[PATCH] D81148: [MC] Fix DWARF forms for 64-bit DWARFv3 files [6/7]

Igor Kudrin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 16 02:10:20 PDT 2020


This revision was automatically updated to reflect the committed changes.
Closed by commit rG1e081342d4bb: [MC] Fix DWARF forms for 64-bit DWARFv3 files [6/7] (authored by ikudrin).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D81148/new/

https://reviews.llvm.org/D81148

Files:
  llvm/lib/MC/MCDwarf.cpp
  llvm/test/MC/ELF/gen-dwarf64.s


Index: llvm/test/MC/ELF/gen-dwarf64.s
===================================================================
--- llvm/test/MC/ELF/gen-dwarf64.s
+++ 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 <End of list>
+
 # 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:
Index: llvm/lib/MC/MCDwarf.cpp
===================================================================
--- llvm/lib/MC/MCDwarf.cpp
+++ 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);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D81148.270992.patch
Type: text/x-patch
Size: 4231 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200616/b450cc3a/attachment.bin>


More information about the llvm-commits mailing list