diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp --- a/llvm/lib/MC/MCDwarf.cpp +++ b/llvm/lib/MC/MCDwarf.cpp @@ -833,14 +833,15 @@ MCOS->emitULEB128IntValue(1); MCOS->emitULEB128IntValue(dwarf::DW_TAG_compile_unit); MCOS->emitInt8(dwarf::DW_CHILDREN_yes); - EmitAbbrev(MCOS, dwarf::DW_AT_stmt_list, context.getDwarfVersion() >= 4 - ? dwarf::DW_FORM_sec_offset - : dwarf::DW_FORM_data4); + dwarf::Form SecOffsetForm = + context.getDwarfVersion() >= 4 + ? dwarf::DW_FORM_sec_offset + : (context.getDwarfFormat() == dwarf::DWARF64 ? dwarf::DW_FORM_data8 + : dwarf::DW_FORM_data4); + EmitAbbrev(MCOS, dwarf::DW_AT_stmt_list, SecOffsetForm); if (context.getGenDwarfSectionSyms().size() > 1 && context.getDwarfVersion() >= 3) { - EmitAbbrev(MCOS, dwarf::DW_AT_ranges, context.getDwarfVersion() >= 4 - ? dwarf::DW_FORM_sec_offset - : dwarf::DW_FORM_data4); + EmitAbbrev(MCOS, dwarf::DW_AT_ranges, SecOffsetForm); } else { EmitAbbrev(MCOS, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr); EmitAbbrev(MCOS, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr); diff --git a/llvm/test/MC/ELF/gen-dwarf64.s b/llvm/test/MC/ELF/gen-dwarf64.s --- a/llvm/test/MC/ELF/gen-dwarf64.s +++ b/llvm/test/MC/ELF/gen-dwarf64.s @@ -1,5 +1,9 @@ ## This checks that llvm-mc is able to produce 64-bit debug info. +# RUN: llvm-mc -g -dwarf-version 3 -dwarf64 -triple x86_64 %s -filetype=obj -o %t3.o +# RUN: llvm-readobj -r %t3.o | FileCheck --check-prefixes=REL,REL3 %s --implicit-check-not="R_{{.*}} .debug_" +# RUN: llvm-dwarfdump -v %t3.o | FileCheck --check-prefixes=DUMP,DUMP3 %s + # RUN: llvm-mc -g -dwarf-version 5 -dwarf64 -triple x86_64 %s -filetype=obj -o %t5.o # RUN: llvm-readobj -r %t5.o | FileCheck --check-prefixes=REL,REL5 %s --implicit-check-not="R_{{.*}} .debug_" # RUN: llvm-dwarfdump -v %t5.o | FileCheck --check-prefixes=DUMP,DUMP5 %s @@ -8,6 +12,7 @@ # 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 +# REL3-NEXT: R_X86_64_64 .debug_ranges 0x0 # REL5-NEXT: R_X86_64_64 .debug_rnglists 0x14 # REL: Section ({{[0-9]+}}) .rela.debug_aranges { # REL-NEXT: R_X86_64_64 .debug_info 0x0 @@ -15,10 +20,20 @@ # REL5-NEXT: R_X86_64_64 .debug_line_str 0x0 # REL5-NEXT: R_X86_64_64 .debug_line_str 0x +## DW_FORM_sec_offset was introduced in DWARFv4. +## For DWARFv3, DW_FORM_data8 is used instead. +# DUMP: .debug_abbrev contents: +# DUMP3: DW_AT_stmt_list DW_FORM_data8 +# DUMP3-NEXT: DW_AT_ranges DW_FORM_data8 +# DUMP5: DW_AT_stmt_list DW_FORM_sec_offset +# DUMP5-NEXT: DW_AT_ranges DW_FORM_sec_offset + # DUMP: .debug_info contents: # DUMP-NEXT: 0x00000000: Compile Unit: {{.*}} format = DWARF64 # DUMP: DW_TAG_compile_unit [1] * +# DUMP3-NEXT: DW_AT_stmt_list [DW_FORM_data8] (0x0000000000000000) # DUMP5-NEXT: DW_AT_stmt_list [DW_FORM_sec_offset] (0x0000000000000000) +# DUMP3-NEXT: DW_AT_ranges [DW_FORM_data8] (0x0000000000000000 # DUMP5-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x0000000000000014 # DUMP-NEXT: [0x0000000000000000, 0x0000000000000001) ".foo" # DUMP-NEXT: [0x0000000000000000, 0x0000000000000001) ".bar") @@ -47,6 +62,13 @@ # DUMP5-NEXT: 0x00000000: "[[DIR]]" # DUMP5-NEXT: 0x[[FILEOFF]]: "[[FILE]]" +# DUMP3: .debug_ranges contents: +# DUMP3-NEXT: 00000000 ffffffffffffffff 0000000000000000 +# DUMP3-NEXT: 00000000 0000000000000000 0000000000000001 +# DUMP3-NEXT: 00000000 ffffffffffffffff 0000000000000000 +# DUMP3-NEXT: 00000000 0000000000000000 0000000000000001 +# DUMP3-NEXT: 00000000 + # DUMP5: .debug_rnglists contents: # DUMP5-NEXT: 0x00000000: range list header: length = 0x000000000000001d, format = DWARF64, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000 # DUMP5-NEXT: ranges: