diff options
Diffstat (limited to 'tests/tests2')
| -rw-r--r-- | tests/tests2/85-asm-outside-function.c | 2 | ||||
| -rw-r--r-- | tests/tests2/85-asm-outside-function.expect | 1 | ||||
| -rw-r--r-- | tests/tests2/88_codeopt.c | 68 | ||||
| -rw-r--r-- | tests/tests2/88_codeopt.expect | 2 | ||||
| -rw-r--r-- | tests/tests2/Makefile | 2 |
5 files changed, 74 insertions, 1 deletions
diff --git a/tests/tests2/85-asm-outside-function.c b/tests/tests2/85-asm-outside-function.c index 0aa7e33..dc5639a 100644 --- a/tests/tests2/85-asm-outside-function.c +++ b/tests/tests2/85-asm-outside-function.c @@ -1,7 +1,9 @@ +extern int printf (const char *, ...); extern void vide(void); __asm__("vide: ret"); int main() { vide(); + printf ("okay\n"); return 0; } diff --git a/tests/tests2/85-asm-outside-function.expect b/tests/tests2/85-asm-outside-function.expect index e69de29..dcf02b2 100644 --- a/tests/tests2/85-asm-outside-function.expect +++ b/tests/tests2/85-asm-outside-function.expect @@ -0,0 +1 @@ +okay diff --git a/tests/tests2/88_codeopt.c b/tests/tests2/88_codeopt.c new file mode 100644 index 0000000..647626f --- /dev/null +++ b/tests/tests2/88_codeopt.c @@ -0,0 +1,68 @@ +/* Check some way in where code suppression caused various + miscompilations. */ +extern int printf (const char *, ...); +typedef unsigned long size_t; + +size_t _brk_start, _brk_end; +void * extend_brk(size_t size, size_t align) +{ + size_t mask = align - 1; + void *ret = 0; + + do { + if (__builtin_expect(!!(_brk_start == 0), 0)) + do { + printf("wrong1\n"); + } while (0); + } while (0); + _brk_end = (_brk_end + mask) & ~mask; + ret = (void *)_brk_end; + _brk_end += size; + + return ret; +} + +static void get_args (int a, int b) +{ + if (a != 1) + printf("wrong2\n"); + else + printf("okay\n"); +} + +void bla(void) +{ + int __ret = 42; + ({ + if (__builtin_expect(!!(0), 0)) { + if (__builtin_expect(!!__ret, 0)) + printf("wrong3\n"); + int x = !!(__ret); + } + __ret; + }); + get_args(!!__ret, sizeof(__ret)); +} + +_Bool chk(unsigned long addr, unsigned long limit, unsigned long size) +{ + _Bool ret; + /* This just needs to compile, no runtime test. (And it doesn't compile + only with certain internal checking added that's not committed). */ + if (0) + ret = 0 != (!!(addr > limit - size)); +} + +int main() +{ + void *r; + _brk_start = 1024; + _brk_end = 1024; + r = extend_brk (4096, 16); + if (!r) + printf("wrong4\n"); + else + printf("okay\n"); + bla(); + return 0; +} diff --git a/tests/tests2/88_codeopt.expect b/tests/tests2/88_codeopt.expect new file mode 100644 index 0000000..439edfd --- /dev/null +++ b/tests/tests2/88_codeopt.expect @@ -0,0 +1,2 @@ +okay +okay diff --git a/tests/tests2/Makefile b/tests/tests2/Makefile index ababb43..b52b54a 100644 --- a/tests/tests2/Makefile +++ b/tests/tests2/Makefile @@ -59,7 +59,7 @@ all test: $(filter-out $(SKIP),$(TESTS)) $(TCC) $< -o ./$*.exe $(FILTER) 2>&1 && \ ./$*.exe $(ARGS) >$*.output 2>&1 || true; \ fi - @diff -Nbu $(SRC)/$*.expect $*.output && rm -f $*.output + @diff -Nbu $(SRC)/$*.expect $*.output && rm -f $*.output $*.exe # automatically generate .expect files with gcc: %.expect : %.c |
