mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:40:38 +00:00
IR: Conservatively verify inalloca arguments
Summary: Try to spot obvious mismatches with inalloca use. Reviewers: rnk Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D3572 llvm-svn: 207676
This commit is contained in:
parent
df3c13c420
commit
a9ce55b419
@ -1494,6 +1494,16 @@ void Verifier::VerifyCallSite(CallSite CS) {
|
||||
// Verify call attributes.
|
||||
VerifyFunctionAttrs(FTy, Attrs, I);
|
||||
|
||||
// Conservatively check the inalloca argument.
|
||||
// We have a bug if we can find that there is an underlying alloca without
|
||||
// inalloca.
|
||||
if (CS.hasInAllocaArgument()) {
|
||||
Value *InAllocaArg = CS.getArgument(FTy->getNumParams() - 1);
|
||||
if (auto AI = dyn_cast<AllocaInst>(InAllocaArg->stripInBoundsOffsets()))
|
||||
Assert2(AI->isUsedWithInAlloca(),
|
||||
"inalloca argument for call has mismatched alloca", AI, I);
|
||||
}
|
||||
|
||||
if (FTy->isVarArg()) {
|
||||
// FIXME? is 'nest' even legal here?
|
||||
bool SawNest = false;
|
||||
|
@ -20,7 +20,7 @@ entry:
|
||||
|
||||
define i32 @main() {
|
||||
entry:
|
||||
%S = alloca %struct.ss
|
||||
%S = alloca inalloca %struct.ss
|
||||
%f0 = getelementptr %struct.ss* %S, i32 0, i32 0
|
||||
%f1 = getelementptr %struct.ss* %S, i32 0, i32 1
|
||||
store i32 1, i32* %f0, align 4
|
||||
@ -42,7 +42,7 @@ entry:
|
||||
|
||||
define i32 @test() {
|
||||
entry:
|
||||
%S = alloca %struct.ss
|
||||
%S = alloca inalloca %struct.ss
|
||||
%c = call i1 @g(%struct.ss* %S, %struct.ss* inalloca %S)
|
||||
; CHECK: call i1 @g(%struct.ss* %S, %struct.ss* inalloca %S)
|
||||
ret i32 0
|
||||
|
@ -8,7 +8,7 @@ declare void @takes_i32_inalloca(i32* inalloca)
|
||||
|
||||
define void @f() {
|
||||
; CHECK-LABEL: define void @f()
|
||||
%args = alloca i32
|
||||
%args = alloca inalloca i32
|
||||
call void bitcast (void (i32)* @takes_i32 to void (i32*)*)(i32* inalloca %args)
|
||||
; CHECK: call void bitcast
|
||||
ret void
|
||||
|
13
test/Verifier/inalloca3.ll
Normal file
13
test/Verifier/inalloca3.ll
Normal file
@ -0,0 +1,13 @@
|
||||
; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s
|
||||
|
||||
|
||||
declare void @doit(i64* inalloca %a)
|
||||
|
||||
define void @a() {
|
||||
entry:
|
||||
%a = alloca [2 x i32]
|
||||
%b = bitcast [2 x i32]* %a to i64*
|
||||
call void @doit(i64* inalloca %b)
|
||||
; CHECK: inalloca argument for call has mismatched alloca
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user