diff options
Diffstat (limited to 'lib/VMCore')
-rw-r--r-- | lib/VMCore/AsmWriter.cpp | 25 | ||||
-rw-r--r-- | lib/VMCore/Mangler.cpp | 38 |
2 files changed, 40 insertions, 23 deletions
diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp index eab845f..d5f211b 100644 --- a/lib/VMCore/AsmWriter.cpp +++ b/lib/VMCore/AsmWriter.cpp @@ -1334,21 +1334,22 @@ void AssemblyWriter::printModule(const Module *M) { static void PrintLinkage(GlobalValue::LinkageTypes LT, raw_ostream &Out) { switch (LT) { - case GlobalValue::PrivateLinkage: Out << "private "; break; - case GlobalValue::InternalLinkage: Out << "internal "; break; + case GlobalValue::ExternalLinkage: break; + case GlobalValue::PrivateLinkage: Out << "private "; break; + case GlobalValue::LinkerPrivateLinkage: Out << "linker_private "; break; + case GlobalValue::InternalLinkage: Out << "internal "; break; + case GlobalValue::LinkOnceAnyLinkage: Out << "linkonce "; break; + case GlobalValue::LinkOnceODRLinkage: Out << "linkonce_odr "; break; + case GlobalValue::WeakAnyLinkage: Out << "weak "; break; + case GlobalValue::WeakODRLinkage: Out << "weak_odr "; break; + case GlobalValue::CommonLinkage: Out << "common "; break; + case GlobalValue::AppendingLinkage: Out << "appending "; break; + case GlobalValue::DLLImportLinkage: Out << "dllimport "; break; + case GlobalValue::DLLExportLinkage: Out << "dllexport "; break; + case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break; case GlobalValue::AvailableExternallyLinkage: Out << "available_externally "; break; - case GlobalValue::LinkOnceAnyLinkage: Out << "linkonce "; break; - case GlobalValue::LinkOnceODRLinkage: Out << "linkonce_odr "; break; - case GlobalValue::WeakAnyLinkage: Out << "weak "; break; - case GlobalValue::WeakODRLinkage: Out << "weak_odr "; break; - case GlobalValue::CommonLinkage: Out << "common "; break; - case GlobalValue::AppendingLinkage: Out << "appending "; break; - case GlobalValue::DLLImportLinkage: Out << "dllimport "; break; - case GlobalValue::DLLExportLinkage: Out << "dllexport "; break; - case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break; - case GlobalValue::ExternalLinkage: break; case GlobalValue::GhostLinkage: llvm_unreachable("GhostLinkage not allowed in AsmWriter!"); } diff --git a/lib/VMCore/Mangler.cpp b/lib/VMCore/Mangler.cpp index 5828e21..c4c2502 100644 --- a/lib/VMCore/Mangler.cpp +++ b/lib/VMCore/Mangler.cpp @@ -32,7 +32,7 @@ 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 (!UseQuotes) { @@ -59,9 +59,13 @@ std::string Mangler::makeNameProper(const std::string &X, if (NeedPrefix) { Result = Prefix + Result; - if (hasPrivateLinkage) + + if (PrefixTy == PrivatePrefixTy) Result = PrivatePrefix + Result; + else if (PrefixTy == LinkerPrivatePrefixTy) + Result = LinkerPrivatePrefix + Result; } + return Result; } @@ -93,8 +97,12 @@ std::string Mangler::makeNameProper(const std::string &X, return X.substr(1); // Strip off the \001. Result = Prefix + X; - if (hasPrivateLinkage) + + if (PrefixTy == PrivatePrefixTy) Result = PrivatePrefix + Result; + else if (PrefixTy == LinkerPrivatePrefixTy) + Result = LinkerPrivatePrefix + Result; + return Result; } @@ -112,9 +120,13 @@ std::string Mangler::makeNameProper(const std::string &X, if (NeedPrefix) { Result = Prefix + Result; - if (hasPrivateLinkage) + + if (PrefixTy == PrivatePrefixTy) Result = PrivatePrefix + Result; + else if (PrefixTy == LinkerPrivatePrefixTy) + Result = LinkerPrivatePrefix + Result; } + Result = '"' + Result + '"'; return Result; } @@ -128,10 +140,13 @@ std::string Mangler::getMangledName(const GlobalValue *GV, const char *Suffix, bool ForcePrivate) { assert((!isa<Function>(GV) || !cast<Function>(GV)->isIntrinsic()) && "Intrinsic functions cannot be mangled by Mangler"); - + + ManglerPrefixTy PrefixTy = + (GV->hasPrivateLinkage() || ForcePrivate) ? PrivatePrefixTy : + GV->hasLinkerPrivateLinkage() ? LinkerPrivatePrefixTy : DefaultPrefixTy; + if (GV->hasName()) - return makeNameProper(GV->getName() + Suffix, - GV->hasPrivateLinkage() | ForcePrivate); + return makeNameProper(GV->getName() + Suffix, PrefixTy); // Get the ID for the global, assigning a new one if we haven't got one // already. @@ -139,12 +154,13 @@ 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), +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); |