From 6aa4743497968e066f6ff256a401e0c94f04107c Mon Sep 17 00:00:00 2001 From: Laurent Huberdeau Date: Fri, 7 Nov 2025 00:20:10 -0500 Subject: [PATCH] Adapt tcc-0.9.26's step to use pnut-exe instead of mes --- steps/tcc-0.9.26/pass1.kaem | 130 +++++++++++------- .../simple-patches/array_sizeof.after | 5 + .../simple-patches/array_sizeof.before | 1 + .../fix_stack_64_bit_operands_on_32_bit.after | 5 + ...fix_stack_64_bit_operands_on_32_bit.before | 3 + .../simple-patches/float_negation.after | 8 ++ .../simple-patches/float_negation.before | 8 ++ .../simple-patches/sscanf_TCC_VERSION.after | 1 + .../simple-patches/sscanf_TCC_VERSION.before | 1 + .../undefine_TCC_IS_NATIVE.after | 1 + .../undefine_TCC_IS_NATIVE.before | 1 + steps/tcc-0.9.26/tcc-0.9.26.x86.checksums | 6 +- 12 files changed, 120 insertions(+), 50 deletions(-) create mode 100644 steps/tcc-0.9.26/simple-patches/array_sizeof.after create mode 100644 steps/tcc-0.9.26/simple-patches/array_sizeof.before create mode 100644 steps/tcc-0.9.26/simple-patches/fix_stack_64_bit_operands_on_32_bit.after create mode 100644 steps/tcc-0.9.26/simple-patches/fix_stack_64_bit_operands_on_32_bit.before create mode 100644 steps/tcc-0.9.26/simple-patches/float_negation.after create mode 100644 steps/tcc-0.9.26/simple-patches/float_negation.before create mode 100644 steps/tcc-0.9.26/simple-patches/sscanf_TCC_VERSION.after create mode 100644 steps/tcc-0.9.26/simple-patches/sscanf_TCC_VERSION.before create mode 100644 steps/tcc-0.9.26/simple-patches/undefine_TCC_IS_NATIVE.after create mode 100644 steps/tcc-0.9.26/simple-patches/undefine_TCC_IS_NATIVE.before diff --git a/steps/tcc-0.9.26/pass1.kaem b/steps/tcc-0.9.26/pass1.kaem index 3a5b669e..21e2354a 100755 --- a/steps/tcc-0.9.26/pass1.kaem +++ b/steps/tcc-0.9.26/pass1.kaem @@ -28,17 +28,31 @@ cd build ungz --file ${DISTFILES}/${TCC_TAR}.tar.gz --output ${TCC_TAR}.tar ungz --file ${DISTFILES}/${MES_PKG}.tar.gz --output ${MES_PKG}.tar untar --non-strict --file ${TCC_TAR}.tar + simple-patch ${TCC_PKG}/tcctools.c \ ../simple-patches/remove-fileopen.before ../simple-patches/remove-fileopen.after simple-patch ${TCC_PKG}/tcctools.c \ ../simple-patches/addback-fileopen.before ../simple-patches/addback-fileopen.after +# Patches to get tcc to compile with pnut, these are reverted after tcc-pnut is built +simple-patch ${TCC_PKG}/tccpp.c \ + ../simple-patches/array_sizeof.before ../simple-patches/array_sizeof.after +simple-patch ${TCC_PKG}/tccgen.c \ + ../simple-patches/fix_stack_64_bit_operands_on_32_bit.before ../simple-patches/fix_stack_64_bit_operands_on_32_bit.after +simple-patch ${TCC_PKG}/tccgen.c \ + ../simple-patches/float_negation.before ../simple-patches/float_negation.after +simple-patch ${TCC_PKG}/libtcc.c \ + ../simple-patches/sscanf_TCC_VERSION.before ../simple-patches/sscanf_TCC_VERSION.after +simple-patch ${TCC_PKG}/tcc.h \ + ../simple-patches/undefine_TCC_IS_NATIVE.before ../simple-patches/undefine_TCC_IS_NATIVE.after + untar --non-strict --file ${MES_PKG}.tar +# Prepare Mes header files + # Create config.h catm ${MES_PKG}/include/mes/config.h catm ${TCC_PKG}/config.h -cd ${TCC_PKG} if match ${ARCH} x86; then MES_ARCH=x86 @@ -56,43 +70,63 @@ if match ${ARCH} riscv64; then HAVE_LONG_LONG=1 fi +mkdir ${MES_PKG}/include/arch +cp ${MES_PKG}/include/linux/${MES_ARCH}/kernel-stat.h ${MES_PKG}/include/arch/kernel-stat.h +cp ${MES_PKG}/include/linux/${MES_ARCH}/signal.h ${MES_PKG}/include/arch/signal.h +cp ${MES_PKG}/include/linux/${MES_ARCH}/syscall.h ${MES_PKG}/include/arch/syscall.h -${MES} --no-auto-compile -e main ${BINDIR}/mescc.scm -- \ - -S \ - -o tcc.s \ - -I ${INCDIR} \ - -D BOOTSTRAP=1 \ - -D HAVE_LONG_LONG=${HAVE_LONG_LONG} \ - -I . \ - -D TCC_TARGET_${TCC_TARGET_ARCH}=1 \ - -D inline= \ - -D CONFIG_TCCDIR=\"${LIBDIR}/tcc\" \ - -D CONFIG_SYSROOT=\"/\" \ - -D CONFIG_TCC_CRTPREFIX=\"${LIBDIR}\" \ - -D CONFIG_TCC_ELFINTERP=\"/mes/loader\" \ - -D CONFIG_TCC_SYSINCLUDEPATHS=\"${PREFIX}/include/mes\" \ - -D TCC_LIBGCC=\"${LIBDIR}/libc.a\" \ - -D CONFIG_TCC_LIBTCC1_MES=0 \ - -D CONFIG_TCCBOOT=1 \ - -D CONFIG_TCC_STATIC=1 \ - -D CONFIG_USE_LIBGCC=1 \ - -D TCC_VERSION=\"0.9.26\" \ - -D ONE_SOURCE=1 \ - tcc.c -${MES} --no-auto-compile -e main ${BINDIR}/mescc.scm -- \ - --base-address 0x08048000 \ - -o tcc-mes \ - -L ${LIBDIR} \ - tcc.s \ - -l c+tcc -cp tcc-mes ${BINDIR}/ -chmod 755 ${BINDIR}/tcc-mes +# Unpack pnut's portable libc, only used to bootstrap tcc-pnut -# test tcc-mes -tcc-mes -version +untar --file ${DISTFILES}/${PNUT_PKG}.tar + +# Here we go! + +cd ${TCC_PKG} + +pnut \ + -I ../pnut-laurent-small-fixes-for-TCC/portable_libc/include/ \ + -D BOOTSTRAP=1 \ + -D HAVE_LONG_LONG=0 \ + -D TCC_TARGET_${TCC_TARGET_ARCH}=1 \ + -D CONFIG_SYSROOT=\"/\" \ + -D CONFIG_TCC_CRTPREFIX=\"${LIBDIR}\" \ + -D CONFIG_TCC_ELFINTERP=\"/mes/loader\" \ + -D CONFIG_TCC_SYSINCLUDEPATHS=\"${PREFIX}/include/mes\" \ + -D TCC_LIBGCC=\"${LIBDIR}/libc.a\" \ + -D CONFIG_TCC_LIBTCC1_MES=0 \ + -D CONFIG_TCCBOOT=1 \ + -D CONFIG_TCC_STATIC=1 \ + -D CONFIG_USE_LIBGCC=1 \ + -D TCC_VERSION=\"0.9.26\" \ + -D ONE_SOURCE=1 \ + -D CONFIG_TCCDIR=\"${LIBDIR}/tcc\" \ + -D __intptr_t_defined=1 \ + tcc.c \ + ../pnut-laurent-small-fixes-for-TCC/portable_libc/libc.c \ + -o tcc-pnut + +cp tcc-pnut ${BINDIR}/ +chmod 755 ${BINDIR}/tcc-pnut + +# test tcc-pnut +tcc-pnut -version + +cd .. + +# Revert patches +simple-patch ${TCC_PKG}/tccpp.c \ + ../simple-patches/array_sizeof.after ../simple-patches/array_sizeof.before +simple-patch ${TCC_PKG}/tccgen.c \ + ../simple-patches/fix_stack_64_bit_operands_on_32_bit.after ../simple-patches/fix_stack_64_bit_operands_on_32_bit.before +simple-patch ${TCC_PKG}/tccgen.c \ + ../simple-patches/float_negation.after ../simple-patches/float_negation.before +simple-patch ${TCC_PKG}/libtcc.c \ + ../simple-patches/sscanf_TCC_VERSION.after ../simple-patches/sscanf_TCC_VERSION.before +simple-patch ${TCC_PKG}/tcc.h \ + ../simple-patches/undefine_TCC_IS_NATIVE.after ../simple-patches/undefine_TCC_IS_NATIVE.before # Recompile the mes C library -cd ../${MES_PKG} +cd ${MES_PKG} # Create unified libc file cd lib @@ -100,41 +134,41 @@ catm ../unified-libc.c ctype/isalnum.c ctype/isalpha.c ctype/isascii.c ctype/isc cd .. # crt1.o -tcc-mes -c -D HAVE_CONFIG_H=1 -I include -I include/linux/${MES_ARCH} -o ${LIBDIR}/crt1.o lib/linux/${MES_ARCH}-mes-gcc/crt1.c +tcc-pnut -c -D HAVE_CONFIG_H=1 -I include -I include/linux/${MES_ARCH} -o ${LIBDIR}/crt1.o lib/linux/${MES_ARCH}-mes-gcc/crt1.c catm ${LIBDIR}/crtn.o catm ${LIBDIR}/crti.o if match ${ARCH} x86; then # crtn.o - tcc-mes -c -D HAVE_CONFIG_H=1 -I include -I include/linux/${MES_ARCH} -o ${LIBDIR}/crtn.o lib/linux/${MES_ARCH}-mes-gcc/crtn.c + tcc-pnut -c -D HAVE_CONFIG_H=1 -I include -I include/linux/${MES_ARCH} -o ${LIBDIR}/crtn.o lib/linux/${MES_ARCH}-mes-gcc/crtn.c # crti.o - tcc-mes -c -D HAVE_CONFIG_H=1 -I include -I include/linux/${MES_ARCH} -o ${LIBDIR}/crti.o lib/linux/${MES_ARCH}-mes-gcc/crti.c + tcc-pnut -c -D HAVE_CONFIG_H=1 -I include -I include/linux/${MES_ARCH} -o ${LIBDIR}/crti.o lib/linux/${MES_ARCH}-mes-gcc/crti.c fi # libc+gcc.a -tcc-mes -c -D HAVE_CONFIG_H=1 -I include -I include/linux/${MES_ARCH} -o unified-libc.o unified-libc.c -tcc-mes -ar cr ${LIBDIR}/libc.a unified-libc.o +tcc-pnut -c -D HAVE_CONFIG_H=1 -I include -I include/linux/${MES_ARCH} -I include/arch -o unified-libc.o unified-libc.c +tcc-pnut -ar cr ${LIBDIR}/libc.a unified-libc.o # libtcc1.a mkdir ${LIBDIR}/tcc -tcc-mes -c -D HAVE_CONFIG_H=1 -D HAVE_LONG_LONG=1 -D HAVE_FLOAT=1 -I include -I include/linux/${MES_ARCH} -o libtcc1.o lib/libtcc1.c +tcc-pnut -c -D HAVE_CONFIG_H=1 -D HAVE_LONG_LONG=1 -D HAVE_FLOAT=1 -I include -I include/linux/${MES_ARCH} -o libtcc1.o lib/libtcc1.c if match ${ARCH} riscv64; then - tcc-mes -c -D HAVE_CONFIG_H=1 -D HAVE_LONG_LONG=1 -D HAVE_FLOAT=1 -I include -I include/linux/${MES_ARCH} -o lib-arm64.o ../${TCC_PKG}/lib/lib-arm64.c - tcc-mes -ar cr ${LIBDIR}/tcc/libtcc1.a libtcc1.o lib-arm64.o + tcc-pnut -c -D HAVE_CONFIG_H=1 -D HAVE_LONG_LONG=1 -D HAVE_FLOAT=1 -I include -I include/linux/${MES_ARCH} -o lib-arm64.o ../${TCC_PKG}/lib/lib-arm64.c + tcc-pnut -ar cr ${LIBDIR}/tcc/libtcc1.a libtcc1.o lib-arm64.o else - tcc-mes -ar cr ${LIBDIR}/tcc/libtcc1.a libtcc1.o + tcc-pnut -ar cr ${LIBDIR}/tcc/libtcc1.a libtcc1.o fi # libgetopt.a -tcc-mes -c -D HAVE_CONFIG_H=1 -I include -I include/linux/${MES_ARCH} lib/posix/getopt.c -tcc-mes -ar cr ${LIBDIR}/libgetopt.a getopt.o +tcc-pnut -c -D HAVE_CONFIG_H=1 -I include -I include/linux/${MES_ARCH} lib/posix/getopt.c +tcc-pnut -ar cr ${LIBDIR}/libgetopt.a getopt.o cd ../${TCC_PKG} # boot0 (ref comments here for all boot*) # compile -tcc-mes \ +tcc-pnut \ -g \ -v \ -static \ @@ -307,10 +341,12 @@ tcc -ar cr ${LIBDIR}/libgetopt.a getopt.o cd ../.. +sha256sum /usr/bin/tcc-pnut + # Checksums if match x${UPDATE_CHECKSUMS} xTrue; then sha256sum -o ${pkg}.${ARCH}.checksums \ - /usr/bin/tcc-mes \ + /usr/bin/tcc-pnut \ /usr/bin/tcc-boot0 \ /usr/bin/tcc-boot1 \ /usr/bin/tcc \ diff --git a/steps/tcc-0.9.26/simple-patches/array_sizeof.after b/steps/tcc-0.9.26/simple-patches/array_sizeof.after new file mode 100644 index 00000000..8f8b6b5e --- /dev/null +++ b/steps/tcc-0.9.26/simple-patches/array_sizeof.after @@ -0,0 +1,5 @@ +#ifdef PNUT_CC + char buf1[1024]; +#else + char buf1[sizeof file->filename]; +#endif diff --git a/steps/tcc-0.9.26/simple-patches/array_sizeof.before b/steps/tcc-0.9.26/simple-patches/array_sizeof.before new file mode 100644 index 00000000..96b3c754 --- /dev/null +++ b/steps/tcc-0.9.26/simple-patches/array_sizeof.before @@ -0,0 +1 @@ + char buf1[sizeof file->filename]; diff --git a/steps/tcc-0.9.26/simple-patches/fix_stack_64_bit_operands_on_32_bit.after b/steps/tcc-0.9.26/simple-patches/fix_stack_64_bit_operands_on_32_bit.after new file mode 100644 index 00000000..cdda60f9 --- /dev/null +++ b/steps/tcc-0.9.26/simple-patches/fix_stack_64_bit_operands_on_32_bit.after @@ -0,0 +1,5 @@ +#if HAVE_LONG_LONG_STUB || HAVE_LONG_LONG + vtop[0].c.i >>= 32; +#else + vtop[0].c.i = 0; +#endif diff --git a/steps/tcc-0.9.26/simple-patches/fix_stack_64_bit_operands_on_32_bit.before b/steps/tcc-0.9.26/simple-patches/fix_stack_64_bit_operands_on_32_bit.before new file mode 100644 index 00000000..c5045fd8 --- /dev/null +++ b/steps/tcc-0.9.26/simple-patches/fix_stack_64_bit_operands_on_32_bit.before @@ -0,0 +1,3 @@ +#if HAVE_LONG_LONG_STUB || HAVE_LONG_LONG + vtop[0].c.i >>= 32; +#endif diff --git a/steps/tcc-0.9.26/simple-patches/float_negation.after b/steps/tcc-0.9.26/simple-patches/float_negation.after new file mode 100644 index 00000000..0e4e7d45 --- /dev/null +++ b/steps/tcc-0.9.26/simple-patches/float_negation.after @@ -0,0 +1,8 @@ +#if HAVE_FLOAT + if (t == VT_FLOAT) + vtop->c.f = (float) 0x80000000; + else if (t == VT_DOUBLE) + vtop->c.d = (double) 0x8000000000000000ULL; + else + vtop->c.ld = (long double) 0x8000000000000000ULL; +#endif diff --git a/steps/tcc-0.9.26/simple-patches/float_negation.before b/steps/tcc-0.9.26/simple-patches/float_negation.before new file mode 100644 index 00000000..b6b21f38 --- /dev/null +++ b/steps/tcc-0.9.26/simple-patches/float_negation.before @@ -0,0 +1,8 @@ +#if HAVE_FLOAT + if (t == VT_FLOAT) + vtop->c.f = -1.0 * 0.0; + else if (t == VT_DOUBLE) + vtop->c.d = -1.0 * 0.0; + else + vtop->c.ld = -1.0 * 0.0; +#endif diff --git a/steps/tcc-0.9.26/simple-patches/sscanf_TCC_VERSION.after b/steps/tcc-0.9.26/simple-patches/sscanf_TCC_VERSION.after new file mode 100644 index 00000000..eab0dbfe --- /dev/null +++ b/steps/tcc-0.9.26/simple-patches/sscanf_TCC_VERSION.after @@ -0,0 +1 @@ + a = 0; b = 9; c = 26; diff --git a/steps/tcc-0.9.26/simple-patches/sscanf_TCC_VERSION.before b/steps/tcc-0.9.26/simple-patches/sscanf_TCC_VERSION.before new file mode 100644 index 00000000..5a97cd23 --- /dev/null +++ b/steps/tcc-0.9.26/simple-patches/sscanf_TCC_VERSION.before @@ -0,0 +1 @@ + sscanf(TCC_VERSION, "%d.%d.%d", &a, &b, &c); diff --git a/steps/tcc-0.9.26/simple-patches/undefine_TCC_IS_NATIVE.after b/steps/tcc-0.9.26/simple-patches/undefine_TCC_IS_NATIVE.after new file mode 100644 index 00000000..5c4c31b1 --- /dev/null +++ b/steps/tcc-0.9.26/simple-patches/undefine_TCC_IS_NATIVE.after @@ -0,0 +1 @@ +#if defined _WIN32 == defined TCC_TARGET_PE && 0 diff --git a/steps/tcc-0.9.26/simple-patches/undefine_TCC_IS_NATIVE.before b/steps/tcc-0.9.26/simple-patches/undefine_TCC_IS_NATIVE.before new file mode 100644 index 00000000..aca9a026 --- /dev/null +++ b/steps/tcc-0.9.26/simple-patches/undefine_TCC_IS_NATIVE.before @@ -0,0 +1 @@ +#if defined _WIN32 == defined TCC_TARGET_PE diff --git a/steps/tcc-0.9.26/tcc-0.9.26.x86.checksums b/steps/tcc-0.9.26/tcc-0.9.26.x86.checksums index 574caca8..7f3f2e24 100644 --- a/steps/tcc-0.9.26/tcc-0.9.26.x86.checksums +++ b/steps/tcc-0.9.26/tcc-0.9.26.x86.checksums @@ -1,6 +1,6 @@ -b879b9101c837c77d0d51e6f5040bdc5f20964fe1f9f3506f77d49445967cef7 /usr/bin/tcc-mes -25698c9689995cad9dcf3dd834526e7ef97fba27cef6367c0e618b9ad6c0657d /usr/bin/tcc-boot0 -7121fee2d9b1b05a6dec06d193b8ddc61504c27a3eef251fc8a271b5001a7702 /usr/bin/tcc-boot1 +9486f581af1e879bbd22292d9c14c3be7c830535b9bb9a47eeac7eff9214fee1 /usr/bin/tcc-pnut +4c8ee015fe7d9faea4a7dd325f92daebcb4908fe7cf46d2bead736ecf1b77b38 /usr/bin/tcc-boot0 +35ae419041c0e5df707e23e2d1b6963227bbe2430cc616102ef5c60234d480bb /usr/bin/tcc-boot1 ae0293afce365667f6beacca537354e01925a5ae3f7c5428209bfc9894b864a1 /usr/bin/tcc bd63add2eb451854baf1a39cfc4780e86ae46128cd3d5b44c54b8a18aedb3c6d /usr/lib/mes/libc.a 12c07ae103e7e3b390150a79e5c600d88de14e9bb73a066f6342582729ef5a3f /usr/lib/mes/libgetopt.a