rename Memo/Count to AnonGlobalIDs/NextAnonGlobalID to be more
authorChris Lattner <sabre@nondot.org>
Tue, 14 Jul 2009 00:01:06 +0000 (00:01 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 14 Jul 2009 00:01:06 +0000 (00:01 +0000)
descriptive.  Thange them to keep track of the ID of a global that is
assigned, not the first mangled name returned for it.  Without doing this,
we are required to always use the same suffix for a global that gets
mangled.  This means that we can mangle the same global once with $stub
and another time with $non_lazy_ptr or whatever.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75561 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/Mangler.h
lib/VMCore/Mangler.cpp

index 33ed102002362a8ae596c85e92412f6b7007c49e..27d137ace5a2273149bc11e2fd810a7cb1ac2492 100644 (file)
@@ -42,13 +42,15 @@ class Mangler {
   /// from names with 'asm' specifiers.
   bool PreserveAsmNames;
 
-  /// Memo - This is used to remember the name that we assign a value.
+  /// AnonGlobalIDs - We need to give global values the same name every time
+  /// they are mangled.  This keeps track of the number we give to anonymous
+  /// ones.
   ///
-  DenseMap<const Value*, std::string> Memo;
+  DenseMap<const GlobalValue*, unsigned> AnonGlobalIDs;
 
-  /// Count - This simple counter is used to unique value names.
+  /// NextAnonGlobalID - This simple counter is used to unique value names.
   ///
-  unsigned Count;
+  unsigned NextAnonGlobalID;
 
   /// AcceptableChars - This bitfield contains a one for each character that is
   /// allowed to be part of an unmangled name.
index 625c9c3a1af54345660600e0a5dff34c90ebe5fc..6e838e395cb5d4ffae8b89cbfe2ff031669fe46e 100644 (file)
@@ -129,32 +129,29 @@ std::string Mangler::makeNameProper(const std::string &X, const char *Prefix,
 }
 
 std::string Mangler::getValueName(const GlobalValue *GV, const char *Suffix) {
-  // Check to see whether we've already named V.
-  std::string &Name = Memo[GV];
-  if (!Name.empty())
-    return Name;       // Return the already-computed name for V.
-
-  // Name mangling occurs as follows:
-  // - If V is an intrinsic function, do not change name at all
-  // - Otherwise, mangling occurs if global collides with existing name.
-  if (isa<Function>(GV) && cast<Function>(GV)->isIntrinsic()) {
-    Name = GV->getNameStart(); // Is an intrinsic function
-  } else if (!GV->hasName()) {
-    // Must mangle the global into a unique ID.
-    Name = "__unnamed_" + utostr(Count++) + Suffix;
-  } else {
+  // Never mangle intrinsic functions.
+  // FIXME: These should never come into the mangler.
+  if (isa<Function>(GV) && cast<Function>(GV)->isIntrinsic())
+    return GV->getNameStart();
+  
+  if (GV->hasName()) {
     if (GV->hasPrivateLinkage())
-      Name = makeNameProper(GV->getName() + Suffix, Prefix, PrivatePrefix);
-    else
-      Name = makeNameProper(GV->getName() + Suffix, Prefix);
+      return makeNameProper(GV->getName() + Suffix, Prefix, PrivatePrefix);
+    return makeNameProper(GV->getName() + Suffix, Prefix);
   }
-
-  return Name;
+  
+  // 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.
+  return "__unnamed_" + utostr(ID) + Suffix;
 }
 
 Mangler::Mangler(Module &M, const char *prefix, const char *privatePrefix)
   : Prefix(prefix), PrivatePrefix (privatePrefix), UseQuotes(false),
-    PreserveAsmNames(false), Count(0) {
+    PreserveAsmNames(false), NextAnonGlobalID(1) {
   std::fill(AcceptableChars, array_endof(AcceptableChars), 0);
 
   // Letters and numbers are acceptable.