- 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.
-
-
Save sunny-g/efe34071e781c173038c57df0cf5eead 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