xref: /llvm-project/llvm/test/CodeGen/ARM/setjmp-bti-basic.ll (revision 1782810b8440144a0141c24192acbaeb55a1545d)
1; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi < %s | FileCheck %s --check-prefix=BTI
2; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -mattr=+no-bti-at-return-twice < %s | \
3; RUN: FileCheck %s --check-prefix=NOBTI
4
5; C source
6; --------
7; jmp_buf buf;
8;
9; extern void bar(int x);
10;
11; int foo(int x) {
12;   if (setjmp(buf))
13;     x = 0;
14;   else
15;     bar(x);
16;   return x;
17; }
18
19@buf = global [20 x i64] zeroinitializer, align 8
20
21define i32 @foo(i32 %x)  "branch-target-enforcement" {
22; BTI-LABEL: foo:
23; BTI:       bl setjmp
24; BTI-NEXT:  bti
25; NOBTI-LABEL: foo:
26; NOBTI:       bl setjmp
27; NOBTI-NOT:   bti
28
29entry:
30  %call = call i32 @setjmp(ptr @buf) #0
31  %tobool.not = icmp eq i32 %call, 0
32  br i1 %tobool.not, label %if.else, label %if.end
33
34if.else:                                          ; preds = %entry
35  call void @bar(i32 %x)
36  br label %if.end
37
38if.end:                                           ; preds = %entry, %if.else
39  %x.addr.0 = phi i32 [ %x, %if.else ], [ 0, %entry ]
40  ret i32 %x.addr.0
41}
42
43declare void @bar(i32)
44declare i32 @setjmp(ptr) #0
45
46attributes #0 = { returns_twice }
47
48