summaryrefslogtreecommitdiffstats
path: root/llvm/lib/VMCore
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-09-11 05:40:42 +0000
committerChris Lattner <sabre@nondot.org>2009-09-11 05:40:42 +0000
commit840c8d72d045cfaeb0c0b940f1a7a1b3f5038440 (patch)
tree5840fafbebb9879de0451f492260bf8cfe28e84b /llvm/lib/VMCore
parent7f41d98928c8c741533feb363160c7ef4838d9c5 (diff)
downloadbcm5719-llvm-840c8d72d045cfaeb0c0b940f1a7a1b3f5038440.tar.gz
bcm5719-llvm-840c8d72d045cfaeb0c0b940f1a7a1b3f5038440.zip
add a new Mangler::getNameWithPrefix API which returns the
(uniqued if unnamed) global variable name with the prefix that it is supposed to get. It doesn't do "mangling" in the sense of adding quotes and hacking on bad characters. llvm-svn: 81505
Diffstat (limited to 'llvm/lib/VMCore')
-rw-r--r--llvm/lib/VMCore/Mangler.cpp50
1 files changed, 48 insertions, 2 deletions
diff --git a/llvm/lib/VMCore/Mangler.cpp b/llvm/lib/VMCore/Mangler.cpp
index 8c918434e3f..21ba086d19f 100644
--- a/llvm/lib/VMCore/Mangler.cpp
+++ b/llvm/lib/VMCore/Mangler.cpp
@@ -12,11 +12,12 @@
//===----------------------------------------------------------------------===//
#include "llvm/Support/Mangler.h"
-#include "llvm/DerivedTypes.h"
-#include "llvm/Module.h"
+#include "llvm/Function.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringMap.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/Support/raw_ostream.h"
using namespace llvm;
static char HexDigit(int V) {
@@ -158,6 +159,51 @@ std::string Mangler::getMangledName(const GlobalValue *GV, const char *Suffix,
return makeNameProper("__unnamed_" + utostr(ID) + Suffix, PrefixTy);
}
+
+/// getNameWithPrefix - Fill OutName with the name of the appropriate prefix
+/// and the specified global variable's name. If the global variable doesn't
+/// have a name, this fills in a unique name for the global.
+void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
+ const GlobalValue *GV,
+ bool isImplicitlyPrivate) {
+
+ // If the global is anonymous or not led with \1, then add the appropriate
+ // prefix.
+ if (!GV->hasName() || GV->getName()[0] != '\1') {
+ OutName.append(Prefix, Prefix+strlen(Prefix));
+
+ if (GV->hasPrivateLinkage() || isImplicitlyPrivate)
+ OutName.append(PrivatePrefix, PrivatePrefix+strlen(PrivatePrefix));
+ else if (GV->hasLinkerPrivateLinkage())
+ OutName.append(LinkerPrivatePrefix,
+ LinkerPrivatePrefix+strlen(LinkerPrivatePrefix));;
+ }
+
+ // If the global has a name, just append it now.
+ if (GV->hasName()) {
+ StringRef Name = GV->getName();
+
+ // Strip off the prefix marker if present.
+ if (Name[0] != '\1')
+ OutName.append(Name.begin(), Name.end());
+ else
+ OutName.append(Name.begin()+1, Name.end());
+ return;
+ }
+
+ // If the global variable doesn't have a name, return a unique name for the
+ // global based on a numbering.
+
+ // Get the ID for the global, assigning a new one if we haven't got one
+ // already.
+ unsigned &ID = AnonGlobalIDs[GV];
+ if (ID == 0) ID = NextAnonGlobalID++;
+
+ // Must mangle the global into a unique ID.
+ raw_svector_ostream(OutName) << "__unnamed_" << ID;
+}
+
+
Mangler::Mangler(Module &M, const char *prefix, const char *privatePrefix,
const char *linkerPrivatePrefix)
: Prefix(prefix), PrivatePrefix(privatePrefix),
OpenPOWER on IntegriCloud