[sanitizer] Improve FreeBSD ASLR detection
[llvm-project.git] / llvm / test / Verifier / callbr.ll
blob4442e864298f30feb721736ee514b6bb0fd86e20
1 ; RUN: not opt -S %s -verify 2>&1 | FileCheck %s
3 ; CHECK: Indirect label missing from arglist.
4 ; CHECK-NEXT: #test1
5 define void @test1() {
6   ; The %4 in the indirect label list is not found in the blockaddresses in the
7   ; arg list (bad).
8   callbr void asm sideeffect "#test1", "i,i"(i8* blockaddress(@test1, %3), i8* blockaddress(@test1, %2))
9   to label %1 [label %4, label %2]
11   ret void
13   ret void
15   ret void
17   ret void
20 ; CHECK-NOT: Indirect label missing from arglist.
21 define void @test2() {
22   ; %4 and %2 are both in the indirect label list and the arg list (good).
23   callbr void asm sideeffect "${0:l} ${1:l}", "i,i"(i8* blockaddress(@test2, %4), i8* blockaddress(@test2, %2))
24   to label %1 [label %4, label %2]
26   ret void
28   ret void
30   ret void
32   ret void
35 ; CHECK-NOT: Indirect label missing from arglist.
36 define void @test3() {
37   ; note %2 blockaddress. Such a case is possible when passing the address of
38   ; a label as an input to the inline asm (both address of label and asm goto
39   ; use blockaddress constants; we're testing that the indirect label list from
40   ; the asm goto is in the arg list to the asm).
41   callbr void asm sideeffect "${0:l} ${1:l} ${2:l}", "i,X,i"(i8* blockaddress(@test3, %4), i8* blockaddress(@test3, %2), i8* blockaddress(@test3, %3))
42   to label %1 [label %3, label %4]
44   ret void
46   ret void
48   ret void
50   ret void
53 ;; Ensure you cannot use the return value of a callbr in indirect targets.
54 ; CHECK: Instruction does not dominate all uses!
55 ; CHECK-NEXT: #test4
56 define i32 @test4(i1 %var) {
57 entry:
58   %ret = callbr i32 asm sideeffect "#test4", "=r,i"(i8* blockaddress(@test4, %abnormal)) to label %normal [label %abnormal]
60 normal:
61   ret i32 0
63 abnormal:
64   ret i32 %ret
67 ;; Ensure you cannot specify the same label as both normal and indirect targets.
68 ; CHECK: Duplicate callbr destination!
69 ; CHECK-NEXT: #test5
70 define i32 @test5() {
71 entry:
72   %ret = callbr i32 asm sideeffect "#test5", "=r,i"(i8* blockaddress(@test5, %both)) to label %both [label %both]
74 both:
75   ret i32 0