Skip to content

Commit 75c08dd

Browse files
committed
Initial commit
0 parents  commit 75c08dd

11 files changed

+541
-0
lines changed

ClangNativeToolchain.cmake

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
cmake_minimum_required(VERSION 3.4.0)
2+
3+
set(INSTALL_DIR /usr/bin)
4+
set(EXE_SUFFIX "")
5+
6+
set(UNIX 1)
7+
8+
set(CMAKE_C_COMPILER ${INSTALL_DIR}/clang)
9+
set(CMAKE_CXX_COMPILER ${INSTALL_DIR}/clang++)
10+
11+
set(CMAKE_AR ${INSTALL_DIR}/llvm-ar CACHE STRING "native build")
12+
set(CMAKE_NM ${INSTALL_DIR}/llvm-nm CACHE STRING "native build")
13+
set(CMAKE_RANLIB ${INSTALL_DIR}/llvm-ranlib CACHE STRING "native build")
14+
set(CMAKE_LD ${INSTALL_DIR}/lld CACHE STRING "native build")
15+
set(CMAKE_LDSHARED ${INSTALL_DIR}/lld CACHE STRING "native build")
16+
17+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3" CACHE STRING "native build")
18+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3" CACHE STRING "native build")
19+
20+
set(CMAKE_C_COMPILER_WORKS ON)
21+
set(CMAKE_CXX_COMPILER_WORKS ON)

Makefile

