1202878Srdivacky//===-- Mangler.cpp - Self-contained c/asm llvm name mangler --------------===// 2202878Srdivacky// 3202878Srdivacky// The LLVM Compiler Infrastructure 4202878Srdivacky// 5202878Srdivacky// This file is distributed under the University of Illinois Open Source 6202878Srdivacky// License. See LICENSE.TXT for details. 7202878Srdivacky// 8202878Srdivacky//===----------------------------------------------------------------------===// 9202878Srdivacky// 10202878Srdivacky// Unified name mangler for assembly backends. 11202878Srdivacky// 12202878Srdivacky//===----------------------------------------------------------------------===// 13202878Srdivacky 14202878Srdivacky#include "llvm/Target/Mangler.h" 15249423Sdim#include "llvm/ADT/SmallString.h" 16249423Sdim#include "llvm/ADT/Twine.h" 17249423Sdim#include "llvm/IR/DataLayout.h" 18249423Sdim#include "llvm/IR/DerivedTypes.h" 19249423Sdim#include "llvm/IR/Function.h" 20202878Srdivacky#include "llvm/MC/MCAsmInfo.h" 21205218Srdivacky#include "llvm/MC/MCContext.h" 22263508Sdim#include "llvm/Target/TargetMachine.h" 23205218Srdivacky#include "llvm/Support/raw_ostream.h" 24202878Srdivackyusing namespace llvm; 25202878Srdivacky 26202878Srdivacky/// getNameWithPrefix - Fill OutName with the name of the appropriate prefix 27202878Srdivacky/// and the specified name as the global variable name. GVName must not be 28202878Srdivacky/// empty. 29202878Srdivackyvoid Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName, 30263508Sdim const Twine &GVName, ManglerPrefixTy PrefixTy, 31263508Sdim bool UseGlobalPrefix) { 32202878Srdivacky SmallString<256> TmpData; 33202878Srdivacky StringRef Name = GVName.toStringRef(TmpData); 34202878Srdivacky assert(!Name.empty() && "getNameWithPrefix requires non-empty name"); 35202878Srdivacky 36263508Sdim const MCAsmInfo *MAI = TM->getMCAsmInfo(); 37205218Srdivacky 38202878Srdivacky // If the global name is not led with \1, add the appropriate prefixes. 39202878Srdivacky if (Name[0] == '\1') { 40202878Srdivacky Name = Name.substr(1); 41202878Srdivacky } else { 42202878Srdivacky if (PrefixTy == Mangler::Private) { 43263508Sdim const char *Prefix = MAI->getPrivateGlobalPrefix(); 44202878Srdivacky OutName.append(Prefix, Prefix+strlen(Prefix)); 45202878Srdivacky } else if (PrefixTy == Mangler::LinkerPrivate) { 46263508Sdim const char *Prefix = MAI->getLinkerPrivateGlobalPrefix(); 47202878Srdivacky OutName.append(Prefix, Prefix+strlen(Prefix)); 48202878Srdivacky } 49202878Srdivacky 50263508Sdim if (UseGlobalPrefix) { 51263508Sdim const char *Prefix = MAI->getGlobalPrefix(); 52263508Sdim if (Prefix[0] == 0) 53263508Sdim ; // Common noop, no prefix. 54263508Sdim else if (Prefix[1] == 0) 55263508Sdim OutName.push_back(Prefix[0]); // Common, one character prefix. 56263508Sdim else 57263508Sdim // Arbitrary length prefix. 58263508Sdim OutName.append(Prefix, Prefix+strlen(Prefix)); 59263508Sdim } 60202878Srdivacky } 61263508Sdim 62202878Srdivacky // If this is a simple string that doesn't need escaping, just append it. 63263508Sdim OutName.append(Name.begin(), Name.end()); 64202878Srdivacky} 65202878Srdivacky 66205218Srdivacky/// AddFastCallStdCallSuffix - Microsoft fastcall and stdcall functions require 67205218Srdivacky/// a suffix on their name indicating the number of words of arguments they 68205218Srdivacky/// take. 69205218Srdivackystatic void AddFastCallStdCallSuffix(SmallVectorImpl<char> &OutName, 70243830Sdim const Function *F, const DataLayout &TD) { 71205218Srdivacky // Calculate arguments size total. 72205218Srdivacky unsigned ArgWords = 0; 73205218Srdivacky for (Function::const_arg_iterator AI = F->arg_begin(), AE = F->arg_end(); 74205218Srdivacky AI != AE; ++AI) { 75226633Sdim Type *Ty = AI->getType(); 76205218Srdivacky // 'Dereference' type in case of byval parameter attribute 77205218Srdivacky if (AI->hasByValAttr()) 78205218Srdivacky Ty = cast<PointerType>(Ty)->getElementType(); 79205218Srdivacky // Size should be aligned to DWORD boundary 80205218Srdivacky ArgWords += ((TD.getTypeAllocSize(Ty) + 3)/4)*4; 81205218Srdivacky } 82205218Srdivacky 83205218Srdivacky raw_svector_ostream(OutName) << '@' << ArgWords; 84205218Srdivacky} 85202878Srdivacky 86205218Srdivacky 87202878Srdivacky/// getNameWithPrefix - Fill OutName with the name of the appropriate prefix 88202878Srdivacky/// and the specified global variable's name. If the global variable doesn't 89202878Srdivacky/// have a name, this fills in a unique name for the global. 90202878Srdivackyvoid Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName, 91263508Sdim const GlobalValue *GV, bool isImplicitlyPrivate, 92263508Sdim bool UseGlobalPrefix) { 93202878Srdivacky ManglerPrefixTy PrefixTy = Mangler::Default; 94202878Srdivacky if (GV->hasPrivateLinkage() || isImplicitlyPrivate) 95202878Srdivacky PrefixTy = Mangler::Private; 96243830Sdim else if (GV->hasLinkerPrivateLinkage() || GV->hasLinkerPrivateWeakLinkage()) 97202878Srdivacky PrefixTy = Mangler::LinkerPrivate; 98202878Srdivacky 99202878Srdivacky // If this global has a name, handle it simply. 100205218Srdivacky if (GV->hasName()) { 101251662Sdim StringRef Name = GV->getName(); 102263508Sdim getNameWithPrefix(OutName, Name, PrefixTy, UseGlobalPrefix); 103251662Sdim // No need to do anything else if the global has the special "do not mangle" 104251662Sdim // flag in the name. 105251662Sdim if (Name[0] == 1) 106251662Sdim return; 107205218Srdivacky } else { 108205218Srdivacky // Get the ID for the global, assigning a new one if we haven't got one 109205218Srdivacky // already. 110205218Srdivacky unsigned &ID = AnonGlobalIDs[GV]; 111205218Srdivacky if (ID == 0) ID = NextAnonGlobalID++; 112202878Srdivacky 113205218Srdivacky // Must mangle the global into a unique ID. 114263508Sdim getNameWithPrefix(OutName, "__unnamed_" + Twine(ID), PrefixTy, 115263508Sdim UseGlobalPrefix); 116205218Srdivacky } 117202878Srdivacky 118205218Srdivacky // If we are supposed to add a microsoft-style suffix for stdcall/fastcall, 119205218Srdivacky // add it. 120263508Sdim if (TM->getMCAsmInfo()->hasMicrosoftFastStdCallMangling()) { 121205218Srdivacky if (const Function *F = dyn_cast<Function>(GV)) { 122205218Srdivacky CallingConv::ID CC = F->getCallingConv(); 123205218Srdivacky 124205218Srdivacky // fastcall functions need to start with @. 125205218Srdivacky // FIXME: This logic seems unlikely to be right. 126205218Srdivacky if (CC == CallingConv::X86_FastCall) { 127205218Srdivacky if (OutName[0] == '_') 128205218Srdivacky OutName[0] = '@'; 129205218Srdivacky else 130205218Srdivacky OutName.insert(OutName.begin(), '@'); 131205218Srdivacky } 132205218Srdivacky 133205218Srdivacky // fastcall and stdcall functions usually need @42 at the end to specify 134205218Srdivacky // the argument info. 135226633Sdim FunctionType *FT = F->getFunctionType(); 136205218Srdivacky if ((CC == CallingConv::X86_FastCall || CC == CallingConv::X86_StdCall) && 137205218Srdivacky // "Pure" variadic functions do not receive @0 suffix. 138205218Srdivacky (!FT->isVarArg() || FT->getNumParams() == 0 || 139205218Srdivacky (FT->getNumParams() == 1 && F->hasStructRetAttr()))) 140263508Sdim AddFastCallStdCallSuffix(OutName, F, *TM->getDataLayout()); 141205218Srdivacky } 142205218Srdivacky } 143202878Srdivacky} 144