1*9880d681SAndroid Build Coastguard Worker; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.localescape(...) 4*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.localrecover(i8*, i8*, i32) 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine internal void @f() { 7*9880d681SAndroid Build Coastguard Worker %a = alloca i8 8*9880d681SAndroid Build Coastguard Worker call void (...) @llvm.localescape(i8* %a) 9*9880d681SAndroid Build Coastguard Worker call void (...) @llvm.localescape(i8* %a) 10*9880d681SAndroid Build Coastguard Worker ret void 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker; CHECK: multiple calls to llvm.localescape in one function 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine internal void @g() { 15*9880d681SAndroid Build Coastguard Workerentry: 16*9880d681SAndroid Build Coastguard Worker %a = alloca i8 17*9880d681SAndroid Build Coastguard Worker br label %not_entry 18*9880d681SAndroid Build Coastguard Workernot_entry: 19*9880d681SAndroid Build Coastguard Worker call void (...) @llvm.localescape(i8* %a) 20*9880d681SAndroid Build Coastguard Worker ret void 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker; CHECK: llvm.localescape used outside of entry block 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine internal void @h() { 25*9880d681SAndroid Build Coastguard Worker call i8* @llvm.localrecover(i8* null, i8* null, i32 0) 26*9880d681SAndroid Build Coastguard Worker ret void 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker; CHECK: llvm.localrecover first argument must be function defined in this module 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker@global = constant i8 0 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdeclare void @declaration() 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdefine internal void @i() { 35*9880d681SAndroid Build Coastguard Worker call i8* @llvm.localrecover(i8* @global, i8* null, i32 0) 36*9880d681SAndroid Build Coastguard Worker ret void 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker; CHECK: llvm.localrecover first argument must be function defined in this module 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine internal void @j() { 41*9880d681SAndroid Build Coastguard Worker call i8* @llvm.localrecover(i8* bitcast(void()* @declaration to i8*), i8* null, i32 0) 42*9880d681SAndroid Build Coastguard Worker ret void 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker; CHECK: llvm.localrecover first argument must be function defined in this module 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine internal void @k(i32 %n) { 47*9880d681SAndroid Build Coastguard Worker call i8* @llvm.localrecover(i8* bitcast(void()* @f to i8*), i8* null, i32 %n) 48*9880d681SAndroid Build Coastguard Worker ret void 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker; CHECK: idx argument of llvm.localrecover must be a constant int 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerdefine internal void @l(i8* %b) { 53*9880d681SAndroid Build Coastguard Worker %a = alloca i8 54*9880d681SAndroid Build Coastguard Worker call void (...) @llvm.localescape(i8* %a, i8* %b) 55*9880d681SAndroid Build Coastguard Worker ret void 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker; CHECK: llvm.localescape only accepts static allocas 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine internal void @m() { 60*9880d681SAndroid Build Coastguard Worker %a = alloca i8 61*9880d681SAndroid Build Coastguard Worker call void (...) @llvm.localescape(i8* %a) 62*9880d681SAndroid Build Coastguard Worker ret void 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine internal void @n(i8* %fp) { 66*9880d681SAndroid Build Coastguard Worker call i8* @llvm.localrecover(i8* bitcast(void ()* @m to i8*), i8* %fp, i32 1) 67*9880d681SAndroid Build Coastguard Worker ret void 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker; CHECK: all indices passed to llvm.localrecover must be less than the number of arguments passed ot llvm.localescape in the parent function 70