From 8a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bc Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 12 Mar 2010 21:03:47 +0000 Subject: move fastcall/stdcall mangling up into Mangler. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98384 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCAsmInfo.cpp | 1 + lib/MC/MCAsmInfoCOFF.cpp | 1 + lib/Target/Mangler.cpp | 68 ++++++++++++++++++++++++---- lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp | 9 +--- lib/Target/X86/AsmPrinter/X86MCInstLower.cpp | 3 -- lib/Target/X86/X86COFFMachineModuleInfo.cpp | 44 ------------------ lib/Target/X86/X86COFFMachineModuleInfo.h | 3 -- 7 files changed, 62 insertions(+), 67 deletions(-) (limited to 'lib') diff --git a/lib/MC/MCAsmInfo.cpp b/lib/MC/MCAsmInfo.cpp index bda700b6aa..c96ff82b30 100644 --- a/lib/MC/MCAsmInfo.cpp +++ b/lib/MC/MCAsmInfo.cpp @@ -69,6 +69,7 @@ MCAsmInfo::MCAsmInfo() { DwarfRequiresFrameSection = true; DwarfUsesInlineInfoSection = false; DwarfSectionOffsetDirective = 0; + HasMicrosoftFastStdCallMangling = false; AsmTransCBE = 0; } diff --git a/lib/MC/MCAsmInfoCOFF.cpp b/lib/MC/MCAsmInfoCOFF.cpp index 9130493de2..5170206c72 100644 --- a/lib/MC/MCAsmInfoCOFF.cpp +++ b/lib/MC/MCAsmInfoCOFF.cpp @@ -35,4 +35,5 @@ MCAsmInfoCOFF::MCAsmInfoCOFF() { AbsoluteEHSectionOffsets = false; SupportsDebugInformation = true; DwarfSectionOffsetDirective = "\t.secrel32\t"; + HasMicrosoftFastStdCallMangling = true; } diff --git a/lib/Target/Mangler.cpp b/lib/Target/Mangler.cpp index c630062bdf..fb93706074 100644 --- a/lib/Target/Mangler.cpp +++ b/lib/Target/Mangler.cpp @@ -12,9 +12,12 @@ //===----------------------------------------------------------------------===// #include "llvm/Target/Mangler.h" -#include "llvm/GlobalValue.h" +#include "llvm/DerivedTypes.h" +#include "llvm/Function.h" +#include "llvm/Target/TargetData.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/Twine.h" using namespace llvm; @@ -144,6 +147,26 @@ void Mangler::getNameWithPrefix(SmallVectorImpl &OutName, return appendMangledQuotedName(OutName, Name); } +/// AddFastCallStdCallSuffix - Microsoft fastcall and stdcall functions require +/// a suffix on their name indicating the number of words of arguments they +/// take. +static void AddFastCallStdCallSuffix(SmallVectorImpl &OutName, + const Function *F, const TargetData &TD) { + // Calculate arguments size total. + unsigned ArgWords = 0; + 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; + } + + raw_svector_ostream(OutName) << '@' << ArgWords; +} + /// getNameWithPrefix - Fill OutName with the name of the appropriate prefix /// and the specified global variable's name. If the global variable doesn't @@ -158,16 +181,43 @@ void Mangler::getNameWithPrefix(SmallVectorImpl &OutName, PrefixTy = Mangler::LinkerPrivate; // If this global has a name, handle it simply. - if (GV->hasName()) - return getNameWithPrefix(OutName, GV->getName(), PrefixTy); + if (GV->hasName()) { + getNameWithPrefix(OutName, GV->getName(), PrefixTy); + } else { + // Get the ID for the global, assigning a new one if we haven't got one + // already. + unsigned &ID = AnonGlobalIDs[GV]; + if (ID == 0) ID = NextAnonGlobalID++; - // Get the ID for the global, assigning a new one if we haven't got one - // already. - unsigned &ID = AnonGlobalIDs[GV]; - if (ID == 0) ID = NextAnonGlobalID++; + // Must mangle the global into a unique ID. + getNameWithPrefix(OutName, "__unnamed_" + Twine(ID), PrefixTy); + } - // Must mangle the global into a unique ID. - getNameWithPrefix(OutName, "__unnamed_" + Twine(ID), PrefixTy); + // If we are supposed to add a microsoft-style suffix for stdcall/fastcall, + // add it. + if (Context.getAsmInfo().hasMicrosoftFastStdCallMangling()) { + if (const Function *F = dyn_cast(GV)) { + CallingConv::ID CC = F->getCallingConv(); + + // fastcall functions need to start with @. + // FIXME: This logic seems unlikely to be right. + if (CC == CallingConv::X86_FastCall) { + if (OutName[0] == '_') + OutName[0] = '@'; + else + OutName.insert(OutName.begin(), '@'); + } + + // fastcall and stdcall functions usually need @42 at the end to specify + // the argument info. + const FunctionType *FT = F->getFunctionType(); + if ((CC == CallingConv::X86_FastCall || CC == CallingConv::X86_StdCall) && + // "Pure" variadic functions do not receive @0 suffix. + (!FT->isVarArg() || FT->getNumParams() == 0 || + (FT->getNumParams() == 1 && F->hasStructRetAttr()))) + AddFastCallStdCallSuffix(OutName, F, TD); + } + } } /// getNameWithPrefix - Fill OutName with the name of the appropriate prefix diff --git a/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp index 517d3366c5..c6439c5f8d 100644 --- a/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp @@ -54,14 +54,7 @@ void X86AsmPrinter::PrintPICBaseSymbol() const { } MCSymbol *X86AsmPrinter::GetGlobalValueSymbol(const GlobalValue *GV) const { - MCSymbol *Symb = Mang->getSymbol(GV); - - if (!Subtarget->isTargetCygMing() || !isa(GV)) - return Symb; - - return X86COFFMachineModuleInfo:: - DecorateCygMingName(Symb, OutContext, cast(GV), - *TM.getTargetData()); + return Mang->getSymbol(GV); } /// runOnMachineFunction - Emit the function body. diff --git a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp index 7b8c479c5b..e80495b9c0 100644 --- a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp +++ b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp @@ -63,9 +63,6 @@ GetSymbolFromOperand(const MachineOperand &MO) const { isa(MO.getGlobal())) { const GlobalValue *GV = MO.getGlobal(); MCSymbol *Sym = Mang->getSymbol(GV); - Sym = X86COFFMachineModuleInfo:: - DecorateCygMingName(Sym, Ctx, cast(GV), - *AsmPrinter.TM.getTargetData()); Name.append(Sym->getName().begin(), Sym->getName().end()); } else { const GlobalValue *GV = MO.getGlobal(); diff --git a/lib/Target/X86/X86COFFMachineModuleInfo.cpp b/lib/Target/X86/X86COFFMachineModuleInfo.cpp index 2988e4f91d..e28c7ad97c 100644 --- a/lib/Target/X86/X86COFFMachineModuleInfo.cpp +++ b/lib/Target/X86/X86COFFMachineModuleInfo.cpp @@ -26,47 +26,3 @@ using namespace llvm; X86COFFMachineModuleInfo::~X86COFFMachineModuleInfo() { } -/// DecorateCygMingName - Query FunctionInfoMap and use this information for -/// various name decorations for Cygwin and MingW. -MCSymbol *X86COFFMachineModuleInfo::DecorateCygMingName(MCSymbol *NameSym, - MCContext &Ctx, - const Function *F, - const TargetData &TD) { - // 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 NameSym; - - 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(); - - SmallString<128> Name(NameSym->getName().begin(), NameSym->getName().end()); - - // "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(), '@'); - } - - return Ctx.GetOrCreateSymbol(Name.str()); -} diff --git a/lib/Target/X86/X86COFFMachineModuleInfo.h b/lib/Target/X86/X86COFFMachineModuleInfo.h index 27f82874ee..eece462eac 100644 --- a/lib/Target/X86/X86COFFMachineModuleInfo.h +++ b/lib/Target/X86/X86COFFMachineModuleInfo.h @@ -30,9 +30,6 @@ public: X86COFFMachineModuleInfo(const MachineModuleInfo &) {} virtual ~X86COFFMachineModuleInfo(); - static MCSymbol *DecorateCygMingName(MCSymbol *Name, MCContext &Ctx, - const Function *F, const TargetData &TD); - void addExternalFunction(StringRef Name) { CygMingStubs.insert(Name); } -- cgit v1.2.3