mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-06 09:34:42 +01:00
[MC] Generate a compilation unit in the 64-bit DWARF format [3/7]
The patch enables producing DWARF64 compilation units and fixes generating references to .debug_abbrev and .debug_line sections. A similar change for .debug_ranges/.debug_rnglists will be added in a forthcoming patch. Differential Revision: https://reviews.llvm.org/D81145
This commit is contained in:
+24
-14
@@ -954,11 +954,19 @@ static void EmitGenDwarfInfo(MCStreamer *MCOS,
|
||||
|
||||
// First part: the header.
|
||||
|
||||
// The 4 byte total length of the information for this compilation unit, not
|
||||
// including these 4 bytes.
|
||||
unsigned UnitLengthBytes =
|
||||
dwarf::getUnitLengthFieldByteSize(context.getDwarfFormat());
|
||||
unsigned OffsetSize = dwarf::getDwarfOffsetByteSize(context.getDwarfFormat());
|
||||
|
||||
if (context.getDwarfFormat() == dwarf::DWARF64)
|
||||
// Emit DWARF64 mark.
|
||||
MCOS->emitInt32(dwarf::DW_LENGTH_DWARF64);
|
||||
|
||||
// The 4 (8 for DWARF64) byte total length of the information for this
|
||||
// compilation unit, not including the unit length field itself.
|
||||
const MCExpr *Length =
|
||||
MakeStartMinusEndExpr(context, *InfoStart, *InfoEnd, 4);
|
||||
emitAbsValue(*MCOS, Length, 4);
|
||||
MakeStartMinusEndExpr(context, *InfoStart, *InfoEnd, UnitLengthBytes);
|
||||
emitAbsValue(*MCOS, Length, OffsetSize);
|
||||
|
||||
// The 2 byte DWARF version.
|
||||
MCOS->emitInt16(context.getDwarfVersion());
|
||||
@@ -971,13 +979,14 @@ static void EmitGenDwarfInfo(MCStreamer *MCOS,
|
||||
MCOS->emitInt8(dwarf::DW_UT_compile);
|
||||
MCOS->emitInt8(AddrSize);
|
||||
}
|
||||
// The 4 byte offset to the debug abbrevs from the start of the .debug_abbrev,
|
||||
// it is at the start of that section so this is zero.
|
||||
if (AbbrevSectionSymbol == nullptr)
|
||||
MCOS->emitInt32(0);
|
||||
else
|
||||
MCOS->emitSymbolValue(AbbrevSectionSymbol, 4,
|
||||
// The 4 (8 for DWARF64) byte offset to the debug abbrevs from the start of
|
||||
// the .debug_abbrev.
|
||||
if (AbbrevSectionSymbol)
|
||||
MCOS->emitSymbolValue(AbbrevSectionSymbol, OffsetSize,
|
||||
AsmInfo.needsDwarfSectionOffsetDirective());
|
||||
else
|
||||
// Since the abbrevs are at the start of the section, the offset is zero.
|
||||
MCOS->emitIntValue(0, OffsetSize);
|
||||
if (context.getDwarfVersion() <= 4)
|
||||
MCOS->emitInt8(AddrSize);
|
||||
|
||||
@@ -986,13 +995,14 @@ static void EmitGenDwarfInfo(MCStreamer *MCOS,
|
||||
// The DW_TAG_compile_unit DIE abbrev (1).
|
||||
MCOS->emitULEB128IntValue(1);
|
||||
|
||||
// DW_AT_stmt_list, a 4 byte offset from the start of the .debug_line section,
|
||||
// which is at the start of that section so this is zero.
|
||||
// DW_AT_stmt_list, a 4 (8 for DWARF64) byte offset from the start of the
|
||||
// .debug_line section.
|
||||
if (LineSectionSymbol)
|
||||
MCOS->emitSymbolValue(LineSectionSymbol, 4,
|
||||
MCOS->emitSymbolValue(LineSectionSymbol, OffsetSize,
|
||||
AsmInfo.needsDwarfSectionOffsetDirective());
|
||||
else
|
||||
MCOS->emitInt32(0);
|
||||
// The line table is at the start of the section, so the offset is zero.
|
||||
MCOS->emitIntValue(0, OffsetSize);
|
||||
|
||||
if (RangesSymbol) {
|
||||
// There are multiple sections containing code, so we must use
|
||||
|
||||
@@ -5,10 +5,20 @@
|
||||
# RUN: llvm-dwarfdump -v %t5.o | FileCheck --check-prefixes=DUMP,DUMP5 %s
|
||||
|
||||
## The references to other debug info sections are 64-bit, as required for DWARF64.
|
||||
# REL: Section ({{[0-9]+}}) .rela.debug_info {
|
||||
# REL-NEXT: R_X86_64_64 .debug_abbrev 0x0
|
||||
# REL-NEXT: R_X86_64_64 .debug_line 0x0
|
||||
# REL5: Section ({{[0-9]+}}) .rela.debug_line {
|
||||
# REL5-NEXT: R_X86_64_64 .debug_line_str 0x0
|
||||
# REL5-NEXT: R_X86_64_64 .debug_line_str 0x
|
||||
|
||||
# DUMP: .debug_info contents:
|
||||
# DUMP-NEXT: 0x00000000: Compile Unit: {{.*}} format = DWARF64
|
||||
# DUMP: DW_TAG_compile_unit [1] *
|
||||
# DUMP5-NEXT: DW_AT_stmt_list [DW_FORM_sec_offset] (0x0000000000000000)
|
||||
# DUMP: DW_TAG_label [2]
|
||||
# DUMP-NEXT: DW_AT_name [DW_FORM_string] ("foo")
|
||||
|
||||
# DUMP: .debug_line contents:
|
||||
# DUMP-NEXT: debug_line[0x00000000]
|
||||
# DUMP-NEXT: Line table prologue:
|
||||
@@ -22,3 +32,7 @@
|
||||
# DUMP5: .debug_line_str contents:
|
||||
# DUMP5-NEXT: 0x00000000: "[[DIR]]"
|
||||
# DUMP5-NEXT: 0x[[FILEOFF]]: "[[FILE]]"
|
||||
|
||||
.section .foo, "ax", @progbits
|
||||
foo:
|
||||
nop
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
// This checks that llvm-mc is able to produce 64-bit debug info.
|
||||
|
||||
// RUN: llvm-mc -g -dwarf64 -triple x86_64-apple-darwin10 %s -filetype=obj -o %t
|
||||
// RUN: llvm-dwarfdump -v %t | FileCheck %s
|
||||
|
||||
// CHECK: .debug_info contents:
|
||||
// CHECK-NEXT: 0x00000000: Compile Unit: {{.*}} format = DWARF64, version = {{.*}}, abbr_offset = 0x0000, addr_size = 0x08
|
||||
// CHECK: DW_TAG_compile_unit [1] *
|
||||
// CHECK-NEXT: DW_AT_stmt_list [DW_FORM_sec_offset] (0x0000000000000000)
|
||||
// CHECK: DW_TAG_label [2]
|
||||
// CHECK-NEXT: DW_AT_name [DW_FORM_string] ("foo")
|
||||
|
||||
_foo:
|
||||
nop
|
||||
Reference in New Issue
Block a user