mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-19 00:14:20 +00:00
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:
parent
f91570c264
commit
500233aef9
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user