X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=lib%2FVMCore%2FMangler.cpp;h=44cf77826629546e4c35d25d9c92824ed575ad56;hb=61466c50df9d00c4a07b1fd72536399cfb418ebd;hp=10a29db285c0b31f2147f5ad929645afb62dfb0a;hpb=03e9dd9ffae4370bf53bcdf04504e5ad908a1ec6;p=oota-llvm.git diff --git a/lib/VMCore/Mangler.cpp b/lib/VMCore/Mangler.cpp index 10a29db285c..44cf7782662 100644 --- a/lib/VMCore/Mangler.cpp +++ b/lib/VMCore/Mangler.cpp @@ -32,16 +32,9 @@ static std::string MangleLetter(unsigned char C) { /// in them, so mangle them as appropriate. /// std::string Mangler::makeNameProper(const std::string &X, - bool hasPrivateLinkage) { + ManglerPrefixTy PrefixTy) { 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; @@ -64,8 +57,15 @@ std::string Mangler::makeNameProper(const std::string &X, Result += *I; } - if (NeedPrefix) - Result = ThePrefix + Result; + if (NeedPrefix) { + Result = Prefix + Result; + + if (PrefixTy == Mangler::Private) + Result = PrivatePrefix + Result; + else if (PrefixTy == Mangler::LinkerPrivate) + Result = LinkerPrivatePrefix + Result; + } + return Result; } @@ -95,7 +95,15 @@ std::string Mangler::makeNameProper(const std::string &X, if (!NeedQuotes) { if (!NeedPrefix) return X.substr(1); // Strip off the \001. - return ThePrefix + X; + + Result = Prefix + X; + + if (PrefixTy == Mangler::Private) + Result = PrivatePrefix + Result; + else if (PrefixTy == Mangler::LinkerPrivate) + Result = LinkerPrivatePrefix + Result; + + return Result; } Result = X.substr(0, I-X.begin()); @@ -110,8 +118,15 @@ std::string Mangler::makeNameProper(const std::string &X, Result += *I; } - if (NeedPrefix) - Result = ThePrefix + Result; + if (NeedPrefix) { + Result = Prefix + Result; + + if (PrefixTy == Mangler::Private) + Result = PrivatePrefix + Result; + else if (PrefixTy == Mangler::LinkerPrivate) + Result = LinkerPrivatePrefix + Result; + } + Result = '"' + Result + '"'; return Result; } @@ -125,10 +140,13 @@ std::string Mangler::getMangledName(const GlobalValue *GV, const char *Suffix, bool ForcePrivate) { assert((!isa(GV) || !cast(GV)->isIntrinsic()) && "Intrinsic functions cannot be mangled by Mangler"); - + + ManglerPrefixTy PrefixTy = + (GV->hasPrivateLinkage() || ForcePrivate) ? Mangler::Private : + GV->hasLinkerPrivateLinkage() ? Mangler::LinkerPrivate : Mangler::Default; + if (GV->hasName()) - return makeNameProper(GV->getName() + Suffix, - GV->hasPrivateLinkage() | ForcePrivate); + return makeNameProper(GV->getNameStr() + Suffix, PrefixTy); // Get the ID for the global, assigning a new one if we haven't got one // already. @@ -136,13 +154,14 @@ std::string Mangler::getMangledName(const GlobalValue *GV, const char *Suffix, if (ID == 0) ID = NextAnonGlobalID++; // Must mangle the global into a unique ID. - return makeNameProper("__unnamed_" + utostr(ID) + Suffix, - GV->hasPrivateLinkage() | ForcePrivate); + return makeNameProper("__unnamed_" + utostr(ID) + Suffix, PrefixTy); } -Mangler::Mangler(Module &M, const char *prefix, const char *privatePrefix) - : Prefix(prefix), PrivatePrefix (privatePrefix), UseQuotes(false), - PreserveAsmNames(false), NextAnonGlobalID(1) { +Mangler::Mangler(Module &M, const char *prefix, const char *privatePrefix, + const char *linkerPrivatePrefix) + : Prefix(prefix), PrivatePrefix(privatePrefix), + LinkerPrivatePrefix(linkerPrivatePrefix), UseQuotes(false), + NextAnonGlobalID(1) { std::fill(AcceptableChars, array_endof(AcceptableChars), 0); // Letters and numbers are acceptable.