1b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke//===-- Mangler.cpp - Self-contained c/asm llvm name mangler --------------===// 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke// 10c94c825a4098f2a86589d31b318bbb8836a5df44Chris Lattner// Unified name mangler for assembly backends. 11b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke// 12b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke//===----------------------------------------------------------------------===// 13b198ca304b1abb2784291315f19c89d04e5968fdBrian Gaeke 1445111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner#include "llvm/Target/Mangler.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallString.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/Twine.h" 170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h" 190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 20c0dba723d119adc8c7b49c6d0e97d10eac4428fcChris Lattner#include "llvm/MC/MCAsmInfo.h" 215ef31a039dbb9c36cfd78442b3554d1b6974ec4cChris Lattner#include "llvm/MC/MCContext.h" 22cc5a882c96af6e36bc029b7ff69f62f94e2d041dBill Wendling#include "llvm/Target/TargetMachine.h" 238a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner#include "llvm/Support/raw_ostream.h" 242cdd21c2e4d855500dfb53f77aa74da53ccf9de6Chris Lattnerusing namespace llvm; 25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 263420e7f360dab7712a9ec4f51d233c7e73642ec7Sean Huntstatic bool isAcceptableChar(char C, bool AllowPeriod, bool AllowUTF8) { 27acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner if ((C < 'a' || C > 'z') && 28acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner (C < 'A' || C > 'Z') && 29acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner (C < '0' || C > '9') && 30b9a01bcf486814a44098745920d43daaf9f7c260Mon P Wang C != '_' && C != '$' && C != '@' && 313420e7f360dab7712a9ec4f51d233c7e73642ec7Sean Hunt !(AllowPeriod && C == '.') && 323420e7f360dab7712a9ec4f51d233c7e73642ec7Sean Hunt !(AllowUTF8 && (C & 0x80))) 33acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner return false; 34acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner return true; 35acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner} 36acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner 37acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattnerstatic char HexDigit(int V) { 38acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner return V < 10 ? V+'0' : V+'A'-10; 39acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner} 40acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner 41acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattnerstatic void MangleLetter(SmallVectorImpl<char> &OutName, unsigned char C) { 42acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner OutName.push_back('_'); 43acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner OutName.push_back(HexDigit(C >> 4)); 44acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner OutName.push_back(HexDigit(C & 15)); 45acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner OutName.push_back('_'); 46acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner} 47acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner 48c5252da873d547a19069eaf9030fec203f128f66Dmitri Gribenko/// NameNeedsEscaping - Return true if the identifier \p Str needs quotes 49acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner/// for this assembler. 5099cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendlingstatic bool NameNeedsEscaping(StringRef Str, const MCAsmInfo *MAI) { 51acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner assert(!Str.empty() && "Cannot create an empty MCSymbol"); 52acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner 53acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner // If the first character is a number and the target does not allow this, we 54acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner // need quotes. 5599cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling if (!MAI->doesAllowNameToStartWithDigit() && Str[0] >= '0' && Str[0] <= '9') 56acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner return true; 57acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner 58acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner // If any of the characters in the string is an unacceptable character, force 59acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner // quotes. 6099cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling bool AllowPeriod = MAI->doesAllowPeriodsInName(); 6199cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling bool AllowUTF8 = MAI->doesAllowUTF8(); 62acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner for (unsigned i = 0, e = Str.size(); i != e; ++i) 633420e7f360dab7712a9ec4f51d233c7e73642ec7Sean Hunt if (!isAcceptableChar(Str[i], AllowPeriod, AllowUTF8)) 64acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner return true; 65acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner return false; 66acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner} 67acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner 68acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner/// appendMangledName - Add the specified string in mangled form if it uses 69acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner/// any unusual characters. 700bd58b0e81961313828aa9ac484ab6b0d6c8d970Chris Lattnerstatic void appendMangledName(SmallVectorImpl<char> &OutName, StringRef Str, 7199cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling const MCAsmInfo *MAI) { 72acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner // The first character is not allowed to be a number unless the target 73acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner // explicitly allows it. 7499cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling if (!MAI->doesAllowNameToStartWithDigit() && Str[0] >= '0' && Str[0] <= '9') { 75acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner MangleLetter(OutName, Str[0]); 76acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner Str = Str.substr(1); 77acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner } 78b9a01bcf486814a44098745920d43daaf9f7c260Mon P Wang 7999cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling bool AllowPeriod = MAI->doesAllowPeriodsInName(); 8099cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling bool AllowUTF8 = MAI->doesAllowUTF8(); 81acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner for (unsigned i = 0, e = Str.size(); i != e; ++i) { 823420e7f360dab7712a9ec4f51d233c7e73642ec7Sean Hunt if (!isAcceptableChar(Str[i], AllowPeriod, AllowUTF8)) 83acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner MangleLetter(OutName, Str[i]); 84acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner else 85acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner OutName.push_back(Str[i]); 86acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner } 87acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner} 88acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner 89acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner 90acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner/// appendMangledQuotedName - On systems that support quoted symbols, we still 91acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner/// have to escape some (obscure) characters like " and \n which would break the 92acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner/// assembler's lexing. 93acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattnerstatic void appendMangledQuotedName(SmallVectorImpl<char> &OutName, 94acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner StringRef Str) { 95acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner for (unsigned i = 0, e = Str.size(); i != e; ++i) { 96acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner if (Str[i] == '"' || Str[i] == '\n') 97acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner MangleLetter(OutName, Str[i]); 98acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner else 99acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner OutName.push_back(Str[i]); 100acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner } 101acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner} 102acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner 103acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner 1040e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattner/// getNameWithPrefix - Fill OutName with the name of the appropriate prefix 1050e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattner/// and the specified name as the global variable name. GVName must not be 1060e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattner/// empty. 1070e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattnervoid Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName, 108fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck const Twine &GVName, ManglerPrefixTy PrefixTy, 109fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck bool UseGlobalPrefix) { 1100e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattner SmallString<256> TmpData; 111b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer StringRef Name = GVName.toStringRef(TmpData); 1120e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattner assert(!Name.empty() && "getNameWithPrefix requires non-empty name"); 1130e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattner 11499cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling const MCAsmInfo *MAI = Context.getAsmInfo(); 1155ef31a039dbb9c36cfd78442b3554d1b6974ec4cChris Lattner 1160e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattner // If the global name is not led with \1, add the appropriate prefixes. 117acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner if (Name[0] == '\1') { 118acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner Name = Name.substr(1); 119acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner } else { 120c0dba723d119adc8c7b49c6d0e97d10eac4428fcChris Lattner if (PrefixTy == Mangler::Private) { 12199cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling const char *Prefix = MAI->getPrivateGlobalPrefix(); 122c0dba723d119adc8c7b49c6d0e97d10eac4428fcChris Lattner OutName.append(Prefix, Prefix+strlen(Prefix)); 123c0dba723d119adc8c7b49c6d0e97d10eac4428fcChris Lattner } else if (PrefixTy == Mangler::LinkerPrivate) { 12499cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling const char *Prefix = MAI->getLinkerPrivateGlobalPrefix(); 125c0dba723d119adc8c7b49c6d0e97d10eac4428fcChris Lattner OutName.append(Prefix, Prefix+strlen(Prefix)); 126c0dba723d119adc8c7b49c6d0e97d10eac4428fcChris Lattner } 127c0dba723d119adc8c7b49c6d0e97d10eac4428fcChris Lattner 128fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck if (UseGlobalPrefix) { 129fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck const char *Prefix = MAI->getGlobalPrefix(); 130fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck if (Prefix[0] == 0) 131fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck ; // Common noop, no prefix. 132fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck else if (Prefix[1] == 0) 133fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck OutName.push_back(Prefix[0]); // Common, one character prefix. 134fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck else 135fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck // Arbitrary length prefix. 136fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck OutName.append(Prefix, Prefix+strlen(Prefix)); 137fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck } 1380e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattner } 1390e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattner 140acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner // If this is a simple string that doesn't need escaping, just append it. 141acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner if (!NameNeedsEscaping(Name, MAI) || 142acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner // If quotes are supported, they can be used unless the string contains 143acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner // a quote or newline. 14499cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling (MAI->doesAllowQuotesInName() && 145acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner Name.find_first_of("\n\"") == StringRef::npos)) { 146acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner OutName.append(Name.begin(), Name.end()); 147acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner return; 148acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner } 149acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner 150acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner // On systems that do not allow quoted names, we need to mangle most 151acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner // strange characters. 15299cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling if (!MAI->doesAllowQuotesInName()) 1535ef31a039dbb9c36cfd78442b3554d1b6974ec4cChris Lattner return appendMangledName(OutName, Name, MAI); 154acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner 155acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner // Okay, the system allows quoted strings. We can quote most anything, the 156acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner // only characters that need escaping are " and \n. 157acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner assert(Name.find_first_of("\n\"") != StringRef::npos); 158acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner return appendMangledQuotedName(OutName, Name); 1590e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattner} 1600e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattner 1618a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner/// AddFastCallStdCallSuffix - Microsoft fastcall and stdcall functions require 1628a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner/// a suffix on their name indicating the number of words of arguments they 1638a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner/// take. 1648a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattnerstatic void AddFastCallStdCallSuffix(SmallVectorImpl<char> &OutName, 1653574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow const Function *F, const DataLayout &TD) { 1668a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner // Calculate arguments size total. 1678a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner unsigned ArgWords = 0; 1688a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner for (Function::const_arg_iterator AI = F->arg_begin(), AE = F->arg_end(); 1698a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner AI != AE; ++AI) { 170db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Type *Ty = AI->getType(); 1718a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner // 'Dereference' type in case of byval parameter attribute 1728a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner if (AI->hasByValAttr()) 1738a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner Ty = cast<PointerType>(Ty)->getElementType(); 1748a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner // Size should be aligned to DWORD boundary 1758a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner ArgWords += ((TD.getTypeAllocSize(Ty) + 3)/4)*4; 1768a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner } 1778a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner 1788a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner raw_svector_ostream(OutName) << '@' << ArgWords; 1798a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner} 1808a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner 1815b7dfeebffe606a9be2e3d1eb82e339cfde14069Chris Lattner 1825b7dfeebffe606a9be2e3d1eb82e339cfde14069Chris Lattner/// getNameWithPrefix - Fill OutName with the name of the appropriate prefix 1835b7dfeebffe606a9be2e3d1eb82e339cfde14069Chris Lattner/// and the specified global variable's name. If the global variable doesn't 1845b7dfeebffe606a9be2e3d1eb82e339cfde14069Chris Lattner/// have a name, this fills in a unique name for the global. 1855b7dfeebffe606a9be2e3d1eb82e339cfde14069Chris Lattnervoid Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName, 186fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck const GlobalValue *GV, bool isImplicitlyPrivate, 187fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck bool UseGlobalPrefix) { 188ff240053bfeb1901a70b2f4842e7f46f9278c354Chris Lattner ManglerPrefixTy PrefixTy = Mangler::Default; 189ff240053bfeb1901a70b2f4842e7f46f9278c354Chris Lattner if (GV->hasPrivateLinkage() || isImplicitlyPrivate) 190ff240053bfeb1901a70b2f4842e7f46f9278c354Chris Lattner PrefixTy = Mangler::Private; 19132811bef956e0fae4329e6515420d85f7e510660Bill Wendling else if (GV->hasLinkerPrivateLinkage() || GV->hasLinkerPrivateWeakLinkage()) 192ff240053bfeb1901a70b2f4842e7f46f9278c354Chris Lattner PrefixTy = Mangler::LinkerPrivate; 193ff240053bfeb1901a70b2f4842e7f46f9278c354Chris Lattner 1940e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattner // If this global has a name, handle it simply. 1958a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner if (GV->hasName()) { 1968caffc1e75b34d97bbb225322243e5bad0f379bfAnton Korobeynikov StringRef Name = GV->getName(); 197fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck getNameWithPrefix(OutName, Name, PrefixTy, UseGlobalPrefix); 1988caffc1e75b34d97bbb225322243e5bad0f379bfAnton Korobeynikov // No need to do anything else if the global has the special "do not mangle" 1998caffc1e75b34d97bbb225322243e5bad0f379bfAnton Korobeynikov // flag in the name. 2008caffc1e75b34d97bbb225322243e5bad0f379bfAnton Korobeynikov if (Name[0] == 1) 2018caffc1e75b34d97bbb225322243e5bad0f379bfAnton Korobeynikov return; 2028a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner } else { 2038a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner // Get the ID for the global, assigning a new one if we haven't got one 2048a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner // already. 2058a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner unsigned &ID = AnonGlobalIDs[GV]; 2068a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner if (ID == 0) ID = NextAnonGlobalID++; 2070e7ab8cb07716305894fabcc512b8d5d0318bd4dChris Lattner 2088a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner // Must mangle the global into a unique ID. 209fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck getNameWithPrefix(OutName, "__unnamed_" + Twine(ID), PrefixTy, 210fdbea5107b5a8249421fd5e603a31f40f05ea25fNico Rieck UseGlobalPrefix); 2118a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner } 2125b7dfeebffe606a9be2e3d1eb82e339cfde14069Chris Lattner 2138a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner // If we are supposed to add a microsoft-style suffix for stdcall/fastcall, 2148a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner // add it. 21599cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling if (Context.getAsmInfo()->hasMicrosoftFastStdCallMangling()) { 2168a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner if (const Function *F = dyn_cast<Function>(GV)) { 2178a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner CallingConv::ID CC = F->getCallingConv(); 2188a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner 2198a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner // fastcall functions need to start with @. 2208a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner // FIXME: This logic seems unlikely to be right. 2218a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner if (CC == CallingConv::X86_FastCall) { 2228a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner if (OutName[0] == '_') 2238a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner OutName[0] = '@'; 2248a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner else 2258a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner OutName.insert(OutName.begin(), '@'); 2268a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner } 2278a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner 2288a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner // fastcall and stdcall functions usually need @42 at the end to specify 2298a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner // the argument info. 230db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner FunctionType *FT = F->getFunctionType(); 2318a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner if ((CC == CallingConv::X86_FastCall || CC == CallingConv::X86_StdCall) && 2328a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner // "Pure" variadic functions do not receive @0 suffix. 2338a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner (!FT->isVarArg() || FT->getNumParams() == 0 || 2348a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner (FT->getNumParams() == 1 && F->hasStructRetAttr()))) 235cc5a882c96af6e36bc029b7ff69f62f94e2d041dBill Wendling AddFastCallStdCallSuffix(OutName, F, *TM->getDataLayout()); 2368a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner } 2378a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner } 2385b7dfeebffe606a9be2e3d1eb82e339cfde14069Chris Lattner} 2395b7dfeebffe606a9be2e3d1eb82e339cfde14069Chris Lattner 24073ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner/// getSymbol - Return the MCSymbol for the specified global value. This 24173ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner/// symbol is the main label that is the address of the global. 24273ff564d65e9c748562c5734d1f72a2a233f0275Chris LattnerMCSymbol *Mangler::getSymbol(const GlobalValue *GV) { 24373ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner SmallString<60> NameStr; 24473ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner getNameWithPrefix(NameStr, GV, false); 2459b97a73dedf736e14b04a3d1a153f10d25b2507bChris Lattner return Context.GetOrCreateSymbol(NameStr.str()); 24673ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner} 24773ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner 24873ff564d65e9c748562c5734d1f72a2a233f0275Chris Lattner 249