If we use DW_AT_ranges we need to specify a base address that ranges
authorEric Christopher <echristo@gmail.com>
Wed, 29 Jan 2014 22:22:56 +0000 (22:22 +0000)
committerEric Christopher <echristo@gmail.com>
Wed, 29 Jan 2014 22:22:56 +0000 (22:22 +0000)
are relative to in the compile unit. Currently let's just use 0...

Thanks to Greg Clayton for the catch!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200425 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/DwarfDebug.cpp
test/DebugInfo/X86/stmt-list-multiple-compile-units.ll

index d557f403480296bd53cd01929bb522802ec25152..326c4482d2ec058cc8cf893d3f676a290ba4d5e5 100644 (file)
@@ -1054,11 +1054,17 @@ void DwarfDebug::finalizeModuleInfo() {
       // FIXME: We should use ranges if we have multiple compile units or
       // allow reordering of code ala .subsections_via_symbols in mach-o.
       DwarfCompileUnit *U = SkCU ? SkCU : static_cast<DwarfCompileUnit *>(TheU);
-      if (useCURanges() && TheU->getRanges().size())
+      if (useCURanges() && TheU->getRanges().size()) {
         addSectionLabel(Asm, U, U->getUnitDie(), dwarf::DW_AT_ranges,
                         Asm->GetTempSymbol("cu_ranges", U->getUniqueID()),
                         DwarfDebugRangeSectionSym);
-      else
+
+        // A DW_AT_low_pc attribute may also be specified in combination with
+        // DW_AT_ranges to specify the default base address for use in location
+        // lists (see Section 2.6.2) and range lists (see Section 2.17.3).
+        U->addUInt(U->getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
+                   0);
+      } else
         U->addUInt(U->getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
                    0);
     }
index 5cb8f613a340188de3270af66cea26bb69e8f20a..4e14e6099a177b1d20c78f8ea11f80439977e207 100644 (file)
@@ -9,10 +9,12 @@
 ; CHECK: DW_TAG_compile_unit
 ; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset]   (0x00000000)
 ; CHECK: DW_AT_ranges [DW_FORM_sec_offset]      (0x00000000)
+; CHECK: DW_AT_low_pc [DW_FORM_addr]            (0x0000000000000000)
 
 ; CHECK: DW_TAG_compile_unit
 ; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset]   (0x0000003c)
 ; CHECK: DW_AT_ranges [DW_FORM_sec_offset]      (0x00000020)
+; CHECK: DW_AT_low_pc [DW_FORM_addr]            (0x0000000000000000)
 
 ; CHECK: .debug_line contents:
 ; CHECK-NEXT: Line table prologue:
 ; DWARF3: DW_TAG_compile_unit
 ; DWARF3: DW_AT_stmt_list [DW_FORM_data4]    (0x00000000)
 ; DWARF3: DW_AT_ranges [DW_FORM_data4]       (0x00000000)
+; DWARF3: DW_AT_low_pc [DW_FORM_addr]        (0x0000000000000000)
 
 ; DWARF3: DW_TAG_compile_unit
 ; DWARF3: DW_AT_stmt_list [DW_FORM_data4]   (0x0000003c)
 ; DWARF3: DW_AT_ranges [DW_FORM_data4]      (0x00000020)
+; DWARF3: DW_AT_low_pc [DW_FORM_addr]       (0x0000000000000000)
 
 ; DWARF3: .debug_line contents:
 ; DWARF3-NEXT: Line table prologue: