From 903529a7228daf84bfa7ef20379cfcc4154c57cf Mon Sep 17 00:00:00 2001 From: Nerixyz Date: Sun, 7 Sep 2025 22:19:28 +0200 Subject: [PATCH 1/3] [llvm-pdbutil] Create public symbols in yaml2pdb --- .../tools/llvm-pdbutil/Inputs/publics.yaml | 22 +++++++++++++ .../tools/llvm-pdbutil/publics-yaml2pdb.test | 31 +++++++++++++++++++ llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp | 20 ++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 llvm/test/tools/llvm-pdbutil/Inputs/publics.yaml create mode 100644 llvm/test/tools/llvm-pdbutil/publics-yaml2pdb.test diff --git a/llvm/test/tools/llvm-pdbutil/Inputs/publics.yaml b/llvm/test/tools/llvm-pdbutil/Inputs/publics.yaml new file mode 100644 index 0000000000000..ab1570e5dff1e --- /dev/null +++ b/llvm/test/tools/llvm-pdbutil/Inputs/publics.yaml @@ -0,0 +1,22 @@ +--- +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/test/tools/llvm-pdbutil/publics-yaml2pdb.test b/llvm/test/tools/llvm-pdbutil/publics-yaml2pdb.test new file mode 100644 index 0000000000000..192ae25ce8344 --- /dev/null +++ b/llvm/test/tools/llvm-pdbutil/publics-yaml2pdb.test @@ -0,0 +1,31 @@ +; RUN: llvm-pdbutil yaml2pdb %p/Inputs/publics.yaml --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' diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp index e50d19a994b6f..9e90033216a3b 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" @@ -818,6 +820,7 @@ static void yamlToPdb(StringRef Path) { pdb::yaml::PdbDbiStream DefaultDbiStream; pdb::yaml::PdbTpiStream DefaultTpiStream; pdb::yaml::PdbTpiStream DefaultIpiStream; + pdb::yaml::PdbPublicsStream DefaultPublicsStream; const auto &Info = YamlObj.PdbStream.value_or(DefaultInfoStream); @@ -880,6 +883,23 @@ static void yamlToPdb(StringRef Path) { IpiBuilder.addTypeRecord(Type.RecordData, std::nullopt); } + auto &GsiBuilder = Builder.getGsiBuilder(); + const auto &Publics = YamlObj.PublicsStream.value_or(DefaultPublicsStream); + std::vector BulkPublics; + for (const auto &P : Publics.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; From 631c8a5b1bea4815d2173f0e708f36628ace51a4 Mon Sep 17 00:00:00 2001 From: Nerixyz Date: Mon, 8 Sep 2025 11:22:28 +0200 Subject: [PATCH 2/3] fix: only create gsi stream if needed --- llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp index 9e90033216a3b..a5b8e8b7941d7 100644 --- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp +++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp @@ -820,7 +820,6 @@ static void yamlToPdb(StringRef Path) { pdb::yaml::PdbDbiStream DefaultDbiStream; pdb::yaml::PdbTpiStream DefaultTpiStream; pdb::yaml::PdbTpiStream DefaultIpiStream; - pdb::yaml::PdbPublicsStream DefaultPublicsStream; const auto &Info = YamlObj.PdbStream.value_or(DefaultInfoStream); @@ -883,22 +882,23 @@ static void yamlToPdb(StringRef Path) { IpiBuilder.addTypeRecord(Type.RecordData, std::nullopt); } - auto &GsiBuilder = Builder.getGsiBuilder(); - const auto &Publics = YamlObj.PublicsStream.value_or(DefaultPublicsStream); - std::vector BulkPublics; - for (const auto &P : Publics.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); + 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)); } - GsiBuilder.addPublicSymbols(std::move(BulkPublics)); Builder.getStringTableBuilder().setStrings(*Strings.strings()); From 188885fef11f0bcf803d50100ce2d512de54d0af Mon Sep 17 00:00:00 2001 From: Nerixyz Date: Tue, 9 Sep 2025 14:56:32 +0200 Subject: [PATCH 3/3] fix: merge test input and commands --- .../tools/llvm-pdbutil/Inputs/publics.yaml | 22 ----- .../tools/llvm-pdbutil/publics-yaml2pdb.test | 80 ++++++++++++------- 2 files changed, 52 insertions(+), 50 deletions(-) delete mode 100644 llvm/test/tools/llvm-pdbutil/Inputs/publics.yaml diff --git a/llvm/test/tools/llvm-pdbutil/Inputs/publics.yaml b/llvm/test/tools/llvm-pdbutil/Inputs/publics.yaml deleted file mode 100644 index ab1570e5dff1e..0000000000000 --- a/llvm/test/tools/llvm-pdbutil/Inputs/publics.yaml +++ /dev/null @@ -1,22 +0,0 @@ ---- -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/test/tools/llvm-pdbutil/publics-yaml2pdb.test b/llvm/test/tools/llvm-pdbutil/publics-yaml2pdb.test index 192ae25ce8344..836100691ae74 100644 --- a/llvm/test/tools/llvm-pdbutil/publics-yaml2pdb.test +++ b/llvm/test/tools/llvm-pdbutil/publics-yaml2pdb.test @@ -1,31 +1,55 @@ -; RUN: llvm-pdbutil yaml2pdb %p/Inputs/publics.yaml --pdb=%t.pdb -; RUN: llvm-pdbutil dump --publics %t.pdb | FileCheck --check-prefix=CHECK-YAML2PDB %s +# 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 +# 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-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' +... -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'