Skip to content

Commit c8c8b07

Browse files
committed
wasi-sdk support for full LTO.
Add support for building libcxx and libcxxabi in LTO mode, along aside the regular non-LTO builds. Pass CLANG_VERSION to the wasi-libc build so that it can build itself in LTO and non-LTO modes. And drop the explicit -O1 from the compiler-rt build, and just go with the default optimization settings.
1 parent 79e5760 commit c8c8b07

File tree

1 file changed

+92
-55
lines changed

1 file changed

+92
-55
lines changed

Makefile

+92-55
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ clean:
2020

2121
build/llvm.BUILT:
2222
mkdir -p build/llvm
23-
cd build/llvm; cmake -G Ninja \
23+
cmake -B build/llvm -G Ninja \
2424
-DCMAKE_BUILD_TYPE=MinSizeRel \
2525
-DCMAKE_INSTALL_PREFIX=$(PREFIX) \
2626
-DLLVM_TARGETS_TO_BUILD=WebAssembly \
@@ -54,12 +54,14 @@ build/llvm.BUILT:
5454
build/wasi-libc.BUILT: build/llvm.BUILT
5555
$(MAKE) -C $(ROOT_DIR)/src/wasi-libc \
5656
WASM_CC=$(PREFIX)/bin/clang \
57-
SYSROOT=$(PREFIX)/share/wasi-sysroot
57+
SYSROOT=$(PREFIX)/share/wasi-sysroot \
58+
CLANG_VERSION=$(CLANG_VERSION)
5859
touch build/wasi-libc.BUILT
5960

6061
build/compiler-rt.BUILT: build/llvm.BUILT
62+
# Do the conventional build, and install it.
6163
mkdir -p build/compiler-rt
62-
cd build/compiler-rt; cmake -G Ninja \
64+
cmake -B build/compiler-rt -G Ninja \
6365
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
6466
-DCMAKE_TOOLCHAIN_FILE=$(ROOT_DIR)/wasi-sdk.cmake \
6567
-DCOMPILER_RT_BAREMETAL_BUILD=On \
@@ -69,75 +71,110 @@ build/compiler-rt.BUILT: build/llvm.BUILT
6971
-DCOMPILER_RT_ENABLE_IOS=OFF \
7072
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=On \
7173
-DWASI_SDK_PREFIX=$(PREFIX) \
72-
-DCMAKE_C_FLAGS="-O1 $(DEBUG_PREFIX_MAP)" \
74+
-DCMAKE_C_FLAGS="$(DEBUG_PREFIX_MAP)" \
7375
-DLLVM_CONFIG_PATH=$(ROOT_DIR)/build/llvm/bin/llvm-config \
7476
-DCOMPILER_RT_OS_DIR=wasi \
7577
-DCMAKE_INSTALL_PREFIX=$(PREFIX)/lib/clang/$(CLANG_VERSION)/ \
7678
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
7779
$(LLVM_PROJ_DIR)/compiler-rt/lib/builtins
7880
ninja $(NINJA_FLAGS) -v -C build/compiler-rt install
81+
# Install clang-provided headers.
7982
cp -R $(ROOT_DIR)/build/llvm/lib/clang $(PREFIX)/lib/
8083
touch build/compiler-rt.BUILT
8184

