diff --git a/include/llvm/Support/Mangler.h b/include/llvm/Support/Mangler.h index 27d137ace5a..0dc26edc2df 100644 --- a/include/llvm/Support/Mangler.h +++ b/include/llvm/Support/Mangler.h @@ -94,8 +94,8 @@ public: /// does this for you, so there's no point calling it on the result /// from getValueName. /// - std::string makeNameProper(const std::string &x, const char *Prefix = 0, - const char *PrivatePrefix = 0); + std::string makeNameProper(const std::string &x, + bool hasPrivateLinkage = false); }; } // End llvm namespace diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index c1cb97ccf72..867b00370c1 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -271,8 +271,8 @@ AsmPrinter::getCurrentFunctionEHName(const MachineFunction *MF, Name = MF->getFunction()->getName(); if (Name.empty()) Name = Mang->getValueName(MF->getFunction()); - Name = Mang->makeNameProper(TAI->getEHGlobalPrefix() + - Name + ".eh", TAI->getGlobalPrefix()); + + Name = Mang->makeNameProper(TAI->getEHGlobalPrefix() + Name + ".eh"); return Name; } diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 6097447a611..0e3b306aab0 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -86,8 +86,8 @@ public: /// specified debug variable. DIE *&getDieMapSlotFor(GlobalVariable *GV) { return GVToDieMap[GV]; } - /// getDIEEntrySlotFor - Returns the debug information entry proxy slot for the - /// specified debug variable. + /// getDIEEntrySlotFor - Returns the debug information entry proxy slot for + /// the specified debug variable. DIEEntry *&getDIEEntrySlotFor(GlobalVariable *GV) { return GVToDIEEntryMap[GV]; } diff --git a/lib/VMCore/Mangler.cpp b/lib/VMCore/Mangler.cpp index a01f0f1540e..cec41dfd400 100644 --- a/lib/VMCore/Mangler.cpp +++ b/lib/VMCore/Mangler.cpp @@ -31,13 +31,16 @@ static std::string MangleLetter(unsigned char C) { /// makeNameProper - We don't want identifier names non-C-identifier characters /// in them, so mangle them as appropriate. /// -std::string Mangler::makeNameProper(const std::string &X, const char *Prefix, - const char *PrivatePrefix) { - if (X.empty()) return X; // Empty names are uniqued by the caller. +std::string Mangler::makeNameProper(const std::string &X, + bool hasPrivateLinkage) { + assert(!X.empty() && "Cannot mangle empty strings"); // If PreserveAsmNames is set, names with asm identifiers are not modified. if (PreserveAsmNames && X[0] == 1) return X; + + // Figure out the prefix to use. + const char *ThePrefix = hasPrivateLinkage ? PrivatePrefix : Prefix; if (!UseQuotes) { std::string Result; @@ -61,12 +64,8 @@ std::string Mangler::makeNameProper(const std::string &X, const char *Prefix, Result += *I; } - if (NeedPrefix) { - if (Prefix) - Result = Prefix + Result; - if (PrivatePrefix) - Result = PrivatePrefix + Result; - } + if (NeedPrefix) + Result = ThePrefix + Result; return Result; } @@ -94,17 +93,12 @@ std::string Mangler::makeNameProper(const std::string &X, const char *Prefix, // In the common case, we don't need quotes. Handle this quickly. if (!NeedQuotes) { - if (NeedPrefix) { - if (Prefix) - Result = Prefix + X; - else - Result = X; - if (PrivatePrefix) - Result = PrivatePrefix + Result; - return Result; - } else - return X.substr(1); + if (!NeedPrefix) + return X.substr(1); // Strip off the \001. + return ThePrefix + X; } + + Result = X.substr(0, I-X.begin()); // Otherwise, construct the string the expensive way. for (std::string::const_iterator E = X.end(); I != E; ++I) { @@ -116,14 +110,8 @@ std::string Mangler::makeNameProper(const std::string &X, const char *Prefix, Result += *I; } - if (NeedPrefix) { - if (Prefix) - Result = Prefix + X; - else - Result = X; - if (PrivatePrefix) - Result = PrivatePrefix + Result; - } + if (NeedPrefix) + Result = ThePrefix + Result; Result = '"' + Result + '"'; return Result; } @@ -132,11 +120,8 @@ std::string Mangler::getValueName(const GlobalValue *GV, const char *Suffix) { assert((!isa(GV) || !cast(GV)->isIntrinsic()) && "Intrinsic functions cannot be mangled by Mangler"); - if (GV->hasName()) { - if (GV->hasPrivateLinkage()) - return makeNameProper(GV->getName() + Suffix, Prefix, PrivatePrefix); - return makeNameProper(GV->getName() + Suffix, Prefix); - } + if (GV->hasName()) + return makeNameProper(GV->getName() + Suffix, GV->hasPrivateLinkage()); // Get the ID for the global, assigning a new one if we haven't got one // already. diff --git a/test/CodeGen/PowerPC/private.ll b/test/CodeGen/PowerPC/private.ll index 0f0d13492a0..a36adf58a8c 100644 --- a/test/CodeGen/PowerPC/private.ll +++ b/test/CodeGen/PowerPC/private.ll @@ -6,20 +6,20 @@ ; RUN: grep .Lbaz: %t ; RUN: grep lis.*\.Lbaz %t ; RUN: llvm-as < %s | llc -mtriple=powerpc-apple-darwin > %t -; RUN: grep L_foo: %t -; RUN: grep bl.*\L_foo %t -; RUN: grep L_baz: %t -; RUN: grep lis.*\L_baz %t +; RUN: grep Lfoo: %t +; RUN: grep bl.*\Lfoo %t +; RUN: grep Lbaz: %t +; RUN: grep lis.*\Lbaz %t -declare void @foo() +declare void @foo() nounwind -define private void @foo() { +define private void @foo() nounwind { ret void } @baz = private global i32 4; -define i32 @bar() { +define i32 @bar() nounwind { call void @foo() %1 = load i32* @baz, align 4 ret i32 %1 diff --git a/test/CodeGen/X86/private-2.ll b/test/CodeGen/X86/private-2.ll index 74781285677..689fe34bab1 100644 --- a/test/CodeGen/X86/private-2.ll +++ b/test/CodeGen/X86/private-2.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin10 | grep L__ZZ20 +; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin10 | grep L_ZZ20 ; Quote should be outside of private prefix. ; rdar://6855766x