369 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			369 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C
		
	
	
#include "ffi_test.h"
 | 
						|
 | 
						|
#include <assert.h>
 | 
						|
#include <stdarg.h>
 | 
						|
#include <string.h>
 | 
						|
 | 
						|
void ffi_test_0(void) {}
 | 
						|
 | 
						|
int ffi_test_1(void) { return 3; }
 | 
						|
 | 
						|
int ffi_test_2(int x, int y) { return x + y; }
 | 
						|
 | 
						|
int ffi_test_3(int x, int y, int z, int t) { return x + y + z * t; }
 | 
						|
 | 
						|
float ffi_test_4(void) { return 1.5; }
 | 
						|
 | 
						|
double ffi_test_5(void) { return 1.5; }
 | 
						|
 | 
						|
double ffi_test_6(float x, float y) { return x * y; }
 | 
						|
 | 
						|
double ffi_test_7(double x, double y) { return x * y; }
 | 
						|
 | 
						|
double ffi_test_8(double x, float y, double z, float t, int w) {
 | 
						|
  return x * y + z * t + w;
 | 
						|
}
 | 
						|
 | 
						|
int ffi_test_9(int a, int b, int c, int d, int e, int f, int g) {
 | 
						|
  return a + b + c + d + e + f + g;
 | 
						|
}
 | 
						|
 | 
						|
int ffi_test_10(int a, int b, double c, int d, float e, int f, int g, int h) {
 | 
						|
  return (int)(a - b - c - d - e - f - g - h);
 | 
						|
}
 | 
						|
 | 
						|
int ffi_test_11(int a, struct foo b, int c) { return a * b.x + c * b.y; }
 | 
						|
 | 
						|
int ffi_test_12(int a, int b, struct rect c, int d, int e, int f) {
 | 
						|
  return (int)(a + b + c.x + c.y + c.w + c.h + d + e + f);
 | 
						|
}
 | 
						|
 | 
						|
int ffi_test_13(int a, int b, int c, int d, int e, int f, int g, int h, int i,
 | 
						|
                int j, int k) {
 | 
						|
  return a + b + c + d + e + f + g + h + i + j + k;
 | 
						|
}
 | 
						|
 | 
						|
struct foo ffi_test_14(int x, int y) {
 | 
						|
  struct foo r;
 | 
						|
  r.x = x;
 | 
						|
  r.y = y;
 | 
						|
  return r;
 | 
						|
}
 | 
						|
 | 
						|
char* ffi_test_15(char* x, char* y) {
 | 
						|
  if (strcmp(x, y))
 | 
						|
    return "foo";
 | 
						|
  else
 | 
						|
    return "bar";
 | 
						|
}
 | 
						|
 | 
						|
struct bar ffi_test_16(long x, long y, long z) {
 | 
						|
  struct bar r;
 | 
						|
  r.x = x;
 | 
						|
  r.y = y;
 | 
						|
  r.z = z;
 | 
						|
  return r;
 | 
						|
}
 | 
						|
 | 
						|
struct tiny ffi_test_17(int x) {
 | 
						|
  struct tiny r;
 | 
						|
  r.x = x;
 | 
						|
  return r;
 | 
						|
}
 | 
						|
 | 
						|
FACTOR_STDCALL(int) ffi_test_18(int x, int y, int z, int t) {
 | 
						|
  return x + y + z * t;
 | 
						|
}
 | 
						|
 | 
						|
FACTOR_STDCALL(struct bar) ffi_test_19(long x, long y, long z) {
 | 
						|
  struct bar r;
 | 
						|
  r.x = x;
 | 
						|
  r.y = y;
 | 
						|
  r.z = z;
 | 
						|
  return r;
 | 
						|
}
 | 
						|
 | 
						|
void ffi_test_20(double x1, double x2, double x3, double y1, double y2,
 | 
						|
                 double y3, double z1, double z2, double z3) {}
 | 
						|
 | 
						|
long long ffi_test_21(long x, long y) { return (long long) x * (long long) y; }
 | 
						|
 | 
						|
long ffi_test_22(long x, long long y, long long z) { return (long)(x + y / z); }
 | 
						|
 | 
						|
