blob: eb010c3a683385c5a955ec47dd83e100a0cee694 [file] [log] [blame]
Brian Gaekeb198ca32003-07-24 20:20:58 +00001//===-- Mangler.cpp - Self-contained c/asm llvm name mangler --------------===//
Misha Brukmanfd939082005-04-21 23:48:37 +00002//
John Criswellb576c942003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukmanfd939082005-04-21 23:48:37 +00007//
John Criswellb576c942003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Brian Gaekeb198ca32003-07-24 20:20:58 +00009//
Chris Lattnerc94c8252010-01-16 21:08:46 +000010// Unified name mangler for assembly backends.
Brian Gaekeb198ca32003-07-24 20:20:58 +000011//
12//===----------------------------------------------------------------------===//
13
Chris Lattner45111d12010-01-16 21:57:06 +000014#include "llvm/Target/Mangler.h"
Chris Lattnerc94c8252010-01-16 21:08:46 +000015#include "llvm/GlobalValue.h"
Chris Lattner36e69ae2010-01-13 05:02:57 +000016#include "llvm/ADT/SmallString.h"
Chris Lattnerc94c8252010-01-16 21:08:46 +000017#include "llvm/ADT/Twine.h"
Chris Lattner5b7dfee2009-09-11 05:40:42 +000018#include "llvm/Support/raw_ostream.h"
Chris Lattner2cdd21c2003-12-14 21:35:53 +000019using namespace llvm;
Brian Gaeked0fde302003-11-11 22:41:34 +000020
Chris Lattner0e7ab8c2010-01-13 07:01:09 +000021/// getNameWithPrefix - Fill OutName with the name of the appropriate prefix
22/// and the specified name as the global variable name. GVName must not be
23/// empty.
24void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
25 const Twine &GVName, ManglerPrefixTy PrefixTy) {
26 SmallString<256> TmpData;
Benjamin Kramerb357e062010-01-13 12:45:23 +000027 StringRef Name = GVName.toStringRef(TmpData);
Chris Lattner0e7ab8c2010-01-13 07:01:09 +000028 assert(!Name.empty() && "getNameWithPrefix requires non-empty name");
29
30 // If the global name is not led with \1, add the appropriate prefixes.
31 if (Name[0] != '\1') {
32 if (PrefixTy == Mangler::Private)
33 OutName.append(PrivatePrefix, PrivatePrefix+strlen(PrivatePrefix));
34 else if (PrefixTy == Mangler::LinkerPrivate)
35 OutName.append(LinkerPrivatePrefix,
36 LinkerPrivatePrefix+strlen(LinkerPrivatePrefix));
37
38 if (Prefix[0] == 0)
39 ; // Common noop, no prefix.
40 else if (Prefix[1] == 0)
41 OutName.push_back(Prefix[0]); // Common, one character prefix.
42 else
43 OutName.append(Prefix, Prefix+strlen(Prefix)); // Arbitrary prefix.
44 } else {
45 Name = Name.substr(1);
46 }
47
48 OutName.append(Name.begin(), Name.end());
49}
50
Chris Lattner5b7dfee2009-09-11 05:40:42 +000051
52/// getNameWithPrefix - Fill OutName with the name of the appropriate prefix
53/// and the specified global variable's name. If the global variable doesn't
54/// have a name, this fills in a unique name for the global.
55void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
56 const GlobalValue *GV,
57 bool isImplicitlyPrivate) {
Chris Lattner0e7ab8c2010-01-13 07:01:09 +000058 // If this global has a name, handle it simply.
Chris Lattner5b7dfee2009-09-11 05:40:42 +000059 if (GV->hasName()) {
Chris Lattner0e7ab8c2010-01-13 07:01:09 +000060 ManglerPrefixTy PrefixTy = Mangler::Default;
61 if (GV->hasPrivateLinkage() || isImplicitlyPrivate)
62 PrefixTy = Mangler::Private;
63 else if (GV->hasLinkerPrivateLinkage())
64 PrefixTy = Mangler::LinkerPrivate;
Chris Lattner5b7dfee2009-09-11 05:40:42 +000065
Chris Lattner0e7ab8c2010-01-13 07:01:09 +000066 return getNameWithPrefix(OutName, GV->getName(), PrefixTy);
Chris Lattner5b7dfee2009-09-11 05:40:42 +000067 }
68
69 // If the global variable doesn't have a name, return a unique name for the
70 // global based on a numbering.
71
Chris Lattner0e7ab8c2010-01-13 07:01:09 +000072 // Anonymous names always get prefixes.
73 if (GV->hasPrivateLinkage() || isImplicitlyPrivate)
74 OutName.append(PrivatePrefix, PrivatePrefix+strlen(PrivatePrefix));
75 else if (GV->hasLinkerPrivateLinkage())
76 OutName.append(LinkerPrivatePrefix,
77 LinkerPrivatePrefix+strlen(LinkerPrivatePrefix));;
78 OutName.append(Prefix, Prefix+strlen(Prefix));
79
Chris Lattner5b7dfee2009-09-11 05:40:42 +000080 // Get the ID for the global, assigning a new one if we haven't got one
81 // already.
82 unsigned &ID = AnonGlobalIDs[GV];
83 if (ID == 0) ID = NextAnonGlobalID++;
84
85 // Must mangle the global into a unique ID.
86 raw_svector_ostream(OutName) << "__unnamed_" << ID;
87}
88
Chris Lattner61f160a2010-01-16 18:06:34 +000089/// getNameWithPrefix - Fill OutName with the name of the appropriate prefix
90/// and the specified global variable's name. If the global variable doesn't
91/// have a name, this fills in a unique name for the global.
92std::string Mangler::getNameWithPrefix(const GlobalValue *GV,
93 bool isImplicitlyPrivate) {
94 SmallString<64> Buf;
95 getNameWithPrefix(Buf, GV, isImplicitlyPrivate);
96 return std::string(Buf.begin(), Buf.end());
97}
98
Chris Lattner5b7dfee2009-09-11 05:40:42 +000099
Bill Wendling3d10a5a2009-07-20 01:03:30 +0000100Mangler::Mangler(Module &M, const char *prefix, const char *privatePrefix,
101 const char *linkerPrivatePrefix)
102 : Prefix(prefix), PrivatePrefix(privatePrefix),
Chris Lattnerc94c8252010-01-16 21:08:46 +0000103 LinkerPrivatePrefix(linkerPrivatePrefix), NextAnonGlobalID(1) {
Brian Gaekeb198ca32003-07-24 20:20:58 +0000104}