From bfd96842f7e26265c52878ed6366b74c7155c47e Mon Sep 17 00:00:00 2001 From: Luca Versari Date: Sat, 8 Jun 2024 22:42:34 +0200 Subject: [PATCH] Try libstdc++ and larger thread stacks. --- .gitmodules | 4 ++ Makefile | 69 +++++++++---------- additional_includes/bits_stdc++.h | 110 ------------------------------ gcc | 1 + test.sh | 6 +- 5 files changed, 42 insertions(+), 148 deletions(-) delete mode 100644 additional_includes/bits_stdc++.h create mode 160000 gcc diff --git a/.gitmodules b/.gitmodules index ef4f0dd..6921f3b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,3 +8,7 @@ path = llvm-project url = https://github.com/veluca93/llvm-project branch = wasi-build +[submodule "gcc"] + path = gcc + url = https://github.com/gcc-mirror/gcc.git + branch = cd0059a1976303638cea95f216de129334fc04d1 diff --git a/Makefile b/Makefile index 9168a3f..b4759c8 100644 --- a/Makefile +++ b/Makefile @@ -12,11 +12,14 @@ WASM_CXX := ${LLVM_HOST}/bin/clang++ WASM_NM := ${LLVM_HOST}/bin/llvm-nm WASM_AR := ${LLVM_HOST}/bin/llvm-ar WASM_CFLAGS := -ffile-prefix-map=${DIR}=/ -matomics -mbulk-memory -mmutable-globals -WASM_CXXFLAGS := -ffile-prefix-map=${DIR}=/ -matomics -mbulk-memory -mmutable-globals +WASM_CXXFLAGS := -ffile-prefix-map=${DIR}=/ -matomics -mbulk-memory -mmutable-globals \ + -stdlib=libstdc++ -I ${SYSROOT}/include/c++/15.0.0/wasm32-wasi/ \ + -I ${SYSROOT}/include/c++/15.0.0/ WASM_LDFLAGS := -Wl,-z -Wl,stack-size=10485760 \ -Wl,--shared-memory -Wl,--export-memory -Wl,--import-memory \ -Wl,--max-memory=4294967296 \ - -Wl,--initial-memory=41943040 + -Wl,--initial-memory=41943040 \ + -L${SYSROOT}/lib/ MAKE := make all: ${OUTPUT}.DONE test @@ -36,6 +39,8 @@ build/llvm-host.BUILT: llvm-project | build build/wasi-libc.BUILT: wasi-libc build/llvm-host.BUILT | build rsync -a --delete wasi-libc/ build/wasi-libc + sed -i 's/#define DEFAULT_STACK_SIZE 131072/#define DEFAULT_STACK_SIZE 10485760/' \ + build/wasi-libc/libc-top-half/musl/src/internal/pthread_impl.h $(MAKE) -C build/wasi-libc THREAD_MODEL=posix \ CC=${WASM_CC} AR=$(WASM_AR) NM=${WASM_NM} EXTRA_CFLAGS="${WASI_CFLAGS} -O2 -DNDEBUG" \ INSTALL_DIR=${SYSROOT} install @@ -49,7 +54,7 @@ build/compiler-rt-host.BUILT: build/llvm.SRC build/wasi-libc.BUILT mkdir -p build/compiler-rt-build-host cmake -B build/compiler-rt-build-host -S build/llvm-src/compiler-rt/lib/builtins \ -DWASM_PREFIX=${LLVM_HOST} -DCMAKE_TOOLCHAIN_FILE=${DIR}/cmake/toolchain.cmake \ - -DCMAKE_C_FLAGS="-I${DIR} ${WASM_C}" \ + -DCMAKE_C_FLAGS="-I${DIR} ${WASM_CFLAGS}" \ -DCOMPILER_RT_BAREMETAL_BUILD=On \ -DCOMPILER_RT_INCLUDE_TESTS=OFF \ -DCOMPILER_RT_HAS_FPIC_FLAG=OFF \ @@ -63,7 +68,7 @@ build/compiler-rt.BUILT: build/llvm.SRC build/compiler-rt-host.BUILT mkdir -p build/compiler-rt-build cmake -B build/compiler-rt-build -S build/llvm-src/compiler-rt/lib/builtins \ -DWASM_PREFIX=${LLVM_HOST} -DCMAKE_TOOLCHAIN_FILE=${DIR}/cmake/toolchain.cmake \ - -DCMAKE_C_FLAGS="-I${DIR} ${WASM_C}" \ + -DCMAKE_C_FLAGS="-I${DIR} ${WASM_CFLAGS}" \ -DCOMPILER_RT_BAREMETAL_BUILD=On \ -DCOMPILER_RT_INCLUDE_TESTS=OFF \ -DCOMPILER_RT_HAS_FPIC_FLAG=OFF \ @@ -73,40 +78,32 @@ build/compiler-rt.BUILT: build/llvm.SRC build/compiler-rt-host.BUILT $(MAKE) -C build/compiler-rt-build install touch $@ -build/libcxx.BUILT: build/compiler-rt.BUILT - mkdir -p build/libcxx-build - # We disable checking the C++ compiler as we are building -lc++, which is needed by the check. - cmake -B build/libcxx-build -S build/llvm-src/runtimes \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_SYSROOT=$(SYSROOT) -DCMAKE_INSTALL_PREFIX="${SYSROOT}" -DDEFAULT_SYSROOT="/" \ - -DWASM_PREFIX=${LLVM_HOST} -DCMAKE_TOOLCHAIN_FILE=${DIR}/cmake/toolchain.cmake \ - -DCMAKE_C_FLAGS="-I${DIR} ${WASM_C}" \ - -DCMAKE_CXX_FLAGS="-I${DIR} ${WASM_CXXFLAGS} -fno-exceptions" \ - -DCMAKE_POSITION_INDEPENDENT_CODE=OFF \ - -DCMAKE_C_COMPILER_WORKS=ON \ - -DCMAKE_CXX_COMPILER_WORKS=ON \ - -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ - -DLIBCXX_ENABLE_SHARED:BOOL=OFF \ - -DLIBCXX_ENABLE_EXCEPTIONS:BOOL=OFF \ - -DLIBCXX_ENABLE_ABI_LINKER_SCRIPT:BOOL=OFF \ - -DLIBCXX_CXX_ABI=libcxxabi \ - -DLIBCXX_HAS_MUSL_LIBC:BOOL=ON \ - -DLIBCXX_ABI_VERSION=2 \ - -DLIBCXXABI_ENABLE_EXCEPTIONS:BOOL=OFF \ - -DLIBCXXABI_ENABLE_SHARED:BOOL=OFF \ - -DLIBCXXABI_SILENT_TERMINATE:BOOL=ON \ - -DLIBCXXABI_USE_LLVM_UNWINDER=OFF \ - -DLIBCXX_LIBDIR_SUFFIX=/wasm32-wasi-threads \ - -DLIBCXXABI_LIBDIR_SUFFIX=/wasm32-wasi-threads - $(MAKE) -C build/libcxx-build install - touch $@ +LIBSTDCXX_FLAGS=-fsized-deallocation -Wno-unknown-warning-option -Wno-vla-cxx-extension \ + -Wno-unused-function -Wno-instantiation-after-specialization \ + -Wno-missing-braces -Wno-unused-variable -Wno-string-plus-int \ + -Wno-unused-parameter -fno-exceptions + +build/libstdcxx.BUILT: build/compiler-rt.BUILT + rsync -a --delete gcc/ build/gcc + mkdir -p build/gcc-build + cd build/gcc-build && \ + PATH=${LLVM_HOST}/bin:$$PATH LDFLAGS="${WASM_LDFLAGS}" \ + CXXFLAGS="${LIBSTDCXX_FLAGS} ${WASM_CXXFLAGS}" \ + ../gcc/libstdc++-v3/configure --prefix=${SYSROOT} \ + --host wasm32-wasi --target wasm32-wasi --build=$(shell $(CC) -dumpmachine) \ + CC=${WASM_CC} CXX=${WASM_CXX} AR=${WASM_AR} NM=${WASM_NM} \ + --enable-libstdcxx-threads --enable-shared=off -disable-libstdcxx-dual-abi + cd build/gcc-build && PATH=${LLVM_HOST}/bin:$$PATH $(MAKE) \ + CFLAGS_FOR_TARGET="${WASM_CFLAGS} -fsized-deallocation" \ + CXXFLAGS_FOR_TARGET="${WASM_CXXFLAGS}" install + touch "$@" -build/llvm.BUILT: build/llvm.SRC build/libcxx.BUILT +build/llvm.BUILT: build/llvm.SRC build/libstdcxx.BUILT cmake -B build/llvm-build -S build/llvm-src/llvm \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_SYSROOT=$(SYSROOT) -DCMAKE_INSTALL_PREFIX="${SYSROOT}" -DDEFAULT_SYSROOT=/ \ -DWASM_PREFIX=${LLVM_HOST} -DCMAKE_TOOLCHAIN_FILE=${DIR}/cmake/toolchain.cmake \ - -DCMAKE_C_FLAGS="-I${DIR} ${WASM_C}" \ + -DCMAKE_C_FLAGS="-I${DIR} ${WASM_CFLAGS}" \ -DCMAKE_CXX_FLAGS="-I${DIR} ${WASM_CXXFLAGS} -fno-exceptions" \ -DLLVM_TARGETS_TO_BUILD=WebAssembly -DLLVM_ENABLE_PROJECTS="clang;lld;clang-tools-extra" \ -DLLVM_INCLUDE_BENCHMARKS=OFF \ @@ -131,19 +128,19 @@ build/python.BUILT: build/wasi-libc.BUILT build/llvm.BUILT ../configure --target wasm32-wasi --host wasm32-wasi --build=$(shell $(CC) -dumpmachine) \ --with-build-python=${DIR}/build/cpython/host-build/python \ CC=${WASM_CC} AR=${WASM_AR} NM=${WASM_NM} \ - --prefix=${DIR}/build/sysroot --with-lto=full \ + --prefix=${SYSROOT} --with-lto=full \ --enable-wasm-pthreads=yes --disable-test-modules \ CONFIG_SITE=${DIR}/cpython-config-override $(MAKE) -C build/cpython/wasm-build install touch "$@" -${OUTPUT}/cpp.COPIED: build/llvm.BUILT build/python.BUILT additional_includes/bits_stdc++.h +${OUTPUT}/cpp.COPIED: build/llvm.BUILT build/python.BUILT mkdir -p ${OUTPUT}/cpp/{bin,lib,include} rsync -avL ${SYSROOT}/bin/clang++ ${SYSROOT}/bin/wasm-ld ${SYSROOT}/bin/clangd ${OUTPUT}/cpp/bin/ rsync -avL ${SYSROOT}/lib/clang ${SYSROOT}/lib/wasm32-wasi-threads ${OUTPUT}/cpp/lib/ rsync -avL ${SYSROOT}/include/c++ ${SYSROOT}/include/wasm32-wasi-threads ${OUTPUT}/cpp/include/ + rsync -avL ${SYSROOT}/lib/lib{sup,std}c++.a ${OUTPUT}/cpp/lib/ mkdir -p ${OUTPUT}/cpp/include/bits - cp additional_includes/bits_stdc++.h ${OUTPUT}/cpp/include/bits/stdc++.h touch "$@" ${OUTPUT}/python.COPIED: build/llvm.BUILT build/python.BUILT diff --git a/additional_includes/bits_stdc++.h b/additional_includes/bits_stdc++.h deleted file mode 100644 index c2f02be..0000000 --- a/additional_includes/bits_stdc++.h +++ /dev/null @@ -1,110 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if __cplusplus >= 201103L -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif - -#if __cplusplus >= 201402L -#include -#endif - -#if __cplusplus >= 201703L -#include -#include -#include -#include -#include -#include -#include -#endif - -#if __cplusplus >= 202002L -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif diff --git a/gcc b/gcc new file mode 160000 index 0000000..365b142 --- /dev/null +++ b/gcc @@ -0,0 +1 @@ +Subproject commit 365b1421aa39f3467d30711148fcad7e373af14b diff --git a/test.sh b/test.sh index 5c2effb..4bd2d39 100755 --- a/test.sh +++ b/test.sh @@ -36,16 +36,18 @@ EOF $(which wasmtime) -W threads=y -S threads=y --dir $DIR::/ \ $DIR/bin/clang++ -cc1 -isysroot / \ - "-resource-dir" "lib/clang/19" -I /include/c++/v1 "-isysroot" "/" \ + "-resource-dir" "lib/clang/19" -I "/include/c++/15.0.0/wasm32-wasi/" -I "/include/c++/15.0.0/" "-isysroot" "/" \ "-internal-isystem" "lib/clang/19/include" "-internal-isystem" "/include/wasm32-wasi-threads" "-internal-isystem" "/include" \ "-target-feature" "+atomics" "-target-feature" "+bulk-memory" "-target-feature" "+mutable-globals" \ + "-stdlib=libstdc++" \ -O2 -emit-obj main.cc -o main.wasm $(which wasmtime) -W threads=y -S threads=y --dir $DIR::/ \ $DIR/bin/wasm-ld \ -L /lib/wasm32-wasi-threads/ /lib/clang/19/lib/wasi/libclang_rt.builtins-wasm32.a \ -lc /lib/wasm32-wasi-threads/crt1.o \ + -L /lib -lstdc++ -lsupc++ \ -z stack-size=1048576 --shared-memory --import-memory --export-memory --max-memory=4294967296 \ - -lc++ -lc++abi main.wasm -o main + main.wasm -o main $(which wasmtime) -W threads=y -S threads=y $DIR/main a b c d <<< 13845