#include #include #undef LLVM_CAN_PASS_STRUCTS_BY_VALUE #ifdef LLVM_CAN_PASS_STRUCTS_BY_VALUE typedef struct SmallStruct_struct { char c1, c2, c3, c4; int n; } SmallStruct; typedef struct BigStruct_struct { char c1, c2, c3, c4; double d1, d2; /* Note: d1 will need padding */ int n; struct BigStruct_struct* next; /* Note: next will need padding */ } BigStruct; SmallStruct printStructArgs(SmallStruct s1, /* Could fit in reg */ int a1, float a2, char a3, double a4, char* a5, BigStruct s2, /* Must go on stack */ int a6, float a7, char a8, double a9, char* a10, SmallStruct s3, /* Probably no available regs */ int a11, float a12, char a13, double a14, char* a15) { SmallStruct result; printf("\nprintStructArgs with 13 arguments:\n"); printf("\tArg 1 : %c %c %c %c %d\n", s1.c1, s1.c2, s1.c3, s1.c4, s1.n); printf("\tArgs 2-6 : %d %f %c %lf %c\n", a1, a2, a3, a4, *a5); printf("\tArg 7 : %c %c %c %c %lf %lf %d %p\n", s2.c1, s2.c2, s2.c3, s2.c4, s2.d1, s2.d2, s2.n,s2.next); printf("\tArg 8 : %c %c %c %c %d\n", s3.c1, s3.c2, s3.c3, s3.c4, s3.n); printf("\tArgs 9-13 : %d %f %c %lf %c\n", a6, a7, a8, a9, *a10); printf("\tArgs 14-18: %d %f %c %lf %c\n", a11, a12, a13, a14, *a15); printf("\n"); result.c1 = s2.c1; result.c2 = s2.c2; result.c3 = s2.c3; result.c4 = s2.c4; result.n = s2.n; return result; } #endif /* LLVM_CAN_PASS_STRUCTS_BY_VALUE */ #undef LLC_SUPPORTS_VARARGS_FUNCTIONS #ifdef LLC_SUPPORTS_VARARGS_FUNCTIONS void printVarArgs(int a1, ...) { double a2, a7, a12; /* float is promoted to double! */ int a3, a8, a13; /* char is promoted to int! */ double a4, a9, a14; char *a5, *a10, *a15; int a6, a11; va_list ap; va_start(ap, a1); a2 = va_arg(ap, double); a3 = va_arg(ap, int); a4 = va_arg(ap, double); a5 = va_arg(ap, char*); a6 = va_arg(ap, int); a7 = va_arg(ap, double); a8 = va_arg(ap, int); a9 = va_arg(ap, double); a10 = va_arg(ap, char*); a11 = va_arg(ap, int); a12 = va_arg(ap, double); a13 = va_arg(ap, int); a14 = va_arg(ap, double); a15 = va_arg(ap, char*); printf("\nprintVarArgs with 15 arguments:\n"); printf("\tArgs 1-5 : %d %f %c %lf %c\n", a1, a2, a3, a4, *a5); printf("\tArgs 6-10 : %d %f %c %lf %c\n", a6, a7, a8, a9, *a10); printf("\tArgs 11-14: %d %f %c %lf %c\n", a11, a12, a13, a14, *a15); printf("\n"); return; } #endif /* LLC_SUPPORTS_VARARGS_FUNCTIONS */ void printArgsNoRet(int a1, float a2, char a3, double a4, char* a5, int a6, float a7, char a8, double a9, char* a10, int a11, float a12, char a13, double a14, char* a15) { printf("\nprintArgsNoRet with 15 arguments:\n"); printf("\tArgs 1-5 : %d %f %c %lf %c\n", a1, a2, a3, a4, *a5); printf("\tArgs 6-10 : %d %f %c %lf %c\n", a6, a7, a8, a9, *a10); printf("\tArgs 11-14: %d %f %c %lf %c\n", a11, a12, a13, a14, *a15); printf("\n"); return; } int main(int argc, char** argv) { #ifdef LLVM_CAN_PASS_STRUCTS_BY_VALUE SmallStruct s1, s3, result; BigStruct s2; #endif /* LLVM_CAN_PASS_STRUCTS_BY_VALUE */ printArgsNoRet(1, 2.1, 'c', 4.1, "e", 6, 7.1, 'h', 9.1, "j", 11, 12.1, 'm', 14.1, "o"); #ifdef LLC_SUPPORTS_VARARGS_FUNCTIONS printVarArgs(1, 2.2, 'c', 4.2, "e", 6, 7.2, 'h', 9.2, "j", 11, 12.2, 'm', 14.2, "o"); #endif /* LLC_SUPPORTS_VARARGS_FUNCTIONS */ #ifdef LLVM_CAN_PASS_STRUCTS_BY_VALUE s1.c1 = 'a'; s1.c2 = 'b'; s1.c3 = 'c'; s1.c4 = 'd'; s1.n = 111; s2.c1 = 'h'; s2.c2 = 'i'; s2.c3 = 'j'; s2.c4 = 'k'; s2.d1 = 1.1; s2.d2 = 2.2; s2.n = 222; s2.next = &s2; s3.c1 = 'w'; s3.c2 = 'x'; s3.c3 = 'y'; s3.c4 = 'z'; s3.n = 333; result = printStructArgs(s1, 1, 2.0, 'c', 4.0, "e", s2, 6, 7.0, 'h', 9.0, "j", s3); printf("\nprintStructArgs returns:\n\t%c %c %c %c %d\n\n", result.c1, result.c2, result.c3, result.c4, result.n); #endif /* LLVM_CAN_PASS_STRUCTS_BY_VALUE */ return 0; }