diff --git a/llvm/test/tools/llvm-pdbutil/publics-yaml2pdb.test b/llvm/test/tools/llvm-pdbutil/publics-yaml2pdb.test new file mode 100644 index 0000000000000..836100691ae74 --- /dev/null +++ b/llvm/test/tools/llvm-pdbutil/publics-yaml2pdb.test @@ -0,0 +1,55 @@ +# RUN: llvm-pdbutil yaml2pdb %s --pdb=%t.pdb +# RUN: llvm-pdbutil dump --publics %t.pdb | FileCheck --check-prefix=CHECK-YAML2PDB %s + +# RUN: llvm-pdbutil pdb2yaml --publics-stream %t.pdb > %t.yaml +# RUN: FileCheck --input-file=%t.yaml --check-prefix=CHECK-PDB2YAML %s + +# CHECK-YAML2PDB: S_PUB32 [size = 44] `?AMethod@AClass@@QEAAXHPEAD@Z` +# CHECK-YAML2PDB: flags = function, addr = 0001:0480 +# CHECK-YAML2PDB: S_PUB32 [size = 28] `??_7Base@@6B@` +# CHECK-YAML2PDB: flags = none, addr = 0002:0000 +# CHECK-YAML2PDB: S_PUB32 [size = 32] `??0Base@@QEAA@XZ` +# CHECK-YAML2PDB: flags = function, addr = 0001:0000 + +# CHECK-PDB2YAML: - Kind: S_PUB32 +# CHECK-PDB2YAML: PublicSym32: +# CHECK-PDB2YAML: Flags: [ Function ] +# CHECK-PDB2YAML: Offset: 480 +# CHECK-PDB2YAML: Segment: 1 +# CHECK-PDB2YAML: Name: '?AMethod@AClass@@QEAAXHPEAD@Z' +# CHECK-PDB2YAML: - Kind: S_PUB32 +# CHECK-PDB2YAML: PublicSym32: +# CHECK-PDB2YAML: Flags: [ ] +# CHECK-PDB2YAML: Offset: 0 +# CHECK-PDB2YAML: Segment: 2 +# CHECK-PDB2YAML: Name: '??_7Base@@6B@' +# CHECK-PDB2YAML: - Kind: S_PUB32 +# CHECK-PDB2YAML: PublicSym32: +# CHECK-PDB2YAML: Flags: [ Function ] +# CHECK-PDB2YAML: Offset: 0 +# CHECK-PDB2YAML: Segment: 1 +# CHECK-PDB2YAML: Name: '??0Base@@QEAA@XZ' + +--- +PublicsStream: + Records: + - Kind: S_PUB32 + PublicSym32: + Flags: [ Function ] + Offset: 480 + Segment: 1 + Name: '?AMethod@AClass@@QEAAXHPEAD@Z' + - Kind: S_PUB32 + PublicSym32: + Flags: [ ] + Offset: 0 + Segment: 2 + Name: '??_7Base@@6B@' + - Kind: S_PUB32 + PublicSym32: + Flags: [ Function ] + Offset: 0 + Segment: 1 + Name: '??0Base@@QEAA@XZ' +... + diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp index e50d19a994b6f..a5b8e8b7941d7 100644 --- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp +++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp @@ -38,6 +38,7 @@ #include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h" #include "llvm/DebugInfo/CodeView/MergingTypeTableBuilder.h" #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" +#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h" #include "llvm/DebugInfo/CodeView/TypeStreamMerger.h" #include "llvm/DebugInfo/MSF/MSFBuilder.h" #include "llvm/DebugInfo/MSF/MappedBlockStream.h" @@ -49,6 +50,7 @@ #include "llvm/DebugInfo/PDB/IPDBSession.h" #include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h" #include "llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h" +#include "llvm/DebugInfo/PDB/Native/GSIStreamBuilder.h" #include "llvm/DebugInfo/PDB/Native/InfoStream.h" #include "llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h" #include "llvm/DebugInfo/PDB/Native/InputFile.h" @@ -880,6 +882,24 @@ static void yamlToPdb(StringRef Path) { IpiBuilder.addTypeRecord(Type.RecordData, std::nullopt); } + if (YamlObj.PublicsStream) { + auto &GsiBuilder = Builder.getGsiBuilder(); + std::vector BulkPublics; + for (const auto &P : YamlObj.PublicsStream->PubSyms) { + CVSymbol CV = P.toCodeViewSymbol(Allocator, CodeViewContainer::Pdb); + auto PS = cantFail(SymbolDeserializer::deserializeAs(CV)); + + BulkPublic BP; + BP.Name = PS.Name.data(); + BP.NameLen = PS.Name.size(); + BP.setFlags(PS.Flags); + BP.Offset = PS.Offset; + BP.Segment = PS.Segment; + BulkPublics.emplace_back(BP); + } + GsiBuilder.addPublicSymbols(std::move(BulkPublics)); + } + Builder.getStringTableBuilder().setStrings(*Strings.strings()); codeview::GUID IgnoredOutGuid;