aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-02-28 22:34:45 +0000
committerChris Lattner <sabre@nondot.org>2009-02-28 22:34:45 +0000
commit18f9efdd9ef6b529d054ce63f41be7fc33bee995 (patch)
treedad743e12c3f089f1015216a718b12178d4346b2
parentd6c628ed317f0eb39c4187fb8d137d5911a011de (diff)
downloadexternal_llvm-18f9efdd9ef6b529d054ce63f41be7fc33bee995.zip
external_llvm-18f9efdd9ef6b529d054ce63f41be7fc33bee995.tar.gz
external_llvm-18f9efdd9ef6b529d054ce63f41be7fc33bee995.tar.bz2
expose TypePrinting as a public API.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@65729 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Assembly/Writer.h18
-rw-r--r--lib/VMCore/AsmWriter.cpp47
2 files changed, 42 insertions, 23 deletions
diff --git a/include/llvm/Assembly/Writer.h b/include/llvm/Assembly/Writer.h
index 8e79b27..343539a 100644
--- a/include/llvm/Assembly/Writer.h
+++ b/include/llvm/Assembly/Writer.h
@@ -25,6 +25,24 @@ class Type;
class Module;
class Value;
class raw_ostream;
+template <typename T> class SmallVectorImpl;
+
+/// TypePrinting - Type printing machinery.
+class TypePrinting {
+ void *TypeNames;
+public:
+ TypePrinting(const Module *M);
+ ~TypePrinting();
+
+ void clear();
+
+ void print(const Type *Ty, raw_ostream &OS);
+ void printAtLeastOneLevel(const Type *Ty, raw_ostream &OS);
+
+private:
+ void CalcTypeName(const Type *Ty, SmallVectorImpl<const Type *> &TypeStack,
+ raw_ostream &OS);
+};
// WriteTypeSymbolic - This attempts to write the specified type as a symbolic
// type, if there is an entry in the Module's symbol table for the specified
diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp
index d61dd9d..4128fdb 100644
--- a/lib/VMCore/AsmWriter.cpp
+++ b/lib/VMCore/AsmWriter.cpp
@@ -137,25 +137,19 @@ static void PrintLLVMName(raw_ostream &OS, const Value *V) {
// TypePrinting Class: Type printing machinery
//===----------------------------------------------------------------------===//
-namespace {
- /// TypePrinting - Type printing machinery.
- class TypePrinting {
- std::map<const Type *, std::string> TypeNames;
- public:
- TypePrinting(const Module *M);
-
- void print(const Type *Ty, raw_ostream &OS);
- void printAtLeastOneLevel(const Type *Ty, raw_ostream &OS);
-
- private:
- void CalcTypeName(const Type *Ty, SmallVectorImpl<const Type *> &TypeStack,
- raw_ostream &OS);
- };
-} // end anonymous namespace.
+static std::map<const Type *, std::string> &getTypeNamesMap(void *M) {
+ return *static_cast<std::map<const Type *, std::string>*>(M);
+}
+
+void TypePrinting::clear() {
+ getTypeNamesMap(TypeNames).clear();
+}
TypePrinting::TypePrinting(const Module *M) {
if (M == 0) return;
+ TypeNames = new std::map<const Type *, std::string>();
+
// If the module has a symbol table, take all global types and stuff their
// names into the TypeNames map.
const TypeSymbolTable &ST = M->getTypeSymbolTable();
@@ -180,18 +174,23 @@ TypePrinting::TypePrinting(const Module *M) {
std::string NameStr;
raw_string_ostream NameOS(NameStr);
PrintLLVMName(NameOS, TI->first.c_str(), TI->first.length(), LocalPrefix);
- TypeNames.insert(std::make_pair(Ty, NameOS.str()));
+ getTypeNamesMap(TypeNames).insert(std::make_pair(Ty, NameOS.str()));
}
}
+TypePrinting::~TypePrinting() {
+ delete &getTypeNamesMap(TypeNames);
+}
+
/// CalcTypeName - Write the specified type to the specified raw_ostream, making
/// use of type names or up references to shorten the type name where possible.
void TypePrinting::CalcTypeName(const Type *Ty,
SmallVectorImpl<const Type *> &TypeStack,
raw_ostream &OS) {
// Check to see if the type is named.
- std::map<const Type *, std::string>::iterator I = TypeNames.find(Ty);
- if (I != TypeNames.end() &&
+ std::map<const Type*, std::string> &TM = getTypeNamesMap(TypeNames);
+ std::map<const Type *, std::string>::iterator I = TM.find(Ty);
+ if (I != TM.end() &&
// If the name wasn't temporarily removed use it.
!I->second.empty()) {
OS << I->second;
@@ -296,8 +295,9 @@ void TypePrinting::CalcTypeName(const Type *Ty,
///
void TypePrinting::print(const Type *Ty, raw_ostream &OS) {
// Check to see if the type is named.
- std::map<const Type*, std::string>::iterator I = TypeNames.find(Ty);
- if (I != TypeNames.end()) {
+ std::map<const Type*, std::string> &TM = getTypeNamesMap(TypeNames);
+ std::map<const Type*, std::string>::iterator I = TM.find(Ty);
+ if (I != TM.end()) {
OS << I->second;
return;
}
@@ -313,7 +313,7 @@ void TypePrinting::print(const Type *Ty, raw_ostream &OS) {
OS << TypeOS.str();
// Cache type name for later use.
- TypeNames.insert(std::make_pair(Ty, TypeOS.str()));
+ TM.insert(std::make_pair(Ty, TypeOS.str()));
}
/// printAtLeastOneLevel - Print out one level of the possibly complex type
@@ -321,8 +321,9 @@ void TypePrinting::print(const Type *Ty, raw_ostream &OS) {
void TypePrinting::printAtLeastOneLevel(const Type *Ty, raw_ostream &OS) {
// If the type does not have a name, then it is already guaranteed to print at
// least one level.
- std::map<const Type*, std::string>::iterator I = TypeNames.find(Ty);
- if (I == TypeNames.end())
+ std::map<const Type*, std::string> &TM = getTypeNamesMap(TypeNames);
+ std::map<const Type*, std::string>::iterator I = TM.find(Ty);
+ if (I == TM.end())
return print(Ty, OS);
// Otherwise, temporarily remove the name and print it.