diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-02-18 23:53:56 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-02-18 23:53:56 +0000 |
commit | 5f361c9f1e1bb10592cefe02595710d6527362af (patch) | |
tree | 382c1d4cddc34043f4f2032c0a5534a1123ec11c /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 84e7c1e2ffbd19c4bb934da483046e8d73e4d931 (diff) | |
download | bcm5719-llvm-5f361c9f1e1bb10592cefe02595710d6527362af.tar.gz bcm5719-llvm-5f361c9f1e1bb10592cefe02595710d6527362af.zip |
Address Chris's comments regarding C++ name mangling.
llvm-svn: 64984
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index e7c784580bd..ca6ba14f855 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -170,13 +170,15 @@ static void setGlobalVisibility(llvm::GlobalValue *GV, /// 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 @@ void CodeGenModule::EmitAliases() { 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 @@ void CodeGenModule::EmitGlobalDefinition(const ValueDecl *D) { 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 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { 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 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { // 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 @@ CodeGenModule::EmitForwardFunctionDefinition(const FunctionDecl *D) { 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; |