From feb499facdf695771ac6f2bc0b85a124670ee88c Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Wed, 20 May 2026 16:57:07 +0200 Subject: [PATCH] Update to Emscripten 6.0.0 This change was generated by running ./system/lib/push_musl_changes.py within the Emscripten repo. --- arch/emscripten/bits/endian.h | 1 - arch/emscripten/bits/fenv.h | 15 +------ arch/emscripten/bits/limits.h | 2 +- arch/emscripten/bits/mman.h | 4 ++ arch/emscripten/bits/posix.h | 2 - arch/emscripten/bits/reg.h | 6 --- arch/emscripten/bits/setjmp.h | 1 + arch/emscripten/bits/signal.h | 70 ++++++++++++++++++++----------- arch/emscripten/bits/stat.h | 13 ++++-- arch/emscripten/bits/stdint.h | 33 --------------- arch/emscripten/bits/user.h | 48 --------------------- src/internal/pthread_impl.h | 6 ++- src/internal/syscall.h | 10 ----- src/network/h_errno.c | 8 ++++ src/thread/__timedwait.c | 6 +-- src/thread/__wait.c | 3 +- src/thread/pthread_barrier_wait.c | 4 +- src/thread/pthread_detach.c | 3 +- src/thread/pthread_key_create.c | 4 -- src/thread/thrd_create.c | 2 - src/unistd/isatty.c | 3 -- 21 files changed, 82 insertions(+), 162 deletions(-) delete mode 100644 arch/emscripten/bits/endian.h create mode 100644 arch/emscripten/bits/mman.h delete mode 100644 arch/emscripten/bits/posix.h delete mode 100644 arch/emscripten/bits/reg.h delete mode 100644 arch/emscripten/bits/stdint.h diff --git a/arch/emscripten/bits/endian.h b/arch/emscripten/bits/endian.h deleted file mode 100644 index 172c338f5..000000000 --- a/arch/emscripten/bits/endian.h +++ /dev/null @@ -1 +0,0 @@ -#define __BYTE_ORDER __LITTLE_ENDIAN diff --git a/arch/emscripten/bits/fenv.h b/arch/emscripten/bits/fenv.h index d3512cb6f..4aff0bd7b 100644 --- a/arch/emscripten/bits/fenv.h +++ b/arch/emscripten/bits/fenv.h @@ -8,20 +8,7 @@ typedef unsigned short fexcept_t; typedef struct { - unsigned short __control_word; - unsigned short __unused1; - unsigned short __status_word; - unsigned short __unused2; - unsigned short __tags; - unsigned short __unused3; - unsigned int __eip; - unsigned short __cs_selector; - unsigned int __opcode:11; - unsigned int __unused4:5; - unsigned int __data_offset; - unsigned short __data_selector; - unsigned short __unused5; - unsigned int __mxcsr; + unsigned __cw; } fenv_t; #define FE_DFL_ENV ((const fenv_t *) -1) diff --git a/arch/emscripten/bits/limits.h b/arch/emscripten/bits/limits.h index 7a09fdc1d..3c67802c1 100644 --- a/arch/emscripten/bits/limits.h +++ b/arch/emscripten/bits/limits.h @@ -1 +1 @@ -#define PAGE_SIZE 65536 +#define PAGESIZE 65536 diff --git a/arch/emscripten/bits/mman.h b/arch/emscripten/bits/mman.h new file mode 100644 index 000000000..c52e718d0 --- /dev/null +++ b/arch/emscripten/bits/mman.h @@ -0,0 +1,4 @@ +// XXX Emscripten in sync with both: +// - musl/arch/x86_64/bits/mman.h +// - musl/arch/i386/bits/mman.h +#define MAP_32BIT 0x40 diff --git a/arch/emscripten/bits/posix.h b/arch/emscripten/bits/posix.h deleted file mode 100644 index 30a38714f..000000000 --- a/arch/emscripten/bits/posix.h +++ /dev/null @@ -1,2 +0,0 @@ -#define _POSIX_V6_ILP32_OFFBIG 1 -#define _POSIX_V7_ILP32_OFFBIG 1 diff --git a/arch/emscripten/bits/reg.h b/arch/emscripten/bits/reg.h deleted file mode 100644 index 1c4987c77..000000000 --- a/arch/emscripten/bits/reg.h +++ /dev/null @@ -1,6 +0,0 @@ -#undef __WORDSIZE -#ifdef __wasm64__ -#define __WORDSIZE 64 -#else -#define __WORDSIZE 32 -#endif diff --git a/arch/emscripten/bits/setjmp.h b/arch/emscripten/bits/setjmp.h index decd26dca..1c9aa40ed 100644 --- a/arch/emscripten/bits/setjmp.h +++ b/arch/emscripten/bits/setjmp.h @@ -1 +1,2 @@ +// XXX Emscripten in sync with musl/arch/i386/bits/setjmp.h typedef unsigned long __jmp_buf[6]; diff --git a/arch/emscripten/bits/signal.h b/arch/emscripten/bits/signal.h index 58bc5e2c3..231dc9261 100644 --- a/arch/emscripten/bits/signal.h +++ b/arch/emscripten/bits/signal.h @@ -1,3 +1,4 @@ +// XXX Emscripten in sync with musl/arch/i386/bits/signal.h #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) @@ -7,33 +8,46 @@ #endif #ifdef _GNU_SOURCE -#define REG_GS 0 -#define REG_FS 1 -#define REG_ES 2 -#define REG_DS 3 -#define REG_EDI 4 -#define REG_ESI 5 -#define REG_EBP 6 -#define REG_ESP 7 -#define REG_EBX 8 -#define REG_EDX 9 -#define REG_ECX 10 -#define REG_EAX 11 -#define REG_TRAPNO 12 -#define REG_ERR 13 -#define REG_EIP 14 -#define REG_CS 15 -#define REG_EFL 16 -#define REG_UESP 17 -#define REG_SS 18 +enum { REG_GS = 0 }; +#define REG_GS REG_GS +enum { REG_FS = 1 }; +#define REG_FS REG_FS +enum { REG_ES = 2 }; +#define REG_ES REG_ES +enum { REG_DS = 3 }; +#define REG_DS REG_DS +enum { REG_EDI = 4 }; +#define REG_EDI REG_EDI +enum { REG_ESI = 5 }; +#define REG_ESI REG_ESI +enum { REG_EBP = 6 }; +#define REG_EBP REG_EBP +enum { REG_ESP = 7 }; +#define REG_ESP REG_ESP +enum { REG_EBX = 8 }; +#define REG_EBX REG_EBX +enum { REG_EDX = 9 }; +#define REG_EDX REG_EDX +enum { REG_ECX = 10 }; +#define REG_ECX REG_ECX +enum { REG_EAX = 11 }; +#define REG_EAX REG_EAX +enum { REG_TRAPNO = 12 }; +#define REG_TRAPNO REG_TRAPNO +enum { REG_ERR = 13 }; +#define REG_ERR REG_ERR +enum { REG_EIP = 14 }; +#define REG_EIP REG_EIP +enum { REG_CS = 15 }; +#define REG_CS REG_CS +enum { REG_EFL = 16 }; +#define REG_EFL REG_EFL +enum { REG_UESP = 17 }; +#define REG_UESP REG_UESP +enum { REG_SS = 18 }; +#define REG_SS REG_SS #endif -struct sigaltstack { - void *ss_sp; - int ss_flags; - size_t ss_size; -}; - #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) typedef int greg_t, gregset_t[19]; typedef struct _fpstate { @@ -64,6 +78,12 @@ typedef struct { } mcontext_t; #endif +struct sigaltstack { + void *ss_sp; + int ss_flags; + size_t ss_size; +}; + typedef struct __ucontext { unsigned long uc_flags; struct __ucontext *uc_link; diff --git a/arch/emscripten/bits/stat.h b/arch/emscripten/bits/stat.h index bfa9a597b..1ed366395 100644 --- a/arch/emscripten/bits/stat.h +++ b/arch/emscripten/bits/stat.h @@ -1,8 +1,9 @@ +// XXX Emscripten in sync with musl/arch/i386/bits/stat.h except for the padding, +// 64-bit time_t redirections change and st_ino placement. + /* copied from kernel definition, but with padding replaced * by the corresponding correctly-sized userspace types. */ - -struct stat -{ +struct stat { dev_t st_dev; #ifndef __EMSCRIPTEN__ int __st_dev_padding; @@ -19,6 +20,12 @@ struct stat off_t st_size; blksize_t st_blksize; blkcnt_t st_blocks; +#ifndef __EMSCRIPTEN__ // XXX Emscripten no need to activate the symbol redirections for 64-bit time_t. + struct { + long tv_sec; + long tv_nsec; + } __st_atim32, __st_mtim32, __st_ctim32; +#endif struct timespec st_atim; struct timespec st_mtim; struct timespec st_ctim; diff --git a/arch/emscripten/bits/stdint.h b/arch/emscripten/bits/stdint.h deleted file mode 100644 index 832dca5fb..000000000 --- a/arch/emscripten/bits/stdint.h +++ /dev/null @@ -1,33 +0,0 @@ -typedef int32_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef uint32_t uint_fast16_t; -typedef uint32_t uint_fast32_t; - -#define INT_FAST16_MIN INT32_MIN -#define INT_FAST32_MIN INT32_MIN - -#define INT_FAST16_MAX INT32_MAX -#define INT_FAST32_MAX INT32_MAX - -#define UINT_FAST16_MAX UINT32_MAX -#define UINT_FAST32_MAX UINT32_MAX - -#if __LP64__ - -#define INTPTR_MIN INT64_MIN -#define INTPTR_MAX INT64_MAX -#define UINTPTR_MAX UINT64_MAX -#define PTRDIFF_MIN INT64_MIN -#define PTRDIFF_MAX INT64_MAX -#define SIZE_MAX UINT64_MAX - -#else - -#define INTPTR_MIN (-1-__INTPTR_MAX__) -#define INTPTR_MAX __INTPTR_MAX__ -#define UINTPTR_MAX __UINTPTR_MAX__ -#define PTRDIFF_MIN (-1-__PTRDIFF_MAX__) -#define PTRDIFF_MAX __PTRDIFF_MAX__ -#define SIZE_MAX __SIZE_MAX__ - -#endif diff --git a/arch/emscripten/bits/user.h b/arch/emscripten/bits/user.h index fa623621e..e69de29bb 100644 --- a/arch/emscripten/bits/user.h +++ b/arch/emscripten/bits/user.h @@ -1,48 +0,0 @@ -#undef __WORDSIZE -#define __WORDSIZE 32 - -typedef struct user_fpregs_struct -{ - long cwd, swd, twd, fip, fcs, foo, fos, st_space[20]; -} elf_fpregset_t; - -typedef struct user_fpxregs_struct -{ - unsigned short cwd, swd, twd, fop; - long fip, fcs, foo, fos, mxcsr, reserved; - long st_space[32], xmm_space[32], padding[56]; -} elf_fpxregset_t; - -struct user_regs_struct -{ - long ebx, ecx, edx, esi, edi, ebp, eax, xds, xes, xfs, xgs; - long orig_eax, eip, xcs, eflags, esp, xss; -}; - -#define ELF_NGREG 17 -typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG]; - -struct user -{ - struct user_regs_struct regs; - int u_fpvalid; - struct user_fpregs_struct i387; - unsigned long u_tsize; - unsigned long u_dsize; - unsigned long u_ssize; - unsigned long start_code; - unsigned long start_stack; - long signal; - int reserved; - struct user_regs_struct *u_ar0; - struct user_fpregs_struct *u_fpstate; - unsigned long magic; - char u_comm[32]; - int u_debugreg[8]; -}; - -#define PAGE_MASK (~(PAGE_SIZE-1)) -#define NBPG PAGE_SIZE -#define UPAGES 1 -#define HOST_TEXT_START_ADDR (u.start_code) -#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h index a366b6cef..c9a687cdd 100644 --- a/src/internal/pthread_impl.h +++ b/src/internal/pthread_impl.h @@ -61,13 +61,17 @@ struct pthread { long off; volatile void *volatile pending; } robust_list; +#ifndef __EMSCRIPTEN__ + // Emscripten uses C11 _Thread_local instead for h_errno int h_errno_val; +#endif volatile int timer_id; #ifndef __EMSCRIPTEN__ // Emscripten uses C11 _Thread_local instead for locale locale_t locale; -#endif + // Emscripten doesn't use this field. volatile int killlock[1]; +#endif char *dlerror_buf; void *stdio_locks; diff --git a/src/internal/syscall.h b/src/internal/syscall.h index 4476dbe7d..be10369af 100644 --- a/src/internal/syscall.h +++ b/src/internal/syscall.h @@ -30,15 +30,9 @@ typedef long syscall_arg_t; #endif -#ifdef __cplusplus -extern "C" { -#endif hidden long __syscall_ret(unsigned long), __syscall_cp(syscall_arg_t, syscall_arg_t, syscall_arg_t, syscall_arg_t, syscall_arg_t, syscall_arg_t, syscall_arg_t); -#ifdef __cplusplus -} -#endif #ifndef __EMSCRIPTEN__ #define __syscall1(n,a) __syscall1(n,__scc(a)) @@ -456,11 +450,7 @@ hidden long __emulate_wait4(int, int *, int, void *, int); #define sys_wait4(a,b,c,d) __syscall_ret(__sys_wait4(a,b,c,d)) #define sys_wait4_cp(a,b,c,d) __syscall_ret(__sys_wait4_cp(a,b,c,d)) -#ifdef __cplusplus -hidden void __procfdname(char __buf[], unsigned); -#else hidden void __procfdname(char __buf[static 15+3*sizeof(int)], unsigned); -#endif hidden void *__vdsosym(const char *, const char *); diff --git a/src/network/h_errno.c b/src/network/h_errno.c index 638f77180..0ded77ce9 100644 --- a/src/network/h_errno.c +++ b/src/network/h_errno.c @@ -4,8 +4,16 @@ #undef h_errno int h_errno; +#ifdef __EMSCRIPTEN__ +static _Thread_local int __h_errno_storage; +#endif + int *__h_errno_location(void) { +#ifdef __EMSCRIPTEN__ + return &__h_errno_storage; +#else if (!__pthread_self()->stack) return &h_errno; return &__pthread_self()->h_errno_val; +#endif } diff --git a/src/thread/__timedwait.c b/src/thread/__timedwait.c index 9e3ccc984..2c82d2ab1 100644 --- a/src/thread/__timedwait.c +++ b/src/thread/__timedwait.c @@ -2,13 +2,11 @@ #include #include #ifdef __EMSCRIPTEN__ -#include -#include -#include +#include // for INFINITY #else #include "futex.h" -#endif #include "syscall.h" +#endif #include "pthread_impl.h" #ifndef __EMSCRIPTEN__ diff --git a/src/thread/__wait.c b/src/thread/__wait.c index 66a140bd6..fe3b5cf38 100644 --- a/src/thread/__wait.c +++ b/src/thread/__wait.c @@ -1,6 +1,5 @@ #ifdef __EMSCRIPTEN__ -#include -#include +#include // for INFINITY #endif #include "pthread_impl.h" diff --git a/src/thread/pthread_barrier_wait.c b/src/thread/pthread_barrier_wait.c index 37aebd0f1..37180c8e5 100644 --- a/src/thread/pthread_barrier_wait.c +++ b/src/thread/pthread_barrier_wait.c @@ -1,6 +1,6 @@ #ifdef __EMSCRIPTEN__ -#include // For INFINITY -#include // For INFINITY +#include // for assert +#include // for INFINITY #endif #include "pthread_impl.h" diff --git a/src/thread/pthread_detach.c b/src/thread/pthread_detach.c index c25882cca..2b516e232 100644 --- a/src/thread/pthread_detach.c +++ b/src/thread/pthread_detach.c @@ -32,5 +32,6 @@ static int __pthread_detach(pthread_t t) weak_alias(__pthread_detach, pthread_detach); weak_alias(__pthread_detach, thrd_detach); -// XXX EMSCRIPTEN: add extra alias for asan. +#ifdef __EMSCRIPTEN__ // XXX Emscripten add an extra alias for ASan/LSan. weak_alias(__pthread_detach, emscripten_builtin_pthread_detach); +#endif diff --git a/src/thread/pthread_key_create.c b/src/thread/pthread_key_create.c index f45553919..39770c7a3 100644 --- a/src/thread/pthread_key_create.c +++ b/src/thread/pthread_key_create.c @@ -1,10 +1,6 @@ #include "pthread_impl.h" #include "fork_impl.h" -#ifdef __EMSCRIPTEN__ -#include -#endif - volatile size_t __pthread_tsd_size = sizeof(void *) * PTHREAD_KEYS_MAX; void *__pthread_tsd_main[PTHREAD_KEYS_MAX] = { 0 }; diff --git a/src/thread/thrd_create.c b/src/thread/thrd_create.c index ca4efb661..d1191660a 100644 --- a/src/thread/thrd_create.c +++ b/src/thread/thrd_create.c @@ -6,8 +6,6 @@ // if we call the internal __pthread_create function here to don't the wrapping // See pthread_create wrapper in compiler-rt/lib/lsan/lsan_interceptors.cpp. #define __pthread_create pthread_create -#else -int __pthread_create(pthread_t *restrict, const pthread_attr_t *restrict, void *(*)(void *), void *restrict); #endif int thrd_create(thrd_t *thr, thrd_start_t func, void *arg) diff --git a/src/unistd/isatty.c b/src/unistd/isatty.c index 8a7de3c55..fe922d465 100644 --- a/src/unistd/isatty.c +++ b/src/unistd/isatty.c @@ -1,6 +1,3 @@ -#ifdef __EMSCRIPTEN__ -#include -#endif #include #include #include