+178
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
# Project directories
2+
PROJ_ROOT=${CURDIR}/..
3+
LLVM_PROJ_DIR=$(PROJ_ROOT)/third-party/llvm-project
4+
5+
TOOLCHAIN_DIR=$(PROJ_ROOT)/toolchain
6+
TOOLCHAIN_FILE=$(TOOLCHAIN_DIR)/WasiToolchain.cmake
7+
8+
# Install dirs
9+
FAASM_LOCAL_DIR=/usr/local/faasm
10+
PREFIX=$(FAASM_LOCAL_DIR)/toolchain
11+
FAASM_SYSROOT=/usr/local/faasm/llvm-sysroot
12+
13+
# NOTE - upgrading LLVM itself is done by updating the submodule in this project
14+
CLANG_VERSION=10.0.1
15+
16+
BUILD_DIR=$(LLVM_PROJ_DIR)/build
17+
LLVM_CONFIG=$(BUILD_DIR)/llvm/bin/llvm-config
18+
AR=$(BUILD_DIR)/llvm/bin/llvm-ar
19+
20+
WASI_LIBC_DIR=$(PROJ_ROOT)/third-party/wasi-libc
21+
22+
# -------------------------------------------
23+
# This is adapted from the wasi-sdk Makefile found here:
24+
# https://github.com/WebAssembly/wasi-sdk/blob/master/Makefile
25+
# -------------------------------------------
26+
27+
default: build
28+
29+
.PHONY: clean-libc
30+
clean-libc:
31+
rm -rf $(BUILD_DIR)/libc.BUILT $(WASI_LIBC_DIR)/build
32+
33+
.PHONY: clean-libs
34+
clean-libs: clean-libc
35+
rm -rf $(BUILD_DIR)/compiler-rt $(BUILD_DIR)/compiler-rt.BUILT
36+
rm -rf $(BUILD_DIR)/libcxx $(BUILD_DIR)/libcxx.BUILT
37+
rm -rf $(BUILD_DIR)/libcxxabi $(BUILD_DIR)/libcxxabi.BUILT
38+
39+
.PHONY: clean-all
40+
clean-all:
41+
rm -rf $(BUILD_DIR) $(PREFIX)
42+
43+
$(BUILD_DIR)/llvm.BUILT:
44+
mkdir -p $(BUILD_DIR)/llvm
45+
cd $(BUILD_DIR)/llvm; cmake -G Ninja \
46+
-DCMAKE_C_COMPILER=/usr/bin/clang-10 \
47+
-DCMAKE_CXX_COMPILER=/usr/bin/clang++-10 \
48+
-DCMAKE_BUILD_TYPE=MinSizeRel \
49+
-DCMAKE_INSTALL_PREFIX=$(PREFIX) \
50+
-DLLVM_TARGETS_TO_BUILD=WebAssembly \
51+
-DLLVM_DEFAULT_TARGET_TRIPLE=wasm32-wasi \
52+
-DLLVM_EXTERNAL_CLANG_SOURCE_DIR=$(LLVM_PROJ_DIR)/clang \
53+
-DLLVM_EXTERNAL_OPENMP_SOURCE_DIR=$(LLVM_PROJ_DIR)/openmp \
54+
-DLLVM_EXTERNAL_LLD_SOURCE_DIR=$(LLVM_PROJ_DIR)/lld \
55+
-DLLVM_ENABLE_PROJECTS="lld;clang;openmp" \
56+
-DDEFAULT_SYSROOT=$(FAASM_SYSROOT) \
57+
$(LLVM_PROJ_DIR)/llvm
58+
ninja -v -C $(BUILD_DIR)/llvm \
59+
install-clang \
60+
install-clang-resource-headers \
61+
install-lld \
62+
install-llc \
63+
install-llvm-ar \
64+
install-llvm-ranlib \
65+
install-llvm-dwarfdump \
66+
install-llvm-nm \
67+
install-llvm-size \
68+
install-llvm-config
69+
touch $(BUILD_DIR)/llvm.BUILT
70+
71+
# WASI libc
72+
$(BUILD_DIR)/libc.BUILT: $(BUILD_DIR)/llvm.BUILT
73+
cd $(WASI_LIBC_DIR); $(MAKE) \
74+
THREAD_MODEL=faasm \
75+
WASM_CC=$(PREFIX)/bin/clang \
76+
WASM_AR=$(PREFIX)/bin/llvm-ar \
77+
WASM_NM=$(PREFIX)/bin/llvm-nm \
78+
SYSROOT=$(FAASM_SYSROOT)
79+
touch $(BUILD_DIR)/libc.BUILT
80+
81+
$(BUILD_DIR)/compiler-rt.BUILT: $(BUILD_DIR)/libc.BUILT
82+
mkdir -p $(BUILD_DIR)/compiler-rt
83+
cd $(BUILD_DIR)/compiler-rt; cmake -G Ninja \
84+
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
85+
-DCMAKE_TOOLCHAIN_FILE=$(TOOLCHAIN_FILE) \
86+
-DCOMPILER_RT_BAREMETAL_BUILD=ON \
87+
-DCOMPILER_RT_BUILD_XRAY=OFF \
88+
-DCOMPILER_RT_INCLUDE_TESTS=OFF \
89+
-DCOMPILER_RT_HAS_FPIC_FLAG=OFF \
90+
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \
91+
-DLLVM_CONFIG_PATH=$(LLVM_CONFIG) \
92+
-DCMAKE_INSTALL_PREFIX=$(PREFIX)/lib/clang/$(CLANG_VERSION)/ \
93+
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
94+
-DCOMPILER_RT_OS_DIR=wasi \
95+
$(LLVM_PROJ_DIR)/compiler-rt/lib/builtins
96+
ninja -v -C $(BUILD_DIR)/compiler-rt install
97+
cp -R $(BUILD_DIR)/llvm/lib/clang $(PREFIX)/lib/
98+
touch $(BUILD_DIR)/compiler-rt.BUILT
99+
100+
$(BUILD_DIR)/libcxx.BUILT: $(BUILD_DIR)/compiler-rt.BUILT
101+
mkdir -p $(BUILD_DIR)/libcxx
102+
cd $(BUILD_DIR)/libcxx; cmake -G Ninja \
103+
-DCMAKE_TOOLCHAIN_FILE=$(TOOLCHAIN_FILE) \
104+
-DCMAKE_BUILD_TYPE=RelWithDebugInfo \
105+
-DCMAKE_CXX_COMPILER_WORKS=ON \
106+
-DCMAKE_C_COMPILER_WORKS=ON \
107+
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
108+
-DCMAKE_INSTALL_PREFIX=$(FAASM_SYSROOT) \
109+
-DLLVM_COMPILER_CHECKED=ON \
110+
-DLLVM_CONFIG_PATH=$(LLVM_CONFIG) \
111+
-DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=ON \
112+
-DLIBCXX_USE_COMPILER_RT=ON \
113+
-DLIBCXX_ENABLE_THREADS:BOOL=ON \
114+
-DLIBCXX_HAS_PTHREAD_API:BOOL=ON \
115+
-DLIBCXX_HAS_EXTERNAL_THREAD_API:BOOL=OFF \
116+
-DLIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY:BOOL=OFF \
117+
-DLIBCXX_HAS_WIN32_THREAD_API:BOOL=OFF \
118+
-DLIBCXX_ENABLE_SHARED:BOOL=OFF \
119+
-DLIBCXX_ENABLE_PIC:BOOL=OFF \
120+
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY:BOOL=OFF \
121+
-DLIBCXX_ENABLE_EXCEPTIONS:BOOL=OFF \
122+
-DLIBCXX_ENABLE_FILESYSTEM:BOOL=OFF \
123+
-DLIBCXX_CXX_ABI=libcxxabi \
124+
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=$(LLVM_PROJ_DIR)/libcxxabi/include \
125+
-DLIBCXX_HAS_MUSL_LIBC:BOOL=ON \
126+
-DLIBCXX_ABI_VERSION=2 \
127+
-DLIBCXX_LIBDIR_SUFFIX=/wasm32-wasi \
128+
--debug-trycompile \
129+
$(LLVM_PROJ_DIR)/libcxx
130+
ninja -v -C $(BUILD_DIR)/libcxx install
131+
touch $(BUILD_DIR)/libcxx.BUILT
132+
133+
$(BUILD_DIR)/libcxxabi.BUILT: $(BUILD_DIR)/libcxx.BUILT
134+
mkdir -p $(BUILD_DIR)/libcxxabi
135+
cd $(BUILD_DIR)/libcxxabi; cmake -G Ninja \
136+
-DCMAKE_BUILD_TYPE=RelWithDebugInfo \
137+
-DCMAKE_C_FLAGS="-I$(FAASM_SYSROOT)/include" \
138+
-DCMAKE_CXX_FLAGS="-I$(FAASM_SYSROOT)/include/c++/v1" \
139+
-DCMAKE_TOOLCHAIN_FILE=$(TOOLCHAIN_FILE) \
140+
-DLLVM_CONFIG_PATH=$(LLVM_CONFIG) \
141+
-DCMAKE_CXX_COMPILER_WORKS=ON \
142+
-DCMAKE_C_COMPILER_WORKS=ON \
143+
-DCMAKE_INSTALL_PREFIX=$(FAASM_SYSROOT) \
144+
-DLLVM_COMPILER_CHECKED=ON \
145+
-DLIBCXXABI_USE_COMPILER_RT=ON \
146+
-DLIBCXXABI_ENABLE_EXCEPTIONS:BOOL=OFF \
147+
-DLIBCXXABI_ENABLE_SHARED:BOOL=OFF \
148+
-DLIBCXXABI_SILENT_TERMINATE:BOOL=ON \
149+
-DLIBCXXABI_ENABLE_THREADS:BOOL=ON \
150+
-DLIBCXXABI_HAS_PTHREAD_API:BOOL=ON \
151+
-DLIBCXXABI_HAS_EXTERNAL_THREAD_API:BOOL=OFF \
152+
-DLIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY:BOOL=OFF \
153+
-DLIBCXXABI_HAS_WIN32_THREAD_API:BOOL=OFF \
154+
-DLIBCXXABI_ENABLE_PIC:BOOL=OFF \
155+
-DLIBCXXABI_LIBCXX_PATH=$(LLVM_PROJ_DIR)/libcxx \
156+
-DLIBCXXABI_LIBCXX_INCLUDES=$(FAASM_SYSROOT)/include/c++/v1 \
157+
-DUNIX:BOOL=ON \
158+
-DLIBCXXABI_LIBDIR_SUFFIX=/wasm32-wasi \
159+
--debug-trycompile \
160+
$(LLVM_PROJ_DIR)/libcxxabi
161+
ninja -v -C $(BUILD_DIR)/libcxxabi install
162+
touch $(BUILD_DIR)/libcxxabi.BUILT
163+
164+
.PHONY: extras
165+
extras: $(BUILD_DIR)/libcxxabi.BUILT
166+
cp $(TOOLCHAIN_DIR)/sysroot_extras/* $(FAASM_SYSROOT)/lib/wasm32-wasi/
167+
168+
llvm: $(BUILD_DIR)/llvm.BUILT
169+
170+
libc: $(BUILD_DIR)/libc.BUILT
171+
172+
libcxx: $(BUILD_DIR)/libcxx.BUILT
173+
174+
libcxxabi: $(BUILD_DIR)/libcxxabi.BUILT
175+
176+
compiler-rt: $(BUILD_DIR)/compiler-rt.BUILT
177+
178+
build: $(BUILD_DIR)/llvm.BUILT $(BUILD_DIR)/libc.BUILT $(BUILD_DIR)/compiler-rt.BUILT $(BUILD_DIR)/libcxxabi.BUILT $(BUILD_DIR)/libcxx.BUILT extras

Makefile.envs

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#
2+
# IMPORTANT: this file is used by lots of submodules/
3+
# projects so be careful **NOT** to set any global variables
4+
# like CC/CXX. Keep it generic
5+
#
6+
7+
export WASM_SYSROOT=/usr/local/faasm/llvm-sysroot
8+
export WASM_TOOLCHAIN_BIN=/usr/local/faasm/toolchain/bin
9+
10+
export WASM_CC=$(WASM_TOOLCHAIN_BIN)/clang
11+
export WASM_CXX=$(WASM_TOOLCHAIN_BIN)/clang++
12+
export WASM_CPP=$(WASM_TOOLCHAIN_BIN)/clang-cpp
13+
export WASM_AR=$(WASM_TOOLCHAIN_BIN)/llvm-ar
14+
export WASM_NM=$(WASM_TOOLCHAIN_BIN)/llvm.nm
15+
export WASM_RANLIB=$(WASM_TOOLCHAIN_BIN)/llvm-ranlib
16+
export WASM_LD=$(WASM_TOOLCHAIN_BIN)/wasm-ld
17+
export WASM_LDSHARED=$(WASM_TOOLCHAIN_BIN)/wasm-ld
18+
export WASM_LDFLAGS="-Xlinker --stack-first -Xlinker --no-check-features"
19+
20+
export WASM_BUILD=wasm32
21+
export WASM_HOST=wasm32-unknown-wasi
22+
export WASM_HOST_UNKNOWN=wasm32-unknown-unknown
23+
24+
# Note potential performance gains from unimplemented-simd128 here.
25+
# May not be necessary in future.
26+
export WASM_CFLAGS_NO_QUOTES=-O3 --sysroot=$(WASM_SYSROOT) -msimd128 -munimplemented-simd128 -mno-atomics -D__faasm
27+
export WASM_CXXFLAGS_NO_QUOTES=$(WASM_CFLAGS_NO_QUOTES)
28+
export WASM_CFLAGS="$(WASM_CFLAGS_NO_QUOTES)"
29+
export WASM_CXXFLAGS="$(WASM_CXXFLAGS_NO_QUOTES)"
30+

WasiToolchain.cmake

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
cmake_minimum_required(VERSION 3.4.0)
2+
3+
# -----------------------------------------
4+
# A useful reference for this file is the wasi-sdk equivalent:
5+
# https://github.com/WebAssembly/wasi-sdk/blob/master/wasi-sdk.cmake
6+
# If anything breaks it's useful to compare the two.
7+
#
8+
# BUT there are lots of crucial modifications in here and it's
9+
# used all over the place in this project, so be **very** careful
10+
# if changing it.
11+
# -----------------------------------------
12+
13+
set(INSTALL_DIR /usr/local/faasm/toolchain/bin)
14+
set(FAASM_SYSROOT /usr/local/faasm/llvm-sysroot)
15+
16+
set(EXE_SUFFIX "")
17+
18+
set(UNIX 1)
19+
20+
# Note that system name and processor here are crucial
21+
# Setting system name automatically switches on cross-compiling
22+
set(WASM_TRIPLE wasm32-wasi)
23+
set(CMAKE_SYSTEM_NAME Wasm)
24+
set(CMAKE_SYSTEM_VERSION 1)
25+
set(CMAKE_SYSTEM_PROCESSOR wasm32)
26+
set(CMAKE_C_COMPILER_TARGET ${WASM_TRIPLE} CACHE STRING "faasm build")
27+
set(CMAKE_CXX_COMPILER_TARGET ${WASM_TRIPLE} CACHE STRING "faasm build")
28+
29+
# Specify LLVM toolchain
30+
set(CMAKE_C_COMPILER ${INSTALL_DIR}/clang)
31+
set(CMAKE_CXX_COMPILER ${INSTALL_DIR}/clang++)
32+
set(CMAKE_AR ${INSTALL_DIR}/llvm-ar CACHE STRING "faasm build")
33+
set(CMAKE_NM ${INSTALL_DIR}/llvm-nm CACHE STRING "faasm build")
34+
set(CMAKE_RANLIB ${INSTALL_DIR}/llvm-ranlib CACHE STRING "faasm build")
35+
#set(CMAKE_LD ${INSTALL_DIR}/wasm-ld CACHE STRING "faasm build")
36+
#set(CMAKE_LDSHARED ${INSTALL_DIR}/wasm-ld CACHE STRING "faasm build")
37+
38+
set(CMAKE_DL_LIBS "")
39+
40+
# Explicitly disable eigen parallelisation
41+
add_definitions(-DEIGEN_DONT_PARALLELIZE=1)
42+
43+
# Add definition for flagging Faasm
44+
add_definitions(-D__faasm)
45+
46+
# Note: see Clang wasm-specific flags at https://clang.llvm.org/docs/ClangCommandLineReference.html#webassembly
47+
# Note the optimisation level. We want to keep vectorization so stick with O3
48+
# Also note that the optimisation is crucial to getting any kind of decent performance
49+
# We must explicitly exclude atomics here just in case we've accidentally introduced them
50+
# upstream. Use of atomics means we can't link things together:
51+
# https://reviews.llvm.org/D59281
52+
set(FAASM_COMPILER_FLAGS "-O3 -msimd128 -mno-atomics --sysroot=${FAASM_SYSROOT}")
53+
54+
set(CMAKE_SYSROOT ${FAASM_SYSROOT} CACHE STRING "faasm build")
55+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FAASM_COMPILER_FLAGS}" CACHE STRING "faasm build")
56+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FAASM_COMPILER_FLAGS}" CACHE STRING "faasm build")
57+
58+
# This is important to ensure the right search path
59+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
60+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
61+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
62+
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
63+
64+
set(CMAKE_C_COMPILER_WORKS ON)
65+
set(CMAKE_CXX_COMPILER_WORKS ON)
66+
67+
# -------- NOTE ----------
68+
# The stack-first here is really important to help detect stack overflow
69+
# issues. Without it the stack will overflow into the global data.
70+
# stack-size is also crucial to bigger functions not messing up
71+
72+
# This needs to be included to support libcxx with atomics
73+
# -Xlinker --shared-memory
74+
75+
SET(FAASM_COMMON_LINKER_FLAGS "\
76+
-Xlinker --stack-first \
77+
-Xlinker --no-check-features \
78+
-Xlinker --threads \
79+
-Xlinker --max-memory=4294901760 \
80+
")
81+
82+
SET(FAASM_EXE_LINKER_FLAGS "${FAASM_COMMON_LINKER_FLAGS}")
83+
84+
# Note, these get passed to llvm-ar for static libs, so
85+
# don't set for CMAKE_STATIC_LINKER_FLAGS
86+
SET(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} ${FAASM_COMMON_LINKER_FLAGS} CACHE STRING "faasm build")

env.sh

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
export WASM_SYSROOT=/usr/local/faasm/llvm-sysroot
2+
export WASM_TOOLCHAIN_BIN=/usr/local/faasm/toolchain/bin
3+
4+
export WASM_CC=${WASM_TOOLCHAIN_BIN}/clang
5+
export WASM_CXX=${WASM_TOOLCHAIN_BIN}/clang++
6+
export WASM_CPP=${WASM_TOOLCHAIN_BIN}/clang-cpp
7+
export WASM_AR=${WASM_TOOLCHAIN_BIN}/llvm-ar
8+
export WASM_NM=${WASM_TOOLCHAIN_BIN}/llvm-nm
9+
export WASM_RANLIB=${WASM_TOOLCHAIN_BIN}/llvm-ranlib
10+
export WASM_LD=${WASM_TOOLCHAIN_BIN}/wasm-ld
11+
export WASM_LDSHARED=${WASM_TOOLCHAIN_BIN}/wasm-ld
12+
13+
export WASM_LDFLAGS="-Xlinker --stack-first -Xlinker --no-check-features"
14+
export WASM_FUNC_LDFLAGS="-Xlinker --export=_faasm_zygote -Xlinker --export=__wasm_call_ctors -Xlinker --max-memory=4294901760 -Wl,-z,stack-size=4194304 -Wl,"
15+
16+
export WASM_BUILD=wasm32
17+
export WASM_HOST=wasm32-unknown-wasi
18+
export WASM_HOST_UNKNOWN=wasm32-unknown-unknown
19+
20+
export WASM_CFLAGS="-O3 --sysroot=${WASM_SYSROOT} -msimd128 -mno-atomics -D__faasm"
21+
export WASM_CXXFLAGS=${WASM_CFLAGS}
22+

native_clang.sh

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/bin/bash
2+
3+
export CXX=/usr/bin/clang++-10
4+
export CC=/usr/bin/clang-10
5+
export CPP=/usr/bin/clang-cpp-10
6+
export LINK=/usr/bin/clang++-10
7+

native_gcc.sh

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/bin/bash
2+
3+
export CXX=/usr/bin/g++
4+
export CC=/usr/bin/gcc
5+

sysroot_extras/crt1.imports

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
__wasi_proc_exit

sysroot_extras/libc++.imports

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
__cxa_throw
2+
__cxa_allocate_exception

sysroot_extras/libc++abi.imports

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
_Unwind_RaiseException
2+
_Unwind_DeleteException
3+
_Unwind_ForcedUnwind
4+
5+
syscall

0 commit comments

Comments
 (0)