Skip to content

Commit

Permalink
[llvm-pdbdump] Recursively dump class layout.
Browse files Browse the repository at this point in the history
llvm-svn: 300258
  • Loading branch information
Zachary Turner committed Apr 13, 2017
1 parent 60f54ac commit 4dc4f01
Show file tree
Hide file tree
Showing 23 changed files with 730 additions and 138 deletions.
10 changes: 2 additions & 8 deletions llvm/include/llvm/DebugInfo/PDB/ConcreteSymbolEnumerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,11 @@ class ConcreteSymbolEnumerator : public IPDBEnumChildren<ChildType> {

std::unique_ptr<ChildType> getChildAtIndex(uint32_t Index) const override {
std::unique_ptr<PDBSymbol> Child = Enumerator->getChildAtIndex(Index);
return make_concrete_child(std::move(Child));
return unique_dyn_cast_or_null<ChildType>(Child);
}

std::unique_ptr<ChildType> getNext() override {
std::unique_ptr<PDBSymbol> Child = Enumerator->getNext();
return make_concrete_child(std::move(Child));
return unique_dyn_cast_or_null<ChildType>(Enumerator->getNext());
}

void reset() override { Enumerator->reset(); }
Expand All @@ -50,11 +49,6 @@ class ConcreteSymbolEnumerator : public IPDBEnumChildren<ChildType> {
}

private:
std::unique_ptr<ChildType>
make_concrete_child(std::unique_ptr<PDBSymbol> Child) const {
ChildType *ConcreteChild = dyn_cast_or_null<ChildType>(Child.release());
return std::unique_ptr<ChildType>(ConcreteChild);
}

std::unique_ptr<IPDBEnumSymbols> Enumerator;
};
Expand Down
2 changes: 2 additions & 0 deletions llvm/include/llvm/DebugInfo/PDB/PDBSymbolFunc.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ class PDBSymbolFunc : public PDBSymbol {

void dump(PDBSymDumper &Dumper) const override;

bool isDestructor() const;

std::unique_ptr<IPDBEnumChildren<PDBSymbolData>> getArguments() const;

DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::Function)
Expand Down
39 changes: 33 additions & 6 deletions llvm/include/llvm/DebugInfo/PDB/UDTLayout.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ class DataMemberLayoutItem : public StorageItemBase {
virtual uint32_t deepPaddingSize() const;

const PDBSymbolData &getDataMember();
bool hasUDTLayout() const;
const ClassLayout &getUDTLayout() const;

private:
std::unique_ptr<PDBSymbolData> DataMember;
Expand All @@ -77,13 +79,24 @@ class VTableLayoutItem : public StorageItemBase {
public:
VTableLayoutItem(const UDTLayoutBase &Parent,
std::unique_ptr<PDBSymbolTypeVTable> VTable);
ArrayRef<PDBSymbolFunc *> funcs() const { return VTableFuncs; }

uint32_t getElementSize() const { return ElementSize; }

void setFunction(uint32_t Index, PDBSymbolFunc &Func) {
VTableFuncs[Index] = &Func;
}

private:
uint32_t ElementSize = 0;
std::unique_ptr<PDBSymbolTypeVTableShape> Shape;
std::unique_ptr<PDBSymbolTypeVTable> VTable;
std::vector<std::unique_ptr<PDBSymbolFunc>> VTableFuncs;
std::vector<PDBSymbolFunc *> VTableFuncs;
};

class UDTLayoutBase {
template <typename T> using UniquePtrVector = std::vector<std::unique_ptr<T>>;

public:
UDTLayoutBase(const PDBSymbol &Symbol, const std::string &Name,
uint32_t Size);
Expand All @@ -99,26 +112,37 @@ class UDTLayoutBase {
return ChildStorage;
}

ArrayRef<BaseClassLayout *> base_classes() const { return BaseClasses; }
VTableLayoutItem *findVTableAtOffset(uint32_t RelativeOffset);

ArrayRef<std::unique_ptr<PDBSymbol>> other_items() const {
return NonStorageItems;
StringRef getUDTName() const { return Name; }

ArrayRef<BaseClassLayout *> bases() const { return BaseClasses; }
ArrayRef<std::unique_ptr<PDBSymbolTypeBaseClass>> vbases() const {
return VirtualBases;
}

ArrayRef<std::unique_ptr<PDBSymbolFunc>> funcs() const { return Funcs; }

ArrayRef<std::unique_ptr<PDBSymbol>> other_items() const { return Other; }

const PDBSymbol &getSymbolBase() const { return SymbolBase; }

protected:
void initializeChildren(const PDBSymbol &Sym);

void addChildToLayout(std::unique_ptr<StorageItemBase> Child);
void addVirtualOverride(PDBSymbolFunc &Func);
void addVirtualIntro(PDBSymbolFunc &Func);

const PDBSymbol &SymbolBase;
std::string Name;
uint32_t SizeOf = 0;

BitVector UsedBytes;
std::vector<std::unique_ptr<PDBSymbol>> NonStorageItems;
std::vector<std::unique_ptr<StorageItemBase>> ChildStorage;
UniquePtrVector<PDBSymbol> Other;
UniquePtrVector<PDBSymbolFunc> Funcs;
UniquePtrVector<PDBSymbolTypeBaseClass> VirtualBases;
UniquePtrVector<StorageItemBase> ChildStorage;
std::vector<std::list<StorageItemBase *>> ChildrenPerByte;
std::vector<BaseClassLayout *> BaseClasses;
VTableLayoutItem *VTable = nullptr;
Expand All @@ -129,6 +153,8 @@ class ClassLayout : public UDTLayoutBase {
explicit ClassLayout(const PDBSymbolTypeUDT &UDT);
explicit ClassLayout(std::unique_ptr<PDBSymbolTypeUDT> UDT);

ClassLayout(ClassLayout &&Other) = default;

const PDBSymbolTypeUDT &getClass() const { return UDT; }

private:
Expand All @@ -142,6 +168,7 @@ class BaseClassLayout : public UDTLayoutBase, public StorageItemBase {
std::unique_ptr<PDBSymbolTypeBaseClass> Base);

const PDBSymbolTypeBaseClass &getBase() const { return *Base; }
bool isVirtualBase() const { return IsVirtualBase; }

private:
std::unique_ptr<PDBSymbolTypeBaseClass> Base;
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/DebugInfo/PDB/PDBSymbol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,8 @@ PDBSymbol::findInlineFramesByRVA(uint32_t RVA) const {
std::unique_ptr<IPDBEnumSymbols>
PDBSymbol::getChildStats(TagStats &Stats) const {
std::unique_ptr<IPDBEnumSymbols> Result(findAllChildren());
if (!Result)
return nullptr;
Stats.clear();
while (auto Child = Result->getNext()) {
++Stats[Child->getSymTag()];
Expand Down
11 changes: 11 additions & 0 deletions llvm/lib/DebugInfo/PDB/PDBSymbolFunc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,3 +95,14 @@ PDBSymbolFunc::getArguments() const {
}

void PDBSymbolFunc::dump(PDBSymDumper &Dumper) const { Dumper.dump(*this); }

bool PDBSymbolFunc::isDestructor() const {
std::string Name = getName();
if (Name.empty())
return false;
if (Name[0] == '~')
return true;
if (Name == "__vecDelDtor")
return true;
return false;
}
Loading

0 comments on commit 4dc4f01

Please sign in to comment.