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 @@ -64,7 +64,9 @@ }; struct ARange { - InitialLength Length; + llvm::dwarf::DwarfFormat Format; + uint32_t LengthPrefix; + uint64_t Length; uint16_t Version; uint32_t CuOffset; uint8_t AddrSize; @@ -263,6 +265,13 @@ static void mapping(IO &IO, DWARFYAML::InitialLength &DWARF); }; +template <> struct ScalarEnumerationTraits { + static void enumeration(IO &IO, dwarf::DwarfFormat &Format) { + IO.enumCase(Format, "DWARF32", dwarf::DWARF32); + IO.enumCase(Format, "DWARF64", dwarf::DWARF64); + } +}; + #define HANDLE_DW_TAG(unused, name, unused2, unused3, unused4) \ io.enumCase(value, "DW_TAG_" #name, dwarf::DW_TAG_##name); 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 @@ -15,6 +15,7 @@ #include "DWARFVisitor.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" +#include "llvm/BinaryFormat/Dwarf.h" #include "llvm/ObjectYAML/DWARFYAML.h" #include "llvm/Support/Error.h" #include "llvm/Support/Host.h" @@ -94,7 +95,12 @@ void DWARFYAML::EmitDebugAranges(raw_ostream &OS, const DWARFYAML::Data &DI) { for (auto Range : DI.ARanges) { auto HeaderStart = OS.tell(); - writeInitialLength(Range.Length, OS, DI.IsLittleEndian); + if (Range.Format == dwarf::DWARF64) { + // TODO: Test emitting DWARF64 section. + writeInteger((uint32_t)Range.LengthPrefix, OS, DI.IsLittleEndian); + writeInteger((uint64_t)Range.Length, OS, DI.IsLittleEndian); + } else + writeInteger((uint32_t)Range.Length, OS, DI.IsLittleEndian); writeInteger((uint16_t)Range.Version, OS, DI.IsLittleEndian); writeInteger((uint32_t)Range.CuOffset, OS, DI.IsLittleEndian); writeInteger((uint8_t)Range.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 @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/ObjectYAML/DWARFYAML.h" +#include "llvm/BinaryFormat/Dwarf.h" namespace llvm { @@ -74,6 +75,10 @@ void MappingTraits::mapping(IO &IO, DWARFYAML::ARange &ARange) { + IO.mapRequired("Format", ARange.Format); + if (ARange.Format == dwarf::DWARF64) + IO.mapOptional("LengthPrefix", ARange.LengthPrefix, + dwarf::DW_LENGTH_DWARF64); IO.mapRequired("Length", ARange.Length); IO.mapRequired("Version", ARange.Version); IO.mapRequired("CuOffset", ARange.CuOffset); diff --git a/llvm/test/ObjectYAML/MachO/DWARF-debug_aranges.yaml b/llvm/test/ObjectYAML/MachO/DWARF-debug_aranges.yaml --- a/llvm/test/ObjectYAML/MachO/DWARF-debug_aranges.yaml +++ b/llvm/test/ObjectYAML/MachO/DWARF-debug_aranges.yaml @@ -313,8 +313,8 @@ - _main DWARF: debug_aranges: - - Length: - TotalLength: 44 + - Format: DWARF32 + Length: 44 Version: 2 CuOffset: 0 AddrSize: 8 @@ -326,8 +326,8 @@ #CHECK: DWARF: #CHECK: debug_aranges: -#CHECK: - Length: -#CHECK: TotalLength: 44 +#CHECK: - Format: DWARF32 +#CHECK: Length: 44 #CHECK: Version: 2 #CHECK: CuOffset: 0 #CHECK: AddrSize: 8 diff --git a/llvm/test/ObjectYAML/MachO/DWARF-debug_info.yaml b/llvm/test/ObjectYAML/MachO/DWARF-debug_info.yaml --- a/llvm/test/ObjectYAML/MachO/DWARF-debug_info.yaml +++ b/llvm/test/ObjectYAML/MachO/DWARF-debug_info.yaml @@ -375,8 +375,8 @@ - Attribute: DW_AT_type Form: DW_FORM_ref4 debug_aranges: - - Length: - TotalLength: 44 + - Format: DWARF32 + Length: 44 Version: 2 CuOffset: 0 AddrSize: 8 diff --git a/llvm/test/ObjectYAML/MachO/DWARF-debug_line.yaml b/llvm/test/ObjectYAML/MachO/DWARF-debug_line.yaml --- a/llvm/test/ObjectYAML/MachO/DWARF-debug_line.yaml +++ b/llvm/test/ObjectYAML/MachO/DWARF-debug_line.yaml @@ -394,8 +394,8 @@ - Attribute: DW_AT_type Form: DW_FORM_ref4 debug_aranges: - - Length: - TotalLength: 44 + - Format: DWARF32 + Length: 44 Version: 2 CuOffset: 0 AddrSize: 8 diff --git a/llvm/test/ObjectYAML/MachO/DWARF5-debug_info.yaml b/llvm/test/ObjectYAML/MachO/DWARF5-debug_info.yaml --- a/llvm/test/ObjectYAML/MachO/DWARF5-debug_info.yaml +++ b/llvm/test/ObjectYAML/MachO/DWARF5-debug_info.yaml @@ -374,9 +374,9 @@ Attributes: - Attribute: DW_AT_type Form: DW_FORM_ref4 - debug_aranges: - - Length: - TotalLength: 44 + debug_aranges: + - Format: DWARF32 + Length: 44 Version: 2 CuOffset: 0 AddrSize: 8 diff --git a/llvm/test/tools/llvm-gsymutil/ARM_AArch64/fat-macho-dwarf.yaml b/llvm/test/tools/llvm-gsymutil/ARM_AArch64/fat-macho-dwarf.yaml --- a/llvm/test/tools/llvm-gsymutil/ARM_AArch64/fat-macho-dwarf.yaml +++ b/llvm/test/tools/llvm-gsymutil/ARM_AArch64/fat-macho-dwarf.yaml @@ -378,8 +378,8 @@ - Attribute: DW_AT_type Form: DW_FORM_ref_addr debug_aranges: - - Length: - TotalLength: 28 + - Format: DWARF32 + Length: 28 Version: 2 CuOffset: 0 AddrSize: 4 @@ -859,8 +859,8 @@ - Attribute: DW_AT_type Form: DW_FORM_ref_addr debug_aranges: - - Length: - TotalLength: 44 + - Format: DWARF32 + Length: 44 Version: 2 CuOffset: 0 AddrSize: 8 diff --git a/llvm/test/tools/llvm-gsymutil/X86/mach-dwarf.yaml b/llvm/test/tools/llvm-gsymutil/X86/mach-dwarf.yaml --- a/llvm/test/tools/llvm-gsymutil/X86/mach-dwarf.yaml +++ b/llvm/test/tools/llvm-gsymutil/X86/mach-dwarf.yaml @@ -539,8 +539,8 @@ - Attribute: DW_AT_type Form: DW_FORM_ref_addr debug_aranges: - - Length: - TotalLength: 60 + - Format: DWARF32 + Length: 60 Version: 2 CuOffset: 0 AddrSize: 8 diff --git a/llvm/test/tools/obj2yaml/MachO/DWARF-debug_aranges-error.yaml b/llvm/test/tools/obj2yaml/MachO/DWARF-debug_aranges-error.yaml --- a/llvm/test/tools/obj2yaml/MachO/DWARF-debug_aranges-error.yaml +++ b/llvm/test/tools/obj2yaml/MachO/DWARF-debug_aranges-error.yaml @@ -287,8 +287,8 @@ reserved3: 0x00000000 DWARF: debug_aranges: - - Length: - TotalLength: 45 + - Format: DWARF32 + Length: 45 Version: 2 CuOffset: 0 AddrSize: 8 diff --git a/llvm/test/tools/yaml2obj/ELF/DWARF/debug-aranges.yaml b/llvm/test/tools/yaml2obj/ELF/DWARF/debug-aranges.yaml --- a/llvm/test/tools/yaml2obj/ELF/DWARF/debug-aranges.yaml +++ b/llvm/test/tools/yaml2obj/ELF/DWARF/debug-aranges.yaml @@ -69,8 +69,8 @@ Machine: EM_X86_64 DWARF: debug_aranges: - - Length: - TotalLength: 0x2c + - Format: DWARF32 + Length: 0x2c Version: 2 CuOffset: 0 AddrSize: 0x08 @@ -78,8 +78,8 @@ Descriptors: - Address: 0x0000000000001234 Length: 0x20 - - Length: - TotalLength: 0x2c + - Format: DWARF32 + Length: 0x2c Version: 2 CuOffset: 0x65 AddrSize: 0x08 @@ -203,8 +203,8 @@ Size: 0x10 DWARF: debug_aranges: - - Length: - TotalLength: 0x2c + - Format: DWARF32 + Length: 0x2c Version: 2 CuOffset: 0 AddrSize: 0x08 @@ -230,8 +230,8 @@ Content: "00" DWARF: debug_aranges: - - Length: - TotalLength: 0x2c + - Format: DWARF32 + Length: 0x2c Version: 2 CuOffset: 0 AddrSize: 0x08 @@ -296,8 +296,8 @@ Type: SHT_STRTAB DWARF: debug_aranges: - - Length: - TotalLength: 0x2c + - Format: DWARF32 + Length: 0x2c Version: 2 CuOffset: 0 AddrSize: 0x08 diff --git a/llvm/tools/obj2yaml/dwarf2yaml.cpp b/llvm/tools/obj2yaml/dwarf2yaml.cpp --- a/llvm/tools/obj2yaml/dwarf2yaml.cpp +++ b/llvm/tools/obj2yaml/dwarf2yaml.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "Error.h" +#include "llvm/BinaryFormat/Dwarf.h" #include "llvm/DebugInfo/DWARF/DWARFContext.h" #include "llvm/DebugInfo/DWARF/DWARFDebugArangeSet.h" #include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h" @@ -68,7 +69,8 @@ if (Error E = Set.extract(ArangesData, &Offset)) return E; DWARFYAML::ARange Range; - Range.Length.setLength(Set.getHeader().Length); + Range.Format = Set.getHeader().Format; + Range.Length = Set.getHeader().Length; Range.Version = Set.getHeader().Version; Range.CuOffset = Set.getHeader().CuOffset; Range.AddrSize = Set.getHeader().AddrSize;