85+
# Flags common to both the non-LTO and LTO builds of libcxx.
86+
LIBCXX_CMAKE_FLAGS = \
87+
-DCMAKE_TOOLCHAIN_FILE=$(ROOT_DIR)/wasi-sdk.cmake \
88+
-DLLVM_CONFIG_PATH=$(ROOT_DIR)/build/llvm/bin/llvm-config \
89+
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
90+
-DLIBCXX_ENABLE_THREADS:BOOL=OFF \
91+
-DLIBCXX_HAS_PTHREAD_API:BOOL=OFF \
92+
-DLIBCXX_HAS_EXTERNAL_THREAD_API:BOOL=OFF \
93+
-DLIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY:BOOL=OFF \
94+
-DLIBCXX_HAS_WIN32_THREAD_API:BOOL=OFF \
95+
-DCMAKE_BUILD_TYPE=RelWithDebugInfo \
96+
-DLIBCXX_ENABLE_SHARED:BOOL=OFF \
97+
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY:BOOL=OFF \
98+
-DLIBCXX_ENABLE_EXCEPTIONS:BOOL=OFF \
99+
-DLIBCXX_ENABLE_FILESYSTEM:BOOL=OFF \
100+
-DLIBCXX_CXX_ABI=libcxxabi \
101+
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=$(LLVM_PROJ_DIR)/libcxxabi/include \
102+
-DLIBCXX_HAS_MUSL_LIBC:BOOL=ON \
103+
-DLIBCXX_ABI_VERSION=2 \
104+
-DWASI_SDK_PREFIX=$(PREFIX) \
105+
-DCMAKE_C_FLAGS="$(DEBUG_PREFIX_MAP)" \
106+
-DCMAKE_CXX_FLAGS="$(DEBUG_PREFIX_MAP)" \
107+
--debug-trycompile
108+
82109
build/libcxx.BUILT: build/llvm.BUILT build/compiler-rt.BUILT build/wasi-libc.BUILT
110+
# Do the conventional build.
83111
mkdir -p build/libcxx
84-
cd build/libcxx; cmake -G Ninja \
85-
-DCMAKE_TOOLCHAIN_FILE=$(ROOT_DIR)/wasi-sdk.cmake \
86-
-DLLVM_CONFIG_PATH=$(ROOT_DIR)/build/llvm/bin/llvm-config \
87-
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
88-
-DLIBCXX_ENABLE_THREADS:BOOL=OFF \
89-
-DLIBCXX_HAS_PTHREAD_API:BOOL=OFF \
90-
-DLIBCXX_HAS_EXTERNAL_THREAD_API:BOOL=OFF \
91-
-DLIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY:BOOL=OFF \
92-
-DLIBCXX_HAS_WIN32_THREAD_API:BOOL=OFF \
93-
-DCMAKE_BUILD_TYPE=RelWithDebugInfo \
94-
-DLIBCXX_ENABLE_SHARED:BOOL=OFF \
95-
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY:BOOL=OFF \
96-
-DLIBCXX_ENABLE_EXCEPTIONS:BOOL=OFF \
97-
-DLIBCXX_ENABLE_FILESYSTEM:BOOL=OFF \
98-
-DLIBCXX_CXX_ABI=libcxxabi \
99-
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=$(LLVM_PROJ_DIR)/libcxxabi/include \
100-
-DLIBCXX_HAS_MUSL_LIBC:BOOL=ON \
101-
-DLIBCXX_ABI_VERSION=2 \
102-
-DLIBCXX_LIBDIR_SUFFIX=/wasm32-wasi \
103-
-DWASI_SDK_PREFIX=$(PREFIX) \
104-
-DCMAKE_C_FLAGS="$(DEBUG_PREFIX_MAP)" \
105-
-DCMAKE_CXX_FLAGS="$(DEBUG_PREFIX_MAP)" \
106-
--debug-trycompile \
107-
$(LLVM_PROJ_DIR)/libcxx
112+
cmake -B build/libcxx -G Ninja $(LIBCXX_CMAKE_FLAGS) \
113+
-DCMAKE_C_FLAGS="$(DEBUG_PREFIX_MAP)" \
114+
-DCMAKE_CXX_FLAGS="$(DEBUG_PREFIX_MAP)" \
115+
-DLIBCXX_LIBDIR_SUFFIX=/wasm32-wasi \
116+
$(LLVM_PROJ_DIR)/libcxx
117+
ninja $(NINJA_FLAGS) -v -C build/libcxx
118+
# Now build the same thing but with LTO enabled.
119+
mkdir -p build/libcxx.llvm-lto
120+
cmake -B build/libcxx.llvm-lto -G Ninja $(LIBCXX_CMAKE_FLAGS) \
121+
-DCMAKE_C_FLAGS="-flto $(DEBUG_PREFIX_MAP)" \
122+
-DCMAKE_CXX_FLAGS="-flto $(DEBUG_PREFIX_MAP)" \
123+
-DLIBCXX_LIBDIR_SUFFIX=/wasm32-wasi/llvm-lto/$(CLANG_VERSION) \
124+
$(LLVM_PROJ_DIR)/libcxx
125+
ninja $(NINJA_FLAGS) -v -C build/libcxx.llvm-lto
126+
# Do the install.
108127
ninja $(NINJA_FLAGS) -v -C build/libcxx install
128+
ninja $(NINJA_FLAGS) -v -C build/libcxx.llvm-lto install
109129
touch build/libcxx.BUILT
110130

