Fix struct layout some more
[tinycc.git] / tests / tcctest.c
blob9fcd7a49d15b03101d40e9b517841b9e206a4eef
1 /*
2 * TCC auto test program
3 */
4 #include "config.h"
6 #if GCC_MAJOR >= 3
8 /* Unfortunately, gcc version < 3 does not handle that! */
9 #define ALL_ISOC99
11 /* only gcc 3 handles _Bool correctly */
12 #define BOOL_ISOC99
14 /* gcc 2.95.3 does not handle correctly CR in strings or after strays */
15 #define CORRECT_CR_HANDLING
17 #endif
19 #if defined(_WIN32)
20 #define LONG_LONG_FORMAT "%lld"
21 #define ULONG_LONG_FORMAT "%llu"
22 #else
23 #define LONG_LONG_FORMAT "%Ld"
24 #define ULONG_LONG_FORMAT "%Lu"
25 #endif
27 // MinGW has 80-bit rather than 64-bit long double which isn't compatible with TCC or MSVC
28 #if defined(_WIN32) && defined(__GNUC__)
29 #define LONG_DOUBLE double
30 #define LONG_DOUBLE_LITERAL(x) x
31 #else
32 #define LONG_DOUBLE long double
33 #define LONG_DOUBLE_LITERAL(x) x ## L
34 #endif
36 /* deprecated and no longer supported in gcc 3.3 */
37 //#define ACCEPT_CR_IN_STRINGS
39 /* __VA_ARGS__ and __func__ support */
40 #define C99_MACROS
42 /* test various include syntaxes */
44 #define TCCLIB_INC <tcclib.h>
45 #define TCCLIB_INC1 <tcclib
46 #define TCCLIB_INC2 h>
47 #define TCCLIB_INC3 "tcclib.h"
49 #include TCCLIB_INC
51 #include TCCLIB_INC1.TCCLIB_INC2
53 #include TCCLIB_INC1.h>
55 #include TCCLIB_INC3
57 #include <tcclib.h>
59 #include "tcclib.h"
61 #include "tcctest.h"
63 /* Test two more ways to include a file named like a pp-number */
64 #define INC(name) <tests/name.h>
65 #define funnyname 42test.h
66 #define incdir tests/
67 #define incname < incdir funnyname >
68 #define __stringify(x) #x
69 #define stringify(x) __stringify(x)
70 #include INC(42test)
71 #include incname
72 #include stringify(funnyname)
74 void intdiv_test();
75 void string_test();
76 void expr_test();
77 void macro_test();
78 void recursive_macro_test();
79 void scope_test();
80 void forward_test();
81 void funcptr_test();
82 void loop_test();
83 void switch_test();
84 void goto_test();
85 void enum_test();
86 void typedef_test();
87 void struct_test();
88 void array_test();
89 void expr_ptr_test();
90 void bool_test();
91 void optimize_out();
92 void expr2_test();
93 void constant_expr_test();
94 void expr_cmp_test();
95 void char_short_test();
96 void init_test(void);
97 void compound_literal_test(void);
98 int kr_test();
99 void struct_assign_test(void);
100 void cast_test(void);
101 void bitfield_test(void);
102 void c99_bool_test(void);
103 void float_test(void);
104 void longlong_test(void);
105 void manyarg_test(void);
106 void stdarg_test(void);
107 void whitespace_test(void);
108 void relocation_test(void);
109 void old_style_function(void);
110 void alloca_test(void);
111 void c99_vla_test(int size1, int size2);
112 void sizeof_test(void);
113 void typeof_test(void);
114 void local_label_test(void);
115 void statement_expr_test(void);
116 void asm_test(void);
117 void builtin_test(void);
118 void weak_test(void);
119 void global_data_test(void);
120 void cmp_comparison_test(void);
121 void math_cmp_test(void);
122 void callsave_test(void);
123 void builtin_frame_address_test(void);
124 void attrib_test(void);
126 int fib(int n);
127 void num(int n);
128 void forward_ref(void);
129 int isid(int c);
131 /* Line joining happens before tokenization, so the following
132 must be parsed as ellipsis. */
133 void funny_line_continuation (int, ..\
134 . );
136 char via_volatile (char);
138 #define A 2
139 #define N 1234 + A
140 #define pf printf
141 #define M1(a, b) (a) + (b)
143 #define str\
144 (s) # s
145 #define glue(a, b) a ## b
146 #define xglue(a, b) glue(a, b)
147 #define HIGHLOW "hello"
148 #define LOW LOW ", world"
150 static int onetwothree = 123;
151 #define onetwothree4 onetwothree
152 #define onetwothree xglue(onetwothree,4)
154 #define min(a, b) ((a) < (b) ? (a) : (b))
156 #ifdef C99_MACROS
157 #define dprintf(level,...) printf(__VA_ARGS__)
158 #endif
160 /* gcc vararg macros */
161 #define dprintf1(level, fmt, args...) printf(fmt, ## args)
163 #define MACRO_NOARGS()
165 #define AAA 3
166 #undef AAA
167 #define AAA 4
169 #if 1
170 #define B3 1
171 #elif 1
172 #define B3 2
173 #elif 0
174 #define B3 3
175 #else
176 #define B3 4
177 #endif
179 #define __INT64_C(c) c ## LL
180 #define INT64_MIN (-__INT64_C(9223372036854775807)-1)
182 int qq(int x)
184 return x + 40;
186 #define qq(x) x
188 #define spin_lock(lock) do { } while (0)
189 #define wq_spin_lock spin_lock
190 #define TEST2() wq_spin_lock(a)
192 #define UINT_MAX ((unsigned) -1)
194 void intdiv_test(void)
196 printf("18/21=%u\n", 18/21);
197 printf("18%%21=%u\n", 18%21);
198 printf("41/21=%u\n", 41/21);
199 printf("41%%21=%u\n", 41%21);
200 printf("42/21=%u\n", 42/21);
201 printf("42%%21=%u\n", 42%21);
202 printf("43/21=%u\n", 43/21);
203 printf("43%%21=%u\n", 43%21);
204 printf("126/21=%u\n", 126/21);
205 printf("126%%21=%u\n", 126%21);
206 printf("131/21=%u\n", 131/21);
207 printf("131%%21=%u\n", 131%21);
208 printf("(UINT_MAX/2+3)/2=%u\n", (UINT_MAX/2+3)/2);
209 printf("(UINT_MAX/2+3)%%2=%u\n", (UINT_MAX/2+3)%2);
211 printf("18/-21=%u\n", 18/-21);
212 printf("18%%-21=%u\n", 18%-21);
213 printf("41/-21=%u\n", 41/-21);
214 printf("41%%-21=%u\n", 41%-21);
215 printf("42/-21=%u\n", 42/-21);
216 printf("42%%-21=%u\n", 42%-21);
217 printf("43/-21=%u\n", 43/-21);
218 printf("43%%-21=%u\n", 43%-21);
219 printf("126/-21=%u\n", 126/-21);
220 printf("126%%-21=%u\n", 126%-21);
221 printf("131/-21=%u\n", 131/-21);
222 printf("131%%-21=%u\n", 131%-21);
223 printf("(UINT_MAX/2+3)/-2=%u\n", (UINT_MAX/2+3)/-2);
224 printf("(UINT_MAX/2+3)%%-2=%u\n", (UINT_MAX/2+3)%-2);
226 printf("-18/21=%u\n", -18/21);
227 printf("-18%%21=%u\n", -18%21);
228 printf("-41/21=%u\n", -41/21);
229 printf("-41%%21=%u\n", -41%21);
230 printf("-42/21=%u\n", -42/21);
231 printf("-42%%21=%u\n", -42%21);
232 printf("-43/21=%u\n", -43/21);
233 printf("-43%%21=%u\n", -43%21);
234 printf("-126/21=%u\n", -126/21);
235 printf("-126%%21=%u\n", -126%21);
236 printf("-131/21=%u\n", -131/21);
237 printf("-131%%21=%u\n", -131%21);
238 printf("-(UINT_MAX/2+3)/2=%u\n", (0-(UINT_MAX/2+3))/2);
239 printf("-(UINT_MAX/2+3)%%2=%u\n", (0-(UINT_MAX/2+3))%2);
241 printf("-18/-21=%u\n", -18/-21);
242 printf("-18%%-21=%u\n", -18%-21);
243 printf("-41/-21=%u\n", -41/-21);
244 printf("-41%%-21=%u\n", -41%-21);
245 printf("-42/-21=%u\n", -42/-21);
246 printf("-42%%-21=%u\n", -42%-21);
247 printf("-43/-21=%u\n", -43/-21);
248 printf("-43%%-21=%u\n", -43%-21);
249 printf("-126/-21=%u\n", -126/-21);
250 printf("-126%%-21=%u\n", -126%-21);
251 printf("-131/-21=%u\n", -131/-21);
252 printf("-131%%-21=%u\n", -131%-21);
253 printf("-(UINT_MAX/2+3)/-2=%u\n", (0-(UINT_MAX/2+3))/-2);
254 printf("-(UINT_MAX/2+3)%%-2=%u\n", (0-(UINT_MAX/2+3))%-2);
257 void macro_test(void)
259 printf("macro:\n");\f\v
260 pf("N=%d\n", N);
261 printf("aaa=%d\n", AAA);
263 printf("min=%d\n", min(1, min(2, -1)));
265 printf("s1=%s\n", glue(HIGH, LOW));
266 printf("s2=%s\n", xglue(HIGH, LOW));
267 printf("s3=%s\n", str("c"));
268 printf("s4=%s\n", str(a1));
269 printf("B3=%d\n", B3);
271 printf("onetwothree=%d\n", onetwothree);
273 #ifdef A
274 printf("A defined\n");
275 #endif
276 #ifdef B
277 printf("B defined\n");
278 #endif
279 #ifdef A
280 printf("A defined\n");
281 #else
282 printf("A not defined\n");
283 #endif
284 #ifdef B
285 printf("B defined\n");
286 #else
287 printf("B not defined\n");
288 #endif
290 #ifdef A
291 printf("A defined\n");
292 #ifdef B
293 printf("B1 defined\n");
294 #else
295 printf("B1 not defined\n");
296 #endif
297 #else
298 printf("A not defined\n");
299 #ifdef B
300 printf("B2 defined\n");
301 #else
302 printf("B2 not defined\n");
303 #endif
304 #endif
306 #if 1+1
307 printf("test true1\n");
308 #endif
309 #if 0
310 printf("test true2\n");
311 #endif
312 #if 1-1
313 printf("test true3\n");
314 #endif
315 #if defined(A)
316 printf("test trueA\n");
317 #endif
318 #if defined(B)
319 printf("test trueB\n");
320 #endif
322 #if 0
323 printf("test 0\n");
324 #elif 0
325 printf("test 1\n");
326 #elif 2
327 printf("test 2\n");
328 #else
329 printf("test 3\n");
330 #endif
332 MACRO_NOARGS();
334 #ifdef __LINE__
335 printf("__LINE__ defined\n");
336 #endif
338 printf("__LINE__=%d __FILE__=%s\n",
339 __LINE__, __FILE__);
340 #if 0
341 #line 200
342 printf("__LINE__=%d __FILE__=%s\n",
343 __LINE__, __FILE__);
344 #line 203 "test"
345 printf("__LINE__=%d __FILE__=%s\n",
346 __LINE__, __FILE__);
347 #line 227 "tcctest.c"
348 #endif
350 /* not strictly preprocessor, but we test it there */
351 #ifdef C99_MACROS
352 printf("__func__ = %s\n", __func__);
353 dprintf(1, "vaarg=%d\n", 1);
354 #endif
355 dprintf1(1, "vaarg1\n");
356 dprintf1(1, "vaarg1=%d\n", 2);
357 dprintf1(1, "vaarg1=%d %d\n", 1, 2);
359 /* gcc extension */
360 printf("func='%s'\n", __FUNCTION__);
362 /* complicated macros in glibc */
363 printf("INT64_MIN=" LONG_LONG_FORMAT "\n", INT64_MIN);
365 int a;
366 a = 1;
367 glue(a+, +);
368 printf("a=%d\n", a);
369 glue(a <, <= 2);
370 printf("a=%d\n", a);
373 /* macro function with argument outside the macro string */
374 #define MF_s MF_hello
375 #define MF_hello(msg) printf("%s\n",msg)
377 #define MF_t printf("tralala\n"); MF_hello
379 MF_s("hi");
380 MF_t("hi");
382 /* test macro substituion inside args (should not eat stream) */
383 printf("qq=%d\n", qq(qq)(2));
385 /* test zero argument case. NOTE: gcc 2.95.x does not accept a
386 null argument without a space. gcc 3.2 fixes that. */
388 #define qq1(x) 1
389 printf("qq1=%d\n", qq1( ));
391 /* comment with stray handling *\
393 /* this is a valid *\/ comment */
394 /* this is a valid comment *\*/
395 // this is a valid\
396 comment
398 /* test function macro substitution when the function name is
399 substituted */
400 TEST2();
402 /* And again when the name and parenthes are separated by a
403 comment. */
404 TEST2 /* the comment */ ();
406 printf("%s\n", get_basefile_from_header());
407 printf("%s\n", __BASE_FILE__);
408 printf("%s\n", get_file_from_header());
409 printf("%s\n", __FILE__);
411 /* Check that funnily named include was in fact included */
412 have_included_42test_h = 1;
413 have_included_42test_h_second = 1;
414 have_included_42test_h_third = 1;
418 static void print_num(char *fn, int line, int num) {
419 printf("fn %s, line %d, num %d\n", fn, line, num);
422 void recursive_macro_test(void)
425 #define ELF32_ST_TYPE(val) ((val) & 0xf)
426 #define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
427 #define STB_WEAK 2 /* Weak symbol */
428 #define ELFW(type) ELF##32##_##type
429 printf("%d\n", ELFW(ST_INFO)(STB_WEAK, ELFW(ST_TYPE)(123)));
431 #define WRAP(x) x
433 #define print_num(x) print_num(__FILE__,__LINE__,x)
434 print_num(123);
435 WRAP(print_num(123));
436 WRAP(WRAP(print_num(123)));
438 static struct recursive_macro { int rm_field; } G;
439 #define rm_field (G.rm_field)
440 printf("rm_field = %d\n", rm_field);
441 printf("rm_field = %d\n", WRAP(rm_field));
442 WRAP((printf("rm_field = %d %d\n", rm_field, WRAP(rm_field))));
445 int op(a,b)
447 return a / b;
450 int ret(a)
452 if (a == 2)
453 return 1;
454 if (a == 3)
455 return 2;
456 return 0;
459 void ps(const char *s)
461 int c;
462 while (1) {
463 c = *s;
464 if (c == 0)
465 break;
466 printf("%c", c);
467 s++;
471 const char foo1_string[] = "\
472 bar\n\
473 test\14\
476 void string_test()
478 unsigned int b;
479 printf("string:\n");
480 printf("\141\1423\143\n");/* dezdez test */
481 printf("\x41\x42\x43\x3a\n");
482 printf("c=%c\n", 'r');
483 printf("wc=%C 0x%lx %C\n", L'a', L'\x1234', L'c');
484 printf("foo1_string='%s'\n", foo1_string);
485 #if 0
486 printf("wstring=%S\n", L"abc");
487 printf("wstring=%S\n", L"abc" L"def" "ghi");
488 printf("'\\377'=%d '\\xff'=%d\n", '\377', '\xff');
489 printf("L'\\377'=%d L'\\xff'=%d\n", L'\377', L'\xff');
490 #endif
491 ps("test\n");
492 b = 32;
493 while ((b = b + 1) < 96) {
494 printf("%c", b);
496 printf("\n");
497 printf("fib=%d\n", fib(33));
498 b = 262144;
499 while (b != 0x80000000) {
500 num(b);
501 b = b * 2;
505 void loop_test()
507 int i;
508 i = 0;
509 while (i < 10)
510 printf("%d", i++);
511 printf("\n");
512 for(i = 0; i < 10;i++)
513 printf("%d", i);
514 printf("\n");
515 i = 0;
516 do {
517 printf("%d", i++);
518 } while (i < 10);
519 printf("\n");
521 char count = 123;
522 /* c99 for loop init test */
523 for (size_t count = 1; count < 3; count++)
524 printf("count=%d\n", count);
525 printf("count = %d\n", count);
527 /* break/continue tests */
528 i = 0;
529 while (1) {
530 if (i == 6)
531 break;
532 i++;
533 if (i == 3)
534 continue;
535 printf("%d", i);
537 printf("\n");
539 /* break/continue tests */
540 i = 0;
541 do {
542 if (i == 6)
543 break;
544 i++;
545 if (i == 3)
546 continue;
547 printf("%d", i);
548 } while(1);
549 printf("\n");
551 for(i = 0;i < 10;i++) {
552 if (i == 3)
553 continue;
554 printf("%d", i);
556 printf("\n");
559 typedef int typedef_and_label;
561 void goto_test()
563 int i;
564 static void *label_table[3] = { &&label1, &&label2, &&label3 };
566 printf("goto:\n");
567 i = 0;
568 /* This needs to parse as label, not as start of decl. */
569 typedef_and_label:
570 s_loop:
571 if (i >= 10)
572 goto s_end;
573 printf("%d", i);
574 i++;
575 goto s_loop;
576 s_end:
577 printf("\n");
579 /* we also test computed gotos (GCC extension) */
580 for(i=0;i<3;i++) {
581 goto *label_table[i];
582 label1:
583 printf("label1\n");
584 goto next;
585 label2:
586 printf("label2\n");
587 goto next;
588 label3:
589 printf("label3\n");
590 next: ;
594 enum {
596 E1 = 2,
597 E2 = 4,
602 enum test {
603 E5 = 1000,
606 struct S_enum {
607 enum {E6 = 42, E7, E8} e:8;
610 enum ELong {
611 /* This is either 0 on L32 machines, or a large number
612 on L64 machines. We should be able to store this. */
613 EL_large = (unsigned long)0xf000 << 32,
616 enum { BIASU = -1U<<31 };
617 enum { BIASS = -1 << 31 };
619 static int getint(int i)
621 if (i)
622 return 0;
623 else
624 return (int)(-1U << 31);
627 void enum_test()
629 enum test b1;
630 /* The following should give no warning */
631 unsigned *p = &b1;
632 struct S_enum s = {E7};
633 printf("enum: %d\n", s.e);
634 printf("enum:\n%d %d %d %d %d %d\n",
635 E0, E1, E2, E3, E4, E5);
636 b1 = 1;
637 printf("b1=%d\n", b1);
638 printf("enum large: %ld\n", EL_large);
640 if (getint(0) == BIASU)
641 printf("enum unsigned: ok\n");
642 else
643 printf("enum unsigned: wrong\n");
644 if (getint(0) == BIASS)
645 printf("enum unsigned: ok\n");
646 else
647 printf("enum unsigned: wrong\n");
650 typedef int *my_ptr;
652 typedef int mytype1;
653 typedef int mytype2;
655 void typedef_test()
657 my_ptr a;
658 mytype1 mytype2;
659 int b;
661 a = &b;
662 *a = 1234;
663 printf("typedef:\n");
664 printf("a=%d\n", *a);
665 mytype2 = 2;
666 printf("mytype2=%d\n", mytype2);
669 void forward_test()
671 printf("forward:\n");
672 forward_ref();
673 forward_ref();
677 void forward_ref(void)
679 printf("forward ok\n");
682 typedef struct struct1 {
683 int f1;
684 int f2, f3;
685 union union1 {
686 int v1;
687 int v2;
688 } u;
689 char str[3];
690 } struct1;
692 struct struct2 {
693 int a;
694 char b;
697 union union2 {
698 int w1;
699 int w2;
702 struct struct1 st1, st2;
704 struct empty_mem {
705 /* nothing */ ;
706 int x;
709 int main(int argc, char **argv)
711 string_test();
712 expr_test();
713 macro_test();
714 recursive_macro_test();
715 scope_test();
716 forward_test();
717 funcptr_test();
718 loop_test();
719 switch_test();
720 goto_test();
721 enum_test();
722 typedef_test();
723 struct_test();
724 array_test();
725 expr_ptr_test();
726 bool_test();
727 optimize_out();
728 expr2_test();
729 constant_expr_test();
730 expr_cmp_test();
731 char_short_test();
732 init_test();
733 compound_literal_test();
734 kr_test();
735 struct_assign_test();
736 cast_test();
737 bitfield_test();
738 c99_bool_test();
739 float_test();
740 longlong_test();
741 manyarg_test();
742 stdarg_test();
743 whitespace_test();
744 relocation_test();
745 old_style_function();
746 alloca_test();
747 c99_vla_test(5, 2);
748 sizeof_test();
749 typeof_test();
750 statement_expr_test();
751 local_label_test();
752 asm_test();
753 builtin_test();
754 #ifndef _WIN32
755 weak_test();
756 #endif
757 global_data_test();
758 cmp_comparison_test();
759 math_cmp_test();
760 callsave_test();
761 builtin_frame_address_test();
762 intdiv_test();
763 if (via_volatile (42) != 42)
764 printf ("via_volatile broken\n");
765 attrib_test();
766 return 0;
769 int tab[3];
770 int tab2[3][2];
772 int g;
774 void f1(g)
776 printf("g1=%d\n", g);
779 void scope_test()
781 printf("scope:\n");
782 g = 2;
783 f1(1);
784 printf("g2=%d\n", g);
786 int g;
787 g = 3;
788 printf("g3=%d\n", g);
790 int g;
791 g = 4;
792 printf("g4=%d\n", g);
795 printf("g5=%d\n", g);
798 void array_test()
800 int i, j, a[4];
802 printf("array:\n");
803 printf("sizeof(a) = %d\n", sizeof(a));
804 printf("sizeof(\"a\") = %d\n", sizeof("a"));
805 #ifdef C99_MACROS
806 printf("sizeof(__func__) = %d\n", sizeof(__func__));
807 #endif
808 printf("sizeof tab %d\n", sizeof(tab));
809 printf("sizeof tab2 %d\n", sizeof tab2);
810 tab[0] = 1;
811 tab[1] = 2;
812 tab[2] = 3;
813 printf("%d %d %d\n", tab[0], tab[1], tab[2]);
814 for(i=0;i<3;i++)
815 for(j=0;j<2;j++)
816 tab2[i][j] = 10 * i + j;
817 for(i=0;i<3*2;i++) {
818 printf(" %3d", ((int *)tab2)[i]);
820 printf("\n");
821 printf("sizeof(size_t)=%d\n", sizeof(size_t));
822 printf("sizeof(ptrdiff_t)=%d\n", sizeof(ptrdiff_t));
825 void expr_test()
827 int a, b;
828 a = 0;
829 printf("%d\n", a += 1);
830 printf("%d\n", a -= 2);
831 printf("%d\n", a *= 31232132);
832 printf("%d\n", a /= 4);
833 printf("%d\n", a %= 20);
834 printf("%d\n", a &= 6);
835 printf("%d\n", a ^= 7);
836 printf("%d\n", a |= 8);
837 printf("%d\n", a >>= 3);
838 printf("%d\n", a <<= 4);
840 a = 22321;
841 b = -22321;
842 printf("%d\n", a + 1);
843 printf("%d\n", a - 2);
844 printf("%d\n", a * 312);
845 printf("%d\n", a / 4);
846 printf("%d\n", b / 4);
847 printf("%d\n", (unsigned)b / 4);
848 printf("%d\n", a % 20);
849 printf("%d\n", b % 20);
850 printf("%d\n", (unsigned)b % 20);
851 printf("%d\n", a & 6);
852 printf("%d\n", a ^ 7);
853 printf("%d\n", a | 8);
854 printf("%d\n", a >> 3);
855 printf("%d\n", b >> 3);
856 printf("%d\n", (unsigned)b >> 3);
857 printf("%d\n", a << 4);
858 printf("%d\n", ~a);
859 printf("%d\n", -a);
860 printf("%d\n", +a);
862 printf("%d\n", 12 + 1);
863 printf("%d\n", 12 - 2);
864 printf("%d\n", 12 * 312);
865 printf("%d\n", 12 / 4);
866 printf("%d\n", 12 % 20);
867 printf("%d\n", 12 & 6);
868 printf("%d\n", 12 ^ 7);
869 printf("%d\n", 12 | 8);
870 printf("%d\n", 12 >> 2);
871 printf("%d\n", 12 << 4);
872 printf("%d\n", ~12);
873 printf("%d\n", -12);
874 printf("%d\n", +12);
875 printf("%d %d %d %d\n",
876 isid('a'),
877 isid('g'),
878 isid('T'),
879 isid('('));
882 int isid(int c)
884 return (c >= 'a' & c <= 'z') | (c >= 'A' & c <= 'Z') | c == '_';
887 /**********************/
889 int vstack[10], *vstack_ptr;
891 void vpush(int vt, int vc)
893 *vstack_ptr++ = vt;
894 *vstack_ptr++ = vc;
897 void vpop(int *ft, int *fc)
899 *fc = *--vstack_ptr;
900 *ft = *--vstack_ptr;
903 void expr2_test()
905 int a, b;
907 printf("expr2:\n");
908 vstack_ptr = vstack;
909 vpush(1432432, 2);
910 vstack_ptr[-2] &= ~0xffffff80;
911 vpop(&a, &b);
912 printf("res= %d %d\n", a, b);
915 void constant_expr_test()
917 int a;
918 printf("constant_expr:\n");
919 a = 3;
920 printf("%d\n", a * 16);
921 printf("%d\n", a * 1);
922 printf("%d\n", a + 0);
925 int tab4[10];
927 void expr_ptr_test()
929 int *p, *q;
930 int i = -1;
932 printf("expr_ptr:\n");
933 p = tab4;
934 q = tab4 + 10;
935 printf("diff=%d\n", q - p);
936 p++;
937 printf("inc=%d\n", p - tab4);
938 p--;
939 printf("dec=%d\n", p - tab4);
940 ++p;
941 printf("inc=%d\n", p - tab4);
942 --p;
943 printf("dec=%d\n", p - tab4);
944 printf("add=%d\n", p + 3 - tab4);
945 printf("add=%d\n", 3 + p - tab4);
947 /* check if 64bit support is ok */
948 q = p = 0;
949 q += i;
950 printf("%p %p %ld\n", q, p, p-q);
951 printf("%d %d %d %d %d %d\n",
952 p == q, p != q, p < q, p <= q, p >= q, p > q);
953 i = 0xf0000000;
954 p += i;
955 printf("%p %p %ld\n", q, p, p-q);
956 printf("%d %d %d %d %d %d\n",
957 p == q, p != q, p < q, p <= q, p >= q, p > q);
958 p = (int *)((char *)p + 0xf0000000);
959 printf("%p %p %ld\n", q, p, p-q);
960 printf("%d %d %d %d %d %d\n",
961 p == q, p != q, p < q, p <= q, p >= q, p > q);
962 p += 0xf0000000;
963 printf("%p %p %ld\n", q, p, p-q);
964 printf("%d %d %d %d %d %d\n",
965 p == q, p != q, p < q, p <= q, p >= q, p > q);
967 struct size12 {
968 int i, j, k;
970 struct size12 s[2], *sp = s;
971 int i, j;
972 sp->i = 42;
973 sp++;
974 j = -1;
975 printf("%d\n", sp[j].i);
977 #ifdef __LP64__
978 i = 1;
979 p = (int*)0x100000000UL + i;
980 i = ((long)p) >> 32;
981 printf("largeptr: %p %d\n", p, i);
982 #endif
985 void expr_cmp_test()
987 int a, b;
988 printf("constant_expr:\n");
989 a = -1;
990 b = 1;
991 printf("%d\n", a == a);
992 printf("%d\n", a != a);
994 printf("%d\n", a < b);
995 printf("%d\n", a <= b);
996 printf("%d\n", a <= a);
997 printf("%d\n", b >= a);
998 printf("%d\n", a >= a);
999 printf("%d\n", b > a);
1001 printf("%d\n", (unsigned)a < b);
1002 printf("%d\n", (unsigned)a <= b);
1003 printf("%d\n", (unsigned)a <= a);
1004 printf("%d\n", (unsigned)b >= a);
1005 printf("%d\n", (unsigned)a >= a);
1006 printf("%d\n", (unsigned)b > a);
1009 struct empty {
1012 struct aligntest1 {
1013 char a[10];
1016 struct aligntest2 {
1017 int a;
1018 char b[10];
1021 struct aligntest3 {
1022 double a, b;
1025 struct aligntest4 {
1026 double a[0];
1029 struct __attribute__((aligned(16))) aligntest5
1031 int i;
1033 struct aligntest6
1035 int i;
1036 } __attribute__((aligned(16)));
1037 struct aligntest7
1039 int i;
1041 struct aligntest5 altest5[2];
1042 struct aligntest6 altest6[2];
1043 int pad1;
1044 /* altest7 is correctly aligned to 16 bytes also with TCC,
1045 but __alignof__ returns the wrong result (4) because we
1046 can't store the alignment yet when specified on symbols
1047 directly (it's stored in the type so we'd need to make
1048 a copy of it).
1049 struct aligntest7 altest7[2] __attribute__((aligned(16)));*/
1051 struct Large {
1052 unsigned long flags;
1053 union {
1054 void *u1;
1055 int *u2;
1058 struct {
1059 union {
1060 unsigned long index;
1061 void *freelist;
1063 union {
1064 unsigned long counters;
1065 struct {
1066 int bla;
1071 union {
1072 struct {
1073 long u3;
1074 long u4;
1076 void *u5;
1077 struct {
1078 unsigned long compound_head;
1079 unsigned int compound_dtor;
1080 unsigned int compound_order;
1083 } __attribute__((aligned(2 * sizeof(long))));
1085 void struct_test()
1087 struct1 *s;
1088 union union2 u;
1089 struct Large ls;
1091 printf("struct:\n");
1092 printf("sizes: %d %d %d %d\n",
1093 sizeof(struct struct1),
1094 sizeof(struct struct2),
1095 sizeof(union union1),
1096 sizeof(union union2));
1097 printf("offsets: %d\n", (int)((char*)&st1.u.v1 - (char*)&st1));
1098 st1.f1 = 1;
1099 st1.f2 = 2;
1100 st1.f3 = 3;
1101 printf("st1: %d %d %d\n",
1102 st1.f1, st1.f2, st1.f3);
1103 st1.u.v1 = 1;
1104 st1.u.v2 = 2;
1105 printf("union1: %d\n", st1.u.v1);
1106 u.w1 = 1;
1107 u.w2 = 2;
1108 printf("union2: %d\n", u.w1);
1109 s = &st2;
1110 s->f1 = 3;
1111 s->f2 = 2;
1112 s->f3 = 1;
1113 printf("st2: %d %d %d\n",
1114 s->f1, s->f2, s->f3);
1115 printf("str_addr=%x\n", (int)st1.str - (int)&st1.f1);
1117 /* align / size tests */
1118 printf("aligntest1 sizeof=%d alignof=%d\n",
1119 sizeof(struct aligntest1), __alignof__(struct aligntest1));
1120 printf("aligntest2 sizeof=%d alignof=%d\n",
1121 sizeof(struct aligntest2), __alignof__(struct aligntest2));
1122 printf("aligntest3 sizeof=%d alignof=%d\n",
1123 sizeof(struct aligntest3), __alignof__(struct aligntest3));
1124 printf("aligntest4 sizeof=%d alignof=%d\n",
1125 sizeof(struct aligntest4), __alignof__(struct aligntest4));
1126 printf("aligntest5 sizeof=%d alignof=%d\n",
1127 sizeof(struct aligntest5), __alignof__(struct aligntest5));
1128 printf("aligntest6 sizeof=%d alignof=%d\n",
1129 sizeof(struct aligntest6), __alignof__(struct aligntest6));
1130 printf("aligntest7 sizeof=%d alignof=%d\n",
1131 sizeof(struct aligntest7), __alignof__(struct aligntest7));
1132 printf("altest5 sizeof=%d alignof=%d\n",
1133 sizeof(altest5), __alignof__(altest5));
1134 printf("altest6 sizeof=%d alignof=%d\n",
1135 sizeof(altest6), __alignof__(altest6));
1136 /*printf("altest7 sizeof=%d alignof=%d\n",
1137 sizeof(altest7), __alignof__(altest7));*/
1139 /* empty structures (GCC extension) */
1140 printf("sizeof(struct empty) = %d\n", sizeof(struct empty));
1141 printf("alignof(struct empty) = %d\n", __alignof__(struct empty));
1143 printf("Large: sizeof=%d\n", sizeof(ls));
1144 memset(&ls, 0, sizeof(ls));
1145 ls.compound_head = 42;
1146 printf("Large: offsetof(compound_head)=%d\n", (int)((char*)&ls.compound_head - (char*)&ls));
1149 /* XXX: depend on endianness */
1150 void char_short_test()
1152 int var1, var2;
1154 printf("char_short:\n");
1156 var1 = 0x01020304;
1157 var2 = 0xfffefdfc;
1158 printf("s8=%d %d\n",
1159 *(char *)&var1, *(char *)&var2);
1160 printf("u8=%d %d\n",
1161 *(unsigned char *)&var1, *(unsigned char *)&var2);
1162 printf("s16=%d %d\n",
1163 *(short *)&var1, *(short *)&var2);
1164 printf("u16=%d %d\n",
1165 *(unsigned short *)&var1, *(unsigned short *)&var2);
1166 printf("s32=%d %d\n",
1167 *(int *)&var1, *(int *)&var2);
1168 printf("u32=%d %d\n",
1169 *(unsigned int *)&var1, *(unsigned int *)&var2);
1170 *(char *)&var1 = 0x08;
1171 printf("var1=%x\n", var1);
1172 *(short *)&var1 = 0x0809;
1173 printf("var1=%x\n", var1);
1174 *(int *)&var1 = 0x08090a0b;
1175 printf("var1=%x\n", var1);
1178 /******************/
1180 typedef struct Sym {
1181 int v;
1182 int t;
1183 int c;
1184 struct Sym *next;
1185 struct Sym *prev;
1186 } Sym;
1188 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
1189 #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
1191 static int toupper1(int a)
1193 return TOUPPER(a);
1196 static unsigned int calc_vm_flags(unsigned int prot)
1198 unsigned int prot_bits;
1199 /* This used to segfault in some revisions: */
1200 prot_bits = ((0x1==0x00000001)?(prot&0x1):(prot&0x1)?0x00000001:0);
1201 return prot_bits;
1204 void bool_test()
1206 int *s, a, b, t, f, i;
1208 a = 0;
1209 s = (void*)0;
1210 printf("!s=%d\n", !s);
1212 if (!s || !s[0])
1213 a = 1;
1214 printf("a=%d\n", a);
1216 printf("a=%d %d %d\n", 0 || 0, 0 || 1, 1 || 1);
1217 printf("a=%d %d %d\n", 0 && 0, 0 && 1, 1 && 1);
1218 printf("a=%d %d\n", 1 ? 1 : 0, 0 ? 1 : 0);
1219 #if 1 && 1
1220 printf("a1\n");
1221 #endif
1222 #if 1 || 0
1223 printf("a2\n");
1224 #endif
1225 #if 1 ? 0 : 1
1226 printf("a3\n");
1227 #endif
1228 #if 0 ? 0 : 1
1229 printf("a4\n");
1230 #endif
1232 a = 4;
1233 printf("b=%d\n", a + (0 ? 1 : a / 2));
1235 /* test register spilling */
1236 a = 10;
1237 b = 10;
1238 a = (a + b) * ((a < b) ?
1239 ((b - a) * (a - b)): a + b);
1240 printf("a=%d\n", a);
1242 /* test complex || or && expressions */
1243 t = 1;
1244 f = 0;
1245 a = 32;
1246 printf("exp=%d\n", f == (32 <= a && a <= 3));
1247 printf("r=%d\n", (t || f) + (t && f));
1249 /* test ? : cast */
1251 int aspect_on;
1252 int aspect_native = 65536;
1253 double bfu_aspect = 1.0;
1254 int aspect;
1255 for(aspect_on = 0; aspect_on < 2; aspect_on++) {
1256 aspect=aspect_on?(aspect_native*bfu_aspect+0.5):65535UL;
1257 printf("aspect=%d\n", aspect);
1261 /* test ? : GCC extension */
1263 static int v1 = 34 ? : -1; /* constant case */
1264 static int v2 = 0 ? : -1; /* constant case */
1265 int a = 30;
1267 printf("%d %d\n", v1, v2);
1268 printf("%d %d\n", a - 30 ? : a * 2, a + 1 ? : a * 2);
1271 /* again complex expression */
1272 for(i=0;i<256;i++) {
1273 if (toupper1 (i) != TOUPPER (i))
1274 printf("error %d\n", i);
1276 printf ("bits = 0x%x\n", calc_vm_flags (0x1));
1279 extern int undefined_function(void);
1280 extern int defined_function(void);
1282 static inline void refer_to_undefined(void)
1284 undefined_function();
1287 void optimize_out(void)
1289 int i = 0 ? undefined_function() : defined_function();
1290 printf ("oo:%d\n", i);
1291 int j = 1 ? defined_function() : undefined_function();
1292 printf ("oo:%d\n", j);
1293 if (0)
1294 printf("oo:%d\n", undefined_function());
1295 else
1296 printf("oo:%d\n", defined_function());
1297 if (1)
1298 printf("oo:%d\n", defined_function());
1299 else
1300 printf("oo:%d\n", undefined_function());
1301 while (1) {
1302 printf("oow:%d\n", defined_function());
1303 break;
1304 printf("oow:%d\n", undefined_function());
1306 j = 1;
1307 /* Following is a switch without {} block intentionally. */
1308 switch (j)
1309 case 1: break;
1310 printf ("oos:%d\n", defined_function());
1311 /* The following break shouldn't lead to disabled code after
1312 the while. */
1313 while (1)
1314 break;
1315 printf ("ool1:%d\n", defined_function());
1316 /* Same for the other types of loops. */
1318 break;
1319 while (1);
1320 printf ("ool2:%d\n", defined_function());
1321 for (;;)
1322 break;
1323 printf ("ool3:%d\n", defined_function());
1324 /* Normal {} blocks without controlling statements
1325 shouldn't reactivate code emission */
1326 while (1) {
1328 break;
1330 printf ("ool4:%d\n", undefined_function());
1332 j = 1;
1333 while (j) {
1334 if (j == 0)
1335 break; /* this break shouldn't disable code outside the if. */
1336 printf("ool5:%d\n", defined_function());
1337 j--;
1340 j = 1;
1341 while (j) {
1342 if (1)
1343 j--;
1344 else
1345 breakhere: break;
1346 printf("ool6:%d\n", defined_function());
1347 goto breakhere;
1350 /* Test that constants in logical && are optimized: */
1351 i = 0 && undefined_function();
1352 i = defined_function() && 0 && undefined_function();
1353 if (0 && undefined_function())
1354 undefined_function();
1355 if (defined_function() && 0)
1356 undefined_function();
1357 if (0 && 0)
1358 undefined_function();
1359 if (defined_function() && 0 && undefined_function())
1360 undefined_function();
1361 /* The same for || : */
1362 i = 1 || undefined_function();
1363 i = defined_function() || 1 || undefined_function();
1364 if (1 || undefined_function())
1366 else
1367 undefined_function();
1368 if (defined_function() || 1)
1370 else
1371 undefined_function();
1372 if (1 || 1)
1374 else
1375 undefined_function();
1376 if (defined_function() || 1 || undefined_function())
1378 else
1379 undefined_function();
1381 if (defined_function() && 0)
1382 refer_to_undefined();
1384 if (1)
1385 return;
1386 printf ("oor:%d\n", undefined_function());
1389 int defined_function(void)
1391 static int i = 40;
1392 return i++;
1395 /* GCC accepts that */
1396 static int tab_reinit[];
1397 static int tab_reinit[10];
1399 //int cinit1; /* a global variable can be defined several times without error ! */
1400 int cinit1;
1401 int cinit1;
1402 int cinit1 = 0;
1403 int *cinit2 = (int []){3, 2, 1};
1405 void compound_literal_test(void)
1407 int *p, i;
1408 char *q, *q3;
1410 printf("compound_test:\n");
1412 p = (int []){1, 2, 3};
1413 for(i=0;i<3;i++)
1414 printf(" %d", p[i]);
1415 printf("\n");
1417 for(i=0;i<3;i++)
1418 printf("%d", cinit2[i]);
1419 printf("\n");
1421 q = "tralala1";
1422 printf("q1=%s\n", q);
1424 q = (char *){ "tralala2" };
1425 printf("q2=%s\n", q);
1427 q3 = (char *){ q };
1428 printf("q3=%s\n", q3);
1430 q = (char []){ "tralala3" };
1431 printf("q4=%s\n", q);
1433 #ifdef ALL_ISOC99
1434 p = (int []){1, 2, cinit1 + 3};
1435 for(i=0;i<3;i++)
1436 printf(" %d", p[i]);
1437 printf("\n");
1439 for(i=0;i<3;i++) {
1440 p = (int []){1, 2, 4 + i};
1441 printf("%d %d %d\n",
1442 p[0],
1443 p[1],
1444 p[2]);
1446 #endif
1449 /* K & R protos */
1451 kr_func1(a, b)
1453 return a + b;
1456 int kr_func2(a, b)
1458 return a + b;
1461 kr_test()
1463 printf("kr_test:\n");
1464 printf("func1=%d\n", kr_func1(3, 4));
1465 printf("func2=%d\n", kr_func2(3, 4));
1466 return 0;
1469 void num(int n)
1471 char *tab, *p;
1472 tab = (char*)malloc(20);
1473 p = tab;
1474 while (1) {
1475 *p = 48 + (n % 10);
1476 p++;
1477 n = n / 10;
1478 if (n == 0)
1479 break;
1481 while (p != tab) {
1482 p--;
1483 printf("%c", *p);
1485 printf("\n");
1486 free(tab);
1489 /* structure assignment tests */
1490 struct structa1 {
1491 int f1;
1492 char f2;
1495 struct structa1 ssta1;
1497 void struct_assign_test1(struct structa1 s1, int t, float f)
1499 printf("%d %d %d %f\n", s1.f1, s1.f2, t, f);
1502 struct structa1 struct_assign_test2(struct structa1 s1, int t)
1504 s1.f1 += t;
1505 s1.f2 -= t;
1506 return s1;
1509 void struct_assign_test(void)
1511 struct S {
1512 struct structa1 lsta1, lsta2;
1513 int i;
1514 } s, *ps;
1516 ps = &s;
1517 ps->i = 4;
1518 #if 0
1519 printf("struct_assign_test:\n");
1521 s.lsta1.f1 = 1;
1522 s.lsta1.f2 = 2;
1523 printf("%d %d\n", s.lsta1.f1, s.lsta1.f2);
1524 s.lsta2 = s.lsta1;
1525 printf("%d %d\n", s.lsta2.f1, s.lsta2.f2);
1526 #else
1527 s.lsta2.f1 = 1;
1528 s.lsta2.f2 = 2;
1529 #endif
1530 struct_assign_test1(ps->lsta2, 3, 4.5);
1532 printf("before call: %d %d\n", s.lsta2.f1, s.lsta2.f2);
1533 ps->lsta2 = struct_assign_test2(ps->lsta2, ps->i);
1534 printf("after call: %d %d\n", ps->lsta2.f1, ps->lsta2.f2);
1536 static struct {
1537 void (*elem)();
1538 } t[] = {
1539 /* XXX: we should allow this even without braces */
1540 { struct_assign_test }
1542 printf("%d\n", struct_assign_test == t[0].elem);
1545 /* casts to short/char */
1547 void cast1(char a, short b, unsigned char c, unsigned short d)
1549 printf("%d %d %d %d\n", a, b, c, d);
1552 char bcast;
1553 short scast;
1555 void cast_test()
1557 int a;
1558 char c;
1559 char tab[10];
1560 unsigned b,d;
1561 short s;
1562 char *p = NULL;
1563 p -= 0x700000000042;
1565 printf("cast_test:\n");
1566 a = 0xfffff;
1567 cast1(a, a, a, a);
1568 a = 0xffffe;
1569 printf("%d %d %d %d\n",
1570 (char)(a + 1),
1571 (short)(a + 1),
1572 (unsigned char)(a + 1),
1573 (unsigned short)(a + 1));
1574 printf("%d %d %d %d\n",
1575 (char)0xfffff,
1576 (short)0xfffff,
1577 (unsigned char)0xfffff,
1578 (unsigned short)0xfffff);
1580 a = (bcast = 128) + 1;
1581 printf("%d\n", a);
1582 a = (scast = 65536) + 1;
1583 printf("%d\n", a);
1585 printf("sizeof(c) = %d, sizeof((int)c) = %d\n", sizeof(c), sizeof((int)c));
1587 /* test cast from unsigned to signed short to int */
1588 b = 0xf000;
1589 d = (short)b;
1590 printf("((unsigned)(short)0x%08x) = 0x%08x\n", b, d);
1591 b = 0xf0f0;
1592 d = (char)b;
1593 printf("((unsigned)(char)0x%08x) = 0x%08x\n", b, d);
1595 /* test implicit int casting for array accesses */
1596 c = 0;
1597 tab[1] = 2;
1598 tab[c] = 1;
1599 printf("%d %d\n", tab[0], tab[1]);
1601 /* test implicit casting on some operators */
1602 printf("sizeof(+(char)'a') = %d\n", sizeof(+(char)'a'));
1603 printf("sizeof(-(char)'a') = %d\n", sizeof(-(char)'a'));
1604 printf("sizeof(~(char)'a') = %d\n", sizeof(-(char)'a'));
1606 /* from pointer to integer types */
1607 printf("%d %d %ld %ld %lld %lld\n",
1608 (int)p, (unsigned int)p,
1609 (long)p, (unsigned long)p,
1610 (long long)p, (unsigned long long)p);
1612 /* from integers to pointers */
1613 printf("%p %p %p %p\n",
1614 (void *)a, (void *)b, (void *)c, (void *)d);
1617 /* initializers tests */
1618 struct structinit1 {
1619 int f1;
1620 char f2;
1621 short f3;
1622 int farray[3];
1625 int sinit1 = 2;
1626 int sinit2 = { 3 };
1627 int sinit3[3] = { 1, 2, {{3}}, };
1628 int sinit4[3][2] = { {1, 2}, {3, 4}, {5, 6} };
1629 int sinit5[3][2] = { 1, 2, 3, 4, 5, 6 };
1630 int sinit6[] = { 1, 2, 3 };
1631 int sinit7[] = { [2] = 3, [0] = 1, 2 };
1632 char sinit8[] = "hello" "trala";
1634 struct structinit1 sinit9 = { 1, 2, 3 };
1635 struct structinit1 sinit10 = { .f2 = 2, 3, .f1 = 1 };
1636 struct structinit1 sinit11 = { .f2 = 2, 3, .f1 = 1,
1637 #ifdef ALL_ISOC99
1638 .farray[0] = 10,
1639 .farray[1] = 11,
1640 .farray[2] = 12,
1641 #endif
1644 char *sinit12 = "hello world";
1645 char *sinit13[] = {
1646 "test1",
1647 "test2",
1648 "test3",
1650 char sinit14[10] = { "abc" };
1651 int sinit15[3] = { sizeof(sinit15), 1, 2 };
1653 struct { int a[3], b; } sinit16[] = { { 1 }, 2 };
1655 struct bar {
1656 char *s;
1657 int len;
1658 } sinit17[] = {
1659 "a1", 4,
1660 "a2", 1
1663 int sinit18[10] = {
1664 [2 ... 5] = 20,
1666 [8] = 10,
1669 struct complexinit0 {
1670 int a;
1671 int b;
1674 struct complexinit {
1675 int a;
1676 const struct complexinit0 *b;
1679 const static struct complexinit cix[] = {
1680 [0] = {
1681 .a = 2000,
1682 .b = (const struct complexinit0[]) {
1683 { 2001, 2002 },
1684 { 2003, 2003 },
1690 struct complexinit2 {
1691 int a;
1692 int b[];
1695 struct complexinit2 cix20;
1697 struct complexinit2 cix21 = {
1698 .a = 3000,
1699 .b = { 3001, 3002, 3003 }
1702 struct complexinit2 cix22 = {
1703 .a = 4000,
1704 .b = { 4001, 4002, 4003, 4004, 4005, 4006 }
1707 typedef int arrtype1[];
1708 arrtype1 sinit19 = {1};
1709 arrtype1 sinit20 = {2,3};
1710 typedef int arrtype2[3];
1711 arrtype2 sinit21 = {4};
1712 arrtype2 sinit22 = {5,6,7};
1714 /* Address comparisons of non-weak symbols with zero can be const-folded */
1715 int sinit23[2] = { "astring" ? sizeof("astring") : -1,
1716 &sinit23 ? 42 : -1 };
1718 void init_test(void)
1720 int linit1 = 2;
1721 int linit2 = { 3 };
1722 int linit4[3][2] = { {1, 2}, {3, 4}, {5, 6} };
1723 int linit6[] = { 1, 2, 3 };
1724 int i, j;
1725 char linit8[] = "hello" "trala";
1726 int linit12[10] = { 1, 2 };
1727 int linit13[10] = { 1, 2, [7] = 3, [3] = 4, };
1728 char linit14[10] = "abc";
1729 int linit15[10] = { linit1, linit1 + 1, [6] = linit1 + 2, };
1730 struct linit16 { int a1, a2, a3, a4; } linit16 = { 1, .a3 = 2 };
1731 int linit17 = sizeof(linit17);
1732 int zero = 0;
1733 /* Addresses on non-weak symbols are non-zero, but not the access itself */
1734 int linit18[2] = {&zero ? 1 : -1, zero ? -1 : 1 };
1736 printf("init_test:\n");
1738 printf("sinit1=%d\n", sinit1);
1739 printf("sinit2=%d\n", sinit2);
1740 printf("sinit3=%d %d %d %d\n",
1741 sizeof(sinit3),
1742 sinit3[0],
1743 sinit3[1],
1744 sinit3[2]
1746 printf("sinit6=%d\n", sizeof(sinit6));
1747 printf("sinit7=%d %d %d %d\n",
1748 sizeof(sinit7),
1749 sinit7[0],
1750 sinit7[1],
1751 sinit7[2]
1753 printf("sinit8=%s\n", sinit8);
1754 printf("sinit9=%d %d %d\n",
1755 sinit9.f1,
1756 sinit9.f2,
1757 sinit9.f3
1759 printf("sinit10=%d %d %d\n",
1760 sinit10.f1,
1761 sinit10.f2,
1762 sinit10.f3
1764 printf("sinit11=%d %d %d %d %d %d\n",
1765 sinit11.f1,
1766 sinit11.f2,
1767 sinit11.f3,
1768 sinit11.farray[0],
1769 sinit11.farray[1],
1770 sinit11.farray[2]
1773 for(i=0;i<3;i++)
1774 for(j=0;j<2;j++)
1775 printf("[%d][%d] = %d %d %d\n",
1776 i, j, sinit4[i][j], sinit5[i][j], linit4[i][j]);
1777 printf("linit1=%d\n", linit1);
1778 printf("linit2=%d\n", linit2);
1779 printf("linit6=%d\n", sizeof(linit6));
1780 printf("linit8=%d %s\n", sizeof(linit8), linit8);
1782 printf("sinit12=%s\n", sinit12);
1783 printf("sinit13=%d %s %s %s\n",
1784 sizeof(sinit13),
1785 sinit13[0],
1786 sinit13[1],
1787 sinit13[2]);
1788 printf("sinit14=%s\n", sinit14);
1790 for(i=0;i<10;i++) printf(" %d", linit12[i]);
1791 printf("\n");
1792 for(i=0;i<10;i++) printf(" %d", linit13[i]);
1793 printf("\n");
1794 for(i=0;i<10;i++) printf(" %d", linit14[i]);
1795 printf("\n");
1796 for(i=0;i<10;i++) printf(" %d", linit15[i]);
1797 printf("\n");
1798 printf("%d %d %d %d\n",
1799 linit16.a1,
1800 linit16.a2,
1801 linit16.a3,
1802 linit16.a4);
1803 /* test that initialisation is done after variable declare */
1804 printf("linit17=%d\n", linit17);
1805 printf("sinit15=%d\n", sinit15[0]);
1806 printf("sinit16=%d %d\n", sinit16[0].a[0], sinit16[1].a[0]);
1807 printf("sinit17=%s %d %s %d\n",
1808 sinit17[0].s, sinit17[0].len,
1809 sinit17[1].s, sinit17[1].len);
1810 for(i=0;i<10;i++)
1811 printf("%x ", sinit18[i]);
1812 printf("\n");
1813 /* complex init check */
1814 printf("cix: %d %d %d %d %d %d %d\n",
1815 cix[0].a,
1816 cix[0].b[0].a, cix[0].b[0].b,
1817 cix[0].b[1].a, cix[0].b[1].b,
1818 cix[0].b[2].a, cix[0].b[2].b);
1819 printf("cix2: %d %d\n", cix21.b[2], cix22.b[5]);
1820 printf("sizeof cix20 %d, cix21 %d, sizeof cix22 %d\n", sizeof cix20, sizeof cix21, sizeof cix22);
1822 printf("arrtype1: %d %d %d\n", sinit19[0], sinit20[0], sinit20[1]);
1823 printf("arrtype2: %d %d\n", sizeof(sinit19), sizeof(sinit20));
1824 printf("arrtype3: %d %d %d\n", sinit21[0], sinit21[1], sinit21[2]);
1825 printf("arrtype4: %d %d %d\n", sinit22[0], sinit22[1], sinit22[2]);
1826 printf("arrtype5: %d %d\n", sizeof(sinit21), sizeof(sinit22));
1827 printf("arrtype6: %d\n", sizeof(arrtype2));
1829 printf("sinit23= %d %d\n", sinit23[0], sinit23[1]);
1830 printf("linit18= %d %d\n", linit18[0], linit18[1]);
1833 void switch_uc(unsigned char uc)
1835 switch (uc) {
1836 case 0xfb ... 0xfe:
1837 printf("ucsw:1\n");
1838 break;
1839 case 0xff:
1840 printf("ucsw:2\n");
1841 break;
1842 case 0 ... 5:
1843 printf("ucsw:3\n");
1844 break;
1845 default:
1846 printf("ucsw: broken!\n");
1850 void switch_sc(signed char sc)
1852 switch (sc) {
1853 case -5 ... -2:
1854 printf("scsw:1\n");
1855 break;
1856 case -1:
1857 printf("scsw:2\n");
1858 break;
1859 case 0 ... 5:
1860 printf("scsw:3\n");
1861 break;
1862 default:
1863 printf("scsw: broken!\n");
1867 void switch_test()
1869 int i;
1870 unsigned long long ull;
1871 long long ll;
1873 for(i=0;i<15;i++) {
1874 switch(i) {
1875 case 0:
1876 case 1:
1877 printf("a");
1878 break;
1879 default:
1880 printf("%d", i);
1881 break;
1882 case 8 ... 12:
1883 printf("c");
1884 break;
1885 case 3:
1886 printf("b");
1887 break;
1888 case 0xc33c6b9fU:
1889 case 0x7c9eeeb9U:
1890 break;
1893 printf("\n");
1895 for (i = 1; i <= 5; i++) {
1896 ull = (unsigned long long)i << 61;
1897 switch (ull) {
1898 case 1ULL << 61:
1899 printf("ullsw:1\n");
1900 break;
1901 case 2ULL << 61:
1902 printf("ullsw:2\n");
1903 break;
1904 case 3ULL << 61:
1905 printf("ullsw:3\n");
1906 break;
1907 case 4ULL << 61:
1908 printf("ullsw:4\n");
1909 break;
1910 case 5ULL << 61:
1911 printf("ullsw:5\n");
1912 break;
1913 default:
1914 printf("ullsw: broken!\n");
1918 for (i = 1; i <= 5; i++) {
1919 ll = (long long)i << 61;
1920 switch (ll) {
1921 case 1LL << 61:
1922 printf("llsw:1\n");
1923 break;
1924 case 2LL << 61:
1925 printf("llsw:2\n");
1926 break;
1927 case 3LL << 61:
1928 printf("llsw:3\n");
1929 break;
1930 case 4LL << 61:
1931 printf("llsw:4\n");
1932 break;
1933 case 5LL << 61:
1934 printf("llsw:5\n");
1935 break;
1936 default:
1937 printf("llsw: broken!\n");
1941 for (i = -5; i <= 5; i++) {
1942 switch_uc((unsigned char)i);
1945 for (i = -5; i <= 5; i++) {
1946 switch_sc ((signed char)i);
1950 /* ISOC99 _Bool type */
1951 void c99_bool_test(void)
1953 #ifdef BOOL_ISOC99
1954 int a;
1955 _Bool b;
1957 printf("bool_test:\n");
1958 printf("sizeof(_Bool) = %d\n", sizeof(_Bool));
1959 a = 3;
1960 printf("cast: %d %d %d\n", (_Bool)10, (_Bool)0, (_Bool)a);
1961 b = 3;
1962 printf("b = %d\n", b);
1963 b++;
1964 printf("b = %d\n", b);
1965 #endif
1968 void bitfield_test(void)
1970 int a;
1971 short sa;
1972 unsigned char ca;
1973 struct sbf1 {
1974 int f1 : 3;
1975 int : 2;
1976 int f2 : 1;
1977 int : 0;
1978 int f3 : 5;
1979 int f4 : 7;
1980 unsigned int f5 : 7;
1981 } st1;
1982 printf("bitfield_test:");
1983 printf("sizeof(st1) = %d\n", sizeof(st1));
1985 st1.f1 = 3;
1986 st1.f2 = 1;
1987 st1.f3 = 15;
1988 a = 120;
1989 st1.f4 = a;
1990 st1.f5 = a;
1991 st1.f5++;
1992 printf("%d %d %d %d %d\n",
1993 st1.f1, st1.f2, st1.f3, st1.f4, st1.f5);
1994 sa = st1.f5;
1995 ca = st1.f5;
1996 printf("%d %d\n", sa, ca);
1998 st1.f1 = 7;
1999 if (st1.f1 == -1)
2000 printf("st1.f1 == -1\n");
2001 else
2002 printf("st1.f1 != -1\n");
2003 if (st1.f2 == -1)
2004 printf("st1.f2 == -1\n");
2005 else
2006 printf("st1.f2 != -1\n");
2008 /* bit sizes below must be bigger than 32 since GCC doesn't allow
2009 long-long bitfields whose size is not bigger than int */
2010 struct sbf2 {
2011 long long f1 : 45;
2012 long long : 2;
2013 long long f2 : 35;
2014 unsigned long long f3 : 38;
2015 } st2;
2016 st2.f1 = 0x123456789ULL;
2017 a = 120;
2018 st2.f2 = (long long)a << 25;
2019 st2.f3 = a;
2020 st2.f2++;
2021 printf("%lld %lld %lld\n", st2.f1, st2.f2, st2.f3);
2024 #ifdef __x86_64__
2025 #define FLOAT_FMT "%f\n"
2026 #else
2027 /* x86's float isn't compatible with GCC */
2028 #define FLOAT_FMT "%.5f\n"
2029 #endif
2031 /* declare strto* functions as they are C99 */
2032 double strtod(const char *nptr, char **endptr);
2034 #if defined(_WIN32)
2035 float strtof(const char *nptr, char **endptr) {return (float)strtod(nptr, endptr);}
2036 LONG_DOUBLE strtold(const char *nptr, char **endptr) {return (LONG_DOUBLE)strtod(nptr, endptr);}
2037 #else
2038 float strtof(const char *nptr, char **endptr);
2039 LONG_DOUBLE strtold(const char *nptr, char **endptr);
2040 #endif
2042 #define FTEST(prefix, typename, type, fmt)\
2043 void prefix ## cmp(type a, type b)\
2045 printf("%d %d %d %d %d %d\n",\
2046 a == b,\
2047 a != b,\
2048 a < b,\
2049 a > b,\
2050 a >= b,\
2051 a <= b);\
2052 printf(fmt " " fmt " " fmt " " fmt " " fmt " " fmt " " fmt "\n",\
2055 a + b,\
2056 a - b,\
2057 a * b,\
2058 a / b,\
2059 -a);\
2060 printf(fmt "\n", ++a);\
2061 printf(fmt "\n", a++);\
2062 printf(fmt "\n", a);\
2063 b = 0;\
2064 printf("%d %d\n", !a, !b);\
2066 void prefix ## fcast(type a)\
2068 float fa;\
2069 double da;\
2070 LONG_DOUBLE la;\
2071 int ia;\
2072 long long llia;\
2073 unsigned int ua;\
2074 unsigned long long llua;\
2075 type b;\
2076 fa = a;\
2077 da = a;\
2078 la = a;\
2079 printf("ftof: %f %f %Lf\n", fa, da, la);\
2080 ia = (int)a;\
2081 llia = (long long)a;\
2082 a = (a >= 0) ? a : -a;\
2083 ua = (unsigned int)a;\
2084 llua = (unsigned long long)a;\
2085 printf("ftoi: %d %u %lld %llu\n", ia, ua, llia, llua);\
2086 ia = -1234;\
2087 ua = 0x81234500;\
2088 llia = -0x123456789012345LL;\
2089 llua = 0xf123456789012345LLU;\
2090 b = ia;\
2091 printf("itof: " fmt "\n", b);\
2092 b = ua;\
2093 printf("utof: " fmt "\n", b);\
2094 b = llia;\
2095 printf("lltof: " fmt "\n", b);\
2096 b = llua;\
2097 printf("ulltof: " fmt "\n", b);\
2100 float prefix ## retf(type a) { return a; }\
2101 double prefix ## retd(type a) { return a; }\
2102 LONG_DOUBLE prefix ## retld(type a) { return a; }\
2104 void prefix ## call(void)\
2106 printf("float: " FLOAT_FMT, prefix ## retf(42.123456789));\
2107 printf("double: %f\n", prefix ## retd(42.123456789));\
2108 printf("long double: %Lf\n", prefix ## retld(42.123456789));\
2109 printf("strto%s: %f\n", #prefix, (double)strto ## prefix("1.2", NULL));\
2112 void prefix ## signed_zeros(void) \
2114 type x = 0.0, y = -0.0, n, p;\
2115 if (x == y)\
2116 printf ("Test 1.0 / x != 1.0 / y returns %d (should be 1).\n",\
2117 1.0 / x != 1.0 / y);\
2118 else\
2119 printf ("x != y; this is wrong!\n");\
2121 n = -x;\
2122 if (x == n)\
2123 printf ("Test 1.0 / x != 1.0 / -x returns %d (should be 1).\n",\
2124 1.0 / x != 1.0 / n);\
2125 else\
2126 printf ("x != -x; this is wrong!\n");\
2128 p = +y;\
2129 if (x == p)\
2130 printf ("Test 1.0 / x != 1.0 / +y returns %d (should be 1).\n",\
2131 1.0 / x != 1.0 / p);\
2132 else\
2133 printf ("x != +y; this is wrong!\n");\
2134 p = -y;\
2135 if (x == p)\
2136 printf ("Test 1.0 / x != 1.0 / -y returns %d (should be 0).\n",\
2137 1.0 / x != 1.0 / p);\
2138 else\
2139 printf ("x != -y; this is wrong!\n");\
2141 void prefix ## test(void)\
2143 printf("testing '%s'\n", #typename);\
2144 prefix ## cmp(1, 2.5);\
2145 prefix ## cmp(2, 1.5);\
2146 prefix ## cmp(1, 1);\
2147 prefix ## fcast(234.6);\
2148 prefix ## fcast(-2334.6);\
2149 prefix ## call();\
2150 prefix ## signed_zeros();\
2153 FTEST(f, float, float, "%f")
2154 FTEST(d, double, double, "%f")
2155 FTEST(ld, long double, LONG_DOUBLE, "%Lf")
2157 double ftab1[3] = { 1.2, 3.4, -5.6 };
2160 void float_test(void)
2162 #if !defined(__arm__) || defined(__ARM_PCS_VFP)
2163 float fa, fb;
2164 double da, db;
2165 int a;
2166 unsigned int b;
2168 printf("float_test:\n");
2169 printf("sizeof(float) = %d\n", sizeof(float));
2170 printf("sizeof(double) = %d\n", sizeof(double));
2171 printf("sizeof(long double) = %d\n", sizeof(LONG_DOUBLE));
2172 ftest();
2173 dtest();
2174 ldtest();
2175 printf("%f %f %f\n", ftab1[0], ftab1[1], ftab1[2]);
2176 printf("%f %f %f\n", 2.12, .5, 2.3e10);
2177 // printf("%f %f %f\n", 0x1234p12, 0x1e23.23p10, 0x12dp-10);
2178 da = 123;
2179 printf("da=%f\n", da);
2180 fa = 123;
2181 printf("fa=%f\n", fa);
2182 a = 4000000000;
2183 da = a;
2184 printf("da = %f\n", da);
2185 b = 4000000000;
2186 db = b;
2187 printf("db = %f\n", db);
2188 #endif
2191 int fib(int n)
2193 if (n <= 2)
2194 return 1;
2195 else
2196 return fib(n-1) + fib(n-2);
2199 void funcptr_test()
2201 void (*func)(int);
2202 int a;
2203 struct {
2204 int dummy;
2205 void (*func)(int);
2206 } st1;
2207 long diff;
2209 printf("funcptr:\n");
2210 func = &num;
2211 (*func)(12345);
2212 func = num;
2213 a = 1;
2214 a = 1;
2215 func(12345);
2216 /* more complicated pointer computation */
2217 st1.func = num;
2218 st1.func(12346);
2219 printf("sizeof1 = %d\n", sizeof(funcptr_test));
2220 printf("sizeof2 = %d\n", sizeof funcptr_test);
2221 printf("sizeof3 = %d\n", sizeof(&funcptr_test));
2222 printf("sizeof4 = %d\n", sizeof &funcptr_test);
2223 a = 0;
2224 func = num + a;
2225 diff = func - num;
2226 func(42);
2227 (func + diff)(42);
2228 (num + a)(43);
2231 void lloptest(long long a, long long b)
2233 unsigned long long ua, ub;
2235 ua = a;
2236 ub = b;
2237 /* arith */
2238 printf("arith: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n",
2239 a + b,
2240 a - b,
2241 a * b);
2243 if (b != 0) {
2244 printf("arith1: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n",
2245 a / b,
2246 a % b);
2249 /* binary */
2250 printf("bin: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n",
2251 a & b,
2252 a | b,
2253 a ^ b);
2255 /* tests */
2256 printf("test: %d %d %d %d %d %d\n",
2257 a == b,
2258 a != b,
2259 a < b,
2260 a > b,
2261 a >= b,
2262 a <= b);
2264 printf("utest: %d %d %d %d %d %d\n",
2265 ua == ub,
2266 ua != ub,
2267 ua < ub,
2268 ua > ub,
2269 ua >= ub,
2270 ua <= ub);
2272 /* arith2 */
2273 a++;
2274 b++;
2275 printf("arith2: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", a, b);
2276 printf("arith2: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", a++, b++);
2277 printf("arith2: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", --a, --b);
2278 printf("arith2: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", a, b);
2279 b = ub = 0;
2280 printf("not: %d %d %d %d\n", !a, !ua, !b, !ub);
2283 void llshift(long long a, int b)
2285 printf("shift: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n",
2286 (unsigned long long)a >> b,
2287 a >> b,
2288 a << b);
2289 printf("shiftc: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n",
2290 (unsigned long long)a >> 3,
2291 a >> 3,
2292 a << 3);
2293 printf("shiftc: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n",
2294 (unsigned long long)a >> 35,
2295 a >> 35,
2296 a << 35);
2299 void llfloat(void)
2301 float fa;
2302 double da;
2303 LONG_DOUBLE lda;
2304 long long la, lb, lc;
2305 unsigned long long ula, ulb, ulc;
2306 la = 0x12345678;
2307 ula = 0x72345678;
2308 la = (la << 20) | 0x12345;
2309 ula = ula << 33;
2310 printf("la=" LONG_LONG_FORMAT " ula=" ULONG_LONG_FORMAT "\n", la, ula);
2312 fa = la;
2313 da = la;
2314 lda = la;
2315 printf("lltof: %f %f %Lf\n", fa, da, lda);
2317 la = fa;
2318 lb = da;
2319 lc = lda;
2320 printf("ftoll: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", la, lb, lc);
2322 fa = ula;
2323 da = ula;
2324 lda = ula;
2325 printf("ulltof: %f %f %Lf\n", fa, da, lda);
2327 ula = fa;
2328 ulb = da;
2329 ulc = lda;
2330 printf("ftoull: " ULONG_LONG_FORMAT " " ULONG_LONG_FORMAT " " ULONG_LONG_FORMAT "\n", ula, ulb, ulc);
2333 long long llfunc1(int a)
2335 return a * 2;
2338 struct S {
2339 int id;
2340 char item;
2343 long long int value(struct S *v)
2345 return ((long long int)v->item);
2348 long long llfunc2(long long x, long long y, int z)
2350 return x * y * z;
2353 void longlong_test(void)
2355 long long a, b, c;
2356 int ia;
2357 unsigned int ua;
2358 printf("longlong_test:\n");
2359 printf("sizeof(long long) = %d\n", sizeof(long long));
2360 ia = -1;
2361 ua = -2;
2362 a = ia;
2363 b = ua;
2364 printf(LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", a, b);
2365 printf(LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " %Lx\n",
2366 (long long)1,
2367 (long long)-2,
2368 1LL,
2369 0x1234567812345679);
2370 a = llfunc1(-3);
2371 printf(LONG_LONG_FORMAT "\n", a);
2373 lloptest(1000, 23);
2374 lloptest(0xff, 0x1234);
2375 b = 0x72345678 << 10;
2376 lloptest(-3, b);
2377 llshift(0x123, 5);
2378 llshift(-23, 5);
2379 b = 0x72345678LL << 10;
2380 llshift(b, 47);
2382 llfloat();
2383 #if 1
2384 b = 0x12345678;
2385 a = -1;
2386 c = a + b;
2387 printf("%Lx\n", c);
2388 #endif
2390 /* long long reg spill test */
2392 struct S a;
2394 a.item = 3;
2395 printf("%lld\n", value(&a));
2397 lloptest(0x80000000, 0);
2400 long long *p, v, **pp;
2401 v = 1;
2402 p = &v;
2403 p[0]++;
2404 printf("another long long spill test : %lld\n", *p);
2405 pp = &p;
2407 v = llfunc2(**pp, **pp, ia);
2408 printf("a long long function (arm-)reg-args test : %lld\n", v);
2410 a = 68719476720LL;
2411 b = 4294967295LL;
2412 printf("%d %d %d %d\n", a > b, a < b, a >= b, a <= b);
2414 printf(LONG_LONG_FORMAT "\n", 0x123456789LLU);
2416 /* long long pointer deref in argument passing test */
2417 a = 0x123;
2418 long long *p = &a;
2419 llshift(*p, 5);
2422 void manyarg_test(void)
2424 LONG_DOUBLE ld = 1234567891234LL;
2425 printf("manyarg_test:\n");
2426 printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f\n",
2427 1, 2, 3, 4, 5, 6, 7, 8,
2428 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0);
2429 printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
2430 LONG_LONG_FORMAT " " LONG_LONG_FORMAT " %f %f\n",
2431 1, 2, 3, 4, 5, 6, 7, 8,
2432 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
2433 1234567891234LL, 987654321986LL,
2434 42.0, 43.0);
2435 printf("%Lf %d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
2436 LONG_LONG_FORMAT " " LONG_LONG_FORMAT " %f %f\n",
2437 ld, 1, 2, 3, 4, 5, 6, 7, 8,
2438 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
2439 1234567891234LL, 987654321986LL,
2440 42.0, 43.0);
2441 printf("%d %d %d %d %d %d %d %d %Lf\n",
2442 1, 2, 3, 4, 5, 6, 7, 8, ld);
2443 printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
2444 LONG_LONG_FORMAT " " LONG_LONG_FORMAT "%f %f %Lf\n",
2445 1, 2, 3, 4, 5, 6, 7, 8,
2446 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
2447 1234567891234LL, 987654321986LL,
2448 42.0, 43.0, ld);
2449 printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
2450 "%Lf " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " %f %f %Lf\n",
2451 1, 2, 3, 4, 5, 6, 7, 8,
2452 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
2453 ld, 1234567891234LL, 987654321986LL,
2454 42.0, 43.0, ld);
2457 void vprintf1(const char *fmt, ...)
2459 va_list ap, aq;
2460 const char *p;
2461 int c, i;
2462 double d;
2463 long long ll;
2464 LONG_DOUBLE ld;
2466 va_start(aq, fmt);
2467 va_copy(ap, aq);
2469 p = fmt;
2470 for(;;) {
2471 c = *p;
2472 if (c == '\0')
2473 break;
2474 p++;
2475 if (c == '%') {
2476 c = *p;
2477 switch(c) {
2478 case '\0':
2479 goto the_end;
2480 case 'd':
2481 i = va_arg(ap, int);
2482 printf("%d", i);
2483 break;
2484 case 'f':
2485 d = va_arg(ap, double);
2486 printf("%f", d);
2487 break;
2488 case 'l':
2489 ll = va_arg(ap, long long);
2490 printf(LONG_LONG_FORMAT, ll);
2491 break;
2492 case 'F':
2493 ld = va_arg(ap, LONG_DOUBLE);
2494 printf("%Lf", ld);
2495 break;
2497 p++;
2498 } else {
2499 putchar(c);
2502 the_end:
2503 va_end(aq);
2504 va_end(ap);
2507 struct myspace {
2508 short int profile;
2511 void stdarg_for_struct(struct myspace bob, ...)
2513 struct myspace george, bill;
2514 va_list ap;
2515 short int validate;
2517 va_start(ap, bob);
2518 bill = va_arg(ap, struct myspace);
2519 george = va_arg(ap, struct myspace);
2520 validate = va_arg(ap, int);
2521 printf("stdarg_for_struct: %d %d %d %d\n",
2522 bob.profile, bill.profile, george.profile, validate);
2523 va_end(ap);
2526 void stdarg_for_libc(const char *fmt, ...)
2528 va_list args;
2529 va_start(args, fmt);
2530 vprintf(fmt, args);
2531 va_end(args);
2534 void stdarg_test(void)
2536 LONG_DOUBLE ld = 1234567891234LL;
2537 struct myspace bob;
2539 vprintf1("%d %d %d\n", 1, 2, 3);
2540 vprintf1("%f %d %f\n", 1.0, 2, 3.0);
2541 vprintf1("%l %l %d %f\n", 1234567891234LL, 987654321986LL, 3, 1234.0);
2542 vprintf1("%F %F %F\n", LONG_DOUBLE_LITERAL(1.2), LONG_DOUBLE_LITERAL(2.3), LONG_DOUBLE_LITERAL(3.4));
2543 vprintf1("%d %f %l %F %d %f %l %F\n",
2544 1, 1.2, 3LL, LONG_DOUBLE_LITERAL(4.5), 6, 7.8, 9LL, LONG_DOUBLE_LITERAL(0.1));
2545 vprintf1("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f\n",
2546 1, 2, 3, 4, 5, 6, 7, 8,
2547 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8);
2548 vprintf1("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f\n",
2549 1, 2, 3, 4, 5, 6, 7, 8,
2550 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0);
2551 vprintf1("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
2552 "%l %l %f %f\n",
2553 1, 2, 3, 4, 5, 6, 7, 8,
2554 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
2555 1234567891234LL, 987654321986LL,
2556 42.0, 43.0);
2557 vprintf1("%F %d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
2558 "%l %l %f %f\n",
2559 ld, 1, 2, 3, 4, 5, 6, 7, 8,
2560 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
2561 1234567891234LL, 987654321986LL,
2562 42.0, 43.0);
2563 vprintf1("%d %d %d %d %d %d %d %d %F\n",
2564 1, 2, 3, 4, 5, 6, 7, 8, ld);
2565 vprintf1("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
2566 "%l %l %f %f %F\n",
2567 1, 2, 3, 4, 5, 6, 7, 8,
2568 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
2569 1234567891234LL, 987654321986LL,
2570 42.0, 43.0, ld);
2571 vprintf1("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
2572 "%F %l %l %f %f %F\n",
2573 1, 2, 3, 4, 5, 6, 7, 8,
2574 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
2575 ld, 1234567891234LL, 987654321986LL,
2576 42.0, 43.0, ld);
2578 bob.profile = 42;
2579 stdarg_for_struct(bob, bob, bob, bob.profile);
2580 stdarg_for_libc("stdarg_for_libc: %s %.2f %d\n", "string", 1.23, 456);
2583 void whitespace_test(void)
2585 char *str;
2587 \f\v #if 1
2588 pri\
2589 ntf("whitspace:\n");\f\v
2590 #endif
2591 pf("N=%d\n", 2);
2593 #ifdef CORRECT_CR_HANDLING
2594 pri\
2595 ntf("aaa=%d\n", 3);
2596 #endif
2598 pri\
2600 ntf("min=%d\n", 4);
2602 #ifdef ACCEPT_CR_IN_STRINGS
2603 printf("len1=%d\n", strlen("
2604 "));
2605 #ifdef CORRECT_CR_HANDLING
2606 str = "
2608 printf("len1=%d str[0]=%d\n", strlen(str), str[0]);
2609 #endif
2610 printf("len1=%d\n", strlen(" a
2611 "));
2612 #endif /* ACCEPT_CR_IN_STRINGS */
2615 int reltab[3] = { 1, 2, 3 };
2617 int *rel1 = &reltab[1];
2618 int *rel2 = &reltab[2];
2620 void getmyaddress(void)
2622 printf("in getmyaddress\n");
2625 #ifdef __LP64__
2626 long __pa_symbol(void)
2628 /* This 64bit constant was handled incorrectly, it was used as addend
2629 (which can hold 64bit just fine) in connection with a symbol,
2630 and TCC generates wrong code for that (displacements are 32bit only).
2631 This effectively is "+ 0x80000000", and if addresses of globals
2632 are below 2GB the result should be a number without high 32 bits set. */
2633 return ((long)(((unsigned long)(&rel1))) - (0xffffffff80000000UL));
2635 #endif
2637 unsigned long theaddress = (unsigned long)getmyaddress;
2638 void relocation_test(void)
2640 void (*fptr)(void) = (void (*)(void))theaddress;
2641 printf("*rel1=%d\n", *rel1);
2642 printf("*rel2=%d\n", *rel2);
2643 fptr();
2644 #ifdef __LP64__
2645 printf("pa_symbol=0x%lx\n", __pa_symbol() >> 63);
2646 #endif
2649 void old_style_f(a,b,c)
2650 int a, b;
2651 double c;
2653 printf("a=%d b=%d b=%f\n", a, b, c);
2656 void decl_func1(int cmpfn())
2658 printf("cmpfn=%lx\n", (long)cmpfn);
2661 void decl_func2(cmpfn)
2662 int cmpfn();
2664 printf("cmpfn=%lx\n", (long)cmpfn);
2667 void old_style_function(void)
2669 old_style_f((void *)1, 2, 3.0);
2670 decl_func1(NULL);
2671 decl_func2(NULL);
2674 void alloca_test()
2676 #if defined __i386__ || defined __x86_64__ || defined __arm__
2677 char *p = alloca(16);
2678 strcpy(p,"123456789012345");
2679 printf("alloca: p is %s\n", p);
2680 char *demo = "This is only a test.\n";
2681 /* Test alloca embedded in a larger expression */
2682 printf("alloca: %s\n", strcpy(alloca(strlen(demo)+1),demo) );
2683 #endif
2686 void *bounds_checking_is_enabled()
2688 char ca[10], *cp = ca-1;
2689 return (ca != cp + 1) ? cp : NULL;
2692 typedef int constant_negative_array_size_as_compile_time_assertion_idiom[(1 ? 2 : 0) - 1];
2694 void c99_vla_test(int size1, int size2)
2696 #if defined __i386__ || defined __x86_64__
2697 int size = size1 * size2;
2698 int tab1[size][2], tab2[10][2];
2699 void *tab1_ptr, *tab2_ptr, *bad_ptr;
2701 /* "size" should have been 'captured' at tab1 declaration,
2702 so modifying it should have no effect on VLA behaviour. */
2703 size = size-1;
2705 printf("Test C99 VLA 1 (sizeof): ");
2706 printf("%s\n", (sizeof tab1 == size1 * size2 * 2 * sizeof(int)) ? "PASSED" : "FAILED");
2707 tab1_ptr = tab1;
2708 tab2_ptr = tab2;
2709 printf("Test C99 VLA 2 (ptrs subtract): ");
2710 printf("%s\n", (tab2 - tab1 == (tab2_ptr - tab1_ptr) / (sizeof(int) * 2)) ? "PASSED" : "FAILED");
2711 printf("Test C99 VLA 3 (ptr add): ");
2712 printf("%s\n", &tab1[5][1] == (tab1_ptr + (5 * 2 + 1) * sizeof(int)) ? "PASSED" : "FAILED");
2713 printf("Test C99 VLA 4 (ptr access): ");
2714 tab1[size1][1] = 42;
2715 printf("%s\n", (*((int *) (tab1_ptr + (size1 * 2 + 1) * sizeof(int))) == 42) ? "PASSED" : "FAILED");
2717 printf("Test C99 VLA 5 (bounds checking (might be disabled)): ");
2718 if (bad_ptr = bounds_checking_is_enabled()) {
2719 int *t1 = &tab1[size1 * size2 - 1][3];
2720 int *t2 = &tab2[9][3];
2721 printf("%s ", bad_ptr == t1 ? "PASSED" : "FAILED");
2722 printf("%s ", bad_ptr == t2 ? "PASSED" : "FAILED");
2724 char*c1 = 1 + sizeof(tab1) + (char*)tab1;
2725 char*c2 = 1 + sizeof(tab2) + (char*)tab2;
2726 printf("%s ", bad_ptr == c1 ? "PASSED" : "FAILED");
2727 printf("%s ", bad_ptr == c2 ? "PASSED" : "FAILED");
2729 int *i1 = tab1[-1];
2730 int *i2 = tab2[-1];
2731 printf("%s ", bad_ptr == i1 ? "PASSED" : "FAILED");
2732 printf("%s ", bad_ptr == i2 ? "PASSED" : "FAILED");
2734 int *x1 = tab1[size1 * size2 + 1];
2735 int *x2 = tab2[10 + 1];
2736 printf("%s ", bad_ptr == x1 ? "PASSED" : "FAILED");
2737 printf("%s ", bad_ptr == x2 ? "PASSED" : "FAILED");
2738 } else {
2739 printf("PASSED PASSED PASSED PASSED PASSED PASSED PASSED PASSED ");
2741 printf("\n");
2742 #endif
2745 #ifndef __TINYC__
2746 typedef __SIZE_TYPE__ uintptr_t;
2747 #endif
2749 void sizeof_test(void)
2751 int a;
2752 int **ptr;
2754 printf("sizeof(int) = %d\n", sizeof(int));
2755 printf("sizeof(unsigned int) = %d\n", sizeof(unsigned int));
2756 printf("sizeof(long) = %d\n", sizeof(long));
2757 printf("sizeof(unsigned long) = %d\n", sizeof(unsigned long));
2758 printf("sizeof(short) = %d\n", sizeof(short));
2759 printf("sizeof(unsigned short) = %d\n", sizeof(unsigned short));
2760 printf("sizeof(char) = %d\n", sizeof(char));
2761 printf("sizeof(unsigned char) = %d\n", sizeof(unsigned char));
2762 printf("sizeof(func) = %d\n", sizeof sizeof_test());
2763 a = 1;
2764 printf("sizeof(a++) = %d\n", sizeof a++);
2765 printf("a=%d\n", a);
2766 ptr = NULL;
2767 printf("sizeof(**ptr) = %d\n", sizeof (**ptr));
2769 /* The type of sizeof should be as large as a pointer, actually
2770 it should be size_t. */
2771 printf("sizeof(sizeof(int) = %d\n", sizeof(sizeof(int)));
2772 uintptr_t t = 1;
2773 uintptr_t t2;
2774 /* Effectively <<32, but defined also on 32bit machines. */
2775 t <<= 16;
2776 t <<= 16;
2777 t++;
2778 /* This checks that sizeof really can be used to manipulate
2779 uintptr_t objects, without truncation. */
2780 t2 = t & -sizeof(uintptr_t);
2781 printf ("%lu %lu\n", t, t2);
2783 /* some alignof tests */
2784 printf("__alignof__(int) = %d\n", __alignof__(int));
2785 printf("__alignof__(unsigned int) = %d\n", __alignof__(unsigned int));
2786 printf("__alignof__(short) = %d\n", __alignof__(short));
2787 printf("__alignof__(unsigned short) = %d\n", __alignof__(unsigned short));
2788 printf("__alignof__(char) = %d\n", __alignof__(char));
2789 printf("__alignof__(unsigned char) = %d\n", __alignof__(unsigned char));
2790 printf("__alignof__(func) = %d\n", __alignof__ sizeof_test());
2792 /* sizes of VLAs need to be evaluated even inside sizeof: */
2793 a = 2;
2794 printf("sizeof(char[1+2*a]) = %d\n", sizeof(char[1+2*a]));
2795 /* And checking if sizeof compound literal works. Parenthesized: */
2796 printf("sizeof( (struct {int i; int j;}){4,5} ) = %d\n",
2797 sizeof( (struct {int i; int j;}){4,5} ));
2798 /* And as direct sizeof argument (as unary expression): */
2799 printf("sizeof (struct {short i; short j;}){4,5} = %d\n",
2800 sizeof (struct {short i; short j;}){4,5} );
2802 /* sizeof(x && y) should be sizeof(int), even if constant
2803 evaluating is possible. */
2804 printf("sizeof(t && 0) = %d\n", sizeof(t && 0));
2805 printf("sizeof(1 && 1) = %d\n", sizeof(1 && 1));
2806 printf("sizeof(t || 1) = %d\n", sizeof(t || 1));
2807 printf("sizeof(0 || 0) = %d\n", sizeof(0 || 0));
2810 void typeof_test(void)
2812 double a;
2813 typeof(a) b;
2814 typeof(float) c;
2816 a = 1.5;
2817 b = 2.5;
2818 c = 3.5;
2819 printf("a=%f b=%f c=%f\n", a, b, c);
2823 struct hlist_node;
2824 struct hlist_head {
2825 struct hlist_node *first, *last;
2828 void statement_expr_test(void)
2830 int a, i;
2832 /* Basic stmt expr test */
2833 a = 0;
2834 for(i=0;i<10;i++) {
2835 a += 1 +
2836 ( { int b, j;
2837 b = 0;
2838 for(j=0;j<5;j++)
2839 b += j; b;
2840 } );
2842 printf("a=%d\n", a);
2844 /* Test that symbols aren't freed prematurely.
2845 With SYM_DEBUG valgrind will show a read from a freed
2846 symbol, and tcc will show an (invalid) warning on the initialization
2847 of 'ptr' below, if symbols are popped after the stmt expr. */
2848 void *v = (void*)39;
2849 typeof(({
2850 (struct hlist_node *)v;
2851 })) x;
2852 typeof (x)
2853 ptr = (struct hlist_node *)v;
2855 /* This part used to segfault when symbols were popped prematurely.
2856 The symbols for the static local would be overwritten with
2857 helper symbols from the pre-processor expansions in between. */
2858 #define some_attr __attribute__((aligned(1)))
2859 #define tps(str) ({ \
2860 static const char *t some_attr = str; \
2861 t; \
2863 printf ("stmtexpr: %s %s\n",
2864 tps("somerandomlongstring"),
2865 tps("anotherlongstring"));
2867 /* Test that the three decls of 't' don't interact. */
2868 int t = 40;
2869 int b = ({ int t = 41; t; });
2870 int c = ({ int t = 42; t; });
2872 /* Test that aggregate return values work. */
2873 struct hlist_head h
2874 = ({
2875 typedef struct hlist_head T;
2876 long pre = 48;
2877 T t = { (void*)43, (void*)44 };
2878 long post = 49;
2881 printf ("stmtexpr: %d %d %d\n", t, b, c);
2882 printf ("stmtexpr: %ld %ld\n", (long)h.first, (long)h.last);
2885 void local_label_test(void)
2887 int a;
2888 goto l1;
2890 a = 1 + ({
2891 __label__ l1, l2, l3, l4;
2892 goto l1;
2894 printf("aa1\n");
2895 goto l3;
2897 printf("aa3\n");
2898 goto l4;
2900 printf("aa2\n");
2901 goto l2;
2902 l3:;
2905 printf("a=%d\n", a);
2906 return;
2908 printf("bb1\n");
2909 goto l2;
2911 printf("bb2\n");
2912 goto l4;
2915 /* inline assembler test */
2916 #if defined(__i386__) || defined(__x86_64__)
2918 /* from linux kernel */
2919 static char * strncat1(char * dest,const char * src,size_t count)
2921 long d0, d1, d2, d3;
2922 __asm__ __volatile__(
2923 "repne\n\t"
2924 "scasb\n\t"
2925 "dec %1\n\t"
2926 "mov %8,%3\n"
2927 "1:\tdec %3\n\t"
2928 "js 2f\n\t"
2929 "lodsb\n\t"
2930 "stosb\n\t"
2931 "testb %%al,%%al\n\t"
2932 "jne 1b\n"
2933 "2:\txor %2,%2\n\t"
2934 "stosb"
2935 : "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
2936 : "0" (src),"1" (dest),"2" (0),"3" (0xffffffff), "g" (count)
2937 : "memory");
2938 return dest;
2941 static char * strncat2(char * dest,const char * src,size_t count)
2943 long d0, d1, d2, d3;
2944 __asm__ __volatile__(
2945 "repne scasb\n\t" /* one-line repne prefix + string op */
2946 "dec %1\n\t"
2947 "mov %8,%3\n"
2948 "1:\tdec %3\n\t"
2949 "js 2f\n\t"
2950 "lodsb\n\t"
2951 "stosb\n\t"
2952 "testb %%al,%%al\n\t"
2953 "jne 1b\n"
2954 "2:\txor %2,%2\n\t"
2955 "stosb"
2956 : "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
2957 : "0" (src),"1" (dest),"2" (0),"3" (0xffffffff), "g" (count)
2958 : "memory");
2959 return dest;
2962 static inline void * memcpy1(void * to, const void * from, size_t n)
2964 long d0, d1, d2;
2965 __asm__ __volatile__(
2966 "rep ; movsl\n\t"
2967 "testb $2,%b4\n\t"
2968 "je 1f\n\t"
2969 "movsw\n"
2970 "1:\ttestb $1,%b4\n\t"
2971 "je 2f\n\t"
2972 "movsb\n"
2973 "2:"
2974 : "=&c" (d0), "=&D" (d1), "=&S" (d2)
2975 :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
2976 : "memory");
2977 return (to);
2980 static inline void * memcpy2(void * to, const void * from, size_t n)
2982 long d0, d1, d2;
2983 __asm__ __volatile__(
2984 "rep movsl\n\t" /* one-line rep prefix + string op */
2985 "testb $2,%b4\n\t"
2986 "je 1f\n\t"
2987 "movsw\n"
2988 "1:\ttestb $1,%b4\n\t"
2989 "je 2f\n\t"
2990 "movsb\n"
2991 "2:"
2992 : "=&c" (d0), "=&D" (d1), "=&S" (d2)
2993 :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
2994 : "memory");
2995 return (to);
2998 static __inline__ void sigaddset1(unsigned int *set, int _sig)
3000 __asm__("btsl %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc");
3003 static __inline__ void sigdelset1(unsigned int *set, int _sig)
3005 asm("btrl %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc", "flags");
3008 static __inline__ __const__ unsigned int swab32(unsigned int x)
3010 __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */
3011 "rorl $16,%0\n\t" /* swap words */
3012 "xchgb %b0,%h0" /* swap higher bytes */
3013 :"=" "q" (x)
3014 : "0" (x));
3015 return x;
3018 static __inline__ unsigned long long mul64(unsigned int a, unsigned int b)
3020 unsigned long long res;
3021 #ifdef __x86_64__
3022 /* Using the A constraint is wrong (it means rdx:rax, which is too large)
3023 but still test the 32bit->64bit mull. */
3024 unsigned int resh, resl;
3025 __asm__("mull %2" : "=a" (resl), "=d" (resh) : "a" (a), "r" (b));
3026 res = ((unsigned long long)resh << 32) | resl;
3027 #else
3028 __asm__("mull %2" : "=A" (res) : "a" (a), "r" (b));
3029 #endif
3030 return res;
3033 static __inline__ unsigned long long inc64(unsigned long long a)
3035 unsigned long long res;
3036 #ifdef __x86_64__
3037 /* Using the A constraint is wrong, and increments are tested
3038 elsewere. */
3039 res = a + 1;
3040 #else
3041 __asm__("addl $1, %%eax ; adcl $0, %%edx" : "=A" (res) : "A" (a));
3042 #endif
3043 return res;
3046 struct struct123 {
3047 int a;
3048 int b;
3050 struct struct1231 {
3051 unsigned long addr;
3054 unsigned long mconstraint_test(struct struct1231 *r)
3056 unsigned long ret;
3057 unsigned int a[2];
3058 a[0] = 0;
3059 __asm__ volatile ("lea %2,%0; movl 4(%0),%k0; addl %2,%k0; movl $51,%2; movl $52,4%2; movl $63,%1"
3060 : "=&r" (ret), "=m" (a)
3061 : "m" (*(struct struct123 *)r->addr));
3062 return ret + a[0];
3065 #ifdef __x86_64__
3066 int fls64(unsigned long long x)
3068 int bitpos = -1;
3069 asm("bsrq %1,%q0"
3070 : "+r" (bitpos)
3071 : "rm" (x));
3072 return bitpos + 1;
3074 #endif
3076 void other_constraints_test(void)
3078 unsigned long ret;
3079 int var;
3080 __asm__ volatile ("movq %P1,%0" : "=r" (ret) : "p" (&var));
3081 printf ("oc1: %d\n", ret == (unsigned long)&var);
3084 /* Test global asm blocks playing with aliases. */
3085 void base_func(void)
3087 printf ("asmc: base\n");
3090 extern void override_func1 (void);
3091 extern void override_func2 (void);
3093 asm(".weak override_func1\n.set override_func1, base_func");
3094 asm(".set override_func1, base_func");
3095 asm(".set override_func2, base_func");
3097 void override_func2 (void)
3099 printf ("asmc: override2\n");
3102 /* This checks a construct used by the linux kernel to encode
3103 references to strings by PC relative references. */
3104 extern int bug_table[] __attribute__((section("__bug_table")));
3105 char * get_asm_string (void)
3107 extern int some_symbol;
3108 asm volatile (".globl some_symbol\n"
3109 "jmp .+6\n"
3110 "1:\n"
3111 "some_symbol: .long 0\n"
3112 ".pushsection __bug_table, \"a\"\n"
3113 ".globl bug_table\n"
3114 "bug_table:\n"
3115 /* The first entry (1b-2b) is unused in this test,
3116 but we include it to check if cross-section
3117 PC-relative references work. */
3118 "2:\t.long 1b - 2b, %c0 - 2b\n"
3119 ".popsection\n" : : "i" ("A string"));
3120 char * str = ((char*)bug_table) + bug_table[1];
3121 return str;
3124 unsigned int set;
3126 void fancy_copy (unsigned *in, unsigned *out)
3128 asm volatile ("" : "=r" (*out) : "0" (*in));
3131 void fancy_copy2 (unsigned *in, unsigned *out)
3133 asm volatile ("mov %0,(%1)" : : "r" (*in), "r" (out) : "memory");
3136 #ifdef __x86_64__
3137 void clobber_r12(void)
3139 asm volatile("mov $1, %%r12" ::: "r12");
3141 #endif
3143 void test_high_clobbers(void)
3145 #ifdef __x86_64__
3146 register long val asm("r12");
3147 long val2;
3148 /* This tests if asm clobbers correctly save/restore callee saved
3149 registers if they are clobbered and if it's the high 8 x86-64
3150 registers. This is fragile for GCC as the constraints do not
3151 correctly capture the data flow, but good enough for us. */
3152 asm volatile("mov $0x4542, %%r12" : "=r" (val):: "memory");
3153 clobber_r12();
3154 asm volatile("mov %%r12, %0" : "=r" (val2) : "r" (val): "memory");
3155 printf("asmhc: 0x%x\n", val2);
3156 #endif
3159 static long cpu_number;
3160 void trace_console(long len, long len2)
3162 /* This generated invalid code when the emission of the switch
3163 table isn't disabled. The asms are necessary to show the bug,
3164 normal statements don't work (they need to generate some code
3165 even under nocode_wanted, which normal statements don't do,
3166 but asms do). Also at least these number of cases is necessary
3167 to generate enough "random" bytes. They ultimately are enough
3168 to create invalid instruction patterns to which the first
3169 skip-to-decision-table jump jumps. If decision table emission
3170 is disabled all of this is no problem.
3172 It also is necessary that the switches are in a statement expression
3173 (which has the property of not being enterable from outside. no
3174 matter what). */
3175 if (0
3178 long pscr_ret__;
3179 switch(len) {
3180 case 4:
3182 long pfo_ret__;
3183 switch (len2) {
3184 case 8: printf("bla"); pfo_ret__ = 42; break;
3186 pscr_ret__ = pfo_ret__;
3188 break;
3189 case 8:
3191 long pfo_ret__;
3192 switch (len2) {
3193 case 1:asm("movq %1,%0": "=r" (pfo_ret__) : "m" (cpu_number)); break;
3194 case 2:asm("movq %1,%0": "=r" (pfo_ret__) : "m" (cpu_number)); break;
3195 case 4:asm("movq %1,%0": "=r" (pfo_ret__) : "m" (cpu_number)); break;
3196 case 8:asm("movq %1,%0": "=r" (pfo_ret__) : "m" (cpu_number)); break;
3197 default: printf("impossible\n");
3199 pscr_ret__ = pfo_ret__;
3201 break;
3203 pscr_ret__;
3206 printf("huh?\n");
3209 void asm_test(void)
3211 char buf[128];
3212 unsigned int val, val2;
3213 struct struct123 s1;
3214 struct struct1231 s2 = { (unsigned long)&s1 };
3215 /* Hide the outer base_func, but check later that the inline
3216 asm block gets the outer one. */
3217 int base_func = 42;
3218 void override_func3 (void);
3219 unsigned long asmret;
3220 #ifdef BOOL_ISOC99
3221 _Bool somebool;
3222 #endif
3223 register int regvar asm("%esi");
3225 printf("inline asm:\n");
3227 // parse 0x1E-1 as 3 tokens in asm mode
3228 asm volatile ("mov $0x1E-1,%eax");
3230 /* test the no operand case */
3231 asm volatile ("xorl %eax, %eax");
3233 memcpy1(buf, "hello", 6);
3234 strncat1(buf, " worldXXXXX", 3);
3235 printf("%s\n", buf);
3237 memcpy2(buf, "hello", 6);
3238 strncat2(buf, " worldXXXXX", 3);
3239 printf("%s\n", buf);
3241 /* 'A' constraint test */
3242 printf("mul64=0x%Lx\n", mul64(0x12345678, 0xabcd1234));
3243 printf("inc64=0x%Lx\n", inc64(0x12345678ffffffff));
3245 s1.a = 42;
3246 s1.b = 43;
3247 printf("mconstraint: %d", mconstraint_test(&s2));
3248 printf(" %d %d\n", s1.a, s1.b);
3249 other_constraints_test();
3250 set = 0xff;
3251 sigdelset1(&set, 2);
3252 sigaddset1(&set, 16);
3253 /* NOTE: we test here if C labels are correctly restored after the
3254 asm statement */
3255 goto label1;
3256 label2:
3257 __asm__("btsl %1,%0" : "=m"(set) : "Ir"(20) : "cc");
3258 printf("set=0x%x\n", set);
3259 val = 0x01020304;
3260 printf("swab32(0x%08x) = 0x%0x\n", val, swab32(val));
3261 override_func1();
3262 override_func2();
3263 /* The base_func ref from the following inline asm should find
3264 the global one, not the local decl from this function. */
3265 asm volatile(".weak override_func3\n.set override_func3, base_func");
3266 override_func3();
3267 /* Check that we can also load structs of appropriate layout
3268 into registers. */
3269 asm volatile("" : "=r" (asmret) : "0"(s2));
3270 if (asmret != s2.addr)
3271 printf("asmstr: failed\n");
3272 #ifdef BOOL_ISOC99
3273 /* Check that the typesize correctly sets the register size to
3274 8 bit. */
3275 asm volatile("cmp %1,%2; sete %0" : "=a"(somebool) : "r"(1), "r"(2));
3276 if (!somebool)
3277 printf("asmbool: failed\n");
3278 #endif
3279 printf("asmstr: %s\n", get_asm_string());
3280 val = 43;
3281 fancy_copy (&val, &val2);
3282 printf ("fancycpy(%d)=%d\n", val, val2);
3283 val = 44;
3284 fancy_copy2 (&val, &val2);
3285 printf ("fancycpy2(%d)=%d\n", val, val2);
3286 asm volatile ("mov $0x4243, %%esi" : "=r" (regvar));
3287 printf ("regvar=%x\n", regvar);
3288 test_high_clobbers();
3289 trace_console(8, 8);
3290 return;
3291 label1:
3292 goto label2;
3295 #else
3297 void asm_test(void)
3301 #endif
3303 #define COMPAT_TYPE(type1, type2) \
3305 printf("__builtin_types_compatible_p(%s, %s) = %d\n", #type1, #type2, \
3306 __builtin_types_compatible_p (type1, type2));\
3309 int constant_p_var;
3311 void builtin_test(void)
3313 short s;
3314 int i;
3315 long long ll;
3316 #if GCC_MAJOR >= 3
3317 COMPAT_TYPE(int, int);
3318 COMPAT_TYPE(int, unsigned int);
3319 COMPAT_TYPE(int, char);
3320 COMPAT_TYPE(int, const int);
3321 COMPAT_TYPE(int, volatile int);
3322 COMPAT_TYPE(int *, int *);
3323 COMPAT_TYPE(int *, void *);
3324 COMPAT_TYPE(int *, const int *);
3325 COMPAT_TYPE(char *, unsigned char *);
3326 COMPAT_TYPE(char *, signed char *);
3327 COMPAT_TYPE(char *, char *);
3328 /* space is needed because tcc preprocessor introduces a space between each token */
3329 COMPAT_TYPE(char * *, void *);
3330 #endif
3331 printf("res = %d\n", __builtin_constant_p(1));
3332 printf("res = %d\n", __builtin_constant_p(1 + 2));
3333 printf("res = %d\n", __builtin_constant_p(&constant_p_var));
3334 printf("res = %d\n", __builtin_constant_p(constant_p_var));
3335 printf("res = %d\n", __builtin_constant_p(100000 / constant_p_var));
3336 s = 1;
3337 ll = 2;
3338 i = __builtin_choose_expr (1 != 0, ll, s);
3339 printf("bce: %d\n", i);
3340 i = __builtin_choose_expr (1 != 1, ll, s);
3341 printf("bce: %d\n", i);
3342 i = sizeof (__builtin_choose_expr (1, ll, s));
3343 printf("bce: %d\n", i);
3344 i = sizeof (__builtin_choose_expr (0, ll, s));
3345 printf("bce: %d\n", i);
3347 printf("bera: %p\n", __builtin_extract_return_addr((void*)43));
3350 #ifndef _WIN32
3351 extern int __attribute__((weak)) weak_f1(void);
3352 extern int __attribute__((weak)) weak_f2(void);
3353 extern int weak_f3(void);
3354 extern int __attribute__((weak)) weak_v1;
3355 extern int __attribute__((weak)) weak_v2;
3356 extern int weak_v3;
3358 extern int (*weak_fpa)() __attribute__((weak));
3359 extern int __attribute__((weak)) (*weak_fpb)();
3360 extern __attribute__((weak)) int (*weak_fpc)();
3362 extern int weak_asm_f1(void) asm("weak_asm_f1x") __attribute((weak));
3363 extern int __attribute((weak)) weak_asm_f2(void) asm("weak_asm_f2x") ;
3364 extern int __attribute((weak)) weak_asm_f3(void) asm("weak_asm_f3x") __attribute((weak));
3365 extern int weak_asm_v1 asm("weak_asm_v1x") __attribute((weak));
3366 extern int __attribute((weak)) weak_asm_v2 asm("weak_asm_v2x") ;
3367 extern int __attribute((weak)) weak_asm_v3(void) asm("weak_asm_v3x") __attribute((weak));
3369 static const size_t dummy = 0;
3370 extern __typeof(dummy) weak_dummy1 __attribute__((weak, alias("dummy")));
3371 extern __typeof(dummy) __attribute__((weak, alias("dummy"))) weak_dummy2;
3372 extern __attribute__((weak, alias("dummy"))) __typeof(dummy) weak_dummy3;
3374 int some_lib_func(void);
3375 int dummy_impl_of_slf(void) { return 444; }
3376 int some_lib_func(void) __attribute__((weak, alias("dummy_impl_of_slf")));
3378 int weak_toolate() __attribute__((weak));
3379 int weak_toolate() { return 0; }
3381 void __attribute__((weak)) weak_test(void)
3383 printf("weak_f1=%d\n", weak_f1 ? weak_f1() : 123);
3384 printf("weak_f2=%d\n", weak_f2 ? weak_f2() : 123);
3385 printf("weak_f3=%d\n", weak_f3 ? weak_f3() : 123);
3386 printf("weak_v1=%d\n",&weak_v1 ? weak_v1 : 123);
3387 printf("weak_v2=%d\n",&weak_v2 ? weak_v2 : 123);
3388 printf("weak_v3=%d\n",&weak_v3 ? weak_v3 : 123);
3390 printf("weak_fpa=%d\n",&weak_fpa ? weak_fpa() : 123);
3391 printf("weak_fpb=%d\n",&weak_fpb ? weak_fpb() : 123);
3392 printf("weak_fpc=%d\n",&weak_fpc ? weak_fpc() : 123);
3394 printf("weak_asm_f1=%d\n", weak_asm_f1 != NULL);
3395 printf("weak_asm_f2=%d\n", weak_asm_f2 != NULL);
3396 printf("weak_asm_f3=%d\n", weak_asm_f3 != NULL);
3397 printf("weak_asm_v1=%d\n",&weak_asm_v1 != NULL);
3398 printf("weak_asm_v2=%d\n",&weak_asm_v2 != NULL);
3399 printf("weak_asm_v3=%d\n",&weak_asm_v3 != NULL);
3400 printf("some_lib_func=%d\n", &some_lib_func ? some_lib_func() : 0);
3403 int __attribute__((weak)) weak_f2() { return 222; }
3404 int __attribute__((weak)) weak_f3() { return 333; }
3405 int __attribute__((weak)) weak_v2 = 222;
3406 int __attribute__((weak)) weak_v3 = 333;
3407 #endif
3409 void const_func(const int a)
3413 void const_warn_test(void)
3415 const_func(1);
3418 struct condstruct {
3419 int i;
3422 int getme (struct condstruct *s, int i)
3424 int i1 = (i == 0 ? 0 : s)->i;
3425 int i2 = (i == 0 ? s : 0)->i;
3426 int i3 = (i == 0 ? (void*)0 : s)->i;
3427 int i4 = (i == 0 ? s : (void*)0)->i;
3428 return i1 + i2 + i3 + i4;
3431 struct global_data
3433 int a[40];
3434 int *b[40];
3437 struct global_data global_data;
3439 int global_data_getstuff (int *, int);
3441 void global_data_callit (int i)
3443 *global_data.b[i] = global_data_getstuff (global_data.b[i], 1);
3446 int global_data_getstuff (int *p, int i)
3448 return *p + i;
3451 void global_data_test (void)
3453 global_data.a[0] = 42;
3454 global_data.b[0] = &global_data.a[0];
3455 global_data_callit (0);
3456 printf ("%d\n", global_data.a[0]);
3459 struct cmpcmpS
3461 unsigned char fill : 3;
3462 unsigned char b1 : 1;
3463 unsigned char b2 : 1;
3464 unsigned char fill2 : 3;
3467 int glob1, glob2, glob3;
3469 void compare_comparisons (struct cmpcmpS *s)
3471 if (s->b1 != (glob1 == glob2)
3472 || (s->b2 != (glob1 == glob3)))
3473 printf ("comparing comparisons broken\n");
3476 void cmp_comparison_test(void)
3478 struct cmpcmpS s;
3479 s.b1 = 1;
3480 glob1 = 42; glob2 = 42;
3481 s.b2 = 0;
3482 glob3 = 43;
3483 compare_comparisons (&s);
3486 int fcompare (double a, double b, int code)
3488 switch (code) {
3489 case 0: return a == b;
3490 case 1: return a != b;
3491 case 2: return a < b;
3492 case 3: return a >= b;
3493 case 4: return a > b;
3494 case 5: return a <= b;
3498 void math_cmp_test(void)
3500 double nan = 0.0/0.0;
3501 double one = 1.0;
3502 double two = 2.0;
3503 int comp = 0;
3504 #define bug(a,b,op,iop,part) printf("Test broken: %s %s %s %s %d\n", #a, #b, #op, #iop, part)
3506 /* This asserts that "a op b" is _not_ true, but "a iop b" is true.
3507 And it does this in various ways so that all code generation paths
3508 are checked (generating inverted tests, or non-inverted tests, or
3509 producing a 0/1 value without jumps (that's done in the fcompare
3510 function). */
3511 #define FCMP(a,b,op,iop,code) \
3512 if (fcompare (a,b,code)) \
3513 bug (a,b,op,iop,1); \
3514 if (a op b) \
3515 bug (a,b,op,iop,2); \
3516 if (a iop b) \
3518 else \
3519 bug (a,b,op,iop,3); \
3520 if ((a op b) || comp) \
3521 bug (a,b,op,iop,4); \
3522 if ((a iop b) || comp) \
3524 else \
3525 bug (a,b,op,iop,5);
3527 /* Equality tests. */
3528 FCMP(nan, nan, ==, !=, 0);
3529 FCMP(one, two, ==, !=, 0);
3530 FCMP(one, one, !=, ==, 1);
3531 /* Non-equality is a bit special. */
3532 if (!fcompare (nan, nan, 1))
3533 bug (nan, nan, !=, ==, 6);
3535 /* Relational tests on numbers. */
3536 FCMP(two, one, <, >=, 2);
3537 FCMP(one, two, >=, <, 3);
3538 FCMP(one, two, >, <=, 4);
3539 FCMP(two, one, <=, >, 5);
3541 /* Relational tests on NaNs. Note that the inverse op here is
3542 always !=, there's no operator in C that is equivalent to !(a < b),
3543 when NaNs are involved, same for the other relational ops. */
3544 FCMP(nan, nan, <, !=, 2);
3545 FCMP(nan, nan, >=, !=, 3);
3546 FCMP(nan, nan, >, !=, 4);
3547 FCMP(nan, nan, <=, !=, 5);
3550 double get100 () { return 100.0; }
3552 void callsave_test(void)
3554 #if defined __i386__ || defined __x86_64__ || defined __arm__
3555 int i, s; double *d; double t;
3556 s = sizeof (double);
3557 printf ("callsavetest: %d\n", s);
3558 d = alloca (sizeof(double));
3559 d[0] = 10.0;
3560 /* x86-64 had a bug were the next call to get100 would evict
3561 the lvalue &d[0] as VT_LLOCAL, and the reload would be done
3562 in int type, not pointer type. When alloca returns a pointer
3563 with the high 32 bit set (which is likely on x86-64) the access
3564 generates a segfault. */
3565 i = d[0] > get100 ();
3566 printf ("%d\n", i);
3567 #endif
3571 void bfa3(ptrdiff_t str_offset)
3573 printf("bfa3: %s\n", (char *)__builtin_frame_address(3) + str_offset);
3575 void bfa2(ptrdiff_t str_offset)
3577 printf("bfa2: %s\n", (char *)__builtin_frame_address(2) + str_offset);
3578 bfa3(str_offset);
3580 void bfa1(ptrdiff_t str_offset)
3582 printf("bfa1: %s\n", (char *)__builtin_frame_address(1) + str_offset);
3583 bfa2(str_offset);
3586 void builtin_frame_address_test(void)
3588 /* builtin_frame_address fails on ARM with gcc which make test3 fail */
3589 #ifndef __arm__
3590 char str[] = "__builtin_frame_address";
3591 char *fp0 = __builtin_frame_address(0);
3593 printf("str: %s\n", str);
3594 bfa1(str-fp0);
3595 #endif
3598 char via_volatile (char i)
3600 char volatile vi;
3601 vi = i;
3602 return vi;
3605 struct __attribute__((__packed__)) Spacked {
3606 char a;
3607 short b;
3608 int c;
3610 struct Spacked spacked;
3611 typedef struct __attribute__((__packed__)) {
3612 char a;
3613 short b;
3614 int c;
3615 } Spacked2;
3616 Spacked2 spacked2;
3617 /* This doesn't work for now. Requires adjusting field offsets/sizes
3618 after parsing the struct members. */
3619 typedef struct Spacked3_s {
3620 char a;
3621 short b;
3622 int c;
3623 } __attribute__((__packed__)) Spacked3;
3624 Spacked3 spacked3;
3625 struct gate_struct64 {
3626 unsigned short offset_low;
3627 unsigned short segment;
3628 unsigned ist : 3, zero0 : 5, type : 5, dpl : 2, p : 1;
3629 unsigned short offset_middle;
3630 unsigned offset_high;
3631 unsigned zero1;
3632 } __attribute__((packed));
3633 typedef struct gate_struct64 gate_desc;
3634 gate_desc a_gate_desc;
3635 void attrib_test(void)
3637 printf("attr: %d %d %d %d\n", sizeof(struct Spacked),
3638 sizeof(spacked), sizeof(Spacked2), sizeof(spacked2));
3639 printf("attr: %d %d\n", sizeof(Spacked3), sizeof(spacked3));
3640 printf("attr: %d %d\n", sizeof(gate_desc), sizeof(a_gate_desc));
3642 extern __attribute__((__unused__)) char * __attribute__((__unused__)) *
3643 strange_attrib_placement (void);
3645 void * __attribute__((__unused__)) get_void_ptr (void *a)
3647 return a;