[llvm-commits] [llvm] r65734 - in /llvm/trunk: include/llvm/Type.h lib/VMCore/Type.cpp

Chris Lattner sabre at nondot.org
Sat Feb 28 15:01:57 PST 2009


Author: lattner
Date: Sat Feb 28 17:01:57 2009
New Revision: 65734

URL: http://llvm.org/viewvc/llvm-project?rev=65734&view=rev
Log:
delete a bunch of duplicated type printing logic, using the type printing
stuff in AsmWriter.cpp for Type::getDescription().

Modified:
    llvm/trunk/include/llvm/Type.h
    llvm/trunk/lib/VMCore/Type.cpp

Modified: llvm/trunk/include/llvm/Type.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Type.h?rev=65734&r1=65733&r2=65734&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Type.h (original)
+++ llvm/trunk/include/llvm/Type.h Sat Feb 28 17:01:57 2009
@@ -177,8 +177,8 @@
   ///
   inline TypeID getTypeID() const { return ID; }
 
-  /// getDescription - Return the string representation of the type...
-  const std::string &getDescription() const;
+  /// getDescription - Return the string representation of the type.
+  std::string getDescription() const;
 
   /// isInteger - True if this is an instance of IntegerType.
   ///

Modified: llvm/trunk/lib/VMCore/Type.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Type.cpp?rev=65734&r1=65733&r2=65734&view=diff

==============================================================================
--- llvm/trunk/lib/VMCore/Type.cpp (original)
+++ llvm/trunk/lib/VMCore/Type.cpp Sat Feb 28 17:01:57 2009
@@ -13,14 +13,16 @@
 
 #include "llvm/DerivedTypes.h"
 #include "llvm/Constants.h"
+#include "llvm/Assembly/Writer.h"
 #include "llvm/ADT/DepthFirstIterator.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/SCCIterator.h"
 #include "llvm/ADT/STLExtras.h"
-#include "llvm/Support/MathExtras.h"
 #include "llvm/Support/Compiler.h"
-#include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/Debug.h"
+#include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/MathExtras.h"
+#include "llvm/Support/raw_ostream.h"
 #include <algorithm>
 #include <cstdarg>
 using namespace llvm;
@@ -42,10 +44,8 @@
 // for types as they are needed.  Because resolution of types must invalidate
 // all of the abstract type descriptions, we keep them in a seperate map to make
 // this easy.
-static ManagedStatic<std::map<const Type*, 
-                              std::string> > ConcreteTypeDescriptions;
-static ManagedStatic<std::map<const Type*,
-                              std::string> > AbstractTypeDescriptions;
+static ManagedStatic<TypePrinting> ConcreteTypeDescriptions;
+static ManagedStatic<TypePrinting> AbstractTypeDescriptions;
 
 /// Because of the way Type subclasses are allocated, this function is necessary
 /// to use the correct kind of "delete" operator to deallocate the Type object.
@@ -229,151 +229,14 @@
 }
 
 
-// getTypeDescription - This is a recursive function that walks a type hierarchy
-// calculating the description for a type.
-//
-static std::string getTypeDescription(const Type *Ty,
-                                      std::vector<const Type *> &TypeStack) {
-  if (isa<OpaqueType>(Ty)) {                     // Base case for the recursion
-    std::map<const Type*, std::string>::iterator I =
-      AbstractTypeDescriptions->find(Ty);
-    if (I != AbstractTypeDescriptions->end())
-      return I->second;
-    std::string Desc = "opaque";
-    AbstractTypeDescriptions->insert(std::make_pair(Ty, Desc));
-    return Desc;
-  }
-
-  if (!Ty->isAbstract()) {                       // Base case for the recursion
-    std::map<const Type*, std::string>::iterator I =
-      ConcreteTypeDescriptions->find(Ty);
-    if (I != ConcreteTypeDescriptions->end()) 
-      return I->second;
-    
-    if (Ty->isPrimitiveType()) {
-      switch (Ty->getTypeID()) {
-      default: assert(0 && "Unknown prim type!");
-      case Type::VoidTyID:   return (*ConcreteTypeDescriptions)[Ty] = "void";
-      case Type::FloatTyID:  return (*ConcreteTypeDescriptions)[Ty] = "float";
-      case Type::DoubleTyID: return (*ConcreteTypeDescriptions)[Ty] = "double";
-      case Type::X86_FP80TyID: 
-            return (*ConcreteTypeDescriptions)[Ty] = "x86_fp80";
-      case Type::FP128TyID: return (*ConcreteTypeDescriptions)[Ty] = "fp128";
-      case Type::PPC_FP128TyID: 
-          return (*ConcreteTypeDescriptions)[Ty] = "ppc_fp128";
-      case Type::LabelTyID:  return (*ConcreteTypeDescriptions)[Ty] = "label";
-      }
-    }
-  }
-
-  // Check to see if the Type is already on the stack...
-  unsigned Slot = 0, CurSize = TypeStack.size();
-  while (Slot < CurSize && TypeStack[Slot] != Ty) ++Slot; // Scan for type
-
-  // This is another base case for the recursion.  In this case, we know
-  // that we have looped back to a type that we have previously visited.
-  // Generate the appropriate upreference to handle this.
-  //
-  if (Slot < CurSize)
-    return "\\" + utostr(CurSize-Slot);         // Here's the upreference
-
-  // Recursive case: derived types...
-  std::string Result;
-  TypeStack.push_back(Ty);    // Add us to the stack..
-
-  switch (Ty->getTypeID()) {
-  case Type::IntegerTyID: {
-    const IntegerType *ITy = cast<IntegerType>(Ty);
-    Result = "i" + utostr(ITy->getBitWidth());
-    break;
-  }
-  case Type::FunctionTyID: {
-    const FunctionType *FTy = cast<FunctionType>(Ty);
-    if (!Result.empty())
-      Result += " ";
-    Result += getTypeDescription(FTy->getReturnType(), TypeStack) + " (";
-    for (FunctionType::param_iterator I = FTy->param_begin(),
-         E = FTy->param_end(); I != E; ++I) {
-      if (I != FTy->param_begin())
-        Result += ", ";
-      Result += getTypeDescription(*I, TypeStack);
-    }
-    if (FTy->isVarArg()) {
-      if (FTy->getNumParams()) Result += ", ";
-      Result += "...";
-    }
-    Result += ")";
-    break;
-  }
-  case Type::StructTyID: {
-    const StructType *STy = cast<StructType>(Ty);
-    if (STy->isPacked())
-      Result = "<{ ";
-    else
-      Result = "{ ";
-    for (StructType::element_iterator I = STy->element_begin(),
-           E = STy->element_end(); I != E; ++I) {
-      if (I != STy->element_begin())
-        Result += ", ";
-      Result += getTypeDescription(*I, TypeStack);
-    }
-    Result += " }";
-    if (STy->isPacked())
-      Result += ">";
-    break;
-  }
-  case Type::PointerTyID: {
-    const PointerType *PTy = cast<PointerType>(Ty);
-    Result = getTypeDescription(PTy->getElementType(), TypeStack);
-    if (unsigned AddressSpace = PTy->getAddressSpace())
-      Result += " addrspace(" + utostr(AddressSpace) + ")";
-    Result += " *";
-    break;
-  }
-  case Type::ArrayTyID: {
-    const ArrayType *ATy = cast<ArrayType>(Ty);
-    unsigned NumElements = ATy->getNumElements();
-    Result = "[";
-    Result += utostr(NumElements) + " x ";
-    Result += getTypeDescription(ATy->getElementType(), TypeStack) + "]";
-    break;
-  }
-  case Type::VectorTyID: {
-    const VectorType *PTy = cast<VectorType>(Ty);
-    unsigned NumElements = PTy->getNumElements();
-    Result = "<";
-    Result += utostr(NumElements) + " x ";
-    Result += getTypeDescription(PTy->getElementType(), TypeStack) + ">";
-    break;
-  }
-  default:
-    Result = "<error>";
-    assert(0 && "Unhandled type in getTypeDescription!");
-  }
-
-  TypeStack.pop_back();       // Remove self from stack...
-
-  return Result;
-}
-
-
-
-static const std::string &getOrCreateDesc(std::map<const Type*,std::string>&Map,
-                                          const Type *Ty) {
-  std::map<const Type*, std::string>::iterator I = Map.find(Ty);
-  if (I != Map.end()) return I->second;
-
-  std::vector<const Type *> TypeStack;
-  std::string Result = getTypeDescription(Ty, TypeStack);
-  return Map[Ty] = Result;
-}
-
-
-const std::string &Type::getDescription() const {
-  if (isAbstract())
-    return getOrCreateDesc(*AbstractTypeDescriptions, this);
-  else
-    return getOrCreateDesc(*ConcreteTypeDescriptions, this);
+std::string Type::getDescription() const {
+  TypePrinting &Map =
+    isAbstract() ? *AbstractTypeDescriptions : *ConcreteTypeDescriptions;
+  
+  std::string DescStr;
+  raw_string_ostream DescOS(DescStr);
+  Map.print(this, DescOS);
+  return DescOS.str();
 }
 
 
@@ -1372,7 +1235,8 @@
   assert(ForwardType == 0 && "This type has already been refined!");
 
   // The descriptions may be out of date.  Conservatively clear them all!
-  AbstractTypeDescriptions->clear();
+  if (AbstractTypeDescriptions.isConstructed())
+    AbstractTypeDescriptions->clear();
 
 #ifdef DEBUG_MERGE_TYPES
   DOUT << "REFINING abstract type [" << (void*)this << " "





More information about the llvm-commits mailing list