diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2012-06-22 01:25:12 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2012-06-22 01:25:12 +0000 |
commit | 33da33676fe3026fb8e1b237e845698bff42ffb0 (patch) | |
tree | 4dcaa8f76cb2edcf5f37dffca08ae40c1bb3fd91 /llvm/lib | |
parent | b8650f106a57891ce004996569f59dcce5b9982e (diff) | |
download | bcm5719-llvm-33da33676fe3026fb8e1b237e845698bff42ffb0.tar.gz bcm5719-llvm-33da33676fe3026fb8e1b237e845698bff42ffb0.zip |
Emit relocations for DW_AT_location entries on systems which need it. This is
a recommit of r127757. Fixes PR9493. Patch by Paul Robinson!
llvm-svn: 158957
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 15 | ||||
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/MC/MCAsmInfo.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/MC/MCAsmInfoDarwin.cpp | 2 |
4 files changed, 18 insertions, 13 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index eeacc43c097..2d6dc804635 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -1388,13 +1388,14 @@ void AsmPrinter::EmitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset, unsigned Size) const { - // Emit Label+Offset - const MCExpr *Plus = - MCBinaryExpr::CreateAdd(MCSymbolRefExpr::Create(Label, OutContext), - MCConstantExpr::Create(Offset, OutContext), - OutContext); - - OutStreamer.EmitValue(Plus, 4, 0/*AddrSpace*/); + // Emit Label+Offset (or just Label if Offset is zero) + const MCExpr *Expr = MCSymbolRefExpr::Create(Label, OutContext); + if (Offset) + Expr = MCBinaryExpr::CreateAdd(Expr, + MCConstantExpr::Create(Offset, OutContext), + OutContext); + + OutStreamer.EmitValue(Expr, Size, 0/*AddrSpace*/); } diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 2e24977ef24..1e4ef5fbdbb 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1624,7 +1624,7 @@ void DwarfDebug::emitDIE(DIE *Die) { // DW_AT_range Value encodes offset in debug_range section. DIEInteger *V = cast<DIEInteger>(Values[i]); - if (Asm->MAI->doesDwarfUseLabelOffsetForRanges()) { + if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) { Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym, V->getValue(), 4); @@ -1637,10 +1637,14 @@ void DwarfDebug::emitDIE(DIE *Die) { break; } case dwarf::DW_AT_location: { - if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) - Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4); - else + if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) { + if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) + Asm->EmitLabelReference(L->getValue(), 4); + else + Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4); + } else { Values[i]->EmitValue(Asm, Form); + } break; } case dwarf::DW_AT_accessibility: { diff --git a/llvm/lib/MC/MCAsmInfo.cpp b/llvm/lib/MC/MCAsmInfo.cpp index d9c1d51d185..beb20e8f159 100644 --- a/llvm/lib/MC/MCAsmInfo.cpp +++ b/llvm/lib/MC/MCAsmInfo.cpp @@ -86,7 +86,7 @@ MCAsmInfo::MCAsmInfo() { DwarfUsesInlineInfoSection = false; DwarfRequiresRelocationForSectionOffset = true; DwarfSectionOffsetDirective = 0; - DwarfUsesLabelOffsetForRanges = true; + DwarfUsesRelocationsAcrossSections = true; DwarfUsesRelocationsForStringPool = true; DwarfRegNumForCFI = false; HasMicrosoftFastStdCallMangling = false; diff --git a/llvm/lib/MC/MCAsmInfoDarwin.cpp b/llvm/lib/MC/MCAsmInfoDarwin.cpp index 73ef7ba0604..7c271a9e824 100644 --- a/llvm/lib/MC/MCAsmInfoDarwin.cpp +++ b/llvm/lib/MC/MCAsmInfoDarwin.cpp @@ -60,6 +60,6 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() { HasSymbolResolver = true; DwarfRequiresRelocationForSectionOffset = false; - DwarfUsesLabelOffsetForRanges = false; + DwarfUsesRelocationsAcrossSections = false; DwarfUsesRelocationsForStringPool = false; } |