tinycc/tests/tests2/117_gcc_test.c
herman ten brugge 9712aff9c0 Fix gcc testsuite problems
arm-gen.c:
- is_hgen_float_aggr/gfunc_sret: Fix for zero sized structs

arm64-gen.c:
- arm64_ldrs: Fix for zero sized structs
- arm64_sym: Use R_AARCH64_ABS64 instead of R_AARCH64_MOVW_UABS_G*
             This has same speed. See 117_gcc_test.c(tst_adr)
- load: Fix for zero sized structs and add VT_CONST | VT_LVAL support
- store: add VT_CONST | VT_LVAL support
- arm64_gen_bl_or_b: Allow branch. See 117_gcc_test.c(tst_branch)
- gen_bounds_prolog: Use R_AARCH64_ABS64 for bound checking
- gen_bounds_epilog: Use R_AARCH64_ABS64 for bound checking
- gfunc_call: Allow large stack
- arm64_gen_opic: Do not crash on large shift

riscv64-gen.c:
- load: Move type_size call. (move_reg set sv.type.ref NULL for VT_STRUCT)
- gfunc_call: Allow large stack
- gen_opil: Fix word mode calls

x86_64-gen.c:
- load: Fix for zero sized structs

libtcc.c:
- Add some defines for gcc testsuite (only most common)

tccgen.c:
- parse_builtin_params: Add types for builtins
- unary: Add builtins: __builtin_abort __builtin_memcpy __builtin_memcmp
                       __builtin_memmove __builtin_memset __builtin_strlen
                       __builtin_strcpy __builtin_strncpy __builtin_strcmp
                       __builtin_strncmp __builtin_strcat __builtin_strchr
                       __builtin_strdup __builtin_malloc __builtin_realloc
                       __builtin_calloc __builtin_free __builtin_alloca
- decl_initializer: Fix crash. See 60_errors_and_warnings(test_var_array)

tccmacho.c:
- Remove 'ret = 0'

tcctok.h:
- Add builtin/bound checking tokens

tests/gcctestsuite.sh:
- Add more counters and run execute tests

tests/bug.c
- Some remaining bugs in tcc (not complete)

tests/tests2/60_errors_and_warnings:
- Add test_var_array test

tests/tests2/117_gcc_test:
- New test

Results of gcctestsuite.sh for all targets:

linux:
x86_64: 3036 test(s) ok.  328 test(s) failed.  24 test(s) exe failed.
i386:   3037 test(s) ok.  327 test(s) failed.  24 test(s) exe failed.
arm:    2986 test(s) ok.  362 test(s) failed.  40 test(s) exe failed.
arm64:  2996 test(s) ok.  367 test(s) failed.  25 test(s) exe failed.
macos:  3031 test(s) ok.  332 test(s) failed.  25 test(s) exe failed.
riscv:  2948 test(s) ok.  401 test(s) failed.  39 test(s) exe failed.

windows:
x86_64: 3027 test(s) ok.  333 test(s) failed.  28 test(s) exe failed.
i386:   3029 test(s) ok.  331 test(s) failed.  28 test(s) exe failed.

linux with bounds checking:
x86_64: 3030 test(s) ok.  328 test(s) failed.  30 test(s) exe failed.
i386:   3028 test(s) ok.  327 test(s) failed.  33 test(s) exe failed.
arm:    2997 test(s) ok.  362 test(s) failed.  29 test(s) exe failed.
arm64:  2986 test(s) ok.  367 test(s) failed.  35 test(s) exe failed.
macos:  3026 test(s) ok.  332 test(s) failed.  30 test(s) exe failed.
riscv:  2936 test(s) ok.  409 test(s) failed.  43 test(s) exe failed.

windows with bounds checking:
x86_64: 3029 test(s) ok.  332 test(s) failed.  27 test(s) exe failed.
i386:   3027 test(s) ok.  331 test(s) failed.  30 test(s) exe failed.

all: fail for complex and vector types, nested functions
     and a lot of gcc defines/buitins.
arm/arm64/riscv: fail for asm and alloca.
riscv: fail with 'error: unimp: store(struct)'
2020-07-05 14:01:50 +02:00

135 lines
2.7 KiB
C

#include <stdio.h>
void tst_branch(void)
{
goto *&&a;
printf ("dummy");
a: ;
}
void tst_void_ptr(void *pv, int i)
{
i ? *pv : *pv; // dr106
}
void tst_shift(void)
{
int i = 1;
long l = 1;
i = i << 32; // illegal. just test
l = l << 64; // illegal. just test
}
#if !defined(_WIN32)
#include <sys/mman.h>
void tst_const_addr(void)
{
void *addr = mmap ((void *)0x20000000, 4096, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS, -1, 0);
if (addr != (void *) -1) {
#if !defined(__riscv)
*(int *)0x20000000 += 42;
#endif
munmap (addr, 4096);
}
}
#endif
struct zero_struct {};
struct zero_struct tst_zero_struct(void)
{
struct zero_struct ret;
return ret;
}
struct big_struct { char a[262144]; };
struct big_struct tst_big(struct big_struct tst)
{
return tst;
}
void tst_adr (int (*fp)(char *, const char *, ...))
{
char buf[10];
(*fp)(buf, "%.0f", 5.0);
}
static const char str[] = "abcdefghijklmnopqrstuvwxyz";
void tst_builtin(void)
{
char *p;
char tmp[100];
if (__builtin_offsetof(struct big_struct, a) != 0) __builtin_abort();
p = __builtin_memcpy (tmp, str, sizeof(str));
if (p != tmp) __builtin_abort();
if (__builtin_memcmp (p, str, sizeof(str))) __builtin_abort();
p = __builtin_memmove(tmp, str, sizeof(str));
if (__builtin_memcmp (p, str, sizeof(str))) __builtin_abort();
p = __builtin_memset(tmp, 0, sizeof (tmp));
if (p != tmp || tmp[0] != 0 || tmp[99] != 0) __builtin_abort();
if (__builtin_strlen(str) != sizeof(str) - 1) __builtin_abort();
p = __builtin_strcpy(tmp, str);
if (__builtin_memcmp (p, str, sizeof(str))) __builtin_abort();
p = __builtin_strncpy(tmp, str, sizeof(str));
if (__builtin_memcmp (p, str, sizeof(str))) __builtin_abort();
if (__builtin_strcmp (p, str)) __builtin_abort();
if (__builtin_strncmp (p, str, sizeof(str))) __builtin_abort();
tmp[0] = '\0';
p = __builtin_strcat(tmp, str);
if (__builtin_memcmp (p, str, sizeof(str))) __builtin_abort();
if (__builtin_strchr(p, 'z') != &p[25]) __builtin_abort();
p = __builtin_strdup (str);
if (__builtin_memcmp (p, str, sizeof(str))) __builtin_abort();
__builtin_free(p);
p = __builtin_malloc (100);
__builtin_memset(p, 0, 100);
p = __builtin_realloc (p, 1000);
__builtin_memset(p, 0, 1000);
__builtin_free(p);
p = __builtin_calloc(10, 10);
__builtin_memset(p, 0, 100);
__builtin_free(p);
#if defined(__i386__) || defined(__x86_64__)
p = __builtin_alloca(100);
__builtin_memset(p, 0, 100);
#endif
}
int
main (void)
{
struct big_struct big;
tst_shift();
tst_void_ptr(&big.a[0], 0);
#if !defined(_WIN32)
tst_const_addr();
#endif
tst_zero_struct();
tst_big(big);
tst_adr(&sprintf);
tst_builtin();
}