summaryrefslogtreecommitdiffstats
path: root/js/src/ctypes/libffi/testsuite/libffi.go/aa-direct.c
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/ctypes/libffi/testsuite/libffi.go/aa-direct.c')
-rw-r--r--js/src/ctypes/libffi/testsuite/libffi.go/aa-direct.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/js/src/ctypes/libffi/testsuite/libffi.go/aa-direct.c b/js/src/ctypes/libffi/testsuite/libffi.go/aa-direct.c
new file mode 100644
index 0000000000..b00c404ab3
--- /dev/null
+++ b/js/src/ctypes/libffi/testsuite/libffi.go/aa-direct.c
@@ -0,0 +1,34 @@
+/* { dg-do run } */
+
+#include "static-chain.h"
+
+#if defined(__GNUC__) && !defined(__clang__) && defined(STATIC_CHAIN_REG)
+
+#include "ffitest.h"
+
+/* Blatent assumption here that the prologue doesn't clobber the
+ static chain for trivial functions. If this is not true, don't
+ define STATIC_CHAIN_REG, and we'll test what we can via other tests. */
+void *doit(void)
+{
+ register void *chain __asm__(STATIC_CHAIN_REG);
+ return chain;
+}
+
+int main()
+{
+ ffi_cif cif;
+ void *result;
+
+ CHECK(ffi_prep_cif(&cif, ABI_NUM, 0, &ffi_type_pointer, NULL) == FFI_OK);
+
+ ffi_call_go(&cif, FFI_FN(doit), &result, NULL, &result);
+
+ CHECK(result == &result);
+
+ return 0;
+}
+
+#else /* UNSUPPORTED */
+int main() { return 0; }
+#endif