aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2001-10-28 21:38:02 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2001-10-28 21:38:02 +0000
commit9466f5113ba859677a28887c3c7143065e702019 (patch)
tree11f43750dc00e662ed17ab3b7a3a595dc7b1071a /lib
parentd889330869aa89c4db309965a52dc82bf3ebfd97 (diff)
downloadexternal_llvm-9466f5113ba859677a28887c3c7143065e702019.zip
external_llvm-9466f5113ba859677a28887c3c7143065e702019.tar.gz
external_llvm-9466f5113ba859677a28887c3c7143065e702019.tar.bz2
Added name-mangling routines for future use.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1003 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Linker/LinkModules.cpp59
-rw-r--r--lib/Transforms/Utils/Linker.cpp59
-rw-r--r--lib/VMCore/Linker.cpp59
3 files changed, 177 insertions, 0 deletions
diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp
index 55023b8..2be5698 100644
--- a/lib/Linker/LinkModules.cpp
+++ b/lib/Linker/LinkModules.cpp
@@ -16,6 +16,8 @@
#include "llvm/SymbolTable.h"
#include "llvm/DerivedTypes.h"
#include "llvm/iOther.h"
+#include "string"
+
// Error - Simple wrapper function to conditionally assign to E and return true.
// This just makes error return conditions a little bit simpler...
@@ -350,3 +352,60 @@ bool LinkModules(Module *Dest, const Module *Src, string *ErrorMsg = 0) {
return false;
}
+
+
+// MangleTypeName - Implement a consistent name-mangling scheme for
+// a given type.
+//
+string
+MangleTypeName(const Type* type)
+{
+ string mangledName;
+
+ if (type->isPrimitiveType())
+ {
+ const string& longName = type->getDescription();
+ mangledName = string(longName.c_str(), (longName.length() < 2)? 1 : 2);
+ }
+ else if (type->getPrimitiveID() == Type::PointerTyID)
+ {
+ PointerType* ptype = (PointerType*) type;
+ mangledName = string("P_" + MangleTypeName(ptype->getValueType()));
+ }
+ else if (type->getPrimitiveID() == Type::StructTyID)
+ {
+ StructType* stype = (StructType*) type;
+ mangledName = string("S_");
+ for (unsigned i=0; i < stype->getNumContainedTypes(); ++i)
+ mangledName += string(MangleTypeName(stype->getContainedType(i)));
+ }
+ else if (type->getPrimitiveID() == Type::ArrayTyID)
+ {
+ ArrayType* atype = (ArrayType*) type;
+ mangledName = string("A_" +MangleTypeName(atype->getElementType()));
+ }
+ else if (type->getPrimitiveID() == Type::MethodTyID)
+ {
+ MethodType* mtype = (MethodType*) type;
+ mangledName = string("M_") + MangleTypeName(mtype->getReturnType());
+ for (unsigned i=1; i < mtype->getNumContainedTypes(); ++i)
+ mangledName += string(MangleTypeName(mtype->getContainedType(i)));
+ }
+
+ return mangledName;
+}
+
+
+// mangleName - implement a consistent name-mangling scheme for all
+// externally visible (i.e., global) objects.
+// privateName should be unique within the module.
+//
+string
+MangleName(const string& privateName, const Value* V)
+{
+ // Lets drop the P_ before every global name since all globals are ptrs
+ return privateName + "_" +
+ MangleTypeName((isa<GlobalValue>(V)
+ ? cast<GlobalValue>(V)->getType()->getValueType()
+ : V->getType()));
+}
diff --git a/lib/Transforms/Utils/Linker.cpp b/lib/Transforms/Utils/Linker.cpp
index 55023b8..2be5698 100644
--- a/lib/Transforms/Utils/Linker.cpp
+++ b/lib/Transforms/Utils/Linker.cpp
@@ -16,6 +16,8 @@
#include "llvm/SymbolTable.h"
#include "llvm/DerivedTypes.h"
#include "llvm/iOther.h"
+#include "string"
+
// Error - Simple wrapper function to conditionally assign to E and return true.
// This just makes error return conditions a little bit simpler...
@@ -350,3 +352,60 @@ bool LinkModules(Module *Dest, const Module *Src, string *ErrorMsg = 0) {
return false;
}
+
+
+// MangleTypeName - Implement a consistent name-mangling scheme for
+// a given type.
+//
+string
+MangleTypeName(const Type* type)
+{
+ string mangledName;
+
+ if (type->isPrimitiveType())
+ {
+ const string& longName = type->getDescription();
+ mangledName = string(longName.c_str(), (longName.length() < 2)? 1 : 2);
+ }
+ else if (type->getPrimitiveID() == Type::PointerTyID)
+ {
+ PointerType* ptype = (PointerType*) type;
+ mangledName = string("P_" + MangleTypeName(ptype->getValueType()));
+ }
+ else if (type->getPrimitiveID() == Type::StructTyID)
+ {
+ StructType* stype = (StructType*) type;
+ mangledName = string("S_");
+ for (unsigned i=0; i < stype->getNumContainedTypes(); ++i)
+ mangledName += string(MangleTypeName(stype->getContainedType(i)));
+ }
+ else if (type->getPrimitiveID() == Type::ArrayTyID)
+ {
+ ArrayType* atype = (ArrayType*) type;
+ mangledName = string("A_" +MangleTypeName(atype->getElementType()));
+ }
+ else if (type->getPrimitiveID() == Type::MethodTyID)
+ {
+ MethodType* mtype = (MethodType*) type;
+ mangledName = string("M_") + MangleTypeName(mtype->getReturnType());
+ for (unsigned i=1; i < mtype->getNumContainedTypes(); ++i)
+ mangledName += string(MangleTypeName(mtype->getContainedType(i)));
+ }
+
+ return mangledName;
+}
+
+
+// mangleName - implement a consistent name-mangling scheme for all
+// externally visible (i.e., global) objects.
+// privateName should be unique within the module.
+//
+string
+MangleName(const string& privateName, const Value* V)
+{
+ // Lets drop the P_ before every global name since all globals are ptrs
+ return privateName + "_" +
+ MangleTypeName((isa<GlobalValue>(V)
+ ? cast<GlobalValue>(V)->getType()->getValueType()
+ : V->getType()));
+}
diff --git a/lib/VMCore/Linker.cpp b/lib/VMCore/Linker.cpp
index 55023b8..2be5698 100644
--- a/lib/VMCore/Linker.cpp
+++ b/lib/VMCore/Linker.cpp
@@ -16,6 +16,8 @@
#include "llvm/SymbolTable.h"
#include "llvm/DerivedTypes.h"
#include "llvm/iOther.h"
+#include "string"
+
// Error - Simple wrapper function to conditionally assign to E and return true.
// This just makes error return conditions a little bit simpler...
@@ -350,3 +352,60 @@ bool LinkModules(Module *Dest, const Module *Src, string *ErrorMsg = 0) {
return false;
}
+
+
+// MangleTypeName - Implement a consistent name-mangling scheme for
+// a given type.
+//
+string
+MangleTypeName(const Type* type)
+{
+ string mangledName;
+
+ if (type->isPrimitiveType())
+ {
+ const string& longName = type->getDescription();
+ mangledName = string(longName.c_str(), (longName.length() < 2)? 1 : 2);
+ }
+ else if (type->getPrimitiveID() == Type::PointerTyID)
+ {
+ PointerType* ptype = (PointerType*) type;
+ mangledName = string("P_" + MangleTypeName(ptype->getValueType()));
+ }
+ else if (type->getPrimitiveID() == Type::StructTyID)
+ {
+ StructType* stype = (StructType*) type;
+ mangledName = string("S_");
+ for (unsigned i=0; i < stype->getNumContainedTypes(); ++i)
+ mangledName += string(MangleTypeName(stype->getContainedType(i)));
+ }
+ else if (type->getPrimitiveID() == Type::ArrayTyID)
+ {
+ ArrayType* atype = (ArrayType*) type;
+ mangledName = string("A_" +MangleTypeName(atype->getElementType()));
+ }
+ else if (type->getPrimitiveID() == Type::MethodTyID)
+ {
+ MethodType* mtype = (MethodType*) type;
+ mangledName = string("M_") + MangleTypeName(mtype->getReturnType());
+ for (unsigned i=1; i < mtype->getNumContainedTypes(); ++i)
+ mangledName += string(MangleTypeName(mtype->getContainedType(i)));
+ }
+
+ return mangledName;
+}
+
+
+// mangleName - implement a consistent name-mangling scheme for all
+// externally visible (i.e., global) objects.
+// privateName should be unique within the module.
+//
+string
+MangleName(const string& privateName, const Value* V)
+{
+ // Lets drop the P_ before every global name since all globals are ptrs
+ return privateName + "_" +
+ MangleTypeName((isa<GlobalValue>(V)
+ ? cast<GlobalValue>(V)->getType()->getValueType()
+ : V->getType()));
+}