]> git.lizzy.rs Git - rust.git/blob - src/test/codegen/naked-functions.rs
Auto merge of #67476 - mark-i-m:simplify-borrow_check-5, r=matthewjasper
[rust.git] / src / test / codegen / naked-functions.rs
1 // ignore-tidy-linelength
2
3 // compile-flags: -C no-prepopulate-passes
4
5 #![crate_type = "lib"]
6 #![feature(naked_functions)]
7
8 // CHECK: Function Attrs: naked
9 // CHECK-NEXT: define void @naked_empty()
10 #[no_mangle]
11 #[naked]
12 pub fn naked_empty() {
13     // CHECK-NEXT: {{.+}}:
14     // CHECK-NEXT: ret void
15 }
16
17 // CHECK: Function Attrs: naked
18 #[no_mangle]
19 #[naked]
20 // CHECK-NEXT: define void @naked_with_args(i{{[0-9]+( %0)?}})
21 pub fn naked_with_args(a: isize) {
22     // CHECK-NEXT: {{.+}}:
23     // CHECK-NEXT: %a = alloca i{{[0-9]+}}
24     &a; // keep variable in an alloca
25     // CHECK: ret void
26 }
27
28 // CHECK: Function Attrs: naked
29 // CHECK-NEXT: define i{{[0-9]+}} @naked_with_return()
30 #[no_mangle]
31 #[naked]
32 pub fn naked_with_return() -> isize {
33     // CHECK-NEXT: {{.+}}:
34     // CHECK-NEXT: ret i{{[0-9]+}} 0
35     0
36 }
37
38 // CHECK: Function Attrs: naked
39 // CHECK-NEXT: define i{{[0-9]+}} @naked_with_args_and_return(i{{[0-9]+( %0)?}})
40 #[no_mangle]
41 #[naked]
42 pub fn naked_with_args_and_return(a: isize) -> isize {
43     // CHECK-NEXT: {{.+}}:
44     // CHECK-NEXT: %a = alloca i{{[0-9]+}}
45     &a; // keep variable in an alloca
46     // CHECK: ret i{{[0-9]+}} %{{[0-9]+}}
47     a
48 }
49
50 // CHECK: Function Attrs: naked
51 // CHECK-NEXT: define void @naked_recursive()
52 #[no_mangle]
53 #[naked]
54 pub fn naked_recursive() {
55     // CHECK-NEXT: {{.+}}:
56     // CHECK-NEXT: call void @naked_empty()
57
58     // FIXME(#39685) Avoid one block per call.
59     // CHECK-NEXT: br label %bb1
60     // CHECK: bb1:
61
62     naked_empty();
63
64     // CHECK-NEXT: %{{[0-9]+}} = call i{{[0-9]+}} @naked_with_return()
65
66     // FIXME(#39685) Avoid one block per call.
67     // CHECK-NEXT: br label %bb2
68     // CHECK: bb2:
69
70     // CHECK-NEXT: %{{[0-9]+}} = call i{{[0-9]+}} @naked_with_args_and_return(i{{[0-9]+}} %{{[0-9]+}})
71
72     // FIXME(#39685) Avoid one block per call.
73     // CHECK-NEXT: br label %bb3
74     // CHECK: bb3:
75
76     // CHECK-NEXT: call void @naked_with_args(i{{[0-9]+}} %{{[0-9]+}})
77
78     // FIXME(#39685) Avoid one block per call.
79     // CHECK-NEXT: br label %bb4
80     // CHECK: bb4:
81
82     naked_with_args(
83         naked_with_args_and_return(
84             naked_with_return()
85         )
86     );
87     // CHECK-NEXT: ret void
88 }