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