llvm/test/LLC/callargs.c
Vikram S. Adve a7a1c7e971 Some of these are feature tests, not regression tests.
This directory needs to be reorganized and some of the tests
need changes to make them executable.  Also comments would help...


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2865 91177308-0d34-0410-b5e6-96231b3b80d8
2002-07-10 21:54:05 +00:00

157 lines
4.3 KiB
C

#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;
}