@@ -44,6 +44,10 @@ def should_install(self, host_target):
44
44
return False
45
45
46
46
def build (self , host_target ):
47
+ self ._build (host_target )
48
+ self ._build (host_target , thread_model = 'posix' )
49
+
50
+ def _build (self , host_target , thread_model = 'single' ):
47
51
build_root = os .path .dirname (self .build_dir )
48
52
llvm_build_bin_dir = os .path .join (
49
53
'..' , build_root , '%s-%s' % ('llvm' , host_target ), 'bin' )
@@ -66,12 +70,13 @@ def build(self, host_target):
66
70
# https://github.com/llvm/llvm-project/commit/7dd387d2971d7759cadfffeb2082439f6c7ddd49
67
71
'--old-file=check-symbols' ,
68
72
'-C' , self .source_dir ,
69
- 'OBJDIR=' + os .path .join (self .build_dir , 'obj' ),
73
+ 'OBJDIR=' + os .path .join (self .build_dir , 'obj-' + thread_model ),
70
74
'SYSROOT=' + sysroot_build_dir ,
71
75
'INSTALL_DIR=' + WASILibc .sysroot_install_path (build_root ),
72
76
'CC=' + os .path .join (clang_tools_path , 'clang' ),
73
77
'AR=' + os .path .join (llvm_tools_path , 'llvm-ar' ),
74
78
'NM=' + os .path .join (llvm_tools_path , 'llvm-nm' ),
79
+ 'THREAD_MODEL=' + thread_model ,
75
80
])
76
81
77
82
@classmethod
@@ -121,18 +126,26 @@ def should_install(self, host_target):
121
126
return False
122
127
123
128
def build (self , host_target ):
129
+ self ._build (host_target )
130
+
131
+ def _build (self , host_target , enable_wasi_threads = False ):
124
132
build_root = os .path .dirname (self .build_dir )
125
133
llvm_build_bin_dir = os .path .join (
126
134
'..' , build_root , '%s-%s' % ('llvm' , host_target ), 'bin' )
127
135
llvm_tools_path = self .args .native_llvm_tools_path or llvm_build_bin_dir
128
136
clang_tools_path = self .args .native_clang_tools_path or llvm_build_bin_dir
129
137
138
+ cmake_has_threads = 'TRUE' if enable_wasi_threads else 'FALSE'
139
+
130
140
self .cmake_options .define ('CMAKE_SYSROOT:PATH' ,
131
141
WASILibc .sysroot_build_path (build_root , host_target ))
132
142
self .cmake_options .define ('LLVM_ENABLE_RUNTIMES:STRING' ,
133
143
'libcxx;libcxxabi;compiler-rt' )
134
- self .cmake_options .define ('LIBCXX_LIBDIR_SUFFIX:STRING' , '/wasm32-wasi' )
135
- self .cmake_options .define ('LIBCXXABI_LIBDIR_SUFFIX:STRING' , '/wasm32-wasi' )
144
+ libdir_suffix = '/wasm32-wasi'
145
+ if enable_wasi_threads :
146
+ libdir_suffix = '/wasm32-wasi-threads'
147
+ self .cmake_options .define ('LIBCXX_LIBDIR_SUFFIX:STRING' , libdir_suffix )
148
+ self .cmake_options .define ('LIBCXXABI_LIBDIR_SUFFIX:STRING' , libdir_suffix )
136
149
self .cmake_options .define ('CMAKE_STAGING_PREFIX:PATH' , '/' )
137
150
138
151
self .cmake_options .define ('COMPILER_RT_DEFAULT_TARGET_ARCH:STRING' , 'wasm32' )
@@ -157,19 +170,27 @@ def build(self, host_target):
157
170
os .path .join (clang_tools_path , 'clang' ))
158
171
self .cmake_options .define ('CMAKE_CXX_COMPILER:STRING' ,
159
172
os .path .join (clang_tools_path , 'clang++' ))
173
+
174
+ c_flags = []
160
175
# Explicitly disable exceptions even though it's usually implicitly disabled by
161
176
# LIBCXX_ENABLE_EXCEPTIONS because the CMake feature check fails to detect
162
177
# -fno-exceptions support in clang due to missing compiler-rt while configuring
163
178
# as mono project.
164
- self .cmake_options .define ('CMAKE_CXX_FLAGS:STRING' , '-fno-exceptions' )
179
+ cxx_flags = ['-fno-exceptions' ]
180
+ if enable_wasi_threads :
181
+ c_flags .append ('-pthread' )
182
+ cxx_flags .append ('-pthread' )
183
+ self .cmake_options .define ('CMAKE_C_FLAGS:STRING' , ' ' .join (c_flags ))
184
+ self .cmake_options .define ('CMAKE_CXX_FLAGS:STRING' , ' ' .join (cxx_flags ))
165
185
166
- self .cmake_options .define ('CMAKE_C_COMPILER_TARGET:STRING' , 'wasm32-wasi' )
167
- self .cmake_options .define ('CMAKE_CXX_COMPILER_TARGET:STRING' , 'wasm32-wasi' )
186
+ target_triple = 'wasm32-wasi-threads' if enable_wasi_threads else 'wasm32-wasi'
187
+ self .cmake_options .define ('CMAKE_C_COMPILER_TARGET:STRING' , target_triple )
188
+ self .cmake_options .define ('CMAKE_CXX_COMPILER_TARGET:STRING' , target_triple )
168
189
169
190
self .cmake_options .define ('CXX_SUPPORTS_CXX11:BOOL' , 'TRUE' )
170
191
171
- self .cmake_options .define ('LIBCXX_ENABLE_THREADS:BOOL' , 'FALSE' )
172
- self .cmake_options .define ('LIBCXX_HAS_PTHREAD_API:BOOL' , 'FALSE' )
192
+ self .cmake_options .define ('LIBCXX_ENABLE_THREADS:BOOL' , cmake_has_threads )
193
+ self .cmake_options .define ('LIBCXX_HAS_PTHREAD_API:BOOL' , cmake_has_threads )
173
194
self .cmake_options .define ('LIBCXX_HAS_EXTERNAL_THREAD_API:BOOL' , 'FALSE' )
174
195
self .cmake_options .define ('LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY:BOOL' , 'FALSE' )
175
196
self .cmake_options .define ('LIBCXX_HAS_WIN32_THREAD_API:BOOL' , 'FALSE' )
@@ -184,8 +205,8 @@ def build(self, host_target):
184
205
self .cmake_options .define ('LIBCXXABI_ENABLE_EXCEPTIONS:BOOL' , 'FALSE' )
185
206
self .cmake_options .define ('LIBCXXABI_ENABLE_SHARED:BOOL' , 'FALSE' )
186
207
self .cmake_options .define ('LIBCXXABI_SILENT_TERMINATE:BOOL' , 'TRUE' )
187
- self .cmake_options .define ('LIBCXXABI_ENABLE_THREADS:BOOL' , 'FALSE' )
188
- self .cmake_options .define ('LIBCXXABI_HAS_PTHREAD_API:BOOL' , 'FALSE' )
208
+ self .cmake_options .define ('LIBCXXABI_ENABLE_THREADS:BOOL' , cmake_has_threads )
209
+ self .cmake_options .define ('LIBCXXABI_HAS_PTHREAD_API:BOOL' , cmake_has_threads )
189
210
self .cmake_options .define ('LIBCXXABI_HAS_EXTERNAL_THREAD_API:BOOL' , 'FALSE' )
190
211
self .cmake_options .define ('LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY:BOOL' ,
191
212
'FALSE' )
@@ -201,3 +222,7 @@ def build(self, host_target):
201
222
@classmethod
202
223
def get_dependencies (cls ):
203
224
return [WASILibc , llvm .LLVM ]
225
+
226
+ class WasmThreadsLLVMRuntimeLibs (WasmLLVMRuntimeLibs ):
227
+ def build (self , host_target ):
228
+ self ._build (host_target , enable_wasi_threads = True )
0 commit comments