volatile int __thread_list_lock;
#ifndef __wasilibc_unmodified_upstream
+
+/* These symbols are generated by wasm-ld. __stack_high/__stack_low
+ * symbols are only available in LLVM v16 and higher, therefore they're
+ * defined as weak symbols and if not available, __heap_base/__data_end
+ * is used instead.
+ *
+ * TODO: remove usage of __heap_base/__data_end for stack size calculation
+ * once we drop support for LLVM v15 and older.
+ */
+extern unsigned char __heap_base;
+extern unsigned char __data_end;
+extern unsigned char __global_base;
+extern weak unsigned char __stack_high;
+extern weak unsigned char __stack_low;
+
+static inline void setup_default_stack_size()
+{
+ ptrdiff_t stack_size;
+
+ if (&__stack_high)
+ stack_size = &__stack_high - &__stack_low;
+ else {
+ unsigned char *sp;
+ __asm__(
+ ".globaltype __stack_pointer, i32\n"
+ "global.get __stack_pointer\n"
+ "local.set %0\n"
+ : "=r"(sp));
+ stack_size = sp > &__global_base ? &__heap_base - &__data_end : (ptrdiff_t)&__global_base;
+ }
+
+ if (stack_size > __default_stacksize)
+ __default_stacksize =
+ stack_size < DEFAULT_STACK_MAX ?
+ stack_size : DEFAULT_STACK_MAX;
+}
+
void __wasi_init_tp() {
__init_tp((void *)__get_tp());
}
if (!r) libc.can_do_threads = 1;
td->detach_state = DT_JOINABLE;
td->tid = __syscall(SYS_set_tid_address, &__thread_list_lock);
+#else
+ setup_default_stack_size();
#endif
td->locale = &libc.global_locale;
td->robust_list.head = &td->robust_list.head;