Skip to content

Instantly share code, notes, and snippets.

@binji
Created November 25, 2022 05:14
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save binji/b7541f9740c21d7c6dac95cbc9ea6fca to your computer and use it in GitHub Desktop.
Save binji/b7541f9740c21d7c6dac95cbc9ea6fca to your computer and use it in GitHub Desktop.
Compiling LLVM/Clang for Wasm notes
  • 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.
    • 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()
    • 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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment