Fix store to not index
[oota-llvm.git] / test / LLC / callargs.c
1 #include <stdio.h>
2 #include <stdarg.h>
3
4
5 #undef LLVM_CAN_PASS_STRUCTS_BY_VALUE
6 #ifdef LLVM_CAN_PASS_STRUCTS_BY_VALUE
7 typedef struct SmallStruct_struct {
8   char c1, c2, c3, c4;
9   int  n; 
10 } SmallStruct;
11
12
13 typedef struct BigStruct_struct {
14   char       c1, c2, c3, c4;
15   double     d1, d2;                    /* Note: d1 will need padding */
16   int        n; 
17   struct BigStruct_struct* next;        /* Note: next will need padding */
18 } BigStruct;
19
20
21 SmallStruct
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)
28 {
29   SmallStruct result;
30   
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);
39   printf("\n");
40   
41   result.c1 = s2.c1;
42   result.c2 = s2.c2;
43   result.c3 = s2.c3;
44   result.c4 = s2.c4;
45   result.n  = s2.n;
46   
47   return result;
48 }
49 #endif  /* LLVM_CAN_PASS_STRUCTS_BY_VALUE */
50
51 #undef LLC_SUPPORTS_VARARGS_FUNCTIONS
52 #ifdef LLC_SUPPORTS_VARARGS_FUNCTIONS
53 void
54 printVarArgs(int a1, ...)
55 {
56   double a2, a7,  a12;                  /* float is promoted to double! */
57   int    a3, a8,  a13;                  /* char is promoted to int! */
58   double a4, a9,  a14;
59   char  *a5, *a10, *a15;
60   int    a6, a11;
61   
62   va_list ap;
63   va_start(ap, a1);
64   a2  = va_arg(ap, double);
65   a3  = va_arg(ap, int);
66   a4  = va_arg(ap, double);
67   a5  = va_arg(ap, char*);
68   
69   a6  = va_arg(ap, int);
70   a7  = va_arg(ap, double);
71   a8  = va_arg(ap, int);
72   a9  = va_arg(ap, double);
73   a10 = va_arg(ap, char*);
74   
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*);
80   
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);
85   printf("\n");
86   return;
87 }
88 #endif /* LLC_SUPPORTS_VARARGS_FUNCTIONS */
89
90
91 void
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)
95 {
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);
100   printf("\n");
101   return;
102 }
103
104
105 int
106 main(int argc, char** argv)
107 {
108 #ifdef LLVM_CAN_PASS_STRUCTS_BY_VALUE
109   SmallStruct s1, s3, result;
110   BigStruct   s2;
111 #endif /* LLVM_CAN_PASS_STRUCTS_BY_VALUE */
112   
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");
116   
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 */
122   
123 #ifdef LLVM_CAN_PASS_STRUCTS_BY_VALUE
124   s1.c1 = 'a'; 
125   s1.c2 = 'b'; 
126   s1.c3 = 'c'; 
127   s1.c4 = 'd'; 
128   s1.n  = 111;
129   
130   s2.c1 = 'h'; 
131   s2.c2 = 'i'; 
132   s2.c3 = 'j'; 
133   s2.c4 = 'k'; 
134   s2.d1 = 1.1;
135   s2.d2 = 2.2;
136   s2.n  = 222;
137   s2.next = &s2;
138   
139   s3.c1 = 'w'; 
140   s3.c2 = 'x'; 
141   s3.c3 = 'y'; 
142   s3.c4 = 'z'; 
143   s3.n  = 333;
144   
145   result = printStructArgs(s1,
146                            1, 2.0, 'c', 4.0, "e",
147                            s2,
148                            6, 7.0, 'h', 9.0, "j",
149                            s3);
150   
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 */
154
155   return 0;
156 }