float ffi_test_23(float x[3], float y[3]) {
 | 
						|
  return x[0] * y[0] + x[1] * y[1] + x[2] * y[2];
 | 
						|
}
 | 
						|
 | 
						|
struct test_struct_1 ffi_test_24(void) {
 | 
						|
  struct test_struct_1 s;
 | 
						|
  s.x = 1;
 | 
						|
  return s;
 | 
						|
}
 | 
						|
 | 
						|
struct test_struct_2 ffi_test_25(void) {
 | 
						|
  struct test_struct_2 s;
 | 
						|
  s.x = 1;
 | 
						|
  s.y = 2;
 | 
						|
  return s;
 | 
						|
}
 | 
						|
 | 
						|
struct test_struct_3 ffi_test_26(void) {
 | 
						|
  struct test_struct_3 s;
 | 
						|
  s.x = 1;
 | 
						|
  s.y = 2;
 | 
						|
  s.z = 3;
 | 
						|
  return s;
 | 
						|
}
 | 
						|
 | 
						|
struct test_struct_4 ffi_test_27(void) {
 | 
						|
  struct test_struct_4 s;
 | 
						|
  s.x = 1;
 | 
						|
  s.y = 2;
 | 
						|
  s.z = 3;
 | 
						|
  s.a = 4;
 | 
						|
  return s;
 | 
						|
}
 | 
						|
 | 
						|
struct test_struct_5 ffi_test_28(void) {
 | 
						|
  struct test_struct_5 s;
 | 
						|
  s.x = 1;
 | 
						|
  s.y = 2;
 | 
						|
  s.z = 3;
 | 
						|
  s.a = 4;
 | 
						|
  s.b = 5;
 | 
						|
  return s;
 | 
						|
}
 | 
						|
 | 
						|
struct test_struct_6 ffi_test_29(void) {
 | 
						|
  struct test_struct_6 s;
 | 
						|
  s.x = 1;
 | 
						|
  s.y = 2;
 | 
						|
  s.z = 3;
 | 
						|
  s.a = 4;
 | 
						|
  s.b = 5;
 | 
						|
  s.c = 6;
 | 
						|
  return s;
 | 
						|
}
 | 
						|
 | 
						|
struct test_struct_7 ffi_test_30(void) {
 | 
						|
  struct test_struct_7 s;
 | 
						|
  s.x = 1;
 | 
						|
  s.y = 2;
 | 
						|
  s.z = 3;
 | 
						|
  s.a = 4;
 | 
						|
  s.b = 5;
 | 
						|
  s.c = 6;
 | 
						|
  s.d = 7;
 | 
						|
  return s;
 | 
						|
}
 | 
						|
 | 
						|
int ffi_test_31(int x0, int x1, int x2, int x3, int x4, int x5, int x6, int x7,
 | 
						|
                int x8, int x9, int x10, int x11, int x12, int x13, int x14,
 | 
						|
                int x15, int x16, int x17, int x18, int x19, int x20, int x21,
 | 
						|
                int x22, int x23, int x24, int x25, int x26, int x27, int x28,
 | 
						|
                int x29, int x30, int x31, int x32, int x33, int x34, int x35,
 | 
						|
                int x36, int x37, int x38, int x39, int x40, int x41) {
 | 
						|
  return x0 + x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 +
 | 
						|
         x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + x22 + x23 + x24 +
 | 
						|
         x25 + x26 + x27 + x28 + x29 + x30 + x31 + x32 + x33 + x34 + x35 + x36 +
 | 
						|
         x37 + x38 + x39 + x40 + x41;
 | 
						|
}
 | 
						|
 | 
						|
float ffi_test_31_point_5(float x0, float x1, float x2, float x3, float x4,
 | 
						|
                          float x5, float x6, float x7, float x8, float x9,
 | 
						|
                          float x10, float x11, float x12, float x13, float x14,
 | 
						|
                          float x15, float x16, float x17, float x18, float x19,
 | 
						|
                          float x20, float x21, float x22, float x23, float x24,
 | 
						|
                          float x25, float x26, float x27, float x28, float x29,
 | 
						|
                          float x30, float x31, float x32, float x33, float x34,
 | 
						|
                          float x35, float x36, float x37, float x38, float x39,
 | 
						|
                          float x40, float x41) {
 | 
						|
  return x0 + x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 +
 | 
						|
         x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + x22 + x23 + x24 +
 | 
						|
         x25 + x26 + x27 + x28 + x29 + x30 + x31 + x32 + x33 + x34 + x35 + x36 +
 | 
						|
         x37 + x38 + x39 + x40 + x41;
 | 
						|
}
 | 
						|
 | 
						|
