Index: test/Transforms/NaCl/rewrite-setlongjmp-calls.ll |
diff --git a/test/Transforms/NaCl/rewrite-setlongjmp-calls.ll b/test/Transforms/NaCl/rewrite-setlongjmp-calls.ll |
new file mode 100644 |
index 0000000000000000000000000000000000000000..856f74042736def96d63f50dee94c0e1707c4dc2 |
--- /dev/null |
+++ b/test/Transforms/NaCl/rewrite-setlongjmp-calls.ll |
@@ -0,0 +1,70 @@ |
+; RUN: opt < %s -rewrite-pnacl-library-calls -S | FileCheck %s |
+; Test the RewritePNaClLibraryCalls pass |
+ |
+declare i32 @setjmp(i64*) |
+declare void @longjmp(i64*, i32) |
+ |
+define i32 @call_setjmp(i64* %arg) { |
+; CHECK-NOT: call i32 @setjmp |
+; CHECK: %jmp_buf_i8 = bitcast i64* %arg to i8* |
+; CHECK-NEXT: %val = call i32 @llvm.nacl.setjmp(i8* %jmp_buf_i8) |
+ %val = call i32 @setjmp(i64* %arg) |
+ ret i32 %val |
+} |
+ |
+define void @call_longjmp(i64* %arg, i32 %num) { |
+; CHECK-NOT: call void @longjmp |
+; CHECK: %jmp_buf_i8 = bitcast i64* %arg to i8* |
+; CHECK-NEXT: call void @llvm.nacl.longjmp(i8* %jmp_buf_i8, i32 %num) |
+ call void @longjmp(i64* %arg, i32 %num) |
+ ret void |
+} |
+ |
+define i32 @takeaddr_longjmp(i64* %arg, i32 %num) { |
+ %fp = alloca void (i64*, i32)*, align 8 |
+; CHECK-NOT: store void (i64*, i32)* @longjmp |
+; CHECK: store void (i64*, i32)* @__nacl_wrap_longjmp, void (i64*, i32)** %fp |
+ store void (i64*, i32)* @longjmp, void (i64*, i32)** %fp, align 8 |
+ ret i32 7 |
+} |
+ |
+; A more complex example with a number of calls in several BBs |
+define void @multiple_calls(i64* %arg, i32 %num) { |
+entryblock: |
+; CHECK: entryblock |
+; CHECK: bitcast |
+; CHECK-NEXT: call void @llvm.nacl.longjmp |
+ call void @longjmp(i64* %arg, i32 %num) |
+ br label %block1 |
+block1: |
+; CHECK: block1 |
+; CHECK: bitcast |
+; CHECK-NEXT: call void @llvm.nacl.longjmp |
+ call void @longjmp(i64* %arg, i32 %num) |
+; CHECK: call i32 @llvm.nacl.setjmp |
+ %val = call i32 @setjmp(i64* %arg) |
+ %num2 = add i32 %val, %num |
+; CHECK: bitcast |
+; CHECK-NEXT: call void @llvm.nacl.longjmp |
+ call void @longjmp(i64* %arg, i32 %num2) |
+ br label %exitblock |
+exitblock: |
+ %num3 = add i32 %num, %num |
+ call void @longjmp(i64* %arg, i32 %num3) |
+ %num4 = add i32 %num, %num3 |
+; CHECK: bitcast |
+; CHECK-NEXT: call void @llvm.nacl.longjmp |
+ call void @longjmp(i64* %arg, i32 %num4) |
+ ret void |
+} |
+ |
+; CHECK: declare i32 @llvm.nacl.setjmp(i8*) |
+; CHECK: declare void @llvm.nacl.longjmp(i8*, i32) |
+ |
+; CHECK: define private void @__nacl_wrap_longjmp(i64* %env, i32 %val) { |
+; CHECK-NEXT: entry: |
+; CHECK-NEXT: %jmp_buf_i8 = bitcast i64* %env to i8* |
+; CHECK-NEXT: call void @llvm.nacl.longjmp(i8* %jmp_buf_i8, i32 %val) |
+; CHECK-NEXT: ret void |
+; CHECK-NEXT: } |
+ |