136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===-- Mangler.cpp - Self-contained c/asm llvm name mangler --------------===// 236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The LLVM Compiler Infrastructure 436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source 636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details. 736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Unified name mangler for assembly backends. 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Mangler.h" 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/SmallString.h" 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/Twine.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/DataLayout.h" 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/DerivedTypes.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Function.h" 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/raw_ostream.h" 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace llvm; 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic void getNameWithPrefixx(raw_ostream &OS, const Twine &GVName, 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Mangler::ManglerPrefixTy PrefixTy, 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const DataLayout &DL, bool UseAt) { 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallString<256> TmpData; 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef Name = GVName.toStringRef(TmpData); 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(!Name.empty() && "getNameWithPrefix requires non-empty name"); 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (PrefixTy == Mangler::Private) 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << DL.getPrivateGlobalPrefix(); 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else if (PrefixTy == Mangler::LinkerPrivate) 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << DL.getLinkerPrivateGlobalPrefix(); 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (UseAt) { 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << '@'; 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } else { 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines char Prefix = DL.getGlobalPrefix(); 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Prefix != '\0') 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << Prefix; 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If this is a simple string that doesn't need escaping, just append it. 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << Name; 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid Mangler::getNameWithPrefix(raw_ostream &OS, const Twine &GVName, 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ManglerPrefixTy PrefixTy) const { 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return getNameWithPrefixx(OS, GVName, PrefixTy, *DL, false); 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName, 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const Twine &GVName, 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ManglerPrefixTy PrefixTy) const { 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_svector_ostream OS(OutName); 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return getNameWithPrefix(OS, GVName, PrefixTy); 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// AddFastCallStdCallSuffix - Microsoft fastcall and stdcall functions require 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// a suffix on their name indicating the number of words of arguments they 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// take. 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic void AddFastCallStdCallSuffix(raw_ostream &OS, const Function *F, 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const DataLayout &TD) { 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Calculate arguments size total. 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned ArgWords = 0; 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (Function::const_arg_iterator AI = F->arg_begin(), AE = F->arg_end(); 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AI != AE; ++AI) { 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Type *Ty = AI->getType(); 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // 'Dereference' type in case of byval or inalloca parameter attribute. 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (AI->hasByValOrInAllocaAttr()) 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Ty = cast<PointerType>(Ty)->getElementType(); 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Size should be aligned to DWORD boundary 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ArgWords += ((TD.getTypeAllocSize(Ty) + 3)/4)*4; 7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << '@' << ArgWords; 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid Mangler::getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV, 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool CannotUsePrivateLabel) const { 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ManglerPrefixTy PrefixTy = Mangler::Default; 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (GV->hasPrivateLinkage()) { 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (CannotUsePrivateLabel) 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PrefixTy = Mangler::LinkerPrivate; 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PrefixTy = Mangler::Private; 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!GV->hasName()) { 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Get the ID for the global, assigning a new one if we haven't got one 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // already. 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned &ID = AnonGlobalIDs[GV]; 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (ID == 0) 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ID = NextAnonGlobalID++; 9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Must mangle the global into a unique ID. 9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getNameWithPrefix(OS, "__unnamed_" + Twine(ID), PrefixTy); 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return; 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef Name = GV->getName(); 10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // No need to do anything special if the global has the special "do not 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // mangle" flag in the name. 10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Name[0] == '\1') { 10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << Name.substr(1); 10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return; 10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool UseAt = false; 111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const Function *MSFunc = nullptr; 11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines CallingConv::ID CC; 11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (DL->hasMicrosoftFastStdCallMangling()) { 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if ((MSFunc = dyn_cast<Function>(GV))) { 11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines CC = MSFunc->getCallingConv(); 11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // fastcall functions need to start with @ instead of _. 11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (CC == CallingConv::X86_FastCall) 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines UseAt = true; 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getNameWithPrefixx(OS, Name, PrefixTy, *DL, UseAt); 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!MSFunc) 12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return; 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If we are supposed to add a microsoft-style suffix for stdcall/fastcall, 12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // add it. 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // fastcall and stdcall functions usually need @42 at the end to specify 13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // the argument info. 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FunctionType *FT = MSFunc->getFunctionType(); 13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if ((CC == CallingConv::X86_FastCall || CC == CallingConv::X86_StdCall) && 13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // "Pure" variadic functions do not receive @0 suffix. 13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (!FT->isVarArg() || FT->getNumParams() == 0 || 13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (FT->getNumParams() == 1 && MSFunc->hasStructRetAttr()))) 13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AddFastCallStdCallSuffix(OS, MSFunc, *DL); 13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName, 14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const GlobalValue *GV, 14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool CannotUsePrivateLabel) const { 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_svector_ostream OS(OutName); 14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getNameWithPrefix(OS, GV, CannotUsePrivateLabel); 14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 145