Skip to content

Commit 3751b6b

Browse files
authored
[llvm-pdbutil] Create public symbols in yaml2pdb (#157362)
pdb2yaml dumps the public symbols, but yaml2pdb didn't create these in the exported PDB. With this PR, they're added to the final PDB.
1 parent 6ff97d0 commit 3751b6b

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# RUN: llvm-pdbutil yaml2pdb %s --pdb=%t.pdb
2+
# RUN: llvm-pdbutil dump --publics %t.pdb | FileCheck --check-prefix=CHECK-YAML2PDB %s
3+
4+
# RUN: llvm-pdbutil pdb2yaml --publics-stream %t.pdb > %t.yaml
5+
# RUN: FileCheck --input-file=%t.yaml --check-prefix=CHECK-PDB2YAML %s
6+
7+
# CHECK-YAML2PDB: S_PUB32 [size = 44] `?AMethod@AClass@@QEAAXHPEAD@Z`
8+
# CHECK-YAML2PDB: flags = function, addr = 0001:0480
9+
# CHECK-YAML2PDB: S_PUB32 [size = 28] `??_7Base@@6B@`
10+
# CHECK-YAML2PDB: flags = none, addr = 0002:0000
11+
# CHECK-YAML2PDB: S_PUB32 [size = 32] `??0Base@@QEAA@XZ`
12+
# CHECK-YAML2PDB: flags = function, addr = 0001:0000
13+
14+
# CHECK-PDB2YAML: - Kind: S_PUB32
15+
# CHECK-PDB2YAML: PublicSym32:
16+
# CHECK-PDB2YAML: Flags: [ Function ]
17+
# CHECK-PDB2YAML: Offset: 480
18+
# CHECK-PDB2YAML: Segment: 1
19+
# CHECK-PDB2YAML: Name: '?AMethod@AClass@@QEAAXHPEAD@Z'
20+
# CHECK-PDB2YAML: - Kind: S_PUB32
21+
# CHECK-PDB2YAML: PublicSym32:
22+
# CHECK-PDB2YAML: Flags: [ ]
23+
# CHECK-PDB2YAML: Offset: 0
24+
# CHECK-PDB2YAML: Segment: 2
25+
# CHECK-PDB2YAML: Name: '??_7Base@@6B@'
26+
# CHECK-PDB2YAML: - Kind: S_PUB32
27+
# CHECK-PDB2YAML: PublicSym32:
28+
# CHECK-PDB2YAML: Flags: [ Function ]
29+
# CHECK-PDB2YAML: Offset: 0
30+
# CHECK-PDB2YAML: Segment: 1
31+
# CHECK-PDB2YAML: Name: '??0Base@@QEAA@XZ'
32+
33+
---
34+
PublicsStream:
35+
Records:
36+
- Kind: S_PUB32
37+
PublicSym32:
38+
Flags: [ Function ]
39+
Offset: 480
40+
Segment: 1
41+
Name: '?AMethod@AClass@@QEAAXHPEAD@Z'
42+
- Kind: S_PUB32
43+
PublicSym32:
44+
Flags: [ ]
45+
Offset: 0
46+
Segment: 2
47+
Name: '??_7Base@@6B@'
48+
- Kind: S_PUB32
49+
PublicSym32:
50+
Flags: [ Function ]
51+
Offset: 0
52+
Segment: 1
53+
Name: '??0Base@@QEAA@XZ'
54+
...
55+

llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
3939
#include "llvm/DebugInfo/CodeView/MergingTypeTableBuilder.h"
4040
#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
41+
#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
4142
#include "llvm/DebugInfo/CodeView/TypeStreamMerger.h"
4243
#include "llvm/DebugInfo/MSF/MSFBuilder.h"
4344
#include "llvm/DebugInfo/MSF/MappedBlockStream.h"
@@ -49,6 +50,7 @@
4950
#include "llvm/DebugInfo/PDB/IPDBSession.h"
5051
#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h"
5152
#include "llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h"
53+
#include "llvm/DebugInfo/PDB/Native/GSIStreamBuilder.h"
5254
#include "llvm/DebugInfo/PDB/Native/InfoStream.h"
5355
#include "llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h"
5456
#include "llvm/DebugInfo/PDB/Native/InputFile.h"
@@ -880,6 +882,24 @@ static void yamlToPdb(StringRef Path) {
880882
IpiBuilder.addTypeRecord(Type.RecordData, std::nullopt);
881883
}
882884

885+
if (YamlObj.PublicsStream) {
886+
auto &GsiBuilder = Builder.getGsiBuilder();
887+
std::vector<BulkPublic> BulkPublics;
888+
for (const auto &P : YamlObj.PublicsStream->PubSyms) {
889+
CVSymbol CV = P.toCodeViewSymbol(Allocator, CodeViewContainer::Pdb);
890+
auto PS = cantFail(SymbolDeserializer::deserializeAs<PublicSym32>(CV));
891+
892+
BulkPublic BP;
893+
BP.Name = PS.Name.data();
894+
BP.NameLen = PS.Name.size();
895+
BP.setFlags(PS.Flags);
896+
BP.Offset = PS.Offset;
897+
BP.Segment = PS.Segment;
898+
BulkPublics.emplace_back(BP);
899+
}
900+
GsiBuilder.addPublicSymbols(std::move(BulkPublics));
901+
}
902+
883903
Builder.getStringTableBuilder().setStrings(*Strings.strings());
884904

885905
codeview::GUID IgnoredOutGuid;

0 commit comments

Comments
 (0)