[llvm] ea7db62 - [ObjectYAML][DWARF] Make the `PubSection` optional.

Xing GUO via llvm-commits llvm-commits at lists.llvm.org
Fri May 29 05:08:23 PDT 2020


Author: Xing GUO
Date: 2020-05-29T20:11:53+08:00
New Revision: ea7db621d289022f0733eb63bb10a837936cbb38

URL: https://github.com/llvm/llvm-project/commit/ea7db621d289022f0733eb63bb10a837936cbb38
DIFF: https://github.com/llvm/llvm-project/commit/ea7db621d289022f0733eb63bb10a837936cbb38.diff

LOG: [ObjectYAML][DWARF] Make the `PubSection` optional.

This patch helps make the `PubSection` optional in the DWARF structure.

Reviewed By: jhenderson, aprantl

Differential Revision: https://reviews.llvm.org/D80722

Added: 
    

Modified: 
    llvm/include/llvm/ObjectYAML/DWARFYAML.h
    llvm/lib/ObjectYAML/DWARFYAML.cpp
    llvm/lib/ObjectYAML/MachOEmitter.cpp
    llvm/test/ObjectYAML/MachO/DWARF-pubsections.yaml
    llvm/tools/obj2yaml/dwarf2yaml.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ObjectYAML/DWARFYAML.h b/llvm/include/llvm/ObjectYAML/DWARFYAML.h
