Skip to content

Commit

Permalink
[DWARF] Fix DWARFUnit::getDebugInfoSize() for 64-bit DWARF.
Browse files Browse the repository at this point in the history
The calculation there was correct only for DWARF32.

Differential Revision: https://reviews.llvm.org/D66421


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@369356 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
igorkudrin committed Aug 20, 2019
1 parent 1074344 commit 8e766b3
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 4 deletions.
11 changes: 11 additions & 0 deletions include/llvm/BinaryFormat/Dwarf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 6 additions & 4 deletions include/llvm/DebugInfo/DWARF/DWARFUnit.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,11 @@ class DWARFUnitHeader {
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();
}
};

Expand Down Expand Up @@ -501,7 +502,8 @@ class DWARFUnit {
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
Expand Down
37 changes: 37 additions & 0 deletions test/tools/llvm-dwarfdump/X86/debug_info_min_dwarf64.s
Original file line number Diff line number Diff line change
@@ -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:

0 comments on commit 8e766b3

Please sign in to comment.