double ffi_test_32(struct test_struct_8 x, int y) { return (x.x + x.y) * y; }
 | 
						|
 | 
						|
double ffi_test_33(struct test_struct_9 x, int y) { return (x.x + x.y) * y; }
 | 
						|
 | 
						|
double ffi_test_34(struct test_struct_10 x, int y) { return (x.x + x.y) * y; }
 | 
						|
 | 
						|
double ffi_test_35(struct test_struct_11 x, int y) { return (x.x + x.y) * y; }
 | 
						|
 | 
						|
double ffi_test_36(struct test_struct_12 x) { return x.x; }
 | 
						|
 | 
						|
static int global_var;
 | 
						|
 | 
						|
void ffi_test_36_point_5(void) { global_var = 0; }
 | 
						|
 | 
						|
int ffi_test_37(int (*f)(int, int, int)) {
 | 
						|
  global_var = f(global_var, global_var * 2, global_var * 3);
 | 
						|
  return global_var;
 | 
						|
}
 | 
						|
 | 
						|
unsigned long long ffi_test_38(unsigned long long x, unsigned long long y) {
 | 
						|
  return x * y;
 | 
						|
}
 | 
						|
 | 
						|
int ffi_test_39(long a, long b, struct test_struct_13 s) {
 | 
						|
  assert(a == b);
 | 
						|
  return (int)(s.x1 + s.x2 + s.x3 + s.x4 + s.x5 + s.x6);
 | 
						|
}
 | 
						|
 | 
						|
struct test_struct_14 ffi_test_40(double x1, double x2) {
 | 
						|
  struct test_struct_14 retval;
 | 
						|
  retval.x1 = x1;
 | 
						|
  retval.x2 = x2;
 | 
						|
  return retval;
 | 
						|
}
 | 
						|
 | 
						|
struct test_struct_12 ffi_test_41(int a, double x) {
 | 
						|
  struct test_struct_12 retval;
 | 
						|
  retval.a = a;
 | 
						|
  retval.x = x;
 | 
						|
  return retval;
 | 
						|
}
 | 
						|
 | 
						|
struct test_struct_15 ffi_test_42(float x, float y) {
 | 
						|
  struct test_struct_15 retval;
 | 
						|
  retval.x = x;
 | 
						|
  retval.y = y;
 | 
						|
  return retval;
 | 
						|
}
 | 
						|
 | 
						|
struct test_struct_16 ffi_test_43(float x, int a) {
 | 
						|
  struct test_struct_16 retval;
 | 
						|
  retval.x = x;
 | 
						|
  retval.a = a;
 | 
						|
  return retval;
 | 
						|
}
 | 
						|
 | 
						|
struct test_struct_14 ffi_test_44(void) {
 | 
						|
  struct test_struct_14 retval;
 | 
						|
  retval.x1 = 1.0;
 | 
						|
  retval.x2 = 2.0;
 | 
						|
  return retval;
 | 
						|
}
 | 
						|
 | 
						|
/* C99 features */
 | 
						|
#ifndef _MSC_VER
 | 
						|
 | 
						|
_Complex float ffi_test_45(int x) { return x; }
 | 
						|
 | 
						|
_Complex double ffi_test_46(int x) { return x; }
 | 
						|
 | 
						|
_Complex float ffi_test_47(_Complex float x, _Complex double y) {
 | 
						|
  return x + 2 * y;
 | 
						|
}
 | 
						|
 | 
						|
short ffi_test_48(struct bool_field_test x) { return x.parents; }
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
FACTOR_FASTCALL(int) ffi_test_49(int x) { return x + 1; }
 | 
						|
 | 
						|
FACTOR_FASTCALL(int) ffi_test_50(int x, int y) { return x + y + 1; }
 | 
						|
 | 
						|
FACTOR_FASTCALL(int) ffi_test_51(int x, int y, int z) { return x + y + z + 1; }
 | 
						|
 | 
						|
