Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: test/Transforms/NaCl/rewrite-setlongjmp-calls.ll

Issue 14617017: Adding a pass - RewritePNaClLibraryCalls, that replaces known library calls with stable bitcode int… (Closed) Base URL: http://git.chromium.org/native_client/pnacl-llvm.git@master
Patch Set: Added llvm.nacl.{set|long}jmp to the list of whitelisted intrinsics for ABI Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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 ; Since the address of longjmp is being taken here, a body is generated
8 ; for it, which does a cast and calls an intrinsic
9
10 ; CHECK: define internal void @longjmp(i64* %env, i32 %val) {
11 ; CHECK: entry:
12 ; CHECK: %jmp_buf_i8 = bitcast i64* %env to i8*
13 ; CHECK: call void @llvm.nacl.longjmp(i8* %jmp_buf_i8, i32 %val)
14 ; CHECK: unreachable
15 ; CHECK: }
16
17 define i32 @call_setjmp(i64* %arg) {
18 ; CHECK-NOT: call i32 @setjmp
19 ; CHECK: %jmp_buf_i8 = bitcast i64* %arg to i8*
20 ; CHECK-NEXT: %val = call i32 @llvm.nacl.setjmp(i8* %jmp_buf_i8)
21 %val = call i32 @setjmp(i64* %arg)
22 ret i32 %val
23 }
24
25 define void @call_longjmp(i64* %arg, i32 %num) {
Mark Seaborn 2013/05/13 23:39:58 Seems to duplicate @call_longjmp() in rewrite-long
eliben 2013/05/14 17:38:58 rewrite-longjmp-no-store.ll is targeted specifical
26 ; CHECK-NOT: call void @longjmp
27 ; CHECK: %jmp_buf_i8 = bitcast i64* %arg to i8*
28 ; CHECK-NEXT: call void @llvm.nacl.longjmp(i8* %jmp_buf_i8, i32 %num)
29 call void @longjmp(i64* %arg, i32 %num)
30 ret void
31 }
32
33 define i32 @takeaddr_longjmp(i64* %arg, i32 %num) {
34 %fp = alloca void (i64*, i32)*, align 8
35 ; CHECK: store void (i64*, i32)* @longjmp, void (i64*, i32)** %fp
36 store void (i64*, i32)* @longjmp, void (i64*, i32)** %fp, align 8
37 ret i32 7
38 }
39
40 ; A more complex example with a number of calls in several BBs
41 define void @multiple_calls(i64* %arg, i32 %num) {
42 entryblock:
43 ; CHECK: entryblock
44 ; CHECK: bitcast
45 ; CHECK-NEXT: call void @llvm.nacl.longjmp
46 call void @longjmp(i64* %arg, i32 %num)
47 br label %block1
48 block1:
49 ; CHECK: block1
50 ; CHECK: bitcast
51 ; CHECK-NEXT: call void @llvm.nacl.longjmp
52 call void @longjmp(i64* %arg, i32 %num)
53 ; CHECK: call i32 @llvm.nacl.setjmp
54 %val = call i32 @setjmp(i64* %arg)
55 %num2 = add i32 %val, %num
56 ; CHECK: bitcast
57 ; CHECK-NEXT: call void @llvm.nacl.longjmp
58 call void @longjmp(i64* %arg, i32 %num2)
59 br label %exitblock
60 exitblock:
61 %num3 = add i32 %num, %num
62 call void @longjmp(i64* %arg, i32 %num3)
63 %num4 = add i32 %num, %num3
64 ; CHECK: bitcast
65 ; CHECK-NEXT: call void @llvm.nacl.longjmp
66 call void @longjmp(i64* %arg, i32 %num4)
67 ret void
68 }
69
70 ; CHECK: declare i32 @llvm.nacl.setjmp(i8*)
71 ; CHECK: declare void @llvm.nacl.longjmp(i8*, i32)
72
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698