aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMisha Brukman <brukman+llvm@gmail.com>2004-01-15 22:44:19 +0000
committerMisha Brukman <brukman+llvm@gmail.com>2004-01-15 22:44:19 +0000
commitcbbbdf768fa67ecc17d5532100498c44d91f244d (patch)
tree3fc6584eeb3d7754376a3159552e8dc374b64a61
parent4a6ca8d0963e2557470f90198575a3324da758bf (diff)
downloadexternal_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.cpp95
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))