Skip to content

Commit 0881d0b

Browse files
committed
[PDB][NativeSession] Clean up some things in NativeSession.
-Use the actual sect/offset to keep track of symbols in the cache so they don't get created multiple times with different addresses. -Remove getSymTag from PDBFunctionSymbol/PDBPublicSymbol because it's already implemented in the base class -Merge the symbolizer test files for DIA and native, since the tests are the same. -Implement getCompilandId for NativeLineNumber Reviewed By: amccarth Differential Revision: https://reviews.llvm.org/D84208
1 parent a361aa5 commit 0881d0b

File tree

12 files changed

+50
-70
lines changed

12 files changed

+50
-70
lines changed

llvm/include/llvm/DebugInfo/PDB/Native/NativeFunctionSymbol.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ class NativeFunctionSymbol : public NativeRawSymbol {
3030
uint32_t getAddressOffset() const override;
3131
uint32_t getAddressSection() const override;
3232
std::string getName() const override;
33-
PDB_SymType getSymTag() const override;
3433
uint64_t getLength() const override;
3534
uint32_t getRelativeVirtualAddress() const override;
3635
uint64_t getVirtualAddress() const override;

llvm/include/llvm/DebugInfo/PDB/Native/NativeLineNumber.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class NativeLineNumber : public IPDBLineNumber {
2222
const codeview::LineInfo Line,
2323
uint32_t ColumnNumber, uint32_t Length,
2424
uint32_t Section, uint32_t Offset,
25-
uint32_t SrcFileId);
25+
uint32_t SrcFileId, uint32_t CompilandId);
2626

2727
uint32_t getLineNumber() const override;
2828
uint32_t getLineNumberEnd() const override;
@@ -45,6 +45,7 @@ class NativeLineNumber : public IPDBLineNumber {
4545
uint32_t Offset;
4646
uint32_t Length;
4747
uint32_t SrcFileId;
48+
uint32_t CompilandId;
4849
};
4950
} // namespace pdb
5051
} // namespace llvm

