From c0dba723d119adc8c7b49c6d0e97d10eac4428fc Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 17 Jan 2010 18:22:35 +0000 Subject: [PATCH] now that mangler is in libtarget, it can use MCAsmInfo instead of clients having to pass various fields from it in. Simplify. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93686 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/Mangler.h | 18 ++-------- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 3 +- lib/CodeGen/ELFWriter.cpp | 2 +- lib/Target/CBackend/CBackend.cpp | 51 ++++++++++++++++++--------- lib/Target/Mangler.cpp | 46 +++++++++++++----------- tools/lto/LTOCodeGenerator.cpp | 3 +- tools/lto/LTOModule.cpp | 2 +- 7 files changed, 66 insertions(+), 59 deletions(-) diff --git a/include/llvm/Target/Mangler.h b/include/llvm/Target/Mangler.h index 132e0e720f0..07ff7e29c0f 100644 --- a/include/llvm/Target/Mangler.h +++ b/include/llvm/Target/Mangler.h @@ -19,11 +19,10 @@ namespace llvm { class Twine; -class Type; -class Module; class Value; class GlobalValue; template class SmallVectorImpl; +class MCAsmInfo; class Mangler { public: @@ -34,17 +33,7 @@ public: }; private: - /// Prefix - This string is added to each symbol that is emitted, unless the - /// 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; - - /// LinkerPrivatePrefix - This string is emitted before each symbol with - /// "linker_private" linkage. - const char *LinkerPrivatePrefix; + const MCAsmInfo &MAI; /// AnonGlobalIDs - We need to give global values the same name every time /// they are mangled. This keeps track of the number we give to anonymous @@ -59,8 +48,7 @@ private: public: // Mangler ctor - if a prefix is specified, it will be prepended onto all // symbols. - Mangler(Module &M, const char *Prefix = "", const char *privatePrefix = "", - const char *linkerPrivatePrefix = ""); + Mangler(const MCAsmInfo &mai) : MAI(mai) {} /// getNameWithPrefix - Fill OutName with the name of the appropriate prefix /// and the specified global variable's name. If the global variable doesn't diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 82c176546e3..bb1f1d31d14 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -101,8 +101,7 @@ bool AsmPrinter::doInitialization(Module &M) { const_cast(getObjFileLowering()) .Initialize(OutContext, TM); - Mang = new Mangler(M, MAI->getGlobalPrefix(), MAI->getPrivateGlobalPrefix(), - MAI->getLinkerPrivateGlobalPrefix()); + Mang = new Mangler(*MAI); // Allow the target to emit any magic that it wants at the start of the file. EmitStartOfAsmFile(M); diff --git a/lib/CodeGen/ELFWriter.cpp b/lib/CodeGen/ELFWriter.cpp index 7af0aefb734..d1920d0c2df 100644 --- a/lib/CodeGen/ELFWriter.cpp +++ b/lib/CodeGen/ELFWriter.cpp @@ -119,7 +119,7 @@ bool ELFWriter::doInitialization(Module &M) { // Initialize TargetLoweringObjectFile. const_cast(TLOF).Initialize(OutContext, TM); - Mang = new Mangler(M); + Mang = new Mangler(*MAI); // ELF Header // ---------- diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index cf076876d88..7fd54ad3797 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -58,6 +58,13 @@ extern "C" void LLVMInitializeCBackendTarget() { } namespace { + class CBEMCAsmInfo : public MCAsmInfo { + public: + CBEMCAsmInfo() { + GlobalPrefix = ""; + PrivateGlobalPrefix = ""; + } + }; /// CBackendNameAllUsedStructsAndMergeFunctions - This pass inserts names for /// any unnamed structure types that are used by the program, and merges /// external functions with the same name. @@ -1869,8 +1876,17 @@ bool CWriter::doInitialization(Module &M) { IL = new IntrinsicLowering(*TD); IL->AddPrototypes(M); - // Ensure that all structure types have names... - Mang = new Mangler(M); +#if 0 + std::string Triple = TheModule->getTargetTriple(); + if (Triple.empty()) + Triple = llvm::sys::getHostTriple(); + + std::string E; + if (const Target *Match = TargetRegistry::lookupTarget(Triple, E)) + TAsm = Match->createAsmInfo(Triple); +#endif + TAsm = new CBEMCAsmInfo(); + Mang = new Mangler(*TAsm); // Keep track of which functions are static ctors/dtors so they can have // an attribute added to their prototypes. @@ -3240,30 +3256,31 @@ bool CWriter::visitBuiltinCall(CallInst &I, Intrinsic::ID ID, // of the per target tables // handle multiple constraint codes std::string CWriter::InterpretASMConstraint(InlineAsm::ConstraintInfo& c) { - assert(c.Codes.size() == 1 && "Too many asm constraint codes to handle"); - const char *const *table = 0; - // Grab the translation table from MCAsmInfo if it exists. - if (!TAsm) { - std::string Triple = TheModule->getTargetTriple(); - if (Triple.empty()) - Triple = llvm::sys::getHostTriple(); - - std::string E; - if (const Target *Match = TargetRegistry::lookupTarget(Triple, E)) - TAsm = Match->createAsmInfo(Triple); - } - if (TAsm) - table = TAsm->getAsmCBE(); + const MCAsmInfo *TargetAsm; + std::string Triple = TheModule->getTargetTriple(); + if (Triple.empty()) + Triple = llvm::sys::getHostTriple(); + + std::string E; + if (const Target *Match = TargetRegistry::lookupTarget(Triple, E)) + TargetAsm = Match->createAsmInfo(Triple); + else + return c.Codes[0]; + + const char *const *table = TargetAsm->getAsmCBE(); // Search the translation table if it exists. for (int i = 0; table && table[i]; i += 2) - if (c.Codes[0] == table[i]) + if (c.Codes[0] == table[i]) { + delete TargetAsm; return table[i+1]; + } // Default is identity. + delete TargetAsm; return c.Codes[0]; } diff --git a/lib/Target/Mangler.cpp b/lib/Target/Mangler.cpp index eb010c3a683..29c80f07bfd 100644 --- a/lib/Target/Mangler.cpp +++ b/lib/Target/Mangler.cpp @@ -13,6 +13,7 @@ #include "llvm/Target/Mangler.h" #include "llvm/GlobalValue.h" +#include "llvm/MC/MCAsmInfo.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/Twine.h" #include "llvm/Support/raw_ostream.h" @@ -29,18 +30,21 @@ void Mangler::getNameWithPrefix(SmallVectorImpl &OutName, // If the global name is not led with \1, add the appropriate prefixes. if (Name[0] != '\1') { - if (PrefixTy == Mangler::Private) - OutName.append(PrivatePrefix, PrivatePrefix+strlen(PrivatePrefix)); - else if (PrefixTy == Mangler::LinkerPrivate) - OutName.append(LinkerPrivatePrefix, - LinkerPrivatePrefix+strlen(LinkerPrivatePrefix)); - + if (PrefixTy == Mangler::Private) { + const char *Prefix = MAI.getPrivateGlobalPrefix(); + OutName.append(Prefix, Prefix+strlen(Prefix)); + } else if (PrefixTy == Mangler::LinkerPrivate) { + const char *Prefix = MAI.getLinkerPrivateGlobalPrefix(); + OutName.append(Prefix, Prefix+strlen(Prefix)); + } + + const char *Prefix = MAI.getGlobalPrefix(); if (Prefix[0] == 0) ; // Common noop, no prefix. else if (Prefix[1] == 0) OutName.push_back(Prefix[0]); // Common, one character prefix. else - OutName.append(Prefix, Prefix+strlen(Prefix)); // Arbitrary prefix. + OutName.append(Prefix, Prefix+strlen(Prefix)); // Arbitrary length prefix. } else { Name = Name.substr(1); } @@ -68,14 +72,21 @@ void Mangler::getNameWithPrefix(SmallVectorImpl &OutName, // If the global variable doesn't have a name, return a unique name for the // global based on a numbering. + if (GV->hasPrivateLinkage() || isImplicitlyPrivate) { + const char *Prefix = MAI.getPrivateGlobalPrefix(); + OutName.append(Prefix, Prefix+strlen(Prefix)); + } else if (GV->hasLinkerPrivateLinkage()) { + const char *Prefix = MAI.getLinkerPrivateGlobalPrefix(); + OutName.append(Prefix, Prefix+strlen(Prefix)); + } - // Anonymous names always get prefixes. - if (GV->hasPrivateLinkage() || isImplicitlyPrivate) - OutName.append(PrivatePrefix, PrivatePrefix+strlen(PrivatePrefix)); - else if (GV->hasLinkerPrivateLinkage()) - OutName.append(LinkerPrivatePrefix, - LinkerPrivatePrefix+strlen(LinkerPrivatePrefix));; - OutName.append(Prefix, Prefix+strlen(Prefix)); + const char *Prefix = MAI.getGlobalPrefix(); + if (Prefix[0] == 0) + ; // Common noop, no prefix. + else if (Prefix[1] == 0) + OutName.push_back(Prefix[0]); // Common, one character prefix. + else + OutName.append(Prefix, Prefix+strlen(Prefix)); // Arbitrary length prefix. // Get the ID for the global, assigning a new one if we haven't got one // already. @@ -95,10 +106,3 @@ std::string Mangler::getNameWithPrefix(const GlobalValue *GV, getNameWithPrefix(Buf, GV, isImplicitlyPrivate); return std::string(Buf.begin(), Buf.end()); } - - -Mangler::Mangler(Module &M, const char *prefix, const char *privatePrefix, - const char *linkerPrivatePrefix) - : Prefix(prefix), PrivatePrefix(privatePrefix), - LinkerPrivatePrefix(linkerPrivatePrefix), NextAnonGlobalID(1) { -} diff --git a/tools/lto/LTOCodeGenerator.cpp b/tools/lto/LTOCodeGenerator.cpp index 6201d764b03..46e967aca0c 100644 --- a/tools/lto/LTOCodeGenerator.cpp +++ b/tools/lto/LTOCodeGenerator.cpp @@ -323,8 +323,7 @@ void LTOCodeGenerator::applyScopeRestrictions() // mark which symbols can not be internalized if ( !_mustPreserveSymbols.empty() ) { - Mangler mangler(*mergedModule, - _target->getMCAsmInfo()->getGlobalPrefix()); + Mangler mangler(*_target->getMCAsmInfo()); std::vector mustPreserveList; for (Module::iterator f = mergedModule->begin(), e = mergedModule->end(); f != e; ++f) { diff --git a/tools/lto/LTOModule.cpp b/tools/lto/LTOModule.cpp index 8ad90291bb7..64de668894d 100644 --- a/tools/lto/LTOModule.cpp +++ b/tools/lto/LTOModule.cpp @@ -439,7 +439,7 @@ void LTOModule::lazyParseSymbols() _symbolsParsed = true; // Use mangler to add GlobalPrefix to names to match linker names. - Mangler mangler(*_module, _target->getMCAsmInfo()->getGlobalPrefix()); + Mangler mangler(*_target->getMCAsmInfo()); // add functions for (Module::iterator f = _module->begin(); f != _module->end(); ++f) { -- 2.34.1