131+
# Flags common to both the non-LTO and LTO builds of libcxxabi.
132+
LIBCXXABI_CMAKE_FLAGS = \
133+
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
134+
-DCMAKE_CXX_COMPILER_WORKS=ON \
135+
-DCMAKE_C_COMPILER_WORKS=ON \
136+
-DLIBCXXABI_ENABLE_EXCEPTIONS:BOOL=OFF \
137+
-DLIBCXXABI_ENABLE_SHARED:BOOL=OFF \
138+
-DLIBCXXABI_SILENT_TERMINATE:BOOL=ON \
139+
-DLIBCXXABI_ENABLE_THREADS:BOOL=OFF \
140+
-DLIBCXXABI_HAS_PTHREAD_API:BOOL=OFF \
141+
-DLIBCXXABI_HAS_EXTERNAL_THREAD_API:BOOL=OFF \
142+
-DLIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY:BOOL=OFF \
143+
-DLIBCXXABI_HAS_WIN32_THREAD_API:BOOL=OFF \
144+
$(if $(patsubst 8.%,,$(CLANG_VERSION)),-DLIBCXXABI_ENABLE_PIC:BOOL=OFF,) \
145+
-DCXX_SUPPORTS_CXX11=ON \
146+
-DLLVM_COMPILER_CHECKED=ON \
147+
-DCMAKE_BUILD_TYPE=RelWithDebugInfo \
148+
-DLIBCXXABI_LIBCXX_PATH=$(LLVM_PROJ_DIR)/libcxx \
149+
-DLIBCXXABI_LIBCXX_INCLUDES=$(PREFIX)/share/wasi-sysroot/include/c++/v1 \
150+
-DLLVM_CONFIG_PATH=$(ROOT_DIR)/build/llvm/bin/llvm-config \
151+
-DCMAKE_TOOLCHAIN_FILE=$(ROOT_DIR)/wasi-sdk.cmake \
152+
-DWASI_SDK_PREFIX=$(PREFIX) \
153+
-DCMAKE_C_FLAGS="$(DEBUG_PREFIX_MAP) -I$(PREFIX)/share/wasi-sysroot/include" \
154+
-DCMAKE_CXX_FLAGS="$(DEBUG_PREFIX_MAP) -I$(PREFIX)/share/wasi-sysroot/include/c++/v1" \
155+
-DUNIX:BOOL=ON \
156+
--debug-trycompile
157+
111158
build/libcxxabi.BUILT: build/libcxx.BUILT build/llvm.BUILT
159+
# Do the conventional build.
112160
mkdir -p build/libcxxabi
113-
cd build/libcxxabi; cmake -G Ninja \
114-
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
115-
-DCMAKE_CXX_COMPILER_WORKS=ON \
116-
-DCMAKE_C_COMPILER_WORKS=ON \
117-
-DLIBCXXABI_ENABLE_EXCEPTIONS:BOOL=OFF \
118-
-DLIBCXXABI_ENABLE_SHARED:BOOL=OFF \
119-
-DLIBCXXABI_SILENT_TERMINATE:BOOL=ON \
120-
-DLIBCXXABI_ENABLE_THREADS:BOOL=OFF \
121-
-DLIBCXXABI_HAS_PTHREAD_API:BOOL=OFF \
122-
-DLIBCXXABI_HAS_EXTERNAL_THREAD_API:BOOL=OFF \
123-
-DLIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY:BOOL=OFF \
124-
-DLIBCXXABI_HAS_WIN32_THREAD_API:BOOL=OFF \
125-
$(if $(patsubst 8.%,,$(CLANG_VERSION)),-DLIBCXXABI_ENABLE_PIC:BOOL=OFF,) \
126-
-DCXX_SUPPORTS_CXX11=ON \
127-
-DLLVM_COMPILER_CHECKED=ON \
128-
-DCMAKE_BUILD_TYPE=RelWithDebugInfo \
129-
-DLIBCXXABI_LIBCXX_PATH=$(LLVM_PROJ_DIR)/libcxx \
130-
-DLIBCXXABI_LIBCXX_INCLUDES=$(PREFIX)/share/wasi-sysroot/include/c++/v1 \
131-
-DLLVM_CONFIG_PATH=$(ROOT_DIR)/build/llvm/bin/llvm-config \
132-
-DCMAKE_TOOLCHAIN_FILE=$(ROOT_DIR)/wasi-sdk.cmake \
133-
-DLIBCXXABI_LIBDIR_SUFFIX=/wasm32-wasi \
134-
-DWASI_SDK_PREFIX=$(PREFIX) \
135-
-DCMAKE_C_FLAGS="$(DEBUG_PREFIX_MAP) -I$(PREFIX)/share/wasi-sysroot/include" \
136-
-DCMAKE_CXX_FLAGS="$(DEBUG_PREFIX_MAP) -I$(PREFIX)/share/wasi-sysroot/include/c++/v1" \
137-
-DUNIX:BOOL=ON \
138-
--debug-trycompile \
139-
$(LLVM_PROJ_DIR)/libcxxabi
161+
cmake -B build/libcxxabi -G Ninja $(LIBCXXABI_CMAKE_FLAGS) \
162+
-DCMAKE_C_FLAGS="$(DEBUG_PREFIX_MAP)" \
163+
-DCMAKE_CXX_FLAGS="$(DEBUG_PREFIX_MAP)" \
164+
-DLIBCXXABI_LIBDIR_SUFFIX=/wasm32-wasi \
165+
$(LLVM_PROJ_DIR)/libcxxabi
166+
ninja $(NINJA_FLAGS) -v -C build/libcxxabi
167+
# Now build the same thing but with LTO enabled.
168+
mkdir -p build/libcxxabi.llvm-lto
169+
cmake -B build/libcxxabi.llvm-lto -G Ninja $(LIBCXXABI_CMAKE_FLAGS) \
170+
-DCMAKE_C_FLAGS="-flto $(DEBUG_PREFIX_MAP)" \
171+
-DCMAKE_CXX_FLAGS="-flto $(DEBUG_PREFIX_MAP)" \
172+
-DLIBCXXABI_LIBDIR_SUFFIX=/wasm32-wasi/llvm-lto/$(CLANG_VERSION) \
173+
$(LLVM_PROJ_DIR)/libcxxabi
174+
ninja $(NINJA_FLAGS) -v -C build/libcxxabi.llvm-lto
175+
# Do the install.
140176
ninja $(NINJA_FLAGS) -v -C build/libcxxabi install
177+
ninja $(NINJA_FLAGS) -v -C build/libcxxabi.llvm-lto install
141178
touch build/libcxxabi.BUILT
142179

143180
build/config.BUILT:

0 commit comments

Comments
 (0)