diff options
Diffstat (limited to 'llvm/test/Regression/LLC/callargs.c')
| -rw-r--r-- | llvm/test/Regression/LLC/callargs.c | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/llvm/test/Regression/LLC/callargs.c b/llvm/test/Regression/LLC/callargs.c new file mode 100644 index 00000000000..1c31890aa92 --- /dev/null +++ b/llvm/test/Regression/LLC/callargs.c @@ -0,0 +1,156 @@ +#include <stdio.h> +#include <stdarg.h> + + +#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; +} |

