DebugInfo: Implement relative addressing for DW_AT_ranges under fission
authorDavid Blaikie <dblaikie@gmail.com>
Mon, 24 Mar 2014 21:07:27 +0000 (21:07 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Mon, 24 Mar 2014 21:07:27 +0000 (21:07 +0000)
This removes the debug_ranges relocations from debug_info.dwo (but
doesn't implement the DW_AT_GNU_ranges_base which is also necessary for
correct functioning)

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

lib/CodeGen/AsmPrinter/DwarfDebug.cpp
test/DebugInfo/X86/fission-ranges.ll

index eb769fe7ae34952850043eeeef1934210f5a4f09..a368f03f7532f90cf3268aa3b642ceb624e59d85 100644 (file)
@@ -456,8 +456,15 @@ void DwarfDebug::addScopeRangeList(DwarfCompileUnit *TheCU, DIE *ScopeDIE,
   // Emit offset in .debug_range as a relocatable label. emitDIE will handle
   // emitting it appropriately.
   MCSymbol *RangeSym = Asm->GetTempSymbol("debug_ranges", GlobalRangeCount++);
-  addSectionLabel(Asm, TheCU, ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
-                  DwarfDebugRangeSectionSym);
+
+  // Under fission, ranges are specified by constant offsets relative to the
+  // CU's DW_AT_GNU_ranges_base.
+  if (useSplitDwarf())
+    TheCU->addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
+                           DwarfDebugRangeSectionSym);
+  else
+    addSectionLabel(Asm, TheCU, ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
+                    DwarfDebugRangeSectionSym);
 
   RangeSpanList List(RangeSym);
   for (const InsnRange &R : Range) {
index 6a2bb487a75635dff563ba535b02f681d1d58cce..b95038bacc1462c35ac7981887736ea046ecad43 100644 (file)
@@ -1,5 +1,14 @@
 ; RUN: llc -split-dwarf=Enable -O0 %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t
-; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s
+; RUN: llvm-dwarfdump -debug-dump=info.dwo %t | FileCheck %s
+; RUN: llvm-objdump -r %t | FileCheck --check-prefix=RELA %s
+
+; CHECK: DW_AT_ranges [DW_FORM_sec_offset]   (0x000000a0)
+
+; Make sure we don't produce any relocations in any .dwo section (though in particular, debug_info.dwo)
+; FIXME: There should be no relocations in .dwo sections at all, but for now there are debug_loc relocs here.
+; RELA: RELOCATION RECORDS FOR [.rela.debug_info.dwo]
+; RELA-NOT: R_X86_64_32 .debug_ranges
+; RELA: RELOCATION RECORDS FOR
 
 ; From the code:
 
@@ -29,8 +38,6 @@
 
 ; clang -g -S -gsplit-dwarf -O1 small.c
 
-; CHECK: DW_AT_ranges
-
 @c = external global i32
 
 ; Function Attrs: nounwind uwtable