aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXing GUO <higuoxing@gmail.com>2020-09-08 19:55:14 +0800
committerXing GUO <higuoxing@gmail.com>2020-09-08 19:55:47 +0800
commit25c3fa3f13336b2da7c63162b0d9da164a0a96a1 (patch)
tree1978200523dc4c3d08e6a8315b0f9df2c97e5105
parent847299d3f00507f172097bad9dde61dfad0d355b (diff)
downloadllvm-25c3fa3f13336b2da7c63162b0d9da164a0a96a1.zip
llvm-25c3fa3f13336b2da7c63162b0d9da164a0a96a1.tar.gz
llvm-25c3fa3f13336b2da7c63162b0d9da164a0a96a1.tar.bz2
[DWARFYAML] Make the debug_ranges section optional.
This patch makes the debug_ranges section optional. When we specify an empty debug_ranges section, yaml2obj only emits the section header. Reviewed By: jhenderson Differential Revision: https://reviews.llvm.org/D87263
-rw-r--r--llvm/include/llvm/ObjectYAML/DWARFYAML.h2
-rw-r--r--llvm/lib/ObjectYAML/DWARFEmitter.cpp2
-rw-r--r--llvm/lib/ObjectYAML/DWARFYAML.cpp5
-rw-r--r--llvm/test/ObjectYAML/MachO/DWARF-debug_ranges.yaml45
-rw-r--r--llvm/test/tools/yaml2obj/ELF/DWARF/debug-ranges.yaml14
-rw-r--r--llvm/tools/obj2yaml/dwarf2yaml.cpp5
6 files changed, 67 insertions, 6 deletions
diff --git a/llvm/include/llvm/ObjectYAML/DWARFYAML.h b/llvm/include/llvm/ObjectYAML/DWARFYAML.h
index 99a7af8..3e5be41 100644
--- a/llvm/include/llvm/ObjectYAML/DWARFYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DWARFYAML.h
@@ -214,7 +214,7 @@ struct Data {
Optional<std::vector<StringRef>> DebugStrings;
Optional<std::vector<StringOffsetsTable>> DebugStrOffsets;
Optional<std::vector<ARange>> DebugAranges;
- std::vector<Ranges> DebugRanges;
+ Optional<std::vector<Ranges>> DebugRanges;
Optional<std::vector<AddrTableEntry>> DebugAddr;
Optional<PubSection> PubNames;
Optional<PubSection> PubTypes;
diff --git a/llvm/lib/ObjectYAML/DWARFEmitter.cpp b/llvm/lib/ObjectYAML/DWARFEmitter.cpp
index bf29f40..b634f7c 100644
--- a/llvm/lib/ObjectYAML/DWARFEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DWARFEmitter.cpp
@@ -190,7 +190,7 @@ Error DWARFYAML::emitDebugAranges(raw_ostream &OS, const DWARFYAML::Data &DI) {
Error DWARFYAML::emitDebugRanges(raw_ostream &OS, const DWARFYAML::Data &DI) {
const size_t RangesOffset = OS.tell();
uint64_t EntryIndex = 0;
- for (auto DebugRanges : DI.DebugRanges) {
+ for (auto DebugRanges : *DI.DebugRanges) {
const size_t CurrOffset = OS.tell() - RangesOffset;
if (DebugRanges.Offset && (uint64_t)*DebugRanges.Offset < CurrOffset)
return createStringError(errc::invalid_argument,
diff --git a/llvm/lib/ObjectYAML/DWARFYAML.cpp b/llvm/lib/ObjectYAML/DWARFYAML.cpp
index 353e505..975b9b4 100644
--- a/llvm/lib/ObjectYAML/DWARFYAML.cpp
+++ b/llvm/lib/ObjectYAML/DWARFYAML.cpp
@@ -28,7 +28,7 @@ SetVector<StringRef> DWARFYAML::Data::getNonEmptySectionNames() const {
SecNames.insert("debug_str");
if (DebugAranges)
SecNames.insert("debug_aranges");
- if (!DebugRanges.empty())
+ if (DebugRanges)
SecNames.insert("debug_ranges");
if (!DebugLines.empty())
SecNames.insert("debug_line");
@@ -95,8 +95,7 @@ void MappingTraits<DWARFYAML::Data>::mapping(IO &IO, DWARFYAML::Data &DWARF) {
IO.mapOptional("debug_str", DWARF.DebugStrings);
IO.mapOptional("debug_abbrev", DWARF.DebugAbbrev);
IO.mapOptional("debug_aranges", DWARF.DebugAranges);
- if (!DWARF.DebugRanges.empty() || !IO.outputting())
- IO.mapOptional("debug_ranges", DWARF.DebugRanges);
+ IO.mapOptional("debug_ranges", DWARF.DebugRanges);
IO.mapOptional("debug_pubnames", DWARF.PubNames);
IO.mapOptional("debug_pubtypes", DWARF.PubTypes);
DWARFCtx.IsGNUPubSec = true;
diff --git a/llvm/test/ObjectYAML/MachO/DWARF-debug_ranges.yaml b/llvm/test/ObjectYAML/MachO/DWARF-debug_ranges.yaml
index 8948bf9..30997ba 100644
--- a/llvm/test/ObjectYAML/MachO/DWARF-debug_ranges.yaml
+++ b/llvm/test/ObjectYAML/MachO/DWARF-debug_ranges.yaml
@@ -239,3 +239,48 @@ DWARF:
- AbbrCode: 0x00000000
Values: []
...
+
+## Test generating and dumping an empty __debug_ranges section.
+
+# RUN: yaml2obj --docnum=2 %s | obj2yaml | FileCheck %s --check-prefix=EMPTY
+
+# EMPTY: DWARF:
+# EMPTY-NEXT: debug_ranges: []
+# EMPTY-NEXT: ...
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x01000007
+ cpusubtype: 0x00000003
+ filetype: 0x0000000A
+ ncmds: 1
+ sizeofcmds: 232
+ flags: 0x00000000
+ reserved: 0x00000000
+LoadCommands:
+ - cmd: LC_SEGMENT_64
+ cmdsize: 152
+ segname: __DWARF
+ vmaddr: 0x00
+ vmsize: 0x00
+ fileoff: 0x00
+ filesize: 0x00
+ maxprot: 0
+ initprot: 0
+ nsects: 1
+ flags: 0
+ Sections:
+ - sectname: __debug_ranges
+ segname: __DWARF
+ addr: 0x00
+ size: [[SIZE=0]]
+ offset: 0x210
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: [[CONTENT=<none>]]
diff --git a/llvm/test/tools/yaml2obj/ELF/DWARF/debug-ranges.yaml b/llvm/test/tools/yaml2obj/ELF/DWARF/debug-ranges.yaml
index 6a9cd7a6..f80dd6d 100644
--- a/llvm/test/tools/yaml2obj/ELF/DWARF/debug-ranges.yaml
+++ b/llvm/test/tools/yaml2obj/ELF/DWARF/debug-ranges.yaml
@@ -407,3 +407,17 @@ DWARF:
Entries:
- LowOffset: 0x1234
HighOffset: 0x5678
+
+## l) Test that the .debug_ranges section header is emitted if the "debug_ranges"
+## entry is empty.
+
+# RUN: yaml2obj --docnum=12 %s -o %t12.o
+# RUN: llvm-readobj -S %t12.o | FileCheck -DSIZE=0 -DADDRALIGN=1 %s --check-prefix=DWARF-HEADER
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+DWARF:
+ debug_ranges: []
diff --git a/llvm/tools/obj2yaml/dwarf2yaml.cpp b/llvm/tools/obj2yaml/dwarf2yaml.cpp
index cef7b69..1dcf6d4 100644
--- a/llvm/tools/obj2yaml/dwarf2yaml.cpp
+++ b/llvm/tools/obj2yaml/dwarf2yaml.cpp
@@ -114,6 +114,7 @@ Error dumpDebugRanges(DWARFContext &DCtx, DWARFYAML::Data &Y) {
DCtx.isLittleEndian(), AddrSize);
uint64_t Offset = 0;
DWARFDebugRangeList DwarfRanges;
+ std::vector<DWARFYAML::Ranges> DebugRanges;
while (Data.isValidOffset(Offset)) {
DWARFYAML::Ranges YamlRanges;
@@ -123,8 +124,10 @@ Error dumpDebugRanges(DWARFContext &DCtx, DWARFYAML::Data &Y) {
return E;
for (const auto &RLE : DwarfRanges.getEntries())
YamlRanges.Entries.push_back({RLE.StartAddress, RLE.EndAddress});
- Y.DebugRanges.push_back(std::move(YamlRanges));
+ DebugRanges.push_back(std::move(YamlRanges));
}
+
+ Y.DebugRanges = DebugRanges;
return ErrorSuccess();
}