2525// int f_opt(FnCallback cb);
2626// int f_raw(FnCallback cb);
2727//
28+ // int d_opt(void *ctx);
29+ // int d_raw(void *ctx);
30+ //
2831// int callback_i32(int);
2932//
3033// int (*T_OPT)(FnCallback) = f_opt;
3134// int (*T_RAW)(FnCallback) = f_raw;
3235//
36+ // int (*D_OPT)(void *) = d_opt;
37+ // int (*D_RAW)(void *) = d_raw;
3338// int main(void) {
39+ // /* function pointers */
3440// T_OPT(callback_i32);
3541// T_OPT(NULL);
3642//
3743// T_RAW(callback_i32);
3844//
45+ // /* data pointers */
46+ // int x = 42;
47+ // D_OPT(&x);
48+ // D_OPT(NULL);
49+ //
3950// return 0;
4051// }
4152// ```
4657#![ crate_type = "lib" ]
4758
4859extern crate minicore;
49- use minicore:: Option ;
5060use minicore:: Option :: { None , Some } ;
61+ use minicore:: { Option , c_void} ;
5162
5263extern "C" {
5364 fn f_opt ( cb : Option < unsafe extern "C" fn ( i32 ) -> i32 > ) -> i32 ;
5465 fn f_raw ( cb : unsafe extern "C" fn ( i32 ) -> i32 ) -> i32 ;
66+
67+ fn g_opt ( ctx : Option < * mut c_void > ) -> i32 ;
68+ fn g_raw ( ctx : * mut c_void ) -> i32 ;
69+
70+ fn callback_i32 ( x : i32 ) -> i32 ;
5571}
5672
5773type FnOpt = unsafe extern "C" fn ( Option < unsafe extern "C" fn ( i32 ) -> i32 > ) -> i32 ;
5874type FnRaw = unsafe extern "C" fn ( unsafe extern "C" fn ( i32 ) -> i32 ) -> i32 ;
75+ type DataOpt = unsafe extern "C" fn ( Option < * mut c_void > ) -> i32 ;
76+ type DataRaw = unsafe extern "C" fn ( * mut c_void ) -> i32 ;
5977
6078#[ used]
6179// DISC: @{{.*}}T_OPT = constant ptr ptrauth (ptr @{{.*}}f_opt, i32 0, i64 12410), align 8
@@ -66,13 +84,21 @@ static T_OPT: FnOpt = f_opt;
6684// NO_DISC: @{{.*}}T_RAW = constant ptr ptrauth (ptr @{{.*}}f_raw, i32 0), align 8
6785static T_RAW : FnRaw = f_raw;
6886
69- unsafe extern "C" {
70- fn callback_i32 ( x : i32 ) -> i32 ;
71- }
87+ // DISC: @{{.*}}G_OPT = constant ptr ptrauth (ptr @{{.*}}g_opt, i32 0, i64 12410), align 8
88+ // NO_DISC: @{{.*}}G_OPT = constant ptr ptrauth (ptr @{{.*}}g_opt, i32 0), align 8
89+ #[ used]
90+ static G_OPT : DataOpt = g_opt;
7291
92+ // DISC: @{{.*}}G_RAW = constant ptr ptrauth (ptr @{{.*}}g_raw, i32 0, i64 12410), align 8
93+ // NO_DISC: @{{.*}}G_RAW = constant ptr ptrauth (ptr @{{.*}}g_raw, i32 0), align 8
94+ #[ used]
95+ static G_RAW : DataRaw = g_raw;
7396// CHECK-LABEL: main
7497pub fn main ( ) {
98+ let mut x = 42i32 ;
99+
75100 unsafe {
101+ // Function pointers
76102 //DISC: call i32 ptrauth (ptr @f_opt, i32 0, i64 12410)(ptr ptrauth (ptr @callback_i32, i32 0, i64 2981)) {{.*}} [ "ptrauth"(i32 0, i64 12410) ]
77103 //NO_DISC: call i32 ptrauth (ptr @f_opt, i32 0)(ptr ptrauth (ptr @callback_i32, i32 0)) {{.*}} [ "ptrauth"(i32 0, i64 0) ]
78104 let _ = T_OPT ( Some ( callback_i32) ) ;
@@ -82,5 +108,17 @@ pub fn main() {
82108 // DISC: call i32 ptrauth (ptr @f_raw, i32 0, i64 12410)(ptr ptrauth (ptr @callback_i32, i32 0, i64 2981)) {{.*}} [ "ptrauth"(i32 0, i64 12410) ]
83109 // NO_DISC: call i32 ptrauth (ptr @f_raw, i32 0)(ptr ptrauth (ptr @callback_i32, i32 0)) {{.*}} [ "ptrauth"(i32 0, i64 0) ]
84110 let _ = T_RAW ( callback_i32) ;
111+
112+ // Data pointers
113+ // DISC: call i32 ptrauth (ptr @g_opt, i32 0, i64 12410){{.*}} [ "ptrauth"(i32 0, i64 12410) ]
114+ // NO_DISC: call i32 ptrauth (ptr @g_opt, i32 0){{.*}} [ "ptrauth"(i32 0, i64 0) ]
115+ let _ = G_OPT ( Some ( ( & mut x as * mut i32 ) as * mut c_void ) ) ;
116+ // DISC: call i32 ptrauth (ptr @g_opt, i32 0, i64 12410){{.*}} [ "ptrauth"(i32 0, i64 12410) ]
117+ // NO_DISC: call i32 ptrauth (ptr @g_opt, i32 0){{.*}} [ "ptrauth"(i32 0, i64 0) ]
118+ let _ = G_OPT ( None ) ;
119+
120+ // DISC: call i32 ptrauth (ptr @g_raw, i32 0, i64 12410){{.*}} [ "ptrauth"(i32 0, i64 12410) ]
121+ // NO_DISC: call i32 ptrauth (ptr @g_raw, i32 0){{.*}} [ "ptrauth"(i32 0, i64 0) ]
122+ let _ = G_RAW ( ( & mut x as * mut i32 ) as * mut c_void ) ;
85123 }
86124}
0 commit comments