diff options
author | Chris Lattner <sabre@nondot.org> | 2009-03-01 01:16:21 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-03-01 01:16:21 +0000 |
commit | d2b6cb0a2b6e5994ff871027617c5efd69f7e3ad (patch) | |
tree | f9102564ab52c6d6b1e5515b04568d93f39c8035 | |
parent | a27ea9e89f38e9bcca4d67defb0bae887a16d72c (diff) | |
download | llvm-d2b6cb0a2b6e5994ff871027617c5efd69f7e3ad.tar.gz llvm-d2b6cb0a2b6e5994ff871027617c5efd69f7e3ad.tar.bz2 llvm-d2b6cb0a2b6e5994ff871027617c5efd69f7e3ad.tar.xz |
simplify handling "don't print top level name" processing, so that we get
stuff like %A = type { %A*} instead of an upref.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@65748 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Assembly/Writer.h | 9 | ||||
-rw-r--r-- | lib/VMCore/AsmWriter.cpp | 56 |
2 files changed, 25 insertions, 40 deletions
diff --git a/include/llvm/Assembly/Writer.h b/include/llvm/Assembly/Writer.h index 1138919bb4..34d905399d 100644 --- a/include/llvm/Assembly/Writer.h +++ b/include/llvm/Assembly/Writer.h @@ -38,8 +38,11 @@ public: void clear(); - void print(const Type *Ty, raw_ostream &OS); - void printAtLeastOneLevel(const Type *Ty, raw_ostream &OS); + void print(const Type *Ty, raw_ostream &OS, bool IgnoreTopLevelName = false); + + void printAtLeastOneLevel(const Type *Ty, raw_ostream &OS) { + print(Ty, OS, true); + } /// hasTypeName - Return true if the type has a name in TypeNames, false /// otherwise. @@ -52,7 +55,7 @@ public: private: void CalcTypeName(const Type *Ty, SmallVectorImpl<const Type *> &TypeStack, - raw_ostream &OS); + raw_ostream &OS, bool IgnoreTopLevelName = false); }; // WriteTypeSymbolic - This attempts to write the specified type as a symbolic diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp index 5f418408bc..239760d2b0 100644 --- a/lib/VMCore/AsmWriter.cpp +++ b/lib/VMCore/AsmWriter.cpp @@ -166,15 +166,15 @@ TypePrinting::~TypePrinting() { /// 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) { + raw_ostream &OS, bool IgnoreTopLevelName) { // Check to see if the type is named. - DenseMap<const Type*, std::string> &TM = getTypeNamesMap(TypeNames); - DenseMap<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; - return; + if (!IgnoreTopLevelName) { + DenseMap<const Type*, std::string> &TM = getTypeNamesMap(TypeNames); + DenseMap<const Type *, std::string>::iterator I = TM.find(Ty); + if (I != TM.end()) { + OS << I->second; + return; + } } // Check to see if the Type is already on the stack... @@ -273,13 +273,16 @@ void TypePrinting::CalcTypeName(const Type *Ty, /// printTypeInt - The internal guts of printing out a type that has a /// potentially named portion. /// -void TypePrinting::print(const Type *Ty, raw_ostream &OS) { +void TypePrinting::print(const Type *Ty, raw_ostream &OS, + bool IgnoreTopLevelName) { // Check to see if the type is named. DenseMap<const Type*, std::string> &TM = getTypeNamesMap(TypeNames); - DenseMap<const Type*, std::string>::iterator I = TM.find(Ty); - if (I != TM.end()) { - OS << I->second; - return; + if (!IgnoreTopLevelName) { + DenseMap<const Type*, std::string>::iterator I = TM.find(Ty); + if (I != TM.end()) { + OS << I->second; + return; + } } // Otherwise we have a type that has not been named but is a derived type. @@ -289,33 +292,12 @@ void TypePrinting::print(const Type *Ty, raw_ostream &OS) { std::string TypeName; raw_string_ostream TypeOS(TypeName); - CalcTypeName(Ty, TypeStack, TypeOS); + CalcTypeName(Ty, TypeStack, TypeOS, IgnoreTopLevelName); OS << TypeOS.str(); // Cache type name for later use. - TM.insert(std::make_pair(Ty, TypeOS.str())); -} - -/// printAtLeastOneLevel - Print out one level of the possibly complex type -/// without considering any symbolic types that we may have equal to it. -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. - DenseMap<const Type*, std::string> &TM = getTypeNamesMap(TypeNames); - DenseMap<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. - std::string OldName; - std::swap(OldName, I->second); - - // Print the type without the name. - SmallVector<const Type *, 16> TypeStack; - CalcTypeName(Ty, TypeStack, OS); - - // Restore the name. - std::swap(OldName, I->second); + if (!IgnoreTopLevelName) + TM.insert(std::make_pair(Ty, TypeOS.str())); } namespace { |