xref: /aosp_15_r20/external/libffi/testsuite/libffi.go/aa-direct.c (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan /* { dg-do run } */
2*1fd5a2e1SPrashanth Swaminathan 
3*1fd5a2e1SPrashanth Swaminathan #include "static-chain.h"
4*1fd5a2e1SPrashanth Swaminathan 
5*1fd5a2e1SPrashanth Swaminathan #if defined(__GNUC__) && !defined(__clang__) && defined(STATIC_CHAIN_REG)
6*1fd5a2e1SPrashanth Swaminathan 
7*1fd5a2e1SPrashanth Swaminathan #include "ffitest.h"
8*1fd5a2e1SPrashanth Swaminathan 
9*1fd5a2e1SPrashanth Swaminathan /* Blatent assumption here that the prologue doesn't clobber the
10*1fd5a2e1SPrashanth Swaminathan    static chain for trivial functions.  If this is not true, don't
11*1fd5a2e1SPrashanth Swaminathan    define STATIC_CHAIN_REG, and we'll test what we can via other tests.  */
doit(void)12*1fd5a2e1SPrashanth Swaminathan void *doit(void)
13*1fd5a2e1SPrashanth Swaminathan {
14*1fd5a2e1SPrashanth Swaminathan   register void *chain __asm__(STATIC_CHAIN_REG);
15*1fd5a2e1SPrashanth Swaminathan   return chain;
16*1fd5a2e1SPrashanth Swaminathan }
17*1fd5a2e1SPrashanth Swaminathan 
main()18*1fd5a2e1SPrashanth Swaminathan int main()
19*1fd5a2e1SPrashanth Swaminathan {
20*1fd5a2e1SPrashanth Swaminathan   ffi_cif cif;
21*1fd5a2e1SPrashanth Swaminathan   void *result;
22*1fd5a2e1SPrashanth Swaminathan 
23*1fd5a2e1SPrashanth Swaminathan   CHECK(ffi_prep_cif(&cif, ABI_NUM, 0, &ffi_type_pointer, NULL) == FFI_OK);
24*1fd5a2e1SPrashanth Swaminathan 
25*1fd5a2e1SPrashanth Swaminathan   ffi_call_go(&cif, FFI_FN(doit), &result, NULL, &result);
26*1fd5a2e1SPrashanth Swaminathan 
27*1fd5a2e1SPrashanth Swaminathan   CHECK(result == &result);
28*1fd5a2e1SPrashanth Swaminathan 
29*1fd5a2e1SPrashanth Swaminathan   return 0;
30*1fd5a2e1SPrashanth Swaminathan }
31*1fd5a2e1SPrashanth Swaminathan 
32*1fd5a2e1SPrashanth Swaminathan #else /* UNSUPPORTED */
main()33*1fd5a2e1SPrashanth Swaminathan int main() { return 0; }
34*1fd5a2e1SPrashanth Swaminathan #endif
35