forked from OSchip/llvm-project
Verify parameter alignment attribute
In DAGISel, the parameter alignment only have 4 bits to hold the value. The encode(alignment) would plus the value by 1, so the max aligment that ISel can support is 2^14. This patch verify align attribute for parameter. Differential Revision: https://reviews.llvm.org/D122130
This commit is contained in:
parent
4a48742922
commit
1fd118ffc4
|
@ -1819,6 +1819,12 @@ void Verifier::verifyParameterAttrs(AttributeSet Attrs, Type *Ty,
|
|||
|
||||
if (PointerType *PTy = dyn_cast<PointerType>(Ty)) {
|
||||
if (Attrs.hasAttribute(Attribute::ByVal)) {
|
||||
if (Attrs.hasAttribute(Attribute::Alignment)) {
|
||||
Align AttrAlign = Attrs.getAlignment().valueOrOne();
|
||||
Align MaxAlign(ParamMaxAlignment);
|
||||
Assert(AttrAlign <= MaxAlign,
|
||||
"Attribute 'align' exceed the max size 2^14", V);
|
||||
}
|
||||
SmallPtrSet<Type *, 4> Visited;
|
||||
Assert(Attrs.getByValType()->isSized(&Visited),
|
||||
"Attribute 'byval' does not support unsized types!", V);
|
||||
|
@ -3154,7 +3160,7 @@ void Verifier::visitCallBase(CallBase &Call) {
|
|||
return;
|
||||
Align ABIAlign = DL.getABITypeAlign(Ty);
|
||||
Align MaxAlign(ParamMaxAlignment);
|
||||
Assert(ABIAlign < MaxAlign,
|
||||
Assert(ABIAlign <= MaxAlign,
|
||||
"Incorrect alignment of " + Message + " to called function!", Call);
|
||||
};
|
||||
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
; RUN: not llvm-as < %s 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK: Attribute 'align' exceed the max size 2^14
|
||||
define dso_local void @foo(i8* %p) {
|
||||
entry:
|
||||
%p1 = bitcast i8* %p to <8 x float>*
|
||||
call void @bar(<8 x float>* noundef byval(<8 x float>) align 32768 %p1)
|
||||
ret void
|
||||
}
|
||||
|
||||
declare dso_local void @bar(<8 x float>* %p)
|
Loading…
Reference in New Issue