Skip to content

Commit

Permalink
[PDB] Implement more find methods for PDB symbols
Browse files Browse the repository at this point in the history
Summary:
Add additional find methods on PDB raw symbols.

findChildrenByAddr()
findChildrenByVA()
findInlineFramesByAddr()
findInlineFramesByVA()
findInlineLines()
findInlineLinesByAddr()
findInlineLinesByRVA()
findInlineLinesByVA()




Reviewers: zturner, llvm-commits

Reviewed By: zturner

Differential Revision: https://reviews.llvm.org/D43637

llvm-svn: 325824
  • Loading branch information
aaronsm committed Feb 22, 2018
1 parent 385d8ea commit fbe6540
Show file tree
Hide file tree
Showing 6 changed files with 236 additions and 0 deletions.
21 changes: 21 additions & 0 deletions llvm/include/llvm/DebugInfo/PDB/DIA/DIARawSymbol.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,31 @@ class DIARawSymbol : public IPDBRawSymbol {
findChildren(PDB_SymType Type, StringRef Name,
PDB_NameSearchFlags Flags) const override;
std::unique_ptr<IPDBEnumSymbols>
findChildrenByAddr(PDB_SymType Type, StringRef Name,
PDB_NameSearchFlags Flags,
uint32_t Section, uint32_t Offset) const override;
std::unique_ptr<IPDBEnumSymbols>
findChildrenByVA(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags,
uint64_t VA) const override;
std::unique_ptr<IPDBEnumSymbols>
findChildrenByRVA(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags,
uint32_t RVA) const override;

std::unique_ptr<IPDBEnumSymbols>
findInlineFramesByAddr(uint32_t Section, uint32_t Offset) const override;
std::unique_ptr<IPDBEnumSymbols>
findInlineFramesByRVA(uint32_t RVA) const override;
std::unique_ptr<IPDBEnumSymbols>
findInlineFramesByVA(uint64_t VA) const override;

std::unique_ptr<IPDBEnumLineNumbers> findInlineeLines() const override;
std::unique_ptr<IPDBEnumLineNumbers>
findInlineeLinesByAddr(uint32_t Section, uint32_t Offset,
uint32_t Length) const override;
std::unique_ptr<IPDBEnumLineNumbers>
findInlineeLinesByRVA(uint32_t RVA, uint32_t Length) const override;
std::unique_ptr<IPDBEnumLineNumbers>
findInlineeLinesByVA(uint64_t VA, uint32_t Length) const override;

void getDataBytes(llvm::SmallVector<uint8_t, 32> &bytes) const override;
void getFrontEndVersion(VersionInfo &Version) const override;
Expand Down
21 changes: 21 additions & 0 deletions llvm/include/llvm/DebugInfo/PDB/IPDBRawSymbol.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,31 @@ class IPDBRawSymbol {
findChildren(PDB_SymType Type, StringRef Name,
PDB_NameSearchFlags Flags) const = 0;
virtual std::unique_ptr<IPDBEnumSymbols>
findChildrenByAddr(PDB_SymType Type, StringRef Name,
PDB_NameSearchFlags Flags,
uint32_t Section, uint32_t Offset) const = 0;
virtual std::unique_ptr<IPDBEnumSymbols>
findChildrenByVA(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags,
uint64_t VA) const = 0;
virtual std::unique_ptr<IPDBEnumSymbols>
findChildrenByRVA(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags,
uint32_t RVA) const = 0;

virtual std::unique_ptr<IPDBEnumSymbols>
findInlineFramesByAddr(uint32_t Section, uint32_t Offset) const = 0;
virtual std::unique_ptr<IPDBEnumSymbols>
findInlineFramesByRVA(uint32_t RVA) const = 0;
virtual std::unique_ptr<IPDBEnumSymbols>
findInlineFramesByVA(uint64_t VA) const = 0;

virtual std::unique_ptr<IPDBEnumLineNumbers> findInlineeLines() const = 0;
virtual std::unique_ptr<IPDBEnumLineNumbers>
findInlineeLinesByAddr(uint32_t Section, uint32_t Offset,
uint32_t Length) const = 0;
virtual std::unique_ptr<IPDBEnumLineNumbers>
findInlineeLinesByRVA(uint32_t RVA, uint32_t Length) const = 0;
virtual std::unique_ptr<IPDBEnumLineNumbers>
findInlineeLinesByVA(uint64_t VA, uint32_t Length) const = 0;

virtual void getDataBytes(llvm::SmallVector<uint8_t, 32> &bytes) const = 0;
virtual void getBackEndVersion(VersionInfo &Version) const = 0;
Expand Down
21 changes: 21 additions & 0 deletions llvm/include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,32 @@ class NativeRawSymbol : public IPDBRawSymbol {
std::unique_ptr<IPDBEnumSymbols>
findChildren(PDB_SymType Type, StringRef Name,
PDB_NameSearchFlags Flags) const override;
std::unique_ptr<IPDBEnumSymbols>
findChildrenByAddr(PDB_SymType Type, StringRef Name,
PDB_NameSearchFlags Flags,
uint32_t Section, uint32_t Offset) const override;
std::unique_ptr<IPDBEnumSymbols>
findChildrenByVA(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags,
uint64_t VA) const override;
std::unique_ptr<IPDBEnumSymbols>
findChildrenByRVA(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags,
uint32_t RVA) const override;

std::unique_ptr<IPDBEnumSymbols>
findInlineFramesByAddr(uint32_t Section, uint32_t Offset) const override;
std::unique_ptr<IPDBEnumSymbols>
findInlineFramesByRVA(uint32_t RVA) const override;
std::unique_ptr<IPDBEnumSymbols>
findInlineFramesByVA(uint64_t VA) const override;

std::unique_ptr<IPDBEnumLineNumbers> findInlineeLines() const override;
std::unique_ptr<IPDBEnumLineNumbers>
findInlineeLinesByAddr(uint32_t Section, uint32_t Offset,
uint32_t Length) const override;
std::unique_ptr<IPDBEnumLineNumbers>
findInlineeLinesByRVA(uint32_t RVA, uint32_t Length) const override;
std::unique_ptr<IPDBEnumLineNumbers>
findInlineeLinesByVA(uint64_t VA, uint32_t Length) const override;

void getDataBytes(SmallVector<uint8_t, 32> &Bytes) const override;
void getFrontEndVersion(VersionInfo &Version) const override;
Expand Down
95 changes: 95 additions & 0 deletions llvm/lib/DebugInfo/PDB/DIA/DIARawSymbol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,47 @@ DIARawSymbol::findChildren(PDB_SymType Type, StringRef Name,
return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
}

std::unique_ptr<IPDBEnumSymbols>
DIARawSymbol::findChildrenByAddr(PDB_SymType Type, StringRef Name,
PDB_NameSearchFlags Flags, uint32_t Section,
uint32_t Offset) const {
llvm::SmallVector<UTF16, 32> Name16;
llvm::convertUTF8ToUTF16String(Name, Name16);

enum SymTagEnum EnumVal = static_cast<enum SymTagEnum>(Type);

DWORD CompareFlags = static_cast<DWORD>(Flags);
wchar_t *Name16Str = reinterpret_cast<wchar_t *>(Name16.data());

CComPtr<IDiaEnumSymbols> DiaEnumerator;
if (S_OK !=
Symbol->findChildrenExByAddr(EnumVal, Name16Str, CompareFlags, Section,
Offset, &DiaEnumerator))
return nullptr;

return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
}

std::unique_ptr<IPDBEnumSymbols>
DIARawSymbol::findChildrenByVA(PDB_SymType Type, StringRef Name,
PDB_NameSearchFlags Flags, uint64_t VA) const {
llvm::SmallVector<UTF16, 32> Name16;
llvm::convertUTF8ToUTF16String(Name, Name16);

enum SymTagEnum EnumVal = static_cast<enum SymTagEnum>(Type);

DWORD CompareFlags = static_cast<DWORD>(Flags);
wchar_t *Name16Str = reinterpret_cast<wchar_t *>(Name16.data());

CComPtr<IDiaEnumSymbols> DiaEnumerator;
if (S_OK !=
Symbol->findChildrenExByVA(EnumVal, Name16Str, CompareFlags, VA,
&DiaEnumerator))
return nullptr;

return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
}

std::unique_ptr<IPDBEnumSymbols>
DIARawSymbol::findChildrenByRVA(PDB_SymType Type, StringRef Name,
PDB_NameSearchFlags Flags, uint32_t RVA) const {
Expand All @@ -418,6 +459,15 @@ DIARawSymbol::findChildrenByRVA(PDB_SymType Type, StringRef Name,
return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
}

std::unique_ptr<IPDBEnumSymbols>
DIARawSymbol::findInlineFramesByAddr(uint32_t Section, uint32_t Offset) const {
CComPtr<IDiaEnumSymbols> DiaEnumerator;
if (S_OK != Symbol->findInlineFramesByAddr(Section, Offset, &DiaEnumerator))
return nullptr;

return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
}

std::unique_ptr<IPDBEnumSymbols>
DIARawSymbol::findInlineFramesByRVA(uint32_t RVA) const {
CComPtr<IDiaEnumSymbols> DiaEnumerator;
Expand All @@ -427,6 +477,51 @@ DIARawSymbol::findInlineFramesByRVA(uint32_t RVA) const {
return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
}

std::unique_ptr<IPDBEnumSymbols>
DIARawSymbol::findInlineFramesByVA(uint64_t VA) const {
CComPtr<IDiaEnumSymbols> DiaEnumerator;
if (S_OK != Symbol->findInlineFramesByVA(VA, &DiaEnumerator))
return nullptr;

return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
}

std::unique_ptr<IPDBEnumLineNumbers> DIARawSymbol::findInlineeLines() const {
CComPtr<IDiaEnumLineNumbers> DiaEnumerator;
if (S_OK != Symbol->findInlineeLines(&DiaEnumerator))
return nullptr;

return llvm::make_unique<DIAEnumLineNumbers>(DiaEnumerator);
}

std::unique_ptr<IPDBEnumLineNumbers>
DIARawSymbol::findInlineeLinesByAddr(uint32_t Section, uint32_t Offset,
uint32_t Length) const {
CComPtr<IDiaEnumLineNumbers> DiaEnumerator;
if (S_OK != Symbol->findInlineeLinesByAddr(Section, Offset, Length, &DiaEnumerator))
return nullptr;

return llvm::make_unique<DIAEnumLineNumbers>(DiaEnumerator);
}

std::unique_ptr<IPDBEnumLineNumbers>
DIARawSymbol::findInlineeLinesByRVA(uint32_t RVA, uint32_t Length) const {
CComPtr<IDiaEnumLineNumbers> DiaEnumerator;
if (S_OK != Symbol->findInlineeLinesByRVA(RVA, Length, &DiaEnumerator))
return nullptr;

return llvm::make_unique<DIAEnumLineNumbers>(DiaEnumerator);
}

std::unique_ptr<IPDBEnumLineNumbers>
DIARawSymbol::findInlineeLinesByVA(uint64_t VA, uint32_t Length) const {
CComPtr<IDiaEnumLineNumbers> DiaEnumerator;
if (S_OK != Symbol->findInlineeLinesByVA(VA, Length, &DiaEnumerator))
return nullptr;

return llvm::make_unique<DIAEnumLineNumbers>(DiaEnumerator);
}

void DIARawSymbol::getDataBytes(llvm::SmallVector<uint8_t, 32> &bytes) const {
bytes.clear();

Expand Down
44 changes: 44 additions & 0 deletions llvm/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,61 @@ NativeRawSymbol::findChildren(PDB_SymType Type, StringRef Name,
return nullptr;
}

std::unique_ptr<IPDBEnumSymbols>
NativeRawSymbol::findChildrenByAddr(PDB_SymType Type, StringRef Name,
PDB_NameSearchFlags Flags, uint32_t Section, uint32_t Offset) const {
return nullptr;
}

std::unique_ptr<IPDBEnumSymbols>
NativeRawSymbol::findChildrenByVA(PDB_SymType Type, StringRef Name,
PDB_NameSearchFlags Flags, uint64_t VA) const {
return nullptr;
}

std::unique_ptr<IPDBEnumSymbols>
NativeRawSymbol::findChildrenByRVA(PDB_SymType Type, StringRef Name,
PDB_NameSearchFlags Flags, uint32_t RVA) const {
return nullptr;
}

std::unique_ptr<IPDBEnumSymbols>
NativeRawSymbol::findInlineFramesByAddr(uint32_t Section,
uint32_t Offset) const {
return nullptr;
}

std::unique_ptr<IPDBEnumSymbols>
NativeRawSymbol::findInlineFramesByRVA(uint32_t RVA) const {
return nullptr;
}

std::unique_ptr<IPDBEnumSymbols>
NativeRawSymbol::findInlineFramesByVA(uint64_t VA) const {
return nullptr;
}

std::unique_ptr<IPDBEnumLineNumbers>
NativeRawSymbol::findInlineeLines() const {
return nullptr;
}

std::unique_ptr<IPDBEnumLineNumbers>
NativeRawSymbol::findInlineeLinesByAddr(uint32_t Section, uint32_t Offset,
uint32_t Length) const {
return nullptr;
}

std::unique_ptr<IPDBEnumLineNumbers>
NativeRawSymbol::findInlineeLinesByRVA(uint32_t RVA, uint32_t Length) const {
return nullptr;
}

std::unique_ptr<IPDBEnumLineNumbers>
NativeRawSymbol::findInlineeLinesByVA(uint64_t VA, uint32_t Length) const {
return nullptr;
}

void NativeRawSymbol::getDataBytes(SmallVector<uint8_t, 32> &bytes) const {
bytes.clear();
}
Expand Down
34 changes: 34 additions & 0 deletions llvm/unittests/DebugInfo/PDB/PDBApiTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,14 +142,48 @@ class MockRawSymbol : public IPDBRawSymbol {
return nullptr;
}
std::unique_ptr<IPDBEnumSymbols>
findChildrenByAddr(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags,
uint32_t Section, uint32_t Offset) const {
return nullptr;
}
std::unique_ptr<IPDBEnumSymbols>
findChildrenByVA(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags,
uint64_t VA) const override {
return nullptr;
}
std::unique_ptr<IPDBEnumSymbols>
findChildrenByRVA(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags,
uint32_t RVA) const override {
return nullptr;
}
std::unique_ptr<IPDBEnumSymbols>
findInlineFramesByAddr(uint32_t Section, uint32_t Offset) const override {
return nullptr;
}
std::unique_ptr<IPDBEnumSymbols>
findInlineFramesByRVA(uint32_t RVA) const override {
return nullptr;
}
std::unique_ptr<IPDBEnumSymbols>
findInlineFramesByVA(uint64_t VA) const override {
return nullptr;
}
std::unique_ptr<IPDBEnumLineNumbers> findInlineeLines() const override {
return nullptr;
}
std::unique_ptr<IPDBEnumLineNumbers>
findInlineeLinesByAddr(uint32_t Section, uint32_t Offset,
uint32_t Length) const override {
return nullptr;
}
std::unique_ptr<IPDBEnumLineNumbers>
findInlineeLinesByRVA(uint32_t RVA, uint32_t Length) const override {
return nullptr;
}
std::unique_ptr<IPDBEnumLineNumbers>
findInlineeLinesByVA(uint64_t VA, uint32_t Length) const override {
return nullptr;
}

void getDataBytes(llvm::SmallVector<uint8_t, 32> &bytes) const override {}
void getFrontEndVersion(VersionInfo &Version) const override {}
Expand Down

0 comments on commit fbe6540

Please sign in to comment.