Make sure we emit a relocation to the debug_ranges section in the

presence of CU ranges.

llvm-svn: 199276
This commit is contained in:
Eric Christopher 2014-01-15 00:04:29 +00:00
parent e9fab9b077
commit 1ad8457570
3 changed files with 16 additions and 3 deletions

View File

@ -209,6 +209,10 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
else else
HasDwarfPubSections = DwarfPubSections == Enable; 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 DwarfVersion = DwarfVersionNumber
? DwarfVersionNumber ? DwarfVersionNumber
: getDwarfVersionFromModule(MMI->getModule()); : getDwarfVersionFromModule(MMI->getModule());
@ -1057,8 +1061,7 @@ void DwarfDebug::finalizeModuleInfo() {
// FIXME: We should use ranges if we have multiple compile units or // FIXME: We should use ranges if we have multiple compile units or
// allow reordering of code ala .subsections_via_symbols in mach-o. // allow reordering of code ala .subsections_via_symbols in mach-o.
DwarfCompileUnit *U = SkCU ? SkCU : static_cast<DwarfCompileUnit *>(TheU); DwarfCompileUnit *U = SkCU ? SkCU : static_cast<DwarfCompileUnit *>(TheU);
if ((DwarfCURanges || TargetMachine::getFunctionSections()) && if (useCURanges() && TheU->getRanges().size())
TheU->getRanges().size())
addSectionLabel(Asm, U, U->getUnitDie(), dwarf::DW_AT_ranges, addSectionLabel(Asm, U, U->getUnitDie(), dwarf::DW_AT_ranges,
Asm->GetTempSymbol("cu_ranges", U->getUniqueID()), Asm->GetTempSymbol("cu_ranges", U->getUniqueID()),
DwarfDebugRangeSectionSym); DwarfDebugRangeSectionSym);
@ -2910,7 +2913,7 @@ void DwarfDebug::emitDebugRanges() {
} }
// Now emit a range for the CU itself. // Now emit a range for the CU itself.
if (DwarfCURanges) { if (useCURanges()) {
Asm->OutStreamer.EmitLabel( Asm->OutStreamer.EmitLabel(
Asm->GetTempSymbol("cu_ranges", TheCU->getUniqueID())); Asm->GetTempSymbol("cu_ranges", TheCU->getUniqueID()));
const SmallVectorImpl<RangeSpan> &Ranges = TheCU->getRanges(); const SmallVectorImpl<RangeSpan> &Ranges = TheCU->getRanges();

View File

@ -458,6 +458,9 @@ class DwarfDebug : public AsmPrinterHandler {
// Whether to emit the pubnames/pubtypes sections. // Whether to emit the pubnames/pubtypes sections.
bool HasDwarfPubSections; bool HasDwarfPubSections;
// Whether or not to use AT_ranges for compilation units.
bool HasCURanges;
// Version of dwarf we're emitting. // Version of dwarf we're emitting.
unsigned DwarfVersion; unsigned DwarfVersion;
@ -733,6 +736,9 @@ public:
/// split dwarf proposal support. /// split dwarf proposal support.
bool useSplitDwarf() { return HasSplitDwarf; } bool useSplitDwarf() { return HasSplitDwarf; }
/// \brief Returns whether or not to use AT_ranges for compilation units.
bool useCURanges() { return HasCURanges; }
/// Returns the Dwarf Version. /// Returns the Dwarf Version.
unsigned getDwarfVersion() const { return DwarfVersion; } unsigned getDwarfVersion() const { return DwarfVersion; }

View File

@ -1,5 +1,6 @@
; RUN: llc -split-dwarf=Enable -O0 %s -ffunction-sections -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t ; 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-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: 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 ; 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. ; With function sections enabled make sure that we have a DW_AT_ranges attribute.
; FUNCTION-SECTIONS: DW_AT_ranges ; 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. ; Without function sections enabled make sure that we have no DW_AT_ranges attribute.
; NO-FUNCTION-SECTIONS-NOT: DW_AT_ranges ; NO-FUNCTION-SECTIONS-NOT: DW_AT_ranges