diff options
author | Misha Brukman <brukman+llvm@gmail.com> | 2004-01-15 22:44:19 +0000 |
---|---|---|
committer | Misha Brukman <brukman+llvm@gmail.com> | 2004-01-15 22:44:19 +0000 |
commit | cbbbdf768fa67ecc17d5532100498c44d91f244d (patch) | |
tree | 3fc6584eeb3d7754376a3159552e8dc374b64a61 | |
parent | 4a6ca8d0963e2557470f90198575a3324da758bf (diff) | |
download | external_llvm-cbbbdf768fa67ecc17d5532100498c44d91f244d.zip external_llvm-cbbbdf768fa67ecc17d5532100498c44d91f244d.tar.gz external_llvm-cbbbdf768fa67ecc17d5532100498c44d91f244d.tar.bz2 |
Use the LLVM standard name mangling infrastructure instead of reinventing the
wheel.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10891 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/SparcV9/SparcV9AsmPrinter.cpp | 95 |
1 files changed, 18 insertions, 77 deletions
diff --git a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp index a202ffa..5bb2ee6 100644 --- a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp +++ b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp @@ -27,6 +27,7 @@ #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionInfo.h" #include "llvm/CodeGen/MachineInstr.h" +#include "llvm/Support/Mangler.h" #include "Support/StringExtras.h" #include "Support/Statistic.h" #include "SparcInternals.h" @@ -36,20 +37,6 @@ using namespace llvm; namespace { Statistic<> EmittedInsts("asm-printer", "Number of machine instrs printed"); - class GlobalIdTable: public Annotation { - static AnnotationID AnnotId; - friend class AsmPrinter; // give access to AnnotId - public: - // AnonymousObjectMap - map anonymous values to unique integer IDs - std::map<const Value*, unsigned> AnonymousObjectMap; - unsigned LastAnonIDUsed; - - GlobalIdTable() : Annotation(AnnotId), LastAnonIDUsed(0) {} - }; - - AnnotationID GlobalIdTable::AnnotId = - AnnotationManager::getID("ASM PRINTER GLOBAL TABLE ANNOT"); - //===--------------------------------------------------------------------===// // Utility functions @@ -169,7 +156,9 @@ namespace { namespace { class AsmPrinter { - GlobalIdTable* idTable; + // Mangle symbol names appropriately + Mangler *Mang; + public: std::ostream &toAsm; const TargetMachine &Target; @@ -183,16 +172,15 @@ namespace { } CurSection; AsmPrinter(std::ostream &os, const TargetMachine &T) - : idTable(0), toAsm(os), Target(T), CurSection(Unknown) {} + : /* idTable(0), */ toAsm(os), Target(T), CurSection(Unknown) {} + ~AsmPrinter() { + delete Mang; + } + // (start|end)(Module|Function) - Callback methods invoked by subclasses void startModule(Module &M) { - // Create the global id table if it does not already exist - idTable = (GlobalIdTable*)M.getAnnotation(GlobalIdTable::AnnotId); - if (idTable == NULL) { - idTable = new GlobalIdTable(); - M.addAnnotation(idTable); - } + Mang = new Mangler(M); } void PrintZeroBytesToPad(int numBytes) { @@ -265,68 +253,21 @@ namespace { toAsm << "\n"; } - static std::string getValidSymbolName(const std::string &S) { - std::string Result; - - // Symbol names in Sparc assembly language have these rules: - // (a) Must match { letter | _ | . | $ } { letter | _ | . | $ | digit }* - // (b) A name beginning in "." is treated as a local name. - // - if (isdigit(S[0])) - Result = "ll"; - - for (unsigned i = 0; i < S.size(); ++i) { - char C = S[i]; - if (C == '_' || C == '.' || C == '$' || isalpha(C) || isdigit(C)) - Result += C; - else { - Result += '_'; - Result += char('0' + ((unsigned char)C >> 4)); - Result += char('0' + (C & 0xF)); - } - } - return Result; - } - - // getID - Return a valid identifier for the specified value. Base it on - // the name of the identifier if possible (qualified by the type), and - // use a numbered value based on prefix otherwise. - // FPrefix is always prepended to the output identifier. - // - std::string getID(const Value *V, const char *Prefix, - const char *FPrefix = "") - { - std::string Result = FPrefix; // "Forced prefix" - - Result += V->hasName() ? V->getName() : std::string(Prefix); - - // Qualify all internal names with a unique id. - if (!isa<GlobalValue>(V) || !cast<GlobalValue>(V)->hasExternalLinkage()) { - unsigned &ValID = idTable->AnonymousObjectMap[V]; - if (ValID == 0) - ValID = ++idTable->LastAnonIDUsed; - - Result += "_" + utostr(ValID); - - // Replace or prefix problem characters in the name - Result = getValidSymbolName(Result); - } - - return Result; - } - - // getID Wrappers - Ensure consistent usage... + // getID Wrappers - Ensure consistent usage + // Symbol names in Sparc assembly language have these rules: + // (a) Must match { letter | _ | . | $ } { letter | _ | . | $ | digit }* + // (b) A name beginning in "." is treated as a local name. std::string getID(const Function *F) { - return getID(F, "LLVMFunction_"); + return Mang->getValueName(F); } std::string getID(const BasicBlock *BB) { - return getID(BB, "LL", (".L_"+getID(BB->getParent())+"_").c_str()); + return ".L_" + getID(BB->getParent()) + "_" + Mang->getValueName(BB); } std::string getID(const GlobalVariable *GV) { - return getID(GV, "LLVMGlobal_"); + return Mang->getValueName(GV); } std::string getID(const Constant *CV) { - return getID(CV, "LLVMConst_", ".C_"); + return ".C_" + Mang->getValueName(CV); } std::string getID(const GlobalValue *GV) { if (const GlobalVariable *V = dyn_cast<GlobalVariable>(GV)) |