From 8f18edd8b6fe00209314f4c56f33d7c3c18bbbff Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Tue, 5 May 2009 22:50:29 +0000 Subject: [PATCH] Quotes should be printed before private prefix; some code clean up. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71032 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/Mangler.h | 6 +- lib/VMCore/Mangler.cpp | 126 +++++++++++++++++++-------------- test/CodeGen/X86/private-2.ll | 13 ++++ 3 files changed, 90 insertions(+), 55 deletions(-) create mode 100644 test/CodeGen/X86/private-2.ll diff --git a/include/llvm/Support/Mangler.h b/include/llvm/Support/Mangler.h index 2a0fd8b69d7..8f672bdd6f6 100644 --- a/include/llvm/Support/Mangler.h +++ b/include/llvm/Support/Mangler.h @@ -29,7 +29,10 @@ class Mangler { /// symbol is marked as not needing this prefix. const char *Prefix; + /// PrivatePrefix - This string is emitted before each symbol with private + /// linkage. const char *PrivatePrefix; + /// UseQuotes - If this is set, the target accepts global names in quotes, /// e.g. "foo bar" is a legal name. This syntax is used instead of escaping /// the space character. By default, this is false. @@ -95,7 +98,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 = ""); + std::string makeNameProper(const std::string &x, const char *Prefix = 0, + const char *PrivatePrefix = 0); private: /// getTypeID - Return a unique ID for the specified LLVM type. diff --git a/lib/VMCore/Mangler.cpp b/lib/VMCore/Mangler.cpp index 36cfbf766a7..0bd190ad4ed 100644 --- a/lib/VMCore/Mangler.cpp +++ b/lib/VMCore/Mangler.cpp @@ -31,8 +31,8 @@ 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) { - std::string Result; +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. // If PreserveAsmNames is set, names with asm identifiers are not modified. @@ -40,12 +40,15 @@ std::string Mangler::makeNameProper(const std::string &X, const char *Prefix) { return X; if (!UseQuotes) { + std::string Result; + // If X does not start with (char)1, add the prefix. + bool NeedPrefix = true; std::string::const_iterator I = X.begin(); - if (*I != 1) - Result = Prefix; - else + if (*I == 1) { + NeedPrefix = false; ++I; // Skip over the marker. + } // Mangle the first letter specially, don't allow numbers. if (*I >= '0' && *I <= '9') @@ -57,53 +60,71 @@ std::string Mangler::makeNameProper(const std::string &X, const char *Prefix) { else Result += *I; } - } else { - bool NeedsQuotes = false; - - std::string::const_iterator I = X.begin(); - if (*I == 1) - ++I; // Skip over the marker. - // If the first character is a number, we need quotes. - if (*I >= '0' && *I <= '9') - NeedsQuotes = true; - - // Do an initial scan of the string, checking to see if we need quotes or - // to escape a '"' or not. - if (!NeedsQuotes) - for (std::string::const_iterator E = X.end(); I != E; ++I) - if (!isCharAcceptable(*I)) { - NeedsQuotes = true; - break; - } - - // In the common case, we don't need quotes. Handle this quickly. - if (!NeedsQuotes) { - if (*X.begin() != 1) - return Prefix+X; - else - return X.substr(1); + if (NeedPrefix) { + if (Prefix) + Result = Prefix + Result; + if (PrivatePrefix) + Result = PrivatePrefix + Result; } - - // Otherwise, construct the string the expensive way. - I = X.begin(); - - // If X does not start with (char)1, add the prefix. - if (*I != 1) - Result = Prefix; - else - ++I; // Skip the marker if present. - - for (std::string::const_iterator E = X.end(); I != E; ++I) { - if (*I == '"') - Result += "_QQ_"; - else if (*I == '\n') - Result += "_NL_"; - else - Result += *I; - } - Result = '"' + Result + '"'; + return Result; } + + bool NeedPrefix = true; + bool NeedQuotes = false; + std::string Result; + std::string::const_iterator I = X.begin(); + if (*I == 1) { + NeedPrefix = false; + ++I; // Skip over the marker. + } + + // If the first character is a number, we need quotes. + if (*I >= '0' && *I <= '9') + NeedQuotes = true; + + // Do an initial scan of the string, checking to see if we need quotes or + // to escape a '"' or not. + if (!NeedQuotes) + for (std::string::const_iterator E = X.end(); I != E; ++I) + if (!isCharAcceptable(*I)) { + NeedQuotes = true; + break; + } + + // 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); + } + + // Otherwise, construct the string the expensive way. + for (std::string::const_iterator E = X.end(); I != E; ++I) { + if (*I == '"') + Result += "_QQ_"; + else if (*I == '\n') + Result += "_NL_"; + else + Result += *I; + } + + if (NeedPrefix) { + if (Prefix) + Result = Prefix + X; + else + Result = X; + if (PrivatePrefix) + Result = PrivatePrefix + Result; + } + Result = '"' + Result + '"'; return Result; } @@ -146,13 +167,10 @@ std::string Mangler::getValueName(const GlobalValue *GV, const char * Suffix) { static unsigned GlobalID = 0; Name = "__unnamed_" + utostr(TypeUniqueID) + "_" + utostr(GlobalID++); } else { - Name = makeNameProper(GV->getName() + Suffix, Prefix); - std::string prefix; if (GV->hasPrivateLinkage()) - prefix = PrivatePrefix; + Name = makeNameProper(GV->getName() + Suffix, Prefix, PrivatePrefix); else - prefix = ""; - Name = prefix + Name; + Name = makeNameProper(GV->getName() + Suffix, Prefix); } return Name; diff --git a/test/CodeGen/X86/private-2.ll b/test/CodeGen/X86/private-2.ll new file mode 100644 index 00000000000..74781285677 --- /dev/null +++ b/test/CodeGen/X86/private-2.ll @@ -0,0 +1,13 @@ +; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin10 | grep L__ZZ20 +; Quote should be outside of private prefix. +; rdar://6855766x + + %struct.A = type { i32*, i32 } +@"_ZZ20-[Example1 whatever]E4C.91" = private constant %struct.A { i32* null, i32 1 } ; <%struct.A*> [#uses=1] + +define internal i32* @"\01-[Example1 whatever]"() nounwind optsize ssp { +entry: + %0 = getelementptr %struct.A* @"_ZZ20-[Example1 whatever]E4C.91", i64 0, i32 0 ; [#uses=1] + %1 = load i32** %0, align 8 ; [#uses=1] + ret i32* %1 +}