diff --git a/llvm/include/llvm/ObjectYAML/DWARFYAML.h b/llvm/include/llvm/ObjectYAML/DWARFYAML.h --- a/llvm/include/llvm/ObjectYAML/DWARFYAML.h +++ b/llvm/include/llvm/ObjectYAML/DWARFYAML.h @@ -81,7 +81,7 @@ /// Class that describes a single range list inside the .debug_ranges section. struct Ranges { - llvm::yaml::Hex32 Offset; + Optional Offset; llvm::yaml::Hex8 AddrSize; std::vector Entries; }; diff --git a/llvm/lib/ObjectYAML/DWARFEmitter.cpp b/llvm/lib/ObjectYAML/DWARFEmitter.cpp --- a/llvm/lib/ObjectYAML/DWARFEmitter.cpp +++ b/llvm/lib/ObjectYAML/DWARFEmitter.cpp @@ -118,9 +118,13 @@ const size_t RangesOffset = OS.tell(); for (auto DebugRanges : DI.DebugRanges) { const size_t CurrOffset = OS.tell() - RangesOffset; - assert(DebugRanges.Offset <= CurrOffset); - if (DebugRanges.Offset > CurrOffset) - ZeroFillBytes(OS, DebugRanges.Offset - CurrOffset); + if (DebugRanges.Offset) { + assert(*DebugRanges.Offset >= CurrOffset && + "Offset should be greater than or equal to the bytes that we have " + "written"); + if (*DebugRanges.Offset > CurrOffset) + ZeroFillBytes(OS, *DebugRanges.Offset - CurrOffset); + } for (auto Entry : DebugRanges.Entries) { writeVariableSizedInteger(Entry.LowOffset, DebugRanges.AddrSize, OS, DI.IsLittleEndian); diff --git a/llvm/lib/ObjectYAML/DWARFYAML.cpp b/llvm/lib/ObjectYAML/DWARFYAML.cpp --- a/llvm/lib/ObjectYAML/DWARFYAML.cpp +++ b/llvm/lib/ObjectYAML/DWARFYAML.cpp @@ -92,7 +92,7 @@ void MappingTraits::mapping(IO &IO, DWARFYAML::Ranges &DebugRanges) { - IO.mapRequired("Offset", DebugRanges.Offset); + IO.mapOptional("Offset", DebugRanges.Offset); IO.mapRequired("AddrSize", DebugRanges.AddrSize); IO.mapRequired("Entries", DebugRanges.Entries); } diff --git a/llvm/test/tools/yaml2obj/ELF/DWARF/debug-ranges.yaml b/llvm/test/tools/yaml2obj/ELF/DWARF/debug-ranges.yaml --- a/llvm/test/tools/yaml2obj/ELF/DWARF/debug-ranges.yaml +++ b/llvm/test/tools/yaml2obj/ELF/DWARF/debug-ranges.yaml @@ -6,7 +6,7 @@ # RUN: yaml2obj --docnum=1 -DENDIAN=ELFDATA2LSB %s -o %t.le.o # RUN: llvm-readobj --sections --section-data %t.le.o | \ -# RUN: FileCheck %s -DSIZE=72 -DADDRALIGN=1 --check-prefixes=DWARF-HEADER,DWARF-LE-CONTENT +# RUN: FileCheck %s -DSIZE=88 -DADDRALIGN=1 --check-prefixes=DWARF-HEADER,DWARF-LE-CONTENT # DWARF-HEADER: Index: 1 # DWARF-HEADER-NEXT: Name: .debug_ranges (1) @@ -40,9 +40,14 @@ ## | | ## | +---------------- Terminating Entry (Lower bits, 8-byte) ## +---------------- HighOffset (8-byte) 0x40 -# DWARF-LE-CONTENT-NEXT: 0040: 00000000 00000000 -## | +# DWARF-LE-CONTENT-NEXT: 0040: 00000000 00000000 00000000 10000000 +## | | | +## | | +------- HighOffset (4-byte) 0x10 +## | +------- LowOffset (4-byte) 0x00 ## +---------------- Terminating Entry (Higher bits, 8-byte) +# DWARF-LE-CONTENT-NEXT: 0050: 00000000 00000000 +## | +## +---------------- Terminating Entry (8-byte) # DWARF-LE-CONTENT-NEXT: ) --- !ELF @@ -67,12 +72,16 @@ HighOffset: 0x0000000000000030 - LowOffset: 0x0000000000000000 HighOffset: 0x0000000000000040 + - AddrSize: 0x04 + Entries: + - LowOffset: 0x00000000 + HighOffset: 0x00000010 ## Generate and verify a big endian .debug_ranges section. # RUN: yaml2obj --docnum=1 -DENDIAN=ELFDATA2MSB %s -o %t.be.o # RUN: llvm-readobj --sections --section-data %t.be.o | \ -# RUN: FileCheck %s -DSIZE=72 -DADDRALIGN=1 --check-prefixes=DWARF-HEADER,DWARF-BE-CONTENT +# RUN: FileCheck %s -DSIZE=88 -DADDRALIGN=1 --check-prefixes=DWARF-HEADER,DWARF-BE-CONTENT # DWARF-BE-CONTENT: SectionData ( # DWARF-BE-CONTENT-NEXT: 0000: 00000000 00000010 00000000 00000020 @@ -94,9 +103,14 @@ ## | | ## | +---------------- Terminating Entry (Lower bits, 8-byte) ## +---------------- HighOffset (8-byte) 0x40 -# DWARF-BE-CONTENT-NEXT: 0040: 00000000 00000000 -## | +# DWARF-BE-CONTENT-NEXT: 0040: 00000000 00000000 00000000 00000010 +## | | | +## | | +------- HighOffset (4-byte) 0x10 +## | +------- LowOffset (4-byte) 0x00 ## +---------------- Terminating Entry (Higher bits, 8-byte) +# DWARF-BE-CONTENT-NEXT: 0050: 00000000 00000000 +## | +## +---------------- Terminating Entry (8-byte) # DWARF-BE-CONTENT-NEXT: ) ## b) Generate the .debug_ranges section from raw section content. @@ -159,8 +173,7 @@ Size: 0x10 DWARF: debug_ranges: - - Offset: 0 - AddrSize: 0x04 + - AddrSize: 0x04 Entries: - LowOffset: 0x00000000 HighOffset: 0x00000000 @@ -182,8 +195,7 @@ Content: "00" DWARF: debug_ranges: - - Offset: 0 - AddrSize: 0x04 + - AddrSize: 0x04 Entries: - LowOffset: 0x00000000 HighOffset: 0x00000000 @@ -244,8 +256,7 @@ Type: SHT_STRTAB DWARF: debug_ranges: - - Offset: 0 - AddrSize: 0x04 + - AddrSize: 0x04 Entries: - LowOffset: 0x00000000 HighOffset: 0x00000000