I really should do this when less tired; I keep breaking one platform while fixing another. I've also fixed some Windows issues with tcctest since Windows printf() uses different format flags to those on Linux, and removed some conditional compilation tests in tcctest since they now should work.
Unified · Split
| @@ -5,13 +5,12 @@ if(WIN32) · 4 unmodified lines | |||
| 5 | set(TCC_CFLAGS ${TCC_CFLAGS} -I${CMAKE_SOURCE_DIR}/win32/include) | 5 | set(TCC_CFLAGS ${TCC_CFLAGS} -I${CMAKE_SOURCE_DIR}/win32/include) |
| 6 | else() | 6 | else() |
| 7 | set(TCC_MATH_LDFLAGS -lm) | 7 | set(TCC_MATH_LDFLAGS -lm) |
| 8 | set(LIBTCC_EXTRA_LIBS dl) | ||
| 8 | set(LIBTCC_LDFLAGS -ldl -lm -Wl,-rpath=${CMAKE_BINARY_DIR}) | 9 | set(LIBTCC_LDFLAGS -ldl -lm -Wl,-rpath=${CMAKE_BINARY_DIR}) |
| 9 | endif() | 10 | endif() |
| 10 | 11 | ||
| 11 | add_executable(abitest-cc abitest.c) | 12 | add_executable(abitest-cc abitest.c) |
| 12 | if(NOT WIN32) | 13 | target_link_libraries(abitest-cc libtcc ${LIBTCC_EXTRA_LIBS}) |
| 13 | target_link_libraries(abitest-cc libtcc dl) | ||
| 14 | endif() | ||
| 15 | add_test(NAME abitest-cc WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND abitest-cc lib_path=${CMAKE_BINARY_DIR} include=${CMAKE_SOURCE_DIR}/include) | 14 | add_test(NAME abitest-cc WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND abitest-cc lib_path=${CMAKE_BINARY_DIR} include=${CMAKE_SOURCE_DIR}/include) |
| 16 | 15 | ||
| 17 | set(ABITEST_TCC abitest-tcc${CMAKE_EXECUTABLE_SUFFIX}) | 16 | set(ABITEST_TCC abitest-tcc${CMAKE_EXECUTABLE_SUFFIX}) |
| @@ -16,6 +16,14 @@ · 15 unmodified lines | |||
| 16 | 16 | ||
| 17 | #endif | 17 | #endif |
| 18 | 18 | ||
| 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 | ||
| 26 | |||
| 19 | // MinGW has 80-bit rather than 64-bit long double which isn't compatible with TCC or MSVC | 27 | // MinGW has 80-bit rather than 64-bit long double which isn't compatible with TCC or MSVC |
| 20 | #if defined(_WIN32) && defined(__GNUC__) | 28 | #if defined(_WIN32) && defined(__GNUC__) |
| 21 | #define LONG_DOUBLE double | 29 | #define LONG_DOUBLE double |
| @@ -263,7 +271,7 @@ void macro_test(void) · 241 unmodified lines | |||
| 263 | printf("func='%s'\n", __FUNCTION__); | 271 | printf("func='%s'\n", __FUNCTION__); |
| 264 | 272 | ||
| 265 | /* complicated macros in glibc */ | 273 | /* complicated macros in glibc */ |
| 266 | printf("INT64_MIN=%Ld\n", INT64_MIN); | 274 | printf("INT64_MIN=" LONG_LONG_FORMAT "\n", INT64_MIN); |
| 267 | { | 275 | { |
| 268 | int a; | 276 | int a; |
| 269 | a = 1; | 277 | a = 1; |
| @@ -1711,19 +1719,19 @@ void lloptest(long long a, long long b) · 1441 unmodified lines | |||
| 1711 | ua = a; | 1719 | ua = a; |
| 1712 | ub = b; | 1720 | ub = b; |
| 1713 | /* arith */ | 1721 | /* arith */ |
| 1714 | printf("arith: %Ld %Ld %Ld\n", | 1722 | printf("arith: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", |
| 1715 | a + b, | 1723 | a + b, |
| 1716 | a - b, | 1724 | a - b, |
| 1717 | a * b); | 1725 | a * b); |
| 1718 | 1726 | ||
| 1719 | if (b != 0) { | 1727 | if (b != 0) { |
| 1720 | printf("arith1: %Ld %Ld\n", | 1728 | printf("arith1: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", |
| 1721 | a / b, | 1729 | a / b, |
| 1722 | a % b); | 1730 | a % b); |
| 1723 | } | 1731 | } |
| 1724 | 1732 | ||
| 1725 | /* binary */ | 1733 | /* binary */ |
| 1726 | printf("bin: %Ld %Ld %Ld\n", | 1734 | printf("bin: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", |
| 1727 | a & b, | 1735 | a & b, |
| 1728 | a | b, | 1736 | a | b, |
| 1729 | a ^ b); | 1737 | a ^ b); |
| @@ -1748,25 +1756,25 @@ void lloptest(long long a, long long b) · 18 unmodified lines | |||
| 1748 | /* arith2 */ | 1756 | /* arith2 */ |
| 1749 | a++; | 1757 | a++; |
| 1750 | b++; | 1758 | b++; |
| 1751 | printf("arith2: %Ld %Ld\n", a, b); | 1759 | printf("arith2: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", a, b); |
| 1752 | printf("arith2: %Ld %Ld\n", a++, b++); | 1760 | printf("arith2: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", a++, b++); |
| 1753 | printf("arith2: %Ld %Ld\n", --a, --b); | 1761 | printf("arith2: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", --a, --b); |
| 1754 | printf("arith2: %Ld %Ld\n", a, b); | 1762 | printf("arith2: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", a, b); |
| 1755 | b = ub = 0; | 1763 | b = ub = 0; |
| 1756 | printf("not: %d %d %d %d\n", !a, !ua, !b, !ub); | 1764 | printf("not: %d %d %d %d\n", !a, !ua, !b, !ub); |
| 1757 | } | 1765 | } |
| 1758 | 1766 | ||
| 1759 | void llshift(long long a, int b) | 1767 | void llshift(long long a, int b) |
| 1760 | { | 1768 | { |
| 1761 | printf("shift: %Ld %Ld %Ld\n", | 1769 | printf("shift: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", |
| 1762 | (unsigned long long)a >> b, | 1770 | (unsigned long long)a >> b, |
| 1763 | a >> b, | 1771 | a >> b, |
| 1764 | a << b); | 1772 | a << b); |
| 1765 | printf("shiftc: %Ld %Ld %Ld\n", | 1773 | printf("shiftc: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", |
| 1766 | (unsigned long long)a >> 3, | 1774 | (unsigned long long)a >> 3, |
| 1767 | a >> 3, | 1775 | a >> 3, |
| 1768 | a << 3); | 1776 | a << 3); |
| 1769 | printf("shiftc: %Ld %Ld %Ld\n", | 1777 | printf("shiftc: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", |
| 1770 | (unsigned long long)a >> 35, | 1778 | (unsigned long long)a >> 35, |
| 1771 | a >> 35, | 1779 | a >> 35, |
| 1772 | a << 35); | 1780 | a << 35); |
| @@ -1783,7 +1791,7 @@ void llfloat(void) · 10 unmodified lines | |||
| 1783 | ula = 0x72345678; | 1791 | ula = 0x72345678; |
| 1784 | la = (la << 20) | 0x12345; | 1792 | la = (la << 20) | 0x12345; |
| 1785 | ula = ula << 33; | 1793 | ula = ula << 33; |
| 1786 | printf("la=%Ld ula=%Lu\n", la, ula); | 1794 | printf("la=" LONG_LONG_FORMAT " ula=" ULONG_LONG_FORMAT "\n", la, ula); |
| 1787 | 1795 | ||
| 1788 | fa = la; | 1796 | fa = la; |
| 1789 | da = la; | 1797 | da = la; |
| @@ -1793,7 +1801,7 @@ void llfloat(void) · 3 unmodified lines | |||
| 1793 | la = fa; | 1801 | la = fa; |
| 1794 | lb = da; | 1802 | lb = da; |
| 1795 | lc = lda; | 1803 | lc = lda; |
| 1796 | printf("ftoll: %Ld %Ld %Ld\n", la, lb, lc); | 1804 | printf("ftoll: " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", la, lb, lc); |
| 1797 | 1805 | ||
| 1798 | fa = ula; | 1806 | fa = ula; |
| 1799 | da = ula; | 1807 | da = ula; |
| @@ -1803,7 +1811,7 @@ void llfloat(void) · 3 unmodified lines | |||
| 1803 | ula = fa; | 1811 | ula = fa; |
| 1804 | ulb = da; | 1812 | ulb = da; |
| 1805 | ulc = lda; | 1813 | ulc = lda; |
| 1806 | printf("ftoull: %Lu %Lu %Lu\n", ula, ulb, ulc); | 1814 | printf("ftoull: " ULONG_LONG_FORMAT " " ULONG_LONG_FORMAT " " ULONG_LONG_FORMAT "\n", ula, ulb, ulc); |
| 1807 | } | 1815 | } |
| 1808 | 1816 | ||
| 1809 | long long llfunc1(int a) | 1817 | long long llfunc1(int a) |
| @@ -1832,14 +1840,14 @@ void longlong_test(void) · 22 unmodified lines | |||
| 1832 | ua = -2; | 1840 | ua = -2; |
| 1833 | a = ia; | 1841 | a = ia; |
| 1834 | b = ua; | 1842 | b = ua; |
| 1835 | printf("%Ld %Ld\n", a, b); | 1843 | printf(LONG_LONG_FORMAT " " LONG_LONG_FORMAT "\n", a, b); |
| 1836 | printf("%Ld %Ld %Ld %Lx\n", | 1844 | printf(LONG_LONG_FORMAT " " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " %Lx\n", |
| 1837 | (long long)1, | 1845 | (long long)1, |
| 1838 | (long long)-2, | 1846 | (long long)-2, |
| 1839 | 1LL, | 1847 | 1LL, |
| 1840 | 0x1234567812345679); | 1848 | 0x1234567812345679); |
| 1841 | a = llfunc1(-3); | 1849 | a = llfunc1(-3); |
| 1842 | printf("%Ld\n", a); | 1850 | printf(LONG_LONG_FORMAT "\n", a); |
| 1843 | 1851 | ||
| 1844 | lloptest(1000, 23); | 1852 | lloptest(1000, 23); |
| 1845 | lloptest(0xff, 0x1234); | 1853 | lloptest(0xff, 0x1234); |
| @@ -1880,7 +1888,7 @@ void longlong_test(void) · 34 unmodified lines | |||
| 1880 | b = 4294967295LL; | 1888 | b = 4294967295LL; |
| 1881 | printf("%d %d %d %d\n", a > b, a < b, a >= b, a <= b); | 1889 | printf("%d %d %d %d\n", a > b, a < b, a >= b, a <= b); |
| 1882 | 1890 | ||
| 1883 | printf("%Ld\n", 0x123456789LLU); | 1891 | printf(LONG_LONG_FORMAT "\n", 0x123456789LLU); |
| 1884 | } | 1892 | } |
| 1885 | 1893 | ||
| 1886 | void manyarg_test(void) | 1894 | void manyarg_test(void) |
| @@ -1891,34 +1899,31 @@ void manyarg_test(void) · 4 unmodified lines | |||
| 1891 | 1, 2, 3, 4, 5, 6, 7, 8, | 1899 | 1, 2, 3, 4, 5, 6, 7, 8, |
| 1892 | 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0); | 1900 | 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0); |
| 1893 | printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f " | 1901 | printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f " |
| 1894 | "%Ld %Ld %f %f\n", | 1902 | LONG_LONG_FORMAT " " LONG_LONG_FORMAT " %f %f\n", |
| 1895 | 1, 2, 3, 4, 5, 6, 7, 8, | 1903 | 1, 2, 3, 4, 5, 6, 7, 8, |
| 1896 | 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0, | 1904 | 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0, |
| 1897 | 1234567891234LL, 987654321986LL, | 1905 | 1234567891234LL, 987654321986LL, |
| 1898 | 42.0, 43.0); | 1906 | 42.0, 43.0); |
| 1899 | printf("%Lf %d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f " | 1907 | printf("%Lf %d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f " |
| 1900 | "%Ld %Ld %f %f\n", | 1908 | LONG_LONG_FORMAT " " LONG_LONG_FORMAT " %f %f\n", |
| 1901 | ld, 1, 2, 3, 4, 5, 6, 7, 8, | 1909 | ld, 1, 2, 3, 4, 5, 6, 7, 8, |
| 1902 | 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0, | 1910 | 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0, |
| 1903 | 1234567891234LL, 987654321986LL, | 1911 | 1234567891234LL, 987654321986LL, |
| 1904 | 42.0, 43.0); | 1912 | 42.0, 43.0); |
| 1905 | /* XXX: known bug of x86-64 */ | ||
| 1906 | #ifndef __x86_64__ | ||
| 1907 | printf("%d %d %d %d %d %d %d %d %Lf\n", | 1913 | printf("%d %d %d %d %d %d %d %d %Lf\n", |
| 1908 | 1, 2, 3, 4, 5, 6, 7, 8, ld); | 1914 | 1, 2, 3, 4, 5, 6, 7, 8, ld); |
| 1909 | printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f " | 1915 | printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f " |
| 1910 | "%Ld %Ld %f %f %Lf\n", | 1916 | LONG_LONG_FORMAT " " LONG_LONG_FORMAT "%f %f %Lf\n", |
| 1911 | 1, 2, 3, 4, 5, 6, 7, 8, | 1917 | 1, 2, 3, 4, 5, 6, 7, 8, |
| 1912 | 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0, | 1918 | 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0, |
| 1913 | 1234567891234LL, 987654321986LL, | 1919 | 1234567891234LL, 987654321986LL, |
| 1914 | 42.0, 43.0, ld); | 1920 | 42.0, 43.0, ld); |
| 1915 | printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f " | 1921 | printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f " |
| 1916 | "%Lf %Ld %Ld %f %f %Lf\n", | 1922 | "%Lf " LONG_LONG_FORMAT " " LONG_LONG_FORMAT " %f %f %Lf\n", |
| 1917 | 1, 2, 3, 4, 5, 6, 7, 8, | 1923 | 1, 2, 3, 4, 5, 6, 7, 8, |
| 1918 | 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0, | 1924 | 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0, |
| 1919 | ld, 1234567891234LL, 987654321986LL, | 1925 | ld, 1234567891234LL, 987654321986LL, |
| 1920 | 42.0, 43.0, ld); | 1926 | 42.0, 43.0, ld); |
| 1921 | #endif | ||
| 1922 | } | 1927 | } |
| 1923 | 1928 | ||
| 1924 | void vprintf1(const char *fmt, ...) | 1929 | void vprintf1(const char *fmt, ...) |
| @@ -1954,7 +1959,7 @@ void vprintf1(const char *fmt, ...) · 29 unmodified lines | |||
| 1954 | break; | 1959 | break; |
| 1955 | case 'l': | 1960 | case 'l': |
| 1956 | ll = va_arg(ap, long long); | 1961 | ll = va_arg(ap, long long); |
| 1957 | printf("%Ld", ll); | 1962 | printf(LONG_LONG_FORMAT, ll); |
| 1958 | break; | 1963 | break; |
| 1959 | case 'F': | 1964 | case 'F': |
| 1960 | ld = va_arg(ap, LONG_DOUBLE); | 1965 | ld = va_arg(ap, LONG_DOUBLE); |
| @@ -1999,11 +2004,8 @@ void stdarg_test(void) · 38 unmodified lines | |||
| 1999 | vprintf1("%f %d %f\n", 1.0, 2, 3.0); | 2004 | vprintf1("%f %d %f\n", 1.0, 2, 3.0); |
| 2000 | vprintf1("%l %l %d %f\n", 1234567891234LL, 987654321986LL, 3, 1234.0); | 2005 | vprintf1("%l %l %d %f\n", 1234567891234LL, 987654321986LL, 3, 1234.0); |
| 2001 | vprintf1("%F %F %F\n", LONG_DOUBLE_LITERAL(1.2), LONG_DOUBLE_LITERAL(2.3), LONG_DOUBLE_LITERAL(3.4)); | 2006 | vprintf1("%F %F %F\n", LONG_DOUBLE_LITERAL(1.2), LONG_DOUBLE_LITERAL(2.3), LONG_DOUBLE_LITERAL(3.4)); |
| 2002 | #ifdef __x86_64__ | ||
| 2003 | /* a bug of x86's TCC */ | ||
| 2004 | vprintf1("%d %f %l %F %d %f %l %F\n", | 2007 | vprintf1("%d %f %l %F %d %f %l %F\n", |
| 2005 | 1, 1.2, 3L, 4.5L, 6, 7.8, 9L, 0.1L); | 2008 | 1, 1.2, 3LL, LONG_DOUBLE_LITERAL(4.5), 6, 7.8, 9LL, LONG_DOUBLE_LITERAL(0.1)); |
| 2006 | #endif | ||
| 2007 | vprintf1("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f\n", | 2009 | vprintf1("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f\n", |
| 2008 | 1, 2, 3, 4, 5, 6, 7, 8, | 2010 | 1, 2, 3, 4, 5, 6, 7, 8, |
| 2009 | 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8); | 2011 | 0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8); |