diff --git a/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp index d809daf0d6f..b879d48ce05 100644 --- a/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp @@ -61,7 +61,8 @@ MCSymbol *X86AsmPrinter::GetGlobalValueSymbol(const GlobalValue *GV) const { X86COFFMachineModuleInfo &COFFMMI = MMI->getObjFileInfo(); - COFFMMI.DecorateCygMingName(Symb, OutContext, GV, *TM.getTargetData()); + COFFMMI.DecorateCygMingName(Symb, OutContext, cast(GV), + *TM.getTargetData()); return Symb; } diff --git a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp index 8eaeeacd39b..8dabaac6d19 100644 --- a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp +++ b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp @@ -23,6 +23,7 @@ #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCInst.h" #include "llvm/MC/MCStreamer.h" +#include "llvm/MC/MCSymbol.h" #include "llvm/Target/Mangler.h" #include "llvm/Support/FormattedStream.h" #include "llvm/ADT/SmallString.h" @@ -54,7 +55,21 @@ GetSymbolFromOperand(const MachineOperand &MO) const { SmallString<128> Name; - if (MO.isGlobal()) { + if (!MO.isGlobal()) { + assert(MO.isSymbol()); + Name += AsmPrinter.MAI->getGlobalPrefix(); + Name += MO.getSymbolName(); + } else if (getSubtarget().isTargetCygMing() && + isa(MO.getGlobal())) { + const GlobalValue *GV = MO.getGlobal(); + MCSymbol *Sym = Mang->getSymbol(GV); + X86COFFMachineModuleInfo &COFFMMI = + AsmPrinter.MMI->getObjFileInfo(); + COFFMMI.DecorateCygMingName(Sym, Ctx, cast(GV), + *AsmPrinter.TM.getTargetData()); + Name.append(Sym->getName().begin(), Sym->getName().end()); + } else { + const GlobalValue *GV = MO.getGlobal(); bool isImplicitlyPrivate = false; if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB || MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY || @@ -62,18 +77,7 @@ GetSymbolFromOperand(const MachineOperand &MO) const { MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE) isImplicitlyPrivate = true; - const GlobalValue *GV = MO.getGlobal(); Mang->getNameWithPrefix(Name, GV, isImplicitlyPrivate); - - if (getSubtarget().isTargetCygMing()) { - X86COFFMachineModuleInfo &COFFMMI = - AsmPrinter.MMI->getObjFileInfo(); - COFFMMI.DecorateCygMingName(Name, GV, *AsmPrinter.TM.getTargetData()); - } - } else { - assert(MO.isSymbol()); - Name += AsmPrinter.MAI->getGlobalPrefix(); - Name += MO.getSymbolName(); } // If the target flags on the operand changes the name of the symbol, do that diff --git a/lib/Target/X86/X86COFFMachineModuleInfo.cpp b/lib/Target/X86/X86COFFMachineModuleInfo.cpp index fcdeba1b1cc..8fbd20714d6 100644 --- a/lib/Target/X86/X86COFFMachineModuleInfo.cpp +++ b/lib/Target/X86/X86COFFMachineModuleInfo.cpp @@ -22,65 +22,50 @@ #include "llvm/Support/raw_ostream.h" using namespace llvm; -X86COFFMachineModuleInfo::X86COFFMachineModuleInfo(const MachineModuleInfo &) { -} + X86COFFMachineModuleInfo::~X86COFFMachineModuleInfo() { } -void X86COFFMachineModuleInfo::addExternalFunction(const StringRef& Name) { - CygMingStubs.insert(Name); -} - -/// DecorateCygMingName - Apply various name decorations if the function uses -/// stdcall or fastcall calling convention. -void X86COFFMachineModuleInfo::DecorateCygMingName(SmallVectorImpl &Name, - const GlobalValue *GV, +/// DecorateCygMingName - Query FunctionInfoMap and use this information for +/// various name decorations for Cygwin and MingW. +void X86COFFMachineModuleInfo::DecorateCygMingName(MCSymbol *&NameSym, + MCContext &Ctx, + const Function *F, const TargetData &TD) { - const Function *F = dyn_cast(GV); - if (!F) return; - + SmallString<128> Name(NameSym->getName().begin(), NameSym->getName().end()); + // We don't want to decorate non-stdcall or non-fastcall functions right now CallingConv::ID CC = F->getCallingConv(); if (CC != CallingConv::X86_StdCall && CC != CallingConv::X86_FastCall) return; - + unsigned ArgWords = 0; // Calculate arguments sizes for (Function::const_arg_iterator AI = F->arg_begin(), AE = F->arg_end(); AI != AE; ++AI) { const Type *Ty = AI->getType(); - + // 'Dereference' type in case of byval parameter attribute if (AI->hasByValAttr()) Ty = cast(Ty)->getElementType(); - + // Size should be aligned to DWORD boundary ArgWords += ((TD.getTypeAllocSize(Ty) + 3)/4)*4; } - + const FunctionType *FT = F->getFunctionType(); // "Pure" variadic functions do not receive @0 suffix. if (!FT->isVarArg() || FT->getNumParams() == 0 || (FT->getNumParams() == 1 && F->hasStructRetAttr())) raw_svector_ostream(Name) << '@' << ArgWords; - + if (CC == CallingConv::X86_FastCall) { if (Name[0] == '_') Name[0] = '@'; else Name.insert(Name.begin(), '@'); } -} - -/// DecorateCygMingName - Query FunctionInfoMap and use this information for -/// various name decorations for Cygwin and MingW. -void X86COFFMachineModuleInfo::DecorateCygMingName(MCSymbol *&Name, - MCContext &Ctx, - const GlobalValue *GV, - const TargetData &TD) { - SmallString<128> NameStr(Name->getName().begin(), Name->getName().end()); - DecorateCygMingName(NameStr, GV, TD); - - Name = Ctx.GetOrCreateSymbol(NameStr.str()); + + NameSym = Ctx.GetOrCreateSymbol(Name.str()); } diff --git a/lib/Target/X86/X86COFFMachineModuleInfo.h b/lib/Target/X86/X86COFFMachineModuleInfo.h index 1552ce117dc..f43b5ce7cbb 100644 --- a/lib/Target/X86/X86COFFMachineModuleInfo.h +++ b/lib/Target/X86/X86COFFMachineModuleInfo.h @@ -27,15 +27,16 @@ namespace llvm { class X86COFFMachineModuleInfo : public MachineModuleInfoImpl { StringSet<> CygMingStubs; public: - X86COFFMachineModuleInfo(const MachineModuleInfo &); - ~X86COFFMachineModuleInfo(); + X86COFFMachineModuleInfo(const MachineModuleInfo &) {} + virtual ~X86COFFMachineModuleInfo(); - void DecorateCygMingName(MCSymbol* &Name, MCContext &Ctx, - const GlobalValue *GV, const TargetData &TD); - void DecorateCygMingName(SmallVectorImpl &Name, const GlobalValue *GV, - const TargetData &TD); + void DecorateCygMingName(MCSymbol *&Name, MCContext &Ctx, + const Function *F, const TargetData &TD); - void addExternalFunction(const StringRef& Name); + void addExternalFunction(StringRef Name) { + CygMingStubs.insert(Name); + } + typedef StringSet<>::const_iterator stub_iterator; stub_iterator stub_begin() const { return CygMingStubs.begin(); } stub_iterator stub_end() const { return CygMingStubs.end(); }