Bitcasting two or from aggregate types is not permitted. Update

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
This commit is contained in:
Dan Gohman
2008-09-08 16:45:59 +00:00
parent f91570c264
commit 500233aef9
2 changed files with 11 additions and 3 deletions

View 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 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 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 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> </dd>
<dt><b><tt>getelementptr ( CSTPTR, IDX0, IDX1, ... )</tt></b></dt> <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> <h5>Arguments:</h5>
<p>The '<tt>bitcast</tt>' instruction takes a value to cast, which must be <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 a non-aggregate first class value, and a type to cast it to, which must also be
href="#t_firstclass">first class</a> type. The bit sizes of <tt>value</tt> 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 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 type is a pointer, the destination type must also be a pointer. This
instruction supports bitwise conversion of vectors to integers and to vectors instruction supports bitwise conversion of vectors to integers and to vectors

View File

@@ -883,6 +883,12 @@ void Verifier::visitBitCastInst(BitCastInst &I) {
"Bitcast requires both operands to be pointer or neither", &I); "Bitcast requires both operands to be pointer or neither", &I);
Assert1(SrcBitSize == DestBitSize, "Bitcast requies types of same width", &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); visitInstruction(I);
} }