From 1ad8457570e8641f9729b8cd45d2468bea59a754 Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Wed, 15 Jan 2014 00:04:29 +0000 Subject: [PATCH] Make sure we emit a relocation to the debug_ranges section in the presence of CU ranges. llvm-svn: 199276 --- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 9 ++++++--- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h | 6 ++++++ llvm/test/DebugInfo/X86/cu-ranges.ll | 4 ++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index c895f17931d9..f76e898cfb5a 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -209,6 +209,10 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) else HasDwarfPubSections = DwarfPubSections == Enable; + // For now only turn on CU ranges if we've explicitly asked for it + // or we have -ffunction-sections enabled. + HasCURanges = DwarfCURanges || TargetMachine::getFunctionSections(); + DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber : getDwarfVersionFromModule(MMI->getModule()); @@ -1057,8 +1061,7 @@ 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(TheU); - if ((DwarfCURanges || TargetMachine::getFunctionSections()) && - TheU->getRanges().size()) + if (useCURanges() && TheU->getRanges().size()) addSectionLabel(Asm, U, U->getUnitDie(), dwarf::DW_AT_ranges, Asm->GetTempSymbol("cu_ranges", U->getUniqueID()), DwarfDebugRangeSectionSym); @@ -2910,7 +2913,7 @@ void DwarfDebug::emitDebugRanges() { } // Now emit a range for the CU itself. - if (DwarfCURanges) { + if (useCURanges()) { Asm->OutStreamer.EmitLabel( Asm->GetTempSymbol("cu_ranges", TheCU->getUniqueID())); const SmallVectorImpl &Ranges = TheCU->getRanges(); diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index 5a2110605542..516def804d15 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -458,6 +458,9 @@ class DwarfDebug : public AsmPrinterHandler { // Whether to emit the pubnames/pubtypes sections. bool HasDwarfPubSections; + // Whether or not to use AT_ranges for compilation units. + bool HasCURanges; + // Version of dwarf we're emitting. unsigned DwarfVersion; @@ -733,6 +736,9 @@ public: /// split dwarf proposal support. bool useSplitDwarf() { return HasSplitDwarf; } + /// \brief Returns whether or not to use AT_ranges for compilation units. + bool useCURanges() { return HasCURanges; } + /// Returns the Dwarf Version. unsigned getDwarfVersion() const { return DwarfVersion; } diff --git a/llvm/test/DebugInfo/X86/cu-ranges.ll b/llvm/test/DebugInfo/X86/cu-ranges.ll index 77561a4e6333..e582ea733247 100644 --- a/llvm/test/DebugInfo/X86/cu-ranges.ll +++ b/llvm/test/DebugInfo/X86/cu-ranges.ll @@ -1,5 +1,6 @@ ; RUN: llc -split-dwarf=Enable -O0 %s -ffunction-sections -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t ; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck --check-prefix=FUNCTION-SECTIONS %s +; RUN: llvm-readobj --relocations %t | FileCheck --check-prefix=FUNCTION-SECTIONS-RELOCS %s ; 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 --check-prefix=NO-FUNCTION-SECTIONS %s @@ -12,6 +13,9 @@ ; With function sections enabled make sure that we have a DW_AT_ranges attribute. ; FUNCTION-SECTIONS: DW_AT_ranges +; Check that we have a relocation against the .debug_ranges section. +; FUNCTION-SECTIONS-RELOCS: R_X86_64_32 .debug_ranges 0x0 + ; Without function sections enabled make sure that we have no DW_AT_ranges attribute. ; NO-FUNCTION-SECTIONS-NOT: DW_AT_ranges