1//===-- Mangler.cpp - Self-contained c/asm llvm name mangler --------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// Unified name mangler for assembly backends. 11// 12//===----------------------------------------------------------------------===// 13 14#include "llvm/IR/Mangler.h" 15#include "llvm/ADT/SmallString.h" 16#include "llvm/ADT/Twine.h" 17#include "llvm/IR/DataLayout.h" 18#include "llvm/IR/DerivedTypes.h" 19#include "llvm/IR/Function.h" 20#include "llvm/IR/Module.h" 21#include "llvm/Support/raw_ostream.h" 22using namespace llvm; 23 24namespace { 25enum ManglerPrefixTy { 26 Default, ///< Emit default string before each symbol. 27 Private, ///< Emit "private" prefix before each symbol. 28 LinkerPrivate ///< Emit "linker private" prefix before each symbol. 29}; 30} 31 32static void getNameWithPrefixImpl(raw_ostream &OS, const Twine &GVName, 33 ManglerPrefixTy PrefixTy, 34 const DataLayout &DL, char Prefix) { 35 SmallString<256> TmpData; 36 StringRef Name = GVName.toStringRef(TmpData); 37 assert(!Name.empty() && "getNameWithPrefix requires non-empty name"); 38 39 // No need to do anything special if the global has the special "do not 40 // mangle" flag in the name. 41 if (Name[0] == '\1') { 42 OS << Name.substr(1); 43 return; 44 } 45 46 if (PrefixTy == Private) 47 OS << DL.getPrivateGlobalPrefix(); 48 else if (PrefixTy == LinkerPrivate) 49 OS << DL.getLinkerPrivateGlobalPrefix(); 50 51 if (Prefix != '\0') 52 OS << Prefix; 53 54 // If this is a simple string that doesn't need escaping, just append it. 55 OS << Name; 56} 57 58static void getNameWithPrefixImpl(raw_ostream &OS, const Twine &GVName, 59 const DataLayout &DL, 60 ManglerPrefixTy PrefixTy) { 61 char Prefix = DL.getGlobalPrefix(); 62 return getNameWithPrefixImpl(OS, GVName, PrefixTy, DL, Prefix); 63} 64 65void Mangler::getNameWithPrefix(raw_ostream &OS, const Twine &GVName, 66 const DataLayout &DL) { 67 return getNameWithPrefixImpl(OS, GVName, DL, Default); 68} 69 70void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName, 71 const Twine &GVName, const DataLayout &DL) { 72 raw_svector_ostream OS(OutName); 73 char Prefix = DL.getGlobalPrefix(); 74 return getNameWithPrefixImpl(OS, GVName, Default, DL, Prefix); 75} 76 77static bool hasByteCountSuffix(CallingConv::ID CC) { 78 switch (CC) { 79 case CallingConv::X86_FastCall: 80 case CallingConv::X86_StdCall: 81 case CallingConv::X86_VectorCall: 82 return true; 83 default: 84 return false; 85 } 86} 87 88/// Microsoft fastcall and stdcall functions require a suffix on their name 89/// indicating the number of words of arguments they take. 90static void addByteCountSuffix(raw_ostream &OS, const Function *F, 91 const DataLayout &DL) { 92 // Calculate arguments size total. 93 unsigned ArgWords = 0; 94 for (Function::const_arg_iterator AI = F->arg_begin(), AE = F->arg_end(); 95 AI != AE; ++AI) { 96 Type *Ty = AI->getType(); 97 // 'Dereference' type in case of byval or inalloca parameter attribute. 98 if (AI->hasByValOrInAllocaAttr()) 99 Ty = cast<PointerType>(Ty)->getElementType(); 100 // Size should be aligned to pointer size. 101 unsigned PtrSize = DL.getPointerSize(); 102 ArgWords += alignTo(DL.getTypeAllocSize(Ty), PtrSize); 103 } 104 105 OS << '@' << ArgWords; 106} 107 108void Mangler::getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV, 109 bool CannotUsePrivateLabel) const { 110 ManglerPrefixTy PrefixTy = Default; 111 if (GV->hasPrivateLinkage()) { 112 if (CannotUsePrivateLabel) 113 PrefixTy = LinkerPrivate; 114 else 115 PrefixTy = Private; 116 } 117 118 const DataLayout &DL = GV->getParent()->getDataLayout(); 119 if (!GV->hasName()) { 120 // Get the ID for the global, assigning a new one if we haven't got one 121 // already. 122 unsigned &ID = AnonGlobalIDs[GV]; 123 if (ID == 0) 124 ID = NextAnonGlobalID++; 125 126 // Must mangle the global into a unique ID. 127 getNameWithPrefixImpl(OS, "__unnamed_" + Twine(ID), DL, PrefixTy); 128 return; 129 } 130 131 StringRef Name = GV->getName(); 132 char Prefix = DL.getGlobalPrefix(); 133 134 // Mangle functions with Microsoft calling conventions specially. Only do 135 // this mangling for x86_64 vectorcall and 32-bit x86. 136 const Function *MSFunc = dyn_cast<Function>(GV); 137 if (Name.startswith("\01")) 138 MSFunc = nullptr; // Don't mangle when \01 is present. 139 CallingConv::ID CC = 140 MSFunc ? MSFunc->getCallingConv() : (unsigned)CallingConv::C; 141 if (!DL.hasMicrosoftFastStdCallMangling() && 142 CC != CallingConv::X86_VectorCall) 143 MSFunc = nullptr; 144 if (MSFunc) { 145 if (CC == CallingConv::X86_FastCall) 146 Prefix = '@'; // fastcall functions have an @ prefix instead of _. 147 else if (CC == CallingConv::X86_VectorCall) 148 Prefix = '\0'; // vectorcall functions have no prefix. 149 } 150 151 getNameWithPrefixImpl(OS, Name, PrefixTy, DL, Prefix); 152 153 if (!MSFunc) 154 return; 155 156 // If we are supposed to add a microsoft-style suffix for stdcall, fastcall, 157 // or vectorcall, add it. These functions have a suffix of @N where N is the 158 // cumulative byte size of all of the parameters to the function in decimal. 159 if (CC == CallingConv::X86_VectorCall) 160 OS << '@'; // vectorcall functions use a double @ suffix. 161 FunctionType *FT = MSFunc->getFunctionType(); 162 if (hasByteCountSuffix(CC) && 163 // "Pure" variadic functions do not receive @0 suffix. 164 (!FT->isVarArg() || FT->getNumParams() == 0 || 165 (FT->getNumParams() == 1 && MSFunc->hasStructRetAttr()))) 166 addByteCountSuffix(OS, MSFunc, DL); 167} 168 169void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName, 170 const GlobalValue *GV, 171 bool CannotUsePrivateLabel) const { 172 raw_svector_ostream OS(OutName); 173 getNameWithPrefix(OS, GV, CannotUsePrivateLabel); 174} 175