llvm/include/llvm/DebugInfo/PDB/Native/NativePublicSymbol.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ class NativePublicSymbol : public NativeRawSymbol {
3030
uint32_t getAddressOffset() const override;
3131
uint32_t getAddressSection() const override;
3232
std::string getName() const override;
33-
PDB_SymType getSymTag() const override;
3433
uint32_t getRelativeVirtualAddress() const override;
3534
uint64_t getVirtualAddress() const override;
3635

llvm/include/llvm/DebugInfo/PDB/Native/SymbolCache.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class SymbolCache {
6161
DenseMap<uint32_t, SymIndexId> GlobalOffsetToSymbolId;
6262

6363
/// Map from segment and code offset to SymIndexId.
64-
DenseMap<std::pair<uint32_t, uint32_t>, SymIndexId> AddressToFunctionSymId;
64+
DenseMap<std::pair<uint32_t, uint32_t>, SymIndexId> AddressToSymbolId;
6565
DenseMap<std::pair<uint32_t, uint32_t>, SymIndexId> AddressToPublicSymId;
6666

6767
/// Map from virtual address to module index.

llvm/lib/DebugInfo/PDB/Native/NativeFunctionSymbol.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ using namespace llvm::pdb;
1919
NativeFunctionSymbol::NativeFunctionSymbol(NativeSession &Session,
2020
SymIndexId Id,
2121
const codeview::ProcSym &Sym)
22-
: NativeRawSymbol(Session, PDB_SymType::Data, Id), Sym(Sym) {}
22+
: NativeRawSymbol(Session, PDB_SymType::Function, Id), Sym(Sym) {}
2323

2424
NativeFunctionSymbol::~NativeFunctionSymbol() {}
2525

@@ -42,10 +42,6 @@ std::string NativeFunctionSymbol::getName() const {
4242
return std::string(Sym.Name);
4343
}
4444

45-
PDB_SymType NativeFunctionSymbol::getSymTag() const {
46-
return PDB_SymType::Function;
47-
}
48-
4945
uint64_t NativeFunctionSymbol::getLength() const { return Sym.CodeSize; }
5046

5147
uint32_t NativeFunctionSymbol::getRelativeVirtualAddress() const {

llvm/lib/DebugInfo/PDB/Native/NativeLineNumber.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ NativeLineNumber::NativeLineNumber(const NativeSession &Session,
1515
const codeview::LineInfo Line,
1616
uint32_t ColumnNumber, uint32_t Section,
1717
uint32_t Offset, uint32_t Length,
18-
uint32_t SrcFileId)
18+
uint32_t SrcFileId, uint32_t CompilandId)
1919
: Session(Session), Line(Line), ColumnNumber(ColumnNumber),
20-
Section(Section), Offset(Offset), Length(Length), SrcFileId(SrcFileId) {}
20+
Section(Section), Offset(Offset), Length(Length), SrcFileId(SrcFileId),
21+
CompilandId(CompilandId) {}
2122

2223
uint32_t NativeLineNumber::getLineNumber() const { return Line.getStartLine(); }
2324

@@ -45,6 +46,6 @@ uint32_t NativeLineNumber::getLength() const { return Length; }
4546

4647
uint32_t NativeLineNumber::getSourceFileId() const { return SrcFileId; }
4748

48-
uint32_t NativeLineNumber::getCompilandId() const { return 0; }
49+
uint32_t NativeLineNumber::getCompilandId() const { return CompilandId; }
4950

5051
bool NativeLineNumber::isStatement() const { return Line.isStatement(); }

llvm/lib/DebugInfo/PDB/Native/NativePublicSymbol.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ using namespace llvm::pdb;
1818

1919
NativePublicSymbol::NativePublicSymbol(NativeSession &Session, SymIndexId Id,
2020
const codeview::PublicSym32 &Sym)
21-
: NativeRawSymbol(Session, PDB_SymType::Data, Id), Sym(Sym) {}
21+
: NativeRawSymbol(Session, PDB_SymType::PublicSymbol, Id), Sym(Sym) {}
2222

2323
NativePublicSymbol::~NativePublicSymbol() {}
2424

@@ -39,10 +39,6 @@ std::string NativePublicSymbol::getName() const {
3939
return std::string(Sym.Name);
4040
}
4141

42-
PDB_SymType NativePublicSymbol::getSymTag() const {
43-
return PDB_SymType::PublicSymbol;
44-
}
45-
4642
uint32_t NativePublicSymbol::getRelativeVirtualAddress() const {
4743
return Session.getRVAFromSectOffset(Sym.Segment, Sym.Offset);
4844
}

llvm/lib/DebugInfo/PDB/Native/NativeSession.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,14 +272,14 @@ NativeSession::findLineNumbersByAddress(uint64_t Address,
272272

273273
std::unique_ptr<IPDBEnumLineNumbers>
274274
NativeSession::findLineNumbersByRVA(uint32_t RVA, uint32_t Length) const {
275-
return findLineNumbersByAddress(getLoadAddress() + RVA, Length);
275+
return Cache.findLineNumbersByVA(getLoadAddress() + RVA, Length);
276276
}
277277

278278
std::unique_ptr<IPDBEnumLineNumbers>
279279
NativeSession::findLineNumbersBySectOffset(uint32_t Section, uint32_t Offset,
280280
uint32_t Length) const {
281281
uint64_t VA = getVAFromSectOffset(Section, Offset);
282-
return findLineNumbersByAddress(VA, Length);
282+
return Cache.findLineNumbersByVA(VA, Length);
283283
}
284284

285285
std::unique_ptr<IPDBEnumSourceFiles>

llvm/lib/DebugInfo/PDB/Native/SymbolCache.cpp

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,16 @@ SymbolCache::findSymbolBySectOffset(uint32_t Sect, uint32_t Offset,
319319
return findFunctionSymbolBySectOffset(Sect, Offset);
320320
case PDB_SymType::PublicSymbol:
321321
return findPublicSymbolBySectOffset(Sect, Offset);
322+
case PDB_SymType::Compiland: {
323+
Optional<uint16_t> Modi =
324+
getModuleIndexForAddr(Session.getVAFromSectOffset(Sect, Offset));
325+
if (!Modi)
326+
return nullptr;
327+
return getOrCreateCompiland(*Modi);
328+
}
322329
case PDB_SymType::None: {
323-
// FIXME: Implement for PDB_SymType::Data.
330+
// FIXME: Implement for PDB_SymType::Data. The symbolizer calls this but
331+
// only uses it to find the symbol length.
324332
if (auto Sym = findFunctionSymbolBySectOffset(Sect, Offset))
325333
return Sym;
326334
return nullptr;
@@ -332,8 +340,8 @@ SymbolCache::findSymbolBySectOffset(uint32_t Sect, uint32_t Offset,
332340

333341
std::unique_ptr<PDBSymbol>
334342
SymbolCache::findFunctionSymbolBySectOffset(uint32_t Sect, uint32_t Offset) {
335-
auto Iter = AddressToFunctionSymId.find({Sect, Offset});
336-
if (Iter != AddressToFunctionSymId.end())
343+
auto Iter = AddressToSymbolId.find({Sect, Offset});
344+
if (Iter != AddressToSymbolId.end())
337345
return getSymbolById(Iter->second);
338346

339347
if (!Dbi)
@@ -357,8 +365,14 @@ SymbolCache::findFunctionSymbolBySectOffset(uint32_t Sect, uint32_t Offset) {
357365
auto PS = cantFail(SymbolDeserializer::deserializeAs<ProcSym>(*I));
358366
if (Sect == PS.Segment && Offset >= PS.CodeOffset &&
359367
Offset < PS.CodeOffset + PS.CodeSize) {
368+
// Check if the symbol is already cached.
369+
auto Found = AddressToSymbolId.find({PS.Segment, PS.CodeOffset});
370+
if (Found != AddressToSymbolId.end())
371+
return getSymbolById(Found->second);
372+
373+
// Otherwise, create a new symbol.
360374
SymIndexId Id = createSymbol<NativeFunctionSymbol>(PS);
361-
AddressToFunctionSymId.insert({{Sect, Offset}, Id});
375+
AddressToSymbolId.insert({{PS.Segment, PS.CodeOffset}, Id});
362376
return getSymbolById(Id);
363377
}
364378

@@ -418,9 +432,16 @@ SymbolCache::findPublicSymbolBySectOffset(uint32_t Sect, uint32_t Offset) {
418432
consumeError(Sym.takeError());
419433
return nullptr;
420434
}
435+
436+
// Check if the symbol is already cached.
421437
auto PS = cantFail(SymbolDeserializer::deserializeAs<PublicSym32>(Sym.get()));
438+
auto Found = AddressToPublicSymId.find({PS.Segment, PS.Offset});
439+
if (Found != AddressToPublicSymId.end())
440+
return getSymbolById(Found->second);
441+
442+
// Otherwise, create a new symbol.
422443
SymIndexId Id = createSymbol<NativePublicSymbol>(PS);
423-
AddressToPublicSymId.insert({{Sect, Offset}, Id});
444+
AddressToPublicSymId.insert({{PS.Segment, PS.Offset}, Id});
424445
return getSymbolById(Id);
425446
}
426447

@@ -587,7 +608,7 @@ SymbolCache::findLineNumbersByVA(uint64_t VA, uint32_t Length) const {
587608
ExpectedChecksums->getArray().at(LineIter->FileNameIndex);
588609
uint32_t SrcFileId = getOrCreateSourceFile(*ChecksumIter);
589610
NativeLineNumber LineNum(Session, LineIter->Line, LineIter->ColumnNumber,
590-
LineSect, LineOff, LineLength, SrcFileId);
611+
LineSect, LineOff, LineLength, SrcFileId, Modi);
591612
LineNumbers.push_back(LineNum);
592613
++LineIter;
593614
}

llvm/test/tools/llvm-symbolizer/pdb/pdb-native-columns.test renamed to llvm/test/tools/llvm-symbolizer/pdb/pdb-columns.test

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ RUN: echo 0x140006C20 >> %t.input
66
RUN: echo 0x140006C30 >> %t.input
77
RUN: echo 0x140006C40 >> %t.input
88
RUN: echo 0x140006C70 >> %t.input
9+
RUN: llvm-symbolizer -obj="%p/Inputs/test-columns.exe" < %t.input \
10+
RUN: | FileCheck %s
911
RUN: llvm-symbolizer -obj="%p/Inputs/test-columns.exe" -use-native-pdb-reader < %t.input \
1012
RUN: | FileCheck %s
1113

llvm/test/tools/llvm-symbolizer/pdb/pdb-native.test

Lines changed: 0 additions & 45 deletions
This file was deleted.

llvm/test/tools/llvm-symbolizer/pdb/pdb.test

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,23 @@ RUN: | FileCheck %s
1111
RUN: llvm-symbolizer -obj="%p/Inputs/test.exe" -demangle=false < %t.input \
1212
RUN: | FileCheck %s --check-prefix=CHECK-NO-DEMANGLE
1313

14+
Test with native pdb reader.
15+
RUN: llvm-symbolizer -use-native-pdb-reader -obj="%p/Inputs/test.exe" < %t.input \
16+
RUN: | FileCheck %s
17+
RUN: llvm-symbolizer -use-native-pdb-reader -obj="%p/Inputs/test.exe" -demangle=false < %t.input \
18+
RUN: | FileCheck %s --check-prefix=CHECK-NO-DEMANGLE
19+
1420
Subtract ImageBase from all the offsets and run the test again with
1521
--relative-address.
1622

1723
RUN: %python -c 'import sys;print("\n".join([hex(int(x, 16) - 0x400000) for x in sys.stdin]))' < %t.input \
1824
RUN: | llvm-symbolizer -obj="%p/Inputs/test.exe" -demangle=false --relative-address \
1925
RUN: | FileCheck %s --check-prefix=CHECK-NO-DEMANGLE
2026

27+
RUN: %python -c 'import sys;print("\n".join([hex(int(x, 16) - 0x400000) for x in sys.stdin]))' < %t.input \
28+
RUN: | llvm-symbolizer -use-native-pdb-reader -obj="%p/Inputs/test.exe" -demangle=false --relative-address \
29+
RUN: | FileCheck %s --check-prefix=CHECK-NO-DEMANGLE
30+
2131
CHECK: foo(void)
2232
CHECK-NEXT: test.cpp:10
2333
CHECK: {{^private_symbol$}}

0 commit comments

Comments
 (0)