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 | 42263e2e407ab7d1d805e7b41cffd7217134d3b6 (patch) | |
tree | e8692ac06acd78e2b5b79758eadf78507860e611 /lib/Target/TargetLoweringObjectFile.cpp | |
parent | a257095ebb29fd223be2fdbf86d542c5bdfe05f0 (diff) |
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
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98292 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/TargetLoweringObjectFile.cpp')
-rw-r--r-- | lib/Target/TargetLoweringObjectFile.cpp | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index 87527bd29e..b47dad5c94 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/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 { |