2008-03-04 Anthony Green <green@redhat.com>

Blake Chaffin
            hos@tamanegi.org

        * testsuite/libffi.call/cls_align_longdouble_split2.c
          testsuite/libffi.call/cls_align_longdouble_split.c
          testsuite/libffi.call/cls_dbls_struct.c
          testsuite/libffi.call/cls_double_va.c
          testsuite/libffi.call/cls_longdouble.c
          testsuite/libffi.call/cls_longdouble_va.c
          testsuite/libffi.call/cls_pointer.c
          testsuite/libffi.call/cls_pointer_stack.c
          testsuite/libffi.call/err_bad_abi.c
          testsuite/libffi.call/err_bad_typedef.c
          testsuite/libffi.call/huge_struct.c
          testsuite/libffi.call/stret_large2.c
          testsuite/libffi.call/stret_large.c
          testsuite/libffi.call/stret_medium2.c
          testsuite/libffi.call/stret_medium.c: New tests from Apple.
This commit is contained in:
green
2008-03-05 00:07:02 +00:00
parent 429e37d3ad
commit 23a9e73212
16 changed files with 1809 additions and 0 deletions

View File

@@ -0,0 +1,74 @@
/* Area: ffi_call, closure_call
Purpose: Check double arguments in structs.
Limitations: none.
PR: none.
Originator: Blake Chaffin 6/23/2007 */
/* { dg-do run } */
#include "ffitest.h"
typedef struct Dbls {
double x;
double y;
} Dbls;
void
closure_test_fn(Dbls p)
{
printf("%.1f %.1f\n", p.x, p.y);
}
void
closure_test_gn(ffi_cif* cif,void* resp,void** args, void* userdata)
{
closure_test_fn(*(Dbls*)args[0]);
}
int main(int argc, char** argv)
{
ffi_cif cif;
#ifndef USING_MMAP
static ffi_closure cl;
#endif
ffi_closure* pcl;
ffi_type* cl_arg_types[1];
#ifdef USING_MMAP
pcl = allocate_mmap(sizeof(ffi_closure));
#else
pcl = &cl;
#endif
ffi_type ts1_type;
ffi_type* ts1_type_elements[4];
ts1_type.size = 0;
ts1_type.alignment = 0;
ts1_type.type = FFI_TYPE_STRUCT;
ts1_type.elements = ts1_type_elements;
ts1_type_elements[0] = &ffi_type_double;
ts1_type_elements[1] = &ffi_type_double;
ts1_type_elements[2] = NULL;
cl_arg_types[0] = &ts1_type;
Dbls arg = { 1.0, 2.0 };
/* Initialize the cif */
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
&ffi_type_void, cl_arg_types) == FFI_OK);
CHECK(ffi_prep_closure(pcl, &cif, closure_test_gn, NULL) == FFI_OK);
((void*(*)(Dbls))(pcl))(arg);
/* { dg-output "1.0 2.0\n" } */
closure_test_fn(arg);
/* { dg-output "1.0 2.0\n" } */
return 0;
}