Control: reassign -1 libclang-common-14-dev 1:14.0.6-2 Control: retitle -1 Please build and ship compiler-rt for wasm32/wasm64 Tags: patch
Dear maintainer, clang in Debian right now can build to the wasm32-unknown-wasi target, as well as the less commonly used wasm64-unknown-wasi target. However, their use is very limited, as there is no available builtins library in Debian. libgcc is not available for WebAssembly. compiler-rt, however, is, and is what the WASI SDK ships with. Unfortunately it is not being shipped in Debian right now. In other words, this is a request to build and ship: /usr/lib/llvm-14/lib/clang/14.0.6/lib/wasi/libclang_rt.builtins-wasm32.a /usr/lib/llvm-14/lib/clang/14.0.6/lib/wasi/libclang_rt.builtins-wasm64.a I had success in building these in a clean llvm-toolchain tree with: mkdir build; cd build cmake \ -DCMAKE_C_COMPILER=clang \ -DCOMPILER_RT_STANDALONE_BUILD=ON \ -DCOMPILER_RT_BAREMETAL_BUILD=ON \ -DCOMPILER_RT_DEFAULT_TARGET_TRIPLE=wasm32-unknown-wasi \ -DCOMPILER_RT_OS_DIR=wasi \ ../compiler-rt/lib/builtins/ The WASI SDK sets a few other options (BUILD_XRAY=OFF etc.) that I don't know the use of: https://github.com/WebAssembly/wasi-sdk/blob/a0a342ac182caf871223797c48d00138cf67e9fb/Makefile#L102 In the package's debian/rules, this could take the form of the libclc SPIR-V build. Specifically, something like this (untested): debian-rtlib-wasm32-build: mkdir -p compiler-rt/lib/builtins/build-wasm32 echo "Using cmake: $(CMAKE_BIN)" cd compiler-rt/lib/builtins/build-wasm32 && \ $(CMAKE_BIN) ../ \ -G $(GENERATOR) \ -DCMAKE_C_COMPILER=$(STAGE_2_BIN_DIR)/clang \ -DCMAKE_CXX_COMPILER=$(STAGE_2_BIN_DIR)/clang++ \ -DCMAKE_C_FLAGS="$(opt_flags) $(STAGE_2_CFLAGS)" \ -DCMAKE_CXX_FLAGS="$(opt_flags) $(STAGE_2_CXXFLAGS)" \ -DCMAKE_SHARED_LINKER_FLAGS="$(STAGE_2_LDFLAGS) -L$(STAGE_2_LIB_DIR)" \ -DCMAKE_MODULE_LINKER_FLAGS="$(STAGE_2_LDFLAGS) -L$(STAGE_2_LIB_DIR)" \ -DCMAKE_EXE_LINKER_FLAGS="$(STAGE_2_LDFLAGS) -L$(STAGE_2_LIB_DIR)" \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_INSTALL_DATADIR=lib \ -DCMAKE_INSTALL_INCLUDEDIR=include \ -DLLVM_CONFIG=$(STAGE_2_BIN_DIR)/llvm-config \ -DCOMPILER_RT_STANDALONE_BUILD=ON \ -DCOMPILER_RT_BAREMETAL_BUILD=ON \ -DCOMPILER_RT_DEFAULT_TARGET_TRIPLE=wasm32-unknown-wasi \ -DCOMPILER_RT_OS_DIR=wasi; \ ninja $(NJOBS) $(VERBOSE) touch $@ (to be adjusted e.g. with a for loop for wasm64, plus hooked up on dh_auto_build, clean etc.) The resulting binaries could be shipped under libclang-common-14-dev, or, given their architecture-independent nature, under a new Arch: all package. I trust you know what's best here :) Furthermore, given that a) there is no WASM port for libgcc b) Debian defaults its rtlib to libgcc, this makes all out-of-the-box (i.e. without --rtlib=compiler-rt) runs to fail. To address this, something like this could be added to clang/lib/Driver/ToolChains/WebAssembly.cpp to change the default to compiler-rt specifically for the WebAssembly targets: ToolChain::RuntimeLibType WebAssembly::GetRuntimeLibType( const ArgList &Args) const { if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) { StringRef Value = A->getValue(); if (Value != "compiler-rt") getDriver().Diag(clang::diag::err_drv_unsupported_rtlib_for_platform) << Value << "WebAssembly"; } return ToolChain::RLT_CompilerRT; } (This is lifted from Darwin.cpp, and is otherwise also untested.) Hope this all helps! Apologies for not providing better patches, but building LLVM takes many hours on machines currently available to me, which makes iterating on this quite painful. Thank you for maintaining LLVM in Debian -- my time spent with the package revealed its immense complexity, and I deeply appreciate all the work it has gone into it. Regards, Faidon