Skip to content

Commit 9ea441b

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 2bfea0c commit 9ea441b

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
@@ -17,7 +17,7 @@ clean:
1717

1818
build/llvm.BUILT:
1919
mkdir -p build/llvm
20-
cd build/llvm; cmake -G Ninja \
20+
cmake -B build/llvm -G Ninja \
2121
-DCMAKE_BUILD_TYPE=MinSizeRel \
2222
-DCMAKE_INSTALL_PREFIX=$(PREFIX) \
2323
-DLLVM_TARGETS_TO_BUILD=WebAssembly \
@@ -51,12 +51,14 @@ build/llvm.BUILT:
5151
build/wasi-libc.BUILT: build/llvm.BUILT
5252
$(MAKE) -C $(ROOT_DIR)/src/wasi-libc \
5353
WASM_CC=$(PREFIX)/bin/clang \
54-
SYSROOT=$(PREFIX)/share/wasi-sysroot
54+
SYSROOT=$(PREFIX)/share/wasi-sysroot \
55+
CLANG_VERSION=$(CLANG_VERSION)
5556
touch build/wasi-libc.BUILT
5657

5758
build/compiler-rt.BUILT: build/llvm.BUILT
59+
# Do the conventional build, and install it.
5860
mkdir -p build/compiler-rt
59-
cd build/compiler-rt; cmake -G Ninja \
61+
cmake -B build/compiler-rt -G Ninja \
6062
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
6163
-DCMAKE_TOOLCHAIN_FILE=$(ROOT_DIR)/wasi-sdk.cmake \
6264
-DCOMPILER_RT_BAREMETAL_BUILD=On \
@@ -66,75 +68,110 @@ build/compiler-rt.BUILT: build/llvm.BUILT
6668
-DCOMPILER_RT_ENABLE_IOS=OFF \
6769
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=On \
6870
-DWASI_SDK_PREFIX=$(PREFIX) \
69-
-DCMAKE_C_FLAGS="-O1 $(DEBUG_PREFIX_MAP)" \
71+
-DCMAKE_C_FLAGS="$(DEBUG_PREFIX_MAP)" \
7072
-DLLVM_CONFIG_PATH=$(ROOT_DIR)/build/llvm/bin/llvm-config \
7173
-DCOMPILER_RT_OS_DIR=wasi \
7274
-DCMAKE_INSTALL_PREFIX=$(PREFIX)/lib/clang/$(CLANG_VERSION)/ \
7375
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
7476
$(LLVM_PROJ_DIR)/compiler-rt/lib/builtins
7577
ninja -v -C build/compiler-rt install
78+
# Install clang-provided headers.
7679
cp -R $(ROOT_DIR)/build/llvm/lib/clang $(PREFIX)/lib/
7780
touch build/compiler-rt.BUILT
7881

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

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

140177
build/config.BUILT:

0 commit comments

Comments
 (0)