OLD | NEW |
(Empty) | |
| 1 ; RUN: opt < %s -rewrite-pnacl-library-calls -S | FileCheck %s |
| 2 ; Test the RewritePNaClLibraryCalls pass |
| 3 |
| 4 declare i32 @setjmp(i64*) |
| 5 declare void @longjmp(i64*, i32) |
| 6 |
| 7 define i32 @call_setjmp(i64* %arg) { |
| 8 ; CHECK-NOT: call i32 @setjmp |
| 9 ; CHECK: %jmp_buf_i8 = bitcast i64* %arg to i8* |
| 10 ; CHECK-NEXT: %val = call i32 @llvm.nacl.setjmp(i8* %jmp_buf_i8) |
| 11 %val = call i32 @setjmp(i64* %arg) |
| 12 ret i32 %val |
| 13 } |
| 14 |
| 15 define void @call_longjmp(i64* %arg, i32 %num) { |
| 16 ; CHECK-NOT: call void @longjmp |
| 17 ; CHECK: %jmp_buf_i8 = bitcast i64* %arg to i8* |
| 18 ; CHECK-NEXT: call void @llvm.nacl.longjmp(i8* %jmp_buf_i8, i32 %num) |
| 19 call void @longjmp(i64* %arg, i32 %num) |
| 20 ret void |
| 21 } |
| 22 |
| 23 define i32 @takeaddr_longjmp(i64* %arg, i32 %num) { |
| 24 %fp = alloca void (i64*, i32)*, align 8 |
| 25 ; CHECK-NOT: store void (i64*, i32)* @longjmp |
| 26 ; CHECK: store void (i64*, i32)* @__nacl_wrap_longjmp, void (i64*, i32)** %fp |
| 27 store void (i64*, i32)* @longjmp, void (i64*, i32)** %fp, align 8 |
| 28 ret i32 7 |
| 29 } |
| 30 |
| 31 ; A more complex example with a number of calls in several BBs |
| 32 define void @multiple_calls(i64* %arg, i32 %num) { |
| 33 entryblock: |
| 34 ; CHECK: entryblock |
| 35 ; CHECK: bitcast |
| 36 ; CHECK-NEXT: call void @llvm.nacl.longjmp |
| 37 call void @longjmp(i64* %arg, i32 %num) |
| 38 br label %block1 |
| 39 block1: |
| 40 ; CHECK: block1 |
| 41 ; CHECK: bitcast |
| 42 ; CHECK-NEXT: call void @llvm.nacl.longjmp |
| 43 call void @longjmp(i64* %arg, i32 %num) |
| 44 ; CHECK: call i32 @llvm.nacl.setjmp |
| 45 %val = call i32 @setjmp(i64* %arg) |
| 46 %num2 = add i32 %val, %num |
| 47 ; CHECK: bitcast |
| 48 ; CHECK-NEXT: call void @llvm.nacl.longjmp |
| 49 call void @longjmp(i64* %arg, i32 %num2) |
| 50 br label %exitblock |
| 51 exitblock: |
| 52 %num3 = add i32 %num, %num |
| 53 call void @longjmp(i64* %arg, i32 %num3) |
| 54 %num4 = add i32 %num, %num3 |
| 55 ; CHECK: bitcast |
| 56 ; CHECK-NEXT: call void @llvm.nacl.longjmp |
| 57 call void @longjmp(i64* %arg, i32 %num4) |
| 58 ret void |
| 59 } |
| 60 |
| 61 ; CHECK: declare i32 @llvm.nacl.setjmp(i8*) |
| 62 ; CHECK: declare void @llvm.nacl.longjmp(i8*, i32) |
| 63 |
| 64 ; CHECK: define private void @__nacl_wrap_longjmp(i64* %env, i32 %val) { |
| 65 ; CHECK-NEXT: entry: |
| 66 ; CHECK-NEXT: %jmp_buf_i8 = bitcast i64* %env to i8* |
| 67 ; CHECK-NEXT: call void @llvm.nacl.longjmp(i8* %jmp_buf_i8, i32 %val) |
| 68 ; CHECK-NEXT: ret void |
| 69 ; CHECK-NEXT: } |
| 70 |
OLD | NEW |