Fix Type::isSized() to realize that "{ opaque }" is not sized
authorChris Lattner <sabre@nondot.org>
Fri, 2 Jul 2004 23:20:17 +0000 (23:20 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 2 Jul 2004 23:20:17 +0000 (23:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14585 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Type.h
lib/VMCore/Type.cpp

index e25bfe1e0ff22fd80a2168524d353bb86bbc6795..1598f0b97f076bafd422bdcd9aafa25ac5c12384 100644 (file)
@@ -206,8 +206,8 @@ public:
   /// TargetData subsystem to do this.
   ///
   bool isSized() const {
-    return ID != VoidTyID && ID != TypeTyID &&
-           ID != FunctionTyID && ID != LabelTyID && ID != OpaqueTyID;
+    return (ID >= BoolTyID && ID <= DoubleTyID) || ID == PointerTyID ||
+           isSizedDerivedType();
   }
 
   /// getPrimitiveSize - Return the basic size of this type if it is a primative
@@ -306,6 +306,11 @@ public:
       RefCountIsZero();
   }
 private:
+  /// isSizedDerivedType - Derived types like structures and arrays are sized
+  /// iff all of the members of the type are sized as well.  Since asking for
+  /// their size is relatively uncommon, move this operation out of line.
+  bool isSizedDerivedType() const;
+
   virtual void RefCountIsZero() const {
     abort(); // only on derived types!
   }
index 779848924247e3d15773da0480106cab843692bf..eefcee98d4e9a72716dfe7981988e2119594fc24 100644 (file)
@@ -159,6 +159,21 @@ unsigned Type::getPrimitiveSize() const {
   }
 }
 
+/// isSizedDerivedType - Derived types like structures and arrays are sized
+/// iff all of the members of the type are sized as well.  Since asking for
+/// their size is relatively uncommon, move this operation out of line.
+bool Type::isSizedDerivedType() const {
+  if (const ArrayType *ATy = dyn_cast<ArrayType>(this))
+    return ATy->getElementType()->isSized();
+
+  if (!isa<StructType>(this)) return false;
+
+  // Okay, our struct is sized if all of the elements are...
+  for (subtype_iterator I = subtype_begin(), E = subtype_end(); I != E; ++I)
+    if (!(*I)->isSized()) return false;
+
+  return true;
+}
 
 /// getForwardedTypeInternal - This method is used to implement the union-find
 /// algorithm for when a type is being forwarded to another type.