Add an extra operand to LABEL nodes which distinguishes between debug, EH, or misc...
[oota-llvm.git] / include / llvm / Type.h
index a763c65c852b45a323886185d92ab24e43bd5a6e..db177994aeef28415c84d464e21d82e6c964b569 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 
@@ -52,7 +52,7 @@ class TypeMapBase;
 ///
 /// Opaque types are also kinda weird and scary and different because they have
 /// to keep a list of uses of the type.  When, through linking, parsing, or
-/// bytecode reading, they become resolved, they need to find and update all
+/// bitcode reading, they become resolved, they need to find and update all
 /// users of the unknown type, causing them to reference a new, more concrete
 /// type.  Opaque types are deleted when their use list dwindles to zero users.
 ///
@@ -70,18 +70,20 @@ public:
     VoidTyID = 0,    ///<  0: type with no size
     FloatTyID,       ///<  1: 32 bit floating point type
     DoubleTyID,      ///<  2: 64 bit floating point type
-    LabelTyID,       ///<  3: Labels
+    X86_FP80TyID,    ///<  3: 80 bit floating point type (X87)
+    FP128TyID,       ///<  4: 128 bit floating point type (112-bit mantissa)
+    PPC_FP128TyID,   ///<  5: 128 bit floating point type (two 64-bits)
+    LabelTyID,       ///<  6: Labels
 
     // Derived types... see DerivedTypes.h file...
     // Make sure FirstDerivedTyID stays up to date!!!
-    IntegerTyID,     ///<  4: Arbitrary bit width integers
-    FunctionTyID,    ///<  5: Functions
-    StructTyID,      ///<  6: Structures
-    PackedStructTyID,///<  7: Packed Structure. This is for bytecode only
-    ArrayTyID,       ///<  8: Arrays
-    PointerTyID,     ///<  9: Pointers
-    OpaqueTyID,      ///< 10: Opaque: type with unknown structure
-    VectorTyID,      ///< 11: SIMD 'packed' format, or other vector type
+    IntegerTyID,     ///<  7: Arbitrary bit width integers
+    FunctionTyID,    ///<  8: Functions
+    StructTyID,      ///<  9: Structures
+    ArrayTyID,       ///< 10: Arrays
+    PointerTyID,     ///< 11: Pointers
+    OpaqueTyID,      ///< 12: Opaque: type with unknown structure
+    VectorTyID,      ///< 13: SIMD 'packed' format, or other vector type
 
     NumTypeIDs,                         // Must remain as last defined ID
     LastPrimitiveTyID = LabelTyID,
@@ -107,7 +109,6 @@ private:
   void destroy() const; // const is a lie, this does "delete this"!
 
 protected:
-  Type(const char *Name, TypeID id);
   explicit Type(TypeID id) : ID(id), Abstract(false), SubclassData(0),
                              RefCount(0), ForwardType(0), NumContainedTys(0),
                              ContainedTys(0) {}
@@ -178,9 +179,15 @@ public:
   ///
   bool isInteger() const { return ID == IntegerTyID; } 
 
+  /// isIntOrIntVector - Return true if this is an integer type or a vector of
+  /// integer types.
+  ///
+  bool isIntOrIntVector() const;
+  
   /// isFloatingPoint - Return true if this is one of the two floating point
   /// types
-  bool isFloatingPoint() const { return ID == FloatTyID || ID == DoubleTyID; }
+  bool isFloatingPoint() const { return ID == FloatTyID || ID == DoubleTyID ||
+      ID == X86_FP80TyID || ID == FP128TyID || ID == PPC_FP128TyID; }
 
   /// isFPOrFPVector - Return true if this is a FP type or a vector of FP types.
   ///
@@ -222,21 +229,21 @@ public:
       return true;
     // If it is not something that can have a size (e.g. a function or label),
     // it doesn't have a size.
-    if (ID != StructTyID && ID != ArrayTyID && ID != VectorTyID &&
-        ID != PackedStructTyID)
+    if (ID != StructTyID && ID != ArrayTyID && ID != VectorTyID)
       return false;
     // If it is something that can have a size and it's concrete, it definitely
     // has a size, otherwise we have to try harder to decide.
     return !isAbstract() || isSizedDerivedType();
   }
 
-  /// getPrimitiveSize - Return the basic size of this type if it is a primitive
-  /// type.  These are fixed by LLVM and are not target dependent.  This will
-  /// return zero if the type does not have a size or is not a primitive type.
+  /// getPrimitiveSizeInBits - Return the basic size of this type if it is a
+  /// primitive type.  These are fixed by LLVM and are not target dependent.
+  /// This will return zero if the type does not have a size or is not a
+  /// primitive type.
   ///
   unsigned getPrimitiveSizeInBits() const;
 
-  /// getForwaredType - Return the type that this type has been resolved to if
+  /// getForwardedType - Return the type that this type has been resolved to if
   /// it has been resolved to anything.  This is used to implement the
   /// union-find algorithm for type resolution, and shouldn't be used by general
   /// purpose clients.
@@ -282,6 +289,7 @@ public:
   // These are the builtin types that are always available...
   //
   static const Type *VoidTy, *LabelTy, *FloatTy, *DoubleTy;
+  static const Type *X86_FP80Ty, *FP128Ty, *PPC_FP128Ty;
   static const IntegerType *Int1Ty, *Int8Ty, *Int16Ty, *Int32Ty, *Int64Ty;
 
   /// Methods for support type inquiry through isa, cast, and dyn_cast: