diff options
author | Chris Lattner <sabre@nondot.org> | 2010-03-11 21:55:20 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-03-11 21:55:20 +0000 |
commit | 03627cb12c066a4aed81536a7b9f4af1a59e8fa1 (patch) | |
tree | d8f2ea9a908aa4835ed85c4417c5b4505d36ffba /llvm/lib/Target/TargetLoweringObjectFile.cpp | |
parent | 576aec4363ad12140f44f2e68abe90855270c4df (diff) | |
download | bcm5719-llvm-03627cb12c066a4aed81536a7b9f4af1a59e8fa1.tar.gz bcm5719-llvm-03627cb12c066a4aed81536a7b9f4af1a59e8fa1.zip |
fix a fixme in TargetLoweringObjectFile::getExprForDwarfReference
where we used ot create an MCSymbol for ".". Now emit an assembler
temporary label and reference it instead of "." textually.
rdar://7739457
llvm-svn: 98292
Diffstat (limited to 'llvm/lib/Target/TargetLoweringObjectFile.cpp')
-rw-r--r-- | llvm/lib/Target/TargetLoweringObjectFile.cpp | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/llvm/lib/Target/TargetLoweringObjectFile.cpp b/llvm/lib/Target/TargetLoweringObjectFile.cpp index 87527bd29e6..b47dad5c94a 100644 --- a/llvm/lib/Target/TargetLoweringObjectFile.cpp +++ b/llvm/lib/Target/TargetLoweringObjectFile.cpp @@ -19,6 +19,7 @@ #include "llvm/GlobalVariable.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCExpr.h" +#include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSymbol.h" #include "llvm/Target/Mangler.h" #include "llvm/Target/TargetData.h" @@ -307,29 +308,34 @@ getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, else Sym = getContext().GetOrCreateSymbol(Name.str()); - return getExprForDwarfReference(Sym, MMI, Encoding, Streamer); + return getExprForDwarfReference(Sym, Mang, MMI, Encoding, Streamer); } const MCExpr *TargetLoweringObjectFile:: -getExprForDwarfReference(const MCSymbol *Sym, MachineModuleInfo *MMI, - unsigned Encoding, MCStreamer &Streamer) const { +getExprForDwarfReference(const MCSymbol *Sym, Mangler *Mang, + MachineModuleInfo *MMI, unsigned Encoding, + MCStreamer &Streamer) const { const MCExpr *Res = MCSymbolRefExpr::Create(Sym, getContext()); switch (Encoding & 0xF0) { default: llvm_report_error("We do not support this DWARF encoding yet!"); - break; case dwarf::DW_EH_PE_absptr: // Do nothing special - break; - case dwarf::DW_EH_PE_pcrel: - // FIXME: PCSymbol - const MCExpr *PC = MCSymbolRefExpr::Create(".", getContext()); - Res = MCBinaryExpr::CreateSub(Res, PC, getContext()); - break; + return Res; + case dwarf::DW_EH_PE_pcrel: { + // Emit a label to the streamer for the current position. This gives us + // .-foo addressing. + SmallString<128> Name; + Mang->getNameWithPrefix(Name, Twine("PCtemp") + Twine(Mang->getUniqueID()), + Mangler::Private); + + MCSymbol *PCSym = getContext().GetOrCreateTemporarySymbol(Name.str()); + Streamer.EmitLabel(PCSym); + const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, getContext()); + return MCBinaryExpr::CreateSub(Res, PC, getContext()); + } } - - return Res; } unsigned TargetLoweringObjectFile::getPersonalityEncoding() const { |