mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
[DWARF] Fix DWARFUnit::getDebugInfoSize() for 64-bit DWARF.
The calculation there was correct only for DWARF32. Differential Revision: https://reviews.llvm.org/D66421 llvm-svn: 369356
This commit is contained in:
parent
52efdb7adc
commit
2ee0278731
@ -513,6 +513,17 @@ struct FormParams {
|
||||
explicit operator bool() const { return Version && AddrSize; }
|
||||
};
|
||||
|
||||
/// Get the byte size of the unit length field depending on the DWARF format.
|
||||
inline uint8_t getUnitLengthFieldByteSize(DwarfFormat Format) {
|
||||
switch (Format) {
|
||||
case DwarfFormat::DWARF32:
|
||||
return 4;
|
||||
case DwarfFormat::DWARF64:
|
||||
return 12;
|
||||
}
|
||||
llvm_unreachable("Invalid Format value");
|
||||
}
|
||||
|
||||
/// Get the fixed byte size for a given form.
|
||||
///
|
||||
/// If the form has a fixed byte size, then an Optional with a value will be
|
||||
|
@ -97,10 +97,11 @@ public:
|
||||
return UnitType == dwarf::DW_UT_type || UnitType == dwarf::DW_UT_split_type;
|
||||
}
|
||||
uint8_t getSize() const { return Size; }
|
||||
uint8_t getUnitLengthFieldByteSize() const {
|
||||
return dwarf::getUnitLengthFieldByteSize(FormParams.Format);
|
||||
}
|
||||
uint64_t getNextUnitOffset() const {
|
||||
return Offset + Length +
|
||||
(FormParams.Format == llvm::dwarf::DwarfFormat::DWARF64 ? 4 : 0) +
|
||||
FormParams.getDwarfOffsetByteSize();
|
||||
return Offset + Length + getUnitLengthFieldByteSize();
|
||||
}
|
||||
};
|
||||
|
||||
@ -501,7 +502,8 @@ public:
|
||||
private:
|
||||
/// Size in bytes of the .debug_info data associated with this compile unit.
|
||||
size_t getDebugInfoSize() const {
|
||||
return Header.getLength() + 4 - getHeaderSize();
|
||||
return Header.getLength() + Header.getUnitLengthFieldByteSize() -
|
||||
getHeaderSize();
|
||||
}
|
||||
|
||||
/// extractDIEsIfNeeded - Parses a compile unit and indexes its DIEs if it
|
||||
|
37
test/tools/llvm-dwarfdump/X86/debug_info_min_dwarf64.s
Normal file
37
test/tools/llvm-dwarfdump/X86/debug_info_min_dwarf64.s
Normal file
@ -0,0 +1,37 @@
|
||||
# RUN: llvm-mc %s -filetype obj -triple x86_64-unknown-elf -o - | \
|
||||
# RUN: llvm-dwarfdump -debug-info - | \
|
||||
# RUN: FileCheck %s
|
||||
|
||||
.section .debug_abbrev,"",@progbits
|
||||
.byte 0x01 # Abbrev code
|
||||
.byte 0x11 # DW_TAG_compile_unit
|
||||
.byte 0x00 # DW_CHILDREN_no
|
||||
.byte 0x13 # DW_AT_language
|
||||
.byte 0x05 # DW_FORM_data2
|
||||
.byte 0x00 # EOM(1)
|
||||
.byte 0x00 # EOM(2)
|
||||
.byte 0x00 # EOM(3)
|
||||
|
||||
.section .debug_info,"",@progbits
|
||||
# CHECK: .debug_info contents:
|
||||
# CHECK-NEXT: 0x00000000: Compile Unit:
|
||||
DI_4_64_start:
|
||||
.long 0xffffffff # DWARF64 mark
|
||||
.quad DI_4_64_end - DI_4_64_version # Length of Unit
|
||||
# CHECK-SAME: length = 0x0000000f
|
||||
DI_4_64_version:
|
||||
.short 4 # DWARF version number
|
||||
# CHECK-SAME: version = 0x0004
|
||||
.quad .debug_abbrev # Offset Into Abbrev. Section
|
||||
# CHECK-SAME: abbr_offset = 0x0000
|
||||
.byte 8 # Address Size (in bytes)
|
||||
# CHECK-SAME: addr_size = 0x08
|
||||
# CHECK-SAME: (next unit at 0x0000001b)
|
||||
|
||||
.byte 1 # Abbreviation code
|
||||
# CHECK: 0x00000017: DW_TAG_compile_unit
|
||||
.short 4 # DW_LANG_C_plus_plus
|
||||
# CHECK-NEXT: DW_AT_language (DW_LANG_C_plus_plus)
|
||||
.byte 0 # NULL
|
||||
DI_4_64_end:
|
||||
|
Loading…
Reference in New Issue
Block a user