5 #undef LLVM_CAN_PASS_STRUCTS_BY_VALUE
6 #ifdef LLVM_CAN_PASS_STRUCTS_BY_VALUE
7 typedef struct SmallStruct_struct {
13 typedef struct BigStruct_struct {
15 double d1, d2; /* Note: d1 will need padding */
17 struct BigStruct_struct* next; /* Note: next will need padding */
22 printStructArgs(SmallStruct s1, /* Could fit in reg */
23 int a1, float a2, char a3, double a4, char* a5,
24 BigStruct s2, /* Must go on stack */
25 int a6, float a7, char a8, double a9, char* a10,
26 SmallStruct s3, /* Probably no available regs */
27 int a11, float a12, char a13, double a14, char* a15)
31 printf("\nprintStructArgs with 13 arguments:\n");
32 printf("\tArg 1 : %c %c %c %c %d\n", s1.c1, s1.c2, s1.c3, s1.c4, s1.n);
33 printf("\tArgs 2-6 : %d %f %c %lf %c\n", a1, a2, a3, a4, *a5);
34 printf("\tArg 7 : %c %c %c %c %lf %lf %d %p\n",
35 s2.c1, s2.c2, s2.c3, s2.c4, s2.d1, s2.d2, s2.n,s2.next);
36 printf("\tArg 8 : %c %c %c %c %d\n", s3.c1, s3.c2, s3.c3, s3.c4, s3.n);
37 printf("\tArgs 9-13 : %d %f %c %lf %c\n", a6, a7, a8, a9, *a10);
38 printf("\tArgs 14-18: %d %f %c %lf %c\n", a11, a12, a13, a14, *a15);
49 #endif /* LLVM_CAN_PASS_STRUCTS_BY_VALUE */
51 #undef LLC_SUPPORTS_VARARGS_FUNCTIONS
52 #ifdef LLC_SUPPORTS_VARARGS_FUNCTIONS
54 printVarArgs(int a1, ...)
56 double a2, a7, a12; /* float is promoted to double! */
57 int a3, a8, a13; /* char is promoted to int! */
64 a2 = va_arg(ap, double);
66 a4 = va_arg(ap, double);
67 a5 = va_arg(ap, char*);
70 a7 = va_arg(ap, double);
72 a9 = va_arg(ap, double);
73 a10 = va_arg(ap, char*);
75 a11 = va_arg(ap, int);
76 a12 = va_arg(ap, double);
77 a13 = va_arg(ap, int);
78 a14 = va_arg(ap, double);
79 a15 = va_arg(ap, char*);
81 printf("\nprintVarArgs with 15 arguments:\n");
82 printf("\tArgs 1-5 : %d %f %c %lf %c\n", a1, a2, a3, a4, *a5);
83 printf("\tArgs 6-10 : %d %f %c %lf %c\n", a6, a7, a8, a9, *a10);
84 printf("\tArgs 11-14: %d %f %c %lf %c\n", a11, a12, a13, a14, *a15);
88 #endif /* LLC_SUPPORTS_VARARGS_FUNCTIONS */
92 printArgsNoRet(int a1, float a2, char a3, double a4, char* a5,
93 int a6, float a7, char a8, double a9, char* a10,
94 int a11, float a12, char a13, double a14, char* a15)
96 printf("\nprintArgsNoRet with 15 arguments:\n");
97 printf("\tArgs 1-5 : %d %f %c %lf %c\n", a1, a2, a3, a4, *a5);
98 printf("\tArgs 6-10 : %d %f %c %lf %c\n", a6, a7, a8, a9, *a10);
99 printf("\tArgs 11-14: %d %f %c %lf %c\n", a11, a12, a13, a14, *a15);
106 main(int argc, char** argv)
108 #ifdef LLVM_CAN_PASS_STRUCTS_BY_VALUE
109 SmallStruct s1, s3, result;
111 #endif /* LLVM_CAN_PASS_STRUCTS_BY_VALUE */
113 printArgsNoRet(1, 2.1, 'c', 4.1, "e",
114 6, 7.1, 'h', 9.1, "j",
115 11, 12.1, 'm', 14.1, "o");
117 #ifdef LLC_SUPPORTS_VARARGS_FUNCTIONS
118 printVarArgs(1, 2.2, 'c', 4.2, "e",
119 6, 7.2, 'h', 9.2, "j",
120 11, 12.2, 'm', 14.2, "o");
121 #endif /* LLC_SUPPORTS_VARARGS_FUNCTIONS */
123 #ifdef LLVM_CAN_PASS_STRUCTS_BY_VALUE
145 result = printStructArgs(s1,
146 1, 2.0, 'c', 4.0, "e",
148 6, 7.0, 'h', 9.0, "j",
151 printf("\nprintStructArgs returns:\n\t%c %c %c %c %d\n\n",
152 result.c1, result.c2, result.c3, result.c4, result.n);
153 #endif /* LLVM_CAN_PASS_STRUCTS_BY_VALUE */