From d2b6cb0a2b6e5994ff871027617c5efd69f7e3ad Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 1 Mar 2009 01:16:21 +0000 Subject: [PATCH] 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 --- include/llvm/Assembly/Writer.h | 9 ++++-- 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 1138919bb4a..34d905399d4 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 &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 5f418408bc2..239760d2b08 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 &TypeStack, - raw_ostream &OS) { + raw_ostream &OS, bool IgnoreTopLevelName) { // Check to see if the type is named. - DenseMap &TM = getTypeNamesMap(TypeNames); - DenseMap::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 &TM = getTypeNamesMap(TypeNames); + DenseMap::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 &TM = getTypeNamesMap(TypeNames); - DenseMap::iterator I = TM.find(Ty); - if (I != TM.end()) { - OS << I->second; - return; + if (!IgnoreTopLevelName) { + DenseMap::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 &TM = getTypeNamesMap(TypeNames); - DenseMap::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 TypeStack; - CalcTypeName(Ty, TypeStack, OS); - - // Restore the name. - std::swap(OldName, I->second); + if (!IgnoreTopLevelName) + TM.insert(std::make_pair(Ty, TypeOS.str())); } namespace {