[llvm] [llvm-pdbutil] Include DBI section contribs in YAML (PR #191624)

via llvm-commits llvm-commits at lists.llvm.org
Sat Apr 11 05:23:06 PDT 2026


https://github.com/Nerixyz updated https://github.com/llvm/llvm-project/pull/191624

>From 1acb09c3b7132d97f9890c2aac1ed3093720d92f Mon Sep 17 00:00:00 2001
From: Nerixyz <nerixdev at outlook.de>
Date: Sat, 11 Apr 2026 13:28:48 +0200
Subject: [PATCH] [llvm-pdbutil] Include DBI section contribs in YAML

---
 .../llvm/DebugInfo/PDB/Native/DbiStream.h     |   2 +
 llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp   |   4 +
 .../dbi-section-contribs-v2-yaml.test         |  25 +++
 .../dbi-section-contribs-ver60-yaml.test      | 193 ++++++++++++++++++
 llvm/tools/llvm-pdbutil/PdbYaml.cpp           |  28 +++
 llvm/tools/llvm-pdbutil/PdbYaml.h             |  20 ++
 llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp   |  36 ++++
 llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp      |  33 +++
 llvm/tools/llvm-pdbutil/llvm-pdbutil.h        |   1 +
 9 files changed, 342 insertions(+)
 create mode 100644 llvm/test/tools/llvm-pdbutil/dbi-section-contribs-v2-yaml.test
 create mode 100644 llvm/test/tools/llvm-pdbutil/dbi-section-contribs-ver60-yaml.test

diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/DbiStream.h b/llvm/include/llvm/DebugInfo/PDB/Native/DbiStream.h
index 36e08cb0e1bd5..758060c5932b1 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Native/DbiStream.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Native/DbiStream.h
@@ -93,6 +93,8 @@ class DbiStream {
   LLVM_ABI void
   visitSectionContributions(ISectionContribVisitor &Visitor) const;
 
+  LLVM_ABI PdbRaw_DbiSecContribVer getSectionContributionsVersion() const;
+
   LLVM_ABI Expected<StringRef> getECName(uint32_t NI) const;
 
 private:
diff --git a/llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp b/llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp
index 1a22673340492..39b1afb0bb4ba 100644
--- a/llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp
+++ b/llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp
@@ -231,6 +231,10 @@ void DbiStream::visitSectionContributions(
   }
 }
 
+PdbRaw_DbiSecContribVer DbiStream::getSectionContributionsVersion() const {
+  return SectionContribVersion;
+}
+
 Expected<StringRef> DbiStream::getECName(uint32_t NI) const {
   return ECNames.getStringForID(NI);
 }
diff --git a/llvm/test/tools/llvm-pdbutil/dbi-section-contribs-v2-yaml.test b/llvm/test/tools/llvm-pdbutil/dbi-section-contribs-v2-yaml.test
new file mode 100644
index 0000000000000..d4d3306509934
--- /dev/null
+++ b/llvm/test/tools/llvm-pdbutil/dbi-section-contribs-v2-yaml.test
@@ -0,0 +1,25 @@
+# RUN: not llvm-pdbutil yaml2pdb %s --pdb=%t.pdb 2>&1 | FileCheck --check-prefix=CHECK-YAML2PDB %s
+
+# CHECK-YAML2PDB: Only DBI section contrib Version Ver60 is supported
+
+---
+DbiStream:
+  VerHeader:       V70
+  Age:             3
+  BuildNumber:     36402
+  PdbDllVersion:   35728
+  PdbDllRbld:      0
+  Flags:           1
+  MachineType:     Amd64
+  SectionContribs:
+    Version:         V2
+    Items:
+      - ISect:           1
+        Offset:          0
+        Size:            15
+        Characteristics: 1610612768
+        Imod:            1
+        DataCrc:         0
+        RelocCrc:        0
+        ISectCoff:       0
+...
diff --git a/llvm/test/tools/llvm-pdbutil/dbi-section-contribs-ver60-yaml.test b/llvm/test/tools/llvm-pdbutil/dbi-section-contribs-ver60-yaml.test
new file mode 100644
index 0000000000000..1df6b2f70f77b
--- /dev/null
+++ b/llvm/test/tools/llvm-pdbutil/dbi-section-contribs-ver60-yaml.test
@@ -0,0 +1,193 @@
+# RUN: llvm-pdbutil yaml2pdb %s --pdb=%t.pdb
+# RUN: llvm-pdbutil dump --section-contribs %t.pdb | FileCheck --check-prefix=CHECK-YAML2PDB %s
+
+# RUN: llvm-pdbutil pdb2yaml --section-contribs %t.pdb > %t.yaml
+# RUN: FileCheck --input-file=%t.yaml --check-prefix=CHECK-PDB2YAML %s
+
+# CHECK-YAML2PDB:      SC[.text]   | mod = 1, 0001:0000, size = 15, data crc = 0, reloc crc = 0
+# CHECK-YAML2PDB-NEXT:               IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ
+# CHECK-YAML2PDB-NEXT: SC[.text]   | mod = 0, 0001:0032, size = 44, data crc = 994759651, reloc crc = 0
+# CHECK-YAML2PDB-NEXT:               IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_MEM_EXECUTE |
+# CHECK-YAML2PDB-NEXT:               IMAGE_SCN_MEM_READ
+# CHECK-YAML2PDB-NEXT: SC[.text]   | mod = 0, 0001:0096, size = 22, data crc = 3114067823, reloc crc = 0
+# CHECK-YAML2PDB-NEXT:               IMAGE_SCN_CNT_CODE | IMAGE_SCN_LNK_COMDAT | IMAGE_SCN_ALIGN_16BYTES |
+# CHECK-YAML2PDB-NEXT:               IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ
+# CHECK-YAML2PDB-NEXT: SC[.rdata]  | mod = 1, 0002:0000, size = 56, data crc = 0, reloc crc = 0
+# CHECK-YAML2PDB-NEXT:               IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_READ
+# CHECK-YAML2PDB-NEXT: SC[.rdata]  | mod = 1, 0002:0324, size = 58, data crc = 0, reloc crc = 0
+# CHECK-YAML2PDB-NEXT:               IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_READ
+# CHECK-YAML2PDB-NEXT: SC[.rdata]  | mod = 1, 0002:0384, size = 20, data crc = 0, reloc crc = 0
+# CHECK-YAML2PDB-NEXT:               IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_READ
+# CHECK-YAML2PDB-NEXT: SC[.rdata]  | mod = 0, 0002:0676, size = 8, data crc = 931692337, reloc crc = 0
+# CHECK-YAML2PDB-NEXT:               IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_READ
+
+# CHECK-PDB2YAML:      SectionContribs:
+# CHECK-PDB2YAML-NEXT:   Version:         Ver60
+# CHECK-PDB2YAML-NEXT:   Items:
+# CHECK-PDB2YAML-NEXT:     - ISect:           1
+# CHECK-PDB2YAML-NEXT:       Offset:          0
+# CHECK-PDB2YAML-NEXT:       Size:            15
+# CHECK-PDB2YAML-NEXT:       Characteristics: 1610612768
+# CHECK-PDB2YAML-NEXT:       Imod:            1
+# CHECK-PDB2YAML-NEXT:       DataCrc:         0
+# CHECK-PDB2YAML-NEXT:       RelocCrc:        0
+# CHECK-PDB2YAML-NEXT:       ISectCoff:       0
+# CHECK-PDB2YAML-NEXT:     - ISect:           1
+# CHECK-PDB2YAML-NEXT:       Offset:          32
+# CHECK-PDB2YAML-NEXT:       Size:            44
+# CHECK-PDB2YAML-NEXT:       Characteristics: 1615855648
+# CHECK-PDB2YAML-NEXT:       Imod:            0
+# CHECK-PDB2YAML-NEXT:       DataCrc:         994759651
+# CHECK-PDB2YAML-NEXT:       RelocCrc:        0
+# CHECK-PDB2YAML-NEXT:       ISectCoff:       0
+# CHECK-PDB2YAML-NEXT:     - ISect:           1
+# CHECK-PDB2YAML-NEXT:       Offset:          96
+# CHECK-PDB2YAML-NEXT:       Size:            22
+# CHECK-PDB2YAML-NEXT:       Characteristics: 1615859744
+# CHECK-PDB2YAML-NEXT:       Imod:            0
+# CHECK-PDB2YAML-NEXT:       DataCrc:         3114067823
+# CHECK-PDB2YAML-NEXT:       RelocCrc:        0
+# CHECK-PDB2YAML-NEXT:       ISectCoff:       0
+# CHECK-PDB2YAML-NEXT:     - ISect:           2
+# CHECK-PDB2YAML-NEXT:       Offset:          0
+# CHECK-PDB2YAML-NEXT:       Size:            56
+# CHECK-PDB2YAML-NEXT:       Characteristics: 1076887616
+# CHECK-PDB2YAML-NEXT:       Imod:            1
+# CHECK-PDB2YAML-NEXT:       DataCrc:         0
+# CHECK-PDB2YAML-NEXT:       RelocCrc:        0
+# CHECK-PDB2YAML-NEXT:       ISectCoff:       0
+# CHECK-PDB2YAML-NEXT:     - ISect:           2
+# CHECK-PDB2YAML-NEXT:       Offset:          324
+# CHECK-PDB2YAML-NEXT:       Size:            58
+# CHECK-PDB2YAML-NEXT:       Characteristics: 1076887616
+# CHECK-PDB2YAML-NEXT:       Imod:            1
+# CHECK-PDB2YAML-NEXT:       DataCrc:         0
+# CHECK-PDB2YAML-NEXT:       RelocCrc:        0
+# CHECK-PDB2YAML-NEXT:       ISectCoff:       0
+# CHECK-PDB2YAML-NEXT:     - ISect:           2
+# CHECK-PDB2YAML-NEXT:       Offset:          384
+# CHECK-PDB2YAML-NEXT:       Size:            20
+# CHECK-PDB2YAML-NEXT:       Characteristics: 1076887616
+# CHECK-PDB2YAML-NEXT:       Imod:            1
+# CHECK-PDB2YAML-NEXT:       DataCrc:         0
+# CHECK-PDB2YAML-NEXT:       RelocCrc:        0
+# CHECK-PDB2YAML-NEXT:       ISectCoff:       0
+# CHECK-PDB2YAML-NEXT:     - ISect:           2
+# CHECK-PDB2YAML-NEXT:       Offset:          676
+# CHECK-PDB2YAML-NEXT:       Size:            8
+# CHECK-PDB2YAML-NEXT:       Characteristics: 1076887616
+# CHECK-PDB2YAML-NEXT:       Imod:            0
+# CHECK-PDB2YAML-NEXT:       DataCrc:         931692337
+# CHECK-PDB2YAML-NEXT:       RelocCrc:        0
+# CHECK-PDB2YAML-NEXT:       ISectCoff:       0
+
+---
+DbiStream:
+  VerHeader:       V70
+  Age:             3
+  BuildNumber:     36402
+  PdbDllVersion:   35728
+  PdbDllRbld:      0
+  Flags:           1
+  MachineType:     Amd64
+  SectionHeaders:
+    - Name:            .text
+      VirtualSize:     4229
+      VirtualAddress:  4096
+      SizeOfRawData:   4608
+      PointerToRawData: 1024
+      PointerToRelocations: 0
+      PointerToLinenumbers: 0
+      NumberOfRelocations: 0
+      NumberOfLinenumbers: 0
+      Characteristics: 1610612768
+    - Name:            .rdata
+      VirtualSize:     1196
+      VirtualAddress:  12288
+      SizeOfRawData:   1536
+      PointerToRawData: 5632
+      PointerToRelocations: 0
+      PointerToLinenumbers: 0
+      NumberOfRelocations: 0
+      NumberOfLinenumbers: 0
+      Characteristics: 1073741888
+    - Name:            .pdata
+      VirtualSize:     312
+      VirtualAddress:  16384
+      SizeOfRawData:   512
+      PointerToRawData: 7168
+      PointerToRelocations: 0
+      PointerToLinenumbers: 0
+      NumberOfRelocations: 0
+      NumberOfLinenumbers: 0
+      Characteristics: 1073741888
+    - Name:            .reloc
+      VirtualSize:     8
+      VirtualAddress:  20480
+      SizeOfRawData:   512
+      PointerToRawData: 7680
+      PointerToRelocations: 0
+      PointerToLinenumbers: 0
+      NumberOfRelocations: 0
+      NumberOfLinenumbers: 0
+      Characteristics: 1107296320
+  SectionContribs:
+    Version:         Ver60
+    Items:
+      - ISect:           1
+        Offset:          0
+        Size:            15
+        Characteristics: 1610612768
+        Imod:            1
+        DataCrc:         0
+        RelocCrc:        0
+        ISectCoff:       0
+      - ISect:           1
+        Offset:          32
+        Size:            44
+        Characteristics: 1615855648
+        Imod:            0
+        DataCrc:         994759651
+        RelocCrc:        0
+        ISectCoff:       0
+      - ISect:           1
+        Offset:          96
+        Size:            22
+        Characteristics: 1615859744
+        Imod:            0
+        DataCrc:         3114067823
+        RelocCrc:        0
+        ISectCoff:       0
+      - ISect:           2
+        Offset:          0
+        Size:            56
+        Characteristics: 1076887616
+        Imod:            1
+        DataCrc:         0
+        RelocCrc:        0
+        ISectCoff:       0
+      - ISect:           2
+        Offset:          324
+        Size:            58
+        Characteristics: 1076887616
+        Imod:            1
+        DataCrc:         0
+        RelocCrc:        0
+        ISectCoff:       0
+      - ISect:           2
+        Offset:          384
+        Size:            20
+        Characteristics: 1076887616
+        Imod:            1
+        DataCrc:         0
+        RelocCrc:        0
+        ISectCoff:       0
+      - ISect:           2
+        Offset:          676
+        Size:            8
+        Characteristics: 1076887616
+        Imod:            0
+        DataCrc:         931692337
+        RelocCrc:        0
+        ISectCoff:       0
+...
diff --git a/llvm/tools/llvm-pdbutil/PdbYaml.cpp b/llvm/tools/llvm-pdbutil/PdbYaml.cpp
index 4131292c5c908..9c14d2e0ed724 100644
--- a/llvm/tools/llvm-pdbutil/PdbYaml.cpp
+++ b/llvm/tools/llvm-pdbutil/PdbYaml.cpp
@@ -25,6 +25,7 @@ using namespace llvm::yaml;
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::CoffSectionHeader)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::NamedStreamMapping)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbDbiModuleInfo)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbDbiSectionContrib)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::StreamBlockList)
 LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(llvm::pdb::PdbRaw_FeatureSig)
 
