/* This tests passing of structs. Only integers are tested. */ #include "defines.h" #include "args.h" struct IntegerRegisters iregs; struct FloatRegisters fregs; unsigned int num_iregs, num_fregs; struct int_struct { int i; }; struct long_struct { long l; }; struct long2_struct { long l1, l2; }; struct long3_struct { long l1, l2, l3; }; union un1 { char c; int i; }; union un2 { char c1; long l; char c2; }; union un3 { struct int_struct is; struct long_struct ls; union un1 un; }; void check_mixed_passing1 (char c1 ATTRIBUTE_UNUSED, struct int_struct is ATTRIBUTE_UNUSED, char c2 ATTRIBUTE_UNUSED) { check_int_arguments; } void check_mixed_passing2 (char c1 ATTRIBUTE_UNUSED, struct long3_struct ls ATTRIBUTE_UNUSED, char c2 ATTRIBUTE_UNUSED) { check_int_arguments; /* Check the passing on the stack by comparing the address of the stack elements to the expected place on the stack. */ assert ((unsigned long)&ls.l1 == rsp+8); assert ((unsigned long)&ls.l2 == rsp+16); assert ((unsigned long)&ls.l3 == rsp+24); } int main (void) { struct int_struct is = { 64 }; #ifdef CHECK_LARGER_STRUCTS struct long3_struct l3s = { 65, 66, 67 }; #endif clear_struct_registers; iregs.I0 = 8; iregs.I1 = 64; iregs.I2 = 9; num_iregs = 3; clear_int_hardware_registers; WRAP_CALL (check_mixed_passing1)(8, is, 9); #ifdef CHECK_LARGER_STRUCTS clear_struct_registers; iregs.I0 = 10; iregs.I1 = 11; num_iregs = 2; clear_int_hardware_registers; WRAP_CALL (check_mixed_passing2)(10, l3s, 11); #endif return 0; }