Stream: general

Topic: global is immutable: cannot modify it with `global.set`


view this post on Zulip Dennis Zhang (Aug 05 2024 at 15:45):

.text

    .export_name    wasi_thread_start, wasi_thread_start

    .globaltype __stack_pointer, i32
    .globaltype __tls_base, i32
    .functype   __wasi_thread_start_C (i32, i32) -> ()

    .hidden wasi_thread_start
    .globl  wasi_thread_start
    .type   wasi_thread_start,@function

wasi_thread_start:
    .functype   wasi_thread_start (i32, i32) -> ()

    # Set up the minimum C environment.
    # Note: offsetof(start_arg, stack) == 0
    local.get   1  # start_arg
    i32.load    0  # stack
    global.set  __stack_pointer

    local.get   1  # start_arg
    i32.load    4  # tls_base
    global.set  __tls_base

    # Make the C function do the rest of work.
    local.get   0  # tid
    local.get   1  # start_arg
    call __wasi_thread_start_C

    # Unlock thread list. (as CLONE_CHILD_CLEARTID would do for Linux)
    #
    # Note: once we unlock the thread list, our "map_base" can be freed
    # by a joining thread. It's safe as we are in ASM and no longer use
    # our C stack or pthread_t. It's impossible to do this safely in C
    # because there is no way to tell the C compiler not to use C stack.
    i32.const   __thread_list_lock
    i32.const   0
    i32.atomic.store 0
    # As an optimization, we can check tl_lock_waiters here.
    # But for now, simply wake up unconditionally as
    # CLONE_CHILD_CLEARTID does.
    i32.const   __thread_list_lock
    i32.const   1
    memory.atomic.notify 0
    drop

    end_function

Dear Community,

We are trying to integrate wasi_thread_start.s into our own pipeline. It compiles into an object file fine with the command:

clang-16 --target=wasm32-wasi-threads -matomics -mbulk-memory -mmutable-globals -mllvm -wasm-enable-sjlj -o wasi_thread_start.o -c wasi_thread_start.s

However, when executing, we are facing the problem: global is immutable: cannot modify it with global.set. Any help would be much appreciated!

Best,
Dennis

view this post on Zulip bjorn3 (Aug 05 2024 at 19:24):

Wasi-libc's build system seems to only pass --target=wasm32-wasi-threads -matomics to clang for compiling assembly. Maybe one of the other flags you pass shouldn't be passed? Also wasi-sdk is compiled with clang 18, rather than clang 16. That could also cause this problem.


Last updated: Dec 23 2024 at 12:05 UTC