- How to Cross Compile LLVM: https://llvm.org/docs/HowToCrossCompileLLVM.html
- Building LLVM with CMake: https://llvm.org/docs/CMake.html
- Hints from wasi-sdk Makefile: https://github.com/CraneStation/wasi-sdk/blob/master/Makefile
- Try compiling natively (needed for llvm-tblgen and clang-tblgen)
- cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="X86;WebAssembly" -DLLVM_ENABLE_PROJECTS="lld;clang" ../llvm
- Try building LLVM with WASI:
- cmake -G Ninja -DCMAKE_AR=”/usr/local/google/home/binji/dev/llvm-project/build/bin/llvm-ar” -DCMAKE_RANLIB=”/usr/local/google/home/binji/dev/llvm-project/build/bin/llvm-ranlib” -DCMAKE_C_COMPILER="/usr/local/google/home/binji/dev/wasi-sdk-5.0/opt/wasi-sdk/bin/clang" -DCMAKE_CXX_COMPILER="/usr/local/google/home/binji/dev/wasi-sdk-5.0/opt/wasi-sdk/bin/clang++" -DCMAKE_CROSSCOMPILING=True -DCMAKE_INSTALL_PREFIX=/usr/local/google/home/binji/dev/wasi-clang -DLLVM_TABLEGEN=/usr/local/google/home/binji/dev/llvm-project/build/bin/llvm-tblgen -DCLANG_TABLEGEN=/usr/local/google/home/binji/dev/llvm-project/build/bin/clang-tblgen -DCMAKE_C_FLAGS="--sysroot=/usr/local/google/home/binji/dev/wasi-sdk-5.0/opt/wasi-sdk/share/sysroot" -DCMAKE_CXX_FLAGS="--sysroot=/usr/local/google/home/binji/dev/wasi-sdk-5.0/opt/wasi-sdk/share/sysroot" -DLLVM_TARGETS_TO_BUILD=WebAssembly -DLLVM_ENABLE_PROJECTS=clang -DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_DEFAULT_TARGET_TRIPLE=wasm32-wasi -DLLVM_INCLUDE_UTILS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_BUILD_DOCS=OFF -DLLVM_ENABLE_OCAMLDOC=OFF -DLLVM_ENABLE_THREADS=OFF -DLLVM_ENABLE_BACKTRACES=OFF -DLLVM_BUILD_STATIC=ON -DLLVM_ENABLE_PIC=OFF -DCMAKE_SKIP_INSTALL_RPATH=ON -DCMAKE_SKIP_RPATH=ON ../llvm
- Doesn’t work
- /usr/local/google/home/binji/dev/wasi-sdk-5.0/opt/wasi-sdk/share/sysroot/include/c++/v1/atomic:554:2: error: is not supported on this single threaded system
- /usr/local/google/home/binji/dev/llvm-project/llvm/lib/Support/LockFileManager.cpp:116:33: error: use of undeclared identifier 'getsid'; did you mean 'gets'?
- /usr/local/google/home/binji/dev/llvm-project/llvm/lib/Support/CodeGenCoverage.cpp:94:27: error: no member named 'getpid' in the global namespace
- /usr/local/google/home/binji/dev/wasi-sdk-5.0/opt/wasi-sdk/share/sysroot/include/c++/v1/setjmp.h:35:15: fatal error: 'setjmp.h' file not found
- Hacking thread stuff
- Re-enabling threads in libcxx: _LIBCPP_HAS_NO_THREADS in __config
- #define _LIBCPP_HAS_THREAD_API_EXTERNAL
- Providing dummy thread implementation
- Disable rpath
- Disable PIC
- Link errors in llvm-tblgen?
- wasm-ld: error: utils/TableGen/CMakeFiles/llvm-tblgen.dir/AsmMatcherEmitter.cpp.o: undefined symbol: vtable for
llvm::cl::OptionValue<std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char> > >
- SBC says that I need to use llvm-ar instead.
- Needed llvm-ranlib too.
- wasm-ld: error: utils/TableGen/CMakeFiles/llvm-tblgen.dir/AsmMatcherEmitter.cpp.o: undefined symbol: vtable for
- Now just one link error: realpath.
- For now, replaced with stub implementation. Probably shouldn't be defined in WASI stdlib.h
- Progress, now failing to link: llvm-profdata, llvm-lto
- Some function signature mismatches
- wasm-ld: warning: function signature mismatch: _ZNK4llvm12MCAsmBackend12getFixupKindENS_9StringRefE
>>> defined as () -> void in lib/libLLVMWebAssemblyDesc.a(WebAssemblyAsmBackend.cpp.o)
>>> defined as (i32, i32, i32) -> void in lib/libLLVMMC.a(MCAsmBackend.cpp.o)
- Missing destructors:
- wasm-ld: error: lib/libLLVMLTO.a(LTO.cpp.o): undefined symbol: std::__2::mutex::~mutex()
- wasm-ld: error: lib/libLLVMLTO.a(LTO.cpp.o): undefined symbol: std::__2::shared_future::~shared_future()
- Some function signature mismatches
- More commands: cmake -G Ninja -DCMAKE_AR="/usr/local/google/home/binji/dev/llvm-project/build/bin/llvm-ar" -DCMAKE_RANLIB="/usr/local/google/home/binji/dev/llvm-project/build/bin/llvm-ranlib" -DCMAKE_C_COMPILER="$WASI/clang" -DCMAKE_CXX_COMPILER="$WASI/clang++" -DCMAKE_CROSSCOMPILING=True -DCMAKE_INSTALL_PREFIX=/usr/local/google/home/binji/dev/wasi-clang -DLLVM_TABLEGEN=/usr/local/google/home/binji/dev/llvm-project/build/bin/llvm-tblgen -DCLANG_TABLEGEN=/usr/local/google/home/binji/dev/llvm-project/build/bin/clang-tblgen -DLLVM_TARGETS_TO_BUILD=WebAssembly -DLLVM_ENABLE_PROJECTS="clang;lld" -DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_DEFAULT_TARGET_TRIPLE=wasm32-wasi -DLLVM_BUILD_TOOLS=OFF -DLLVM_INCLUDE_UTILS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_GO_TESTS=OFF -DLLVM_ENABLE_BINDINGS=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_BUILD_DOCS=OFF -DLLVM_ENABLE_OCAMLDOC=OFF -DLLVM_ENABLE_THREADS=OFF -DLLVM_ENABLE_BACKTRACES=OFF -DLLVM_ENABLE_UNWIND_TABLES=OFF -DLLVM_ENABLE_CRASH_OVERRIDES=OFF -DLLVM_ENABLE_TERMINFO=OFF -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_ENABLE_LIBEDIT=OFF -DLLVM_ENABLE_LIBPFM=OFF -DLLVM_BUILD_STATIC=ON -DCMAKE_SKIP_RPATH=ON -DCMAKE_SKIP_INSTALL_RPATH=ON -DLLVM_ENABLE_PIC=OFF -DLLVM_ENABLE_ZLIB=OFF -DCLANG_ENABLE_ARCMT=OFF -DCLANG_ENABLE_STATIC_ANALYZER=OFF -DCLANG_BUILD_TOOLS=OFF ../llvm
- Now just build clang target!
- Yay! clang.wasm generated.
Created
November 25, 2022 05:14
-
-
Save binji/b7541f9740c21d7c6dac95cbc9ea6fca to your computer and use it in GitHub Desktop.
Compiling LLVM/Clang for Wasm notes
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
yea this doesn't work anymore because stuff in
fs
:Not your fault (this is 2 years ago), just letting other know