Add support to the mangler for targets which require _'s on global symbols
authorChris Lattner <sabre@nondot.org>
Mon, 11 Aug 2003 19:34:29 +0000 (19:34 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 11 Aug 2003 19:34:29 +0000 (19:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7741 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/Mangler.h
lib/Support/Mangler.cpp
lib/VMCore/Mangler.cpp
support/lib/Support/Mangler.cpp

index 533b44f5256d602544846a71ef7b936477ac871e..15ec2f49fc48355c4d5befecb7017a0cff573bec 100644 (file)
@@ -14,14 +14,29 @@ class Module;
 #include <string>
 
 class Mangler {
+  /// This keeps track of which global values have had their names
+  /// mangled in the current module.
+  ///
+  std::set<const Value *> MangledGlobals;
+
+  Module &M;
+  bool AddUnderscorePrefix;
+
+  typedef std::map<const Value *, std::string> ValueMap;
+  ValueMap Memo;
+
+  unsigned Count;
 public:
+
+  // Mangler ctor - if AddUnderscorePrefix is true, then all public global
+  // symbols will be prefixed with an underscore.
+  Mangler(Module &M, bool AddUnderscorePrefix = false);
+
   /// getValueName - Returns the mangled name of V, an LLVM Value,
   /// in the current module.
   ///
   std::string getValueName(const Value *V);
 
-  Mangler(Module &M_);
-
   /// makeNameProper - We don't want identifier names with ., space, or
   /// - in them, so we mangle these characters into the strings "d_",
   /// "s_", and "D_", respectively. This is a very simple mangling that
@@ -30,19 +45,6 @@ public:
   /// from getValueName.
   /// 
   static std::string makeNameProper(const std::string &x);
-
-private:
-  /// This keeps track of which global values have had their names
-  /// mangled in the current module.
-  ///
-  std::set<const Value *> MangledGlobals;
-
-  Module &M;
-
-  typedef std::map<const Value *, std::string> ValueMap;
-  ValueMap Memo;
-
-  unsigned int Count;
 };
 
 #endif // LLVM_SUPPORT_MANGLER_H
index 665cb7388c117b4b78bc936870bef4ffde468740..a58ca330afda7fb2c050cae396275b362f7c2bd4 100644 (file)
@@ -42,8 +42,9 @@ std::string Mangler::getValueName(const Value *V) {
     //   2) V's name would collide if it is not mangled.
     //
     const GlobalValue* gv = dyn_cast<GlobalValue>(V);
-    if(gv && !gv->hasInternalLinkage() && !MangledGlobals.count(gv)) {
+    if (gv && !gv->hasInternalLinkage() && !MangledGlobals.count(gv)) {
       name = makeNameProper(gv->getName());
+      if (AddUnderscorePrefix) name = "_" + name;
     } else {
       // Non-global, or global with internal linkage / colliding name
       // -> mangle.
@@ -54,12 +55,13 @@ std::string Mangler::getValueName(const Value *V) {
     name = "ltmp_" + utostr(Count++) + "_"
       + utostr(V->getType()->getUniqueID());
   }
+  
   Memo[V] = name;
   return name;
 }
 
-Mangler::Mangler(Module &M_) : M(M_)
-{
+Mangler::Mangler(Module &m, bool addUnderscorePrefix)
+  : M(m), AddUnderscorePrefix(addUnderscorePrefix) {
   // Calculate which global values have names that will collide when we throw
   // away type information.
   std::set<std::string> FoundNames;
index 665cb7388c117b4b78bc936870bef4ffde468740..a58ca330afda7fb2c050cae396275b362f7c2bd4 100644 (file)
@@ -42,8 +42,9 @@ std::string Mangler::getValueName(const Value *V) {
     //   2) V's name would collide if it is not mangled.
     //
     const GlobalValue* gv = dyn_cast<GlobalValue>(V);
-    if(gv && !gv->hasInternalLinkage() && !MangledGlobals.count(gv)) {
+    if (gv && !gv->hasInternalLinkage() && !MangledGlobals.count(gv)) {
       name = makeNameProper(gv->getName());
+      if (AddUnderscorePrefix) name = "_" + name;
     } else {
       // Non-global, or global with internal linkage / colliding name
       // -> mangle.
@@ -54,12 +55,13 @@ std::string Mangler::getValueName(const Value *V) {
     name = "ltmp_" + utostr(Count++) + "_"
       + utostr(V->getType()->getUniqueID());
   }
+  
   Memo[V] = name;
   return name;
 }
 
-Mangler::Mangler(Module &M_) : M(M_)
-{
+Mangler::Mangler(Module &m, bool addUnderscorePrefix)
+  : M(m), AddUnderscorePrefix(addUnderscorePrefix) {
   // Calculate which global values have names that will collide when we throw
   // away type information.
   std::set<std::string> FoundNames;
index 665cb7388c117b4b78bc936870bef4ffde468740..a58ca330afda7fb2c050cae396275b362f7c2bd4 100644 (file)
@@ -42,8 +42,9 @@ std::string Mangler::getValueName(const Value *V) {
     //   2) V's name would collide if it is not mangled.
     //
     const GlobalValue* gv = dyn_cast<GlobalValue>(V);
-    if(gv && !gv->hasInternalLinkage() && !MangledGlobals.count(gv)) {
+    if (gv && !gv->hasInternalLinkage() && !MangledGlobals.count(gv)) {
       name = makeNameProper(gv->getName());
+      if (AddUnderscorePrefix) name = "_" + name;
     } else {
       // Non-global, or global with internal linkage / colliding name
       // -> mangle.
@@ -54,12 +55,13 @@ std::string Mangler::getValueName(const Value *V) {
     name = "ltmp_" + utostr(Count++) + "_"
       + utostr(V->getType()->getUniqueID());
   }
+  
   Memo[V] = name;
   return name;
 }
 
-Mangler::Mangler(Module &M_) : M(M_)
-{
+Mangler::Mangler(Module &m, bool addUnderscorePrefix)
+  : M(m), AddUnderscorePrefix(addUnderscorePrefix) {
   // Calculate which global values have names that will collide when we throw
   // away type information.
   std::set<std::string> FoundNames;