index 806dd13715e5..509417beb283 100644
--- a/llvm/include/llvm/ObjectYAML/DWARFYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DWARFYAML.h
@@ -99,6 +99,9 @@ struct PubSection {
   uint32_t UnitSize;
   bool IsGNUStyle = false;
   std::vector<PubEntry> Entries;
+
+  PubSection() = default;
+  PubSection(bool IsGNUStyle) : IsGNUStyle(IsGNUStyle) {}
 };
 
 struct FormValue {
@@ -161,11 +164,11 @@ struct Data {
   std::vector<StringRef> DebugStrings;
   std::vector<ARange> ARanges;
   std::vector<Ranges> DebugRanges;
-  PubSection PubNames;
-  PubSection PubTypes;
+  Optional<PubSection> PubNames;
+  Optional<PubSection> PubTypes;
 
-  PubSection GNUPubNames;
-  PubSection GNUPubTypes;
+  Optional<PubSection> GNUPubNames;
+  Optional<PubSection> GNUPubTypes;
 
   std::vector<Unit> CompileUnits;
 

diff  --git a/llvm/lib/ObjectYAML/DWARFYAML.cpp b/llvm/lib/ObjectYAML/DWARFYAML.cpp
index 4805f727e0ce..30a77c74dc6c 100644
--- a/llvm/lib/ObjectYAML/DWARFYAML.cpp
+++ b/llvm/lib/ObjectYAML/DWARFYAML.cpp
@@ -17,10 +17,8 @@ namespace llvm {
 
 bool DWARFYAML::Data::isEmpty() const {
   return DebugStrings.empty() && AbbrevDecls.empty() && ARanges.empty() &&
-         DebugRanges.empty() && PubNames.Entries.empty() &&
-         PubTypes.Entries.empty() && GNUPubNames.Entries.empty() &&
-         GNUPubTypes.Entries.empty() && CompileUnits.empty() &&
-         DebugLines.empty();
+         DebugRanges.empty() && !PubNames && !PubTypes && !GNUPubNames &&
+         !GNUPubTypes && CompileUnits.empty() && DebugLines.empty();
 }
 
 SetVector<StringRef> DWARFYAML::Data::getUsedSectionNames() const {
@@ -41,14 +39,10 @@ void MappingTraits<DWARFYAML::Data>::mapping(IO &IO, DWARFYAML::Data &DWARF) {
     IO.mapOptional("debug_aranges", DWARF.ARanges);
   if (!DWARF.DebugRanges.empty() || !IO.outputting())
     IO.mapOptional("debug_ranges", DWARF.DebugRanges);
-  if (!DWARF.PubNames.Entries.empty() || !IO.outputting())
-    IO.mapOptional("debug_pubnames", DWARF.PubNames);
-  if (!DWARF.PubTypes.Entries.empty() || !IO.outputting())
-    IO.mapOptional("debug_pubtypes", DWARF.PubTypes);
-  if (!DWARF.GNUPubNames.Entries.empty() || !IO.outputting())
-    IO.mapOptional("debug_gnu_pubnames", DWARF.GNUPubNames);
-  if (!DWARF.GNUPubTypes.Entries.empty() || !IO.outputting())
-    IO.mapOptional("debug_gnu_pubtypes", DWARF.GNUPubTypes);
+  IO.mapOptional("debug_pubnames", DWARF.PubNames);
+  IO.mapOptional("debug_pubtypes", DWARF.PubTypes);
+  IO.mapOptional("debug_gnu_pubnames", DWARF.GNUPubNames);
+  IO.mapOptional("debug_gnu_pubtypes", DWARF.GNUPubTypes);
   IO.mapOptional("debug_info", DWARF.CompileUnits);
   IO.mapOptional("debug_line", DWARF.DebugLines);
   IO.setContext(&oldContext);

diff  --git a/llvm/lib/ObjectYAML/MachOEmitter.cpp b/llvm/lib/ObjectYAML/MachOEmitter.cpp
index f8661e0c3c31..c9bca43a4ef9 100644
--- a/llvm/lib/ObjectYAML/MachOEmitter.cpp
+++ b/llvm/lib/ObjectYAML/MachOEmitter.cpp
@@ -295,11 +295,13 @@ Error MachOWriter::writeSectionData(raw_ostream &OS) {
           } else if (0 == strncmp(&Sec.sectname[0], "__debug_ranges", 16)) {
             DWARFYAML::EmitDebugRanges(OS, Obj.DWARF);
           } else if (0 == strncmp(&Sec.sectname[0], "__debug_pubnames", 16)) {
-            DWARFYAML::EmitPubSection(OS, Obj.DWARF.PubNames,
-                                      Obj.IsLittleEndian);
+            if (Obj.DWARF.PubNames)
+              DWARFYAML::EmitPubSection(OS, *Obj.DWARF.PubNames,
+                                        Obj.IsLittleEndian);
           } else if (0 == strncmp(&Sec.sectname[0], "__debug_pubtypes", 16)) {
-            DWARFYAML::EmitPubSection(OS, Obj.DWARF.PubTypes,
-                                      Obj.IsLittleEndian);
+            if (Obj.DWARF.PubTypes)
+              DWARFYAML::EmitPubSection(OS, *Obj.DWARF.PubTypes,
+                                        Obj.IsLittleEndian);
           } else if (0 == strncmp(&Sec.sectname[0], "__debug_info", 16)) {
             DWARFYAML::EmitDebugInfo(OS, Obj.DWARF);
           } else if (0 == strncmp(&Sec.sectname[0], "__debug_line", 16)) {

diff  --git a/llvm/test/ObjectYAML/MachO/DWARF-pubsections.yaml b/llvm/test/ObjectYAML/MachO/DWARF-pubsections.yaml
index f2eadd20d8a7..4faac060c8a5 100644
--- a/llvm/test/ObjectYAML/MachO/DWARF-pubsections.yaml
+++ b/llvm/test/ObjectYAML/MachO/DWARF-pubsections.yaml
@@ -1,3 +1,9 @@
+## This file contains test cases for generating .debug_pubnames/.debug_pubtypes
+## section in object files from the DWARF entry of Mach-O YAML inputs
+
+## a) Test that yaml2obj emits the .debug_pubnames and .debug_pubtypes sections and
+## obj2yaml converts them back.
+
 # RUN: yaml2obj %s | obj2yaml | FileCheck %s
 
 --- !mach-o
@@ -345,3 +351,87 @@ DWARF:
 #CHECK:       - DieOffset:       0x00000071
 #CHECK:         Name:            char
 #CHECK: ...
+
+## b) Test that yaml2obj will not emit the .debug_pubnames/.debug_pubtypes section's
+## contents, if the "debug_pubnames"/"debug_pubtypes" entry doesn't exist in the
+## "DWARF" entry.
+
+# RUN: yaml2obj --docnum=2 %s | obj2yaml | FileCheck %s --check-prefix=EMPTY
+
+#      EMPTY: Sections:
+# EMPTY-NEXT:   - sectname:        __debug_pubnames
+# EMPTY-NEXT:     segname:         __DWARF
+# EMPTY-NEXT:     addr:            0x0000000000000000
+# EMPTY-NEXT:     size:            0
+# EMPTY-NEXT:     offset:          0x00000000
+# EMPTY-NEXT:     align:           0
+# EMPTY-NEXT:     reloff:          0x00000000
+# EMPTY-NEXT:     nreloc:          0
+# EMPTY-NEXT:     flags:           0x00000000
+# EMPTY-NEXT:     reserved1:       0x00000000
+# EMPTY-NEXT:     reserved2:       0x00000000
+# EMPTY-NEXT:     reserved3:       0x00000000
+# EMPTY-NEXT:     content:         ''
+# EMPTY-NEXT:   - sectname:        __debug_pubtypes
+# EMPTY-NEXT:     segname:         __DWARF
+# EMPTY-NEXT:     addr:            0x0000000000000000
+# EMPTY-NEXT:     size:            0
+# EMPTY-NEXT:     offset:          0x00000720
+# EMPTY-NEXT:     align:           0
+# EMPTY-NEXT:     reloff:          0x00000000
+# EMPTY-NEXT:     nreloc:          0
+# EMPTY-NEXT:     flags:           0x00000000
+# EMPTY-NEXT:     reserved1:       0x00000000
+# EMPTY-NEXT:     reserved2:       0x00000000
+# EMPTY-NEXT:     reserved3:       0x00000000
+# EMPTY-NEXT:     content:         ''
+# EMPTY-NEXT: ...
+
+--- !mach-o
+FileHeader:
+  magic:      0xFEEDFACF
+  cputype:    0x01000007
+  cpusubtype: 0x00000003
+  filetype:   0x0000000A
+  ncmds:      1
+  sizeofcmds: 1800
+  flags:      0x00000000
+  reserved:   0x00000000
+LoadCommands:
+  - cmd:      LC_SEGMENT_64
+    cmdsize:  232
+    segname:  __DWARF
+    vmaddr:   0x00000000
+    vmsize:   0x00000000
+    fileoff:  0
+    filesize: 0
+    maxprot:  0
+    initprot: 0
+    nsects:   2
+    flags:    0
+    Sections:
+      - sectname:  __debug_pubnames
+        segname:   __DWARF
+        addr:      0x0000000000000000
+        size:      0
+        offset:    0x00000000
+        align:     0
+        reloff:    0x00000000
+        nreloc:    0
+        flags:     0x00000000
+        reserved1: 0x00000000
+        reserved2: 0x00000000
+        reserved3: 0x00000000
+      - sectname:  __debug_pubtypes
+        segname:   __DWARF
+        addr:      0x0000000000000000
+        size:      0
+        offset:    0x00000720
+        align:     0
+        reloff:    0x00000000
+        nreloc:    0
+        flags:     0x00000000
+        reserved1: 0x00000000
+        reserved2: 0x00000000
+        reserved3: 0x00000000
+DWARF:

diff  --git a/llvm/tools/obj2yaml/dwarf2yaml.cpp b/llvm/tools/obj2yaml/dwarf2yaml.cpp
index a007efe7e507..0a1cac8c73c1 100644
--- a/llvm/tools/obj2yaml/dwarf2yaml.cpp
+++ b/llvm/tools/obj2yaml/dwarf2yaml.cpp
@@ -11,6 +11,7 @@
 #include "llvm/DebugInfo/DWARF/DWARFDebugArangeSet.h"
 #include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h"
 #include "llvm/DebugInfo/DWARF/DWARFFormValue.h"
+#include "llvm/DebugInfo/DWARF/DWARFSection.h"
 #include "llvm/ObjectYAML/DWARFYAML.h"
 
 #include <algorithm>
@@ -135,17 +136,32 @@ void dumpPubSection(DWARFContext &DCtx, DWARFYAML::PubSection &Y,
 
 void dumpDebugPubSections(DWARFContext &DCtx, DWARFYAML::Data &Y) {
   const DWARFObject &D = DCtx.getDWARFObj();
-  Y.PubNames.IsGNUStyle = false;
-  dumpPubSection(DCtx, Y.PubNames, D.getPubnamesSection());
 
-  Y.PubTypes.IsGNUStyle = false;
-  dumpPubSection(DCtx, Y.PubTypes, D.getPubtypesSection());
+  const DWARFSection PubNames = D.getPubnamesSection();
+  if (!PubNames.Data.empty()) {
+    Y.PubNames.emplace(/*IsGNUStyle=*/false);
+    dumpPubSection(DCtx, *Y.PubNames, PubNames);
+  }
 
-  Y.GNUPubNames.IsGNUStyle = true;
-  dumpPubSection(DCtx, Y.GNUPubNames, D.getGnuPubnamesSection());
+  const DWARFSection PubTypes = D.getPubtypesSection();
+  if (!PubTypes.Data.empty()) {
+    Y.PubTypes.emplace(/*IsGNUStyle=*/false);
+    dumpPubSection(DCtx, *Y.PubTypes, PubTypes);
+  }
 
-  Y.GNUPubTypes.IsGNUStyle = true;
-  dumpPubSection(DCtx, Y.GNUPubTypes, D.getGnuPubtypesSection());
+  const DWARFSection GNUPubNames = D.getGnuPubnamesSection();
+  if (!GNUPubNames.Data.empty()) {
+    // TODO: Test dumping .debug_gnu_pubnames section.
+    Y.GNUPubNames.emplace(/*IsGNUStyle=*/true);
+    dumpPubSection(DCtx, *Y.GNUPubNames, GNUPubNames);
+  }
+
+  const DWARFSection GNUPubTypes = D.getGnuPubtypesSection();
+  if (!GNUPubTypes.Data.empty()) {
+    // TODO: Test dumping .debug_gnu_pubtypes section.
+    Y.GNUPubTypes.emplace(/*IsGNUStyle=*/true);
+    dumpPubSection(DCtx, *Y.GNUPubTypes, GNUPubTypes);
+  }
 }
 
 void dumpDebugInfo(DWARFContext &DCtx, DWARFYAML::Data &Y) {


        


More information about the llvm-commits mailing list