Bitcasting two or from aggregate types is not permitted. Update
authorDan Gohman <gohman@apple.com>
Mon, 8 Sep 2008 16:45:59 +0000 (16:45 +0000)
committerDan Gohman <gohman@apple.com>
Mon, 8 Sep 2008 16:45:59 +0000 (16:45 +0000)
LangRef.html, and teach the verifier to check bitcast instructions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55921 91177308-0d34-0410-b5e6-96231b3b80d8

docs/LangRef.html
lib/VMCore/Verifier.cpp

index 8994a3559fb40251df1605a99444e2655f1396d4..1beb670765d858eaabbc95df2030708f9665674a 100644 (file)
@@ -1729,7 +1729,8 @@ following is the syntax for constant expressions:</p>
   was stored to memory and read back as TYPE. In other words, no bits change 
   with this operator, just the type.  This can be used for conversion of
   vector types to any other type, as long as they have the same bit width. For
-  pointers it is only valid to cast to another pointer type.
+  pointers it is only valid to cast to another pointer type. It is not valid
+  to bitcast to or from an aggregate type.
   </dd>
 
   <dt><b><tt>getelementptr ( CSTPTR, IDX0, IDX1, ... )</tt></b></dt>
@@ -3808,8 +3809,9 @@ nothing is done (<i>no-op cast</i>).</p>
 <h5>Arguments:</h5>
 
 <p>The '<tt>bitcast</tt>' instruction takes a value to cast, which must be 
-a first class value, and a type to cast it to, which must also be a <a
-  href="#t_firstclass">first class</a> type. The bit sizes of <tt>value</tt>
+a non-aggregate first class value, and a type to cast it to, which must also be
+a non-aggregate <a href="#t_firstclass">first class</a> type. The bit sizes of
+<tt>value</tt>
 and the destination type, <tt>ty2</tt>, must be identical. If the source
 type is a pointer, the destination type must also be a pointer.  This
 instruction supports bitwise conversion of vectors to integers and to vectors
index aa6963d94a238a0210e8a2203152f6748af85efd..805fb2564a4519c28683f3f9a7eda15373ac14e9 100644 (file)
@@ -883,6 +883,12 @@ void Verifier::visitBitCastInst(BitCastInst &I) {
           "Bitcast requires both operands to be pointer or neither", &I);
   Assert1(SrcBitSize == DestBitSize, "Bitcast requies types of same width", &I);
 
+  // Disallow aggregates.
+  Assert1(!SrcTy->isAggregateType(),
+          "Bitcast operand must not be aggregate", &I);
+  Assert1(!DestTy->isAggregateType(),
+          "Bitcast type must not be aggregate", &I);
+
   visitInstruction(I);
 }