From f4ec1889db0cb381943553ee2bc3fc2c766bc166 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Mon, 24 Mar 2014 21:07:27 +0000 Subject: [PATCH] DebugInfo: Implement relative addressing for DW_AT_ranges under fission 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 | 11 +++++++++-- test/DebugInfo/X86/fission-ranges.ll | 13 ++++++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index eb769fe7ae3..a368f03f753 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -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) { diff --git a/test/DebugInfo/X86/fission-ranges.ll b/test/DebugInfo/X86/fission-ranges.ll index 6a2bb487a75..b95038bacc1 100644 --- a/test/DebugInfo/X86/fission-ranges.ll +++ b/test/DebugInfo/X86/fission-ranges.ll @@ -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