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 | |
parent | a257095ebb29fd223be2fdbf86d542c5bdfe05f0 (diff) | |
download | llvm-42263e2e407ab7d1d805e7b41cffd7217134d3b6.tar.gz llvm-42263e2e407ab7d1d805e7b41cffd7217134d3b6.tar.bz2 llvm-42263e2e407ab7d1d805e7b41cffd7217134d3b6.tar.xz |
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
-rw-r--r-- | include/llvm/Target/Mangler.h | 6 | ||||
-rw-r--r-- | include/llvm/Target/TargetLoweringObjectFile.h | 4 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfPrinter.cpp | 3 | ||||
-rw-r--r-- | lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 6 | ||||
-rw-r--r-- | lib/Target/TargetLoweringObjectFile.cpp | 30 |
5 files changed, 31 insertions, 18 deletions
diff --git a/include/llvm/Target/Mangler.h b/include/llvm/Target/Mangler.h index 45cbf9da1e..d8dc8ec8c4 100644 --- a/include/llvm/Target/Mangler.h +++ b/include/llvm/Target/Mangler.h @@ -51,6 +51,12 @@ public: // symbols. Mangler(const MCAsmInfo &mai) : MAI(mai), NextAnonGlobalID(1) {} + /// getUniqueID() - Allocate and return a unique ID. + /// FIXME: Remove this. + unsigned getUniqueID() { + return NextAnonGlobalID++; + } + /// getNameWithPrefix - Fill OutName with the name of the appropriate prefix /// and the specified global variable's name. If the global variable doesn't /// have a name, this fills in a unique name for the global. diff --git a/include/llvm/Target/TargetLoweringObjectFile.h b/include/llvm/Target/TargetLoweringObjectFile.h index 7750cf02a6..6c99598ea6 100644 --- a/include/llvm/Target/TargetLoweringObjectFile.h +++ b/include/llvm/Target/TargetLoweringObjectFile.h @@ -208,8 +208,8 @@ public: /// const MCExpr * - getExprForDwarfReference(const MCSymbol *Sym, MachineModuleInfo *MMI, - unsigned Encoding, + getExprForDwarfReference(const MCSymbol *Sym, Mangler *Mang, + MachineModuleInfo *MMI, unsigned Encoding, MCStreamer &Streamer) const; virtual unsigned getPersonalityEncoding() const; diff --git a/lib/CodeGen/AsmPrinter/DwarfPrinter.cpp b/lib/CodeGen/AsmPrinter/DwarfPrinter.cpp index 0a314dd43e..ed4772783d 100644 --- a/lib/CodeGen/AsmPrinter/DwarfPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfPrinter.cpp @@ -189,7 +189,8 @@ void DwarfPrinter::EmitULEB128(unsigned Value, const char *Desc, void DwarfPrinter::EmitReference(const MCSymbol *Sym, unsigned Encoding) const { const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); - const MCExpr *Exp = TLOF.getExprForDwarfReference(Sym, Asm->MMI, Encoding, + const MCExpr *Exp = TLOF.getExprForDwarfReference(Sym, Asm->Mang, + Asm->MMI, Encoding, Asm->OutStreamer); Asm->OutStreamer.EmitValue(Exp, SizeOfEncodedValue(Encoding), /*addrspace*/0); } diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index c03ed4503e..788bbf1190 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -421,7 +421,7 @@ getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, } return TargetLoweringObjectFile:: - getExprForDwarfReference(Sym, MMI, + getExprForDwarfReference(Sym, Mang, MMI, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); } @@ -784,8 +784,8 @@ getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, } return TargetLoweringObjectFile:: - getExprForDwarfReference(Sym, MMI, Encoding & ~dwarf::DW_EH_PE_indirect, - Streamer); + getExprForDwarfReference(Sym, Mang, MMI, + Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); } return TargetLoweringObjectFile:: 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 { |