'InitialLength' is replaced with 'Format' (DWARF32 by default) and 'Length' in this patch.
Besides, test cases for DWARFv4 and DWARFv5, DWARF32 and DWARF64 is
added.
Reviewed By: jhenderson
Differential Revision: https://reviews.llvm.org/D82622
- Attribute: DW_AT_type
Form: DW_FORM_ref4
debug_info:
- - Length:
- TotalLength: 122
+ - Length: 122
Version: 4
AbbrOffset: 0
AddrSize: 8
" - Attribute: DW_AT_byte_size\n"
" Form: DW_FORM_data1\n"
"debug_info:\n"
- " - Length:\n"
- " TotalLength: 0\n"
+ " - Length: 0\n"
" Version: 4\n"
" AbbrOffset: 0\n"
" AddrSize: 8\n"
- Attribute: DW_AT_type
Form: DW_FORM_ref4
debug_info:
- - Length:
- TotalLength: 579
+ - Length: 579
Version: 4
AbbrOffset: 0
AddrSize: 8
" - Attribute: DW_AT_byte_size\n"
" Form: DW_FORM_data1\n"
"debug_info:\n"
- " - Length:\n"
- " TotalLength: 0\n"
+ " - Length: 0\n"
" Version: 4\n"
" AbbrOffset: 0\n"
" AddrSize: 8\n"
};
struct Unit {
- InitialLength Length;
+ dwarf::DwarfFormat Format;
+ uint64_t Length;
uint16_t Version;
llvm::dwarf::UnitType Type; // Added in DWARF 5
yaml::Hex64 AbbrOffset;
protected:
void onStartCompileUnit(const DWARFYAML::Unit &CU) override {
- writeInitialLength(CU.Length, OS, DebugInfo.IsLittleEndian);
+ writeInitialLength(CU.Format, CU.Length, OS, DebugInfo.IsLittleEndian);
writeInteger((uint16_t)CU.Version, OS, DebugInfo.IsLittleEndian);
if (CU.Version >= 5) {
writeInteger((uint8_t)CU.Type, OS, DebugInfo.IsLittleEndian);
writeInteger((uint8_t)CU.AddrSize, OS, DebugInfo.IsLittleEndian);
cantFail(writeVariableSizedInteger(CU.AbbrOffset,
- CU.Length.isDWARF64() ? 8 : 4, OS,
- DebugInfo.IsLittleEndian));
+ CU.Format == dwarf::DWARF64 ? 8 : 4,
+ OS, DebugInfo.IsLittleEndian));
} else {
cantFail(writeVariableSizedInteger(CU.AbbrOffset,
- CU.Length.isDWARF64() ? 8 : 4, OS,
- DebugInfo.IsLittleEndian));
+ CU.Format == dwarf::DWARF64 ? 8 : 4,
+ OS, DebugInfo.IsLittleEndian));
writeInteger((uint8_t)CU.AddrSize, OS, DebugInfo.IsLittleEndian);
}
}
Length = CU.Version >= 5 ? 8 : 7;
}
- virtual void onEndCompileUnit(DWARFYAML::Unit &CU) {
- CU.Length.setLength(Length);
- }
+ virtual void onEndCompileUnit(DWARFYAML::Unit &CU) { CU.Length = Length; }
virtual void onStartDIE(DWARFYAML::Unit &CU, DWARFYAML::Entry &DIE) {
Length += getULEB128Size(DIE.AbbrCode);
//===----------------------------------------------------------------------===//
#include "DWARFVisitor.h"
+#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/ObjectYAML/DWARFYAML.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/Error.h"
}
static unsigned getOffsetSize(const DWARFYAML::Unit &Unit) {
- return Unit.Length.isDWARF64() ? 8 : 4;
+ return Unit.Format == dwarf::DWARF64 ? 8 : 4;
}
static unsigned getRefSize(const DWARFYAML::Unit &Unit) {
}
void MappingTraits<DWARFYAML::Unit>::mapping(IO &IO, DWARFYAML::Unit &Unit) {
+ IO.mapOptional("Format", Unit.Format, dwarf::DWARF32);
IO.mapRequired("Length", Unit.Length);
IO.mapRequired("Version", Unit.Version);
if (Unit.Version >= 5)
-# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+## This file contains test cases for generating a DAWRFv4 .debug_info
+## section in object files from the DWARF entry of Mach-O YAML inputs.
+
+## a) Test that yaml2obj emits a DWARF32 .debug_info sections and obj2yaml
+## converts it back.
+
+# RUN: yaml2obj --docnum=1 %s | obj2yaml | FileCheck %s --check-prefix=DWARF32
--- !mach-o
FileHeader:
- Address: 0x0000000100000F50
Length: 52
debug_info:
- - Length:
- TotalLength: 117
+ - Length: 117
Version: 4
AbbrOffset: 0
AddrSize: 8
...
...
+# DWARF32: DWARF:
+# DWARF32: debug_info:
+# DWARF32-NEXT: - Length: 117
+# DWARF32-NEXT: Version: 4
+# DWARF32-NEXT: AbbrOffset: 0
+# DWARF32-NEXT: AddrSize: 8
+# DWARF32-NEXT: Entries:
+# DWARF32-NEXT: - AbbrCode: 0x00000001
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - Value: 0x000000000000000C
+# DWARF32-NEXT: - Value: 0x0000000000000038
+# DWARF32-NEXT: - Value: 0x0000000000000000
+# DWARF32-NEXT: - Value: 0x0000000000000046
+# DWARF32-NEXT: - Value: 0x0000000100000F50
+# DWARF32-NEXT: - Value: 0x0000000000000034
+# DWARF32-NEXT: - AbbrCode: 0x00000002
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000100000F50
+# DWARF32-NEXT: - Value: 0x0000000000000034
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: BlockData: [ 0x56 ]
+# DWARF32-NEXT: - Value: 0x0000000000000076
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - Value: 0x0000000000000003
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - Value: 0x0000000000000060
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - AbbrCode: 0x00000003
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000000000002
+# DWARF32-NEXT: BlockData: [ 0x91, 0x78 ]
+# DWARF32-NEXT: - Value: 0x000000000000007B
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - Value: 0x0000000000000003
+# DWARF32-NEXT: - Value: 0x0000000000000060
+# DWARF32-NEXT: - AbbrCode: 0x00000003
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000000000002
+# DWARF32-NEXT: BlockData: [ 0x91, 0x70 ]
+# DWARF32-NEXT: - Value: 0x0000000000000080
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - Value: 0x0000000000000003
+# DWARF32-NEXT: - Value: 0x0000000000000067
+# DWARF32-NEXT: - AbbrCode: 0x00000000
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - AbbrCode: 0x00000004
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000000000085
+# DWARF32-NEXT: - Value: 0x0000000000000005
+# DWARF32-NEXT: - Value: 0x0000000000000004
+# DWARF32-NEXT: - AbbrCode: 0x00000005
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x000000000000006C
+# DWARF32-NEXT: - AbbrCode: 0x00000005
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000000000071
+# DWARF32-NEXT: - AbbrCode: 0x00000004
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000000000089
+# DWARF32-NEXT: - Value: 0x0000000000000006
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - AbbrCode: 0x00000000
+# DWARF32-NEXT: Values:
+
+## b) Test that yaml2obj emits a correct unit header and obj2yaml is able to convert it back.
+
+## Test DWARF32 unit header.
+
+# RUN: yaml2obj --docnum=2 -DFORMAT=DWARF32 %s -o %t2.dwarf32.o
+# RUN: llvm-readobj --hex-dump=__debug_info %t2.dwarf32.o | \
+# RUN: FileCheck %s --check-prefix=DWARF32-HEADER
+
+# DWARF32-HEADER: Hex dump of section '__debug_info':
+# DWARF32-HEADER-NEXT: 0x00000000 0c000000 04000000 00000801 34120000 ............4...
+## ^------- unit_length (4-byte)
+## ^--- version (2-byte)
+## ^-------- debug_abbrev_offset (4-byte)
+## ^- address_size (1-byte)
+## ^- abbrev code (ULEB128)
+## ^------- value, Form: DW_FORM_addr (4-byte)
+
+# RUN: obj2yaml %t2.dwarf32.o | FileCheck %s --check-prefix=DWARF32-YAML
+
+# DWARF32-YAML: debug_info:
+# DWARF32-YAML-NEXT: - Length: 12
+# DWARF32-YAML-NEXT: Version: 4
+# DWARF32-YAML-NEXT: AbbrOffset: 0
+# DWARF32-YAML-NEXT: AddrSize: 8
+# DWARF32-YAML-NEXT: Entries:
+# DWARF32-YAML-NEXT: - AbbrCode: 0x00000001
+# DWARF32-YAML-NEXT: Values:
+# DWARF32-YAML-NEXT: - Value: 0x0000000000001234
+
+--- !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: 232
+ segname: __DWARF
+ vmaddr: 0x00
+ vmsize: 0x00
+ fileoff: 0x00
+ filesize: 0x00
+ maxprot: 0
+ initprot: 0
+ nsects: 2
+ flags: 0
+ Sections:
+ - sectname: __debug_abbrev
+ segname: __DWARF
+ addr: 0x00
+ size: 12
+ offset: 528
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __debug_info
+ segname: __DWARF
+ addr: 0x00
+ size: 0xffff
+ offset: 1070
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+DWARF:
+ debug_abbrev:
+ - Code: 1
+ Tag: DW_TAG_compile_unit
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_low_pc
+ Form: DW_FORM_addr
+ debug_info:
+ - Format: [[FORMAT]]
+ Length: 12
+ Version: 4
+ AbbrOffset: 0
+ AddrSize: 8
+ Entries:
+ - AbbrCode: 1
+ Values:
+ - Value: 0x1234
+
+## Test DWARF64 unit header.
+
+# RUN: yaml2obj --docnum=2 -DFORMAT=DWARF64 %s -o %t2.dwarf64.o
+# RUN: llvm-readobj --hex-dump=__debug_info %t2.dwarf64.o | \
+# RUN: FileCheck %s --check-prefix=DWARF64-HEADER
+
+# DWARF64-HEADER: Hex dump of section '__debug_info':
+# DWARF64-HEADER-NEXT: 0x00000000 ffffffff 0c000000 00000000 04000000 ................
+## ^------------------------- unit_length (12-byte)
+## ^--- version (2-byte)
+## ^--- debug_abbrev_offset (8-byte)
+# DWARF64-HEADER-NEXT: 0x00000010 00000000 00000801 34120000 00000000 ........4.......
+## -------------
+## ^- address_size (1-byte)
+## ^- abbrev code (ULEB128)
+## ^---------------- value, Form: DW_FORM_addr (8-byte)
+
+# RUN: obj2yaml %t2.dwarf64.o | FileCheck %s --check-prefix=DWARF64-YAML
-#CHECK: DWARF:
-#CHECK: debug_info:
-#CHECK: - Length:
-#CHECK: TotalLength: 117
-#CHECK: Version: 4
-#CHECK: AbbrOffset: 0
-#CHECK: AddrSize: 8
-#CHECK: Entries:
-#CHECK: - AbbrCode: 0x00000001
-#CHECK: Values:
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - Value: 0x000000000000000C
-#CHECK: - Value: 0x0000000000000038
-#CHECK: - Value: 0x0000000000000000
-#CHECK: - Value: 0x0000000000000046
-#CHECK: - Value: 0x0000000100000F50
-#CHECK: - Value: 0x0000000000000034
-#CHECK: - AbbrCode: 0x00000002
-#CHECK: Values:
-#CHECK: - Value: 0x0000000100000F50
-#CHECK: - Value: 0x0000000000000034
-#CHECK: - Value: 0x0000000000000001
-#CHECK: BlockData: [ 0x56 ]
-#CHECK: - Value: 0x0000000000000076
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - Value: 0x0000000000000003
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - Value: 0x0000000000000060
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - AbbrCode: 0x00000003
-#CHECK: Values:
-#CHECK: - Value: 0x0000000000000002
-#CHECK: BlockData: [ 0x91, 0x78 ]
-#CHECK: - Value: 0x000000000000007B
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - Value: 0x0000000000000003
-#CHECK: - Value: 0x0000000000000060
-#CHECK: - AbbrCode: 0x00000003
-#CHECK: Values:
-#CHECK: - Value: 0x0000000000000002
-#CHECK: BlockData: [ 0x91, 0x70 ]
-#CHECK: - Value: 0x0000000000000080
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - Value: 0x0000000000000003
-#CHECK: - Value: 0x0000000000000067
-#CHECK: - AbbrCode: 0x00000000
-#CHECK: Values:
-#CHECK: - AbbrCode: 0x00000004
-#CHECK: Values:
-#CHECK: - Value: 0x0000000000000085
-#CHECK: - Value: 0x0000000000000005
-#CHECK: - Value: 0x0000000000000004
-#CHECK: - AbbrCode: 0x00000005
-#CHECK: Values:
-#CHECK: - Value: 0x000000000000006C
-#CHECK: - AbbrCode: 0x00000005
-#CHECK: Values:
-#CHECK: - Value: 0x0000000000000071
-#CHECK: - AbbrCode: 0x00000004
-#CHECK: Values:
-#CHECK: - Value: 0x0000000000000089
-#CHECK: - Value: 0x0000000000000006
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - AbbrCode: 0x00000000
-#CHECK: Values:
+# DWARF64-YAML: debug_info:
+# DWARF64-YAML-NEXT: - Format: DWARF64
+# DWARF64-YAML-NEXT: Length: 12
+# DWARF64-YAML-NEXT: Version: 4
+# DWARF64-YAML-NEXT: AbbrOffset: 0
+# DWARF64-YAML-NEXT: AddrSize: 8
+# DWARF64-YAML-NEXT: Entries:
+# DWARF64-YAML-NEXT: - AbbrCode: 0x00000001
+# DWARF64-YAML-NEXT: Values:
+# DWARF64-YAML-NEXT: - Value: 0x0000000000001234
- DieOffset: 0x00000071
Name: char
debug_info:
- - Length:
- TotalLength: 117
+ - Length: 117
Version: 4
AbbrOffset: 0
AddrSize: 8
- LowOffset: 0x0000000000000000
HighOffset: 0x0000000000001000
debug_info:
- - Length:
- TotalLength: 82
+ - Length: 82
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: 0x201A
Form: DW_FORM_addr
debug_info:
- - Length:
- TotalLength: 168
+ - Length: 168
Version: 2
AbbrOffset: 0
AddrSize: 8
...
#CHECK: debug_info:
-#CHECK: - Length:
-#CHECK: TotalLength: 168
+#CHECK: - Length: 168
#CHECK: Version: 2
#CHECK: AbbrOffset: 0
#CHECK: AddrSize: 8
-# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+## This file contains test cases for generating a DWARFv5 .debug_info
+## section in object files from the DWARF entry of Mach-O YAML inputs.
+
+## a) Test that yaml2obj emits a DWARF32 .debug_info sections and obj2yaml
+## converts it back.
+
+# RUN: yaml2obj --docnum=1 %s | obj2yaml | FileCheck %s --check-prefix=DWARF32
--- !mach-o
FileHeader:
- Address: 0x0000000100000F50
Length: 52
debug_info:
- - Length:
- TotalLength: 118
+ - Length: 118
Version: 5
UnitType: DW_UT_compile
AbbrOffset: 0
Data: 11
...
+# DWARF32: DWARF:
+# DWARF32: debug_info:
+# DWARF32-NEXT: - Length: 118
+# DWARF32-NEXT: Version: 5
+# DWARF32-NEXT: UnitType: DW_UT_compile
+# DWARF32-NEXT: AbbrOffset: 0
+# DWARF32-NEXT: AddrSize: 8
+# DWARF32-NEXT: Entries:
+# DWARF32-NEXT: - AbbrCode: 0x00000001
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - Value: 0x000000000000000C
+# DWARF32-NEXT: - Value: 0x0000000000000038
+# DWARF32-NEXT: - Value: 0x0000000000000000
+# DWARF32-NEXT: - Value: 0x0000000000000046
+# DWARF32-NEXT: - Value: 0x0000000100000F50
+# DWARF32-NEXT: - Value: 0x0000000000000034
+# DWARF32-NEXT: - AbbrCode: 0x00000002
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000100000F50
+# DWARF32-NEXT: - Value: 0x0000000000000034
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: BlockData: [ 0x56 ]
+# DWARF32-NEXT: - Value: 0x0000000000000076
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - Value: 0x0000000000000003
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - Value: 0x0000000000000060
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - AbbrCode: 0x00000003
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000000000002
+# DWARF32-NEXT: BlockData: [ 0x91, 0x78 ]
+# DWARF32-NEXT: - Value: 0x000000000000007B
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - Value: 0x0000000000000003
+# DWARF32-NEXT: - Value: 0x0000000000000060
+# DWARF32-NEXT: - AbbrCode: 0x00000003
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000000000002
+# DWARF32-NEXT: BlockData: [ 0x91, 0x70 ]
+# DWARF32-NEXT: - Value: 0x0000000000000080
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - Value: 0x0000000000000003
+# DWARF32-NEXT: - Value: 0x0000000000000067
+# DWARF32-NEXT: - AbbrCode: 0x00000000
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - AbbrCode: 0x00000004
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000000000085
+# DWARF32-NEXT: - Value: 0x0000000000000005
+# DWARF32-NEXT: - Value: 0x0000000000000004
+# DWARF32-NEXT: - AbbrCode: 0x00000005
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x000000000000006C
+# DWARF32-NEXT: - AbbrCode: 0x00000005
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000000000071
+# DWARF32-NEXT: - AbbrCode: 0x00000004
+# DWARF32-NEXT: Values:
+# DWARF32-NEXT: - Value: 0x0000000000000089
+# DWARF32-NEXT: - Value: 0x0000000000000006
+# DWARF32-NEXT: - Value: 0x0000000000000001
+# DWARF32-NEXT: - AbbrCode: 0x00000000
+# DWARF32-NEXT: Values:
+
+## b) Test that yaml2obj emits a correct unit header and obj2yaml is able to convert it back.
+
+## Test DWARF32 unit header.
+
+# RUN: yaml2obj --docnum=2 -DFORMAT=DWARF32 -DLENGTH=12 %s -o %t2.dwarf32.o
+# RUN: llvm-readobj --hex-dump=__debug_info %t2.dwarf32.o | \
+# RUN: FileCheck %s --check-prefix=DWARF32-HEADER
+
+# DWARF32-HEADER: Hex dump of section '__debug_info':
+# DWARF32-HEADER-NEXT: 0x00000000 0c000000 05000108 00000000 01341200 .............4..
+## ^------- unit_header (4-byte)
+## ^--- version (2-byte)
+## ^- unit_type (1-byte)
+## ^- address_size (1-byte)
+## ^------- deubug_abbrev_offset (4-byte)
+## ^- abbrev code (ULEB128)
+## ^----- value, Form: DW_AT_addr (8-byte)
+# DWARF32-HEADER-NEXT: 0x00000010 00000000 00 .....
+## -----------
+
+# RUN: obj2yaml %t2.dwarf32.o | FileCheck %s --check-prefix=DWARF32-YAML
+
+# DWARF32-YAML: debug_info:
+# DWARF32-YAML-NEXT: - Length: 12
+# DWARF32-YAML-NEXT: Version: 5
+# DWARF32-YAML-NEXT: UnitType: DW_UT_compile
+# DWARF32-YAML-NEXT: AbbrOffset: 0x0000000000000000
+# DWARF32-YAML-NEXT: AddrSize: 8
+# DWARF32-YAML-NEXT: Entries:
+# DWARF32-YAML-NEXT: - AbbrCode: 0x00000001
+# DWARF32-YAML-NEXT: Values:
+# DWARF32-YAML-NEXT: - Value: 0x0000000000001234
+
+--- !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: 232
+ segname: __DWARF
+ vmaddr: 0x00
+ vmsize: 0x00
+ fileoff: 0x00
+ filesize: 0x00
+ maxprot: 0
+ initprot: 0
+ nsects: 2
+ flags: 0
+ Sections:
+ - sectname: __debug_abbrev
+ segname: __DWARF
+ addr: 0x00
+ size: 12
+ offset: 528
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __debug_info
+ segname: __DWARF
+ addr: 0x00
+ size: 0xffff
+ offset: 1070
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+DWARF:
+ debug_abbrev:
+ - Code: 1
+ Tag: DW_TAG_compile_unit
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_low_pc
+ Form: DW_FORM_addr
+ debug_info:
+ - Format: [[FORMAT]]
+ Length: [[LENGTH]]
+ Version: 5
+ UnitType: DW_UT_compile
+ AbbrOffset: 0
+ AddrSize: 8
+ Entries:
+ - AbbrCode: 1
+ Values:
+ - Value: 0x1234
+
+## Test DWARF64 unit header.
+
+# RUN: yaml2obj --docnum=2 -DFORMAT=DWARF64 -DLENGTH=20 %s -o %t2.dwarf64.o
+# RUN: llvm-readobj --hex-dump=__debug_info %t2.dwarf64.o | \
+# RUN: FileCheck %s --check-prefix=DWARF64-HEADER
+
+# DWARF64-HEADER: Hex dump of section '__debug_info':
+# DWARF64-HEADER-NEXT: 0x00000000 ffffffff 14000000 00000000 05000108 ................
+## ^------------------------- unit_length (12-byte)
+## ^--- version (2-byte)
+## ^- unit_type (1-byte)
+## ^- address_size (1-byte)
+# DWARF64-HEADER-NEXT: 0x00000010 00000000 00000000 01341200 00000000 .........4......
+## ^---------------- debug_abbrev_offset (8-byte)
+## ^- abbrev code (ULEB128)
+## ^-------------- value, Form: DW_AT_addr (8-byte)
+# DWARF64-HEADER-NEXT: 0x00000020 00 .
+## --
+
+# RUN: obj2yaml %t2.dwarf64.o | FileCheck %s --check-prefix=DWARF64-YAML
-#CHECK: DWARF:
-#CHECK: debug_info:
-#CHECK: - Length:
-#CHECK: TotalLength: 118
-#CHECK: Version: 5
-#CHECK: UnitType: DW_UT_compile
-#CHECK: AbbrOffset: 0
-#CHECK: AddrSize: 8
-#CHECK: Entries:
-#CHECK: - AbbrCode: 0x00000001
-#CHECK: Values:
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - Value: 0x000000000000000C
-#CHECK: - Value: 0x0000000000000038
-#CHECK: - Value: 0x0000000000000000
-#CHECK: - Value: 0x0000000000000046
-#CHECK: - Value: 0x0000000100000F50
-#CHECK: - Value: 0x0000000000000034
-#CHECK: - AbbrCode: 0x00000002
-#CHECK: Values:
-#CHECK: - Value: 0x0000000100000F50
-#CHECK: - Value: 0x0000000000000034
-#CHECK: - Value: 0x0000000000000001
-#CHECK: BlockData: [ 0x56 ]
-#CHECK: - Value: 0x0000000000000076
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - Value: 0x0000000000000003
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - Value: 0x0000000000000060
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - AbbrCode: 0x00000003
-#CHECK: Values:
-#CHECK: - Value: 0x0000000000000002
-#CHECK: BlockData: [ 0x91, 0x78 ]
-#CHECK: - Value: 0x000000000000007B
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - Value: 0x0000000000000003
-#CHECK: - Value: 0x0000000000000060
-#CHECK: - AbbrCode: 0x00000003
-#CHECK: Values:
-#CHECK: - Value: 0x0000000000000002
-#CHECK: BlockData: [ 0x91, 0x70 ]
-#CHECK: - Value: 0x0000000000000080
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - Value: 0x0000000000000003
-#CHECK: - Value: 0x0000000000000067
-#CHECK: - AbbrCode: 0x00000000
-#CHECK: Values:
-#CHECK: - AbbrCode: 0x00000004
-#CHECK: Values:
-#CHECK: - Value: 0x0000000000000085
-#CHECK: - Value: 0x0000000000000005
-#CHECK: - Value: 0x0000000000000004
-#CHECK: - AbbrCode: 0x00000005
-#CHECK: Values:
-#CHECK: - Value: 0x000000000000006C
-#CHECK: - AbbrCode: 0x00000005
-#CHECK: Values:
-#CHECK: - Value: 0x0000000000000071
-#CHECK: - AbbrCode: 0x00000004
-#CHECK: Values:
-#CHECK: - Value: 0x0000000000000089
-#CHECK: - Value: 0x0000000000000006
-#CHECK: - Value: 0x0000000000000001
-#CHECK: - AbbrCode: 0x00000000
-#CHECK: Values:
+# DWARF64-YAML: debug_info:
+# DWARF64-YAML-NEXT: - Format: DWARF64
+# DWARF64-YAML-NEXT: Length: 20
+# DWARF64-YAML-NEXT: Version: 5
+# DWARF64-YAML-NEXT: UnitType: DW_UT_compile
+# DWARF64-YAML-NEXT: AbbrOffset: 0x0000000000000000
+# DWARF64-YAML-NEXT: AddrSize: 8
+# DWARF64-YAML-NEXT: Entries:
+# DWARF64-YAML-NEXT: - AbbrCode: 0x00000001
+# DWARF64-YAML-NEXT: Values:
+# DWARF64-YAML-NEXT: - Value: 0x0000000000001234
- LowOffset: 0x0000000000001000
HighOffset: 0x0000000000002000
debug_info:
- - Length:
- TotalLength: 99
+ - Length: 99
Version: 4
AbbrOffset: 0
AddrSize: 8
- DieOffset: 0x0000006F
Name: char
debug_info:
- - Length:
- TotalLength: 115
+ - Length: 115
Version: 4
AbbrOffset: 0
AddrSize: 4
- DieOffset: 0x00000076
Name: char
debug_info:
- - Length:
- TotalLength: 122
+ - Length: 122
Version: 4
AbbrOffset: 0
AddrSize: 8
- DieOffset: 0x000000D8
Name: char
debug_info:
- - Length:
- TotalLength: 220
+ - Length: 220
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_external
Form: DW_FORM_flag_present
debug_info:
- - Length:
- TotalLength: 113
+ - Length: 113
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: 0x01
Form: DW_FORM_addrx4 ## 0x2c
debug_info:
- - Length:
- TotalLength: 0x1234
+ - Length: 0x1234
Version: 5
UnitType: DW_UT_type
AbbrOffset: 0x1234
- Value: 0x1234 ## DW_FORM_addrx2
- Value: 0x123456 ## DW_FORM_addrx3 (unimplemented)
- Value: 0x12345678 ## DW_FORM_addrx4
- - Length:
- TotalLength: 0x1234
+ - Length: 0x1234
Version: 5
## Test another unit type.
UnitType: DW_UT_compile
Entries:
- AbbrCode: 0
Values: []
- - Length:
- TotalLength: 0x5678
+ - Length: 0x5678
## Test DWARFv4
Version: 4
AbbrOffset: 0x5678
Children: DW_CHILDREN_no
Attributes: []
debug_info:
- - Length:
- TotalLength: 0x1234
+ - Length: 0x1234
Version: 5
UnitType: DW_UT_type
AbbrOffset: 0x1234
Children: DW_CHILDREN_no
Attributes: []
debug_info:
- - Length:
- TotalLength: 0x1234
+ - Length: 0x1234
Version: 5
UnitType: DW_UT_type
AbbrOffset: 0x1234
Children: DW_CHILDREN_no
Attributes: []
debug_info:
- - Length:
- TotalLength: 0x1234
+ - Length: 0x1234
Version: 5
UnitType: DW_UT_type
AbbrOffset: 0x1234
Machine: EM_X86_64
DWARF:
debug_info:
- - Length:
- TotalLength: 0x1234
+ - Length: 0x1234
Version: 5
UnitType: DW_UT_type
AbbrOffset: 0x1234
- Attribute: DW_AT_high_pc
Form: DW_FORM_data4
debug_info:
- - Length:
- TotalLength: 0x1234
+ - Length: 0x1234
Version: 5
UnitType: DW_UT_type
AbbrOffset: 0x1234
Machine: EM_X86_64
DWARF:
debug_info:
- - Length:
- TotalLength: 0x1234
+ - Length: 0x1234
Version: 5
UnitType: DW_UT_type
AbbrOffset: 0x1234
Machine: EM_X86_64
DWARF:
debug_info:
- - Length:
- TotalLength: 0xffffffff
- TotalLength64: 0x0c
+ - Format: DWARF64
+ Length: 0x0c
Version: 5
UnitType: DW_UT_type
AbbrOffset: 0x1234
Machine: EM_X86_64
DWARF:
debug_info:
- - Length:
- TotalLength: 0xffffffff
- TotalLength64: 0x0c
+ - Format: DWARF64
+ Length: 0x0c
Version: 4
AbbrOffset: 0x1234
AddrSize: 8
void dumpDebugInfo(DWARFContext &DCtx, DWARFYAML::Data &Y) {
for (const auto &CU : DCtx.compile_units()) {
DWARFYAML::Unit NewUnit;
- NewUnit.Length.setLength(CU->getLength());
+ NewUnit.Format = CU->getFormat();
+ NewUnit.Length = CU->getLength();
NewUnit.Version = CU->getVersion();
if(NewUnit.Version >= 5)
NewUnit.Type = (dwarf::UnitType)CU->getUnitType();
" Children: DW_CHILDREN_yes\n"
" Attributes:\n"
"debug_info:\n"
- " - Length:\n"
- " TotalLength: 0\n"
+ " - Length: 0\n"
" Version: 4\n"
" AbbrOffset: 0\n"
" AddrSize: 8\n"
- Attribute: DW_AT_type
Form: DW_FORM_ref4
debug_info:
- - Length:
- TotalLength: 22
+ - Length: 22
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_type
Form: DW_FORM_ref_addr
debug_info:
- - Length:
- TotalLength: 22
+ - Length: 22
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_ranges
Form: DW_FORM_sec_offset
debug_info:
- - Length:
- TotalLength: 16
+ - Length: 16
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_ranges
Form: DW_FORM_sec_offset
debug_info:
- - Length:
- TotalLength: 17
+ - Length: 17
Version: 5
UnitType: DW_UT_compile
AbbrOffset: 0
- Attribute: DW_AT_stmt_list
Form: DW_FORM_sec_offset
debug_info:
- - Length:
- TotalLength: 16
+ - Length: 16
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_name
Form: DW_FORM_strp
debug_info:
- - Length:
- TotalLength: 12
+ - Length: 12
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_type
Form: DW_FORM_ref_addr
debug_info:
- - Length:
- TotalLength: 22
+ - Length: 22
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_stmt_list
Form: DW_FORM_sec_offset
debug_info:
- - Length:
- TotalLength: 16
+ - Length: 16
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_stmt_list
Form: DW_FORM_sec_offset
debug_info:
- - Length:
- TotalLength: 16
+ - Length: 16
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_stmt_list
Form: DW_FORM_sec_offset
debug_info:
- - Length:
- TotalLength: 16
+ - Length: 16
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_stmt_list
Form: DW_FORM_sec_offset
debug_info:
- - Length:
- TotalLength: 16
+ - Length: 16
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_stmt_list
Form: DW_FORM_sec_offset
debug_info:
- - Length:
- TotalLength: 16
+ - Length: 16
Version: 4
AbbrOffset: 0
AddrSize: 8
Values:
- Value: 0x0000000000000001
- Value: 0x0000000000000000
- - Length:
- TotalLength: 16
+ - Length: 16
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_high_pc
Form: DW_FORM_addr
debug_info:
- - Length:
- TotalLength: 46
+ - Length: 46
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_high_pc
Form: DW_FORM_addr
debug_info:
- - Length:
- TotalLength: 52
+ - Length: 52
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_high_pc
Form: DW_FORM_addr
debug_info:
- - Length:
- TotalLength: 55
+ - Length: 55
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_high_pc
Form: DW_FORM_addr
debug_info:
- - Length:
- TotalLength: 85
+ - Length: 85
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_high_pc
Form: DW_FORM_addr
debug_info:
- - Length:
- TotalLength: 34
+ - Length: 34
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_high_pc
Form: DW_FORM_addr
debug_info:
- - Length:
- TotalLength: 71
+ - Length: 71
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_high_pc
Form: DW_FORM_addr
debug_info:
- - Length:
- TotalLength: 73
+ - Length: 73
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_call_data_location
Form: DW_FORM_sec_offset
debug_info:
- - Length:
- TotalLength: 0
+ - Length: 0
Version: 5
UnitType: DW_UT_compile
AbbrOffset: 0
- Attribute: DW_AT_high_pc
Form: DW_FORM_addr
debug_info:
- - Length:
- TotalLength: 52
+ - Length: 52
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_high_pc
Form: DW_FORM_data4
debug_info:
- - Length:
- TotalLength: 44
+ - Length: 44
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_artificial
Form: DW_FORM_flag_present
debug_info:
- - Length:
- TotalLength: 68
+ - Length: 68
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_high_pc
Form: DW_FORM_data4
debug_info:
- - Length:
- TotalLength: 78
+ - Length: 78
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_call_line
Form: DW_FORM_data4
debug_info:
- - Length:
- TotalLength: 74
+ - Length: 74
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_decl_line
Form: DW_FORM_data1
debug_info:
- - Length:
- TotalLength: 103
+ - Length: 103
Version: 4
AbbrOffset: 0
AddrSize: 8
- Attribute: DW_AT_high_pc
Form: DW_FORM_addr
debug_info:
- - Length:
- TotalLength: 75
+ - Length: 75
Version: 4
AbbrOffset: 0
AddrSize: 4
- Attribute: DW_AT_high_pc
Form: DW_FORM_addr
debug_info:
- - Length:
- TotalLength: 103
+ - Length: 103
Version: 4
AbbrOffset: 0
AddrSize: 8