@@ -99,6 +100,13 @@ template <> struct ScalarEnumerationTraits<llvm::pdb::PdbRaw_FeatureSig> {
     io.enumCase(Features, "VC140", PdbRaw_FeatureSig::VC140);
   }
 };
+
+template <> struct ScalarEnumerationTraits<llvm::pdb::PdbRaw_DbiSecContribVer> {
+  static void enumeration(IO &IO, PdbRaw_DbiSecContribVer &Ver) {
+    IO.enumCase(Ver, "Ver60", PdbRaw_DbiSecContribVer::DbiSecContribVer60);
+    IO.enumCase(Ver, "V2", PdbRaw_DbiSecContribVer::DbiSecContribV2);
+  }
+};
 }
 }
 
@@ -191,6 +199,25 @@ void MappingTraits<PdbInfoStream>::mapping(IO &IO, PdbInfoStream &Obj) {
   IO.mapOptional("Version", Obj.Version, PdbImplVC70);
 }
 
+void MappingTraits<PdbDbiSectionContribs>::mapping(IO &IO,
+                                                   PdbDbiSectionContribs &Obj) {
+  IO.mapOptional("Version", Obj.Version,
+                 PdbRaw_DbiSecContribVer::DbiSecContribVer60);
+  IO.mapOptional("Items", Obj.Items);
+}
+
+void MappingTraits<PdbDbiSectionContrib>::mapping(IO &IO,
+                                                  PdbDbiSectionContrib &Obj) {
+  IO.mapOptional("ISect", Obj.ISect);
+  IO.mapOptional("Offset", Obj.Off);
+  IO.mapOptional("Size", Obj.Size);
+  IO.mapOptional("Characteristics", Obj.Characteristics);
+  IO.mapOptional("Imod", Obj.Imod);
+  IO.mapOptional("DataCrc", Obj.DataCrc);
+  IO.mapOptional("RelocCrc", Obj.RelocCrc);
+  IO.mapOptional("ISectCoff", Obj.ISectCoff);
+}
+
 void MappingTraits<PdbDbiStream>::mapping(IO &IO, PdbDbiStream &Obj) {
   IO.mapOptional("VerHeader", Obj.VerHeader, PdbDbiV70);
   IO.mapOptional("Age", Obj.Age, 1U);
@@ -208,6 +235,7 @@ void MappingTraits<PdbDbiStream>::mapping(IO &IO, PdbDbiStream &Obj) {
   }
   IO.mapOptional("Modules", Obj.ModInfos);
   IO.mapOptional("SectionHeaders", Obj.SectionHeaders);
+  IO.mapOptional("SectionContribs", Obj.SectionContribs);
 }
 
 void MappingTraits<PdbTpiStream>::mapping(IO &IO,
diff --git a/llvm/tools/llvm-pdbutil/PdbYaml.h b/llvm/tools/llvm-pdbutil/PdbYaml.h
index 874667577218d..931af36b5605a 100644
--- a/llvm/tools/llvm-pdbutil/PdbYaml.h
+++ b/llvm/tools/llvm-pdbutil/PdbYaml.h
@@ -90,6 +90,23 @@ struct PdbDbiModuleInfo {
   std::optional<PdbModiStream> Modi;
 };
 
+struct PdbDbiSectionContrib {
+  uint16_t ISect = 0;
+  int32_t Off = 0;
+  int32_t Size = 0;
+  uint32_t Characteristics = 0;
+  uint16_t Imod = 0;
+  uint32_t DataCrc = 0;
+  uint32_t RelocCrc = 0;
+  /// Only in `SectionContrib2`.
+  uint32_t ISectCoff = 0;
+};
+
+struct PdbDbiSectionContribs {
+  PdbRaw_DbiSecContribVer Version = PdbRaw_DbiSecContribVer::DbiSecContribVer60;
+  std::vector<PdbDbiSectionContrib> Items;
+};
+
 struct PdbDbiStream {
   PdbRaw_DbiVer VerHeader = PdbDbiV70;
   uint32_t Age = 1;
@@ -102,6 +119,7 @@ struct PdbDbiStream {
   std::vector<PdbDbiModuleInfo> ModInfos;
   COFF::header FakeHeader;
   std::vector<CoffSectionHeader> SectionHeaders;
+  std::optional<PdbDbiSectionContribs> SectionContribs;
 };
 
 struct PdbTpiStream {
@@ -139,6 +157,8 @@ LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::MSFHeaders)
 LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(msf::SuperBlock)
 LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::StreamBlockList)
 LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::PdbInfoStream)
+LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::PdbDbiSectionContrib)
+LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::PdbDbiSectionContribs)
 LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::PdbDbiStream)
 LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::PdbTpiStream)
 LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::PdbPublicsStream)
diff --git a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp
index 8fe7f600d173c..99d4c5aa3f733 100644
--- a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp
+++ b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp
@@ -19,6 +19,7 @@
 #include "llvm/DebugInfo/MSF/MappedBlockStream.h"
 #include "llvm/DebugInfo/PDB/Native/DbiStream.h"
 #include "llvm/DebugInfo/PDB/Native/GlobalsStream.h"
+#include "llvm/DebugInfo/PDB/Native/ISectionContribVisitor.h"
 #include "llvm/DebugInfo/PDB/Native/InfoStream.h"
 #include "llvm/DebugInfo/PDB/Native/ModuleDebugStream.h"
 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
@@ -303,6 +304,41 @@ Error YAMLOutputStyle::dumpDbiStream() {
     }
   }
 
+  if (opts::pdb2yaml::DumpSectionContribs) {
+    struct Visitor : public ISectionContribVisitor {
+      Visitor(std::vector<yaml::PdbDbiSectionContrib> &Out) : Out(Out) {}
+
+      static yaml::PdbDbiSectionContrib createFromSC(const SectionContrib &C) {
+        yaml::PdbDbiSectionContrib SC;
+        SC.ISect = C.ISect;
+        SC.Off = C.Off;
+        SC.Size = C.Size;
+        SC.Characteristics = C.Characteristics;
+        SC.Imod = C.Imod;
+        SC.DataCrc = C.DataCrc;
+        SC.RelocCrc = C.RelocCrc;
+        return SC;
+      }
+
+      void visit(const SectionContrib &C) override {
+        Out.emplace_back(createFromSC(C));
+      }
+      void visit(const SectionContrib2 &C) override {
+        yaml::PdbDbiSectionContrib SC = createFromSC(C.Base);
+        SC.ISectCoff = C.ISectCoff;
+        Out.emplace_back(SC);
+      }
+
+      std::vector<yaml::PdbDbiSectionContrib> &Out;
+    };
+    Obj.DbiStream->SectionContribs.emplace(yaml::PdbDbiSectionContribs{
+        /*Version=*/DS.getSectionContributionsVersion(),
+        /*Items=*/{},
+    });
+    Visitor Vis(Obj.DbiStream->SectionContribs->Items);
+    DS.visitSectionContributions(Vis);
+  }
+
   return Error::success();
 }
 
diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
index 16ecc59b0db87..f7a81ef085399 100644
--- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
+++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
@@ -721,6 +721,10 @@ cl::opt<bool> DumpSectionHeaders("section-headers",
                                  cl::desc("Dump section headers."),
                                  cl::cat(FileOptions),
                                  cl::sub(PdbToYamlSubcommand));
+cl::opt<bool> DumpSectionContribs("section-contribs",
+                                  cl::desc("dump section contributions"),
+                                  cl::cat(FileOptions),
+                                  cl::sub(PdbToYamlSubcommand));
 
 cl::list<std::string> InputFilename(cl::Positional,
                                     cl::desc("<input PDB file>"), cl::Required,
@@ -870,6 +874,31 @@ static void yamlToPdb(StringRef Path) {
     }
   }
 
+  if (Dbi.SectionContribs) {
+    if (Dbi.SectionContribs->Version !=
+        PdbRaw_DbiSecContribVer::DbiSecContribVer60) {
+      errs() << "Only DBI section contrib Version Ver60 is supported\n";
+      errs().flush();
+      exit(1);
+    }
+
+    for (const auto &Contrib : Dbi.SectionContribs->Items) {
+      SectionContrib SC;
+      SC.ISect = Contrib.ISect;
+      SC.Padding[0] = 0;
+      SC.Padding[1] = 0;
+      SC.Off = Contrib.Off;
+      SC.Size = Contrib.Size;
+      SC.Characteristics = Contrib.Characteristics;
+      SC.Imod = Contrib.Imod;
+      SC.Padding2[0] = 0;
+      SC.Padding2[1] = 0;
+      SC.DataCrc = Contrib.DataCrc;
+      SC.RelocCrc = Contrib.RelocCrc;
+      DbiBuilder.addSectionContrib(SC);
+    }
+  }
+
   std::vector<object::coff_section> Sections;
   if (!Dbi.SectionHeaders.empty()) {
     for (const auto &Hdr : Dbi.SectionHeaders)
@@ -1565,6 +1594,7 @@ int main(int Argc, const char **Argv) {
       opts::pdb2yaml::DumpModuleFiles = true;
       opts::pdb2yaml::DumpModuleSyms = true;
       opts::pdb2yaml::DumpSectionHeaders = true;
+      opts::pdb2yaml::DumpSectionContribs = true;
       opts::pdb2yaml::DumpModuleSubsections.push_back(
           opts::ModuleSubsection::All);
     }
@@ -1578,6 +1608,9 @@ int main(int Argc, const char **Argv) {
 
     if (opts::pdb2yaml::DumpSectionHeaders)
       opts::pdb2yaml::DbiStream = true;
+
+    if (opts::pdb2yaml::DumpSectionContribs)
+      opts::pdb2yaml::DbiStream = true;
   }
 
   llvm::sys::InitializeCOMRAII COM(llvm::sys::COMThreadingMode::MultiThreaded);
diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.h b/llvm/tools/llvm-pdbutil/llvm-pdbutil.h
index 73ff2fe86f93a..0fca047f53b3d 100644
--- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.h
+++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.h
@@ -202,6 +202,7 @@ extern llvm::cl::opt<bool> DumpModuleFiles;
 extern llvm::cl::list<ModuleSubsection> DumpModuleSubsections;
 extern llvm::cl::opt<bool> DumpModuleSyms;
 extern llvm::cl::opt<bool> DumpSectionHeaders;
+extern llvm::cl::opt<bool> DumpSectionContribs;
 } // namespace pdb2yaml
 
 namespace explain {



More information about the llvm-commits mailing list