Address Chris's comments regarding C++ name mangling.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64984 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index e7c7845..ca6ba14 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -170,13 +170,15 @@
 /// FIXME: Performance here is going to be terribly until we start
 /// caching mangled names. However, we should fix the problem above
 /// first.
-IdentifierInfo *CodeGenModule::getMangledName(const NamedDecl *ND) const {
-  std::string Name;
-  llvm::raw_string_ostream Out(Name);
+const char *CodeGenModule::getMangledName(const NamedDecl *ND) {
+  llvm::SmallString<256> Name;
+  llvm::raw_svector_ostream Out(Name);
   if (!mangleName(ND, Context, Out))
-    return ND->getIdentifier();
+    return ND->getIdentifier()->getName();
 
-  return &Context.Idents.get(Out.str());
+  Name += '\0';
+  return MangledNames.GetOrCreateValue(Name.begin(), Name.end())
+           .getKeyData();
 }
 
 /// AddGlobalCtor - Add a function to the list that will be called before
@@ -379,7 +381,7 @@
     llvm::GlobalValue *GA = 
       new llvm::GlobalAlias(aliasee->getType(),
                             llvm::Function::ExternalLinkage,
-                            getMangledName(D)->getName(), aliasee, 
+                            getMangledName(D), aliasee, 
                             &getModule());
     
     llvm::GlobalValue *&Entry = GlobalDeclMap[getMangledName(D)];
@@ -582,7 +584,7 @@
     llvm::GlobalVariable *GV = 
       new llvm::GlobalVariable(Ty, false, 
                                llvm::GlobalValue::ExternalLinkage,
-                               0, getMangledName(D)->getName(), &getModule(), 
+                               0, getMangledName(D), &getModule(), 
                                0, ASTTy.getAddressSpace());
     Entry = GV;
 
@@ -630,7 +632,7 @@
   if (!GV) {
     GV = new llvm::GlobalVariable(InitType, false, 
                                   llvm::GlobalValue::ExternalLinkage,
-                                  0, getMangledName(D)->getName(), 
+                                  0, getMangledName(D), 
                                   &getModule(), 0, ASTTy.getAddressSpace());
   } else if (GV->getType() != 
              llvm::PointerType::get(InitType, ASTTy.getAddressSpace())) {
@@ -654,7 +656,7 @@
     // Make a new global with the correct type
     GV = new llvm::GlobalVariable(InitType, false, 
                                   llvm::GlobalValue::ExternalLinkage,
-                                  0, getMangledName(D)->getName(), 
+                                  0, getMangledName(D), 
                                   &getModule(), 0, ASTTy.getAddressSpace());
     // Steal the name of the old global
     GV->takeName(OldGV);
@@ -753,7 +755,7 @@
   const llvm::Type *Ty = getTypes().ConvertType(D->getType());
   llvm::Function *F = llvm::Function::Create(cast<llvm::FunctionType>(Ty), 
                                              llvm::Function::ExternalLinkage,
-                                             getMangledName(D)->getName(),
+                                             getMangledName(D),
                                              &getModule());
   SetFunctionAttributes(D, F);
   return F;