FACTOR_FASTCALL(int) ffi_test_52(int x, float y, int z) {
 | 
						|
  return (int)(x + y + z + 1);
 | 
						|
}
 | 
						|
 | 
						|
FACTOR_FASTCALL(int) ffi_test_53(int x, float y, int z, int w) {
 | 
						|
  return (int)(x + y + z + w + 1);
 | 
						|
}
 | 
						|
 | 
						|
FACTOR_FASTCALL(int) ffi_test_54(struct test_struct_11 x, int y) {
 | 
						|
  return x.x + x.y + y + 1;
 | 
						|
}
 | 
						|
 | 
						|
FACTOR_FASTCALL(int) ffi_test_55(struct test_struct_11 x, int y, int z) {
 | 
						|
  return x.x + x.y + y + z + 1;
 | 
						|
}
 | 
						|
 | 
						|
FACTOR_FASTCALL(int) ffi_test_56(struct test_struct_11 x, int y, int z, int w) {
 | 
						|
  return x.x + x.y + y + z + w + 1;
 | 
						|
}
 | 
						|
 | 
						|
FACTOR_FASTCALL(struct test_struct_11) ffi_test_57(int x, int y) {
 | 
						|
  struct test_struct_11 r = { x + y, x - y };
 | 
						|
  return r;
 | 
						|
}
 | 
						|
 | 
						|
FACTOR_FASTCALL(struct test_struct_11) ffi_test_58(int x, int y, int z) {
 | 
						|
  struct test_struct_11 r = { x + y, y - z };
 | 
						|
  return r;
 | 
						|
}
 | 
						|
 | 
						|
signed long long ffi_test_59(signed long long x) {
 | 
						|
  return x;
 | 
						|
}
 | 
						|
 | 
						|
unsigned long long ffi_test_60(unsigned long long x) {
 | 
						|
  return x;
 | 
						|
}
 | 
						|
 | 
						|
/* C99 features */
 | 
						|
#ifndef _MSC_VER
 | 
						|
 | 
						|
struct bool_and_ptr ffi_test_61() {
 | 
						|
  struct bool_and_ptr bap;
 | 
						|
  bap.b = true;
 | 
						|
  bap.ptr = NULL;
 | 
						|
  return bap;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
struct uint_pair ffi_test_62() {
 | 
						|
  struct uint_pair uip;
 | 
						|
  uip.a = 0xabcdefab;
 | 
						|
  uip.b = 0x12345678;
 | 
						|
  return uip;
 | 
						|
}
 | 
						|
 | 
						|
struct ulonglong_pair ffi_test_63() {
 | 
						|
  struct ulonglong_pair ullp;
 | 
						|
  ullp.a = 0xabcdefabcdefabcd;
 | 
						|
  ullp.b = 0x1234567891234567;
 | 
						|
  return ullp;
 | 
						|
}
 | 
						|
 | 
						|
int ffi_test_64(int n, ...) {
 | 
						|
    va_list ap;
 | 
						|
    va_start(ap, n);
 | 
						|
    int sum = 0;
 | 
						|
    for (int i = 0; i < n; i++) {
 | 
						|
        sum += va_arg(ap, int);
 | 
						|
    }
 | 
						|
    va_end(ap);
 | 
						|
    return sum;
 | 
						|
}
 | 
						|
 | 
						|
double ffi_test_65(int n, ...) {
 | 
						|
    va_list ap;
 | 
						|
    va_start(ap, n);
 | 
						|
    double sum = 0.0;
 | 
						|
    for (int i = 0; i < n; i++) {
 | 
						|
        sum += va_arg(ap, double);
 | 
						|
    }
 | 
						|
    va_end(ap);
 | 
						|
    return sum;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void* bug1021_test_1(void* x, int y) {
 | 
						|
  return (void*)(y * y + (size_t)x);
 | 
						|
}
 | 
						|
 | 
						|
int bug1021_test_2(int x, char *y, void *z) {
 | 
						|
  return y[0];
 | 
						|
}
 | 
						|
 | 
						|
void* bug1021_test_3(int x) {
 | 
						|
  return (void*)(size_t)((long)x);
 | 
						|
}
 |