tinycc/tests
Philip 059aea5d35 fix a subtle x86-64 calling bug
I ran into an issue playing with tinycc, and tracked it down to a rather
weird assumption in the function calling code. This breaks only when
varargs and float/double arguments are combined, I think, and only when
calling GCC-generated (or non-TinyCC, at least) code. The problem is we
sometimes generate code like this:

804a468: 4c 89 d9 mov %r11,%rcx
804a46b: b8 01 00 00 00 mov $0x1,%eax
804a470: 48 8b 45 c0 mov -0x40(%rbp),%rax
804a474: 4c 8b 18 mov (%rax),%r11
804a477: 41 ff d3 callq *%r11

for a function call. Note how $eax is first set to the correct value,
then clobbered when we try to load the function pointer into R11. With
the patch, the code generated is:

804a468: 4c 89 d9 mov %r11,%rcx
804a46b: b8 01 00 00 00 mov $0x1,%eax
804a470: 4c 8b 5d c0 mov -0x40(%rbp),%r11
804a474: 4d 8b 1b mov (%r11),%r11
804a477: 41 ff d3 callq *%r11

which is correct.

This becomes an issue when get_reg(RC_INT) is modified not always to
return %rax after a save_regs(0), because then another register (%ecx,
say) is clobbered, and the function passed an invalid argument.

A rather convoluted test case that generates the above code is
included. Please note that the test will not cause a failure because
TinyCC code ignores the %rax argument, but it will cause incorrect
behavior when combined with GCC code, which might wrongly fail to save
XMM registers and cause data corruption.
2015-04-23 18:08:28 +00:00
..
tests2 * and #pragma pop_macro("macro_name") 2015-04-21 06:34:35 +03:00
abitest.c fix a subtle x86-64 calling bug 2015-04-23 18:08:28 +00:00
asmtest.S Allow tcc to understand a setob,... opcodes as alias to seto,... 2015-01-06 22:59:19 +03:00
boundtest.c a bounds checking code for the ARCH=x86_64 2015-04-10 15:17:22 +03:00
CMakeLists.txt Improved variable length array support. 2013-04-27 22:58:52 +01:00
gcctestsuite.sh Fix bashims in configure and gcctestsuite.sh. 2010-05-26 14:08:29 +02:00
libtcc_test.c remove a compilation warnings for libtest and test3 2015-04-10 06:44:34 +03:00
Makefile -fdollar-in-identifiers addon 2015-04-20 03:44:08 +03:00
tcctest.c Disable floating-point test for ARM soft-float 2015-03-03 17:28:13 +03:00
tcctest.py Added cross compilation to CMake build system. 2013-04-25 01:08:18 +01:00
vla_test.c Improved variable length array support. 2013-04-27 22:58:52 +01:00