summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 13:54:38 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 13:54:38 +0000
commit8c1ab65c0f548d20b7f177bdb736daaf603340e1 (patch)
treedf55b7e75bf43f2bf500845b105afe3ac3a5157e
parentInitial commit. (diff)
downloadwasi-libc-8c1ab65c0f548d20b7f177bdb736daaf603340e1.tar.xz
wasi-libc-8c1ab65c0f548d20b7f177bdb736daaf603340e1.zip
Adding upstream version 0.0~git20221206.8b7148f.upstream/0.0_git20221206.8b7148f
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
-rw-r--r--.gitattributes4
-rw-r--r--.github/workflows/main.yml141
-rw-r--r--.gitignore2
-rw-r--r--.gitmodules3
-rw-r--r--CODE_OF_CONDUCT.md46
-rw-r--r--LICENSE16
-rw-r--r--LICENSE-APACHE201
-rw-r--r--LICENSE-APACHE-LLVM220
-rw-r--r--LICENSE-MIT23
-rw-r--r--Makefile691
-rw-r--r--README.md51
-rw-r--r--dlmalloc/include/unistd.h10
-rw-r--r--dlmalloc/src/dlmalloc.c98
-rw-r--r--dlmalloc/src/malloc.c6352
-rw-r--r--emmalloc/emmalloc.c1535
-rw-r--r--expected/wasm32-wasi/posix/defined-symbols.txt1330
-rw-r--r--expected/wasm32-wasi/posix/include-all.c171
-rw-r--r--expected/wasm32-wasi/posix/predefined-macros.txt3398
-rw-r--r--expected/wasm32-wasi/posix/undefined-symbols.txt73
-rw-r--r--expected/wasm32-wasi/single/defined-symbols.txt1205
-rw-r--r--expected/wasm32-wasi/single/include-all.c170
-rw-r--r--expected/wasm32-wasi/single/predefined-macros.txt3355
-rw-r--r--expected/wasm32-wasi/single/undefined-symbols.txt68
-rw-r--r--libc-bottom-half/README.md19
-rw-r--r--libc-bottom-half/clocks/clock.c35
-rw-r--r--libc-bottom-half/clocks/getrusage.c28
-rw-r--r--libc-bottom-half/clocks/times.c26
-rw-r--r--libc-bottom-half/cloudlibc/LICENSE22
-rw-r--r--libc-bottom-half/cloudlibc/src/common/clock.h19
-rw-r--r--libc-bottom-half/cloudlibc/src/common/limits.h35
-rw-r--r--libc-bottom-half/cloudlibc/src/common/time.h63
-rw-r--r--libc-bottom-half/cloudlibc/src/include/_/cdefs.h36
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/dirent/closedir.c10
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/dirent/dirent_impl.h31
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/dirent/dirfd.c11
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/dirent/fdclosedir.c16
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/dirent/fdopendir.c44
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/dirent/opendirat.c23
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/dirent/readdir.c132
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/dirent/rewinddir.c15
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/dirent/scandirat.c168
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/dirent/seekdir.c15
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/dirent/telldir.c11
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/errno/errno.c87
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/fcntl/fcntl.c62
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/fcntl/openat.c80
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/fcntl/posix_fadvise.c24
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/fcntl/posix_fallocate.c13
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/poll/poll.c129
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sched/sched_yield.c16
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/stdio/renameat.c17
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/stdlib/_Exit.c14
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/ioctl/ioctl.c88
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/select/pselect.c125
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/select/select.c25
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/socket/getsockopt.c48
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/socket/recv.c40
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/socket/send.c32
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/socket/shutdown.c27
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/socket/socket_impl.h57
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/stat/fstat.c21
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/stat/fstatat.c31
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/stat/futimens.c29
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/stat/mkdirat.c18
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/stat/stat_impl.h116
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/stat/utimensat.c38
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/time/gettimeofday.c18
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/uio/preadv.c24
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/uio/pwritev.c24
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/uio/readv.c40
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/sys/uio/writev.c40
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/time/CLOCK_MONOTONIC.c12
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/time/CLOCK_REALTIME.c12
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/time/clock_getres.c21
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/time/clock_gettime.c22
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/time/clock_nanosleep.c37
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/time/nanosleep.c15
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/time/time.c16
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/close.c16
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/faccessat.c53
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/fdatasync.c16
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/fsync.c16
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/ftruncate.c22
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/linkat.c24
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/lseek.c25
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/pread.c31
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/pwrite.c31
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/read.c18
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/readlinkat.c21
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/sleep.c13
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/symlinkat.c17
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/unlinkat.c17
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/usleep.c18
-rw-r--r--libc-bottom-half/cloudlibc/src/libc/unistd/write.c19
-rw-r--r--libc-bottom-half/crt/crt1-command.c53
-rw-r--r--libc-bottom-half/crt/crt1-reactor.c7
-rw-r--r--libc-bottom-half/crt/crt1.c3
-rw-r--r--libc-bottom-half/getpid/getpid.c6
-rw-r--r--libc-bottom-half/headers/private/_/limits.h1
-rw-r--r--libc-bottom-half/headers/private/_/struct/timespec.h1
-rw-r--r--libc-bottom-half/headers/private/_/struct/timeval.h1
-rw-r--r--libc-bottom-half/headers/private/_/types.h9
-rw-r--r--libc-bottom-half/headers/private/assert.h7
-rw-r--r--libc-bottom-half/headers/private/common/crt.h0
-rw-r--r--libc-bottom-half/headers/private/errno.h2
-rw-r--r--libc-bottom-half/headers/private/fcntl.h2
-rw-r--r--libc-bottom-half/headers/private/sched.h0
-rw-r--r--libc-bottom-half/headers/private/stdarg.h2
-rw-r--r--libc-bottom-half/headers/private/stdint.h12
-rw-r--r--libc-bottom-half/headers/private/stdio.h3
-rw-r--r--libc-bottom-half/headers/private/stdlib.h8
-rw-r--r--libc-bottom-half/headers/private/string.h2
-rw-r--r--libc-bottom-half/headers/private/sys/mman.h2
-rw-r--r--libc-bottom-half/headers/private/threads.h3
-rw-r--r--libc-bottom-half/headers/public/__errno.h20
-rw-r--r--libc-bottom-half/headers/public/__errno_values.h86
-rw-r--r--libc-bottom-half/headers/public/__fd_set.h76
-rw-r--r--libc-bottom-half/headers/public/__function___isatty.h14
-rw-r--r--libc-bottom-half/headers/public/__functions_malloc.h26
-rw-r--r--libc-bottom-half/headers/public/__functions_memcpy.h20
-rw-r--r--libc-bottom-half/headers/public/__header_dirent.h45
-rw-r--r--libc-bottom-half/headers/public/__header_fcntl.h61
-rw-r--r--libc-bottom-half/headers/public/__header_inttypes.h182
-rw-r--r--libc-bottom-half/headers/public/__header_netinet_in.h30
-rw-r--r--libc-bottom-half/headers/public/__header_poll.h27
-rw-r--r--libc-bottom-half/headers/public/__header_stdlib.h21
-rw-r--r--libc-bottom-half/headers/public/__header_string.h23
-rw-r--r--libc-bottom-half/headers/public/__header_sys_ioctl.h17
-rw-r--r--libc-bottom-half/headers/public/__header_sys_resource.h19
-rw-r--r--libc-bottom-half/headers/public/__header_sys_socket.h41
-rw-r--r--libc-bottom-half/headers/public/__header_sys_stat.h15
-rw-r--r--libc-bottom-half/headers/public/__header_time.h33
-rw-r--r--libc-bottom-half/headers/public/__header_unistd.h28
-rw-r--r--libc-bottom-half/headers/public/__macro_FD_SETSIZE.h6
-rw-r--r--libc-bottom-half/headers/public/__macro_PAGESIZE.h16
-rw-r--r--libc-bottom-half/headers/public/__mode_t.h38
-rw-r--r--libc-bottom-half/headers/public/__seek.h10
-rw-r--r--libc-bottom-half/headers/public/__struct_dirent.h14
-rw-r--r--libc-bottom-half/headers/public/__struct_in6_addr.h8
-rw-r--r--libc-bottom-half/headers/public/__struct_in_addr.h10
-rw-r--r--libc-bottom-half/headers/public/__struct_iovec.h12
-rw-r--r--libc-bottom-half/headers/public/__struct_msghdr.h16
-rw-r--r--libc-bottom-half/headers/public/__struct_pollfd.h10
-rw-r--r--libc-bottom-half/headers/public/__struct_rusage.h12
-rw-r--r--libc-bottom-half/headers/public/__struct_sockaddr.h14
-rw-r--r--libc-bottom-half/headers/public/__struct_sockaddr_in.h17
-rw-r--r--libc-bottom-half/headers/public/__struct_sockaddr_in6.h19
-rw-r--r--libc-bottom-half/headers/public/__struct_sockaddr_storage.h14
-rw-r--r--libc-bottom-half/headers/public/__struct_sockaddr_un.h13
-rw-r--r--libc-bottom-half/headers/public/__struct_stat.h35
-rw-r--r--libc-bottom-half/headers/public/__struct_timespec.h12
-rw-r--r--libc-bottom-half/headers/public/__struct_timeval.h13
-rw-r--r--libc-bottom-half/headers/public/__struct_tm.h19
-rw-r--r--libc-bottom-half/headers/public/__struct_tms.h13
-rw-r--r--libc-bottom-half/headers/public/__typedef_DIR.h6
-rw-r--r--libc-bottom-half/headers/public/__typedef_blkcnt_t.h7
-rw-r--r--libc-bottom-half/headers/public/__typedef_blksize_t.h6
-rw-r--r--libc-bottom-half/headers/public/__typedef_clock_t.h7
-rw-r--r--libc-bottom-half/headers/public/__typedef_clockid_t.h6
-rw-r--r--libc-bottom-half/headers/public/__typedef_dev_t.h7
-rw-r--r--libc-bottom-half/headers/public/__typedef_fd_set.h14
-rw-r--r--libc-bottom-half/headers/public/__typedef_gid_t.h6
-rw-r--r--libc-bottom-half/headers/public/__typedef_in_addr_t.h6
-rw-r--r--libc-bottom-half/headers/public/__typedef_in_port_t.h6
-rw-r--r--libc-bottom-half/headers/public/__typedef_ino_t.h7
-rw-r--r--libc-bottom-half/headers/public/__typedef_mode_t.h6
-rw-r--r--libc-bottom-half/headers/public/__typedef_nfds_t.h6
-rw-r--r--libc-bottom-half/headers/public/__typedef_nlink_t.h7
-rw-r--r--libc-bottom-half/headers/public/__typedef_off_t.h7
-rw-r--r--libc-bottom-half/headers/public/__typedef_sa_family_t.h6
-rw-r--r--libc-bottom-half/headers/public/__typedef_sigset_t.h7
-rw-r--r--libc-bottom-half/headers/public/__typedef_socklen_t.h6
-rw-r--r--libc-bottom-half/headers/public/__typedef_ssize_t.h7
-rw-r--r--libc-bottom-half/headers/public/__typedef_suseconds_t.h8
-rw-r--r--libc-bottom-half/headers/public/__typedef_time_t.h7
-rw-r--r--libc-bottom-half/headers/public/__typedef_uid_t.h6
-rw-r--r--libc-bottom-half/headers/public/dirent.h10
-rw-r--r--libc-bottom-half/headers/public/errno.h7
-rw-r--r--libc-bottom-half/headers/public/fcntl.h10
-rw-r--r--libc-bottom-half/headers/public/inttypes.h10
-rw-r--r--libc-bottom-half/headers/public/netinet/in.h6
-rw-r--r--libc-bottom-half/headers/public/poll.h10
-rw-r--r--libc-bottom-half/headers/public/stdlib.h10
-rw-r--r--libc-bottom-half/headers/public/string.h10
-rw-r--r--libc-bottom-half/headers/public/sys/ioctl.h10
-rw-r--r--libc-bottom-half/headers/public/sys/resource.h10
-rw-r--r--libc-bottom-half/headers/public/sys/select.h18
-rw-r--r--libc-bottom-half/headers/public/sys/socket.h6
-rw-r--r--libc-bottom-half/headers/public/sys/stat.h10
-rw-r--r--libc-bottom-half/headers/public/sys/time.h6
-rw-r--r--libc-bottom-half/headers/public/sys/times.h6
-rw-r--r--libc-bottom-half/headers/public/sys/types.h16
-rw-r--r--libc-bottom-half/headers/public/sys/uio.h6
-rw-r--r--libc-bottom-half/headers/public/sys/un.h6
-rw-r--r--libc-bottom-half/headers/public/time.h10
-rw-r--r--libc-bottom-half/headers/public/unistd.h10
-rw-r--r--libc-bottom-half/headers/public/wasi/api.h2115
-rw-r--r--libc-bottom-half/headers/public/wasi/libc-environ.h36
-rw-r--r--libc-bottom-half/headers/public/wasi/libc-find-relpath.h79
-rw-r--r--libc-bottom-half/headers/public/wasi/libc-nocwd.h58
-rw-r--r--libc-bottom-half/headers/public/wasi/libc.h65
-rw-r--r--libc-bottom-half/headers/public/wchar.h9
-rw-r--r--libc-bottom-half/mman/mman.c124
-rw-r--r--libc-bottom-half/signal/signal.c142
-rw-r--r--libc-bottom-half/sources/__errno_location.c5
-rw-r--r--libc-bottom-half/sources/__main_void.c54
-rw-r--r--libc-bottom-half/sources/__wasilibc_dt.c34
-rw-r--r--libc-bottom-half/sources/__wasilibc_environ.c14
-rw-r--r--libc-bottom-half/sources/__wasilibc_fd_renumber.c13
-rw-r--r--libc-bottom-half/sources/__wasilibc_initialize_environ.c93
-rw-r--r--libc-bottom-half/sources/__wasilibc_real.c672
-rw-r--r--libc-bottom-half/sources/__wasilibc_rmdirat.c12
-rw-r--r--libc-bottom-half/sources/__wasilibc_tell.c14
-rw-r--r--libc-bottom-half/sources/__wasilibc_unlinkat.c12
-rw-r--r--libc-bottom-half/sources/abort.c6
-rw-r--r--libc-bottom-half/sources/accept.c51
-rw-r--r--libc-bottom-half/sources/at_fdcwd.c141
-rw-r--r--libc-bottom-half/sources/chdir.c171
-rw-r--r--libc-bottom-half/sources/complex-builtins.c29
-rw-r--r--libc-bottom-half/sources/environ.c31
-rw-r--r--libc-bottom-half/sources/errno.c5
-rw-r--r--libc-bottom-half/sources/getcwd.c39
-rw-r--r--libc-bottom-half/sources/getentropy.c20
-rw-r--r--libc-bottom-half/sources/isatty.c22
-rw-r--r--libc-bottom-half/sources/math/fmin-fmax.c34
-rw-r--r--libc-bottom-half/sources/math/math-builtins.c69
-rw-r--r--libc-bottom-half/sources/posix.c449
-rw-r--r--libc-bottom-half/sources/preopens.c268
-rw-r--r--libc-bottom-half/sources/reallocarray.c14
-rw-r--r--libc-bottom-half/sources/sbrk.c32
-rw-r--r--libc-bottom-half/sources/truncate.c21
-rw-r--r--libc-top-half/README.md25
-rw-r--r--libc-top-half/headers/private/printscan.h59
-rw-r--r--libc-top-half/headers/private/wasi/libc-environ-compat.h12
-rw-r--r--libc-top-half/musl/.mailmap1
-rw-r--r--libc-top-half/musl/COPYRIGHT193
-rw-r--r--libc-top-half/musl/INSTALL191
-rw-r--r--libc-top-half/musl/Makefile237
-rw-r--r--libc-top-half/musl/README23
-rw-r--r--libc-top-half/musl/VERSION1
-rw-r--r--libc-top-half/musl/WHATSNEW2329
-rw-r--r--libc-top-half/musl/arch/aarch64/atomic_arch.h82
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/alltypes.h.in24
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/fcntl.h38
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/fenv.h19
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/float.h16
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/hwcap.h52
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/mman.h2
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/reg.h2
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/signal.h153
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/stat.h18
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/syscall.h.in302
-rw-r--r--libc-top-half/musl/arch/aarch64/bits/user.h16
-rw-r--r--libc-top-half/musl/arch/aarch64/crt_arch.h15
-rw-r--r--libc-top-half/musl/arch/aarch64/fp_arch.h25
-rw-r--r--libc-top-half/musl/arch/aarch64/kstat.h21
-rw-r--r--libc-top-half/musl/arch/aarch64/pthread_arch.h11
-rw-r--r--libc-top-half/musl/arch/aarch64/reloc.h24
-rw-r--r--libc-top-half/musl/arch/aarch64/syscall_arch.h78
-rw-r--r--libc-top-half/musl/arch/arm/arch.mak1
-rw-r--r--libc-top-half/musl/arch/arm/atomic_arch.h107
-rw-r--r--libc-top-half/musl/arch/arm/bits/alltypes.h.in21
-rw-r--r--libc-top-half/musl/arch/arm/bits/fcntl.h40
-rw-r--r--libc-top-half/musl/arch/arm/bits/fenv.h23
-rw-r--r--libc-top-half/musl/arch/arm/bits/float.h16
-rw-r--r--libc-top-half/musl/arch/arm/bits/hwcap.h53
-rw-r--r--libc-top-half/musl/arch/arm/bits/ioctl_fix.h2
-rw-r--r--libc-top-half/musl/arch/arm/bits/ipcstat.h1
-rw-r--r--libc-top-half/musl/arch/arm/bits/msg.h18
-rw-r--r--libc-top-half/musl/arch/arm/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/arm/bits/ptrace.h25
-rw-r--r--libc-top-half/musl/arch/arm/bits/reg.h3
-rw-r--r--libc-top-half/musl/arch/arm/bits/sem.h18
-rw-r--r--libc-top-half/musl/arch/arm/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/arm/bits/shm.h31
-rw-r--r--libc-top-half/musl/arch/arm/bits/signal.h86
-rw-r--r--libc-top-half/musl/arch/arm/bits/stat.h25
-rw-r--r--libc-top-half/musl/arch/arm/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/arm/bits/syscall.h.in409
-rw-r--r--libc-top-half/musl/arch/arm/bits/user.h36
-rw-r--r--libc-top-half/musl/arch/arm/crt_arch.h18
-rw-r--r--libc-top-half/musl/arch/arm/kstat.h21
-rw-r--r--libc-top-half/musl/arch/arm/pthread_arch.h32
-rw-r--r--libc-top-half/musl/arch/arm/reloc.h32
-rw-r--r--libc-top-half/musl/arch/arm/syscall_arch.h103
-rw-r--r--libc-top-half/musl/arch/generic/bits/dirent.h11
-rw-r--r--libc-top-half/musl/arch/generic/bits/errno.h134
-rw-r--r--libc-top-half/musl/arch/generic/bits/fcntl.h46
-rw-r--r--libc-top-half/musl/arch/generic/bits/fenv.h10
-rw-r--r--libc-top-half/musl/arch/generic/bits/hwcap.h0
-rw-r--r--libc-top-half/musl/arch/generic/bits/io.h0
-rw-r--r--libc-top-half/musl/arch/generic/bits/ioctl.h115
-rw-r--r--libc-top-half/musl/arch/generic/bits/ioctl_fix.h0
-rw-r--r--libc-top-half/musl/arch/generic/bits/ipc.h11
-rw-r--r--libc-top-half/musl/arch/generic/bits/ipcstat.h1
-rw-r--r--libc-top-half/musl/arch/generic/bits/kd.h1
-rw-r--r--libc-top-half/musl/arch/generic/bits/limits.h0
-rw-r--r--libc-top-half/musl/arch/generic/bits/link.h1
-rw-r--r--libc-top-half/musl/arch/generic/bits/mman.h0
-rw-r--r--libc-top-half/musl/arch/generic/bits/msg.h12
-rw-r--r--libc-top-half/musl/arch/generic/bits/poll.h0
-rw-r--r--libc-top-half/musl/arch/generic/bits/ptrace.h0
-rw-r--r--libc-top-half/musl/arch/generic/bits/resource.h0
-rw-r--r--libc-top-half/musl/arch/generic/bits/sem.h14
-rw-r--r--libc-top-half/musl/arch/generic/bits/shm.h24
-rw-r--r--libc-top-half/musl/arch/generic/bits/socket.h0
-rw-r--r--libc-top-half/musl/arch/generic/bits/soundcard.h1
-rw-r--r--libc-top-half/musl/arch/generic/bits/statfs.h7
-rw-r--r--libc-top-half/musl/arch/generic/bits/termios.h166
-rw-r--r--libc-top-half/musl/arch/generic/bits/vt.h1
-rw-r--r--libc-top-half/musl/arch/generic/fp_arch.h0
-rw-r--r--libc-top-half/musl/arch/i386/arch.mak1
-rw-r--r--libc-top-half/musl/arch/i386/atomic_arch.h108
-rw-r--r--libc-top-half/musl/arch/i386/bits/alltypes.h.in31
-rw-r--r--libc-top-half/musl/arch/i386/bits/fenv.h33
-rw-r--r--libc-top-half/musl/arch/i386/bits/float.h20
-rw-r--r--libc-top-half/musl/arch/i386/bits/io.h77
-rw-r--r--libc-top-half/musl/arch/i386/bits/ipcstat.h1
-rw-r--r--libc-top-half/musl/arch/i386/bits/limits.h1
-rw-r--r--libc-top-half/musl/arch/i386/bits/mman.h1
-rw-r--r--libc-top-half/musl/arch/i386/bits/msg.h18
-rw-r--r--libc-top-half/musl/arch/i386/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/i386/bits/ptrace.h11
-rw-r--r--libc-top-half/musl/arch/i386/bits/reg.h19
-rw-r--r--libc-top-half/musl/arch/i386/bits/sem.h13
-rw-r--r--libc-top-half/musl/arch/i386/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/i386/bits/shm.h31
-rw-r--r--libc-top-half/musl/arch/i386/bits/signal.h142
-rw-r--r--libc-top-half/musl/arch/i386/bits/stat.h25
-rw-r--r--libc-top-half/musl/arch/i386/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/i386/bits/syscall.h.in439
-rw-r--r--libc-top-half/musl/arch/i386/bits/user.h44
-rw-r--r--libc-top-half/musl/arch/i386/crt_arch.h16
-rw-r--r--libc-top-half/musl/arch/i386/kstat.h21
-rw-r--r--libc-top-half/musl/arch/i386/pthread_arch.h8
-rw-r--r--libc-top-half/musl/arch/i386/reloc.h23
-rw-r--r--libc-top-half/musl/arch/i386/syscall_arch.h89
-rw-r--r--libc-top-half/musl/arch/m68k/arch.mak1
-rw-r--r--libc-top-half/musl/arch/m68k/atomic_arch.h8
-rw-r--r--libc-top-half/musl/arch/m68k/bits/alltypes.h.in25
-rw-r--r--libc-top-half/musl/arch/m68k/bits/fcntl.h40
-rw-r--r--libc-top-half/musl/arch/m68k/bits/fenv.h29
-rw-r--r--libc-top-half/musl/arch/m68k/bits/float.h39
-rw-r--r--libc-top-half/musl/arch/m68k/bits/ipcstat.h1
-rw-r--r--libc-top-half/musl/arch/m68k/bits/msg.h18
-rw-r--r--libc-top-half/musl/arch/m68k/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/m68k/bits/ptrace.h2
-rw-r--r--libc-top-half/musl/arch/m68k/bits/reg.h45
-rw-r--r--libc-top-half/musl/arch/m68k/bits/sem.h13
-rw-r--r--libc-top-half/musl/arch/m68k/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/m68k/bits/shm.h31
-rw-r--r--libc-top-half/musl/arch/m68k/bits/signal.h140
-rw-r--r--libc-top-half/musl/arch/m68k/bits/stat.h25
-rw-r--r--libc-top-half/musl/arch/m68k/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/m68k/bits/syscall.h.in418
-rw-r--r--libc-top-half/musl/arch/m68k/bits/user.h38
-rw-r--r--libc-top-half/musl/arch/m68k/crt_arch.h14
-rw-r--r--libc-top-half/musl/arch/m68k/kstat.h21
-rw-r--r--libc-top-half/musl/arch/m68k/pthread_arch.h12
-rw-r--r--libc-top-half/musl/arch/m68k/reloc.h30
-rw-r--r--libc-top-half/musl/arch/m68k/syscall_arch.h90
-rw-r--r--libc-top-half/musl/arch/microblaze/arch.mak1
-rw-r--r--libc-top-half/musl/arch/microblaze/atomic_arch.h53
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/alltypes.h.in21
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/float.h16
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/ipcstat.h1
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/msg.h18
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/reg.h3
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/sem.h18
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/shm.h31
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/signal.h88
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/stat.h25
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/syscall.h.in440
-rw-r--r--libc-top-half/musl/arch/microblaze/bits/user.h25
-rw-r--r--libc-top-half/musl/arch/microblaze/crt_arch.h17
-rw-r--r--libc-top-half/musl/arch/microblaze/kstat.h21
-rw-r--r--libc-top-half/musl/arch/microblaze/pthread_arch.h8
-rw-r--r--libc-top-half/musl/arch/microblaze/reloc.h27
-rw-r--r--libc-top-half/musl/arch/microblaze/syscall_arch.h99
-rw-r--r--libc-top-half/musl/arch/mips/arch.mak1
-rw-r--r--libc-top-half/musl/arch/mips/atomic_arch.h58
-rw-r--r--libc-top-half/musl/arch/mips/bits/alltypes.h.in21
-rw-r--r--libc-top-half/musl/arch/mips/bits/errno.h134
-rw-r--r--libc-top-half/musl/arch/mips/bits/fcntl.h40
-rw-r--r--libc-top-half/musl/arch/mips/bits/fenv.h25
-rw-r--r--libc-top-half/musl/arch/mips/bits/float.h16
-rw-r--r--libc-top-half/musl/arch/mips/bits/hwcap.h14
-rw-r--r--libc-top-half/musl/arch/mips/bits/ioctl.h114
-rw-r--r--libc-top-half/musl/arch/mips/bits/ipcstat.h1
-rw-r--r--libc-top-half/musl/arch/mips/bits/mman.h25
-rw-r--r--libc-top-half/musl/arch/mips/bits/msg.h27
-rw-r--r--libc-top-half/musl/arch/mips/bits/poll.h2
-rw-r--r--libc-top-half/musl/arch/mips/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/mips/bits/ptrace.h9
-rw-r--r--libc-top-half/musl/arch/mips/bits/reg.h47
-rw-r--r--libc-top-half/musl/arch/mips/bits/resource.h5
-rw-r--r--libc-top-half/musl/arch/mips/bits/sem.h16
-rw-r--r--libc-top-half/musl/arch/mips/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/mips/bits/shm.h29
-rw-r--r--libc-top-half/musl/arch/mips/bits/signal.h124
-rw-r--r--libc-top-half/musl/arch/mips/bits/socket.h35
-rw-r--r--libc-top-half/musl/arch/mips/bits/stat.h26
-rw-r--r--libc-top-half/musl/arch/mips/bits/statfs.h8
-rw-r--r--libc-top-half/musl/arch/mips/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/mips/bits/syscall.h.in421
-rw-r--r--libc-top-half/musl/arch/mips/bits/termios.h169
-rw-r--r--libc-top-half/musl/arch/mips/bits/user.h13
-rw-r--r--libc-top-half/musl/arch/mips/crt_arch.h29
-rw-r--r--libc-top-half/musl/arch/mips/ksigaction.h13
-rw-r--r--libc-top-half/musl/arch/mips/kstat.h22
-rw-r--r--libc-top-half/musl/arch/mips/pthread_arch.h18
-rw-r--r--libc-top-half/musl/arch/mips/reloc.h50
-rw-r--r--libc-top-half/musl/arch/mips/syscall_arch.h153
-rw-r--r--libc-top-half/musl/arch/mips64/atomic_arch.h56
-rw-r--r--libc-top-half/musl/arch/mips64/bits/alltypes.h.in22
-rw-r--r--libc-top-half/musl/arch/mips64/bits/errno.h134
-rw-r--r--libc-top-half/musl/arch/mips64/bits/fcntl.h40
-rw-r--r--libc-top-half/musl/arch/mips64/bits/fenv.h25
-rw-r--r--libc-top-half/musl/arch/mips64/bits/float.h16
-rw-r--r--libc-top-half/musl/arch/mips64/bits/hwcap.h3
-rw-r--r--libc-top-half/musl/arch/mips64/bits/ioctl.h114
-rw-r--r--libc-top-half/musl/arch/mips64/bits/ipc.h12
-rw-r--r--libc-top-half/musl/arch/mips64/bits/mman.h25
-rw-r--r--libc-top-half/musl/arch/mips64/bits/poll.h2
-rw-r--r--libc-top-half/musl/arch/mips64/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/mips64/bits/ptrace.h9
-rw-r--r--libc-top-half/musl/arch/mips64/bits/reg.h47
-rw-r--r--libc-top-half/musl/arch/mips64/bits/resource.h5
-rw-r--r--libc-top-half/musl/arch/mips64/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/mips64/bits/signal.h143
-rw-r--r--libc-top-half/musl/arch/mips64/bits/socket.h35
-rw-r--r--libc-top-half/musl/arch/mips64/bits/stat.h20
-rw-r--r--libc-top-half/musl/arch/mips64/bits/statfs.h8
-rw-r--r--libc-top-half/musl/arch/mips64/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/mips64/bits/syscall.h.in351
-rw-r--r--libc-top-half/musl/arch/mips64/bits/termios.h169
-rw-r--r--libc-top-half/musl/arch/mips64/bits/user.h15
-rw-r--r--libc-top-half/musl/arch/mips64/crt_arch.h33
-rw-r--r--libc-top-half/musl/arch/mips64/ksigaction.h10
-rw-r--r--libc-top-half/musl/arch/mips64/kstat.h21
-rw-r--r--libc-top-half/musl/arch/mips64/pthread_arch.h19
-rw-r--r--libc-top-half/musl/arch/mips64/reloc.h60
-rw-r--r--libc-top-half/musl/arch/mips64/syscall_arch.h128
-rw-r--r--libc-top-half/musl/arch/mipsn32/arch.mak1
-rw-r--r--libc-top-half/musl/arch/mipsn32/atomic_arch.h52
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/alltypes.h.in21
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/errno.h134
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/fcntl.h40
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/fenv.h25
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/float.h16
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/hwcap.h3
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/ioctl.h114
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/ipcstat.h1
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/mman.h25
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/msg.h27
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/poll.h2
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/ptrace.h9
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/reg.h47
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/resource.h5
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/sem.h16
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/shm.h29
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/signal.h143
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/socket.h35
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/stat.h23
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/statfs.h8
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/syscall.h.in375
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/termios.h169
-rw-r--r--libc-top-half/musl/arch/mipsn32/bits/user.h15
-rw-r--r--libc-top-half/musl/arch/mipsn32/crt_arch.h32
-rw-r--r--libc-top-half/musl/arch/mipsn32/ksigaction.h10
-rw-r--r--libc-top-half/musl/arch/mipsn32/kstat.h22
-rw-r--r--libc-top-half/musl/arch/mipsn32/pthread_arch.h19
-rw-r--r--libc-top-half/musl/arch/mipsn32/reloc.h50
-rw-r--r--libc-top-half/musl/arch/mipsn32/syscall_arch.h130
-rw-r--r--libc-top-half/musl/arch/or1k/arch.mak1
-rw-r--r--libc-top-half/musl/arch/or1k/atomic_arch.h14
-rw-r--r--libc-top-half/musl/arch/or1k/bits/alltypes.h.in16
-rw-r--r--libc-top-half/musl/arch/or1k/bits/float.h16
-rw-r--r--libc-top-half/musl/arch/or1k/bits/ipcstat.h1
-rw-r--r--libc-top-half/musl/arch/or1k/bits/limits.h1
-rw-r--r--libc-top-half/musl/arch/or1k/bits/msg.h18
-rw-r--r--libc-top-half/musl/arch/or1k/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/or1k/bits/reg.h3
-rw-r--r--libc-top-half/musl/arch/or1k/bits/sem.h13
-rw-r--r--libc-top-half/musl/arch/or1k/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/or1k/bits/shm.h31
-rw-r--r--libc-top-half/musl/arch/or1k/bits/signal.h85
-rw-r--r--libc-top-half/musl/arch/or1k/bits/stat.h25
-rw-r--r--libc-top-half/musl/arch/or1k/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/or1k/bits/syscall.h.in324
-rw-r--r--libc-top-half/musl/arch/or1k/bits/user.h0
-rw-r--r--libc-top-half/musl/arch/or1k/crt_arch.h18
-rw-r--r--libc-top-half/musl/arch/or1k/kstat.h21
-rw-r--r--libc-top-half/musl/arch/or1k/pthread_arch.h16
-rw-r--r--libc-top-half/musl/arch/or1k/reloc.h24
-rw-r--r--libc-top-half/musl/arch/or1k/syscall_arch.h115
-rw-r--r--libc-top-half/musl/arch/powerpc/arch.mak1
-rw-r--r--libc-top-half/musl/arch/powerpc/atomic_arch.h38
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/alltypes.h.in20
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/errno.h134
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/fcntl.h40
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/fenv.h36
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/float.h16
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/hwcap.h43
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/ioctl.h120
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/ipc.h12
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/ipcstat.h1
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/mman.h13
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/msg.h18
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/ptrace.h25
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/reg.h3
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/sem.h12
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/shm.h30
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/signal.h119
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/socket.h25
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/stat.h24
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/syscall.h.in428
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/termios.h171
-rw-r--r--libc-top-half/musl/arch/powerpc/bits/user.h23
-rw-r--r--libc-top-half/musl/arch/powerpc/crt_arch.h20
-rw-r--r--libc-top-half/musl/arch/powerpc/kstat.h20
-rw-r--r--libc-top-half/musl/arch/powerpc/pthread_arch.h16
-rw-r--r--libc-top-half/musl/arch/powerpc/reloc.h31
-rw-r--r--libc-top-half/musl/arch/powerpc/syscall_arch.h94
-rw-r--r--libc-top-half/musl/arch/powerpc64/atomic_arch.h62
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/alltypes.h.in20
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/errno.h134
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/fcntl.h40
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/fenv.h31
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/float.h16
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/hwcap.h43
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/ioctl.h120
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/ipc.h12
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/mman.h13
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/ptrace.h25
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/reg.h3
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/shm.h23
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/signal.h110
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/socket.h27
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/stat.h16
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/syscall.h.in400
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/termios.h171
-rw-r--r--libc-top-half/musl/arch/powerpc64/bits/user.h23
-rw-r--r--libc-top-half/musl/arch/powerpc64/crt_arch.h19
-rw-r--r--libc-top-half/musl/arch/powerpc64/kstat.h19
-rw-r--r--libc-top-half/musl/arch/powerpc64/pthread_arch.h16
-rw-r--r--libc-top-half/musl/arch/powerpc64/reloc.h31
-rw-r--r--libc-top-half/musl/arch/powerpc64/syscall_arch.h90
-rw-r--r--libc-top-half/musl/arch/riscv64/atomic_arch.h38
-rw-r--r--libc-top-half/musl/arch/riscv64/bits/alltypes.h.in18
-rw-r--r--libc-top-half/musl/arch/riscv64/bits/fenv.h17
-rw-r--r--libc-top-half/musl/arch/riscv64/bits/float.h16
-rw-r--r--libc-top-half/musl/arch/riscv64/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/riscv64/bits/reg.h2
-rw-r--r--libc-top-half/musl/arch/riscv64/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/riscv64/bits/signal.h118
-rw-r--r--libc-top-half/musl/arch/riscv64/bits/stat.h18
-rw-r--r--libc-top-half/musl/arch/riscv64/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/riscv64/bits/syscall.h.in304
-rw-r--r--libc-top-half/musl/arch/riscv64/bits/user.h6
-rw-r--r--libc-top-half/musl/arch/riscv64/crt_arch.h19
-rw-r--r--libc-top-half/musl/arch/riscv64/kstat.h21
-rw-r--r--libc-top-half/musl/arch/riscv64/pthread_arch.h13
-rw-r--r--libc-top-half/musl/arch/riscv64/reloc.h22
-rw-r--r--libc-top-half/musl/arch/riscv64/syscall_arch.h78
-rw-r--r--libc-top-half/musl/arch/s390x/atomic_arch.h30
-rw-r--r--libc-top-half/musl/arch/s390x/bits/alltypes.h.in19
-rw-r--r--libc-top-half/musl/arch/s390x/bits/fcntl.h43
-rw-r--r--libc-top-half/musl/arch/s390x/bits/fenv.h17
-rw-r--r--libc-top-half/musl/arch/s390x/bits/float.h20
-rw-r--r--libc-top-half/musl/arch/s390x/bits/hwcap.h15
-rw-r--r--libc-top-half/musl/arch/s390x/bits/ioctl_fix.h2
-rw-r--r--libc-top-half/musl/arch/s390x/bits/limits.h1
-rw-r--r--libc-top-half/musl/arch/s390x/bits/link.h1
-rw-r--r--libc-top-half/musl/arch/s390x/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/s390x/bits/ptrace.h12
-rw-r--r--libc-top-half/musl/arch/s390x/bits/reg.h2
-rw-r--r--libc-top-half/musl/arch/s390x/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/s390x/bits/signal.h121
-rw-r--r--libc-top-half/musl/arch/s390x/bits/stat.h16
-rw-r--r--libc-top-half/musl/arch/s390x/bits/statfs.h7
-rw-r--r--libc-top-half/musl/arch/s390x/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/s390x/bits/syscall.h.in365
-rw-r--r--libc-top-half/musl/arch/s390x/bits/user.h62
-rw-r--r--libc-top-half/musl/arch/s390x/crt_arch.h17
-rw-r--r--libc-top-half/musl/arch/s390x/kstat.h19
-rw-r--r--libc-top-half/musl/arch/s390x/pthread_arch.h12
-rw-r--r--libc-top-half/musl/arch/s390x/reloc.h13
-rw-r--r--libc-top-half/musl/arch/s390x/syscall_arch.h74
-rw-r--r--libc-top-half/musl/arch/sh/arch.mak1
-rw-r--r--libc-top-half/musl/arch/sh/atomic_arch.h48
-rw-r--r--libc-top-half/musl/arch/sh/bits/alltypes.h.in25
-rw-r--r--libc-top-half/musl/arch/sh/bits/fenv.h26
-rw-r--r--libc-top-half/musl/arch/sh/bits/float.h16
-rw-r--r--libc-top-half/musl/arch/sh/bits/hwcap.h11
-rw-r--r--libc-top-half/musl/arch/sh/bits/ioctl.h112
-rw-r--r--libc-top-half/musl/arch/sh/bits/ipcstat.h1
-rw-r--r--libc-top-half/musl/arch/sh/bits/limits.h1
-rw-r--r--libc-top-half/musl/arch/sh/bits/msg.h18
-rw-r--r--libc-top-half/musl/arch/sh/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/sh/bits/ptrace.h5
-rw-r--r--libc-top-half/musl/arch/sh/bits/sem.h18
-rw-r--r--libc-top-half/musl/arch/sh/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/sh/bits/shm.h31
-rw-r--r--libc-top-half/musl/arch/sh/bits/signal.h96
-rw-r--r--libc-top-half/musl/arch/sh/bits/stat.h25
-rw-r--r--libc-top-half/musl/arch/sh/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/sh/bits/syscall.h.in412
-rw-r--r--libc-top-half/musl/arch/sh/bits/user.h51
-rw-r--r--libc-top-half/musl/arch/sh/crt_arch.h78
-rw-r--r--libc-top-half/musl/arch/sh/ksigaction.h10
-rw-r--r--libc-top-half/musl/arch/sh/kstat.h21
-rw-r--r--libc-top-half/musl/arch/sh/pthread_arch.h16
-rw-r--r--libc-top-half/musl/arch/sh/reloc.h52
-rw-r--r--libc-top-half/musl/arch/sh/syscall_arch.h93
-rw-r--r--libc-top-half/musl/arch/wasm32/atomic_arch.h7
-rw-r--r--libc-top-half/musl/arch/wasm32/bits/alltypes.h.in58
-rw-r--r--libc-top-half/musl/arch/wasm32/bits/dirent.h1
-rw-r--r--libc-top-half/musl/arch/wasm32/bits/fcntl.h1
-rw-r--r--libc-top-half/musl/arch/wasm32/bits/float.h16
-rw-r--r--libc-top-half/musl/arch/wasm32/bits/ioctl.h1
-rw-r--r--libc-top-half/musl/arch/wasm32/bits/limits.h1
-rw-r--r--libc-top-half/musl/arch/wasm32/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/wasm32/bits/reg.h2
-rw-r--r--libc-top-half/musl/arch/wasm32/bits/signal.h40
-rw-r--r--libc-top-half/musl/arch/wasm32/bits/stat.h1
-rw-r--r--libc-top-half/musl/arch/wasm32/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/wasm32/fp_arch.h25
-rw-r--r--libc-top-half/musl/arch/wasm32/pthread_arch.h5
-rw-r--r--libc-top-half/musl/arch/wasm32/reloc.h1
-rw-r--r--libc-top-half/musl/arch/wasm32/syscall_arch.h0
-rw-r--r--libc-top-half/musl/arch/x32/atomic_arch.h121
-rw-r--r--libc-top-half/musl/arch/x32/bits/alltypes.h.in24
-rw-r--r--libc-top-half/musl/arch/x32/bits/fcntl.h40
-rw-r--r--libc-top-half/musl/arch/x32/bits/fenv.h34
-rw-r--r--libc-top-half/musl/arch/x32/bits/float.h20
-rw-r--r--libc-top-half/musl/arch/x32/bits/io.h77
-rw-r--r--libc-top-half/musl/arch/x32/bits/ioctl_fix.h4
-rw-r--r--libc-top-half/musl/arch/x32/bits/ipc.h11
-rw-r--r--libc-top-half/musl/arch/x32/bits/limits.h1
-rw-r--r--libc-top-half/musl/arch/x32/bits/mman.h1
-rw-r--r--libc-top-half/musl/arch/x32/bits/msg.h15
-rw-r--r--libc-top-half/musl/arch/x32/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/x32/bits/ptrace.h13
-rw-r--r--libc-top-half/musl/arch/x32/bits/reg.h29
-rw-r--r--libc-top-half/musl/arch/x32/bits/sem.h11
-rw-r--r--libc-top-half/musl/arch/x32/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/x32/bits/shm.h32
-rw-r--r--libc-top-half/musl/arch/x32/bits/signal.h153
-rw-r--r--libc-top-half/musl/arch/x32/bits/socket.h5
-rw-r--r--libc-top-half/musl/arch/x32/bits/stat.h22
-rw-r--r--libc-top-half/musl/arch/x32/bits/statfs.h9
-rw-r--r--libc-top-half/musl/arch/x32/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/x32/bits/syscall.h.in349
-rw-r--r--libc-top-half/musl/arch/x32/bits/user.h41
-rw-r--r--libc-top-half/musl/arch/x32/crt_arch.h12
-rw-r--r--libc-top-half/musl/arch/x32/ksigaction.h11
-rw-r--r--libc-top-half/musl/arch/x32/kstat.h22
-rw-r--r--libc-top-half/musl/arch/x32/pthread_arch.h12
-rw-r--r--libc-top-half/musl/arch/x32/reloc.h31
-rw-r--r--libc-top-half/musl/arch/x32/syscall_arch.h93
-rw-r--r--libc-top-half/musl/arch/x86_64/atomic_arch.h123
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/alltypes.h.in20
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/fenv.h34
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/float.h20
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/io.h77
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/limits.h1
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/mman.h1
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/posix.h2
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/ptrace.h13
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/reg.h29
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/sem.h11
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/setjmp.h1
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/signal.h153
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/stat.h22
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/stdint.h20
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/syscall.h.in358
-rw-r--r--libc-top-half/musl/arch/x86_64/bits/user.h41
-rw-r--r--libc-top-half/musl/arch/x86_64/crt_arch.h12
-rw-r--r--libc-top-half/musl/arch/x86_64/ksigaction.h11
-rw-r--r--libc-top-half/musl/arch/x86_64/kstat.h22
-rw-r--r--libc-top-half/musl/arch/x86_64/pthread_arch.h8
-rw-r--r--libc-top-half/musl/arch/x86_64/reloc.h20
-rw-r--r--libc-top-half/musl/arch/x86_64/syscall_arch.h70
-rw-r--r--libc-top-half/musl/compat/time32/__xstat.c24
-rw-r--r--libc-top-half/musl/compat/time32/adjtime32.c21
-rw-r--r--libc-top-half/musl/compat/time32/adjtimex_time32.c10
-rw-r--r--libc-top-half/musl/compat/time32/aio_suspend_time32.c11
-rw-r--r--libc-top-half/musl/compat/time32/clock_adjtime32.c70
-rw-r--r--libc-top-half/musl/compat/time32/clock_getres_time32.c13
-rw-r--r--libc-top-half/musl/compat/time32/clock_gettime32.c18
-rw-r--r--libc-top-half/musl/compat/time32/clock_nanosleep_time32.c15
-rw-r--r--libc-top-half/musl/compat/time32/clock_settime32.c9
-rw-r--r--libc-top-half/musl/compat/time32/cnd_timedwait_time32.c9
-rw-r--r--libc-top-half/musl/compat/time32/ctime32.c7
-rw-r--r--libc-top-half/musl/compat/time32/ctime32_r.c7
-rw-r--r--libc-top-half/musl/compat/time32/difftime32.c7
-rw-r--r--libc-top-half/musl/compat/time32/fstat_time32.c17
-rw-r--r--libc-top-half/musl/compat/time32/fstatat_time32.c17
-rw-r--r--libc-top-half/musl/compat/time32/ftime32.c25
-rw-r--r--libc-top-half/musl/compat/time32/futimens_time32.c10
-rw-r--r--libc-top-half/musl/compat/time32/futimes_time32.c12
-rw-r--r--libc-top-half/musl/compat/time32/futimesat_time32.c12
-rw-r--r--libc-top-half/musl/compat/time32/getitimer_time32.c15
-rw-r--r--libc-top-half/musl/compat/time32/getrusage_time32.c39
-rw-r--r--libc-top-half/musl/compat/time32/gettimeofday_time32.c19
-rw-r--r--libc-top-half/musl/compat/time32/gmtime32.c7
-rw-r--r--libc-top-half/musl/compat/time32/gmtime32_r.c7
-rw-r--r--libc-top-half/musl/compat/time32/localtime32.c7
-rw-r--r--libc-top-half/musl/compat/time32/localtime32_r.c7
-rw-r--r--libc-top-half/musl/compat/time32/lstat_time32.c17
-rw-r--r--libc-top-half/musl/compat/time32/lutimes_time32.c12
-rw-r--r--libc-top-half/musl/compat/time32/mktime32.c16
-rw-r--r--libc-top-half/musl/compat/time32/mq_timedreceive_time32.c9
-rw-r--r--libc-top-half/musl/compat/time32/mq_timedsend_time32.c9
-rw-r--r--libc-top-half/musl/compat/time32/mtx_timedlock_time32.c9
-rw-r--r--libc-top-half/musl/compat/time32/nanosleep_time32.c15
-rw-r--r--libc-top-half/musl/compat/time32/ppoll_time32.c10
-rw-r--r--libc-top-half/musl/compat/time32/pselect_time32.c9
-rw-r--r--libc-top-half/musl/compat/time32/pthread_cond_timedwait_time32.c9
-rw-r--r--libc-top-half/musl/compat/time32/pthread_mutex_timedlock_time32.c9
-rw-r--r--libc-top-half/musl/compat/time32/pthread_rwlock_timedrdlock_time32.c9
-rw-r--r--libc-top-half/musl/compat/time32/pthread_rwlock_timedwrlock_time32.c9
-rw-r--r--libc-top-half/musl/compat/time32/pthread_timedjoin_np_time32.c10
-rw-r--r--libc-top-half/musl/compat/time32/recvmmsg_time32.c10
-rw-r--r--libc-top-half/musl/compat/time32/sched_rr_get_interval_time32.c13
-rw-r--r--libc-top-half/musl/compat/time32/select_time32.c10
-rw-r--r--libc-top-half/musl/compat/time32/sem_timedwait_time32.c9
-rw-r--r--libc-top-half/musl/compat/time32/semtimedop_time32.c10
-rw-r--r--libc-top-half/musl/compat/time32/setitimer_time32.c25
-rw-r--r--libc-top-half/musl/compat/time32/settimeofday_time32.c10
-rw-r--r--libc-top-half/musl/compat/time32/sigtimedwait_time32.c9
-rw-r--r--libc-top-half/musl/compat/time32/stat_time32.c17
-rw-r--r--libc-top-half/musl/compat/time32/stime32.c8
-rw-r--r--libc-top-half/musl/compat/time32/thrd_sleep_time32.c16
-rw-r--r--libc-top-half/musl/compat/time32/time32.c15
-rw-r--r--libc-top-half/musl/compat/time32/time32.h91
-rw-r--r--libc-top-half/musl/compat/time32/time32gm.c15
-rw-r--r--libc-top-half/musl/compat/time32/timer_gettime32.c15
-rw-r--r--libc-top-half/musl/compat/time32/timer_settime32.c25
-rw-r--r--libc-top-half/musl/compat/time32/timerfd_gettime32.c16
-rw-r--r--libc-top-half/musl/compat/time32/timerfd_settime32.c26
-rw-r--r--libc-top-half/musl/compat/time32/timespec_get_time32.c18
-rw-r--r--libc-top-half/musl/compat/time32/utime_time32.c14
-rw-r--r--libc-top-half/musl/compat/time32/utimensat_time32.c11
-rw-r--r--libc-top-half/musl/compat/time32/utimes_time32.c11
-rw-r--r--libc-top-half/musl/compat/time32/wait3_time32.c40
-rw-r--r--libc-top-half/musl/compat/time32/wait4_time32.c40
-rwxr-xr-xlibc-top-half/musl/configure814
-rw-r--r--libc-top-half/musl/crt/Scrt1.c1
-rw-r--r--libc-top-half/musl/crt/aarch64/crti.s13
-rw-r--r--libc-top-half/musl/crt/aarch64/crtn.s7
-rw-r--r--libc-top-half/musl/crt/arm/crti.s13
-rw-r--r--libc-top-half/musl/crt/arm/crtn.s9
-rw-r--r--libc-top-half/musl/crt/crt1.c19
-rw-r--r--libc-top-half/musl/crt/crti.c0
-rw-r--r--libc-top-half/musl/crt/crtn.c0
-rw-r--r--libc-top-half/musl/crt/i386/crti.s9
-rw-r--r--libc-top-half/musl/crt/i386/crtn.s7
-rw-r--r--libc-top-half/musl/crt/microblaze/crti.s13
-rw-r--r--libc-top-half/musl/crt/microblaze/crtn.s9
-rw-r--r--libc-top-half/musl/crt/mips/crti.s19
-rw-r--r--libc-top-half/musl/crt/mips/crtn.s13
-rw-r--r--libc-top-half/musl/crt/mips64/crti.s17
-rw-r--r--libc-top-half/musl/crt/mips64/crtn.s13
-rw-r--r--libc-top-half/musl/crt/mipsn32/crti.s18
-rw-r--r--libc-top-half/musl/crt/mipsn32/crtn.s12
-rw-r--r--libc-top-half/musl/crt/or1k/crti.s11
-rw-r--r--libc-top-half/musl/crt/or1k/crtn.s9
-rw-r--r--libc-top-half/musl/crt/powerpc/crti.s15
-rw-r--r--libc-top-half/musl/crt/powerpc/crtn.s13
-rw-r--r--libc-top-half/musl/crt/powerpc64/crti.s21
-rw-r--r--libc-top-half/musl/crt/powerpc64/crtn.s13
-rw-r--r--libc-top-half/musl/crt/rcrt1.c14
-rw-r--r--libc-top-half/musl/crt/s390x/crti.s17
-rw-r--r--libc-top-half/musl/crt/s390x/crtn.s9
-rw-r--r--libc-top-half/musl/crt/sh/crti.s21
-rw-r--r--libc-top-half/musl/crt/sh/crtn.s13
-rw-r--r--libc-top-half/musl/crt/x32/crti.s9
-rw-r--r--libc-top-half/musl/crt/x32/crtn.s7
-rw-r--r--libc-top-half/musl/crt/x86_64/crti.s9
-rw-r--r--libc-top-half/musl/crt/x86_64/crtn.s7
-rw-r--r--libc-top-half/musl/dist/config.mak36
-rw-r--r--libc-top-half/musl/dynamic.list45
-rw-r--r--libc-top-half/musl/include/aio.h73
-rw-r--r--libc-top-half/musl/include/alloca.h19
-rw-r--r--libc-top-half/musl/include/alltypes.h.in118
-rw-r--r--libc-top-half/musl/include/ar.h25
-rw-r--r--libc-top-half/musl/include/arpa/ftp.h35
-rw-r--r--libc-top-half/musl/include/arpa/inet.h35
-rw-r--r--libc-top-half/musl/include/arpa/nameser.h455
-rw-r--r--libc-top-half/musl/include/arpa/nameser_compat.h2
-rw-r--r--libc-top-half/musl/include/arpa/telnet.h251
-rw-r--r--libc-top-half/musl/include/arpa/tftp.h31
-rw-r--r--libc-top-half/musl/include/assert.h23
-rw-r--r--libc-top-half/musl/include/byteswap.h26
-rw-r--r--libc-top-half/musl/include/complex.h143
-rw-r--r--libc-top-half/musl/include/cpio.h29
-rw-r--r--libc-top-half/musl/include/crypt.h20
-rw-r--r--libc-top-half/musl/include/ctype.h77
-rw-r--r--libc-top-half/musl/include/dirent.h89
-rw-r--r--libc-top-half/musl/include/dlfcn.h46
-rw-r--r--libc-top-half/musl/include/elf.h3296
-rw-r--r--libc-top-half/musl/include/endian.h80
-rw-r--r--libc-top-half/musl/include/err.h25
-rw-r--r--libc-top-half/musl/include/errno.h32
-rw-r--r--libc-top-half/musl/include/fcntl.h246
-rw-r--r--libc-top-half/musl/include/features.h40
-rw-r--r--libc-top-half/musl/include/fenv.h28
-rw-r--r--libc-top-half/musl/include/float.h56
-rw-r--r--libc-top-half/musl/include/fmtmsg.h47
-rw-r--r--libc-top-half/musl/include/fnmatch.h24
-rw-r--r--libc-top-half/musl/include/ftw.h45
-rw-r--r--libc-top-half/musl/include/getopt.h30
-rw-r--r--libc-top-half/musl/include/glob.h54
-rw-r--r--libc-top-half/musl/include/grp.h53
-rw-r--r--libc-top-half/musl/include/iconv.h24
-rw-r--r--libc-top-half/musl/include/ifaddrs.h35
-rw-r--r--libc-top-half/musl/include/inttypes.h233
-rw-r--r--libc-top-half/musl/include/iso646.h20
-rw-r--r--libc-top-half/musl/include/langinfo.h98
-rw-r--r--libc-top-half/musl/include/lastlog.h1
-rw-r--r--libc-top-half/musl/include/libgen.h15
-rw-r--r--libc-top-half/musl/include/libintl.h33
-rw-r--r--libc-top-half/musl/include/limits.h180
-rw-r--r--libc-top-half/musl/include/link.h53
-rw-r--r--libc-top-half/musl/include/locale.h93
-rw-r--r--libc-top-half/musl/include/malloc.h33
-rw-r--r--libc-top-half/musl/include/math.h459
-rw-r--r--libc-top-half/musl/include/memory.h1
-rw-r--r--libc-top-half/musl/include/mntent.h43
-rw-r--r--libc-top-half/musl/include/monetary.h23
-rw-r--r--libc-top-half/musl/include/mqueue.h41
-rw-r--r--libc-top-half/musl/include/net/ethernet.h55
-rw-r--r--libc-top-half/musl/include/net/if.h141
-rw-r--r--libc-top-half/musl/include/net/if_arp.h142
-rw-r--r--libc-top-half/musl/include/net/route.h124
-rw-r--r--libc-top-half/musl/include/netdb.h156
-rw-r--r--libc-top-half/musl/include/netinet/ether.h22
-rw-r--r--libc-top-half/musl/include/netinet/icmp6.h305
-rw-r--r--libc-top-half/musl/include/netinet/if_ether.h149
-rw-r--r--libc-top-half/musl/include/netinet/igmp.h45
-rw-r--r--libc-top-half/musl/include/netinet/in.h433
-rw-r--r--libc-top-half/musl/include/netinet/in_systm.h9
-rw-r--r--libc-top-half/musl/include/netinet/ip.h199
-rw-r--r--libc-top-half/musl/include/netinet/ip6.h141
-rw-r--r--libc-top-half/musl/include/netinet/ip_icmp.h193
-rw-r--r--libc-top-half/musl/include/netinet/tcp.h305
-rw-r--r--libc-top-half/musl/include/netinet/udp.h46
-rw-r--r--libc-top-half/musl/include/netpacket/packet.h62
-rw-r--r--libc-top-half/musl/include/nl_types.h22
-rw-r--r--libc-top-half/musl/include/paths.h31
-rw-r--r--libc-top-half/musl/include/poll.h69
-rw-r--r--libc-top-half/musl/include/pthread.h254
-rw-r--r--libc-top-half/musl/include/pty.h18
-rw-r--r--libc-top-half/musl/include/pwd.h50
-rw-r--r--libc-top-half/musl/include/regex.h62
-rw-r--r--libc-top-half/musl/include/resolv.h142
-rw-r--r--libc-top-half/musl/include/sched.h152
-rw-r--r--libc-top-half/musl/include/scsi/scsi.h150
-rw-r--r--libc-top-half/musl/include/scsi/scsi_ioctl.h11
-rw-r--r--libc-top-half/musl/include/scsi/sg.h129
-rw-r--r--libc-top-half/musl/include/search.h63
-rw-r--r--libc-top-half/musl/include/semaphore.h39
-rw-r--r--libc-top-half/musl/include/setjmp.h53
-rw-r--r--libc-top-half/musl/include/shadow.h44
-rw-r--r--libc-top-half/musl/include/signal.h339
-rw-r--r--libc-top-half/musl/include/spawn.h83
-rw-r--r--libc-top-half/musl/include/stdalign.h20
-rw-r--r--libc-top-half/musl/include/stdarg.h21
-rw-r--r--libc-top-half/musl/include/stdbool.h14
-rw-r--r--libc-top-half/musl/include/stdc-predef.h13
-rw-r--r--libc-top-half/musl/include/stddef.h27
-rw-r--r--libc-top-half/musl/include/stdint.h117
-rw-r--r--libc-top-half/musl/include/stdio.h254
-rw-r--r--libc-top-half/musl/include/stdio_ext.h34
-rw-r--r--libc-top-half/musl/include/stdlib.h219
-rw-r--r--libc-top-half/musl/include/stdnoreturn.h7
-rw-r--r--libc-top-half/musl/include/string.h128
-rw-r--r--libc-top-half/musl/include/strings.h39
-rw-r--r--libc-top-half/musl/include/stropts.h139
-rw-r--r--libc-top-half/musl/include/sys/acct.h72
-rw-r--r--libc-top-half/musl/include/sys/auxv.h17
-rw-r--r--libc-top-half/musl/include/sys/cachectl.h22
-rw-r--r--libc-top-half/musl/include/sys/dir.h2
-rw-r--r--libc-top-half/musl/include/sys/epoll.h69
-rw-r--r--libc-top-half/musl/include/sys/errno.h2
-rw-r--r--libc-top-half/musl/include/sys/eventfd.h26
-rw-r--r--libc-top-half/musl/include/sys/fanotify.h111
-rw-r--r--libc-top-half/musl/include/sys/fcntl.h2
-rw-r--r--libc-top-half/musl/include/sys/file.h21
-rw-r--r--libc-top-half/musl/include/sys/fsuid.h20
-rw-r--r--libc-top-half/musl/include/sys/inotify.h58
-rw-r--r--libc-top-half/musl/include/sys/io.h17
-rw-r--r--libc-top-half/musl/include/sys/ioctl.h124
-rw-r--r--libc-top-half/musl/include/sys/ipc.h42
-rw-r--r--libc-top-half/musl/include/sys/kd.h1
-rw-r--r--libc-top-half/musl/include/sys/klog.h14
-rw-r--r--libc-top-half/musl/include/sys/membarrier.h21
-rw-r--r--libc-top-half/musl/include/sys/mman.h157
-rw-r--r--libc-top-half/musl/include/sys/mount.h75
-rw-r--r--libc-top-half/musl/include/sys/msg.h53
-rw-r--r--libc-top-half/musl/include/sys/mtio.h188
-rw-r--r--libc-top-half/musl/include/sys/param.h37
-rw-r--r--libc-top-half/musl/include/sys/personality.h49
-rw-r--r--libc-top-half/musl/include/sys/poll.h2
-rw-r--r--libc-top-half/musl/include/sys/prctl.h186
-rw-r--r--libc-top-half/musl/include/sys/procfs.h63
-rw-r--r--libc-top-half/musl/include/sys/ptrace.h147
-rw-r--r--libc-top-half/musl/include/sys/quota.h102
-rw-r--r--libc-top-half/musl/include/sys/random.h27
-rw-r--r--libc-top-half/musl/include/sys/reboot.h20
-rw-r--r--libc-top-half/musl/include/sys/reg.h9
-rw-r--r--libc-top-half/musl/include/sys/resource.h126
-rw-r--r--libc-top-half/musl/include/sys/select.h54
-rw-r--r--libc-top-half/musl/include/sys/sem.h72
-rw-r--r--libc-top-half/musl/include/sys/sendfile.h22
-rw-r--r--libc-top-half/musl/include/sys/shm.h70
-rw-r--r--libc-top-half/musl/include/sys/signal.h2
-rw-r--r--libc-top-half/musl/include/sys/signalfd.h49
-rw-r--r--libc-top-half/musl/include/sys/socket.h448
-rw-r--r--libc-top-half/musl/include/sys/soundcard.h1
-rw-r--r--libc-top-half/musl/include/sys/stat.h143
-rw-r--r--libc-top-half/musl/include/sys/statfs.h32
-rw-r--r--libc-top-half/musl/include/sys/statvfs.h56
-rw-r--r--libc-top-half/musl/include/sys/stropts.h1
-rw-r--r--libc-top-half/musl/include/sys/swap.h21
-rw-r--r--libc-top-half/musl/include/sys/syscall.h10
-rw-r--r--libc-top-half/musl/include/sys/sysinfo.h36
-rw-r--r--libc-top-half/musl/include/sys/syslog.h1
-rw-r--r--libc-top-half/musl/include/sys/sysmacros.h15
-rw-r--r--libc-top-half/musl/include/sys/termios.h2
-rw-r--r--libc-top-half/musl/include/sys/time.h84
-rw-r--r--libc-top-half/musl/include/sys/timeb.h28
-rw-r--r--libc-top-half/musl/include/sys/timerfd.h32
-rw-r--r--libc-top-half/musl/include/sys/times.h34
-rw-r--r--libc-top-half/musl/include/sys/timex.h103
-rw-r--r--libc-top-half/musl/include/sys/ttydefaults.h34
-rw-r--r--libc-top-half/musl/include/sys/types.h85
-rw-r--r--libc-top-half/musl/include/sys/ucontext.h1
-rw-r--r--libc-top-half/musl/include/sys/uio.h48
-rw-r--r--libc-top-half/musl/include/sys/un.h39
-rw-r--r--libc-top-half/musl/include/sys/user.h16
-rw-r--r--libc-top-half/musl/include/sys/utsname.h29
-rw-r--r--libc-top-half/musl/include/sys/vfs.h1
-rw-r--r--libc-top-half/musl/include/sys/vt.h1
-rw-r--r--libc-top-half/musl/include/sys/wait.h67
-rw-r--r--libc-top-half/musl/include/sys/xattr.h32
-rw-r--r--libc-top-half/musl/include/syscall.h1
-rw-r--r--libc-top-half/musl/include/sysexits.h21
-rw-r--r--libc-top-half/musl/include/syslog.h100
-rw-r--r--libc-top-half/musl/include/tar.h33
-rw-r--r--libc-top-half/musl/include/termios.h50
-rw-r--r--libc-top-half/musl/include/tgmath.h270
-rw-r--r--libc-top-half/musl/include/threads.h93
-rw-r--r--libc-top-half/musl/include/time.h204
-rw-r--r--libc-top-half/musl/include/uchar.h29
-rw-r--r--libc-top-half/musl/include/ucontext.h25
-rw-r--r--libc-top-half/musl/include/ulimit.h17
-rw-r--r--libc-top-half/musl/include/unistd.h577
-rw-r--r--libc-top-half/musl/include/utime.h29
-rw-r--r--libc-top-half/musl/include/utmp.h52
-rw-r--r--libc-top-half/musl/include/utmpx.h67
-rw-r--r--libc-top-half/musl/include/values.h39
-rw-r--r--libc-top-half/musl/include/wait.h2
-rw-r--r--libc-top-half/musl/include/wchar.h214
-rw-r--r--libc-top-half/musl/include/wctype.h79
-rw-r--r--libc-top-half/musl/include/wordexp.h41
-rw-r--r--libc-top-half/musl/ldso/dlstart.c148
-rw-r--r--libc-top-half/musl/ldso/dynlink.c2361
-rw-r--r--libc-top-half/musl/src/aio/aio.c418
-rw-r--r--libc-top-half/musl/src/aio/aio_suspend.c79
-rw-r--r--libc-top-half/musl/src/aio/lio_listio.c143
-rw-r--r--libc-top-half/musl/src/complex/__cexp.c87
-rw-r--r--libc-top-half/musl/src/complex/__cexpf.c68
-rw-r--r--libc-top-half/musl/src/complex/cabs.c6
-rw-r--r--libc-top-half/musl/src/complex/cabsf.c6
-rw-r--r--libc-top-half/musl/src/complex/cabsl.c13
-rw-r--r--libc-top-half/musl/src/complex/cacos.c11
-rw-r--r--libc-top-half/musl/src/complex/cacosf.c11
-rw-r--r--libc-top-half/musl/src/complex/cacosh.c12
-rw-r--r--libc-top-half/musl/src/complex/cacoshf.c10
-rw-r--r--libc-top-half/musl/src/complex/cacoshl.c17
-rw-r--r--libc-top-half/musl/src/complex/cacosl.c16
-rw-r--r--libc-top-half/musl/src/complex/carg.c6
-rw-r--r--libc-top-half/musl/src/complex/cargf.c6
-rw-r--r--libc-top-half/musl/src/complex/cargl.c13
-rw-r--r--libc-top-half/musl/src/complex/casin.c17
-rw-r--r--libc-top-half/musl/src/complex/casinf.c15
-rw-r--r--libc-top-half/musl/src/complex/casinh.c9
-rw-r--r--libc-top-half/musl/src/complex/casinhf.c7
-rw-r--r--libc-top-half/musl/src/complex/casinhl.c14
-rw-r--r--libc-top-half/musl/src/complex/casinl.c21
-rw-r--r--libc-top-half/musl/src/complex/catan.c107
-rw-r--r--libc-top-half/musl/src/complex/catanf.c105
-rw-r--r--libc-top-half/musl/src/complex/catanh.c9
-rw-r--r--libc-top-half/musl/src/complex/catanhf.c7
-rw-r--r--libc-top-half/musl/src/complex/catanhl.c14
-rw-r--r--libc-top-half/musl/src/complex/catanl.c114
-rw-r--r--libc-top-half/musl/src/complex/ccos.c8
-rw-r--r--libc-top-half/musl/src/complex/ccosf.c6
-rw-r--r--libc-top-half/musl/src/complex/ccosh.c140
-rw-r--r--libc-top-half/musl/src/complex/ccoshf.c90
-rw-r--r--libc-top-half/musl/src/complex/ccoshl.c7
-rw-r--r--libc-top-half/musl/src/complex/ccosl.c13
-rw-r--r--libc-top-half/musl/src/complex/cexp.c83
-rw-r--r--libc-top-half/musl/src/complex/cexpf.c83
-rw-r--r--libc-top-half/musl/src/complex/cexpl.c7
-rw-r--r--libc-top-half/musl/src/complex/cimag.c6
-rw-r--r--libc-top-half/musl/src/complex/cimagf.c6
-rw-r--r--libc-top-half/musl/src/complex/cimagl.c6
-rw-r--r--libc-top-half/musl/src/complex/clog.c14
-rw-r--r--libc-top-half/musl/src/complex/clogf.c12
-rw-r--r--libc-top-half/musl/src/complex/clogl.c18
-rw-r--r--libc-top-half/musl/src/complex/conj.c6
-rw-r--r--libc-top-half/musl/src/complex/conjf.c6
-rw-r--r--libc-top-half/musl/src/complex/conjl.c6
-rw-r--r--libc-top-half/musl/src/complex/cpow.c8
-rw-r--r--libc-top-half/musl/src/complex/cpowf.c6
-rw-r--r--libc-top-half/musl/src/complex/cpowl.c13
-rw-r--r--libc-top-half/musl/src/complex/cproj.c8
-rw-r--r--libc-top-half/musl/src/complex/cprojf.c8
-rw-r--r--libc-top-half/musl/src/complex/cprojl.c15
-rw-r--r--libc-top-half/musl/src/complex/creal.c6
-rw-r--r--libc-top-half/musl/src/complex/crealf.c6
-rw-r--r--libc-top-half/musl/src/complex/creall.c6
-rw-r--r--libc-top-half/musl/src/complex/csin.c9
-rw-r--r--libc-top-half/musl/src/complex/csinf.c7
-rw-r--r--libc-top-half/musl/src/complex/csinh.c141
-rw-r--r--libc-top-half/musl/src/complex/csinhf.c90
-rw-r--r--libc-top-half/musl/src/complex/csinhl.c7
-rw-r--r--libc-top-half/musl/src/complex/csinl.c14
-rw-r--r--libc-top-half/musl/src/complex/csqrt.c100
-rw-r--r--libc-top-half/musl/src/complex/csqrtf.c82
-rw-r--r--libc-top-half/musl/src/complex/csqrtl.c7
-rw-r--r--libc-top-half/musl/src/complex/ctan.c9
-rw-r--r--libc-top-half/musl/src/complex/ctanf.c7
-rw-r--r--libc-top-half/musl/src/complex/ctanh.c129
-rw-r--r--libc-top-half/musl/src/complex/ctanhf.c66
-rw-r--r--libc-top-half/musl/src/complex/ctanhl.c7
-rw-r--r--libc-top-half/musl/src/complex/ctanl.c14
-rw-r--r--libc-top-half/musl/src/conf/confstr.c17
-rw-r--r--libc-top-half/musl/src/conf/fpathconf.c39
-rw-r--r--libc-top-half/musl/src/conf/legacy.c22
-rw-r--r--libc-top-half/musl/src/conf/pathconf.c6
-rw-r--r--libc-top-half/musl/src/conf/sysconf.c282
-rw-r--r--libc-top-half/musl/src/crypt/crypt.c14
-rw-r--r--libc-top-half/musl/src/crypt/crypt_blowfish.c806
-rw-r--r--libc-top-half/musl/src/crypt/crypt_des.c1016
-rw-r--r--libc-top-half/musl/src/crypt/crypt_des.h14
-rw-r--r--libc-top-half/musl/src/crypt/crypt_md5.c285
-rw-r--r--libc-top-half/musl/src/crypt/crypt_r.c23
-rw-r--r--libc-top-half/musl/src/crypt/crypt_sha256.c322
-rw-r--r--libc-top-half/musl/src/crypt/crypt_sha512.c371
-rw-r--r--libc-top-half/musl/src/crypt/encrypt.c52
-rw-r--r--libc-top-half/musl/src/ctype/__ctype_b_loc.c41
-rw-r--r--libc-top-half/musl/src/ctype/__ctype_get_mb_cur_max.c7
-rw-r--r--libc-top-half/musl/src/ctype/__ctype_tolower_loc.c30
-rw-r--r--libc-top-half/musl/src/ctype/__ctype_toupper_loc.c30
-rw-r--r--libc-top-half/musl/src/ctype/alpha.h172
-rw-r--r--libc-top-half/musl/src/ctype/casemap.h297
-rw-r--r--libc-top-half/musl/src/ctype/isalnum.c13
-rw-r--r--libc-top-half/musl/src/ctype/isalpha.c14
-rw-r--r--libc-top-half/musl/src/ctype/isascii.c7
-rw-r--r--libc-top-half/musl/src/ctype/isblank.c13
-rw-r--r--libc-top-half/musl/src/ctype/iscntrl.c13
-rw-r--r--libc-top-half/musl/src/ctype/isdigit.c14
-rw-r--r--libc-top-half/musl/src/ctype/isgraph.c14
-rw-r--r--libc-top-half/musl/src/ctype/islower.c14
-rw-r--r--libc-top-half/musl/src/ctype/isprint.c14
-rw-r--r--libc-top-half/musl/src/ctype/ispunct.c13
-rw-r--r--libc-top-half/musl/src/ctype/isspace.c14
-rw-r--r--libc-top-half/musl/src/ctype/isupper.c14
-rw-r--r--libc-top-half/musl/src/ctype/iswalnum.c13
-rw-r--r--libc-top-half/musl/src/ctype/iswalpha.c21
-rw-r--r--libc-top-half/musl/src/ctype/iswblank.c14
-rw-r--r--libc-top-half/musl/src/ctype/iswcntrl.c16
-rw-r--r--libc-top-half/musl/src/ctype/iswctype.c75
-rw-r--r--libc-top-half/musl/src/ctype/iswdigit.c15
-rw-r--r--libc-top-half/musl/src/ctype/iswgraph.c14
-rw-r--r--libc-top-half/musl/src/ctype/iswlower.c13
-rw-r--r--libc-top-half/musl/src/ctype/iswprint.c26
-rw-r--r--libc-top-half/musl/src/ctype/iswpunct.c19
-rw-r--r--libc-top-half/musl/src/ctype/iswspace.c24
-rw-r--r--libc-top-half/musl/src/ctype/iswupper.c13
-rw-r--r--libc-top-half/musl/src/ctype/iswxdigit.c13
-rw-r--r--libc-top-half/musl/src/ctype/isxdigit.c13
-rw-r--r--libc-top-half/musl/src/ctype/nonspacing.h91
-rw-r--r--libc-top-half/musl/src/ctype/punct.h141
-rw-r--r--libc-top-half/musl/src/ctype/toascii.c7
-rw-r--r--libc-top-half/musl/src/ctype/tolower.c14
-rw-r--r--libc-top-half/musl/src/ctype/toupper.c14
-rw-r--r--libc-top-half/musl/src/ctype/towctrans.c84
-rw-r--r--libc-top-half/musl/src/ctype/wcswidth.c8
-rw-r--r--libc-top-half/musl/src/ctype/wctrans.c29
-rw-r--r--libc-top-half/musl/src/ctype/wcwidth.c29
-rw-r--r--libc-top-half/musl/src/ctype/wide.h65
-rw-r--r--libc-top-half/musl/src/dirent/__dirent.h11
-rw-r--r--libc-top-half/musl/src/dirent/alphasort.c9
-rw-r--r--libc-top-half/musl/src/dirent/closedir.c11
-rw-r--r--libc-top-half/musl/src/dirent/dirfd.c7
-rw-r--r--libc-top-half/musl/src/dirent/fdopendir.c31
-rw-r--r--libc-top-half/musl/src/dirent/opendir.c21
-rw-r--r--libc-top-half/musl/src/dirent/readdir.c29
-rw-r--r--libc-top-half/musl/src/dirent/readdir_r.c29
-rw-r--r--libc-top-half/musl/src/dirent/rewinddir.c13
-rw-r--r--libc-top-half/musl/src/dirent/scandir.c47
-rw-r--r--libc-top-half/musl/src/dirent/seekdir.c12
-rw-r--r--libc-top-half/musl/src/dirent/telldir.c7
-rw-r--r--libc-top-half/musl/src/dirent/versionsort.c11
-rw-r--r--libc-top-half/musl/src/env/__environ.c6
-rw-r--r--libc-top-half/musl/src/env/__init_tls.c186
-rw-r--r--libc-top-half/musl/src/env/__libc_start_main.c97
-rw-r--r--libc-top-half/musl/src/env/__reset_tls.c15
-rw-r--r--libc-top-half/musl/src/env/__stack_chk_fail.c49
-rw-r--r--libc-top-half/musl/src/env/clearenv.c21
-rw-r--r--libc-top-half/musl/src/env/getenv.c20
-rw-r--r--libc-top-half/musl/src/env/putenv.c53
-rw-r--r--libc-top-half/musl/src/env/secure_getenv.c8
-rw-r--r--libc-top-half/musl/src/env/setenv.c42
-rw-r--r--libc-top-half/musl/src/env/unsetenv.c35
-rw-r--r--libc-top-half/musl/src/errno/__errno_location.c9
-rw-r--r--libc-top-half/musl/src/errno/__strerror.h137
-rw-r--r--libc-top-half/musl/src/errno/strerror.c47
-rw-r--r--libc-top-half/musl/src/exit/_Exit.c8
-rw-r--r--libc-top-half/musl/src/exit/abort.c30
-rw-r--r--libc-top-half/musl/src/exit/abort_lock.c3
-rw-r--r--libc-top-half/musl/src/exit/arm/__aeabi_atexit.c6
-rw-r--r--libc-top-half/musl/src/exit/assert.c8
-rw-r--r--libc-top-half/musl/src/exit/at_quick_exit.c35
-rw-r--r--libc-top-half/musl/src/exit/atexit.c82
-rw-r--r--libc-top-half/musl/src/exit/exit.c52
-rw-r--r--libc-top-half/musl/src/exit/quick_exit.c11
-rw-r--r--libc-top-half/musl/src/fcntl/creat.c8
-rw-r--r--libc-top-half/musl/src/fcntl/fcntl.c48
-rw-r--r--libc-top-half/musl/src/fcntl/open.c23
-rw-r--r--libc-top-half/musl/src/fcntl/openat.c19
-rw-r--r--libc-top-half/musl/src/fcntl/posix_fadvise.c18
-rw-r--r--libc-top-half/musl/src/fcntl/posix_fallocate.c10
-rw-r--r--libc-top-half/musl/src/fenv/__flt_rounds.c19
-rw-r--r--libc-top-half/musl/src/fenv/aarch64/fenv.s68
-rw-r--r--libc-top-half/musl/src/fenv/arm/fenv-hf.S70
-rw-r--r--libc-top-half/musl/src/fenv/arm/fenv.c3
-rw-r--r--libc-top-half/musl/src/fenv/fegetexceptflag.c7
-rw-r--r--libc-top-half/musl/src/fenv/feholdexcept.c8
-rw-r--r--libc-top-half/musl/src/fenv/fenv.c38
-rw-r--r--libc-top-half/musl/src/fenv/fesetexceptflag.c8
-rw-r--r--libc-top-half/musl/src/fenv/fesetround.c23
-rw-r--r--libc-top-half/musl/src/fenv/feupdateenv.c9
-rw-r--r--libc-top-half/musl/src/fenv/i386/fenv.s164
-rw-r--r--libc-top-half/musl/src/fenv/m68k/fenv.c85
-rw-r--r--libc-top-half/musl/src/fenv/mips/fenv-sf.c3
-rw-r--r--libc-top-half/musl/src/fenv/mips/fenv.S72
-rw-r--r--libc-top-half/musl/src/fenv/mips64/fenv-sf.c3
-rw-r--r--libc-top-half/musl/src/fenv/mips64/fenv.S72
-rw-r--r--libc-top-half/musl/src/fenv/mipsn32/fenv-sf.c3
-rw-r--r--libc-top-half/musl/src/fenv/mipsn32/fenv.S71
-rw-r--r--libc-top-half/musl/src/fenv/powerpc/fenv-sf.c3
-rw-r--r--libc-top-half/musl/src/fenv/powerpc/fenv.S130
-rw-r--r--libc-top-half/musl/src/fenv/powerpc64/fenv.c69
-rw-r--r--libc-top-half/musl/src/fenv/riscv64/fenv-sf.c3
-rw-r--r--libc-top-half/musl/src/fenv/riscv64/fenv.S56
-rw-r--r--libc-top-half/musl/src/fenv/s390x/fenv.c56
-rw-r--r--libc-top-half/musl/src/fenv/sh/fenv-nofpu.c3
-rw-r--r--libc-top-half/musl/src/fenv/sh/fenv.S81
-rw-r--r--libc-top-half/musl/src/fenv/x32/fenv.s98
-rw-r--r--libc-top-half/musl/src/fenv/x86_64/fenv.s98
-rw-r--r--libc-top-half/musl/src/include/arpa/inet.h8
-rw-r--r--libc-top-half/musl/src/include/crypt.h16
-rw-r--r--libc-top-half/musl/src/include/errno.h18
-rw-r--r--libc-top-half/musl/src/include/features.h11
-rw-r--r--libc-top-half/musl/src/include/langinfo.h8
-rw-r--r--libc-top-half/musl/src/include/pthread.h29
-rw-r--r--libc-top-half/musl/src/include/resolv.h12
-rw-r--r--libc-top-half/musl/src/include/signal.h16
-rw-r--r--libc-top-half/musl/src/include/stdio.h22
-rw-r--r--libc-top-half/musl/src/include/stdlib.h19
-rw-r--r--libc-top-half/musl/src/include/string.h11
-rw-r--r--libc-top-half/musl/src/include/sys/auxv.h10
-rw-r--r--libc-top-half/musl/src/include/sys/membarrier.h9
-rw-r--r--libc-top-half/musl/src/include/sys/mman.h20
-rw-r--r--libc-top-half/musl/src/include/sys/sysinfo.h9
-rw-r--r--libc-top-half/musl/src/include/sys/time.h8
-rw-r--r--libc-top-half/musl/src/include/time.h15
-rw-r--r--libc-top-half/musl/src/include/unistd.h20
-rw-r--r--libc-top-half/musl/src/include/wchar.h11
-rw-r--r--libc-top-half/musl/src/internal/aio_impl.h9
-rw-r--r--libc-top-half/musl/src/internal/atomic.h333
-rw-r--r--libc-top-half/musl/src/internal/complex_impl.h22
-rw-r--r--libc-top-half/musl/src/internal/defsysinfo.c3
-rw-r--r--libc-top-half/musl/src/internal/dynlink.h113
-rw-r--r--libc-top-half/musl/src/internal/fdpic_crt.h28
-rw-r--r--libc-top-half/musl/src/internal/floatscan.c556
-rw-r--r--libc-top-half/musl/src/internal/floatscan.h12
-rw-r--r--libc-top-half/musl/src/internal/fork_impl.h21
-rw-r--r--libc-top-half/musl/src/internal/futex.h19
-rw-r--r--libc-top-half/musl/src/internal/i386/defsysinfo.s9
-rw-r--r--libc-top-half/musl/src/internal/intscan.c100
-rw-r--r--libc-top-half/musl/src/internal/intscan.h8
-rw-r--r--libc-top-half/musl/src/internal/ksigaction.h13
-rw-r--r--libc-top-half/musl/src/internal/libc.c9
-rw-r--r--libc-top-half/musl/src/internal/libc.h76
-rw-r--r--libc-top-half/musl/src/internal/libm.h292
-rw-r--r--libc-top-half/musl/src/internal/locale_impl.h65
-rw-r--r--libc-top-half/musl/src/internal/lock.h15
-rw-r--r--libc-top-half/musl/src/internal/procfdname.c15
-rw-r--r--libc-top-half/musl/src/internal/pthread_impl.h226
-rw-r--r--libc-top-half/musl/src/internal/sh/__shcall.c6
-rw-r--r--libc-top-half/musl/src/internal/shgetc.c37
-rw-r--r--libc-top-half/musl/src/internal/shgetc.h32
-rw-r--r--libc-top-half/musl/src/internal/stdio_impl.h137
-rw-r--r--libc-top-half/musl/src/internal/syscall.h400
-rw-r--r--libc-top-half/musl/src/internal/syscall_ret.c11
-rw-r--r--libc-top-half/musl/src/internal/vdso.c93
-rw-r--r--libc-top-half/musl/src/internal/version.c4
-rw-r--r--libc-top-half/musl/src/ipc/ftok.c10
-rw-r--r--libc-top-half/musl/src/ipc/ipc.h24
-rw-r--r--libc-top-half/musl/src/ipc/msgctl.c51
-rw-r--r--libc-top-half/musl/src/ipc/msgget.c12
-rw-r--r--libc-top-half/musl/src/ipc/msgrcv.c12
-rw-r--r--libc-top-half/musl/src/ipc/msgsnd.c12
-rw-r--r--libc-top-half/musl/src/ipc/semctl.c69
-rw-r--r--libc-top-half/musl/src/ipc/semget.c19
-rw-r--r--libc-top-half/musl/src/ipc/semop.c12
-rw-r--r--libc-top-half/musl/src/ipc/semtimedop.c35
-rw-r--r--libc-top-half/musl/src/ipc/shmat.c17
-rw-r--r--libc-top-half/musl/src/ipc/shmctl.c51
-rw-r--r--libc-top-half/musl/src/ipc/shmdt.c12
-rw-r--r--libc-top-half/musl/src/ipc/shmget.c14
-rw-r--r--libc-top-half/musl/src/ldso/__dlsym.c14
-rw-r--r--libc-top-half/musl/src/ldso/aarch64/dlsym.s6
-rw-r--r--libc-top-half/musl/src/ldso/aarch64/tlsdesc.s31
-rw-r--r--libc-top-half/musl/src/ldso/arm/dlsym.s8
-rw-r--r--libc-top-half/musl/src/ldso/arm/dlsym_time64.S3
-rw-r--r--libc-top-half/musl/src/ldso/arm/find_exidx.c42
-rw-r--r--libc-top-half/musl/src/ldso/arm/tlsdesc.S55
-rw-r--r--libc-top-half/musl/src/ldso/dl_iterate_phdr.c47
-rw-r--r--libc-top-half/musl/src/ldso/dladdr.c9
-rw-r--r--libc-top-half/musl/src/ldso/dlclose.c7
-rw-r--r--libc-top-half/musl/src/ldso/dlerror.c87
-rw-r--r--libc-top-half/musl/src/ldso/dlinfo.c14
-rw-r--r--libc-top-half/musl/src/ldso/dlopen.c10
-rw-r--r--libc-top-half/musl/src/ldso/dlsym.c7
-rw-r--r--libc-top-half/musl/src/ldso/i386/dlsym.s11
-rw-r--r--libc-top-half/musl/src/ldso/i386/dlsym_time64.S3
-rw-r--r--libc-top-half/musl/src/ldso/i386/tlsdesc.s23
-rw-r--r--libc-top-half/musl/src/ldso/m68k/dlsym.s12
-rw-r--r--libc-top-half/musl/src/ldso/m68k/dlsym_time64.S3
-rw-r--r--libc-top-half/musl/src/ldso/microblaze/dlsym.s6
-rw-r--r--libc-top-half/musl/src/ldso/microblaze/dlsym_time64.S3
-rw-r--r--libc-top-half/musl/src/ldso/mips/dlsym.s17
-rw-r--r--libc-top-half/musl/src/ldso/mips/dlsym_time64.S3
-rw-r--r--libc-top-half/musl/src/ldso/mips64/dlsym.s17
-rw-r--r--libc-top-half/musl/src/ldso/mipsn32/dlsym.s17
-rw-r--r--libc-top-half/musl/src/ldso/mipsn32/dlsym_time64.S3
-rw-r--r--libc-top-half/musl/src/ldso/or1k/dlsym.s6
-rw-r--r--libc-top-half/musl/src/ldso/or1k/dlsym_time64.S3
-rw-r--r--libc-top-half/musl/src/ldso/powerpc/dlsym.s8
-rw-r--r--libc-top-half/musl/src/ldso/powerpc/dlsym_time64.S3
-rw-r--r--libc-top-half/musl/src/ldso/powerpc64/dlsym.s11
-rw-r--r--libc-top-half/musl/src/ldso/riscv64/dlsym.s6
-rw-r--r--libc-top-half/musl/src/ldso/s390x/dlsym.s6
-rw-r--r--libc-top-half/musl/src/ldso/sh/dlsym.s11
-rw-r--r--libc-top-half/musl/src/ldso/sh/dlsym_time64.S3
-rw-r--r--libc-top-half/musl/src/ldso/tlsdesc.c9
-rw-r--r--libc-top-half/musl/src/ldso/x32/dlsym.s7
-rw-r--r--libc-top-half/musl/src/ldso/x86_64/dlsym.s7
-rw-r--r--libc-top-half/musl/src/ldso/x86_64/tlsdesc.s23
-rw-r--r--libc-top-half/musl/src/legacy/cuserid.c22
-rw-r--r--libc-top-half/musl/src/legacy/daemon.c33
-rw-r--r--libc-top-half/musl/src/legacy/err.c67
-rw-r--r--libc-top-half/musl/src/legacy/euidaccess.c10
-rw-r--r--libc-top-half/musl/src/legacy/ftw.c11
-rw-r--r--libc-top-half/musl/src/legacy/futimes.c14
-rw-r--r--libc-top-half/musl/src/legacy/getdtablesize.c11
-rw-r--r--libc-top-half/musl/src/legacy/getloadavg.c14
-rw-r--r--libc-top-half/musl/src/legacy/getpagesize.c8
-rw-r--r--libc-top-half/musl/src/legacy/getpass.c40
-rw-r--r--libc-top-half/musl/src/legacy/getusershell.c32
-rw-r--r--libc-top-half/musl/src/legacy/isastream.c7
-rw-r--r--libc-top-half/musl/src/legacy/lutimes.c16
-rw-r--r--libc-top-half/musl/src/legacy/ulimit.c19
-rw-r--r--libc-top-half/musl/src/legacy/utmpx.c52
-rw-r--r--libc-top-half/musl/src/legacy/valloc.c8
-rw-r--r--libc-top-half/musl/src/linux/adjtime.c27
-rw-r--r--libc-top-half/musl/src/linux/adjtimex.c7
-rw-r--r--libc-top-half/musl/src/linux/arch_prctl.c7
-rw-r--r--libc-top-half/musl/src/linux/brk.c9
-rw-r--r--libc-top-half/musl/src/linux/cache.c50
-rw-r--r--libc-top-half/musl/src/linux/cap.c11
-rw-r--r--libc-top-half/musl/src/linux/chroot.c8
-rw-r--r--libc-top-half/musl/src/linux/clock_adjtime.c151
-rw-r--r--libc-top-half/musl/src/linux/clone.c21
-rw-r--r--libc-top-half/musl/src/linux/copy_file_range.c8
-rw-r--r--libc-top-half/musl/src/linux/epoll.c37
-rw-r--r--libc-top-half/musl/src/linux/eventfd.c23
-rw-r--r--libc-top-half/musl/src/linux/fallocate.c12
-rw-r--r--libc-top-half/musl/src/linux/fanotify.c14
-rw-r--r--libc-top-half/musl/src/linux/flock.c7
-rw-r--r--libc-top-half/musl/src/linux/getdents.c12
-rw-r--r--libc-top-half/musl/src/linux/getrandom.c7
-rw-r--r--libc-top-half/musl/src/linux/gettid.c8
-rw-r--r--libc-top-half/musl/src/linux/inotify.c26
-rw-r--r--libc-top-half/musl/src/linux/ioperm.c10
-rw-r--r--libc-top-half/musl/src/linux/iopl.c10
-rw-r--r--libc-top-half/musl/src/linux/klogctl.c7
-rw-r--r--libc-top-half/musl/src/linux/membarrier.c72
-rw-r--r--libc-top-half/musl/src/linux/memfd_create.c8
-rw-r--r--libc-top-half/musl/src/linux/mlock2.c10
-rw-r--r--libc-top-half/musl/src/linux/module.c11
-rw-r--r--libc-top-half/musl/src/linux/mount.c17
-rw-r--r--libc-top-half/musl/src/linux/name_to_handle_at.c10
-rw-r--r--libc-top-half/musl/src/linux/open_by_handle_at.c8
-rw-r--r--libc-top-half/musl/src/linux/personality.c8
-rw-r--r--libc-top-half/musl/src/linux/pivot_root.c6
-rw-r--r--libc-top-half/musl/src/linux/ppoll.c26
-rw-r--r--libc-top-half/musl/src/linux/prctl.c14
-rw-r--r--libc-top-half/musl/src/linux/prlimit.c26
-rw-r--r--libc-top-half/musl/src/linux/process_vm.c13
-rw-r--r--libc-top-half/musl/src/linux/ptrace.c29
-rw-r--r--libc-top-half/musl/src/linux/quotactl.c7
-rw-r--r--libc-top-half/musl/src/linux/readahead.c8
-rw-r--r--libc-top-half/musl/src/linux/reboot.c7
-rw-r--r--libc-top-half/musl/src/linux/remap_file_pages.c8
-rw-r--r--libc-top-half/musl/src/linux/sbrk.c11
-rw-r--r--libc-top-half/musl/src/linux/sendfile.c9
-rw-r--r--libc-top-half/musl/src/linux/setfsgid.c7
-rw-r--r--libc-top-half/musl/src/linux/setfsuid.c7
-rw-r--r--libc-top-half/musl/src/linux/setgroups.c36
-rw-r--r--libc-top-half/musl/src/linux/sethostname.c8
-rw-r--r--libc-top-half/musl/src/linux/setns.c8
-rw-r--r--libc-top-half/musl/src/linux/settimeofday.c13
-rw-r--r--libc-top-half/musl/src/linux/signalfd.c21
-rw-r--r--libc-top-half/musl/src/linux/splice.c8
-rw-r--r--libc-top-half/musl/src/linux/stime.c9
-rw-r--r--libc-top-half/musl/src/linux/swap.c12
-rw-r--r--libc-top-half/musl/src/linux/sync_file_range.c17
-rw-r--r--libc-top-half/musl/src/linux/syncfs.c8
-rw-r--r--libc-top-half/musl/src/linux/sysinfo.c9
-rw-r--r--libc-top-half/musl/src/linux/tee.c8
-rw-r--r--libc-top-half/musl/src/linux/timerfd.c59
-rw-r--r--libc-top-half/musl/src/linux/unshare.c8
-rw-r--r--libc-top-half/musl/src/linux/utimes.c8
-rw-r--r--libc-top-half/musl/src/linux/vhangup.c8
-rw-r--r--libc-top-half/musl/src/linux/vmsplice.c8
-rw-r--r--libc-top-half/musl/src/linux/wait3.c9
-rw-r--r--libc-top-half/musl/src/linux/wait4.c39
-rw-r--r--libc-top-half/musl/src/linux/x32/sysinfo.c49
-rw-r--r--libc-top-half/musl/src/linux/xattr.c62
-rw-r--r--libc-top-half/musl/src/locale/__lctrans.c19
-rw-r--r--libc-top-half/musl/src/locale/__mo_lookup.c42
-rw-r--r--libc-top-half/musl/src/locale/big5.h1085
-rw-r--r--libc-top-half/musl/src/locale/bind_textdomain_codeset.c11
-rw-r--r--libc-top-half/musl/src/locale/c_locale.c15
-rw-r--r--libc-top-half/musl/src/locale/catclose.c18
-rw-r--r--libc-top-half/musl/src/locale/catgets.c44
-rw-r--r--libc-top-half/musl/src/locale/catopen.c87
-rw-r--r--libc-top-half/musl/src/locale/codepages.h320
-rw-r--r--libc-top-half/musl/src/locale/dcngettext.c283
-rw-r--r--libc-top-half/musl/src/locale/duplocale.c20
-rw-r--r--libc-top-half/musl/src/locale/freelocale.c14
-rw-r--r--libc-top-half/musl/src/locale/gb18030.h1866
-rw-r--r--libc-top-half/musl/src/locale/hkscs.h390
-rw-r--r--libc-top-half/musl/src/locale/iconv.c685
-rw-r--r--libc-top-half/musl/src/locale/iconv_close.c8
-rw-r--r--libc-top-half/musl/src/locale/jis0208.h563
-rw-r--r--libc-top-half/musl/src/locale/ksc.h650
-rw-r--r--libc-top-half/musl/src/locale/langinfo.c73
-rw-r--r--libc-top-half/musl/src/locale/legacychars.h40
-rw-r--r--libc-top-half/musl/src/locale/locale_map.c119
-rw-r--r--libc-top-half/musl/src/locale/localeconv.c34
-rw-r--r--libc-top-half/musl/src/locale/newlocale.c72
-rw-r--r--libc-top-half/musl/src/locale/pleval.c158
-rw-r--r--libc-top-half/musl/src/locale/pleval.h8
-rw-r--r--libc-top-half/musl/src/locale/revjis.h515
-rw-r--r--libc-top-half/musl/src/locale/setlocale.c78
-rw-r--r--libc-top-half/musl/src/locale/strcoll.c15
-rw-r--r--libc-top-half/musl/src/locale/strfmon.c101
-rw-r--r--libc-top-half/musl/src/locale/strtod_l.c22
-rw-r--r--libc-top-half/musl/src/locale/strxfrm.c18
-rw-r--r--libc-top-half/musl/src/locale/textdomain.c42
-rw-r--r--libc-top-half/musl/src/locale/uselocale.c27
-rw-r--r--libc-top-half/musl/src/locale/wcscoll.c16
-rw-r--r--libc-top-half/musl/src/locale/wcsxfrm.c23
-rw-r--r--libc-top-half/musl/src/malloc/calloc.c45
-rw-r--r--libc-top-half/musl/src/malloc/free.c6
-rw-r--r--libc-top-half/musl/src/malloc/libc_calloc.c4
-rw-r--r--libc-top-half/musl/src/malloc/lite_malloc.c118
-rw-r--r--libc-top-half/musl/src/malloc/mallocng/aligned_alloc.c60
-rw-r--r--libc-top-half/musl/src/malloc/mallocng/donate.c39
-rw-r--r--libc-top-half/musl/src/malloc/mallocng/free.c151
-rw-r--r--libc-top-half/musl/src/malloc/mallocng/glue.h93
-rw-r--r--libc-top-half/musl/src/malloc/mallocng/malloc.c387
-rw-r--r--libc-top-half/musl/src/malloc/mallocng/malloc_usable_size.c13
-rw-r--r--libc-top-half/musl/src/malloc/mallocng/meta.h288
-rw-r--r--libc-top-half/musl/src/malloc/mallocng/realloc.c51
-rw-r--r--libc-top-half/musl/src/malloc/memalign.c7
-rw-r--r--libc-top-half/musl/src/malloc/oldmalloc/aligned_alloc.c53
-rw-r--r--libc-top-half/musl/src/malloc/oldmalloc/malloc.c556
-rw-r--r--libc-top-half/musl/src/malloc/oldmalloc/malloc_impl.h39
-rw-r--r--libc-top-half/musl/src/malloc/oldmalloc/malloc_usable_size.c9
-rw-r--r--libc-top-half/musl/src/malloc/posix_memalign.c11
-rw-r--r--libc-top-half/musl/src/malloc/realloc.c6
-rw-r--r--libc-top-half/musl/src/malloc/reallocarray.c13
-rw-r--r--libc-top-half/musl/src/malloc/replaced.c4
-rw-r--r--libc-top-half/musl/src/math/__cos.c71
-rw-r--r--libc-top-half/musl/src/math/__cosdf.c35
-rw-r--r--libc-top-half/musl/src/math/__cosl.c96
-rw-r--r--libc-top-half/musl/src/math/__expo2.c25
-rw-r--r--libc-top-half/musl/src/math/__expo2f.c25
-rw-r--r--libc-top-half/musl/src/math/__fpclassify.c11
-rw-r--r--libc-top-half/musl/src/math/__fpclassifyf.c11
-rw-r--r--libc-top-half/musl/src/math/__fpclassifyl.c42
-rw-r--r--libc-top-half/musl/src/math/__invtrigl.c63
-rw-r--r--libc-top-half/musl/src/math/__invtrigl.h8
-rw-r--r--libc-top-half/musl/src/math/__math_divzero.c6
-rw-r--r--libc-top-half/musl/src/math/__math_divzerof.c6
-rw-r--r--libc-top-half/musl/src/math/__math_invalid.c6
-rw-r--r--libc-top-half/musl/src/math/__math_invalidf.c6
-rw-r--r--libc-top-half/musl/src/math/__math_invalidl.c9
-rw-r--r--libc-top-half/musl/src/math/__math_oflow.c6
-rw-r--r--libc-top-half/musl/src/math/__math_oflowf.c6
-rw-r--r--libc-top-half/musl/src/math/__math_uflow.c6
-rw-r--r--libc-top-half/musl/src/math/__math_uflowf.c6
-rw-r--r--libc-top-half/musl/src/math/__math_xflow.c6
-rw-r--r--libc-top-half/musl/src/math/__math_xflowf.c6
-rw-r--r--libc-top-half/musl/src/math/__polevll.c93
-rw-r--r--libc-top-half/musl/src/math/__rem_pio2.c194
-rw-r--r--libc-top-half/musl/src/math/__rem_pio2_large.c442
-rw-r--r--libc-top-half/musl/src/math/__rem_pio2f.c90
-rw-r--r--libc-top-half/musl/src/math/__rem_pio2l.c159
-rw-r--r--libc-top-half/musl/src/math/__signbit.c13
-rw-r--r--libc-top-half/musl/src/math/__signbitf.c11
-rw-r--r--libc-top-half/musl/src/math/__signbitl.c14
-rw-r--r--libc-top-half/musl/src/math/__sin.c64
-rw-r--r--libc-top-half/musl/src/math/__sindf.c36
-rw-r--r--libc-top-half/musl/src/math/__sinl.c78
-rw-r--r--libc-top-half/musl/src/math/__tan.c110
-rw-r--r--libc-top-half/musl/src/math/__tandf.c54
-rw-r--r--libc-top-half/musl/src/math/__tanl.c143
-rw-r--r--libc-top-half/musl/src/math/aarch64/ceil.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/ceilf.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/fabs.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/fabsf.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/floor.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/floorf.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/fma.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/fmaf.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/fmax.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/fmaxf.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/fmin.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/fminf.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/llrint.c10
-rw-r--r--libc-top-half/musl/src/math/aarch64/llrintf.c10
-rw-r--r--libc-top-half/musl/src/math/aarch64/llround.c8
-rw-r--r--libc-top-half/musl/src/math/aarch64/llroundf.c8
-rw-r--r--libc-top-half/musl/src/math/aarch64/lrint.c10
-rw-r--r--libc-top-half/musl/src/math/aarch64/lrintf.c10
-rw-r--r--libc-top-half/musl/src/math/aarch64/lround.c8
-rw-r--r--libc-top-half/musl/src/math/aarch64/lroundf.c8
-rw-r--r--libc-top-half/musl/src/math/aarch64/nearbyint.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/nearbyintf.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/rint.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/rintf.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/round.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/roundf.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/sqrt.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/sqrtf.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/trunc.c7
-rw-r--r--libc-top-half/musl/src/math/aarch64/truncf.c7
-rw-r--r--libc-top-half/musl/src/math/acos.c101
-rw-r--r--libc-top-half/musl/src/math/acosf.c71
-rw-r--r--libc-top-half/musl/src/math/acosh.c24
-rw-r--r--libc-top-half/musl/src/math/acoshf.c26
-rw-r--r--libc-top-half/musl/src/math/acoshl.c29
-rw-r--r--libc-top-half/musl/src/math/acosl.c67
-rw-r--r--libc-top-half/musl/src/math/arm/fabs.c15
-rw-r--r--libc-top-half/musl/src/math/arm/fabsf.c15
-rw-r--r--libc-top-half/musl/src/math/arm/fma.c15
-rw-r--r--libc-top-half/musl/src/math/arm/fmaf.c15
-rw-r--r--libc-top-half/musl/src/math/arm/sqrt.c15
-rw-r--r--libc-top-half/musl/src/math/arm/sqrtf.c15
-rw-r--r--libc-top-half/musl/src/math/asin.c107
-rw-r--r--libc-top-half/musl/src/math/asinf.c61
-rw-r--r--libc-top-half/musl/src/math/asinh.c28
-rw-r--r--libc-top-half/musl/src/math/asinhf.c28
-rw-r--r--libc-top-half/musl/src/math/asinhl.c41
-rw-r--r--libc-top-half/musl/src/math/asinl.c71
-rw-r--r--libc-top-half/musl/src/math/atan.c116
-rw-r--r--libc-top-half/musl/src/math/atan2.c107
-rw-r--r--libc-top-half/musl/src/math/atan2f.c83
-rw-r--r--libc-top-half/musl/src/math/atan2l.c85
-rw-r--r--libc-top-half/musl/src/math/atanf.c94
-rw-r--r--libc-top-half/musl/src/math/atanh.c29
-rw-r--r--libc-top-half/musl/src/math/atanhf.c28
-rw-r--r--libc-top-half/musl/src/math/atanhl.c35
-rw-r--r--libc-top-half/musl/src/math/atanl.c184
-rw-r--r--libc-top-half/musl/src/math/cbrt.c103
-rw-r--r--libc-top-half/musl/src/math/cbrtf.c66
-rw-r--r--libc-top-half/musl/src/math/cbrtl.c124
-rw-r--r--libc-top-half/musl/src/math/ceil.c31
-rw-r--r--libc-top-half/musl/src/math/ceilf.c27
-rw-r--r--libc-top-half/musl/src/math/ceill.c34
-rw-r--r--libc-top-half/musl/src/math/copysign.c8
-rw-r--r--libc-top-half/musl/src/math/copysignf.c10
-rw-r--r--libc-top-half/musl/src/math/copysignl.c16
-rw-r--r--libc-top-half/musl/src/math/cos.c77
-rw-r--r--libc-top-half/musl/src/math/cosf.c78
-rw-r--r--libc-top-half/musl/src/math/cosh.c44
-rw-r--r--libc-top-half/musl/src/math/coshf.c37
-rw-r--r--libc-top-half/musl/src/math/coshl.c47
-rw-r--r--libc-top-half/musl/src/math/cosl.c39
-rw-r--r--libc-top-half/musl/src/math/erf.c273
-rw-r--r--libc-top-half/musl/src/math/erff.c183
-rw-r--r--libc-top-half/musl/src/math/erfl.c353
-rw-r--r--libc-top-half/musl/src/math/exp.c134
-rw-r--r--libc-top-half/musl/src/math/exp10.c24
-rw-r--r--libc-top-half/musl/src/math/exp10f.c22
-rw-r--r--libc-top-half/musl/src/math/exp10l.c32
-rw-r--r--libc-top-half/musl/src/math/exp2.c121
-rw-r--r--libc-top-half/musl/src/math/exp2f.c69
-rw-r--r--libc-top-half/musl/src/math/exp2f_data.c35
-rw-r--r--libc-top-half/musl/src/math/exp2f_data.h23
-rw-r--r--libc-top-half/musl/src/math/exp2l.c619
-rw-r--r--libc-top-half/musl/src/math/exp_data.c182
-rw-r--r--libc-top-half/musl/src/math/exp_data.h26
-rw-r--r--libc-top-half/musl/src/math/expf.c80
-rw-r--r--libc-top-half/musl/src/math/expl.c128
-rw-r--r--libc-top-half/musl/src/math/expm1.c201
-rw-r--r--libc-top-half/musl/src/math/expm1f.c110
-rw-r--r--libc-top-half/musl/src/math/expm1l.c123
-rw-r--r--libc-top-half/musl/src/math/fabs.c9
-rw-r--r--libc-top-half/musl/src/math/fabsf.c9
-rw-r--r--libc-top-half/musl/src/math/fabsl.c15
-rw-r--r--libc-top-half/musl/src/math/fdim.c10
-rw-r--r--libc-top-half/musl/src/math/fdimf.c10
-rw-r--r--libc-top-half/musl/src/math/fdiml.c18
-rw-r--r--libc-top-half/musl/src/math/finite.c7
-rw-r--r--libc-top-half/musl/src/math/finitef.c7
-rw-r--r--libc-top-half/musl/src/math/floor.c31
-rw-r--r--libc-top-half/musl/src/math/floorf.c27
-rw-r--r--libc-top-half/musl/src/math/floorl.c34
-rw-r--r--libc-top-half/musl/src/math/fma.c183
-rw-r--r--libc-top-half/musl/src/math/fmaf.c92
-rw-r--r--libc-top-half/musl/src/math/fmal.c297
-rw-r--r--libc-top-half/musl/src/math/fmax.c13
-rw-r--r--libc-top-half/musl/src/math/fmaxf.c13
-rw-r--r--libc-top-half/musl/src/math/fmaxl.c21
-rw-r--r--libc-top-half/musl/src/math/fmin.c13
-rw-r--r--libc-top-half/musl/src/math/fminf.c13
-rw-r--r--libc-top-half/musl/src/math/fminl.c21
-rw-r--r--libc-top-half/musl/src/math/fmod.c68
-rw-r--r--libc-top-half/musl/src/math/fmodf.c65
-rw-r--r--libc-top-half/musl/src/math/fmodl.c105
-rw-r--r--libc-top-half/musl/src/math/frexp.c23
-rw-r--r--libc-top-half/musl/src/math/frexpf.c23
-rw-r--r--libc-top-half/musl/src/math/frexpl.c29
-rw-r--r--libc-top-half/musl/src/math/hypot.c67
-rw-r--r--libc-top-half/musl/src/math/hypotf.c35
-rw-r--r--libc-top-half/musl/src/math/hypotl.c66
-rw-r--r--libc-top-half/musl/src/math/i386/__invtrigl.s0
-rw-r--r--libc-top-half/musl/src/math/i386/acos.s18
-rw-r--r--libc-top-half/musl/src/math/i386/acosf.s16
-rw-r--r--libc-top-half/musl/src/math/i386/acosl.s14
-rw-r--r--libc-top-half/musl/src/math/i386/asin.s21
-rw-r--r--libc-top-half/musl/src/math/i386/asinf.s23
-rw-r--r--libc-top-half/musl/src/math/i386/asinl.s12
-rw-r--r--libc-top-half/musl/src/math/i386/atan.s16
-rw-r--r--libc-top-half/musl/src/math/i386/atan2.s15
-rw-r--r--libc-top-half/musl/src/math/i386/atan2f.s17
-rw-r--r--libc-top-half/musl/src/math/i386/atan2l.s7
-rw-r--r--libc-top-half/musl/src/math/i386/atanf.s18
-rw-r--r--libc-top-half/musl/src/math/i386/atanl.s7
-rw-r--r--libc-top-half/musl/src/math/i386/ceil.s1
-rw-r--r--libc-top-half/musl/src/math/i386/ceilf.s1
-rw-r--r--libc-top-half/musl/src/math/i386/ceill.s1
-rw-r--r--libc-top-half/musl/src/math/i386/exp2l.s1
-rw-r--r--libc-top-half/musl/src/math/i386/exp_ld.s93
-rw-r--r--libc-top-half/musl/src/math/i386/expl.s101
-rw-r--r--libc-top-half/musl/src/math/i386/expm1l.s1
-rw-r--r--libc-top-half/musl/src/math/i386/fabs.c7
-rw-r--r--libc-top-half/musl/src/math/i386/fabsf.c7
-rw-r--r--libc-top-half/musl/src/math/i386/fabsl.c7
-rw-r--r--libc-top-half/musl/src/math/i386/floor.s67
-rw-r--r--libc-top-half/musl/src/math/i386/floorf.s1
-rw-r--r--libc-top-half/musl/src/math/i386/floorl.s1
-rw-r--r--libc-top-half/musl/src/math/i386/fmod.c10
-rw-r--r--libc-top-half/musl/src/math/i386/fmodf.c10
-rw-r--r--libc-top-half/musl/src/math/i386/fmodl.c9
-rw-r--r--libc-top-half/musl/src/math/i386/hypot.s45
-rw-r--r--libc-top-half/musl/src/math/i386/hypotf.s42
-rw-r--r--libc-top-half/musl/src/math/i386/ldexp.s1
-rw-r--r--libc-top-half/musl/src/math/i386/ldexpf.s1
-rw-r--r--libc-top-half/musl/src/math/i386/ldexpl.s1
-rw-r--r--libc-top-half/musl/src/math/i386/llrint.c8
-rw-r--r--libc-top-half/musl/src/math/i386/llrintf.c8
-rw-r--r--libc-top-half/musl/src/math/i386/llrintl.c8
-rw-r--r--libc-top-half/musl/src/math/i386/log.s9
-rw-r--r--libc-top-half/musl/src/math/i386/log10.s9
-rw-r--r--libc-top-half/musl/src/math/i386/log10f.s9
-rw-r--r--libc-top-half/musl/src/math/i386/log10l.s7
-rw-r--r--libc-top-half/musl/src/math/i386/log1p.s25
-rw-r--r--libc-top-half/musl/src/math/i386/log1pf.s26
-rw-r--r--libc-top-half/musl/src/math/i386/log1pl.s15
-rw-r--r--libc-top-half/musl/src/math/i386/log2.s9
-rw-r--r--libc-top-half/musl/src/math/i386/log2f.s9
-rw-r--r--libc-top-half/musl/src/math/i386/log2l.s7
-rw-r--r--libc-top-half/musl/src/math/i386/logf.s9
-rw-r--r--libc-top-half/musl/src/math/i386/logl.s7
-rw-r--r--libc-top-half/musl/src/math/i386/lrint.c8
-rw-r--r--libc-top-half/musl/src/math/i386/lrintf.c8
-rw-r--r--libc-top-half/musl/src/math/i386/lrintl.c8
-rw-r--r--libc-top-half/musl/src/math/i386/remainder.c12
-rw-r--r--libc-top-half/musl/src/math/i386/remainderf.c12
-rw-r--r--libc-top-half/musl/src/math/i386/remainderl.c9
-rw-r--r--libc-top-half/musl/src/math/i386/remquo.s50
-rw-r--r--libc-top-half/musl/src/math/i386/remquof.s1
-rw-r--r--libc-top-half/musl/src/math/i386/remquol.s1
-rw-r--r--libc-top-half/musl/src/math/i386/rint.c7
-rw-r--r--libc-top-half/musl/src/math/i386/rintf.c7
-rw-r--r--libc-top-half/musl/src/math/i386/rintl.c7
-rw-r--r--libc-top-half/musl/src/math/i386/scalbln.s1
-rw-r--r--libc-top-half/musl/src/math/i386/scalblnf.s1
-rw-r--r--libc-top-half/musl/src/math/i386/scalblnl.s1
-rw-r--r--libc-top-half/musl/src/math/i386/scalbn.s33
-rw-r--r--libc-top-half/musl/src/math/i386/scalbnf.s32
-rw-r--r--libc-top-half/musl/src/math/i386/scalbnl.s32
-rw-r--r--libc-top-half/musl/src/math/i386/sqrt.c15
-rw-r--r--libc-top-half/musl/src/math/i386/sqrtf.c12
-rw-r--r--libc-top-half/musl/src/math/i386/sqrtl.c7
-rw-r--r--libc-top-half/musl/src/math/i386/trunc.s1
-rw-r--r--libc-top-half/musl/src/math/i386/truncf.s1
-rw-r--r--libc-top-half/musl/src/math/i386/truncl.s1
-rw-r--r--libc-top-half/musl/src/math/ilogb.c26
-rw-r--r--libc-top-half/musl/src/math/ilogbf.c26
-rw-r--r--libc-top-half/musl/src/math/ilogbl.c55
-rw-r--r--libc-top-half/musl/src/math/j0.c375
-rw-r--r--libc-top-half/musl/src/math/j0f.c314
-rw-r--r--libc-top-half/musl/src/math/j1.c362
-rw-r--r--libc-top-half/musl/src/math/j1f.c310
-rw-r--r--libc-top-half/musl/src/math/jn.c280
-rw-r--r--libc-top-half/musl/src/math/jnf.c202
-rw-r--r--libc-top-half/musl/src/math/ldexp.c6
-rw-r--r--libc-top-half/musl/src/math/ldexpf.c6
-rw-r--r--libc-top-half/musl/src/math/ldexpl.c6
-rw-r--r--libc-top-half/musl/src/math/lgamma.c7
-rw-r--r--libc-top-half/musl/src/math/lgamma_r.c283
-rw-r--r--libc-top-half/musl/src/math/lgammaf.c7
-rw-r--r--libc-top-half/musl/src/math/lgammaf_r.c218
-rw-r--r--libc-top-half/musl/src/math/lgammal.c353
-rw-r--r--libc-top-half/musl/src/math/llrint.c8
-rw-r--r--libc-top-half/musl/src/math/llrintf.c8
-rw-r--r--libc-top-half/musl/src/math/llrintl.c36
-rw-r--r--libc-top-half/musl/src/math/llround.c6
-rw-r--r--libc-top-half/musl/src/math/llroundf.c6
-rw-r--r--libc-top-half/musl/src/math/llroundl.c6
-rw-r--r--libc-top-half/musl/src/math/log.c112
-rw-r--r--libc-top-half/musl/src/math/log10.c101
-rw-r--r--libc-top-half/musl/src/math/log10f.c77
-rw-r--r--libc-top-half/musl/src/math/log10l.c191
-rw-r--r--libc-top-half/musl/src/math/log1p.c122
-rw-r--r--libc-top-half/musl/src/math/log1pf.c77
-rw-r--r--libc-top-half/musl/src/math/log1pl.c177
-rw-r--r--libc-top-half/musl/src/math/log2.c122
-rw-r--r--libc-top-half/musl/src/math/log2_data.c201
-rw-r--r--libc-top-half/musl/src/math/log2_data.h28
-rw-r--r--libc-top-half/musl/src/math/log2f.c72
-rw-r--r--libc-top-half/musl/src/math/log2f_data.c33
-rw-r--r--libc-top-half/musl/src/math/log2f_data.h19
-rw-r--r--libc-top-half/musl/src/math/log2l.c182
-rw-r--r--libc-top-half/musl/src/math/log_data.c328
-rw-r--r--libc-top-half/musl/src/math/log_data.h28
-rw-r--r--libc-top-half/musl/src/math/logb.c17
-rw-r--r--libc-top-half/musl/src/math/logbf.c10
-rw-r--r--libc-top-half/musl/src/math/logbl.c16
-rw-r--r--libc-top-half/musl/src/math/logf.c71
-rw-r--r--libc-top-half/musl/src/math/logf_data.c33
-rw-r--r--libc-top-half/musl/src/math/logf_data.h20
-rw-r--r--libc-top-half/musl/src/math/logl.c175
-rw-r--r--libc-top-half/musl/src/math/lrint.c72
-rw-r--r--libc-top-half/musl/src/math/lrintf.c8
-rw-r--r--libc-top-half/musl/src/math/lrintl.c36
-rw-r--r--libc-top-half/musl/src/math/lround.c6
-rw-r--r--libc-top-half/musl/src/math/lroundf.c6
-rw-r--r--libc-top-half/musl/src/math/lroundl.c6
-rw-r--r--libc-top-half/musl/src/math/m68k/sqrtl.c15
-rw-r--r--libc-top-half/musl/src/math/mips/fabs.c16
-rw-r--r--libc-top-half/musl/src/math/mips/fabsf.c16
-rw-r--r--libc-top-half/musl/src/math/mips/sqrt.c16
-rw-r--r--libc-top-half/musl/src/math/mips/sqrtf.c16
-rw-r--r--libc-top-half/musl/src/math/modf.c34
-rw-r--r--libc-top-half/musl/src/math/modff.c34
-rw-r--r--libc-top-half/musl/src/math/modfl.c53
-rw-r--r--libc-top-half/musl/src/math/nan.c6
-rw-r--r--libc-top-half/musl/src/math/nanf.c6
-rw-r--r--libc-top-half/musl/src/math/nanl.c6
-rw-r--r--libc-top-half/musl/src/math/nearbyint.c20
-rw-r--r--libc-top-half/musl/src/math/nearbyintf.c18
-rw-r--r--libc-top-half/musl/src/math/nearbyintl.c26
-rw-r--r--libc-top-half/musl/src/math/nextafter.c31
-rw-r--r--libc-top-half/musl/src/math/nextafterf.c30
-rw-r--r--libc-top-half/musl/src/math/nextafterl.c75
-rw-r--r--libc-top-half/musl/src/math/nexttoward.c42
-rw-r--r--libc-top-half/musl/src/math/nexttowardf.c35
-rw-r--r--libc-top-half/musl/src/math/nexttowardl.c6
-rw-r--r--libc-top-half/musl/src/math/pow.c343
-rw-r--r--libc-top-half/musl/src/math/pow_data.c180
-rw-r--r--libc-top-half/musl/src/math/pow_data.h22
-rw-r--r--libc-top-half/musl/src/math/powerpc/fabs.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc/fabsf.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc/fma.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc/fmaf.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc/sqrt.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc/sqrtf.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc64/ceil.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc64/ceilf.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc64/fabs.c7
-rw-r--r--libc-top-half/musl/src/math/powerpc64/fabsf.c7
-rw-r--r--libc-top-half/musl/src/math/powerpc64/floor.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc64/floorf.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc64/fma.c7
-rw-r--r--libc-top-half/musl/src/math/powerpc64/fmaf.c7
-rw-r--r--libc-top-half/musl/src/math/powerpc64/fmax.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc64/fmaxf.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc64/fmin.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc64/fminf.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc64/lrint.c16
-rw-r--r--libc-top-half/musl/src/math/powerpc64/lrintf.c16
-rw-r--r--libc-top-half/musl/src/math/powerpc64/lround.c18
-rw-r--r--libc-top-half/musl/src/math/powerpc64/lroundf.c18
-rw-r--r--libc-top-half/musl/src/math/powerpc64/round.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc64/roundf.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc64/sqrt.c7
-rw-r--r--libc-top-half/musl/src/math/powerpc64/sqrtf.c7
-rw-r--r--libc-top-half/musl/src/math/powerpc64/trunc.c15
-rw-r--r--libc-top-half/musl/src/math/powerpc64/truncf.c15
-rw-r--r--libc-top-half/musl/src/math/powf.c185
-rw-r--r--libc-top-half/musl/src/math/powf_data.c34
-rw-r--r--libc-top-half/musl/src/math/powf_data.h26
-rw-r--r--libc-top-half/musl/src/math/powl.c526
-rw-r--r--libc-top-half/musl/src/math/remainder.c9
-rw-r--r--libc-top-half/musl/src/math/remainderf.c9
-rw-r--r--libc-top-half/musl/src/math/remainderl.c15
-rw-r--r--libc-top-half/musl/src/math/remquo.c82
-rw-r--r--libc-top-half/musl/src/math/remquof.c82
-rw-r--r--libc-top-half/musl/src/math/remquol.c124
-rw-r--r--libc-top-half/musl/src/math/rint.c28
-rw-r--r--libc-top-half/musl/src/math/rintf.c30
-rw-r--r--libc-top-half/musl/src/math/rintl.c29
-rw-r--r--libc-top-half/musl/src/math/riscv64/copysign.c15
-rw-r--r--libc-top-half/musl/src/math/riscv64/copysignf.c15
-rw-r--r--libc-top-half/musl/src/math/riscv64/fabs.c15
-rw-r--r--libc-top-half/musl/src/math/riscv64/fabsf.c15
-rw-r--r--libc-top-half/musl/src/math/riscv64/fma.c15
-rw-r--r--libc-top-half/musl/src/math/riscv64/fmaf.c15
-rw-r--r--libc-top-half/musl/src/math/riscv64/fmax.c15
-rw-r--r--libc-top-half/musl/src/math/riscv64/fmaxf.c15
-rw-r--r--libc-top-half/musl/src/math/riscv64/fmin.c15
-rw-r--r--libc-top-half/musl/src/math/riscv64/fminf.c15
-rw-r--r--libc-top-half/musl/src/math/riscv64/sqrt.c15
-rw-r--r--libc-top-half/musl/src/math/riscv64/sqrtf.c15
-rw-r--r--libc-top-half/musl/src/math/round.c35
-rw-r--r--libc-top-half/musl/src/math/roundf.c36
-rw-r--r--libc-top-half/musl/src/math/roundl.c37
-rw-r--r--libc-top-half/musl/src/math/s390x/ceil.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/ceilf.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/ceill.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/fabs.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/fabsf.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/fabsl.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/floor.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/floorf.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/floorl.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/fma.c7
-rw-r--r--libc-top-half/musl/src/math/s390x/fmaf.c7
-rw-r--r--libc-top-half/musl/src/math/s390x/nearbyint.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/nearbyintf.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/nearbyintl.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/rint.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/rintf.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/rintl.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/round.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/roundf.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/roundl.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/sqrt.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/sqrtf.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/sqrtl.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/trunc.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/truncf.c15
-rw-r--r--libc-top-half/musl/src/math/s390x/truncl.c15
-rw-r--r--libc-top-half/musl/src/math/scalb.c35
-rw-r--r--libc-top-half/musl/src/math/scalbf.c32
-rw-r--r--libc-top-half/musl/src/math/scalbln.c11
-rw-r--r--libc-top-half/musl/src/math/scalblnf.c11
-rw-r--r--libc-top-half/musl/src/math/scalblnl.c19
-rw-r--r--libc-top-half/musl/src/math/scalbn.c33
-rw-r--r--libc-top-half/musl/src/math/scalbnf.c31
-rw-r--r--libc-top-half/musl/src/math/scalbnl.c36
-rw-r--r--libc-top-half/musl/src/math/signgam.c6
-rw-r--r--libc-top-half/musl/src/math/significand.c7
-rw-r--r--libc-top-half/musl/src/math/significandf.c7
-rw-r--r--libc-top-half/musl/src/math/sin.c78
-rw-r--r--libc-top-half/musl/src/math/sincos.c69
-rw-r--r--libc-top-half/musl/src/math/sincosf.c117
-rw-r--r--libc-top-half/musl/src/math/sincosl.c60
-rw-r--r--libc-top-half/musl/src/math/sinf.c76
-rw-r--r--libc-top-half/musl/src/math/sinh.c43
-rw-r--r--libc-top-half/musl/src/math/sinhf.c35
-rw-r--r--libc-top-half/musl/src/math/sinhl.c43
-rw-r--r--libc-top-half/musl/src/math/sinl.c41
-rw-r--r--libc-top-half/musl/src/math/sqrt.c158
-rw-r--r--libc-top-half/musl/src/math/sqrt_data.c19
-rw-r--r--libc-top-half/musl/src/math/sqrt_data.h13
-rw-r--r--libc-top-half/musl/src/math/sqrtf.c83
-rw-r--r--libc-top-half/musl/src/math/sqrtl.c259
-rw-r--r--libc-top-half/musl/src/math/tan.c70
-rw-r--r--libc-top-half/musl/src/math/tanf.c64
-rw-r--r--libc-top-half/musl/src/math/tanh.c45
-rw-r--r--libc-top-half/musl/src/math/tanhf.c39
-rw-r--r--libc-top-half/musl/src/math/tanhl.c48
-rw-r--r--libc-top-half/musl/src/math/tanl.c29
-rw-r--r--libc-top-half/musl/src/math/tgamma.c222
-rw-r--r--libc-top-half/musl/src/math/tgammaf.c6
-rw-r--r--libc-top-half/musl/src/math/tgammal.c281
-rw-r--r--libc-top-half/musl/src/math/trunc.c19
-rw-r--r--libc-top-half/musl/src/math/truncf.c19
-rw-r--r--libc-top-half/musl/src/math/truncl.c34
-rw-r--r--libc-top-half/musl/src/math/x32/__invtrigl.s0
-rw-r--r--libc-top-half/musl/src/math/x32/acosl.s16
-rw-r--r--libc-top-half/musl/src/math/x32/asinl.s12
-rw-r--r--libc-top-half/musl/src/math/x32/atan2l.s7
-rw-r--r--libc-top-half/musl/src/math/x32/atanl.s7
-rw-r--r--libc-top-half/musl/src/math/x32/ceill.s1
-rw-r--r--libc-top-half/musl/src/math/x32/exp2l.s83
-rw-r--r--libc-top-half/musl/src/math/x32/expl.s101
-rw-r--r--libc-top-half/musl/src/math/x32/expm1l.s1
-rw-r--r--libc-top-half/musl/src/math/x32/fabs.s9
-rw-r--r--libc-top-half/musl/src/math/x32/fabsf.s7
-rw-r--r--libc-top-half/musl/src/math/x32/fabsl.s6
-rw-r--r--libc-top-half/musl/src/math/x32/floorl.s27
-rw-r--r--libc-top-half/musl/src/math/x32/fma.c23
-rw-r--r--libc-top-half/musl/src/math/x32/fmaf.c23
-rw-r--r--libc-top-half/musl/src/math/x32/fmodl.s11
-rw-r--r--libc-top-half/musl/src/math/x32/llrint.s5
-rw-r--r--libc-top-half/musl/src/math/x32/llrintf.s5
-rw-r--r--libc-top-half/musl/src/math/x32/llrintl.s7
-rw-r--r--libc-top-half/musl/src/math/x32/log10l.s7
-rw-r--r--libc-top-half/musl/src/math/x32/log1pl.s15
-rw-r--r--libc-top-half/musl/src/math/x32/log2l.s7
-rw-r--r--libc-top-half/musl/src/math/x32/logl.s7
-rw-r--r--libc-top-half/musl/src/math/x32/lrint.s5
-rw-r--r--libc-top-half/musl/src/math/x32/lrintf.s5
-rw-r--r--libc-top-half/musl/src/math/x32/lrintl.s7
-rw-r--r--libc-top-half/musl/src/math/x32/remainderl.s11
-rw-r--r--libc-top-half/musl/src/math/x32/rintl.s6
-rw-r--r--libc-top-half/musl/src/math/x32/sqrt.s4
-rw-r--r--libc-top-half/musl/src/math/x32/sqrtf.s4
-rw-r--r--libc-top-half/musl/src/math/x32/sqrtl.s5
-rw-r--r--libc-top-half/musl/src/math/x32/truncl.s1
-rw-r--r--libc-top-half/musl/src/math/x86_64/__invtrigl.s0
-rw-r--r--libc-top-half/musl/src/math/x86_64/acosl.s16
-rw-r--r--libc-top-half/musl/src/math/x86_64/asinl.s12
-rw-r--r--libc-top-half/musl/src/math/x86_64/atan2l.s7
-rw-r--r--libc-top-half/musl/src/math/x86_64/atanl.s7
-rw-r--r--libc-top-half/musl/src/math/x86_64/ceill.s1
-rw-r--r--libc-top-half/musl/src/math/x86_64/exp2l.s83
-rw-r--r--libc-top-half/musl/src/math/x86_64/expl.s101
-rw-r--r--libc-top-half/musl/src/math/x86_64/expm1l.s1
-rw-r--r--libc-top-half/musl/src/math/x86_64/fabs.c10
-rw-r--r--libc-top-half/musl/src/math/x86_64/fabsf.c10
-rw-r--r--libc-top-half/musl/src/math/x86_64/fabsl.c7
-rw-r--r--libc-top-half/musl/src/math/x86_64/floorl.s27
-rw-r--r--libc-top-half/musl/src/math/x86_64/fma.c23
-rw-r--r--libc-top-half/musl/src/math/x86_64/fmaf.c23
-rw-r--r--libc-top-half/musl/src/math/x86_64/fmodl.c9
-rw-r--r--libc-top-half/musl/src/math/x86_64/llrint.c8
-rw-r--r--libc-top-half/musl/src/math/x86_64/llrintf.c8
-rw-r--r--libc-top-half/musl/src/math/x86_64/llrintl.c8
-rw-r--r--libc-top-half/musl/src/math/x86_64/log10l.s7
-rw-r--r--libc-top-half/musl/src/math/x86_64/log1pl.s15
-rw-r--r--libc-top-half/musl/src/math/x86_64/log2l.s7
-rw-r--r--libc-top-half/musl/src/math/x86_64/logl.s7
-rw-r--r--libc-top-half/musl/src/math/x86_64/lrint.c8
-rw-r--r--libc-top-half/musl/src/math/x86_64/lrintf.c8
-rw-r--r--libc-top-half/musl/src/math/x86_64/lrintl.c8
-rw-r--r--libc-top-half/musl/src/math/x86_64/remainderl.c9
-rw-r--r--libc-top-half/musl/src/math/x86_64/remquol.c32
-rw-r--r--libc-top-half/musl/src/math/x86_64/rintl.c7
-rw-r--r--libc-top-half/musl/src/math/x86_64/sqrt.c7
-rw-r--r--libc-top-half/musl/src/math/x86_64/sqrtf.c7
-rw-r--r--libc-top-half/musl/src/math/x86_64/sqrtl.c7
-rw-r--r--libc-top-half/musl/src/math/x86_64/truncl.s1
-rw-r--r--libc-top-half/musl/src/misc/a64l.c29
-rw-r--r--libc-top-half/musl/src/misc/basename.c14
-rw-r--r--libc-top-half/musl/src/misc/dirname.c14
-rw-r--r--libc-top-half/musl/src/misc/ffs.c7
-rw-r--r--libc-top-half/musl/src/misc/ffsl.c7
-rw-r--r--libc-top-half/musl/src/misc/ffsll.c7
-rw-r--r--libc-top-half/musl/src/misc/fmtmsg.c96
-rw-r--r--libc-top-half/musl/src/misc/forkpty.c57
-rw-r--r--libc-top-half/musl/src/misc/get_current_dir_name.c15
-rw-r--r--libc-top-half/musl/src/misc/getauxval.c15
-rw-r--r--libc-top-half/musl/src/misc/getdomainname.c17
-rw-r--r--libc-top-half/musl/src/misc/getentropy.c33
-rw-r--r--libc-top-half/musl/src/misc/gethostid.c6
-rw-r--r--libc-top-half/musl/src/misc/getopt.c105
-rw-r--r--libc-top-half/musl/src/misc/getopt_long.c148
-rw-r--r--libc-top-half/musl/src/misc/getpriority.c9
-rw-r--r--libc-top-half/musl/src/misc/getresgid.c8
-rw-r--r--libc-top-half/musl/src/misc/getresuid.c8
-rw-r--r--libc-top-half/musl/src/misc/getrlimit.c26
-rw-r--r--libc-top-half/musl/src/misc/getrusage.c35
-rw-r--r--libc-top-half/musl/src/misc/getsubopt.c23
-rw-r--r--libc-top-half/musl/src/misc/initgroups.c11
-rw-r--r--libc-top-half/musl/src/misc/ioctl.c151
-rw-r--r--libc-top-half/musl/src/misc/issetugid.c8
-rw-r--r--libc-top-half/musl/src/misc/lockf.c32
-rw-r--r--libc-top-half/musl/src/misc/login_tty.c14
-rw-r--r--libc-top-half/musl/src/misc/mntent.c77
-rw-r--r--libc-top-half/musl/src/misc/nftw.c148
-rw-r--r--libc-top-half/musl/src/misc/openpty.c40
-rw-r--r--libc-top-half/musl/src/misc/ptsname.c13
-rw-r--r--libc-top-half/musl/src/misc/pty.c35
-rw-r--r--libc-top-half/musl/src/misc/realpath.c156
-rw-r--r--libc-top-half/musl/src/misc/setdomainname.c8
-rw-r--r--libc-top-half/musl/src/misc/setpriority.c7
-rw-r--r--libc-top-half/musl/src/misc/setrlimit.c47
-rw-r--r--libc-top-half/musl/src/misc/syscall.c21
-rw-r--r--libc-top-half/musl/src/misc/syslog.c162
-rw-r--r--libc-top-half/musl/src/misc/uname.c32
-rw-r--r--libc-top-half/musl/src/misc/wordexp.c187
-rw-r--r--libc-top-half/musl/src/mman/madvise.c9
-rw-r--r--libc-top-half/musl/src/mman/mincore.c8
-rw-r--r--libc-top-half/musl/src/mman/mlock.c11
-rw-r--r--libc-top-half/musl/src/mman/mlockall.c7
-rw-r--r--libc-top-half/musl/src/mman/mmap.c41
-rw-r--r--libc-top-half/musl/src/mman/mprotect.c13
-rw-r--r--libc-top-half/musl/src/mman/mremap.c32
-rw-r--r--libc-top-half/musl/src/mman/msync.c7
-rw-r--r--libc-top-half/musl/src/mman/munlock.c7
-rw-r--r--libc-top-half/musl/src/mman/munlockall.c7
-rw-r--r--libc-top-half/musl/src/mman/munmap.c13
-rw-r--r--libc-top-half/musl/src/mman/posix_madvise.c9
-rw-r--r--libc-top-half/musl/src/mman/shm_open.c43
-rw-r--r--libc-top-half/musl/src/mq/mq_close.c7
-rw-r--r--libc-top-half/musl/src/mq/mq_getattr.c7
-rw-r--r--libc-top-half/musl/src/mq/mq_notify.c73
-rw-r--r--libc-top-half/musl/src/mq/mq_open.c19
-rw-r--r--libc-top-half/musl/src/mq/mq_receive.c6
-rw-r--r--libc-top-half/musl/src/mq/mq_send.c6
-rw-r--r--libc-top-half/musl/src/mq/mq_setattr.c7
-rw-r--r--libc-top-half/musl/src/mq/mq_timedreceive.c24
-rw-r--r--libc-top-half/musl/src/mq/mq_timedsend.c24
-rw-r--r--libc-top-half/musl/src/mq/mq_unlink.c16
-rw-r--r--libc-top-half/musl/src/multibyte/btowc.c10
-rw-r--r--libc-top-half/musl/src/multibyte/c16rtomb.c35
-rw-r--r--libc-top-half/musl/src/multibyte/c32rtomb.c7
-rw-r--r--libc-top-half/musl/src/multibyte/internal.c26
-rw-r--r--libc-top-half/musl/src/multibyte/internal.h24
-rw-r--r--libc-top-half/musl/src/multibyte/mblen.c6
-rw-r--r--libc-top-half/musl/src/multibyte/mbrlen.c7
-rw-r--r--libc-top-half/musl/src/multibyte/mbrtoc16.c30
-rw-r--r--libc-top-half/musl/src/multibyte/mbrtoc32.c13
-rw-r--r--libc-top-half/musl/src/multibyte/mbrtowc.c51
-rw-r--r--libc-top-half/musl/src/multibyte/mbsinit.c6
-rw-r--r--libc-top-half/musl/src/multibyte/mbsnrtowcs.c55
-rw-r--r--libc-top-half/musl/src/multibyte/mbsrtowcs.c120
-rw-r--r--libc-top-half/musl/src/multibyte/mbstowcs.c7
-rw-r--r--libc-top-half/musl/src/multibyte/mbtowc.c47
-rw-r--r--libc-top-half/musl/src/multibyte/wcrtomb.c37
-rw-r--r--libc-top-half/musl/src/multibyte/wcsnrtombs.c35
-rw-r--r--libc-top-half/musl/src/multibyte/wcsrtombs.c55
-rw-r--r--libc-top-half/musl/src/multibyte/wcstombs.c7
-rw-r--r--libc-top-half/musl/src/multibyte/wctob.c11
-rw-r--r--libc-top-half/musl/src/multibyte/wctomb.c8
-rw-r--r--libc-top-half/musl/src/network/accept.c7
-rw-r--r--libc-top-half/musl/src/network/accept4.c19
-rw-r--r--libc-top-half/musl/src/network/bind.c7
-rw-r--r--libc-top-half/musl/src/network/connect.c7
-rw-r--r--libc-top-half/musl/src/network/dn_comp.c107
-rw-r--r--libc-top-half/musl/src/network/dn_expand.c33
-rw-r--r--libc-top-half/musl/src/network/dn_skipname.c15
-rw-r--r--libc-top-half/musl/src/network/dns_parse.c33
-rw-r--r--libc-top-half/musl/src/network/ent.c22
-rw-r--r--libc-top-half/musl/src/network/ether.c58
-rw-r--r--libc-top-half/musl/src/network/freeaddrinfo.c16
-rw-r--r--libc-top-half/musl/src/network/gai_strerror.c25
-rw-r--r--libc-top-half/musl/src/network/getaddrinfo.c135
-rw-r--r--libc-top-half/musl/src/network/gethostbyaddr.c24
-rw-r--r--libc-top-half/musl/src/network/gethostbyaddr_r.c71
-rw-r--r--libc-top-half/musl/src/network/gethostbyname.c11
-rw-r--r--libc-top-half/musl/src/network/gethostbyname2.c25
-rw-r--r--libc-top-half/musl/src/network/gethostbyname2_r.c80
-rw-r--r--libc-top-half/musl/src/network/gethostbyname_r.c11
-rw-r--r--libc-top-half/musl/src/network/getifaddrs.c216
-rw-r--r--libc-top-half/musl/src/network/getnameinfo.c200
-rw-r--r--libc-top-half/musl/src/network/getpeername.c7
-rw-r--r--libc-top-half/musl/src/network/getservbyname.c12
-rw-r--r--libc-top-half/musl/src/network/getservbyname_r.c55
-rw-r--r--libc-top-half/musl/src/network/getservbyport.c12
-rw-r--r--libc-top-half/musl/src/network/getservbyport_r.c60
-rw-r--r--libc-top-half/musl/src/network/getsockname.c7
-rw-r--r--libc-top-half/musl/src/network/getsockopt.c41
-rw-r--r--libc-top-half/musl/src/network/h_errno.c11
-rw-r--r--libc-top-half/musl/src/network/herror.c8
-rw-r--r--libc-top-half/musl/src/network/hstrerror.c18
-rw-r--r--libc-top-half/musl/src/network/htonl.c8
-rw-r--r--libc-top-half/musl/src/network/htons.c8
-rw-r--r--libc-top-half/musl/src/network/if_freenameindex.c7
-rw-r--r--libc-top-half/musl/src/network/if_indextoname.c23
-rw-r--r--libc-top-half/musl/src/network/if_nameindex.c114
-rw-r--r--libc-top-half/musl/src/network/if_nametoindex.c18
-rw-r--r--libc-top-half/musl/src/network/in6addr_any.c3
-rw-r--r--libc-top-half/musl/src/network/in6addr_loopback.c3
-rw-r--r--libc-top-half/musl/src/network/inet_addr.c10
-rw-r--r--libc-top-half/musl/src/network/inet_aton.c41
-rw-r--r--libc-top-half/musl/src/network/inet_legacy.c32
-rw-r--r--libc-top-half/musl/src/network/inet_ntoa.c10
-rw-r--r--libc-top-half/musl/src/network/inet_ntop.c54
-rw-r--r--libc-top-half/musl/src/network/inet_pton.c71
-rw-r--r--libc-top-half/musl/src/network/listen.c7
-rw-r--r--libc-top-half/musl/src/network/lookup.h55
-rw-r--r--libc-top-half/musl/src/network/lookup_ipliteral.c55
-rw-r--r--libc-top-half/musl/src/network/lookup_name.c425
-rw-r--r--libc-top-half/musl/src/network/lookup_serv.c114
-rw-r--r--libc-top-half/musl/src/network/netlink.c52
-rw-r--r--libc-top-half/musl/src/network/netlink.h94
-rw-r--r--libc-top-half/musl/src/network/netname.c12
-rw-r--r--libc-top-half/musl/src/network/ns_parse.c171
-rw-r--r--libc-top-half/musl/src/network/ntohl.c8
-rw-r--r--libc-top-half/musl/src/network/ntohs.c8
-rw-r--r--libc-top-half/musl/src/network/proto.c84
-rw-r--r--libc-top-half/musl/src/network/recv.c6
-rw-r--r--libc-top-half/musl/src/network/recvfrom.c7
-rw-r--r--libc-top-half/musl/src/network/recvmmsg.c39
-rw-r--r--libc-top-half/musl/src/network/recvmsg.c68
-rw-r--r--libc-top-half/musl/src/network/res_init.c6
-rw-r--r--libc-top-half/musl/src/network/res_mkquery.c44
-rw-r--r--libc-top-half/musl/src/network/res_msend.c188
-rw-r--r--libc-top-half/musl/src/network/res_query.c26
-rw-r--r--libc-top-half/musl/src/network/res_querydomain.c14
-rw-r--r--libc-top-half/musl/src/network/res_send.c9
-rw-r--r--libc-top-half/musl/src/network/res_state.c9
-rw-r--r--libc-top-half/musl/src/network/resolvconf.c94
-rw-r--r--libc-top-half/musl/src/network/send.c6
-rw-r--r--libc-top-half/musl/src/network/sendmmsg.c30
-rw-r--r--libc-top-half/musl/src/network/sendmsg.c29
-rw-r--r--libc-top-half/musl/src/network/sendto.c7
-rw-r--r--libc-top-half/musl/src/network/serv.c14
-rw-r--r--libc-top-half/musl/src/network/setsockopt.c46
-rw-r--r--libc-top-half/musl/src/network/shutdown.c7
-rw-r--r--libc-top-half/musl/src/network/sockatmark.c10
-rw-r--r--libc-top-half/musl/src/network/socket.c21
-rw-r--r--libc-top-half/musl/src/network/socketpair.c25
-rw-r--r--libc-top-half/musl/src/passwd/fgetgrent.c12
-rw-r--r--libc-top-half/musl/src/passwd/fgetpwent.c12
-rw-r--r--libc-top-half/musl/src/passwd/fgetspent.c15
-rw-r--r--libc-top-half/musl/src/passwd/getgr_a.c169
-rw-r--r--libc-top-half/musl/src/passwd/getgr_r.c49
-rw-r--r--libc-top-half/musl/src/passwd/getgrent.c39
-rw-r--r--libc-top-half/musl/src/passwd/getgrent_a.c68
-rw-r--r--libc-top-half/musl/src/passwd/getgrouplist.c81
-rw-r--r--libc-top-half/musl/src/passwd/getpw_a.c142
-rw-r--r--libc-top-half/musl/src/passwd/getpw_r.c42
-rw-r--r--libc-top-half/musl/src/passwd/getpwent.c37
-rw-r--r--libc-top-half/musl/src/passwd/getpwent_a.c54
-rw-r--r--libc-top-half/musl/src/passwd/getspent.c14
-rw-r--r--libc-top-half/musl/src/passwd/getspnam.c18
-rw-r--r--libc-top-half/musl/src/passwd/getspnam_r.c125
-rw-r--r--libc-top-half/musl/src/passwd/lckpwdf.c11
-rw-r--r--libc-top-half/musl/src/passwd/nscd.h44
-rw-r--r--libc-top-half/musl/src/passwd/nscd_query.c115
-rw-r--r--libc-top-half/musl/src/passwd/putgrent.c17
-rw-r--r--libc-top-half/musl/src/passwd/putpwent.c10
-rw-r--r--libc-top-half/musl/src/passwd/putspent.c13
-rw-r--r--libc-top-half/musl/src/passwd/pwf.h15
-rw-r--r--libc-top-half/musl/src/prng/__rand48_step.c14
-rw-r--r--libc-top-half/musl/src/prng/__seed48.c3
-rw-r--r--libc-top-half/musl/src/prng/drand48.c17
-rw-r--r--libc-top-half/musl/src/prng/lcong48.c8
-rw-r--r--libc-top-half/musl/src/prng/lrand48.c13
-rw-r--r--libc-top-half/musl/src/prng/mrand48.c13
-rw-r--r--libc-top-half/musl/src/prng/rand.c15
-rw-r--r--libc-top-half/musl/src/prng/rand48.h5
-rw-r--r--libc-top-half/musl/src/prng/rand_r.c15
-rw-r--r--libc-top-half/musl/src/prng/random.c126
-rw-r--r--libc-top-half/musl/src/prng/seed48.c11
-rw-r--r--libc-top-half/musl/src/prng/srand48.c6
-rw-r--r--libc-top-half/musl/src/process/_Fork.c38
-rw-r--r--libc-top-half/musl/src/process/arm/vfork.s10
-rw-r--r--libc-top-half/musl/src/process/execl.c22
-rw-r--r--libc-top-half/musl/src/process/execle.c23
-rw-r--r--libc-top-half/musl/src/process/execlp.c22
-rw-r--r--libc-top-half/musl/src/process/execv.c8
-rw-r--r--libc-top-half/musl/src/process/execve.c8
-rw-r--r--libc-top-half/musl/src/process/execvp.c60
-rw-r--r--libc-top-half/musl/src/process/fdop.h17
-rw-r--r--libc-top-half/musl/src/process/fexecve.c16
-rw-r--r--libc-top-half/musl/src/process/fork.c86
-rw-r--r--libc-top-half/musl/src/process/i386/vfork.s12
-rw-r--r--libc-top-half/musl/src/process/posix_spawn.c214
-rw-r--r--libc-top-half/musl/src/process/posix_spawn_file_actions_addchdir.c18
-rw-r--r--libc-top-half/musl/src/process/posix_spawn_file_actions_addclose.c17
-rw-r--r--libc-top-half/musl/src/process/posix_spawn_file_actions_adddup2.c18
-rw-r--r--libc-top-half/musl/src/process/posix_spawn_file_actions_addfchdir.c18
-rw-r--r--libc-top-half/musl/src/process/posix_spawn_file_actions_addopen.c21
-rw-r--r--libc-top-half/musl/src/process/posix_spawn_file_actions_destroy.c14
-rw-r--r--libc-top-half/musl/src/process/posix_spawn_file_actions_init.c7
-rw-r--r--libc-top-half/musl/src/process/posix_spawnattr_destroy.c6
-rw-r--r--libc-top-half/musl/src/process/posix_spawnattr_getflags.c7
-rw-r--r--libc-top-half/musl/src/process/posix_spawnattr_getpgroup.c7
-rw-r--r--libc-top-half/musl/src/process/posix_spawnattr_getsigdefault.c7
-rw-r--r--libc-top-half/musl/src/process/posix_spawnattr_getsigmask.c7
-rw-r--r--libc-top-half/musl/src/process/posix_spawnattr_init.c7
-rw-r--r--libc-top-half/musl/src/process/posix_spawnattr_sched.c25
-rw-r--r--libc-top-half/musl/src/process/posix_spawnattr_setflags.c18
-rw-r--r--libc-top-half/musl/src/process/posix_spawnattr_setpgroup.c7
-rw-r--r--libc-top-half/musl/src/process/posix_spawnattr_setsigdefault.c7
-rw-r--r--libc-top-half/musl/src/process/posix_spawnattr_setsigmask.c7
-rw-r--r--libc-top-half/musl/src/process/posix_spawnp.c13
-rw-r--r--libc-top-half/musl/src/process/s390x/vfork.s6
-rw-r--r--libc-top-half/musl/src/process/sh/vfork.s20
-rw-r--r--libc-top-half/musl/src/process/system.c46
-rw-r--r--libc-top-half/musl/src/process/vfork.c14
-rw-r--r--libc-top-half/musl/src/process/wait.c6
-rw-r--r--libc-top-half/musl/src/process/waitid.c7
-rw-r--r--libc-top-half/musl/src/process/waitpid.c7
-rw-r--r--libc-top-half/musl/src/process/x32/vfork.s10
-rw-r--r--libc-top-half/musl/src/process/x86_64/vfork.s10
-rw-r--r--libc-top-half/musl/src/regex/fnmatch.c321
-rw-r--r--libc-top-half/musl/src/regex/glob.c317
-rw-r--r--libc-top-half/musl/src/regex/regcomp.c2953
-rw-r--r--libc-top-half/musl/src/regex/regerror.c37
-rw-r--r--libc-top-half/musl/src/regex/regexec.c1028
-rw-r--r--libc-top-half/musl/src/regex/tre-mem.c158
-rw-r--r--libc-top-half/musl/src/regex/tre.h233
-rw-r--r--libc-top-half/musl/src/sched/affinity.c33
-rw-r--r--libc-top-half/musl/src/sched/sched_cpucount.c11
-rw-r--r--libc-top-half/musl/src/sched/sched_get_priority_max.c12
-rw-r--r--libc-top-half/musl/src/sched/sched_getcpu.c42
-rw-r--r--libc-top-half/musl/src/sched/sched_getparam.c8
-rw-r--r--libc-top-half/musl/src/sched/sched_getscheduler.c8
-rw-r--r--libc-top-half/musl/src/sched/sched_rr_get_interval.c21
-rw-r--r--libc-top-half/musl/src/sched/sched_setparam.c8
-rw-r--r--libc-top-half/musl/src/sched/sched_setscheduler.c8
-rw-r--r--libc-top-half/musl/src/sched/sched_yield.c7
-rw-r--r--libc-top-half/musl/src/search/hsearch.c153
-rw-r--r--libc-top-half/musl/src/search/insque.c32
-rw-r--r--libc-top-half/musl/src/search/lsearch.c31
-rw-r--r--libc-top-half/musl/src/search/tdelete.c49
-rw-r--r--libc-top-half/musl/src/search/tdestroy.c16
-rw-r--r--libc-top-half/musl/src/search/tfind.c20
-rw-r--r--libc-top-half/musl/src/search/tsearch.c92
-rw-r--r--libc-top-half/musl/src/search/tsearch.h13
-rw-r--r--libc-top-half/musl/src/search/twalk.c22
-rw-r--r--libc-top-half/musl/src/select/poll.c15
-rw-r--r--libc-top-half/musl/src/select/pselect.c26
-rw-r--r--libc-top-half/musl/src/select/select.c44
-rw-r--r--libc-top-half/musl/src/setjmp/aarch64/longjmp.s23
-rw-r--r--libc-top-half/musl/src/setjmp/aarch64/setjmp.s24
-rw-r--r--libc-top-half/musl/src/setjmp/arm/longjmp.S50
-rw-r--r--libc-top-half/musl/src/setjmp/arm/setjmp.S52
-rw-r--r--libc-top-half/musl/src/setjmp/i386/longjmp.s16
-rw-r--r--libc-top-half/musl/src/setjmp/i386/setjmp.s23
-rw-r--r--libc-top-half/musl/src/setjmp/longjmp.c0
-rw-r--r--libc-top-half/musl/src/setjmp/m68k/longjmp.s14
-rw-r--r--libc-top-half/musl/src/setjmp/m68k/setjmp.s18
-rw-r--r--libc-top-half/musl/src/setjmp/microblaze/longjmp.s29
-rw-r--r--libc-top-half/musl/src/setjmp/microblaze/setjmp.s32
-rw-r--r--libc-top-half/musl/src/setjmp/mips/longjmp.S34
-rw-r--r--libc-top-half/musl/src/setjmp/mips/setjmp.S33
-rw-r--r--libc-top-half/musl/src/setjmp/mips64/longjmp.S37
-rw-r--r--libc-top-half/musl/src/setjmp/mips64/setjmp.S34
-rw-r--r--libc-top-half/musl/src/setjmp/mipsn32/longjmp.S36
-rw-r--r--libc-top-half/musl/src/setjmp/mipsn32/setjmp.S34
-rw-r--r--libc-top-half/musl/src/setjmp/or1k/longjmp.s25
-rw-r--r--libc-top-half/musl/src/setjmp/or1k/setjmp.s27
-rw-r--r--libc-top-half/musl/src/setjmp/powerpc/longjmp.S99
-rw-r--r--libc-top-half/musl/src/setjmp/powerpc/setjmp.S93
-rw-r--r--libc-top-half/musl/src/setjmp/powerpc64/longjmp.s81
-rw-r--r--libc-top-half/musl/src/setjmp/powerpc64/setjmp.s89
-rw-r--r--libc-top-half/musl/src/setjmp/riscv64/longjmp.S42
-rw-r--r--libc-top-half/musl/src/setjmp/riscv64/setjmp.S41
-rw-r--r--libc-top-half/musl/src/setjmp/s390x/longjmp.s23
-rw-r--r--libc-top-half/musl/src/setjmp/s390x/setjmp.s25
-rw-r--r--libc-top-half/musl/src/setjmp/setjmp.c0
-rw-r--r--libc-top-half/musl/src/setjmp/sh/longjmp.S28
-rw-r--r--libc-top-half/musl/src/setjmp/sh/setjmp.S32
-rw-r--r--libc-top-half/musl/src/setjmp/x32/longjmp.s18
-rw-r--r--libc-top-half/musl/src/setjmp/x32/setjmp.s22
-rw-r--r--libc-top-half/musl/src/setjmp/x86_64/longjmp.s18
-rw-r--r--libc-top-half/musl/src/setjmp/x86_64/setjmp.s22
-rw-r--r--libc-top-half/musl/src/signal/aarch64/restore.s10
-rw-r--r--libc-top-half/musl/src/signal/aarch64/sigsetjmp.s21
-rw-r--r--libc-top-half/musl/src/signal/arm/restore.s15
-rw-r--r--libc-top-half/musl/src/signal/arm/sigsetjmp.s24
-rw-r--r--libc-top-half/musl/src/signal/block.c44
-rw-r--r--libc-top-half/musl/src/signal/getitimer.c18
-rw-r--r--libc-top-half/musl/src/signal/i386/restore.s14
-rw-r--r--libc-top-half/musl/src/signal/i386/sigsetjmp.s26
-rw-r--r--libc-top-half/musl/src/signal/kill.c7
-rw-r--r--libc-top-half/musl/src/signal/killpg.c11
-rw-r--r--libc-top-half/musl/src/signal/m68k/sigsetjmp.s29
-rw-r--r--libc-top-half/musl/src/signal/microblaze/restore.s13
-rw-r--r--libc-top-half/musl/src/signal/microblaze/sigsetjmp.s22
-rw-r--r--libc-top-half/musl/src/signal/mips/restore.s15
-rw-r--r--libc-top-half/musl/src/signal/mips/sigsetjmp.s33
-rw-r--r--libc-top-half/musl/src/signal/mips64/restore.s11
-rw-r--r--libc-top-half/musl/src/signal/mips64/sigsetjmp.s38
-rw-r--r--libc-top-half/musl/src/signal/mipsn32/restore.s11
-rw-r--r--libc-top-half/musl/src/signal/mipsn32/sigsetjmp.s38
-rw-r--r--libc-top-half/musl/src/signal/or1k/sigsetjmp.s24
-rw-r--r--libc-top-half/musl/src/signal/powerpc/restore.s13
-rw-r--r--libc-top-half/musl/src/signal/powerpc/sigsetjmp.s27
-rw-r--r--libc-top-half/musl/src/signal/powerpc64/restore.s13
-rw-r--r--libc-top-half/musl/src/signal/powerpc64/sigsetjmp.s37
-rw-r--r--libc-top-half/musl/src/signal/psiginfo.c6
-rw-r--r--libc-top-half/musl/src/signal/psignal.c27
-rw-r--r--libc-top-half/musl/src/signal/raise.c13
-rw-r--r--libc-top-half/musl/src/signal/restore.c12
-rw-r--r--libc-top-half/musl/src/signal/riscv64/restore.s8
-rw-r--r--libc-top-half/musl/src/signal/riscv64/sigsetjmp.s23
-rw-r--r--libc-top-half/musl/src/signal/s390x/restore.s11
-rw-r--r--libc-top-half/musl/src/signal/s390x/sigsetjmp.s23
-rw-r--r--libc-top-half/musl/src/signal/setitimer.c26
-rw-r--r--libc-top-half/musl/src/signal/sh/restore.s24
-rw-r--r--libc-top-half/musl/src/signal/sh/sigsetjmp.s41
-rw-r--r--libc-top-half/musl/src/signal/sigaction.c84
-rw-r--r--libc-top-half/musl/src/signal/sigaddset.c13
-rw-r--r--libc-top-half/musl/src/signal/sigaltstack.c18
-rw-r--r--libc-top-half/musl/src/signal/sigandset.c12
-rw-r--r--libc-top-half/musl/src/signal/sigdelset.c13
-rw-r--r--libc-top-half/musl/src/signal/sigemptyset.c13
-rw-r--r--libc-top-half/musl/src/signal/sigfillset.c18
-rw-r--r--libc-top-half/musl/src/signal/sighold.c10
-rw-r--r--libc-top-half/musl/src/signal/sigignore.c11
-rw-r--r--libc-top-half/musl/src/signal/siginterrupt.c12
-rw-r--r--libc-top-half/musl/src/signal/sigisemptyset.c10
-rw-r--r--libc-top-half/musl/src/signal/sigismember.c8
-rw-r--r--libc-top-half/musl/src/signal/siglongjmp.c9
-rw-r--r--libc-top-half/musl/src/signal/signal.c13
-rw-r--r--libc-top-half/musl/src/signal/sigorset.c12
-rw-r--r--libc-top-half/musl/src/signal/sigpause.c9
-rw-r--r--libc-top-half/musl/src/signal/sigpending.c7
-rw-r--r--libc-top-half/musl/src/signal/sigprocmask.c10
-rw-r--r--libc-top-half/musl/src/signal/sigqueue.c22
-rw-r--r--libc-top-half/musl/src/signal/sigrelse.c10
-rw-r--r--libc-top-half/musl/src/signal/sigrtmax.c6
-rw-r--r--libc-top-half/musl/src/signal/sigrtmin.c6
-rw-r--r--libc-top-half/musl/src/signal/sigset.c27
-rw-r--r--libc-top-half/musl/src/signal/sigsetjmp.c0
-rw-r--r--libc-top-half/musl/src/signal/sigsetjmp_tail.c10
-rw-r--r--libc-top-half/musl/src/signal/sigsuspend.c7
-rw-r--r--libc-top-half/musl/src/signal/sigtimedwait.c32
-rw-r--r--libc-top-half/musl/src/signal/sigwait.c10
-rw-r--r--libc-top-half/musl/src/signal/sigwaitinfo.c6
-rw-r--r--libc-top-half/musl/src/signal/x32/getitimer.c7
-rw-r--r--libc-top-half/musl/src/signal/x32/restore.s8
-rw-r--r--libc-top-half/musl/src/signal/x32/setitimer.c7
-rw-r--r--libc-top-half/musl/src/signal/x32/sigsetjmp.s25
-rw-r--r--libc-top-half/musl/src/signal/x86_64/restore.s8
-rw-r--r--libc-top-half/musl/src/signal/x86_64/sigsetjmp.s24
-rw-r--r--libc-top-half/musl/src/stat/__xstat.c40
-rw-r--r--libc-top-half/musl/src/stat/chmod.c12
-rw-r--r--libc-top-half/musl/src/stat/fchmod.c19
-rw-r--r--libc-top-half/musl/src/stat/fchmodat.c38
-rw-r--r--libc-top-half/musl/src/stat/fstat.c15
-rw-r--r--libc-top-half/musl/src/stat/fstatat.c147
-rw-r--r--libc-top-half/musl/src/stat/futimens.c6
-rw-r--r--libc-top-half/musl/src/stat/futimesat.c31
-rw-r--r--libc-top-half/musl/src/stat/lchmod.c8
-rw-r--r--libc-top-half/musl/src/stat/lstat.c11
-rw-r--r--libc-top-half/musl/src/stat/mkdir.c12
-rw-r--r--libc-top-half/musl/src/stat/mkdirat.c7
-rw-r--r--libc-top-half/musl/src/stat/mkfifo.c6
-rw-r--r--libc-top-half/musl/src/stat/mkfifoat.c6
-rw-r--r--libc-top-half/musl/src/stat/mknod.c12
-rw-r--r--libc-top-half/musl/src/stat/mknodat.c7
-rw-r--r--libc-top-half/musl/src/stat/stat.c11
-rw-r--r--libc-top-half/musl/src/stat/statvfs.c63
-rw-r--r--libc-top-half/musl/src/stat/umask.c7
-rw-r--r--libc-top-half/musl/src/stat/utimensat.c60
-rw-r--r--libc-top-half/musl/src/stdio/__fclose_ca.c6
-rw-r--r--libc-top-half/musl/src/stdio/__fdopen.c85
-rw-r--r--libc-top-half/musl/src/stdio/__fmodeflags.c16
-rw-r--r--libc-top-half/musl/src/stdio/__fopen_rb_ca.c32
-rw-r--r--libc-top-half/musl/src/stdio/__lockfile.c23
-rw-r--r--libc-top-half/musl/src/stdio/__overflow.c10
-rw-r--r--libc-top-half/musl/src/stdio/__stdio_close.c26
-rw-r--r--libc-top-half/musl/src/stdio/__stdio_exit.c25
-rw-r--r--libc-top-half/musl/src/stdio/__stdio_read.c33
-rw-r--r--libc-top-half/musl/src/stdio/__stdio_seek.c11
-rw-r--r--libc-top-half/musl/src/stdio/__stdio_write.c38
-rw-r--r--libc-top-half/musl/src/stdio/__stdout_write.c21
-rw-r--r--libc-top-half/musl/src/stdio/__toread.c19
-rw-r--r--libc-top-half/musl/src/stdio/__towrite.c23
-rw-r--r--libc-top-half/musl/src/stdio/__uflow.c11
-rw-r--r--libc-top-half/musl/src/stdio/asprintf.c13
-rw-r--r--libc-top-half/musl/src/stdio/clearerr.c10
-rw-r--r--libc-top-half/musl/src/stdio/dprintf.c12
-rw-r--r--libc-top-half/musl/src/stdio/ext.c57
-rw-r--r--libc-top-half/musl/src/stdio/ext2.c24
-rw-r--r--libc-top-half/musl/src/stdio/fclose.c38
-rw-r--r--libc-top-half/musl/src/stdio/feof.c14
-rw-r--r--libc-top-half/musl/src/stdio/ferror.c14
-rw-r--r--libc-top-half/musl/src/stdio/fflush.c47
-rw-r--r--libc-top-half/musl/src/stdio/fgetc.c7
-rw-r--r--libc-top-half/musl/src/stdio/fgetln.c21
-rw-r--r--libc-top-half/musl/src/stdio/fgetpos.c11
-rw-r--r--libc-top-half/musl/src/stdio/fgets.c48
-rw-r--r--libc-top-half/musl/src/stdio/fgetwc.c68
-rw-r--r--libc-top-half/musl/src/stdio/fgetws.c28
-rw-r--r--libc-top-half/musl/src/stdio/fileno.c16
-rw-r--r--libc-top-half/musl/src/stdio/flockfile.c9
-rw-r--r--libc-top-half/musl/src/stdio/fmemopen.c137
-rw-r--r--libc-top-half/musl/src/stdio/fopen.c51
-rw-r--r--libc-top-half/musl/src/stdio/fopencookie.c135
-rw-r--r--libc-top-half/musl/src/stdio/fprintf.c12
-rw-r--r--libc-top-half/musl/src/stdio/fputc.c7
-rw-r--r--libc-top-half/musl/src/stdio/fputs.c10
-rw-r--r--libc-top-half/musl/src/stdio/fputwc.c40
-rw-r--r--libc-top-half/musl/src/stdio/fputws.c29
-rw-r--r--libc-top-half/musl/src/stdio/fread.c38
-rw-r--r--libc-top-half/musl/src/stdio/freopen.c80
-rw-r--r--libc-top-half/musl/src/stdio/fscanf.c14
-rw-r--r--libc-top-half/musl/src/stdio/fseek.c50
-rw-r--r--libc-top-half/musl/src/stdio/fsetpos.c8
-rw-r--r--libc-top-half/musl/src/stdio/ftell.c41
-rw-r--r--libc-top-half/musl/src/stdio/ftrylockfile.c46
-rw-r--r--libc-top-half/musl/src/stdio/funlockfile.c13
-rw-r--r--libc-top-half/musl/src/stdio/fwide.c16
-rw-r--r--libc-top-half/musl/src/stdio/fwprintf.c13
-rw-r--r--libc-top-half/musl/src/stdio/fwrite.c38
-rw-r--r--libc-top-half/musl/src/stdio/fwscanf.c15
-rw-r--r--libc-top-half/musl/src/stdio/getc.c9
-rw-r--r--libc-top-half/musl/src/stdio/getc.h29
-rw-r--r--libc-top-half/musl/src/stdio/getc_unlocked.c9
-rw-r--r--libc-top-half/musl/src/stdio/getchar.c7
-rw-r--r--libc-top-half/musl/src/stdio/getchar_unlocked.c6
-rw-r--r--libc-top-half/musl/src/stdio/getdelim.c83
-rw-r--r--libc-top-half/musl/src/stdio/getline.c6
-rw-r--r--libc-top-half/musl/src/stdio/gets.c15
-rw-r--r--libc-top-half/musl/src/stdio/getw.c8
-rw-r--r--libc-top-half/musl/src/stdio/getwc.c7
-rw-r--r--libc-top-half/musl/src/stdio/getwchar.c9
-rw-r--r--libc-top-half/musl/src/stdio/ofl.c20
-rw-r--r--libc-top-half/musl/src/stdio/ofl_add.c11
-rw-r--r--libc-top-half/musl/src/stdio/open_memstream.c109
-rw-r--r--libc-top-half/musl/src/stdio/open_wmemstream.c112
-rw-r--r--libc-top-half/musl/src/stdio/pclose.c13
-rw-r--r--libc-top-half/musl/src/stdio/perror.c30
-rw-r--r--libc-top-half/musl/src/stdio/popen.c61
-rw-r--r--libc-top-half/musl/src/stdio/printf.c17
-rw-r--r--libc-top-half/musl/src/stdio/putc.c9
-rw-r--r--libc-top-half/musl/src/stdio/putc.h29
-rw-r--r--libc-top-half/musl/src/stdio/putc_unlocked.c9
-rw-r--r--libc-top-half/musl/src/stdio/putchar.c7
-rw-r--r--libc-top-half/musl/src/stdio/putchar_unlocked.c6
-rw-r--r--libc-top-half/musl/src/stdio/puts.c10
-rw-r--r--libc-top-half/musl/src/stdio/putw.c7
-rw-r--r--libc-top-half/musl/src/stdio/putwc.c7
-rw-r--r--libc-top-half/musl/src/stdio/putwchar.c9
-rw-r--r--libc-top-half/musl/src/stdio/remove.c19
-rw-r--r--libc-top-half/musl/src/stdio/rename.c14
-rw-r--r--libc-top-half/musl/src/stdio/rewind.c9
-rw-r--r--libc-top-half/musl/src/stdio/scanf.c14
-rw-r--r--libc-top-half/musl/src/stdio/setbuf.c6
-rw-r--r--libc-top-half/musl/src/stdio/setbuffer.c7
-rw-r--r--libc-top-half/musl/src/stdio/setlinebuf.c7
-rw-r--r--libc-top-half/musl/src/stdio/setvbuf.c29
-rw-r--r--libc-top-half/musl/src/stdio/snprintf.c13
-rw-r--r--libc-top-half/musl/src/stdio/sprintf.c12
-rw-r--r--libc-top-half/musl/src/stdio/sscanf.c14
-rw-r--r--libc-top-half/musl/src/stdio/stderr.c20
-rw-r--r--libc-top-half/musl/src/stdio/stdin.c19
-rw-r--r--libc-top-half/musl/src/stdio/stdout.c20
-rw-r--r--libc-top-half/musl/src/stdio/swprintf.c13
-rw-r--r--libc-top-half/musl/src/stdio/swscanf.c14
-rw-r--r--libc-top-half/musl/src/stdio/tempnam.c49
-rw-r--r--libc-top-half/musl/src/stdio/tmpfile.c31
-rw-r--r--libc-top-half/musl/src/stdio/tmpnam.c29
-rw-r--r--libc-top-half/musl/src/stdio/ungetc.c20
-rw-r--r--libc-top-half/musl/src/stdio/ungetwc.c35
-rw-r--r--libc-top-half/musl/src/stdio/vasprintf.c15
-rw-r--r--libc-top-half/musl/src/stdio/vdprintf.c13
-rw-r--r--libc-top-half/musl/src/stdio/vfprintf.c737
-rw-r--r--libc-top-half/musl/src/stdio/vfscanf.c351
-rw-r--r--libc-top-half/musl/src/stdio/vfwprintf.c414
-rw-r--r--libc-top-half/musl/src/stdio/vfwscanf.c332
-rw-r--r--libc-top-half/musl/src/stdio/vprintf.c6
-rw-r--r--libc-top-half/musl/src/stdio/vscanf.c9
-rw-r--r--libc-top-half/musl/src/stdio/vsnprintf.c57
-rw-r--r--libc-top-half/musl/src/stdio/vsprintf.c7
-rw-r--r--libc-top-half/musl/src/stdio/vsscanf.c31
-rw-r--r--libc-top-half/musl/src/stdio/vswprintf.c62
-rw-r--r--libc-top-half/musl/src/stdio/vswscanf.c42
-rw-r--r--libc-top-half/musl/src/stdio/vwprintf.c7
-rw-r--r--libc-top-half/musl/src/stdio/vwscanf.c10
-rw-r--r--libc-top-half/musl/src/stdio/wprintf.c13
-rw-r--r--libc-top-half/musl/src/stdio/wscanf.c15
-rw-r--r--libc-top-half/musl/src/stdlib/abs.c6
-rw-r--r--libc-top-half/musl/src/stdlib/atof.c6
-rw-r--r--libc-top-half/musl/src/stdlib/atoi.c16
-rw-r--r--libc-top-half/musl/src/stdlib/atol.c17
-rw-r--r--libc-top-half/musl/src/stdlib/atoll.c17
-rw-r--r--libc-top-half/musl/src/stdlib/bsearch.c20
-rw-r--r--libc-top-half/musl/src/stdlib/div.c6
-rw-r--r--libc-top-half/musl/src/stdlib/ecvt.c20
-rw-r--r--libc-top-half/musl/src/stdlib/fcvt.c25
-rw-r--r--libc-top-half/musl/src/stdlib/gcvt.c9
-rw-r--r--libc-top-half/musl/src/stdlib/imaxabs.c6
-rw-r--r--libc-top-half/musl/src/stdlib/imaxdiv.c6
-rw-r--r--libc-top-half/musl/src/stdlib/labs.c6
-rw-r--r--libc-top-half/musl/src/stdlib/ldiv.c6
-rw-r--r--libc-top-half/musl/src/stdlib/llabs.c6
-rw-r--r--libc-top-half/musl/src/stdlib/lldiv.c6
-rw-r--r--libc-top-half/musl/src/stdlib/qsort.c221
-rw-r--r--libc-top-half/musl/src/stdlib/qsort_nr.c14
-rw-r--r--libc-top-half/musl/src/stdlib/strtod.c48
-rw-r--r--libc-top-half/musl/src/stdlib/strtol.c56
-rw-r--r--libc-top-half/musl/src/stdlib/wcstod.c82
-rw-r--r--libc-top-half/musl/src/stdlib/wcstol.c83
-rw-r--r--libc-top-half/musl/src/string/aarch64/memcpy.S186
-rw-r--r--libc-top-half/musl/src/string/aarch64/memset.S115
-rw-r--r--libc-top-half/musl/src/string/arm/__aeabi_memcpy.s45
-rw-r--r--libc-top-half/musl/src/string/arm/__aeabi_memset.s31
-rw-r--r--libc-top-half/musl/src/string/arm/memcpy.S479
-rw-r--r--libc-top-half/musl/src/string/bcmp.c8
-rw-r--r--libc-top-half/musl/src/string/bcopy.c8
-rw-r--r--libc-top-half/musl/src/string/bzero.c8
-rw-r--r--libc-top-half/musl/src/string/explicit_bzero.c8
-rw-r--r--libc-top-half/musl/src/string/i386/memcpy.s32
-rw-r--r--libc-top-half/musl/src/string/i386/memmove.s22
-rw-r--r--libc-top-half/musl/src/string/i386/memset.s76
-rw-r--r--libc-top-half/musl/src/string/index.c8
-rw-r--r--libc-top-half/musl/src/string/memccpy.c34
-rw-r--r--libc-top-half/musl/src/string/memchr.c27
-rw-r--r--libc-top-half/musl/src/string/memcmp.c8
-rw-r--r--libc-top-half/musl/src/string/memcpy.c128
-rw-r--r--libc-top-half/musl/src/string/memmem.c149
-rw-r--r--libc-top-half/musl/src/string/memmove.c46
-rw-r--r--libc-top-half/musl/src/string/mempcpy.c7
-rw-r--r--libc-top-half/musl/src/string/memrchr.c11
-rw-r--r--libc-top-half/musl/src/string/memset.c94
-rw-r--r--libc-top-half/musl/src/string/rindex.c8
-rw-r--r--libc-top-half/musl/src/string/stpcpy.c29
-rw-r--r--libc-top-half/musl/src/string/stpncpy.c32
-rw-r--r--libc-top-half/musl/src/string/strcasecmp.c16
-rw-r--r--libc-top-half/musl/src/string/strcasestr.c9
-rw-r--r--libc-top-half/musl/src/string/strcat.c7
-rw-r--r--libc-top-half/musl/src/string/strchr.c7
-rw-r--r--libc-top-half/musl/src/string/strchrnul.c28
-rw-r--r--libc-top-half/musl/src/string/strcmp.c7
-rw-r--r--libc-top-half/musl/src/string/strcpy.c7
-rw-r--r--libc-top-half/musl/src/string/strcspn.c17
-rw-r--r--libc-top-half/musl/src/string/strdup.c10
-rw-r--r--libc-top-half/musl/src/string/strerror_r.c19
-rw-r--r--libc-top-half/musl/src/string/strlcat.c9
-rw-r--r--libc-top-half/musl/src/string/strlcpy.c34
-rw-r--r--libc-top-half/musl/src/string/strlen.c22
-rw-r--r--libc-top-half/musl/src/string/strncasecmp.c17
-rw-r--r--libc-top-half/musl/src/string/strncat.c10
-rw-r--r--libc-top-half/musl/src/string/strncmp.c9
-rw-r--r--libc-top-half/musl/src/string/strncpy.c7
-rw-r--r--libc-top-half/musl/src/string/strndup.c12
-rw-r--r--libc-top-half/musl/src/string/strnlen.c7
-rw-r--r--libc-top-half/musl/src/string/strpbrk.c7
-rw-r--r--libc-top-half/musl/src/string/strrchr.c6
-rw-r--r--libc-top-half/musl/src/string/strsep.c13
-rw-r--r--libc-top-half/musl/src/string/strsignal.c126
-rw-r--r--libc-top-half/musl/src/string/strspn.c20
-rw-r--r--libc-top-half/musl/src/string/strstr.c154
-rw-r--r--libc-top-half/musl/src/string/strtok.c13
-rw-r--r--libc-top-half/musl/src/string/strtok_r.c12
-rw-r--r--libc-top-half/musl/src/string/strverscmp.c34
-rw-r--r--libc-top-half/musl/src/string/swab.c13
-rw-r--r--libc-top-half/musl/src/string/wcpcpy.c6
-rw-r--r--libc-top-half/musl/src/string/wcpncpy.c6
-rw-r--r--libc-top-half/musl/src/string/wcscasecmp.c7
-rw-r--r--libc-top-half/musl/src/string/wcscasecmp_l.c6
-rw-r--r--libc-top-half/musl/src/string/wcscat.c7
-rw-r--r--libc-top-half/musl/src/string/wcschr.c8
-rw-r--r--libc-top-half/musl/src/string/wcscmp.c7
-rw-r--r--libc-top-half/musl/src/string/wcscpy.c8
-rw-r--r--libc-top-half/musl/src/string/wcscspn.c10
-rw-r--r--libc-top-half/musl/src/string/wcsdup.c10
-rw-r--r--libc-top-half/musl/src/string/wcslen.c8
-rw-r--r--libc-top-half/musl/src/string/wcsncasecmp.c9
-rw-r--r--libc-top-half/musl/src/string/wcsncasecmp_l.c6
-rw-r--r--libc-top-half/musl/src/string/wcsncat.c10
-rw-r--r--libc-top-half/musl/src/string/wcsncmp.c7
-rw-r--r--libc-top-half/musl/src/string/wcsncpy.c9
-rw-r--r--libc-top-half/musl/src/string/wcsnlen.c8
-rw-r--r--libc-top-half/musl/src/string/wcspbrk.c7
-rw-r--r--libc-top-half/musl/src/string/wcsrchr.c8
-rw-r--r--libc-top-half/musl/src/string/wcsspn.c8
-rw-r--r--libc-top-half/musl/src/string/wcsstr.c105
-rw-r--r--libc-top-half/musl/src/string/wcstok.c12
-rw-r--r--libc-top-half/musl/src/string/wcswcs.c6
-rw-r--r--libc-top-half/musl/src/string/wmemchr.c7
-rw-r--r--libc-top-half/musl/src/string/wmemcmp.c7
-rw-r--r--libc-top-half/musl/src/string/wmemcpy.c8
-rw-r--r--libc-top-half/musl/src/string/wmemmove.c13
-rw-r--r--libc-top-half/musl/src/string/wmemset.c8
-rw-r--r--libc-top-half/musl/src/string/x86_64/memcpy.s25
-rw-r--r--libc-top-half/musl/src/string/x86_64/memmove.s16
-rw-r--r--libc-top-half/musl/src/string/x86_64/memset.s72
-rw-r--r--libc-top-half/musl/src/temp/__randname.c18
-rw-r--r--libc-top-half/musl/src/temp/mkdtemp.c23
-rw-r--r--libc-top-half/musl/src/temp/mkostemp.c9
-rw-r--r--libc-top-half/musl/src/temp/mkostemps.c29
-rw-r--r--libc-top-half/musl/src/temp/mkstemp.c8
-rw-r--r--libc-top-half/musl/src/temp/mkstemps.c9
-rw-r--r--libc-top-half/musl/src/temp/mktemp.c30
-rw-r--r--libc-top-half/musl/src/termios/cfgetospeed.c13
-rw-r--r--libc-top-half/musl/src/termios/cfmakeraw.c13
-rw-r--r--libc-top-half/musl/src/termios/cfsetospeed.c22
-rw-r--r--libc-top-half/musl/src/termios/tcdrain.c8
-rw-r--r--libc-top-half/musl/src/termios/tcflow.c7
-rw-r--r--libc-top-half/musl/src/termios/tcflush.c7
-rw-r--r--libc-top-half/musl/src/termios/tcgetattr.c9
-rw-r--r--libc-top-half/musl/src/termios/tcgetsid.c10
-rw-r--r--libc-top-half/musl/src/termios/tcgetwinsize.c8
-rw-r--r--libc-top-half/musl/src/termios/tcsendbreak.c8
-rw-r--r--libc-top-half/musl/src/termios/tcsetattr.c12
-rw-r--r--libc-top-half/musl/src/termios/tcsetwinsize.c8
-rw-r--r--libc-top-half/musl/src/thread/__lock.c62
-rw-r--r--libc-top-half/musl/src/thread/__set_thread_area.c10
-rw-r--r--libc-top-half/musl/src/thread/__syscall_cp.c20
-rw-r--r--libc-top-half/musl/src/thread/__timedwait.c84
-rw-r--r--libc-top-half/musl/src/thread/__tls_get_addr.c7
-rw-r--r--libc-top-half/musl/src/thread/__unmapself.c24
-rw-r--r--libc-top-half/musl/src/thread/__wait.c55
-rw-r--r--libc-top-half/musl/src/thread/aarch64/__set_thread_area.s7
-rw-r--r--libc-top-half/musl/src/thread/aarch64/__unmapself.s7
-rw-r--r--libc-top-half/musl/src/thread/aarch64/clone.s30
-rw-r--r--libc-top-half/musl/src/thread/aarch64/syscall_cp.s32
-rw-r--r--libc-top-half/musl/src/thread/arm/__aeabi_read_tp.s10
-rw-r--r--libc-top-half/musl/src/thread/arm/__set_thread_area.c52
-rw-r--r--libc-top-half/musl/src/thread/arm/__unmapself.s9
-rw-r--r--libc-top-half/musl/src/thread/arm/atomics.s106
-rw-r--r--libc-top-half/musl/src/thread/arm/clone.s28
-rw-r--r--libc-top-half/musl/src/thread/arm/syscall_cp.s29
-rw-r--r--libc-top-half/musl/src/thread/call_once.c7
-rw-r--r--libc-top-half/musl/src/thread/clone.c7
-rw-r--r--libc-top-half/musl/src/thread/cnd_broadcast.c9
-rw-r--r--libc-top-half/musl/src/thread/cnd_destroy.c6
-rw-r--r--libc-top-half/musl/src/thread/cnd_init.c7
-rw-r--r--libc-top-half/musl/src/thread/cnd_signal.c9
-rw-r--r--libc-top-half/musl/src/thread/cnd_timedwait.c14
-rw-r--r--libc-top-half/musl/src/thread/cnd_wait.c9
-rw-r--r--libc-top-half/musl/src/thread/default_attr.c4
-rw-r--r--libc-top-half/musl/src/thread/i386/__set_thread_area.s47
-rw-r--r--libc-top-half/musl/src/thread/i386/__unmapself.s11
-rw-r--r--libc-top-half/musl/src/thread/i386/clone.s49
-rw-r--r--libc-top-half/musl/src/thread/i386/syscall_cp.s41
-rw-r--r--libc-top-half/musl/src/thread/i386/tls.s9
-rw-r--r--libc-top-half/musl/src/thread/lock_ptc.c18
-rw-r--r--libc-top-half/musl/src/thread/m68k/__m68k_read_tp.s8
-rw-r--r--libc-top-half/musl/src/thread/m68k/clone.s25
-rw-r--r--libc-top-half/musl/src/thread/m68k/syscall_cp.s26
-rw-r--r--libc-top-half/musl/src/thread/microblaze/__set_thread_area.s7
-rw-r--r--libc-top-half/musl/src/thread/microblaze/__unmapself.s8
-rw-r--r--libc-top-half/musl/src/thread/microblaze/clone.s30
-rw-r--r--libc-top-half/musl/src/thread/microblaze/syscall_cp.s27
-rw-r--r--libc-top-half/musl/src/thread/mips/__unmapself.s10
-rw-r--r--libc-top-half/musl/src/thread/mips/clone.s36
-rw-r--r--libc-top-half/musl/src/thread/mips/syscall_cp.s53
-rw-r--r--libc-top-half/musl/src/thread/mips64/__unmapself.s9
-rw-r--r--libc-top-half/musl/src/thread/mips64/clone.s34
-rw-r--r--libc-top-half/musl/src/thread/mips64/syscall_cp.s52
-rw-r--r--libc-top-half/musl/src/thread/mipsn32/__unmapself.s9
-rw-r--r--libc-top-half/musl/src/thread/mipsn32/clone.s34
-rw-r--r--libc-top-half/musl/src/thread/mipsn32/syscall_cp.s51
-rw-r--r--libc-top-half/musl/src/thread/mtx_destroy.c5
-rw-r--r--libc-top-half/musl/src/thread/mtx_init.c10
-rw-r--r--libc-top-half/musl/src/thread/mtx_lock.c12
-rw-r--r--libc-top-half/musl/src/thread/mtx_timedlock.c13
-rw-r--r--libc-top-half/musl/src/thread/mtx_trylock.c15
-rw-r--r--libc-top-half/musl/src/thread/mtx_unlock.c10
-rw-r--r--libc-top-half/musl/src/thread/or1k/__set_thread_area.s7
-rw-r--r--libc-top-half/musl/src/thread/or1k/__unmapself.s8
-rw-r--r--libc-top-half/musl/src/thread/or1k/clone.s31
-rw-r--r--libc-top-half/musl/src/thread/or1k/syscall_cp.s29
-rw-r--r--libc-top-half/musl/src/thread/powerpc/__set_thread_area.s12
-rw-r--r--libc-top-half/musl/src/thread/powerpc/__unmapself.s9
-rw-r--r--libc-top-half/musl/src/thread/powerpc/clone.s73
-rw-r--r--libc-top-half/musl/src/thread/powerpc/syscall_cp.s59
-rw-r--r--libc-top-half/musl/src/thread/powerpc64/__set_thread_area.s9
-rw-r--r--libc-top-half/musl/src/thread/powerpc64/__unmapself.s9
-rw-r--r--libc-top-half/musl/src/thread/powerpc64/clone.s48
-rw-r--r--libc-top-half/musl/src/thread/powerpc64/syscall_cp.s44
-rw-r--r--libc-top-half/musl/src/thread/pthread_atfork.c49
-rw-r--r--libc-top-half/musl/src/thread/pthread_attr_destroy.c6
-rw-r--r--libc-top-half/musl/src/thread/pthread_attr_get.c98
-rw-r--r--libc-top-half/musl/src/thread/pthread_attr_init.c11
-rw-r--r--libc-top-half/musl/src/thread/pthread_attr_setdetachstate.c8
-rw-r--r--libc-top-half/musl/src/thread/pthread_attr_setguardsize.c8
-rw-r--r--libc-top-half/musl/src/thread/pthread_attr_setinheritsched.c9
-rw-r--r--libc-top-half/musl/src/thread/pthread_attr_setschedparam.c7
-rw-r--r--libc-top-half/musl/src/thread/pthread_attr_setschedpolicy.c7
-rw-r--r--libc-top-half/musl/src/thread/pthread_attr_setscope.c13
-rw-r--r--libc-top-half/musl/src/thread/pthread_attr_setstack.c9
-rw-r--r--libc-top-half/musl/src/thread/pthread_attr_setstacksize.c9
-rw-r--r--libc-top-half/musl/src/thread/pthread_barrier_destroy.c15
-rw-r--r--libc-top-half/musl/src/thread/pthread_barrier_init.c8
-rw-r--r--libc-top-half/musl/src/thread/pthread_barrier_wait.c111
-rw-r--r--libc-top-half/musl/src/thread/pthread_barrierattr_destroy.c6
-rw-r--r--libc-top-half/musl/src/thread/pthread_barrierattr_init.c7
-rw-r--r--libc-top-half/musl/src/thread/pthread_barrierattr_setpshared.c8
-rw-r--r--libc-top-half/musl/src/thread/pthread_cancel.c101
-rw-r--r--libc-top-half/musl/src/thread/pthread_cleanup_push.c20
-rw-r--r--libc-top-half/musl/src/thread/pthread_cond_broadcast.c10
-rw-r--r--libc-top-half/musl/src/thread/pthread_cond_destroy.c14
-rw-r--r--libc-top-half/musl/src/thread/pthread_cond_init.c11
-rw-r--r--libc-top-half/musl/src/thread/pthread_cond_signal.c10
-rw-r--r--libc-top-half/musl/src/thread/pthread_cond_timedwait.c230
-rw-r--r--libc-top-half/musl/src/thread/pthread_cond_wait.c6
-rw-r--r--libc-top-half/musl/src/thread/pthread_condattr_destroy.c6
-rw-r--r--libc-top-half/musl/src/thread/pthread_condattr_init.c7
-rw-r--r--libc-top-half/musl/src/thread/pthread_condattr_setclock.c21
-rw-r--r--libc-top-half/musl/src/thread/pthread_condattr_setpshared.c9
-rw-r--r--libc-top-half/musl/src/thread/pthread_create.c565
-rw-r--r--libc-top-half/musl/src/thread/pthread_detach.c14
-rw-r--r--libc-top-half/musl/src/thread/pthread_equal.c10
-rw-r--r--libc-top-half/musl/src/thread/pthread_getattr_np.c24
-rw-r--r--libc-top-half/musl/src/thread/pthread_getconcurrency.c6
-rw-r--r--libc-top-half/musl/src/thread/pthread_getcpuclockid.c7
-rw-r--r--libc-top-half/musl/src/thread/pthread_getname_np.c25
-rw-r--r--libc-top-half/musl/src/thread/pthread_getschedparam.c21
-rw-r--r--libc-top-half/musl/src/thread/pthread_getspecific.c11
-rw-r--r--libc-top-half/musl/src/thread/pthread_join.c46
-rw-r--r--libc-top-half/musl/src/thread/pthread_key_create.c95
-rw-r--r--libc-top-half/musl/src/thread/pthread_kill.c18
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutex_consistent.c14
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutex_destroy.c18
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutex_getprioceiling.c6
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutex_init.c8
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutex_lock.c12
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutex_setprioceiling.c6
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutex_timedlock.c96
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutex_trylock.c78
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutex_unlock.c60
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutexattr_destroy.c6
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutexattr_init.c7
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutexattr_setprotocol.c32
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutexattr_setpshared.c9
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutexattr_setrobust.c27
-rw-r--r--libc-top-half/musl/src/thread/pthread_mutexattr_settype.c8
-rw-r--r--libc-top-half/musl/src/thread/pthread_once.c50
-rw-r--r--libc-top-half/musl/src/thread/pthread_rwlock_destroy.c6
-rw-r--r--libc-top-half/musl/src/thread/pthread_rwlock_init.c8
-rw-r--r--libc-top-half/musl/src/thread/pthread_rwlock_rdlock.c8
-rw-r--r--libc-top-half/musl/src/thread/pthread_rwlock_timedrdlock.c25
-rw-r--r--libc-top-half/musl/src/thread/pthread_rwlock_timedwrlock.c25
-rw-r--r--libc-top-half/musl/src/thread/pthread_rwlock_tryrdlock.c15
-rw-r--r--libc-top-half/musl/src/thread/pthread_rwlock_trywrlock.c9
-rw-r--r--libc-top-half/musl/src/thread/pthread_rwlock_unlock.c20
-rw-r--r--libc-top-half/musl/src/thread/pthread_rwlock_wrlock.c8
-rw-r--r--libc-top-half/musl/src/thread/pthread_rwlockattr_destroy.c6
-rw-r--r--libc-top-half/musl/src/thread/pthread_rwlockattr_init.c7
-rw-r--r--libc-top-half/musl/src/thread/pthread_rwlockattr_setpshared.c8
-rw-r--r--libc-top-half/musl/src/thread/pthread_self.c15
-rw-r--r--libc-top-half/musl/src/thread/pthread_setattr_default_np.c37
-rw-r--r--libc-top-half/musl/src/thread/pthread_setcancelstate.c14
-rw-r--r--libc-top-half/musl/src/thread/pthread_setcanceltype.c11
-rw-r--r--libc-top-half/musl/src/thread/pthread_setconcurrency.c9
-rw-r--r--libc-top-half/musl/src/thread/pthread_setname_np.c26
-rw-r--r--libc-top-half/musl/src/thread/pthread_setschedparam.c14
-rw-r--r--libc-top-half/musl/src/thread/pthread_setschedprio.c14
-rw-r--r--libc-top-half/musl/src/thread/pthread_setspecific.c12
-rw-r--r--libc-top-half/musl/src/thread/pthread_sigmask.c19
-rw-r--r--libc-top-half/musl/src/thread/pthread_spin_destroy.c6
-rw-r--r--libc-top-half/musl/src/thread/pthread_spin_init.c6
-rw-r--r--libc-top-half/musl/src/thread/pthread_spin_lock.c8
-rw-r--r--libc-top-half/musl/src/thread/pthread_spin_trylock.c7
-rw-r--r--libc-top-half/musl/src/thread/pthread_spin_unlock.c7
-rw-r--r--libc-top-half/musl/src/thread/pthread_testcancel.c14
-rw-r--r--libc-top-half/musl/src/thread/riscv64/__set_thread_area.s6
-rw-r--r--libc-top-half/musl/src/thread/riscv64/__unmapself.s7
-rw-r--r--libc-top-half/musl/src/thread/riscv64/clone.s34
-rw-r--r--libc-top-half/musl/src/thread/riscv64/syscall_cp.s29
-rw-r--r--libc-top-half/musl/src/thread/s390x/__set_thread_area.s10
-rw-r--r--libc-top-half/musl/src/thread/s390x/__tls_get_offset.s17
-rw-r--r--libc-top-half/musl/src/thread/s390x/__unmapself.s6
-rw-r--r--libc-top-half/musl/src/thread/s390x/clone.s54
-rw-r--r--libc-top-half/musl/src/thread/s390x/syscall_cp.s34
-rw-r--r--libc-top-half/musl/src/thread/sem_destroy.c6
-rw-r--r--libc-top-half/musl/src/thread/sem_getvalue.c8
-rw-r--r--libc-top-half/musl/src/thread/sem_init.c15
-rw-r--r--libc-top-half/musl/src/thread/sem_open.c182
-rw-r--r--libc-top-half/musl/src/thread/sem_post.c17
-rw-r--r--libc-top-half/musl/src/thread/sem_timedwait.c31
-rw-r--r--libc-top-half/musl/src/thread/sem_trywait.c13
-rw-r--r--libc-top-half/musl/src/thread/sem_unlink.c7
-rw-r--r--libc-top-half/musl/src/thread/sem_wait.c6
-rw-r--r--libc-top-half/musl/src/thread/sh/__set_thread_area.c37
-rw-r--r--libc-top-half/musl/src/thread/sh/__unmapself.c24
-rw-r--r--libc-top-half/musl/src/thread/sh/__unmapself_mmu.s23
-rw-r--r--libc-top-half/musl/src/thread/sh/atomics.s65
-rw-r--r--libc-top-half/musl/src/thread/sh/clone.s54
-rw-r--r--libc-top-half/musl/src/thread/sh/syscall_cp.s45
-rw-r--r--libc-top-half/musl/src/thread/synccall.c120
-rw-r--r--libc-top-half/musl/src/thread/syscall_cp.c0
-rw-r--r--libc-top-half/musl/src/thread/thrd_create.c12
-rw-r--r--libc-top-half/musl/src/thread/thrd_exit.c8
-rw-r--r--libc-top-half/musl/src/thread/thrd_join.c11
-rw-r--r--libc-top-half/musl/src/thread/thrd_sleep.c14
-rw-r--r--libc-top-half/musl/src/thread/thrd_yield.c7
-rw-r--r--libc-top-half/musl/src/thread/tls.c0
-rw-r--r--libc-top-half/musl/src/thread/tss_create.c10
-rw-r--r--libc-top-half/musl/src/thread/tss_delete.c7
-rw-r--r--libc-top-half/musl/src/thread/tss_set.c13
-rw-r--r--libc-top-half/musl/src/thread/vmlock.c23
-rw-r--r--libc-top-half/musl/src/thread/x32/__set_thread_area.s11
-rw-r--r--libc-top-half/musl/src/thread/x32/__unmapself.s10
-rw-r--r--libc-top-half/musl/src/thread/x32/clone.s26
-rw-r--r--libc-top-half/musl/src/thread/x32/syscall_cp.s31
-rw-r--r--libc-top-half/musl/src/thread/x86_64/__set_thread_area.s11
-rw-r--r--libc-top-half/musl/src/thread/x86_64/__unmapself.s10
-rw-r--r--libc-top-half/musl/src/thread/x86_64/clone.s28
-rw-r--r--libc-top-half/musl/src/thread/x86_64/syscall_cp.s31
-rw-r--r--libc-top-half/musl/src/time/__map_file.c19
-rw-r--r--libc-top-half/musl/src/time/__month_to_secs.c10
-rw-r--r--libc-top-half/musl/src/time/__secs_to_tm.c82
-rw-r--r--libc-top-half/musl/src/time/__tm_to_secs.c24
-rw-r--r--libc-top-half/musl/src/time/__tz.c456
-rw-r--r--libc-top-half/musl/src/time/__year_to_secs.c47
-rw-r--r--libc-top-half/musl/src/time/asctime.c7
-rw-r--r--libc-top-half/musl/src/time/asctime_r.c28
-rw-r--r--libc-top-half/musl/src/time/clock.c16
-rw-r--r--libc-top-half/musl/src/time/clock_getcpuclockid.c14
-rw-r--r--libc-top-half/musl/src/time/clock_getres.c21
-rw-r--r--libc-top-half/musl/src/time/clock_gettime.c107
-rw-r--r--libc-top-half/musl/src/time/clock_nanosleep.c38
-rw-r--r--libc-top-half/musl/src/time/clock_settime.c24
-rw-r--r--libc-top-half/musl/src/time/ctime.c8
-rw-r--r--libc-top-half/musl/src/time/ctime_r.c7
-rw-r--r--libc-top-half/musl/src/time/difftime.c6
-rw-r--r--libc-top-half/musl/src/time/ftime.c12
-rw-r--r--libc-top-half/musl/src/time/getdate.c52
-rw-r--r--libc-top-half/musl/src/time/gettimeofday.c13
-rw-r--r--libc-top-half/musl/src/time/gmtime.c8
-rw-r--r--libc-top-half/musl/src/time/gmtime_r.c16
-rw-r--r--libc-top-half/musl/src/time/localtime.c7
-rw-r--r--libc-top-half/musl/src/time/localtime_r.c21
-rw-r--r--libc-top-half/musl/src/time/mktime.c28
-rw-r--r--libc-top-half/musl/src/time/nanosleep.c7
-rw-r--r--libc-top-half/musl/src/time/strftime.c285
-rw-r--r--libc-top-half/musl/src/time/strptime.c206
-rw-r--r--libc-top-half/musl/src/time/time.c10
-rw-r--r--libc-top-half/musl/src/time/time_impl.h15
-rw-r--r--libc-top-half/musl/src/time/timegm.c18
-rw-r--r--libc-top-half/musl/src/time/timer_create.c129
-rw-r--r--libc-top-half/musl/src/time/timer_delete.c14
-rw-r--r--libc-top-half/musl/src/time/timer_getoverrun.c12
-rw-r--r--libc-top-half/musl/src/time/timer_gettime.c28
-rw-r--r--libc-top-half/musl/src/time/timer_settime.c37
-rw-r--r--libc-top-half/musl/src/time/times.c7
-rw-r--r--libc-top-half/musl/src/time/timespec_get.c10
-rw-r--r--libc-top-half/musl/src/time/utime.c11
-rw-r--r--libc-top-half/musl/src/time/wcsftime.c71
-rw-r--r--libc-top-half/musl/src/unistd/_exit.c7
-rw-r--r--libc-top-half/musl/src/unistd/access.c12
-rw-r--r--libc-top-half/musl/src/unistd/acct.c8
-rw-r--r--libc-top-half/musl/src/unistd/alarm.c10
-rw-r--r--libc-top-half/musl/src/unistd/chdir.c7
-rw-r--r--libc-top-half/musl/src/unistd/chown.c12
-rw-r--r--libc-top-half/musl/src/unistd/close.c19
-rw-r--r--libc-top-half/musl/src/unistd/ctermid.c7
-rw-r--r--libc-top-half/musl/src/unistd/dup.c7
-rw-r--r--libc-top-half/musl/src/unistd/dup2.c20
-rw-r--r--libc-top-half/musl/src/unistd/dup3.c24
-rw-r--r--libc-top-half/musl/src/unistd/faccessat.c61
-rw-r--r--libc-top-half/musl/src/unistd/fchdir.c15
-rw-r--r--libc-top-half/musl/src/unistd/fchown.c20
-rw-r--r--libc-top-half/musl/src/unistd/fchownat.c7
-rw-r--r--libc-top-half/musl/src/unistd/fdatasync.c7
-rw-r--r--libc-top-half/musl/src/unistd/fsync.c7
-rw-r--r--libc-top-half/musl/src/unistd/ftruncate.c9
-rw-r--r--libc-top-half/musl/src/unistd/getcwd.c25
-rw-r--r--libc-top-half/musl/src/unistd/getegid.c7
-rw-r--r--libc-top-half/musl/src/unistd/geteuid.c7
-rw-r--r--libc-top-half/musl/src/unistd/getgid.c7
-rw-r--r--libc-top-half/musl/src/unistd/getgroups.c7
-rw-r--r--libc-top-half/musl/src/unistd/gethostname.c13
-rw-r--r--libc-top-half/musl/src/unistd/getlogin.c7
-rw-r--r--libc-top-half/musl/src/unistd/getlogin_r.c12
-rw-r--r--libc-top-half/musl/src/unistd/getpgid.c7
-rw-r--r--libc-top-half/musl/src/unistd/getpgrp.c7
-rw-r--r--libc-top-half/musl/src/unistd/getpid.c7
-rw-r--r--libc-top-half/musl/src/unistd/getppid.c7
-rw-r--r--libc-top-half/musl/src/unistd/getsid.c7
-rw-r--r--libc-top-half/musl/src/unistd/getuid.c7
-rw-r--r--libc-top-half/musl/src/unistd/isatty.c13
-rw-r--r--libc-top-half/musl/src/unistd/lchown.c12
-rw-r--r--libc-top-half/musl/src/unistd/link.c12
-rw-r--r--libc-top-half/musl/src/unistd/linkat.c7
-rw-r--r--libc-top-half/musl/src/unistd/lseek.c23
-rw-r--r--libc-top-half/musl/src/unistd/mips/pipe.s20
-rw-r--r--libc-top-half/musl/src/unistd/mips64/pipe.s19
-rw-r--r--libc-top-half/musl/src/unistd/mipsn32/lseek.c20
-rw-r--r--libc-top-half/musl/src/unistd/mipsn32/pipe.s19
-rw-r--r--libc-top-half/musl/src/unistd/nice.c23
-rw-r--r--libc-top-half/musl/src/unistd/pause.c11
-rw-r--r--libc-top-half/musl/src/unistd/pipe.c11
-rw-r--r--libc-top-half/musl/src/unistd/pipe2.c22
-rw-r--r--libc-top-half/musl/src/unistd/posix_close.c6
-rw-r--r--libc-top-half/musl/src/unistd/pread.c9
-rw-r--r--libc-top-half/musl/src/unistd/preadv.c12
-rw-r--r--libc-top-half/musl/src/unistd/pwrite.c9
-rw-r--r--libc-top-half/musl/src/unistd/pwritev.c12
-rw-r--r--libc-top-half/musl/src/unistd/read.c7
-rw-r--r--libc-top-half/musl/src/unistd/readlink.c19
-rw-r--r--libc-top-half/musl/src/unistd/readlinkat.c14
-rw-r--r--libc-top-half/musl/src/unistd/readv.c7
-rw-r--r--libc-top-half/musl/src/unistd/renameat.c11
-rw-r--r--libc-top-half/musl/src/unistd/rmdir.c12
-rw-r--r--libc-top-half/musl/src/unistd/setegid.c8
-rw-r--r--libc-top-half/musl/src/unistd/seteuid.c8
-rw-r--r--libc-top-half/musl/src/unistd/setgid.c8
-rw-r--r--libc-top-half/musl/src/unistd/setpgid.c7
-rw-r--r--libc-top-half/musl/src/unistd/setpgrp.c6
-rw-r--r--libc-top-half/musl/src/unistd/setregid.c8
-rw-r--r--libc-top-half/musl/src/unistd/setresgid.c9
-rw-r--r--libc-top-half/musl/src/unistd/setresuid.c9
-rw-r--r--libc-top-half/musl/src/unistd/setreuid.c8
-rw-r--r--libc-top-half/musl/src/unistd/setsid.c7
-rw-r--r--libc-top-half/musl/src/unistd/setuid.c8
-rw-r--r--libc-top-half/musl/src/unistd/setxid.c34
-rw-r--r--libc-top-half/musl/src/unistd/sh/pipe.s27
-rw-r--r--libc-top-half/musl/src/unistd/sleep.c10
-rw-r--r--libc-top-half/musl/src/unistd/symlink.c12
-rw-r--r--libc-top-half/musl/src/unistd/symlinkat.c7
-rw-r--r--libc-top-half/musl/src/unistd/sync.c7
-rw-r--r--libc-top-half/musl/src/unistd/tcgetpgrp.c11
-rw-r--r--libc-top-half/musl/src/unistd/tcsetpgrp.c9
-rw-r--r--libc-top-half/musl/src/unistd/truncate.c9
-rw-r--r--libc-top-half/musl/src/unistd/ttyname.c14
-rw-r--r--libc-top-half/musl/src/unistd/ttyname_r.c28
-rw-r--r--libc-top-half/musl/src/unistd/ualarm.c13
-rw-r--r--libc-top-half/musl/src/unistd/unlink.c12
-rw-r--r--libc-top-half/musl/src/unistd/unlinkat.c7
-rw-r--r--libc-top-half/musl/src/unistd/usleep.c12
-rw-r--r--libc-top-half/musl/src/unistd/write.c7
-rw-r--r--libc-top-half/musl/src/unistd/writev.c7
-rw-r--r--libc-top-half/musl/src/unistd/x32/lseek.c15
-rw-r--r--libc-top-half/musl/tools/add-cfi.common.awk26
-rw-r--r--libc-top-half/musl/tools/add-cfi.i386.awk209
-rw-r--r--libc-top-half/musl/tools/add-cfi.x86_64.awk196
-rwxr-xr-xlibc-top-half/musl/tools/install.sh64
-rw-r--r--libc-top-half/musl/tools/ld.musl-clang.in51
-rw-r--r--libc-top-half/musl/tools/mkalltypes.sed15
-rw-r--r--libc-top-half/musl/tools/musl-clang.in35
-rw-r--r--libc-top-half/musl/tools/musl-gcc.specs.sh37
-rw-r--r--libc-top-half/musl/tools/version.sh12
-rw-r--r--libc-top-half/sources/arc4random.c160
-rw-r--r--test/.gitignore3
-rw-r--r--test/Makefile175
-rw-r--r--test/README.md6
-rw-r--r--tools/wasi-headers/.gitignore2
-rw-r--r--tools/wasi-headers/Cargo.toml16
-rw-r--r--tools/wasi-headers/LICENSE220
-rw-r--r--tools/wasi-headers/src/c_header.rs874
-rw-r--r--tools/wasi-headers/src/lib.rs39
-rw-r--r--tools/wasi-headers/src/main.rs61
-rw-r--r--tools/wasi-headers/tests/verify.rs95
2882 files changed, 155757 insertions, 0 deletions
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..aa2b1b7
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,4 @@
+# Se publish headers and other files from the repo, and we don't want
+# them differing depending on the line-ending style of the host they
+# were checked out on.
+* text eol=lf
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 0000000..83c2751
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,141 @@
+name: CI
+on: [push, pull_request]
+
+jobs:
+ buildlibc:
+ name: Build libc
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-latest, macos-latest, windows-latest]
+ # oldest and newest supported LLVM version
+ clang_version: [10.0.0, 14.0.0]
+ steps:
+ - uses: actions/checkout@v1
+ with:
+ submodules: true
+
+ - name: Install libtinfo5
+ run: |
+ set -ex
+ sudo apt-get update
+ sudo apt-get install -y libtinfo5
+ if: matrix.os == 'ubuntu-latest'
+
+ - name: Install LLVM tools (Windows)
+ shell: bash
+ run: |
+ curl -fsSLO https://github.com/llvm/llvm-project/releases/download/llvmorg-${{ matrix.clang_version }}/LLVM-${{ matrix.clang_version }}-win64.exe
+ 7z x LLVM-${{ matrix.clang_version }}-win64.exe -y -o"llvm"
+ echo "$(pwd)/llvm/bin" >> $GITHUB_PATH
+ echo "CC=$(pwd)/llvm/bin/clang.exe" >> $GITHUB_ENV
+ echo "AR=$(pwd)/llvm/bin/llvm-ar.exe" >> $GITHUB_ENV
+ echo "NM=$(pwd)/llvm/bin/llvm-nm.exe" >> $GITHUB_ENV
+ if: matrix.os == 'windows-latest'
+
+ - name: Override llvm-nm with one from rustup (Windows)
+ run: |
+ rustup update stable
+ rustup default stable
+ rustup component add llvm-tools-preview
+ echo "NM=$(rustc --print sysroot|sed 's|C:|/c|'|sed 's|\\|/|g')/lib/rustlib/x86_64-pc-windows-msvc/bin/llvm-nm.exe" >> $GITHUB_ENV
+ if: matrix.os == 'windows-latest'
+
+ - name: Install LLVM tools (MacOS)
+ shell: bash
+ run: |
+ curl -sSfL https://github.com/llvm/llvm-project/releases/download/llvmorg-${{ matrix.clang_version }}/clang+llvm-${{ matrix.clang_version }}-x86_64-apple-darwin.tar.xz | tar xJf -
+ export CLANG_DIR=`pwd`/clang+llvm-${{ matrix.clang_version }}-x86_64-apple-darwin/bin
+ echo "$CLANG_DIR" >> $GITHUB_PATH
+ echo "CC=$CLANG_DIR/clang" >> $GITHUB_ENV
+ echo "AR=$CLANG_DIR/llvm-ar" >> $GITHUB_ENV
+ echo "NM=$CLANG_DIR/llvm-nm" >> $GITHUB_ENV
+ if: matrix.os == 'macos-latest'
+
+ - name: Install LLVM tools (Linux)
+ shell: bash
+ run: |
+ curl -sSfL https://github.com/llvm/llvm-project/releases/download/llvmorg-${{ matrix.clang_version }}/clang+llvm-${{ matrix.clang_version }}-x86_64-linux-gnu-ubuntu-18.04.tar.xz | tar xJf -
+ export CLANG_DIR=`pwd`/clang+llvm-${{ matrix.clang_version }}-x86_64-linux-gnu-ubuntu-18.04/bin
+ echo "$CLANG_DIR" >> $GITHUB_PATH
+ echo "CLANG_DIR=$CLANG_DIR" >> $GITHUB_ENV
+ echo "CC=$CLANG_DIR/clang" >> $GITHUB_ENV
+ echo "AR=$CLANG_DIR/llvm-ar" >> $GITHUB_ENV
+ echo "NM=$CLANG_DIR/llvm-nm" >> $GITHUB_ENV
+ if: matrix.os == 'ubuntu-latest'
+
+ - name: Build libc
+ shell: bash
+ run: make -j4
+
+ - name: Test
+ shell: bash
+ # For Clang linking to work correctly, we need to place Clang's runtime
+ # library for `wasm32-wasi` in the right location (i.e., the `mkdir` and
+ # `cp` below).
+ run: |
+ cd test
+ make download
+ export WASI_DIR=$(realpath $CLANG_DIR/../lib/clang/${{ matrix.clang_version }}/lib/wasi/)
+ mkdir -p $WASI_DIR
+ cp download/lib/wasi/libclang_rt.builtins-wasm32.a $WASI_DIR
+ make test
+ # The older version of Clang does not provide the expected symbol for the
+ # test entrypoints: `undefined symbol: __main_argc_argv`.
+ if: matrix.os == 'ubuntu-latest' && matrix.clang_version != '10.0.0'
+
+ - uses: actions/upload-artifact@v1
+ with:
+ # Upload the sysroot folder. Give it a name according to the OS it was built for.
+ name: ${{ format( 'sysroot-{0}.tgz', matrix.os) }}
+ path: sysroot
+
+ - name: Build libc + threads
+ # Only build the thread-capable wasi-libc in the latest supported Clang
+ # version; the earliest version does not have all necessary builtins
+ # (e.g., `__builtin_wasm_memory_atomic_notify`).
+ if: matrix.clang_version != '10.0.0'
+ shell: bash
+ run: make -j4 THREAD_MODEL=posix
+
+ # Disable the headerstest job for now, while WASI transitions from the
+ # witx snapshots to wit proposals, and we have a few manual edits to the
+ # generated header to make life easier for folks.
+ headerstest:
+ if: ${{ false }} # Disable the headers test for now.
+ name: wasi-headers test
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-latest, macos-latest, windows-latest]
+ steps:
+ - uses: actions/checkout@v1
+ with:
+ submodules: true
+ - name: Install Rust (rustup)
+ shell: bash
+ run: rustup update stable --no-self-update && rustup default stable
+ if: matrix.os != 'macos-latest'
+ - name: Install Rust (macos)
+ run: |
+ curl https://sh.rustup.rs | sh -s -- -y
+ echo "$HOME/.cargo/bin" >> $GITHUB_PATH
+ if: matrix.os == 'macos-latest'
+ - run: cargo fetch
+ working-directory: tools/wasi-headers
+ - run: cargo build
+ working-directory: tools/wasi-headers
+ - run: cargo test
+ working-directory: tools/wasi-headers
+
+ rustfmt:
+ name: Rustfmt
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v1
+ with:
+ submodules: true
+ - name: Install Rust
+ run: rustup update stable && rustup default stable && rustup component add rustfmt
+ - run: cargo fmt -- --check
+ working-directory: tools/wasi-headers
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3af68b6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+sysroot
+build
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..1db3f0b
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "tools/wasi-headers/WASI"]
+ path = tools/wasi-headers/WASI
+ url = https://github.com/WebAssembly/WASI
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..38ef2ef
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,46 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at either sunfish@mozilla.com or tyler@fastly.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..b0bfe6c
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,16 @@
+wasi-libc as a whole is multi-licensed under the
+Apache License v2.0 with LLVM Exceptions, the Apache License v2.0, and
+the MIT License. See the LICENSE-APACHE-LLVM, LICENSE-APACHE and LICENSE-MIT
+files, respectively, for details.
+
+Portions of this software are derived from third-party works covered by
+their own licenses:
+
+dlmalloc/ - CC0; see the notice in malloc.c for details
+emmalloc/ - MIT; see the notice in emmalloc.c for details
+libc-bottom-half/cloudlibc/ - BSD-2-Clause; see the LICENSE file for details
+libc-top-half/musl/ - MIT; see the COPYRIGHT file for details
+
+wasi-libc's changes to these files are multi-licensed under the
+Apache License v2.0 with LLVM Exceptions, the Apache License v2.0,
+the MIT License, and the original licenses of the third-party works.
diff --git a/LICENSE-APACHE b/LICENSE-APACHE
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/LICENSE-APACHE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/LICENSE-APACHE-LLVM b/LICENSE-APACHE-LLVM
new file mode 100644
index 0000000..f9d8195
--- /dev/null
+++ b/LICENSE-APACHE-LLVM
@@ -0,0 +1,220 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+--- LLVM Exceptions to the Apache 2.0 License ----
+
+As an exception, if, as a result of your compiling your source code, portions
+of this Software are embedded into an Object form of such source code, you
+may redistribute such embedded portions in such Object form without complying
+with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
+
+In addition, if you combine or link compiled forms of this Software with
+software that is licensed under the GPLv2 ("Combined Software") and if a
+court of competent jurisdiction determines that the patent provision (Section
+3), the indemnity provision (Section 9) or other Section of the License
+conflicts with the conditions of the GPLv2, you may retroactively and
+prospectively choose to deem waived or otherwise exclude such Section(s) of
+the License, but only in their entirety and only with respect to the Combined
+Software.
+
diff --git a/LICENSE-MIT b/LICENSE-MIT
new file mode 100644
index 0000000..31aa793
--- /dev/null
+++ b/LICENSE-MIT
@@ -0,0 +1,23 @@
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..37551cb
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,691 @@
+# These variables are specifically meant to be overridable via the make
+# command-line.
+# ?= doesn't work for CC and AR because make has a default value for them.
+ifeq ($(origin CC), default)
+CC := clang
+endif
+NM ?= $(patsubst %clang,%llvm-nm,$(filter-out ccache sccache,$(CC)))
+ifeq ($(origin AR), default)
+AR = $(patsubst %clang,%llvm-ar,$(filter-out ccache sccache,$(CC)))
+endif
+EXTRA_CFLAGS ?= -O2 -DNDEBUG
+# The directory where we build the sysroot.
+SYSROOT ?= $(CURDIR)/sysroot
+# A directory to install to for "make install".
+INSTALL_DIR ?= /usr/local
+# single or posix; note that pthread support is still a work-in-progress.
+THREAD_MODEL ?= single
+# dlmalloc or none
+MALLOC_IMPL ?= dlmalloc
+# yes or no
+BUILD_LIBC_TOP_HALF ?= yes
+# The directory where we will store intermediate artifacts.
+OBJDIR ?= $(CURDIR)/build
+
+# When the length is no larger than this threshold, we consider the
+# overhead of bulk memory opcodes to outweigh the performance benefit,
+# and fall back to the original musl implementation. See
+# https://github.com/WebAssembly/wasi-libc/pull/263 for relevant
+# discussion
+BULK_MEMORY_THRESHOLD ?= 32
+
+# Variables from this point on are not meant to be overridable via the
+# make command-line.
+
+# Set the target variables. Multiarch triples notably omit the vendor field,
+# which happens to be what we do for the main target triple too.
+TARGET_TRIPLE = wasm32-wasi
+MULTIARCH_TRIPLE = wasm32-wasi
+
+# These variables describe the locations of various files and directories in
+# the source tree.
+DLMALLOC_DIR = $(CURDIR)/dlmalloc
+DLMALLOC_SRC_DIR = $(DLMALLOC_DIR)/src
+DLMALLOC_SOURCES = $(DLMALLOC_SRC_DIR)/dlmalloc.c
+DLMALLOC_INC = $(DLMALLOC_DIR)/include
+EMMALLOC_DIR = $(CURDIR)/emmalloc
+EMMALLOC_SOURCES = $(EMMALLOC_DIR)/emmalloc.c
+LIBC_BOTTOM_HALF_DIR = $(CURDIR)/libc-bottom-half
+LIBC_BOTTOM_HALF_CLOUDLIBC_SRC = $(LIBC_BOTTOM_HALF_DIR)/cloudlibc/src
+LIBC_BOTTOM_HALF_CLOUDLIBC_SRC_INC = $(LIBC_BOTTOM_HALF_CLOUDLIBC_SRC)/include
+LIBC_BOTTOM_HALF_HEADERS_PUBLIC = $(LIBC_BOTTOM_HALF_DIR)/headers/public
+LIBC_BOTTOM_HALF_HEADERS_PRIVATE = $(LIBC_BOTTOM_HALF_DIR)/headers/private
+LIBC_BOTTOM_HALF_SOURCES = $(LIBC_BOTTOM_HALF_DIR)/sources
+LIBC_BOTTOM_HALF_ALL_SOURCES = \
+ $(sort \
+ $(shell find $(LIBC_BOTTOM_HALF_CLOUDLIBC_SRC) -name \*.c) \
+ $(shell find $(LIBC_BOTTOM_HALF_SOURCES) -name \*.c))
+
+# FIXME(https://reviews.llvm.org/D85567) - due to a bug in LLD the weak
+# references to a function defined in `chdir.c` only work if `chdir.c` is at the
+# end of the archive, but once that LLD review lands and propagates into LLVM
+# then we don't have to do this.
+LIBC_BOTTOM_HALF_ALL_SOURCES := $(filter-out $(LIBC_BOTTOM_HALF_SOURCES)/chdir.c,$(LIBC_BOTTOM_HALF_ALL_SOURCES))
+LIBC_BOTTOM_HALF_ALL_SOURCES := $(LIBC_BOTTOM_HALF_ALL_SOURCES) $(LIBC_BOTTOM_HALF_SOURCES)/chdir.c
+
+LIBWASI_EMULATED_MMAN_SOURCES = \
+ $(sort $(shell find $(LIBC_BOTTOM_HALF_DIR)/mman -name \*.c))
+LIBWASI_EMULATED_PROCESS_CLOCKS_SOURCES = \
+ $(sort $(shell find $(LIBC_BOTTOM_HALF_DIR)/clocks -name \*.c))
+LIBWASI_EMULATED_GETPID_SOURCES = \
+ $(sort $(shell find $(LIBC_BOTTOM_HALF_DIR)/getpid -name \*.c))
+LIBWASI_EMULATED_SIGNAL_SOURCES = \
+ $(sort $(shell find $(LIBC_BOTTOM_HALF_DIR)/signal -name \*.c))
+LIBWASI_EMULATED_SIGNAL_MUSL_SOURCES = \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/signal/psignal.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/string/strsignal.c
+LIBC_BOTTOM_HALF_CRT_SOURCES = $(wildcard $(LIBC_BOTTOM_HALF_DIR)/crt/*.c)
+LIBC_TOP_HALF_DIR = $(CURDIR)/libc-top-half
+LIBC_TOP_HALF_MUSL_DIR = $(LIBC_TOP_HALF_DIR)/musl
+LIBC_TOP_HALF_MUSL_SRC_DIR = $(LIBC_TOP_HALF_MUSL_DIR)/src
+LIBC_TOP_HALF_MUSL_INC = $(LIBC_TOP_HALF_MUSL_DIR)/include
+LIBC_TOP_HALF_MUSL_SOURCES = \
+ $(addprefix $(LIBC_TOP_HALF_MUSL_SRC_DIR)/, \
+ misc/a64l.c \
+ misc/basename.c \
+ misc/dirname.c \
+ misc/ffs.c \
+ misc/ffsl.c \
+ misc/ffsll.c \
+ misc/fmtmsg.c \
+ misc/getdomainname.c \
+ misc/gethostid.c \
+ misc/getopt.c \
+ misc/getopt_long.c \
+ misc/getsubopt.c \
+ misc/uname.c \
+ misc/nftw.c \
+ errno/strerror.c \
+ network/htonl.c \
+ network/htons.c \
+ network/ntohl.c \
+ network/ntohs.c \
+ network/inet_ntop.c \
+ network/inet_pton.c \
+ network/inet_aton.c \
+ network/in6addr_any.c \
+ network/in6addr_loopback.c \
+ fenv/fenv.c \
+ fenv/fesetround.c \
+ fenv/feupdateenv.c \
+ fenv/fesetexceptflag.c \
+ fenv/fegetexceptflag.c \
+ fenv/feholdexcept.c \
+ exit/exit.c \
+ exit/atexit.c \
+ exit/assert.c \
+ exit/quick_exit.c \
+ exit/at_quick_exit.c \
+ time/strftime.c \
+ time/asctime.c \
+ time/asctime_r.c \
+ time/ctime.c \
+ time/ctime_r.c \
+ time/wcsftime.c \
+ time/strptime.c \
+ time/difftime.c \
+ time/timegm.c \
+ time/ftime.c \
+ time/gmtime.c \
+ time/gmtime_r.c \
+ time/timespec_get.c \
+ time/getdate.c \
+ time/localtime.c \
+ time/localtime_r.c \
+ time/mktime.c \
+ time/__tm_to_secs.c \
+ time/__month_to_secs.c \
+ time/__secs_to_tm.c \
+ time/__year_to_secs.c \
+ time/__tz.c \
+ fcntl/creat.c \
+ dirent/alphasort.c \
+ dirent/versionsort.c \
+ env/__stack_chk_fail.c \
+ env/clearenv.c \
+ env/getenv.c \
+ env/putenv.c \
+ env/setenv.c \
+ env/unsetenv.c \
+ unistd/posix_close.c \
+ stat/futimesat.c \
+ legacy/getpagesize.c \
+ thread/thrd_sleep.c \
+ ) \
+ $(filter-out %/procfdname.c %/syscall.c %/syscall_ret.c %/vdso.c %/version.c, \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/internal/*.c)) \
+ $(filter-out %/flockfile.c %/funlockfile.c %/__lockfile.c %/ftrylockfile.c \
+ %/rename.c \
+ %/tmpnam.c %/tmpfile.c %/tempnam.c \
+ %/popen.c %/pclose.c \
+ %/remove.c \
+ %/gets.c, \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/stdio/*.c)) \
+ $(filter-out %/strsignal.c, \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/string/*.c)) \
+ $(filter-out %/dcngettext.c %/textdomain.c %/bind_textdomain_codeset.c, \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/locale/*.c)) \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/stdlib/*.c) \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/search/*.c) \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/multibyte/*.c) \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/regex/*.c) \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/prng/*.c) \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/conf/*.c) \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/ctype/*.c) \
+ $(filter-out %/__signbit.c %/__signbitf.c %/__signbitl.c \
+ %/__fpclassify.c %/__fpclassifyf.c %/__fpclassifyl.c \
+ %/ceilf.c %/ceil.c \
+ %/floorf.c %/floor.c \
+ %/truncf.c %/trunc.c \
+ %/rintf.c %/rint.c \
+ %/nearbyintf.c %/nearbyint.c \
+ %/sqrtf.c %/sqrt.c \
+ %/fabsf.c %/fabs.c \
+ %/copysignf.c %/copysign.c \
+ %/fminf.c %/fmaxf.c \
+ %/fmin.c %/fmax.c, \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/math/*.c)) \
+ $(filter-out %/crealf.c %/creal.c %creall.c \
+ %/cimagf.c %/cimag.c %cimagl.c, \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/complex/*.c)) \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/crypt/*.c)
+
+ifeq ($(THREAD_MODEL), posix)
+LIBC_TOP_HALF_MUSL_SOURCES += \
+ $(addprefix $(LIBC_TOP_HALF_MUSL_SRC_DIR)/, \
+ env/__init_tls.c \
+ stdio/__lockfile.c \
+ thread/__lock.c \
+ thread/__wait.c \
+ thread/__timedwait.c \
+ thread/default_attr.c \
+ thread/pthread_attr_destroy.c \
+ thread/pthread_attr_init.c \
+ thread/pthread_attr_setstack.c \
+ thread/pthread_attr_setstacksize.c \
+ thread/pthread_cleanup_push.c \
+ thread/pthread_cond_broadcast.c \
+ thread/pthread_cond_destroy.c \
+ thread/pthread_cond_init.c \
+ thread/pthread_cond_signal.c \
+ thread/pthread_cond_timedwait.c \
+ thread/pthread_cond_wait.c \
+ thread/pthread_condattr_destroy.c \
+ thread/pthread_condattr_init.c \
+ thread/pthread_condattr_setclock.c \
+ thread/pthread_condattr_setpshared.c \
+ thread/pthread_create.c \
+ thread/pthread_getspecific.c \
+ thread/pthread_join.c \
+ thread/pthread_key_create.c \
+ thread/pthread_mutex_consistent.c \
+ thread/pthread_mutex_destroy.c \
+ thread/pthread_mutex_init.c \
+ thread/pthread_mutex_getprioceiling.c \
+ thread/pthread_mutex_lock.c \
+ thread/pthread_mutex_timedlock.c \
+ thread/pthread_mutex_trylock.c \
+ thread/pthread_mutex_unlock.c \
+ thread/pthread_mutexattr_destroy.c \
+ thread/pthread_mutexattr_init.c \
+ thread/pthread_mutexattr_setprotocol.c \
+ thread/pthread_mutexattr_setpshared.c \
+ thread/pthread_mutexattr_setrobust.c \
+ thread/pthread_mutexattr_settype.c \
+ thread/pthread_once.c \
+ thread/pthread_rwlock_destroy.c \
+ thread/pthread_rwlock_init.c \
+ thread/pthread_rwlock_rdlock.c \
+ thread/pthread_rwlock_timedrdlock.c \
+ thread/pthread_rwlock_timedwrlock.c \
+ thread/pthread_rwlock_tryrdlock.c \
+ thread/pthread_rwlock_trywrlock.c \
+ thread/pthread_rwlock_unlock.c \
+ thread/pthread_rwlock_wrlock.c \
+ thread/pthread_rwlockattr_destroy.c \
+ thread/pthread_rwlockattr_init.c \
+ thread/pthread_rwlockattr_setpshared.c \
+ thread/pthread_setcancelstate.c \
+ thread/pthread_setspecific.c \
+ thread/pthread_self.c \
+ thread/pthread_testcancel.c \
+ thread/sem_destroy.c \
+ thread/sem_getvalue.c \
+ thread/sem_init.c \
+ thread/sem_post.c \
+ thread/sem_timedwait.c \
+ thread/sem_trywait.c \
+ thread/sem_wait.c \
+ )
+endif
+
+MUSL_PRINTSCAN_SOURCES = \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/internal/floatscan.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/stdio/vfprintf.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/stdio/vfwprintf.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/stdio/vfscanf.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/stdlib/strtod.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/stdlib/wcstod.c
+BULK_MEMORY_SOURCES = \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/string/memcpy.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/string/memmove.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/string/memset.c
+LIBC_TOP_HALF_HEADERS_PRIVATE = $(LIBC_TOP_HALF_DIR)/headers/private
+LIBC_TOP_HALF_SOURCES = $(LIBC_TOP_HALF_DIR)/sources
+LIBC_TOP_HALF_ALL_SOURCES = \
+ $(LIBC_TOP_HALF_MUSL_SOURCES) \
+ $(sort $(shell find $(LIBC_TOP_HALF_SOURCES) -name \*.c))
+
+# Add any extra flags
+CFLAGS = $(EXTRA_CFLAGS)
+# Set the target.
+CFLAGS += --target=$(TARGET_TRIPLE)
+# WebAssembly floating-point match doesn't trap.
+# TODO: Add -fno-signaling-nans when the compiler supports it.
+CFLAGS += -fno-trapping-math
+# Add all warnings, but disable a few which occur in third-party code.
+CFLAGS += -Wall -Wextra -Werror \
+ -Wno-null-pointer-arithmetic \
+ -Wno-unused-parameter \
+ -Wno-sign-compare \
+ -Wno-unused-variable \
+ -Wno-unused-function \
+ -Wno-ignored-attributes \
+ -Wno-missing-braces \
+ -Wno-ignored-pragmas \
+ -Wno-unused-but-set-variable \
+ -Wno-unknown-warning-option
+
+# Configure support for threads.
+ifeq ($(THREAD_MODEL), single)
+CFLAGS += -mthread-model single
+endif
+ifeq ($(THREAD_MODEL), posix)
+# Specify the tls-model until LLVM 15 is released (which should contain
+# https://reviews.llvm.org/D130053).
+CFLAGS += -mthread-model posix -pthread -ftls-model=local-exec
+
+# Include cloudlib's directory to access the structure definition of clockid_t
+CFLAGS += -I$(LIBC_BOTTOM_HALF_CLOUDLIBC_SRC)
+endif
+
+# Expose the public headers to the implementation. We use `-isystem` for
+# purpose for two reasons:
+#
+# 1. It only does `<...>` not `"...."` lookup. We are making a libc,
+# which is a system library, so all public headers should be
+# accessible via `<...>` and never also need `"..."`. `-isystem` main
+# purpose is to only effect `<...>` lookup.
+#
+# 2. The `-I` for private headers added for specific C files below
+# should come earlier in the search path, so they can "override"
+# and/or `#include_next` the public headers. `-isystem` (like
+# `-idirafter`) comes later in the search path than `-I`.
+CFLAGS += -isystem "$(SYSROOT_INC)"
+
+# These variables describe the locations of various files and directories in
+# the build tree.
+objs = $(patsubst $(CURDIR)/%.c,$(OBJDIR)/%.o,$(1))
+DLMALLOC_OBJS = $(call objs,$(DLMALLOC_SOURCES))
+EMMALLOC_OBJS = $(call objs,$(EMMALLOC_SOURCES))
+LIBC_BOTTOM_HALF_ALL_OBJS = $(call objs,$(LIBC_BOTTOM_HALF_ALL_SOURCES))
+LIBC_TOP_HALF_ALL_OBJS = $(call objs,$(LIBC_TOP_HALF_ALL_SOURCES))
+ifeq ($(MALLOC_IMPL),dlmalloc)
+LIBC_OBJS += $(DLMALLOC_OBJS)
+else ifeq ($(MALLOC_IMPL),emmalloc)
+LIBC_OBJS += $(EMMALLOC_OBJS)
+else ifeq ($(MALLOC_IMPL),none)
+# No object files to add.
+else
+$(error unknown malloc implementation $(MALLOC_IMPL))
+endif
+# Add libc-bottom-half's objects.
+LIBC_OBJS += $(LIBC_BOTTOM_HALF_ALL_OBJS)
+ifeq ($(BUILD_LIBC_TOP_HALF),yes)
+# libc-top-half is musl.
+LIBC_OBJS += $(LIBC_TOP_HALF_ALL_OBJS)
+endif
+MUSL_PRINTSCAN_OBJS = $(call objs,$(MUSL_PRINTSCAN_SOURCES))
+MUSL_PRINTSCAN_LONG_DOUBLE_OBJS = $(patsubst %.o,%.long-double.o,$(MUSL_PRINTSCAN_OBJS))
+MUSL_PRINTSCAN_NO_FLOATING_POINT_OBJS = $(patsubst %.o,%.no-floating-point.o,$(MUSL_PRINTSCAN_OBJS))
+BULK_MEMORY_OBJS = $(call objs,$(BULK_MEMORY_SOURCES))
+LIBWASI_EMULATED_MMAN_OBJS = $(call objs,$(LIBWASI_EMULATED_MMAN_SOURCES))
+LIBWASI_EMULATED_PROCESS_CLOCKS_OBJS = $(call objs,$(LIBWASI_EMULATED_PROCESS_CLOCKS_SOURCES))
+LIBWASI_EMULATED_GETPID_OBJS = $(call objs,$(LIBWASI_EMULATED_GETPID_SOURCES))
+LIBWASI_EMULATED_SIGNAL_OBJS = $(call objs,$(LIBWASI_EMULATED_SIGNAL_SOURCES))
+LIBWASI_EMULATED_SIGNAL_MUSL_OBJS = $(call objs,$(LIBWASI_EMULATED_SIGNAL_MUSL_SOURCES))
+
+# These variables describe the locations of various files and
+# directories in the generated sysroot tree.
+SYSROOT_LIB := $(SYSROOT)/lib/$(MULTIARCH_TRIPLE)
+SYSROOT_INC = $(SYSROOT)/include
+SYSROOT_SHARE = $(SYSROOT)/share/$(MULTIARCH_TRIPLE)
+
+# Files from musl's include directory that we don't want to install in the
+# sysroot's include directory.
+MUSL_OMIT_HEADERS :=
+
+# Remove files which aren't headers (we generate alltypes.h below).
+MUSL_OMIT_HEADERS += \
+ "bits/syscall.h.in" \
+ "bits/alltypes.h.in" \
+ "alltypes.h.in"
+
+# Use the compiler's version of these headers.
+MUSL_OMIT_HEADERS += \
+ "stdarg.h" \
+ "stddef.h"
+
+# Use the WASI errno definitions.
+MUSL_OMIT_HEADERS += \
+ "bits/errno.h"
+
+# Remove headers that aren't supported yet or that aren't relevant for WASI.
+MUSL_OMIT_HEADERS += \
+ "sys/procfs.h" \
+ "sys/user.h" \
+ "sys/kd.h" "sys/vt.h" "sys/soundcard.h" "sys/sem.h" \
+ "sys/shm.h" "sys/msg.h" "sys/ipc.h" "sys/ptrace.h" \
+ "sys/statfs.h" \
+ "bits/kd.h" "bits/vt.h" "bits/soundcard.h" "bits/sem.h" \
+ "bits/shm.h" "bits/msg.h" "bits/ipc.h" "bits/ptrace.h" \
+ "bits/statfs.h" \
+ "sys/vfs.h" \
+ "sys/statvfs.h" \
+ "syslog.h" "sys/syslog.h" \
+ "wait.h" "sys/wait.h" \
+ "ucontext.h" "sys/ucontext.h" \
+ "paths.h" \
+ "utmp.h" "utmpx.h" \
+ "lastlog.h" \
+ "sys/acct.h" \
+ "sys/cachectl.h" \
+ "sys/epoll.h" "sys/reboot.h" "sys/swap.h" \
+ "sys/sendfile.h" "sys/inotify.h" \
+ "sys/quota.h" \
+ "sys/klog.h" \
+ "sys/fsuid.h" \
+ "sys/io.h" \
+ "sys/prctl.h" \
+ "sys/mtio.h" \
+ "sys/mount.h" \
+ "sys/fanotify.h" \
+ "sys/personality.h" \
+ "elf.h" "link.h" "bits/link.h" \
+ "scsi/scsi.h" "scsi/scsi_ioctl.h" "scsi/sg.h" \
+ "sys/auxv.h" \
+ "pwd.h" "shadow.h" "grp.h" \
+ "mntent.h" \
+ "netdb.h" \
+ "resolv.h" \
+ "pty.h" \
+ "dlfcn.h" \
+ "setjmp.h" \
+ "ulimit.h" \
+ "sys/xattr.h" \
+ "wordexp.h" \
+ "spawn.h" \
+ "sys/membarrier.h" \
+ "sys/signalfd.h" \
+ "termios.h" \
+ "sys/termios.h" \
+ "bits/termios.h" \
+ "net/if.h" \
+ "net/if_arp.h" \
+ "net/ethernet.h" \
+ "net/route.h" \
+ "netinet/if_ether.h" \
+ "netinet/ether.h" \
+ "sys/timerfd.h" \
+ "libintl.h" \
+ "sys/sysmacros.h" \
+ "aio.h"
+
+ifeq ($(THREAD_MODEL), single)
+# Remove headers not supported in single-threaded mode.
+MUSL_OMIT_HEADERS += "pthread.h"
+endif
+
+default: finish
+
+$(SYSROOT_LIB)/libc.a: $(LIBC_OBJS)
+
+$(SYSROOT_LIB)/libc-printscan-long-double.a: $(MUSL_PRINTSCAN_LONG_DOUBLE_OBJS)
+
+$(SYSROOT_LIB)/libc-printscan-no-floating-point.a: $(MUSL_PRINTSCAN_NO_FLOATING_POINT_OBJS)
+
+$(SYSROOT_LIB)/libwasi-emulated-mman.a: $(LIBWASI_EMULATED_MMAN_OBJS)
+
+$(SYSROOT_LIB)/libwasi-emulated-process-clocks.a: $(LIBWASI_EMULATED_PROCESS_CLOCKS_OBJS)
+
+$(SYSROOT_LIB)/libwasi-emulated-getpid.a: $(LIBWASI_EMULATED_GETPID_OBJS)
+
+$(SYSROOT_LIB)/libwasi-emulated-signal.a: $(LIBWASI_EMULATED_SIGNAL_OBJS) $(LIBWASI_EMULATED_SIGNAL_MUSL_OBJS)
+
+%.a:
+ @mkdir -p "$(@D)"
+ # On Windows, the commandline for the ar invocation got too long, so it needs to be split up.
+ $(AR) crs $@ $(wordlist 1, 199, $^)
+ $(AR) crs $@ $(wordlist 200, 399, $^)
+ $(AR) crs $@ $(wordlist 400, 599, $^)
+ $(AR) crs $@ $(wordlist 600, 799, $^)
+ # This might eventually overflow again, but at least it'll do so in a loud way instead of
+ # silently dropping the tail.
+ $(AR) crs $@ $(wordlist 800, 100000, $^)
+
+$(MUSL_PRINTSCAN_OBJS): CFLAGS += \
+ -D__wasilibc_printscan_no_long_double \
+ -D__wasilibc_printscan_full_support_option="\"add -lc-printscan-long-double to the link command\""
+
+$(MUSL_PRINTSCAN_NO_FLOATING_POINT_OBJS): CFLAGS += \
+ -D__wasilibc_printscan_no_floating_point \
+ -D__wasilibc_printscan_floating_point_support_option="\"remove -lc-printscan-no-floating-point from the link command\""
+
+# TODO: apply -mbulk-memory globally, once
+# https://github.com/llvm/llvm-project/issues/52618 is resolved
+$(BULK_MEMORY_OBJS): CFLAGS += \
+ -mbulk-memory
+
+$(BULK_MEMORY_OBJS): CFLAGS += \
+ -DBULK_MEMORY_THRESHOLD=$(BULK_MEMORY_THRESHOLD)
+
+$(LIBWASI_EMULATED_SIGNAL_MUSL_OBJS): CFLAGS += \
+ -D_WASI_EMULATED_SIGNAL
+
+$(OBJDIR)/%.long-double.o: $(CURDIR)/%.c include_dirs
+ @mkdir -p "$(@D)"
+ $(CC) $(CFLAGS) -MD -MP -o $@ -c $<
+
+$(OBJDIR)/%.no-floating-point.o: $(CURDIR)/%.c include_dirs
+ @mkdir -p "$(@D)"
+ $(CC) $(CFLAGS) -MD -MP -o $@ -c $<
+
+$(OBJDIR)/%.o: $(CURDIR)/%.c include_dirs
+ @mkdir -p "$(@D)"
+ $(CC) $(CFLAGS) -MD -MP -o $@ -c $<
+
+-include $(shell find $(OBJDIR) -name \*.d)
+
+$(DLMALLOC_OBJS): CFLAGS += \
+ -I$(DLMALLOC_INC)
+
+startup_files $(LIBC_BOTTOM_HALF_ALL_OBJS): CFLAGS += \
+ -I$(LIBC_BOTTOM_HALF_HEADERS_PRIVATE) \
+ -I$(LIBC_BOTTOM_HALF_CLOUDLIBC_SRC_INC) \
+ -I$(LIBC_BOTTOM_HALF_CLOUDLIBC_SRC) \
+ -I$(LIBC_TOP_HALF_MUSL_SRC_DIR)/include \
+ -I$(LIBC_TOP_HALF_MUSL_SRC_DIR)/internal
+
+$(LIBC_TOP_HALF_ALL_OBJS) $(MUSL_PRINTSCAN_LONG_DOUBLE_OBJS) $(MUSL_PRINTSCAN_NO_FLOATING_POINT_OBJS) $(LIBWASI_EMULATED_SIGNAL_MUSL_OBJS): CFLAGS += \
+ -I$(LIBC_TOP_HALF_MUSL_SRC_DIR)/include \
+ -I$(LIBC_TOP_HALF_MUSL_SRC_DIR)/internal \
+ -I$(LIBC_TOP_HALF_MUSL_DIR)/arch/wasm32 \
+ -I$(LIBC_TOP_HALF_MUSL_DIR)/arch/generic \
+ -I$(LIBC_TOP_HALF_HEADERS_PRIVATE) \
+ -Wno-parentheses \
+ -Wno-shift-op-parentheses \
+ -Wno-bitwise-op-parentheses \
+ -Wno-logical-op-parentheses \
+ -Wno-string-plus-int \
+ -Wno-dangling-else \
+ -Wno-unknown-pragmas
+
+$(LIBWASI_EMULATED_PROCESS_CLOCKS_OBJS): CFLAGS += \
+ -I$(LIBC_BOTTOM_HALF_CLOUDLIBC_SRC)
+
+include_dirs:
+ #
+ # Install the include files.
+ #
+ mkdir -p "$(SYSROOT_INC)"
+ cp -r "$(LIBC_BOTTOM_HALF_HEADERS_PUBLIC)"/* "$(SYSROOT_INC)"
+
+ # Generate musl's bits/alltypes.h header.
+ mkdir -p "$(SYSROOT_INC)/bits"
+ sed -f $(LIBC_TOP_HALF_MUSL_DIR)/tools/mkalltypes.sed \
+ $(LIBC_TOP_HALF_MUSL_DIR)/arch/wasm32/bits/alltypes.h.in \
+ $(LIBC_TOP_HALF_MUSL_DIR)/include/alltypes.h.in \
+ > "$(SYSROOT_INC)/bits/alltypes.h"
+
+ # Copy in the bulk of musl's public header files.
+ cp -r "$(LIBC_TOP_HALF_MUSL_INC)"/* "$(SYSROOT_INC)"
+ # Copy in the musl's "bits" header files.
+ cp -r "$(LIBC_TOP_HALF_MUSL_DIR)"/arch/generic/bits/* "$(SYSROOT_INC)/bits"
+ cp -r "$(LIBC_TOP_HALF_MUSL_DIR)"/arch/wasm32/bits/* "$(SYSROOT_INC)/bits"
+
+ # Remove selected header files.
+ $(RM) $(patsubst %,$(SYSROOT_INC)/%,$(MUSL_OMIT_HEADERS))
+
+startup_files: include_dirs
+ #
+ # Build the startup files.
+ #
+ @mkdir -p "$(OBJDIR)"
+ cd "$(OBJDIR)" && \
+ $(CC) $(CFLAGS) -c $(LIBC_BOTTOM_HALF_CRT_SOURCES) -MD -MP && \
+ mkdir -p "$(SYSROOT_LIB)" && \
+ mv *.o "$(SYSROOT_LIB)"
+
+libc: include_dirs \
+ $(SYSROOT_LIB)/libc.a \
+ $(SYSROOT_LIB)/libc-printscan-long-double.a \
+ $(SYSROOT_LIB)/libc-printscan-no-floating-point.a \
+ $(SYSROOT_LIB)/libwasi-emulated-mman.a \
+ $(SYSROOT_LIB)/libwasi-emulated-process-clocks.a \
+ $(SYSROOT_LIB)/libwasi-emulated-getpid.a \
+ $(SYSROOT_LIB)/libwasi-emulated-signal.a
+
+finish: startup_files libc
+ #
+ # Create empty placeholder libraries.
+ #
+ for name in m rt pthread crypt util xnet resolv dl; do \
+ $(AR) crs "$(SYSROOT_LIB)/lib$${name}.a"; \
+ done
+
+ #
+ # The build succeeded! The generated sysroot is in $(SYSROOT).
+ #
+
+# The check for defined and undefined symbols expects there to be a heap
+# alloctor (providing malloc, calloc, free, etc). Skip this step if the build
+# is done without a malloc implementation.
+ifneq ($(MALLOC_IMPL),none)
+finish: check-symbols
+endif
+
+DEFINED_SYMBOLS = $(SYSROOT_SHARE)/defined-symbols.txt
+UNDEFINED_SYMBOLS = $(SYSROOT_SHARE)/undefined-symbols.txt
+
+check-symbols: startup_files libc
+ #
+ # Collect metadata on the sysroot and perform sanity checks.
+ #
+ mkdir -p "$(SYSROOT_SHARE)"
+
+ #
+ # Collect symbol information.
+ #
+ @# TODO: Use llvm-nm --extern-only instead of grep. This is blocked on
+ @# LLVM PR40497, which is fixed in 9.0, but not in 8.0.
+ @# Ignore certain llvm builtin symbols such as those starting with __mul
+ @# since these dependencies can vary between llvm versions.
+ "$(NM)" --defined-only "$(SYSROOT_LIB)"/libc.a "$(SYSROOT_LIB)"/libwasi-emulated-*.a "$(SYSROOT_LIB)"/*.o \
+ |grep ' [[:upper:]] ' |sed 's/.* [[:upper:]] //' |LC_ALL=C sort |uniq > "$(DEFINED_SYMBOLS)"
+ for undef_sym in $$("$(NM)" --undefined-only "$(SYSROOT_LIB)"/libc.a "$(SYSROOT_LIB)"/libc-*.a "$(SYSROOT_LIB)"/*.o \
+ |grep ' U ' |sed 's/.* U //' |LC_ALL=C sort |uniq); do \
+ grep -q '\<'$$undef_sym'\>' "$(DEFINED_SYMBOLS)" || echo $$undef_sym; \
+ done | grep -v "^__mul" > "$(UNDEFINED_SYMBOLS)"
+ grep '^_*imported_wasi_' "$(UNDEFINED_SYMBOLS)" \
+ > "$(SYSROOT_LIB)/libc.imports"
+
+ #
+ # Generate a test file that includes all public C header files.
+ #
+ cd "$(SYSROOT_INC)" && \
+ for header in $$(find . -type f -not -name mman.h -not -name signal.h -not -name times.h -not -name resource.h |grep -v /bits/ |grep -v /c++/); do \
+ echo '#include <'$$header'>' | sed 's/\.\///' ; \
+ done |LC_ALL=C sort >$(SYSROOT_SHARE)/include-all.c ; \
+ cd - >/dev/null
+
+ #
+ # Test that it compiles.
+ #
+ $(CC) $(CFLAGS) -fsyntax-only "$(SYSROOT_SHARE)/include-all.c" -Wno-\#warnings
+
+ #
+ # Collect all the predefined macros, except for compiler version macros
+ # which we don't need to track here.
+ #
+ @#
+ @# For the __*_ATOMIC_*_LOCK_FREE macros, squash individual compiler names
+ @# to attempt, toward keeping these files compiler-independent.
+ @#
+ @# We have to add `-isystem $(SYSROOT_INC)` because otherwise clang puts
+ @# its builtin include path first, which produces compiler-specific
+ @# output.
+ @#
+ @# TODO: Undefine __FLOAT128__ for now since it's not in clang 8.0.
+ @# TODO: Filter out __FLT16_* for now, as not all versions of clang have these.
+ @# TODO: Filter out __NO_MATH_ERRNO_ and a few __*WIDTH__ that are new to clang 14.
+ @# TODO: clang defined __FLT_EVAL_METHOD__ until clang 15, so we force-undefine it
+ @# for older versions.
+ $(CC) $(CFLAGS) "$(SYSROOT_SHARE)/include-all.c" \
+ -isystem $(SYSROOT_INC) \
+ -std=gnu17 \
+ -E -dM -Wno-\#warnings \
+ -D_ALL_SOURCE \
+ -U__llvm__ \
+ -U__clang__ \
+ -U__clang_major__ \
+ -U__clang_minor__ \
+ -U__clang_patchlevel__ \
+ -U__clang_version__ \
+ -U__clang_literal_encoding__ \
+ -U__clang_wide_literal_encoding__ \
+ -U__GNUC__ \
+ -U__GNUC_MINOR__ \
+ -U__GNUC_PATCHLEVEL__ \
+ -U__VERSION__ \
+ -U__FLOAT128__ \
+ -U__NO_MATH_ERRNO__ \
+ -U__BITINT_MAXWIDTH__ \
+ -U__FLT_EVAL_METHOD__ -Wno-builtin-macro-redefined \
+ | sed -e 's/__[[:upper:][:digit:]]*_ATOMIC_\([[:upper:][:digit:]_]*\)_LOCK_FREE/__compiler_ATOMIC_\1_LOCK_FREE/' \
+ | grep -v '^#define __FLT16_' \
+ | grep -v '^#define __\(BOOL\|INT_\(LEAST\|FAST\)\(8\|16\|32\|64\)\|INT\|LONG\|LLONG\|SHRT\)_WIDTH__' \
+ > "$(SYSROOT_SHARE)/predefined-macros.txt"
+
+ # Check that the computed metadata matches the expected metadata.
+ # This ignores whitespace because on Windows the output has CRLF line endings.
+ diff -wur "$(CURDIR)/expected/$(MULTIARCH_TRIPLE)/$(THREAD_MODEL)" "$(SYSROOT_SHARE)"
+
+install: finish
+ mkdir -p "$(INSTALL_DIR)"
+ cp -r "$(SYSROOT)/lib" "$(SYSROOT)/share" "$(SYSROOT)/include" "$(INSTALL_DIR)"
+
+clean:
+ $(RM) -r "$(OBJDIR)"
+ $(RM) -r "$(SYSROOT)"
+
+.PHONY: default startup_files libc finish install include_dirs clean
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..3068295
--- /dev/null
+++ b/README.md
@@ -0,0 +1,51 @@
+# WASI Libc
+
+WASI Libc is a libc for WebAssembly programs built on top of WASI system calls.
+It provides a wide array of POSIX-compatible C APIs, including support for
+standard I/O, file I/O, filesystem manipulation, memory management, time, string,
+environment variables, program startup, and many other APIs.
+
+WASI Libc is sufficiently stable and usable for many purposes, as most of the
+POSIX-compatible APIs are stable, though it is continuing to evolve to better
+align with wasm and WASI. For example, pthread support is still a work in
+progress.
+
+## Usage
+
+The easiest way to get started with this is to use [wasi-sdk], which includes a
+build of WASI Libc in its sysroot.
+
+## Building from source
+
+To build a WASI sysroot from source, obtain a WebAssembly-supporting C compiler
+(currently this is only clang 10+, though we'd like to support other compilers as well),
+and then run:
+
+```sh
+make CC=/path/to/clang/with/wasm/support \
+ AR=/path/to/llvm-ar \
+ NM=/path/to/llvm-nm
+```
+
+This makes a directory called "sysroot", by default. See the top of the Makefile
+for customization options.
+
+To use the sysroot, use the `--sysroot=` option:
+
+```sh
+/path/to/wasm/supporting/c/compiler --sysroot=/path/to/the/newly/built/sysroot ...
+```
+
+to run the compiler using the newly built sysroot.
+
+Note that Clang packages typically don't include cross-compiled builds of
+compiler-rt, libcxx, or libcxxabi, for `libclang_rt.builtins-wasm32.a`, libc++.a,
+or libc++abi.a, respectively, so they may not be usable without
+extra setup. This is one of the things [wasi-sdk] simplifies, as it includes
+cross-compiled builds of compiler-rt, libc++.a, and libc++abi.a.
+
+## Arch Linux AUR package
+For Arch Linux users, there's an unofficial AUR package tracking this git repo that can be installed under the name [wasi-libc-git].
+
+[wasi-sdk]: https://github.com/WebAssembly/wasi-sdk
+[wasi-libc-git]: https://aur.archlinux.org/packages/wasi-libc-git/
diff --git a/dlmalloc/include/unistd.h b/dlmalloc/include/unistd.h
new file mode 100644
index 0000000..7c4f1fa
--- /dev/null
+++ b/dlmalloc/include/unistd.h
@@ -0,0 +1,10 @@
+/* Stub include file to support dlmalloc. */
+
+#include <stdint.h>
+#include <__macro_PAGESIZE.h>
+
+#define sysconf(name) PAGESIZE
+#define _SC_PAGESIZE
+
+/* Declare sbrk. */
+void *sbrk(intptr_t increment) __attribute__((__warn_unused_result__));
diff --git a/dlmalloc/src/dlmalloc.c b/dlmalloc/src/dlmalloc.c
new file mode 100644
index 0000000..331536b
--- /dev/null
+++ b/dlmalloc/src/dlmalloc.c
@@ -0,0 +1,98 @@
+// This file is a wrapper around malloc.c, which is the upstream source file.
+// It sets configuration flags and controls which symbols are exported.
+
+#include <stddef.h>
+#include <malloc.h>
+
+// Define configuration macros for dlmalloc.
+
+// WebAssembly doesn't have mmap-style memory allocation.
+#define HAVE_MMAP 0
+
+// WebAssembly doesn't support shrinking linear memory.
+#define MORECORE_CANNOT_TRIM 1
+
+// Disable sanity checks to reduce code size.
+#define ABORT __builtin_unreachable()
+
+// If threads are enabled, enable support for threads.
+#ifdef _REENTRANT
+#define USE_LOCKS 1
+#endif
+
+// Make malloc deterministic.
+#define LACKS_TIME_H 1
+
+// Disable malloc statistics generation to reduce code size.
+#define NO_MALLINFO 1
+#define NO_MALLOC_STATS 1
+
+// Align malloc regions to 16, to avoid unaligned SIMD accesses.
+#define MALLOC_ALIGNMENT 16
+
+// Declare errno values used by dlmalloc. We define them like this to avoid
+// putting specific errno values in the ABI.
+extern const int __ENOMEM;
+#define ENOMEM __ENOMEM
+extern const int __EINVAL;
+#define EINVAL __EINVAL
+
+// Define USE_DL_PREFIX so that we leave dlmalloc's names prefixed with 'dl'.
+// We define them as "static", and we wrap them with public names below. This
+// serves two purposes:
+//
+// One is to make it easy to control which symbols are exported; dlmalloc
+// defines several non-standard functions and we wish to explicitly control
+// which functions are part of our public-facing interface.
+//
+// The other is to protect against compilers optimizing based on the assumption
+// that they know what functions with names like "malloc" do. Code in the
+// implementation will call functions like "dlmalloc" and assume it can use
+// the resulting pointers to access the metadata outside of the nominally
+// allocated objects. However, if the function were named "malloc", compilers
+// might see code like that and assume it has undefined behavior and can be
+// optimized away. By using "dlmalloc" in the implementation, we don't need
+// -fno-builtin to avoid this problem.
+#define USE_DL_PREFIX 1
+#define DLMALLOC_EXPORT static inline
+
+// This isn't declared with DLMALLOC_EXPORT so make it static explicitly.
+static size_t dlmalloc_usable_size(void*);
+
+// Include the upstream dlmalloc's malloc.c.
+#include "malloc.c"
+
+// Export the public names.
+
+void *malloc(size_t size) {
+ return dlmalloc(size);
+}
+
+void free(void *ptr) {
+ dlfree(ptr);
+}
+
+void *calloc(size_t nmemb, size_t size) {
+ return dlcalloc(nmemb, size);
+}
+
+void *realloc(void *ptr, size_t size) {
+ return dlrealloc(ptr, size);
+}
+
+int posix_memalign(void **memptr, size_t alignment, size_t size) {
+ return dlposix_memalign(memptr, alignment, size);
+}
+
+void* aligned_alloc(size_t alignment, size_t bytes) {
+ return dlmemalign(alignment, bytes);
+}
+
+size_t malloc_usable_size(void *ptr) {
+ return dlmalloc_usable_size(ptr);
+}
+
+// Define these to satisfy musl references.
+void *__libc_malloc(size_t) __attribute__((alias("malloc")));
+void __libc_free(void *) __attribute__((alias("free")));
+void *__libc_calloc(size_t nmemb, size_t size) __attribute__((alias("calloc")));
diff --git a/dlmalloc/src/malloc.c b/dlmalloc/src/malloc.c
new file mode 100644
index 0000000..03da739
--- /dev/null
+++ b/dlmalloc/src/malloc.c
@@ -0,0 +1,6352 @@
+/*
+ This is a version (aka dlmalloc) of malloc/free/realloc written by
+ Doug Lea and released to the public domain, as explained at
+ http://creativecommons.org/publicdomain/zero/1.0/ Send questions,
+ comments, complaints, performance data, etc to dl@cs.oswego.edu
+
+* Version 2.8.6 Wed Aug 29 06:57:58 2012 Doug Lea
+ Note: There may be an updated version of this malloc obtainable at
+ ftp://gee.cs.oswego.edu/pub/misc/malloc.c
+ Check before installing!
+
+* Quickstart
+
+ This library is all in one file to simplify the most common usage:
+ ftp it, compile it (-O3), and link it into another program. All of
+ the compile-time options default to reasonable values for use on
+ most platforms. You might later want to step through various
+ compile-time and dynamic tuning options.
+
+ For convenience, an include file for code using this malloc is at:
+ ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.6.h
+ You don't really need this .h file unless you call functions not
+ defined in your system include files. The .h file contains only the
+ excerpts from this file needed for using this malloc on ANSI C/C++
+ systems, so long as you haven't changed compile-time options about
+ naming and tuning parameters. If you do, then you can create your
+ own malloc.h that does include all settings by cutting at the point
+ indicated below. Note that you may already by default be using a C
+ library containing a malloc that is based on some version of this
+ malloc (for example in linux). You might still want to use the one
+ in this file to customize settings or to avoid overheads associated
+ with library versions.
+
+* Vital statistics:
+
+ Supported pointer/size_t representation: 4 or 8 bytes
+ size_t MUST be an unsigned type of the same width as
+ pointers. (If you are using an ancient system that declares
+ size_t as a signed type, or need it to be a different width
+ than pointers, you can use a previous release of this malloc
+ (e.g. 2.7.2) supporting these.)
+
+ Alignment: 8 bytes (minimum)
+ This suffices for nearly all current machines and C compilers.
+ However, you can define MALLOC_ALIGNMENT to be wider than this
+ if necessary (up to 128bytes), at the expense of using more space.
+
+ Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes)
+ 8 or 16 bytes (if 8byte sizes)
+ Each malloced chunk has a hidden word of overhead holding size
+ and status information, and additional cross-check word
+ if FOOTERS is defined.
+
+ Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead)
+ 8-byte ptrs: 32 bytes (including overhead)
+
+ Even a request for zero bytes (i.e., malloc(0)) returns a
+ pointer to something of the minimum allocatable size.
+ The maximum overhead wastage (i.e., number of extra bytes
+ allocated than were requested in malloc) is less than or equal
+ to the minimum size, except for requests >= mmap_threshold that
+ are serviced via mmap(), where the worst case wastage is about
+ 32 bytes plus the remainder from a system page (the minimal
+ mmap unit); typically 4096 or 8192 bytes.
+
+ Security: static-safe; optionally more or less
+ The "security" of malloc refers to the ability of malicious
+ code to accentuate the effects of errors (for example, freeing
+ space that is not currently malloc'ed or overwriting past the
+ ends of chunks) in code that calls malloc. This malloc
+ guarantees not to modify any memory locations below the base of
+ heap, i.e., static variables, even in the presence of usage
+ errors. The routines additionally detect most improper frees
+ and reallocs. All this holds as long as the static bookkeeping
+ for malloc itself is not corrupted by some other means. This
+ is only one aspect of security -- these checks do not, and
+ cannot, detect all possible programming errors.
+
+ If FOOTERS is defined nonzero, then each allocated chunk
+ carries an additional check word to verify that it was malloced
+ from its space. These check words are the same within each
+ execution of a program using malloc, but differ across
+ executions, so externally crafted fake chunks cannot be
+ freed. This improves security by rejecting frees/reallocs that
+ could corrupt heap memory, in addition to the checks preventing
+ writes to statics that are always on. This may further improve
+ security at the expense of time and space overhead. (Note that
+ FOOTERS may also be worth using with MSPACES.)
+
+ By default detected errors cause the program to abort (calling
+ "abort()"). You can override this to instead proceed past
+ errors by defining PROCEED_ON_ERROR. In this case, a bad free
+ has no effect, and a malloc that encounters a bad address
+ caused by user overwrites will ignore the bad address by
+ dropping pointers and indices to all known memory. This may
+ be appropriate for programs that should continue if at all
+ possible in the face of programming errors, although they may
+ run out of memory because dropped memory is never reclaimed.
+
+ If you don't like either of these options, you can define
+ CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything
+ else. And if if you are sure that your program using malloc has
+ no errors or vulnerabilities, you can define INSECURE to 1,
+ which might (or might not) provide a small performance improvement.
+
+ It is also possible to limit the maximum total allocatable
+ space, using malloc_set_footprint_limit. This is not
+ designed as a security feature in itself (calls to set limits
+ are not screened or privileged), but may be useful as one
+ aspect of a secure implementation.
+
+ Thread-safety: NOT thread-safe unless USE_LOCKS defined non-zero
+ When USE_LOCKS is defined, each public call to malloc, free,
+ etc is surrounded with a lock. By default, this uses a plain
+ pthread mutex, win32 critical section, or a spin-lock if if
+ available for the platform and not disabled by setting
+ USE_SPIN_LOCKS=0. However, if USE_RECURSIVE_LOCKS is defined,
+ recursive versions are used instead (which are not required for
+ base functionality but may be needed in layered extensions).
+ Using a global lock is not especially fast, and can be a major
+ bottleneck. It is designed only to provide minimal protection
+ in concurrent environments, and to provide a basis for
+ extensions. If you are using malloc in a concurrent program,
+ consider instead using nedmalloc
+ (http://www.nedprod.com/programs/portable/nedmalloc/) or
+ ptmalloc (See http://www.malloc.de), which are derived from
+ versions of this malloc.
+
+ System requirements: Any combination of MORECORE and/or MMAP/MUNMAP
+ This malloc can use unix sbrk or any emulation (invoked using
+ the CALL_MORECORE macro) and/or mmap/munmap or any emulation
+ (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system
+ memory. On most unix systems, it tends to work best if both
+ MORECORE and MMAP are enabled. On Win32, it uses emulations
+ based on VirtualAlloc. It also uses common C library functions
+ like memset.
+
+ Compliance: I believe it is compliant with the Single Unix Specification
+ (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably
+ others as well.
+
+* Overview of algorithms
+
+ This is not the fastest, most space-conserving, most portable, or
+ most tunable malloc ever written. However it is among the fastest
+ while also being among the most space-conserving, portable and
+ tunable. Consistent balance across these factors results in a good
+ general-purpose allocator for malloc-intensive programs.
+
+ In most ways, this malloc is a best-fit allocator. Generally, it
+ chooses the best-fitting existing chunk for a request, with ties
+ broken in approximately least-recently-used order. (This strategy
+ normally maintains low fragmentation.) However, for requests less
+ than 256bytes, it deviates from best-fit when there is not an
+ exactly fitting available chunk by preferring to use space adjacent
+ to that used for the previous small request, as well as by breaking
+ ties in approximately most-recently-used order. (These enhance
+ locality of series of small allocations.) And for very large requests
+ (>= 256Kb by default), it relies on system memory mapping
+ facilities, if supported. (This helps avoid carrying around and
+ possibly fragmenting memory used only for large chunks.)
+
+ All operations (except malloc_stats and mallinfo) have execution
+ times that are bounded by a constant factor of the number of bits in
+ a size_t, not counting any clearing in calloc or copying in realloc,
+ or actions surrounding MORECORE and MMAP that have times
+ proportional to the number of non-contiguous regions returned by
+ system allocation routines, which is often just 1. In real-time
+ applications, you can optionally suppress segment traversals using
+ NO_SEGMENT_TRAVERSAL, which assures bounded execution even when
+ system allocators return non-contiguous spaces, at the typical
+ expense of carrying around more memory and increased fragmentation.
+
+ The implementation is not very modular and seriously overuses
+ macros. Perhaps someday all C compilers will do as good a job
+ inlining modular code as can now be done by brute-force expansion,
+ but now, enough of them seem not to.
+
+ Some compilers issue a lot of warnings about code that is
+ dead/unreachable only on some platforms, and also about intentional
+ uses of negation on unsigned types. All known cases of each can be
+ ignored.
+
+ For a longer but out of date high-level description, see
+ http://gee.cs.oswego.edu/dl/html/malloc.html
+
+* MSPACES
+ If MSPACES is defined, then in addition to malloc, free, etc.,
+ this file also defines mspace_malloc, mspace_free, etc. These
+ are versions of malloc routines that take an "mspace" argument
+ obtained using create_mspace, to control all internal bookkeeping.
+ If ONLY_MSPACES is defined, only these versions are compiled.
+ So if you would like to use this allocator for only some allocations,
+ and your system malloc for others, you can compile with
+ ONLY_MSPACES and then do something like...
+ static mspace mymspace = create_mspace(0,0); // for example
+ #define mymalloc(bytes) mspace_malloc(mymspace, bytes)
+
+ (Note: If you only need one instance of an mspace, you can instead
+ use "USE_DL_PREFIX" to relabel the global malloc.)
+
+ You can similarly create thread-local allocators by storing
+ mspaces as thread-locals. For example:
+ static __thread mspace tlms = 0;
+ void* tlmalloc(size_t bytes) {
+ if (tlms == 0) tlms = create_mspace(0, 0);
+ return mspace_malloc(tlms, bytes);
+ }
+ void tlfree(void* mem) { mspace_free(tlms, mem); }
+
+ Unless FOOTERS is defined, each mspace is completely independent.
+ You cannot allocate from one and free to another (although
+ conformance is only weakly checked, so usage errors are not always
+ caught). If FOOTERS is defined, then each chunk carries around a tag
+ indicating its originating mspace, and frees are directed to their
+ originating spaces. Normally, this requires use of locks.
+
+ ------------------------- Compile-time options ---------------------------
+
+Be careful in setting #define values for numerical constants of type
+size_t. On some systems, literal values are not automatically extended
+to size_t precision unless they are explicitly casted. You can also
+use the symbolic values MAX_SIZE_T, SIZE_T_ONE, etc below.
+
+WIN32 default: defined if _WIN32 defined
+ Defining WIN32 sets up defaults for MS environment and compilers.
+ Otherwise defaults are for unix. Beware that there seem to be some
+ cases where this malloc might not be a pure drop-in replacement for
+ Win32 malloc: Random-looking failures from Win32 GDI API's (eg;
+ SetDIBits()) may be due to bugs in some video driver implementations
+ when pixel buffers are malloc()ed, and the region spans more than
+ one VirtualAlloc()ed region. Because dlmalloc uses a small (64Kb)
+ default granularity, pixel buffers may straddle virtual allocation
+ regions more often than when using the Microsoft allocator. You can
+ avoid this by using VirtualAlloc() and VirtualFree() for all pixel
+ buffers rather than using malloc(). If this is not possible,
+ recompile this malloc with a larger DEFAULT_GRANULARITY. Note:
+ in cases where MSC and gcc (cygwin) are known to differ on WIN32,
+ conditions use _MSC_VER to distinguish them.
+
+DLMALLOC_EXPORT default: extern
+ Defines how public APIs are declared. If you want to export via a
+ Windows DLL, you might define this as
+ #define DLMALLOC_EXPORT extern __declspec(dllexport)
+ If you want a POSIX ELF shared object, you might use
+ #define DLMALLOC_EXPORT extern __attribute__((visibility("default")))
+
+MALLOC_ALIGNMENT default: (size_t)(2 * sizeof(void *))
+ Controls the minimum alignment for malloc'ed chunks. It must be a
+ power of two and at least 8, even on machines for which smaller
+ alignments would suffice. It may be defined as larger than this
+ though. Note however that code and data structures are optimized for
+ the case of 8-byte alignment.
+
+MSPACES default: 0 (false)
+ If true, compile in support for independent allocation spaces.
+ This is only supported if HAVE_MMAP is true.
+
+ONLY_MSPACES default: 0 (false)
+ If true, only compile in mspace versions, not regular versions.
+
+USE_LOCKS default: 0 (false)
+ Causes each call to each public routine to be surrounded with
+ pthread or WIN32 mutex lock/unlock. (If set true, this can be
+ overridden on a per-mspace basis for mspace versions.) If set to a
+ non-zero value other than 1, locks are used, but their
+ implementation is left out, so lock functions must be supplied manually,
+ as described below.
+
+USE_SPIN_LOCKS default: 1 iff USE_LOCKS and spin locks available
+ If true, uses custom spin locks for locking. This is currently
+ supported only gcc >= 4.1, older gccs on x86 platforms, and recent
+ MS compilers. Otherwise, posix locks or win32 critical sections are
+ used.
+
+USE_RECURSIVE_LOCKS default: not defined
+ If defined nonzero, uses recursive (aka reentrant) locks, otherwise
+ uses plain mutexes. This is not required for malloc proper, but may
+ be needed for layered allocators such as nedmalloc.
+
+LOCK_AT_FORK default: not defined
+ If defined nonzero, performs pthread_atfork upon initialization
+ to initialize child lock while holding parent lock. The implementation
+ assumes that pthread locks (not custom locks) are being used. In other
+ cases, you may need to customize the implementation.
+
+FOOTERS default: 0
+ If true, provide extra checking and dispatching by placing
+ information in the footers of allocated chunks. This adds
+ space and time overhead.
+
+INSECURE default: 0
+ If true, omit checks for usage errors and heap space overwrites.
+
+USE_DL_PREFIX default: NOT defined
+ Causes compiler to prefix all public routines with the string 'dl'.
+ This can be useful when you only want to use this malloc in one part
+ of a program, using your regular system malloc elsewhere.
+
+MALLOC_INSPECT_ALL default: NOT defined
+ If defined, compiles malloc_inspect_all and mspace_inspect_all, that
+ perform traversal of all heap space. Unless access to these
+ functions is otherwise restricted, you probably do not want to
+ include them in secure implementations.
+
+ABORT default: defined as abort()
+ Defines how to abort on failed checks. On most systems, a failed
+ check cannot die with an "assert" or even print an informative
+ message, because the underlying print routines in turn call malloc,
+ which will fail again. Generally, the best policy is to simply call
+ abort(). It's not very useful to do more than this because many
+ errors due to overwriting will show up as address faults (null, odd
+ addresses etc) rather than malloc-triggered checks, so will also
+ abort. Also, most compilers know that abort() does not return, so
+ can better optimize code conditionally calling it.
+
+PROCEED_ON_ERROR default: defined as 0 (false)
+ Controls whether detected bad addresses cause them to bypassed
+ rather than aborting. If set, detected bad arguments to free and
+ realloc are ignored. And all bookkeeping information is zeroed out
+ upon a detected overwrite of freed heap space, thus losing the
+ ability to ever return it from malloc again, but enabling the
+ application to proceed. If PROCEED_ON_ERROR is defined, the
+ static variable malloc_corruption_error_count is compiled in
+ and can be examined to see if errors have occurred. This option
+ generates slower code than the default abort policy.
+
+DEBUG default: NOT defined
+ The DEBUG setting is mainly intended for people trying to modify
+ this code or diagnose problems when porting to new platforms.
+ However, it may also be able to better isolate user errors than just
+ using runtime checks. The assertions in the check routines spell
+ out in more detail the assumptions and invariants underlying the
+ algorithms. The checking is fairly extensive, and will slow down
+ execution noticeably. Calling malloc_stats or mallinfo with DEBUG
+ set will attempt to check every non-mmapped allocated and free chunk
+ in the course of computing the summaries.
+
+ABORT_ON_ASSERT_FAILURE default: defined as 1 (true)
+ Debugging assertion failures can be nearly impossible if your
+ version of the assert macro causes malloc to be called, which will
+ lead to a cascade of further failures, blowing the runtime stack.
+ ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(),
+ which will usually make debugging easier.
+
+MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32
+ The action to take before "return 0" when malloc fails to be able to
+ return memory because there is none available.
+
+HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES
+ True if this system supports sbrk or an emulation of it.
+
+MORECORE default: sbrk
+ The name of the sbrk-style system routine to call to obtain more
+ memory. See below for guidance on writing custom MORECORE
+ functions. The type of the argument to sbrk/MORECORE varies across
+ systems. It cannot be size_t, because it supports negative
+ arguments, so it is normally the signed type of the same width as
+ size_t (sometimes declared as "intptr_t"). It doesn't much matter
+ though. Internally, we only call it with arguments less than half
+ the max value of a size_t, which should work across all reasonable
+ possibilities, although sometimes generating compiler warnings.
+
+MORECORE_CONTIGUOUS default: 1 (true) if HAVE_MORECORE
+ If true, take advantage of fact that consecutive calls to MORECORE
+ with positive arguments always return contiguous increasing
+ addresses. This is true of unix sbrk. It does not hurt too much to
+ set it true anyway, since malloc copes with non-contiguities.
+ Setting it false when definitely non-contiguous saves time
+ and possibly wasted space it would take to discover this though.
+
+MORECORE_CANNOT_TRIM default: NOT defined
+ True if MORECORE cannot release space back to the system when given
+ negative arguments. This is generally necessary only if you are
+ using a hand-crafted MORECORE function that cannot handle negative
+ arguments.
+
+NO_SEGMENT_TRAVERSAL default: 0
+ If non-zero, suppresses traversals of memory segments
+ returned by either MORECORE or CALL_MMAP. This disables
+ merging of segments that are contiguous, and selectively
+ releasing them to the OS if unused, but bounds execution times.
+
+HAVE_MMAP default: 1 (true)
+ True if this system supports mmap or an emulation of it. If so, and
+ HAVE_MORECORE is not true, MMAP is used for all system
+ allocation. If set and HAVE_MORECORE is true as well, MMAP is
+ primarily used to directly allocate very large blocks. It is also
+ used as a backup strategy in cases where MORECORE fails to provide
+ space from system. Note: A single call to MUNMAP is assumed to be
+ able to unmap memory that may have be allocated using multiple calls
+ to MMAP, so long as they are adjacent.
+
+HAVE_MREMAP default: 1 on linux, else 0
+ If true realloc() uses mremap() to re-allocate large blocks and
+ extend or shrink allocation spaces.
+
+MMAP_CLEARS default: 1 except on WINCE.
+ True if mmap clears memory so calloc doesn't need to. This is true
+ for standard unix mmap using /dev/zero and on WIN32 except for WINCE.
+
+USE_BUILTIN_FFS default: 0 (i.e., not used)
+ Causes malloc to use the builtin ffs() function to compute indices.
+ Some compilers may recognize and intrinsify ffs to be faster than the
+ supplied C version. Also, the case of x86 using gcc is special-cased
+ to an asm instruction, so is already as fast as it can be, and so
+ this setting has no effect. Similarly for Win32 under recent MS compilers.
+ (On most x86s, the asm version is only slightly faster than the C version.)
+
+malloc_getpagesize default: derive from system includes, or 4096.
+ The system page size. To the extent possible, this malloc manages
+ memory from the system in page-size units. This may be (and
+ usually is) a function rather than a constant. This is ignored
+ if WIN32, where page size is determined using getSystemInfo during
+ initialization.
+
+USE_DEV_RANDOM default: 0 (i.e., not used)
+ Causes malloc to use /dev/random to initialize secure magic seed for
+ stamping footers. Otherwise, the current time is used.
+
+NO_MALLINFO default: 0
+ If defined, don't compile "mallinfo". This can be a simple way
+ of dealing with mismatches between system declarations and
+ those in this file.
+
+MALLINFO_FIELD_TYPE default: size_t
+ The type of the fields in the mallinfo struct. This was originally
+ defined as "int" in SVID etc, but is more usefully defined as
+ size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set
+
+NO_MALLOC_STATS default: 0
+ If defined, don't compile "malloc_stats". This avoids calls to
+ fprintf and bringing in stdio dependencies you might not want.
+
+REALLOC_ZERO_BYTES_FREES default: not defined
+ This should be set if a call to realloc with zero bytes should
+ be the same as a call to free. Some people think it should. Otherwise,
+ since this malloc returns a unique pointer for malloc(0), so does
+ realloc(p, 0).
+
+LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H
+LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H
+LACKS_STDLIB_H LACKS_SCHED_H LACKS_TIME_H default: NOT defined unless on WIN32
+ Define these if your system does not have these header files.
+ You might need to manually insert some of the declarations they provide.
+
+DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS,
+ system_info.dwAllocationGranularity in WIN32,
+ otherwise 64K.
+ Also settable using mallopt(M_GRANULARITY, x)
+ The unit for allocating and deallocating memory from the system. On
+ most systems with contiguous MORECORE, there is no reason to
+ make this more than a page. However, systems with MMAP tend to
+ either require or encourage larger granularities. You can increase
+ this value to prevent system allocation functions to be called so
+ often, especially if they are slow. The value must be at least one
+ page and must be a power of two. Setting to 0 causes initialization
+ to either page size or win32 region size. (Note: In previous
+ versions of malloc, the equivalent of this option was called
+ "TOP_PAD")
+
+DEFAULT_TRIM_THRESHOLD default: 2MB
+ Also settable using mallopt(M_TRIM_THRESHOLD, x)
+ The maximum amount of unused top-most memory to keep before
+ releasing via malloc_trim in free(). Automatic trimming is mainly
+ useful in long-lived programs using contiguous MORECORE. Because
+ trimming via sbrk can be slow on some systems, and can sometimes be
+ wasteful (in cases where programs immediately afterward allocate
+ more large chunks) the value should be high enough so that your
+ overall system performance would improve by releasing this much
+ memory. As a rough guide, you might set to a value close to the
+ average size of a process (program) running on your system.
+ Releasing this much memory would allow such a process to run in
+ memory. Generally, it is worth tuning trim thresholds when a
+ program undergoes phases where several large chunks are allocated
+ and released in ways that can reuse each other's storage, perhaps
+ mixed with phases where there are no such chunks at all. The trim
+ value must be greater than page size to have any useful effect. To
+ disable trimming completely, you can set to MAX_SIZE_T. Note that the trick
+ some people use of mallocing a huge space and then freeing it at
+ program startup, in an attempt to reserve system memory, doesn't
+ have the intended effect under automatic trimming, since that memory
+ will immediately be returned to the system.
+
+DEFAULT_MMAP_THRESHOLD default: 256K
+ Also settable using mallopt(M_MMAP_THRESHOLD, x)
+ The request size threshold for using MMAP to directly service a
+ request. Requests of at least this size that cannot be allocated
+ using already-existing space will be serviced via mmap. (If enough
+ normal freed space already exists it is used instead.) Using mmap
+ segregates relatively large chunks of memory so that they can be
+ individually obtained and released from the host system. A request
+ serviced through mmap is never reused by any other request (at least
+ not directly; the system may just so happen to remap successive
+ requests to the same locations). Segregating space in this way has
+ the benefits that: Mmapped space can always be individually released
+ back to the system, which helps keep the system level memory demands
+ of a long-lived program low. Also, mapped memory doesn't become
+ `locked' between other chunks, as can happen with normally allocated
+ chunks, which means that even trimming via malloc_trim would not
+ release them. However, it has the disadvantage that the space
+ cannot be reclaimed, consolidated, and then used to service later
+ requests, as happens with normal chunks. The advantages of mmap
+ nearly always outweigh disadvantages for "large" chunks, but the
+ value of "large" may vary across systems. The default is an
+ empirically derived value that works well in most systems. You can
+ disable mmap by setting to MAX_SIZE_T.
+
+MAX_RELEASE_CHECK_RATE default: 4095 unless not HAVE_MMAP
+ The number of consolidated frees between checks to release
+ unused segments when freeing. When using non-contiguous segments,
+ especially with multiple mspaces, checking only for topmost space
+ doesn't always suffice to trigger trimming. To compensate for this,
+ free() will, with a period of MAX_RELEASE_CHECK_RATE (or the
+ current number of segments, if greater) try to release unused
+ segments to the OS when freeing chunks that result in
+ consolidation. The best value for this parameter is a compromise
+ between slowing down frees with relatively costly checks that
+ rarely trigger versus holding on to unused memory. To effectively
+ disable, set to MAX_SIZE_T. This may lead to a very slight speed
+ improvement at the expense of carrying around more memory.
+*/
+
+/* Version identifier to allow people to support multiple versions */
+#ifndef DLMALLOC_VERSION
+#define DLMALLOC_VERSION 20806
+#endif /* DLMALLOC_VERSION */
+
+#ifndef DLMALLOC_EXPORT
+#define DLMALLOC_EXPORT extern
+#endif
+
+#ifndef WIN32
+#ifdef _WIN32
+#define WIN32 1
+#endif /* _WIN32 */
+#ifdef _WIN32_WCE
+#define LACKS_FCNTL_H
+#define WIN32 1
+#endif /* _WIN32_WCE */
+#endif /* WIN32 */
+#ifdef WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <tchar.h>
+#define HAVE_MMAP 1
+#define HAVE_MORECORE 0
+#define LACKS_UNISTD_H
+#define LACKS_SYS_PARAM_H
+#define LACKS_SYS_MMAN_H
+#define LACKS_STRING_H
+#define LACKS_STRINGS_H
+#define LACKS_SYS_TYPES_H
+#define LACKS_ERRNO_H
+#define LACKS_SCHED_H
+#ifndef MALLOC_FAILURE_ACTION
+#define MALLOC_FAILURE_ACTION
+#endif /* MALLOC_FAILURE_ACTION */
+#ifndef MMAP_CLEARS
+#ifdef _WIN32_WCE /* WINCE reportedly does not clear */
+#define MMAP_CLEARS 0
+#else
+#define MMAP_CLEARS 1
+#endif /* _WIN32_WCE */
+#endif /*MMAP_CLEARS */
+#endif /* WIN32 */
+
+#if defined(DARWIN) || defined(_DARWIN)
+/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */
+#ifndef HAVE_MORECORE
+#define HAVE_MORECORE 0
+#define HAVE_MMAP 1
+/* OSX allocators provide 16 byte alignment */
+#ifndef MALLOC_ALIGNMENT
+#define MALLOC_ALIGNMENT ((size_t)16U)
+#endif
+#endif /* HAVE_MORECORE */
+#endif /* DARWIN */
+
+#ifndef LACKS_SYS_TYPES_H
+#include <sys/types.h> /* For size_t */
+#endif /* LACKS_SYS_TYPES_H */
+
+/* The maximum possible size_t value has all bits set */
+#define MAX_SIZE_T (~(size_t)0)
+
+#ifndef USE_LOCKS /* ensure true if spin or recursive locks set */
+#if 0
+#define USE_LOCKS ((defined(USE_SPIN_LOCKS) && USE_SPIN_LOCKS != 0) || \
+ (defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0))
+#else
+/* Avoid a -Wexpansion-to-defined compiler warning. */
+#if (defined(USE_SPIN_LOCKS) && USE_SPIN_LOCKS != 0) || \
+ (defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0)
+#define USE_LOCKS 1
+#else
+#define USE_LOCKS 0
+#endif
+#endif
+#endif /* USE_LOCKS */
+
+#if USE_LOCKS /* Spin locks for gcc >= 4.1, older gcc on x86, MSC >= 1310 */
+#if ((defined(__GNUC__) && \
+ ((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) || \
+ defined(__i386__) || defined(__x86_64__))) || \
+ (defined(_MSC_VER) && _MSC_VER>=1310))
+#ifndef USE_SPIN_LOCKS
+#define USE_SPIN_LOCKS 1
+#endif /* USE_SPIN_LOCKS */
+#elif USE_SPIN_LOCKS
+#error "USE_SPIN_LOCKS defined without implementation"
+#endif /* ... locks available... */
+#elif !defined(USE_SPIN_LOCKS)
+#define USE_SPIN_LOCKS 0
+#endif /* USE_LOCKS */
+
+#ifndef ONLY_MSPACES
+#define ONLY_MSPACES 0
+#endif /* ONLY_MSPACES */
+#ifndef MSPACES
+#if ONLY_MSPACES
+#define MSPACES 1
+#else /* ONLY_MSPACES */
+#define MSPACES 0
+#endif /* ONLY_MSPACES */
+#endif /* MSPACES */
+#ifndef MALLOC_ALIGNMENT
+#define MALLOC_ALIGNMENT ((size_t)(2 * sizeof(void *)))
+#endif /* MALLOC_ALIGNMENT */
+#ifndef FOOTERS
+#define FOOTERS 0
+#endif /* FOOTERS */
+#ifndef ABORT
+#define ABORT abort()
+#endif /* ABORT */
+#ifndef ABORT_ON_ASSERT_FAILURE
+#define ABORT_ON_ASSERT_FAILURE 1
+#endif /* ABORT_ON_ASSERT_FAILURE */
+#ifndef PROCEED_ON_ERROR
+#define PROCEED_ON_ERROR 0
+#endif /* PROCEED_ON_ERROR */
+
+#ifndef INSECURE
+#define INSECURE 0
+#endif /* INSECURE */
+#ifndef MALLOC_INSPECT_ALL
+#define MALLOC_INSPECT_ALL 0
+#endif /* MALLOC_INSPECT_ALL */
+#ifndef HAVE_MMAP
+#define HAVE_MMAP 1
+#endif /* HAVE_MMAP */
+#ifndef MMAP_CLEARS
+#define MMAP_CLEARS 1
+#endif /* MMAP_CLEARS */
+#ifndef HAVE_MREMAP
+#ifdef linux
+#define HAVE_MREMAP 1
+#define _GNU_SOURCE /* Turns on mremap() definition */
+#else /* linux */
+#define HAVE_MREMAP 0
+#endif /* linux */
+#endif /* HAVE_MREMAP */
+#ifndef MALLOC_FAILURE_ACTION
+#define MALLOC_FAILURE_ACTION errno = ENOMEM;
+#endif /* MALLOC_FAILURE_ACTION */
+#ifndef HAVE_MORECORE
+#if ONLY_MSPACES
+#define HAVE_MORECORE 0
+#else /* ONLY_MSPACES */
+#define HAVE_MORECORE 1
+#endif /* ONLY_MSPACES */
+#endif /* HAVE_MORECORE */
+#if !HAVE_MORECORE
+#define MORECORE_CONTIGUOUS 0
+#else /* !HAVE_MORECORE */
+#define MORECORE_DEFAULT sbrk
+#ifndef MORECORE_CONTIGUOUS
+#define MORECORE_CONTIGUOUS 1
+#endif /* MORECORE_CONTIGUOUS */
+#endif /* HAVE_MORECORE */
+#ifndef DEFAULT_GRANULARITY
+#if (MORECORE_CONTIGUOUS || defined(WIN32))
+#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */
+#else /* MORECORE_CONTIGUOUS */
+#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U)
+#endif /* MORECORE_CONTIGUOUS */
+#endif /* DEFAULT_GRANULARITY */
+#ifndef DEFAULT_TRIM_THRESHOLD
+#ifndef MORECORE_CANNOT_TRIM
+#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U)
+#else /* MORECORE_CANNOT_TRIM */
+#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T
+#endif /* MORECORE_CANNOT_TRIM */
+#endif /* DEFAULT_TRIM_THRESHOLD */
+#ifndef DEFAULT_MMAP_THRESHOLD
+#if HAVE_MMAP
+#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U)
+#else /* HAVE_MMAP */
+#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T
+#endif /* HAVE_MMAP */
+#endif /* DEFAULT_MMAP_THRESHOLD */
+#ifndef MAX_RELEASE_CHECK_RATE
+#if HAVE_MMAP
+#define MAX_RELEASE_CHECK_RATE 4095
+#else
+#define MAX_RELEASE_CHECK_RATE MAX_SIZE_T
+#endif /* HAVE_MMAP */
+#endif /* MAX_RELEASE_CHECK_RATE */
+#ifndef USE_BUILTIN_FFS
+#define USE_BUILTIN_FFS 0
+#endif /* USE_BUILTIN_FFS */
+#ifndef USE_DEV_RANDOM
+#define USE_DEV_RANDOM 0
+#endif /* USE_DEV_RANDOM */
+#ifndef NO_MALLINFO
+#define NO_MALLINFO 0
+#endif /* NO_MALLINFO */
+#ifndef MALLINFO_FIELD_TYPE
+#define MALLINFO_FIELD_TYPE size_t
+#endif /* MALLINFO_FIELD_TYPE */
+#ifndef NO_MALLOC_STATS
+#define NO_MALLOC_STATS 0
+#endif /* NO_MALLOC_STATS */
+#ifndef NO_SEGMENT_TRAVERSAL
+#define NO_SEGMENT_TRAVERSAL 0
+#endif /* NO_SEGMENT_TRAVERSAL */
+
+/*
+ mallopt tuning options. SVID/XPG defines four standard parameter
+ numbers for mallopt, normally defined in malloc.h. None of these
+ are used in this malloc, so setting them has no effect. But this
+ malloc does support the following options.
+*/
+
+#define M_TRIM_THRESHOLD (-1)
+#define M_GRANULARITY (-2)
+#define M_MMAP_THRESHOLD (-3)
+
+/* ------------------------ Mallinfo declarations ------------------------ */
+
+#if !NO_MALLINFO
+/*
+ This version of malloc supports the standard SVID/XPG mallinfo
+ routine that returns a struct containing usage properties and
+ statistics. It should work on any system that has a
+ /usr/include/malloc.h defining struct mallinfo. The main
+ declaration needed is the mallinfo struct that is returned (by-copy)
+ by mallinfo(). The malloinfo struct contains a bunch of fields that
+ are not even meaningful in this version of malloc. These fields are
+ are instead filled by mallinfo() with other numbers that might be of
+ interest.
+
+ HAVE_USR_INCLUDE_MALLOC_H should be set if you have a
+ /usr/include/malloc.h file that includes a declaration of struct
+ mallinfo. If so, it is included; else a compliant version is
+ declared below. These must be precisely the same for mallinfo() to
+ work. The original SVID version of this struct, defined on most
+ systems with mallinfo, declares all fields as ints. But some others
+ define as unsigned long. If your system defines the fields using a
+ type of different width than listed here, you MUST #include your
+ system version and #define HAVE_USR_INCLUDE_MALLOC_H.
+*/
+
+/* #define HAVE_USR_INCLUDE_MALLOC_H */
+
+#ifdef HAVE_USR_INCLUDE_MALLOC_H
+#include "/usr/include/malloc.h"
+#else /* HAVE_USR_INCLUDE_MALLOC_H */
+#ifndef STRUCT_MALLINFO_DECLARED
+/* HP-UX (and others?) redefines mallinfo unless _STRUCT_MALLINFO is defined */
+#define _STRUCT_MALLINFO
+#define STRUCT_MALLINFO_DECLARED 1
+struct mallinfo {
+ MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */
+ MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */
+ MALLINFO_FIELD_TYPE smblks; /* always 0 */
+ MALLINFO_FIELD_TYPE hblks; /* always 0 */
+ MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */
+ MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */
+ MALLINFO_FIELD_TYPE fsmblks; /* always 0 */
+ MALLINFO_FIELD_TYPE uordblks; /* total allocated space */
+ MALLINFO_FIELD_TYPE fordblks; /* total free space */
+ MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */
+};
+#endif /* STRUCT_MALLINFO_DECLARED */
+#endif /* HAVE_USR_INCLUDE_MALLOC_H */
+#endif /* NO_MALLINFO */
+
+/*
+ Try to persuade compilers to inline. The most critical functions for
+ inlining are defined as macros, so these aren't used for them.
+*/
+
+#ifndef FORCEINLINE
+ #if defined(__GNUC__)
+#define FORCEINLINE __inline __attribute__ ((always_inline))
+ #elif defined(_MSC_VER)
+ #define FORCEINLINE __forceinline
+ #endif
+#endif
+#ifndef NOINLINE
+ #if defined(__GNUC__)
+ #define NOINLINE __attribute__ ((noinline))
+ #elif defined(_MSC_VER)
+ #define NOINLINE __declspec(noinline)
+ #else
+ #define NOINLINE
+ #endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#ifndef FORCEINLINE
+ #define FORCEINLINE inline
+#endif
+#endif /* __cplusplus */
+#ifndef FORCEINLINE
+ #define FORCEINLINE
+#endif
+
+#if !ONLY_MSPACES
+
+/* ------------------- Declarations of public routines ------------------- */
+
+#ifndef USE_DL_PREFIX
+#define dlcalloc calloc
+#define dlfree free
+#define dlmalloc malloc
+#define dlmemalign memalign
+#define dlposix_memalign posix_memalign
+#define dlrealloc realloc
+#define dlrealloc_in_place realloc_in_place
+#define dlvalloc valloc
+#define dlpvalloc pvalloc
+#define dlmallinfo mallinfo
+#define dlmallopt mallopt
+#define dlmalloc_trim malloc_trim
+#define dlmalloc_stats malloc_stats
+#define dlmalloc_usable_size malloc_usable_size
+#define dlmalloc_footprint malloc_footprint
+#define dlmalloc_max_footprint malloc_max_footprint
+#define dlmalloc_footprint_limit malloc_footprint_limit
+#define dlmalloc_set_footprint_limit malloc_set_footprint_limit
+#define dlmalloc_inspect_all malloc_inspect_all
+#define dlindependent_calloc independent_calloc
+#define dlindependent_comalloc independent_comalloc
+#define dlbulk_free bulk_free
+#endif /* USE_DL_PREFIX */
+
+/*
+ malloc(size_t n)
+ Returns a pointer to a newly allocated chunk of at least n bytes, or
+ null if no space is available, in which case errno is set to ENOMEM
+ on ANSI C systems.
+
+ If n is zero, malloc returns a minimum-sized chunk. (The minimum
+ size is 16 bytes on most 32bit systems, and 32 bytes on 64bit
+ systems.) Note that size_t is an unsigned type, so calls with
+ arguments that would be negative if signed are interpreted as
+ requests for huge amounts of space, which will often fail. The
+ maximum supported value of n differs across systems, but is in all
+ cases less than the maximum representable value of a size_t.
+*/
+DLMALLOC_EXPORT void* dlmalloc(size_t);
+
+/*
+ free(void* p)
+ Releases the chunk of memory pointed to by p, that had been previously
+ allocated using malloc or a related routine such as realloc.
+ It has no effect if p is null. If p was not malloced or already
+ freed, free(p) will by default cause the current program to abort.
+*/
+DLMALLOC_EXPORT void dlfree(void*);
+
+/*
+ calloc(size_t n_elements, size_t element_size);
+ Returns a pointer to n_elements * element_size bytes, with all locations
+ set to zero.
+*/
+DLMALLOC_EXPORT void* dlcalloc(size_t, size_t);
+
+/*
+ realloc(void* p, size_t n)
+ Returns a pointer to a chunk of size n that contains the same data
+ as does chunk p up to the minimum of (n, p's size) bytes, or null
+ if no space is available.
+
+ The returned pointer may or may not be the same as p. The algorithm
+ prefers extending p in most cases when possible, otherwise it
+ employs the equivalent of a malloc-copy-free sequence.
+
+ If p is null, realloc is equivalent to malloc.
+
+ If space is not available, realloc returns null, errno is set (if on
+ ANSI) and p is NOT freed.
+
+ if n is for fewer bytes than already held by p, the newly unused
+ space is lopped off and freed if possible. realloc with a size
+ argument of zero (re)allocates a minimum-sized chunk.
+
+ The old unix realloc convention of allowing the last-free'd chunk
+ to be used as an argument to realloc is not supported.
+*/
+DLMALLOC_EXPORT void* dlrealloc(void*, size_t);
+
+/*
+ realloc_in_place(void* p, size_t n)
+ Resizes the space allocated for p to size n, only if this can be
+ done without moving p (i.e., only if there is adjacent space
+ available if n is greater than p's current allocated size, or n is
+ less than or equal to p's size). This may be used instead of plain
+ realloc if an alternative allocation strategy is needed upon failure
+ to expand space; for example, reallocation of a buffer that must be
+ memory-aligned or cleared. You can use realloc_in_place to trigger
+ these alternatives only when needed.
+
+ Returns p if successful; otherwise null.
+*/
+DLMALLOC_EXPORT void* dlrealloc_in_place(void*, size_t);
+
+/*
+ memalign(size_t alignment, size_t n);
+ Returns a pointer to a newly allocated chunk of n bytes, aligned
+ in accord with the alignment argument.
+
+ The alignment argument should be a power of two. If the argument is
+ not a power of two, the nearest greater power is used.
+ 8-byte alignment is guaranteed by normal malloc calls, so don't
+ bother calling memalign with an argument of 8 or less.
+
+ Overreliance on memalign is a sure way to fragment space.
+*/
+DLMALLOC_EXPORT void* dlmemalign(size_t, size_t);
+
+/*
+ int posix_memalign(void** pp, size_t alignment, size_t n);
+ Allocates a chunk of n bytes, aligned in accord with the alignment
+ argument. Differs from memalign only in that it (1) assigns the
+ allocated memory to *pp rather than returning it, (2) fails and
+ returns EINVAL if the alignment is not a power of two (3) fails and
+ returns ENOMEM if memory cannot be allocated.
+*/
+DLMALLOC_EXPORT int dlposix_memalign(void**, size_t, size_t);
+
+/*
+ valloc(size_t n);
+ Equivalent to memalign(pagesize, n), where pagesize is the page
+ size of the system. If the pagesize is unknown, 4096 is used.
+*/
+DLMALLOC_EXPORT void* dlvalloc(size_t);
+
+/*
+ mallopt(int parameter_number, int parameter_value)
+ Sets tunable parameters The format is to provide a
+ (parameter-number, parameter-value) pair. mallopt then sets the
+ corresponding parameter to the argument value if it can (i.e., so
+ long as the value is meaningful), and returns 1 if successful else
+ 0. To workaround the fact that mallopt is specified to use int,
+ not size_t parameters, the value -1 is specially treated as the
+ maximum unsigned size_t value.
+
+ SVID/XPG/ANSI defines four standard param numbers for mallopt,
+ normally defined in malloc.h. None of these are use in this malloc,
+ so setting them has no effect. But this malloc also supports other
+ options in mallopt. See below for details. Briefly, supported
+ parameters are as follows (listed defaults are for "typical"
+ configurations).
+
+ Symbol param # default allowed param values
+ M_TRIM_THRESHOLD -1 2*1024*1024 any (-1 disables)
+ M_GRANULARITY -2 page size any power of 2 >= page size
+ M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support)
+*/
+DLMALLOC_EXPORT int dlmallopt(int, int);
+
+/*
+ malloc_footprint();
+ Returns the number of bytes obtained from the system. The total
+ number of bytes allocated by malloc, realloc etc., is less than this
+ value. Unlike mallinfo, this function returns only a precomputed
+ result, so can be called frequently to monitor memory consumption.
+ Even if locks are otherwise defined, this function does not use them,
+ so results might not be up to date.
+*/
+DLMALLOC_EXPORT size_t dlmalloc_footprint(void);
+
+/*
+ malloc_max_footprint();
+ Returns the maximum number of bytes obtained from the system. This
+ value will be greater than current footprint if deallocated space
+ has been reclaimed by the system. The peak number of bytes allocated
+ by malloc, realloc etc., is less than this value. Unlike mallinfo,
+ this function returns only a precomputed result, so can be called
+ frequently to monitor memory consumption. Even if locks are
+ otherwise defined, this function does not use them, so results might
+ not be up to date.
+*/
+DLMALLOC_EXPORT size_t dlmalloc_max_footprint(void);
+
+/*
+ malloc_footprint_limit();
+ Returns the number of bytes that the heap is allowed to obtain from
+ the system, returning the last value returned by
+ malloc_set_footprint_limit, or the maximum size_t value if
+ never set. The returned value reflects a permission. There is no
+ guarantee that this number of bytes can actually be obtained from
+ the system.
+*/
+DLMALLOC_EXPORT size_t dlmalloc_footprint_limit();
+
+/*
+ malloc_set_footprint_limit();
+ Sets the maximum number of bytes to obtain from the system, causing
+ failure returns from malloc and related functions upon attempts to
+ exceed this value. The argument value may be subject to page
+ rounding to an enforceable limit; this actual value is returned.
+ Using an argument of the maximum possible size_t effectively
+ disables checks. If the argument is less than or equal to the
+ current malloc_footprint, then all future allocations that require
+ additional system memory will fail. However, invocation cannot
+ retroactively deallocate existing used memory.
+*/
+DLMALLOC_EXPORT size_t dlmalloc_set_footprint_limit(size_t bytes);
+
+#if MALLOC_INSPECT_ALL
+/*
+ malloc_inspect_all(void(*handler)(void *start,
+ void *end,
+ size_t used_bytes,
+ void* callback_arg),
+ void* arg);
+ Traverses the heap and calls the given handler for each managed
+ region, skipping all bytes that are (or may be) used for bookkeeping
+ purposes. Traversal does not include include chunks that have been
+ directly memory mapped. Each reported region begins at the start
+ address, and continues up to but not including the end address. The
+ first used_bytes of the region contain allocated data. If
+ used_bytes is zero, the region is unallocated. The handler is
+ invoked with the given callback argument. If locks are defined, they
+ are held during the entire traversal. It is a bad idea to invoke
+ other malloc functions from within the handler.
+
+ For example, to count the number of in-use chunks with size greater
+ than 1000, you could write:
+ static int count = 0;
+ void count_chunks(void* start, void* end, size_t used, void* arg) {
+ if (used >= 1000) ++count;
+ }
+ then:
+ malloc_inspect_all(count_chunks, NULL);
+
+ malloc_inspect_all is compiled only if MALLOC_INSPECT_ALL is defined.
+*/
+DLMALLOC_EXPORT void dlmalloc_inspect_all(void(*handler)(void*, void *, size_t, void*),
+ void* arg);
+
+#endif /* MALLOC_INSPECT_ALL */
+
+#if !NO_MALLINFO
+/*
+ mallinfo()
+ Returns (by copy) a struct containing various summary statistics:
+
+ arena: current total non-mmapped bytes allocated from system
+ ordblks: the number of free chunks
+ smblks: always zero.
+ hblks: current number of mmapped regions
+ hblkhd: total bytes held in mmapped regions
+ usmblks: the maximum total allocated space. This will be greater
+ than current total if trimming has occurred.
+ fsmblks: always zero
+ uordblks: current total allocated space (normal or mmapped)
+ fordblks: total free space
+ keepcost: the maximum number of bytes that could ideally be released
+ back to system via malloc_trim. ("ideally" means that
+ it ignores page restrictions etc.)
+
+ Because these fields are ints, but internal bookkeeping may
+ be kept as longs, the reported values may wrap around zero and
+ thus be inaccurate.
+*/
+DLMALLOC_EXPORT struct mallinfo dlmallinfo(void);
+#endif /* NO_MALLINFO */
+
+/*
+ independent_calloc(size_t n_elements, size_t element_size, void* chunks[]);
+
+ independent_calloc is similar to calloc, but instead of returning a
+ single cleared space, it returns an array of pointers to n_elements
+ independent elements that can hold contents of size elem_size, each
+ of which starts out cleared, and can be independently freed,
+ realloc'ed etc. The elements are guaranteed to be adjacently
+ allocated (this is not guaranteed to occur with multiple callocs or
+ mallocs), which may also improve cache locality in some
+ applications.
+
+ The "chunks" argument is optional (i.e., may be null, which is
+ probably the most typical usage). If it is null, the returned array
+ is itself dynamically allocated and should also be freed when it is
+ no longer needed. Otherwise, the chunks array must be of at least
+ n_elements in length. It is filled in with the pointers to the
+ chunks.
+
+ In either case, independent_calloc returns this pointer array, or
+ null if the allocation failed. If n_elements is zero and "chunks"
+ is null, it returns a chunk representing an array with zero elements
+ (which should be freed if not wanted).
+
+ Each element must be freed when it is no longer needed. This can be
+ done all at once using bulk_free.
+
+ independent_calloc simplifies and speeds up implementations of many
+ kinds of pools. It may also be useful when constructing large data
+ structures that initially have a fixed number of fixed-sized nodes,
+ but the number is not known at compile time, and some of the nodes
+ may later need to be freed. For example:
+
+ struct Node { int item; struct Node* next; };
+
+ struct Node* build_list() {
+ struct Node** pool;
+ int n = read_number_of_nodes_needed();
+ if (n <= 0) return 0;
+ pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
+ if (pool == 0) die();
+ // organize into a linked list...
+ struct Node* first = pool[0];
+ for (i = 0; i < n-1; ++i)
+ pool[i]->next = pool[i+1];
+ free(pool); // Can now free the array (or not, if it is needed later)
+ return first;
+ }
+*/
+DLMALLOC_EXPORT void** dlindependent_calloc(size_t, size_t, void**);
+
+/*
+ independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]);
+
+ independent_comalloc allocates, all at once, a set of n_elements
+ chunks with sizes indicated in the "sizes" array. It returns
+ an array of pointers to these elements, each of which can be
+ independently freed, realloc'ed etc. The elements are guaranteed to
+ be adjacently allocated (this is not guaranteed to occur with
+ multiple callocs or mallocs), which may also improve cache locality
+ in some applications.
+
+ The "chunks" argument is optional (i.e., may be null). If it is null
+ the returned array is itself dynamically allocated and should also
+ be freed when it is no longer needed. Otherwise, the chunks array
+ must be of at least n_elements in length. It is filled in with the
+ pointers to the chunks.
+
+ In either case, independent_comalloc returns this pointer array, or
+ null if the allocation failed. If n_elements is zero and chunks is
+ null, it returns a chunk representing an array with zero elements
+ (which should be freed if not wanted).
+
+ Each element must be freed when it is no longer needed. This can be
+ done all at once using bulk_free.
+
+ independent_comallac differs from independent_calloc in that each
+ element may have a different size, and also that it does not
+ automatically clear elements.
+
+ independent_comalloc can be used to speed up allocation in cases
+ where several structs or objects must always be allocated at the
+ same time. For example:
+
+ struct Head { ... }
+ struct Foot { ... }
+
+ void send_message(char* msg) {
+ int msglen = strlen(msg);
+ size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
+ void* chunks[3];
+ if (independent_comalloc(3, sizes, chunks) == 0)
+ die();
+ struct Head* head = (struct Head*)(chunks[0]);
+ char* body = (char*)(chunks[1]);
+ struct Foot* foot = (struct Foot*)(chunks[2]);
+ // ...
+ }
+
+ In general though, independent_comalloc is worth using only for
+ larger values of n_elements. For small values, you probably won't
+ detect enough difference from series of malloc calls to bother.
+
+ Overuse of independent_comalloc can increase overall memory usage,
+ since it cannot reuse existing noncontiguous small chunks that
+ might be available for some of the elements.
+*/
+DLMALLOC_EXPORT void** dlindependent_comalloc(size_t, size_t*, void**);
+
+/*
+ bulk_free(void* array[], size_t n_elements)
+ Frees and clears (sets to null) each non-null pointer in the given
+ array. This is likely to be faster than freeing them one-by-one.
+ If footers are used, pointers that have been allocated in different
+ mspaces are not freed or cleared, and the count of all such pointers
+ is returned. For large arrays of pointers with poor locality, it
+ may be worthwhile to sort this array before calling bulk_free.
+*/
+DLMALLOC_EXPORT size_t dlbulk_free(void**, size_t n_elements);
+
+/*
+ pvalloc(size_t n);
+ Equivalent to valloc(minimum-page-that-holds(n)), that is,
+ round up n to nearest pagesize.
+ */
+DLMALLOC_EXPORT void* dlpvalloc(size_t);
+
+/*
+ malloc_trim(size_t pad);
+
+ If possible, gives memory back to the system (via negative arguments
+ to sbrk) if there is unused memory at the `high' end of the malloc
+ pool or in unused MMAP segments. You can call this after freeing
+ large blocks of memory to potentially reduce the system-level memory
+ requirements of a program. However, it cannot guarantee to reduce
+ memory. Under some allocation patterns, some large free blocks of
+ memory will be locked between two used chunks, so they cannot be
+ given back to the system.
+
+ The `pad' argument to malloc_trim represents the amount of free
+ trailing space to leave untrimmed. If this argument is zero, only
+ the minimum amount of memory to maintain internal data structures
+ will be left. Non-zero arguments can be supplied to maintain enough
+ trailing space to service future expected allocations without having
+ to re-obtain memory from the system.
+
+ Malloc_trim returns 1 if it actually released any memory, else 0.
+*/
+DLMALLOC_EXPORT int dlmalloc_trim(size_t);
+
+/*
+ malloc_stats();
+ Prints on stderr the amount of space obtained from the system (both
+ via sbrk and mmap), the maximum amount (which may be more than
+ current if malloc_trim and/or munmap got called), and the current
+ number of bytes allocated via malloc (or realloc, etc) but not yet
+ freed. Note that this is the number of bytes allocated, not the
+ number requested. It will be larger than the number requested
+ because of alignment and bookkeeping overhead. Because it includes
+ alignment wastage as being in use, this figure may be greater than
+ zero even when no user-level chunks are allocated.
+
+ The reported current and maximum system memory can be inaccurate if
+ a program makes other calls to system memory allocation functions
+ (normally sbrk) outside of malloc.
+
+ malloc_stats prints only the most commonly interesting statistics.
+ More information can be obtained by calling mallinfo.
+*/
+DLMALLOC_EXPORT void dlmalloc_stats(void);
+
+/*
+ malloc_usable_size(void* p);
+
+ Returns the number of bytes you can actually use in
+ an allocated chunk, which may be more than you requested (although
+ often not) due to alignment and minimum size constraints.
+ You can use this many bytes without worrying about
+ overwriting other allocated objects. This is not a particularly great
+ programming practice. malloc_usable_size can be more useful in
+ debugging and assertions, for example:
+
+ p = malloc(n);
+ assert(malloc_usable_size(p) >= 256);
+*/
+size_t dlmalloc_usable_size(void*);
+
+#endif /* ONLY_MSPACES */
+
+#if MSPACES
+
+/*
+ mspace is an opaque type representing an independent
+ region of space that supports mspace_malloc, etc.
+*/
+typedef void* mspace;
+
+/*
+ create_mspace creates and returns a new independent space with the
+ given initial capacity, or, if 0, the default granularity size. It
+ returns null if there is no system memory available to create the
+ space. If argument locked is non-zero, the space uses a separate
+ lock to control access. The capacity of the space will grow
+ dynamically as needed to service mspace_malloc requests. You can
+ control the sizes of incremental increases of this space by
+ compiling with a different DEFAULT_GRANULARITY or dynamically
+ setting with mallopt(M_GRANULARITY, value).
+*/
+DLMALLOC_EXPORT mspace create_mspace(size_t capacity, int locked);
+
+/*
+ destroy_mspace destroys the given space, and attempts to return all
+ of its memory back to the system, returning the total number of
+ bytes freed. After destruction, the results of access to all memory
+ used by the space become undefined.
+*/
+DLMALLOC_EXPORT size_t destroy_mspace(mspace msp);
+
+/*
+ create_mspace_with_base uses the memory supplied as the initial base
+ of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this
+ space is used for bookkeeping, so the capacity must be at least this
+ large. (Otherwise 0 is returned.) When this initial space is
+ exhausted, additional memory will be obtained from the system.
+ Destroying this space will deallocate all additionally allocated
+ space (if possible) but not the initial base.
+*/
+DLMALLOC_EXPORT mspace create_mspace_with_base(void* base, size_t capacity, int locked);
+
+/*
+ mspace_track_large_chunks controls whether requests for large chunks
+ are allocated in their own untracked mmapped regions, separate from
+ others in this mspace. By default large chunks are not tracked,
+ which reduces fragmentation. However, such chunks are not
+ necessarily released to the system upon destroy_mspace. Enabling
+ tracking by setting to true may increase fragmentation, but avoids
+ leakage when relying on destroy_mspace to release all memory
+ allocated using this space. The function returns the previous
+ setting.
+*/
+DLMALLOC_EXPORT int mspace_track_large_chunks(mspace msp, int enable);
+
+
+/*
+ mspace_malloc behaves as malloc, but operates within
+ the given space.
+*/
+DLMALLOC_EXPORT void* mspace_malloc(mspace msp, size_t bytes);
+
+/*
+ mspace_free behaves as free, but operates within
+ the given space.
+
+ If compiled with FOOTERS==1, mspace_free is not actually needed.
+ free may be called instead of mspace_free because freed chunks from
+ any space are handled by their originating spaces.
+*/
+DLMALLOC_EXPORT void mspace_free(mspace msp, void* mem);
+
+/*
+ mspace_realloc behaves as realloc, but operates within
+ the given space.
+
+ If compiled with FOOTERS==1, mspace_realloc is not actually
+ needed. realloc may be called instead of mspace_realloc because
+ realloced chunks from any space are handled by their originating
+ spaces.
+*/
+DLMALLOC_EXPORT void* mspace_realloc(mspace msp, void* mem, size_t newsize);
+
+/*
+ mspace_calloc behaves as calloc, but operates within
+ the given space.
+*/
+DLMALLOC_EXPORT void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
+
+/*
+ mspace_memalign behaves as memalign, but operates within
+ the given space.
+*/
+DLMALLOC_EXPORT void* mspace_memalign(mspace msp, size_t alignment, size_t bytes);
+
+/*
+ mspace_independent_calloc behaves as independent_calloc, but
+ operates within the given space.
+*/
+DLMALLOC_EXPORT void** mspace_independent_calloc(mspace msp, size_t n_elements,
+ size_t elem_size, void* chunks[]);
+
+/*
+ mspace_independent_comalloc behaves as independent_comalloc, but
+ operates within the given space.
+*/
+DLMALLOC_EXPORT void** mspace_independent_comalloc(mspace msp, size_t n_elements,
+ size_t sizes[], void* chunks[]);
+
+/*
+ mspace_footprint() returns the number of bytes obtained from the
+ system for this space.
+*/
+DLMALLOC_EXPORT size_t mspace_footprint(mspace msp);
+
+/*
+ mspace_max_footprint() returns the peak number of bytes obtained from the
+ system for this space.
+*/
+DLMALLOC_EXPORT size_t mspace_max_footprint(mspace msp);
+
+
+#if !NO_MALLINFO
+/*
+ mspace_mallinfo behaves as mallinfo, but reports properties of
+ the given space.
+*/
+DLMALLOC_EXPORT struct mallinfo mspace_mallinfo(mspace msp);
+#endif /* NO_MALLINFO */
+
+/*
+ malloc_usable_size(void* p) behaves the same as malloc_usable_size;
+*/
+DLMALLOC_EXPORT size_t mspace_usable_size(const void* mem);
+
+/*
+ mspace_malloc_stats behaves as malloc_stats, but reports
+ properties of the given space.
+*/
+DLMALLOC_EXPORT void mspace_malloc_stats(mspace msp);
+
+/*
+ mspace_trim behaves as malloc_trim, but
+ operates within the given space.
+*/
+DLMALLOC_EXPORT int mspace_trim(mspace msp, size_t pad);
+
+/*
+ An alias for mallopt.
+*/
+DLMALLOC_EXPORT int mspace_mallopt(int, int);
+
+#endif /* MSPACES */
+
+#ifdef __cplusplus
+} /* end of extern "C" */
+#endif /* __cplusplus */
+
+/*
+ ========================================================================
+ To make a fully customizable malloc.h header file, cut everything
+ above this line, put into file malloc.h, edit to suit, and #include it
+ on the next line, as well as in programs that use this malloc.
+ ========================================================================
+*/
+
+/* #include "malloc.h" */
+
+/*------------------------------ internal #includes ---------------------- */
+
+#ifdef _MSC_VER
+#pragma warning( disable : 4146 ) /* no "unsigned" warnings */
+#endif /* _MSC_VER */
+#if !NO_MALLOC_STATS
+#include <stdio.h> /* for printing in malloc_stats */
+#endif /* NO_MALLOC_STATS */
+#ifndef LACKS_ERRNO_H
+#include <errno.h> /* for MALLOC_FAILURE_ACTION */
+#endif /* LACKS_ERRNO_H */
+#ifdef DEBUG
+#if ABORT_ON_ASSERT_FAILURE
+#undef assert
+#define assert(x) if(!(x)) ABORT
+#else /* ABORT_ON_ASSERT_FAILURE */
+#include <assert.h>
+#endif /* ABORT_ON_ASSERT_FAILURE */
+#else /* DEBUG */
+#ifndef assert
+#define assert(x)
+#endif
+#define DEBUG 0
+#endif /* DEBUG */
+#if !defined(WIN32) && !defined(LACKS_TIME_H)
+#include <time.h> /* for magic initialization */
+#endif /* WIN32 */
+#ifndef LACKS_STDLIB_H
+#include <stdlib.h> /* for abort() */
+#endif /* LACKS_STDLIB_H */
+#ifndef LACKS_STRING_H
+#include <string.h> /* for memset etc */
+#endif /* LACKS_STRING_H */
+#if USE_BUILTIN_FFS
+#ifndef LACKS_STRINGS_H
+#include <strings.h> /* for ffs */
+#endif /* LACKS_STRINGS_H */
+#endif /* USE_BUILTIN_FFS */
+#if HAVE_MMAP
+#ifndef LACKS_SYS_MMAN_H
+/* On some versions of linux, mremap decl in mman.h needs __USE_GNU set */
+#if (defined(linux) && !defined(__USE_GNU))
+#define __USE_GNU 1
+#include <sys/mman.h> /* for mmap */
+#undef __USE_GNU
+#else
+#include <sys/mman.h> /* for mmap */
+#endif /* linux */
+#endif /* LACKS_SYS_MMAN_H */
+#ifndef LACKS_FCNTL_H
+#include <fcntl.h>
+#endif /* LACKS_FCNTL_H */
+#endif /* HAVE_MMAP */
+#ifndef LACKS_UNISTD_H
+#include <unistd.h> /* for sbrk, sysconf */
+#else /* LACKS_UNISTD_H */
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
+extern void* sbrk(ptrdiff_t);
+#endif /* FreeBSD etc */
+#endif /* LACKS_UNISTD_H */
+
+/* Declarations for locking */
+#if USE_LOCKS
+#ifndef WIN32
+#if defined (__SVR4) && defined (__sun) /* solaris */
+#include <thread.h>
+#elif !defined(LACKS_SCHED_H)
+#include <sched.h>
+#endif /* solaris or LACKS_SCHED_H */
+#if (defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0) || !USE_SPIN_LOCKS
+#include <pthread.h>
+#endif /* USE_RECURSIVE_LOCKS ... */
+#elif defined(_MSC_VER)
+#ifndef _M_AMD64
+/* These are already defined on AMD64 builds */
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+LONG __cdecl _InterlockedCompareExchange(LONG volatile *Dest, LONG Exchange, LONG Comp);
+LONG __cdecl _InterlockedExchange(LONG volatile *Target, LONG Value);
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* _M_AMD64 */
+#pragma intrinsic (_InterlockedCompareExchange)
+#pragma intrinsic (_InterlockedExchange)
+#define interlockedcompareexchange _InterlockedCompareExchange
+#define interlockedexchange _InterlockedExchange
+#elif defined(WIN32) && defined(__GNUC__)
+#define interlockedcompareexchange(a, b, c) __sync_val_compare_and_swap(a, c, b)
+#define interlockedexchange __sync_lock_test_and_set
+#endif /* Win32 */
+#else /* USE_LOCKS */
+#endif /* USE_LOCKS */
+
+#ifndef LOCK_AT_FORK
+#define LOCK_AT_FORK 0
+#endif
+
+/* Declarations for bit scanning on win32 */
+#if defined(_MSC_VER) && _MSC_VER>=1300
+#ifndef BitScanForward /* Try to avoid pulling in WinNT.h */
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+unsigned char _BitScanForward(unsigned long *index, unsigned long mask);
+unsigned char _BitScanReverse(unsigned long *index, unsigned long mask);
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#define BitScanForward _BitScanForward
+#define BitScanReverse _BitScanReverse
+#pragma intrinsic(_BitScanForward)
+#pragma intrinsic(_BitScanReverse)
+#endif /* BitScanForward */
+#endif /* defined(_MSC_VER) && _MSC_VER>=1300 */
+
+#ifndef WIN32
+#ifndef malloc_getpagesize
+# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */
+# ifndef _SC_PAGE_SIZE
+# define _SC_PAGE_SIZE _SC_PAGESIZE
+# endif
+# endif
+# ifdef _SC_PAGE_SIZE
+# define malloc_getpagesize sysconf(_SC_PAGE_SIZE)
+# else
+# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)
+ extern size_t getpagesize();
+# define malloc_getpagesize getpagesize()
+# else
+# ifdef WIN32 /* use supplied emulation of getpagesize */
+# define malloc_getpagesize getpagesize()
+# else
+# ifndef LACKS_SYS_PARAM_H
+# include <sys/param.h>
+# endif
+# ifdef EXEC_PAGESIZE
+# define malloc_getpagesize EXEC_PAGESIZE
+# else
+# ifdef NBPG
+# ifndef CLSIZE
+# define malloc_getpagesize NBPG
+# else
+# define malloc_getpagesize (NBPG * CLSIZE)
+# endif
+# else
+# ifdef NBPC
+# define malloc_getpagesize NBPC
+# else
+# ifdef PAGESIZE
+# define malloc_getpagesize PAGESIZE
+# else /* just guess */
+# define malloc_getpagesize ((size_t)4096U)
+# endif
+# endif
+# endif
+# endif
+# endif
+# endif
+# endif
+#endif
+#endif
+
+/* ------------------- size_t and alignment properties -------------------- */
+
+/* The byte and bit size of a size_t */
+#define SIZE_T_SIZE (sizeof(size_t))
+#define SIZE_T_BITSIZE (sizeof(size_t) << 3)
+
+/* Some constants coerced to size_t */
+/* Annoying but necessary to avoid errors on some platforms */
+#define SIZE_T_ZERO ((size_t)0)
+#define SIZE_T_ONE ((size_t)1)
+#define SIZE_T_TWO ((size_t)2)
+#define SIZE_T_FOUR ((size_t)4)
+#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1)
+#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2)
+#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES)
+#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U)
+
+/* The bit mask value corresponding to MALLOC_ALIGNMENT */
+#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE)
+
+/* True if address a has acceptable alignment */
+#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0)
+
+/* the number of bytes to offset an address to align it */
+#define align_offset(A)\
+ ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\
+ ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK))
+
+/* -------------------------- MMAP preliminaries ------------------------- */
+
+/*
+ If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and
+ checks to fail so compiler optimizer can delete code rather than
+ using so many "#if"s.
+*/
+
+
+/* MORECORE and MMAP must return MFAIL on failure */
+#define MFAIL ((void*)(MAX_SIZE_T))
+#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */
+
+#if HAVE_MMAP
+
+#ifndef WIN32
+#define MUNMAP_DEFAULT(a, s) munmap((a), (s))
+#define MMAP_PROT (PROT_READ|PROT_WRITE)
+#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
+#define MAP_ANONYMOUS MAP_ANON
+#endif /* MAP_ANON */
+#ifdef MAP_ANONYMOUS
+#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS)
+#define MMAP_DEFAULT(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0)
+#else /* MAP_ANONYMOUS */
+/*
+ Nearly all versions of mmap support MAP_ANONYMOUS, so the following
+ is unlikely to be needed, but is supplied just in case.
+*/
+#define MMAP_FLAGS (MAP_PRIVATE)
+static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
+#define MMAP_DEFAULT(s) ((dev_zero_fd < 0) ? \
+ (dev_zero_fd = open("/dev/zero", O_RDWR), \
+ mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \
+ mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0))
+#endif /* MAP_ANONYMOUS */
+
+#define DIRECT_MMAP_DEFAULT(s) MMAP_DEFAULT(s)
+
+#else /* WIN32 */
+
+/* Win32 MMAP via VirtualAlloc */
+static FORCEINLINE void* win32mmap(size_t size) {
+ void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
+ return (ptr != 0)? ptr: MFAIL;
+}
+
+/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
+static FORCEINLINE void* win32direct_mmap(size_t size) {
+ void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
+ PAGE_READWRITE);
+ return (ptr != 0)? ptr: MFAIL;
+}
+
+/* This function supports releasing coalesed segments */
+static FORCEINLINE int win32munmap(void* ptr, size_t size) {
+ MEMORY_BASIC_INFORMATION minfo;
+ char* cptr = (char*)ptr;
+ while (size) {
+ if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0)
+ return -1;
+ if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr ||
+ minfo.State != MEM_COMMIT || minfo.RegionSize > size)
+ return -1;
+ if (VirtualFree(cptr, 0, MEM_RELEASE) == 0)
+ return -1;
+ cptr += minfo.RegionSize;
+ size -= minfo.RegionSize;
+ }
+ return 0;
+}
+
+#define MMAP_DEFAULT(s) win32mmap(s)
+#define MUNMAP_DEFAULT(a, s) win32munmap((a), (s))
+#define DIRECT_MMAP_DEFAULT(s) win32direct_mmap(s)
+#endif /* WIN32 */
+#endif /* HAVE_MMAP */
+
+#if HAVE_MREMAP
+#ifndef WIN32
+#define MREMAP_DEFAULT(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv))
+#endif /* WIN32 */
+#endif /* HAVE_MREMAP */
+
+/**
+ * Define CALL_MORECORE
+ */
+#if HAVE_MORECORE
+ #ifdef MORECORE
+ #define CALL_MORECORE(S) MORECORE(S)
+ #else /* MORECORE */
+ #define CALL_MORECORE(S) MORECORE_DEFAULT(S)
+ #endif /* MORECORE */
+#else /* HAVE_MORECORE */
+ #define CALL_MORECORE(S) MFAIL
+#endif /* HAVE_MORECORE */
+
+/**
+ * Define CALL_MMAP/CALL_MUNMAP/CALL_DIRECT_MMAP
+ */
+#if HAVE_MMAP
+ #define USE_MMAP_BIT (SIZE_T_ONE)
+
+ #ifdef MMAP
+ #define CALL_MMAP(s) MMAP(s)
+ #else /* MMAP */
+ #define CALL_MMAP(s) MMAP_DEFAULT(s)
+ #endif /* MMAP */
+ #ifdef MUNMAP
+ #define CALL_MUNMAP(a, s) MUNMAP((a), (s))
+ #else /* MUNMAP */
+ #define CALL_MUNMAP(a, s) MUNMAP_DEFAULT((a), (s))
+ #endif /* MUNMAP */
+ #ifdef DIRECT_MMAP
+ #define CALL_DIRECT_MMAP(s) DIRECT_MMAP(s)
+ #else /* DIRECT_MMAP */
+ #define CALL_DIRECT_MMAP(s) DIRECT_MMAP_DEFAULT(s)
+ #endif /* DIRECT_MMAP */
+#else /* HAVE_MMAP */
+ #define USE_MMAP_BIT (SIZE_T_ZERO)
+
+ #define MMAP(s) MFAIL
+ #define MUNMAP(a, s) (-1)
+ #define DIRECT_MMAP(s) MFAIL
+ #define CALL_DIRECT_MMAP(s) DIRECT_MMAP(s)
+ #define CALL_MMAP(s) MMAP(s)
+ #define CALL_MUNMAP(a, s) MUNMAP((a), (s))
+#endif /* HAVE_MMAP */
+
+/**
+ * Define CALL_MREMAP
+ */
+#if HAVE_MMAP && HAVE_MREMAP
+ #ifdef MREMAP
+ #define CALL_MREMAP(addr, osz, nsz, mv) MREMAP((addr), (osz), (nsz), (mv))
+ #else /* MREMAP */
+ #define CALL_MREMAP(addr, osz, nsz, mv) MREMAP_DEFAULT((addr), (osz), (nsz), (mv))
+ #endif /* MREMAP */
+#else /* HAVE_MMAP && HAVE_MREMAP */
+ #define CALL_MREMAP(addr, osz, nsz, mv) MFAIL
+#endif /* HAVE_MMAP && HAVE_MREMAP */
+
+/* mstate bit set if continguous morecore disabled or failed */
+#define USE_NONCONTIGUOUS_BIT (4U)
+
+/* segment bit set in create_mspace_with_base */
+#define EXTERN_BIT (8U)
+
+
+/* --------------------------- Lock preliminaries ------------------------ */
+
+/*
+ When locks are defined, there is one global lock, plus
+ one per-mspace lock.
+
+ The global lock_ensures that mparams.magic and other unique
+ mparams values are initialized only once. It also protects
+ sequences of calls to MORECORE. In many cases sys_alloc requires
+ two calls, that should not be interleaved with calls by other
+ threads. This does not protect against direct calls to MORECORE
+ by other threads not using this lock, so there is still code to
+ cope the best we can on interference.
+
+ Per-mspace locks surround calls to malloc, free, etc.
+ By default, locks are simple non-reentrant mutexes.
+
+ Because lock-protected regions generally have bounded times, it is
+ OK to use the supplied simple spinlocks. Spinlocks are likely to
+ improve performance for lightly contended applications, but worsen
+ performance under heavy contention.
+
+ If USE_LOCKS is > 1, the definitions of lock routines here are
+ bypassed, in which case you will need to define the type MLOCK_T,
+ and at least INITIAL_LOCK, DESTROY_LOCK, ACQUIRE_LOCK, RELEASE_LOCK
+ and TRY_LOCK. You must also declare a
+ static MLOCK_T malloc_global_mutex = { initialization values };.
+
+*/
+
+#if !USE_LOCKS
+#define USE_LOCK_BIT (0U)
+#define INITIAL_LOCK(l) (0)
+#define DESTROY_LOCK(l) (0)
+#define ACQUIRE_MALLOC_GLOBAL_LOCK()
+#define RELEASE_MALLOC_GLOBAL_LOCK()
+
+#else
+#if USE_LOCKS > 1
+/* ----------------------- User-defined locks ------------------------ */
+/* Define your own lock implementation here */
+/* #define INITIAL_LOCK(lk) ... */
+/* #define DESTROY_LOCK(lk) ... */
+/* #define ACQUIRE_LOCK(lk) ... */
+/* #define RELEASE_LOCK(lk) ... */
+/* #define TRY_LOCK(lk) ... */
+/* static MLOCK_T malloc_global_mutex = ... */
+
+#elif USE_SPIN_LOCKS
+
+/* First, define CAS_LOCK and CLEAR_LOCK on ints */
+/* Note CAS_LOCK defined to return 0 on success */
+
+#if defined(__GNUC__)&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1))
+#define CAS_LOCK(sl) __sync_lock_test_and_set(sl, 1)
+#define CLEAR_LOCK(sl) __sync_lock_release(sl)
+
+#elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)))
+/* Custom spin locks for older gcc on x86 */
+static FORCEINLINE int x86_cas_lock(int *sl) {
+ int ret;
+ int val = 1;
+ int cmp = 0;
+ __asm__ __volatile__ ("lock; cmpxchgl %1, %2"
+ : "=a" (ret)
+ : "r" (val), "m" (*(sl)), "0"(cmp)
+ : "memory", "cc");
+ return ret;
+}
+
+static FORCEINLINE void x86_clear_lock(int* sl) {
+ assert(*sl != 0);
+ int prev = 0;
+ int ret;
+ __asm__ __volatile__ ("lock; xchgl %0, %1"
+ : "=r" (ret)
+ : "m" (*(sl)), "0"(prev)
+ : "memory");
+}
+
+#define CAS_LOCK(sl) x86_cas_lock(sl)
+#define CLEAR_LOCK(sl) x86_clear_lock(sl)
+
+#else /* Win32 MSC */
+#define CAS_LOCK(sl) interlockedexchange(sl, (LONG)1)
+#define CLEAR_LOCK(sl) interlockedexchange (sl, (LONG)0)
+
+#endif /* ... gcc spins locks ... */
+
+/* How to yield for a spin lock */
+#define SPINS_PER_YIELD 63
+#if defined(_MSC_VER)
+#define SLEEP_EX_DURATION 50 /* delay for yield/sleep */
+#define SPIN_LOCK_YIELD SleepEx(SLEEP_EX_DURATION, FALSE)
+#elif defined (__SVR4) && defined (__sun) /* solaris */
+#define SPIN_LOCK_YIELD thr_yield();
+#elif !defined(LACKS_SCHED_H)
+#define SPIN_LOCK_YIELD sched_yield();
+#else
+#define SPIN_LOCK_YIELD
+#endif /* ... yield ... */
+
+#if !defined(USE_RECURSIVE_LOCKS) || USE_RECURSIVE_LOCKS == 0
+/* Plain spin locks use single word (embedded in malloc_states) */
+static int spin_acquire_lock(int *sl) {
+ int spins = 0;
+ while (*(volatile int *)sl != 0 || CAS_LOCK(sl)) {
+ if ((++spins & SPINS_PER_YIELD) == 0) {
+ SPIN_LOCK_YIELD;
+ }
+ }
+ return 0;
+}
+
+#define MLOCK_T int
+#define TRY_LOCK(sl) !CAS_LOCK(sl)
+#define RELEASE_LOCK(sl) CLEAR_LOCK(sl)
+#define ACQUIRE_LOCK(sl) (CAS_LOCK(sl)? spin_acquire_lock(sl) : 0)
+#define INITIAL_LOCK(sl) (*sl = 0)
+#define DESTROY_LOCK(sl) (0)
+static MLOCK_T malloc_global_mutex = 0;
+
+#else /* USE_RECURSIVE_LOCKS */
+/* types for lock owners */
+#ifdef WIN32
+#define THREAD_ID_T DWORD
+#define CURRENT_THREAD GetCurrentThreadId()
+#define EQ_OWNER(X,Y) ((X) == (Y))
+#else
+/*
+ Note: the following assume that pthread_t is a type that can be
+ initialized to (casted) zero. If this is not the case, you will need to
+ somehow redefine these or not use spin locks.
+*/
+#define THREAD_ID_T pthread_t
+#define CURRENT_THREAD pthread_self()
+#define EQ_OWNER(X,Y) pthread_equal(X, Y)
+#endif
+
+struct malloc_recursive_lock {
+ int sl;
+ unsigned int c;
+ THREAD_ID_T threadid;
+};
+
+#define MLOCK_T struct malloc_recursive_lock
+static MLOCK_T malloc_global_mutex = { 0, 0, (THREAD_ID_T)0};
+
+static FORCEINLINE void recursive_release_lock(MLOCK_T *lk) {
+ assert(lk->sl != 0);
+ if (--lk->c == 0) {
+ CLEAR_LOCK(&lk->sl);
+ }
+}
+
+static FORCEINLINE int recursive_acquire_lock(MLOCK_T *lk) {
+ THREAD_ID_T mythreadid = CURRENT_THREAD;
+ int spins = 0;
+ for (;;) {
+ if (*((volatile int *)(&lk->sl)) == 0) {
+ if (!CAS_LOCK(&lk->sl)) {
+ lk->threadid = mythreadid;
+ lk->c = 1;
+ return 0;
+ }
+ }
+ else if (EQ_OWNER(lk->threadid, mythreadid)) {
+ ++lk->c;
+ return 0;
+ }
+ if ((++spins & SPINS_PER_YIELD) == 0) {
+ SPIN_LOCK_YIELD;
+ }
+ }
+}
+
+static FORCEINLINE int recursive_try_lock(MLOCK_T *lk) {
+ THREAD_ID_T mythreadid = CURRENT_THREAD;
+ if (*((volatile int *)(&lk->sl)) == 0) {
+ if (!CAS_LOCK(&lk->sl)) {
+ lk->threadid = mythreadid;
+ lk->c = 1;
+ return 1;
+ }
+ }
+ else if (EQ_OWNER(lk->threadid, mythreadid)) {
+ ++lk->c;
+ return 1;
+ }
+ return 0;
+}
+
+#define RELEASE_LOCK(lk) recursive_release_lock(lk)
+#define TRY_LOCK(lk) recursive_try_lock(lk)
+#define ACQUIRE_LOCK(lk) recursive_acquire_lock(lk)
+#define INITIAL_LOCK(lk) ((lk)->threadid = (THREAD_ID_T)0, (lk)->sl = 0, (lk)->c = 0)
+#define DESTROY_LOCK(lk) (0)
+#endif /* USE_RECURSIVE_LOCKS */
+
+#elif defined(WIN32) /* Win32 critical sections */
+#define MLOCK_T CRITICAL_SECTION
+#define ACQUIRE_LOCK(lk) (EnterCriticalSection(lk), 0)
+#define RELEASE_LOCK(lk) LeaveCriticalSection(lk)
+#define TRY_LOCK(lk) TryEnterCriticalSection(lk)
+#define INITIAL_LOCK(lk) (!InitializeCriticalSectionAndSpinCount((lk), 0x80000000|4000))
+#define DESTROY_LOCK(lk) (DeleteCriticalSection(lk), 0)
+#define NEED_GLOBAL_LOCK_INIT
+
+static MLOCK_T malloc_global_mutex;
+static volatile LONG malloc_global_mutex_status;
+
+/* Use spin loop to initialize global lock */
+static void init_malloc_global_mutex() {
+ for (;;) {
+ long stat = malloc_global_mutex_status;
+ if (stat > 0)
+ return;
+ /* transition to < 0 while initializing, then to > 0) */
+ if (stat == 0 &&
+ interlockedcompareexchange(&malloc_global_mutex_status, (LONG)-1, (LONG)0) == 0) {
+ InitializeCriticalSection(&malloc_global_mutex);
+ interlockedexchange(&malloc_global_mutex_status, (LONG)1);
+ return;
+ }
+ SleepEx(0, FALSE);
+ }
+}
+
+#else /* pthreads-based locks */
+#define MLOCK_T pthread_mutex_t
+#define ACQUIRE_LOCK(lk) pthread_mutex_lock(lk)
+#define RELEASE_LOCK(lk) pthread_mutex_unlock(lk)
+#define TRY_LOCK(lk) (!pthread_mutex_trylock(lk))
+#define INITIAL_LOCK(lk) pthread_init_lock(lk)
+#define DESTROY_LOCK(lk) pthread_mutex_destroy(lk)
+
+#if defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0 && defined(linux) && !defined(PTHREAD_MUTEX_RECURSIVE)
+/* Cope with old-style linux recursive lock initialization by adding */
+/* skipped internal declaration from pthread.h */
+extern int pthread_mutexattr_setkind_np __P ((pthread_mutexattr_t *__attr,
+ int __kind));
+#define PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP
+#define pthread_mutexattr_settype(x,y) pthread_mutexattr_setkind_np(x,y)
+#endif /* USE_RECURSIVE_LOCKS ... */
+
+static MLOCK_T malloc_global_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static int pthread_init_lock (MLOCK_T *lk) {
+ pthread_mutexattr_t attr;
+ if (pthread_mutexattr_init(&attr)) return 1;
+#if defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0
+ if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)) return 1;
+#endif
+ if (pthread_mutex_init(lk, &attr)) return 1;
+ if (pthread_mutexattr_destroy(&attr)) return 1;
+ return 0;
+}
+
+#endif /* ... lock types ... */
+
+/* Common code for all lock types */
+#define USE_LOCK_BIT (2U)
+
+#ifndef ACQUIRE_MALLOC_GLOBAL_LOCK
+#define ACQUIRE_MALLOC_GLOBAL_LOCK() ACQUIRE_LOCK(&malloc_global_mutex);
+#endif
+
+#ifndef RELEASE_MALLOC_GLOBAL_LOCK
+#define RELEASE_MALLOC_GLOBAL_LOCK() RELEASE_LOCK(&malloc_global_mutex);
+#endif
+
+#endif /* USE_LOCKS */
+
+/* ----------------------- Chunk representations ------------------------ */
+
+/*
+ (The following includes lightly edited explanations by Colin Plumb.)
+
+ The malloc_chunk declaration below is misleading (but accurate and
+ necessary). It declares a "view" into memory allowing access to
+ necessary fields at known offsets from a given base.
+
+ Chunks of memory are maintained using a `boundary tag' method as
+ originally described by Knuth. (See the paper by Paul Wilson
+ ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such
+ techniques.) Sizes of free chunks are stored both in the front of
+ each chunk and at the end. This makes consolidating fragmented
+ chunks into bigger chunks fast. The head fields also hold bits
+ representing whether chunks are free or in use.
+
+ Here are some pictures to make it clearer. They are "exploded" to
+ show that the state of a chunk can be thought of as extending from
+ the high 31 bits of the head field of its header through the
+ prev_foot and PINUSE_BIT bit of the following chunk header.
+
+ A chunk that's in use looks like:
+
+ chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of previous chunk (if P = 0) |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
+ | Size of this chunk 1| +-+
+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | |
+ +- -+
+ | |
+ +- -+
+ | :
+ +- size - sizeof(size_t) available payload bytes -+
+ : |
+ chunk-> +- -+
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1|
+ | Size of next chunk (may or may not be in use) | +-+
+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ And if it's free, it looks like this:
+
+ chunk-> +- -+
+ | User payload (must be in use, or we would have merged!) |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
+ | Size of this chunk 0| +-+
+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Next pointer |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Prev pointer |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | :
+ +- size - sizeof(struct chunk) unused bytes -+
+ : |
+ chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of this chunk |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0|
+ | Size of next chunk (must be in use, or we would have merged)| +-+
+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | :
+ +- User payload -+
+ : |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ |0|
+ +-+
+ Note that since we always merge adjacent free chunks, the chunks
+ adjacent to a free chunk must be in use.
+
+ Given a pointer to a chunk (which can be derived trivially from the
+ payload pointer) we can, in O(1) time, find out whether the adjacent
+ chunks are free, and if so, unlink them from the lists that they
+ are on and merge them with the current chunk.
+
+ Chunks always begin on even word boundaries, so the mem portion
+ (which is returned to the user) is also on an even word boundary, and
+ thus at least double-word aligned.
+
+ The P (PINUSE_BIT) bit, stored in the unused low-order bit of the
+ chunk size (which is always a multiple of two words), is an in-use
+ bit for the *previous* chunk. If that bit is *clear*, then the
+ word before the current chunk size contains the previous chunk
+ size, and can be used to find the front of the previous chunk.
+ The very first chunk allocated always has this bit set, preventing
+ access to non-existent (or non-owned) memory. If pinuse is set for
+ any given chunk, then you CANNOT determine the size of the
+ previous chunk, and might even get a memory addressing fault when
+ trying to do so.
+
+ The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of
+ the chunk size redundantly records whether the current chunk is
+ inuse (unless the chunk is mmapped). This redundancy enables usage
+ checks within free and realloc, and reduces indirection when freeing
+ and consolidating chunks.
+
+ Each freshly allocated chunk must have both cinuse and pinuse set.
+ That is, each allocated chunk borders either a previously allocated
+ and still in-use chunk, or the base of its memory arena. This is
+ ensured by making all allocations from the `lowest' part of any
+ found chunk. Further, no free chunk physically borders another one,
+ so each free chunk is known to be preceded and followed by either
+ inuse chunks or the ends of memory.
+
+ Note that the `foot' of the current chunk is actually represented
+ as the prev_foot of the NEXT chunk. This makes it easier to
+ deal with alignments etc but can be very confusing when trying
+ to extend or adapt this code.
+
+ The exceptions to all this are
+
+ 1. The special chunk `top' is the top-most available chunk (i.e.,
+ the one bordering the end of available memory). It is treated
+ specially. Top is never included in any bin, is used only if
+ no other chunk is available, and is released back to the
+ system if it is very large (see M_TRIM_THRESHOLD). In effect,
+ the top chunk is treated as larger (and thus less well
+ fitting) than any other available chunk. The top chunk
+ doesn't update its trailing size field since there is no next
+ contiguous chunk that would have to index off it. However,
+ space is still allocated for it (TOP_FOOT_SIZE) to enable
+ separation or merging when space is extended.
+
+ 3. Chunks allocated via mmap, have both cinuse and pinuse bits
+ cleared in their head fields. Because they are allocated
+ one-by-one, each must carry its own prev_foot field, which is
+ also used to hold the offset this chunk has within its mmapped
+ region, which is needed to preserve alignment. Each mmapped
+ chunk is trailed by the first two fields of a fake next-chunk
+ for sake of usage checks.
+
+*/
+
+struct malloc_chunk {
+ size_t prev_foot; /* Size of previous chunk (if free). */
+ size_t head; /* Size and inuse bits. */
+ struct malloc_chunk* fd; /* double links -- used only if free. */
+ struct malloc_chunk* bk;
+};
+
+typedef struct malloc_chunk mchunk;
+typedef struct malloc_chunk* mchunkptr;
+typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */
+typedef unsigned int bindex_t; /* Described below */
+typedef unsigned int binmap_t; /* Described below */
+typedef unsigned int flag_t; /* The type of various bit flag sets */
+
+/* ------------------- Chunks sizes and alignments ----------------------- */
+
+#define MCHUNK_SIZE (sizeof(mchunk))
+
+#if FOOTERS
+#define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES)
+#else /* FOOTERS */
+#define CHUNK_OVERHEAD (SIZE_T_SIZE)
+#endif /* FOOTERS */
+
+/* MMapped chunks need a second word of overhead ... */
+#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES)
+/* ... and additional padding for fake next-chunk at foot */
+#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES)
+
+/* The smallest size we can malloc is an aligned minimal chunk */
+#define MIN_CHUNK_SIZE\
+ ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
+
+/* conversion from malloc headers to user pointers, and back */
+#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES))
+#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES))
+/* chunk associated with aligned address A */
+#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A)))
+
+/* Bounds on request (not chunk) sizes. */
+#define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2)
+#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE)
+
+/* pad request bytes into a usable size */
+#define pad_request(req) \
+ (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
+
+/* pad request, checking for minimum (but not maximum) */
+#define request2size(req) \
+ (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req))
+
+
+/* ------------------ Operations on head and foot fields ----------------- */
+
+/*
+ The head field of a chunk is or'ed with PINUSE_BIT when previous
+ adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in
+ use, unless mmapped, in which case both bits are cleared.
+
+ FLAG4_BIT is not used by this malloc, but might be useful in extensions.
+*/
+
+#define PINUSE_BIT (SIZE_T_ONE)
+#define CINUSE_BIT (SIZE_T_TWO)
+#define FLAG4_BIT (SIZE_T_FOUR)
+#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT)
+#define FLAG_BITS (PINUSE_BIT|CINUSE_BIT|FLAG4_BIT)
+
+/* Head value for fenceposts */
+#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE)
+
+/* extraction of fields from head words */
+#define cinuse(p) ((p)->head & CINUSE_BIT)
+#define pinuse(p) ((p)->head & PINUSE_BIT)
+#define flag4inuse(p) ((p)->head & FLAG4_BIT)
+#define is_inuse(p) (((p)->head & INUSE_BITS) != PINUSE_BIT)
+#define is_mmapped(p) (((p)->head & INUSE_BITS) == 0)
+
+#define chunksize(p) ((p)->head & ~(FLAG_BITS))
+
+#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT)
+#define set_flag4(p) ((p)->head |= FLAG4_BIT)
+#define clear_flag4(p) ((p)->head &= ~FLAG4_BIT)
+
+/* Treat space at ptr +/- offset as a chunk */
+#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s)))
+#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s)))
+
+/* Ptr to next or previous physical malloc_chunk. */
+#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~FLAG_BITS)))
+#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) ))
+
+/* extract next chunk's pinuse bit */
+#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT)
+
+/* Get/set size at footer */
+#define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot)
+#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s))
+
+/* Set size, pinuse bit, and foot */
+#define set_size_and_pinuse_of_free_chunk(p, s)\
+ ((p)->head = (s|PINUSE_BIT), set_foot(p, s))
+
+/* Set size, pinuse bit, foot, and clear next pinuse */
+#define set_free_with_pinuse(p, s, n)\
+ (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s))
+
+/* Get the internal overhead associated with chunk p */
+#define overhead_for(p)\
+ (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD)
+
+/* Return true if malloced space is not necessarily cleared */
+#if MMAP_CLEARS
+#define calloc_must_clear(p) (!is_mmapped(p))
+#else /* MMAP_CLEARS */
+#define calloc_must_clear(p) (1)
+#endif /* MMAP_CLEARS */
+
+/* ---------------------- Overlaid data structures ----------------------- */
+
+/*
+ When chunks are not in use, they are treated as nodes of either
+ lists or trees.
+
+ "Small" chunks are stored in circular doubly-linked lists, and look
+ like this:
+
+ chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of previous chunk |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ `head:' | Size of chunk, in bytes |P|
+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Forward pointer to next chunk in list |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Back pointer to previous chunk in list |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Unused space (may be 0 bytes long) .
+ . .
+ . |
+nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ `foot:' | Size of chunk, in bytes |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Larger chunks are kept in a form of bitwise digital trees (aka
+ tries) keyed on chunksizes. Because malloc_tree_chunks are only for
+ free chunks greater than 256 bytes, their size doesn't impose any
+ constraints on user chunk sizes. Each node looks like:
+
+ chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of previous chunk |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ `head:' | Size of chunk, in bytes |P|
+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Forward pointer to next chunk of same size |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Back pointer to previous chunk of same size |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Pointer to left child (child[0]) |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Pointer to right child (child[1]) |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Pointer to parent |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | bin index of this chunk |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Unused space .
+ . |
+nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ `foot:' | Size of chunk, in bytes |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Each tree holding treenodes is a tree of unique chunk sizes. Chunks
+ of the same size are arranged in a circularly-linked list, with only
+ the oldest chunk (the next to be used, in our FIFO ordering)
+ actually in the tree. (Tree members are distinguished by a non-null
+ parent pointer.) If a chunk with the same size an an existing node
+ is inserted, it is linked off the existing node using pointers that
+ work in the same way as fd/bk pointers of small chunks.
+
+ Each tree contains a power of 2 sized range of chunk sizes (the
+ smallest is 0x100 <= x < 0x180), which is is divided in half at each
+ tree level, with the chunks in the smaller half of the range (0x100
+ <= x < 0x140 for the top nose) in the left subtree and the larger
+ half (0x140 <= x < 0x180) in the right subtree. This is, of course,
+ done by inspecting individual bits.
+
+ Using these rules, each node's left subtree contains all smaller
+ sizes than its right subtree. However, the node at the root of each
+ subtree has no particular ordering relationship to either. (The
+ dividing line between the subtree sizes is based on trie relation.)
+ If we remove the last chunk of a given size from the interior of the
+ tree, we need to replace it with a leaf node. The tree ordering
+ rules permit a node to be replaced by any leaf below it.
+
+ The smallest chunk in a tree (a common operation in a best-fit
+ allocator) can be found by walking a path to the leftmost leaf in
+ the tree. Unlike a usual binary tree, where we follow left child
+ pointers until we reach a null, here we follow the right child
+ pointer any time the left one is null, until we reach a leaf with
+ both child pointers null. The smallest chunk in the tree will be
+ somewhere along that path.
+
+ The worst case number of steps to add, find, or remove a node is
+ bounded by the number of bits differentiating chunks within
+ bins. Under current bin calculations, this ranges from 6 up to 21
+ (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case
+ is of course much better.
+*/
+
+struct malloc_tree_chunk {
+ /* The first four fields must be compatible with malloc_chunk */
+ size_t prev_foot;
+ size_t head;
+ struct malloc_tree_chunk* fd;
+ struct malloc_tree_chunk* bk;
+
+ struct malloc_tree_chunk* child[2];
+ struct malloc_tree_chunk* parent;
+ bindex_t index;
+};
+
+typedef struct malloc_tree_chunk tchunk;
+typedef struct malloc_tree_chunk* tchunkptr;
+typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */
+
+/* A little helper macro for trees */
+#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1])
+
+/* ----------------------------- Segments -------------------------------- */
+
+/*
+ Each malloc space may include non-contiguous segments, held in a
+ list headed by an embedded malloc_segment record representing the
+ top-most space. Segments also include flags holding properties of
+ the space. Large chunks that are directly allocated by mmap are not
+ included in this list. They are instead independently created and
+ destroyed without otherwise keeping track of them.
+
+ Segment management mainly comes into play for spaces allocated by
+ MMAP. Any call to MMAP might or might not return memory that is
+ adjacent to an existing segment. MORECORE normally contiguously
+ extends the current space, so this space is almost always adjacent,
+ which is simpler and faster to deal with. (This is why MORECORE is
+ used preferentially to MMAP when both are available -- see
+ sys_alloc.) When allocating using MMAP, we don't use any of the
+ hinting mechanisms (inconsistently) supported in various
+ implementations of unix mmap, or distinguish reserving from
+ committing memory. Instead, we just ask for space, and exploit
+ contiguity when we get it. It is probably possible to do
+ better than this on some systems, but no general scheme seems
+ to be significantly better.
+
+ Management entails a simpler variant of the consolidation scheme
+ used for chunks to reduce fragmentation -- new adjacent memory is
+ normally prepended or appended to an existing segment. However,
+ there are limitations compared to chunk consolidation that mostly
+ reflect the fact that segment processing is relatively infrequent
+ (occurring only when getting memory from system) and that we
+ don't expect to have huge numbers of segments:
+
+ * Segments are not indexed, so traversal requires linear scans. (It
+ would be possible to index these, but is not worth the extra
+ overhead and complexity for most programs on most platforms.)
+ * New segments are only appended to old ones when holding top-most
+ memory; if they cannot be prepended to others, they are held in
+ different segments.
+
+ Except for the top-most segment of an mstate, each segment record
+ is kept at the tail of its segment. Segments are added by pushing
+ segment records onto the list headed by &mstate.seg for the
+ containing mstate.
+
+ Segment flags control allocation/merge/deallocation policies:
+ * If EXTERN_BIT set, then we did not allocate this segment,
+ and so should not try to deallocate or merge with others.
+ (This currently holds only for the initial segment passed
+ into create_mspace_with_base.)
+ * If USE_MMAP_BIT set, the segment may be merged with
+ other surrounding mmapped segments and trimmed/de-allocated
+ using munmap.
+ * If neither bit is set, then the segment was obtained using
+ MORECORE so can be merged with surrounding MORECORE'd segments
+ and deallocated/trimmed using MORECORE with negative arguments.
+*/
+
+struct malloc_segment {
+ char* base; /* base address */
+ size_t size; /* allocated size */
+ struct malloc_segment* next; /* ptr to next segment */
+ flag_t sflags; /* mmap and extern flag */
+};
+
+#define is_mmapped_segment(S) ((S)->sflags & USE_MMAP_BIT)
+#define is_extern_segment(S) ((S)->sflags & EXTERN_BIT)
+
+typedef struct malloc_segment msegment;
+typedef struct malloc_segment* msegmentptr;
+
+/* ---------------------------- malloc_state ----------------------------- */
+
+/*
+ A malloc_state holds all of the bookkeeping for a space.
+ The main fields are:
+
+ Top
+ The topmost chunk of the currently active segment. Its size is
+ cached in topsize. The actual size of topmost space is
+ topsize+TOP_FOOT_SIZE, which includes space reserved for adding
+ fenceposts and segment records if necessary when getting more
+ space from the system. The size at which to autotrim top is
+ cached from mparams in trim_check, except that it is disabled if
+ an autotrim fails.
+
+ Designated victim (dv)
+ This is the preferred chunk for servicing small requests that
+ don't have exact fits. It is normally the chunk split off most
+ recently to service another small request. Its size is cached in
+ dvsize. The link fields of this chunk are not maintained since it
+ is not kept in a bin.
+
+ SmallBins
+ An array of bin headers for free chunks. These bins hold chunks
+ with sizes less than MIN_LARGE_SIZE bytes. Each bin contains
+ chunks of all the same size, spaced 8 bytes apart. To simplify
+ use in double-linked lists, each bin header acts as a malloc_chunk
+ pointing to the real first node, if it exists (else pointing to
+ itself). This avoids special-casing for headers. But to avoid
+ waste, we allocate only the fd/bk pointers of bins, and then use
+ repositioning tricks to treat these as the fields of a chunk.
+
+ TreeBins
+ Treebins are pointers to the roots of trees holding a range of
+ sizes. There are 2 equally spaced treebins for each power of two
+ from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything
+ larger.
+
+ Bin maps
+ There is one bit map for small bins ("smallmap") and one for
+ treebins ("treemap). Each bin sets its bit when non-empty, and
+ clears the bit when empty. Bit operations are then used to avoid
+ bin-by-bin searching -- nearly all "search" is done without ever
+ looking at bins that won't be selected. The bit maps
+ conservatively use 32 bits per map word, even if on 64bit system.
+ For a good description of some of the bit-based techniques used
+ here, see Henry S. Warren Jr's book "Hacker's Delight" (and
+ supplement at http://hackersdelight.org/). Many of these are
+ intended to reduce the branchiness of paths through malloc etc, as
+ well as to reduce the number of memory locations read or written.
+
+ Segments
+ A list of segments headed by an embedded malloc_segment record
+ representing the initial space.
+
+ Address check support
+ The least_addr field is the least address ever obtained from
+ MORECORE or MMAP. Attempted frees and reallocs of any address less
+ than this are trapped (unless INSECURE is defined).
+
+ Magic tag
+ A cross-check field that should always hold same value as mparams.magic.
+
+ Max allowed footprint
+ The maximum allowed bytes to allocate from system (zero means no limit)
+
+ Flags
+ Bits recording whether to use MMAP, locks, or contiguous MORECORE
+
+ Statistics
+ Each space keeps track of current and maximum system memory
+ obtained via MORECORE or MMAP.
+
+ Trim support
+ Fields holding the amount of unused topmost memory that should trigger
+ trimming, and a counter to force periodic scanning to release unused
+ non-topmost segments.
+
+ Locking
+ If USE_LOCKS is defined, the "mutex" lock is acquired and released
+ around every public call using this mspace.
+
+ Extension support
+ A void* pointer and a size_t field that can be used to help implement
+ extensions to this malloc.
+*/
+
+/* Bin types, widths and sizes */
+#define NSMALLBINS (32U)
+#define NTREEBINS (32U)
+#define SMALLBIN_SHIFT (3U)
+#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT)
+#define TREEBIN_SHIFT (8U)
+#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT)
+#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE)
+#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD)
+
+struct malloc_state {
+ binmap_t smallmap;
+ binmap_t treemap;
+ size_t dvsize;
+ size_t topsize;
+ char* least_addr;
+ mchunkptr dv;
+ mchunkptr top;
+ size_t trim_check;
+ size_t release_checks;
+ size_t magic;
+ mchunkptr smallbins[(NSMALLBINS+1)*2];
+ tbinptr treebins[NTREEBINS];
+ size_t footprint;
+ size_t max_footprint;
+ size_t footprint_limit; /* zero means no limit */
+ flag_t mflags;
+#if USE_LOCKS
+ MLOCK_T mutex; /* locate lock among fields that rarely change */
+#endif /* USE_LOCKS */
+ msegment seg;
+ void* extp; /* Unused but available for extensions */
+ size_t exts;
+};
+
+typedef struct malloc_state* mstate;
+
+/* ------------- Global malloc_state and malloc_params ------------------- */
+
+/*
+ malloc_params holds global properties, including those that can be
+ dynamically set using mallopt. There is a single instance, mparams,
+ initialized in init_mparams. Note that the non-zeroness of "magic"
+ also serves as an initialization flag.
+*/
+
+struct malloc_params {
+ size_t magic;
+ size_t page_size;
+ size_t granularity;
+ size_t mmap_threshold;
+ size_t trim_threshold;
+ flag_t default_mflags;
+};
+
+static struct malloc_params mparams;
+
+/* Ensure mparams initialized */
+#define ensure_initialization() (void)(mparams.magic != 0 || init_mparams())
+
+#if !ONLY_MSPACES
+
+/* The global malloc_state used for all non-"mspace" calls */
+static struct malloc_state _gm_;
+#define gm (&_gm_)
+#define is_global(M) ((M) == &_gm_)
+
+#endif /* !ONLY_MSPACES */
+
+#define is_initialized(M) ((M)->top != 0)
+
+/* -------------------------- system alloc setup ------------------------- */
+
+/* Operations on mflags */
+
+#define use_lock(M) ((M)->mflags & USE_LOCK_BIT)
+#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT)
+#if USE_LOCKS
+#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT)
+#else
+#define disable_lock(M)
+#endif
+
+#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT)
+#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT)
+#if HAVE_MMAP
+#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT)
+#else
+#define disable_mmap(M)
+#endif
+
+#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT)
+#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT)
+
+#define set_lock(M,L)\
+ ((M)->mflags = (L)?\
+ ((M)->mflags | USE_LOCK_BIT) :\
+ ((M)->mflags & ~USE_LOCK_BIT))
+
+/* page-align a size */
+#define page_align(S)\
+ (((S) + (mparams.page_size - SIZE_T_ONE)) & ~(mparams.page_size - SIZE_T_ONE))
+
+/* granularity-align a size */
+#define granularity_align(S)\
+ (((S) + (mparams.granularity - SIZE_T_ONE))\
+ & ~(mparams.granularity - SIZE_T_ONE))
+
+
+/* For mmap, use granularity alignment on windows, else page-align */
+#ifdef WIN32
+#define mmap_align(S) granularity_align(S)
+#else
+#define mmap_align(S) page_align(S)
+#endif
+
+/* For sys_alloc, enough padding to ensure can malloc request on success */
+#define SYS_ALLOC_PADDING (TOP_FOOT_SIZE + MALLOC_ALIGNMENT)
+
+#define is_page_aligned(S)\
+ (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0)
+#define is_granularity_aligned(S)\
+ (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0)
+
+/* True if segment S holds address A */
+#define segment_holds(S, A)\
+ ((char*)(A) >= S->base && (char*)(A) < S->base + S->size)
+
+/* Return segment holding given address */
+static msegmentptr segment_holding(mstate m, char* addr) {
+ msegmentptr sp = &m->seg;
+ for (;;) {
+ if (addr >= sp->base && addr < sp->base + sp->size)
+ return sp;
+ if ((sp = sp->next) == 0)
+ return 0;
+ }
+}
+
+/* Return true if segment contains a segment link */
+static int has_segment_link(mstate m, msegmentptr ss) {
+ msegmentptr sp = &m->seg;
+ for (;;) {
+ if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size)
+ return 1;
+ if ((sp = sp->next) == 0)
+ return 0;
+ }
+}
+
+#ifndef MORECORE_CANNOT_TRIM
+#define should_trim(M,s) ((s) > (M)->trim_check)
+#else /* MORECORE_CANNOT_TRIM */
+#define should_trim(M,s) (0)
+#endif /* MORECORE_CANNOT_TRIM */
+
+/*
+ TOP_FOOT_SIZE is padding at the end of a segment, including space
+ that may be needed to place segment records and fenceposts when new
+ noncontiguous segments are added.
+*/
+#define TOP_FOOT_SIZE\
+ (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE)
+
+
+/* ------------------------------- Hooks -------------------------------- */
+
+/*
+ PREACTION should be defined to return 0 on success, and nonzero on
+ failure. If you are not using locking, you can redefine these to do
+ anything you like.
+*/
+
+#if USE_LOCKS
+#define PREACTION(M) ((use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0)
+#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); }
+#else /* USE_LOCKS */
+
+#ifndef PREACTION
+#define PREACTION(M) (0)
+#endif /* PREACTION */
+
+#ifndef POSTACTION
+#define POSTACTION(M)
+#endif /* POSTACTION */
+
+#endif /* USE_LOCKS */
+
+/*
+ CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses.
+ USAGE_ERROR_ACTION is triggered on detected bad frees and
+ reallocs. The argument p is an address that might have triggered the
+ fault. It is ignored by the two predefined actions, but might be
+ useful in custom actions that try to help diagnose errors.
+*/
+
+#if PROCEED_ON_ERROR
+
+/* A count of the number of corruption errors causing resets */
+int malloc_corruption_error_count;
+
+/* default corruption action */
+static void reset_on_error(mstate m);
+
+#define CORRUPTION_ERROR_ACTION(m) reset_on_error(m)
+#define USAGE_ERROR_ACTION(m, p)
+
+#else /* PROCEED_ON_ERROR */
+
+#ifndef CORRUPTION_ERROR_ACTION
+#define CORRUPTION_ERROR_ACTION(m) ABORT
+#endif /* CORRUPTION_ERROR_ACTION */
+
+#ifndef USAGE_ERROR_ACTION
+#define USAGE_ERROR_ACTION(m,p) ABORT
+#endif /* USAGE_ERROR_ACTION */
+
+#endif /* PROCEED_ON_ERROR */
+
+
+/* -------------------------- Debugging setup ---------------------------- */
+
+#if ! DEBUG
+
+#define check_free_chunk(M,P)
+#define check_inuse_chunk(M,P)
+#define check_malloced_chunk(M,P,N)
+#define check_mmapped_chunk(M,P)
+#define check_malloc_state(M)
+#define check_top_chunk(M,P)
+
+#else /* DEBUG */
+#define check_free_chunk(M,P) do_check_free_chunk(M,P)
+#define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P)
+#define check_top_chunk(M,P) do_check_top_chunk(M,P)
+#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N)
+#define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P)
+#define check_malloc_state(M) do_check_malloc_state(M)
+
+static void do_check_any_chunk(mstate m, mchunkptr p);
+static void do_check_top_chunk(mstate m, mchunkptr p);
+static void do_check_mmapped_chunk(mstate m, mchunkptr p);
+static void do_check_inuse_chunk(mstate m, mchunkptr p);
+static void do_check_free_chunk(mstate m, mchunkptr p);
+static void do_check_malloced_chunk(mstate m, void* mem, size_t s);
+static void do_check_tree(mstate m, tchunkptr t);
+static void do_check_treebin(mstate m, bindex_t i);
+static void do_check_smallbin(mstate m, bindex_t i);
+static void do_check_malloc_state(mstate m);
+static int bin_find(mstate m, mchunkptr x);
+static size_t traverse_and_check(mstate m);
+#endif /* DEBUG */
+
+/* ---------------------------- Indexing Bins ---------------------------- */
+
+#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS)
+#define small_index(s) (bindex_t)((s) >> SMALLBIN_SHIFT)
+#define small_index2size(i) ((i) << SMALLBIN_SHIFT)
+#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE))
+
+/* addressing by index. See above about smallbin repositioning */
+#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1])))
+#define treebin_at(M,i) (&((M)->treebins[i]))
+
+/* assign tree index for size S to variable I. Use x86 asm if possible */
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+#define compute_tree_index(S, I)\
+{\
+ unsigned int X = S >> TREEBIN_SHIFT;\
+ if (X == 0)\
+ I = 0;\
+ else if (X > 0xFFFF)\
+ I = NTREEBINS-1;\
+ else {\
+ unsigned int K = (unsigned) sizeof(X)*__CHAR_BIT__ - 1 - (unsigned) __builtin_clz(X); \
+ I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
+ }\
+}
+
+#elif defined (__INTEL_COMPILER)
+#define compute_tree_index(S, I)\
+{\
+ size_t X = S >> TREEBIN_SHIFT;\
+ if (X == 0)\
+ I = 0;\
+ else if (X > 0xFFFF)\
+ I = NTREEBINS-1;\
+ else {\
+ unsigned int K = _bit_scan_reverse (X); \
+ I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
+ }\
+}
+
+#elif defined(_MSC_VER) && _MSC_VER>=1300
+#define compute_tree_index(S, I)\
+{\
+ size_t X = S >> TREEBIN_SHIFT;\
+ if (X == 0)\
+ I = 0;\
+ else if (X > 0xFFFF)\
+ I = NTREEBINS-1;\
+ else {\
+ unsigned int K;\
+ _BitScanReverse((DWORD *) &K, (DWORD) X);\
+ I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
+ }\
+}
+
+#else /* GNUC */
+#define compute_tree_index(S, I)\
+{\
+ size_t X = S >> TREEBIN_SHIFT;\
+ if (X == 0)\
+ I = 0;\
+ else if (X > 0xFFFF)\
+ I = NTREEBINS-1;\
+ else {\
+ unsigned int Y = (unsigned int)X;\
+ unsigned int N = ((Y - 0x100) >> 16) & 8;\
+ unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\
+ N += K;\
+ N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\
+ K = 14 - N + ((Y <<= K) >> 15);\
+ I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\
+ }\
+}
+#endif /* GNUC */
+
+/* Bit representing maximum resolved size in a treebin at i */
+#define bit_for_tree_index(i) \
+ (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2)
+
+/* Shift placing maximum resolved bit in a treebin at i as sign bit */
+#define leftshift_for_tree_index(i) \
+ ((i == NTREEBINS-1)? 0 : \
+ ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2)))
+
+/* The size of the smallest chunk held in bin with index i */
+#define minsize_for_tree_index(i) \
+ ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \
+ (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1)))
+
+
+/* ------------------------ Operations on bin maps ----------------------- */
+
+/* bit corresponding to given index */
+#define idx2bit(i) ((binmap_t)(1) << (i))
+
+/* Mark/Clear bits with given index */
+#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i))
+#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i))
+#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i))
+
+#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i))
+#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i))
+#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i))
+
+/* isolate the least set bit of a bitmap */
+#define least_bit(x) ((x) & -(x))
+
+/* mask with all bits to left of least bit of x on */
+#define left_bits(x) ((x<<1) | -(x<<1))
+
+/* mask with all bits to left of or equal to least bit of x on */
+#define same_or_left_bits(x) ((x) | -(x))
+
+/* index corresponding to given bit. Use x86 asm if possible */
+
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+#define compute_bit2idx(X, I)\
+{\
+ unsigned int J;\
+ J = __builtin_ctz(X); \
+ I = (bindex_t)J;\
+}
+
+#elif defined (__INTEL_COMPILER)
+#define compute_bit2idx(X, I)\
+{\
+ unsigned int J;\
+ J = _bit_scan_forward (X); \
+ I = (bindex_t)J;\
+}
+
+#elif defined(_MSC_VER) && _MSC_VER>=1300
+#define compute_bit2idx(X, I)\
+{\
+ unsigned int J;\
+ _BitScanForward((DWORD *) &J, X);\
+ I = (bindex_t)J;\
+}
+
+#elif USE_BUILTIN_FFS
+#define compute_bit2idx(X, I) I = ffs(X)-1
+
+#else
+#define compute_bit2idx(X, I)\
+{\
+ unsigned int Y = X - 1;\
+ unsigned int K = Y >> (16-4) & 16;\
+ unsigned int N = K; Y >>= K;\
+ N += K = Y >> (8-3) & 8; Y >>= K;\
+ N += K = Y >> (4-2) & 4; Y >>= K;\
+ N += K = Y >> (2-1) & 2; Y >>= K;\
+ N += K = Y >> (1-0) & 1; Y >>= K;\
+ I = (bindex_t)(N + Y);\
+}
+#endif /* GNUC */
+
+
+/* ----------------------- Runtime Check Support ------------------------- */
+
+/*
+ For security, the main invariant is that malloc/free/etc never
+ writes to a static address other than malloc_state, unless static
+ malloc_state itself has been corrupted, which cannot occur via
+ malloc (because of these checks). In essence this means that we
+ believe all pointers, sizes, maps etc held in malloc_state, but
+ check all of those linked or offsetted from other embedded data
+ structures. These checks are interspersed with main code in a way
+ that tends to minimize their run-time cost.
+
+ When FOOTERS is defined, in addition to range checking, we also
+ verify footer fields of inuse chunks, which can be used guarantee
+ that the mstate controlling malloc/free is intact. This is a
+ streamlined version of the approach described by William Robertson
+ et al in "Run-time Detection of Heap-based Overflows" LISA'03
+ http://www.usenix.org/events/lisa03/tech/robertson.html The footer
+ of an inuse chunk holds the xor of its mstate and a random seed,
+ that is checked upon calls to free() and realloc(). This is
+ (probabalistically) unguessable from outside the program, but can be
+ computed by any code successfully malloc'ing any chunk, so does not
+ itself provide protection against code that has already broken
+ security through some other means. Unlike Robertson et al, we
+ always dynamically check addresses of all offset chunks (previous,
+ next, etc). This turns out to be cheaper than relying on hashes.
+*/
+
+#if !INSECURE
+/* Check if address a is at least as high as any from MORECORE or MMAP */
+#define ok_address(M, a) ((char*)(a) >= (M)->least_addr)
+/* Check if address of next chunk n is higher than base chunk p */
+#define ok_next(p, n) ((char*)(p) < (char*)(n))
+/* Check if p has inuse status */
+#define ok_inuse(p) is_inuse(p)
+/* Check if p has its pinuse bit on */
+#define ok_pinuse(p) pinuse(p)
+
+#else /* !INSECURE */
+#define ok_address(M, a) (1)
+#define ok_next(b, n) (1)
+#define ok_inuse(p) (1)
+#define ok_pinuse(p) (1)
+#endif /* !INSECURE */
+
+#if (FOOTERS && !INSECURE)
+/* Check if (alleged) mstate m has expected magic field */
+#define ok_magic(M) ((M)->magic == mparams.magic)
+#else /* (FOOTERS && !INSECURE) */
+#define ok_magic(M) (1)
+#endif /* (FOOTERS && !INSECURE) */
+
+/* In gcc, use __builtin_expect to minimize impact of checks */
+#if !INSECURE
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define RTCHECK(e) __builtin_expect(e, 1)
+#else /* GNUC */
+#define RTCHECK(e) (e)
+#endif /* GNUC */
+#else /* !INSECURE */
+#define RTCHECK(e) (1)
+#endif /* !INSECURE */
+
+/* macros to set up inuse chunks with or without footers */
+
+#if !FOOTERS
+
+#define mark_inuse_foot(M,p,s)
+
+/* Macros for setting head/foot of non-mmapped chunks */
+
+/* Set cinuse bit and pinuse bit of next chunk */
+#define set_inuse(M,p,s)\
+ ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
+ ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
+
+/* Set cinuse and pinuse of this chunk and pinuse of next chunk */
+#define set_inuse_and_pinuse(M,p,s)\
+ ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
+ ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
+
+/* Set size, cinuse and pinuse bit of this chunk */
+#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
+ ((p)->head = (s|PINUSE_BIT|CINUSE_BIT))
+
+#else /* FOOTERS */
+
+/* Set foot of inuse chunk to be xor of mstate and seed */
+#define mark_inuse_foot(M,p,s)\
+ (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic))
+
+#define get_mstate_for(p)\
+ ((mstate)(((mchunkptr)((char*)(p) +\
+ (chunksize(p))))->prev_foot ^ mparams.magic))
+
+#define set_inuse(M,p,s)\
+ ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
+ (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \
+ mark_inuse_foot(M,p,s))
+
+#define set_inuse_and_pinuse(M,p,s)\
+ ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
+ (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\
+ mark_inuse_foot(M,p,s))
+
+#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
+ ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
+ mark_inuse_foot(M, p, s))
+
+#endif /* !FOOTERS */
+
+/* ---------------------------- setting mparams -------------------------- */
+
+#if LOCK_AT_FORK
+static void pre_fork(void) { ACQUIRE_LOCK(&(gm)->mutex); }
+static void post_fork_parent(void) { RELEASE_LOCK(&(gm)->mutex); }
+static void post_fork_child(void) { INITIAL_LOCK(&(gm)->mutex); }
+#endif /* LOCK_AT_FORK */
+
+/* Initialize mparams */
+static int init_mparams(void) {
+#ifdef NEED_GLOBAL_LOCK_INIT
+ if (malloc_global_mutex_status <= 0)
+ init_malloc_global_mutex();
+#endif
+
+ ACQUIRE_MALLOC_GLOBAL_LOCK();
+ if (mparams.magic == 0) {
+ size_t magic;
+ size_t psize;
+ size_t gsize;
+
+#ifndef WIN32
+ psize = malloc_getpagesize;
+ gsize = ((DEFAULT_GRANULARITY != 0)? DEFAULT_GRANULARITY : psize);
+#else /* WIN32 */
+ {
+ SYSTEM_INFO system_info;
+ GetSystemInfo(&system_info);
+ psize = system_info.dwPageSize;
+ gsize = ((DEFAULT_GRANULARITY != 0)?
+ DEFAULT_GRANULARITY : system_info.dwAllocationGranularity);
+ }
+#endif /* WIN32 */
+
+ /* Sanity-check configuration:
+ size_t must be unsigned and as wide as pointer type.
+ ints must be at least 4 bytes.
+ alignment must be at least 8.
+ Alignment, min chunk size, and page size must all be powers of 2.
+ */
+ if ((sizeof(size_t) != sizeof(char*)) ||
+ (MAX_SIZE_T < MIN_CHUNK_SIZE) ||
+ (sizeof(int) < 4) ||
+ (MALLOC_ALIGNMENT < (size_t)8U) ||
+ ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) ||
+ ((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) ||
+ ((gsize & (gsize-SIZE_T_ONE)) != 0) ||
+ ((psize & (psize-SIZE_T_ONE)) != 0))
+ ABORT;
+ mparams.granularity = gsize;
+ mparams.page_size = psize;
+ mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD;
+ mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD;
+#if MORECORE_CONTIGUOUS
+ mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT;
+#else /* MORECORE_CONTIGUOUS */
+ mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT;
+#endif /* MORECORE_CONTIGUOUS */
+
+#if !ONLY_MSPACES
+ /* Set up lock for main malloc area */
+ gm->mflags = mparams.default_mflags;
+ (void)INITIAL_LOCK(&gm->mutex);
+#endif
+#if LOCK_AT_FORK
+ pthread_atfork(&pre_fork, &post_fork_parent, &post_fork_child);
+#endif
+
+ {
+#if USE_DEV_RANDOM
+ int fd;
+ unsigned char buf[sizeof(size_t)];
+ /* Try to use /dev/urandom, else fall back on using time */
+ if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 &&
+ read(fd, buf, sizeof(buf)) == sizeof(buf)) {
+ magic = *((size_t *) buf);
+ close(fd);
+ }
+ else
+#endif /* USE_DEV_RANDOM */
+#ifdef WIN32
+ magic = (size_t)(GetTickCount() ^ (size_t)0x55555555U);
+#elif defined(LACKS_TIME_H)
+ magic = (size_t)&magic ^ (size_t)0x55555555U;
+#else
+ magic = (size_t)(time(0) ^ (size_t)0x55555555U);
+#endif
+ magic |= (size_t)8U; /* ensure nonzero */
+ magic &= ~(size_t)7U; /* improve chances of fault for bad values */
+ /* Until memory modes commonly available, use volatile-write */
+ (*(volatile size_t *)(&(mparams.magic))) = magic;
+ }
+ }
+
+ RELEASE_MALLOC_GLOBAL_LOCK();
+ return 1;
+}
+
+/* support for mallopt */
+static int change_mparam(int param_number, int value) {
+ size_t val;
+ ensure_initialization();
+ val = (value == -1)? MAX_SIZE_T : (size_t)value;
+ switch(param_number) {
+ case M_TRIM_THRESHOLD:
+ mparams.trim_threshold = val;
+ return 1;
+ case M_GRANULARITY:
+ if (val >= mparams.page_size && ((val & (val-1)) == 0)) {
+ mparams.granularity = val;
+ return 1;
+ }
+ else
+ return 0;
+ case M_MMAP_THRESHOLD:
+ mparams.mmap_threshold = val;
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+#if DEBUG
+/* ------------------------- Debugging Support --------------------------- */
+
+/* Check properties of any chunk, whether free, inuse, mmapped etc */
+static void do_check_any_chunk(mstate m, mchunkptr p) {
+ assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
+ assert(ok_address(m, p));
+}
+
+/* Check properties of top chunk */
+static void do_check_top_chunk(mstate m, mchunkptr p) {
+ msegmentptr sp = segment_holding(m, (char*)p);
+ size_t sz = p->head & ~INUSE_BITS; /* third-lowest bit can be set! */
+ assert(sp != 0);
+ assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
+ assert(ok_address(m, p));
+ assert(sz == m->topsize);
+ assert(sz > 0);
+ assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE);
+ assert(pinuse(p));
+ assert(!pinuse(chunk_plus_offset(p, sz)));
+}
+
+/* Check properties of (inuse) mmapped chunks */
+static void do_check_mmapped_chunk(mstate m, mchunkptr p) {
+ size_t sz = chunksize(p);
+ size_t len = (sz + (p->prev_foot) + MMAP_FOOT_PAD);
+ assert(is_mmapped(p));
+ assert(use_mmap(m));
+ assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
+ assert(ok_address(m, p));
+ assert(!is_small(sz));
+ assert((len & (mparams.page_size-SIZE_T_ONE)) == 0);
+ assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD);
+ assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0);
+}
+
+/* Check properties of inuse chunks */
+static void do_check_inuse_chunk(mstate m, mchunkptr p) {
+ do_check_any_chunk(m, p);
+ assert(is_inuse(p));
+ assert(next_pinuse(p));
+ /* If not pinuse and not mmapped, previous chunk has OK offset */
+ assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p);
+ if (is_mmapped(p))
+ do_check_mmapped_chunk(m, p);
+}
+
+/* Check properties of free chunks */
+static void do_check_free_chunk(mstate m, mchunkptr p) {
+ size_t sz = chunksize(p);
+ mchunkptr next = chunk_plus_offset(p, sz);
+ do_check_any_chunk(m, p);
+ assert(!is_inuse(p));
+ assert(!next_pinuse(p));
+ assert (!is_mmapped(p));
+ if (p != m->dv && p != m->top) {
+ if (sz >= MIN_CHUNK_SIZE) {
+ assert((sz & CHUNK_ALIGN_MASK) == 0);
+ assert(is_aligned(chunk2mem(p)));
+ assert(next->prev_foot == sz);
+ assert(pinuse(p));
+ assert (next == m->top || is_inuse(next));
+ assert(p->fd->bk == p);
+ assert(p->bk->fd == p);
+ }
+ else /* markers are always of size SIZE_T_SIZE */
+ assert(sz == SIZE_T_SIZE);
+ }
+}
+
+/* Check properties of malloced chunks at the point they are malloced */
+static void do_check_malloced_chunk(mstate m, void* mem, size_t s) {
+ if (mem != 0) {
+ mchunkptr p = mem2chunk(mem);
+ size_t sz = p->head & ~INUSE_BITS;
+ do_check_inuse_chunk(m, p);
+ assert((sz & CHUNK_ALIGN_MASK) == 0);
+ assert(sz >= MIN_CHUNK_SIZE);
+ assert(sz >= s);
+ /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */
+ assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE));
+ }
+}
+
+/* Check a tree and its subtrees. */
+static void do_check_tree(mstate m, tchunkptr t) {
+ tchunkptr head = 0;
+ tchunkptr u = t;
+ bindex_t tindex = t->index;
+ size_t tsize = chunksize(t);
+ bindex_t idx;
+ compute_tree_index(tsize, idx);
+ assert(tindex == idx);
+ assert(tsize >= MIN_LARGE_SIZE);
+ assert(tsize >= minsize_for_tree_index(idx));
+ assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1))));
+
+ do { /* traverse through chain of same-sized nodes */
+ do_check_any_chunk(m, ((mchunkptr)u));
+ assert(u->index == tindex);
+ assert(chunksize(u) == tsize);
+ assert(!is_inuse(u));
+ assert(!next_pinuse(u));
+ assert(u->fd->bk == u);
+ assert(u->bk->fd == u);
+ if (u->parent == 0) {
+ assert(u->child[0] == 0);
+ assert(u->child[1] == 0);
+ }
+ else {
+ assert(head == 0); /* only one node on chain has parent */
+ head = u;
+ assert(u->parent != u);
+ assert (u->parent->child[0] == u ||
+ u->parent->child[1] == u ||
+ *((tbinptr*)(u->parent)) == u);
+ if (u->child[0] != 0) {
+ assert(u->child[0]->parent == u);
+ assert(u->child[0] != u);
+ do_check_tree(m, u->child[0]);
+ }
+ if (u->child[1] != 0) {
+ assert(u->child[1]->parent == u);
+ assert(u->child[1] != u);
+ do_check_tree(m, u->child[1]);
+ }
+ if (u->child[0] != 0 && u->child[1] != 0) {
+ assert(chunksize(u->child[0]) < chunksize(u->child[1]));
+ }
+ }
+ u = u->fd;
+ } while (u != t);
+ assert(head != 0);
+}
+
+/* Check all the chunks in a treebin. */
+static void do_check_treebin(mstate m, bindex_t i) {
+ tbinptr* tb = treebin_at(m, i);
+ tchunkptr t = *tb;
+ int empty = (m->treemap & (1U << i)) == 0;
+ if (t == 0)
+ assert(empty);
+ if (!empty)
+ do_check_tree(m, t);
+}
+
+/* Check all the chunks in a smallbin. */
+static void do_check_smallbin(mstate m, bindex_t i) {
+ sbinptr b = smallbin_at(m, i);
+ mchunkptr p = b->bk;
+ unsigned int empty = (m->smallmap & (1U << i)) == 0;
+ if (p == b)
+ assert(empty);
+ if (!empty) {
+ for (; p != b; p = p->bk) {
+ size_t size = chunksize(p);
+ mchunkptr q;
+ /* each chunk claims to be free */
+ do_check_free_chunk(m, p);
+ /* chunk belongs in bin */
+ assert(small_index(size) == i);
+ assert(p->bk == b || chunksize(p->bk) == chunksize(p));
+ /* chunk is followed by an inuse chunk */
+ q = next_chunk(p);
+ if (q->head != FENCEPOST_HEAD)
+ do_check_inuse_chunk(m, q);
+ }
+ }
+}
+
+/* Find x in a bin. Used in other check functions. */
+static int bin_find(mstate m, mchunkptr x) {
+ size_t size = chunksize(x);
+ if (is_small(size)) {
+ bindex_t sidx = small_index(size);
+ sbinptr b = smallbin_at(m, sidx);
+ if (smallmap_is_marked(m, sidx)) {
+ mchunkptr p = b;
+ do {
+ if (p == x)
+ return 1;
+ } while ((p = p->fd) != b);
+ }
+ }
+ else {
+ bindex_t tidx;
+ compute_tree_index(size, tidx);
+ if (treemap_is_marked(m, tidx)) {
+ tchunkptr t = *treebin_at(m, tidx);
+ size_t sizebits = size << leftshift_for_tree_index(tidx);
+ while (t != 0 && chunksize(t) != size) {
+ t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
+ sizebits <<= 1;
+ }
+ if (t != 0) {
+ tchunkptr u = t;
+ do {
+ if (u == (tchunkptr)x)
+ return 1;
+ } while ((u = u->fd) != t);
+ }
+ }
+ }
+ return 0;
+}
+
+/* Traverse each chunk and check it; return total */
+static size_t traverse_and_check(mstate m) {
+ size_t sum = 0;
+ if (is_initialized(m)) {
+ msegmentptr s = &m->seg;
+ sum += m->topsize + TOP_FOOT_SIZE;
+ while (s != 0) {
+ mchunkptr q = align_as_chunk(s->base);
+ mchunkptr lastq = 0;
+ assert(pinuse(q));
+ while (segment_holds(s, q) &&
+ q != m->top && q->head != FENCEPOST_HEAD) {
+ sum += chunksize(q);
+ if (is_inuse(q)) {
+ assert(!bin_find(m, q));
+ do_check_inuse_chunk(m, q);
+ }
+ else {
+ assert(q == m->dv || bin_find(m, q));
+ assert(lastq == 0 || is_inuse(lastq)); /* Not 2 consecutive free */
+ do_check_free_chunk(m, q);
+ }
+ lastq = q;
+ q = next_chunk(q);
+ }
+ s = s->next;
+ }
+ }
+ return sum;
+}
+
+
+/* Check all properties of malloc_state. */
+static void do_check_malloc_state(mstate m) {
+ bindex_t i;
+ size_t total;
+ /* check bins */
+ for (i = 0; i < NSMALLBINS; ++i)
+ do_check_smallbin(m, i);
+ for (i = 0; i < NTREEBINS; ++i)
+ do_check_treebin(m, i);
+
+ if (m->dvsize != 0) { /* check dv chunk */
+ do_check_any_chunk(m, m->dv);
+ assert(m->dvsize == chunksize(m->dv));
+ assert(m->dvsize >= MIN_CHUNK_SIZE);
+ assert(bin_find(m, m->dv) == 0);
+ }
+
+ if (m->top != 0) { /* check top chunk */
+ do_check_top_chunk(m, m->top);
+ /*assert(m->topsize == chunksize(m->top)); redundant */
+ assert(m->topsize > 0);
+ assert(bin_find(m, m->top) == 0);
+ }
+
+ total = traverse_and_check(m);
+ assert(total <= m->footprint);
+ assert(m->footprint <= m->max_footprint);
+}
+#endif /* DEBUG */
+
+/* ----------------------------- statistics ------------------------------ */
+
+#if !NO_MALLINFO
+static struct mallinfo internal_mallinfo(mstate m) {
+ struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ ensure_initialization();
+ if (!PREACTION(m)) {
+ check_malloc_state(m);
+ if (is_initialized(m)) {
+ size_t nfree = SIZE_T_ONE; /* top always free */
+ size_t mfree = m->topsize + TOP_FOOT_SIZE;
+ size_t sum = mfree;
+ msegmentptr s = &m->seg;
+ while (s != 0) {
+ mchunkptr q = align_as_chunk(s->base);
+ while (segment_holds(s, q) &&
+ q != m->top && q->head != FENCEPOST_HEAD) {
+ size_t sz = chunksize(q);
+ sum += sz;
+ if (!is_inuse(q)) {
+ mfree += sz;
+ ++nfree;
+ }
+ q = next_chunk(q);
+ }
+ s = s->next;
+ }
+
+ nm.arena = sum;
+ nm.ordblks = nfree;
+ nm.hblkhd = m->footprint - sum;
+ nm.usmblks = m->max_footprint;
+ nm.uordblks = m->footprint - mfree;
+ nm.fordblks = mfree;
+ nm.keepcost = m->topsize;
+ }
+
+ POSTACTION(m);
+ }
+ return nm;
+}
+#endif /* !NO_MALLINFO */
+
+#if !NO_MALLOC_STATS
+static void internal_malloc_stats(mstate m) {
+ ensure_initialization();
+ if (!PREACTION(m)) {
+ size_t maxfp = 0;
+ size_t fp = 0;
+ size_t used = 0;
+ check_malloc_state(m);
+ if (is_initialized(m)) {
+ msegmentptr s = &m->seg;
+ maxfp = m->max_footprint;
+ fp = m->footprint;
+ used = fp - (m->topsize + TOP_FOOT_SIZE);
+
+ while (s != 0) {
+ mchunkptr q = align_as_chunk(s->base);
+ while (segment_holds(s, q) &&
+ q != m->top && q->head != FENCEPOST_HEAD) {
+ if (!is_inuse(q))
+ used -= chunksize(q);
+ q = next_chunk(q);
+ }
+ s = s->next;
+ }
+ }
+ POSTACTION(m); /* drop lock */
+ fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp));
+ fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp));
+ fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used));
+ }
+}
+#endif /* NO_MALLOC_STATS */
+
+/* ----------------------- Operations on smallbins ----------------------- */
+
+/*
+ Various forms of linking and unlinking are defined as macros. Even
+ the ones for trees, which are very long but have very short typical
+ paths. This is ugly but reduces reliance on inlining support of
+ compilers.
+*/
+
+/* Link a free chunk into a smallbin */
+#define insert_small_chunk(M, P, S) {\
+ bindex_t I = small_index(S);\
+ mchunkptr B = smallbin_at(M, I);\
+ mchunkptr F = B;\
+ assert(S >= MIN_CHUNK_SIZE);\
+ if (!smallmap_is_marked(M, I))\
+ mark_smallmap(M, I);\
+ else if (RTCHECK(ok_address(M, B->fd)))\
+ F = B->fd;\
+ else {\
+ CORRUPTION_ERROR_ACTION(M);\
+ }\
+ B->fd = P;\
+ F->bk = P;\
+ P->fd = F;\
+ P->bk = B;\
+}
+
+/* Unlink a chunk from a smallbin */
+#define unlink_small_chunk(M, P, S) {\
+ mchunkptr F = P->fd;\
+ mchunkptr B = P->bk;\
+ bindex_t I = small_index(S);\
+ assert(P != B);\
+ assert(P != F);\
+ assert(chunksize(P) == small_index2size(I));\
+ if (RTCHECK(F == smallbin_at(M,I) || (ok_address(M, F) && F->bk == P))) { \
+ if (B == F) {\
+ clear_smallmap(M, I);\
+ }\
+ else if (RTCHECK(B == smallbin_at(M,I) ||\
+ (ok_address(M, B) && B->fd == P))) {\
+ F->bk = B;\
+ B->fd = F;\
+ }\
+ else {\
+ CORRUPTION_ERROR_ACTION(M);\
+ }\
+ }\
+ else {\
+ CORRUPTION_ERROR_ACTION(M);\
+ }\
+}
+
+/* Unlink the first chunk from a smallbin */
+#define unlink_first_small_chunk(M, B, P, I) {\
+ mchunkptr F = P->fd;\
+ assert(P != B);\
+ assert(P != F);\
+ assert(chunksize(P) == small_index2size(I));\
+ if (B == F) {\
+ clear_smallmap(M, I);\
+ }\
+ else if (RTCHECK(ok_address(M, F) && F->bk == P)) {\
+ F->bk = B;\
+ B->fd = F;\
+ }\
+ else {\
+ CORRUPTION_ERROR_ACTION(M);\
+ }\
+}
+
+/* Replace dv node, binning the old one */
+/* Used only when dvsize known to be small */
+#define replace_dv(M, P, S) {\
+ size_t DVS = M->dvsize;\
+ assert(is_small(DVS));\
+ if (DVS != 0) {\
+ mchunkptr DV = M->dv;\
+ insert_small_chunk(M, DV, DVS);\
+ }\
+ M->dvsize = S;\
+ M->dv = P;\
+}
+
+/* ------------------------- Operations on trees ------------------------- */
+
+/* Insert chunk into tree */
+#define insert_large_chunk(M, X, S) {\
+ tbinptr* H;\
+ bindex_t I;\
+ compute_tree_index(S, I);\
+ H = treebin_at(M, I);\
+ X->index = I;\
+ X->child[0] = X->child[1] = 0;\
+ if (!treemap_is_marked(M, I)) {\
+ mark_treemap(M, I);\
+ *H = X;\
+ X->parent = (tchunkptr)H;\
+ X->fd = X->bk = X;\
+ }\
+ else {\
+ tchunkptr T = *H;\
+ size_t K = S << leftshift_for_tree_index(I);\
+ for (;;) {\
+ if (chunksize(T) != S) {\
+ tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\
+ K <<= 1;\
+ if (*C != 0)\
+ T = *C;\
+ else if (RTCHECK(ok_address(M, C))) {\
+ *C = X;\
+ X->parent = T;\
+ X->fd = X->bk = X;\
+ break;\
+ }\
+ else {\
+ CORRUPTION_ERROR_ACTION(M);\
+ break;\
+ }\
+ }\
+ else {\
+ tchunkptr F = T->fd;\
+ if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\
+ T->fd = F->bk = X;\
+ X->fd = F;\
+ X->bk = T;\
+ X->parent = 0;\
+ break;\
+ }\
+ else {\
+ CORRUPTION_ERROR_ACTION(M);\
+ break;\
+ }\
+ }\
+ }\
+ }\
+}
+
+/*
+ Unlink steps:
+
+ 1. If x is a chained node, unlink it from its same-sized fd/bk links
+ and choose its bk node as its replacement.
+ 2. If x was the last node of its size, but not a leaf node, it must
+ be replaced with a leaf node (not merely one with an open left or
+ right), to make sure that lefts and rights of descendents
+ correspond properly to bit masks. We use the rightmost descendent
+ of x. We could use any other leaf, but this is easy to locate and
+ tends to counteract removal of leftmosts elsewhere, and so keeps
+ paths shorter than minimally guaranteed. This doesn't loop much
+ because on average a node in a tree is near the bottom.
+ 3. If x is the base of a chain (i.e., has parent links) relink
+ x's parent and children to x's replacement (or null if none).
+*/
+
+#define unlink_large_chunk(M, X) {\
+ tchunkptr XP = X->parent;\
+ tchunkptr R;\
+ if (X->bk != X) {\
+ tchunkptr F = X->fd;\
+ R = X->bk;\
+ if (RTCHECK(ok_address(M, F) && F->bk == X && R->fd == X)) {\
+ F->bk = R;\
+ R->fd = F;\
+ }\
+ else {\
+ CORRUPTION_ERROR_ACTION(M);\
+ }\
+ }\
+ else {\
+ tchunkptr* RP;\
+ if (((R = *(RP = &(X->child[1]))) != 0) ||\
+ ((R = *(RP = &(X->child[0]))) != 0)) {\
+ tchunkptr* CP;\
+ while ((*(CP = &(R->child[1])) != 0) ||\
+ (*(CP = &(R->child[0])) != 0)) {\
+ R = *(RP = CP);\
+ }\
+ if (RTCHECK(ok_address(M, RP)))\
+ *RP = 0;\
+ else {\
+ CORRUPTION_ERROR_ACTION(M);\
+ }\
+ }\
+ }\
+ if (XP != 0) {\
+ tbinptr* H = treebin_at(M, X->index);\
+ if (X == *H) {\
+ if ((*H = R) == 0) \
+ clear_treemap(M, X->index);\
+ }\
+ else if (RTCHECK(ok_address(M, XP))) {\
+ if (XP->child[0] == X) \
+ XP->child[0] = R;\
+ else \
+ XP->child[1] = R;\
+ }\
+ else\
+ CORRUPTION_ERROR_ACTION(M);\
+ if (R != 0) {\
+ if (RTCHECK(ok_address(M, R))) {\
+ tchunkptr C0, C1;\
+ R->parent = XP;\
+ if ((C0 = X->child[0]) != 0) {\
+ if (RTCHECK(ok_address(M, C0))) {\
+ R->child[0] = C0;\
+ C0->parent = R;\
+ }\
+ else\
+ CORRUPTION_ERROR_ACTION(M);\
+ }\
+ if ((C1 = X->child[1]) != 0) {\
+ if (RTCHECK(ok_address(M, C1))) {\
+ R->child[1] = C1;\
+ C1->parent = R;\
+ }\
+ else\
+ CORRUPTION_ERROR_ACTION(M);\
+ }\
+ }\
+ else\
+ CORRUPTION_ERROR_ACTION(M);\
+ }\
+ }\
+}
+
+/* Relays to large vs small bin operations */
+
+#define insert_chunk(M, P, S)\
+ if (is_small(S)) insert_small_chunk(M, P, S)\
+ else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); }
+
+#define unlink_chunk(M, P, S)\
+ if (is_small(S)) unlink_small_chunk(M, P, S)\
+ else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); }
+
+
+/* Relays to internal calls to malloc/free from realloc, memalign etc */
+
+#if ONLY_MSPACES
+#define internal_malloc(m, b) mspace_malloc(m, b)
+#define internal_free(m, mem) mspace_free(m,mem);
+#else /* ONLY_MSPACES */
+#if MSPACES
+#define internal_malloc(m, b)\
+ ((m == gm)? dlmalloc(b) : mspace_malloc(m, b))
+#define internal_free(m, mem)\
+ if (m == gm) dlfree(mem); else mspace_free(m,mem);
+#else /* MSPACES */
+#define internal_malloc(m, b) dlmalloc(b)
+#define internal_free(m, mem) dlfree(mem)
+#endif /* MSPACES */
+#endif /* ONLY_MSPACES */
+
+/* ----------------------- Direct-mmapping chunks ----------------------- */
+
+/*
+ Directly mmapped chunks are set up with an offset to the start of
+ the mmapped region stored in the prev_foot field of the chunk. This
+ allows reconstruction of the required argument to MUNMAP when freed,
+ and also allows adjustment of the returned chunk to meet alignment
+ requirements (especially in memalign).
+*/
+
+/* Malloc using mmap */
+static void* mmap_alloc(mstate m, size_t nb) {
+ size_t mmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
+ if (m->footprint_limit != 0) {
+ size_t fp = m->footprint + mmsize;
+ if (fp <= m->footprint || fp > m->footprint_limit)
+ return 0;
+ }
+ if (mmsize > nb) { /* Check for wrap around 0 */
+ char* mm = (char*)(CALL_DIRECT_MMAP(mmsize));
+ if (mm != CMFAIL) {
+ size_t offset = align_offset(chunk2mem(mm));
+ size_t psize = mmsize - offset - MMAP_FOOT_PAD;
+ mchunkptr p = (mchunkptr)(mm + offset);
+ p->prev_foot = offset;
+ p->head = psize;
+ mark_inuse_foot(m, p, psize);
+ chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD;
+ chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0;
+
+ if (m->least_addr == 0 || mm < m->least_addr)
+ m->least_addr = mm;
+ if ((m->footprint += mmsize) > m->max_footprint)
+ m->max_footprint = m->footprint;
+ assert(is_aligned(chunk2mem(p)));
+ check_mmapped_chunk(m, p);
+ return chunk2mem(p);
+ }
+ }
+ return 0;
+}
+
+/* Realloc using mmap */
+static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb, int flags) {
+ size_t oldsize = chunksize(oldp);
+ (void)flags; /* placate people compiling -Wunused */
+ if (is_small(nb)) /* Can't shrink mmap regions below small size */
+ return 0;
+ /* Keep old chunk if big enough but not too big */
+ if (oldsize >= nb + SIZE_T_SIZE &&
+ (oldsize - nb) <= (mparams.granularity << 1))
+ return oldp;
+ else {
+ size_t offset = oldp->prev_foot;
+ size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD;
+ size_t newmmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
+ char* cp = (char*)CALL_MREMAP((char*)oldp - offset,
+ oldmmsize, newmmsize, flags);
+ if (cp != CMFAIL) {
+ mchunkptr newp = (mchunkptr)(cp + offset);
+ size_t psize = newmmsize - offset - MMAP_FOOT_PAD;
+ newp->head = psize;
+ mark_inuse_foot(m, newp, psize);
+ chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD;
+ chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0;
+
+ if (cp < m->least_addr)
+ m->least_addr = cp;
+ if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint)
+ m->max_footprint = m->footprint;
+ check_mmapped_chunk(m, newp);
+ return newp;
+ }
+ }
+ return 0;
+}
+
+
+/* -------------------------- mspace management -------------------------- */
+
+/* Initialize top chunk and its size */
+static void init_top(mstate m, mchunkptr p, size_t psize) {
+ /* Ensure alignment */
+ size_t offset = align_offset(chunk2mem(p));
+ p = (mchunkptr)((char*)p + offset);
+ psize -= offset;
+
+ m->top = p;
+ m->topsize = psize;
+ p->head = psize | PINUSE_BIT;
+ /* set size of fake trailing chunk holding overhead space only once */
+ chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE;
+ m->trim_check = mparams.trim_threshold; /* reset on each update */
+}
+
+/* Initialize bins for a new mstate that is otherwise zeroed out */
+static void init_bins(mstate m) {
+ /* Establish circular links for smallbins */
+ bindex_t i;
+ for (i = 0; i < NSMALLBINS; ++i) {
+ sbinptr bin = smallbin_at(m,i);
+ bin->fd = bin->bk = bin;
+ }
+}
+
+#if PROCEED_ON_ERROR
+
+/* default corruption action */
+static void reset_on_error(mstate m) {
+ int i;
+ ++malloc_corruption_error_count;
+ /* Reinitialize fields to forget about all memory */
+ m->smallmap = m->treemap = 0;
+ m->dvsize = m->topsize = 0;
+ m->seg.base = 0;
+ m->seg.size = 0;
+ m->seg.next = 0;
+ m->top = m->dv = 0;
+ for (i = 0; i < NTREEBINS; ++i)
+ *treebin_at(m, i) = 0;
+ init_bins(m);
+}
+#endif /* PROCEED_ON_ERROR */
+
+/* Allocate chunk and prepend remainder with chunk in successor base. */
+static void* prepend_alloc(mstate m, char* newbase, char* oldbase,
+ size_t nb) {
+ mchunkptr p = align_as_chunk(newbase);
+ mchunkptr oldfirst = align_as_chunk(oldbase);
+ size_t psize = (char*)oldfirst - (char*)p;
+ mchunkptr q = chunk_plus_offset(p, nb);
+ size_t qsize = psize - nb;
+ set_size_and_pinuse_of_inuse_chunk(m, p, nb);
+
+ assert((char*)oldfirst > (char*)q);
+ assert(pinuse(oldfirst));
+ assert(qsize >= MIN_CHUNK_SIZE);
+
+ /* consolidate remainder with first chunk of old base */
+ if (oldfirst == m->top) {
+ size_t tsize = m->topsize += qsize;
+ m->top = q;
+ q->head = tsize | PINUSE_BIT;
+ check_top_chunk(m, q);
+ }
+ else if (oldfirst == m->dv) {
+ size_t dsize = m->dvsize += qsize;
+ m->dv = q;
+ set_size_and_pinuse_of_free_chunk(q, dsize);
+ }
+ else {
+ if (!is_inuse(oldfirst)) {
+ size_t nsize = chunksize(oldfirst);
+ unlink_chunk(m, oldfirst, nsize);
+ oldfirst = chunk_plus_offset(oldfirst, nsize);
+ qsize += nsize;
+ }
+ set_free_with_pinuse(q, qsize, oldfirst);
+ insert_chunk(m, q, qsize);
+ check_free_chunk(m, q);
+ }
+
+ check_malloced_chunk(m, chunk2mem(p), nb);
+ return chunk2mem(p);
+}
+
+/* Add a segment to hold a new noncontiguous region */
+static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) {
+ /* Determine locations and sizes of segment, fenceposts, old top */
+ char* old_top = (char*)m->top;
+ msegmentptr oldsp = segment_holding(m, old_top);
+ char* old_end = oldsp->base + oldsp->size;
+ size_t ssize = pad_request(sizeof(struct malloc_segment));
+ char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
+ size_t offset = align_offset(chunk2mem(rawsp));
+ char* asp = rawsp + offset;
+ char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp;
+ mchunkptr sp = (mchunkptr)csp;
+ msegmentptr ss = (msegmentptr)(chunk2mem(sp));
+ mchunkptr tnext = chunk_plus_offset(sp, ssize);
+ mchunkptr p = tnext;
+ int nfences = 0;
+
+ /* reset top to new space */
+ init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
+
+ /* Set up segment record */
+ assert(is_aligned(ss));
+ set_size_and_pinuse_of_inuse_chunk(m, sp, ssize);
+ *ss = m->seg; /* Push current record */
+ m->seg.base = tbase;
+ m->seg.size = tsize;
+ m->seg.sflags = mmapped;
+ m->seg.next = ss;
+
+ /* Insert trailing fenceposts */
+ for (;;) {
+ mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE);
+ p->head = FENCEPOST_HEAD;
+ ++nfences;
+ if ((char*)(&(nextp->head)) < old_end)
+ p = nextp;
+ else
+ break;
+ }
+ assert(nfences >= 2);
+
+ /* Insert the rest of old top into a bin as an ordinary free chunk */
+ if (csp != old_top) {
+ mchunkptr q = (mchunkptr)old_top;
+ size_t psize = csp - old_top;
+ mchunkptr tn = chunk_plus_offset(q, psize);
+ set_free_with_pinuse(q, psize, tn);
+ insert_chunk(m, q, psize);
+ }
+
+ check_top_chunk(m, m->top);
+}
+
+/* -------------------------- System allocation -------------------------- */
+
+/* Get memory from system using MORECORE or MMAP */
+static void* sys_alloc(mstate m, size_t nb) {
+ char* tbase = CMFAIL;
+ size_t tsize = 0;
+ flag_t mmap_flag = 0;
+ size_t asize; /* allocation size */
+
+ ensure_initialization();
+
+ /* Directly map large chunks, but only if already initialized */
+ if (use_mmap(m) && nb >= mparams.mmap_threshold && m->topsize != 0) {
+ void* mem = mmap_alloc(m, nb);
+ if (mem != 0)
+ return mem;
+ }
+
+ asize = granularity_align(nb + SYS_ALLOC_PADDING);
+#ifdef __wasilibc_unmodified_upstream // Bug fix: set ENOMEM on size overflow
+ if (asize <= nb)
+ return 0; /* wraparound */
+#else
+ if (asize <= nb) {
+ MALLOC_FAILURE_ACTION;
+ return 0; /* wraparound */
+ }
+#endif
+ if (m->footprint_limit != 0) {
+ size_t fp = m->footprint + asize;
+#ifdef __wasilibc_unmodified_upstream // Bug fix: set ENOMEM on footprint overrun
+ if (fp <= m->footprint || fp > m->footprint_limit)
+ return 0;
+#else
+ if (fp <= m->footprint || fp > m->footprint_limit) {
+ MALLOC_FAILURE_ACTION;
+ return 0;
+ }
+#endif
+ }
+
+ /*
+ Try getting memory in any of three ways (in most-preferred to
+ least-preferred order):
+ 1. A call to MORECORE that can normally contiguously extend memory.
+ (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or
+ or main space is mmapped or a previous contiguous call failed)
+ 2. A call to MMAP new space (disabled if not HAVE_MMAP).
+ Note that under the default settings, if MORECORE is unable to
+ fulfill a request, and HAVE_MMAP is true, then mmap is
+ used as a noncontiguous system allocator. This is a useful backup
+ strategy for systems with holes in address spaces -- in this case
+ sbrk cannot contiguously expand the heap, but mmap may be able to
+ find space.
+ 3. A call to MORECORE that cannot usually contiguously extend memory.
+ (disabled if not HAVE_MORECORE)
+
+ In all cases, we need to request enough bytes from system to ensure
+ we can malloc nb bytes upon success, so pad with enough space for
+ top_foot, plus alignment-pad to make sure we don't lose bytes if
+ not on boundary, and round this up to a granularity unit.
+ */
+
+ if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) {
+ char* br = CMFAIL;
+ size_t ssize = asize; /* sbrk call size */
+ msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top);
+ ACQUIRE_MALLOC_GLOBAL_LOCK();
+
+ if (ss == 0) { /* First time through or recovery */
+ char* base = (char*)CALL_MORECORE(0);
+ if (base != CMFAIL) {
+ size_t fp;
+ /* Adjust to end on a page boundary */
+ if (!is_page_aligned(base))
+ ssize += (page_align((size_t)base) - (size_t)base);
+ fp = m->footprint + ssize; /* recheck limits */
+ if (ssize > nb && ssize < HALF_MAX_SIZE_T &&
+ (m->footprint_limit == 0 ||
+ (fp > m->footprint && fp <= m->footprint_limit)) &&
+ (br = (char*)(CALL_MORECORE(ssize))) == base) {
+ tbase = base;
+ tsize = ssize;
+ }
+ }
+ }
+ else {
+ /* Subtract out existing available top space from MORECORE request. */
+ ssize = granularity_align(nb - m->topsize + SYS_ALLOC_PADDING);
+ /* Use mem here only if it did continuously extend old space */
+ if (ssize < HALF_MAX_SIZE_T &&
+ (br = (char*)(CALL_MORECORE(ssize))) == ss->base+ss->size) {
+ tbase = br;
+ tsize = ssize;
+ }
+ }
+
+ if (tbase == CMFAIL) { /* Cope with partial failure */
+ if (br != CMFAIL) { /* Try to use/extend the space we did get */
+ if (ssize < HALF_MAX_SIZE_T &&
+ ssize < nb + SYS_ALLOC_PADDING) {
+ size_t esize = granularity_align(nb + SYS_ALLOC_PADDING - ssize);
+ if (esize < HALF_MAX_SIZE_T) {
+ char* end = (char*)CALL_MORECORE(esize);
+ if (end != CMFAIL)
+ ssize += esize;
+ else { /* Can't use; try to release */
+ (void) CALL_MORECORE(-ssize);
+ br = CMFAIL;
+ }
+ }
+ }
+ }
+ if (br != CMFAIL) { /* Use the space we did get */
+ tbase = br;
+ tsize = ssize;
+ }
+ else
+ disable_contiguous(m); /* Don't try contiguous path in the future */
+ }
+
+ RELEASE_MALLOC_GLOBAL_LOCK();
+ }
+
+ if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */
+ char* mp = (char*)(CALL_MMAP(asize));
+ if (mp != CMFAIL) {
+ tbase = mp;
+ tsize = asize;
+ mmap_flag = USE_MMAP_BIT;
+ }
+ }
+
+ if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */
+ if (asize < HALF_MAX_SIZE_T) {
+ char* br = CMFAIL;
+ char* end = CMFAIL;
+ ACQUIRE_MALLOC_GLOBAL_LOCK();
+ br = (char*)(CALL_MORECORE(asize));
+ end = (char*)(CALL_MORECORE(0));
+ RELEASE_MALLOC_GLOBAL_LOCK();
+ if (br != CMFAIL && end != CMFAIL && br < end) {
+ size_t ssize = end - br;
+ if (ssize > nb + TOP_FOOT_SIZE) {
+ tbase = br;
+ tsize = ssize;
+ }
+ }
+ }
+ }
+
+ if (tbase != CMFAIL) {
+
+ if ((m->footprint += tsize) > m->max_footprint)
+ m->max_footprint = m->footprint;
+
+ if (!is_initialized(m)) { /* first-time initialization */
+ if (m->least_addr == 0 || tbase < m->least_addr)
+ m->least_addr = tbase;
+ m->seg.base = tbase;
+ m->seg.size = tsize;
+ m->seg.sflags = mmap_flag;
+ m->magic = mparams.magic;
+ m->release_checks = MAX_RELEASE_CHECK_RATE;
+ init_bins(m);
+#if !ONLY_MSPACES
+ if (is_global(m))
+ init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
+ else
+#endif
+ {
+ /* Offset top by embedded malloc_state */
+ mchunkptr mn = next_chunk(mem2chunk(m));
+ init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE);
+ }
+ }
+
+ else {
+ /* Try to merge with an existing segment */
+ msegmentptr sp = &m->seg;
+ /* Only consider most recent segment if traversal suppressed */
+ while (sp != 0 && tbase != sp->base + sp->size)
+ sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next;
+ if (sp != 0 &&
+ !is_extern_segment(sp) &&
+ (sp->sflags & USE_MMAP_BIT) == mmap_flag &&
+ segment_holds(sp, m->top)) { /* append */
+ sp->size += tsize;
+ init_top(m, m->top, m->topsize + tsize);
+ }
+ else {
+ if (tbase < m->least_addr)
+ m->least_addr = tbase;
+ sp = &m->seg;
+ while (sp != 0 && sp->base != tbase + tsize)
+ sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next;
+ if (sp != 0 &&
+ !is_extern_segment(sp) &&
+ (sp->sflags & USE_MMAP_BIT) == mmap_flag) {
+ char* oldbase = sp->base;
+ sp->base = tbase;
+ sp->size += tsize;
+ return prepend_alloc(m, tbase, oldbase, nb);
+ }
+ else
+ add_segment(m, tbase, tsize, mmap_flag);
+ }
+ }
+
+ if (nb < m->topsize) { /* Allocate from new or extended top space */
+ size_t rsize = m->topsize -= nb;
+ mchunkptr p = m->top;
+ mchunkptr r = m->top = chunk_plus_offset(p, nb);
+ r->head = rsize | PINUSE_BIT;
+ set_size_and_pinuse_of_inuse_chunk(m, p, nb);
+ check_top_chunk(m, m->top);
+ check_malloced_chunk(m, chunk2mem(p), nb);
+ return chunk2mem(p);
+ }
+ }
+
+ MALLOC_FAILURE_ACTION;
+ return 0;
+}
+
+/* ----------------------- system deallocation -------------------------- */
+
+/* Unmap and unlink any mmapped segments that don't contain used chunks */
+static size_t release_unused_segments(mstate m) {
+ size_t released = 0;
+ int nsegs = 0;
+ msegmentptr pred = &m->seg;
+ msegmentptr sp = pred->next;
+ while (sp != 0) {
+ char* base = sp->base;
+ size_t size = sp->size;
+ msegmentptr next = sp->next;
+ ++nsegs;
+ if (is_mmapped_segment(sp) && !is_extern_segment(sp)) {
+ mchunkptr p = align_as_chunk(base);
+ size_t psize = chunksize(p);
+ /* Can unmap if first chunk holds entire segment and not pinned */
+ if (!is_inuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) {
+ tchunkptr tp = (tchunkptr)p;
+ assert(segment_holds(sp, (char*)sp));
+ if (p == m->dv) {
+ m->dv = 0;
+ m->dvsize = 0;
+ }
+ else {
+ unlink_large_chunk(m, tp);
+ }
+ if (CALL_MUNMAP(base, size) == 0) {
+ released += size;
+ m->footprint -= size;
+ /* unlink obsoleted record */
+ sp = pred;
+ sp->next = next;
+ }
+ else { /* back out if cannot unmap */
+ insert_large_chunk(m, tp, psize);
+ }
+ }
+ }
+ if (NO_SEGMENT_TRAVERSAL) /* scan only first segment */
+ break;
+ pred = sp;
+ sp = next;
+ }
+ /* Reset check counter */
+ m->release_checks = (((size_t) nsegs > (size_t) MAX_RELEASE_CHECK_RATE)?
+ (size_t) nsegs : (size_t) MAX_RELEASE_CHECK_RATE);
+ return released;
+}
+
+static int sys_trim(mstate m, size_t pad) {
+ size_t released = 0;
+ ensure_initialization();
+ if (pad < MAX_REQUEST && is_initialized(m)) {
+ pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */
+
+ if (m->topsize > pad) {
+ /* Shrink top space in granularity-size units, keeping at least one */
+ size_t unit = mparams.granularity;
+ size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit -
+ SIZE_T_ONE) * unit;
+ msegmentptr sp = segment_holding(m, (char*)m->top);
+
+ if (!is_extern_segment(sp)) {
+ if (is_mmapped_segment(sp)) {
+ if (HAVE_MMAP &&
+ sp->size >= extra &&
+ !has_segment_link(m, sp)) { /* can't shrink if pinned */
+ size_t newsize = sp->size - extra;
+ (void)newsize; /* placate people compiling -Wunused-variable */
+ /* Prefer mremap, fall back to munmap */
+ if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) ||
+ (CALL_MUNMAP(sp->base + newsize, extra) == 0)) {
+ released = extra;
+ }
+ }
+ }
+ else if (HAVE_MORECORE) {
+ if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */
+ extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit;
+ ACQUIRE_MALLOC_GLOBAL_LOCK();
+ {
+ /* Make sure end of memory is where we last set it. */
+ char* old_br = (char*)(CALL_MORECORE(0));
+ if (old_br == sp->base + sp->size) {
+ char* rel_br = (char*)(CALL_MORECORE(-extra));
+ char* new_br = (char*)(CALL_MORECORE(0));
+ if (rel_br != CMFAIL && new_br < old_br)
+ released = old_br - new_br;
+ }
+ }
+ RELEASE_MALLOC_GLOBAL_LOCK();
+ }
+ }
+
+ if (released != 0) {
+ sp->size -= released;
+ m->footprint -= released;
+ init_top(m, m->top, m->topsize - released);
+ check_top_chunk(m, m->top);
+ }
+ }
+
+ /* Unmap any unused mmapped segments */
+ if (HAVE_MMAP)
+ released += release_unused_segments(m);
+
+ /* On failure, disable autotrim to avoid repeated failed future calls */
+ if (released == 0 && m->topsize > m->trim_check)
+ m->trim_check = MAX_SIZE_T;
+ }
+
+ return (released != 0)? 1 : 0;
+}
+
+/* Consolidate and bin a chunk. Differs from exported versions
+ of free mainly in that the chunk need not be marked as inuse.
+*/
+static void dispose_chunk(mstate m, mchunkptr p, size_t psize) {
+ mchunkptr next = chunk_plus_offset(p, psize);
+ if (!pinuse(p)) {
+ mchunkptr prev;
+ size_t prevsize = p->prev_foot;
+ if (is_mmapped(p)) {
+ psize += prevsize + MMAP_FOOT_PAD;
+ if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
+ m->footprint -= psize;
+ return;
+ }
+ prev = chunk_minus_offset(p, prevsize);
+ psize += prevsize;
+ p = prev;
+ if (RTCHECK(ok_address(m, prev))) { /* consolidate backward */
+ if (p != m->dv) {
+ unlink_chunk(m, p, prevsize);
+ }
+ else if ((next->head & INUSE_BITS) == INUSE_BITS) {
+ m->dvsize = psize;
+ set_free_with_pinuse(p, psize, next);
+ return;
+ }
+ }
+ else {
+ CORRUPTION_ERROR_ACTION(m);
+ return;
+ }
+ }
+ if (RTCHECK(ok_address(m, next))) {
+ if (!cinuse(next)) { /* consolidate forward */
+ if (next == m->top) {
+ size_t tsize = m->topsize += psize;
+ m->top = p;
+ p->head = tsize | PINUSE_BIT;
+ if (p == m->dv) {
+ m->dv = 0;
+ m->dvsize = 0;
+ }
+ return;
+ }
+ else if (next == m->dv) {
+ size_t dsize = m->dvsize += psize;
+ m->dv = p;
+ set_size_and_pinuse_of_free_chunk(p, dsize);
+ return;
+ }
+ else {
+ size_t nsize = chunksize(next);
+ psize += nsize;
+ unlink_chunk(m, next, nsize);
+ set_size_and_pinuse_of_free_chunk(p, psize);
+ if (p == m->dv) {
+ m->dvsize = psize;
+ return;
+ }
+ }
+ }
+ else {
+ set_free_with_pinuse(p, psize, next);
+ }
+ insert_chunk(m, p, psize);
+ }
+ else {
+ CORRUPTION_ERROR_ACTION(m);
+ }
+}
+
+/* ---------------------------- malloc --------------------------- */
+
+/* allocate a large request from the best fitting chunk in a treebin */
+static void* tmalloc_large(mstate m, size_t nb) {
+ tchunkptr v = 0;
+ size_t rsize = -nb; /* Unsigned negation */
+ tchunkptr t;
+ bindex_t idx;
+ compute_tree_index(nb, idx);
+ if ((t = *treebin_at(m, idx)) != 0) {
+ /* Traverse tree for this bin looking for node with size == nb */
+ size_t sizebits = nb << leftshift_for_tree_index(idx);
+ tchunkptr rst = 0; /* The deepest untaken right subtree */
+ for (;;) {
+ tchunkptr rt;
+ size_t trem = chunksize(t) - nb;
+ if (trem < rsize) {
+ v = t;
+ if ((rsize = trem) == 0)
+ break;
+ }
+ rt = t->child[1];
+ t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
+ if (rt != 0 && rt != t)
+ rst = rt;
+ if (t == 0) {
+ t = rst; /* set t to least subtree holding sizes > nb */
+ break;
+ }
+ sizebits <<= 1;
+ }
+ }
+ if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */
+ binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap;
+ if (leftbits != 0) {
+ bindex_t i;
+ binmap_t leastbit = least_bit(leftbits);
+ compute_bit2idx(leastbit, i);
+ t = *treebin_at(m, i);
+ }
+ }
+
+ while (t != 0) { /* find smallest of tree or subtree */
+ size_t trem = chunksize(t) - nb;
+ if (trem < rsize) {
+ rsize = trem;
+ v = t;
+ }
+ t = leftmost_child(t);
+ }
+
+ /* If dv is a better fit, return 0 so malloc will use it */
+ if (v != 0 && rsize < (size_t)(m->dvsize - nb)) {
+ if (RTCHECK(ok_address(m, v))) { /* split */
+ mchunkptr r = chunk_plus_offset(v, nb);
+ assert(chunksize(v) == rsize + nb);
+ if (RTCHECK(ok_next(v, r))) {
+ unlink_large_chunk(m, v);
+ if (rsize < MIN_CHUNK_SIZE)
+ set_inuse_and_pinuse(m, v, (rsize + nb));
+ else {
+ set_size_and_pinuse_of_inuse_chunk(m, v, nb);
+ set_size_and_pinuse_of_free_chunk(r, rsize);
+ insert_chunk(m, r, rsize);
+ }
+ return chunk2mem(v);
+ }
+ }
+ CORRUPTION_ERROR_ACTION(m);
+ }
+ return 0;
+}
+
+/* allocate a small request from the best fitting chunk in a treebin */
+static void* tmalloc_small(mstate m, size_t nb) {
+ tchunkptr t, v;
+ size_t rsize;
+ bindex_t i;
+ binmap_t leastbit = least_bit(m->treemap);
+ compute_bit2idx(leastbit, i);
+ v = t = *treebin_at(m, i);
+ rsize = chunksize(t) - nb;
+
+ while ((t = leftmost_child(t)) != 0) {
+ size_t trem = chunksize(t) - nb;
+ if (trem < rsize) {
+ rsize = trem;
+ v = t;
+ }
+ }
+
+ if (RTCHECK(ok_address(m, v))) {
+ mchunkptr r = chunk_plus_offset(v, nb);
+ assert(chunksize(v) == rsize + nb);
+ if (RTCHECK(ok_next(v, r))) {
+ unlink_large_chunk(m, v);
+ if (rsize < MIN_CHUNK_SIZE)
+ set_inuse_and_pinuse(m, v, (rsize + nb));
+ else {
+ set_size_and_pinuse_of_inuse_chunk(m, v, nb);
+ set_size_and_pinuse_of_free_chunk(r, rsize);
+ replace_dv(m, r, rsize);
+ }
+ return chunk2mem(v);
+ }
+ }
+
+ CORRUPTION_ERROR_ACTION(m);
+ return 0;
+}
+
+#if !ONLY_MSPACES
+
+#if __wasilibc_unmodified_upstream // Forward declaration of try_init_allocator.
+#else
+static void try_init_allocator(void);
+#endif
+
+void* dlmalloc(size_t bytes) {
+ /*
+ Basic algorithm:
+ If a small request (< 256 bytes minus per-chunk overhead):
+ 1. If one exists, use a remainderless chunk in associated smallbin.
+ (Remainderless means that there are too few excess bytes to
+ represent as a chunk.)
+ 2. If it is big enough, use the dv chunk, which is normally the
+ chunk adjacent to the one used for the most recent small request.
+ 3. If one exists, split the smallest available chunk in a bin,
+ saving remainder in dv.
+ 4. If it is big enough, use the top chunk.
+ 5. If available, get memory from system and use it
+ Otherwise, for a large request:
+ 1. Find the smallest available binned chunk that fits, and use it
+ if it is better fitting than dv chunk, splitting if necessary.
+ 2. If better fitting than any binned chunk, use the dv chunk.
+ 3. If it is big enough, use the top chunk.
+ 4. If request size >= mmap threshold, try to directly mmap this chunk.
+ 5. If available, get memory from system and use it
+
+ The ugly goto's here ensure that postaction occurs along all paths.
+ */
+
+#if USE_LOCKS
+ ensure_initialization(); /* initialize in sys_alloc if not using locks */
+#endif
+
+#if __wasilibc_unmodified_upstream // Try to initialize the allocator.
+#else
+ if (!is_initialized(gm)) {
+ try_init_allocator();
+ }
+#endif
+
+ if (!PREACTION(gm)) {
+ void* mem;
+ size_t nb;
+ if (bytes <= MAX_SMALL_REQUEST) {
+ bindex_t idx;
+ binmap_t smallbits;
+ nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
+ idx = small_index(nb);
+ smallbits = gm->smallmap >> idx;
+
+ if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
+ mchunkptr b, p;
+ idx += ~smallbits & 1; /* Uses next bin if idx empty */
+ b = smallbin_at(gm, idx);
+ p = b->fd;
+ assert(chunksize(p) == small_index2size(idx));
+ unlink_first_small_chunk(gm, b, p, idx);
+ set_inuse_and_pinuse(gm, p, small_index2size(idx));
+ mem = chunk2mem(p);
+ check_malloced_chunk(gm, mem, nb);
+ goto postaction;
+ }
+
+ else if (nb > gm->dvsize) {
+ if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
+ mchunkptr b, p, r;
+ size_t rsize;
+ bindex_t i;
+ binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
+ binmap_t leastbit = least_bit(leftbits);
+ compute_bit2idx(leastbit, i);
+ b = smallbin_at(gm, i);
+ p = b->fd;
+ assert(chunksize(p) == small_index2size(i));
+ unlink_first_small_chunk(gm, b, p, i);
+ rsize = small_index2size(i) - nb;
+ /* Fit here cannot be remainderless if 4byte sizes */
+ if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
+ set_inuse_and_pinuse(gm, p, small_index2size(i));
+ else {
+ set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
+ r = chunk_plus_offset(p, nb);
+ set_size_and_pinuse_of_free_chunk(r, rsize);
+ replace_dv(gm, r, rsize);
+ }
+ mem = chunk2mem(p);
+ check_malloced_chunk(gm, mem, nb);
+ goto postaction;
+ }
+
+ else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) {
+ check_malloced_chunk(gm, mem, nb);
+ goto postaction;
+ }
+ }
+ }
+ else if (bytes >= MAX_REQUEST)
+ nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
+ else {
+ nb = pad_request(bytes);
+ if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) {
+ check_malloced_chunk(gm, mem, nb);
+ goto postaction;
+ }
+ }
+
+ if (nb <= gm->dvsize) {
+ size_t rsize = gm->dvsize - nb;
+ mchunkptr p = gm->dv;
+ if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
+ mchunkptr r = gm->dv = chunk_plus_offset(p, nb);
+ gm->dvsize = rsize;
+ set_size_and_pinuse_of_free_chunk(r, rsize);
+ set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
+ }
+ else { /* exhaust dv */
+ size_t dvs = gm->dvsize;
+ gm->dvsize = 0;
+ gm->dv = 0;
+ set_inuse_and_pinuse(gm, p, dvs);
+ }
+ mem = chunk2mem(p);
+ check_malloced_chunk(gm, mem, nb);
+ goto postaction;
+ }
+
+ else if (nb < gm->topsize) { /* Split top */
+ size_t rsize = gm->topsize -= nb;
+ mchunkptr p = gm->top;
+ mchunkptr r = gm->top = chunk_plus_offset(p, nb);
+ r->head = rsize | PINUSE_BIT;
+ set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
+ mem = chunk2mem(p);
+ check_top_chunk(gm, gm->top);
+ check_malloced_chunk(gm, mem, nb);
+ goto postaction;
+ }
+
+ mem = sys_alloc(gm, nb);
+
+ postaction:
+ POSTACTION(gm);
+ return mem;
+ }
+
+ return 0;
+}
+
+/* ---------------------------- free --------------------------- */
+
+void dlfree(void* mem) {
+ /*
+ Consolidate freed chunks with preceeding or succeeding bordering
+ free chunks, if they exist, and then place in a bin. Intermixed
+ with special cases for top, dv, mmapped chunks, and usage errors.
+ */
+
+ if (mem != 0) {
+ mchunkptr p = mem2chunk(mem);
+#if FOOTERS
+ mstate fm = get_mstate_for(p);
+ if (!ok_magic(fm)) {
+ USAGE_ERROR_ACTION(fm, p);
+ return;
+ }
+#else /* FOOTERS */
+#define fm gm
+#endif /* FOOTERS */
+ if (!PREACTION(fm)) {
+ check_inuse_chunk(fm, p);
+ if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) {
+ size_t psize = chunksize(p);
+ mchunkptr next = chunk_plus_offset(p, psize);
+ if (!pinuse(p)) {
+ size_t prevsize = p->prev_foot;
+ if (is_mmapped(p)) {
+ psize += prevsize + MMAP_FOOT_PAD;
+ if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
+ fm->footprint -= psize;
+ goto postaction;
+ }
+ else {
+ mchunkptr prev = chunk_minus_offset(p, prevsize);
+ psize += prevsize;
+ p = prev;
+ if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
+ if (p != fm->dv) {
+ unlink_chunk(fm, p, prevsize);
+ }
+ else if ((next->head & INUSE_BITS) == INUSE_BITS) {
+ fm->dvsize = psize;
+ set_free_with_pinuse(p, psize, next);
+ goto postaction;
+ }
+ }
+ else
+ goto erroraction;
+ }
+ }
+
+ if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
+ if (!cinuse(next)) { /* consolidate forward */
+ if (next == fm->top) {
+ size_t tsize = fm->topsize += psize;
+ fm->top = p;
+ p->head = tsize | PINUSE_BIT;
+ if (p == fm->dv) {
+ fm->dv = 0;
+ fm->dvsize = 0;
+ }
+ if (should_trim(fm, tsize))
+ sys_trim(fm, 0);
+ goto postaction;
+ }
+ else if (next == fm->dv) {
+ size_t dsize = fm->dvsize += psize;
+ fm->dv = p;
+ set_size_and_pinuse_of_free_chunk(p, dsize);
+ goto postaction;
+ }
+ else {
+ size_t nsize = chunksize(next);
+ psize += nsize;
+ unlink_chunk(fm, next, nsize);
+ set_size_and_pinuse_of_free_chunk(p, psize);
+ if (p == fm->dv) {
+ fm->dvsize = psize;
+ goto postaction;
+ }
+ }
+ }
+ else
+ set_free_with_pinuse(p, psize, next);
+
+ if (is_small(psize)) {
+ insert_small_chunk(fm, p, psize);
+ check_free_chunk(fm, p);
+ }
+ else {
+ tchunkptr tp = (tchunkptr)p;
+ insert_large_chunk(fm, tp, psize);
+ check_free_chunk(fm, p);
+ if (--fm->release_checks == 0)
+ release_unused_segments(fm);
+ }
+ goto postaction;
+ }
+ }
+ erroraction:
+ USAGE_ERROR_ACTION(fm, p);
+ postaction:
+ POSTACTION(fm);
+ }
+ }
+#if !FOOTERS
+#undef fm
+#endif /* FOOTERS */
+}
+
+void* dlcalloc(size_t n_elements, size_t elem_size) {
+ void* mem;
+ size_t req = 0;
+ if (n_elements != 0) {
+ req = n_elements * elem_size;
+ if (((n_elements | elem_size) & ~(size_t)0xffff) &&
+ (req / n_elements != elem_size))
+ req = MAX_SIZE_T; /* force downstream failure on overflow */
+ }
+ mem = dlmalloc(req);
+ if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
+ memset(mem, 0, req);
+ return mem;
+}
+
+#endif /* !ONLY_MSPACES */
+
+/* ------------ Internal support for realloc, memalign, etc -------------- */
+
+/* Try to realloc; only in-place unless can_move true */
+static mchunkptr try_realloc_chunk(mstate m, mchunkptr p, size_t nb,
+ int can_move) {
+ mchunkptr newp = 0;
+ size_t oldsize = chunksize(p);
+ mchunkptr next = chunk_plus_offset(p, oldsize);
+ if (RTCHECK(ok_address(m, p) && ok_inuse(p) &&
+ ok_next(p, next) && ok_pinuse(next))) {
+ if (is_mmapped(p)) {
+ newp = mmap_resize(m, p, nb, can_move);
+ }
+ else if (oldsize >= nb) { /* already big enough */
+ size_t rsize = oldsize - nb;
+ if (rsize >= MIN_CHUNK_SIZE) { /* split off remainder */
+ mchunkptr r = chunk_plus_offset(p, nb);
+ set_inuse(m, p, nb);
+ set_inuse(m, r, rsize);
+ dispose_chunk(m, r, rsize);
+ }
+ newp = p;
+ }
+ else if (next == m->top) { /* extend into top */
+ if (oldsize + m->topsize > nb) {
+ size_t newsize = oldsize + m->topsize;
+ size_t newtopsize = newsize - nb;
+ mchunkptr newtop = chunk_plus_offset(p, nb);
+ set_inuse(m, p, nb);
+ newtop->head = newtopsize |PINUSE_BIT;
+ m->top = newtop;
+ m->topsize = newtopsize;
+ newp = p;
+ }
+ }
+ else if (next == m->dv) { /* extend into dv */
+ size_t dvs = m->dvsize;
+ if (oldsize + dvs >= nb) {
+ size_t dsize = oldsize + dvs - nb;
+ if (dsize >= MIN_CHUNK_SIZE) {
+ mchunkptr r = chunk_plus_offset(p, nb);
+ mchunkptr n = chunk_plus_offset(r, dsize);
+ set_inuse(m, p, nb);
+ set_size_and_pinuse_of_free_chunk(r, dsize);
+ clear_pinuse(n);
+ m->dvsize = dsize;
+ m->dv = r;
+ }
+ else { /* exhaust dv */
+ size_t newsize = oldsize + dvs;
+ set_inuse(m, p, newsize);
+ m->dvsize = 0;
+ m->dv = 0;
+ }
+ newp = p;
+ }
+ }
+ else if (!cinuse(next)) { /* extend into next free chunk */
+ size_t nextsize = chunksize(next);
+ if (oldsize + nextsize >= nb) {
+ size_t rsize = oldsize + nextsize - nb;
+ unlink_chunk(m, next, nextsize);
+ if (rsize < MIN_CHUNK_SIZE) {
+ size_t newsize = oldsize + nextsize;
+ set_inuse(m, p, newsize);
+ }
+ else {
+ mchunkptr r = chunk_plus_offset(p, nb);
+ set_inuse(m, p, nb);
+ set_inuse(m, r, rsize);
+ dispose_chunk(m, r, rsize);
+ }
+ newp = p;
+ }
+ }
+ }
+ else {
+ USAGE_ERROR_ACTION(m, chunk2mem(p));
+ }
+ return newp;
+}
+
+static void* internal_memalign(mstate m, size_t alignment, size_t bytes) {
+ void* mem = 0;
+ if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */
+ alignment = MIN_CHUNK_SIZE;
+ if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */
+ size_t a = MALLOC_ALIGNMENT << 1;
+ while (a < alignment) a <<= 1;
+ alignment = a;
+ }
+ if (bytes >= MAX_REQUEST - alignment) {
+ if (m != 0) { /* Test isn't needed but avoids compiler warning */
+ MALLOC_FAILURE_ACTION;
+ }
+ }
+ else {
+ size_t nb = request2size(bytes);
+ size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD;
+ mem = internal_malloc(m, req);
+ if (mem != 0) {
+ mchunkptr p = mem2chunk(mem);
+ if (PREACTION(m))
+ return 0;
+ if ((((size_t)(mem)) & (alignment - 1)) != 0) { /* misaligned */
+ /*
+ Find an aligned spot inside chunk. Since we need to give
+ back leading space in a chunk of at least MIN_CHUNK_SIZE, if
+ the first calculation places us at a spot with less than
+ MIN_CHUNK_SIZE leader, we can move to the next aligned spot.
+ We've allocated enough total room so that this is always
+ possible.
+ */
+ char* br = (char*)mem2chunk((size_t)(((size_t)((char*)mem + alignment -
+ SIZE_T_ONE)) &
+ -alignment));
+ char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)?
+ br : br+alignment;
+ mchunkptr newp = (mchunkptr)pos;
+ size_t leadsize = pos - (char*)(p);
+ size_t newsize = chunksize(p) - leadsize;
+
+ if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */
+ newp->prev_foot = p->prev_foot + leadsize;
+ newp->head = newsize;
+ }
+ else { /* Otherwise, give back leader, use the rest */
+ set_inuse(m, newp, newsize);
+ set_inuse(m, p, leadsize);
+ dispose_chunk(m, p, leadsize);
+ }
+ p = newp;
+ }
+
+ /* Give back spare room at the end */
+ if (!is_mmapped(p)) {
+ size_t size = chunksize(p);
+ if (size > nb + MIN_CHUNK_SIZE) {
+ size_t remainder_size = size - nb;
+ mchunkptr remainder = chunk_plus_offset(p, nb);
+ set_inuse(m, p, nb);
+ set_inuse(m, remainder, remainder_size);
+ dispose_chunk(m, remainder, remainder_size);
+ }
+ }
+
+ mem = chunk2mem(p);
+ assert (chunksize(p) >= nb);
+ assert(((size_t)mem & (alignment - 1)) == 0);
+ check_inuse_chunk(m, p);
+ POSTACTION(m);
+ }
+ }
+ return mem;
+}
+
+/*
+ Common support for independent_X routines, handling
+ all of the combinations that can result.
+ The opts arg has:
+ bit 0 set if all elements are same size (using sizes[0])
+ bit 1 set if elements should be zeroed
+*/
+static void** ialloc(mstate m,
+ size_t n_elements,
+ size_t* sizes,
+ int opts,
+ void* chunks[]) {
+
+ size_t element_size; /* chunksize of each element, if all same */
+ size_t contents_size; /* total size of elements */
+ size_t array_size; /* request size of pointer array */
+ void* mem; /* malloced aggregate space */
+ mchunkptr p; /* corresponding chunk */
+ size_t remainder_size; /* remaining bytes while splitting */
+ void** marray; /* either "chunks" or malloced ptr array */
+ mchunkptr array_chunk; /* chunk for malloced ptr array */
+ flag_t was_enabled; /* to disable mmap */
+ size_t size;
+ size_t i;
+
+ ensure_initialization();
+ /* compute array length, if needed */
+ if (chunks != 0) {
+ if (n_elements == 0)
+ return chunks; /* nothing to do */
+ marray = chunks;
+ array_size = 0;
+ }
+ else {
+ /* if empty req, must still return chunk representing empty array */
+ if (n_elements == 0)
+ return (void**)internal_malloc(m, 0);
+ marray = 0;
+ array_size = request2size(n_elements * (sizeof(void*)));
+ }
+
+ /* compute total element size */
+ if (opts & 0x1) { /* all-same-size */
+ element_size = request2size(*sizes);
+ contents_size = n_elements * element_size;
+ }
+ else { /* add up all the sizes */
+ element_size = 0;
+ contents_size = 0;
+ for (i = 0; i != n_elements; ++i)
+ contents_size += request2size(sizes[i]);
+ }
+
+ size = contents_size + array_size;
+
+ /*
+ Allocate the aggregate chunk. First disable direct-mmapping so
+ malloc won't use it, since we would not be able to later
+ free/realloc space internal to a segregated mmap region.
+ */
+ was_enabled = use_mmap(m);
+ disable_mmap(m);
+ mem = internal_malloc(m, size - CHUNK_OVERHEAD);
+ if (was_enabled)
+ enable_mmap(m);
+ if (mem == 0)
+ return 0;
+
+ if (PREACTION(m)) return 0;
+ p = mem2chunk(mem);
+ remainder_size = chunksize(p);
+
+ assert(!is_mmapped(p));
+
+ if (opts & 0x2) { /* optionally clear the elements */
+ memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size);
+ }
+
+ /* If not provided, allocate the pointer array as final part of chunk */
+ if (marray == 0) {
+ size_t array_chunk_size;
+ array_chunk = chunk_plus_offset(p, contents_size);
+ array_chunk_size = remainder_size - contents_size;
+ marray = (void**) (chunk2mem(array_chunk));
+ set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size);
+ remainder_size = contents_size;
+ }
+
+ /* split out elements */
+ for (i = 0; ; ++i) {
+ marray[i] = chunk2mem(p);
+ if (i != n_elements-1) {
+ if (element_size != 0)
+ size = element_size;
+ else
+ size = request2size(sizes[i]);
+ remainder_size -= size;
+ set_size_and_pinuse_of_inuse_chunk(m, p, size);
+ p = chunk_plus_offset(p, size);
+ }
+ else { /* the final element absorbs any overallocation slop */
+ set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size);
+ break;
+ }
+ }
+
+#if DEBUG
+ if (marray != chunks) {
+ /* final element must have exactly exhausted chunk */
+ if (element_size != 0) {
+ assert(remainder_size == element_size);
+ }
+ else {
+ assert(remainder_size == request2size(sizes[i]));
+ }
+ check_inuse_chunk(m, mem2chunk(marray));
+ }
+ for (i = 0; i != n_elements; ++i)
+ check_inuse_chunk(m, mem2chunk(marray[i]));
+
+#endif /* DEBUG */
+
+ POSTACTION(m);
+ return marray;
+}
+
+/* Try to free all pointers in the given array.
+ Note: this could be made faster, by delaying consolidation,
+ at the price of disabling some user integrity checks, We
+ still optimize some consolidations by combining adjacent
+ chunks before freeing, which will occur often if allocated
+ with ialloc or the array is sorted.
+*/
+static size_t internal_bulk_free(mstate m, void* array[], size_t nelem) {
+ size_t unfreed = 0;
+ if (!PREACTION(m)) {
+ void** a;
+ void** fence = &(array[nelem]);
+ for (a = array; a != fence; ++a) {
+ void* mem = *a;
+ if (mem != 0) {
+ mchunkptr p = mem2chunk(mem);
+ size_t psize = chunksize(p);
+#if FOOTERS
+ if (get_mstate_for(p) != m) {
+ ++unfreed;
+ continue;
+ }
+#endif
+ check_inuse_chunk(m, p);
+ *a = 0;
+ if (RTCHECK(ok_address(m, p) && ok_inuse(p))) {
+ void ** b = a + 1; /* try to merge with next chunk */
+ mchunkptr next = next_chunk(p);
+ if (b != fence && *b == chunk2mem(next)) {
+ size_t newsize = chunksize(next) + psize;
+ set_inuse(m, p, newsize);
+ *b = chunk2mem(p);
+ }
+ else
+ dispose_chunk(m, p, psize);
+ }
+ else {
+ CORRUPTION_ERROR_ACTION(m);
+ break;
+ }
+ }
+ }
+ if (should_trim(m, m->topsize))
+ sys_trim(m, 0);
+ POSTACTION(m);
+ }
+ return unfreed;
+}
+
+/* Traversal */
+#if MALLOC_INSPECT_ALL
+static void internal_inspect_all(mstate m,
+ void(*handler)(void *start,
+ void *end,
+ size_t used_bytes,
+ void* callback_arg),
+ void* arg) {
+ if (is_initialized(m)) {
+ mchunkptr top = m->top;
+ msegmentptr s;
+ for (s = &m->seg; s != 0; s = s->next) {
+ mchunkptr q = align_as_chunk(s->base);
+ while (segment_holds(s, q) && q->head != FENCEPOST_HEAD) {
+ mchunkptr next = next_chunk(q);
+ size_t sz = chunksize(q);
+ size_t used;
+ void* start;
+ if (is_inuse(q)) {
+ used = sz - CHUNK_OVERHEAD; /* must not be mmapped */
+ start = chunk2mem(q);
+ }
+ else {
+ used = 0;
+ if (is_small(sz)) { /* offset by possible bookkeeping */
+ start = (void*)((char*)q + sizeof(struct malloc_chunk));
+ }
+ else {
+ start = (void*)((char*)q + sizeof(struct malloc_tree_chunk));
+ }
+ }
+ if (start < (void*)next) /* skip if all space is bookkeeping */
+ handler(start, next, used, arg);
+ if (q == top)
+ break;
+ q = next;
+ }
+ }
+ }
+}
+#endif /* MALLOC_INSPECT_ALL */
+
+#ifdef __wasilibc_unmodified_upstream // Define a function that initializes the initial state of dlmalloc.
+#else
+/* ------------------ Exported try_init_allocator -------------------- */
+
+/* Symbol marking the end of data, bss and explicit stack, provided by wasm-ld. */
+extern unsigned char __heap_base;
+
+/* Initialize the initial state of dlmalloc to be able to use free memory between __heap_base and initial. */
+static void try_init_allocator(void) {
+ /* Check that it is a first-time initialization. */
+ assert(!is_initialized(gm));
+
+ char *base = (char *)&__heap_base;
+ /* Calls sbrk(0) that returns the initial memory position. */
+ char *init = (char *)CALL_MORECORE(0);
+ int initial_heap_size = init - base;
+
+ /* Check that initial heap is long enough to serve a minimal allocation request. */
+ if (initial_heap_size <= MIN_CHUNK_SIZE + TOP_FOOT_SIZE + MALLOC_ALIGNMENT) {
+ return;
+ }
+
+ /* Initialize mstate. */
+ ensure_initialization();
+
+ /* Initialize the dlmalloc internal state. */
+ gm->least_addr = base;
+ gm->seg.base = base;
+ gm->seg.size = initial_heap_size;
+ gm->magic = mparams.magic;
+ gm->release_checks = MAX_RELEASE_CHECK_RATE;
+ init_bins(gm);
+ init_top(gm, (mchunkptr)base, initial_heap_size - TOP_FOOT_SIZE);
+}
+#endif
+
+/* ------------------ Exported realloc, memalign, etc -------------------- */
+
+#if !ONLY_MSPACES
+
+void* dlrealloc(void* oldmem, size_t bytes) {
+ void* mem = 0;
+ if (oldmem == 0) {
+ mem = dlmalloc(bytes);
+ }
+ else if (bytes >= MAX_REQUEST) {
+ MALLOC_FAILURE_ACTION;
+ }
+#ifdef REALLOC_ZERO_BYTES_FREES
+ else if (bytes == 0) {
+ dlfree(oldmem);
+ }
+#endif /* REALLOC_ZERO_BYTES_FREES */
+ else {
+ size_t nb = request2size(bytes);
+ mchunkptr oldp = mem2chunk(oldmem);
+#if ! FOOTERS
+ mstate m = gm;
+#else /* FOOTERS */
+ mstate m = get_mstate_for(oldp);
+ if (!ok_magic(m)) {
+ USAGE_ERROR_ACTION(m, oldmem);
+ return 0;
+ }
+#endif /* FOOTERS */
+ if (!PREACTION(m)) {
+ mchunkptr newp = try_realloc_chunk(m, oldp, nb, 1);
+ POSTACTION(m);
+ if (newp != 0) {
+ check_inuse_chunk(m, newp);
+ mem = chunk2mem(newp);
+ }
+ else {
+ mem = internal_malloc(m, bytes);
+ if (mem != 0) {
+ size_t oc = chunksize(oldp) - overhead_for(oldp);
+ memcpy(mem, oldmem, (oc < bytes)? oc : bytes);
+ internal_free(m, oldmem);
+ }
+ }
+ }
+ }
+ return mem;
+}
+
+void* dlrealloc_in_place(void* oldmem, size_t bytes) {
+ void* mem = 0;
+ if (oldmem != 0) {
+ if (bytes >= MAX_REQUEST) {
+ MALLOC_FAILURE_ACTION;
+ }
+ else {
+ size_t nb = request2size(bytes);
+ mchunkptr oldp = mem2chunk(oldmem);
+#if ! FOOTERS
+ mstate m = gm;
+#else /* FOOTERS */
+ mstate m = get_mstate_for(oldp);
+ if (!ok_magic(m)) {
+ USAGE_ERROR_ACTION(m, oldmem);
+ return 0;
+ }
+#endif /* FOOTERS */
+ if (!PREACTION(m)) {
+ mchunkptr newp = try_realloc_chunk(m, oldp, nb, 0);
+ POSTACTION(m);
+ if (newp == oldp) {
+ check_inuse_chunk(m, newp);
+ mem = oldmem;
+ }
+ }
+ }
+ }
+ return mem;
+}
+
+void* dlmemalign(size_t alignment, size_t bytes) {
+ if (alignment <= MALLOC_ALIGNMENT) {
+ return dlmalloc(bytes);
+ }
+ return internal_memalign(gm, alignment, bytes);
+}
+
+int dlposix_memalign(void** pp, size_t alignment, size_t bytes) {
+ void* mem = 0;
+ if (alignment == MALLOC_ALIGNMENT)
+ mem = dlmalloc(bytes);
+ else {
+ size_t d = alignment / sizeof(void*);
+ size_t r = alignment % sizeof(void*);
+ if (r != 0 || d == 0 || (d & (d-SIZE_T_ONE)) != 0)
+ return EINVAL;
+ else if (bytes <= MAX_REQUEST - alignment) {
+ if (alignment < MIN_CHUNK_SIZE)
+ alignment = MIN_CHUNK_SIZE;
+ mem = internal_memalign(gm, alignment, bytes);
+ }
+ }
+ if (mem == 0)
+ return ENOMEM;
+ else {
+ *pp = mem;
+ return 0;
+ }
+}
+
+void* dlvalloc(size_t bytes) {
+ size_t pagesz;
+ ensure_initialization();
+ pagesz = mparams.page_size;
+ return dlmemalign(pagesz, bytes);
+}
+
+void* dlpvalloc(size_t bytes) {
+ size_t pagesz;
+ ensure_initialization();
+ pagesz = mparams.page_size;
+ return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE));
+}
+
+void** dlindependent_calloc(size_t n_elements, size_t elem_size,
+ void* chunks[]) {
+ size_t sz = elem_size; /* serves as 1-element array */
+ return ialloc(gm, n_elements, &sz, 3, chunks);
+}
+
+void** dlindependent_comalloc(size_t n_elements, size_t sizes[],
+ void* chunks[]) {
+ return ialloc(gm, n_elements, sizes, 0, chunks);
+}
+
+size_t dlbulk_free(void* array[], size_t nelem) {
+ return internal_bulk_free(gm, array, nelem);
+}
+
+#if MALLOC_INSPECT_ALL
+void dlmalloc_inspect_all(void(*handler)(void *start,
+ void *end,
+ size_t used_bytes,
+ void* callback_arg),
+ void* arg) {
+ ensure_initialization();
+ if (!PREACTION(gm)) {
+ internal_inspect_all(gm, handler, arg);
+ POSTACTION(gm);
+ }
+}
+#endif /* MALLOC_INSPECT_ALL */
+
+int dlmalloc_trim(size_t pad) {
+ int result = 0;
+ ensure_initialization();
+ if (!PREACTION(gm)) {
+ result = sys_trim(gm, pad);
+ POSTACTION(gm);
+ }
+ return result;
+}
+
+size_t dlmalloc_footprint(void) {
+ return gm->footprint;
+}
+
+size_t dlmalloc_max_footprint(void) {
+ return gm->max_footprint;
+}
+
+size_t dlmalloc_footprint_limit(void) {
+ size_t maf = gm->footprint_limit;
+ return maf == 0 ? MAX_SIZE_T : maf;
+}
+
+size_t dlmalloc_set_footprint_limit(size_t bytes) {
+ size_t result; /* invert sense of 0 */
+ if (bytes == 0)
+ result = granularity_align(1); /* Use minimal size */
+ if (bytes == MAX_SIZE_T)
+ result = 0; /* disable */
+ else
+ result = granularity_align(bytes);
+ return gm->footprint_limit = result;
+}
+
+#if !NO_MALLINFO
+struct mallinfo dlmallinfo(void) {
+ return internal_mallinfo(gm);
+}
+#endif /* NO_MALLINFO */
+
+#if !NO_MALLOC_STATS
+void dlmalloc_stats() {
+ internal_malloc_stats(gm);
+}
+#endif /* NO_MALLOC_STATS */
+
+int dlmallopt(int param_number, int value) {
+ return change_mparam(param_number, value);
+}
+
+size_t dlmalloc_usable_size(void* mem) {
+ if (mem != 0) {
+ mchunkptr p = mem2chunk(mem);
+ if (is_inuse(p))
+ return chunksize(p) - overhead_for(p);
+ }
+ return 0;
+}
+
+#endif /* !ONLY_MSPACES */
+
+/* ----------------------------- user mspaces ---------------------------- */
+
+#if MSPACES
+
+static mstate init_user_mstate(char* tbase, size_t tsize) {
+ size_t msize = pad_request(sizeof(struct malloc_state));
+ mchunkptr mn;
+ mchunkptr msp = align_as_chunk(tbase);
+ mstate m = (mstate)(chunk2mem(msp));
+ memset(m, 0, msize);
+ (void)INITIAL_LOCK(&m->mutex);
+ msp->head = (msize|INUSE_BITS);
+ m->seg.base = m->least_addr = tbase;
+ m->seg.size = m->footprint = m->max_footprint = tsize;
+ m->magic = mparams.magic;
+ m->release_checks = MAX_RELEASE_CHECK_RATE;
+ m->mflags = mparams.default_mflags;
+ m->extp = 0;
+ m->exts = 0;
+ disable_contiguous(m);
+ init_bins(m);
+ mn = next_chunk(mem2chunk(m));
+ init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE);
+ check_top_chunk(m, m->top);
+ return m;
+}
+
+mspace create_mspace(size_t capacity, int locked) {
+ mstate m = 0;
+ size_t msize;
+ ensure_initialization();
+ msize = pad_request(sizeof(struct malloc_state));
+ if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
+ size_t rs = ((capacity == 0)? mparams.granularity :
+ (capacity + TOP_FOOT_SIZE + msize));
+ size_t tsize = granularity_align(rs);
+ char* tbase = (char*)(CALL_MMAP(tsize));
+ if (tbase != CMFAIL) {
+ m = init_user_mstate(tbase, tsize);
+ m->seg.sflags = USE_MMAP_BIT;
+ set_lock(m, locked);
+ }
+ }
+ return (mspace)m;
+}
+
+mspace create_mspace_with_base(void* base, size_t capacity, int locked) {
+ mstate m = 0;
+ size_t msize;
+ ensure_initialization();
+ msize = pad_request(sizeof(struct malloc_state));
+ if (capacity > msize + TOP_FOOT_SIZE &&
+ capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
+ m = init_user_mstate((char*)base, capacity);
+ m->seg.sflags = EXTERN_BIT;
+ set_lock(m, locked);
+ }
+ return (mspace)m;
+}
+
+int mspace_track_large_chunks(mspace msp, int enable) {
+ int ret = 0;
+ mstate ms = (mstate)msp;
+ if (!PREACTION(ms)) {
+ if (!use_mmap(ms)) {
+ ret = 1;
+ }
+ if (!enable) {
+ enable_mmap(ms);
+ } else {
+ disable_mmap(ms);
+ }
+ POSTACTION(ms);
+ }
+ return ret;
+}
+
+size_t destroy_mspace(mspace msp) {
+ size_t freed = 0;
+ mstate ms = (mstate)msp;
+ if (ok_magic(ms)) {
+ msegmentptr sp = &ms->seg;
+ (void)DESTROY_LOCK(&ms->mutex); /* destroy before unmapped */
+ while (sp != 0) {
+ char* base = sp->base;
+ size_t size = sp->size;
+ flag_t flag = sp->sflags;
+ (void)base; /* placate people compiling -Wunused-variable */
+ sp = sp->next;
+ if ((flag & USE_MMAP_BIT) && !(flag & EXTERN_BIT) &&
+ CALL_MUNMAP(base, size) == 0)
+ freed += size;
+ }
+ }
+ else {
+ USAGE_ERROR_ACTION(ms,ms);
+ }
+ return freed;
+}
+
+/*
+ mspace versions of routines are near-clones of the global
+ versions. This is not so nice but better than the alternatives.
+*/
+
+void* mspace_malloc(mspace msp, size_t bytes) {
+ mstate ms = (mstate)msp;
+ if (!ok_magic(ms)) {
+ USAGE_ERROR_ACTION(ms,ms);
+ return 0;
+ }
+ if (!PREACTION(ms)) {
+ void* mem;
+ size_t nb;
+ if (bytes <= MAX_SMALL_REQUEST) {
+ bindex_t idx;
+ binmap_t smallbits;
+ nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
+ idx = small_index(nb);
+ smallbits = ms->smallmap >> idx;
+
+ if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
+ mchunkptr b, p;
+ idx += ~smallbits & 1; /* Uses next bin if idx empty */
+ b = smallbin_at(ms, idx);
+ p = b->fd;
+ assert(chunksize(p) == small_index2size(idx));
+ unlink_first_small_chunk(ms, b, p, idx);
+ set_inuse_and_pinuse(ms, p, small_index2size(idx));
+ mem = chunk2mem(p);
+ check_malloced_chunk(ms, mem, nb);
+ goto postaction;
+ }
+
+ else if (nb > ms->dvsize) {
+ if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
+ mchunkptr b, p, r;
+ size_t rsize;
+ bindex_t i;
+ binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
+ binmap_t leastbit = least_bit(leftbits);
+ compute_bit2idx(leastbit, i);
+ b = smallbin_at(ms, i);
+ p = b->fd;
+ assert(chunksize(p) == small_index2size(i));
+ unlink_first_small_chunk(ms, b, p, i);
+ rsize = small_index2size(i) - nb;
+ /* Fit here cannot be remainderless if 4byte sizes */
+ if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
+ set_inuse_and_pinuse(ms, p, small_index2size(i));
+ else {
+ set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
+ r = chunk_plus_offset(p, nb);
+ set_size_and_pinuse_of_free_chunk(r, rsize);
+ replace_dv(ms, r, rsize);
+ }
+ mem = chunk2mem(p);
+ check_malloced_chunk(ms, mem, nb);
+ goto postaction;
+ }
+
+ else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) {
+ check_malloced_chunk(ms, mem, nb);
+ goto postaction;
+ }
+ }
+ }
+ else if (bytes >= MAX_REQUEST)
+ nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
+ else {
+ nb = pad_request(bytes);
+ if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) {
+ check_malloced_chunk(ms, mem, nb);
+ goto postaction;
+ }
+ }
+
+ if (nb <= ms->dvsize) {
+ size_t rsize = ms->dvsize - nb;
+ mchunkptr p = ms->dv;
+ if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
+ mchunkptr r = ms->dv = chunk_plus_offset(p, nb);
+ ms->dvsize = rsize;
+ set_size_and_pinuse_of_free_chunk(r, rsize);
+ set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
+ }
+ else { /* exhaust dv */
+ size_t dvs = ms->dvsize;
+ ms->dvsize = 0;
+ ms->dv = 0;
+ set_inuse_and_pinuse(ms, p, dvs);
+ }
+ mem = chunk2mem(p);
+ check_malloced_chunk(ms, mem, nb);
+ goto postaction;
+ }
+
+ else if (nb < ms->topsize) { /* Split top */
+ size_t rsize = ms->topsize -= nb;
+ mchunkptr p = ms->top;
+ mchunkptr r = ms->top = chunk_plus_offset(p, nb);
+ r->head = rsize | PINUSE_BIT;
+ set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
+ mem = chunk2mem(p);
+ check_top_chunk(ms, ms->top);
+ check_malloced_chunk(ms, mem, nb);
+ goto postaction;
+ }
+
+ mem = sys_alloc(ms, nb);
+
+ postaction:
+ POSTACTION(ms);
+ return mem;
+ }
+
+ return 0;
+}
+
+void mspace_free(mspace msp, void* mem) {
+ if (mem != 0) {
+ mchunkptr p = mem2chunk(mem);
+#if FOOTERS
+ mstate fm = get_mstate_for(p);
+ (void)msp; /* placate people compiling -Wunused */
+#else /* FOOTERS */
+ mstate fm = (mstate)msp;
+#endif /* FOOTERS */
+ if (!ok_magic(fm)) {
+ USAGE_ERROR_ACTION(fm, p);
+ return;
+ }
+ if (!PREACTION(fm)) {
+ check_inuse_chunk(fm, p);
+ if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) {
+ size_t psize = chunksize(p);
+ mchunkptr next = chunk_plus_offset(p, psize);
+ if (!pinuse(p)) {
+ size_t prevsize = p->prev_foot;
+ if (is_mmapped(p)) {
+ psize += prevsize + MMAP_FOOT_PAD;
+ if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
+ fm->footprint -= psize;
+ goto postaction;
+ }
+ else {
+ mchunkptr prev = chunk_minus_offset(p, prevsize);
+ psize += prevsize;
+ p = prev;
+ if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
+ if (p != fm->dv) {
+ unlink_chunk(fm, p, prevsize);
+ }
+ else if ((next->head & INUSE_BITS) == INUSE_BITS) {
+ fm->dvsize = psize;
+ set_free_with_pinuse(p, psize, next);
+ goto postaction;
+ }
+ }
+ else
+ goto erroraction;
+ }
+ }
+
+ if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
+ if (!cinuse(next)) { /* consolidate forward */
+ if (next == fm->top) {
+ size_t tsize = fm->topsize += psize;
+ fm->top = p;
+ p->head = tsize | PINUSE_BIT;
+ if (p == fm->dv) {
+ fm->dv = 0;
+ fm->dvsize = 0;
+ }
+ if (should_trim(fm, tsize))
+ sys_trim(fm, 0);
+ goto postaction;
+ }
+ else if (next == fm->dv) {
+ size_t dsize = fm->dvsize += psize;
+ fm->dv = p;
+ set_size_and_pinuse_of_free_chunk(p, dsize);
+ goto postaction;
+ }
+ else {
+ size_t nsize = chunksize(next);
+ psize += nsize;
+ unlink_chunk(fm, next, nsize);
+ set_size_and_pinuse_of_free_chunk(p, psize);
+ if (p == fm->dv) {
+ fm->dvsize = psize;
+ goto postaction;
+ }
+ }
+ }
+ else
+ set_free_with_pinuse(p, psize, next);
+
+ if (is_small(psize)) {
+ insert_small_chunk(fm, p, psize);
+ check_free_chunk(fm, p);
+ }
+ else {
+ tchunkptr tp = (tchunkptr)p;
+ insert_large_chunk(fm, tp, psize);
+ check_free_chunk(fm, p);
+ if (--fm->release_checks == 0)
+ release_unused_segments(fm);
+ }
+ goto postaction;
+ }
+ }
+ erroraction:
+ USAGE_ERROR_ACTION(fm, p);
+ postaction:
+ POSTACTION(fm);
+ }
+ }
+}
+
+void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) {
+ void* mem;
+ size_t req = 0;
+ mstate ms = (mstate)msp;
+ if (!ok_magic(ms)) {
+ USAGE_ERROR_ACTION(ms,ms);
+ return 0;
+ }
+ if (n_elements != 0) {
+ req = n_elements * elem_size;
+ if (((n_elements | elem_size) & ~(size_t)0xffff) &&
+ (req / n_elements != elem_size))
+ req = MAX_SIZE_T; /* force downstream failure on overflow */
+ }
+ mem = internal_malloc(ms, req);
+ if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
+ memset(mem, 0, req);
+ return mem;
+}
+
+void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) {
+ void* mem = 0;
+ if (oldmem == 0) {
+ mem = mspace_malloc(msp, bytes);
+ }
+ else if (bytes >= MAX_REQUEST) {
+ MALLOC_FAILURE_ACTION;
+ }
+#ifdef REALLOC_ZERO_BYTES_FREES
+ else if (bytes == 0) {
+ mspace_free(msp, oldmem);
+ }
+#endif /* REALLOC_ZERO_BYTES_FREES */
+ else {
+ size_t nb = request2size(bytes);
+ mchunkptr oldp = mem2chunk(oldmem);
+#if ! FOOTERS
+ mstate m = (mstate)msp;
+#else /* FOOTERS */
+ mstate m = get_mstate_for(oldp);
+ if (!ok_magic(m)) {
+ USAGE_ERROR_ACTION(m, oldmem);
+ return 0;
+ }
+#endif /* FOOTERS */
+ if (!PREACTION(m)) {
+ mchunkptr newp = try_realloc_chunk(m, oldp, nb, 1);
+ POSTACTION(m);
+ if (newp != 0) {
+ check_inuse_chunk(m, newp);
+ mem = chunk2mem(newp);
+ }
+ else {
+ mem = mspace_malloc(m, bytes);
+ if (mem != 0) {
+ size_t oc = chunksize(oldp) - overhead_for(oldp);
+ memcpy(mem, oldmem, (oc < bytes)? oc : bytes);
+ mspace_free(m, oldmem);
+ }
+ }
+ }
+ }
+ return mem;
+}
+
+void* mspace_realloc_in_place(mspace msp, void* oldmem, size_t bytes) {
+ void* mem = 0;
+ if (oldmem != 0) {
+ if (bytes >= MAX_REQUEST) {
+ MALLOC_FAILURE_ACTION;
+ }
+ else {
+ size_t nb = request2size(bytes);
+ mchunkptr oldp = mem2chunk(oldmem);
+#if ! FOOTERS
+ mstate m = (mstate)msp;
+#else /* FOOTERS */
+ mstate m = get_mstate_for(oldp);
+ (void)msp; /* placate people compiling -Wunused */
+ if (!ok_magic(m)) {
+ USAGE_ERROR_ACTION(m, oldmem);
+ return 0;
+ }
+#endif /* FOOTERS */
+ if (!PREACTION(m)) {
+ mchunkptr newp = try_realloc_chunk(m, oldp, nb, 0);
+ POSTACTION(m);
+ if (newp == oldp) {
+ check_inuse_chunk(m, newp);
+ mem = oldmem;
+ }
+ }
+ }
+ }
+ return mem;
+}
+
+void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) {
+ mstate ms = (mstate)msp;
+ if (!ok_magic(ms)) {
+ USAGE_ERROR_ACTION(ms,ms);
+ return 0;
+ }
+ if (alignment <= MALLOC_ALIGNMENT)
+ return mspace_malloc(msp, bytes);
+ return internal_memalign(ms, alignment, bytes);
+}
+
+void** mspace_independent_calloc(mspace msp, size_t n_elements,
+ size_t elem_size, void* chunks[]) {
+ size_t sz = elem_size; /* serves as 1-element array */
+ mstate ms = (mstate)msp;
+ if (!ok_magic(ms)) {
+ USAGE_ERROR_ACTION(ms,ms);
+ return 0;
+ }
+ return ialloc(ms, n_elements, &sz, 3, chunks);
+}
+
+void** mspace_independent_comalloc(mspace msp, size_t n_elements,
+ size_t sizes[], void* chunks[]) {
+ mstate ms = (mstate)msp;
+ if (!ok_magic(ms)) {
+ USAGE_ERROR_ACTION(ms,ms);
+ return 0;
+ }
+ return ialloc(ms, n_elements, sizes, 0, chunks);
+}
+
+size_t mspace_bulk_free(mspace msp, void* array[], size_t nelem) {
+ return internal_bulk_free((mstate)msp, array, nelem);
+}
+
+#if MALLOC_INSPECT_ALL
+void mspace_inspect_all(mspace msp,
+ void(*handler)(void *start,
+ void *end,
+ size_t used_bytes,
+ void* callback_arg),
+ void* arg) {
+ mstate ms = (mstate)msp;
+ if (ok_magic(ms)) {
+ if (!PREACTION(ms)) {
+ internal_inspect_all(ms, handler, arg);
+ POSTACTION(ms);
+ }
+ }
+ else {
+ USAGE_ERROR_ACTION(ms,ms);
+ }
+}
+#endif /* MALLOC_INSPECT_ALL */
+
+int mspace_trim(mspace msp, size_t pad) {
+ int result = 0;
+ mstate ms = (mstate)msp;
+ if (ok_magic(ms)) {
+ if (!PREACTION(ms)) {
+ result = sys_trim(ms, pad);
+ POSTACTION(ms);
+ }
+ }
+ else {
+ USAGE_ERROR_ACTION(ms,ms);
+ }
+ return result;
+}
+
+#if !NO_MALLOC_STATS
+void mspace_malloc_stats(mspace msp) {
+ mstate ms = (mstate)msp;
+ if (ok_magic(ms)) {
+ internal_malloc_stats(ms);
+ }
+ else {
+ USAGE_ERROR_ACTION(ms,ms);
+ }
+}
+#endif /* NO_MALLOC_STATS */
+
+size_t mspace_footprint(mspace msp) {
+ size_t result = 0;
+ mstate ms = (mstate)msp;
+ if (ok_magic(ms)) {
+ result = ms->footprint;
+ }
+ else {
+ USAGE_ERROR_ACTION(ms,ms);
+ }
+ return result;
+}
+
+size_t mspace_max_footprint(mspace msp) {
+ size_t result = 0;
+ mstate ms = (mstate)msp;
+ if (ok_magic(ms)) {
+ result = ms->max_footprint;
+ }
+ else {
+ USAGE_ERROR_ACTION(ms,ms);
+ }
+ return result;
+}
+
+size_t mspace_footprint_limit(mspace msp) {
+ size_t result = 0;
+ mstate ms = (mstate)msp;
+ if (ok_magic(ms)) {
+ size_t maf = ms->footprint_limit;
+ result = (maf == 0) ? MAX_SIZE_T : maf;
+ }
+ else {
+ USAGE_ERROR_ACTION(ms,ms);
+ }
+ return result;
+}
+
+size_t mspace_set_footprint_limit(mspace msp, size_t bytes) {
+ size_t result = 0;
+ mstate ms = (mstate)msp;
+ if (ok_magic(ms)) {
+ if (bytes == 0)
+ result = granularity_align(1); /* Use minimal size */
+ if (bytes == MAX_SIZE_T)
+ result = 0; /* disable */
+ else
+ result = granularity_align(bytes);
+ ms->footprint_limit = result;
+ }
+ else {
+ USAGE_ERROR_ACTION(ms,ms);
+ }
+ return result;
+}
+
+#if !NO_MALLINFO
+struct mallinfo mspace_mallinfo(mspace msp) {
+ mstate ms = (mstate)msp;
+ if (!ok_magic(ms)) {
+ USAGE_ERROR_ACTION(ms,ms);
+ }
+ return internal_mallinfo(ms);
+}
+#endif /* NO_MALLINFO */
+
+size_t mspace_usable_size(const void* mem) {
+ if (mem != 0) {
+ mchunkptr p = mem2chunk(mem);
+ if (is_inuse(p))
+ return chunksize(p) - overhead_for(p);
+ }
+ return 0;
+}
+
+int mspace_mallopt(int param_number, int value) {
+ return change_mparam(param_number, value);
+}
+
+#endif /* MSPACES */
+
+
+/* -------------------- Alternative MORECORE functions ------------------- */
+
+/*
+ Guidelines for creating a custom version of MORECORE:
+
+ * For best performance, MORECORE should allocate in multiples of pagesize.
+ * MORECORE may allocate more memory than requested. (Or even less,
+ but this will usually result in a malloc failure.)
+ * MORECORE must not allocate memory when given argument zero, but
+ instead return one past the end address of memory from previous
+ nonzero call.
+ * For best performance, consecutive calls to MORECORE with positive
+ arguments should return increasing addresses, indicating that
+ space has been contiguously extended.
+ * Even though consecutive calls to MORECORE need not return contiguous
+ addresses, it must be OK for malloc'ed chunks to span multiple
+ regions in those cases where they do happen to be contiguous.
+ * MORECORE need not handle negative arguments -- it may instead
+ just return MFAIL when given negative arguments.
+ Negative arguments are always multiples of pagesize. MORECORE
+ must not misinterpret negative args as large positive unsigned
+ args. You can suppress all such calls from even occurring by defining
+ MORECORE_CANNOT_TRIM,
+
+ As an example alternative MORECORE, here is a custom allocator
+ kindly contributed for pre-OSX macOS. It uses virtually but not
+ necessarily physically contiguous non-paged memory (locked in,
+ present and won't get swapped out). You can use it by uncommenting
+ this section, adding some #includes, and setting up the appropriate
+ defines above:
+
+ #define MORECORE osMoreCore
+
+ There is also a shutdown routine that should somehow be called for
+ cleanup upon program exit.
+
+ #define MAX_POOL_ENTRIES 100
+ #define MINIMUM_MORECORE_SIZE (64 * 1024U)
+ static int next_os_pool;
+ void *our_os_pools[MAX_POOL_ENTRIES];
+
+ void *osMoreCore(int size)
+ {
+ void *ptr = 0;
+ static void *sbrk_top = 0;
+
+ if (size > 0)
+ {
+ if (size < MINIMUM_MORECORE_SIZE)
+ size = MINIMUM_MORECORE_SIZE;
+ if (CurrentExecutionLevel() == kTaskLevel)
+ ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
+ if (ptr == 0)
+ {
+ return (void *) MFAIL;
+ }
+ // save ptrs so they can be freed during cleanup
+ our_os_pools[next_os_pool] = ptr;
+ next_os_pool++;
+ ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
+ sbrk_top = (char *) ptr + size;
+ return ptr;
+ }
+ else if (size < 0)
+ {
+ // we don't currently support shrink behavior
+ return (void *) MFAIL;
+ }
+ else
+ {
+ return sbrk_top;
+ }
+ }
+
+ // cleanup any allocated memory pools
+ // called as last thing before shutting down driver
+
+ void osCleanupMem(void)
+ {
+ void **ptr;
+
+ for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
+ if (*ptr)
+ {
+ PoolDeallocate(*ptr);
+ *ptr = 0;
+ }
+ }
+
+*/
+
+
+/* -----------------------------------------------------------------------
+History:
+ v2.8.6 Wed Aug 29 06:57:58 2012 Doug Lea
+ * fix bad comparison in dlposix_memalign
+ * don't reuse adjusted asize in sys_alloc
+ * add LOCK_AT_FORK -- thanks to Kirill Artamonov for the suggestion
+ * reduce compiler warnings -- thanks to all who reported/suggested these
+
+ v2.8.5 Sun May 22 10:26:02 2011 Doug Lea (dl at gee)
+ * Always perform unlink checks unless INSECURE
+ * Add posix_memalign.
+ * Improve realloc to expand in more cases; expose realloc_in_place.
+ Thanks to Peter Buhr for the suggestion.
+ * Add footprint_limit, inspect_all, bulk_free. Thanks
+ to Barry Hayes and others for the suggestions.
+ * Internal refactorings to avoid calls while holding locks
+ * Use non-reentrant locks by default. Thanks to Roland McGrath
+ for the suggestion.
+ * Small fixes to mspace_destroy, reset_on_error.
+ * Various configuration extensions/changes. Thanks
+ to all who contributed these.
+
+ V2.8.4a Thu Apr 28 14:39:43 2011 (dl at gee.cs.oswego.edu)
+ * Update Creative Commons URL
+
+ V2.8.4 Wed May 27 09:56:23 2009 Doug Lea (dl at gee)
+ * Use zeros instead of prev foot for is_mmapped
+ * Add mspace_track_large_chunks; thanks to Jean Brouwers
+ * Fix set_inuse in internal_realloc; thanks to Jean Brouwers
+ * Fix insufficient sys_alloc padding when using 16byte alignment
+ * Fix bad error check in mspace_footprint
+ * Adaptations for ptmalloc; thanks to Wolfram Gloger.
+ * Reentrant spin locks; thanks to Earl Chew and others
+ * Win32 improvements; thanks to Niall Douglas and Earl Chew
+ * Add NO_SEGMENT_TRAVERSAL and MAX_RELEASE_CHECK_RATE options
+ * Extension hook in malloc_state
+ * Various small adjustments to reduce warnings on some compilers
+ * Various configuration extensions/changes for more platforms. Thanks
+ to all who contributed these.
+
+ V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee)
+ * Add max_footprint functions
+ * Ensure all appropriate literals are size_t
+ * Fix conditional compilation problem for some #define settings
+ * Avoid concatenating segments with the one provided
+ in create_mspace_with_base
+ * Rename some variables to avoid compiler shadowing warnings
+ * Use explicit lock initialization.
+ * Better handling of sbrk interference.
+ * Simplify and fix segment insertion, trimming and mspace_destroy
+ * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x
+ * Thanks especially to Dennis Flanagan for help on these.
+
+ V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee)
+ * Fix memalign brace error.
+
+ V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee)
+ * Fix improper #endif nesting in C++
+ * Add explicit casts needed for C++
+
+ V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee)
+ * Use trees for large bins
+ * Support mspaces
+ * Use segments to unify sbrk-based and mmap-based system allocation,
+ removing need for emulation on most platforms without sbrk.
+ * Default safety checks
+ * Optional footer checks. Thanks to William Robertson for the idea.
+ * Internal code refactoring
+ * Incorporate suggestions and platform-specific changes.
+ Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas,
+ Aaron Bachmann, Emery Berger, and others.
+ * Speed up non-fastbin processing enough to remove fastbins.
+ * Remove useless cfree() to avoid conflicts with other apps.
+ * Remove internal memcpy, memset. Compilers handle builtins better.
+ * Remove some options that no one ever used and rename others.
+
+ V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee)
+ * Fix malloc_state bitmap array misdeclaration
+
+ V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee)
+ * Allow tuning of FIRST_SORTED_BIN_SIZE
+ * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte.
+ * Better detection and support for non-contiguousness of MORECORE.
+ Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger
+ * Bypass most of malloc if no frees. Thanks To Emery Berger.
+ * Fix freeing of old top non-contiguous chunk im sysmalloc.
+ * Raised default trim and map thresholds to 256K.
+ * Fix mmap-related #defines. Thanks to Lubos Lunak.
+ * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield.
+ * Branch-free bin calculation
+ * Default trim and mmap thresholds now 256K.
+
+ V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee)
+ * Introduce independent_comalloc and independent_calloc.
+ Thanks to Michael Pachos for motivation and help.
+ * Make optional .h file available
+ * Allow > 2GB requests on 32bit systems.
+ * new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>.
+ Thanks also to Andreas Mueller <a.mueller at paradatec.de>,
+ and Anonymous.
+ * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for
+ helping test this.)
+ * memalign: check alignment arg
+ * realloc: don't try to shift chunks backwards, since this
+ leads to more fragmentation in some programs and doesn't
+ seem to help in any others.
+ * Collect all cases in malloc requiring system memory into sysmalloc
+ * Use mmap as backup to sbrk
+ * Place all internal state in malloc_state
+ * Introduce fastbins (although similar to 2.5.1)
+ * Many minor tunings and cosmetic improvements
+ * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK
+ * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS
+ Thanks to Tony E. Bennett <tbennett@nvidia.com> and others.
+ * Include errno.h to support default failure action.
+
+ V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee)
+ * return null for negative arguments
+ * Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com>
+ * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
+ (e.g. WIN32 platforms)
+ * Cleanup header file inclusion for WIN32 platforms
+ * Cleanup code to avoid Microsoft Visual C++ compiler complaints
+ * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
+ memory allocation routines
+ * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
+ * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
+ usage of 'assert' in non-WIN32 code
+ * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
+ avoid infinite loop
+ * Always call 'fREe()' rather than 'free()'
+
+ V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee)
+ * Fixed ordering problem with boundary-stamping
+
+ V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee)
+ * Added pvalloc, as recommended by H.J. Liu
+ * Added 64bit pointer support mainly from Wolfram Gloger
+ * Added anonymously donated WIN32 sbrk emulation
+ * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen
+ * malloc_extend_top: fix mask error that caused wastage after
+ foreign sbrks
+ * Add linux mremap support code from HJ Liu
+
+ V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee)
+ * Integrated most documentation with the code.
+ * Add support for mmap, with help from
+ Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
+ * Use last_remainder in more cases.
+ * Pack bins using idea from colin@nyx10.cs.du.edu
+ * Use ordered bins instead of best-fit threshhold
+ * Eliminate block-local decls to simplify tracing and debugging.
+ * Support another case of realloc via move into top
+ * Fix error occuring when initial sbrk_base not word-aligned.
+ * Rely on page size for units instead of SBRK_UNIT to
+ avoid surprises about sbrk alignment conventions.
+ * Add mallinfo, mallopt. Thanks to Raymond Nijssen
+ (raymond@es.ele.tue.nl) for the suggestion.
+ * Add `pad' argument to malloc_trim and top_pad mallopt parameter.
+ * More precautions for cases where other routines call sbrk,
+ courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
+ * Added macros etc., allowing use in linux libc from
+ H.J. Lu (hjl@gnu.ai.mit.edu)
+ * Inverted this history list
+
+ V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee)
+ * Re-tuned and fixed to behave more nicely with V2.6.0 changes.
+ * Removed all preallocation code since under current scheme
+ the work required to undo bad preallocations exceeds
+ the work saved in good cases for most test programs.
+ * No longer use return list or unconsolidated bins since
+ no scheme using them consistently outperforms those that don't
+ given above changes.
+ * Use best fit for very large chunks to prevent some worst-cases.
+ * Added some support for debugging
+
+ V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee)
+ * Removed footers when chunks are in use. Thanks to
+ Paul Wilson (wilson@cs.texas.edu) for the suggestion.
+
+ V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee)
+ * Added malloc_trim, with help from Wolfram Gloger
+ (wmglo@Dent.MED.Uni-Muenchen.DE).
+
+ V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g)
+
+ V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g)
+ * realloc: try to expand in both directions
+ * malloc: swap order of clean-bin strategy;
+ * realloc: only conditionally expand backwards
+ * Try not to scavenge used bins
+ * Use bin counts as a guide to preallocation
+ * Occasionally bin return list chunks in first scan
+ * Add a few optimizations from colin@nyx10.cs.du.edu
+
+ V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g)
+ * faster bin computation & slightly different binning
+ * merged all consolidations to one part of malloc proper
+ (eliminating old malloc_find_space & malloc_clean_bin)
+ * Scan 2 returns chunks (not just 1)
+ * Propagate failure in realloc if malloc returns 0
+ * Add stuff to allow compilation on non-ANSI compilers
+ from kpv@research.att.com
+
+ V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu)
+ * removed potential for odd address access in prev_chunk
+ * removed dependency on getpagesize.h
+ * misc cosmetics and a bit more internal documentation
+ * anticosmetics: mangled names in macros to evade debugger strangeness
+ * tested on sparc, hp-700, dec-mips, rs6000
+ with gcc & native cc (hp, dec only) allowing
+ Detlefs & Zorn comparison study (in SIGPLAN Notices.)
+
+ Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu)
+ * Based loosely on libg++-1.2X malloc. (It retains some of the overall
+ structure of old version, but most details differ.)
+
+*/
diff --git a/emmalloc/emmalloc.c b/emmalloc/emmalloc.c
new file mode 100644
index 0000000..c98e42e
--- /dev/null
+++ b/emmalloc/emmalloc.c
@@ -0,0 +1,1535 @@
+/*
+ * Copyright 2018 The Emscripten Authors. All rights reserved.
+ * Emscripten is available under two separate licenses, the MIT license and the
+ * University of Illinois/NCSA Open Source License. Both these licenses can be
+ * found in the LICENSE file.
+ *
+ * Simple minimalistic but efficient sbrk()-based malloc/free that works in
+ * singlethreaded and multithreaded builds.
+ *
+ * Assumptions:
+ *
+ * - sbrk() is used to claim new memory (sbrk handles geometric/linear
+ * - overallocation growth)
+ * - sbrk() can be used by other code outside emmalloc.
+ * - sbrk() is very fast in most cases (internal wasm call).
+ * - sbrk() returns pointers with an alignment of alignof(max_align_t)
+ *
+ * Invariants:
+ *
+ * - Per-allocation header overhead is 8 bytes, smallest allocated payload
+ * amount is 8 bytes, and a multiple of 4 bytes.
+ * - Acquired memory blocks are subdivided into disjoint regions that lie
+ * next to each other.
+ * - A region is either in used or free.
+ * Used regions may be adjacent, and a used and unused region
+ * may be adjacent, but not two unused ones - they would be
+ * merged.
+ * - Memory allocation takes constant time, unless the alloc needs to sbrk()
+ * or memory is very close to being exhausted.
+ *
+ * Debugging:
+ *
+ * - If not NDEBUG, runtime assert()s are in use.
+ * - If EMMALLOC_MEMVALIDATE is defined, a large amount of extra checks are done.
+ * - If EMMALLOC_VERBOSE is defined, a lot of operations are logged
+ * out, in addition to EMMALLOC_MEMVALIDATE.
+ * - Debugging and logging directly uses console.log via uses EM_ASM, not
+ * printf etc., to minimize any risk of debugging or logging depending on
+ * malloc.
+ */
+
+#include <stdalign.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <memory.h>
+#include <assert.h>
+#include <malloc.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#ifdef __EMSCRIPTEN_TRACING__
+#include <emscripten/trace.h>
+#endif
+
+// Defind by the linker to have the address of the start of the heap.
+extern unsigned char __heap_base;
+
+// Behavior of right shifting a signed integer is compiler implementation defined.
+static_assert((((int32_t)0x80000000U) >> 31) == -1, "This malloc implementation requires that right-shifting a signed integer produces a sign-extending (arithmetic) shift!");
+
+// Configuration: specifies the minimum alignment that malloc()ed memory outputs. Allocation requests with smaller alignment
+// than this will yield an allocation with this much alignment.
+#define MALLOC_ALIGNMENT alignof(max_align_t)
+static_assert(alignof(max_align_t) == 16, "max_align_t must be correct");
+
+#define EMMALLOC_EXPORT __attribute__((weak))
+
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+
+#define NUM_FREE_BUCKETS 64
+#define BUCKET_BITMASK_T uint64_t
+
+// Dynamic memory is subdivided into regions, in the format
+
+// <size:uint32_t> ..... <size:uint32_t> | <size:uint32_t> ..... <size:uint32_t> | <size:uint32_t> ..... <size:uint32_t> | .....
+
+// That is, at the bottom and top end of each memory region, the size of that region is stored. That allows traversing the
+// memory regions backwards and forwards. Because each allocation must be at least a multiple of 4 bytes, the lowest two bits of
+// each size field is unused. Free regions are distinguished by used regions by having the FREE_REGION_FLAG bit present
+// in the size field. I.e. for free regions, the size field is odd, and for used regions, the size field reads even.
+#define FREE_REGION_FLAG 0x1u
+
+// Attempts to malloc() more than this many bytes would cause an overflow when calculating the size of a region,
+// therefore allocations larger than this are short-circuited immediately on entry.
+#define MAX_ALLOC_SIZE 0xFFFFFFC7u
+
+// A free region has the following structure:
+// <size:size_t> <prevptr> <nextptr> ... <size:size_t>
+
+typedef struct Region
+{
+ size_t size;
+ // Use a circular doubly linked list to represent free region data.
+ struct Region *prev, *next;
+ // ... N bytes of free data
+ size_t _at_the_end_of_this_struct_size; // do not dereference, this is present for convenient struct sizeof() computation only
+} Region;
+
+// Each memory block starts with a RootRegion at the beginning.
+// The RootRegion specifies the size of the region block, and forms a linked
+// list of all RootRegions in the program, starting with `listOfAllRegions`
+// below.
+typedef struct RootRegion
+{
+ uint32_t size;
+ struct RootRegion *next;
+ uint8_t* endPtr;
+} RootRegion;
+
+#if defined(__EMSCRIPTEN_PTHREADS__)
+// In multithreaded builds, use a simple global spinlock strategy to acquire/release access to the memory allocator.
+static volatile uint8_t multithreadingLock = 0;
+#define MALLOC_ACQUIRE() while(__sync_lock_test_and_set(&multithreadingLock, 1)) { while(multithreadingLock) { /*nop*/ } }
+#define MALLOC_RELEASE() __sync_lock_release(&multithreadingLock)
+// Test code to ensure we have tight malloc acquire/release guards in place.
+#define ASSERT_MALLOC_IS_ACQUIRED() assert(multithreadingLock == 1)
+#else
+// In singlethreaded builds, no need for locking.
+#define MALLOC_ACQUIRE() ((void)0)
+#define MALLOC_RELEASE() ((void)0)
+#define ASSERT_MALLOC_IS_ACQUIRED() ((void)0)
+#endif
+
+#define IS_POWER_OF_2(val) (((val) & ((val)-1)) == 0)
+#define ALIGN_UP(ptr, alignment) ((uint8_t*)((((uintptr_t)(ptr)) + ((alignment)-1)) & ~((alignment)-1)))
+#define HAS_ALIGNMENT(ptr, alignment) ((((uintptr_t)(ptr)) & ((alignment)-1)) == 0)
+
+static_assert(IS_POWER_OF_2(MALLOC_ALIGNMENT), "MALLOC_ALIGNMENT must be a power of two value!");
+static_assert(MALLOC_ALIGNMENT >= 4, "Smallest possible MALLOC_ALIGNMENT if 4!");
+
+// A region that contains as payload a single forward linked list of pointers to
+// root regions of each disjoint region blocks.
+static RootRegion *listOfAllRegions = NULL;
+
+// For each of the buckets, maintain a linked list head node. The head node for each
+// free region is a sentinel node that does not actually represent any free space, but
+// the sentinel is used to avoid awkward testing against (if node == freeRegionHeadNode)
+// when adding and removing elements from the linked list, i.e. we are guaranteed that
+// the sentinel node is always fixed and there, and the actual free region list elements
+// start at freeRegionBuckets[i].next each.
+static Region freeRegionBuckets[NUM_FREE_BUCKETS] = {
+ { .prev = &freeRegionBuckets[0], .next = &freeRegionBuckets[0] },
+ { .prev = &freeRegionBuckets[1], .next = &freeRegionBuckets[1] },
+ { .prev = &freeRegionBuckets[2], .next = &freeRegionBuckets[2] },
+ { .prev = &freeRegionBuckets[3], .next = &freeRegionBuckets[3] },
+ { .prev = &freeRegionBuckets[4], .next = &freeRegionBuckets[4] },
+ { .prev = &freeRegionBuckets[5], .next = &freeRegionBuckets[5] },
+ { .prev = &freeRegionBuckets[6], .next = &freeRegionBuckets[6] },
+ { .prev = &freeRegionBuckets[7], .next = &freeRegionBuckets[7] },
+ { .prev = &freeRegionBuckets[8], .next = &freeRegionBuckets[8] },
+ { .prev = &freeRegionBuckets[9], .next = &freeRegionBuckets[9] },
+ { .prev = &freeRegionBuckets[10], .next = &freeRegionBuckets[10] },
+ { .prev = &freeRegionBuckets[11], .next = &freeRegionBuckets[11] },
+ { .prev = &freeRegionBuckets[12], .next = &freeRegionBuckets[12] },
+ { .prev = &freeRegionBuckets[13], .next = &freeRegionBuckets[13] },
+ { .prev = &freeRegionBuckets[14], .next = &freeRegionBuckets[14] },
+ { .prev = &freeRegionBuckets[15], .next = &freeRegionBuckets[15] },
+ { .prev = &freeRegionBuckets[16], .next = &freeRegionBuckets[16] },
+ { .prev = &freeRegionBuckets[17], .next = &freeRegionBuckets[17] },
+ { .prev = &freeRegionBuckets[18], .next = &freeRegionBuckets[18] },
+ { .prev = &freeRegionBuckets[19], .next = &freeRegionBuckets[19] },
+ { .prev = &freeRegionBuckets[20], .next = &freeRegionBuckets[20] },
+ { .prev = &freeRegionBuckets[21], .next = &freeRegionBuckets[21] },
+ { .prev = &freeRegionBuckets[22], .next = &freeRegionBuckets[22] },
+ { .prev = &freeRegionBuckets[23], .next = &freeRegionBuckets[23] },
+ { .prev = &freeRegionBuckets[24], .next = &freeRegionBuckets[24] },
+ { .prev = &freeRegionBuckets[25], .next = &freeRegionBuckets[25] },
+ { .prev = &freeRegionBuckets[26], .next = &freeRegionBuckets[26] },
+ { .prev = &freeRegionBuckets[27], .next = &freeRegionBuckets[27] },
+ { .prev = &freeRegionBuckets[28], .next = &freeRegionBuckets[28] },
+ { .prev = &freeRegionBuckets[29], .next = &freeRegionBuckets[29] },
+ { .prev = &freeRegionBuckets[30], .next = &freeRegionBuckets[30] },
+ { .prev = &freeRegionBuckets[31], .next = &freeRegionBuckets[31] },
+ { .prev = &freeRegionBuckets[32], .next = &freeRegionBuckets[32] },
+ { .prev = &freeRegionBuckets[33], .next = &freeRegionBuckets[33] },
+ { .prev = &freeRegionBuckets[34], .next = &freeRegionBuckets[34] },
+ { .prev = &freeRegionBuckets[35], .next = &freeRegionBuckets[35] },
+ { .prev = &freeRegionBuckets[36], .next = &freeRegionBuckets[36] },
+ { .prev = &freeRegionBuckets[37], .next = &freeRegionBuckets[37] },
+ { .prev = &freeRegionBuckets[38], .next = &freeRegionBuckets[38] },
+ { .prev = &freeRegionBuckets[39], .next = &freeRegionBuckets[39] },
+ { .prev = &freeRegionBuckets[40], .next = &freeRegionBuckets[40] },
+ { .prev = &freeRegionBuckets[41], .next = &freeRegionBuckets[41] },
+ { .prev = &freeRegionBuckets[42], .next = &freeRegionBuckets[42] },
+ { .prev = &freeRegionBuckets[43], .next = &freeRegionBuckets[43] },
+ { .prev = &freeRegionBuckets[44], .next = &freeRegionBuckets[44] },
+ { .prev = &freeRegionBuckets[45], .next = &freeRegionBuckets[45] },
+ { .prev = &freeRegionBuckets[46], .next = &freeRegionBuckets[46] },
+ { .prev = &freeRegionBuckets[47], .next = &freeRegionBuckets[47] },
+ { .prev = &freeRegionBuckets[48], .next = &freeRegionBuckets[48] },
+ { .prev = &freeRegionBuckets[49], .next = &freeRegionBuckets[49] },
+ { .prev = &freeRegionBuckets[50], .next = &freeRegionBuckets[50] },
+ { .prev = &freeRegionBuckets[51], .next = &freeRegionBuckets[51] },
+ { .prev = &freeRegionBuckets[52], .next = &freeRegionBuckets[52] },
+ { .prev = &freeRegionBuckets[53], .next = &freeRegionBuckets[53] },
+ { .prev = &freeRegionBuckets[54], .next = &freeRegionBuckets[54] },
+ { .prev = &freeRegionBuckets[55], .next = &freeRegionBuckets[55] },
+ { .prev = &freeRegionBuckets[56], .next = &freeRegionBuckets[56] },
+ { .prev = &freeRegionBuckets[57], .next = &freeRegionBuckets[57] },
+ { .prev = &freeRegionBuckets[58], .next = &freeRegionBuckets[58] },
+ { .prev = &freeRegionBuckets[59], .next = &freeRegionBuckets[59] },
+ { .prev = &freeRegionBuckets[60], .next = &freeRegionBuckets[60] },
+ { .prev = &freeRegionBuckets[61], .next = &freeRegionBuckets[61] },
+ { .prev = &freeRegionBuckets[62], .next = &freeRegionBuckets[62] },
+ { .prev = &freeRegionBuckets[63], .next = &freeRegionBuckets[63] },
+};
+
+// A bitmask that tracks the population status for each of the 64 distinct memory regions:
+// a zero at bit position i means that the free list bucket i is empty. This bitmask is
+// used to avoid redundant scanning of the 64 different free region buckets: instead by
+// looking at the bitmask we can find in constant time an index to a free region bucket
+// that contains free memory of desired size.
+static BUCKET_BITMASK_T freeRegionBucketsUsed = 0;
+
+// Amount of bytes taken up by allocation header data
+#define REGION_HEADER_SIZE (2*sizeof(size_t))
+
+// Smallest allocation size that is possible is 2*pointer size, since payload of each region must at least contain space
+// to store the free region linked list prev and next pointers. An allocation size smaller than this will be rounded up
+// to this size.
+#define SMALLEST_ALLOCATION_SIZE (2*sizeof(void*))
+
+/* Subdivide regions of free space into distinct circular doubly linked lists, where each linked list
+represents a range of free space blocks. The following function compute_free_list_bucket() converts
+an allocation size to the bucket index that should be looked at. The buckets are grouped as follows:
+
+ Bucket 0: [8, 15], range size=8
+ Bucket 1: [16, 23], range size=8
+ Bucket 2: [24, 31], range size=8
+ Bucket 3: [32, 39], range size=8
+ Bucket 4: [40, 47], range size=8
+ Bucket 5: [48, 55], range size=8
+ Bucket 6: [56, 63], range size=8
+ Bucket 7: [64, 71], range size=8
+ Bucket 8: [72, 79], range size=8
+ Bucket 9: [80, 87], range size=8
+ Bucket 10: [88, 95], range size=8
+ Bucket 11: [96, 103], range size=8
+ Bucket 12: [104, 111], range size=8
+ Bucket 13: [112, 119], range size=8
+ Bucket 14: [120, 159], range size=40
+ Bucket 15: [160, 191], range size=32
+ Bucket 16: [192, 223], range size=32
+ Bucket 17: [224, 255], range size=32
+ Bucket 18: [256, 319], range size=64
+ Bucket 19: [320, 383], range size=64
+ Bucket 20: [384, 447], range size=64
+ Bucket 21: [448, 511], range size=64
+ Bucket 22: [512, 639], range size=128
+ Bucket 23: [640, 767], range size=128
+ Bucket 24: [768, 895], range size=128
+ Bucket 25: [896, 1023], range size=128
+ Bucket 26: [1024, 1279], range size=256
+ Bucket 27: [1280, 1535], range size=256
+ Bucket 28: [1536, 1791], range size=256
+ Bucket 29: [1792, 2047], range size=256
+ Bucket 30: [2048, 2559], range size=512
+ Bucket 31: [2560, 3071], range size=512
+ Bucket 32: [3072, 3583], range size=512
+ Bucket 33: [3584, 6143], range size=2560
+ Bucket 34: [6144, 8191], range size=2048
+ Bucket 35: [8192, 12287], range size=4096
+ Bucket 36: [12288, 16383], range size=4096
+ Bucket 37: [16384, 24575], range size=8192
+ Bucket 38: [24576, 32767], range size=8192
+ Bucket 39: [32768, 49151], range size=16384
+ Bucket 40: [49152, 65535], range size=16384
+ Bucket 41: [65536, 98303], range size=32768
+ Bucket 42: [98304, 131071], range size=32768
+ Bucket 43: [131072, 196607], range size=65536
+ Bucket 44: [196608, 262143], range size=65536
+ Bucket 45: [262144, 393215], range size=131072
+ Bucket 46: [393216, 524287], range size=131072
+ Bucket 47: [524288, 786431], range size=262144
+ Bucket 48: [786432, 1048575], range size=262144
+ Bucket 49: [1048576, 1572863], range size=524288
+ Bucket 50: [1572864, 2097151], range size=524288
+ Bucket 51: [2097152, 3145727], range size=1048576
+ Bucket 52: [3145728, 4194303], range size=1048576
+ Bucket 53: [4194304, 6291455], range size=2097152
+ Bucket 54: [6291456, 8388607], range size=2097152
+ Bucket 55: [8388608, 12582911], range size=4194304
+ Bucket 56: [12582912, 16777215], range size=4194304
+ Bucket 57: [16777216, 25165823], range size=8388608
+ Bucket 58: [25165824, 33554431], range size=8388608
+ Bucket 59: [33554432, 50331647], range size=16777216
+ Bucket 60: [50331648, 67108863], range size=16777216
+ Bucket 61: [67108864, 100663295], range size=33554432
+ Bucket 62: [100663296, 134217727], range size=33554432
+ Bucket 63: 134217728 bytes and larger. */
+static_assert(NUM_FREE_BUCKETS == 64, "Following function is tailored specifically for NUM_FREE_BUCKETS == 64 case");
+static int compute_free_list_bucket(size_t allocSize)
+{
+ if (allocSize < 128) return (allocSize >> 3) - 1;
+ int clz = __builtin_clz(allocSize);
+ int bucketIndex = (clz > 19) ? 110 - (clz<<2) + ((allocSize >> (29-clz)) ^ 4) : MIN(71 - (clz<<1) + ((allocSize >> (30-clz)) ^ 2), NUM_FREE_BUCKETS-1);
+ assert(bucketIndex >= 0);
+ assert(bucketIndex < NUM_FREE_BUCKETS);
+ return bucketIndex;
+}
+
+#define DECODE_CEILING_SIZE(size) ((size_t)((size) & ~FREE_REGION_FLAG))
+
+static Region *prev_region(Region *region)
+{
+ size_t prevRegionSize = ((size_t*)region)[-1];
+ prevRegionSize = DECODE_CEILING_SIZE(prevRegionSize);
+ return (Region*)((uint8_t*)region - prevRegionSize);
+}
+
+static Region *next_region(Region *region)
+{
+ return (Region*)((uint8_t*)region + region->size);
+}
+
+static size_t region_ceiling_size(Region *region)
+{
+ return ((size_t*)((uint8_t*)region + region->size))[-1];
+}
+
+static bool region_is_free(Region *r)
+{
+ return region_ceiling_size(r) & FREE_REGION_FLAG;
+}
+
+static bool region_is_in_use(Region *r)
+{
+ return r->size == region_ceiling_size(r);
+}
+
+static size_t size_of_region_from_ceiling(Region *r)
+{
+ size_t size = region_ceiling_size(r);
+ return DECODE_CEILING_SIZE(size);
+}
+
+static bool debug_region_is_consistent(Region *r)
+{
+ assert(r);
+ size_t sizeAtBottom = r->size;
+ size_t sizeAtCeiling = size_of_region_from_ceiling(r);
+ return sizeAtBottom == sizeAtCeiling;
+}
+
+static uint8_t *region_payload_start_ptr(Region *region)
+{
+ return (uint8_t*)region + sizeof(size_t);
+}
+
+static uint8_t *region_payload_end_ptr(Region *region)
+{
+ return (uint8_t*)region + region->size - sizeof(size_t);
+}
+
+static void create_used_region(void *ptr, size_t size)
+{
+ assert(ptr);
+ assert(HAS_ALIGNMENT(ptr, sizeof(size_t)));
+ assert(HAS_ALIGNMENT(size, sizeof(size_t)));
+ assert(size >= sizeof(Region));
+ *(size_t*)ptr = size;
+ ((size_t*)ptr)[(size/sizeof(size_t))-1] = size;
+}
+
+static void create_free_region(void *ptr, size_t size)
+{
+ assert(ptr);
+ assert(HAS_ALIGNMENT(ptr, sizeof(size_t)));
+ assert(HAS_ALIGNMENT(size, sizeof(size_t)));
+ assert(size >= sizeof(Region));
+ Region *freeRegion = (Region*)ptr;
+ freeRegion->size = size;
+ ((size_t*)ptr)[(size/sizeof(size_t))-1] = size | FREE_REGION_FLAG;
+}
+
+static void prepend_to_free_list(Region *region, Region *prependTo)
+{
+ assert(region);
+ assert(prependTo);
+ // N.b. the region we are prepending to is always the sentinel node,
+ // which represents a dummy node that is technically not a free node, so
+ // region_is_free(prependTo) does not hold.
+ assert(region_is_free((Region*)region));
+ region->next = prependTo;
+ region->prev = prependTo->prev;
+ assert(region->prev);
+ prependTo->prev = region;
+ region->prev->next = region;
+}
+
+static void unlink_from_free_list(Region *region)
+{
+ assert(region);
+ assert(region_is_free((Region*)region));
+ assert(region->prev);
+ assert(region->next);
+ region->prev->next = region->next;
+ region->next->prev = region->prev;
+}
+
+static void link_to_free_list(Region *freeRegion)
+{
+ assert(freeRegion);
+ assert(freeRegion->size >= sizeof(Region));
+ int bucketIndex = compute_free_list_bucket(freeRegion->size-REGION_HEADER_SIZE);
+ Region *freeListHead = freeRegionBuckets + bucketIndex;
+ freeRegion->prev = freeListHead;
+ freeRegion->next = freeListHead->next;
+ assert(freeRegion->next);
+ freeListHead->next = freeRegion;
+ freeRegion->next->prev = freeRegion;
+ freeRegionBucketsUsed |= ((BUCKET_BITMASK_T)1) << bucketIndex;
+}
+
+#if 0
+static void dump_memory_regions()
+{
+ ASSERT_MALLOC_IS_ACQUIRED();
+ RootRegion *root = listOfAllRegions;
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('All memory regions:'));
+ while(root)
+ {
+ Region *r = (Region*)root;
+ assert(debug_region_is_consistent(r));
+ uint8_t *lastRegionEnd = root->endPtr;
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('Region block 0x'+($0>>>0).toString(16)+' - 0x'+($1>>>0).toString(16)+ ' ('+($2>>>0)+' bytes):'),
+ r, lastRegionEnd, lastRegionEnd-(uint8_t*)r);
+ while((uint8_t*)r < lastRegionEnd)
+ {
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('Region 0x'+($0>>>0).toString(16)+', size: '+($1>>>0)+' ('+($2?"used":"--FREE--")+')'),
+ r, r->size, region_ceiling_size(r) == r->size);
+
+ assert(debug_region_is_consistent(r));
+ size_t sizeFromCeiling = size_of_region_from_ceiling(r);
+ if (sizeFromCeiling != r->size)
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('Corrupt region! Size marker at the end of the region does not match: '+($0>>>0)), sizeFromCeiling);
+ if (r->size == 0)
+ break;
+ r = next_region(r);
+ }
+ root = root->next;
+ MAIN_THREAD_ASYNC_EM_ASM(console.log(""));
+ }
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('Free regions:'));
+ for(int i = 0; i < NUM_FREE_BUCKETS; ++i)
+ {
+ Region *prev = &freeRegionBuckets[i];
+ Region *fr = freeRegionBuckets[i].next;
+ while(fr != &freeRegionBuckets[i])
+ {
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('In bucket '+$0+', free region 0x'+($1>>>0).toString(16)+', size: ' + ($2>>>0) + ' (size at ceiling: '+($3>>>0)+'), prev: 0x' + ($4>>>0).toString(16) + ', next: 0x' + ($5>>>0).toString(16)),
+ i, fr, fr->size, size_of_region_from_ceiling(fr), fr->prev, fr->next);
+ assert(debug_region_is_consistent(fr));
+ assert(region_is_free(fr));
+ assert(fr->prev == prev);
+ prev = fr;
+ assert(fr->next != fr);
+ assert(fr->prev != fr);
+ fr = fr->next;
+ }
+ }
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('Free bucket index map: ' + ($0>>>0).toString(2) + ' ' + ($1>>>0).toString(2)), (uint32_t)(freeRegionBucketsUsed >> 32), (uint32_t)freeRegionBucketsUsed);
+ MAIN_THREAD_ASYNC_EM_ASM(console.log(""));
+}
+
+void emmalloc_dump_memory_regions()
+{
+ MALLOC_ACQUIRE();
+ dump_memory_regions();
+ MALLOC_RELEASE();
+}
+
+static int validate_memory_regions()
+{
+ ASSERT_MALLOC_IS_ACQUIRED();
+ RootRegion *root = listOfAllRegions;
+ while(root)
+ {
+ Region *r = (Region*)root;
+ if (!debug_region_is_consistent(r))
+ {
+ MAIN_THREAD_ASYNC_EM_ASM(console.error('Used region 0x'+($0>>>0).toString(16)+', size: '+($1>>>0)+' ('+($2?"used":"--FREE--")+') is corrupt (size markers in the beginning and at the end of the region do not match!)'),
+ r, r->size, region_ceiling_size(r) == r->size);
+ return 1;
+ }
+ uint8_t *lastRegionEnd = root->endPtr;
+ while((uint8_t*)r < lastRegionEnd)
+ {
+ if (!debug_region_is_consistent(r))
+ {
+ MAIN_THREAD_ASYNC_EM_ASM(console.error('Used region 0x'+($0>>>0).toString(16)+', size: '+($1>>>0)+' ('+($2?"used":"--FREE--")+') is corrupt (size markers in the beginning and at the end of the region do not match!)'),
+ r, r->size, region_ceiling_size(r) == r->size);
+ return 1;
+ }
+ if (r->size == 0)
+ break;
+ r = next_region(r);
+ }
+ root = root->next;
+ }
+ for(int i = 0; i < NUM_FREE_BUCKETS; ++i)
+ {
+ Region *prev = &freeRegionBuckets[i];
+ Region *fr = freeRegionBuckets[i].next;
+ while(fr != &freeRegionBuckets[i])
+ {
+ if (!debug_region_is_consistent(fr) || !region_is_free(fr) || fr->prev != prev || fr->next == fr || fr->prev == fr)
+ {
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('In bucket '+$0+', free region 0x'+($1>>>0).toString(16)+', size: ' + ($2>>>0) + ' (size at ceiling: '+($3>>>0)+'), prev: 0x' + ($4>>>0).toString(16) + ', next: 0x' + ($5>>>0).toString(16) + ' is corrupt!'),
+ i, fr, fr->size, size_of_region_from_ceiling(fr), fr->prev, fr->next);
+ return 1;
+ }
+ prev = fr;
+ fr = fr->next;
+ }
+ }
+ return 0;
+}
+
+int emmalloc_validate_memory_regions()
+{
+ MALLOC_ACQUIRE();
+ int memoryError = validate_memory_regions();
+ MALLOC_RELEASE();
+ return memoryError;
+}
+#endif
+
+static bool claim_more_memory(size_t numBytes)
+{
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('claim_more_memory(numBytes='+($0>>>0)+ ')'), numBytes);
+#endif
+
+#ifdef EMMALLOC_MEMVALIDATE
+ validate_memory_regions();
+#endif
+
+ uint8_t *startPtr;
+ uint8_t *endPtr;
+ do {
+ // If this is the first time we're called, see if we can use
+ // the initial heap memory set up by wasm-ld.
+ if (!listOfAllRegions) {
+ unsigned char *heap_end = sbrk(0);
+ if (numBytes <= (size_t)(heap_end - &__heap_base)) {
+ startPtr = &__heap_base;
+ endPtr = heap_end;
+ break;
+ }
+ }
+
+ // Round numBytes up to the nearest page size.
+ numBytes = (numBytes + (PAGE_SIZE-1)) & -PAGE_SIZE;
+
+ // Claim memory via sbrk
+ startPtr = (uint8_t*)sbrk(numBytes);
+ if ((intptr_t)startPtr == -1)
+ {
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.error('claim_more_memory: sbrk failed!'));
+#endif
+ return false;
+ }
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('claim_more_memory: claimed 0x' + ($0>>>0).toString(16) + ' - 0x' + ($1>>>0).toString(16) + ' (' + ($2>>>0) + ' bytes) via sbrk()'), startPtr, startPtr + numBytes, numBytes);
+#endif
+ assert(HAS_ALIGNMENT(startPtr, alignof(size_t)));
+ endPtr = startPtr + numBytes;
+ } while (0);
+
+ // Create a sentinel region at the end of the new heap block
+ Region *endSentinelRegion = (Region*)(endPtr - sizeof(Region));
+ create_used_region(endSentinelRegion, sizeof(Region));
+
+ // If we are the sole user of sbrk(), it will feed us continuous/consecutive memory addresses - take advantage
+ // of that if so: instead of creating two disjoint memory regions blocks, expand the previous one to a larger size.
+ uint8_t *previousSbrkEndAddress = listOfAllRegions ? listOfAllRegions->endPtr : 0;
+ if (startPtr == previousSbrkEndAddress)
+ {
+ Region *prevEndSentinel = prev_region((Region*)startPtr);
+ assert(debug_region_is_consistent(prevEndSentinel));
+ assert(region_is_in_use(prevEndSentinel));
+ Region *prevRegion = prev_region(prevEndSentinel);
+ assert(debug_region_is_consistent(prevRegion));
+
+ listOfAllRegions->endPtr = endPtr;
+
+ // Two scenarios, either the last region of the previous block was in use, in which case we need to create
+ // a new free region in the newly allocated space; or it was free, in which case we can extend that region
+ // to cover a larger size.
+ if (region_is_free(prevRegion))
+ {
+ size_t newFreeRegionSize = (uint8_t*)endSentinelRegion - (uint8_t*)prevRegion;
+ unlink_from_free_list(prevRegion);
+ create_free_region(prevRegion, newFreeRegionSize);
+ link_to_free_list(prevRegion);
+ return true;
+ }
+ // else: last region of the previous block was in use. Since we are joining two consecutive sbrk() blocks,
+ // we can swallow the end sentinel of the previous block away.
+ startPtr -= sizeof(Region);
+ }
+ else
+ {
+ // Create a root region at the start of the heap block
+ create_used_region(startPtr, sizeof(Region));
+
+ // Dynamic heap start region:
+ RootRegion *newRegionBlock = (RootRegion*)startPtr;
+ newRegionBlock->next = listOfAllRegions; // Pointer to next region block head
+ newRegionBlock->endPtr = endPtr; // Pointer to the end address of this region block
+ listOfAllRegions = newRegionBlock;
+ startPtr += sizeof(Region);
+ }
+
+ // Create a new memory region for the new claimed free space.
+ create_free_region(startPtr, (uint8_t*)endSentinelRegion - startPtr);
+ link_to_free_list((Region*)startPtr);
+ return true;
+}
+
+#if 0
+// Initialize emmalloc during static initialization.
+// See system/lib/README.md for static constructor ordering.
+__attribute__((constructor(47)))
+static void initialize_emmalloc_heap()
+{
+ // Initialize circular doubly linked lists representing free space
+ // Never useful to unroll this for loop, just takes up code size.
+#pragma clang loop unroll(disable)
+ for(int i = 0; i < NUM_FREE_BUCKETS; ++i)
+ freeRegionBuckets[i].prev = freeRegionBuckets[i].next = &freeRegionBuckets[i];
+
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('initialize_emmalloc_heap()'));
+#endif
+
+ // Start with a tiny dynamic region.
+ claim_more_memory(3*sizeof(Region));
+}
+
+void emmalloc_blank_slate_from_orbit()
+{
+ MALLOC_ACQUIRE();
+ listOfAllRegions = NULL;
+ freeRegionBucketsUsed = 0;
+ initialize_emmalloc_heap();
+ MALLOC_RELEASE();
+}
+#endif
+
+static void *attempt_allocate(Region *freeRegion, size_t alignment, size_t size)
+{
+ ASSERT_MALLOC_IS_ACQUIRED();
+ assert(freeRegion);
+ // Look at the next potential free region to allocate into.
+ // First, we should check if the free region has enough of payload bytes contained
+ // in it to accommodate the new allocation. This check needs to take account the
+ // requested allocation alignment, so the payload memory area needs to be rounded
+ // upwards to the desired alignment.
+ uint8_t *payloadStartPtr = region_payload_start_ptr(freeRegion);
+ uint8_t *payloadStartPtrAligned = ALIGN_UP(payloadStartPtr, alignment);
+ uint8_t *payloadEndPtr = region_payload_end_ptr(freeRegion);
+
+ // Do we have enough free space, taking into account alignment?
+ if (payloadStartPtrAligned + size > payloadEndPtr)
+ return NULL;
+
+ // We have enough free space, so the memory allocation will be made into this region. Remove this free region
+ // from the list of free regions: whatever slop remains will be later added back to the free region pool.
+ unlink_from_free_list(freeRegion);
+
+ // Before we proceed further, fix up the boundary of this region and the region that precedes this one,
+ // so that the boundary between the two regions happens at a right spot for the payload to be aligned.
+ if (payloadStartPtr != payloadStartPtrAligned)
+ {
+ Region *prevRegion = prev_region((Region*)freeRegion);
+ // We never have two free regions adjacent to each other, so the region before this free
+ // region should be in use.
+ assert(region_is_in_use(prevRegion));
+ size_t regionBoundaryBumpAmount = payloadStartPtrAligned - payloadStartPtr;
+ size_t newThisRegionSize = freeRegion->size - regionBoundaryBumpAmount;
+ create_used_region(prevRegion, prevRegion->size + regionBoundaryBumpAmount);
+ freeRegion = (Region *)((uint8_t*)freeRegion + regionBoundaryBumpAmount);
+ freeRegion->size = newThisRegionSize;
+ }
+ // Next, we need to decide whether this region is so large that it should be split into two regions,
+ // one representing the newly used memory area, and at the high end a remaining leftover free area.
+ // This splitting to two is done always if there is enough space for the high end to fit a region.
+ // Carve 'size' bytes of payload off this region. So,
+ // [sz prev next sz]
+ // becomes
+ // [sz payload sz] [sz prev next sz]
+ if (sizeof(Region) + REGION_HEADER_SIZE + size <= freeRegion->size)
+ {
+ // There is enough space to keep a free region at the end of the carved out block
+ // -> construct the new block
+ Region *newFreeRegion = (Region *)((uint8_t*)freeRegion + REGION_HEADER_SIZE + size);
+ create_free_region(newFreeRegion, freeRegion->size - size - REGION_HEADER_SIZE);
+ link_to_free_list(newFreeRegion);
+
+ // Recreate the resized Region under its new size.
+ create_used_region(freeRegion, size + REGION_HEADER_SIZE);
+ }
+ else
+ {
+ // There is not enough space to split the free memory region into used+free parts, so consume the whole
+ // region as used memory, not leaving a free memory region behind.
+ // Initialize the free region as used by resetting the ceiling size to the same value as the size at bottom.
+ ((size_t*)((uint8_t*)freeRegion + freeRegion->size))[-1] = freeRegion->size;
+ }
+
+#ifdef __EMSCRIPTEN_TRACING__
+ emscripten_trace_record_allocation(freeRegion, freeRegion->size);
+#endif
+
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('attempt_allocate - succeeded allocating memory, region ptr=0x' + ($0>>>0).toString(16) + ', align=' + $1 + ', payload size=' + ($2>>>0) + ' bytes)'), freeRegion, alignment, size);
+#endif
+
+ return (uint8_t*)freeRegion + sizeof(size_t);
+}
+
+static size_t validate_alloc_alignment(size_t alignment)
+{
+ // Cannot perform allocations that are less than 4 byte aligned, because the Region
+ // control structures need to be aligned. Also round up to minimum outputted alignment.
+ alignment = MAX(alignment, MALLOC_ALIGNMENT);
+ // Arbitrary upper limit on alignment - very likely a programming bug if alignment is higher than this.
+ assert(alignment <= 1024*1024);
+ return alignment;
+}
+
+static size_t validate_alloc_size(size_t size)
+{
+ assert(size + REGION_HEADER_SIZE > size);
+
+ // Allocation sizes must be a multiple of pointer sizes, and at least 2*sizeof(pointer).
+ size_t validatedSize = size > SMALLEST_ALLOCATION_SIZE ? (size_t)ALIGN_UP(size, sizeof(Region*)) : SMALLEST_ALLOCATION_SIZE;
+ assert(validatedSize >= size); // 32-bit wraparound should not occur, too large sizes should be stopped before
+
+ return validatedSize;
+}
+
+static void *allocate_memory(size_t alignment, size_t size)
+{
+ ASSERT_MALLOC_IS_ACQUIRED();
+
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('allocate_memory(align=' + $0 + ', size=' + ($1>>>0) + ' bytes)'), alignment, size);
+#endif
+
+#ifdef EMMALLOC_MEMVALIDATE
+ validate_memory_regions();
+#endif
+
+ if (!IS_POWER_OF_2(alignment))
+ {
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('Allocation failed: alignment not power of 2!'));
+#endif
+ return 0;
+ }
+
+ if (size > MAX_ALLOC_SIZE)
+ {
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0) + 'bytes! (negative integer wraparound?)'), size);
+#endif
+ return 0;
+ }
+
+ alignment = validate_alloc_alignment(alignment);
+ size = validate_alloc_size(size);
+
+ // Attempt to allocate memory starting from smallest bucket that can contain the required amount of memory.
+ // Under normal alignment conditions this should always be the first or second bucket we look at, but if
+ // performing an allocation with complex alignment, we may need to look at multiple buckets.
+ int bucketIndex = compute_free_list_bucket(size);
+ BUCKET_BITMASK_T bucketMask = freeRegionBucketsUsed >> bucketIndex;
+
+ // Loop through each bucket that has free regions in it, based on bits set in freeRegionBucketsUsed bitmap.
+ while(bucketMask)
+ {
+ BUCKET_BITMASK_T indexAdd = __builtin_ctzll(bucketMask);
+ bucketIndex += indexAdd;
+ bucketMask >>= indexAdd;
+ assert(bucketIndex >= 0);
+ assert(bucketIndex <= NUM_FREE_BUCKETS-1);
+ assert(freeRegionBucketsUsed & (((BUCKET_BITMASK_T)1) << bucketIndex));
+
+ Region *freeRegion = freeRegionBuckets[bucketIndex].next;
+ assert(freeRegion);
+ if (freeRegion != &freeRegionBuckets[bucketIndex])
+ {
+ void *ptr = attempt_allocate(freeRegion, alignment, size);
+ if (ptr)
+ return ptr;
+
+ // We were not able to allocate from the first region found in this bucket, so penalize
+ // the region by cycling it to the end of the doubly circular linked list. (constant time)
+ // This provides a randomized guarantee that when performing allocations of size k to a
+ // bucket of [k-something, k+something] range, we will not always attempt to satisfy the
+ // allocation from the same available region at the front of the list, but we try each
+ // region in turn.
+ unlink_from_free_list(freeRegion);
+ prepend_to_free_list(freeRegion, &freeRegionBuckets[bucketIndex]);
+ // But do not stick around to attempt to look at other regions in this bucket - move
+ // to search the next populated bucket index if this did not fit. This gives a practical
+ // "allocation in constant time" guarantee, since the next higher bucket will only have
+ // regions that are all of strictly larger size than the requested allocation. Only if
+ // there is a difficult alignment requirement we may fail to perform the allocation from
+ // a region in the next bucket, and if so, we keep trying higher buckets until one of them
+ // works.
+ ++bucketIndex;
+ bucketMask >>= 1;
+ }
+ else
+ {
+ // This bucket was not populated after all with any regions,
+ // but we just had a stale bit set to mark a populated bucket.
+ // Reset the bit to update latest status so that we do not
+ // redundantly look at this bucket again.
+ freeRegionBucketsUsed &= ~(((BUCKET_BITMASK_T)1) << bucketIndex);
+ bucketMask ^= 1;
+ }
+ // Instead of recomputing bucketMask from scratch at the end of each loop, it is updated as we go,
+ // to avoid undefined behavior with (x >> 32)/(x >> 64) when bucketIndex reaches 32/64, (the shift would comes out as a no-op instead of 0).
+
+ assert((bucketIndex == NUM_FREE_BUCKETS && bucketMask == 0) || (bucketMask == freeRegionBucketsUsed >> bucketIndex));
+ }
+
+ // None of the buckets were able to accommodate an allocation. If this happens we are almost out of memory.
+ // The largest bucket might contain some suitable regions, but we only looked at one region in that bucket, so
+ // as a last resort, loop through more free regions in the bucket that represents the largest allocations available.
+ // But only if the bucket representing largest allocations available is not any of the first thirty buckets,
+ // these represent allocatable areas less than <1024 bytes - which could be a lot of scrap.
+ // In such case, prefer to sbrk() in more memory right away.
+ int largestBucketIndex = NUM_FREE_BUCKETS - 1 - __builtin_clzll(freeRegionBucketsUsed);
+ // freeRegion will be null if there is absolutely no memory left. (all buckets are 100% used)
+ Region *freeRegion = freeRegionBucketsUsed ? freeRegionBuckets[largestBucketIndex].next : 0;
+ if (freeRegionBucketsUsed >> 30)
+ {
+ // Look only at a constant number of regions in this bucket max, to avoid bad worst case behavior.
+ // If this many regions cannot find free space, we give up and prefer to sbrk() more instead.
+ const int maxRegionsToTryBeforeGivingUp = 99;
+ int numTriesLeft = maxRegionsToTryBeforeGivingUp;
+ while(freeRegion != &freeRegionBuckets[largestBucketIndex] && numTriesLeft-- > 0)
+ {
+ void *ptr = attempt_allocate(freeRegion, alignment, size);
+ if (ptr)
+ return ptr;
+ freeRegion = freeRegion->next;
+ }
+ }
+
+ // We were unable to find a free memory region. Must sbrk() in more memory!
+ size_t numBytesToClaim = size+sizeof(Region)*3;
+ assert(numBytesToClaim > size); // 32-bit wraparound should not happen here, allocation size has been validated above!
+ bool success = claim_more_memory(numBytesToClaim);
+ if (success)
+ return allocate_memory(alignment, size); // Recurse back to itself to try again
+
+ // also sbrk() failed, we are really really constrained :( As a last resort, go back to looking at the
+ // bucket we already looked at above, continuing where the above search left off - perhaps there are
+ // regions we overlooked the first time that might be able to satisfy the allocation.
+ if (freeRegion)
+ {
+ while(freeRegion != &freeRegionBuckets[largestBucketIndex])
+ {
+ void *ptr = attempt_allocate(freeRegion, alignment, size);
+ if (ptr)
+ return ptr;
+ freeRegion = freeRegion->next;
+ }
+ }
+
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('Could not find a free memory block!'));
+#endif
+
+ return 0;
+}
+
+static
+void *emmalloc_memalign(size_t alignment, size_t size)
+{
+ MALLOC_ACQUIRE();
+ void *ptr = allocate_memory(alignment, size);
+ MALLOC_RELEASE();
+ return ptr;
+}
+
+#if 0
+void * EMMALLOC_EXPORT memalign(size_t alignment, size_t size)
+{
+ return emmalloc_memalign(alignment, size);
+}
+#endif
+
+void * EMMALLOC_EXPORT aligned_alloc(size_t alignment, size_t size)
+{
+ if ((alignment % sizeof(void *) != 0) || (size % alignment) != 0)
+ return 0;
+ return emmalloc_memalign(alignment, size);
+}
+
+static
+void *emmalloc_malloc(size_t size)
+{
+ return emmalloc_memalign(MALLOC_ALIGNMENT, size);
+}
+
+void * EMMALLOC_EXPORT malloc(size_t size)
+{
+ return emmalloc_malloc(size);
+}
+
+static
+size_t emmalloc_usable_size(void *ptr)
+{
+ if (!ptr)
+ return 0;
+
+ uint8_t *regionStartPtr = (uint8_t*)ptr - sizeof(size_t);
+ Region *region = (Region*)(regionStartPtr);
+ assert(HAS_ALIGNMENT(region, sizeof(size_t)));
+
+ MALLOC_ACQUIRE();
+
+ size_t size = region->size;
+ assert(size >= sizeof(Region));
+ assert(region_is_in_use(region));
+
+ MALLOC_RELEASE();
+
+ return size - REGION_HEADER_SIZE;
+}
+
+size_t EMMALLOC_EXPORT malloc_usable_size(void *ptr)
+{
+ return emmalloc_usable_size(ptr);
+}
+
+static
+void emmalloc_free(void *ptr)
+{
+#ifdef EMMALLOC_MEMVALIDATE
+ emmalloc_validate_memory_regions();
+#endif
+
+ if (!ptr)
+ return;
+
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('free(ptr=0x'+($0>>>0).toString(16)+')'), ptr);
+#endif
+
+ uint8_t *regionStartPtr = (uint8_t*)ptr - sizeof(size_t);
+ Region *region = (Region*)(regionStartPtr);
+ assert(HAS_ALIGNMENT(region, sizeof(size_t)));
+
+ MALLOC_ACQUIRE();
+
+ size_t size = region->size;
+#ifdef EMMALLOC_VERBOSE
+ if (size < sizeof(Region) || !region_is_in_use(region))
+ {
+ if (debug_region_is_consistent(region))
+ // LLVM wasm backend bug: cannot use MAIN_THREAD_ASYNC_EM_ASM() here, that generates internal compiler error
+ // Reproducible by running e.g. other.test_alloc_3GB
+ EM_ASM(console.error('Double free at region ptr 0x' + ($0>>>0).toString(16) + ', region->size: 0x' + ($1>>>0).toString(16) + ', region->sizeAtCeiling: 0x' + ($2>>>0).toString(16) + ')'), region, size, region_ceiling_size(region));
+ else
+ MAIN_THREAD_ASYNC_EM_ASM(console.error('Corrupt region at region ptr 0x' + ($0>>>0).toString(16) + ' region->size: 0x' + ($1>>>0).toString(16) + ', region->sizeAtCeiling: 0x' + ($2>>>0).toString(16) + ')'), region, size, region_ceiling_size(region));
+ }
+#endif
+ assert(size >= sizeof(Region));
+ assert(region_is_in_use(region));
+
+#ifdef __EMSCRIPTEN_TRACING__
+ emscripten_trace_record_free(region);
+#endif
+
+ // Check merging with left side
+ size_t prevRegionSizeField = ((size_t*)region)[-1];
+ size_t prevRegionSize = prevRegionSizeField & ~FREE_REGION_FLAG;
+ if (prevRegionSizeField != prevRegionSize) // Previous region is free?
+ {
+ Region *prevRegion = (Region*)((uint8_t*)region - prevRegionSize);
+ assert(debug_region_is_consistent(prevRegion));
+ unlink_from_free_list(prevRegion);
+ regionStartPtr = (uint8_t*)prevRegion;
+ size += prevRegionSize;
+ }
+
+ // Check merging with right side
+ Region *nextRegion = next_region(region);
+ assert(debug_region_is_consistent(nextRegion));
+ size_t sizeAtEnd = *(size_t*)region_payload_end_ptr(nextRegion);
+ if (nextRegion->size != sizeAtEnd)
+ {
+ unlink_from_free_list(nextRegion);
+ size += nextRegion->size;
+ }
+
+ create_free_region(regionStartPtr, size);
+ link_to_free_list((Region*)regionStartPtr);
+
+ MALLOC_RELEASE();
+
+#ifdef EMMALLOC_MEMVALIDATE
+ emmalloc_validate_memory_regions();
+#endif
+}
+
+void EMMALLOC_EXPORT free(void *ptr)
+{
+ emmalloc_free(ptr);
+}
+
+// Can be called to attempt to increase or decrease the size of the given region
+// to a new size (in-place). Returns 1 if resize succeeds, and 0 on failure.
+static int attempt_region_resize(Region *region, size_t size)
+{
+ ASSERT_MALLOC_IS_ACQUIRED();
+ assert(size > 0);
+ assert(HAS_ALIGNMENT(size, sizeof(size_t)));
+
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('attempt_region_resize(region=0x' + ($0>>>0).toString(16) + ', size=' + ($1>>>0) + ' bytes)'), region, size);
+#endif
+
+ // First attempt to resize this region, if the next region that follows this one
+ // is a free region.
+ Region *nextRegion = next_region(region);
+ uint8_t *nextRegionEndPtr = (uint8_t*)nextRegion + nextRegion->size;
+ size_t sizeAtCeiling = ((size_t*)nextRegionEndPtr)[-1];
+ if (nextRegion->size != sizeAtCeiling) // Next region is free?
+ {
+ assert(region_is_free(nextRegion));
+ uint8_t *newNextRegionStartPtr = (uint8_t*)region + size;
+ assert(HAS_ALIGNMENT(newNextRegionStartPtr, sizeof(size_t)));
+ // Next region does not shrink to too small size?
+ if (newNextRegionStartPtr + sizeof(Region) <= nextRegionEndPtr)
+ {
+ unlink_from_free_list(nextRegion);
+ create_free_region(newNextRegionStartPtr, nextRegionEndPtr - newNextRegionStartPtr);
+ link_to_free_list((Region*)newNextRegionStartPtr);
+ create_used_region(region, newNextRegionStartPtr - (uint8_t*)region);
+ return 1;
+ }
+ // If we remove the next region altogether, allocation is satisfied?
+ if (newNextRegionStartPtr <= nextRegionEndPtr)
+ {
+ unlink_from_free_list(nextRegion);
+ create_used_region(region, region->size + nextRegion->size);
+ return 1;
+ }
+ }
+ else
+ {
+ // Next region is an used region - we cannot change its starting address. However if we are shrinking the
+ // size of this region, we can create a new free region between this and the next used region.
+ if (size + sizeof(Region) <= region->size)
+ {
+ size_t freeRegionSize = region->size - size;
+ create_used_region(region, size);
+ Region *freeRegion = (Region *)((uint8_t*)region + size);
+ create_free_region(freeRegion, freeRegionSize);
+ link_to_free_list(freeRegion);
+ return 1;
+ }
+ else if (size <= region->size)
+ {
+ // Caller was asking to shrink the size, but due to not being able to fit a full Region in the shrunk
+ // area, we cannot actually do anything. This occurs if the shrink amount is really small. In such case,
+ // just call it success without doing any work.
+ return 1;
+ }
+ }
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('attempt_region_resize failed.'));
+#endif
+ return 0;
+}
+
+static int acquire_and_attempt_region_resize(Region *region, size_t size)
+{
+ MALLOC_ACQUIRE();
+ int success = attempt_region_resize(region, size);
+ MALLOC_RELEASE();
+ return success;
+}
+
+static
+void *emmalloc_aligned_realloc(void *ptr, size_t alignment, size_t size)
+{
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('aligned_realloc(ptr=0x' + ($0>>>0).toString(16) + ', alignment=' + $1 + ', size=' + ($2>>>0)), ptr, alignment, size);
+#endif
+
+ if (!ptr)
+ return emmalloc_memalign(alignment, size);
+
+ if (size == 0)
+ {
+ free(ptr);
+ return 0;
+ }
+
+ if (size > MAX_ALLOC_SIZE)
+ {
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0) + 'bytes! (negative integer wraparound?)'), size);
+#endif
+ return 0;
+ }
+
+ assert(IS_POWER_OF_2(alignment));
+ // aligned_realloc() cannot be used to ask to change the alignment of a pointer.
+ assert(HAS_ALIGNMENT(ptr, alignment));
+ size = validate_alloc_size(size);
+
+ // Calculate the region start address of the original allocation
+ Region *region = (Region*)((uint8_t*)ptr - sizeof(size_t));
+
+ // First attempt to resize the given region to avoid having to copy memory around
+ if (acquire_and_attempt_region_resize(region, size + REGION_HEADER_SIZE))
+ {
+#ifdef __EMSCRIPTEN_TRACING__
+ emscripten_trace_record_reallocation(ptr, ptr, size);
+#endif
+ return ptr;
+ }
+
+ // If resize failed, we must allocate a new region, copy the data over, and then
+ // free the old region.
+ void *newptr = emmalloc_memalign(alignment, size);
+ if (newptr)
+ {
+ memcpy(newptr, ptr, MIN(size, region->size - REGION_HEADER_SIZE));
+ free(ptr);
+ }
+ // N.B. If there is not enough memory, the old memory block should not be freed and
+ // null pointer is returned.
+ return newptr;
+}
+
+#if 0
+void * EMMALLOC_EXPORT aligned_realloc(void *ptr, size_t alignment, size_t size)
+{
+ return emmalloc_aligned_realloc(ptr, alignment, size);
+}
+#endif
+
+#if 0
+// realloc_try() is like realloc(), but only attempts to try to resize the existing memory
+// area. If resizing the existing memory area fails, then realloc_try() will return 0
+// (the original memory block is not freed or modified). If resizing succeeds, previous
+// memory contents will be valid up to min(old length, new length) bytes.
+void *emmalloc_realloc_try(void *ptr, size_t size)
+{
+ if (!ptr)
+ return 0;
+
+ if (size == 0)
+ {
+ free(ptr);
+ return 0;
+ }
+
+ if (size > MAX_ALLOC_SIZE)
+ {
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0) + 'bytes! (negative integer wraparound?)'), size);
+#endif
+ return 0;
+ }
+
+ size = validate_alloc_size(size);
+
+ // Calculate the region start address of the original allocation
+ Region *region = (Region*)((uint8_t*)ptr - sizeof(size_t));
+
+ // Attempt to resize the given region to avoid having to copy memory around
+ int success = acquire_and_attempt_region_resize(region, size + REGION_HEADER_SIZE);
+#ifdef __EMSCRIPTEN_TRACING__
+ if (success)
+ emscripten_trace_record_reallocation(ptr, ptr, size);
+#endif
+ return success ? ptr : 0;
+}
+
+// emmalloc_aligned_realloc_uninitialized() is like aligned_realloc(), but old memory contents
+// will be undefined after reallocation. (old memory is not preserved in any case)
+void *emmalloc_aligned_realloc_uninitialized(void *ptr, size_t alignment, size_t size)
+{
+ if (!ptr)
+ return emmalloc_memalign(alignment, size);
+
+ if (size == 0)
+ {
+ free(ptr);
+ return 0;
+ }
+
+ if (size > MAX_ALLOC_SIZE)
+ {
+#ifdef EMMALLOC_VERBOSE
+ MAIN_THREAD_ASYNC_EM_ASM(console.log('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0) + 'bytes! (negative integer wraparound?)'), size);
+#endif
+ return 0;
+ }
+
+ size = validate_alloc_size(size);
+
+ // Calculate the region start address of the original allocation
+ Region *region = (Region*)((uint8_t*)ptr - sizeof(size_t));
+
+ // First attempt to resize the given region to avoid having to copy memory around
+ if (acquire_and_attempt_region_resize(region, size + REGION_HEADER_SIZE))
+ {
+#ifdef __EMSCRIPTEN_TRACING__
+ emscripten_trace_record_reallocation(ptr, ptr, size);
+#endif
+ return ptr;
+ }
+
+ // If resize failed, drop the old region and allocate a new region. Memory is not
+ // copied over
+ free(ptr);
+ return emmalloc_memalign(alignment, size);
+}
+#endif
+
+static
+void *emmalloc_realloc(void *ptr, size_t size)
+{
+ return emmalloc_aligned_realloc(ptr, MALLOC_ALIGNMENT, size);
+}
+
+void * EMMALLOC_EXPORT realloc(void *ptr, size_t size)
+{
+ return emmalloc_realloc(ptr, size);
+}
+
+#if 0
+// realloc_uninitialized() is like realloc(), but old memory contents
+// will be undefined after reallocation. (old memory is not preserved in any case)
+void *emmalloc_realloc_uninitialized(void *ptr, size_t size)
+{
+ return emmalloc_aligned_realloc_uninitialized(ptr, MALLOC_ALIGNMENT, size);
+}
+#endif
+
+static
+int emmalloc_posix_memalign(void **memptr, size_t alignment, size_t size)
+{
+ assert(memptr);
+ if (alignment % sizeof(void *) != 0)
+ return 22/* EINVAL*/;
+ *memptr = emmalloc_memalign(alignment, size);
+ return *memptr ? 0 : 12/*ENOMEM*/;
+}
+
+int EMMALLOC_EXPORT posix_memalign(void **memptr, size_t alignment, size_t size)
+{
+ return emmalloc_posix_memalign(memptr, alignment, size);
+}
+
+static
+void *emmalloc_calloc(size_t num, size_t size)
+{
+ size_t bytes = num*size;
+ void *ptr = emmalloc_memalign(MALLOC_ALIGNMENT, bytes);
+ if (ptr)
+ memset(ptr, 0, bytes);
+ return ptr;
+}
+
+void * EMMALLOC_EXPORT calloc(size_t num, size_t size)
+{
+ return emmalloc_calloc(num, size);
+}
+
+#if 0
+static int count_linked_list_size(Region *list)
+{
+ int size = 1;
+ for(Region *i = list->next; i != list; list = list->next)
+ ++size;
+ return size;
+}
+
+static size_t count_linked_list_space(Region *list)
+{
+ size_t space = 0;
+ for(Region *i = list->next; i != list; list = list->next)
+ space += region_payload_end_ptr(i) - region_payload_start_ptr(i);
+ return space;
+}
+
+struct mallinfo emmalloc_mallinfo()
+{
+ MALLOC_ACQUIRE();
+
+ struct mallinfo info;
+ // Non-mmapped space allocated (bytes): For emmalloc,
+ // let's define this as the difference between heap size and dynamic top end.
+ info.arena = emscripten_get_heap_size() - (size_t)sbrk(0);
+ // Number of "ordinary" blocks. Let's define this as the number of highest
+ // size blocks. (subtract one from each, since there is a sentinel node in each list)
+ info.ordblks = count_linked_list_size(&freeRegionBuckets[NUM_FREE_BUCKETS-1])-1;
+ // Number of free "fastbin" blocks. For emmalloc, define this as the number
+ // of blocks that are not in the largest pristine block.
+ info.smblks = 0;
+ // The total number of bytes in free "fastbin" blocks.
+ info.fsmblks = 0;
+ for(int i = 0; i < NUM_FREE_BUCKETS-1; ++i)
+ {
+ info.smblks += count_linked_list_size(&freeRegionBuckets[i])-1;
+ info.fsmblks += count_linked_list_space(&freeRegionBuckets[i]);
+ }
+
+ info.hblks = 0; // Number of mmapped regions: always 0. (no mmap support)
+ info.hblkhd = 0; // Amount of bytes in mmapped regions: always 0. (no mmap support)
+
+ // Walk through all the heap blocks to report the following data:
+ // The "highwater mark" for allocated space—that is, the maximum amount of
+ // space that was ever allocated. Emmalloc does not want to pay code to
+ // track this, so this is only reported from current allocation data, and
+ // may not be accurate.
+ info.usmblks = 0;
+ info.uordblks = 0; // The total number of bytes used by in-use allocations.
+ info.fordblks = 0; // The total number of bytes in free blocks.
+ // The total amount of releasable free space at the top of the heap.
+ // This is the maximum number of bytes that could ideally be released by malloc_trim(3).
+ Region *lastActualRegion = prev_region((Region*)(listOfAllRegions->endPtr - sizeof(Region)));
+ info.keepcost = region_is_free(lastActualRegion) ? lastActualRegion->size : 0;
+
+ RootRegion *root = listOfAllRegions;
+ while(root)
+ {
+ Region *r = (Region*)root;
+ assert(debug_region_is_consistent(r));
+ uint8_t *lastRegionEnd = root->endPtr;
+ while((uint8_t*)r < lastRegionEnd)
+ {
+ assert(debug_region_is_consistent(r));
+
+ if (region_is_free(r))
+ {
+ // Count only the payload of the free block towards free memory.
+ info.fordblks += region_payload_end_ptr(r) - region_payload_start_ptr(r);
+ // But the header data of the free block goes towards used memory.
+ info.uordblks += REGION_HEADER_SIZE;
+ }
+ else
+ {
+ info.uordblks += r->size;
+ }
+ // Update approximate watermark data
+ info.usmblks = MAX(info.usmblks, (intptr_t)r + r->size);
+
+ if (r->size == 0)
+ break;
+ r = next_region(r);
+ }
+ root = root->next;
+ }
+
+ MALLOC_RELEASE();
+ return info;
+}
+
+struct mallinfo EMMALLOC_EXPORT mallinfo()
+{
+ return emmalloc_mallinfo();
+}
+
+// Note! This function is not fully multithreadin safe: while this function is running, other threads should not be
+// allowed to call sbrk()!
+static int trim_dynamic_heap_reservation(size_t pad)
+{
+ ASSERT_MALLOC_IS_ACQUIRED();
+
+ if (!listOfAllRegions)
+ return 0; // emmalloc is not controlling any dynamic memory at all - cannot release memory.
+ uint8_t *previousSbrkEndAddress = listOfAllRegions->endPtr;
+ assert(sbrk(0) == previousSbrkEndAddress);
+ size_t lastMemoryRegionSize = ((size_t*)previousSbrkEndAddress)[-1];
+ assert(lastMemoryRegionSize == 16); // // The last memory region should be a sentinel node of exactly 16 bytes in size.
+ Region *endSentinelRegion = (Region*)(previousSbrkEndAddress - sizeof(Region));
+ Region *lastActualRegion = prev_region(endSentinelRegion);
+
+ // Round padding up to multiple of 4 bytes to keep sbrk() and memory region alignment intact.
+ // Also have at least 8 bytes of payload so that we can form a full free region.
+ size_t newRegionSize = (size_t)ALIGN_UP(pad, 4);
+ if (pad > 0)
+ newRegionSize += sizeof(Region) - (newRegionSize - pad);
+
+ if (!region_is_free(lastActualRegion) || lastActualRegion->size <= newRegionSize)
+ return 0; // Last actual region is in use, or caller desired to leave more free memory intact than there is.
+
+ // This many bytes will be shrunk away.
+ size_t shrinkAmount = lastActualRegion->size - newRegionSize;
+ assert(HAS_ALIGNMENT(shrinkAmount, 4));
+
+ unlink_from_free_list(lastActualRegion);
+ // If pad == 0, we should delete the last free region altogether. If pad > 0,
+ // shrink the last free region to the desired size.
+ if (newRegionSize > 0)
+ {
+ create_free_region(lastActualRegion, newRegionSize);
+ link_to_free_list(lastActualRegion);
+ }
+
+ // Recreate the sentinel region at the end of the last free region
+ endSentinelRegion = (Region*)((uint8_t*)lastActualRegion + newRegionSize);
+ create_used_region(endSentinelRegion, sizeof(Region));
+
+ // And update the size field of the whole region block.
+ listOfAllRegions->endPtr = (uint8_t*)endSentinelRegion + sizeof(Region);
+
+ // Finally call sbrk() to shrink the memory area.
+ void *oldSbrk = sbrk(-(intptr_t)shrinkAmount);
+ assert((intptr_t)oldSbrk != -1); // Shrinking with sbrk() should never fail.
+ assert(oldSbrk == previousSbrkEndAddress); // Another thread should not have raced to increase sbrk() on us!
+
+ // All successful, and we actually trimmed memory!
+ return 1;
+}
+
+int emmalloc_trim(size_t pad)
+{
+ MALLOC_ACQUIRE();
+ int success = trim_dynamic_heap_reservation(pad);
+ MALLOC_RELEASE();
+ return success;
+}
+
+int EMMALLOC_EXPORT malloc_trim(size_t pad)
+{
+ return emmalloc_trim(pad);
+}
+
+size_t emmalloc_dynamic_heap_size()
+{
+ size_t dynamicHeapSize = 0;
+
+ MALLOC_ACQUIRE();
+ RootRegion *root = listOfAllRegions;
+ while(root)
+ {
+ dynamicHeapSize += root->endPtr - (uint8_t*)root;
+ root = root->next;
+ }
+ MALLOC_RELEASE();
+ return dynamicHeapSize;
+}
+
+size_t emmalloc_free_dynamic_memory()
+{
+ size_t freeDynamicMemory = 0;
+
+ int bucketIndex = 0;
+
+ MALLOC_ACQUIRE();
+ BUCKET_BITMASK_T bucketMask = freeRegionBucketsUsed;
+
+ // Loop through each bucket that has free regions in it, based on bits set in freeRegionBucketsUsed bitmap.
+ while(bucketMask)
+ {
+ BUCKET_BITMASK_T indexAdd = __builtin_ctzll(bucketMask);
+ bucketIndex += indexAdd;
+ bucketMask >>= indexAdd;
+ for(Region *freeRegion = freeRegionBuckets[bucketIndex].next;
+ freeRegion != &freeRegionBuckets[bucketIndex];
+ freeRegion = freeRegion->next)
+ {
+ freeDynamicMemory += freeRegion->size - REGION_HEADER_SIZE;
+ }
+ ++bucketIndex;
+ bucketMask >>= 1;
+ }
+ MALLOC_RELEASE();
+ return freeDynamicMemory;
+}
+
+size_t emmalloc_compute_free_dynamic_memory_fragmentation_map(size_t freeMemorySizeMap[32])
+{
+ memset((void*)freeMemorySizeMap, 0, sizeof(freeMemorySizeMap[0])*32);
+
+ size_t numFreeMemoryRegions = 0;
+ int bucketIndex = 0;
+ MALLOC_ACQUIRE();
+ BUCKET_BITMASK_T bucketMask = freeRegionBucketsUsed;
+
+ // Loop through each bucket that has free regions in it, based on bits set in freeRegionBucketsUsed bitmap.
+ while(bucketMask)
+ {
+ BUCKET_BITMASK_T indexAdd = __builtin_ctzll(bucketMask);
+ bucketIndex += indexAdd;
+ bucketMask >>= indexAdd;
+ for(Region *freeRegion = freeRegionBuckets[bucketIndex].next;
+ freeRegion != &freeRegionBuckets[bucketIndex];
+ freeRegion = freeRegion->next)
+ {
+ ++numFreeMemoryRegions;
+ size_t freeDynamicMemory = freeRegion->size - REGION_HEADER_SIZE;
+ if (freeDynamicMemory > 0)
+ ++freeMemorySizeMap[31-__builtin_clz(freeDynamicMemory)];
+ else
+ ++freeMemorySizeMap[0];
+ }
+ ++bucketIndex;
+ bucketMask >>= 1;
+ }
+ MALLOC_RELEASE();
+ return numFreeMemoryRegions;
+}
+
+size_t emmalloc_unclaimed_heap_memory(void) {
+ return emscripten_get_heap_max() - (size_t)sbrk(0);
+}
+#endif
+
+// Define these to satisfy musl references.
+void *__libc_malloc(size_t) __attribute__((alias("malloc")));
+void __libc_free(void *) __attribute__((alias("free")));
+void *__libc_calloc(size_t nmemb, size_t size) __attribute__((alias("calloc")));
diff --git a/expected/wasm32-wasi/posix/defined-symbols.txt b/expected/wasm32-wasi/posix/defined-symbols.txt
new file mode 100644
index 0000000..6e565dc
--- /dev/null
+++ b/expected/wasm32-wasi/posix/defined-symbols.txt
@@ -0,0 +1,1330 @@
+_CLOCK_MONOTONIC
+_CLOCK_REALTIME
+_Exit
+_IO_feof_unlocked
+_IO_ferror_unlocked
+_IO_getc
+_IO_getc_unlocked
+_IO_putc
+_IO_putc_unlocked
+__EINVAL
+__ENOMEM
+__SIG_ERR
+__SIG_IGN
+__acquire_ptc
+__aio_close
+__asctime_r
+__assert_fail
+__at_quick_exit_lockptr
+__atexit_lockptr
+__c_dot_utf8
+__c_dot_utf8_locale
+__c_locale
+__clock
+__clock_gettime
+__clock_nanosleep
+__copy_tls
+__cos
+__cosdf
+__cosl
+__crypt_blowfish
+__crypt_des
+__crypt_md5
+__crypt_r
+__crypt_sha256
+__crypt_sha512
+__ctype_b_loc
+__ctype_get_mb_cur_max
+__ctype_tolower_loc
+__ctype_toupper_loc
+__cxa_atexit
+__cxa_finalize
+__default_guardsize
+__default_stacksize
+__des_setkey
+__do_cleanup_pop
+__do_cleanup_push
+__do_des
+__do_orphaned_stdio_locks
+__duplocale
+__env_rm_add
+__errno_location
+__exp2f_data
+__exp_data
+__expo2
+__expo2f
+__fbufsize
+__fclose_ca
+__fdopen
+__fesetround
+__fgetwc_unlocked
+__flbf
+__floatscan
+__fmodeflags
+__fopen_rb_ca
+__fpending
+__fpurge
+__fputwc_unlocked
+__freadable
+__freadahead
+__freading
+__freadptr
+__freadptrinc
+__freelocale
+__fseeko
+__fseeko_unlocked
+__fseterr
+__fsetlocking
+__fsmu8
+__ftello
+__ftello_unlocked
+__funcs_on_exit
+__funcs_on_quick_exit
+__futimesat
+__fwritable
+__fwritex
+__fwriting
+__get_locale
+__getdelim
+__getentropy
+__getopt_msg
+__gmtime_r
+__hwcap
+__inet_aton
+__init_ssp
+__init_tp
+__intscan
+__invtrigl_R
+__isalnum_l
+__isalpha_l
+__isatty
+__isblank_l
+__iscntrl_l
+__isdigit_l
+__isgraph_l
+__islower_l
+__isoc99_fscanf
+__isoc99_fwscanf
+__isoc99_scanf
+__isoc99_sscanf
+__isoc99_swscanf
+__isoc99_vfscanf
+__isoc99_vfwscanf
+__isoc99_vscanf
+__isoc99_vsscanf
+__isoc99_vswscanf
+__isoc99_vwscanf
+__isoc99_wscanf
+__isprint_l
+__ispunct_l
+__isspace_l
+__isupper_l
+__iswalnum_l
+__iswalpha_l
+__iswblank_l
+__iswcntrl_l
+__iswctype_l
+__iswdigit_l
+__iswgraph_l
+__iswlower_l
+__iswprint_l
+__iswpunct_l
+__iswspace_l
+__iswupper_l
+__iswxdigit_l
+__isxdigit_l
+__lctrans
+__lctrans_cur
+__lctrans_impl
+__ldexp_cexp
+__ldexp_cexpf
+__lgamma_r
+__lgammaf_r
+__lgammal_r
+__libc
+__libc_calloc
+__libc_free
+__libc_malloc
+__loc_is_allocated
+__locale_lock
+__locale_lockptr
+__localtime_r
+__lock
+__lockfile
+__log2_data
+__log2f_data
+__log_data
+__logf_data
+__lseek
+__main_void
+__math_divzero
+__math_divzerof
+__math_invalid
+__math_invalidf
+__math_invalidl
+__math_oflow
+__math_oflowf
+__math_uflow
+__math_uflowf
+__math_xflow
+__math_xflowf
+__memrchr
+__mo_lookup
+__month_to_secs
+__newlocale
+__nl_langinfo
+__nl_langinfo_l
+__ofl_add
+__ofl_lock
+__ofl_unlock
+__optpos
+__optreset
+__overflow
+__p1evll
+__pio2_hi
+__pio2_lo
+__pleval
+__polevll
+__posix_getopt
+__pow_log_data
+__powf_log2_data
+__private_cond_signal
+__progname
+__progname_full
+__pthread_cond_timedwait
+__pthread_create
+__pthread_exit
+__pthread_join
+__pthread_key_create
+__pthread_key_delete
+__pthread_mutex_lock
+__pthread_mutex_timedlock
+__pthread_mutex_trylock
+__pthread_mutex_trylock_owner
+__pthread_mutex_unlock
+__pthread_once
+__pthread_once_full
+__pthread_rwlock_rdlock
+__pthread_rwlock_timedrdlock
+__pthread_rwlock_timedwrlock
+__pthread_rwlock_tryrdlock
+__pthread_rwlock_trywrlock
+__pthread_rwlock_unlock
+__pthread_rwlock_wrlock
+__pthread_setcancelstate
+__pthread_testcancel
+__pthread_tsd_main
+__pthread_tsd_run_dtors
+__pthread_tsd_size
+__putenv
+__qsort_r
+__rand48_step
+__random_lockptr
+__reallocarray
+__release_ptc
+__rem_pio2
+__rem_pio2_large
+__rem_pio2f
+__rem_pio2l
+__rsqrt_tab
+__secs_to_tm
+__secs_to_zone
+__seed48
+__shgetc
+__shlim
+__signgam
+__sin
+__sindf
+__sinl
+__small_printf
+__stack_chk_fail
+__stack_chk_fail_local
+__stack_chk_guard
+__stderr_FILE
+__stderr_used
+__stdin_FILE
+__stdin_used
+__stdio_close
+__stdio_exit
+__stdio_exit_needed
+__stdio_ofl_lockptr
+__stdio_read
+__stdio_seek
+__stdio_write
+__stdout_FILE
+__stdout_used
+__stdout_write
+__stpcpy
+__stpncpy
+__strcasecmp_l
+__strchrnul
+__strcoll_l
+__strerror_l
+__strftime_fmt_1
+__strftime_l
+__strncasecmp_l
+__strtod_l
+__strtof_l
+__strtoimax_internal
+__strtol_internal
+__strtold_l
+__strtoll_internal
+__strtoul_internal
+__strtoull_internal
+__strtoumax_internal
+__strxfrm_l
+__sysinfo
+__sysv_signal
+__tan
+__tandf
+__tanl
+__testcancel
+__thread_list_lock
+__timedwait
+__timedwait_cp
+__tl_lock
+__tl_sync
+__tl_unlock
+__tm_to_secs
+__tm_to_tzname
+__tolower_l
+__toread
+__toread_needs_stdio_exit
+__toupper_l
+__towctrans_l
+__towlower_l
+__towrite
+__towrite_needs_stdio_exit
+__towupper_l
+__tre_mem_alloc_impl
+__tre_mem_destroy
+__tre_mem_new_impl
+__tsearch_balance
+__uflow
+__unlist_locked_file
+__unlock
+__unlockfile
+__uselocale
+__utc
+__wait
+__wasi_args_get
+__wasi_args_sizes_get
+__wasi_clock_res_get
+__wasi_clock_time_get
+__wasi_environ_get
+__wasi_environ_sizes_get
+__wasi_fd_advise
+__wasi_fd_allocate
+__wasi_fd_close
+__wasi_fd_datasync
+__wasi_fd_fdstat_get
+__wasi_fd_fdstat_set_flags
+__wasi_fd_fdstat_set_rights
+__wasi_fd_filestat_get
+__wasi_fd_filestat_set_size
+__wasi_fd_filestat_set_times
+__wasi_fd_pread
+__wasi_fd_prestat_dir_name
+__wasi_fd_prestat_get
+__wasi_fd_pwrite
+__wasi_fd_read
+__wasi_fd_readdir
+__wasi_fd_renumber
+__wasi_fd_seek
+__wasi_fd_sync
+__wasi_fd_tell
+__wasi_fd_write
+__wasi_init_tp
+__wasi_path_create_directory
+__wasi_path_filestat_get
+__wasi_path_filestat_set_times
+__wasi_path_link
+__wasi_path_open
+__wasi_path_readlink
+__wasi_path_remove_directory
+__wasi_path_rename
+__wasi_path_symlink
+__wasi_path_unlink_file
+__wasi_poll_oneoff
+__wasi_proc_exit
+__wasi_random_get
+__wasi_sched_yield
+__wasi_sock_accept
+__wasi_sock_recv
+__wasi_sock_send
+__wasi_sock_shutdown
+__wasi_thread_spawn
+__wasilibc_access
+__wasilibc_cwd
+__wasilibc_cwd_lock
+__wasilibc_cwd_unlock
+__wasilibc_deinitialize_environ
+__wasilibc_dttoif
+__wasilibc_ensure_environ
+__wasilibc_environ
+__wasilibc_fd_renumber
+__wasilibc_find_abspath
+__wasilibc_find_relpath
+__wasilibc_find_relpath_alloc
+__wasilibc_futex_wait
+__wasilibc_get_environ
+__wasilibc_iftodt
+__wasilibc_initialize_environ
+__wasilibc_link
+__wasilibc_link_newat
+__wasilibc_link_oldat
+__wasilibc_maybe_reinitialize_environ_eagerly
+__wasilibc_nocwd___wasilibc_rmdirat
+__wasilibc_nocwd___wasilibc_unlinkat
+__wasilibc_nocwd_faccessat
+__wasilibc_nocwd_fstatat
+__wasilibc_nocwd_linkat
+__wasilibc_nocwd_mkdirat_nomode
+__wasilibc_nocwd_openat_nomode
+__wasilibc_nocwd_opendirat
+__wasilibc_nocwd_readlinkat
+__wasilibc_nocwd_renameat
+__wasilibc_nocwd_scandirat
+__wasilibc_nocwd_symlinkat
+__wasilibc_nocwd_utimensat
+__wasilibc_open_nomode
+__wasilibc_pthread_self
+__wasilibc_register_preopened_fd
+__wasilibc_rename_newat
+__wasilibc_rename_oldat
+__wasilibc_rmdirat
+__wasilibc_stat
+__wasilibc_tell
+__wasilibc_unlinkat
+__wasilibc_utimens
+__wasm_call_dtors
+__wcscoll_l
+__wcsftime_l
+__wcsxfrm_l
+__wctrans_l
+__wctype_l
+__xpg_basename
+__xpg_strerror_r
+__year_to_secs
+_environ
+_exit
+_flushlbf
+_initialize
+_pthread_cleanup_pop
+_pthread_cleanup_push
+_start
+a64l
+abort
+abs
+accept
+accept4
+access
+acos
+acosf
+acosh
+acoshf
+acoshl
+acosl
+aligned_alloc
+alphasort
+alphasort64
+arc4random
+arc4random_buf
+arc4random_uniform
+asctime
+asctime_r
+asin
+asinf
+asinh
+asinhf
+asinhl
+asinl
+asprintf
+at_quick_exit
+atan
+atan2
+atan2f
+atan2l
+atanf
+atanh
+atanhf
+atanhl
+atanl
+atexit
+atof
+atoi
+atol
+atoll
+basename
+bcmp
+bcopy
+bsd_signal
+bsearch
+btowc
+bzero
+c16rtomb
+c32rtomb
+cabs
+cabsf
+cabsl
+cacos
+cacosf
+cacosh
+cacoshf
+cacoshl
+cacosl
+calloc
+carg
+cargf
+cargl
+casin
+casinf
+casinh
+casinhf
+casinhl
+casinl
+catan
+catanf
+catanh
+catanhf
+catanhl
+catanl
+catclose
+catgets
+catopen
+cbrt
+cbrtf
+cbrtl
+ccos
+ccosf
+ccosh
+ccoshf
+ccoshl
+ccosl
+ceil
+ceilf
+ceill
+cexp
+cexpf
+cexpl
+chdir
+cimag
+cimagf
+cimagl
+clearenv
+clearerr
+clearerr_unlocked
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clog
+clogf
+clogl
+close
+closedir
+confstr
+conj
+conjf
+conjl
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+coshl
+cosl
+cpow
+cpowf
+cpowl
+cproj
+cprojf
+cprojl
+creal
+crealf
+creall
+creat
+creat64
+crypt
+crypt_r
+csin
+csinf
+csinh
+csinhf
+csinhl
+csinl
+csqrt
+csqrtf
+csqrtl
+ctan
+ctanf
+ctanh
+ctanhf
+ctanhl
+ctanl
+ctime
+ctime_r
+difftime
+dirfd
+dirname
+div
+dprintf
+drand48
+drem
+dremf
+duplocale
+ecvt
+encrypt
+environ
+erand48
+erf
+erfc
+erfcf
+erfcl
+erff
+erfl
+errno
+exit
+exp
+exp10
+exp10f
+exp10l
+exp2
+exp2f
+exp2l
+expf
+expl
+explicit_bzero
+expm1
+expm1f
+expm1l
+fabs
+fabsf
+fabsl
+faccessat
+fclose
+fcntl
+fcvt
+fdatasync
+fdclosedir
+fdim
+fdimf
+fdiml
+fdopen
+fdopendir
+feclearexcept
+fegetenv
+fegetexceptflag
+fegetround
+feholdexcept
+feof
+feof_unlocked
+feraiseexcept
+ferror
+ferror_unlocked
+fesetenv
+fesetexceptflag
+fesetround
+fetestexcept
+feupdateenv
+fflush
+fflush_unlocked
+ffs
+ffsl
+ffsll
+fgetc
+fgetc_unlocked
+fgetln
+fgetpos
+fgetpos64
+fgets
+fgets_unlocked
+fgetwc
+fgetwc_unlocked
+fgetws
+fgetws_unlocked
+fileno
+fileno_unlocked
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmal
+fmax
+fmaxf
+fmaxl
+fmemopen
+fmin
+fminf
+fminl
+fmod
+fmodf
+fmodl
+fmtmsg
+fnmatch
+fopen
+fopen64
+fopencookie
+fpathconf
+fprintf
+fpurge
+fputc
+fputc_unlocked
+fputs
+fputs_unlocked
+fputwc
+fputwc_unlocked
+fputws
+fputws_unlocked
+fread
+fread_unlocked
+free
+freelocale
+freopen
+freopen64
+frexp
+frexpf
+frexpl
+fscanf
+fseek
+fseeko
+fseeko64
+fsetpos
+fsetpos64
+fstat
+fstatat
+fsync
+ftell
+ftello
+ftello64
+ftime
+ftruncate
+futimens
+futimesat
+fwide
+fwprintf
+fwrite
+fwrite_unlocked
+fwscanf
+gcvt
+get_avphys_pages
+get_nprocs
+get_nprocs_conf
+get_phys_pages
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdate
+getdate_err
+getdelim
+getdomainname
+getentropy
+getenv
+gethostid
+getline
+getopt
+getopt_long
+getopt_long_only
+getpagesize
+getpid
+getrusage
+getsockopt
+getsubopt
+gettimeofday
+getw
+getwc
+getwc_unlocked
+getwchar
+getwchar_unlocked
+glob
+glob64
+globfree
+globfree64
+gmtime
+gmtime_r
+hcreate
+hcreate_r
+hdestroy
+hdestroy_r
+hsearch
+hsearch_r
+htonl
+htons
+hypot
+hypotf
+hypotl
+iconv
+iconv_close
+iconv_open
+ilogb
+ilogbf
+ilogbl
+imaxabs
+imaxdiv
+in6addr_any
+in6addr_loopback
+index
+inet_aton
+inet_ntop
+inet_pton
+initstate
+insque
+ioctl
+iprintf
+isalnum
+isalnum_l
+isalpha
+isalpha_l
+isascii
+isatty
+isblank
+isblank_l
+iscntrl
+iscntrl_l
+isdigit
+isdigit_l
+isgraph
+isgraph_l
+islower
+islower_l
+isprint
+isprint_l
+ispunct
+ispunct_l
+isspace
+isspace_l
+isupper
+isupper_l
+iswalnum
+iswalnum_l
+iswalpha
+iswalpha_l
+iswblank
+iswblank_l
+iswcntrl
+iswcntrl_l
+iswctype
+iswctype_l
+iswdigit
+iswdigit_l
+iswgraph
+iswgraph_l
+iswlower
+iswlower_l
+iswprint
+iswprint_l
+iswpunct
+iswpunct_l
+iswspace
+iswspace_l
+iswupper
+iswupper_l
+iswxdigit
+iswxdigit_l
+isxdigit
+isxdigit_l
+j0
+j0f
+j1
+j1f
+jn
+jnf
+jrand48
+l64a
+labs
+lcong48
+ldexp
+ldexpf
+ldexpl
+ldiv
+lfind
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+lgammal
+lgammal_r
+link
+linkat
+llabs
+lldiv
+llrint
+llrintf
+llrintl
+llround
+llroundf
+llroundl
+localeconv
+localtime
+localtime_r
+log
+log10
+log10f
+log10l
+log1p
+log1pf
+log1pl
+log2
+log2f
+log2l
+logb
+logbf
+logbl
+logf
+logl
+lrand48
+lrint
+lrintf
+lrintl
+lround
+lroundf
+lroundl
+lsearch
+lseek
+lstat
+malloc
+malloc_usable_size
+mblen
+mbrlen
+mbrtoc16
+mbrtoc32
+mbrtowc
+mbsinit
+mbsnrtowcs
+mbsrtowcs
+mbstowcs
+mbtowc
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+mempcpy
+memrchr
+memset
+mkdir
+mkdirat
+mktime
+mmap
+modf
+modff
+modfl
+mrand48
+munmap
+nan
+nanf
+nanl
+nanosleep
+nearbyint
+nearbyintf
+nearbyintl
+newlocale
+nextafter
+nextafterf
+nextafterl
+nexttoward
+nexttowardf
+nexttowardl
+nftw
+nftw64
+nl_langinfo
+nl_langinfo_l
+nrand48
+ntohl
+ntohs
+open
+open_memstream
+open_wmemstream
+openat
+opendir
+opendirat
+optarg
+opterr
+optind
+optopt
+optreset
+pathconf
+perror
+poll
+posix_close
+posix_fadvise
+posix_fallocate
+posix_memalign
+pow
+pow10
+pow10f
+pow10l
+powf
+powl
+pread
+preadv
+printf
+program_invocation_name
+program_invocation_short_name
+pselect
+psignal
+pthread_attr_destroy
+pthread_attr_init
+pthread_attr_setstack
+pthread_attr_setstacksize
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_init
+pthread_condattr_setclock
+pthread_condattr_setpshared
+pthread_create
+pthread_exit
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_mutex_consistent
+pthread_mutex_destroy
+pthread_mutex_getprioceiling
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_timedlock
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_init
+pthread_mutexattr_setprotocol
+pthread_mutexattr_setpshared
+pthread_mutexattr_setrobust
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setcancelstate
+pthread_setspecific
+pthread_testcancel
+pthread_timedjoin_np
+pthread_tryjoin_np
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+putw
+putwc
+putwc_unlocked
+putwchar
+putwchar_unlocked
+pwrite
+pwritev
+qsort
+qsort_r
+quick_exit
+raise
+rand
+rand_r
+random
+read
+readdir
+readlink
+readlinkat
+readv
+realloc
+reallocarray
+recv
+regcomp
+regerror
+regexec
+regfree
+remainder
+remainderf
+remainderl
+remove
+remque
+remquo
+remquof
+remquol
+rename
+renameat
+rewind
+rewinddir
+rindex
+rint
+rintf
+rintl
+rmdir
+round
+roundf
+roundl
+sbrk
+scalb
+scalbf
+scalbln
+scalblnf
+scalblnl
+scalbn
+scalbnf
+scalbnl
+scandir
+scandirat
+scanf
+sched_yield
+seed48
+seekdir
+select
+sem_destroy
+sem_getvalue
+sem_init
+sem_post
+sem_timedwait
+sem_trywait
+sem_wait
+send
+setbuf
+setbuffer
+setenv
+setkey
+setlinebuf
+setlocale
+setstate
+setvbuf
+shutdown
+signal
+signgam
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sinhl
+sinl
+sleep
+snprintf
+sprintf
+sqrt
+sqrtf
+sqrtl
+srand
+srand48
+srandom
+sscanf
+stat
+stderr
+stdin
+stdout
+stpcpy
+stpncpy
+strcasecmp
+strcasecmp_l
+strcasestr
+strcat
+strchr
+strchrnul
+strcmp
+strcoll
+strcoll_l
+strcpy
+strcspn
+strdup
+strerror
+strerror_l
+strerror_r
+strfmon
+strfmon_l
+strftime
+strftime_l
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncasecmp_l
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtod_l
+strtof
+strtof_l
+strtoimax
+strtok
+strtok_r
+strtol
+strtold
+strtold_l
+strtoll
+strtoul
+strtoull
+strtoumax
+strverscmp
+strxfrm
+strxfrm_l
+swab
+swprintf
+swscanf
+symlink
+symlinkat
+sysconf
+tan
+tanf
+tanh
+tanhf
+tanhl
+tanl
+tdelete
+tdestroy
+telldir
+tfind
+tgamma
+tgammaf
+tgammal
+thrd_current
+thrd_sleep
+time
+timegm
+times
+timespec_get
+toascii
+tolower
+tolower_l
+toupper
+toupper_l
+towctrans
+towctrans_l
+towlower
+towlower_l
+towupper
+towupper_l
+trunc
+truncate
+truncf
+truncl
+tsearch
+tss_get
+twalk
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unsetenv
+uselocale
+usleep
+utime
+utimensat
+utimes
+vasprintf
+vdprintf
+versionsort
+versionsort64
+vfprintf
+vfscanf
+vfwprintf
+vfwscanf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vswscanf
+vwprintf
+vwscanf
+wasi_thread_start
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscasecmp_l
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscoll_l
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcsftime_l
+wcslen
+wcsncasecmp
+wcsncasecmp_l
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcsnrtombs
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstof
+wcstoimax
+wcstok
+wcstol
+wcstold
+wcstoll
+wcstombs
+wcstoul
+wcstoull
+wcstoumax
+wcswcs
+wcswidth
+wcsxfrm
+wcsxfrm_l
+wctob
+wctomb
+wctrans
+wctrans_l
+wctype
+wctype_l
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/expected/wasm32-wasi/posix/include-all.c b/expected/wasm32-wasi/posix/include-all.c
new file mode 100644
index 0000000..0b43b07
--- /dev/null
+++ b/expected/wasm32-wasi/posix/include-all.c
@@ -0,0 +1,171 @@
+#include <__errno.h>
+#include <__errno_values.h>
+#include <__fd_set.h>
+#include <__function___isatty.h>
+#include <__functions_malloc.h>
+#include <__functions_memcpy.h>
+#include <__header_dirent.h>
+#include <__header_fcntl.h>
+#include <__header_inttypes.h>
+#include <__header_netinet_in.h>
+#include <__header_poll.h>
+#include <__header_stdlib.h>
+#include <__header_string.h>
+#include <__header_sys_ioctl.h>
+#include <__header_sys_resource.h>
+#include <__header_sys_socket.h>
+#include <__header_sys_stat.h>
+#include <__header_time.h>
+#include <__header_unistd.h>
+#include <__macro_FD_SETSIZE.h>
+#include <__macro_PAGESIZE.h>
+#include <__mode_t.h>
+#include <__seek.h>
+#include <__struct_dirent.h>
+#include <__struct_in6_addr.h>
+#include <__struct_in_addr.h>
+#include <__struct_iovec.h>
+#include <__struct_msghdr.h>
+#include <__struct_pollfd.h>
+#include <__struct_rusage.h>
+#include <__struct_sockaddr.h>
+#include <__struct_sockaddr_in.h>
+#include <__struct_sockaddr_in6.h>
+#include <__struct_sockaddr_storage.h>
+#include <__struct_sockaddr_un.h>
+#include <__struct_stat.h>
+#include <__struct_timespec.h>
+#include <__struct_timeval.h>
+#include <__struct_tm.h>
+#include <__struct_tms.h>
+#include <__typedef_DIR.h>
+#include <__typedef_blkcnt_t.h>
+#include <__typedef_blksize_t.h>
+#include <__typedef_clock_t.h>
+#include <__typedef_clockid_t.h>
+#include <__typedef_dev_t.h>
+#include <__typedef_fd_set.h>
+#include <__typedef_gid_t.h>
+#include <__typedef_in_addr_t.h>
+#include <__typedef_in_port_t.h>
+#include <__typedef_ino_t.h>
+#include <__typedef_mode_t.h>
+#include <__typedef_nfds_t.h>
+#include <__typedef_nlink_t.h>
+#include <__typedef_off_t.h>
+#include <__typedef_sa_family_t.h>
+#include <__typedef_sigset_t.h>
+#include <__typedef_socklen_t.h>
+#include <__typedef_ssize_t.h>
+#include <__typedef_suseconds_t.h>
+#include <__typedef_time_t.h>
+#include <__typedef_uid_t.h>
+#include <alloca.h>
+#include <ar.h>
+#include <arpa/ftp.h>
+#include <arpa/inet.h>
+#include <arpa/nameser.h>
+#include <arpa/nameser_compat.h>
+#include <arpa/telnet.h>
+#include <arpa/tftp.h>
+#include <assert.h>
+#include <byteswap.h>
+#include <complex.h>
+#include <cpio.h>
+#include <crypt.h>
+#include <ctype.h>
+#include <dirent.h>
+#include <endian.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <features.h>
+#include <fenv.h>
+#include <float.h>
+#include <fmtmsg.h>
+#include <fnmatch.h>
+#include <ftw.h>
+#include <getopt.h>
+#include <glob.h>
+#include <iconv.h>
+#include <ifaddrs.h>
+#include <inttypes.h>
+#include <iso646.h>
+#include <langinfo.h>
+#include <libgen.h>
+#include <limits.h>
+#include <locale.h>
+#include <malloc.h>
+#include <math.h>
+#include <memory.h>
+#include <monetary.h>
+#include <mqueue.h>
+#include <netinet/icmp6.h>
+#include <netinet/igmp.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/ip6.h>
+#include <netinet/ip_icmp.h>
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <netpacket/packet.h>
+#include <nl_types.h>
+#include <poll.h>
+#include <pthread.h>
+#include <regex.h>
+#include <sched.h>
+#include <search.h>
+#include <semaphore.h>
+#include <stdalign.h>
+#include <stdbool.h>
+#include <stdc-predef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdio_ext.h>
+#include <stdlib.h>
+#include <stdnoreturn.h>
+#include <string.h>
+#include <strings.h>
+#include <stropts.h>
+#include <sys/dir.h>
+#include <sys/errno.h>
+#include <sys/eventfd.h>
+#include <sys/fcntl.h>
+#include <sys/file.h>
+#include <sys/ioctl.h>
+#include <sys/param.h>
+#include <sys/poll.h>
+#include <sys/random.h>
+#include <sys/reg.h>
+#include <sys/select.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/stropts.h>
+#include <sys/syscall.h>
+#include <sys/sysinfo.h>
+#include <sys/time.h>
+#include <sys/timeb.h>
+#include <sys/timex.h>
+#include <sys/ttydefaults.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <sys/un.h>
+#include <sys/utsname.h>
+#include <syscall.h>
+#include <sysexits.h>
+#include <tar.h>
+#include <tgmath.h>
+#include <threads.h>
+#include <time.h>
+#include <uchar.h>
+#include <unistd.h>
+#include <utime.h>
+#include <values.h>
+#include <wasi/api.h>
+#include <wasi/libc-environ.h>
+#include <wasi/libc-find-relpath.h>
+#include <wasi/libc-nocwd.h>
+#include <wasi/libc.h>
+#include <wchar.h>
+#include <wctype.h>
diff --git a/expected/wasm32-wasi/posix/predefined-macros.txt b/expected/wasm32-wasi/posix/predefined-macros.txt
new file mode 100644
index 0000000..ac90920
--- /dev/null
+++ b/expected/wasm32-wasi/posix/predefined-macros.txt
@@ -0,0 +1,3398 @@
+#define ABDAY_1 0x20000
+#define ABDAY_2 0x20001
+#define ABDAY_3 0x20002
+#define ABDAY_4 0x20003
+#define ABDAY_5 0x20004
+#define ABDAY_6 0x20005
+#define ABDAY_7 0x20006
+#define ABMON_1 0x2000E
+#define ABMON_10 0x20017
+#define ABMON_11 0x20018
+#define ABMON_12 0x20019
+#define ABMON_2 0x2000F
+#define ABMON_3 0x20010
+#define ABMON_4 0x20011
+#define ABMON_5 0x20012
+#define ABMON_6 0x20013
+#define ABMON_7 0x20014
+#define ABMON_8 0x20015
+#define ABMON_9 0x20016
+#define ABORT 238
+#define ACK 04
+#define ADD ns_uop_add
+#define ADJ_ESTERROR 0x0008
+#define ADJ_FREQUENCY 0x0002
+#define ADJ_MAXERROR 0x0004
+#define ADJ_MICRO 0x1000
+#define ADJ_NANO 0x2000
+#define ADJ_OFFSET 0x0001
+#define ADJ_OFFSET_SINGLESHOT 0x8001
+#define ADJ_OFFSET_SS_READ 0xa001
+#define ADJ_SETOFFSET 0x0100
+#define ADJ_STATUS 0x0010
+#define ADJ_TAI 0x0080
+#define ADJ_TICK 0x4000
+#define ADJ_TIMECONST 0x0020
+#define AF_INET 1
+#define AF_INET6 2
+#define AF_UNIX 3
+#define AF_UNSPEC 0
+#define ALT_DIGITS 0x2002F
+#define AM_STR 0x20026
+#define ANYMARK 0x01
+#define AO 245
+#define AREGTYPE '\0'
+#define ARFMAG "`\n"
+#define ARG_MAX 131072
+#define ARMAG "!<arch>\n"
+#define AT_EACCESS (0x0)
+#define AT_FDCWD (-2)
+#define AT_REMOVEDIR (0x4)
+#define AT_SYMLINK_FOLLOW (0x2)
+#define AT_SYMLINK_NOFOLLOW (0x1)
+#define AUTHTYPE_CNT 5
+#define AUTHTYPE_KERBEROS_V4 1
+#define AUTHTYPE_KERBEROS_V5 2
+#define AUTHTYPE_MINK 4
+#define AUTHTYPE_NAME(x) authtype_names[x]
+#define AUTHTYPE_NAME_OK(x) ((unsigned int)(x) < AUTHTYPE_CNT)
+#define AUTHTYPE_NULL 0
+#define AUTHTYPE_SPX 3
+#define AUTHTYPE_TEST 99
+#define AUTH_HOW_MASK 2
+#define AUTH_HOW_MUTUAL 2
+#define AUTH_HOW_ONE_WAY 0
+#define AUTH_WHO_CLIENT 0
+#define AUTH_WHO_MASK 1
+#define AUTH_WHO_SERVER 1
+#define AYT 246
+#define BIG_ENDIAN __BIG_ENDIAN
+#define BITSPERBYTE CHAR_BIT
+#define BLKTYPE '4'
+#define BLK_BYTECOUNT 2
+#define BLK_EOF 0x40
+#define BLK_EOR 0x80
+#define BLK_ERRORS 0x20
+#define BLK_RESTART 0x10
+#define BREAK 243
+#define BUFSIZ 1024
+#define BYTE_ORDER __BYTE_ORDER
+#define CANBSIZ 255
+#define CBRK CEOL
+#define CDISCARD CTRL('o')
+#define CDSUSP CTRL('y')
+#define CEOF CTRL('d')
+#define CEOL '\0'
+#define CEOT CEOF
+#define CERASE 0177
+#define CFLUSH CDISCARD
+#define CHARBITS (sizeof(char) * 8)
+#define CHARCLASS_NAME_MAX 14
+#define CHAR_BIT 8
+#define CHAR_MAX 127
+#define CHAR_MIN (-128)
+#define CHRTYPE '3'
+#define CINTR CTRL('c')
+#define CKILL CTRL('u')
+#define CLNEXT CTRL('v')
+#define CLOCKS_PER_SEC ((clock_t)1000000000)
+#define CLOCK_MONOTONIC (&_CLOCK_MONOTONIC)
+#define CLOCK_REALTIME (&_CLOCK_REALTIME)
+#define CMIN 1
+#define CMPLX(x,y) __CMPLX(x, y, double)
+#define CMPLXF(x,y) __CMPLX(x, y, float)
+#define CMPLXL(x,y) __CMPLX(x, y, long double)
+#define CODESET 14
+#define COLL_WEIGHTS_MAX 2
+#define COMPLETE 2
+#define CONTINUE 3
+#define CONTTYPE '7'
+#define CQUIT 034
+#define CREPRINT CTRL('r')
+#define CRNCYSTR 0x4000F
+#define CRPRNT CREPRINT
+#define CSTART CTRL('q')
+#define CSTATUS '\0'
+#define CSTOP CTRL('s')
+#define CSUSP CTRL('z')
+#define CTIME 0
+#define CTRL(x) ((x)&037)
+#define CWERASE CTRL('w')
+#define C_ANY ns_c_any
+#define C_CHAOS ns_c_chaos
+#define C_HS ns_c_hs
+#define C_IN ns_c_in
+#define C_IRGRP 000040
+#define C_IROTH 000004
+#define C_IRUSR 000400
+#define C_ISBLK 060000
+#define C_ISCHR 020000
+#define C_ISCTG 0110000
+#define C_ISDIR 040000
+#define C_ISFIFO 010000
+#define C_ISGID 002000
+#define C_ISLNK 0120000
+#define C_ISREG 0100000
+#define C_ISSOCK 0140000
+#define C_ISUID 004000
+#define C_ISVTX 001000
+#define C_IWGRP 000020
+#define C_IWOTH 000002
+#define C_IWUSR 000200
+#define C_IXGRP 000010
+#define C_IXOTH 000001
+#define C_IXUSR 000100
+#define C_NONE ns_c_none
+#define DATA 03
+#define DAY_1 0x20007
+#define DAY_2 0x20008
+#define DAY_3 0x20009
+#define DAY_4 0x2000A
+#define DAY_5 0x2000B
+#define DAY_6 0x2000C
+#define DAY_7 0x2000D
+#define DBL_DECIMAL_DIG 17
+#define DBL_DIG 15
+#define DBL_EPSILON 2.22044604925031308085e-16
+#define DBL_HAS_SUBNORM 1
+#define DBL_MANT_DIG 53
+#define DBL_MAX 1.79769313486231570815e+308
+#define DBL_MAX_10_EXP 308
+#define DBL_MAX_EXP 1024
+#define DBL_MIN 2.22507385850720138309e-308
+#define DBL_MIN_10_EXP (-307)
+#define DBL_MIN_EXP (-1021)
+#define DBL_TRUE_MIN 4.94065645841246544177e-324
+#define DECIMAL_DIG 36
+#define DELAYTIMER_MAX 0x7fffffff
+#define DELETE ns_uop_delete
+#define DEV_BSIZE 512
+#define DIRTYPE '5'
+#define DM 242
+#define DMAXEXP DBL_MAX_EXP
+#define DMINEXP DBL_MIN_EXP
+#define DO 253
+#define DONT 254
+#define DOUBLEBITS (sizeof(double) * 8)
+#define DTTOIF(x) (__wasilibc_dttoif(x))
+#define DT_BLK __WASI_FILETYPE_BLOCK_DEVICE
+#define DT_CHR __WASI_FILETYPE_CHARACTER_DEVICE
+#define DT_DIR __WASI_FILETYPE_DIRECTORY
+#define DT_FIFO __WASI_FILETYPE_SOCKET_STREAM
+#define DT_LNK __WASI_FILETYPE_SYMBOLIC_LINK
+#define DT_REG __WASI_FILETYPE_REGULAR_FILE
+#define DT_UNKNOWN __WASI_FILETYPE_UNKNOWN
+#define D_FMT 0x20029
+#define D_T_FMT 0x20028
+#define E2BIG __WASI_ERRNO_2BIG
+#define EACCES __WASI_ERRNO_ACCES
+#define EACCESS 2
+#define EADDRINUSE __WASI_ERRNO_ADDRINUSE
+#define EADDRNOTAVAIL __WASI_ERRNO_ADDRNOTAVAIL
+#define EAFNOSUPPORT __WASI_ERRNO_AFNOSUPPORT
+#define EAGAIN __WASI_ERRNO_AGAIN
+#define EALREADY __WASI_ERRNO_ALREADY
+#define EBADF __WASI_ERRNO_BADF
+#define EBADID 5
+#define EBADMSG __WASI_ERRNO_BADMSG
+#define EBADOP 4
+#define EBUSY __WASI_ERRNO_BUSY
+#define EC 247
+#define ECANCELED __WASI_ERRNO_CANCELED
+#define ECHILD __WASI_ERRNO_CHILD
+#define ECONNABORTED __WASI_ERRNO_CONNABORTED
+#define ECONNREFUSED __WASI_ERRNO_CONNREFUSED
+#define ECONNRESET __WASI_ERRNO_CONNRESET
+#define EDEADLK __WASI_ERRNO_DEADLK
+#define EDESTADDRREQ __WASI_ERRNO_DESTADDRREQ
+#define EDOM __WASI_ERRNO_DOM
+#define EDQUOT __WASI_ERRNO_DQUOT
+#define EEXIST __WASI_ERRNO_EXIST
+#define EEXISTS 6
+#define EFAULT __WASI_ERRNO_FAULT
+#define EFBIG __WASI_ERRNO_FBIG
+#define EFD_CLOEXEC O_CLOEXEC
+#define EFD_NONBLOCK O_NONBLOCK
+#define EFD_SEMAPHORE 1
+#define EHOSTUNREACH __WASI_ERRNO_HOSTUNREACH
+#define EIDRM __WASI_ERRNO_IDRM
+#define EILSEQ __WASI_ERRNO_ILSEQ
+#define EINPROGRESS __WASI_ERRNO_INPROGRESS
+#define EINTR __WASI_ERRNO_INTR
+#define EINVAL __WASI_ERRNO_INVAL
+#define EIO __WASI_ERRNO_IO
+#define EISCONN __WASI_ERRNO_ISCONN
+#define EISDIR __WASI_ERRNO_ISDIR
+#define EL 248
+#define ELOOP __WASI_ERRNO_LOOP
+#define EMFILE __WASI_ERRNO_MFILE
+#define EMLINK __WASI_ERRNO_MLINK
+#define EMSGSIZE __WASI_ERRNO_MSGSIZE
+#define EMULTIHOP __WASI_ERRNO_MULTIHOP
+#define ENAMETOOLONG __WASI_ERRNO_NAMETOOLONG
+#define ENCRYPT_CNT 9
+#define ENCRYPT_DEC_KEYID 8
+#define ENCRYPT_ENC_KEYID 7
+#define ENCRYPT_END 4
+#define ENCRYPT_IS 0
+#define ENCRYPT_NAME(x) encrypt_names[x]
+#define ENCRYPT_NAME_OK(x) ((unsigned int)(x) < ENCRYPT_CNT)
+#define ENCRYPT_REPLY 2
+#define ENCRYPT_REQEND 6
+#define ENCRYPT_REQSTART 5
+#define ENCRYPT_START 3
+#define ENCRYPT_SUPPORT 1
+#define ENCTYPE_ANY 0
+#define ENCTYPE_CNT 3
+#define ENCTYPE_DES_CFB64 1
+#define ENCTYPE_DES_OFB64 2
+#define ENCTYPE_NAME(x) enctype_names[x]
+#define ENCTYPE_NAME_OK(x) ((unsigned int)(x) < ENCTYPE_CNT)
+#define ENETDOWN __WASI_ERRNO_NETDOWN
+#define ENETRESET __WASI_ERRNO_NETRESET
+#define ENETUNREACH __WASI_ERRNO_NETUNREACH
+#define ENFILE __WASI_ERRNO_NFILE
+#define ENOBUFS __WASI_ERRNO_NOBUFS
+#define ENODEV __WASI_ERRNO_NODEV
+#define ENOENT __WASI_ERRNO_NOENT
+#define ENOEXEC __WASI_ERRNO_NOEXEC
+#define ENOLCK __WASI_ERRNO_NOLCK
+#define ENOLINK __WASI_ERRNO_NOLINK
+#define ENOMEM __WASI_ERRNO_NOMEM
+#define ENOMSG __WASI_ERRNO_NOMSG
+#define ENOPROTOOPT __WASI_ERRNO_NOPROTOOPT
+#define ENOSPACE 3
+#define ENOSPC __WASI_ERRNO_NOSPC
+#define ENOSYS __WASI_ERRNO_NOSYS
+#define ENOTCAPABLE __WASI_ERRNO_NOTCAPABLE
+#define ENOTCONN __WASI_ERRNO_NOTCONN
+#define ENOTDIR __WASI_ERRNO_NOTDIR
+#define ENOTEMPTY __WASI_ERRNO_NOTEMPTY
+#define ENOTFOUND 1
+#define ENOTRECOVERABLE __WASI_ERRNO_NOTRECOVERABLE
+#define ENOTSOCK __WASI_ERRNO_NOTSOCK
+#define ENOTSUP __WASI_ERRNO_NOTSUP
+#define ENOTTY __WASI_ERRNO_NOTTY
+#define ENOUSER 7
+#define ENV_ESC 2
+#define ENV_USERVAR 3
+#define ENXIO __WASI_ERRNO_NXIO
+#define EOF (-1)
+#define EOPNOTSUPP ENOTSUP
+#define EOR 239
+#define EOVERFLOW __WASI_ERRNO_OVERFLOW
+#define EOWNERDEAD __WASI_ERRNO_OWNERDEAD
+#define EPERM __WASI_ERRNO_PERM
+#define EPIPE __WASI_ERRNO_PIPE
+#define EPROTO __WASI_ERRNO_PROTO
+#define EPROTONOSUPPORT __WASI_ERRNO_PROTONOSUPPORT
+#define EPROTOTYPE __WASI_ERRNO_PROTOTYPE
+#define ERA 0x2002C
+#define ERANGE __WASI_ERRNO_RANGE
+#define ERA_D_FMT 0x2002E
+#define ERA_D_T_FMT 0x20030
+#define ERA_T_FMT 0x20031
+#define EROFS __WASI_ERRNO_ROFS
+#define ERROR 05
+#define ESPIPE __WASI_ERRNO_SPIPE
+#define ESRCH __WASI_ERRNO_SRCH
+#define ESTALE __WASI_ERRNO_STALE
+#define ETIMEDOUT __WASI_ERRNO_TIMEDOUT
+#define ETXTBSY __WASI_ERRNO_TXTBSY
+#define EUNDEF 0
+#define EWOULDBLOCK EAGAIN
+#define EXDEV __WASI_ERRNO_XDEV
+#define EXIT_FAILURE 1
+#define EXIT_SUCCESS 0
+#define EX_CANTCREAT 73
+#define EX_CONFIG 78
+#define EX_DATAERR 65
+#define EX_IOERR 74
+#define EX_NOHOST 68
+#define EX_NOINPUT 66
+#define EX_NOPERM 77
+#define EX_NOUSER 67
+#define EX_OK 0
+#define EX_OSERR 71
+#define EX_OSFILE 72
+#define EX_PROTOCOL 76
+#define EX_SOFTWARE 70
+#define EX_TEMPFAIL 75
+#define EX_UNAVAILABLE 69
+#define EX_USAGE 64
+#define EX__BASE 64
+#define EX__MAX 78
+#define FD_CLOEXEC (1)
+#define FD_CLR(fd,set) (FD_CLR((fd), (set)))
+#define FD_COPY(from,to) (FD_COPY((from), (to)))
+#define FD_ISSET(fd,set) (FD_ISSET((fd), (set)))
+#define FD_SET(fd,set) (FD_SET((fd), (set)))
+#define FD_SETSIZE 1024
+#define FD_ZERO(set) (FD_ZERO((set)))
+#define FE_ALL_EXCEPT 0
+#define FE_DFL_ENV ((const fenv_t *) -1)
+#define FE_TONEAREST 0
+#define FIFOTYPE '6'
+#define FILENAME_MAX 4096
+#define FILESIZEBITS 64
+#define FIONBIO 2
+#define FIONREAD 1
+#define FLOATBITS (sizeof(float) * 8)
+#define FLT_DECIMAL_DIG 9
+#define FLT_DIG 6
+#define FLT_EPSILON 1.1920928955078125e-07F
+#define FLT_EVAL_METHOD 0
+#define FLT_HAS_SUBNORM 1
+#define FLT_MANT_DIG 24
+#define FLT_MAX 3.40282346638528859812e+38F
+#define FLT_MAX_10_EXP 38
+#define FLT_MAX_EXP 128
+#define FLT_MIN 1.17549435082228750797e-38F
+#define FLT_MIN_10_EXP (-37)
+#define FLT_MIN_EXP (-125)
+#define FLT_RADIX 2
+#define FLT_ROUNDS (__builtin_flt_rounds())
+#define FLT_TRUE_MIN 1.40129846432481707092e-45F
+#define FLUSHBAND 0x04
+#define FLUSHR 0x01
+#define FLUSHRW 0x03
+#define FLUSHW 0x02
+#define FMAXEXP FLT_MAX_EXP
+#define FMINEXP FLT_MIN_EXP
+#define FMNAMESZ 8
+#define FNM_CASEFOLD 0x10
+#define FNM_FILE_NAME FNM_PATHNAME
+#define FNM_LEADING_DIR 0x8
+#define FNM_NOESCAPE 0x2
+#define FNM_NOMATCH 1
+#define FNM_NOSYS (-1)
+#define FNM_PATHNAME 0x1
+#define FNM_PERIOD 0x4
+#define FOPEN_MAX 1000
+#define FORMERR ns_r_formerr
+#define FORM_C 3
+#define FORM_N 1
+#define FORM_T 2
+#define FP_ILOGB0 FP_ILOGBNAN
+#define FP_ILOGBNAN (-1-0x7fffffff)
+#define FP_INFINITE 1
+#define FP_NAN 0
+#define FP_NORMAL 4
+#define FP_SUBNORMAL 3
+#define FP_ZERO 2
+#define FSETLOCKING_BYCALLER 2
+#define FSETLOCKING_INTERNAL 1
+#define FSETLOCKING_QUERY 0
+#define FTW_CHDIR 4
+#define FTW_D 2
+#define FTW_DEPTH 8
+#define FTW_DNR 3
+#define FTW_DP 6
+#define FTW_F 1
+#define FTW_MOUNT 2
+#define FTW_NS 4
+#define FTW_PHYS 1
+#define FTW_SL 5
+#define FTW_SLN 7
+#define F_GETFD (1)
+#define F_GETFL (3)
+#define F_LOCK 1
+#define F_OK (0)
+#define F_SETFD (2)
+#define F_SETFL (4)
+#define F_TEST 3
+#define F_TLOCK 2
+#define F_ULOCK 0
+#define GA 249
+#define GETLONG NS_GET32
+#define GETSHORT NS_GET16
+#define GLOB_ABORTED 2
+#define GLOB_APPEND 0x20
+#define GLOB_DOOFFS 0x08
+#define GLOB_ERR 0x01
+#define GLOB_MARK 0x02
+#define GLOB_NOCHECK 0x10
+#define GLOB_NOESCAPE 0x40
+#define GLOB_NOMATCH 3
+#define GLOB_NOSORT 0x04
+#define GLOB_NOSPACE 1
+#define GLOB_NOSYS 4
+#define GLOB_PERIOD 0x80
+#define GROUP_FILTER_SIZE(numsrc) (sizeof(struct group_filter) - sizeof(struct sockaddr_storage) + (numsrc) * sizeof(struct sockaddr_storage))
+#define HFIXEDSZ NS_HFIXEDSZ
+#define HIBITL MINLONG
+#define HIBITS MINSHORT
+#define HOST_NAME_MAX 255
+#define HUGE 3.40282346638528859812e+38F
+#define HUGE_VAL ((double)INFINITY)
+#define HUGE_VALF INFINITY
+#define HUGE_VALL ((long double)INFINITY)
+#define I _Complex_I
+#define IAC 255
+#define ICMP6_DST_UNREACH 1
+#define ICMP6_DST_UNREACH_ADDR 3
+#define ICMP6_DST_UNREACH_ADMIN 1
+#define ICMP6_DST_UNREACH_BEYONDSCOPE 2
+#define ICMP6_DST_UNREACH_NOPORT 4
+#define ICMP6_DST_UNREACH_NOROUTE 0
+#define ICMP6_ECHO_REPLY 129
+#define ICMP6_ECHO_REQUEST 128
+#define ICMP6_FILTER 1
+#define ICMP6_FILTER_BLOCK 1
+#define ICMP6_FILTER_BLOCKOTHERS 3
+#define ICMP6_FILTER_PASS 2
+#define ICMP6_FILTER_PASSONLY 4
+#define ICMP6_FILTER_SETBLOCK(type,filterp) ((((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type) & 31))))
+#define ICMP6_FILTER_SETBLOCKALL(filterp) memset (filterp, 0xFF, sizeof (struct icmp6_filter));
+#define ICMP6_FILTER_SETPASS(type,filterp) ((((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type) & 31))))
+#define ICMP6_FILTER_SETPASSALL(filterp) memset (filterp, 0, sizeof (struct icmp6_filter));
+#define ICMP6_FILTER_WILLBLOCK(type,filterp) ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) != 0)
+#define ICMP6_FILTER_WILLPASS(type,filterp) ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) == 0)
+#define ICMP6_INFOMSG_MASK 0x80
+#define ICMP6_PACKET_TOO_BIG 2
+#define ICMP6_PARAMPROB_HEADER 0
+#define ICMP6_PARAMPROB_NEXTHEADER 1
+#define ICMP6_PARAMPROB_OPTION 2
+#define ICMP6_PARAM_PROB 4
+#define ICMP6_ROUTER_RENUMBERING 138
+#define ICMP6_RR_FLAGS_FORCEAPPLY 0x20
+#define ICMP6_RR_FLAGS_PREVDONE 0x08
+#define ICMP6_RR_FLAGS_REQRESULT 0x40
+#define ICMP6_RR_FLAGS_SPECSITE 0x10
+#define ICMP6_RR_FLAGS_TEST 0x80
+#define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40
+#define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80
+#define ICMP6_RR_PCOUSE_RAFLAGS_AUTO 0x10
+#define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK 0x20
+#define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0100
+#define ICMP6_RR_RESULT_FLAGS_OOB 0x0200
+#define ICMP6_TIME_EXCEEDED 3
+#define ICMP6_TIME_EXCEED_REASSEMBLY 1
+#define ICMP6_TIME_EXCEED_TRANSIT 0
+#define ICMP_ADDRESS 17
+#define ICMP_ADDRESSREPLY 18
+#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8)
+#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8)
+#define ICMP_DEST_UNREACH 3
+#define ICMP_ECHO 8
+#define ICMP_ECHOREPLY 0
+#define ICMP_EXC_FRAGTIME 1
+#define ICMP_EXC_TTL 0
+#define ICMP_FRAG_NEEDED 4
+#define ICMP_HOST_ANO 10
+#define ICMP_HOST_ISOLATED 8
+#define ICMP_HOST_UNKNOWN 7
+#define ICMP_HOST_UNREACH 1
+#define ICMP_HOST_UNR_TOS 12
+#define ICMP_INFOTYPE(type) ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
+#define ICMP_INFO_REPLY 16
+#define ICMP_INFO_REQUEST 15
+#define ICMP_IREQ 15
+#define ICMP_IREQREPLY 16
+#define ICMP_MASKLEN 12
+#define ICMP_MASKREPLY 18
+#define ICMP_MASKREQ 17
+#define ICMP_MAXTYPE 18
+#define ICMP_MINLEN 8
+#define ICMP_NET_ANO 9
+#define ICMP_NET_UNKNOWN 6
+#define ICMP_NET_UNREACH 0
+#define ICMP_NET_UNR_TOS 11
+#define ICMP_PARAMETERPROB 12
+#define ICMP_PARAMPROB 12
+#define ICMP_PARAMPROB_OPTABSENT 1
+#define ICMP_PKT_FILTERED 13
+#define ICMP_PORT_UNREACH 3
+#define ICMP_PREC_CUTOFF 15
+#define ICMP_PREC_VIOLATION 14
+#define ICMP_PROT_UNREACH 2
+#define ICMP_REDIRECT 5
+#define ICMP_REDIRECT_HOST 1
+#define ICMP_REDIRECT_NET 0
+#define ICMP_REDIRECT_TOSHOST 3
+#define ICMP_REDIRECT_TOSNET 2
+#define ICMP_REDIR_HOST 1
+#define ICMP_REDIR_HOSTTOS 3
+#define ICMP_REDIR_NET 0
+#define ICMP_REDIR_NETTOS 2
+#define ICMP_ROUTERADVERT 9
+#define ICMP_ROUTERSOLICIT 10
+#define ICMP_SOURCEQUENCH 4
+#define ICMP_SOURCE_QUENCH 4
+#define ICMP_SR_FAILED 5
+#define ICMP_TIMESTAMP 13
+#define ICMP_TIMESTAMPREPLY 14
+#define ICMP_TIME_EXCEEDED 11
+#define ICMP_TIMXCEED 11
+#define ICMP_TIMXCEED_INTRANS 0
+#define ICMP_TIMXCEED_REASS 1
+#define ICMP_TSLEN (8 + 3 * sizeof (n_time))
+#define ICMP_TSTAMP 13
+#define ICMP_TSTAMPREPLY 14
+#define ICMP_UNREACH 3
+#define ICMP_UNREACH_FILTER_PROHIB 13
+#define ICMP_UNREACH_HOST 1
+#define ICMP_UNREACH_HOST_PRECEDENCE 14
+#define ICMP_UNREACH_HOST_PROHIB 10
+#define ICMP_UNREACH_HOST_UNKNOWN 7
+#define ICMP_UNREACH_ISOLATED 8
+#define ICMP_UNREACH_NEEDFRAG 4
+#define ICMP_UNREACH_NET 0
+#define ICMP_UNREACH_NET_PROHIB 9
+#define ICMP_UNREACH_NET_UNKNOWN 6
+#define ICMP_UNREACH_PORT 3
+#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15
+#define ICMP_UNREACH_PROTOCOL 2
+#define ICMP_UNREACH_SRCFAIL 5
+#define ICMP_UNREACH_TOSHOST 12
+#define ICMP_UNREACH_TOSNET 11
+#define IFTODT(x) (__wasilibc_iftodt(x))
+#define IGMP_AWAKENING_MEMBER 5
+#define IGMP_DELAYING_MEMBER 1
+#define IGMP_DVMRP 0x13
+#define IGMP_HOST_LEAVE_MESSAGE IGMP_V2_LEAVE_GROUP
+#define IGMP_HOST_MEMBERSHIP_QUERY IGMP_MEMBERSHIP_QUERY
+#define IGMP_HOST_MEMBERSHIP_REPORT IGMP_V1_MEMBERSHIP_REPORT
+#define IGMP_HOST_NEW_MEMBERSHIP_REPORT IGMP_V2_MEMBERSHIP_REPORT
+#define IGMP_IDLE_MEMBER 2
+#define IGMP_LAZY_MEMBER 3
+#define IGMP_MAX_HOST_REPORT_DELAY 10
+#define IGMP_MEMBERSHIP_QUERY 0x11
+#define IGMP_MINLEN 8
+#define IGMP_MTRACE 0x1f
+#define IGMP_MTRACE_RESP 0x1e
+#define IGMP_PIM 0x14
+#define IGMP_SLEEPING_MEMBER 4
+#define IGMP_TIMER_SCALE 10
+#define IGMP_TRACE 0x15
+#define IGMP_V1_MEMBERSHIP_REPORT 0x12
+#define IGMP_V2_LEAVE_GROUP 0x17
+#define IGMP_V2_MEMBERSHIP_REPORT 0x16
+#define IGMP_v1_ROUTER 1
+#define IGMP_v2_ROUTER 2
+#define IN6ADDRSZ NS_IN6ADDRSZ
+#define IN6ADDR_ANY_INIT { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }
+#define IN6ADDR_LOOPBACK_INIT { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } }
+#define IN6_ARE_ADDR_EQUAL(a,b) __ARE_4_EQUAL((const uint32_t *)(a), (const uint32_t *)(b))
+#define IN6_IS_ADDR_LINKLOCAL(a) ((((uint8_t *) (a))[0]) == 0xfe && (((uint8_t *) (a))[1] & 0xc0) == 0x80)
+#define IN6_IS_ADDR_LOOPBACK(a) (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && ((uint32_t *) (a))[2] == 0 && ((uint8_t *) (a))[12] == 0 && ((uint8_t *) (a))[13] == 0 && ((uint8_t *) (a))[14] == 0 && ((uint8_t *) (a))[15] == 1 )
+#define IN6_IS_ADDR_MC_GLOBAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0xe))
+#define IN6_IS_ADDR_MC_LINKLOCAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x2))
+#define IN6_IS_ADDR_MC_NODELOCAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x1))
+#define IN6_IS_ADDR_MC_ORGLOCAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x8))
+#define IN6_IS_ADDR_MC_SITELOCAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x5))
+#define IN6_IS_ADDR_MULTICAST(a) (((uint8_t *) (a))[0] == 0xff)
+#define IN6_IS_ADDR_SITELOCAL(a) ((((uint8_t *) (a))[0]) == 0xfe && (((uint8_t *) (a))[1] & 0xc0) == 0xc0)
+#define IN6_IS_ADDR_UNSPECIFIED(a) (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && ((uint32_t *) (a))[2] == 0 && ((uint32_t *) (a))[3] == 0)
+#define IN6_IS_ADDR_V4COMPAT(a) (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && ((uint32_t *) (a))[2] == 0 && ((uint8_t *) (a))[15] > 1)
+#define IN6_IS_ADDR_V4MAPPED(a) (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && ((uint8_t *) (a))[8] == 0 && ((uint8_t *) (a))[9] == 0 && ((uint8_t *) (a))[10] == 0xff && ((uint8_t *) (a))[11] == 0xff)
+#define INADDRSZ NS_INADDRSZ
+#define INADDR_ALLHOSTS_GROUP ((in_addr_t) 0xe0000001)
+#define INADDR_ALLRTRS_GROUP ((in_addr_t) 0xe0000002)
+#define INADDR_ALLSNOOPERS_GROUP ((in_addr_t) 0xe000006a)
+#define INADDR_ANY ((in_addr_t) 0x00000000)
+#define INADDR_BROADCAST ((in_addr_t) 0xffffffff)
+#define INADDR_DUMMY ((in_addr_t) 0xc0000008)
+#define INADDR_LOOPBACK ((in_addr_t) 0x7f000001)
+#define INADDR_MAX_LOCAL_GROUP ((in_addr_t) 0xe00000ff)
+#define INADDR_NONE ((in_addr_t) 0xffffffff)
+#define INADDR_UNSPEC_GROUP ((in_addr_t) 0xe0000000)
+#define INDIR_MASK NS_CMPRSFLGS
+#define INET6_ADDRSTRLEN 46
+#define INET_ADDRSTRLEN 16
+#define INFINITY 1e5000f
+#define INT16SZ NS_INT16SZ
+#define INT16_C(c) c
+#define INT16_MAX (0x7fff)
+#define INT16_MIN (-1-0x7fff)
+#define INT32SZ NS_INT32SZ
+#define INT32_C(c) c
+#define INT32_MAX (0x7fffffff)
+#define INT32_MIN (-1-0x7fffffff)
+#define INT64_C(c) c ## LL
+#define INT64_MAX (0x7fffffffffffffff)
+#define INT64_MIN (-1-0x7fffffffffffffff)
+#define INT8SZ NS_INT8SZ
+#define INT8_C(c) c
+#define INT8_MAX (0x7f)
+#define INT8_MIN (-1-0x7f)
+#define INTBITS (sizeof(int) * 8)
+#define INTMAX_C(c) c ## LL
+#define INTMAX_MAX INT64_MAX
+#define INTMAX_MIN INT64_MIN
+#define INTPTR_MAX INT32_MAX
+#define INTPTR_MIN INT32_MIN
+#define INT_FAST16_MAX INT16_MAX
+#define INT_FAST16_MIN INT16_MIN
+#define INT_FAST32_MAX INT32_MAX
+#define INT_FAST32_MIN INT32_MIN
+#define INT_FAST64_MAX INT64_MAX
+#define INT_FAST64_MIN INT64_MIN
+#define INT_FAST8_MAX INT8_MAX
+#define INT_FAST8_MIN INT8_MIN
+#define INT_LEAST16_MAX INT16_MAX
+#define INT_LEAST16_MIN INT16_MIN
+#define INT_LEAST32_MAX INT32_MAX
+#define INT_LEAST32_MIN INT32_MIN
+#define INT_LEAST64_MAX INT64_MAX
+#define INT_LEAST64_MIN INT64_MIN
+#define INT_LEAST8_MAX INT8_MAX
+#define INT_LEAST8_MIN INT8_MIN
+#define INT_MAX 0x7fffffff
+#define INT_MIN (-1-0x7fffffff)
+#define IN_BADCLASS(a) ((((in_addr_t)(a)) & 0xf0000000) == 0xf0000000)
+#define IN_CLASSA(a) ((((in_addr_t)(a)) & 0x80000000) == 0)
+#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET)
+#define IN_CLASSA_MAX 128
+#define IN_CLASSA_NET 0xff000000
+#define IN_CLASSA_NSHIFT 24
+#define IN_CLASSB(a) ((((in_addr_t)(a)) & 0xc0000000) == 0x80000000)
+#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET)
+#define IN_CLASSB_MAX 65536
+#define IN_CLASSB_NET 0xffff0000
+#define IN_CLASSB_NSHIFT 16
+#define IN_CLASSC(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xc0000000)
+#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET)
+#define IN_CLASSC_NET 0xffffff00
+#define IN_CLASSC_NSHIFT 8
+#define IN_CLASSD(a) ((((in_addr_t)(a)) & 0xf0000000) == 0xe0000000)
+#define IN_EXPERIMENTAL(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xe0000000)
+#define IN_LOOPBACKNET 127
+#define IN_MULTICAST(a) IN_CLASSD(a)
+#define IOV_MAX 1024
+#define IP 244
+#define IP6F_MORE_FRAG 0x0100
+#define IP6F_OFF_MASK 0xf8ff
+#define IP6F_RESERVED_MASK 0x0600
+#define IP6OPT_JUMBO 0xc2
+#define IP6OPT_JUMBO_LEN 6
+#define IP6OPT_NSAP_ADDR 0xc3
+#define IP6OPT_PAD1 0
+#define IP6OPT_PADN 1
+#define IP6OPT_ROUTER_ALERT 0x05
+#define IP6OPT_TUNNEL_LIMIT 0x04
+#define IP6OPT_TYPE(o) ((o) & 0xc0)
+#define IP6OPT_TYPE_DISCARD 0x40
+#define IP6OPT_TYPE_FORCEICMP 0x80
+#define IP6OPT_TYPE_ICMP 0xc0
+#define IP6OPT_TYPE_MUTABLE 0x20
+#define IP6OPT_TYPE_SKIP 0x00
+#define IP6_ALERT_AN 0x0200
+#define IP6_ALERT_MLD 0x0000
+#define IP6_ALERT_RSVP 0x0100
+#define IPDEFTTL 64
+#define IPFRAGTTL 60
+#define IPOPT_CLASS(o) ((o) & IPOPT_CLASS_MASK)
+#define IPOPT_CLASS_MASK 0x60
+#define IPOPT_CONTROL 0x00
+#define IPOPT_COPIED(o) ((o) & IPOPT_COPY)
+#define IPOPT_COPY 0x80
+#define IPOPT_DEBMEAS 0x40
+#define IPOPT_END IPOPT_EOL
+#define IPOPT_EOL 0
+#define IPOPT_LSRR 131
+#define IPOPT_MEASUREMENT IPOPT_DEBMEAS
+#define IPOPT_MINOFF 4
+#define IPOPT_NOOP IPOPT_NOP
+#define IPOPT_NOP 1
+#define IPOPT_NUMBER(o) ((o) & IPOPT_NUMBER_MASK)
+#define IPOPT_NUMBER_MASK 0x1f
+#define IPOPT_OFFSET 2
+#define IPOPT_OLEN 1
+#define IPOPT_OPTVAL 0
+#define IPOPT_RA 148
+#define IPOPT_RESERVED1 0x20
+#define IPOPT_RESERVED2 0x60
+#define IPOPT_RR 7
+#define IPOPT_SATID 136
+#define IPOPT_SEC IPOPT_SECURITY
+#define IPOPT_SECURITY 130
+#define IPOPT_SECUR_CONFID 0xf135
+#define IPOPT_SECUR_EFTO 0x789a
+#define IPOPT_SECUR_MMMM 0xbc4d
+#define IPOPT_SECUR_RESTR 0xaf13
+#define IPOPT_SECUR_SECRET 0xd788
+#define IPOPT_SECUR_TOPSECRET 0x6bc5
+#define IPOPT_SECUR_UNCLASS 0x0000
+#define IPOPT_SID IPOPT_SATID
+#define IPOPT_SSRR 137
+#define IPOPT_TIMESTAMP IPOPT_TS
+#define IPOPT_TS 68
+#define IPOPT_TS_PRESPEC 3
+#define IPOPT_TS_TSANDADDR 1
+#define IPOPT_TS_TSONLY 0
+#define IPPORT_RESERVED 1024
+#define IPPROTO_ICMP 1
+#define IPPROTO_IP 0
+#define IPPROTO_IPV6 41
+#define IPPROTO_RAW 255
+#define IPPROTO_TCP 6
+#define IPPROTO_UDP 17
+#define IPTOS_CLASS(x) ((x) & IPTOS_CLASS_MASK)
+#define IPTOS_CLASS_CS0 0x00
+#define IPTOS_CLASS_CS1 0x20
+#define IPTOS_CLASS_CS2 0x40
+#define IPTOS_CLASS_CS3 0x60
+#define IPTOS_CLASS_CS4 0x80
+#define IPTOS_CLASS_CS5 0xa0
+#define IPTOS_CLASS_CS6 0xc0
+#define IPTOS_CLASS_CS7 0xe0
+#define IPTOS_CLASS_DEFAULT IPTOS_CLASS_CS0
+#define IPTOS_CLASS_MASK 0xe0
+#define IPTOS_DSCP(x) ((x) & IPTOS_DSCP_MASK)
+#define IPTOS_DSCP_AF11 0x28
+#define IPTOS_DSCP_AF12 0x30
+#define IPTOS_DSCP_AF13 0x38
+#define IPTOS_DSCP_AF21 0x48
+#define IPTOS_DSCP_AF22 0x50
+#define IPTOS_DSCP_AF23 0x58
+#define IPTOS_DSCP_AF31 0x68
+#define IPTOS_DSCP_AF32 0x70
+#define IPTOS_DSCP_AF33 0x78
+#define IPTOS_DSCP_AF41 0x88
+#define IPTOS_DSCP_AF42 0x90
+#define IPTOS_DSCP_AF43 0x98
+#define IPTOS_DSCP_EF 0xb8
+#define IPTOS_DSCP_MASK 0xfc
+#define IPTOS_ECN(x) ((x) & IPTOS_ECN_MASK)
+#define IPTOS_ECN_CE 0x03
+#define IPTOS_ECN_ECT0 0x02
+#define IPTOS_ECN_ECT1 0x01
+#define IPTOS_ECN_MASK 0x03
+#define IPTOS_ECN_NOT_ECT 0x00
+#define IPTOS_LOWCOST 0x02
+#define IPTOS_LOWDELAY 0x10
+#define IPTOS_MINCOST IPTOS_LOWCOST
+#define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK)
+#define IPTOS_PREC_CRITIC_ECP 0xa0
+#define IPTOS_PREC_FLASH 0x60
+#define IPTOS_PREC_FLASHOVERRIDE 0x80
+#define IPTOS_PREC_IMMEDIATE 0x40
+#define IPTOS_PREC_INTERNETCONTROL 0xc0
+#define IPTOS_PREC_MASK 0xe0
+#define IPTOS_PREC_NETCONTROL 0xe0
+#define IPTOS_PREC_PRIORITY 0x20
+#define IPTOS_PREC_ROUTINE 0x00
+#define IPTOS_RELIABILITY 0x04
+#define IPTOS_THROUGHPUT 0x08
+#define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK)
+#define IPTOS_TOS_MASK 0x1E
+#define IPTTLDEC 1
+#define IPV6_2292DSTOPTS 4
+#define IPV6_2292HOPLIMIT 8
+#define IPV6_2292HOPOPTS 3
+#define IPV6_2292PKTINFO 2
+#define IPV6_2292PKTOPTIONS 6
+#define IPV6_2292RTHDR 5
+#define IPV6_ADDRFORM 1
+#define IPV6_ADDR_PREFERENCES 72
+#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
+#define IPV6_AUTHHDR 10
+#define IPV6_AUTOFLOWLABEL 70
+#define IPV6_CHECKSUM 7
+#define IPV6_DONTFRAG 62
+#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
+#define IPV6_DSTOPTS 59
+#define IPV6_FREEBIND 78
+#define IPV6_HDRINCL 36
+#define IPV6_HOPLIMIT 52
+#define IPV6_HOPOPTS 54
+#define IPV6_IPSEC_POLICY 34
+#define IPV6_JOIN_ANYCAST 27
+#define IPV6_JOIN_GROUP 20
+#define IPV6_LEAVE_ANYCAST 28
+#define IPV6_LEAVE_GROUP 21
+#define IPV6_MINHOPCOUNT 73
+#define IPV6_MTU 24
+#define IPV6_MTU_DISCOVER 23
+#define IPV6_MULTICAST_ALL 29
+#define IPV6_MULTICAST_HOPS 18
+#define IPV6_MULTICAST_IF 17
+#define IPV6_MULTICAST_LOOP 19
+#define IPV6_NEXTHOP 9
+#define IPV6_ORIGDSTADDR 74
+#define IPV6_PATHMTU 61
+#define IPV6_PKTINFO 50
+#define IPV6_PMTUDISC_DO 2
+#define IPV6_PMTUDISC_DONT 0
+#define IPV6_PMTUDISC_INTERFACE 4
+#define IPV6_PMTUDISC_OMIT 5
+#define IPV6_PMTUDISC_PROBE 3
+#define IPV6_PMTUDISC_WANT 1
+#define IPV6_PREFER_SRC_CGA 0x0008
+#define IPV6_PREFER_SRC_COA 0x0004
+#define IPV6_PREFER_SRC_HOME 0x0400
+#define IPV6_PREFER_SRC_NONCGA 0x0800
+#define IPV6_PREFER_SRC_PUBLIC 0x0002
+#define IPV6_PREFER_SRC_PUBTMP_DEFAULT 0x0100
+#define IPV6_PREFER_SRC_TMP 0x0001
+#define IPV6_RECVDSTOPTS 58
+#define IPV6_RECVERR 25
+#define IPV6_RECVFRAGSIZE 77
+#define IPV6_RECVHOPLIMIT 51
+#define IPV6_RECVHOPOPTS 53
+#define IPV6_RECVORIGDSTADDR IPV6_ORIGDSTADDR
+#define IPV6_RECVPATHMTU 60
+#define IPV6_RECVPKTINFO 49
+#define IPV6_RECVRTHDR 56
+#define IPV6_RECVTCLASS 66
+#define IPV6_ROUTER_ALERT 22
+#define IPV6_ROUTER_ALERT_ISOLATE 30
+#define IPV6_RTHDR 57
+#define IPV6_RTHDRDSTOPTS 55
+#define IPV6_RTHDR_LOOSE 0
+#define IPV6_RTHDR_STRICT 1
+#define IPV6_RTHDR_TYPE_0 0
+#define IPV6_RXDSTOPTS IPV6_DSTOPTS
+#define IPV6_RXHOPOPTS IPV6_HOPOPTS
+#define IPV6_TCLASS 67
+#define IPV6_TRANSPARENT 75
+#define IPV6_UNICAST_HOPS 16
+#define IPV6_UNICAST_IF 76
+#define IPV6_V6ONLY 26
+#define IPV6_XFRM_POLICY 35
+#define IPVERSION 4
+#define IP_ADD_MEMBERSHIP 35
+#define IP_ADD_SOURCE_MEMBERSHIP 39
+#define IP_BIND_ADDRESS_NO_PORT 24
+#define IP_BLOCK_SOURCE 38
+#define IP_CHECKSUM 23
+#define IP_DEFAULT_MULTICAST_LOOP 1
+#define IP_DEFAULT_MULTICAST_TTL 1
+#define IP_DF 0x4000
+#define IP_DROP_MEMBERSHIP 36
+#define IP_DROP_SOURCE_MEMBERSHIP 40
+#define IP_FREEBIND 15
+#define IP_HDRINCL 3
+#define IP_IPSEC_POLICY 16
+#define IP_MAXPACKET 65535
+#define IP_MAX_MEMBERSHIPS 20
+#define IP_MF 0x2000
+#define IP_MINTTL 21
+#define IP_MSFILTER 41
+#define IP_MSFILTER_SIZE(numsrc) (sizeof(struct ip_msfilter) - sizeof(struct in_addr) + (numsrc) * sizeof(struct in_addr))
+#define IP_MSS 576
+#define IP_MTU 14
+#define IP_MTU_DISCOVER 10
+#define IP_MULTICAST_ALL 49
+#define IP_MULTICAST_IF 32
+#define IP_MULTICAST_LOOP 34
+#define IP_MULTICAST_TTL 33
+#define IP_NODEFRAG 22
+#define IP_OFFMASK 0x1fff
+#define IP_OPTIONS 4
+#define IP_ORIGDSTADDR 20
+#define IP_PASSSEC 18
+#define IP_PKTINFO 8
+#define IP_PKTOPTIONS 9
+#define IP_PMTUDISC 10
+#define IP_PMTUDISC_DO 2
+#define IP_PMTUDISC_DONT 0
+#define IP_PMTUDISC_INTERFACE 4
+#define IP_PMTUDISC_OMIT 5
+#define IP_PMTUDISC_PROBE 3
+#define IP_PMTUDISC_WANT 1
+#define IP_RECVERR 11
+#define IP_RECVERR_RFC4884 26
+#define IP_RECVFRAGSIZE 25
+#define IP_RECVOPTS 6
+#define IP_RECVORIGDSTADDR IP_ORIGDSTADDR
+#define IP_RECVRETOPTS IP_RETOPTS
+#define IP_RECVTOS 13
+#define IP_RECVTTL 12
+#define IP_RETOPTS 7
+#define IP_RF 0x8000
+#define IP_ROUTER_ALERT 5
+#define IP_TOS 1
+#define IP_TRANSPARENT 19
+#define IP_TTL 2
+#define IP_UNBLOCK_SOURCE 37
+#define IP_UNICAST_IF 50
+#define IP_XFRM_POLICY 17
+#define IQUERY ns_o_iquery
+#define I_ATMARK (__SID |31)
+#define I_CANPUT (__SID |34)
+#define I_CKBAND (__SID |29)
+#define I_FDINSERT (__SID |16)
+#define I_FIND (__SID |11)
+#define I_FLUSH (__SID | 5)
+#define I_FLUSHBAND (__SID |28)
+#define I_GETBAND (__SID |30)
+#define I_GETCLTIME (__SID |33)
+#define I_GETSIG (__SID |10)
+#define I_GRDOPT (__SID | 7)
+#define I_GWROPT (__SID |20)
+#define I_LINK (__SID |12)
+#define I_LIST (__SID |21)
+#define I_LOOK (__SID | 4)
+#define I_NREAD (__SID | 1)
+#define I_PEEK (__SID |15)
+#define I_PLINK (__SID |22)
+#define I_POP (__SID | 3)
+#define I_PUNLINK (__SID |23)
+#define I_PUSH (__SID | 2)
+#define I_RECVFD (__SID |14)
+#define I_SENDFD (__SID |17)
+#define I_SETCLTIME (__SID |32)
+#define I_SETSIG (__SID | 9)
+#define I_SRDOPT (__SID | 6)
+#define I_STR (__SID | 8)
+#define I_SWROPT (__SID |19)
+#define I_UNLINK (__SID |13)
+#define LASTMARK 0x02
+#define LC_ALL 6
+#define LC_ALL_MASK 0x7fffffff
+#define LC_COLLATE 3
+#define LC_COLLATE_MASK (1<<LC_COLLATE)
+#define LC_CTYPE 0
+#define LC_CTYPE_MASK (1<<LC_CTYPE)
+#define LC_GLOBAL_LOCALE ((locale_t)-1)
+#define LC_MESSAGES 5
+#define LC_MESSAGES_MASK (1<<LC_MESSAGES)
+#define LC_MONETARY 4
+#define LC_MONETARY_MASK (1<<LC_MONETARY)
+#define LC_NUMERIC 1
+#define LC_NUMERIC_MASK (1<<LC_NUMERIC)
+#define LC_TIME 2
+#define LC_TIME_MASK (1<<LC_TIME)
+#define LDBL_DECIMAL_DIG DECIMAL_DIG
+#define LDBL_DIG 33
+#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L
+#define LDBL_HAS_SUBNORM 1
+#define LDBL_MANT_DIG 113
+#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L
+#define LDBL_MAX_10_EXP 4932
+#define LDBL_MAX_EXP 16384
+#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L
+#define LFLOW_OFF 0
+#define LFLOW_ON 1
+#define LFLOW_RESTART_ANY 2
+#define LFLOW_RESTART_XON 3
+#define LITTLE_ENDIAN __LITTLE_ENDIAN
+#define LLONG_MAX 0x7fffffffffffffffLL
+#define LLONG_MIN (-LLONG_MAX-1)
+#define LM_FORWARDMASK 2
+#define LM_MODE 1
+#define LM_SLC 3
+#define LNKTYPE '1'
+#define LOCK_EX 2
+#define LOCK_NB 4
+#define LOCK_SH 1
+#define LOCK_UN 8
+#define LONGBITS (sizeof(long) * 8)
+#define LONG_BIT 32
+#define LONG_MAX __LONG_MAX
+#define LONG_MIN (-LONG_MAX-1)
+#define L_INCR 1
+#define L_SET 0
+#define L_XTND 2
+#define L_ctermid 20
+#define L_cuserid 20
+#define MAGIC "070707"
+#define MATH_ERREXCEPT 2
+#define MATH_ERRNO 1
+#define MAX(a,b) (((a)>(b))?(a):(b))
+#define MAXCDNAME NS_MAXCDNAME
+#define MAXDNAME NS_MAXDNAME
+#define MAXDOUBLE DBL_MAX
+#define MAXFLOAT FLT_MAX
+#define MAXHOSTNAMELEN 64
+#define MAXINT INT_MAX
+#define MAXLABEL NS_MAXLABEL
+#define MAXLONG LONG_MAX
+#define MAXNAMLEN 255
+#define MAXPATHLEN 4096
+#define MAXSHORT SHRT_MAX
+#define MAXSYMLINKS 20
+#define MAXTC 6
+#define MAXTTL 255
+#define MAX_IPOPTLEN 40
+#define MB_CUR_MAX (__ctype_get_mb_cur_max())
+#define MB_LEN_MAX 4
+#define MCAST_BLOCK_SOURCE 43
+#define MCAST_EXCLUDE 0
+#define MCAST_INCLUDE 1
+#define MCAST_JOIN_GROUP 42
+#define MCAST_JOIN_SOURCE_GROUP 46
+#define MCAST_LEAVE_GROUP 45
+#define MCAST_LEAVE_SOURCE_GROUP 47
+#define MCAST_MSFILTER 48
+#define MCAST_UNBLOCK_SOURCE 44
+#define MIN(a,b) (((a)<(b))?(a):(b))
+#define MINDOUBLE DBL_MIN
+#define MINFLOAT FLT_MIN
+#define MININT INT_MIN
+#define MINLONG LONG_MIN
+#define MINSHORT SHRT_MIN
+#define MLD_LISTENER_QUERY 130
+#define MLD_LISTENER_REDUCTION 132
+#define MLD_LISTENER_REPORT 131
+#define MM_APPL 8
+#define MM_CONSOLE 512
+#define MM_ERROR 2
+#define MM_FIRM 4
+#define MM_HALT 1
+#define MM_HARD 1
+#define MM_INFO 4
+#define MM_NOCON 4
+#define MM_NOMSG 1
+#define MM_NOSEV 0
+#define MM_NOTOK (-1)
+#define MM_NRECOV 128
+#define MM_NULLACT ((char*)0)
+#define MM_NULLLBL ((char*)0)
+#define MM_NULLMC 0L
+#define MM_NULLSEV 0
+#define MM_NULLTAG ((char*)0)
+#define MM_NULLTXT ((char*)0)
+#define MM_OK 0
+#define MM_OPSYS 32
+#define MM_PRINT 256
+#define MM_RECOVER 64
+#define MM_SOFT 2
+#define MM_UTIL 16
+#define MM_WARNING 3
+#define MODE_ACK 0x04
+#define MODE_B 2
+#define MODE_C 3
+#define MODE_ECHO 0x0200
+#define MODE_EDIT 0x01
+#define MODE_FLOW 0x0100
+#define MODE_FORCE 0x1000
+#define MODE_INBIN 0x0400
+#define MODE_LIT_ECHO 0x10
+#define MODE_MASK 0x1f
+#define MODE_OUTBIN 0x0800
+#define MODE_S 1
+#define MODE_SOFT_TAB 0x08
+#define MODE_TRAPSIG 0x02
+#define MOD_CLKA ADJ_OFFSET_SINGLESHOT
+#define MOD_CLKB ADJ_TICK
+#define MOD_ESTERROR ADJ_ESTERROR
+#define MOD_FREQUENCY ADJ_FREQUENCY
+#define MOD_MAXERROR ADJ_MAXERROR
+#define MOD_MICRO ADJ_MICRO
+#define MOD_NANO ADJ_NANO
+#define MOD_OFFSET ADJ_OFFSET
+#define MOD_STATUS ADJ_STATUS
+#define MOD_TAI ADJ_TAI
+#define MOD_TIMECONST ADJ_TIMECONST
+#define MON_1 0x2001A
+#define MON_10 0x20023
+#define MON_11 0x20024
+#define MON_12 0x20025
+#define MON_2 0x2001B
+#define MON_3 0x2001C
+#define MON_4 0x2001D
+#define MON_5 0x2001E
+#define MON_6 0x2001F
+#define MON_7 0x20020
+#define MON_8 0x20021
+#define MON_9 0x20022
+#define MORECTL 1
+#define MOREDATA 2
+#define MSG_ANY 0x02
+#define MSG_BAND 0x04
+#define MSG_HIPRI 0x01
+#define MSG_PEEK __WASI_RIFLAGS_RECV_PEEK
+#define MSG_TRUNC __WASI_RIFLAGS_RECV_DATA_TRUNCATED
+#define MSG_WAITALL __WASI_RIFLAGS_RECV_WAITALL
+#define MUXID_ALL (-1)
+#define M_1_PI 0.31830988618379067154
+#define M_2_PI 0.63661977236758134308
+#define M_2_SQRTPI 1.12837916709551257390
+#define M_E 2.7182818284590452354
+#define M_LN10 2.30258509299404568402
+#define M_LN2 0.69314718055994530942
+#define M_LOG10E 0.43429448190325182765
+#define M_LOG2E 1.4426950408889634074
+#define M_PI 3.14159265358979323846
+#define M_PI_2 1.57079632679489661923
+#define M_PI_4 0.78539816339744830962
+#define M_SQRT1_2 0.70710678118654752440
+#define M_SQRT2 1.41421356237309504880
+#define NAMESERVER_PORT NS_DEFAULTPORT
+#define NAME_MAX 255
+#define NAN (0.0f/0.0f)
+#define NBBY 8
+#define NCARGS 131072
+#define NDEBUG 1
+#define ND_NA_FLAG_OVERRIDE 0x00000020
+#define ND_NA_FLAG_ROUTER 0x00000080
+#define ND_NA_FLAG_SOLICITED 0x00000040
+#define ND_NEIGHBOR_ADVERT 136
+#define ND_NEIGHBOR_SOLICIT 135
+#define ND_OPT_HOME_AGENT_INFO 8
+#define ND_OPT_MTU 5
+#define ND_OPT_PI_FLAG_AUTO 0x40
+#define ND_OPT_PI_FLAG_ONLINK 0x80
+#define ND_OPT_PI_FLAG_RADDR 0x20
+#define ND_OPT_PREFIX_INFORMATION 3
+#define ND_OPT_REDIRECTED_HEADER 4
+#define ND_OPT_RTR_ADV_INTERVAL 7
+#define ND_OPT_SOURCE_LINKADDR 1
+#define ND_OPT_TARGET_LINKADDR 2
+#define ND_RA_FLAG_HOME_AGENT 0x20
+#define ND_RA_FLAG_MANAGED 0x80
+#define ND_RA_FLAG_OTHER 0x40
+#define ND_REDIRECT 137
+#define ND_ROUTER_ADVERT 134
+#define ND_ROUTER_SOLICIT 133
+#define NEW_ENV_VALUE 1
+#define NEW_ENV_VAR 0
+#define NGROUPS 32
+#define NGROUPS_MAX 32
+#define NL_ARGMAX 9
+#define NL_CAT_LOCALE 1
+#define NL_LANGMAX 32
+#define NL_LOCALE_NAME(cat) _NL_LOCALE_NAME(cat)
+#define NL_MSGMAX 32767
+#define NL_NMAX 16
+#define NL_SETD 1
+#define NL_SETMAX 255
+#define NL_TEXTMAX 2048
+#define NOERROR ns_r_noerror
+#define NOEXPR 0x50001
+#define NOFILE 256
+#define NOGROUP (-1)
+#define NOP 241
+#define NOSTR 0x50003
+#define NOTAUTH ns_r_notauth
+#define NOTIMP ns_r_notimpl
+#define NOTZONE ns_r_notzone
+#define NR_ICMP_TYPES 18
+#define NR_ICMP_UNREACH 15
+#define NSLC 18
+#define NS_ALG_DH 2
+#define NS_ALG_DSA 3
+#define NS_ALG_DSS NS_ALG_DSA
+#define NS_ALG_EXPIRE_ONLY 253
+#define NS_ALG_MD5RSA 1
+#define NS_ALG_PRIVATE_OID 254
+#define NS_CMPRSFLGS 0xc0
+#define NS_DEFAULTPORT 53
+#define NS_DSA_MAX_BYTES 405
+#define NS_DSA_MIN_SIZE 213
+#define NS_DSA_SIG_SIZE 41
+#define NS_GET16(s,cp) (void)((s) = ns_get16(((cp)+=2)-2))
+#define NS_GET32(l,cp) (void)((l) = ns_get32(((cp)+=4)-4))
+#define NS_HFIXEDSZ 12
+#define NS_IN6ADDRSZ 16
+#define NS_INADDRSZ 4
+#define NS_INT16SZ 2
+#define NS_INT32SZ 4
+#define NS_INT8SZ 1
+#define NS_KEY_EXTENDED_FLAGS 0x1000
+#define NS_KEY_NAME_ENTITY 0x0200
+#define NS_KEY_NAME_RESERVED 0x0300
+#define NS_KEY_NAME_TYPE 0x0300
+#define NS_KEY_NAME_USER 0x0000
+#define NS_KEY_NAME_ZONE 0x0100
+#define NS_KEY_NO_AUTH 0x8000
+#define NS_KEY_NO_CONF 0x4000
+#define NS_KEY_PROT_ANY 255
+#define NS_KEY_PROT_DNSSEC 3
+#define NS_KEY_PROT_EMAIL 2
+#define NS_KEY_PROT_IPSEC 4
+#define NS_KEY_PROT_TLS 1
+#define NS_KEY_RESERVED10 0x0020
+#define NS_KEY_RESERVED11 0x0010
+#define NS_KEY_RESERVED2 0x2000
+#define NS_KEY_RESERVED4 0x0800
+#define NS_KEY_RESERVED5 0x0400
+#define NS_KEY_RESERVED8 0x0080
+#define NS_KEY_RESERVED9 0x0040
+#define NS_KEY_RESERVED_BITMASK ( NS_KEY_RESERVED2 | NS_KEY_RESERVED4 | NS_KEY_RESERVED5 | NS_KEY_RESERVED8 | NS_KEY_RESERVED9 | NS_KEY_RESERVED10 | NS_KEY_RESERVED11 )
+#define NS_KEY_RESERVED_BITMASK2 0xFFFF
+#define NS_KEY_SIGNATORYMASK 0x000F
+#define NS_KEY_TYPEMASK 0xC000
+#define NS_KEY_TYPE_AUTH_CONF 0x0000
+#define NS_KEY_TYPE_AUTH_ONLY 0x4000
+#define NS_KEY_TYPE_CONF_ONLY 0x8000
+#define NS_KEY_TYPE_NO_KEY 0xC000
+#define NS_MAXCDNAME 255
+#define NS_MAXDNAME 1025
+#define NS_MAXLABEL 63
+#define NS_MAXMSG 65535
+#define NS_MD5RSA_MAX_BASE64 (((NS_MD5RSA_MAX_BYTES+2)/3)*4)
+#define NS_MD5RSA_MAX_BITS 4096
+#define NS_MD5RSA_MAX_BYTES ((NS_MD5RSA_MAX_BITS+7/8)*2+3)
+#define NS_MD5RSA_MAX_SIZE ((NS_MD5RSA_MAX_BITS+7)/8)
+#define NS_MD5RSA_MIN_BITS 512
+#define NS_MD5RSA_MIN_SIZE ((NS_MD5RSA_MIN_BITS+7)/8)
+#define NS_NOTIFY_OP ns_o_notify
+#define NS_NXT_BITS 8
+#define NS_NXT_BIT_CLEAR(n,p) (p[(n)/NS_NXT_BITS] &= ~(0x80>>((n)%NS_NXT_BITS)))
+#define NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] & (0x80>>((n)%NS_NXT_BITS)))
+#define NS_NXT_BIT_SET(n,p) (p[(n)/NS_NXT_BITS] |= (0x80>>((n)%NS_NXT_BITS)))
+#define NS_NXT_MAX 127
+#define NS_OPT_DNSSEC_OK 0x8000U
+#define NS_OPT_NSID 3
+#define NS_PACKETSZ 512
+#define NS_PUT16(s,cp) ns_put16((s), ((cp)+=2)-2)
+#define NS_PUT32(l,cp) ns_put32((l), ((cp)+=4)-4)
+#define NS_QFIXEDSZ 4
+#define NS_RRFIXEDSZ 10
+#define NS_SIG_ALG 2
+#define NS_SIG_EXPIR 8
+#define NS_SIG_FOOT 16
+#define NS_SIG_LABELS 3
+#define NS_SIG_OTTL 4
+#define NS_SIG_SIGNED 12
+#define NS_SIG_SIGNER 18
+#define NS_SIG_TYPE 0
+#define NS_TSIG_ALG_HMAC_MD5 "HMAC-MD5.SIG-ALG.REG.INT"
+#define NS_TSIG_ERROR_FORMERR -12
+#define NS_TSIG_ERROR_NO_SPACE -11
+#define NS_TSIG_ERROR_NO_TSIG -10
+#define NS_TSIG_FUDGE 300
+#define NS_TSIG_TCP_COUNT 100
+#define NS_UPDATE_OP ns_o_update
+#define NTELOPTS (1+TELOPT_NEW_ENVIRON)
+#define NULL ((void*)0)
+#define NXDOMAIN ns_r_nxdomain
+#define NXRRSET ns_r_nxrrset
+#define NZERO 20
+#define OLD_ENV_VALUE 0
+#define OLD_ENV_VAR 1
+#define ONCE_FLAG_INIT 0
+#define O_ACCMODE (O_EXEC | O_RDWR | O_SEARCH)
+#define O_APPEND __WASI_FDFLAGS_APPEND
+#define O_CLOEXEC (0)
+#define O_CREAT (__WASI_OFLAGS_CREAT << 12)
+#define O_DIRECTORY (__WASI_OFLAGS_DIRECTORY << 12)
+#define O_DSYNC __WASI_FDFLAGS_DSYNC
+#define O_EXCL (__WASI_OFLAGS_EXCL << 12)
+#define O_EXEC (0x02000000)
+#define O_NOCTTY (0)
+#define O_NOFOLLOW (0x01000000)
+#define O_NONBLOCK __WASI_FDFLAGS_NONBLOCK
+#define O_RDONLY (0x04000000)
+#define O_RDWR (O_RDONLY | O_WRONLY)
+#define O_RSYNC __WASI_FDFLAGS_RSYNC
+#define O_SEARCH (0x08000000)
+#define O_SYNC __WASI_FDFLAGS_SYNC
+#define O_TRUNC (__WASI_OFLAGS_TRUNC << 12)
+#define O_TTY_INIT (0)
+#define O_WRONLY (0x10000000)
+#define PACKETSZ NS_PACKETSZ
+#define PACKET_ADD_MEMBERSHIP 1
+#define PACKET_AUXDATA 8
+#define PACKET_BROADCAST 1
+#define PACKET_COPY_THRESH 7
+#define PACKET_DROP_MEMBERSHIP 2
+#define PACKET_FANOUT 18
+#define PACKET_FANOUT_DATA 22
+#define PACKET_FASTROUTE 6
+#define PACKET_HDRLEN 11
+#define PACKET_HOST 0
+#define PACKET_IGNORE_OUTGOING 23
+#define PACKET_LOOPBACK 5
+#define PACKET_LOSS 14
+#define PACKET_MR_ALLMULTI 2
+#define PACKET_MR_MULTICAST 0
+#define PACKET_MR_PROMISC 1
+#define PACKET_MR_UNICAST 3
+#define PACKET_MULTICAST 2
+#define PACKET_ORIGDEV 9
+#define PACKET_OTHERHOST 3
+#define PACKET_OUTGOING 4
+#define PACKET_QDISC_BYPASS 20
+#define PACKET_RECV_OUTPUT 3
+#define PACKET_RESERVE 12
+#define PACKET_ROLLOVER_STATS 21
+#define PACKET_RX_RING 5
+#define PACKET_STATISTICS 6
+#define PACKET_TIMESTAMP 17
+#define PACKET_TX_HAS_OFF 19
+#define PACKET_TX_RING 13
+#define PACKET_TX_TIMESTAMP 16
+#define PACKET_VERSION 10
+#define PACKET_VNET_HDR 15
+#define PAGESIZE (0x10000)
+#define PAGE_SIZE PAGESIZE
+#define PATH_MAX 4096
+#define PDP_ENDIAN __PDP_ENDIAN
+#define PM_STR 0x20027
+#define POLLERR 0x1000
+#define POLLHUP 0x2000
+#define POLLIN POLLRDNORM
+#define POLLNVAL 0x4000
+#define POLLOUT POLLWRNORM
+#define POLLRDNORM 0x1
+#define POLLWRNORM 0x2
+#define POSIX_CLOSE_RESTART 0
+#define POSIX_FADV_DONTNEED __WASI_ADVICE_DONTNEED
+#define POSIX_FADV_NOREUSE __WASI_ADVICE_NOREUSE
+#define POSIX_FADV_NORMAL __WASI_ADVICE_NORMAL
+#define POSIX_FADV_RANDOM __WASI_ADVICE_RANDOM
+#define POSIX_FADV_SEQUENTIAL __WASI_ADVICE_SEQUENTIAL
+#define POSIX_FADV_WILLNEED __WASI_ADVICE_WILLNEED
+#define PRELIM 1
+#define PRIX16 __UINT16_FMTX__
+#define PRIX32 __UINT32_FMTX__
+#define PRIX64 __UINT64_FMTX__
+#define PRIX8 __UINT8_FMTX__
+#define PRIXFAST16 __UINT_FAST16_FMTX__
+#define PRIXFAST32 __UINT_FAST32_FMTX__
+#define PRIXFAST64 __UINT_FAST64_FMTX__
+#define PRIXFAST8 __UINT_FAST8_FMTX__
+#define PRIXLEAST16 __UINT_LEAST16_FMTX__
+#define PRIXLEAST32 __UINT_LEAST32_FMTX__
+#define PRIXLEAST64 __UINT_LEAST64_FMTX__
+#define PRIXLEAST8 __UINT_LEAST8_FMTX__
+#define PRIXMAX __UINTMAX_FMTX__
+#define PRIXPTR __UINTPTR_FMTX__
+#define PRId16 __INT16_FMTd__
+#define PRId32 __INT32_FMTd__
+#define PRId64 __INT64_FMTd__
+#define PRId8 __INT8_FMTd__
+#define PRIdFAST16 __INT_FAST16_FMTd__
+#define PRIdFAST32 __INT_FAST32_FMTd__
+#define PRIdFAST64 __INT_FAST64_FMTd__
+#define PRIdFAST8 __INT_FAST8_FMTd__
+#define PRIdLEAST16 __INT_LEAST16_FMTd__
+#define PRIdLEAST32 __INT_LEAST32_FMTd__
+#define PRIdLEAST64 __INT_LEAST64_FMTd__
+#define PRIdLEAST8 __INT_LEAST8_FMTd__
+#define PRIdMAX __INTMAX_FMTd__
+#define PRIdPTR __INTPTR_FMTd__
+#define PRIi16 __INT16_FMTi__
+#define PRIi32 __INT32_FMTi__
+#define PRIi64 __INT64_FMTi__
+#define PRIi8 __INT8_FMTi__
+#define PRIiFAST16 __INT_FAST16_FMTi__
+#define PRIiFAST32 __INT_FAST32_FMTi__
+#define PRIiFAST64 __INT_FAST64_FMTi__
+#define PRIiFAST8 __INT_FAST8_FMTi__
+#define PRIiLEAST16 __INT_LEAST16_FMTi__
+#define PRIiLEAST32 __INT_LEAST32_FMTi__
+#define PRIiLEAST64 __INT_LEAST64_FMTi__
+#define PRIiLEAST8 __INT_LEAST8_FMTi__
+#define PRIiMAX __INTMAX_FMTi__
+#define PRIiPTR __INTPTR_FMTi__
+#define PRIo16 __UINT16_FMTo__
+#define PRIo32 __UINT32_FMTo__
+#define PRIo64 __UINT64_FMTo__
+#define PRIo8 __UINT8_FMTo__
+#define PRIoFAST16 __UINT_FAST16_FMTo__
+#define PRIoFAST32 __UINT_FAST32_FMTo__
+#define PRIoFAST64 __UINT_FAST64_FMTo__
+#define PRIoFAST8 __UINT_FAST8_FMTo__
+#define PRIoLEAST16 __UINT_LEAST16_FMTo__
+#define PRIoLEAST32 __UINT_LEAST32_FMTo__
+#define PRIoLEAST64 __UINT_LEAST64_FMTo__
+#define PRIoLEAST8 __UINT_LEAST8_FMTo__
+#define PRIoMAX __UINTMAX_FMTo__
+#define PRIoPTR __UINTPTR_FMTo__
+#define PRIu16 __UINT16_FMTu__
+#define PRIu32 __UINT32_FMTu__
+#define PRIu64 __UINT64_FMTu__
+#define PRIu8 __UINT8_FMTu__
+#define PRIuFAST16 __UINT_FAST16_FMTu__
+#define PRIuFAST32 __UINT_FAST32_FMTu__
+#define PRIuFAST64 __UINT_FAST64_FMTu__
+#define PRIuFAST8 __UINT_FAST8_FMTu__
+#define PRIuLEAST16 __UINT_LEAST16_FMTu__
+#define PRIuLEAST32 __UINT_LEAST32_FMTu__
+#define PRIuLEAST64 __UINT_LEAST64_FMTu__
+#define PRIuLEAST8 __UINT_LEAST8_FMTu__
+#define PRIuMAX __UINTMAX_FMTu__
+#define PRIuPTR __UINTPTR_FMTu__
+#define PRIx16 __UINT16_FMTx__
+#define PRIx32 __UINT32_FMTx__
+#define PRIx64 __UINT64_FMTx__
+#define PRIx8 __UINT8_FMTx__
+#define PRIxFAST16 __UINT_FAST16_FMTx__
+#define PRIxFAST32 __UINT_FAST32_FMTx__
+#define PRIxFAST64 __UINT_FAST64_FMTx__
+#define PRIxFAST8 __UINT_FAST8_FMTx__
+#define PRIxLEAST16 __UINT_LEAST16_FMTx__
+#define PRIxLEAST32 __UINT_LEAST32_FMTx__
+#define PRIxLEAST64 __UINT_LEAST64_FMTx__
+#define PRIxLEAST8 __UINT_LEAST8_FMTx__
+#define PRIxMAX __UINTMAX_FMTx__
+#define PRIxPTR __UINTPTR_FMTx__
+#define PTHREAD_BARRIER_SERIAL_THREAD (-1)
+#define PTHREAD_CANCELED ((void *)-1)
+#define PTHREAD_CANCEL_ASYNCHRONOUS 1
+#define PTHREAD_CANCEL_DEFERRED 0
+#define PTHREAD_CANCEL_DISABLE 1
+#define PTHREAD_CANCEL_ENABLE 0
+#define PTHREAD_CANCEL_MASKED 2
+#define PTHREAD_COND_INITIALIZER {{{0}}}
+#define PTHREAD_CREATE_DETACHED 1
+#define PTHREAD_CREATE_JOINABLE 0
+#define PTHREAD_DESTRUCTOR_ITERATIONS 4
+#define PTHREAD_EXPLICIT_SCHED 1
+#define PTHREAD_INHERIT_SCHED 0
+#define PTHREAD_KEYS_MAX 128
+#define PTHREAD_MUTEX_DEFAULT 0
+#define PTHREAD_MUTEX_ERRORCHECK 2
+#define PTHREAD_MUTEX_INITIALIZER {{{0}}}
+#define PTHREAD_MUTEX_NORMAL 0
+#define PTHREAD_MUTEX_RECURSIVE 1
+#define PTHREAD_MUTEX_ROBUST 1
+#define PTHREAD_MUTEX_STALLED 0
+#define PTHREAD_NULL ((pthread_t)0)
+#define PTHREAD_ONCE_INIT 0
+#define PTHREAD_PRIO_INHERIT 1
+#define PTHREAD_PRIO_NONE 0
+#define PTHREAD_PRIO_PROTECT 2
+#define PTHREAD_PROCESS_PRIVATE 0
+#define PTHREAD_PROCESS_SHARED 1
+#define PTHREAD_RWLOCK_INITIALIZER {{{0}}}
+#define PTHREAD_SCOPE_PROCESS 1
+#define PTHREAD_SCOPE_SYSTEM 0
+#define PTHREAD_STACK_MIN 2048
+#define PTRBITS (sizeof(char *) * 8)
+#define PTRDIFF_MAX INT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PUTLONG NS_PUT32
+#define PUTSHORT NS_PUT16
+#define QFIXEDSZ NS_QFIXEDSZ
+#define QUERY ns_o_query
+#define RADIXCHAR 0x10000
+#define RAND_MAX (0x7fffffff)
+#define REC_EOF '\002'
+#define REC_EOR '\001'
+#define REC_ESC '\377'
+#define REFUSED ns_r_refused
+#define REGTYPE '0'
+#define REG_BADBR 10
+#define REG_BADPAT 2
+#define REG_BADRPT 13
+#define REG_EBRACE 9
+#define REG_EBRACK 7
+#define REG_ECOLLATE 3
+#define REG_ECTYPE 4
+#define REG_EESCAPE 5
+#define REG_ENOSYS -1
+#define REG_EPAREN 8
+#define REG_ERANGE 11
+#define REG_ESPACE 12
+#define REG_ESUBREG 6
+#define REG_EXTENDED 1
+#define REG_ICASE 2
+#define REG_NEWLINE 4
+#define REG_NOMATCH 1
+#define REG_NOSUB 8
+#define REG_NOTBOL 1
+#define REG_NOTEOL 2
+#define REG_OK 0
+#define RE_DUP_MAX 255
+#define RMSGD 0x0001
+#define RMSGN 0x0002
+#define RNORM 0x0000
+#define RPM_PCO_ADD 1
+#define RPM_PCO_CHANGE 2
+#define RPM_PCO_SETGLOBAL 3
+#define RPROTDAT 0x0004
+#define RPROTDIS 0x0008
+#define RPROTMASK 0x001C
+#define RPROTNORM 0x0010
+#define RRFIXEDSZ NS_RRFIXEDSZ
+#define RRQ 01
+#define RS_HIPRI 0x01
+#define RUSAGE_CHILDREN 2
+#define RUSAGE_SELF 1
+#define R_OK (4)
+#define SARMAG 8
+#define SB 250
+#define SCHAR_MAX 127
+#define SCHAR_MIN (-128)
+#define SCNd16 __INT16_FMTd__
+#define SCNd32 __INT32_FMTd__
+#define SCNd64 __INT64_FMTd__
+#define SCNd8 __INT8_FMTd__
+#define SCNdFAST16 __INT_FAST16_FMTd__
+#define SCNdFAST32 __INT_FAST32_FMTd__
+#define SCNdFAST64 __INT_FAST64_FMTd__
+#define SCNdFAST8 __INT_FAST8_FMTd__
+#define SCNdLEAST16 __INT_LEAST16_FMTd__
+#define SCNdLEAST32 __INT_LEAST32_FMTd__
+#define SCNdLEAST64 __INT_LEAST64_FMTd__
+#define SCNdLEAST8 __INT_LEAST8_FMTd__
+#define SCNdMAX __INTMAX_FMTd__
+#define SCNdPTR __INTPTR_FMTd__
+#define SCNi16 __INT16_FMTi__
+#define SCNi32 __INT32_FMTi__
+#define SCNi64 __INT64_FMTi__
+#define SCNi8 __INT8_FMTi__
+#define SCNiFAST16 __INT_FAST16_FMTi__
+#define SCNiFAST32 __INT_FAST32_FMTi__
+#define SCNiFAST64 __INT_FAST64_FMTi__
+#define SCNiFAST8 __INT_FAST8_FMTi__
+#define SCNiLEAST16 __INT_LEAST16_FMTi__
+#define SCNiLEAST32 __INT_LEAST32_FMTi__
+#define SCNiLEAST64 __INT_LEAST64_FMTi__
+#define SCNiLEAST8 __INT_LEAST8_FMTi__
+#define SCNiMAX __INTMAX_FMTi__
+#define SCNiPTR __INTPTR_FMTi__
+#define SCNo16 __UINT16_FMTo__
+#define SCNo32 __UINT32_FMTo__
+#define SCNo64 __UINT64_FMTo__
+#define SCNo8 __UINT8_FMTo__
+#define SCNoFAST16 __UINT_FAST16_FMTo__
+#define SCNoFAST32 __UINT_FAST32_FMTo__
+#define SCNoFAST64 __UINT_FAST64_FMTo__
+#define SCNoFAST8 __UINT_FAST8_FMTo__
+#define SCNoLEAST16 __UINT_LEAST16_FMTo__
+#define SCNoLEAST32 __UINT_LEAST32_FMTo__
+#define SCNoLEAST64 __UINT_LEAST64_FMTo__
+#define SCNoLEAST8 __UINT_LEAST8_FMTo__
+#define SCNoMAX __UINTMAX_FMTo__
+#define SCNoPTR __UINTPTR_FMTo__
+#define SCNu16 __UINT16_FMTu__
+#define SCNu32 __UINT32_FMTu__
+#define SCNu64 __UINT64_FMTu__
+#define SCNu8 __UINT8_FMTu__
+#define SCNuFAST16 __UINT_FAST16_FMTu__
+#define SCNuFAST32 __UINT_FAST32_FMTu__
+#define SCNuFAST64 __UINT_FAST64_FMTu__
+#define SCNuFAST8 __UINT_FAST8_FMTu__
+#define SCNuLEAST16 __UINT_LEAST16_FMTu__
+#define SCNuLEAST32 __UINT_LEAST32_FMTu__
+#define SCNuLEAST64 __UINT_LEAST64_FMTu__
+#define SCNuLEAST8 __UINT_LEAST8_FMTu__
+#define SCNuMAX __UINTMAX_FMTu__
+#define SCNuPTR __UINTPTR_FMTu__
+#define SCNx16 __UINT16_FMTx__
+#define SCNx32 __UINT32_FMTx__
+#define SCNx64 __UINT64_FMTx__
+#define SCNx8 __UINT8_FMTx__
+#define SCNxFAST16 __UINT_FAST16_FMTx__
+#define SCNxFAST32 __UINT_FAST32_FMTx__
+#define SCNxFAST64 __UINT_FAST64_FMTx__
+#define SCNxFAST8 __UINT_FAST8_FMTx__
+#define SCNxLEAST16 __UINT_LEAST16_FMTx__
+#define SCNxLEAST32 __UINT_LEAST32_FMTx__
+#define SCNxLEAST64 __UINT_LEAST64_FMTx__
+#define SCNxLEAST8 __UINT_LEAST8_FMTx__
+#define SCNxMAX __UINTMAX_FMTx__
+#define SCNxPTR __UINTPTR_FMTx__
+#define SE 240
+#define SEEK_CUR __WASI_WHENCE_CUR
+#define SEEK_END __WASI_WHENCE_END
+#define SEEK_SET __WASI_WHENCE_SET
+#define SEGSIZE 512
+#define SEM_FAILED ((sem_t *)0)
+#define SEM_NSEMS_MAX 256
+#define SEM_VALUE_MAX 0x7fffffff
+#define SERVFAIL ns_r_servfail
+#define SHORTBITS (sizeof(short) * 8)
+#define SHRT_MAX 0x7fff
+#define SHRT_MIN (-1-0x7fff)
+#define SHUT_RD __WASI_SDFLAGS_RD
+#define SHUT_RDWR (SHUT_RD | SHUT_WR)
+#define SHUT_WR __WASI_SDFLAGS_WR
+#define SIG_ATOMIC_MAX INT32_MAX
+#define SIG_ATOMIC_MIN INT32_MIN
+#define SIZE_MAX UINT32_MAX
+#define SI_LOAD_SHIFT 16
+#define SLC_ABORT 7
+#define SLC_ACK 0x80
+#define SLC_AO 4
+#define SLC_AYT 5
+#define SLC_BRK 2
+#define SLC_CANTCHANGE 1
+#define SLC_DEFAULT 3
+#define SLC_EC 10
+#define SLC_EL 11
+#define SLC_EOF 8
+#define SLC_EOR 6
+#define SLC_EW 12
+#define SLC_FLAGS 1
+#define SLC_FLUSHIN 0x40
+#define SLC_FLUSHOUT 0x20
+#define SLC_FORW1 17
+#define SLC_FORW2 18
+#define SLC_FUNC 0
+#define SLC_IP 3
+#define SLC_LEVELBITS 0x03
+#define SLC_LNEXT 14
+#define SLC_NAME(x) slc_names[x]
+#define SLC_NAMELIST "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", "LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0,
+#define SLC_NAMES SLC_NAMELIST
+#define SLC_NAME_OK(x) ((unsigned int)(x) <= NSLC)
+#define SLC_NOSUPPORT 0
+#define SLC_RP 13
+#define SLC_SUSP 9
+#define SLC_SYNCH 1
+#define SLC_VALUE 2
+#define SLC_VARIABLE 2
+#define SLC_XOFF 16
+#define SLC_XON 15
+#define SNDPIPE 0x002
+#define SNDZERO 0x001
+#define SOCK_CLOEXEC (0x00002000)
+#define SOCK_DGRAM __WASI_FILETYPE_SOCKET_DGRAM
+#define SOCK_NONBLOCK (0x00004000)
+#define SOCK_STREAM __WASI_FILETYPE_SOCKET_STREAM
+#define SOL_SOCKET 0x7fffffff
+#define SOL_TCP 6
+#define SOL_UDP 17
+#define SO_TYPE 3
+#define SSIZE_MAX LONG_MAX
+#define STATUS ns_o_status
+#define STA_CLK 0x8000
+#define STA_CLOCKERR 0x1000
+#define STA_DEL 0x0020
+#define STA_FLL 0x0008
+#define STA_FREQHOLD 0x0080
+#define STA_INS 0x0010
+#define STA_MODE 0x4000
+#define STA_NANO 0x2000
+#define STA_PLL 0x0001
+#define STA_PPSERROR 0x0800
+#define STA_PPSFREQ 0x0002
+#define STA_PPSJITTER 0x0200
+#define STA_PPSSIGNAL 0x0100
+#define STA_PPSTIME 0x0004
+#define STA_PPSWANDER 0x0400
+#define STA_RONLY (STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR | STA_CLOCKERR | STA_NANO | STA_MODE | STA_CLK)
+#define STA_UNSYNC 0x0040
+#define STDERR_FILENO 2
+#define STDIN_FILENO 0
+#define STDOUT_FILENO 1
+#define STRU_F 1
+#define STRU_P 3
+#define STRU_R 2
+#define SUN_LEN(s) (2+strlen((s)->sun_path))
+#define SUSP 237
+#define SYMLOOP_MAX 40
+#define SYMTYPE '2'
+#define SYNCH 242
+#define S_ADDT ns_s_ar
+#define S_BANDURG 0x0200
+#define S_ERROR 0x0010
+#define S_HANGUP 0x0020
+#define S_HIPRI 0x0002
+#define S_IEXEC S_IXUSR
+#define S_IFBLK (0x6000)
+#define S_IFCHR (0x2000)
+#define S_IFDIR (0x4000)
+#define S_IFIFO (0xc000)
+#define S_IFLNK (0xa000)
+#define S_IFMT (S_IFBLK | S_IFCHR | S_IFDIR | S_IFIFO | S_IFLNK | S_IFREG | S_IFSOCK)
+#define S_IFREG (0x8000)
+#define S_IFSOCK (0xc000)
+#define S_INPUT 0x0001
+#define S_IREAD S_IRUSR
+#define S_IRGRP (0x20)
+#define S_IROTH (0x4)
+#define S_IRUSR (0x100)
+#define S_IRWXG (S_IXGRP | S_IWGRP | S_IRGRP)
+#define S_IRWXO (S_IXOTH | S_IWOTH | S_IROTH)
+#define S_IRWXU (S_IXUSR | S_IWUSR | S_IRUSR)
+#define S_ISBLK(m) (((m)&S_IFMT) == S_IFBLK)
+#define S_ISCHR(m) (((m)&S_IFMT) == S_IFCHR)
+#define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR)
+#define S_ISFIFO(m) (((m)&S_IFMT) == S_IFIFO)
+#define S_ISGID (0x400)
+#define S_ISLNK(m) (((m)&S_IFMT) == S_IFLNK)
+#define S_ISREG(m) (((m)&S_IFMT) == S_IFREG)
+#define S_ISSOCK(m) (((m)&S_IFMT) == S_IFSOCK)
+#define S_ISUID (0x800)
+#define S_ISVTX (0x200)
+#define S_IWGRP (0x10)
+#define S_IWOTH (0x2)
+#define S_IWRITE S_IWUSR
+#define S_IWUSR (0x80)
+#define S_IXGRP (0x8)
+#define S_IXOTH (0x1)
+#define S_IXUSR (0x40)
+#define S_MSG 0x0008
+#define S_OUTPUT 0x0004
+#define S_PREREQ ns_s_pr
+#define S_RDBAND 0x0080
+#define S_RDNORM 0x0040
+#define S_UPDATE ns_s_ud
+#define S_WRBAND 0x0100
+#define S_WRNORM S_OUTPUT
+#define S_ZONE ns_s_zn
+#define TCPI_OPT_ECN 8
+#define TCPI_OPT_SACK 2
+#define TCPI_OPT_TIMESTAMPS 1
+#define TCPI_OPT_WSCALE 4
+#define TCPOLEN_MAXSEG 4
+#define TCPOLEN_SACK_PERMITTED 2
+#define TCPOLEN_TIMESTAMP 10
+#define TCPOLEN_WINDOW 3
+#define TCPOPT_EOL 0
+#define TCPOPT_MAXSEG 2
+#define TCPOPT_NOP 1
+#define TCPOPT_SACK 5
+#define TCPOPT_SACK_PERMITTED 4
+#define TCPOPT_TIMESTAMP 8
+#define TCPOPT_WINDOW 3
+#define TCP_CA_CWR 2
+#define TCP_CA_Disorder 1
+#define TCP_CA_Loss 4
+#define TCP_CA_Open 0
+#define TCP_CA_Recovery 3
+#define TCP_CC_INFO 26
+#define TCP_CLOSE 7
+#define TCP_CLOSE_WAIT 8
+#define TCP_CLOSING 11
+#define TCP_CM_INQ TCP_INQ
+#define TCP_CONGESTION 13
+#define TCP_CORK 3
+#define TCP_DEFER_ACCEPT 9
+#define TCP_ENCAP_ESPINTCP 7
+#define TCP_ESTABLISHED 1
+#define TCP_FASTOPEN 23
+#define TCP_FASTOPEN_CONNECT 30
+#define TCP_FASTOPEN_KEY 33
+#define TCP_FASTOPEN_NO_COOKIE 34
+#define TCP_FIN_WAIT1 4
+#define TCP_FIN_WAIT2 5
+#define TCP_INFO 11
+#define TCP_INQ 36
+#define TCP_KEEPCNT 6
+#define TCP_KEEPIDLE 4
+#define TCP_KEEPINTVL 5
+#define TCP_LAST_ACK 9
+#define TCP_LINGER2 8
+#define TCP_LISTEN 10
+#define TCP_MAXSEG 2
+#define TCP_MD5SIG 14
+#define TCP_MD5SIG_EXT 32
+#define TCP_MD5SIG_FLAG_IFINDEX 0x2
+#define TCP_MD5SIG_FLAG_PREFIX 0x1
+#define TCP_MD5SIG_MAXKEYLEN 80
+#define TCP_NODELAY 1
+#define TCP_NOTSENT_LOWAT 25
+#define TCP_QUEUE_SEQ 21
+#define TCP_QUICKACK 12
+#define TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT 0x1
+#define TCP_REPAIR 19
+#define TCP_REPAIR_OFF 0
+#define TCP_REPAIR_OFF_NO_WP -1
+#define TCP_REPAIR_ON 1
+#define TCP_REPAIR_OPTIONS 22
+#define TCP_REPAIR_QUEUE 20
+#define TCP_REPAIR_WINDOW 29
+#define TCP_SAVED_SYN 28
+#define TCP_SAVE_SYN 27
+#define TCP_SYNCNT 7
+#define TCP_SYN_RECV 3
+#define TCP_SYN_SENT 2
+#define TCP_THIN_DUPACK 17
+#define TCP_THIN_LINEAR_TIMEOUTS 16
+#define TCP_TIMESTAMP 24
+#define TCP_TIME_WAIT 6
+#define TCP_TX_DELAY 37
+#define TCP_ULP 31
+#define TCP_USER_TIMEOUT 18
+#define TCP_WINDOW_CLAMP 10
+#define TCP_ZEROCOPY_RECEIVE 35
+#define TELCMD(x) telcmds[(x)-TELCMD_FIRST]
+#define TELCMD_FIRST xEOF
+#define TELCMD_LAST IAC
+#define TELCMD_OK(x) ((unsigned int)(x) <= TELCMD_LAST && (unsigned int)(x) >= TELCMD_FIRST)
+#define TELOPT_3270REGIME 29
+#define TELOPT_AUTHENTICATION 37
+#define TELOPT_BINARY 0
+#define TELOPT_BM 19
+#define TELOPT_DET 20
+#define TELOPT_ECHO 1
+#define TELOPT_ENCRYPT 38
+#define TELOPT_EOR 25
+#define TELOPT_EXOPL 255
+#define TELOPT_LFLOW 33
+#define TELOPT_LINEMODE 34
+#define TELOPT_LOGOUT 18
+#define TELOPT_NAMS 4
+#define TELOPT_NAOCRD 10
+#define TELOPT_NAOFFD 13
+#define TELOPT_NAOHTD 12
+#define TELOPT_NAOHTS 11
+#define TELOPT_NAOL 8
+#define TELOPT_NAOLFD 16
+#define TELOPT_NAOP 9
+#define TELOPT_NAOVTD 15
+#define TELOPT_NAOVTS 14
+#define TELOPT_NAWS 31
+#define TELOPT_NEW_ENVIRON 39
+#define TELOPT_OLD_ENVIRON 36
+#define TELOPT_OUTMRK 27
+#define TELOPT_RCP 2
+#define TELOPT_RCTE 7
+#define TELOPT_SGA 3
+#define TELOPT_SNDLOC 23
+#define TELOPT_STATUS 5
+#define TELOPT_SUPDUP 21
+#define TELOPT_SUPDUPOUTPUT 22
+#define TELOPT_TM 6
+#define TELOPT_TSPEED 32
+#define TELOPT_TTYLOC 28
+#define TELOPT_TTYPE 24
+#define TELOPT_TUID 26
+#define TELOPT_X3PAD 30
+#define TELOPT_XASCII 17
+#define TELOPT_XDISPLOC 35
+#define TELQUAL_INFO 2
+#define TELQUAL_IS 0
+#define TELQUAL_NAME 3
+#define TELQUAL_REPLY 2
+#define TELQUAL_SEND 1
+#define TGEXEC 00010
+#define TGREAD 00040
+#define TGWRITE 00020
+#define THOUSEP 0x10001
+#define TH_ACK 0x10
+#define TH_FIN 0x01
+#define TH_PUSH 0x08
+#define TH_RST 0x04
+#define TH_SYN 0x02
+#define TH_URG 0x20
+#define TIMER_ABSTIME __WASI_SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME
+#define TIMESPEC_TO_TIMEVAL(tv,ts) ( (tv)->tv_sec = (ts)->tv_sec, (tv)->tv_usec = (ts)->tv_nsec / 1000, (void)0 )
+#define TIMEVAL_TO_TIMESPEC(tv,ts) ( (ts)->tv_sec = (tv)->tv_sec, (ts)->tv_nsec = (tv)->tv_usec * 1000, (void)0 )
+#define TIME_BAD TIME_ERROR
+#define TIME_DEL 2
+#define TIME_ERROR 5
+#define TIME_INS 1
+#define TIME_OK 0
+#define TIME_OOP 3
+#define TIME_UTC 1
+#define TIME_WAIT 4
+#define TMAGIC "ustar"
+#define TMAGLEN 6
+#define TOEXEC 00001
+#define TOREAD 00004
+#define TOWRITE 00002
+#define TRANSIENT 4
+#define TSGID 02000
+#define TSS_DTOR_ITERATIONS 4
+#define TSUID 04000
+#define TSVTX 01000
+#define TTYDEF_CFLAG (CREAD | CS7 | PARENB | HUPCL)
+#define TTYDEF_IFLAG (BRKINT | ISTRIP | ICRNL | IMAXBEL | IXON | IXANY)
+#define TTYDEF_LFLAG (ECHO | ICANON | ISIG | IEXTEN | ECHOE|ECHOKE|ECHOCTL)
+#define TTYDEF_OFLAG (OPOST | ONLCR | XTABS)
+#define TTYDEF_SPEED (B9600)
+#define TTY_NAME_MAX 32
+#define TUEXEC 00100
+#define TUREAD 00400
+#define TUWRITE 00200
+#define TVERSION "00"
+#define TVERSLEN 2
+#define TYPE_A 1
+#define TYPE_E 2
+#define TYPE_I 3
+#define TYPE_L 4
+#define TZNAME_MAX 6
+#define T_A ns_t_a
+#define T_A6 ns_t_a6
+#define T_AAAA ns_t_aaaa
+#define T_AFSDB ns_t_afsdb
+#define T_ANY ns_t_any
+#define T_ATMA ns_t_atma
+#define T_AXFR ns_t_axfr
+#define T_CNAME ns_t_cname
+#define T_DNAME ns_t_dname
+#define T_EID ns_t_eid
+#define T_FMT 0x2002A
+#define T_FMT_AMPM 0x2002B
+#define T_GPOS ns_t_gpos
+#define T_HINFO ns_t_hinfo
+#define T_ISDN ns_t_isdn
+#define T_IXFR ns_t_ixfr
+#define T_KEY ns_t_key
+#define T_LOC ns_t_loc
+#define T_MAILA ns_t_maila
+#define T_MAILB ns_t_mailb
+#define T_MB ns_t_mb
+#define T_MD ns_t_md
+#define T_MF ns_t_mf
+#define T_MG ns_t_mg
+#define T_MINFO ns_t_minfo
+#define T_MR ns_t_mr
+#define T_MX ns_t_mx
+#define T_NAPTR ns_t_naptr
+#define T_NIMLOC ns_t_nimloc
+#define T_NS ns_t_ns
+#define T_NSAP ns_t_nsap
+#define T_NSAP_PTR ns_t_nsap_ptr
+#define T_NULL ns_t_null
+#define T_NXT ns_t_nxt
+#define T_PTR ns_t_ptr
+#define T_PX ns_t_px
+#define T_RP ns_t_rp
+#define T_RT ns_t_rt
+#define T_SIG ns_t_sig
+#define T_SOA ns_t_soa
+#define T_SRV ns_t_srv
+#define T_TSIG ns_t_tsig
+#define T_TXT ns_t_txt
+#define T_WKS ns_t_wks
+#define T_X25 ns_t_x25
+#define UCHAR_MAX 255
+#define UDP_CORK 1
+#define UDP_ENCAP 100
+#define UDP_ENCAP_ESPINUDP 2
+#define UDP_ENCAP_ESPINUDP_NON_IKE 1
+#define UDP_ENCAP_GTP0 4
+#define UDP_ENCAP_GTP1U 5
+#define UDP_ENCAP_L2TPINUDP 3
+#define UDP_ENCAP_RXRPC 6
+#define UDP_GRO 104
+#define UDP_NO_CHECK6_RX 102
+#define UDP_NO_CHECK6_TX 101
+#define UDP_SEGMENT 103
+#define UINT16_C(c) c
+#define UINT16_MAX (0xffff)
+#define UINT32_C(c) c ## U
+#define UINT32_MAX (0xffffffffu)
+#define UINT64_C(c) c ## ULL
+#define UINT64_MAX (0xffffffffffffffffu)
+#define UINT8_C(c) c
+#define UINT8_MAX (0xff)
+#define UINTMAX_C(c) c ## ULL
+#define UINTMAX_MAX UINT64_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define UINT_FAST16_MAX UINT16_MAX
+#define UINT_FAST32_MAX UINT32_MAX
+#define UINT_FAST64_MAX UINT64_MAX
+#define UINT_FAST8_MAX UINT8_MAX
+#define UINT_LEAST16_MAX UINT16_MAX
+#define UINT_LEAST32_MAX UINT32_MAX
+#define UINT_LEAST64_MAX UINT64_MAX
+#define UINT_LEAST8_MAX UINT8_MAX
+#define UINT_MAX 0xffffffffU
+#define UIO_MAXIOV 1024
+#define ULLONG_MAX (2ULL*LLONG_MAX+1)
+#define ULONG_MAX (2UL*LONG_MAX+1)
+#define USHRT_MAX 0xffff
+#define UTIME_NOW (-1)
+#define UTIME_OMIT (-2)
+#define WCHAR_MAX (0x7fffffff+L'\0')
+#define WCHAR_MIN (-1-0x7fffffff+L'\0')
+#define WEOF 0xffffffffU
+#define WILL 251
+#define WINT_MAX UINT32_MAX
+#define WINT_MIN 0U
+#define WONT 252
+#define WORD_BIT 32
+#define WRQ 02
+#define W_OK (2)
+#define X_OK (1)
+#define YESEXPR 0x50000
+#define YESSTR 0x50002
+#define YXDOMAIN ns_r_yxdomain
+#define YXRRSET ns_r_yxrrset
+#define _ALLOCA_H
+#define _ALL_SOURCE 1
+#define _ARPA_FTP_H
+#define _ARPA_INET_H
+#define _ARPA_NAMESER_H
+#define _ARPA_TELNET_H
+#define _ARPA_TFTP_H
+#define _AR_H
+#define _BYTESWAP_H
+#define _COMPLEX_H
+#define _CPIO_H
+#define _CRYPT_H
+#define _CS_GNU_LIBC_VERSION 2
+#define _CS_GNU_LIBPTHREAD_VERSION 3
+#define _CS_PATH 0
+#define _CS_POSIX_V5_WIDTH_RESTRICTED_ENVS 4
+#define _CS_POSIX_V6_ILP32_OFF32_CFLAGS 1116
+#define _CS_POSIX_V6_ILP32_OFF32_LDFLAGS 1117
+#define _CS_POSIX_V6_ILP32_OFF32_LIBS 1118
+#define _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS 1119
+#define _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS 1120
+#define _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS 1121
+#define _CS_POSIX_V6_ILP32_OFFBIG_LIBS 1122
+#define _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS 1123
+#define _CS_POSIX_V6_LP64_OFF64_CFLAGS 1124
+#define _CS_POSIX_V6_LP64_OFF64_LDFLAGS 1125
+#define _CS_POSIX_V6_LP64_OFF64_LIBS 1126
+#define _CS_POSIX_V6_LP64_OFF64_LINTFLAGS 1127
+#define _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS 1128
+#define _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS 1129
+#define _CS_POSIX_V6_LPBIG_OFFBIG_LIBS 1130
+#define _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS 1131
+#define _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS 1
+#define _CS_POSIX_V7_ILP32_OFF32_CFLAGS 1132
+#define _CS_POSIX_V7_ILP32_OFF32_LDFLAGS 1133
+#define _CS_POSIX_V7_ILP32_OFF32_LIBS 1134
+#define _CS_POSIX_V7_ILP32_OFF32_LINTFLAGS 1135
+#define _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS 1136
+#define _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS 1137
+#define _CS_POSIX_V7_ILP32_OFFBIG_LIBS 1138
+#define _CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS 1139
+#define _CS_POSIX_V7_LP64_OFF64_CFLAGS 1140
+#define _CS_POSIX_V7_LP64_OFF64_LDFLAGS 1141
+#define _CS_POSIX_V7_LP64_OFF64_LIBS 1142
+#define _CS_POSIX_V7_LP64_OFF64_LINTFLAGS 1143
+#define _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS 1144
+#define _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS 1145
+#define _CS_POSIX_V7_LPBIG_OFFBIG_LIBS 1146
+#define _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS 1147
+#define _CS_POSIX_V7_WIDTH_RESTRICTED_ENVS 5
+#define _CS_V6_ENV 1148
+#define _CS_V7_ENV 1149
+#define _CTYPE_H
+#define _Complex_I (0.0f+1.0fi)
+#define _DIRENT_H
+#define _DIRENT_HAVE_D_TYPE
+#define _ENDIAN_H
+#define _ERRNO_H
+#define _ERR_H
+#define _FCNTL_H
+#define _FEATURES_H
+#define _FENV_H
+#define _FLOAT_H
+#define _FMTMSG_H
+#define _FNMATCH_H
+#define _FTW_H
+#define _GETOPT_H
+#define _GLOB_H
+#define _GNU_SOURCE 1
+#define _ICONV_H
+#define _IFADDRS_H
+#define _ILP32 1
+#define _INTTYPES_H
+#define _IOFBF 0
+#define _IOLBF 1
+#define _IONBF 2
+#define _ISO646_H
+#define _LANGINFO_H
+#define _LIBGEN_H
+#define _LIMITS_H
+#define _LOCALE_H
+#define _MALLOC_H
+#define _MATH_H
+#define _MONETARY_H
+#define _MQUEUE_H
+#define _NETINET_ICMP6_H
+#define _NETINET_IGMP_H
+#define _NETINET_IN_H
+#define _NETINET_IN_SYSTM_H
+#define _NETINET_IP6_H
+#define _NETINET_IP_H
+#define _NETINET_IP_ICMP_H
+#define _NETINET_TCP_H
+#define _NETINET_UDP_H
+#define _NETPACKET_PACKET_H
+#define _NL_LOCALE_NAME(cat) (((cat)<<16) | 0xffff)
+#define _NL_TYPES_H
+#define _PC_2_SYMLINKS 20
+#define _PC_ALLOC_SIZE_MIN 18
+#define _PC_ASYNC_IO 10
+#define _PC_CHOWN_RESTRICTED 6
+#define _PC_FILESIZEBITS 13
+#define _PC_LINK_MAX 0
+#define _PC_MAX_CANON 1
+#define _PC_MAX_INPUT 2
+#define _PC_NAME_MAX 3
+#define _PC_NO_TRUNC 7
+#define _PC_PATH_MAX 4
+#define _PC_PIPE_BUF 5
+#define _PC_PRIO_IO 11
+#define _PC_REC_INCR_XFER_SIZE 14
+#define _PC_REC_MAX_XFER_SIZE 15
+#define _PC_REC_MIN_XFER_SIZE 16
+#define _PC_REC_XFER_ALIGN 17
+#define _PC_SOCK_MAXBUF 12
+#define _PC_SYMLINK_MAX 19
+#define _PC_SYNC_IO 9
+#define _PC_VDISABLE 8
+#define _POLL_H
+#define _POSIX2_BC_BASE_MAX 99
+#define _POSIX2_BC_DIM_MAX 2048
+#define _POSIX2_BC_SCALE_MAX 99
+#define _POSIX2_BC_STRING_MAX 1000
+#define _POSIX2_CHARCLASS_NAME_MAX 14
+#define _POSIX2_COLL_WEIGHTS_MAX 2
+#define _POSIX2_C_BIND _POSIX_VERSION
+#define _POSIX2_EXPR_NEST_MAX 32
+#define _POSIX2_LINE_MAX 2048
+#define _POSIX2_RE_DUP_MAX 255
+#define _POSIX2_VERSION _POSIX_VERSION
+#define _POSIX_ADVISORY_INFO _POSIX_VERSION
+#define _POSIX_AIO_LISTIO_MAX 2
+#define _POSIX_AIO_MAX 1
+#define _POSIX_ARG_MAX 4096
+#define _POSIX_BARRIERS _POSIX_VERSION
+#define _POSIX_CHILD_MAX 25
+#define _POSIX_CHOWN_RESTRICTED 1
+#define _POSIX_CLOCKRES_MIN 20000000
+#define _POSIX_CLOCK_SELECTION _POSIX_VERSION
+#define _POSIX_CPUTIME _POSIX_VERSION
+#define _POSIX_DELAYTIMER_MAX 32
+#define _POSIX_FSYNC _POSIX_VERSION
+#define _POSIX_HOST_NAME_MAX 255
+#define _POSIX_IPV6 _POSIX_VERSION
+#define _POSIX_LINK_MAX 8
+#define _POSIX_LOGIN_NAME_MAX 9
+#define _POSIX_MAX_CANON 255
+#define _POSIX_MAX_INPUT 255
+#define _POSIX_MONOTONIC_CLOCK _POSIX_VERSION
+#define _POSIX_MQ_OPEN_MAX 8
+#define _POSIX_MQ_PRIO_MAX 32
+#define _POSIX_NAME_MAX 14
+#define _POSIX_NGROUPS_MAX 8
+#define _POSIX_NO_TRUNC 1
+#define _POSIX_OPEN_MAX 20
+#define _POSIX_PATH_MAX 256
+#define _POSIX_PIPE_BUF 512
+#define _POSIX_READER_WRITER_LOCKS _POSIX_VERSION
+#define _POSIX_REALTIME_SIGNALS _POSIX_VERSION
+#define _POSIX_REGEXP 1
+#define _POSIX_RE_DUP_MAX 255
+#define _POSIX_RTSIG_MAX 8
+#define _POSIX_SEM_NSEMS_MAX 256
+#define _POSIX_SEM_VALUE_MAX 32767
+#define _POSIX_SIGQUEUE_MAX 32
+#define _POSIX_SPIN_LOCKS _POSIX_VERSION
+#define _POSIX_SSIZE_MAX 32767
+#define _POSIX_SS_REPL_MAX 4
+#define _POSIX_STREAM_MAX 8
+#define _POSIX_SYMLINK_MAX 255
+#define _POSIX_SYMLOOP_MAX 8
+#define _POSIX_THREADS _POSIX_VERSION
+#define _POSIX_THREAD_ATTR_STACKADDR _POSIX_VERSION
+#define _POSIX_THREAD_ATTR_STACKSIZE _POSIX_VERSION
+#define _POSIX_THREAD_CPUTIME _POSIX_VERSION
+#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
+#define _POSIX_THREAD_KEYS_MAX 128
+#define _POSIX_THREAD_PRIORITY_SCHEDULING _POSIX_VERSION
+#define _POSIX_THREAD_PROCESS_SHARED _POSIX_VERSION
+#define _POSIX_THREAD_SAFE_FUNCTIONS _POSIX_VERSION
+#define _POSIX_THREAD_THREADS_MAX 64
+#define _POSIX_TIMEOUTS _POSIX_VERSION
+#define _POSIX_TIMERS _POSIX_VERSION
+#define _POSIX_TIMER_MAX 32
+#define _POSIX_TRACE_EVENT_NAME_MAX 30
+#define _POSIX_TRACE_NAME_MAX 8
+#define _POSIX_TRACE_SYS_MAX 8
+#define _POSIX_TRACE_USER_EVENT_MAX 32
+#define _POSIX_TTY_NAME_MAX 9
+#define _POSIX_TZNAME_MAX 6
+#define _POSIX_V6_ILP32_OFFBIG (1)
+#define _POSIX_V7_ILP32_OFFBIG (1)
+#define _POSIX_VDISABLE 0
+#define _POSIX_VERSION 200809L
+#define _PTHREAD_H
+#define _PTRDIFF_T
+#define _REENTRANT 1
+#define _REGEX_H
+#define _SCHED_H
+#define _SC_2_CHAR_TERM 95
+#define _SC_2_C_BIND 47
+#define _SC_2_C_DEV 48
+#define _SC_2_FORT_DEV 49
+#define _SC_2_FORT_RUN 50
+#define _SC_2_LOCALEDEF 52
+#define _SC_2_PBS 168
+#define _SC_2_PBS_ACCOUNTING 169
+#define _SC_2_PBS_CHECKPOINT 175
+#define _SC_2_PBS_LOCATE 170
+#define _SC_2_PBS_MESSAGE 171
+#define _SC_2_PBS_TRACK 172
+#define _SC_2_SW_DEV 51
+#define _SC_2_UPE 97
+#define _SC_2_VERSION 46
+#define _SC_ADVISORY_INFO 132
+#define _SC_AIO_LISTIO_MAX 23
+#define _SC_AIO_MAX 24
+#define _SC_AIO_PRIO_DELTA_MAX 25
+#define _SC_ARG_MAX 0
+#define _SC_ASYNCHRONOUS_IO 12
+#define _SC_ATEXIT_MAX 87
+#define _SC_AVPHYS_PAGES 86
+#define _SC_BARRIERS 133
+#define _SC_BC_BASE_MAX 36
+#define _SC_BC_DIM_MAX 37
+#define _SC_BC_SCALE_MAX 38
+#define _SC_BC_STRING_MAX 39
+#define _SC_CHILD_MAX 1
+#define _SC_CLK_TCK 2
+#define _SC_CLOCK_SELECTION 137
+#define _SC_COLL_WEIGHTS_MAX 40
+#define _SC_CPUTIME 138
+#define _SC_DELAYTIMER_MAX 26
+#define _SC_EXPR_NEST_MAX 42
+#define _SC_FSYNC 15
+#define _SC_GETGR_R_SIZE_MAX 69
+#define _SC_GETPW_R_SIZE_MAX 70
+#define _SC_HOST_NAME_MAX 180
+#define _SC_IOV_MAX 60
+#define _SC_IPV6 235
+#define _SC_JOB_CONTROL 7
+#define _SC_LINE_MAX 43
+#define _SC_LOGIN_NAME_MAX 71
+#define _SC_MAPPED_FILES 16
+#define _SC_MEMLOCK 17
+#define _SC_MEMLOCK_RANGE 18
+#define _SC_MEMORY_PROTECTION 19
+#define _SC_MESSAGE_PASSING 20
+#define _SC_MONOTONIC_CLOCK 149
+#define _SC_MQ_OPEN_MAX 27
+#define _SC_MQ_PRIO_MAX 28
+#define _SC_NGROUPS_MAX 3
+#define _SC_NPROCESSORS_CONF 83
+#define _SC_NPROCESSORS_ONLN 84
+#define _SC_NZERO 109
+#define _SC_OPEN_MAX 4
+#define _SC_PAGESIZE 30
+#define _SC_PAGE_SIZE 30
+#define _SC_PASS_MAX 88
+#define _SC_PHYS_PAGES 85
+#define _SC_PRIORITIZED_IO 13
+#define _SC_PRIORITY_SCHEDULING 10
+#define _SC_RAW_SOCKETS 236
+#define _SC_READER_WRITER_LOCKS 153
+#define _SC_REALTIME_SIGNALS 9
+#define _SC_REGEXP 155
+#define _SC_RE_DUP_MAX 44
+#define _SC_RTSIG_MAX 31
+#define _SC_SAVED_IDS 8
+#define _SC_SEMAPHORES 21
+#define _SC_SEM_NSEMS_MAX 32
+#define _SC_SEM_VALUE_MAX 33
+#define _SC_SHARED_MEMORY_OBJECTS 22
+#define _SC_SHELL 157
+#define _SC_SIGQUEUE_MAX 34
+#define _SC_SPAWN 159
+#define _SC_SPIN_LOCKS 154
+#define _SC_SPORADIC_SERVER 160
+#define _SC_SS_REPL_MAX 241
+#define _SC_STREAMS 174
+#define _SC_STREAM_MAX 5
+#define _SC_SYMLOOP_MAX 173
+#define _SC_SYNCHRONIZED_IO 14
+#define _SC_THREADS 67
+#define _SC_THREAD_ATTR_STACKADDR 77
+#define _SC_THREAD_ATTR_STACKSIZE 78
+#define _SC_THREAD_CPUTIME 139
+#define _SC_THREAD_DESTRUCTOR_ITERATIONS 73
+#define _SC_THREAD_KEYS_MAX 74
+#define _SC_THREAD_PRIORITY_SCHEDULING 79
+#define _SC_THREAD_PRIO_INHERIT 80
+#define _SC_THREAD_PRIO_PROTECT 81
+#define _SC_THREAD_PROCESS_SHARED 82
+#define _SC_THREAD_ROBUST_PRIO_INHERIT 247
+#define _SC_THREAD_ROBUST_PRIO_PROTECT 248
+#define _SC_THREAD_SAFE_FUNCTIONS 68
+#define _SC_THREAD_SPORADIC_SERVER 161
+#define _SC_THREAD_STACK_MIN 75
+#define _SC_THREAD_THREADS_MAX 76
+#define _SC_TIMEOUTS 164
+#define _SC_TIMERS 11
+#define _SC_TIMER_MAX 35
+#define _SC_TRACE 181
+#define _SC_TRACE_EVENT_FILTER 182
+#define _SC_TRACE_EVENT_NAME_MAX 242
+#define _SC_TRACE_INHERIT 183
+#define _SC_TRACE_LOG 184
+#define _SC_TRACE_NAME_MAX 243
+#define _SC_TRACE_SYS_MAX 244
+#define _SC_TRACE_USER_EVENT_MAX 245
+#define _SC_TTY_NAME_MAX 72
+#define _SC_TYPED_MEMORY_OBJECTS 165
+#define _SC_TZNAME_MAX 6
+#define _SC_UIO_MAXIOV 60
+#define _SC_V6_ILP32_OFF32 176
+#define _SC_V6_ILP32_OFFBIG 177
+#define _SC_V6_LP64_OFF64 178
+#define _SC_V6_LPBIG_OFFBIG 179
+#define _SC_V7_ILP32_OFF32 237
+#define _SC_V7_ILP32_OFFBIG 238
+#define _SC_V7_LP64_OFF64 239
+#define _SC_V7_LPBIG_OFFBIG 240
+#define _SC_VERSION 29
+#define _SC_XBS5_ILP32_OFF32 125
+#define _SC_XBS5_ILP32_OFFBIG 126
+#define _SC_XBS5_LP64_OFF64 127
+#define _SC_XBS5_LPBIG_OFFBIG 128
+#define _SC_XOPEN_CRYPT 92
+#define _SC_XOPEN_ENH_I18N 93
+#define _SC_XOPEN_LEGACY 129
+#define _SC_XOPEN_REALTIME 130
+#define _SC_XOPEN_REALTIME_THREADS 131
+#define _SC_XOPEN_SHM 94
+#define _SC_XOPEN_STREAMS 246
+#define _SC_XOPEN_UNIX 91
+#define _SC_XOPEN_VERSION 89
+#define _SC_XOPEN_XCU_VERSION 90
+#define _SC_XOPEN_XPG2 98
+#define _SC_XOPEN_XPG3 99
+#define _SC_XOPEN_XPG4 100
+#define _SEARCH_H
+#define _SEMAPHORE_H
+#define _SIZE_T
+#define _STDALIGN_H
+#define _STDBOOL_H
+#define _STDC_PREDEF_H
+#define _STDINT_H
+#define _STDIO_EXT_H
+#define _STDIO_H
+#define _STDLIB_H
+#define _STDNORETURN_H
+#define _STRINGS_H
+#define _STRING_H
+#define _STROPTS_H
+#define _SYSEXITS_H
+#define _SYS_EVENTFD_H
+#define _SYS_FILE_H
+#define _SYS_IOCTL_H
+#define _SYS_PARAM_H
+#define _SYS_RANDOM_H
+#define _SYS_REG_H
+#define _SYS_SELECT_H
+#define _SYS_SOCKET_H
+#define _SYS_STAT_H
+#define _SYS_SYSCALL_H
+#define _SYS_SYSINFO_H
+#define _SYS_TIMEB_H
+#define _SYS_TIMEX_H
+#define _SYS_TIME_H
+#define _SYS_TTYDEFAULTS_H
+#define _SYS_TYPES_H
+#define _SYS_UIO_H
+#define _SYS_UN_H
+#define _SYS_UTSNAME_H
+#define _TAR_H
+#define _TGMATH_H
+#define _THREADS_H
+#define _TIME_H
+#define _UCHAR_H
+#define _UNISTD_H
+#define _UTIME_H
+#define _VALUES_H
+#define _VA_LIST
+#define _WCHAR_H
+#define _WCHAR_T
+#define _WCTYPE_H
+#define _WINT_T
+#define _XOPEN_ENH_I18N 1
+#define _XOPEN_IOV_MAX 16
+#define _XOPEN_NAME_MAX 255
+#define _XOPEN_PATH_MAX 1024
+#define _XOPEN_UNIX 1
+#define _XOPEN_VERSION 700
+#define __ARE_4_EQUAL(a,b) (!( (0[a]-0[b]) | (1[a]-1[b]) | (2[a]-2[b]) | (3[a]-3[b]) ))
+#define __ATOMIC_ACQUIRE 2
+#define __ATOMIC_ACQ_REL 4
+#define __ATOMIC_CONSUME 1
+#define __ATOMIC_RELAXED 0
+#define __ATOMIC_RELEASE 3
+#define __ATOMIC_SEQ_CST 5
+#define __BIGGEST_ALIGNMENT__ 16
+#define __BIG_ENDIAN 4321
+#define __BIND 19950621
+#define __BYTE_ORDER __BYTE_ORDER__
+#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
+#define __CHAR16_TYPE__ unsigned short
+#define __CHAR32_TYPE__ unsigned int
+#define __CHAR_BIT__ 8
+#define __compiler_ATOMIC_BOOL_LOCK_FREE 2
+#define __compiler_ATOMIC_CHAR16_T_LOCK_FREE 2
+#define __compiler_ATOMIC_CHAR32_T_LOCK_FREE 2
+#define __compiler_ATOMIC_CHAR_LOCK_FREE 2
+#define __compiler_ATOMIC_INT_LOCK_FREE 2
+#define __compiler_ATOMIC_LLONG_LOCK_FREE 2
+#define __compiler_ATOMIC_LONG_LOCK_FREE 2
+#define __compiler_ATOMIC_POINTER_LOCK_FREE 2
+#define __compiler_ATOMIC_SHORT_LOCK_FREE 2
+#define __compiler_ATOMIC_WCHAR_T_LOCK_FREE 2
+#define __CLANG_MAX_ALIGN_T_DEFINED
+#define __CMPLX(x,y,t) (__builtin_complex((t)(x), (t)(y)))
+#define __CONSTANT_CFSTRINGS__ 1
+#define __DBLCX(x) (__IS_CX(x) && sizeof(x) == sizeof(double complex))
+#define __DBL_DECIMAL_DIG__ 17
+#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
+#define __DBL_DIG__ 15
+#define __DBL_EPSILON__ 2.2204460492503131e-16
+#define __DBL_HAS_DENORM__ 1
+#define __DBL_HAS_INFINITY__ 1
+#define __DBL_HAS_QUIET_NAN__ 1
+#define __DBL_MANT_DIG__ 53
+#define __DBL_MAX_10_EXP__ 308
+#define __DBL_MAX_EXP__ 1024
+#define __DBL_MAX__ 1.7976931348623157e+308
+#define __DBL_MIN_10_EXP__ (-307)
+#define __DBL_MIN_EXP__ (-1021)
+#define __DBL_MIN__ 2.2250738585072014e-308
+#define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__
+#define __DEFINED_FILE
+#define __DEFINED___isoc_va_list
+#define __DEFINED_blkcnt_t
+#define __DEFINED_blksize_t
+#define __DEFINED_clock_t
+#define __DEFINED_clockid_t
+#define __DEFINED_cnd_t
+#define __DEFINED_dev_t
+#define __DEFINED_double_t
+#define __DEFINED_float_t
+#define __DEFINED_fsblkcnt_t
+#define __DEFINED_fsfilcnt_t
+#define __DEFINED_gid_t
+#define __DEFINED_id_t
+#define __DEFINED_ino_t
+#define __DEFINED_int16_t
+#define __DEFINED_int32_t
+#define __DEFINED_int64_t
+#define __DEFINED_int8_t
+#define __DEFINED_intmax_t
+#define __DEFINED_intptr_t
+#define __DEFINED_key_t
+#define __DEFINED_locale_t
+#define __DEFINED_mbstate_t
+#define __DEFINED_mode_t
+#define __DEFINED_mtx_t
+#define __DEFINED_nlink_t
+#define __DEFINED_off_t
+#define __DEFINED_pid_t
+#define __DEFINED_pthread_attr_t
+#define __DEFINED_pthread_barrier_t
+#define __DEFINED_pthread_barrierattr_t
+#define __DEFINED_pthread_cond_t
+#define __DEFINED_pthread_condattr_t
+#define __DEFINED_pthread_key_t
+#define __DEFINED_pthread_mutex_t
+#define __DEFINED_pthread_mutexattr_t
+#define __DEFINED_pthread_once_t
+#define __DEFINED_pthread_rwlock_t
+#define __DEFINED_pthread_rwlockattr_t
+#define __DEFINED_pthread_spinlock_t
+#define __DEFINED_pthread_t
+#define __DEFINED_register_t
+#define __DEFINED_regoff_t
+#define __DEFINED_sa_family_t
+#define __DEFINED_sigset_t
+#define __DEFINED_size_t
+#define __DEFINED_socklen_t
+#define __DEFINED_ssize_t
+#define __DEFINED_suseconds_t
+#define __DEFINED_time_t
+#define __DEFINED_timer_t
+#define __DEFINED_u_int64_t
+#define __DEFINED_uid_t
+#define __DEFINED_uint16_t
+#define __DEFINED_uint32_t
+#define __DEFINED_uint64_t
+#define __DEFINED_uint8_t
+#define __DEFINED_uintmax_t
+#define __DEFINED_uintptr_t
+#define __DEFINED_useconds_t
+#define __DEFINED_va_list
+#define __DEFINED_wchar_t
+#define __DEFINED_wctype_t
+#define __DEFINED_wint_t
+#define __FINITE_MATH_ONLY__ 0
+#define __FLT(x) (__IS_REAL(x) && sizeof(x) == sizeof(float))
+#define __FLTCX(x) (__IS_CX(x) && sizeof(x) == sizeof(float complex))
+#define __FLT_DECIMAL_DIG__ 9
+#define __FLT_DENORM_MIN__ 1.40129846e-45F
+#define __FLT_DIG__ 6
+#define __FLT_EPSILON__ 1.19209290e-7F
+#define __FLT_HAS_DENORM__ 1
+#define __FLT_HAS_INFINITY__ 1
+#define __FLT_HAS_QUIET_NAN__ 1
+#define __FLT_MANT_DIG__ 24
+#define __FLT_MAX_10_EXP__ 38
+#define __FLT_MAX_EXP__ 128
+#define __FLT_MAX__ 3.40282347e+38F
+#define __FLT_MIN_10_EXP__ (-37)
+#define __FLT_MIN_EXP__ (-125)
+#define __FLT_MIN__ 1.17549435e-38F
+#define __FLT_RADIX__ 2
+#define __compiler_ATOMIC_BOOL_LOCK_FREE 2
+#define __compiler_ATOMIC_CHAR16_T_LOCK_FREE 2
+#define __compiler_ATOMIC_CHAR32_T_LOCK_FREE 2
+#define __compiler_ATOMIC_CHAR_LOCK_FREE 2
+#define __compiler_ATOMIC_INT_LOCK_FREE 2
+#define __compiler_ATOMIC_LLONG_LOCK_FREE 2
+#define __compiler_ATOMIC_LONG_LOCK_FREE 2
+#define __compiler_ATOMIC_POINTER_LOCK_FREE 2
+#define __compiler_ATOMIC_SHORT_LOCK_FREE 2
+#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
+#define __compiler_ATOMIC_WCHAR_T_LOCK_FREE 2
+#define __GNUC_STDC_INLINE__ 1
+#define __GNUC_VA_LIST 1
+#define __GXX_ABI_VERSION 1002
+#define __ILP32__ 1
+#define __INT16_C_SUFFIX__
+#define __INT16_FMTd__ "hd"
+#define __INT16_FMTi__ "hi"
+#define __INT16_MAX__ 32767
+#define __INT16_TYPE__ short
+#define __INT32_C_SUFFIX__
+#define __INT32_FMTd__ "d"
+#define __INT32_FMTi__ "i"
+#define __INT32_MAX__ 2147483647
+#define __INT32_TYPE__ int
+#define __INT64_C_SUFFIX__ LL
+#define __INT64_FMTd__ "lld"
+#define __INT64_FMTi__ "lli"
+#define __INT64_MAX__ 9223372036854775807LL
+#define __INT64_TYPE__ long long int
+#define __INT8_C_SUFFIX__
+#define __INT8_FMTd__ "hhd"
+#define __INT8_FMTi__ "hhi"
+#define __INT8_MAX__ 127
+#define __INT8_TYPE__ signed char
+#define __INTMAX_C_SUFFIX__ LL
+#define __INTMAX_FMTd__ "lld"
+#define __INTMAX_FMTi__ "lli"
+#define __INTMAX_MAX__ 9223372036854775807LL
+#define __INTMAX_TYPE__ long long int
+#define __INTMAX_WIDTH__ 64
+#define __INTPTR_FMTd__ "ld"
+#define __INTPTR_FMTi__ "li"
+#define __INTPTR_MAX__ 2147483647L
+#define __INTPTR_TYPE__ long int
+#define __INTPTR_WIDTH__ 32
+#define __INT_FAST16_FMTd__ "hd"
+#define __INT_FAST16_FMTi__ "hi"
+#define __INT_FAST16_MAX__ 32767
+#define __INT_FAST16_TYPE__ short
+#define __INT_FAST32_FMTd__ "d"
+#define __INT_FAST32_FMTi__ "i"
+#define __INT_FAST32_MAX__ 2147483647
+#define __INT_FAST32_TYPE__ int
+#define __INT_FAST64_FMTd__ "lld"
+#define __INT_FAST64_FMTi__ "lli"
+#define __INT_FAST64_MAX__ 9223372036854775807LL
+#define __INT_FAST64_TYPE__ long long int
+#define __INT_FAST8_FMTd__ "hhd"
+#define __INT_FAST8_FMTi__ "hhi"
+#define __INT_FAST8_MAX__ 127
+#define __INT_FAST8_TYPE__ signed char
+#define __INT_LEAST16_FMTd__ "hd"
+#define __INT_LEAST16_FMTi__ "hi"
+#define __INT_LEAST16_MAX__ 32767
+#define __INT_LEAST16_TYPE__ short
+#define __INT_LEAST32_FMTd__ "d"
+#define __INT_LEAST32_FMTi__ "i"
+#define __INT_LEAST32_MAX__ 2147483647
+#define __INT_LEAST32_TYPE__ int
+#define __INT_LEAST64_FMTd__ "lld"
+#define __INT_LEAST64_FMTi__ "lli"
+#define __INT_LEAST64_MAX__ 9223372036854775807LL
+#define __INT_LEAST64_TYPE__ long long int
+#define __INT_LEAST8_FMTd__ "hhd"
+#define __INT_LEAST8_FMTi__ "hhi"
+#define __INT_LEAST8_MAX__ 127
+#define __INT_LEAST8_TYPE__ signed char
+#define __INT_MAX__ 2147483647
+#define __IS_CX(x) (__IS_FP(x) && sizeof(x) == sizeof((x)+I))
+#define __IS_FP(x) (sizeof((x)+1ULL) == sizeof((x)+1.0f))
+#define __IS_REAL(x) (__IS_FP(x) && 2*sizeof(x) == sizeof((x)+I))
+#define __LDBL(x) (__IS_REAL(x) && sizeof(x) == sizeof(long double) && sizeof(long double) != sizeof(double))
+#define __LDBLCX(x) (__IS_CX(x) && sizeof(x) == sizeof(long double complex) && sizeof(long double) != sizeof(double))
+#define __LDBL_DECIMAL_DIG__ 36
+#define __LDBL_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966L
+#define __LDBL_DIG__ 33
+#define __LDBL_EPSILON__ 1.92592994438723585305597794258492732e-34L
+#define __LDBL_HAS_DENORM__ 1
+#define __LDBL_HAS_INFINITY__ 1
+#define __LDBL_HAS_QUIET_NAN__ 1
+#define __LDBL_MANT_DIG__ 113
+#define __LDBL_MAX_10_EXP__ 4932
+#define __LDBL_MAX_EXP__ 16384
+#define __LDBL_MAX__ 1.18973149535723176508575932662800702e+4932L
+#define __LDBL_MIN_10_EXP__ (-4931)
+#define __LDBL_MIN_EXP__ (-16381)
+#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L
+#define __LITTLE_ENDIAN 1234
+#define __LITTLE_ENDIAN__ 1
+#define __LONG_LONG_MAX__ 9223372036854775807LL
+#define __LONG_MAX __LONG_MAX__
+#define __LONG_MAX__ 2147483647L
+#define __NAMESER 19991006
+#define __NEED_FILE
+#define __NEED___isoc_va_list
+#define __NEED_blkcnt_t
+#define __NEED_blksize_t
+#define __NEED_clock_t
+#define __NEED_clockid_t
+#define __NEED_cnd_t
+#define __NEED_dev_t
+#define __NEED_double_t
+#define __NEED_float_t
+#define __NEED_fsblkcnt_t
+#define __NEED_fsfilcnt_t
+#define __NEED_gid_t
+#define __NEED_id_t
+#define __NEED_ino_t
+#define __NEED_int16_t
+#define __NEED_int32_t
+#define __NEED_int64_t
+#define __NEED_int8_t
+#define __NEED_intmax_t
+#define __NEED_intptr_t
+#define __NEED_key_t
+#define __NEED_locale_t
+#define __NEED_mbstate_t
+#define __NEED_mode_t
+#define __NEED_mtx_t
+#define __NEED_nlink_t
+#define __NEED_off_t
+#define __NEED_pid_t
+#define __NEED_pthread_attr_t
+#define __NEED_pthread_barrier_t
+#define __NEED_pthread_barrierattr_t
+#define __NEED_pthread_cond_t
+#define __NEED_pthread_condattr_t
+#define __NEED_pthread_key_t
+#define __NEED_pthread_mutex_t
+#define __NEED_pthread_mutexattr_t
+#define __NEED_pthread_once_t
+#define __NEED_pthread_rwlock_t
+#define __NEED_pthread_rwlockattr_t
+#define __NEED_pthread_spinlock_t
+#define __NEED_pthread_t
+#define __NEED_register_t
+#define __NEED_regoff_t
+#define __NEED_sa_family_t
+#define __NEED_sigset_t
+#define __NEED_size_t
+#define __NEED_socklen_t
+#define __NEED_ssize_t
+#define __NEED_struct_iovec
+#define __NEED_struct_timespec
+#define __NEED_struct_timeval
+#define __NEED_suseconds_t
+#define __NEED_time_t
+#define __NEED_timer_t
+#define __NEED_u_int64_t
+#define __NEED_uid_t
+#define __NEED_uint16_t
+#define __NEED_uint32_t
+#define __NEED_uint64_t
+#define __NEED_uint8_t
+#define __NEED_uintmax_t
+#define __NEED_uintptr_t
+#define __NEED_useconds_t
+#define __NEED_va_list
+#define __NEED_wchar_t
+#define __NEED_wctype_t
+#define __NEED_wint_t
+#define __OBJC_BOOL_IS_BOOL 0
+#define __OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES 3
+#define __OPENCL_MEMORY_SCOPE_DEVICE 2
+#define __OPENCL_MEMORY_SCOPE_SUB_GROUP 4
+#define __OPENCL_MEMORY_SCOPE_WORK_GROUP 1
+#define __OPENCL_MEMORY_SCOPE_WORK_ITEM 0
+#define __OPTIMIZE__ 1
+#define __ORDER_BIG_ENDIAN__ 4321
+#define __ORDER_LITTLE_ENDIAN__ 1234
+#define __ORDER_PDP_ENDIAN__ 3412
+#define __PDP_ENDIAN 3412
+#define __POINTER_WIDTH__ 32
+#define __PRAGMA_REDEFINE_EXTNAME 1
+#define __PTRDIFF_FMTd__ "ld"
+#define __PTRDIFF_FMTi__ "li"
+#define __PTRDIFF_MAX__ 2147483647L
+#define __PTRDIFF_TYPE__ long int
+#define __PTRDIFF_WIDTH__ 32
+#define __REDIR(x,y) __typeof__(x) x __asm__(#y)
+#define __RETCAST(x)
+#define __RETCAST_2(x,y)
+#define __RETCAST_3(x,y,z)
+#define __RETCAST_CX(x)
+#define __RETCAST_REAL(x)
+#define __SCHAR_MAX__ 127
+#define __SHRT_MAX__ 32767
+#define __SID ('S' << 8)
+#define __SIG_ATOMIC_MAX__ 2147483647L
+#define __SIG_ATOMIC_WIDTH__ 32
+#define __SIZEOF_DOUBLE__ 8
+#define __SIZEOF_FLOAT__ 4
+#define __SIZEOF_INT128__ 16
+#define __SIZEOF_INT__ 4
+#define __SIZEOF_LONG_DOUBLE__ 16
+#define __SIZEOF_LONG_LONG__ 8
+#define __SIZEOF_LONG__ 4
+#define __SIZEOF_POINTER__ 4
+#define __SIZEOF_PTRDIFF_T__ 4
+#define __SIZEOF_SHORT__ 2
+#define __SIZEOF_SIZE_T__ 4
+#define __SIZEOF_WCHAR_T__ 4
+#define __SIZEOF_WINT_T__ 4
+#define __SIZE_FMTX__ "lX"
+#define __SIZE_FMTo__ "lo"
+#define __SIZE_FMTu__ "lu"
+#define __SIZE_FMTx__ "lx"
+#define __SIZE_MAX__ 4294967295UL
+#define __SIZE_TYPE__ long unsigned int
+#define __SIZE_WIDTH__ 32
+#define __STDARG_H
+#define __STDC_HOSTED__ 1
+#define __STDC_IEC_559__ 1
+#define __STDC_ISO_10646__ 201206L
+#define __STDC_UTF_16__ 1
+#define __STDC_UTF_32__ 1
+#define __STDC_VERSION__ 201710L
+#define __STDC__ 1
+#define __STDDEF_H
+#define __UAPI_DEF_IN6_ADDR 0
+#define __UAPI_DEF_IN6_ADDR_ALT 0
+#define __UAPI_DEF_IN6_PKTINFO 0
+#define __UAPI_DEF_IN_ADDR 0
+#define __UAPI_DEF_IN_CLASS 0
+#define __UAPI_DEF_IN_IPPROTO 0
+#define __UAPI_DEF_IN_PKTINFO 0
+#define __UAPI_DEF_IP6_MTUINFO 0
+#define __UAPI_DEF_IPHDR 0
+#define __UAPI_DEF_IPPROTO_V6 0
+#define __UAPI_DEF_IPV6_MREQ 0
+#define __UAPI_DEF_IPV6_OPTIONS 0
+#define __UAPI_DEF_IP_MREQ 0
+#define __UAPI_DEF_SOCKADDR_IN 0
+#define __UAPI_DEF_SOCKADDR_IN6 0
+#define __UINT16_C_SUFFIX__
+#define __UINT16_FMTX__ "hX"
+#define __UINT16_FMTo__ "ho"
+#define __UINT16_FMTu__ "hu"
+#define __UINT16_FMTx__ "hx"
+#define __UINT16_MAX__ 65535
+#define __UINT16_TYPE__ unsigned short
+#define __UINT32_C_SUFFIX__ U
+#define __UINT32_FMTX__ "X"
+#define __UINT32_FMTo__ "o"
+#define __UINT32_FMTu__ "u"
+#define __UINT32_FMTx__ "x"
+#define __UINT32_MAX__ 4294967295U
+#define __UINT32_TYPE__ unsigned int
+#define __UINT64_C_SUFFIX__ ULL
+#define __UINT64_FMTX__ "llX"
+#define __UINT64_FMTo__ "llo"
+#define __UINT64_FMTu__ "llu"
+#define __UINT64_FMTx__ "llx"
+#define __UINT64_MAX__ 18446744073709551615ULL
+#define __UINT64_TYPE__ long long unsigned int
+#define __UINT8_C_SUFFIX__
+#define __UINT8_FMTX__ "hhX"
+#define __UINT8_FMTo__ "hho"
+#define __UINT8_FMTu__ "hhu"
+#define __UINT8_FMTx__ "hhx"
+#define __UINT8_MAX__ 255
+#define __UINT8_TYPE__ unsigned char
+#define __UINTMAX_C_SUFFIX__ ULL
+#define __UINTMAX_FMTX__ "llX"
+#define __UINTMAX_FMTo__ "llo"
+#define __UINTMAX_FMTu__ "llu"
+#define __UINTMAX_FMTx__ "llx"
+#define __UINTMAX_MAX__ 18446744073709551615ULL
+#define __UINTMAX_TYPE__ long long unsigned int
+#define __UINTMAX_WIDTH__ 64
+#define __UINTPTR_FMTX__ "lX"
+#define __UINTPTR_FMTo__ "lo"
+#define __UINTPTR_FMTu__ "lu"
+#define __UINTPTR_FMTx__ "lx"
+#define __UINTPTR_MAX__ 4294967295UL
+#define __UINTPTR_TYPE__ long unsigned int
+#define __UINTPTR_WIDTH__ 32
+#define __UINT_FAST16_FMTX__ "hX"
+#define __UINT_FAST16_FMTo__ "ho"
+#define __UINT_FAST16_FMTu__ "hu"
+#define __UINT_FAST16_FMTx__ "hx"
+#define __UINT_FAST16_MAX__ 65535
+#define __UINT_FAST16_TYPE__ unsigned short
+#define __UINT_FAST32_FMTX__ "X"
+#define __UINT_FAST32_FMTo__ "o"
+#define __UINT_FAST32_FMTu__ "u"
+#define __UINT_FAST32_FMTx__ "x"
+#define __UINT_FAST32_MAX__ 4294967295U
+#define __UINT_FAST32_TYPE__ unsigned int
+#define __UINT_FAST64_FMTX__ "llX"
+#define __UINT_FAST64_FMTo__ "llo"
+#define __UINT_FAST64_FMTu__ "llu"
+#define __UINT_FAST64_FMTx__ "llx"
+#define __UINT_FAST64_MAX__ 18446744073709551615ULL
+#define __UINT_FAST64_TYPE__ long long unsigned int
+#define __UINT_FAST8_FMTX__ "hhX"
+#define __UINT_FAST8_FMTo__ "hho"
+#define __UINT_FAST8_FMTu__ "hhu"
+#define __UINT_FAST8_FMTx__ "hhx"
+#define __UINT_FAST8_MAX__ 255
+#define __UINT_FAST8_TYPE__ unsigned char
+#define __UINT_LEAST16_FMTX__ "hX"
+#define __UINT_LEAST16_FMTo__ "ho"
+#define __UINT_LEAST16_FMTu__ "hu"
+#define __UINT_LEAST16_FMTx__ "hx"
+#define __UINT_LEAST16_MAX__ 65535
+#define __UINT_LEAST16_TYPE__ unsigned short
+#define __UINT_LEAST32_FMTX__ "X"
+#define __UINT_LEAST32_FMTo__ "o"
+#define __UINT_LEAST32_FMTu__ "u"
+#define __UINT_LEAST32_FMTx__ "x"
+#define __UINT_LEAST32_MAX__ 4294967295U
+#define __UINT_LEAST32_TYPE__ unsigned int
+#define __UINT_LEAST64_FMTX__ "llX"
+#define __UINT_LEAST64_FMTo__ "llo"
+#define __UINT_LEAST64_FMTu__ "llu"
+#define __UINT_LEAST64_FMTx__ "llx"
+#define __UINT_LEAST64_MAX__ 18446744073709551615ULL
+#define __UINT_LEAST64_TYPE__ long long unsigned int
+#define __UINT_LEAST8_FMTX__ "hhX"
+#define __UINT_LEAST8_FMTo__ "hho"
+#define __UINT_LEAST8_FMTu__ "hhu"
+#define __UINT_LEAST8_FMTx__ "hhx"
+#define __UINT_LEAST8_MAX__ 255
+#define __UINT_LEAST8_TYPE__ unsigned char
+#define __USER_LABEL_PREFIX__
+#define __USE_TIME_BITS64 1
+#define __WASI_ADVICE_DONTNEED (UINT8_C(4))
+#define __WASI_ADVICE_NOREUSE (UINT8_C(5))
+#define __WASI_ADVICE_NORMAL (UINT8_C(0))
+#define __WASI_ADVICE_RANDOM (UINT8_C(2))
+#define __WASI_ADVICE_SEQUENTIAL (UINT8_C(1))
+#define __WASI_ADVICE_WILLNEED (UINT8_C(3))
+#define __WASI_CLOCKID_MONOTONIC (UINT32_C(1))
+#define __WASI_CLOCKID_PROCESS_CPUTIME_ID (UINT32_C(2))
+#define __WASI_CLOCKID_REALTIME (UINT32_C(0))
+#define __WASI_CLOCKID_THREAD_CPUTIME_ID (UINT32_C(3))
+#define __WASI_DIRCOOKIE_START (UINT64_C(0))
+#define __WASI_ERRNO_2BIG (UINT16_C(1))
+#define __WASI_ERRNO_ACCES (UINT16_C(2))
+#define __WASI_ERRNO_ADDRINUSE (UINT16_C(3))
+#define __WASI_ERRNO_ADDRNOTAVAIL (UINT16_C(4))
+#define __WASI_ERRNO_AFNOSUPPORT (UINT16_C(5))
+#define __WASI_ERRNO_AGAIN (UINT16_C(6))
+#define __WASI_ERRNO_ALREADY (UINT16_C(7))
+#define __WASI_ERRNO_BADF (UINT16_C(8))
+#define __WASI_ERRNO_BADMSG (UINT16_C(9))
+#define __WASI_ERRNO_BUSY (UINT16_C(10))
+#define __WASI_ERRNO_CANCELED (UINT16_C(11))
+#define __WASI_ERRNO_CHILD (UINT16_C(12))
+#define __WASI_ERRNO_CONNABORTED (UINT16_C(13))
+#define __WASI_ERRNO_CONNREFUSED (UINT16_C(14))
+#define __WASI_ERRNO_CONNRESET (UINT16_C(15))
+#define __WASI_ERRNO_DEADLK (UINT16_C(16))
+#define __WASI_ERRNO_DESTADDRREQ (UINT16_C(17))
+#define __WASI_ERRNO_DOM (UINT16_C(18))
+#define __WASI_ERRNO_DQUOT (UINT16_C(19))
+#define __WASI_ERRNO_EXIST (UINT16_C(20))
+#define __WASI_ERRNO_FAULT (UINT16_C(21))
+#define __WASI_ERRNO_FBIG (UINT16_C(22))
+#define __WASI_ERRNO_HOSTUNREACH (UINT16_C(23))
+#define __WASI_ERRNO_IDRM (UINT16_C(24))
+#define __WASI_ERRNO_ILSEQ (UINT16_C(25))
+#define __WASI_ERRNO_INPROGRESS (UINT16_C(26))
+#define __WASI_ERRNO_INTR (UINT16_C(27))
+#define __WASI_ERRNO_INVAL (UINT16_C(28))
+#define __WASI_ERRNO_IO (UINT16_C(29))
+#define __WASI_ERRNO_ISCONN (UINT16_C(30))
+#define __WASI_ERRNO_ISDIR (UINT16_C(31))
+#define __WASI_ERRNO_LOOP (UINT16_C(32))
+#define __WASI_ERRNO_MFILE (UINT16_C(33))
+#define __WASI_ERRNO_MLINK (UINT16_C(34))
+#define __WASI_ERRNO_MSGSIZE (UINT16_C(35))
+#define __WASI_ERRNO_MULTIHOP (UINT16_C(36))
+#define __WASI_ERRNO_NAMETOOLONG (UINT16_C(37))
+#define __WASI_ERRNO_NETDOWN (UINT16_C(38))
+#define __WASI_ERRNO_NETRESET (UINT16_C(39))
+#define __WASI_ERRNO_NETUNREACH (UINT16_C(40))
+#define __WASI_ERRNO_NFILE (UINT16_C(41))
+#define __WASI_ERRNO_NOBUFS (UINT16_C(42))
+#define __WASI_ERRNO_NODEV (UINT16_C(43))
+#define __WASI_ERRNO_NOENT (UINT16_C(44))
+#define __WASI_ERRNO_NOEXEC (UINT16_C(45))
+#define __WASI_ERRNO_NOLCK (UINT16_C(46))
+#define __WASI_ERRNO_NOLINK (UINT16_C(47))
+#define __WASI_ERRNO_NOMEM (UINT16_C(48))
+#define __WASI_ERRNO_NOMSG (UINT16_C(49))
+#define __WASI_ERRNO_NOPROTOOPT (UINT16_C(50))
+#define __WASI_ERRNO_NOSPC (UINT16_C(51))
+#define __WASI_ERRNO_NOSYS (UINT16_C(52))
+#define __WASI_ERRNO_NOTCAPABLE (UINT16_C(76))
+#define __WASI_ERRNO_NOTCONN (UINT16_C(53))
+#define __WASI_ERRNO_NOTDIR (UINT16_C(54))
+#define __WASI_ERRNO_NOTEMPTY (UINT16_C(55))
+#define __WASI_ERRNO_NOTRECOVERABLE (UINT16_C(56))
+#define __WASI_ERRNO_NOTSOCK (UINT16_C(57))
+#define __WASI_ERRNO_NOTSUP (UINT16_C(58))
+#define __WASI_ERRNO_NOTTY (UINT16_C(59))
+#define __WASI_ERRNO_NXIO (UINT16_C(60))
+#define __WASI_ERRNO_OVERFLOW (UINT16_C(61))
+#define __WASI_ERRNO_OWNERDEAD (UINT16_C(62))
+#define __WASI_ERRNO_PERM (UINT16_C(63))
+#define __WASI_ERRNO_PIPE (UINT16_C(64))
+#define __WASI_ERRNO_PROTO (UINT16_C(65))
+#define __WASI_ERRNO_PROTONOSUPPORT (UINT16_C(66))
+#define __WASI_ERRNO_PROTOTYPE (UINT16_C(67))
+#define __WASI_ERRNO_RANGE (UINT16_C(68))
+#define __WASI_ERRNO_ROFS (UINT16_C(69))
+#define __WASI_ERRNO_SPIPE (UINT16_C(70))
+#define __WASI_ERRNO_SRCH (UINT16_C(71))
+#define __WASI_ERRNO_STALE (UINT16_C(72))
+#define __WASI_ERRNO_SUCCESS (UINT16_C(0))
+#define __WASI_ERRNO_TIMEDOUT (UINT16_C(73))
+#define __WASI_ERRNO_TXTBSY (UINT16_C(74))
+#define __WASI_ERRNO_XDEV (UINT16_C(75))
+#define __WASI_EVENTRWFLAGS_FD_READWRITE_HANGUP ((__wasi_eventrwflags_t)(1 << 0))
+#define __WASI_EVENTTYPE_CLOCK (UINT8_C(0))
+#define __WASI_EVENTTYPE_FD_READ (UINT8_C(1))
+#define __WASI_EVENTTYPE_FD_WRITE (UINT8_C(2))
+#define __WASI_FDFLAGS_APPEND ((__wasi_fdflags_t)(1 << 0))
+#define __WASI_FDFLAGS_DSYNC ((__wasi_fdflags_t)(1 << 1))
+#define __WASI_FDFLAGS_NONBLOCK ((__wasi_fdflags_t)(1 << 2))
+#define __WASI_FDFLAGS_RSYNC ((__wasi_fdflags_t)(1 << 3))
+#define __WASI_FDFLAGS_SYNC ((__wasi_fdflags_t)(1 << 4))
+#define __WASI_FILETYPE_BLOCK_DEVICE (UINT8_C(1))
+#define __WASI_FILETYPE_CHARACTER_DEVICE (UINT8_C(2))
+#define __WASI_FILETYPE_DIRECTORY (UINT8_C(3))
+#define __WASI_FILETYPE_REGULAR_FILE (UINT8_C(4))
+#define __WASI_FILETYPE_SOCKET_DGRAM (UINT8_C(5))
+#define __WASI_FILETYPE_SOCKET_STREAM (UINT8_C(6))
+#define __WASI_FILETYPE_SYMBOLIC_LINK (UINT8_C(7))
+#define __WASI_FILETYPE_UNKNOWN (UINT8_C(0))
+#define __WASI_FSTFLAGS_ATIM ((__wasi_fstflags_t)(1 << 0))
+#define __WASI_FSTFLAGS_ATIM_NOW ((__wasi_fstflags_t)(1 << 1))
+#define __WASI_FSTFLAGS_MTIM ((__wasi_fstflags_t)(1 << 2))
+#define __WASI_FSTFLAGS_MTIM_NOW ((__wasi_fstflags_t)(1 << 3))
+#define __WASI_LOOKUPFLAGS_SYMLINK_FOLLOW ((__wasi_lookupflags_t)(1 << 0))
+#define __WASI_OFLAGS_CREAT ((__wasi_oflags_t)(1 << 0))
+#define __WASI_OFLAGS_DIRECTORY ((__wasi_oflags_t)(1 << 1))
+#define __WASI_OFLAGS_EXCL ((__wasi_oflags_t)(1 << 2))
+#define __WASI_OFLAGS_TRUNC ((__wasi_oflags_t)(1 << 3))
+#define __WASI_PREOPENTYPE_DIR (UINT8_C(0))
+#define __WASI_RIFLAGS_RECV_PEEK ((__wasi_riflags_t)(1 << 0))
+#define __WASI_RIFLAGS_RECV_WAITALL ((__wasi_riflags_t)(1 << 1))
+#define __WASI_RIGHTS_FD_ADVISE ((__wasi_rights_t)(1 << 7))
+#define __WASI_RIGHTS_FD_ALLOCATE ((__wasi_rights_t)(1 << 8))
+#define __WASI_RIGHTS_FD_DATASYNC ((__wasi_rights_t)(1 << 0))
+#define __WASI_RIGHTS_FD_FDSTAT_SET_FLAGS ((__wasi_rights_t)(1 << 3))
+#define __WASI_RIGHTS_FD_FILESTAT_GET ((__wasi_rights_t)(1 << 21))
+#define __WASI_RIGHTS_FD_FILESTAT_SET_SIZE ((__wasi_rights_t)(1 << 22))
+#define __WASI_RIGHTS_FD_FILESTAT_SET_TIMES ((__wasi_rights_t)(1 << 23))
+#define __WASI_RIGHTS_FD_READ ((__wasi_rights_t)(1 << 1))
+#define __WASI_RIGHTS_FD_READDIR ((__wasi_rights_t)(1 << 14))
+#define __WASI_RIGHTS_FD_SEEK ((__wasi_rights_t)(1 << 2))
+#define __WASI_RIGHTS_FD_SYNC ((__wasi_rights_t)(1 << 4))
+#define __WASI_RIGHTS_FD_TELL ((__wasi_rights_t)(1 << 5))
+#define __WASI_RIGHTS_FD_WRITE ((__wasi_rights_t)(1 << 6))
+#define __WASI_RIGHTS_PATH_CREATE_DIRECTORY ((__wasi_rights_t)(1 << 9))
+#define __WASI_RIGHTS_PATH_CREATE_FILE ((__wasi_rights_t)(1 << 10))
+#define __WASI_RIGHTS_PATH_FILESTAT_GET ((__wasi_rights_t)(1 << 18))
+#define __WASI_RIGHTS_PATH_FILESTAT_SET_SIZE ((__wasi_rights_t)(1 << 19))
+#define __WASI_RIGHTS_PATH_FILESTAT_SET_TIMES ((__wasi_rights_t)(1 << 20))
+#define __WASI_RIGHTS_PATH_LINK_SOURCE ((__wasi_rights_t)(1 << 11))
+#define __WASI_RIGHTS_PATH_LINK_TARGET ((__wasi_rights_t)(1 << 12))
+#define __WASI_RIGHTS_PATH_OPEN ((__wasi_rights_t)(1 << 13))
+#define __WASI_RIGHTS_PATH_READLINK ((__wasi_rights_t)(1 << 15))
+#define __WASI_RIGHTS_PATH_REMOVE_DIRECTORY ((__wasi_rights_t)(1 << 25))
+#define __WASI_RIGHTS_PATH_RENAME_SOURCE ((__wasi_rights_t)(1 << 16))
+#define __WASI_RIGHTS_PATH_RENAME_TARGET ((__wasi_rights_t)(1 << 17))
+#define __WASI_RIGHTS_PATH_SYMLINK ((__wasi_rights_t)(1 << 24))
+#define __WASI_RIGHTS_PATH_UNLINK_FILE ((__wasi_rights_t)(1 << 26))
+#define __WASI_RIGHTS_POLL_FD_READWRITE ((__wasi_rights_t)(1 << 27))
+#define __WASI_RIGHTS_SOCK_ACCEPT ((__wasi_rights_t)(1 << 29))
+#define __WASI_RIGHTS_SOCK_SHUTDOWN ((__wasi_rights_t)(1 << 28))
+#define __WASI_ROFLAGS_RECV_DATA_TRUNCATED ((__wasi_roflags_t)(1 << 0))
+#define __WASI_SDFLAGS_RD ((__wasi_sdflags_t)(1 << 0))
+#define __WASI_SDFLAGS_WR ((__wasi_sdflags_t)(1 << 1))
+#define __WASI_SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME ((__wasi_subclockflags_t)(1 << 0))
+#define __WASI_WHENCE_CUR (UINT8_C(1))
+#define __WASI_WHENCE_END (UINT8_C(2))
+#define __WASI_WHENCE_SET (UINT8_C(0))
+#define __WCHAR_MAX__ 2147483647
+#define __WCHAR_TYPE__ int
+#define __WCHAR_WIDTH__ 32
+#define __WINT_MAX__ 2147483647
+#define __WINT_TYPE__ int
+#define __WINT_WIDTH__ 32
+#define __WORDSIZE 64
+#define __alignas_is_defined 1
+#define __alignof_is_defined 1
+#define __bitop(x,i,o) ((x)[(i)/8] o (1<<(i)%8))
+#define __bool_true_false_are_defined 1
+#define __inline inline
+#define __restrict restrict
+#define __tg_complex(fun,x) (__RETCAST_CX(x)( __FLTCX((x)+I) && __IS_FP(x) ? fun ## f (x) : __LDBLCX((x)+I) ? fun ## l (x) : fun(x) ))
+#define __tg_complex_retreal(fun,x) (__RETCAST_REAL(x)( __FLTCX((x)+I) && __IS_FP(x) ? fun ## f (x) : __LDBLCX((x)+I) ? fun ## l (x) : fun(x) ))
+#define __tg_real(fun,x) (__RETCAST(x)__tg_real_nocast(fun, x))
+#define __tg_real_2(fun,x,y) (__RETCAST_2(x, y)( __FLT(x) && __FLT(y) ? fun ## f (x, y) : __LDBL((x)+(y)) ? fun ## l (x, y) : fun(x, y) ))
+#define __tg_real_2_1(fun,x,y) (__RETCAST(x)( __FLT(x) ? fun ## f (x, y) : __LDBL(x) ? fun ## l (x, y) : fun(x, y) ))
+#define __tg_real_complex(fun,x) (__RETCAST(x)( __FLTCX(x) ? c ## fun ## f (x) : __DBLCX(x) ? c ## fun (x) : __LDBLCX(x) ? c ## fun ## l (x) : __FLT(x) ? fun ## f (x) : __LDBL(x) ? fun ## l (x) : fun(x) ))
+#define __tg_real_complex_fabs(x) (__RETCAST_REAL(x)( __FLTCX(x) ? cabsf(x) : __DBLCX(x) ? cabs(x) : __LDBLCX(x) ? cabsl(x) : __FLT(x) ? fabsf(x) : __LDBL(x) ? fabsl(x) : fabs(x) ))
+#define __tg_real_complex_pow(x,y) (__RETCAST_2(x, y)( __FLTCX((x)+(y)) && __IS_FP(x) && __IS_FP(y) ? cpowf(x, y) : __FLTCX((x)+(y)) ? cpow(x, y) : __DBLCX((x)+(y)) ? cpow(x, y) : __LDBLCX((x)+(y)) ? cpowl(x, y) : __FLT(x) && __FLT(y) ? powf(x, y) : __LDBL((x)+(y)) ? powl(x, y) : pow(x, y) ))
+#define __tg_real_fma(x,y,z) (__RETCAST_3(x, y, z)( __FLT(x) && __FLT(y) && __FLT(z) ? fmaf(x, y, z) : __LDBL((x)+(y)+(z)) ? fmal(x, y, z) : fma(x, y, z) ))
+#define __tg_real_nocast(fun,x) ( __FLT(x) ? fun ## f (x) : __LDBL(x) ? fun ## l (x) : fun(x) )
+#define __tg_real_remquo(x,y,z) (__RETCAST_2(x, y)( __FLT(x) && __FLT(y) ? remquof(x, y, z) : __LDBL((x)+(y)) ? remquol(x, y, z) : remquo(x, y, z) ))
+#define __tm_gmtoff tm_gmtoff
+#define __tm_zone tm_zone
+#define __va_copy(d,s) __builtin_va_copy(d,s)
+#define __wasi__ 1
+#define __wasi_api_h
+#define __wasi_libc_environ_h
+#define __wasi_libc_find_relpath_h
+#define __wasi_libc_h
+#define __wasi_libc_nocwd_h
+#define __wasilibc___errno_h
+#define __wasilibc___errno_values_h
+#define __wasilibc___fd_set_h
+#define __wasilibc___function___isatty_h
+#define __wasilibc___functions_malloc_h
+#define __wasilibc___functions_memcpy_h
+#define __wasilibc___header_dirent_h
+#define __wasilibc___header_fcntl_h
+#define __wasilibc___header_netinet_in_h
+#define __wasilibc___header_poll_h
+#define __wasilibc___header_stdlib_h
+#define __wasilibc___header_string_h
+#define __wasilibc___header_sys_ioctl_h
+#define __wasilibc___header_sys_resource_h
+#define __wasilibc___header_sys_socket_h
+#define __wasilibc___header_sys_stat_h
+#define __wasilibc___header_time_h
+#define __wasilibc___header_unistd_h
+#define __wasilibc___include_inttypes_h
+#define __wasilibc___macro_FD_SETSIZE_h
+#define __wasilibc___macro_PAGESIZE_h
+#define __wasilibc___mode_t_h
+#define __wasilibc___seek_h
+#define __wasilibc___struct_dirent_h
+#define __wasilibc___struct_in6_addr_h
+#define __wasilibc___struct_in_addr_h
+#define __wasilibc___struct_iovec_h
+#define __wasilibc___struct_msghdr_h
+#define __wasilibc___struct_pollfd_h
+#define __wasilibc___struct_rusage_h
+#define __wasilibc___struct_sockaddr_h
+#define __wasilibc___struct_sockaddr_in6_h
+#define __wasilibc___struct_sockaddr_in_h
+#define __wasilibc___struct_sockaddr_storage_h
+#define __wasilibc___struct_sockaddr_un_h
+#define __wasilibc___struct_stat_h
+#define __wasilibc___struct_timespec_h
+#define __wasilibc___struct_timeval_h
+#define __wasilibc___struct_tm_h
+#define __wasilibc___struct_tms_h
+#define __wasilibc___typedef_DIR_h
+#define __wasilibc___typedef_blkcnt_t_h
+#define __wasilibc___typedef_blksize_t_h
+#define __wasilibc___typedef_clock_t_h
+#define __wasilibc___typedef_clockid_t_h
+#define __wasilibc___typedef_dev_t_h
+#define __wasilibc___typedef_fd_set_h
+#define __wasilibc___typedef_gid_t_h
+#define __wasilibc___typedef_in_addr_t_h
+#define __wasilibc___typedef_in_port_t_h
+#define __wasilibc___typedef_ino_t_h
+#define __wasilibc___typedef_mode_t_h
+#define __wasilibc___typedef_nfds_t_h
+#define __wasilibc___typedef_nlink_t_h
+#define __wasilibc___typedef_off_t_h
+#define __wasilibc___typedef_sa_family_t_h
+#define __wasilibc___typedef_sigset_t_h
+#define __wasilibc___typedef_socklen_t_h
+#define __wasilibc___typedef_ssize_t_h
+#define __wasilibc___typedef_suseconds_t_h
+#define __wasilibc___typedef_time_t_h
+#define __wasilibc___typedef_uid_t_h
+#define __wasm 1
+#define __wasm32 1
+#define __wasm32__ 1
+#define __wasm__ 1
+#define __wasm_atomics__ 1
+#define __wasm_bulk_memory__ 1
+#define __wasm_mutable_globals__ 1
+#define __wasm_sign_ext__ 1
+#define _tolower(a) ((a)|0x20)
+#define _toupper(a) ((a)&0x5f)
+#define acos(x) __tg_real_complex(acos, (x))
+#define acosh(x) __tg_real_complex(acosh, (x))
+#define alignas _Alignas
+#define alignof _Alignof
+#define alloca __builtin_alloca
+#define alphasort64 alphasort
+#define and &&
+#define and_eq &=
+#define asin(x) __tg_real_complex(asin, (x))
+#define asinh(x) __tg_real_complex(asinh, (x))
+#define assert(x) (void)0
+#define atan(x) __tg_real_complex(atan, (x))
+#define atan2(x,y) __tg_real_2(atan2, (x), (y))
+#define atanh(x) __tg_real_complex(atanh, (x))
+#define be16toh(x) __bswap16(x)
+#define be32toh(x) __bswap32(x)
+#define be64toh(x) __bswap64(x)
+#define betoh16(x) __bswap16(x)
+#define betoh32(x) __bswap32(x)
+#define betoh64(x) __bswap64(x)
+#define bitand &
+#define bitor |
+#define blkcnt64_t blkcnt_t
+#define bool _Bool
+#define bswap_16(x) __bswap_16(x)
+#define bswap_32(x) __bswap_32(x)
+#define bswap_64(x) __bswap_64(x)
+#define carg(x) __tg_complex_retreal(carg, (x))
+#define cbrt(x) __tg_real(cbrt, (x))
+#define ceil(x) __tg_real(ceil, (x))
+#define cimag(x) __tg_complex_retreal(cimag, (x))
+#define cimagf(x) (__builtin_cimagf(x))
+#define cimagl(x) (__builtin_cimagl(x))
+#define clrbit(x,i) __bitop(x,i,&=~)
+#define compl ~
+#define complex _Complex
+#define conj(x) __tg_complex(conj, (x))
+#define copysign(x,y) __tg_real_2(copysign, (x), (y))
+#define cos(x) __tg_real_complex(cos, (x))
+#define cosh(x) __tg_real_complex(cosh, (x))
+#define cproj(x) __tg_complex(cproj, (x))
+#define creal(x) __tg_complex_retreal(creal, (x))
+#define crealf(x) (__builtin_crealf(x))
+#define creall(x) (__builtin_creall(x))
+#define creat64 creat
+#define d_fileno d_ino
+#define direct dirent
+#define dirent64 dirent
+#define erf(x) __tg_real(erf, (x))
+#define erfc(x) __tg_real(erfc, (x))
+#define errno errno
+#define exp(x) __tg_real_complex(exp, (x))
+#define exp2(x) __tg_real(exp2, (x))
+#define expm1(x) __tg_real(expm1, (x))
+#define fabs(x) __tg_real_complex_fabs(x)
+#define false 0
+#define fdim(x,y) __tg_real_2(fdim, (x), (y))
+#define fgetpos64 fgetpos
+#define floor(x) __tg_real(floor, (x))
+#define fma(x,y,z) __tg_real_fma((x), (y), (z))
+#define fmax(x,y) __tg_real_2(fmax, (x), (y))
+#define fmin(x,y) __tg_real_2(fmin, (x), (y))
+#define fmod(x,y) __tg_real_2(fmod, (x), (y))
+#define fopen64 fopen
+#define fpclassify(x) (__builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x))
+#define fpos64_t fpos_t
+#define freopen64 freopen
+#define frexp(x,y) __tg_real_2_1(frexp, (x), (y))
+#define fsblkcnt64_t fsblkcnt_t
+#define fseeko64 fseeko
+#define fsetpos64 fsetpos
+#define fsfilcnt64_t fsfilcnt_t
+#define fstat64 fstat
+#define fstatat64 fstatat
+#define ftello64 ftello
+#define ftruncate64 ftruncate
+#define getdents64 getdents
+#define glob64 glob
+#define glob64_t glob_t
+#define globfree64 globfree
+#define howmany(n,d) (((n)+((d)-1))/(d))
+#define htobe16(x) __bswap16(x)
+#define htobe32(x) __bswap32(x)
+#define htobe64(x) __bswap64(x)
+#define htole16(x) (uint16_t)(x)
+#define htole32(x) (uint32_t)(x)
+#define htole64(x) (uint64_t)(x)
+#define hypot(x,y) __tg_real_2(hypot, (x), (y))
+#define icmp6_data16 icmp6_dataun.icmp6_un_data16
+#define icmp6_data32 icmp6_dataun.icmp6_un_data32
+#define icmp6_data8 icmp6_dataun.icmp6_un_data8
+#define icmp6_id icmp6_data16[0]
+#define icmp6_maxdelay icmp6_data16[0]
+#define icmp6_mtu icmp6_data32[0]
+#define icmp6_pptr icmp6_data32[0]
+#define icmp6_seq icmp6_data16[1]
+#define icmp_data icmp_dun.id_data
+#define icmp_gwaddr icmp_hun.ih_gwaddr
+#define icmp_id icmp_hun.ih_idseq.icd_id
+#define icmp_ip icmp_dun.id_ip.idi_ip
+#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime
+#define icmp_mask icmp_dun.id_mask
+#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu
+#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs
+#define icmp_otime icmp_dun.id_ts.its_otime
+#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
+#define icmp_pptr icmp_hun.ih_pptr
+#define icmp_radv icmp_dun.id_radv
+#define icmp_rtime icmp_dun.id_ts.its_rtime
+#define icmp_seq icmp_hun.ih_idseq.icd_seq
+#define icmp_ttime icmp_dun.id_ts.its_ttime
+#define icmp_void icmp_hun.ih_void
+#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa
+#define ifa_broadaddr ifa_ifu.ifu_broadaddr
+#define ifa_dstaddr ifa_ifu.ifu_dstaddr
+#define ilogb(x) __tg_real_nocast(ilogb, (x))
+#define ino64_t ino_t
+#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
+#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
+#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
+#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
+#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
+#define ip6_vfc ip6_ctlun.ip6_un2_vfc
+#define isalpha(a) (0 ? isalpha(a) : (((unsigned)(a)|32)-'a') < 26)
+#define isascii(a) (0 ? isascii(a) : (unsigned)(a) < 128)
+#define isclr(x,i) !isset(x,i)
+#define isdigit(a) (0 ? isdigit(a) : ((unsigned)(a)-'0') < 10)
+#define isfinite(x) (__builtin_isfinite(x))
+#define isgraph(a) (0 ? isgraph(a) : ((unsigned)(a)-0x21) < 0x5e)
+#define isgreater(x,y) (__builtin_isgreater(x, y))
+#define isgreaterequal(x,y) (__builtin_isgreaterequal(x, y))
+#define isinf(x) (__builtin_isinf(x))
+#define isless(x,y) (__builtin_isless(x, y))
+#define islessequal(x,y) (__builtin_islessequal(x, y))
+#define islessgreater(x,y) (__builtin_islessgreater(x, y))
+#define islower(a) (0 ? islower(a) : ((unsigned)(a)-'a') < 26)
+#define isnan(x) (__builtin_isnan(x))
+#define isnormal(x) (__builtin_isnormal(x))
+#define isprint(a) (0 ? isprint(a) : ((unsigned)(a)-0x20) < 0x5f)
+#define isset(x,i) __bitop(x,i,&)
+#define isspace(a) __isspace(a)
+#define isunordered(x,y) (__builtin_isunordered(x, y))
+#define isupper(a) (0 ? isupper(a) : ((unsigned)(a)-'A') < 26)
+#define iswdigit(a) (0 ? iswdigit(a) : ((unsigned)(a)-'0') < 10)
+#define ldexp(x,y) __tg_real_2_1(ldexp, (x), (y))
+#define le16toh(x) (uint16_t)(x)
+#define le32toh(x) (uint32_t)(x)
+#define le64toh(x) (uint64_t)(x)
+#define letoh16(x) (uint16_t)(x)
+#define letoh32(x) (uint32_t)(x)
+#define letoh64(x) (uint64_t)(x)
+#define lgamma(x) __tg_real(lgamma, (x))
+#define llrint(x) __tg_real_nocast(llrint, (x))
+#define llround(x) __tg_real_nocast(llround, (x))
+#define loff_t off_t
+#define log(x) __tg_real_complex(log, (x))
+#define log10(x) __tg_real(log10, (x))
+#define log1p(x) __tg_real(log1p, (x))
+#define log2(x) __tg_real(log2, (x))
+#define logb(x) __tg_real(logb, (x))
+#define lrint(x) __tg_real_nocast(lrint, (x))
+#define lround(x) __tg_real_nocast(lround, (x))
+#define lseek(fd,offset,whence) ({ off_t __f = (fd); off_t __o = (offset); off_t __w = (whence); __builtin_constant_p((offset)) && __builtin_constant_p((whence)) && __o == 0 && __w == SEEK_CUR ? __wasilibc_tell(__f) : lseek(__f, __o, __w); })
+#define lseek64 lseek
+#define lstat64 lstat
+#define math_errhandling 2
+#define mld_cksum mld_icmp6_hdr.icmp6_cksum
+#define mld_code mld_icmp6_hdr.icmp6_code
+#define mld_maxdelay mld_icmp6_hdr.icmp6_data16[0]
+#define mld_reserved mld_icmp6_hdr.icmp6_data16[1]
+#define mld_type mld_icmp6_hdr.icmp6_type
+#define nd_na_cksum nd_na_hdr.icmp6_cksum
+#define nd_na_code nd_na_hdr.icmp6_code
+#define nd_na_flags_reserved nd_na_hdr.icmp6_data32[0]
+#define nd_na_type nd_na_hdr.icmp6_type
+#define nd_ns_cksum nd_ns_hdr.icmp6_cksum
+#define nd_ns_code nd_ns_hdr.icmp6_code
+#define nd_ns_reserved nd_ns_hdr.icmp6_data32[0]
+#define nd_ns_type nd_ns_hdr.icmp6_type
+#define nd_ra_cksum nd_ra_hdr.icmp6_cksum
+#define nd_ra_code nd_ra_hdr.icmp6_code
+#define nd_ra_curhoplimit nd_ra_hdr.icmp6_data8[0]
+#define nd_ra_flags_reserved nd_ra_hdr.icmp6_data8[1]
+#define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1]
+#define nd_ra_type nd_ra_hdr.icmp6_type
+#define nd_rd_cksum nd_rd_hdr.icmp6_cksum
+#define nd_rd_code nd_rd_hdr.icmp6_code
+#define nd_rd_reserved nd_rd_hdr.icmp6_data32[0]
+#define nd_rd_type nd_rd_hdr.icmp6_type
+#define nd_rs_cksum nd_rs_hdr.icmp6_cksum
+#define nd_rs_code nd_rs_hdr.icmp6_code
+#define nd_rs_reserved nd_rs_hdr.icmp6_data32[0]
+#define nd_rs_type nd_rs_hdr.icmp6_type
+#define nearbyint(x) __tg_real(nearbyint, (x))
+#define nextafter(x,y) __tg_real_2(nextafter, (x), (y))
+#define nexttoward(x,y) __tg_real_2(nexttoward, (x), (y))
+#define nftw64 nftw
+#define no_argument 0
+#define noreturn _Noreturn
+#define not !
+#define not_eq !=
+#define ns_msg_base(handle) ((handle)._msg + 0)
+#define ns_msg_count(handle,section) ((handle)._counts[section] + 0)
+#define ns_msg_end(handle) ((handle)._eom + 0)
+#define ns_msg_getflag(handle,flag) (((handle)._flags & _ns_flagdata[flag].mask) >> _ns_flagdata[flag].shift)
+#define ns_msg_id(handle) ((handle)._id + 0)
+#define ns_msg_size(handle) ((handle)._eom - (handle)._msg)
+#define ns_rr_class(rr) ((ns_class)((rr).rr_class + 0))
+#define ns_rr_name(rr) (((rr).name[0] != '\0') ? (rr).name : ".")
+#define ns_rr_rdata(rr) ((rr).rdata + 0)
+#define ns_rr_rdlen(rr) ((rr).rdlength + 0)
+#define ns_rr_ttl(rr) ((rr).ttl + 0)
+#define ns_rr_type(rr) ((ns_type)((rr).type + 0))
+#define ns_t_mrr_p(t) ((t) == ns_t_tsig || (t) == ns_t_opt)
+#define ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || (t) == ns_t_mailb || (t) == ns_t_maila)
+#define ns_t_rr_p(t) (!ns_t_qt_p(t) && !ns_t_mrr_p(t))
+#define ns_t_udp_p(t) ((t) != ns_t_axfr && (t) != ns_t_zxfr)
+#define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || (t) == ns_t_zxfr)
+#define off64_t off_t
+#define offsetof(t,d) __builtin_offsetof(t, d)
+#define open64 open
+#define openat64 openat
+#define optional_argument 2
+#define or ||
+#define or_eq |=
+#define posix_fadvise64 posix_fadvise
+#define posix_fallocate64 posix_fallocate
+#define pow(x,y) __tg_real_complex_pow((x), (y))
+#define powerof2(n) !(((n)-1) & (n))
+#define pread64 pread
+#define preadv64 preadv
+#define pthread_cleanup_pop(r) _pthread_cleanup_pop(&__cb, (r)); } while(0)
+#define pthread_cleanup_push(f,x) do { struct __ptcb __cb; _pthread_cleanup_push(&__cb, f, x);
+#define pthread_equal(x,y) ((x)==(y))
+#define pwrite64 pwrite
+#define pwritev64 pwritev
+#define readdir64 readdir
+#define remainder(x,y) __tg_real_2(remainder, (x), (y))
+#define remquo(x,y,z) __tg_real_remquo((x), (y), (z))
+#define required_argument 1
+#define rint(x) __tg_real(rint, (x))
+#define round(x) __tg_real(round, (x))
+#define roundup(n,d) (howmany(n,d)*(d))
+#define rr_cksum rr_hdr.icmp6_cksum
+#define rr_code rr_hdr.icmp6_code
+#define rr_seqnum rr_hdr.icmp6_data32[0]
+#define rr_type rr_hdr.icmp6_type
+#define scalbln(x,y) __tg_real_2_1(scalbln, (x), (y))
+#define scalbn(x,y) __tg_real_2_1(scalbn, (x), (y))
+#define scandir64 scandir
+#define setbit(x,i) __bitop(x,i,|=)
+#define signbit(x) (__builtin_signbit(x))
+#define sin(x) __tg_real_complex(sin, (x))
+#define sinh(x) __tg_real_complex(sinh, (x))
+#define sqrt(x) __tg_real_complex(sqrt, (x))
+#define st_atime st_atim.tv_sec
+#define st_ctime st_ctim.tv_sec
+#define st_mtime st_mtim.tv_sec
+#define stat64 stat
+#define static_assert _Static_assert
+#define stderr (stderr)
+#define stdin (stdin)
+#define stdout (stdout)
+#define strdupa(x) strcpy(alloca(strlen(x)+1),x)
+#define tan(x) __tg_real_complex(tan, (x))
+#define tanh(x) __tg_real_complex(tanh, (x))
+#define telcmds ((char [][6]){ "EOF", "SUSP", "ABORT", "EOR", "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC", "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0 })
+#define tgamma(x) __tg_real(tgamma, (x))
+#define th_block th_u.tu_block
+#define th_code th_u.tu_code
+#define th_msg th_data
+#define th_stuff th_u.tu_stuff
+#define thrd_equal(A,B) ((A) == (B))
+#define thread_local _Thread_local
+#define timeradd(s,t,a) (void) ( (a)->tv_sec = (s)->tv_sec + (t)->tv_sec, ((a)->tv_usec = (s)->tv_usec + (t)->tv_usec) >= 1000000 && ((a)->tv_usec -= 1000000, (a)->tv_sec++) )
+#define timerclear(t) ((t)->tv_sec = (t)->tv_usec = 0)
+#define timercmp(s,t,op) ((s)->tv_sec == (t)->tv_sec ? (s)->tv_usec op (t)->tv_usec : (s)->tv_sec op (t)->tv_sec)
+#define timerisset(t) ((t)->tv_sec || (t)->tv_usec)
+#define timersub(s,t,a) (void) ( (a)->tv_sec = (s)->tv_sec - (t)->tv_sec, ((a)->tv_usec = (s)->tv_usec - (t)->tv_usec) < 0 && ((a)->tv_usec += 1000000, (a)->tv_sec--) )
+#define true 1
+#define trunc(x) __tg_real(trunc, (x))
+#define uh_dport dest
+#define uh_sport source
+#define uh_sum check
+#define uh_ulen len
+#define va_arg(ap,type) __builtin_va_arg(ap, type)
+#define va_copy(dest,src) __builtin_va_copy(dest, src)
+#define va_end(ap) __builtin_va_end(ap)
+#define va_start(ap,param) __builtin_va_start(ap, param)
+#define versionsort64 versionsort
+#define xEOF 236
+#define xor ^
+#define xor_eq ^=
diff --git a/expected/wasm32-wasi/posix/undefined-symbols.txt b/expected/wasm32-wasi/posix/undefined-symbols.txt
new file mode 100644
index 0000000..7def0a9
--- /dev/null
+++ b/expected/wasm32-wasi/posix/undefined-symbols.txt
@@ -0,0 +1,73 @@
+__addtf3
+__divtf3
+__eqtf2
+__extenddftf2
+__extendsftf2
+__fixtfdi
+__fixtfsi
+__fixunstfsi
+__floatsitf
+__floatunsitf
+__getf2
+__gttf2
+__heap_base
+__imported_wasi_snapshot_preview1_args_get
+__imported_wasi_snapshot_preview1_args_sizes_get
+__imported_wasi_snapshot_preview1_clock_res_get
+__imported_wasi_snapshot_preview1_clock_time_get
+__imported_wasi_snapshot_preview1_environ_get
+__imported_wasi_snapshot_preview1_environ_sizes_get
+__imported_wasi_snapshot_preview1_fd_advise
+__imported_wasi_snapshot_preview1_fd_allocate
+__imported_wasi_snapshot_preview1_fd_close
+__imported_wasi_snapshot_preview1_fd_datasync
+__imported_wasi_snapshot_preview1_fd_fdstat_get
+__imported_wasi_snapshot_preview1_fd_fdstat_set_flags
+__imported_wasi_snapshot_preview1_fd_fdstat_set_rights
+__imported_wasi_snapshot_preview1_fd_filestat_get
+__imported_wasi_snapshot_preview1_fd_filestat_set_size
+__imported_wasi_snapshot_preview1_fd_filestat_set_times
+__imported_wasi_snapshot_preview1_fd_pread
+__imported_wasi_snapshot_preview1_fd_prestat_dir_name
+__imported_wasi_snapshot_preview1_fd_prestat_get
+__imported_wasi_snapshot_preview1_fd_pwrite
+__imported_wasi_snapshot_preview1_fd_read
+__imported_wasi_snapshot_preview1_fd_readdir
+__imported_wasi_snapshot_preview1_fd_renumber
+__imported_wasi_snapshot_preview1_fd_seek
+__imported_wasi_snapshot_preview1_fd_sync
+__imported_wasi_snapshot_preview1_fd_tell
+__imported_wasi_snapshot_preview1_fd_write
+__imported_wasi_snapshot_preview1_path_create_directory
+__imported_wasi_snapshot_preview1_path_filestat_get
+__imported_wasi_snapshot_preview1_path_filestat_set_times
+__imported_wasi_snapshot_preview1_path_link
+__imported_wasi_snapshot_preview1_path_open
+__imported_wasi_snapshot_preview1_path_readlink
+__imported_wasi_snapshot_preview1_path_remove_directory
+__imported_wasi_snapshot_preview1_path_rename
+__imported_wasi_snapshot_preview1_path_symlink
+__imported_wasi_snapshot_preview1_path_unlink_file
+__imported_wasi_snapshot_preview1_poll_oneoff
+__imported_wasi_snapshot_preview1_proc_exit
+__imported_wasi_snapshot_preview1_random_get
+__imported_wasi_snapshot_preview1_sched_yield
+__imported_wasi_snapshot_preview1_sock_accept
+__imported_wasi_snapshot_preview1_sock_recv
+__imported_wasi_snapshot_preview1_sock_send
+__imported_wasi_snapshot_preview1_sock_shutdown
+__imported_wasi_thread_spawn
+__letf2
+__lttf2
+__main_argc_argv
+__netf2
+__stack_pointer
+__subtf3
+__tls_align
+__tls_base
+__tls_size
+__trunctfdf2
+__trunctfsf2
+__unordtf2
+__wasm_call_ctors
+__wasm_init_tls
diff --git a/expected/wasm32-wasi/single/defined-symbols.txt b/expected/wasm32-wasi/single/defined-symbols.txt
new file mode 100644
index 0000000..a692632
--- /dev/null
+++ b/expected/wasm32-wasi/single/defined-symbols.txt
@@ -0,0 +1,1205 @@
+_CLOCK_MONOTONIC
+_CLOCK_REALTIME
+_Exit
+_IO_feof_unlocked
+_IO_ferror_unlocked
+_IO_getc
+_IO_getc_unlocked
+_IO_putc
+_IO_putc_unlocked
+__EINVAL
+__ENOMEM
+__SIG_ERR
+__SIG_IGN
+__asctime_r
+__assert_fail
+__c_dot_utf8
+__c_dot_utf8_locale
+__c_locale
+__clock
+__clock_gettime
+__clock_nanosleep
+__cos
+__cosdf
+__cosl
+__crypt_blowfish
+__crypt_des
+__crypt_md5
+__crypt_r
+__crypt_sha256
+__crypt_sha512
+__ctype_b_loc
+__ctype_get_mb_cur_max
+__ctype_tolower_loc
+__ctype_toupper_loc
+__cxa_atexit
+__cxa_finalize
+__des_setkey
+__do_des
+__duplocale
+__env_rm_add
+__errno_location
+__exp2f_data
+__exp_data
+__expo2
+__expo2f
+__fbufsize
+__fclose_ca
+__fdopen
+__fesetround
+__fgetwc_unlocked
+__flbf
+__floatscan
+__fmodeflags
+__fopen_rb_ca
+__fpending
+__fpurge
+__fputwc_unlocked
+__freadable
+__freadahead
+__freading
+__freadptr
+__freadptrinc
+__freelocale
+__fseeko
+__fseeko_unlocked
+__fseterr
+__fsetlocking
+__fsmu8
+__ftello
+__ftello_unlocked
+__funcs_on_exit
+__funcs_on_quick_exit
+__futimesat
+__fwritable
+__fwritex
+__fwriting
+__get_locale
+__getdelim
+__getentropy
+__getopt_msg
+__gmtime_r
+__hwcap
+__inet_aton
+__init_ssp
+__intscan
+__invtrigl_R
+__isalnum_l
+__isalpha_l
+__isatty
+__isblank_l
+__iscntrl_l
+__isdigit_l
+__isgraph_l
+__islower_l
+__isoc99_fscanf
+__isoc99_fwscanf
+__isoc99_scanf
+__isoc99_sscanf
+__isoc99_swscanf
+__isoc99_vfscanf
+__isoc99_vfwscanf
+__isoc99_vscanf
+__isoc99_vsscanf
+__isoc99_vswscanf
+__isoc99_vwscanf
+__isoc99_wscanf
+__isprint_l
+__ispunct_l
+__isspace_l
+__isupper_l
+__iswalnum_l
+__iswalpha_l
+__iswblank_l
+__iswcntrl_l
+__iswctype_l
+__iswdigit_l
+__iswgraph_l
+__iswlower_l
+__iswprint_l
+__iswpunct_l
+__iswspace_l
+__iswupper_l
+__iswxdigit_l
+__isxdigit_l
+__lctrans
+__lctrans_cur
+__lctrans_impl
+__ldexp_cexp
+__ldexp_cexpf
+__lgamma_r
+__lgammaf_r
+__lgammal_r
+__libc
+__libc_calloc
+__libc_free
+__libc_malloc
+__loc_is_allocated
+__localtime_r
+__log2_data
+__log2f_data
+__log_data
+__logf_data
+__lseek
+__main_void
+__math_divzero
+__math_divzerof
+__math_invalid
+__math_invalidf
+__math_invalidl
+__math_oflow
+__math_oflowf
+__math_uflow
+__math_uflowf
+__math_xflow
+__math_xflowf
+__memrchr
+__mo_lookup
+__month_to_secs
+__newlocale
+__nl_langinfo
+__nl_langinfo_l
+__ofl_add
+__ofl_lock
+__ofl_unlock
+__optpos
+__optreset
+__overflow
+__p1evll
+__pio2_hi
+__pio2_lo
+__pleval
+__polevll
+__posix_getopt
+__pow_log_data
+__powf_log2_data
+__progname
+__progname_full
+__putenv
+__qsort_r
+__rand48_step
+__reallocarray
+__rem_pio2
+__rem_pio2_large
+__rem_pio2f
+__rem_pio2l
+__rsqrt_tab
+__secs_to_tm
+__secs_to_zone
+__seed48
+__shgetc
+__shlim
+__signgam
+__sin
+__sindf
+__sinl
+__small_printf
+__stack_chk_fail
+__stack_chk_fail_local
+__stack_chk_guard
+__stderr_FILE
+__stderr_used
+__stdin_FILE
+__stdin_used
+__stdio_close
+__stdio_exit
+__stdio_exit_needed
+__stdio_read
+__stdio_seek
+__stdio_write
+__stdout_FILE
+__stdout_used
+__stdout_write
+__stpcpy
+__stpncpy
+__strcasecmp_l
+__strchrnul
+__strcoll_l
+__strerror_l
+__strftime_fmt_1
+__strftime_l
+__strncasecmp_l
+__strtod_l
+__strtof_l
+__strtoimax_internal
+__strtol_internal
+__strtold_l
+__strtoll_internal
+__strtoul_internal
+__strtoull_internal
+__strtoumax_internal
+__strxfrm_l
+__sysinfo
+__sysv_signal
+__tan
+__tandf
+__tanl
+__tm_to_secs
+__tm_to_tzname
+__tolower_l
+__toread
+__toread_needs_stdio_exit
+__toupper_l
+__towctrans_l
+__towlower_l
+__towrite
+__towrite_needs_stdio_exit
+__towupper_l
+__tre_mem_alloc_impl
+__tre_mem_destroy
+__tre_mem_new_impl
+__tsearch_balance
+__uflow
+__unlist_locked_file
+__uselocale
+__utc
+__wasi_args_get
+__wasi_args_sizes_get
+__wasi_clock_res_get
+__wasi_clock_time_get
+__wasi_environ_get
+__wasi_environ_sizes_get
+__wasi_fd_advise
+__wasi_fd_allocate
+__wasi_fd_close
+__wasi_fd_datasync
+__wasi_fd_fdstat_get
+__wasi_fd_fdstat_set_flags
+__wasi_fd_fdstat_set_rights
+__wasi_fd_filestat_get
+__wasi_fd_filestat_set_size
+__wasi_fd_filestat_set_times
+__wasi_fd_pread
+__wasi_fd_prestat_dir_name
+__wasi_fd_prestat_get
+__wasi_fd_pwrite
+__wasi_fd_read
+__wasi_fd_readdir
+__wasi_fd_renumber
+__wasi_fd_seek
+__wasi_fd_sync
+__wasi_fd_tell
+__wasi_fd_write
+__wasi_path_create_directory
+__wasi_path_filestat_get
+__wasi_path_filestat_set_times
+__wasi_path_link
+__wasi_path_open
+__wasi_path_readlink
+__wasi_path_remove_directory
+__wasi_path_rename
+__wasi_path_symlink
+__wasi_path_unlink_file
+__wasi_poll_oneoff
+__wasi_proc_exit
+__wasi_random_get
+__wasi_sched_yield
+__wasi_sock_accept
+__wasi_sock_recv
+__wasi_sock_send
+__wasi_sock_shutdown
+__wasilibc_access
+__wasilibc_cwd
+__wasilibc_deinitialize_environ
+__wasilibc_dttoif
+__wasilibc_ensure_environ
+__wasilibc_environ
+__wasilibc_fd_renumber
+__wasilibc_find_abspath
+__wasilibc_find_relpath
+__wasilibc_find_relpath_alloc
+__wasilibc_get_environ
+__wasilibc_iftodt
+__wasilibc_initialize_environ
+__wasilibc_link
+__wasilibc_link_newat
+__wasilibc_link_oldat
+__wasilibc_maybe_reinitialize_environ_eagerly
+__wasilibc_nocwd___wasilibc_rmdirat
+__wasilibc_nocwd___wasilibc_unlinkat
+__wasilibc_nocwd_faccessat
+__wasilibc_nocwd_fstatat
+__wasilibc_nocwd_linkat
+__wasilibc_nocwd_mkdirat_nomode
+__wasilibc_nocwd_openat_nomode
+__wasilibc_nocwd_opendirat
+__wasilibc_nocwd_readlinkat
+__wasilibc_nocwd_renameat
+__wasilibc_nocwd_scandirat
+__wasilibc_nocwd_symlinkat
+__wasilibc_nocwd_utimensat
+__wasilibc_open_nomode
+__wasilibc_register_preopened_fd
+__wasilibc_rename_newat
+__wasilibc_rename_oldat
+__wasilibc_rmdirat
+__wasilibc_stat
+__wasilibc_tell
+__wasilibc_unlinkat
+__wasilibc_utimens
+__wasm_call_dtors
+__wcscoll_l
+__wcsftime_l
+__wcsxfrm_l
+__wctrans_l
+__wctype_l
+__xpg_basename
+__xpg_strerror_r
+__year_to_secs
+_environ
+_exit
+_flushlbf
+_initialize
+_start
+a64l
+abort
+abs
+accept
+accept4
+access
+acos
+acosf
+acosh
+acoshf
+acoshl
+acosl
+aligned_alloc
+alphasort
+alphasort64
+arc4random
+arc4random_buf
+arc4random_uniform
+asctime
+asctime_r
+asin
+asinf
+asinh
+asinhf
+asinhl
+asinl
+asprintf
+at_quick_exit
+atan
+atan2
+atan2f
+atan2l
+atanf
+atanh
+atanhf
+atanhl
+atanl
+atexit
+atof
+atoi
+atol
+atoll
+basename
+bcmp
+bcopy
+bsd_signal
+bsearch
+btowc
+bzero
+c16rtomb
+c32rtomb
+cabs
+cabsf
+cabsl
+cacos
+cacosf
+cacosh
+cacoshf
+cacoshl
+cacosl
+calloc
+carg
+cargf
+cargl
+casin
+casinf
+casinh
+casinhf
+casinhl
+casinl
+catan
+catanf
+catanh
+catanhf
+catanhl
+catanl
+catclose
+catgets
+catopen
+cbrt
+cbrtf
+cbrtl
+ccos
+ccosf
+ccosh
+ccoshf
+ccoshl
+ccosl
+ceil
+ceilf
+ceill
+cexp
+cexpf
+cexpl
+chdir
+cimag
+cimagf
+cimagl
+clearenv
+clearerr
+clearerr_unlocked
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clog
+clogf
+clogl
+close
+closedir
+confstr
+conj
+conjf
+conjl
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+coshl
+cosl
+cpow
+cpowf
+cpowl
+cproj
+cprojf
+cprojl
+creal
+crealf
+creall
+creat
+creat64
+crypt
+crypt_r
+csin
+csinf
+csinh
+csinhf
+csinhl
+csinl
+csqrt
+csqrtf
+csqrtl
+ctan
+ctanf
+ctanh
+ctanhf
+ctanhl
+ctanl
+ctime
+ctime_r
+difftime
+dirfd
+dirname
+div
+dprintf
+drand48
+drem
+dremf
+duplocale
+ecvt
+encrypt
+environ
+erand48
+erf
+erfc
+erfcf
+erfcl
+erff
+erfl
+errno
+exit
+exp
+exp10
+exp10f
+exp10l
+exp2
+exp2f
+exp2l
+expf
+expl
+explicit_bzero
+expm1
+expm1f
+expm1l
+fabs
+fabsf
+fabsl
+faccessat
+fclose
+fcntl
+fcvt
+fdatasync
+fdclosedir
+fdim
+fdimf
+fdiml
+fdopen
+fdopendir
+feclearexcept
+fegetenv
+fegetexceptflag
+fegetround
+feholdexcept
+feof
+feof_unlocked
+feraiseexcept
+ferror
+ferror_unlocked
+fesetenv
+fesetexceptflag
+fesetround
+fetestexcept
+feupdateenv
+fflush
+fflush_unlocked
+ffs
+ffsl
+ffsll
+fgetc
+fgetc_unlocked
+fgetln
+fgetpos
+fgetpos64
+fgets
+fgets_unlocked
+fgetwc
+fgetwc_unlocked
+fgetws
+fgetws_unlocked
+fileno
+fileno_unlocked
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmal
+fmax
+fmaxf
+fmaxl
+fmemopen
+fmin
+fminf
+fminl
+fmod
+fmodf
+fmodl
+fmtmsg
+fnmatch
+fopen
+fopen64
+fopencookie
+fpathconf
+fprintf
+fpurge
+fputc
+fputc_unlocked
+fputs
+fputs_unlocked
+fputwc
+fputwc_unlocked
+fputws
+fputws_unlocked
+fread
+fread_unlocked
+free
+freelocale
+freopen
+freopen64
+frexp
+frexpf
+frexpl
+fscanf
+fseek
+fseeko
+fseeko64
+fsetpos
+fsetpos64
+fstat
+fstatat
+fsync
+ftell
+ftello
+ftello64
+ftime
+ftruncate
+futimens
+futimesat
+fwide
+fwprintf
+fwrite
+fwrite_unlocked
+fwscanf
+gcvt
+get_avphys_pages
+get_nprocs
+get_nprocs_conf
+get_phys_pages
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdate
+getdate_err
+getdelim
+getdomainname
+getentropy
+getenv
+gethostid
+getline
+getopt
+getopt_long
+getopt_long_only
+getpagesize
+getpid
+getrusage
+getsockopt
+getsubopt
+gettimeofday
+getw
+getwc
+getwc_unlocked
+getwchar
+getwchar_unlocked
+glob
+glob64
+globfree
+globfree64
+gmtime
+gmtime_r
+hcreate
+hcreate_r
+hdestroy
+hdestroy_r
+hsearch
+hsearch_r
+htonl
+htons
+hypot
+hypotf
+hypotl
+iconv
+iconv_close
+iconv_open
+ilogb
+ilogbf
+ilogbl
+imaxabs
+imaxdiv
+in6addr_any
+in6addr_loopback
+index
+inet_aton
+inet_ntop
+inet_pton
+initstate
+insque
+ioctl
+iprintf
+isalnum
+isalnum_l
+isalpha
+isalpha_l
+isascii
+isatty
+isblank
+isblank_l
+iscntrl
+iscntrl_l
+isdigit
+isdigit_l
+isgraph
+isgraph_l
+islower
+islower_l
+isprint
+isprint_l
+ispunct
+ispunct_l
+isspace
+isspace_l
+isupper
+isupper_l
+iswalnum
+iswalnum_l
+iswalpha
+iswalpha_l
+iswblank
+iswblank_l
+iswcntrl
+iswcntrl_l
+iswctype
+iswctype_l
+iswdigit
+iswdigit_l
+iswgraph
+iswgraph_l
+iswlower
+iswlower_l
+iswprint
+iswprint_l
+iswpunct
+iswpunct_l
+iswspace
+iswspace_l
+iswupper
+iswupper_l
+iswxdigit
+iswxdigit_l
+isxdigit
+isxdigit_l
+j0
+j0f
+j1
+j1f
+jn
+jnf
+jrand48
+l64a
+labs
+lcong48
+ldexp
+ldexpf
+ldexpl
+ldiv
+lfind
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+lgammal
+lgammal_r
+link
+linkat
+llabs
+lldiv
+llrint
+llrintf
+llrintl
+llround
+llroundf
+llroundl
+localeconv
+localtime
+localtime_r
+log
+log10
+log10f
+log10l
+log1p
+log1pf
+log1pl
+log2
+log2f
+log2l
+logb
+logbf
+logbl
+logf
+logl
+lrand48
+lrint
+lrintf
+lrintl
+lround
+lroundf
+lroundl
+lsearch
+lseek
+lstat
+malloc
+malloc_usable_size
+mblen
+mbrlen
+mbrtoc16
+mbrtoc32
+mbrtowc
+mbsinit
+mbsnrtowcs
+mbsrtowcs
+mbstowcs
+mbtowc
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+mempcpy
+memrchr
+memset
+mkdir
+mkdirat
+mktime
+mmap
+modf
+modff
+modfl
+mrand48
+munmap
+nan
+nanf
+nanl
+nanosleep
+nearbyint
+nearbyintf
+nearbyintl
+newlocale
+nextafter
+nextafterf
+nextafterl
+nexttoward
+nexttowardf
+nexttowardl
+nftw
+nftw64
+nl_langinfo
+nl_langinfo_l
+nrand48
+ntohl
+ntohs
+open
+open_memstream
+open_wmemstream
+openat
+opendir
+opendirat
+optarg
+opterr
+optind
+optopt
+optreset
+pathconf
+perror
+poll
+posix_close
+posix_fadvise
+posix_fallocate
+posix_memalign
+pow
+pow10
+pow10f
+pow10l
+powf
+powl
+pread
+preadv
+printf
+program_invocation_name
+program_invocation_short_name
+pselect
+psignal
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+putw
+putwc
+putwc_unlocked
+putwchar
+putwchar_unlocked
+pwrite
+pwritev
+qsort
+qsort_r
+quick_exit
+raise
+rand
+rand_r
+random
+read
+readdir
+readlink
+readlinkat
+readv
+realloc
+reallocarray
+recv
+regcomp
+regerror
+regexec
+regfree
+remainder
+remainderf
+remainderl
+remove
+remque
+remquo
+remquof
+remquol
+rename
+renameat
+rewind
+rewinddir
+rindex
+rint
+rintf
+rintl
+rmdir
+round
+roundf
+roundl
+sbrk
+scalb
+scalbf
+scalbln
+scalblnf
+scalblnl
+scalbn
+scalbnf
+scalbnl
+scandir
+scandirat
+scanf
+sched_yield
+seed48
+seekdir
+select
+send
+setbuf
+setbuffer
+setenv
+setkey
+setlinebuf
+setlocale
+setstate
+setvbuf
+shutdown
+signal
+signgam
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sinhl
+sinl
+sleep
+snprintf
+sprintf
+sqrt
+sqrtf
+sqrtl
+srand
+srand48
+srandom
+sscanf
+stat
+stderr
+stdin
+stdout
+stpcpy
+stpncpy
+strcasecmp
+strcasecmp_l
+strcasestr
+strcat
+strchr
+strchrnul
+strcmp
+strcoll
+strcoll_l
+strcpy
+strcspn
+strdup
+strerror
+strerror_l
+strerror_r
+strfmon
+strfmon_l
+strftime
+strftime_l
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncasecmp_l
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtod_l
+strtof
+strtof_l
+strtoimax
+strtok
+strtok_r
+strtol
+strtold
+strtold_l
+strtoll
+strtoul
+strtoull
+strtoumax
+strverscmp
+strxfrm
+strxfrm_l
+swab
+swprintf
+swscanf
+symlink
+symlinkat
+sysconf
+tan
+tanf
+tanh
+tanhf
+tanhl
+tanl
+tdelete
+tdestroy
+telldir
+tfind
+tgamma
+tgammaf
+tgammal
+thrd_sleep
+time
+timegm
+times
+timespec_get
+toascii
+tolower
+tolower_l
+toupper
+toupper_l
+towctrans
+towctrans_l
+towlower
+towlower_l
+towupper
+towupper_l
+trunc
+truncate
+truncf
+truncl
+tsearch
+twalk
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unsetenv
+uselocale
+usleep
+utime
+utimensat
+utimes
+vasprintf
+vdprintf
+versionsort
+versionsort64
+vfprintf
+vfscanf
+vfwprintf
+vfwscanf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vswscanf
+vwprintf
+vwscanf
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscasecmp_l
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscoll_l
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcsftime_l
+wcslen
+wcsncasecmp
+wcsncasecmp_l
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcsnrtombs
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstof
+wcstoimax
+wcstok
+wcstol
+wcstold
+wcstoll
+wcstombs
+wcstoul
+wcstoull
+wcstoumax
+wcswcs
+wcswidth
+wcsxfrm
+wcsxfrm_l
+wctob
+wctomb
+wctrans
+wctrans_l
+wctype
+wctype_l
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/expected/wasm32-wasi/single/include-all.c b/expected/wasm32-wasi/single/include-all.c
new file mode 100644
index 0000000..86297f3
--- /dev/null
+++ b/expected/wasm32-wasi/single/include-all.c
@@ -0,0 +1,170 @@
+#include <__errno.h>
+#include <__errno_values.h>
+#include <__fd_set.h>
+#include <__function___isatty.h>
+#include <__functions_malloc.h>
+#include <__functions_memcpy.h>
+#include <__header_dirent.h>
+#include <__header_fcntl.h>
+#include <__header_inttypes.h>
+#include <__header_netinet_in.h>
+#include <__header_poll.h>
+#include <__header_stdlib.h>
+#include <__header_string.h>
+#include <__header_sys_ioctl.h>
+#include <__header_sys_resource.h>
+#include <__header_sys_socket.h>
+#include <__header_sys_stat.h>
+#include <__header_time.h>
+#include <__header_unistd.h>
+#include <__macro_FD_SETSIZE.h>
+#include <__macro_PAGESIZE.h>
+#include <__mode_t.h>
+#include <__seek.h>
+#include <__struct_dirent.h>
+#include <__struct_in6_addr.h>
+#include <__struct_in_addr.h>
+#include <__struct_iovec.h>
+#include <__struct_msghdr.h>
+#include <__struct_pollfd.h>
+#include <__struct_rusage.h>
+#include <__struct_sockaddr.h>
+#include <__struct_sockaddr_in.h>
+#include <__struct_sockaddr_in6.h>
+#include <__struct_sockaddr_storage.h>
+#include <__struct_sockaddr_un.h>
+#include <__struct_stat.h>
+#include <__struct_timespec.h>
+#include <__struct_timeval.h>
+#include <__struct_tm.h>
+#include <__struct_tms.h>
+#include <__typedef_DIR.h>
+#include <__typedef_blkcnt_t.h>
+#include <__typedef_blksize_t.h>
+#include <__typedef_clock_t.h>
+#include <__typedef_clockid_t.h>
+#include <__typedef_dev_t.h>
+#include <__typedef_fd_set.h>
+#include <__typedef_gid_t.h>
+#include <__typedef_in_addr_t.h>
+#include <__typedef_in_port_t.h>
+#include <__typedef_ino_t.h>
+#include <__typedef_mode_t.h>
+#include <__typedef_nfds_t.h>
+#include <__typedef_nlink_t.h>
+#include <__typedef_off_t.h>
+#include <__typedef_sa_family_t.h>
+#include <__typedef_sigset_t.h>
+#include <__typedef_socklen_t.h>
+#include <__typedef_ssize_t.h>
+#include <__typedef_suseconds_t.h>
+#include <__typedef_time_t.h>
+#include <__typedef_uid_t.h>
+#include <alloca.h>
+#include <ar.h>
+#include <arpa/ftp.h>
+#include <arpa/inet.h>
+#include <arpa/nameser.h>
+#include <arpa/nameser_compat.h>
+#include <arpa/telnet.h>
+#include <arpa/tftp.h>
+#include <assert.h>
+#include <byteswap.h>
+#include <complex.h>
+#include <cpio.h>
+#include <crypt.h>
+#include <ctype.h>
+#include <dirent.h>
+#include <endian.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <features.h>
+#include <fenv.h>
+#include <float.h>
+#include <fmtmsg.h>
+#include <fnmatch.h>
+#include <ftw.h>
+#include <getopt.h>
+#include <glob.h>
+#include <iconv.h>
+#include <ifaddrs.h>
+#include <inttypes.h>
+#include <iso646.h>
+#include <langinfo.h>
+#include <libgen.h>
+#include <limits.h>
+#include <locale.h>
+#include <malloc.h>
+#include <math.h>
+#include <memory.h>
+#include <monetary.h>
+#include <mqueue.h>
+#include <netinet/icmp6.h>
+#include <netinet/igmp.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/ip6.h>
+#include <netinet/ip_icmp.h>
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <netpacket/packet.h>
+#include <nl_types.h>
+#include <poll.h>
+#include <regex.h>
+#include <sched.h>
+#include <search.h>
+#include <semaphore.h>
+#include <stdalign.h>
+#include <stdbool.h>
+#include <stdc-predef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdio_ext.h>
+#include <stdlib.h>
+#include <stdnoreturn.h>
+#include <string.h>
+#include <strings.h>
+#include <stropts.h>
+#include <sys/dir.h>
+#include <sys/errno.h>
+#include <sys/eventfd.h>
+#include <sys/fcntl.h>
+#include <sys/file.h>
+#include <sys/ioctl.h>
+#include <sys/param.h>
+#include <sys/poll.h>
+#include <sys/random.h>
+#include <sys/reg.h>
+#include <sys/select.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/stropts.h>
+#include <sys/syscall.h>
+#include <sys/sysinfo.h>
+#include <sys/time.h>
+#include <sys/timeb.h>
+#include <sys/timex.h>
+#include <sys/ttydefaults.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <sys/un.h>
+#include <sys/utsname.h>
+#include <syscall.h>
+#include <sysexits.h>
+#include <tar.h>
+#include <tgmath.h>
+#include <threads.h>
+#include <time.h>
+#include <uchar.h>
+#include <unistd.h>
+#include <utime.h>
+#include <values.h>
+#include <wasi/api.h>
+#include <wasi/libc-environ.h>
+#include <wasi/libc-find-relpath.h>
+#include <wasi/libc-nocwd.h>
+#include <wasi/libc.h>
+#include <wchar.h>
+#include <wctype.h>
diff --git a/expected/wasm32-wasi/single/predefined-macros.txt b/expected/wasm32-wasi/single/predefined-macros.txt
new file mode 100644
index 0000000..1f7b341
--- /dev/null
+++ b/expected/wasm32-wasi/single/predefined-macros.txt
@@ -0,0 +1,3355 @@
+#define ABDAY_1 0x20000
+#define ABDAY_2 0x20001
+#define ABDAY_3 0x20002
+#define ABDAY_4 0x20003
+#define ABDAY_5 0x20004
+#define ABDAY_6 0x20005
+#define ABDAY_7 0x20006
+#define ABMON_1 0x2000E
+#define ABMON_10 0x20017
+#define ABMON_11 0x20018
+#define ABMON_12 0x20019
+#define ABMON_2 0x2000F
+#define ABMON_3 0x20010
+#define ABMON_4 0x20011
+#define ABMON_5 0x20012
+#define ABMON_6 0x20013
+#define ABMON_7 0x20014
+#define ABMON_8 0x20015
+#define ABMON_9 0x20016
+#define ABORT 238
+#define ACK 04
+#define ADD ns_uop_add
+#define ADJ_ESTERROR 0x0008
+#define ADJ_FREQUENCY 0x0002
+#define ADJ_MAXERROR 0x0004
+#define ADJ_MICRO 0x1000
+#define ADJ_NANO 0x2000
+#define ADJ_OFFSET 0x0001
+#define ADJ_OFFSET_SINGLESHOT 0x8001
+#define ADJ_OFFSET_SS_READ 0xa001
+#define ADJ_SETOFFSET 0x0100
+#define ADJ_STATUS 0x0010
+#define ADJ_TAI 0x0080
+#define ADJ_TICK 0x4000
+#define ADJ_TIMECONST 0x0020
+#define AF_INET 1
+#define AF_INET6 2
+#define AF_UNIX 3
+#define AF_UNSPEC 0
+#define ALT_DIGITS 0x2002F
+#define AM_STR 0x20026
+#define ANYMARK 0x01
+#define AO 245
+#define AREGTYPE '\0'
+#define ARFMAG "`\n"
+#define ARG_MAX 131072
+#define ARMAG "!<arch>\n"
+#define AT_EACCESS (0x0)
+#define AT_FDCWD (-2)
+#define AT_REMOVEDIR (0x4)
+#define AT_SYMLINK_FOLLOW (0x2)
+#define AT_SYMLINK_NOFOLLOW (0x1)
+#define AUTHTYPE_CNT 5
+#define AUTHTYPE_KERBEROS_V4 1
+#define AUTHTYPE_KERBEROS_V5 2
+#define AUTHTYPE_MINK 4
+#define AUTHTYPE_NAME(x) authtype_names[x]
+#define AUTHTYPE_NAME_OK(x) ((unsigned int)(x) < AUTHTYPE_CNT)
+#define AUTHTYPE_NULL 0
+#define AUTHTYPE_SPX 3
+#define AUTHTYPE_TEST 99
+#define AUTH_HOW_MASK 2
+#define AUTH_HOW_MUTUAL 2
+#define AUTH_HOW_ONE_WAY 0
+#define AUTH_WHO_CLIENT 0
+#define AUTH_WHO_MASK 1
+#define AUTH_WHO_SERVER 1
+#define AYT 246
+#define BIG_ENDIAN __BIG_ENDIAN
+#define BITSPERBYTE CHAR_BIT
+#define BLKTYPE '4'
+#define BLK_BYTECOUNT 2
+#define BLK_EOF 0x40
+#define BLK_EOR 0x80
+#define BLK_ERRORS 0x20
+#define BLK_RESTART 0x10
+#define BREAK 243
+#define BUFSIZ 1024
+#define BYTE_ORDER __BYTE_ORDER
+#define CANBSIZ 255
+#define CBRK CEOL
+#define CDISCARD CTRL('o')
+#define CDSUSP CTRL('y')
+#define CEOF CTRL('d')
+#define CEOL '\0'
+#define CEOT CEOF
+#define CERASE 0177
+#define CFLUSH CDISCARD
+#define CHARBITS (sizeof(char) * 8)
+#define CHARCLASS_NAME_MAX 14
+#define CHAR_BIT 8
+#define CHAR_MAX 127
+#define CHAR_MIN (-128)
+#define CHRTYPE '3'
+#define CINTR CTRL('c')
+#define CKILL CTRL('u')
+#define CLNEXT CTRL('v')
+#define CLOCKS_PER_SEC ((clock_t)1000000000)
+#define CLOCK_MONOTONIC (&_CLOCK_MONOTONIC)
+#define CLOCK_REALTIME (&_CLOCK_REALTIME)
+#define CMIN 1
+#define CMPLX(x,y) __CMPLX(x, y, double)
+#define CMPLXF(x,y) __CMPLX(x, y, float)
+#define CMPLXL(x,y) __CMPLX(x, y, long double)
+#define CODESET 14
+#define COLL_WEIGHTS_MAX 2
+#define COMPLETE 2
+#define CONTINUE 3
+#define CONTTYPE '7'
+#define CQUIT 034
+#define CREPRINT CTRL('r')
+#define CRNCYSTR 0x4000F
+#define CRPRNT CREPRINT
+#define CSTART CTRL('q')
+#define CSTATUS '\0'
+#define CSTOP CTRL('s')
+#define CSUSP CTRL('z')
+#define CTIME 0
+#define CTRL(x) ((x)&037)
+#define CWERASE CTRL('w')
+#define C_ANY ns_c_any
+#define C_CHAOS ns_c_chaos
+#define C_HS ns_c_hs
+#define C_IN ns_c_in
+#define C_IRGRP 000040
+#define C_IROTH 000004
+#define C_IRUSR 000400
+#define C_ISBLK 060000
+#define C_ISCHR 020000
+#define C_ISCTG 0110000
+#define C_ISDIR 040000
+#define C_ISFIFO 010000
+#define C_ISGID 002000
+#define C_ISLNK 0120000
+#define C_ISREG 0100000
+#define C_ISSOCK 0140000
+#define C_ISUID 004000
+#define C_ISVTX 001000
+#define C_IWGRP 000020
+#define C_IWOTH 000002
+#define C_IWUSR 000200
+#define C_IXGRP 000010
+#define C_IXOTH 000001
+#define C_IXUSR 000100
+#define C_NONE ns_c_none
+#define DATA 03
+#define DAY_1 0x20007
+#define DAY_2 0x20008
+#define DAY_3 0x20009
+#define DAY_4 0x2000A
+#define DAY_5 0x2000B
+#define DAY_6 0x2000C
+#define DAY_7 0x2000D
+#define DBL_DECIMAL_DIG 17
+#define DBL_DIG 15
+#define DBL_EPSILON 2.22044604925031308085e-16
+#define DBL_HAS_SUBNORM 1
+#define DBL_MANT_DIG 53
+#define DBL_MAX 1.79769313486231570815e+308
+#define DBL_MAX_10_EXP 308
+#define DBL_MAX_EXP 1024
+#define DBL_MIN 2.22507385850720138309e-308
+#define DBL_MIN_10_EXP (-307)
+#define DBL_MIN_EXP (-1021)
+#define DBL_TRUE_MIN 4.94065645841246544177e-324
+#define DECIMAL_DIG 36
+#define DELAYTIMER_MAX 0x7fffffff
+#define DELETE ns_uop_delete
+#define DEV_BSIZE 512
+#define DIRTYPE '5'
+#define DM 242
+#define DMAXEXP DBL_MAX_EXP
+#define DMINEXP DBL_MIN_EXP
+#define DO 253
+#define DONT 254
+#define DOUBLEBITS (sizeof(double) * 8)
+#define DTTOIF(x) (__wasilibc_dttoif(x))
+#define DT_BLK __WASI_FILETYPE_BLOCK_DEVICE
+#define DT_CHR __WASI_FILETYPE_CHARACTER_DEVICE
+#define DT_DIR __WASI_FILETYPE_DIRECTORY
+#define DT_FIFO __WASI_FILETYPE_SOCKET_STREAM
+#define DT_LNK __WASI_FILETYPE_SYMBOLIC_LINK
+#define DT_REG __WASI_FILETYPE_REGULAR_FILE
+#define DT_UNKNOWN __WASI_FILETYPE_UNKNOWN
+#define D_FMT 0x20029
+#define D_T_FMT 0x20028
+#define E2BIG __WASI_ERRNO_2BIG
+#define EACCES __WASI_ERRNO_ACCES
+#define EACCESS 2
+#define EADDRINUSE __WASI_ERRNO_ADDRINUSE
+#define EADDRNOTAVAIL __WASI_ERRNO_ADDRNOTAVAIL
+#define EAFNOSUPPORT __WASI_ERRNO_AFNOSUPPORT
+#define EAGAIN __WASI_ERRNO_AGAIN
+#define EALREADY __WASI_ERRNO_ALREADY
+#define EBADF __WASI_ERRNO_BADF
+#define EBADID 5
+#define EBADMSG __WASI_ERRNO_BADMSG
+#define EBADOP 4
+#define EBUSY __WASI_ERRNO_BUSY
+#define EC 247
+#define ECANCELED __WASI_ERRNO_CANCELED
+#define ECHILD __WASI_ERRNO_CHILD
+#define ECONNABORTED __WASI_ERRNO_CONNABORTED
+#define ECONNREFUSED __WASI_ERRNO_CONNREFUSED
+#define ECONNRESET __WASI_ERRNO_CONNRESET
+#define EDEADLK __WASI_ERRNO_DEADLK
+#define EDESTADDRREQ __WASI_ERRNO_DESTADDRREQ
+#define EDOM __WASI_ERRNO_DOM
+#define EDQUOT __WASI_ERRNO_DQUOT
+#define EEXIST __WASI_ERRNO_EXIST
+#define EEXISTS 6
+#define EFAULT __WASI_ERRNO_FAULT
+#define EFBIG __WASI_ERRNO_FBIG
+#define EFD_CLOEXEC O_CLOEXEC
+#define EFD_NONBLOCK O_NONBLOCK
+#define EFD_SEMAPHORE 1
+#define EHOSTUNREACH __WASI_ERRNO_HOSTUNREACH
+#define EIDRM __WASI_ERRNO_IDRM
+#define EILSEQ __WASI_ERRNO_ILSEQ
+#define EINPROGRESS __WASI_ERRNO_INPROGRESS
+#define EINTR __WASI_ERRNO_INTR
+#define EINVAL __WASI_ERRNO_INVAL
+#define EIO __WASI_ERRNO_IO
+#define EISCONN __WASI_ERRNO_ISCONN
+#define EISDIR __WASI_ERRNO_ISDIR
+#define EL 248
+#define ELOOP __WASI_ERRNO_LOOP
+#define EMFILE __WASI_ERRNO_MFILE
+#define EMLINK __WASI_ERRNO_MLINK
+#define EMSGSIZE __WASI_ERRNO_MSGSIZE
+#define EMULTIHOP __WASI_ERRNO_MULTIHOP
+#define ENAMETOOLONG __WASI_ERRNO_NAMETOOLONG
+#define ENCRYPT_CNT 9
+#define ENCRYPT_DEC_KEYID 8
+#define ENCRYPT_ENC_KEYID 7
+#define ENCRYPT_END 4
+#define ENCRYPT_IS 0
+#define ENCRYPT_NAME(x) encrypt_names[x]
+#define ENCRYPT_NAME_OK(x) ((unsigned int)(x) < ENCRYPT_CNT)
+#define ENCRYPT_REPLY 2
+#define ENCRYPT_REQEND 6
+#define ENCRYPT_REQSTART 5
+#define ENCRYPT_START 3
+#define ENCRYPT_SUPPORT 1
+#define ENCTYPE_ANY 0
+#define ENCTYPE_CNT 3
+#define ENCTYPE_DES_CFB64 1
+#define ENCTYPE_DES_OFB64 2
+#define ENCTYPE_NAME(x) enctype_names[x]
+#define ENCTYPE_NAME_OK(x) ((unsigned int)(x) < ENCTYPE_CNT)
+#define ENETDOWN __WASI_ERRNO_NETDOWN
+#define ENETRESET __WASI_ERRNO_NETRESET
+#define ENETUNREACH __WASI_ERRNO_NETUNREACH
+#define ENFILE __WASI_ERRNO_NFILE
+#define ENOBUFS __WASI_ERRNO_NOBUFS
+#define ENODEV __WASI_ERRNO_NODEV
+#define ENOENT __WASI_ERRNO_NOENT
+#define ENOEXEC __WASI_ERRNO_NOEXEC
+#define ENOLCK __WASI_ERRNO_NOLCK
+#define ENOLINK __WASI_ERRNO_NOLINK
+#define ENOMEM __WASI_ERRNO_NOMEM
+#define ENOMSG __WASI_ERRNO_NOMSG
+#define ENOPROTOOPT __WASI_ERRNO_NOPROTOOPT
+#define ENOSPACE 3
+#define ENOSPC __WASI_ERRNO_NOSPC
+#define ENOSYS __WASI_ERRNO_NOSYS
+#define ENOTCAPABLE __WASI_ERRNO_NOTCAPABLE
+#define ENOTCONN __WASI_ERRNO_NOTCONN
+#define ENOTDIR __WASI_ERRNO_NOTDIR
+#define ENOTEMPTY __WASI_ERRNO_NOTEMPTY
+#define ENOTFOUND 1
+#define ENOTRECOVERABLE __WASI_ERRNO_NOTRECOVERABLE
+#define ENOTSOCK __WASI_ERRNO_NOTSOCK
+#define ENOTSUP __WASI_ERRNO_NOTSUP
+#define ENOTTY __WASI_ERRNO_NOTTY
+#define ENOUSER 7
+#define ENV_ESC 2
+#define ENV_USERVAR 3
+#define ENXIO __WASI_ERRNO_NXIO
+#define EOF (-1)
+#define EOPNOTSUPP ENOTSUP
+#define EOR 239
+#define EOVERFLOW __WASI_ERRNO_OVERFLOW
+#define EOWNERDEAD __WASI_ERRNO_OWNERDEAD
+#define EPERM __WASI_ERRNO_PERM
+#define EPIPE __WASI_ERRNO_PIPE
+#define EPROTO __WASI_ERRNO_PROTO
+#define EPROTONOSUPPORT __WASI_ERRNO_PROTONOSUPPORT
+#define EPROTOTYPE __WASI_ERRNO_PROTOTYPE
+#define ERA 0x2002C
+#define ERANGE __WASI_ERRNO_RANGE
+#define ERA_D_FMT 0x2002E
+#define ERA_D_T_FMT 0x20030
+#define ERA_T_FMT 0x20031
+#define EROFS __WASI_ERRNO_ROFS
+#define ERROR 05
+#define ESPIPE __WASI_ERRNO_SPIPE
+#define ESRCH __WASI_ERRNO_SRCH
+#define ESTALE __WASI_ERRNO_STALE
+#define ETIMEDOUT __WASI_ERRNO_TIMEDOUT
+#define ETXTBSY __WASI_ERRNO_TXTBSY
+#define EUNDEF 0
+#define EWOULDBLOCK EAGAIN
+#define EXDEV __WASI_ERRNO_XDEV
+#define EXIT_FAILURE 1
+#define EXIT_SUCCESS 0
+#define EX_CANTCREAT 73
+#define EX_CONFIG 78
+#define EX_DATAERR 65
+#define EX_IOERR 74
+#define EX_NOHOST 68
+#define EX_NOINPUT 66
+#define EX_NOPERM 77
+#define EX_NOUSER 67
+#define EX_OK 0
+#define EX_OSERR 71
+#define EX_OSFILE 72
+#define EX_PROTOCOL 76
+#define EX_SOFTWARE 70
+#define EX_TEMPFAIL 75
+#define EX_UNAVAILABLE 69
+#define EX_USAGE 64
+#define EX__BASE 64
+#define EX__MAX 78
+#define FD_CLOEXEC (1)
+#define FD_CLR(fd,set) (FD_CLR((fd), (set)))
+#define FD_COPY(from,to) (FD_COPY((from), (to)))
+#define FD_ISSET(fd,set) (FD_ISSET((fd), (set)))
+#define FD_SET(fd,set) (FD_SET((fd), (set)))
+#define FD_SETSIZE 1024
+#define FD_ZERO(set) (FD_ZERO((set)))
+#define FE_ALL_EXCEPT 0
+#define FE_DFL_ENV ((const fenv_t *) -1)
+#define FE_TONEAREST 0
+#define FIFOTYPE '6'
+#define FILENAME_MAX 4096
+#define FILESIZEBITS 64
+#define FIONBIO 2
+#define FIONREAD 1
+#define FLOATBITS (sizeof(float) * 8)
+#define FLT_DECIMAL_DIG 9
+#define FLT_DIG 6
+#define FLT_EPSILON 1.1920928955078125e-07F
+#define FLT_EVAL_METHOD 0
+#define FLT_HAS_SUBNORM 1
+#define FLT_MANT_DIG 24
+#define FLT_MAX 3.40282346638528859812e+38F
+#define FLT_MAX_10_EXP 38
+#define FLT_MAX_EXP 128
+#define FLT_MIN 1.17549435082228750797e-38F
+#define FLT_MIN_10_EXP (-37)
+#define FLT_MIN_EXP (-125)
+#define FLT_RADIX 2
+#define FLT_ROUNDS (__builtin_flt_rounds())
+#define FLT_TRUE_MIN 1.40129846432481707092e-45F
+#define FLUSHBAND 0x04
+#define FLUSHR 0x01
+#define FLUSHRW 0x03
+#define FLUSHW 0x02
+#define FMAXEXP FLT_MAX_EXP
+#define FMINEXP FLT_MIN_EXP
+#define FMNAMESZ 8
+#define FNM_CASEFOLD 0x10
+#define FNM_FILE_NAME FNM_PATHNAME
+#define FNM_LEADING_DIR 0x8
+#define FNM_NOESCAPE 0x2
+#define FNM_NOMATCH 1
+#define FNM_NOSYS (-1)
+#define FNM_PATHNAME 0x1
+#define FNM_PERIOD 0x4
+#define FOPEN_MAX 1000
+#define FORMERR ns_r_formerr
+#define FORM_C 3
+#define FORM_N 1
+#define FORM_T 2
+#define FP_ILOGB0 FP_ILOGBNAN
+#define FP_ILOGBNAN (-1-0x7fffffff)
+#define FP_INFINITE 1
+#define FP_NAN 0
+#define FP_NORMAL 4
+#define FP_SUBNORMAL 3
+#define FP_ZERO 2
+#define FSETLOCKING_BYCALLER 2
+#define FSETLOCKING_INTERNAL 1
+#define FSETLOCKING_QUERY 0
+#define FTW_CHDIR 4
+#define FTW_D 2
+#define FTW_DEPTH 8
+#define FTW_DNR 3
+#define FTW_DP 6
+#define FTW_F 1
+#define FTW_MOUNT 2
+#define FTW_NS 4
+#define FTW_PHYS 1
+#define FTW_SL 5
+#define FTW_SLN 7
+#define F_GETFD (1)
+#define F_GETFL (3)
+#define F_LOCK 1
+#define F_OK (0)
+#define F_SETFD (2)
+#define F_SETFL (4)
+#define F_TEST 3
+#define F_TLOCK 2
+#define F_ULOCK 0
+#define GA 249
+#define GETLONG NS_GET32
+#define GETSHORT NS_GET16
+#define GLOB_ABORTED 2
+#define GLOB_APPEND 0x20
+#define GLOB_DOOFFS 0x08
+#define GLOB_ERR 0x01
+#define GLOB_MARK 0x02
+#define GLOB_NOCHECK 0x10
+#define GLOB_NOESCAPE 0x40
+#define GLOB_NOMATCH 3
+#define GLOB_NOSORT 0x04
+#define GLOB_NOSPACE 1
+#define GLOB_NOSYS 4
+#define GLOB_PERIOD 0x80
+#define GROUP_FILTER_SIZE(numsrc) (sizeof(struct group_filter) - sizeof(struct sockaddr_storage) + (numsrc) * sizeof(struct sockaddr_storage))
+#define HFIXEDSZ NS_HFIXEDSZ
+#define HIBITL MINLONG
+#define HIBITS MINSHORT
+#define HOST_NAME_MAX 255
+#define HUGE 3.40282346638528859812e+38F
+#define HUGE_VAL ((double)INFINITY)
+#define HUGE_VALF INFINITY
+#define HUGE_VALL ((long double)INFINITY)
+#define I _Complex_I
+#define IAC 255
+#define ICMP6_DST_UNREACH 1
+#define ICMP6_DST_UNREACH_ADDR 3
+#define ICMP6_DST_UNREACH_ADMIN 1
+#define ICMP6_DST_UNREACH_BEYONDSCOPE 2
+#define ICMP6_DST_UNREACH_NOPORT 4
+#define ICMP6_DST_UNREACH_NOROUTE 0
+#define ICMP6_ECHO_REPLY 129
+#define ICMP6_ECHO_REQUEST 128
+#define ICMP6_FILTER 1
+#define ICMP6_FILTER_BLOCK 1
+#define ICMP6_FILTER_BLOCKOTHERS 3
+#define ICMP6_FILTER_PASS 2
+#define ICMP6_FILTER_PASSONLY 4
+#define ICMP6_FILTER_SETBLOCK(type,filterp) ((((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type) & 31))))
+#define ICMP6_FILTER_SETBLOCKALL(filterp) memset (filterp, 0xFF, sizeof (struct icmp6_filter));
+#define ICMP6_FILTER_SETPASS(type,filterp) ((((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type) & 31))))
+#define ICMP6_FILTER_SETPASSALL(filterp) memset (filterp, 0, sizeof (struct icmp6_filter));
+#define ICMP6_FILTER_WILLBLOCK(type,filterp) ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) != 0)
+#define ICMP6_FILTER_WILLPASS(type,filterp) ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) == 0)
+#define ICMP6_INFOMSG_MASK 0x80
+#define ICMP6_PACKET_TOO_BIG 2
+#define ICMP6_PARAMPROB_HEADER 0
+#define ICMP6_PARAMPROB_NEXTHEADER 1
+#define ICMP6_PARAMPROB_OPTION 2
+#define ICMP6_PARAM_PROB 4
+#define ICMP6_ROUTER_RENUMBERING 138
+#define ICMP6_RR_FLAGS_FORCEAPPLY 0x20
+#define ICMP6_RR_FLAGS_PREVDONE 0x08
+#define ICMP6_RR_FLAGS_REQRESULT 0x40
+#define ICMP6_RR_FLAGS_SPECSITE 0x10
+#define ICMP6_RR_FLAGS_TEST 0x80
+#define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40
+#define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80
+#define ICMP6_RR_PCOUSE_RAFLAGS_AUTO 0x10
+#define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK 0x20
+#define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0100
+#define ICMP6_RR_RESULT_FLAGS_OOB 0x0200
+#define ICMP6_TIME_EXCEEDED 3
+#define ICMP6_TIME_EXCEED_REASSEMBLY 1
+#define ICMP6_TIME_EXCEED_TRANSIT 0
+#define ICMP_ADDRESS 17
+#define ICMP_ADDRESSREPLY 18
+#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8)
+#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8)
+#define ICMP_DEST_UNREACH 3
+#define ICMP_ECHO 8
+#define ICMP_ECHOREPLY 0
+#define ICMP_EXC_FRAGTIME 1
+#define ICMP_EXC_TTL 0
+#define ICMP_FRAG_NEEDED 4
+#define ICMP_HOST_ANO 10
+#define ICMP_HOST_ISOLATED 8
+#define ICMP_HOST_UNKNOWN 7
+#define ICMP_HOST_UNREACH 1
+#define ICMP_HOST_UNR_TOS 12
+#define ICMP_INFOTYPE(type) ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
+#define ICMP_INFO_REPLY 16
+#define ICMP_INFO_REQUEST 15
+#define ICMP_IREQ 15
+#define ICMP_IREQREPLY 16
+#define ICMP_MASKLEN 12
+#define ICMP_MASKREPLY 18
+#define ICMP_MASKREQ 17
+#define ICMP_MAXTYPE 18
+#define ICMP_MINLEN 8
+#define ICMP_NET_ANO 9
+#define ICMP_NET_UNKNOWN 6
+#define ICMP_NET_UNREACH 0
+#define ICMP_NET_UNR_TOS 11
+#define ICMP_PARAMETERPROB 12
+#define ICMP_PARAMPROB 12
+#define ICMP_PARAMPROB_OPTABSENT 1
+#define ICMP_PKT_FILTERED 13
+#define ICMP_PORT_UNREACH 3
+#define ICMP_PREC_CUTOFF 15
+#define ICMP_PREC_VIOLATION 14
+#define ICMP_PROT_UNREACH 2
+#define ICMP_REDIRECT 5
+#define ICMP_REDIRECT_HOST 1
+#define ICMP_REDIRECT_NET 0
+#define ICMP_REDIRECT_TOSHOST 3
+#define ICMP_REDIRECT_TOSNET 2
+#define ICMP_REDIR_HOST 1
+#define ICMP_REDIR_HOSTTOS 3
+#define ICMP_REDIR_NET 0
+#define ICMP_REDIR_NETTOS 2
+#define ICMP_ROUTERADVERT 9
+#define ICMP_ROUTERSOLICIT 10
+#define ICMP_SOURCEQUENCH 4
+#define ICMP_SOURCE_QUENCH 4
+#define ICMP_SR_FAILED 5
+#define ICMP_TIMESTAMP 13
+#define ICMP_TIMESTAMPREPLY 14
+#define ICMP_TIME_EXCEEDED 11
+#define ICMP_TIMXCEED 11
+#define ICMP_TIMXCEED_INTRANS 0
+#define ICMP_TIMXCEED_REASS 1
+#define ICMP_TSLEN (8 + 3 * sizeof (n_time))
+#define ICMP_TSTAMP 13
+#define ICMP_TSTAMPREPLY 14
+#define ICMP_UNREACH 3
+#define ICMP_UNREACH_FILTER_PROHIB 13
+#define ICMP_UNREACH_HOST 1
+#define ICMP_UNREACH_HOST_PRECEDENCE 14
+#define ICMP_UNREACH_HOST_PROHIB 10
+#define ICMP_UNREACH_HOST_UNKNOWN 7
+#define ICMP_UNREACH_ISOLATED 8
+#define ICMP_UNREACH_NEEDFRAG 4
+#define ICMP_UNREACH_NET 0
+#define ICMP_UNREACH_NET_PROHIB 9
+#define ICMP_UNREACH_NET_UNKNOWN 6
+#define ICMP_UNREACH_PORT 3
+#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15
+#define ICMP_UNREACH_PROTOCOL 2
+#define ICMP_UNREACH_SRCFAIL 5
+#define ICMP_UNREACH_TOSHOST 12
+#define ICMP_UNREACH_TOSNET 11
+#define IFTODT(x) (__wasilibc_iftodt(x))
+#define IGMP_AWAKENING_MEMBER 5
+#define IGMP_DELAYING_MEMBER 1
+#define IGMP_DVMRP 0x13
+#define IGMP_HOST_LEAVE_MESSAGE IGMP_V2_LEAVE_GROUP
+#define IGMP_HOST_MEMBERSHIP_QUERY IGMP_MEMBERSHIP_QUERY
+#define IGMP_HOST_MEMBERSHIP_REPORT IGMP_V1_MEMBERSHIP_REPORT
+#define IGMP_HOST_NEW_MEMBERSHIP_REPORT IGMP_V2_MEMBERSHIP_REPORT
+#define IGMP_IDLE_MEMBER 2
+#define IGMP_LAZY_MEMBER 3
+#define IGMP_MAX_HOST_REPORT_DELAY 10
+#define IGMP_MEMBERSHIP_QUERY 0x11
+#define IGMP_MINLEN 8
+#define IGMP_MTRACE 0x1f
+#define IGMP_MTRACE_RESP 0x1e
+#define IGMP_PIM 0x14
+#define IGMP_SLEEPING_MEMBER 4
+#define IGMP_TIMER_SCALE 10
+#define IGMP_TRACE 0x15
+#define IGMP_V1_MEMBERSHIP_REPORT 0x12
+#define IGMP_V2_LEAVE_GROUP 0x17
+#define IGMP_V2_MEMBERSHIP_REPORT 0x16
+#define IGMP_v1_ROUTER 1
+#define IGMP_v2_ROUTER 2
+#define IN6ADDRSZ NS_IN6ADDRSZ
+#define IN6ADDR_ANY_INIT { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }
+#define IN6ADDR_LOOPBACK_INIT { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } }
+#define IN6_ARE_ADDR_EQUAL(a,b) __ARE_4_EQUAL((const uint32_t *)(a), (const uint32_t *)(b))
+#define IN6_IS_ADDR_LINKLOCAL(a) ((((uint8_t *) (a))[0]) == 0xfe && (((uint8_t *) (a))[1] & 0xc0) == 0x80)
+#define IN6_IS_ADDR_LOOPBACK(a) (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && ((uint32_t *) (a))[2] == 0 && ((uint8_t *) (a))[12] == 0 && ((uint8_t *) (a))[13] == 0 && ((uint8_t *) (a))[14] == 0 && ((uint8_t *) (a))[15] == 1 )
+#define IN6_IS_ADDR_MC_GLOBAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0xe))
+#define IN6_IS_ADDR_MC_LINKLOCAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x2))
+#define IN6_IS_ADDR_MC_NODELOCAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x1))
+#define IN6_IS_ADDR_MC_ORGLOCAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x8))
+#define IN6_IS_ADDR_MC_SITELOCAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x5))
+#define IN6_IS_ADDR_MULTICAST(a) (((uint8_t *) (a))[0] == 0xff)
+#define IN6_IS_ADDR_SITELOCAL(a) ((((uint8_t *) (a))[0]) == 0xfe && (((uint8_t *) (a))[1] & 0xc0) == 0xc0)
+#define IN6_IS_ADDR_UNSPECIFIED(a) (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && ((uint32_t *) (a))[2] == 0 && ((uint32_t *) (a))[3] == 0)
+#define IN6_IS_ADDR_V4COMPAT(a) (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && ((uint32_t *) (a))[2] == 0 && ((uint8_t *) (a))[15] > 1)
+#define IN6_IS_ADDR_V4MAPPED(a) (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && ((uint8_t *) (a))[8] == 0 && ((uint8_t *) (a))[9] == 0 && ((uint8_t *) (a))[10] == 0xff && ((uint8_t *) (a))[11] == 0xff)
+#define INADDRSZ NS_INADDRSZ
+#define INADDR_ALLHOSTS_GROUP ((in_addr_t) 0xe0000001)
+#define INADDR_ALLRTRS_GROUP ((in_addr_t) 0xe0000002)
+#define INADDR_ALLSNOOPERS_GROUP ((in_addr_t) 0xe000006a)
+#define INADDR_ANY ((in_addr_t) 0x00000000)
+#define INADDR_BROADCAST ((in_addr_t) 0xffffffff)
+#define INADDR_DUMMY ((in_addr_t) 0xc0000008)
+#define INADDR_LOOPBACK ((in_addr_t) 0x7f000001)
+#define INADDR_MAX_LOCAL_GROUP ((in_addr_t) 0xe00000ff)
+#define INADDR_NONE ((in_addr_t) 0xffffffff)
+#define INADDR_UNSPEC_GROUP ((in_addr_t) 0xe0000000)
+#define INDIR_MASK NS_CMPRSFLGS
+#define INET6_ADDRSTRLEN 46
+#define INET_ADDRSTRLEN 16
+#define INFINITY 1e5000f
+#define INT16SZ NS_INT16SZ
+#define INT16_C(c) c
+#define INT16_MAX (0x7fff)
+#define INT16_MIN (-1-0x7fff)
+#define INT32SZ NS_INT32SZ
+#define INT32_C(c) c
+#define INT32_MAX (0x7fffffff)
+#define INT32_MIN (-1-0x7fffffff)
+#define INT64_C(c) c ## LL
+#define INT64_MAX (0x7fffffffffffffff)
+#define INT64_MIN (-1-0x7fffffffffffffff)
+#define INT8SZ NS_INT8SZ
+#define INT8_C(c) c
+#define INT8_MAX (0x7f)
+#define INT8_MIN (-1-0x7f)
+#define INTBITS (sizeof(int) * 8)
+#define INTMAX_C(c) c ## LL
+#define INTMAX_MAX INT64_MAX
+#define INTMAX_MIN INT64_MIN
+#define INTPTR_MAX INT32_MAX
+#define INTPTR_MIN INT32_MIN
+#define INT_FAST16_MAX INT16_MAX
+#define INT_FAST16_MIN INT16_MIN
+#define INT_FAST32_MAX INT32_MAX
+#define INT_FAST32_MIN INT32_MIN
+#define INT_FAST64_MAX INT64_MAX
+#define INT_FAST64_MIN INT64_MIN
+#define INT_FAST8_MAX INT8_MAX
+#define INT_FAST8_MIN INT8_MIN
+#define INT_LEAST16_MAX INT16_MAX
+#define INT_LEAST16_MIN INT16_MIN
+#define INT_LEAST32_MAX INT32_MAX
+#define INT_LEAST32_MIN INT32_MIN
+#define INT_LEAST64_MAX INT64_MAX
+#define INT_LEAST64_MIN INT64_MIN
+#define INT_LEAST8_MAX INT8_MAX
+#define INT_LEAST8_MIN INT8_MIN
+#define INT_MAX 0x7fffffff
+#define INT_MIN (-1-0x7fffffff)
+#define IN_BADCLASS(a) ((((in_addr_t)(a)) & 0xf0000000) == 0xf0000000)
+#define IN_CLASSA(a) ((((in_addr_t)(a)) & 0x80000000) == 0)
+#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET)
+#define IN_CLASSA_MAX 128
+#define IN_CLASSA_NET 0xff000000
+#define IN_CLASSA_NSHIFT 24
+#define IN_CLASSB(a) ((((in_addr_t)(a)) & 0xc0000000) == 0x80000000)
+#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET)
+#define IN_CLASSB_MAX 65536
+#define IN_CLASSB_NET 0xffff0000
+#define IN_CLASSB_NSHIFT 16
+#define IN_CLASSC(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xc0000000)
+#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET)
+#define IN_CLASSC_NET 0xffffff00
+#define IN_CLASSC_NSHIFT 8
+#define IN_CLASSD(a) ((((in_addr_t)(a)) & 0xf0000000) == 0xe0000000)
+#define IN_EXPERIMENTAL(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xe0000000)
+#define IN_LOOPBACKNET 127
+#define IN_MULTICAST(a) IN_CLASSD(a)
+#define IOV_MAX 1024
+#define IP 244
+#define IP6F_MORE_FRAG 0x0100
+#define IP6F_OFF_MASK 0xf8ff
+#define IP6F_RESERVED_MASK 0x0600
+#define IP6OPT_JUMBO 0xc2
+#define IP6OPT_JUMBO_LEN 6
+#define IP6OPT_NSAP_ADDR 0xc3
+#define IP6OPT_PAD1 0
+#define IP6OPT_PADN 1
+#define IP6OPT_ROUTER_ALERT 0x05
+#define IP6OPT_TUNNEL_LIMIT 0x04
+#define IP6OPT_TYPE(o) ((o) & 0xc0)
+#define IP6OPT_TYPE_DISCARD 0x40
+#define IP6OPT_TYPE_FORCEICMP 0x80
+#define IP6OPT_TYPE_ICMP 0xc0
+#define IP6OPT_TYPE_MUTABLE 0x20
+#define IP6OPT_TYPE_SKIP 0x00
+#define IP6_ALERT_AN 0x0200
+#define IP6_ALERT_MLD 0x0000
+#define IP6_ALERT_RSVP 0x0100
+#define IPDEFTTL 64
+#define IPFRAGTTL 60
+#define IPOPT_CLASS(o) ((o) & IPOPT_CLASS_MASK)
+#define IPOPT_CLASS_MASK 0x60
+#define IPOPT_CONTROL 0x00
+#define IPOPT_COPIED(o) ((o) & IPOPT_COPY)
+#define IPOPT_COPY 0x80
+#define IPOPT_DEBMEAS 0x40
+#define IPOPT_END IPOPT_EOL
+#define IPOPT_EOL 0
+#define IPOPT_LSRR 131
+#define IPOPT_MEASUREMENT IPOPT_DEBMEAS
+#define IPOPT_MINOFF 4
+#define IPOPT_NOOP IPOPT_NOP
+#define IPOPT_NOP 1
+#define IPOPT_NUMBER(o) ((o) & IPOPT_NUMBER_MASK)
+#define IPOPT_NUMBER_MASK 0x1f
+#define IPOPT_OFFSET 2
+#define IPOPT_OLEN 1
+#define IPOPT_OPTVAL 0
+#define IPOPT_RA 148
+#define IPOPT_RESERVED1 0x20
+#define IPOPT_RESERVED2 0x60
+#define IPOPT_RR 7
+#define IPOPT_SATID 136
+#define IPOPT_SEC IPOPT_SECURITY
+#define IPOPT_SECURITY 130
+#define IPOPT_SECUR_CONFID 0xf135
+#define IPOPT_SECUR_EFTO 0x789a
+#define IPOPT_SECUR_MMMM 0xbc4d
+#define IPOPT_SECUR_RESTR 0xaf13
+#define IPOPT_SECUR_SECRET 0xd788
+#define IPOPT_SECUR_TOPSECRET 0x6bc5
+#define IPOPT_SECUR_UNCLASS 0x0000
+#define IPOPT_SID IPOPT_SATID
+#define IPOPT_SSRR 137
+#define IPOPT_TIMESTAMP IPOPT_TS
+#define IPOPT_TS 68
+#define IPOPT_TS_PRESPEC 3
+#define IPOPT_TS_TSANDADDR 1
+#define IPOPT_TS_TSONLY 0
+#define IPPORT_RESERVED 1024
+#define IPPROTO_ICMP 1
+#define IPPROTO_IP 0
+#define IPPROTO_IPV6 41
+#define IPPROTO_RAW 255
+#define IPPROTO_TCP 6
+#define IPPROTO_UDP 17
+#define IPTOS_CLASS(x) ((x) & IPTOS_CLASS_MASK)
+#define IPTOS_CLASS_CS0 0x00
+#define IPTOS_CLASS_CS1 0x20
+#define IPTOS_CLASS_CS2 0x40
+#define IPTOS_CLASS_CS3 0x60
+#define IPTOS_CLASS_CS4 0x80
+#define IPTOS_CLASS_CS5 0xa0
+#define IPTOS_CLASS_CS6 0xc0
+#define IPTOS_CLASS_CS7 0xe0
+#define IPTOS_CLASS_DEFAULT IPTOS_CLASS_CS0
+#define IPTOS_CLASS_MASK 0xe0
+#define IPTOS_DSCP(x) ((x) & IPTOS_DSCP_MASK)
+#define IPTOS_DSCP_AF11 0x28
+#define IPTOS_DSCP_AF12 0x30
+#define IPTOS_DSCP_AF13 0x38
+#define IPTOS_DSCP_AF21 0x48
+#define IPTOS_DSCP_AF22 0x50
+#define IPTOS_DSCP_AF23 0x58
+#define IPTOS_DSCP_AF31 0x68
+#define IPTOS_DSCP_AF32 0x70
+#define IPTOS_DSCP_AF33 0x78
+#define IPTOS_DSCP_AF41 0x88
+#define IPTOS_DSCP_AF42 0x90
+#define IPTOS_DSCP_AF43 0x98
+#define IPTOS_DSCP_EF 0xb8
+#define IPTOS_DSCP_MASK 0xfc
+#define IPTOS_ECN(x) ((x) & IPTOS_ECN_MASK)
+#define IPTOS_ECN_CE 0x03
+#define IPTOS_ECN_ECT0 0x02
+#define IPTOS_ECN_ECT1 0x01
+#define IPTOS_ECN_MASK 0x03
+#define IPTOS_ECN_NOT_ECT 0x00
+#define IPTOS_LOWCOST 0x02
+#define IPTOS_LOWDELAY 0x10
+#define IPTOS_MINCOST IPTOS_LOWCOST
+#define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK)
+#define IPTOS_PREC_CRITIC_ECP 0xa0
+#define IPTOS_PREC_FLASH 0x60
+#define IPTOS_PREC_FLASHOVERRIDE 0x80
+#define IPTOS_PREC_IMMEDIATE 0x40
+#define IPTOS_PREC_INTERNETCONTROL 0xc0
+#define IPTOS_PREC_MASK 0xe0
+#define IPTOS_PREC_NETCONTROL 0xe0
+#define IPTOS_PREC_PRIORITY 0x20
+#define IPTOS_PREC_ROUTINE 0x00
+#define IPTOS_RELIABILITY 0x04
+#define IPTOS_THROUGHPUT 0x08
+#define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK)
+#define IPTOS_TOS_MASK 0x1E
+#define IPTTLDEC 1
+#define IPV6_2292DSTOPTS 4
+#define IPV6_2292HOPLIMIT 8
+#define IPV6_2292HOPOPTS 3
+#define IPV6_2292PKTINFO 2
+#define IPV6_2292PKTOPTIONS 6
+#define IPV6_2292RTHDR 5
+#define IPV6_ADDRFORM 1
+#define IPV6_ADDR_PREFERENCES 72
+#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
+#define IPV6_AUTHHDR 10
+#define IPV6_AUTOFLOWLABEL 70
+#define IPV6_CHECKSUM 7
+#define IPV6_DONTFRAG 62
+#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
+#define IPV6_DSTOPTS 59
+#define IPV6_FREEBIND 78
+#define IPV6_HDRINCL 36
+#define IPV6_HOPLIMIT 52
+#define IPV6_HOPOPTS 54
+#define IPV6_IPSEC_POLICY 34
+#define IPV6_JOIN_ANYCAST 27
+#define IPV6_JOIN_GROUP 20
+#define IPV6_LEAVE_ANYCAST 28
+#define IPV6_LEAVE_GROUP 21
+#define IPV6_MINHOPCOUNT 73
+#define IPV6_MTU 24
+#define IPV6_MTU_DISCOVER 23
+#define IPV6_MULTICAST_ALL 29
+#define IPV6_MULTICAST_HOPS 18
+#define IPV6_MULTICAST_IF 17
+#define IPV6_MULTICAST_LOOP 19
+#define IPV6_NEXTHOP 9
+#define IPV6_ORIGDSTADDR 74
+#define IPV6_PATHMTU 61
+#define IPV6_PKTINFO 50
+#define IPV6_PMTUDISC_DO 2
+#define IPV6_PMTUDISC_DONT 0
+#define IPV6_PMTUDISC_INTERFACE 4
+#define IPV6_PMTUDISC_OMIT 5
+#define IPV6_PMTUDISC_PROBE 3
+#define IPV6_PMTUDISC_WANT 1
+#define IPV6_PREFER_SRC_CGA 0x0008
+#define IPV6_PREFER_SRC_COA 0x0004
+#define IPV6_PREFER_SRC_HOME 0x0400
+#define IPV6_PREFER_SRC_NONCGA 0x0800
+#define IPV6_PREFER_SRC_PUBLIC 0x0002
+#define IPV6_PREFER_SRC_PUBTMP_DEFAULT 0x0100
+#define IPV6_PREFER_SRC_TMP 0x0001
+#define IPV6_RECVDSTOPTS 58
+#define IPV6_RECVERR 25
+#define IPV6_RECVFRAGSIZE 77
+#define IPV6_RECVHOPLIMIT 51
+#define IPV6_RECVHOPOPTS 53
+#define IPV6_RECVORIGDSTADDR IPV6_ORIGDSTADDR
+#define IPV6_RECVPATHMTU 60
+#define IPV6_RECVPKTINFO 49
+#define IPV6_RECVRTHDR 56
+#define IPV6_RECVTCLASS 66
+#define IPV6_ROUTER_ALERT 22
+#define IPV6_ROUTER_ALERT_ISOLATE 30
+#define IPV6_RTHDR 57
+#define IPV6_RTHDRDSTOPTS 55
+#define IPV6_RTHDR_LOOSE 0
+#define IPV6_RTHDR_STRICT 1
+#define IPV6_RTHDR_TYPE_0 0
+#define IPV6_RXDSTOPTS IPV6_DSTOPTS
+#define IPV6_RXHOPOPTS IPV6_HOPOPTS
+#define IPV6_TCLASS 67
+#define IPV6_TRANSPARENT 75
+#define IPV6_UNICAST_HOPS 16
+#define IPV6_UNICAST_IF 76
+#define IPV6_V6ONLY 26
+#define IPV6_XFRM_POLICY 35
+#define IPVERSION 4
+#define IP_ADD_MEMBERSHIP 35
+#define IP_ADD_SOURCE_MEMBERSHIP 39
+#define IP_BIND_ADDRESS_NO_PORT 24
+#define IP_BLOCK_SOURCE 38
+#define IP_CHECKSUM 23
+#define IP_DEFAULT_MULTICAST_LOOP 1
+#define IP_DEFAULT_MULTICAST_TTL 1
+#define IP_DF 0x4000
+#define IP_DROP_MEMBERSHIP 36
+#define IP_DROP_SOURCE_MEMBERSHIP 40
+#define IP_FREEBIND 15
+#define IP_HDRINCL 3
+#define IP_IPSEC_POLICY 16
+#define IP_MAXPACKET 65535
+#define IP_MAX_MEMBERSHIPS 20
+#define IP_MF 0x2000
+#define IP_MINTTL 21
+#define IP_MSFILTER 41
+#define IP_MSFILTER_SIZE(numsrc) (sizeof(struct ip_msfilter) - sizeof(struct in_addr) + (numsrc) * sizeof(struct in_addr))
+#define IP_MSS 576
+#define IP_MTU 14
+#define IP_MTU_DISCOVER 10
+#define IP_MULTICAST_ALL 49
+#define IP_MULTICAST_IF 32
+#define IP_MULTICAST_LOOP 34
+#define IP_MULTICAST_TTL 33
+#define IP_NODEFRAG 22
+#define IP_OFFMASK 0x1fff
+#define IP_OPTIONS 4
+#define IP_ORIGDSTADDR 20
+#define IP_PASSSEC 18
+#define IP_PKTINFO 8
+#define IP_PKTOPTIONS 9
+#define IP_PMTUDISC 10
+#define IP_PMTUDISC_DO 2
+#define IP_PMTUDISC_DONT 0
+#define IP_PMTUDISC_INTERFACE 4
+#define IP_PMTUDISC_OMIT 5
+#define IP_PMTUDISC_PROBE 3
+#define IP_PMTUDISC_WANT 1
+#define IP_RECVERR 11
+#define IP_RECVERR_RFC4884 26
+#define IP_RECVFRAGSIZE 25
+#define IP_RECVOPTS 6
+#define IP_RECVORIGDSTADDR IP_ORIGDSTADDR
+#define IP_RECVRETOPTS IP_RETOPTS
+#define IP_RECVTOS 13
+#define IP_RECVTTL 12
+#define IP_RETOPTS 7
+#define IP_RF 0x8000
+#define IP_ROUTER_ALERT 5
+#define IP_TOS 1
+#define IP_TRANSPARENT 19
+#define IP_TTL 2
+#define IP_UNBLOCK_SOURCE 37
+#define IP_UNICAST_IF 50
+#define IP_XFRM_POLICY 17
+#define IQUERY ns_o_iquery
+#define I_ATMARK (__SID |31)
+#define I_CANPUT (__SID |34)
+#define I_CKBAND (__SID |29)
+#define I_FDINSERT (__SID |16)
+#define I_FIND (__SID |11)
+#define I_FLUSH (__SID | 5)
+#define I_FLUSHBAND (__SID |28)
+#define I_GETBAND (__SID |30)
+#define I_GETCLTIME (__SID |33)
+#define I_GETSIG (__SID |10)
+#define I_GRDOPT (__SID | 7)
+#define I_GWROPT (__SID |20)
+#define I_LINK (__SID |12)
+#define I_LIST (__SID |21)
+#define I_LOOK (__SID | 4)
+#define I_NREAD (__SID | 1)
+#define I_PEEK (__SID |15)
+#define I_PLINK (__SID |22)
+#define I_POP (__SID | 3)
+#define I_PUNLINK (__SID |23)
+#define I_PUSH (__SID | 2)
+#define I_RECVFD (__SID |14)
+#define I_SENDFD (__SID |17)
+#define I_SETCLTIME (__SID |32)
+#define I_SETSIG (__SID | 9)
+#define I_SRDOPT (__SID | 6)
+#define I_STR (__SID | 8)
+#define I_SWROPT (__SID |19)
+#define I_UNLINK (__SID |13)
+#define LASTMARK 0x02
+#define LC_ALL 6
+#define LC_ALL_MASK 0x7fffffff
+#define LC_COLLATE 3
+#define LC_COLLATE_MASK (1<<LC_COLLATE)
+#define LC_CTYPE 0
+#define LC_CTYPE_MASK (1<<LC_CTYPE)
+#define LC_GLOBAL_LOCALE ((locale_t)-1)
+#define LC_MESSAGES 5
+#define LC_MESSAGES_MASK (1<<LC_MESSAGES)
+#define LC_MONETARY 4
+#define LC_MONETARY_MASK (1<<LC_MONETARY)
+#define LC_NUMERIC 1
+#define LC_NUMERIC_MASK (1<<LC_NUMERIC)
+#define LC_TIME 2
+#define LC_TIME_MASK (1<<LC_TIME)
+#define LDBL_DECIMAL_DIG DECIMAL_DIG
+#define LDBL_DIG 33
+#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L
+#define LDBL_HAS_SUBNORM 1
+#define LDBL_MANT_DIG 113
+#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L
+#define LDBL_MAX_10_EXP 4932
+#define LDBL_MAX_EXP 16384
+#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L
+#define LFLOW_OFF 0
+#define LFLOW_ON 1
+#define LFLOW_RESTART_ANY 2
+#define LFLOW_RESTART_XON 3
+#define LITTLE_ENDIAN __LITTLE_ENDIAN
+#define LLONG_MAX 0x7fffffffffffffffLL
+#define LLONG_MIN (-LLONG_MAX-1)
+#define LM_FORWARDMASK 2
+#define LM_MODE 1
+#define LM_SLC 3
+#define LNKTYPE '1'
+#define LOCK_EX 2
+#define LOCK_NB 4
+#define LOCK_SH 1
+#define LOCK_UN 8
+#define LONGBITS (sizeof(long) * 8)
+#define LONG_BIT 32
+#define LONG_MAX __LONG_MAX
+#define LONG_MIN (-LONG_MAX-1)
+#define L_INCR 1
+#define L_SET 0
+#define L_XTND 2
+#define L_ctermid 20
+#define L_cuserid 20
+#define MAGIC "070707"
+#define MATH_ERREXCEPT 2
+#define MATH_ERRNO 1
+#define MAX(a,b) (((a)>(b))?(a):(b))
+#define MAXCDNAME NS_MAXCDNAME
+#define MAXDNAME NS_MAXDNAME
+#define MAXDOUBLE DBL_MAX
+#define MAXFLOAT FLT_MAX
+#define MAXHOSTNAMELEN 64
+#define MAXINT INT_MAX
+#define MAXLABEL NS_MAXLABEL
+#define MAXLONG LONG_MAX
+#define MAXNAMLEN 255
+#define MAXPATHLEN 4096
+#define MAXSHORT SHRT_MAX
+#define MAXSYMLINKS 20
+#define MAXTC 6
+#define MAXTTL 255
+#define MAX_IPOPTLEN 40
+#define MB_CUR_MAX (__ctype_get_mb_cur_max())
+#define MB_LEN_MAX 4
+#define MCAST_BLOCK_SOURCE 43
+#define MCAST_EXCLUDE 0
+#define MCAST_INCLUDE 1
+#define MCAST_JOIN_GROUP 42
+#define MCAST_JOIN_SOURCE_GROUP 46
+#define MCAST_LEAVE_GROUP 45
+#define MCAST_LEAVE_SOURCE_GROUP 47
+#define MCAST_MSFILTER 48
+#define MCAST_UNBLOCK_SOURCE 44
+#define MIN(a,b) (((a)<(b))?(a):(b))
+#define MINDOUBLE DBL_MIN
+#define MINFLOAT FLT_MIN
+#define MININT INT_MIN
+#define MINLONG LONG_MIN
+#define MINSHORT SHRT_MIN
+#define MLD_LISTENER_QUERY 130
+#define MLD_LISTENER_REDUCTION 132
+#define MLD_LISTENER_REPORT 131
+#define MM_APPL 8
+#define MM_CONSOLE 512
+#define MM_ERROR 2
+#define MM_FIRM 4
+#define MM_HALT 1
+#define MM_HARD 1
+#define MM_INFO 4
+#define MM_NOCON 4
+#define MM_NOMSG 1
+#define MM_NOSEV 0
+#define MM_NOTOK (-1)
+#define MM_NRECOV 128
+#define MM_NULLACT ((char*)0)
+#define MM_NULLLBL ((char*)0)
+#define MM_NULLMC 0L
+#define MM_NULLSEV 0
+#define MM_NULLTAG ((char*)0)
+#define MM_NULLTXT ((char*)0)
+#define MM_OK 0
+#define MM_OPSYS 32
+#define MM_PRINT 256
+#define MM_RECOVER 64
+#define MM_SOFT 2
+#define MM_UTIL 16
+#define MM_WARNING 3
+#define MODE_ACK 0x04
+#define MODE_B 2
+#define MODE_C 3
+#define MODE_ECHO 0x0200
+#define MODE_EDIT 0x01
+#define MODE_FLOW 0x0100
+#define MODE_FORCE 0x1000
+#define MODE_INBIN 0x0400
+#define MODE_LIT_ECHO 0x10
+#define MODE_MASK 0x1f
+#define MODE_OUTBIN 0x0800
+#define MODE_S 1
+#define MODE_SOFT_TAB 0x08
+#define MODE_TRAPSIG 0x02
+#define MOD_CLKA ADJ_OFFSET_SINGLESHOT
+#define MOD_CLKB ADJ_TICK
+#define MOD_ESTERROR ADJ_ESTERROR
+#define MOD_FREQUENCY ADJ_FREQUENCY
+#define MOD_MAXERROR ADJ_MAXERROR
+#define MOD_MICRO ADJ_MICRO
+#define MOD_NANO ADJ_NANO
+#define MOD_OFFSET ADJ_OFFSET
+#define MOD_STATUS ADJ_STATUS
+#define MOD_TAI ADJ_TAI
+#define MOD_TIMECONST ADJ_TIMECONST
+#define MON_1 0x2001A
+#define MON_10 0x20023
+#define MON_11 0x20024
+#define MON_12 0x20025
+#define MON_2 0x2001B
+#define MON_3 0x2001C
+#define MON_4 0x2001D
+#define MON_5 0x2001E
+#define MON_6 0x2001F
+#define MON_7 0x20020
+#define MON_8 0x20021
+#define MON_9 0x20022
+#define MORECTL 1
+#define MOREDATA 2
+#define MSG_ANY 0x02
+#define MSG_BAND 0x04
+#define MSG_HIPRI 0x01
+#define MSG_PEEK __WASI_RIFLAGS_RECV_PEEK
+#define MSG_TRUNC __WASI_RIFLAGS_RECV_DATA_TRUNCATED
+#define MSG_WAITALL __WASI_RIFLAGS_RECV_WAITALL
+#define MUXID_ALL (-1)
+#define M_1_PI 0.31830988618379067154
+#define M_2_PI 0.63661977236758134308
+#define M_2_SQRTPI 1.12837916709551257390
+#define M_E 2.7182818284590452354
+#define M_LN10 2.30258509299404568402
+#define M_LN2 0.69314718055994530942
+#define M_LOG10E 0.43429448190325182765
+#define M_LOG2E 1.4426950408889634074
+#define M_PI 3.14159265358979323846
+#define M_PI_2 1.57079632679489661923
+#define M_PI_4 0.78539816339744830962
+#define M_SQRT1_2 0.70710678118654752440
+#define M_SQRT2 1.41421356237309504880
+#define NAMESERVER_PORT NS_DEFAULTPORT
+#define NAME_MAX 255
+#define NAN (0.0f/0.0f)
+#define NBBY 8
+#define NCARGS 131072
+#define NDEBUG 1
+#define ND_NA_FLAG_OVERRIDE 0x00000020
+#define ND_NA_FLAG_ROUTER 0x00000080
+#define ND_NA_FLAG_SOLICITED 0x00000040
+#define ND_NEIGHBOR_ADVERT 136
+#define ND_NEIGHBOR_SOLICIT 135
+#define ND_OPT_HOME_AGENT_INFO 8
+#define ND_OPT_MTU 5
+#define ND_OPT_PI_FLAG_AUTO 0x40
+#define ND_OPT_PI_FLAG_ONLINK 0x80
+#define ND_OPT_PI_FLAG_RADDR 0x20
+#define ND_OPT_PREFIX_INFORMATION 3
+#define ND_OPT_REDIRECTED_HEADER 4
+#define ND_OPT_RTR_ADV_INTERVAL 7
+#define ND_OPT_SOURCE_LINKADDR 1
+#define ND_OPT_TARGET_LINKADDR 2
+#define ND_RA_FLAG_HOME_AGENT 0x20
+#define ND_RA_FLAG_MANAGED 0x80
+#define ND_RA_FLAG_OTHER 0x40
+#define ND_REDIRECT 137
+#define ND_ROUTER_ADVERT 134
+#define ND_ROUTER_SOLICIT 133
+#define NEW_ENV_VALUE 1
+#define NEW_ENV_VAR 0
+#define NGROUPS 32
+#define NGROUPS_MAX 32
+#define NL_ARGMAX 9
+#define NL_CAT_LOCALE 1
+#define NL_LANGMAX 32
+#define NL_LOCALE_NAME(cat) _NL_LOCALE_NAME(cat)
+#define NL_MSGMAX 32767
+#define NL_NMAX 16
+#define NL_SETD 1
+#define NL_SETMAX 255
+#define NL_TEXTMAX 2048
+#define NOERROR ns_r_noerror
+#define NOEXPR 0x50001
+#define NOFILE 256
+#define NOGROUP (-1)
+#define NOP 241
+#define NOSTR 0x50003
+#define NOTAUTH ns_r_notauth
+#define NOTIMP ns_r_notimpl
+#define NOTZONE ns_r_notzone
+#define NR_ICMP_TYPES 18
+#define NR_ICMP_UNREACH 15
+#define NSLC 18
+#define NS_ALG_DH 2
+#define NS_ALG_DSA 3
+#define NS_ALG_DSS NS_ALG_DSA
+#define NS_ALG_EXPIRE_ONLY 253
+#define NS_ALG_MD5RSA 1
+#define NS_ALG_PRIVATE_OID 254
+#define NS_CMPRSFLGS 0xc0
+#define NS_DEFAULTPORT 53
+#define NS_DSA_MAX_BYTES 405
+#define NS_DSA_MIN_SIZE 213
+#define NS_DSA_SIG_SIZE 41
+#define NS_GET16(s,cp) (void)((s) = ns_get16(((cp)+=2)-2))
+#define NS_GET32(l,cp) (void)((l) = ns_get32(((cp)+=4)-4))
+#define NS_HFIXEDSZ 12
+#define NS_IN6ADDRSZ 16
+#define NS_INADDRSZ 4
+#define NS_INT16SZ 2
+#define NS_INT32SZ 4
+#define NS_INT8SZ 1
+#define NS_KEY_EXTENDED_FLAGS 0x1000
+#define NS_KEY_NAME_ENTITY 0x0200
+#define NS_KEY_NAME_RESERVED 0x0300
+#define NS_KEY_NAME_TYPE 0x0300
+#define NS_KEY_NAME_USER 0x0000
+#define NS_KEY_NAME_ZONE 0x0100
+#define NS_KEY_NO_AUTH 0x8000
+#define NS_KEY_NO_CONF 0x4000
+#define NS_KEY_PROT_ANY 255
+#define NS_KEY_PROT_DNSSEC 3
+#define NS_KEY_PROT_EMAIL 2
+#define NS_KEY_PROT_IPSEC 4
+#define NS_KEY_PROT_TLS 1
+#define NS_KEY_RESERVED10 0x0020
+#define NS_KEY_RESERVED11 0x0010
+#define NS_KEY_RESERVED2 0x2000
+#define NS_KEY_RESERVED4 0x0800
+#define NS_KEY_RESERVED5 0x0400
+#define NS_KEY_RESERVED8 0x0080
+#define NS_KEY_RESERVED9 0x0040
+#define NS_KEY_RESERVED_BITMASK ( NS_KEY_RESERVED2 | NS_KEY_RESERVED4 | NS_KEY_RESERVED5 | NS_KEY_RESERVED8 | NS_KEY_RESERVED9 | NS_KEY_RESERVED10 | NS_KEY_RESERVED11 )
+#define NS_KEY_RESERVED_BITMASK2 0xFFFF
+#define NS_KEY_SIGNATORYMASK 0x000F
+#define NS_KEY_TYPEMASK 0xC000
+#define NS_KEY_TYPE_AUTH_CONF 0x0000
+#define NS_KEY_TYPE_AUTH_ONLY 0x4000
+#define NS_KEY_TYPE_CONF_ONLY 0x8000
+#define NS_KEY_TYPE_NO_KEY 0xC000
+#define NS_MAXCDNAME 255
+#define NS_MAXDNAME 1025
+#define NS_MAXLABEL 63
+#define NS_MAXMSG 65535
+#define NS_MD5RSA_MAX_BASE64 (((NS_MD5RSA_MAX_BYTES+2)/3)*4)
+#define NS_MD5RSA_MAX_BITS 4096
+#define NS_MD5RSA_MAX_BYTES ((NS_MD5RSA_MAX_BITS+7/8)*2+3)
+#define NS_MD5RSA_MAX_SIZE ((NS_MD5RSA_MAX_BITS+7)/8)
+#define NS_MD5RSA_MIN_BITS 512
+#define NS_MD5RSA_MIN_SIZE ((NS_MD5RSA_MIN_BITS+7)/8)
+#define NS_NOTIFY_OP ns_o_notify
+#define NS_NXT_BITS 8
+#define NS_NXT_BIT_CLEAR(n,p) (p[(n)/NS_NXT_BITS] &= ~(0x80>>((n)%NS_NXT_BITS)))
+#define NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] & (0x80>>((n)%NS_NXT_BITS)))
+#define NS_NXT_BIT_SET(n,p) (p[(n)/NS_NXT_BITS] |= (0x80>>((n)%NS_NXT_BITS)))
+#define NS_NXT_MAX 127
+#define NS_OPT_DNSSEC_OK 0x8000U
+#define NS_OPT_NSID 3
+#define NS_PACKETSZ 512
+#define NS_PUT16(s,cp) ns_put16((s), ((cp)+=2)-2)
+#define NS_PUT32(l,cp) ns_put32((l), ((cp)+=4)-4)
+#define NS_QFIXEDSZ 4
+#define NS_RRFIXEDSZ 10
+#define NS_SIG_ALG 2
+#define NS_SIG_EXPIR 8
+#define NS_SIG_FOOT 16
+#define NS_SIG_LABELS 3
+#define NS_SIG_OTTL 4
+#define NS_SIG_SIGNED 12
+#define NS_SIG_SIGNER 18
+#define NS_SIG_TYPE 0
+#define NS_TSIG_ALG_HMAC_MD5 "HMAC-MD5.SIG-ALG.REG.INT"
+#define NS_TSIG_ERROR_FORMERR -12
+#define NS_TSIG_ERROR_NO_SPACE -11
+#define NS_TSIG_ERROR_NO_TSIG -10
+#define NS_TSIG_FUDGE 300
+#define NS_TSIG_TCP_COUNT 100
+#define NS_UPDATE_OP ns_o_update
+#define NTELOPTS (1+TELOPT_NEW_ENVIRON)
+#define NULL ((void*)0)
+#define NXDOMAIN ns_r_nxdomain
+#define NXRRSET ns_r_nxrrset
+#define NZERO 20
+#define OLD_ENV_VALUE 0
+#define OLD_ENV_VAR 1
+#define ONCE_FLAG_INIT 0
+#define O_ACCMODE (O_EXEC | O_RDWR | O_SEARCH)
+#define O_APPEND __WASI_FDFLAGS_APPEND
+#define O_CLOEXEC (0)
+#define O_CREAT (__WASI_OFLAGS_CREAT << 12)
+#define O_DIRECTORY (__WASI_OFLAGS_DIRECTORY << 12)
+#define O_DSYNC __WASI_FDFLAGS_DSYNC
+#define O_EXCL (__WASI_OFLAGS_EXCL << 12)
+#define O_EXEC (0x02000000)
+#define O_NOCTTY (0)
+#define O_NOFOLLOW (0x01000000)
+#define O_NONBLOCK __WASI_FDFLAGS_NONBLOCK
+#define O_RDONLY (0x04000000)
+#define O_RDWR (O_RDONLY | O_WRONLY)
+#define O_RSYNC __WASI_FDFLAGS_RSYNC
+#define O_SEARCH (0x08000000)
+#define O_SYNC __WASI_FDFLAGS_SYNC
+#define O_TRUNC (__WASI_OFLAGS_TRUNC << 12)
+#define O_TTY_INIT (0)
+#define O_WRONLY (0x10000000)
+#define PACKETSZ NS_PACKETSZ
+#define PACKET_ADD_MEMBERSHIP 1
+#define PACKET_AUXDATA 8
+#define PACKET_BROADCAST 1
+#define PACKET_COPY_THRESH 7
+#define PACKET_DROP_MEMBERSHIP 2
+#define PACKET_FANOUT 18
+#define PACKET_FANOUT_DATA 22
+#define PACKET_FASTROUTE 6
+#define PACKET_HDRLEN 11
+#define PACKET_HOST 0
+#define PACKET_IGNORE_OUTGOING 23
+#define PACKET_LOOPBACK 5
+#define PACKET_LOSS 14
+#define PACKET_MR_ALLMULTI 2
+#define PACKET_MR_MULTICAST 0
+#define PACKET_MR_PROMISC 1
+#define PACKET_MR_UNICAST 3
+#define PACKET_MULTICAST 2
+#define PACKET_ORIGDEV 9
+#define PACKET_OTHERHOST 3
+#define PACKET_OUTGOING 4
+#define PACKET_QDISC_BYPASS 20
+#define PACKET_RECV_OUTPUT 3
+#define PACKET_RESERVE 12
+#define PACKET_ROLLOVER_STATS 21
+#define PACKET_RX_RING 5
+#define PACKET_STATISTICS 6
+#define PACKET_TIMESTAMP 17
+#define PACKET_TX_HAS_OFF 19
+#define PACKET_TX_RING 13
+#define PACKET_TX_TIMESTAMP 16
+#define PACKET_VERSION 10
+#define PACKET_VNET_HDR 15
+#define PAGESIZE (0x10000)
+#define PAGE_SIZE PAGESIZE
+#define PATH_MAX 4096
+#define PDP_ENDIAN __PDP_ENDIAN
+#define PM_STR 0x20027
+#define POLLERR 0x1000
+#define POLLHUP 0x2000
+#define POLLIN POLLRDNORM
+#define POLLNVAL 0x4000
+#define POLLOUT POLLWRNORM
+#define POLLRDNORM 0x1
+#define POLLWRNORM 0x2
+#define POSIX_CLOSE_RESTART 0
+#define POSIX_FADV_DONTNEED __WASI_ADVICE_DONTNEED
+#define POSIX_FADV_NOREUSE __WASI_ADVICE_NOREUSE
+#define POSIX_FADV_NORMAL __WASI_ADVICE_NORMAL
+#define POSIX_FADV_RANDOM __WASI_ADVICE_RANDOM
+#define POSIX_FADV_SEQUENTIAL __WASI_ADVICE_SEQUENTIAL
+#define POSIX_FADV_WILLNEED __WASI_ADVICE_WILLNEED
+#define PRELIM 1
+#define PRIX16 __UINT16_FMTX__
+#define PRIX32 __UINT32_FMTX__
+#define PRIX64 __UINT64_FMTX__
+#define PRIX8 __UINT8_FMTX__
+#define PRIXFAST16 __UINT_FAST16_FMTX__
+#define PRIXFAST32 __UINT_FAST32_FMTX__
+#define PRIXFAST64 __UINT_FAST64_FMTX__
+#define PRIXFAST8 __UINT_FAST8_FMTX__
+#define PRIXLEAST16 __UINT_LEAST16_FMTX__
+#define PRIXLEAST32 __UINT_LEAST32_FMTX__
+#define PRIXLEAST64 __UINT_LEAST64_FMTX__
+#define PRIXLEAST8 __UINT_LEAST8_FMTX__
+#define PRIXMAX __UINTMAX_FMTX__
+#define PRIXPTR __UINTPTR_FMTX__
+#define PRId16 __INT16_FMTd__
+#define PRId32 __INT32_FMTd__
+#define PRId64 __INT64_FMTd__
+#define PRId8 __INT8_FMTd__
+#define PRIdFAST16 __INT_FAST16_FMTd__
+#define PRIdFAST32 __INT_FAST32_FMTd__
+#define PRIdFAST64 __INT_FAST64_FMTd__
+#define PRIdFAST8 __INT_FAST8_FMTd__
+#define PRIdLEAST16 __INT_LEAST16_FMTd__
+#define PRIdLEAST32 __INT_LEAST32_FMTd__
+#define PRIdLEAST64 __INT_LEAST64_FMTd__
+#define PRIdLEAST8 __INT_LEAST8_FMTd__
+#define PRIdMAX __INTMAX_FMTd__
+#define PRIdPTR __INTPTR_FMTd__
+#define PRIi16 __INT16_FMTi__
+#define PRIi32 __INT32_FMTi__
+#define PRIi64 __INT64_FMTi__
+#define PRIi8 __INT8_FMTi__
+#define PRIiFAST16 __INT_FAST16_FMTi__
+#define PRIiFAST32 __INT_FAST32_FMTi__
+#define PRIiFAST64 __INT_FAST64_FMTi__
+#define PRIiFAST8 __INT_FAST8_FMTi__
+#define PRIiLEAST16 __INT_LEAST16_FMTi__
+#define PRIiLEAST32 __INT_LEAST32_FMTi__
+#define PRIiLEAST64 __INT_LEAST64_FMTi__
+#define PRIiLEAST8 __INT_LEAST8_FMTi__
+#define PRIiMAX __INTMAX_FMTi__
+#define PRIiPTR __INTPTR_FMTi__
+#define PRIo16 __UINT16_FMTo__
+#define PRIo32 __UINT32_FMTo__
+#define PRIo64 __UINT64_FMTo__
+#define PRIo8 __UINT8_FMTo__
+#define PRIoFAST16 __UINT_FAST16_FMTo__
+#define PRIoFAST32 __UINT_FAST32_FMTo__
+#define PRIoFAST64 __UINT_FAST64_FMTo__
+#define PRIoFAST8 __UINT_FAST8_FMTo__
+#define PRIoLEAST16 __UINT_LEAST16_FMTo__
+#define PRIoLEAST32 __UINT_LEAST32_FMTo__
+#define PRIoLEAST64 __UINT_LEAST64_FMTo__
+#define PRIoLEAST8 __UINT_LEAST8_FMTo__
+#define PRIoMAX __UINTMAX_FMTo__
+#define PRIoPTR __UINTPTR_FMTo__
+#define PRIu16 __UINT16_FMTu__
+#define PRIu32 __UINT32_FMTu__
+#define PRIu64 __UINT64_FMTu__
+#define PRIu8 __UINT8_FMTu__
+#define PRIuFAST16 __UINT_FAST16_FMTu__
+#define PRIuFAST32 __UINT_FAST32_FMTu__
+#define PRIuFAST64 __UINT_FAST64_FMTu__
+#define PRIuFAST8 __UINT_FAST8_FMTu__
+#define PRIuLEAST16 __UINT_LEAST16_FMTu__
+#define PRIuLEAST32 __UINT_LEAST32_FMTu__
+#define PRIuLEAST64 __UINT_LEAST64_FMTu__
+#define PRIuLEAST8 __UINT_LEAST8_FMTu__
+#define PRIuMAX __UINTMAX_FMTu__
+#define PRIuPTR __UINTPTR_FMTu__
+#define PRIx16 __UINT16_FMTx__
+#define PRIx32 __UINT32_FMTx__
+#define PRIx64 __UINT64_FMTx__
+#define PRIx8 __UINT8_FMTx__
+#define PRIxFAST16 __UINT_FAST16_FMTx__
+#define PRIxFAST32 __UINT_FAST32_FMTx__
+#define PRIxFAST64 __UINT_FAST64_FMTx__
+#define PRIxFAST8 __UINT_FAST8_FMTx__
+#define PRIxLEAST16 __UINT_LEAST16_FMTx__
+#define PRIxLEAST32 __UINT_LEAST32_FMTx__
+#define PRIxLEAST64 __UINT_LEAST64_FMTx__
+#define PRIxLEAST8 __UINT_LEAST8_FMTx__
+#define PRIxMAX __UINTMAX_FMTx__
+#define PRIxPTR __UINTPTR_FMTx__
+#define PTRBITS (sizeof(char *) * 8)
+#define PTRDIFF_MAX INT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PUTLONG NS_PUT32
+#define PUTSHORT NS_PUT16
+#define QFIXEDSZ NS_QFIXEDSZ
+#define QUERY ns_o_query
+#define RADIXCHAR 0x10000
+#define RAND_MAX (0x7fffffff)
+#define REC_EOF '\002'
+#define REC_EOR '\001'
+#define REC_ESC '\377'
+#define REFUSED ns_r_refused
+#define REGTYPE '0'
+#define REG_BADBR 10
+#define REG_BADPAT 2
+#define REG_BADRPT 13
+#define REG_EBRACE 9
+#define REG_EBRACK 7
+#define REG_ECOLLATE 3
+#define REG_ECTYPE 4
+#define REG_EESCAPE 5
+#define REG_ENOSYS -1
+#define REG_EPAREN 8
+#define REG_ERANGE 11
+#define REG_ESPACE 12
+#define REG_ESUBREG 6
+#define REG_EXTENDED 1
+#define REG_ICASE 2
+#define REG_NEWLINE 4
+#define REG_NOMATCH 1
+#define REG_NOSUB 8
+#define REG_NOTBOL 1
+#define REG_NOTEOL 2
+#define REG_OK 0
+#define RE_DUP_MAX 255
+#define RMSGD 0x0001
+#define RMSGN 0x0002
+#define RNORM 0x0000
+#define RPM_PCO_ADD 1
+#define RPM_PCO_CHANGE 2
+#define RPM_PCO_SETGLOBAL 3
+#define RPROTDAT 0x0004
+#define RPROTDIS 0x0008
+#define RPROTMASK 0x001C
+#define RPROTNORM 0x0010
+#define RRFIXEDSZ NS_RRFIXEDSZ
+#define RRQ 01
+#define RS_HIPRI 0x01
+#define RUSAGE_CHILDREN 2
+#define RUSAGE_SELF 1
+#define R_OK (4)
+#define SARMAG 8
+#define SB 250
+#define SCHAR_MAX 127
+#define SCHAR_MIN (-128)
+#define SCNd16 __INT16_FMTd__
+#define SCNd32 __INT32_FMTd__
+#define SCNd64 __INT64_FMTd__
+#define SCNd8 __INT8_FMTd__
+#define SCNdFAST16 __INT_FAST16_FMTd__
+#define SCNdFAST32 __INT_FAST32_FMTd__
+#define SCNdFAST64 __INT_FAST64_FMTd__
+#define SCNdFAST8 __INT_FAST8_FMTd__
+#define SCNdLEAST16 __INT_LEAST16_FMTd__
+#define SCNdLEAST32 __INT_LEAST32_FMTd__
+#define SCNdLEAST64 __INT_LEAST64_FMTd__
+#define SCNdLEAST8 __INT_LEAST8_FMTd__
+#define SCNdMAX __INTMAX_FMTd__
+#define SCNdPTR __INTPTR_FMTd__
+#define SCNi16 __INT16_FMTi__
+#define SCNi32 __INT32_FMTi__
+#define SCNi64 __INT64_FMTi__
+#define SCNi8 __INT8_FMTi__
+#define SCNiFAST16 __INT_FAST16_FMTi__
+#define SCNiFAST32 __INT_FAST32_FMTi__
+#define SCNiFAST64 __INT_FAST64_FMTi__
+#define SCNiFAST8 __INT_FAST8_FMTi__
+#define SCNiLEAST16 __INT_LEAST16_FMTi__
+#define SCNiLEAST32 __INT_LEAST32_FMTi__
+#define SCNiLEAST64 __INT_LEAST64_FMTi__
+#define SCNiLEAST8 __INT_LEAST8_FMTi__
+#define SCNiMAX __INTMAX_FMTi__
+#define SCNiPTR __INTPTR_FMTi__
+#define SCNo16 __UINT16_FMTo__
+#define SCNo32 __UINT32_FMTo__
+#define SCNo64 __UINT64_FMTo__
+#define SCNo8 __UINT8_FMTo__
+#define SCNoFAST16 __UINT_FAST16_FMTo__
+#define SCNoFAST32 __UINT_FAST32_FMTo__
+#define SCNoFAST64 __UINT_FAST64_FMTo__
+#define SCNoFAST8 __UINT_FAST8_FMTo__
+#define SCNoLEAST16 __UINT_LEAST16_FMTo__
+#define SCNoLEAST32 __UINT_LEAST32_FMTo__
+#define SCNoLEAST64 __UINT_LEAST64_FMTo__
+#define SCNoLEAST8 __UINT_LEAST8_FMTo__
+#define SCNoMAX __UINTMAX_FMTo__
+#define SCNoPTR __UINTPTR_FMTo__
+#define SCNu16 __UINT16_FMTu__
+#define SCNu32 __UINT32_FMTu__
+#define SCNu64 __UINT64_FMTu__
+#define SCNu8 __UINT8_FMTu__
+#define SCNuFAST16 __UINT_FAST16_FMTu__
+#define SCNuFAST32 __UINT_FAST32_FMTu__
+#define SCNuFAST64 __UINT_FAST64_FMTu__
+#define SCNuFAST8 __UINT_FAST8_FMTu__
+#define SCNuLEAST16 __UINT_LEAST16_FMTu__
+#define SCNuLEAST32 __UINT_LEAST32_FMTu__
+#define SCNuLEAST64 __UINT_LEAST64_FMTu__
+#define SCNuLEAST8 __UINT_LEAST8_FMTu__
+#define SCNuMAX __UINTMAX_FMTu__
+#define SCNuPTR __UINTPTR_FMTu__
+#define SCNx16 __UINT16_FMTx__
+#define SCNx32 __UINT32_FMTx__
+#define SCNx64 __UINT64_FMTx__
+#define SCNx8 __UINT8_FMTx__
+#define SCNxFAST16 __UINT_FAST16_FMTx__
+#define SCNxFAST32 __UINT_FAST32_FMTx__
+#define SCNxFAST64 __UINT_FAST64_FMTx__
+#define SCNxFAST8 __UINT_FAST8_FMTx__
+#define SCNxLEAST16 __UINT_LEAST16_FMTx__
+#define SCNxLEAST32 __UINT_LEAST32_FMTx__
+#define SCNxLEAST64 __UINT_LEAST64_FMTx__
+#define SCNxLEAST8 __UINT_LEAST8_FMTx__
+#define SCNxMAX __UINTMAX_FMTx__
+#define SCNxPTR __UINTPTR_FMTx__
+#define SE 240
+#define SEEK_CUR __WASI_WHENCE_CUR
+#define SEEK_END __WASI_WHENCE_END
+#define SEEK_SET __WASI_WHENCE_SET
+#define SEGSIZE 512
+#define SEM_FAILED ((sem_t *)0)
+#define SERVFAIL ns_r_servfail
+#define SHORTBITS (sizeof(short) * 8)
+#define SHRT_MAX 0x7fff
+#define SHRT_MIN (-1-0x7fff)
+#define SHUT_RD __WASI_SDFLAGS_RD
+#define SHUT_RDWR (SHUT_RD | SHUT_WR)
+#define SHUT_WR __WASI_SDFLAGS_WR
+#define SIG_ATOMIC_MAX INT32_MAX
+#define SIG_ATOMIC_MIN INT32_MIN
+#define SIZE_MAX UINT32_MAX
+#define SI_LOAD_SHIFT 16
+#define SLC_ABORT 7
+#define SLC_ACK 0x80
+#define SLC_AO 4
+#define SLC_AYT 5
+#define SLC_BRK 2
+#define SLC_CANTCHANGE 1
+#define SLC_DEFAULT 3
+#define SLC_EC 10
+#define SLC_EL 11
+#define SLC_EOF 8
+#define SLC_EOR 6
+#define SLC_EW 12
+#define SLC_FLAGS 1
+#define SLC_FLUSHIN 0x40
+#define SLC_FLUSHOUT 0x20
+#define SLC_FORW1 17
+#define SLC_FORW2 18
+#define SLC_FUNC 0
+#define SLC_IP 3
+#define SLC_LEVELBITS 0x03
+#define SLC_LNEXT 14
+#define SLC_NAME(x) slc_names[x]
+#define SLC_NAMELIST "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", "LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0,
+#define SLC_NAMES SLC_NAMELIST
+#define SLC_NAME_OK(x) ((unsigned int)(x) <= NSLC)
+#define SLC_NOSUPPORT 0
+#define SLC_RP 13
+#define SLC_SUSP 9
+#define SLC_SYNCH 1
+#define SLC_VALUE 2
+#define SLC_VARIABLE 2
+#define SLC_XOFF 16
+#define SLC_XON 15
+#define SNDPIPE 0x002
+#define SNDZERO 0x001
+#define SOCK_CLOEXEC (0x00002000)
+#define SOCK_DGRAM __WASI_FILETYPE_SOCKET_DGRAM
+#define SOCK_NONBLOCK (0x00004000)
+#define SOCK_STREAM __WASI_FILETYPE_SOCKET_STREAM
+#define SOL_SOCKET 0x7fffffff
+#define SOL_TCP 6
+#define SOL_UDP 17
+#define SO_TYPE 3
+#define SSIZE_MAX LONG_MAX
+#define STATUS ns_o_status
+#define STA_CLK 0x8000
+#define STA_CLOCKERR 0x1000
+#define STA_DEL 0x0020
+#define STA_FLL 0x0008
+#define STA_FREQHOLD 0x0080
+#define STA_INS 0x0010
+#define STA_MODE 0x4000
+#define STA_NANO 0x2000
+#define STA_PLL 0x0001
+#define STA_PPSERROR 0x0800
+#define STA_PPSFREQ 0x0002
+#define STA_PPSJITTER 0x0200
+#define STA_PPSSIGNAL 0x0100
+#define STA_PPSTIME 0x0004
+#define STA_PPSWANDER 0x0400
+#define STA_RONLY (STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR | STA_CLOCKERR | STA_NANO | STA_MODE | STA_CLK)
+#define STA_UNSYNC 0x0040
+#define STDERR_FILENO 2
+#define STDIN_FILENO 0
+#define STDOUT_FILENO 1
+#define STRU_F 1
+#define STRU_P 3
+#define STRU_R 2
+#define SUN_LEN(s) (2+strlen((s)->sun_path))
+#define SUSP 237
+#define SYMLOOP_MAX 40
+#define SYMTYPE '2'
+#define SYNCH 242
+#define S_ADDT ns_s_ar
+#define S_BANDURG 0x0200
+#define S_ERROR 0x0010
+#define S_HANGUP 0x0020
+#define S_HIPRI 0x0002
+#define S_IEXEC S_IXUSR
+#define S_IFBLK (0x6000)
+#define S_IFCHR (0x2000)
+#define S_IFDIR (0x4000)
+#define S_IFIFO (0xc000)
+#define S_IFLNK (0xa000)
+#define S_IFMT (S_IFBLK | S_IFCHR | S_IFDIR | S_IFIFO | S_IFLNK | S_IFREG | S_IFSOCK)
+#define S_IFREG (0x8000)
+#define S_IFSOCK (0xc000)
+#define S_INPUT 0x0001
+#define S_IREAD S_IRUSR
+#define S_IRGRP (0x20)
+#define S_IROTH (0x4)
+#define S_IRUSR (0x100)
+#define S_IRWXG (S_IXGRP | S_IWGRP | S_IRGRP)
+#define S_IRWXO (S_IXOTH | S_IWOTH | S_IROTH)
+#define S_IRWXU (S_IXUSR | S_IWUSR | S_IRUSR)
+#define S_ISBLK(m) (((m)&S_IFMT) == S_IFBLK)
+#define S_ISCHR(m) (((m)&S_IFMT) == S_IFCHR)
+#define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR)
+#define S_ISFIFO(m) (((m)&S_IFMT) == S_IFIFO)
+#define S_ISGID (0x400)
+#define S_ISLNK(m) (((m)&S_IFMT) == S_IFLNK)
+#define S_ISREG(m) (((m)&S_IFMT) == S_IFREG)
+#define S_ISSOCK(m) (((m)&S_IFMT) == S_IFSOCK)
+#define S_ISUID (0x800)
+#define S_ISVTX (0x200)
+#define S_IWGRP (0x10)
+#define S_IWOTH (0x2)
+#define S_IWRITE S_IWUSR
+#define S_IWUSR (0x80)
+#define S_IXGRP (0x8)
+#define S_IXOTH (0x1)
+#define S_IXUSR (0x40)
+#define S_MSG 0x0008
+#define S_OUTPUT 0x0004
+#define S_PREREQ ns_s_pr
+#define S_RDBAND 0x0080
+#define S_RDNORM 0x0040
+#define S_UPDATE ns_s_ud
+#define S_WRBAND 0x0100
+#define S_WRNORM S_OUTPUT
+#define S_ZONE ns_s_zn
+#define TCPI_OPT_ECN 8
+#define TCPI_OPT_SACK 2
+#define TCPI_OPT_TIMESTAMPS 1
+#define TCPI_OPT_WSCALE 4
+#define TCPOLEN_MAXSEG 4
+#define TCPOLEN_SACK_PERMITTED 2
+#define TCPOLEN_TIMESTAMP 10
+#define TCPOLEN_WINDOW 3
+#define TCPOPT_EOL 0
+#define TCPOPT_MAXSEG 2
+#define TCPOPT_NOP 1
+#define TCPOPT_SACK 5
+#define TCPOPT_SACK_PERMITTED 4
+#define TCPOPT_TIMESTAMP 8
+#define TCPOPT_WINDOW 3
+#define TCP_CA_CWR 2
+#define TCP_CA_Disorder 1
+#define TCP_CA_Loss 4
+#define TCP_CA_Open 0
+#define TCP_CA_Recovery 3
+#define TCP_CC_INFO 26
+#define TCP_CLOSE 7
+#define TCP_CLOSE_WAIT 8
+#define TCP_CLOSING 11
+#define TCP_CM_INQ TCP_INQ
+#define TCP_CONGESTION 13
+#define TCP_CORK 3
+#define TCP_DEFER_ACCEPT 9
+#define TCP_ENCAP_ESPINTCP 7
+#define TCP_ESTABLISHED 1
+#define TCP_FASTOPEN 23
+#define TCP_FASTOPEN_CONNECT 30
+#define TCP_FASTOPEN_KEY 33
+#define TCP_FASTOPEN_NO_COOKIE 34
+#define TCP_FIN_WAIT1 4
+#define TCP_FIN_WAIT2 5
+#define TCP_INFO 11
+#define TCP_INQ 36
+#define TCP_KEEPCNT 6
+#define TCP_KEEPIDLE 4
+#define TCP_KEEPINTVL 5
+#define TCP_LAST_ACK 9
+#define TCP_LINGER2 8
+#define TCP_LISTEN 10
+#define TCP_MAXSEG 2
+#define TCP_MD5SIG 14
+#define TCP_MD5SIG_EXT 32
+#define TCP_MD5SIG_FLAG_IFINDEX 0x2
+#define TCP_MD5SIG_FLAG_PREFIX 0x1
+#define TCP_MD5SIG_MAXKEYLEN 80
+#define TCP_NODELAY 1
+#define TCP_NOTSENT_LOWAT 25
+#define TCP_QUEUE_SEQ 21
+#define TCP_QUICKACK 12
+#define TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT 0x1
+#define TCP_REPAIR 19
+#define TCP_REPAIR_OFF 0
+#define TCP_REPAIR_OFF_NO_WP -1
+#define TCP_REPAIR_ON 1
+#define TCP_REPAIR_OPTIONS 22
+#define TCP_REPAIR_QUEUE 20
+#define TCP_REPAIR_WINDOW 29
+#define TCP_SAVED_SYN 28
+#define TCP_SAVE_SYN 27
+#define TCP_SYNCNT 7
+#define TCP_SYN_RECV 3
+#define TCP_SYN_SENT 2
+#define TCP_THIN_DUPACK 17
+#define TCP_THIN_LINEAR_TIMEOUTS 16
+#define TCP_TIMESTAMP 24
+#define TCP_TIME_WAIT 6
+#define TCP_TX_DELAY 37
+#define TCP_ULP 31
+#define TCP_USER_TIMEOUT 18
+#define TCP_WINDOW_CLAMP 10
+#define TCP_ZEROCOPY_RECEIVE 35
+#define TELCMD(x) telcmds[(x)-TELCMD_FIRST]
+#define TELCMD_FIRST xEOF
+#define TELCMD_LAST IAC
+#define TELCMD_OK(x) ((unsigned int)(x) <= TELCMD_LAST && (unsigned int)(x) >= TELCMD_FIRST)
+#define TELOPT_3270REGIME 29
+#define TELOPT_AUTHENTICATION 37
+#define TELOPT_BINARY 0
+#define TELOPT_BM 19
+#define TELOPT_DET 20
+#define TELOPT_ECHO 1
+#define TELOPT_ENCRYPT 38
+#define TELOPT_EOR 25
+#define TELOPT_EXOPL 255
+#define TELOPT_LFLOW 33
+#define TELOPT_LINEMODE 34
+#define TELOPT_LOGOUT 18
+#define TELOPT_NAMS 4
+#define TELOPT_NAOCRD 10
+#define TELOPT_NAOFFD 13
+#define TELOPT_NAOHTD 12
+#define TELOPT_NAOHTS 11
+#define TELOPT_NAOL 8
+#define TELOPT_NAOLFD 16
+#define TELOPT_NAOP 9
+#define TELOPT_NAOVTD 15
+#define TELOPT_NAOVTS 14
+#define TELOPT_NAWS 31
+#define TELOPT_NEW_ENVIRON 39
+#define TELOPT_OLD_ENVIRON 36
+#define TELOPT_OUTMRK 27
+#define TELOPT_RCP 2
+#define TELOPT_RCTE 7
+#define TELOPT_SGA 3
+#define TELOPT_SNDLOC 23
+#define TELOPT_STATUS 5
+#define TELOPT_SUPDUP 21
+#define TELOPT_SUPDUPOUTPUT 22
+#define TELOPT_TM 6
+#define TELOPT_TSPEED 32
+#define TELOPT_TTYLOC 28
+#define TELOPT_TTYPE 24
+#define TELOPT_TUID 26
+#define TELOPT_X3PAD 30
+#define TELOPT_XASCII 17
+#define TELOPT_XDISPLOC 35
+#define TELQUAL_INFO 2
+#define TELQUAL_IS 0
+#define TELQUAL_NAME 3
+#define TELQUAL_REPLY 2
+#define TELQUAL_SEND 1
+#define TGEXEC 00010
+#define TGREAD 00040
+#define TGWRITE 00020
+#define THOUSEP 0x10001
+#define TH_ACK 0x10
+#define TH_FIN 0x01
+#define TH_PUSH 0x08
+#define TH_RST 0x04
+#define TH_SYN 0x02
+#define TH_URG 0x20
+#define TIMER_ABSTIME __WASI_SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME
+#define TIMESPEC_TO_TIMEVAL(tv,ts) ( (tv)->tv_sec = (ts)->tv_sec, (tv)->tv_usec = (ts)->tv_nsec / 1000, (void)0 )
+#define TIMEVAL_TO_TIMESPEC(tv,ts) ( (ts)->tv_sec = (tv)->tv_sec, (ts)->tv_nsec = (tv)->tv_usec * 1000, (void)0 )
+#define TIME_BAD TIME_ERROR
+#define TIME_DEL 2
+#define TIME_ERROR 5
+#define TIME_INS 1
+#define TIME_OK 0
+#define TIME_OOP 3
+#define TIME_UTC 1
+#define TIME_WAIT 4
+#define TMAGIC "ustar"
+#define TMAGLEN 6
+#define TOEXEC 00001
+#define TOREAD 00004
+#define TOWRITE 00002
+#define TRANSIENT 4
+#define TSGID 02000
+#define TSS_DTOR_ITERATIONS 4
+#define TSUID 04000
+#define TSVTX 01000
+#define TTYDEF_CFLAG (CREAD | CS7 | PARENB | HUPCL)
+#define TTYDEF_IFLAG (BRKINT | ISTRIP | ICRNL | IMAXBEL | IXON | IXANY)
+#define TTYDEF_LFLAG (ECHO | ICANON | ISIG | IEXTEN | ECHOE|ECHOKE|ECHOCTL)
+#define TTYDEF_OFLAG (OPOST | ONLCR | XTABS)
+#define TTYDEF_SPEED (B9600)
+#define TTY_NAME_MAX 32
+#define TUEXEC 00100
+#define TUREAD 00400
+#define TUWRITE 00200
+#define TVERSION "00"
+#define TVERSLEN 2
+#define TYPE_A 1
+#define TYPE_E 2
+#define TYPE_I 3
+#define TYPE_L 4
+#define TZNAME_MAX 6
+#define T_A ns_t_a
+#define T_A6 ns_t_a6
+#define T_AAAA ns_t_aaaa
+#define T_AFSDB ns_t_afsdb
+#define T_ANY ns_t_any
+#define T_ATMA ns_t_atma
+#define T_AXFR ns_t_axfr
+#define T_CNAME ns_t_cname
+#define T_DNAME ns_t_dname
+#define T_EID ns_t_eid
+#define T_FMT 0x2002A
+#define T_FMT_AMPM 0x2002B
+#define T_GPOS ns_t_gpos
+#define T_HINFO ns_t_hinfo
+#define T_ISDN ns_t_isdn
+#define T_IXFR ns_t_ixfr
+#define T_KEY ns_t_key
+#define T_LOC ns_t_loc
+#define T_MAILA ns_t_maila
+#define T_MAILB ns_t_mailb
+#define T_MB ns_t_mb
+#define T_MD ns_t_md
+#define T_MF ns_t_mf
+#define T_MG ns_t_mg
+#define T_MINFO ns_t_minfo
+#define T_MR ns_t_mr
+#define T_MX ns_t_mx
+#define T_NAPTR ns_t_naptr
+#define T_NIMLOC ns_t_nimloc
+#define T_NS ns_t_ns
+#define T_NSAP ns_t_nsap
+#define T_NSAP_PTR ns_t_nsap_ptr
+#define T_NULL ns_t_null
+#define T_NXT ns_t_nxt
+#define T_PTR ns_t_ptr
+#define T_PX ns_t_px
+#define T_RP ns_t_rp
+#define T_RT ns_t_rt
+#define T_SIG ns_t_sig
+#define T_SOA ns_t_soa
+#define T_SRV ns_t_srv
+#define T_TSIG ns_t_tsig
+#define T_TXT ns_t_txt
+#define T_WKS ns_t_wks
+#define T_X25 ns_t_x25
+#define UCHAR_MAX 255
+#define UDP_CORK 1
+#define UDP_ENCAP 100
+#define UDP_ENCAP_ESPINUDP 2
+#define UDP_ENCAP_ESPINUDP_NON_IKE 1
+#define UDP_ENCAP_GTP0 4
+#define UDP_ENCAP_GTP1U 5
+#define UDP_ENCAP_L2TPINUDP 3
+#define UDP_ENCAP_RXRPC 6
+#define UDP_GRO 104
+#define UDP_NO_CHECK6_RX 102
+#define UDP_NO_CHECK6_TX 101
+#define UDP_SEGMENT 103
+#define UINT16_C(c) c
+#define UINT16_MAX (0xffff)
+#define UINT32_C(c) c ## U
+#define UINT32_MAX (0xffffffffu)
+#define UINT64_C(c) c ## ULL
+#define UINT64_MAX (0xffffffffffffffffu)
+#define UINT8_C(c) c
+#define UINT8_MAX (0xff)
+#define UINTMAX_C(c) c ## ULL
+#define UINTMAX_MAX UINT64_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define UINT_FAST16_MAX UINT16_MAX
+#define UINT_FAST32_MAX UINT32_MAX
+#define UINT_FAST64_MAX UINT64_MAX
+#define UINT_FAST8_MAX UINT8_MAX
+#define UINT_LEAST16_MAX UINT16_MAX
+#define UINT_LEAST32_MAX UINT32_MAX
+#define UINT_LEAST64_MAX UINT64_MAX
+#define UINT_LEAST8_MAX UINT8_MAX
+#define UINT_MAX 0xffffffffU
+#define UIO_MAXIOV 1024
+#define ULLONG_MAX (2ULL*LLONG_MAX+1)
+#define ULONG_MAX (2UL*LONG_MAX+1)
+#define USHRT_MAX 0xffff
+#define UTIME_NOW (-1)
+#define UTIME_OMIT (-2)
+#define WCHAR_MAX (0x7fffffff+L'\0')
+#define WCHAR_MIN (-1-0x7fffffff+L'\0')
+#define WEOF 0xffffffffU
+#define WILL 251
+#define WINT_MAX UINT32_MAX
+#define WINT_MIN 0U
+#define WONT 252
+#define WORD_BIT 32
+#define WRQ 02
+#define W_OK (2)
+#define X_OK (1)
+#define YESEXPR 0x50000
+#define YESSTR 0x50002
+#define YXDOMAIN ns_r_yxdomain
+#define YXRRSET ns_r_yxrrset
+#define _ALLOCA_H
+#define _ALL_SOURCE 1
+#define _ARPA_FTP_H
+#define _ARPA_INET_H
+#define _ARPA_NAMESER_H
+#define _ARPA_TELNET_H
+#define _ARPA_TFTP_H
+#define _AR_H
+#define _BYTESWAP_H
+#define _COMPLEX_H
+#define _CPIO_H
+#define _CRYPT_H
+#define _CS_GNU_LIBC_VERSION 2
+#define _CS_GNU_LIBPTHREAD_VERSION 3
+#define _CS_PATH 0
+#define _CS_POSIX_V5_WIDTH_RESTRICTED_ENVS 4
+#define _CS_POSIX_V6_ILP32_OFF32_CFLAGS 1116
+#define _CS_POSIX_V6_ILP32_OFF32_LDFLAGS 1117
+#define _CS_POSIX_V6_ILP32_OFF32_LIBS 1118
+#define _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS 1119
+#define _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS 1120
+#define _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS 1121
+#define _CS_POSIX_V6_ILP32_OFFBIG_LIBS 1122
+#define _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS 1123
+#define _CS_POSIX_V6_LP64_OFF64_CFLAGS 1124
+#define _CS_POSIX_V6_LP64_OFF64_LDFLAGS 1125
+#define _CS_POSIX_V6_LP64_OFF64_LIBS 1126
+#define _CS_POSIX_V6_LP64_OFF64_LINTFLAGS 1127
+#define _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS 1128
+#define _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS 1129
+#define _CS_POSIX_V6_LPBIG_OFFBIG_LIBS 1130
+#define _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS 1131
+#define _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS 1
+#define _CS_POSIX_V7_ILP32_OFF32_CFLAGS 1132
+#define _CS_POSIX_V7_ILP32_OFF32_LDFLAGS 1133
+#define _CS_POSIX_V7_ILP32_OFF32_LIBS 1134
+#define _CS_POSIX_V7_ILP32_OFF32_LINTFLAGS 1135
+#define _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS 1136
+#define _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS 1137
+#define _CS_POSIX_V7_ILP32_OFFBIG_LIBS 1138
+#define _CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS 1139
+#define _CS_POSIX_V7_LP64_OFF64_CFLAGS 1140
+#define _CS_POSIX_V7_LP64_OFF64_LDFLAGS 1141
+#define _CS_POSIX_V7_LP64_OFF64_LIBS 1142
+#define _CS_POSIX_V7_LP64_OFF64_LINTFLAGS 1143
+#define _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS 1144
+#define _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS 1145
+#define _CS_POSIX_V7_LPBIG_OFFBIG_LIBS 1146
+#define _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS 1147
+#define _CS_POSIX_V7_WIDTH_RESTRICTED_ENVS 5
+#define _CS_V6_ENV 1148
+#define _CS_V7_ENV 1149
+#define _CTYPE_H
+#define _Complex_I (0.0f+1.0fi)
+#define _DIRENT_H
+#define _DIRENT_HAVE_D_TYPE
+#define _ENDIAN_H
+#define _ERRNO_H
+#define _ERR_H
+#define _FCNTL_H
+#define _FEATURES_H
+#define _FENV_H
+#define _FLOAT_H
+#define _FMTMSG_H
+#define _FNMATCH_H
+#define _FTW_H
+#define _GETOPT_H
+#define _GLOB_H
+#define _GNU_SOURCE 1
+#define _ICONV_H
+#define _IFADDRS_H
+#define _ILP32 1
+#define _INTTYPES_H
+#define _IOFBF 0
+#define _IOLBF 1
+#define _IONBF 2
+#define _ISO646_H
+#define _LANGINFO_H
+#define _LIBGEN_H
+#define _LIMITS_H
+#define _LOCALE_H
+#define _MALLOC_H
+#define _MATH_H
+#define _MONETARY_H
+#define _MQUEUE_H
+#define _NETINET_ICMP6_H
+#define _NETINET_IGMP_H
+#define _NETINET_IN_H
+#define _NETINET_IN_SYSTM_H
+#define _NETINET_IP6_H
+#define _NETINET_IP_H
+#define _NETINET_IP_ICMP_H
+#define _NETINET_TCP_H
+#define _NETINET_UDP_H
+#define _NETPACKET_PACKET_H
+#define _NL_LOCALE_NAME(cat) (((cat)<<16) | 0xffff)
+#define _NL_TYPES_H
+#define _PC_2_SYMLINKS 20
+#define _PC_ALLOC_SIZE_MIN 18
+#define _PC_ASYNC_IO 10
+#define _PC_CHOWN_RESTRICTED 6
+#define _PC_FILESIZEBITS 13
+#define _PC_LINK_MAX 0
+#define _PC_MAX_CANON 1
+#define _PC_MAX_INPUT 2
+#define _PC_NAME_MAX 3
+#define _PC_NO_TRUNC 7
+#define _PC_PATH_MAX 4
+#define _PC_PIPE_BUF 5
+#define _PC_PRIO_IO 11
+#define _PC_REC_INCR_XFER_SIZE 14
+#define _PC_REC_MAX_XFER_SIZE 15
+#define _PC_REC_MIN_XFER_SIZE 16
+#define _PC_REC_XFER_ALIGN 17
+#define _PC_SOCK_MAXBUF 12
+#define _PC_SYMLINK_MAX 19
+#define _PC_SYNC_IO 9
+#define _PC_VDISABLE 8
+#define _POLL_H
+#define _POSIX2_BC_BASE_MAX 99
+#define _POSIX2_BC_DIM_MAX 2048
+#define _POSIX2_BC_SCALE_MAX 99
+#define _POSIX2_BC_STRING_MAX 1000
+#define _POSIX2_CHARCLASS_NAME_MAX 14
+#define _POSIX2_COLL_WEIGHTS_MAX 2
+#define _POSIX2_C_BIND _POSIX_VERSION
+#define _POSIX2_EXPR_NEST_MAX 32
+#define _POSIX2_LINE_MAX 2048
+#define _POSIX2_RE_DUP_MAX 255
+#define _POSIX2_VERSION _POSIX_VERSION
+#define _POSIX_ADVISORY_INFO _POSIX_VERSION
+#define _POSIX_AIO_LISTIO_MAX 2
+#define _POSIX_AIO_MAX 1
+#define _POSIX_ARG_MAX 4096
+#define _POSIX_BARRIERS _POSIX_VERSION
+#define _POSIX_CHILD_MAX 25
+#define _POSIX_CHOWN_RESTRICTED 1
+#define _POSIX_CLOCKRES_MIN 20000000
+#define _POSIX_CLOCK_SELECTION _POSIX_VERSION
+#define _POSIX_CPUTIME _POSIX_VERSION
+#define _POSIX_DELAYTIMER_MAX 32
+#define _POSIX_FSYNC _POSIX_VERSION
+#define _POSIX_HOST_NAME_MAX 255
+#define _POSIX_IPV6 _POSIX_VERSION
+#define _POSIX_LINK_MAX 8
+#define _POSIX_LOGIN_NAME_MAX 9
+#define _POSIX_MAX_CANON 255
+#define _POSIX_MAX_INPUT 255
+#define _POSIX_MONOTONIC_CLOCK _POSIX_VERSION
+#define _POSIX_MQ_OPEN_MAX 8
+#define _POSIX_MQ_PRIO_MAX 32
+#define _POSIX_NAME_MAX 14
+#define _POSIX_NGROUPS_MAX 8
+#define _POSIX_NO_TRUNC 1
+#define _POSIX_OPEN_MAX 20
+#define _POSIX_PATH_MAX 256
+#define _POSIX_PIPE_BUF 512
+#define _POSIX_READER_WRITER_LOCKS _POSIX_VERSION
+#define _POSIX_REALTIME_SIGNALS _POSIX_VERSION
+#define _POSIX_REGEXP 1
+#define _POSIX_RE_DUP_MAX 255
+#define _POSIX_RTSIG_MAX 8
+#define _POSIX_SEM_NSEMS_MAX 256
+#define _POSIX_SEM_VALUE_MAX 32767
+#define _POSIX_SIGQUEUE_MAX 32
+#define _POSIX_SPIN_LOCKS _POSIX_VERSION
+#define _POSIX_SSIZE_MAX 32767
+#define _POSIX_SS_REPL_MAX 4
+#define _POSIX_STREAM_MAX 8
+#define _POSIX_SYMLINK_MAX 255
+#define _POSIX_SYMLOOP_MAX 8
+#define _POSIX_THREADS _POSIX_VERSION
+#define _POSIX_THREAD_ATTR_STACKADDR _POSIX_VERSION
+#define _POSIX_THREAD_ATTR_STACKSIZE _POSIX_VERSION
+#define _POSIX_THREAD_CPUTIME _POSIX_VERSION
+#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
+#define _POSIX_THREAD_KEYS_MAX 128
+#define _POSIX_THREAD_PRIORITY_SCHEDULING _POSIX_VERSION
+#define _POSIX_THREAD_PROCESS_SHARED _POSIX_VERSION
+#define _POSIX_THREAD_SAFE_FUNCTIONS _POSIX_VERSION
+#define _POSIX_THREAD_THREADS_MAX 64
+#define _POSIX_TIMEOUTS _POSIX_VERSION
+#define _POSIX_TIMERS _POSIX_VERSION
+#define _POSIX_TIMER_MAX 32
+#define _POSIX_TRACE_EVENT_NAME_MAX 30
+#define _POSIX_TRACE_NAME_MAX 8
+#define _POSIX_TRACE_SYS_MAX 8
+#define _POSIX_TRACE_USER_EVENT_MAX 32
+#define _POSIX_TTY_NAME_MAX 9
+#define _POSIX_TZNAME_MAX 6
+#define _POSIX_V6_ILP32_OFFBIG (1)
+#define _POSIX_V7_ILP32_OFFBIG (1)
+#define _POSIX_VDISABLE 0
+#define _POSIX_VERSION 200809L
+#define _PTRDIFF_T
+#define _REGEX_H
+#define _SCHED_H
+#define _SC_2_CHAR_TERM 95
+#define _SC_2_C_BIND 47
+#define _SC_2_C_DEV 48
+#define _SC_2_FORT_DEV 49
+#define _SC_2_FORT_RUN 50
+#define _SC_2_LOCALEDEF 52
+#define _SC_2_PBS 168
+#define _SC_2_PBS_ACCOUNTING 169
+#define _SC_2_PBS_CHECKPOINT 175
+#define _SC_2_PBS_LOCATE 170
+#define _SC_2_PBS_MESSAGE 171
+#define _SC_2_PBS_TRACK 172
+#define _SC_2_SW_DEV 51
+#define _SC_2_UPE 97
+#define _SC_2_VERSION 46
+#define _SC_ADVISORY_INFO 132
+#define _SC_AIO_LISTIO_MAX 23
+#define _SC_AIO_MAX 24
+#define _SC_AIO_PRIO_DELTA_MAX 25
+#define _SC_ARG_MAX 0
+#define _SC_ASYNCHRONOUS_IO 12
+#define _SC_ATEXIT_MAX 87
+#define _SC_AVPHYS_PAGES 86
+#define _SC_BARRIERS 133
+#define _SC_BC_BASE_MAX 36
+#define _SC_BC_DIM_MAX 37
+#define _SC_BC_SCALE_MAX 38
+#define _SC_BC_STRING_MAX 39
+#define _SC_CHILD_MAX 1
+#define _SC_CLK_TCK 2
+#define _SC_CLOCK_SELECTION 137
+#define _SC_COLL_WEIGHTS_MAX 40
+#define _SC_CPUTIME 138
+#define _SC_DELAYTIMER_MAX 26
+#define _SC_EXPR_NEST_MAX 42
+#define _SC_FSYNC 15
+#define _SC_GETGR_R_SIZE_MAX 69
+#define _SC_GETPW_R_SIZE_MAX 70
+#define _SC_HOST_NAME_MAX 180
+#define _SC_IOV_MAX 60
+#define _SC_IPV6 235
+#define _SC_JOB_CONTROL 7
+#define _SC_LINE_MAX 43
+#define _SC_LOGIN_NAME_MAX 71
+#define _SC_MAPPED_FILES 16
+#define _SC_MEMLOCK 17
+#define _SC_MEMLOCK_RANGE 18
+#define _SC_MEMORY_PROTECTION 19
+#define _SC_MESSAGE_PASSING 20
+#define _SC_MONOTONIC_CLOCK 149
+#define _SC_MQ_OPEN_MAX 27
+#define _SC_MQ_PRIO_MAX 28
+#define _SC_NGROUPS_MAX 3
+#define _SC_NPROCESSORS_CONF 83
+#define _SC_NPROCESSORS_ONLN 84
+#define _SC_NZERO 109
+#define _SC_OPEN_MAX 4
+#define _SC_PAGESIZE 30
+#define _SC_PAGE_SIZE 30
+#define _SC_PASS_MAX 88
+#define _SC_PHYS_PAGES 85
+#define _SC_PRIORITIZED_IO 13
+#define _SC_PRIORITY_SCHEDULING 10
+#define _SC_RAW_SOCKETS 236
+#define _SC_READER_WRITER_LOCKS 153
+#define _SC_REALTIME_SIGNALS 9
+#define _SC_REGEXP 155
+#define _SC_RE_DUP_MAX 44
+#define _SC_RTSIG_MAX 31
+#define _SC_SAVED_IDS 8
+#define _SC_SEMAPHORES 21
+#define _SC_SEM_NSEMS_MAX 32
+#define _SC_SEM_VALUE_MAX 33
+#define _SC_SHARED_MEMORY_OBJECTS 22
+#define _SC_SHELL 157
+#define _SC_SIGQUEUE_MAX 34
+#define _SC_SPAWN 159
+#define _SC_SPIN_LOCKS 154
+#define _SC_SPORADIC_SERVER 160
+#define _SC_SS_REPL_MAX 241
+#define _SC_STREAMS 174
+#define _SC_STREAM_MAX 5
+#define _SC_SYMLOOP_MAX 173
+#define _SC_SYNCHRONIZED_IO 14
+#define _SC_THREADS 67
+#define _SC_THREAD_ATTR_STACKADDR 77
+#define _SC_THREAD_ATTR_STACKSIZE 78
+#define _SC_THREAD_CPUTIME 139
+#define _SC_THREAD_DESTRUCTOR_ITERATIONS 73
+#define _SC_THREAD_KEYS_MAX 74
+#define _SC_THREAD_PRIORITY_SCHEDULING 79
+#define _SC_THREAD_PRIO_INHERIT 80
+#define _SC_THREAD_PRIO_PROTECT 81
+#define _SC_THREAD_PROCESS_SHARED 82
+#define _SC_THREAD_ROBUST_PRIO_INHERIT 247
+#define _SC_THREAD_ROBUST_PRIO_PROTECT 248
+#define _SC_THREAD_SAFE_FUNCTIONS 68
+#define _SC_THREAD_SPORADIC_SERVER 161
+#define _SC_THREAD_STACK_MIN 75
+#define _SC_THREAD_THREADS_MAX 76
+#define _SC_TIMEOUTS 164
+#define _SC_TIMERS 11
+#define _SC_TIMER_MAX 35
+#define _SC_TRACE 181
+#define _SC_TRACE_EVENT_FILTER 182
+#define _SC_TRACE_EVENT_NAME_MAX 242
+#define _SC_TRACE_INHERIT 183
+#define _SC_TRACE_LOG 184
+#define _SC_TRACE_NAME_MAX 243
+#define _SC_TRACE_SYS_MAX 244
+#define _SC_TRACE_USER_EVENT_MAX 245
+#define _SC_TTY_NAME_MAX 72
+#define _SC_TYPED_MEMORY_OBJECTS 165
+#define _SC_TZNAME_MAX 6
+#define _SC_UIO_MAXIOV 60
+#define _SC_V6_ILP32_OFF32 176
+#define _SC_V6_ILP32_OFFBIG 177
+#define _SC_V6_LP64_OFF64 178
+#define _SC_V6_LPBIG_OFFBIG 179
+#define _SC_V7_ILP32_OFF32 237
+#define _SC_V7_ILP32_OFFBIG 238
+#define _SC_V7_LP64_OFF64 239
+#define _SC_V7_LPBIG_OFFBIG 240
+#define _SC_VERSION 29
+#define _SC_XBS5_ILP32_OFF32 125
+#define _SC_XBS5_ILP32_OFFBIG 126
+#define _SC_XBS5_LP64_OFF64 127
+#define _SC_XBS5_LPBIG_OFFBIG 128
+#define _SC_XOPEN_CRYPT 92
+#define _SC_XOPEN_ENH_I18N 93
+#define _SC_XOPEN_LEGACY 129
+#define _SC_XOPEN_REALTIME 130
+#define _SC_XOPEN_REALTIME_THREADS 131
+#define _SC_XOPEN_SHM 94
+#define _SC_XOPEN_STREAMS 246
+#define _SC_XOPEN_UNIX 91
+#define _SC_XOPEN_VERSION 89
+#define _SC_XOPEN_XCU_VERSION 90
+#define _SC_XOPEN_XPG2 98
+#define _SC_XOPEN_XPG3 99
+#define _SC_XOPEN_XPG4 100
+#define _SEARCH_H
+#define _SEMAPHORE_H
+#define _SIZE_T
+#define _STDALIGN_H
+#define _STDBOOL_H
+#define _STDC_PREDEF_H
+#define _STDINT_H
+#define _STDIO_EXT_H
+#define _STDIO_H
+#define _STDLIB_H
+#define _STDNORETURN_H
+#define _STRINGS_H
+#define _STRING_H
+#define _STROPTS_H
+#define _SYSEXITS_H
+#define _SYS_EVENTFD_H
+#define _SYS_FILE_H
+#define _SYS_IOCTL_H
+#define _SYS_PARAM_H
+#define _SYS_RANDOM_H
+#define _SYS_REG_H
+#define _SYS_SELECT_H
+#define _SYS_SOCKET_H
+#define _SYS_STAT_H
+#define _SYS_SYSCALL_H
+#define _SYS_SYSINFO_H
+#define _SYS_TIMEB_H
+#define _SYS_TIMEX_H
+#define _SYS_TIME_H
+#define _SYS_TTYDEFAULTS_H
+#define _SYS_TYPES_H
+#define _SYS_UIO_H
+#define _SYS_UN_H
+#define _SYS_UTSNAME_H
+#define _TAR_H
+#define _TGMATH_H
+#define _THREADS_H
+#define _TIME_H
+#define _UCHAR_H
+#define _UNISTD_H
+#define _UTIME_H
+#define _VALUES_H
+#define _VA_LIST
+#define _WCHAR_H
+#define _WCHAR_T
+#define _WCTYPE_H
+#define _WINT_T
+#define _XOPEN_ENH_I18N 1
+#define _XOPEN_IOV_MAX 16
+#define _XOPEN_NAME_MAX 255
+#define _XOPEN_PATH_MAX 1024
+#define _XOPEN_UNIX 1
+#define _XOPEN_VERSION 700
+#define __ARE_4_EQUAL(a,b) (!( (0[a]-0[b]) | (1[a]-1[b]) | (2[a]-2[b]) | (3[a]-3[b]) ))
+#define __ATOMIC_ACQUIRE 2
+#define __ATOMIC_ACQ_REL 4
+#define __ATOMIC_CONSUME 1
+#define __ATOMIC_RELAXED 0
+#define __ATOMIC_RELEASE 3
+#define __ATOMIC_SEQ_CST 5
+#define __BIGGEST_ALIGNMENT__ 16
+#define __BIG_ENDIAN 4321
+#define __BIND 19950621
+#define __BYTE_ORDER __BYTE_ORDER__
+#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
+#define __CHAR16_TYPE__ unsigned short
+#define __CHAR32_TYPE__ unsigned int
+#define __CHAR_BIT__ 8
+#define __compiler_ATOMIC_BOOL_LOCK_FREE 2
+#define __compiler_ATOMIC_CHAR16_T_LOCK_FREE 2
+#define __compiler_ATOMIC_CHAR32_T_LOCK_FREE 2
+#define __compiler_ATOMIC_CHAR_LOCK_FREE 2
+#define __compiler_ATOMIC_INT_LOCK_FREE 2
+#define __compiler_ATOMIC_LLONG_LOCK_FREE 2
+#define __compiler_ATOMIC_LONG_LOCK_FREE 2
+#define __compiler_ATOMIC_POINTER_LOCK_FREE 2
+#define __compiler_ATOMIC_SHORT_LOCK_FREE 2
+#define __compiler_ATOMIC_WCHAR_T_LOCK_FREE 2
+#define __CLANG_MAX_ALIGN_T_DEFINED
+#define __CMPLX(x,y,t) (__builtin_complex((t)(x), (t)(y)))
+#define __CONSTANT_CFSTRINGS__ 1
+#define __DBLCX(x) (__IS_CX(x) && sizeof(x) == sizeof(double complex))
+#define __DBL_DECIMAL_DIG__ 17
+#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
+#define __DBL_DIG__ 15
+#define __DBL_EPSILON__ 2.2204460492503131e-16
+#define __DBL_HAS_DENORM__ 1
+#define __DBL_HAS_INFINITY__ 1
+#define __DBL_HAS_QUIET_NAN__ 1
+#define __DBL_MANT_DIG__ 53
+#define __DBL_MAX_10_EXP__ 308
+#define __DBL_MAX_EXP__ 1024
+#define __DBL_MAX__ 1.7976931348623157e+308
+#define __DBL_MIN_10_EXP__ (-307)
+#define __DBL_MIN_EXP__ (-1021)
+#define __DBL_MIN__ 2.2250738585072014e-308
+#define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__
+#define __DEFINED_FILE
+#define __DEFINED___isoc_va_list
+#define __DEFINED_blkcnt_t
+#define __DEFINED_blksize_t
+#define __DEFINED_clock_t
+#define __DEFINED_clockid_t
+#define __DEFINED_cnd_t
+#define __DEFINED_dev_t
+#define __DEFINED_double_t
+#define __DEFINED_float_t
+#define __DEFINED_fsblkcnt_t
+#define __DEFINED_fsfilcnt_t
+#define __DEFINED_gid_t
+#define __DEFINED_id_t
+#define __DEFINED_ino_t
+#define __DEFINED_int16_t
+#define __DEFINED_int32_t
+#define __DEFINED_int64_t
+#define __DEFINED_int8_t
+#define __DEFINED_intmax_t
+#define __DEFINED_intptr_t
+#define __DEFINED_key_t
+#define __DEFINED_locale_t
+#define __DEFINED_mbstate_t
+#define __DEFINED_mode_t
+#define __DEFINED_mtx_t
+#define __DEFINED_nlink_t
+#define __DEFINED_off_t
+#define __DEFINED_pid_t
+#define __DEFINED_pthread_attr_t
+#define __DEFINED_pthread_barrier_t
+#define __DEFINED_pthread_barrierattr_t
+#define __DEFINED_pthread_cond_t
+#define __DEFINED_pthread_condattr_t
+#define __DEFINED_pthread_key_t
+#define __DEFINED_pthread_mutex_t
+#define __DEFINED_pthread_mutexattr_t
+#define __DEFINED_pthread_once_t
+#define __DEFINED_pthread_rwlock_t
+#define __DEFINED_pthread_rwlockattr_t
+#define __DEFINED_pthread_spinlock_t
+#define __DEFINED_pthread_t
+#define __DEFINED_register_t
+#define __DEFINED_regoff_t
+#define __DEFINED_sa_family_t
+#define __DEFINED_sigset_t
+#define __DEFINED_size_t
+#define __DEFINED_socklen_t
+#define __DEFINED_ssize_t
+#define __DEFINED_suseconds_t
+#define __DEFINED_time_t
+#define __DEFINED_timer_t
+#define __DEFINED_u_int64_t
+#define __DEFINED_uid_t
+#define __DEFINED_uint16_t
+#define __DEFINED_uint32_t
+#define __DEFINED_uint64_t
+#define __DEFINED_uint8_t
+#define __DEFINED_uintmax_t
+#define __DEFINED_uintptr_t
+#define __DEFINED_useconds_t
+#define __DEFINED_va_list
+#define __DEFINED_wchar_t
+#define __DEFINED_wctype_t
+#define __DEFINED_wint_t
+#define __FINITE_MATH_ONLY__ 0
+#define __FLT(x) (__IS_REAL(x) && sizeof(x) == sizeof(float))
+#define __FLTCX(x) (__IS_CX(x) && sizeof(x) == sizeof(float complex))
+#define __FLT_DECIMAL_DIG__ 9
+#define __FLT_DENORM_MIN__ 1.40129846e-45F
+#define __FLT_DIG__ 6
+#define __FLT_EPSILON__ 1.19209290e-7F
+#define __FLT_HAS_DENORM__ 1
+#define __FLT_HAS_INFINITY__ 1
+#define __FLT_HAS_QUIET_NAN__ 1
+#define __FLT_MANT_DIG__ 24
+#define __FLT_MAX_10_EXP__ 38
+#define __FLT_MAX_EXP__ 128
+#define __FLT_MAX__ 3.40282347e+38F
+#define __FLT_MIN_10_EXP__ (-37)
+#define __FLT_MIN_EXP__ (-125)
+#define __FLT_MIN__ 1.17549435e-38F
+#define __FLT_RADIX__ 2
+#define __compiler_ATOMIC_BOOL_LOCK_FREE 2
+#define __compiler_ATOMIC_CHAR16_T_LOCK_FREE 2
+#define __compiler_ATOMIC_CHAR32_T_LOCK_FREE 2
+#define __compiler_ATOMIC_CHAR_LOCK_FREE 2
+#define __compiler_ATOMIC_INT_LOCK_FREE 2
+#define __compiler_ATOMIC_LLONG_LOCK_FREE 2
+#define __compiler_ATOMIC_LONG_LOCK_FREE 2
+#define __compiler_ATOMIC_POINTER_LOCK_FREE 2
+#define __compiler_ATOMIC_SHORT_LOCK_FREE 2
+#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
+#define __compiler_ATOMIC_WCHAR_T_LOCK_FREE 2
+#define __GNUC_STDC_INLINE__ 1
+#define __GNUC_VA_LIST 1
+#define __GXX_ABI_VERSION 1002
+#define __ILP32__ 1
+#define __INT16_C_SUFFIX__
+#define __INT16_FMTd__ "hd"
+#define __INT16_FMTi__ "hi"
+#define __INT16_MAX__ 32767
+#define __INT16_TYPE__ short
+#define __INT32_C_SUFFIX__
+#define __INT32_FMTd__ "d"
+#define __INT32_FMTi__ "i"
+#define __INT32_MAX__ 2147483647
+#define __INT32_TYPE__ int
+#define __INT64_C_SUFFIX__ LL
+#define __INT64_FMTd__ "lld"
+#define __INT64_FMTi__ "lli"
+#define __INT64_MAX__ 9223372036854775807LL
+#define __INT64_TYPE__ long long int
+#define __INT8_C_SUFFIX__
+#define __INT8_FMTd__ "hhd"
+#define __INT8_FMTi__ "hhi"
+#define __INT8_MAX__ 127
+#define __INT8_TYPE__ signed char
+#define __INTMAX_C_SUFFIX__ LL
+#define __INTMAX_FMTd__ "lld"
+#define __INTMAX_FMTi__ "lli"
+#define __INTMAX_MAX__ 9223372036854775807LL
+#define __INTMAX_TYPE__ long long int
+#define __INTMAX_WIDTH__ 64
+#define __INTPTR_FMTd__ "ld"
+#define __INTPTR_FMTi__ "li"
+#define __INTPTR_MAX__ 2147483647L
+#define __INTPTR_TYPE__ long int
+#define __INTPTR_WIDTH__ 32
+#define __INT_FAST16_FMTd__ "hd"
+#define __INT_FAST16_FMTi__ "hi"
+#define __INT_FAST16_MAX__ 32767
+#define __INT_FAST16_TYPE__ short
+#define __INT_FAST32_FMTd__ "d"
+#define __INT_FAST32_FMTi__ "i"
+#define __INT_FAST32_MAX__ 2147483647
+#define __INT_FAST32_TYPE__ int
+#define __INT_FAST64_FMTd__ "lld"
+#define __INT_FAST64_FMTi__ "lli"
+#define __INT_FAST64_MAX__ 9223372036854775807LL
+#define __INT_FAST64_TYPE__ long long int
+#define __INT_FAST8_FMTd__ "hhd"
+#define __INT_FAST8_FMTi__ "hhi"
+#define __INT_FAST8_MAX__ 127
+#define __INT_FAST8_TYPE__ signed char
+#define __INT_LEAST16_FMTd__ "hd"
+#define __INT_LEAST16_FMTi__ "hi"
+#define __INT_LEAST16_MAX__ 32767
+#define __INT_LEAST16_TYPE__ short
+#define __INT_LEAST32_FMTd__ "d"
+#define __INT_LEAST32_FMTi__ "i"
+#define __INT_LEAST32_MAX__ 2147483647
+#define __INT_LEAST32_TYPE__ int
+#define __INT_LEAST64_FMTd__ "lld"
+#define __INT_LEAST64_FMTi__ "lli"
+#define __INT_LEAST64_MAX__ 9223372036854775807LL
+#define __INT_LEAST64_TYPE__ long long int
+#define __INT_LEAST8_FMTd__ "hhd"
+#define __INT_LEAST8_FMTi__ "hhi"
+#define __INT_LEAST8_MAX__ 127
+#define __INT_LEAST8_TYPE__ signed char
+#define __INT_MAX__ 2147483647
+#define __IS_CX(x) (__IS_FP(x) && sizeof(x) == sizeof((x)+I))
+#define __IS_FP(x) (sizeof((x)+1ULL) == sizeof((x)+1.0f))
+#define __IS_REAL(x) (__IS_FP(x) && 2*sizeof(x) == sizeof((x)+I))
+#define __LDBL(x) (__IS_REAL(x) && sizeof(x) == sizeof(long double) && sizeof(long double) != sizeof(double))
+#define __LDBLCX(x) (__IS_CX(x) && sizeof(x) == sizeof(long double complex) && sizeof(long double) != sizeof(double))
+#define __LDBL_DECIMAL_DIG__ 36
+#define __LDBL_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966L
+#define __LDBL_DIG__ 33
+#define __LDBL_EPSILON__ 1.92592994438723585305597794258492732e-34L
+#define __LDBL_HAS_DENORM__ 1
+#define __LDBL_HAS_INFINITY__ 1
+#define __LDBL_HAS_QUIET_NAN__ 1
+#define __LDBL_MANT_DIG__ 113
+#define __LDBL_MAX_10_EXP__ 4932
+#define __LDBL_MAX_EXP__ 16384
+#define __LDBL_MAX__ 1.18973149535723176508575932662800702e+4932L
+#define __LDBL_MIN_10_EXP__ (-4931)
+#define __LDBL_MIN_EXP__ (-16381)
+#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L
+#define __LITTLE_ENDIAN 1234
+#define __LITTLE_ENDIAN__ 1
+#define __LONG_LONG_MAX__ 9223372036854775807LL
+#define __LONG_MAX __LONG_MAX__
+#define __LONG_MAX__ 2147483647L
+#define __NAMESER 19991006
+#define __NEED_FILE
+#define __NEED___isoc_va_list
+#define __NEED_blkcnt_t
+#define __NEED_blksize_t
+#define __NEED_clock_t
+#define __NEED_clockid_t
+#define __NEED_cnd_t
+#define __NEED_dev_t
+#define __NEED_double_t
+#define __NEED_float_t
+#define __NEED_fsblkcnt_t
+#define __NEED_fsfilcnt_t
+#define __NEED_gid_t
+#define __NEED_id_t
+#define __NEED_ino_t
+#define __NEED_int16_t
+#define __NEED_int32_t
+#define __NEED_int64_t
+#define __NEED_int8_t
+#define __NEED_intmax_t
+#define __NEED_intptr_t
+#define __NEED_key_t
+#define __NEED_locale_t
+#define __NEED_mbstate_t
+#define __NEED_mode_t
+#define __NEED_mtx_t
+#define __NEED_nlink_t
+#define __NEED_off_t
+#define __NEED_pid_t
+#define __NEED_pthread_attr_t
+#define __NEED_pthread_barrier_t
+#define __NEED_pthread_barrierattr_t
+#define __NEED_pthread_cond_t
+#define __NEED_pthread_condattr_t
+#define __NEED_pthread_key_t
+#define __NEED_pthread_mutex_t
+#define __NEED_pthread_mutexattr_t
+#define __NEED_pthread_once_t
+#define __NEED_pthread_rwlock_t
+#define __NEED_pthread_rwlockattr_t
+#define __NEED_pthread_spinlock_t
+#define __NEED_pthread_t
+#define __NEED_register_t
+#define __NEED_regoff_t
+#define __NEED_sa_family_t
+#define __NEED_sigset_t
+#define __NEED_size_t
+#define __NEED_socklen_t
+#define __NEED_ssize_t
+#define __NEED_struct_iovec
+#define __NEED_struct_timespec
+#define __NEED_struct_timeval
+#define __NEED_suseconds_t
+#define __NEED_time_t
+#define __NEED_timer_t
+#define __NEED_u_int64_t
+#define __NEED_uid_t
+#define __NEED_uint16_t
+#define __NEED_uint32_t
+#define __NEED_uint64_t
+#define __NEED_uint8_t
+#define __NEED_uintmax_t
+#define __NEED_uintptr_t
+#define __NEED_useconds_t
+#define __NEED_va_list
+#define __NEED_wchar_t
+#define __NEED_wctype_t
+#define __NEED_wint_t
+#define __OBJC_BOOL_IS_BOOL 0
+#define __OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES 3
+#define __OPENCL_MEMORY_SCOPE_DEVICE 2
+#define __OPENCL_MEMORY_SCOPE_SUB_GROUP 4
+#define __OPENCL_MEMORY_SCOPE_WORK_GROUP 1
+#define __OPENCL_MEMORY_SCOPE_WORK_ITEM 0
+#define __OPTIMIZE__ 1
+#define __ORDER_BIG_ENDIAN__ 4321
+#define __ORDER_LITTLE_ENDIAN__ 1234
+#define __ORDER_PDP_ENDIAN__ 3412
+#define __PDP_ENDIAN 3412
+#define __POINTER_WIDTH__ 32
+#define __PRAGMA_REDEFINE_EXTNAME 1
+#define __PTRDIFF_FMTd__ "ld"
+#define __PTRDIFF_FMTi__ "li"
+#define __PTRDIFF_MAX__ 2147483647L
+#define __PTRDIFF_TYPE__ long int
+#define __PTRDIFF_WIDTH__ 32
+#define __REDIR(x,y) __typeof__(x) x __asm__(#y)
+#define __RETCAST(x)
+#define __RETCAST_2(x,y)
+#define __RETCAST_3(x,y,z)
+#define __RETCAST_CX(x)
+#define __RETCAST_REAL(x)
+#define __SCHAR_MAX__ 127
+#define __SHRT_MAX__ 32767
+#define __SID ('S' << 8)
+#define __SIG_ATOMIC_MAX__ 2147483647L
+#define __SIG_ATOMIC_WIDTH__ 32
+#define __SIZEOF_DOUBLE__ 8
+#define __SIZEOF_FLOAT__ 4
+#define __SIZEOF_INT128__ 16
+#define __SIZEOF_INT__ 4
+#define __SIZEOF_LONG_DOUBLE__ 16
+#define __SIZEOF_LONG_LONG__ 8
+#define __SIZEOF_LONG__ 4
+#define __SIZEOF_POINTER__ 4
+#define __SIZEOF_PTRDIFF_T__ 4
+#define __SIZEOF_SHORT__ 2
+#define __SIZEOF_SIZE_T__ 4
+#define __SIZEOF_WCHAR_T__ 4
+#define __SIZEOF_WINT_T__ 4
+#define __SIZE_FMTX__ "lX"
+#define __SIZE_FMTo__ "lo"
+#define __SIZE_FMTu__ "lu"
+#define __SIZE_FMTx__ "lx"
+#define __SIZE_MAX__ 4294967295UL
+#define __SIZE_TYPE__ long unsigned int
+#define __SIZE_WIDTH__ 32
+#define __STDARG_H
+#define __STDC_HOSTED__ 1
+#define __STDC_IEC_559__ 1
+#define __STDC_ISO_10646__ 201206L
+#define __STDC_UTF_16__ 1
+#define __STDC_UTF_32__ 1
+#define __STDC_VERSION__ 201710L
+#define __STDC__ 1
+#define __STDDEF_H
+#define __UAPI_DEF_IN6_ADDR 0
+#define __UAPI_DEF_IN6_ADDR_ALT 0
+#define __UAPI_DEF_IN6_PKTINFO 0
+#define __UAPI_DEF_IN_ADDR 0
+#define __UAPI_DEF_IN_CLASS 0
+#define __UAPI_DEF_IN_IPPROTO 0
+#define __UAPI_DEF_IN_PKTINFO 0
+#define __UAPI_DEF_IP6_MTUINFO 0
+#define __UAPI_DEF_IPHDR 0
+#define __UAPI_DEF_IPPROTO_V6 0
+#define __UAPI_DEF_IPV6_MREQ 0
+#define __UAPI_DEF_IPV6_OPTIONS 0
+#define __UAPI_DEF_IP_MREQ 0
+#define __UAPI_DEF_SOCKADDR_IN 0
+#define __UAPI_DEF_SOCKADDR_IN6 0
+#define __UINT16_C_SUFFIX__
+#define __UINT16_FMTX__ "hX"
+#define __UINT16_FMTo__ "ho"
+#define __UINT16_FMTu__ "hu"
+#define __UINT16_FMTx__ "hx"
+#define __UINT16_MAX__ 65535
+#define __UINT16_TYPE__ unsigned short
+#define __UINT32_C_SUFFIX__ U
+#define __UINT32_FMTX__ "X"
+#define __UINT32_FMTo__ "o"
+#define __UINT32_FMTu__ "u"
+#define __UINT32_FMTx__ "x"
+#define __UINT32_MAX__ 4294967295U
+#define __UINT32_TYPE__ unsigned int
+#define __UINT64_C_SUFFIX__ ULL
+#define __UINT64_FMTX__ "llX"
+#define __UINT64_FMTo__ "llo"
+#define __UINT64_FMTu__ "llu"
+#define __UINT64_FMTx__ "llx"
+#define __UINT64_MAX__ 18446744073709551615ULL
+#define __UINT64_TYPE__ long long unsigned int
+#define __UINT8_C_SUFFIX__
+#define __UINT8_FMTX__ "hhX"
+#define __UINT8_FMTo__ "hho"
+#define __UINT8_FMTu__ "hhu"
+#define __UINT8_FMTx__ "hhx"
+#define __UINT8_MAX__ 255
+#define __UINT8_TYPE__ unsigned char
+#define __UINTMAX_C_SUFFIX__ ULL
+#define __UINTMAX_FMTX__ "llX"
+#define __UINTMAX_FMTo__ "llo"
+#define __UINTMAX_FMTu__ "llu"
+#define __UINTMAX_FMTx__ "llx"
+#define __UINTMAX_MAX__ 18446744073709551615ULL
+#define __UINTMAX_TYPE__ long long unsigned int
+#define __UINTMAX_WIDTH__ 64
+#define __UINTPTR_FMTX__ "lX"
+#define __UINTPTR_FMTo__ "lo"
+#define __UINTPTR_FMTu__ "lu"
+#define __UINTPTR_FMTx__ "lx"
+#define __UINTPTR_MAX__ 4294967295UL
+#define __UINTPTR_TYPE__ long unsigned int
+#define __UINTPTR_WIDTH__ 32
+#define __UINT_FAST16_FMTX__ "hX"
+#define __UINT_FAST16_FMTo__ "ho"
+#define __UINT_FAST16_FMTu__ "hu"
+#define __UINT_FAST16_FMTx__ "hx"
+#define __UINT_FAST16_MAX__ 65535
+#define __UINT_FAST16_TYPE__ unsigned short
+#define __UINT_FAST32_FMTX__ "X"
+#define __UINT_FAST32_FMTo__ "o"
+#define __UINT_FAST32_FMTu__ "u"
+#define __UINT_FAST32_FMTx__ "x"
+#define __UINT_FAST32_MAX__ 4294967295U
+#define __UINT_FAST32_TYPE__ unsigned int
+#define __UINT_FAST64_FMTX__ "llX"
+#define __UINT_FAST64_FMTo__ "llo"
+#define __UINT_FAST64_FMTu__ "llu"
+#define __UINT_FAST64_FMTx__ "llx"
+#define __UINT_FAST64_MAX__ 18446744073709551615ULL
+#define __UINT_FAST64_TYPE__ long long unsigned int
+#define __UINT_FAST8_FMTX__ "hhX"
+#define __UINT_FAST8_FMTo__ "hho"
+#define __UINT_FAST8_FMTu__ "hhu"
+#define __UINT_FAST8_FMTx__ "hhx"
+#define __UINT_FAST8_MAX__ 255
+#define __UINT_FAST8_TYPE__ unsigned char
+#define __UINT_LEAST16_FMTX__ "hX"
+#define __UINT_LEAST16_FMTo__ "ho"
+#define __UINT_LEAST16_FMTu__ "hu"
+#define __UINT_LEAST16_FMTx__ "hx"
+#define __UINT_LEAST16_MAX__ 65535
+#define __UINT_LEAST16_TYPE__ unsigned short
+#define __UINT_LEAST32_FMTX__ "X"
+#define __UINT_LEAST32_FMTo__ "o"
+#define __UINT_LEAST32_FMTu__ "u"
+#define __UINT_LEAST32_FMTx__ "x"
+#define __UINT_LEAST32_MAX__ 4294967295U
+#define __UINT_LEAST32_TYPE__ unsigned int
+#define __UINT_LEAST64_FMTX__ "llX"
+#define __UINT_LEAST64_FMTo__ "llo"
+#define __UINT_LEAST64_FMTu__ "llu"
+#define __UINT_LEAST64_FMTx__ "llx"
+#define __UINT_LEAST64_MAX__ 18446744073709551615ULL
+#define __UINT_LEAST64_TYPE__ long long unsigned int
+#define __UINT_LEAST8_FMTX__ "hhX"
+#define __UINT_LEAST8_FMTo__ "hho"
+#define __UINT_LEAST8_FMTu__ "hhu"
+#define __UINT_LEAST8_FMTx__ "hhx"
+#define __UINT_LEAST8_MAX__ 255
+#define __UINT_LEAST8_TYPE__ unsigned char
+#define __USER_LABEL_PREFIX__
+#define __USE_TIME_BITS64 1
+#define __WASI_ADVICE_DONTNEED (UINT8_C(4))
+#define __WASI_ADVICE_NOREUSE (UINT8_C(5))
+#define __WASI_ADVICE_NORMAL (UINT8_C(0))
+#define __WASI_ADVICE_RANDOM (UINT8_C(2))
+#define __WASI_ADVICE_SEQUENTIAL (UINT8_C(1))
+#define __WASI_ADVICE_WILLNEED (UINT8_C(3))
+#define __WASI_CLOCKID_MONOTONIC (UINT32_C(1))
+#define __WASI_CLOCKID_PROCESS_CPUTIME_ID (UINT32_C(2))
+#define __WASI_CLOCKID_REALTIME (UINT32_C(0))
+#define __WASI_CLOCKID_THREAD_CPUTIME_ID (UINT32_C(3))
+#define __WASI_DIRCOOKIE_START (UINT64_C(0))
+#define __WASI_ERRNO_2BIG (UINT16_C(1))
+#define __WASI_ERRNO_ACCES (UINT16_C(2))
+#define __WASI_ERRNO_ADDRINUSE (UINT16_C(3))
+#define __WASI_ERRNO_ADDRNOTAVAIL (UINT16_C(4))
+#define __WASI_ERRNO_AFNOSUPPORT (UINT16_C(5))
+#define __WASI_ERRNO_AGAIN (UINT16_C(6))
+#define __WASI_ERRNO_ALREADY (UINT16_C(7))
+#define __WASI_ERRNO_BADF (UINT16_C(8))
+#define __WASI_ERRNO_BADMSG (UINT16_C(9))
+#define __WASI_ERRNO_BUSY (UINT16_C(10))
+#define __WASI_ERRNO_CANCELED (UINT16_C(11))
+#define __WASI_ERRNO_CHILD (UINT16_C(12))
+#define __WASI_ERRNO_CONNABORTED (UINT16_C(13))
+#define __WASI_ERRNO_CONNREFUSED (UINT16_C(14))
+#define __WASI_ERRNO_CONNRESET (UINT16_C(15))
+#define __WASI_ERRNO_DEADLK (UINT16_C(16))
+#define __WASI_ERRNO_DESTADDRREQ (UINT16_C(17))
+#define __WASI_ERRNO_DOM (UINT16_C(18))
+#define __WASI_ERRNO_DQUOT (UINT16_C(19))
+#define __WASI_ERRNO_EXIST (UINT16_C(20))
+#define __WASI_ERRNO_FAULT (UINT16_C(21))
+#define __WASI_ERRNO_FBIG (UINT16_C(22))
+#define __WASI_ERRNO_HOSTUNREACH (UINT16_C(23))
+#define __WASI_ERRNO_IDRM (UINT16_C(24))
+#define __WASI_ERRNO_ILSEQ (UINT16_C(25))
+#define __WASI_ERRNO_INPROGRESS (UINT16_C(26))
+#define __WASI_ERRNO_INTR (UINT16_C(27))
+#define __WASI_ERRNO_INVAL (UINT16_C(28))
+#define __WASI_ERRNO_IO (UINT16_C(29))
+#define __WASI_ERRNO_ISCONN (UINT16_C(30))
+#define __WASI_ERRNO_ISDIR (UINT16_C(31))
+#define __WASI_ERRNO_LOOP (UINT16_C(32))
+#define __WASI_ERRNO_MFILE (UINT16_C(33))
+#define __WASI_ERRNO_MLINK (UINT16_C(34))
+#define __WASI_ERRNO_MSGSIZE (UINT16_C(35))
+#define __WASI_ERRNO_MULTIHOP (UINT16_C(36))
+#define __WASI_ERRNO_NAMETOOLONG (UINT16_C(37))
+#define __WASI_ERRNO_NETDOWN (UINT16_C(38))
+#define __WASI_ERRNO_NETRESET (UINT16_C(39))
+#define __WASI_ERRNO_NETUNREACH (UINT16_C(40))
+#define __WASI_ERRNO_NFILE (UINT16_C(41))
+#define __WASI_ERRNO_NOBUFS (UINT16_C(42))
+#define __WASI_ERRNO_NODEV (UINT16_C(43))
+#define __WASI_ERRNO_NOENT (UINT16_C(44))
+#define __WASI_ERRNO_NOEXEC (UINT16_C(45))
+#define __WASI_ERRNO_NOLCK (UINT16_C(46))
+#define __WASI_ERRNO_NOLINK (UINT16_C(47))
+#define __WASI_ERRNO_NOMEM (UINT16_C(48))
+#define __WASI_ERRNO_NOMSG (UINT16_C(49))
+#define __WASI_ERRNO_NOPROTOOPT (UINT16_C(50))
+#define __WASI_ERRNO_NOSPC (UINT16_C(51))
+#define __WASI_ERRNO_NOSYS (UINT16_C(52))
+#define __WASI_ERRNO_NOTCAPABLE (UINT16_C(76))
+#define __WASI_ERRNO_NOTCONN (UINT16_C(53))
+#define __WASI_ERRNO_NOTDIR (UINT16_C(54))
+#define __WASI_ERRNO_NOTEMPTY (UINT16_C(55))
+#define __WASI_ERRNO_NOTRECOVERABLE (UINT16_C(56))
+#define __WASI_ERRNO_NOTSOCK (UINT16_C(57))
+#define __WASI_ERRNO_NOTSUP (UINT16_C(58))
+#define __WASI_ERRNO_NOTTY (UINT16_C(59))
+#define __WASI_ERRNO_NXIO (UINT16_C(60))
+#define __WASI_ERRNO_OVERFLOW (UINT16_C(61))
+#define __WASI_ERRNO_OWNERDEAD (UINT16_C(62))
+#define __WASI_ERRNO_PERM (UINT16_C(63))
+#define __WASI_ERRNO_PIPE (UINT16_C(64))
+#define __WASI_ERRNO_PROTO (UINT16_C(65))
+#define __WASI_ERRNO_PROTONOSUPPORT (UINT16_C(66))
+#define __WASI_ERRNO_PROTOTYPE (UINT16_C(67))
+#define __WASI_ERRNO_RANGE (UINT16_C(68))
+#define __WASI_ERRNO_ROFS (UINT16_C(69))
+#define __WASI_ERRNO_SPIPE (UINT16_C(70))
+#define __WASI_ERRNO_SRCH (UINT16_C(71))
+#define __WASI_ERRNO_STALE (UINT16_C(72))
+#define __WASI_ERRNO_SUCCESS (UINT16_C(0))
+#define __WASI_ERRNO_TIMEDOUT (UINT16_C(73))
+#define __WASI_ERRNO_TXTBSY (UINT16_C(74))
+#define __WASI_ERRNO_XDEV (UINT16_C(75))
+#define __WASI_EVENTRWFLAGS_FD_READWRITE_HANGUP ((__wasi_eventrwflags_t)(1 << 0))
+#define __WASI_EVENTTYPE_CLOCK (UINT8_C(0))
+#define __WASI_EVENTTYPE_FD_READ (UINT8_C(1))
+#define __WASI_EVENTTYPE_FD_WRITE (UINT8_C(2))
+#define __WASI_FDFLAGS_APPEND ((__wasi_fdflags_t)(1 << 0))
+#define __WASI_FDFLAGS_DSYNC ((__wasi_fdflags_t)(1 << 1))
+#define __WASI_FDFLAGS_NONBLOCK ((__wasi_fdflags_t)(1 << 2))
+#define __WASI_FDFLAGS_RSYNC ((__wasi_fdflags_t)(1 << 3))
+#define __WASI_FDFLAGS_SYNC ((__wasi_fdflags_t)(1 << 4))
+#define __WASI_FILETYPE_BLOCK_DEVICE (UINT8_C(1))
+#define __WASI_FILETYPE_CHARACTER_DEVICE (UINT8_C(2))
+#define __WASI_FILETYPE_DIRECTORY (UINT8_C(3))
+#define __WASI_FILETYPE_REGULAR_FILE (UINT8_C(4))
+#define __WASI_FILETYPE_SOCKET_DGRAM (UINT8_C(5))
+#define __WASI_FILETYPE_SOCKET_STREAM (UINT8_C(6))
+#define __WASI_FILETYPE_SYMBOLIC_LINK (UINT8_C(7))
+#define __WASI_FILETYPE_UNKNOWN (UINT8_C(0))
+#define __WASI_FSTFLAGS_ATIM ((__wasi_fstflags_t)(1 << 0))
+#define __WASI_FSTFLAGS_ATIM_NOW ((__wasi_fstflags_t)(1 << 1))
+#define __WASI_FSTFLAGS_MTIM ((__wasi_fstflags_t)(1 << 2))
+#define __WASI_FSTFLAGS_MTIM_NOW ((__wasi_fstflags_t)(1 << 3))
+#define __WASI_LOOKUPFLAGS_SYMLINK_FOLLOW ((__wasi_lookupflags_t)(1 << 0))
+#define __WASI_OFLAGS_CREAT ((__wasi_oflags_t)(1 << 0))
+#define __WASI_OFLAGS_DIRECTORY ((__wasi_oflags_t)(1 << 1))
+#define __WASI_OFLAGS_EXCL ((__wasi_oflags_t)(1 << 2))
+#define __WASI_OFLAGS_TRUNC ((__wasi_oflags_t)(1 << 3))
+#define __WASI_PREOPENTYPE_DIR (UINT8_C(0))
+#define __WASI_RIFLAGS_RECV_PEEK ((__wasi_riflags_t)(1 << 0))
+#define __WASI_RIFLAGS_RECV_WAITALL ((__wasi_riflags_t)(1 << 1))
+#define __WASI_RIGHTS_FD_ADVISE ((__wasi_rights_t)(1 << 7))
+#define __WASI_RIGHTS_FD_ALLOCATE ((__wasi_rights_t)(1 << 8))
+#define __WASI_RIGHTS_FD_DATASYNC ((__wasi_rights_t)(1 << 0))
+#define __WASI_RIGHTS_FD_FDSTAT_SET_FLAGS ((__wasi_rights_t)(1 << 3))
+#define __WASI_RIGHTS_FD_FILESTAT_GET ((__wasi_rights_t)(1 << 21))
+#define __WASI_RIGHTS_FD_FILESTAT_SET_SIZE ((__wasi_rights_t)(1 << 22))
+#define __WASI_RIGHTS_FD_FILESTAT_SET_TIMES ((__wasi_rights_t)(1 << 23))
+#define __WASI_RIGHTS_FD_READ ((__wasi_rights_t)(1 << 1))
+#define __WASI_RIGHTS_FD_READDIR ((__wasi_rights_t)(1 << 14))
+#define __WASI_RIGHTS_FD_SEEK ((__wasi_rights_t)(1 << 2))
+#define __WASI_RIGHTS_FD_SYNC ((__wasi_rights_t)(1 << 4))
+#define __WASI_RIGHTS_FD_TELL ((__wasi_rights_t)(1 << 5))
+#define __WASI_RIGHTS_FD_WRITE ((__wasi_rights_t)(1 << 6))
+#define __WASI_RIGHTS_PATH_CREATE_DIRECTORY ((__wasi_rights_t)(1 << 9))
+#define __WASI_RIGHTS_PATH_CREATE_FILE ((__wasi_rights_t)(1 << 10))
+#define __WASI_RIGHTS_PATH_FILESTAT_GET ((__wasi_rights_t)(1 << 18))
+#define __WASI_RIGHTS_PATH_FILESTAT_SET_SIZE ((__wasi_rights_t)(1 << 19))
+#define __WASI_RIGHTS_PATH_FILESTAT_SET_TIMES ((__wasi_rights_t)(1 << 20))
+#define __WASI_RIGHTS_PATH_LINK_SOURCE ((__wasi_rights_t)(1 << 11))
+#define __WASI_RIGHTS_PATH_LINK_TARGET ((__wasi_rights_t)(1 << 12))
+#define __WASI_RIGHTS_PATH_OPEN ((__wasi_rights_t)(1 << 13))
+#define __WASI_RIGHTS_PATH_READLINK ((__wasi_rights_t)(1 << 15))
+#define __WASI_RIGHTS_PATH_REMOVE_DIRECTORY ((__wasi_rights_t)(1 << 25))
+#define __WASI_RIGHTS_PATH_RENAME_SOURCE ((__wasi_rights_t)(1 << 16))
+#define __WASI_RIGHTS_PATH_RENAME_TARGET ((__wasi_rights_t)(1 << 17))
+#define __WASI_RIGHTS_PATH_SYMLINK ((__wasi_rights_t)(1 << 24))
+#define __WASI_RIGHTS_PATH_UNLINK_FILE ((__wasi_rights_t)(1 << 26))
+#define __WASI_RIGHTS_POLL_FD_READWRITE ((__wasi_rights_t)(1 << 27))
+#define __WASI_RIGHTS_SOCK_ACCEPT ((__wasi_rights_t)(1 << 29))
+#define __WASI_RIGHTS_SOCK_SHUTDOWN ((__wasi_rights_t)(1 << 28))
+#define __WASI_ROFLAGS_RECV_DATA_TRUNCATED ((__wasi_roflags_t)(1 << 0))
+#define __WASI_SDFLAGS_RD ((__wasi_sdflags_t)(1 << 0))
+#define __WASI_SDFLAGS_WR ((__wasi_sdflags_t)(1 << 1))
+#define __WASI_SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME ((__wasi_subclockflags_t)(1 << 0))
+#define __WASI_WHENCE_CUR (UINT8_C(1))
+#define __WASI_WHENCE_END (UINT8_C(2))
+#define __WASI_WHENCE_SET (UINT8_C(0))
+#define __WCHAR_MAX__ 2147483647
+#define __WCHAR_TYPE__ int
+#define __WCHAR_WIDTH__ 32
+#define __WINT_MAX__ 2147483647
+#define __WINT_TYPE__ int
+#define __WINT_WIDTH__ 32
+#define __WORDSIZE 64
+#define __alignas_is_defined 1
+#define __alignof_is_defined 1
+#define __bitop(x,i,o) ((x)[(i)/8] o (1<<(i)%8))
+#define __bool_true_false_are_defined 1
+#define __inline inline
+#define __restrict restrict
+#define __tg_complex(fun,x) (__RETCAST_CX(x)( __FLTCX((x)+I) && __IS_FP(x) ? fun ## f (x) : __LDBLCX((x)+I) ? fun ## l (x) : fun(x) ))
+#define __tg_complex_retreal(fun,x) (__RETCAST_REAL(x)( __FLTCX((x)+I) && __IS_FP(x) ? fun ## f (x) : __LDBLCX((x)+I) ? fun ## l (x) : fun(x) ))
+#define __tg_real(fun,x) (__RETCAST(x)__tg_real_nocast(fun, x))
+#define __tg_real_2(fun,x,y) (__RETCAST_2(x, y)( __FLT(x) && __FLT(y) ? fun ## f (x, y) : __LDBL((x)+(y)) ? fun ## l (x, y) : fun(x, y) ))
+#define __tg_real_2_1(fun,x,y) (__RETCAST(x)( __FLT(x) ? fun ## f (x, y) : __LDBL(x) ? fun ## l (x, y) : fun(x, y) ))
+#define __tg_real_complex(fun,x) (__RETCAST(x)( __FLTCX(x) ? c ## fun ## f (x) : __DBLCX(x) ? c ## fun (x) : __LDBLCX(x) ? c ## fun ## l (x) : __FLT(x) ? fun ## f (x) : __LDBL(x) ? fun ## l (x) : fun(x) ))
+#define __tg_real_complex_fabs(x) (__RETCAST_REAL(x)( __FLTCX(x) ? cabsf(x) : __DBLCX(x) ? cabs(x) : __LDBLCX(x) ? cabsl(x) : __FLT(x) ? fabsf(x) : __LDBL(x) ? fabsl(x) : fabs(x) ))
+#define __tg_real_complex_pow(x,y) (__RETCAST_2(x, y)( __FLTCX((x)+(y)) && __IS_FP(x) && __IS_FP(y) ? cpowf(x, y) : __FLTCX((x)+(y)) ? cpow(x, y) : __DBLCX((x)+(y)) ? cpow(x, y) : __LDBLCX((x)+(y)) ? cpowl(x, y) : __FLT(x) && __FLT(y) ? powf(x, y) : __LDBL((x)+(y)) ? powl(x, y) : pow(x, y) ))
+#define __tg_real_fma(x,y,z) (__RETCAST_3(x, y, z)( __FLT(x) && __FLT(y) && __FLT(z) ? fmaf(x, y, z) : __LDBL((x)+(y)+(z)) ? fmal(x, y, z) : fma(x, y, z) ))
+#define __tg_real_nocast(fun,x) ( __FLT(x) ? fun ## f (x) : __LDBL(x) ? fun ## l (x) : fun(x) )
+#define __tg_real_remquo(x,y,z) (__RETCAST_2(x, y)( __FLT(x) && __FLT(y) ? remquof(x, y, z) : __LDBL((x)+(y)) ? remquol(x, y, z) : remquo(x, y, z) ))
+#define __tm_gmtoff tm_gmtoff
+#define __tm_zone tm_zone
+#define __va_copy(d,s) __builtin_va_copy(d,s)
+#define __wasi__ 1
+#define __wasi_api_h
+#define __wasi_libc_environ_h
+#define __wasi_libc_find_relpath_h
+#define __wasi_libc_h
+#define __wasi_libc_nocwd_h
+#define __wasilibc___errno_h
+#define __wasilibc___errno_values_h
+#define __wasilibc___fd_set_h
+#define __wasilibc___function___isatty_h
+#define __wasilibc___functions_malloc_h
+#define __wasilibc___functions_memcpy_h
+#define __wasilibc___header_dirent_h
+#define __wasilibc___header_fcntl_h
+#define __wasilibc___header_netinet_in_h
+#define __wasilibc___header_poll_h
+#define __wasilibc___header_stdlib_h
+#define __wasilibc___header_string_h
+#define __wasilibc___header_sys_ioctl_h
+#define __wasilibc___header_sys_resource_h
+#define __wasilibc___header_sys_socket_h
+#define __wasilibc___header_sys_stat_h
+#define __wasilibc___header_time_h
+#define __wasilibc___header_unistd_h
+#define __wasilibc___include_inttypes_h
+#define __wasilibc___macro_FD_SETSIZE_h
+#define __wasilibc___macro_PAGESIZE_h
+#define __wasilibc___mode_t_h
+#define __wasilibc___seek_h
+#define __wasilibc___struct_dirent_h
+#define __wasilibc___struct_in6_addr_h
+#define __wasilibc___struct_in_addr_h
+#define __wasilibc___struct_iovec_h
+#define __wasilibc___struct_msghdr_h
+#define __wasilibc___struct_pollfd_h
+#define __wasilibc___struct_rusage_h
+#define __wasilibc___struct_sockaddr_h
+#define __wasilibc___struct_sockaddr_in6_h
+#define __wasilibc___struct_sockaddr_in_h
+#define __wasilibc___struct_sockaddr_storage_h
+#define __wasilibc___struct_sockaddr_un_h
+#define __wasilibc___struct_stat_h
+#define __wasilibc___struct_timespec_h
+#define __wasilibc___struct_timeval_h
+#define __wasilibc___struct_tm_h
+#define __wasilibc___struct_tms_h
+#define __wasilibc___typedef_DIR_h
+#define __wasilibc___typedef_blkcnt_t_h
+#define __wasilibc___typedef_blksize_t_h
+#define __wasilibc___typedef_clock_t_h
+#define __wasilibc___typedef_clockid_t_h
+#define __wasilibc___typedef_dev_t_h
+#define __wasilibc___typedef_fd_set_h
+#define __wasilibc___typedef_gid_t_h
+#define __wasilibc___typedef_in_addr_t_h
+#define __wasilibc___typedef_in_port_t_h
+#define __wasilibc___typedef_ino_t_h
+#define __wasilibc___typedef_mode_t_h
+#define __wasilibc___typedef_nfds_t_h
+#define __wasilibc___typedef_nlink_t_h
+#define __wasilibc___typedef_off_t_h
+#define __wasilibc___typedef_sa_family_t_h
+#define __wasilibc___typedef_sigset_t_h
+#define __wasilibc___typedef_socklen_t_h
+#define __wasilibc___typedef_ssize_t_h
+#define __wasilibc___typedef_suseconds_t_h
+#define __wasilibc___typedef_time_t_h
+#define __wasilibc___typedef_uid_t_h
+#define __wasm 1
+#define __wasm32 1
+#define __wasm32__ 1
+#define __wasm__ 1
+#define _tolower(a) ((a)|0x20)
+#define _toupper(a) ((a)&0x5f)
+#define acos(x) __tg_real_complex(acos, (x))
+#define acosh(x) __tg_real_complex(acosh, (x))
+#define alignas _Alignas
+#define alignof _Alignof
+#define alloca __builtin_alloca
+#define alphasort64 alphasort
+#define and &&
+#define and_eq &=
+#define asin(x) __tg_real_complex(asin, (x))
+#define asinh(x) __tg_real_complex(asinh, (x))
+#define assert(x) (void)0
+#define atan(x) __tg_real_complex(atan, (x))
+#define atan2(x,y) __tg_real_2(atan2, (x), (y))
+#define atanh(x) __tg_real_complex(atanh, (x))
+#define be16toh(x) __bswap16(x)
+#define be32toh(x) __bswap32(x)
+#define be64toh(x) __bswap64(x)
+#define betoh16(x) __bswap16(x)
+#define betoh32(x) __bswap32(x)
+#define betoh64(x) __bswap64(x)
+#define bitand &
+#define bitor |
+#define blkcnt64_t blkcnt_t
+#define bool _Bool
+#define bswap_16(x) __bswap_16(x)
+#define bswap_32(x) __bswap_32(x)
+#define bswap_64(x) __bswap_64(x)
+#define carg(x) __tg_complex_retreal(carg, (x))
+#define cbrt(x) __tg_real(cbrt, (x))
+#define ceil(x) __tg_real(ceil, (x))
+#define cimag(x) __tg_complex_retreal(cimag, (x))
+#define cimagf(x) (__builtin_cimagf(x))
+#define cimagl(x) (__builtin_cimagl(x))
+#define clrbit(x,i) __bitop(x,i,&=~)
+#define compl ~
+#define complex _Complex
+#define conj(x) __tg_complex(conj, (x))
+#define copysign(x,y) __tg_real_2(copysign, (x), (y))
+#define cos(x) __tg_real_complex(cos, (x))
+#define cosh(x) __tg_real_complex(cosh, (x))
+#define cproj(x) __tg_complex(cproj, (x))
+#define creal(x) __tg_complex_retreal(creal, (x))
+#define crealf(x) (__builtin_crealf(x))
+#define creall(x) (__builtin_creall(x))
+#define creat64 creat
+#define d_fileno d_ino
+#define direct dirent
+#define dirent64 dirent
+#define erf(x) __tg_real(erf, (x))
+#define erfc(x) __tg_real(erfc, (x))
+#define errno errno
+#define exp(x) __tg_real_complex(exp, (x))
+#define exp2(x) __tg_real(exp2, (x))
+#define expm1(x) __tg_real(expm1, (x))
+#define fabs(x) __tg_real_complex_fabs(x)
+#define false 0
+#define fdim(x,y) __tg_real_2(fdim, (x), (y))
+#define fgetpos64 fgetpos
+#define floor(x) __tg_real(floor, (x))
+#define fma(x,y,z) __tg_real_fma((x), (y), (z))
+#define fmax(x,y) __tg_real_2(fmax, (x), (y))
+#define fmin(x,y) __tg_real_2(fmin, (x), (y))
+#define fmod(x,y) __tg_real_2(fmod, (x), (y))
+#define fopen64 fopen
+#define fpclassify(x) (__builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x))
+#define fpos64_t fpos_t
+#define freopen64 freopen
+#define frexp(x,y) __tg_real_2_1(frexp, (x), (y))
+#define fsblkcnt64_t fsblkcnt_t
+#define fseeko64 fseeko
+#define fsetpos64 fsetpos
+#define fsfilcnt64_t fsfilcnt_t
+#define fstat64 fstat
+#define fstatat64 fstatat
+#define ftello64 ftello
+#define ftruncate64 ftruncate
+#define getdents64 getdents
+#define glob64 glob
+#define glob64_t glob_t
+#define globfree64 globfree
+#define howmany(n,d) (((n)+((d)-1))/(d))
+#define htobe16(x) __bswap16(x)
+#define htobe32(x) __bswap32(x)
+#define htobe64(x) __bswap64(x)
+#define htole16(x) (uint16_t)(x)
+#define htole32(x) (uint32_t)(x)
+#define htole64(x) (uint64_t)(x)
+#define hypot(x,y) __tg_real_2(hypot, (x), (y))
+#define icmp6_data16 icmp6_dataun.icmp6_un_data16
+#define icmp6_data32 icmp6_dataun.icmp6_un_data32
+#define icmp6_data8 icmp6_dataun.icmp6_un_data8
+#define icmp6_id icmp6_data16[0]
+#define icmp6_maxdelay icmp6_data16[0]
+#define icmp6_mtu icmp6_data32[0]
+#define icmp6_pptr icmp6_data32[0]
+#define icmp6_seq icmp6_data16[1]
+#define icmp_data icmp_dun.id_data
+#define icmp_gwaddr icmp_hun.ih_gwaddr
+#define icmp_id icmp_hun.ih_idseq.icd_id
+#define icmp_ip icmp_dun.id_ip.idi_ip
+#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime
+#define icmp_mask icmp_dun.id_mask
+#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu
+#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs
+#define icmp_otime icmp_dun.id_ts.its_otime
+#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
+#define icmp_pptr icmp_hun.ih_pptr
+#define icmp_radv icmp_dun.id_radv
+#define icmp_rtime icmp_dun.id_ts.its_rtime
+#define icmp_seq icmp_hun.ih_idseq.icd_seq
+#define icmp_ttime icmp_dun.id_ts.its_ttime
+#define icmp_void icmp_hun.ih_void
+#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa
+#define ifa_broadaddr ifa_ifu.ifu_broadaddr
+#define ifa_dstaddr ifa_ifu.ifu_dstaddr
+#define ilogb(x) __tg_real_nocast(ilogb, (x))
+#define ino64_t ino_t
+#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
+#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
+#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
+#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
+#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
+#define ip6_vfc ip6_ctlun.ip6_un2_vfc
+#define isalpha(a) (0 ? isalpha(a) : (((unsigned)(a)|32)-'a') < 26)
+#define isascii(a) (0 ? isascii(a) : (unsigned)(a) < 128)
+#define isclr(x,i) !isset(x,i)
+#define isdigit(a) (0 ? isdigit(a) : ((unsigned)(a)-'0') < 10)
+#define isfinite(x) (__builtin_isfinite(x))
+#define isgraph(a) (0 ? isgraph(a) : ((unsigned)(a)-0x21) < 0x5e)
+#define isgreater(x,y) (__builtin_isgreater(x, y))
+#define isgreaterequal(x,y) (__builtin_isgreaterequal(x, y))
+#define isinf(x) (__builtin_isinf(x))
+#define isless(x,y) (__builtin_isless(x, y))
+#define islessequal(x,y) (__builtin_islessequal(x, y))
+#define islessgreater(x,y) (__builtin_islessgreater(x, y))
+#define islower(a) (0 ? islower(a) : ((unsigned)(a)-'a') < 26)
+#define isnan(x) (__builtin_isnan(x))
+#define isnormal(x) (__builtin_isnormal(x))
+#define isprint(a) (0 ? isprint(a) : ((unsigned)(a)-0x20) < 0x5f)
+#define isset(x,i) __bitop(x,i,&)
+#define isspace(a) __isspace(a)
+#define isunordered(x,y) (__builtin_isunordered(x, y))
+#define isupper(a) (0 ? isupper(a) : ((unsigned)(a)-'A') < 26)
+#define iswdigit(a) (0 ? iswdigit(a) : ((unsigned)(a)-'0') < 10)
+#define ldexp(x,y) __tg_real_2_1(ldexp, (x), (y))
+#define le16toh(x) (uint16_t)(x)
+#define le32toh(x) (uint32_t)(x)
+#define le64toh(x) (uint64_t)(x)
+#define letoh16(x) (uint16_t)(x)
+#define letoh32(x) (uint32_t)(x)
+#define letoh64(x) (uint64_t)(x)
+#define lgamma(x) __tg_real(lgamma, (x))
+#define llrint(x) __tg_real_nocast(llrint, (x))
+#define llround(x) __tg_real_nocast(llround, (x))
+#define loff_t off_t
+#define log(x) __tg_real_complex(log, (x))
+#define log10(x) __tg_real(log10, (x))
+#define log1p(x) __tg_real(log1p, (x))
+#define log2(x) __tg_real(log2, (x))
+#define logb(x) __tg_real(logb, (x))
+#define lrint(x) __tg_real_nocast(lrint, (x))
+#define lround(x) __tg_real_nocast(lround, (x))
+#define lseek(fd,offset,whence) ({ off_t __f = (fd); off_t __o = (offset); off_t __w = (whence); __builtin_constant_p((offset)) && __builtin_constant_p((whence)) && __o == 0 && __w == SEEK_CUR ? __wasilibc_tell(__f) : lseek(__f, __o, __w); })
+#define lseek64 lseek
+#define lstat64 lstat
+#define math_errhandling 2
+#define mld_cksum mld_icmp6_hdr.icmp6_cksum
+#define mld_code mld_icmp6_hdr.icmp6_code
+#define mld_maxdelay mld_icmp6_hdr.icmp6_data16[0]
+#define mld_reserved mld_icmp6_hdr.icmp6_data16[1]
+#define mld_type mld_icmp6_hdr.icmp6_type
+#define nd_na_cksum nd_na_hdr.icmp6_cksum
+#define nd_na_code nd_na_hdr.icmp6_code
+#define nd_na_flags_reserved nd_na_hdr.icmp6_data32[0]
+#define nd_na_type nd_na_hdr.icmp6_type
+#define nd_ns_cksum nd_ns_hdr.icmp6_cksum
+#define nd_ns_code nd_ns_hdr.icmp6_code
+#define nd_ns_reserved nd_ns_hdr.icmp6_data32[0]
+#define nd_ns_type nd_ns_hdr.icmp6_type
+#define nd_ra_cksum nd_ra_hdr.icmp6_cksum
+#define nd_ra_code nd_ra_hdr.icmp6_code
+#define nd_ra_curhoplimit nd_ra_hdr.icmp6_data8[0]
+#define nd_ra_flags_reserved nd_ra_hdr.icmp6_data8[1]
+#define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1]
+#define nd_ra_type nd_ra_hdr.icmp6_type
+#define nd_rd_cksum nd_rd_hdr.icmp6_cksum
+#define nd_rd_code nd_rd_hdr.icmp6_code
+#define nd_rd_reserved nd_rd_hdr.icmp6_data32[0]
+#define nd_rd_type nd_rd_hdr.icmp6_type
+#define nd_rs_cksum nd_rs_hdr.icmp6_cksum
+#define nd_rs_code nd_rs_hdr.icmp6_code
+#define nd_rs_reserved nd_rs_hdr.icmp6_data32[0]
+#define nd_rs_type nd_rs_hdr.icmp6_type
+#define nearbyint(x) __tg_real(nearbyint, (x))
+#define nextafter(x,y) __tg_real_2(nextafter, (x), (y))
+#define nexttoward(x,y) __tg_real_2(nexttoward, (x), (y))
+#define nftw64 nftw
+#define no_argument 0
+#define noreturn _Noreturn
+#define not !
+#define not_eq !=
+#define ns_msg_base(handle) ((handle)._msg + 0)
+#define ns_msg_count(handle,section) ((handle)._counts[section] + 0)
+#define ns_msg_end(handle) ((handle)._eom + 0)
+#define ns_msg_getflag(handle,flag) (((handle)._flags & _ns_flagdata[flag].mask) >> _ns_flagdata[flag].shift)
+#define ns_msg_id(handle) ((handle)._id + 0)
+#define ns_msg_size(handle) ((handle)._eom - (handle)._msg)
+#define ns_rr_class(rr) ((ns_class)((rr).rr_class + 0))
+#define ns_rr_name(rr) (((rr).name[0] != '\0') ? (rr).name : ".")
+#define ns_rr_rdata(rr) ((rr).rdata + 0)
+#define ns_rr_rdlen(rr) ((rr).rdlength + 0)
+#define ns_rr_ttl(rr) ((rr).ttl + 0)
+#define ns_rr_type(rr) ((ns_type)((rr).type + 0))
+#define ns_t_mrr_p(t) ((t) == ns_t_tsig || (t) == ns_t_opt)
+#define ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || (t) == ns_t_mailb || (t) == ns_t_maila)
+#define ns_t_rr_p(t) (!ns_t_qt_p(t) && !ns_t_mrr_p(t))
+#define ns_t_udp_p(t) ((t) != ns_t_axfr && (t) != ns_t_zxfr)
+#define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || (t) == ns_t_zxfr)
+#define off64_t off_t
+#define offsetof(t,d) __builtin_offsetof(t, d)
+#define open64 open
+#define openat64 openat
+#define optional_argument 2
+#define or ||
+#define or_eq |=
+#define posix_fadvise64 posix_fadvise
+#define posix_fallocate64 posix_fallocate
+#define pow(x,y) __tg_real_complex_pow((x), (y))
+#define powerof2(n) !(((n)-1) & (n))
+#define pread64 pread
+#define preadv64 preadv
+#define pwrite64 pwrite
+#define pwritev64 pwritev
+#define readdir64 readdir
+#define remainder(x,y) __tg_real_2(remainder, (x), (y))
+#define remquo(x,y,z) __tg_real_remquo((x), (y), (z))
+#define required_argument 1
+#define rint(x) __tg_real(rint, (x))
+#define round(x) __tg_real(round, (x))
+#define roundup(n,d) (howmany(n,d)*(d))
+#define rr_cksum rr_hdr.icmp6_cksum
+#define rr_code rr_hdr.icmp6_code
+#define rr_seqnum rr_hdr.icmp6_data32[0]
+#define rr_type rr_hdr.icmp6_type
+#define scalbln(x,y) __tg_real_2_1(scalbln, (x), (y))
+#define scalbn(x,y) __tg_real_2_1(scalbn, (x), (y))
+#define scandir64 scandir
+#define setbit(x,i) __bitop(x,i,|=)
+#define signbit(x) (__builtin_signbit(x))
+#define sin(x) __tg_real_complex(sin, (x))
+#define sinh(x) __tg_real_complex(sinh, (x))
+#define sqrt(x) __tg_real_complex(sqrt, (x))
+#define st_atime st_atim.tv_sec
+#define st_ctime st_ctim.tv_sec
+#define st_mtime st_mtim.tv_sec
+#define stat64 stat
+#define static_assert _Static_assert
+#define stderr (stderr)
+#define stdin (stdin)
+#define stdout (stdout)
+#define strdupa(x) strcpy(alloca(strlen(x)+1),x)
+#define tan(x) __tg_real_complex(tan, (x))
+#define tanh(x) __tg_real_complex(tanh, (x))
+#define telcmds ((char [][6]){ "EOF", "SUSP", "ABORT", "EOR", "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC", "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0 })
+#define tgamma(x) __tg_real(tgamma, (x))
+#define th_block th_u.tu_block
+#define th_code th_u.tu_code
+#define th_msg th_data
+#define th_stuff th_u.tu_stuff
+#define thrd_equal(A,B) ((A) == (B))
+#define thread_local _Thread_local
+#define timeradd(s,t,a) (void) ( (a)->tv_sec = (s)->tv_sec + (t)->tv_sec, ((a)->tv_usec = (s)->tv_usec + (t)->tv_usec) >= 1000000 && ((a)->tv_usec -= 1000000, (a)->tv_sec++) )
+#define timerclear(t) ((t)->tv_sec = (t)->tv_usec = 0)
+#define timercmp(s,t,op) ((s)->tv_sec == (t)->tv_sec ? (s)->tv_usec op (t)->tv_usec : (s)->tv_sec op (t)->tv_sec)
+#define timerisset(t) ((t)->tv_sec || (t)->tv_usec)
+#define timersub(s,t,a) (void) ( (a)->tv_sec = (s)->tv_sec - (t)->tv_sec, ((a)->tv_usec = (s)->tv_usec - (t)->tv_usec) < 0 && ((a)->tv_usec += 1000000, (a)->tv_sec--) )
+#define true 1
+#define trunc(x) __tg_real(trunc, (x))
+#define uh_dport dest
+#define uh_sport source
+#define uh_sum check
+#define uh_ulen len
+#define va_arg(ap,type) __builtin_va_arg(ap, type)
+#define va_copy(dest,src) __builtin_va_copy(dest, src)
+#define va_end(ap) __builtin_va_end(ap)
+#define va_start(ap,param) __builtin_va_start(ap, param)
+#define versionsort64 versionsort
+#define xEOF 236
+#define xor ^
+#define xor_eq ^=
diff --git a/expected/wasm32-wasi/single/undefined-symbols.txt b/expected/wasm32-wasi/single/undefined-symbols.txt
new file mode 100644
index 0000000..b9cdb34
--- /dev/null
+++ b/expected/wasm32-wasi/single/undefined-symbols.txt
@@ -0,0 +1,68 @@
+__addtf3
+__divtf3
+__eqtf2
+__extenddftf2
+__extendsftf2
+__fixtfdi
+__fixtfsi
+__fixunstfsi
+__floatsitf
+__floatunsitf
+__getf2
+__gttf2
+__heap_base
+__imported_wasi_snapshot_preview1_args_get
+__imported_wasi_snapshot_preview1_args_sizes_get
+__imported_wasi_snapshot_preview1_clock_res_get
+__imported_wasi_snapshot_preview1_clock_time_get
+__imported_wasi_snapshot_preview1_environ_get
+__imported_wasi_snapshot_preview1_environ_sizes_get
+__imported_wasi_snapshot_preview1_fd_advise
+__imported_wasi_snapshot_preview1_fd_allocate
+__imported_wasi_snapshot_preview1_fd_close
+__imported_wasi_snapshot_preview1_fd_datasync
+__imported_wasi_snapshot_preview1_fd_fdstat_get
+__imported_wasi_snapshot_preview1_fd_fdstat_set_flags
+__imported_wasi_snapshot_preview1_fd_fdstat_set_rights
+__imported_wasi_snapshot_preview1_fd_filestat_get
+__imported_wasi_snapshot_preview1_fd_filestat_set_size
+__imported_wasi_snapshot_preview1_fd_filestat_set_times
+__imported_wasi_snapshot_preview1_fd_pread
+__imported_wasi_snapshot_preview1_fd_prestat_dir_name
+__imported_wasi_snapshot_preview1_fd_prestat_get
+__imported_wasi_snapshot_preview1_fd_pwrite
+__imported_wasi_snapshot_preview1_fd_read
+__imported_wasi_snapshot_preview1_fd_readdir
+__imported_wasi_snapshot_preview1_fd_renumber
+__imported_wasi_snapshot_preview1_fd_seek
+__imported_wasi_snapshot_preview1_fd_sync
+__imported_wasi_snapshot_preview1_fd_tell
+__imported_wasi_snapshot_preview1_fd_write
+__imported_wasi_snapshot_preview1_path_create_directory
+__imported_wasi_snapshot_preview1_path_filestat_get
+__imported_wasi_snapshot_preview1_path_filestat_set_times
+__imported_wasi_snapshot_preview1_path_link
+__imported_wasi_snapshot_preview1_path_open
+__imported_wasi_snapshot_preview1_path_readlink
+__imported_wasi_snapshot_preview1_path_remove_directory
+__imported_wasi_snapshot_preview1_path_rename
+__imported_wasi_snapshot_preview1_path_symlink
+__imported_wasi_snapshot_preview1_path_unlink_file
+__imported_wasi_snapshot_preview1_poll_oneoff
+__imported_wasi_snapshot_preview1_proc_exit
+__imported_wasi_snapshot_preview1_random_get
+__imported_wasi_snapshot_preview1_sched_yield
+__imported_wasi_snapshot_preview1_sock_accept
+__imported_wasi_snapshot_preview1_sock_recv
+__imported_wasi_snapshot_preview1_sock_send
+__imported_wasi_snapshot_preview1_sock_shutdown
+__letf2
+__lttf2
+__main_argc_argv
+__netf2
+__stack_pointer
+__subtf3
+__trunctfdf2
+__trunctfsf2
+__unordtf2
+__wasm_call_ctors
diff --git a/libc-bottom-half/README.md b/libc-bottom-half/README.md
new file mode 100644
index 0000000..1e5401c
--- /dev/null
+++ b/libc-bottom-half/README.md
@@ -0,0 +1,19 @@
+# WASI libc "bottom half".
+
+The WASI libc "bottom half" is conceptually the lower half of a traditional libc
+implementation, consisting of C interfaces to the low-level WASI syscalls.
+
+This implementation is partially derived from the "bottom half" of [cloudlibc],
+revision 8835639f27fc42d32096d59d294a0bbb857dc368.
+
+[cloudlibc]: https://github.com/NuxiNL/cloudlibc
+
+This implementation includes preopen functionality, which emulates POSIX APIs
+accepting absolute paths by translating them into pre-opened directory handles
+and relative paths that can be opened with `openat`. This technique is inspired
+by [libpreopen], however the implementation here is designed to be built into
+libc rather than to be a layer on top of libc.
+
+[libpreopen]: https://github.com/musec/libpreopen
+
+The WASI libc lower half currently depends on the dlmalloc component.
diff --git a/libc-bottom-half/clocks/clock.c b/libc-bottom-half/clocks/clock.c
new file mode 100644
index 0000000..6767d73
--- /dev/null
+++ b/libc-bottom-half/clocks/clock.c
@@ -0,0 +1,35 @@
+#define _WASI_EMULATED_PROCESS_CLOCKS
+#include <time.h>
+#include <wasi/api.h>
+#include <common/time.h>
+
+_Static_assert(
+ CLOCKS_PER_SEC == NSEC_PER_SEC,
+ "This implementation assumes that `clock` is in nanoseconds"
+);
+
+// Snapshot of the monotonic clock at the start of the program.
+static __wasi_timestamp_t start;
+
+// Use a priority of 10 to run fairly early in the implementation-reserved
+// constructor priority range.
+__attribute__((constructor(10)))
+static void init(void) {
+ (void)__wasi_clock_time_get(__WASI_CLOCKID_MONOTONIC, 0, &start);
+}
+
+// Define the libc symbol as `__clock` so that we can reliably call it
+// from elsewhere in libc.
+clock_t __clock(void) {
+ // Use `MONOTONIC` instead of `PROCESS_CPUTIME_ID` since WASI doesn't have
+ // an inherent concept of a process. Note that this means we'll incorrectly
+ // include time from other processes, so this function is only declared by
+ // the headers if `_WASI_EMULATED_PROCESS_CLOCKS` is defined.
+ __wasi_timestamp_t now = 0;
+ (void)__wasi_clock_time_get(__WASI_CLOCKID_MONOTONIC, 0, &now);
+ return now - start;
+}
+
+// Define a user-visible alias as a weak symbol.
+__attribute__((__weak__, __alias__("__clock")))
+clock_t clock(void);
diff --git a/libc-bottom-half/clocks/getrusage.c b/libc-bottom-half/clocks/getrusage.c
new file mode 100644
index 0000000..d0113c5
--- /dev/null
+++ b/libc-bottom-half/clocks/getrusage.c
@@ -0,0 +1,28 @@
+#define _WASI_EMULATED_PROCESS_CLOCKS
+#include <sys/resource.h>
+#include <errno.h>
+#include <time.h>
+#include <wasi/api.h>
+#include <common/time.h>
+
+// `clock` is a weak symbol so that application code can override it.
+// We want to use the function in libc, so use the libc-internal name.
+clock_t __clock(void);
+
+int getrusage(int who, struct rusage *r_usage) {
+ switch (who) {
+ case RUSAGE_SELF: {
+ __wasi_timestamp_t usertime = __clock();
+ *r_usage = (struct rusage) {
+ .ru_utime = timestamp_to_timeval(usertime)
+ };
+ return 0;
+ }
+ case RUSAGE_CHILDREN:
+ *r_usage = (struct rusage) {};
+ return 0;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+}
diff --git a/libc-bottom-half/clocks/times.c b/libc-bottom-half/clocks/times.c
new file mode 100644
index 0000000..e245569
--- /dev/null
+++ b/libc-bottom-half/clocks/times.c
@@ -0,0 +1,26 @@
+#define _WASI_EMULATED_PROCESS_CLOCKS
+#include <time.h>
+#include <sys/times.h>
+#include <wasi/api.h>
+#include <common/time.h>
+
+_Static_assert(
+ CLOCKS_PER_SEC == NSEC_PER_SEC,
+ "This implementation assumes that `clock` is in nanoseconds"
+);
+
+// `clock` is a weak symbol so that application code can override it.
+// We want to use the function in libc, so use the libc-internal name.
+clock_t __clock(void);
+
+clock_t times(struct tms *buffer) {
+ __wasi_timestamp_t user = __clock();
+ *buffer = (struct tms){
+ .tms_utime = user,
+ .tms_cutime = user
+ };
+
+ __wasi_timestamp_t realtime = 0;
+ (void)__wasi_clock_time_get(__WASI_CLOCKID_MONOTONIC, 0, &realtime);
+ return realtime;
+}
diff --git a/libc-bottom-half/cloudlibc/LICENSE b/libc-bottom-half/cloudlibc/LICENSE
new file mode 100644
index 0000000..dd33b05
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2015-2017 Nuxi (https://nuxi.nl/) and contributors.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
diff --git a/libc-bottom-half/cloudlibc/src/common/clock.h b/libc-bottom-half/cloudlibc/src/common/clock.h
new file mode 100644
index 0000000..58d40a1
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/common/clock.h
@@ -0,0 +1,19 @@
+// Copyright (c) 2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#ifndef COMMON_CLOCK_H
+#define COMMON_CLOCK_H
+
+#include <wasi/api.h>
+
+// In this implementation we define clockid_t as a pointer type, so that
+// we can implement them as full objects. Right now we only use those
+// objects to store the raw ABI-level clock identifier, but in the
+// future we can use this to provide support for pthread_getcpuclockid()
+// and clock file descriptors.
+struct __clockid {
+ __wasi_clockid_t id;
+};
+
+#endif
diff --git a/libc-bottom-half/cloudlibc/src/common/limits.h b/libc-bottom-half/cloudlibc/src/common/limits.h
new file mode 100644
index 0000000..67e2f07
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/common/limits.h
@@ -0,0 +1,35 @@
+// Copyright (c) 2015 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#ifndef COMMON_LIMITS_H
+#define COMMON_LIMITS_H
+
+#include <limits.h>
+
+#define NUMERIC_MIN(t) \
+ _Generic((t)0, char \
+ : CHAR_MIN, signed char \
+ : SCHAR_MIN, unsigned char : 0, short \
+ : SHRT_MIN, unsigned short : 0, int \
+ : INT_MIN, unsigned int : 0, long \
+ : LONG_MIN, unsigned long : 0, long long \
+ : LLONG_MIN, unsigned long long : 0, default \
+ : (void)0)
+
+#define NUMERIC_MAX(t) \
+ _Generic((t)0, char \
+ : CHAR_MAX, signed char \
+ : SCHAR_MAX, unsigned char \
+ : UCHAR_MAX, short \
+ : SHRT_MAX, unsigned short \
+ : USHRT_MAX, int \
+ : INT_MAX, unsigned int \
+ : UINT_MAX, long \
+ : LONG_MAX, unsigned long \
+ : ULONG_MAX, long long \
+ : LLONG_MAX, unsigned long long \
+ : ULLONG_MAX, default \
+ : (void)0)
+
+#endif
diff --git a/libc-bottom-half/cloudlibc/src/common/time.h b/libc-bottom-half/cloudlibc/src/common/time.h
new file mode 100644
index 0000000..08e2852
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/common/time.h
@@ -0,0 +1,63 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#ifndef COMMON_TIME_H
+#define COMMON_TIME_H
+
+#include <common/limits.h>
+
+#include <sys/time.h>
+
+#include <wasi/api.h>
+#include <stdbool.h>
+#include <time.h>
+
+#define NSEC_PER_SEC 1000000000
+
+static inline bool timespec_to_timestamp_exact(
+ const struct timespec *timespec, __wasi_timestamp_t *timestamp) {
+ // Invalid nanoseconds field.
+ if (timespec->tv_nsec < 0 || timespec->tv_nsec >= NSEC_PER_SEC)
+ return false;
+
+ // Timestamps before the Epoch are not supported.
+ if (timespec->tv_sec < 0)
+ return false;
+
+ // Make sure our timestamp does not overflow.
+ return !__builtin_mul_overflow(timespec->tv_sec, NSEC_PER_SEC, timestamp) &&
+ !__builtin_add_overflow(*timestamp, timespec->tv_nsec, timestamp);
+}
+
+static inline bool timespec_to_timestamp_clamp(
+ const struct timespec *timespec, __wasi_timestamp_t *timestamp) {
+ // Invalid nanoseconds field.
+ if (timespec->tv_nsec < 0 || timespec->tv_nsec >= NSEC_PER_SEC)
+ return false;
+
+ if (timespec->tv_sec < 0) {
+ // Timestamps before the Epoch are not supported.
+ *timestamp = 0;
+ } else if (__builtin_mul_overflow(timespec->tv_sec, NSEC_PER_SEC, timestamp) ||
+ __builtin_add_overflow(*timestamp, timespec->tv_nsec, timestamp)) {
+ // Make sure our timestamp does not overflow.
+ *timestamp = NUMERIC_MAX(__wasi_timestamp_t);
+ }
+ return true;
+}
+
+static inline struct timespec timestamp_to_timespec(
+ __wasi_timestamp_t timestamp) {
+ // Decompose timestamp into seconds and nanoseconds.
+ return (struct timespec){.tv_sec = timestamp / NSEC_PER_SEC,
+ .tv_nsec = timestamp % NSEC_PER_SEC};
+}
+
+static inline struct timeval timestamp_to_timeval(
+ __wasi_timestamp_t timestamp) {
+ struct timespec ts = timestamp_to_timespec(timestamp);
+ return (struct timeval){.tv_sec = ts.tv_sec, ts.tv_nsec / 1000};
+}
+
+#endif
diff --git a/libc-bottom-half/cloudlibc/src/include/_/cdefs.h b/libc-bottom-half/cloudlibc/src/include/_/cdefs.h
new file mode 100644
index 0000000..d9a6f54
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/include/_/cdefs.h
@@ -0,0 +1,36 @@
+// Copyright (c) 2015-2017 Nuxi, https://nuxi.nl/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+
+#ifndef ___CDEFS_H_
+#define ___CDEFS_H_
+
+// Compiler-independent annotations.
+
+#define __strong_reference(oldsym, newsym) \
+ extern __typeof__(oldsym) newsym __attribute__((__alias__(#oldsym)))
+
+// Convenience macros.
+
+#define __arraycount(x) (sizeof(x) / sizeof((x)[0]))
+
+#endif
diff --git a/libc-bottom-half/cloudlibc/src/libc/dirent/closedir.c b/libc-bottom-half/cloudlibc/src/libc/dirent/closedir.c
new file mode 100644
index 0000000..3585737
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/dirent/closedir.c
@@ -0,0 +1,10 @@
+// Copyright (c) 2015 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <dirent.h>
+#include <unistd.h>
+
+int closedir(DIR *dirp) {
+ return close(fdclosedir(dirp));
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/dirent/dirent_impl.h b/libc-bottom-half/cloudlibc/src/libc/dirent/dirent_impl.h
new file mode 100644
index 0000000..642400a
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/dirent/dirent_impl.h
@@ -0,0 +1,31 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#ifndef DIRENT_DIRENT_IMPL_H
+#define DIRENT_DIRENT_IMPL_H
+
+#include <wasi/api.h>
+#include <stddef.h>
+
+struct dirent;
+
+#define DIRENT_DEFAULT_BUFFER_SIZE 4096
+
+struct _DIR {
+ // Directory file descriptor and cookie.
+ int fd;
+ __wasi_dircookie_t cookie;
+
+ // Read buffer.
+ char *buffer;
+ size_t buffer_processed;
+ size_t buffer_size;
+ size_t buffer_used;
+
+ // Object returned by readdir().
+ struct dirent *dirent;
+ size_t dirent_size;
+};
+
+#endif
diff --git a/libc-bottom-half/cloudlibc/src/libc/dirent/dirfd.c b/libc-bottom-half/cloudlibc/src/libc/dirent/dirfd.c
new file mode 100644
index 0000000..033157a
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/dirent/dirfd.c
@@ -0,0 +1,11 @@
+// Copyright (c) 2015 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <dirent.h>
+
+#include "dirent_impl.h"
+
+int dirfd(DIR *dirp) {
+ return dirp->fd;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/dirent/fdclosedir.c b/libc-bottom-half/cloudlibc/src/libc/dirent/fdclosedir.c
new file mode 100644
index 0000000..cabe702
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/dirent/fdclosedir.c
@@ -0,0 +1,16 @@
+// Copyright (c) 2015 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <dirent.h>
+#include <stdlib.h>
+
+#include "dirent_impl.h"
+
+int fdclosedir(DIR *dirp) {
+ int fd = dirp->fd;
+ free(dirp->buffer);
+ free(dirp->dirent);
+ free(dirp);
+ return fd;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/dirent/fdopendir.c b/libc-bottom-half/cloudlibc/src/libc/dirent/fdopendir.c
new file mode 100644
index 0000000..4a2136a
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/dirent/fdopendir.c
@@ -0,0 +1,44 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <dirent.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include "dirent_impl.h"
+
+DIR *fdopendir(int fd) {
+ // Allocate new directory object and read buffer.
+ DIR *dirp = malloc(sizeof(*dirp));
+ if (dirp == NULL)
+ return NULL;
+ dirp->buffer = malloc(DIRENT_DEFAULT_BUFFER_SIZE);
+ if (dirp->buffer == NULL) {
+ free(dirp);
+ return NULL;
+ }
+
+ // Ensure that this is really a directory by already loading the first
+ // chunk of data.
+ __wasi_errno_t error =
+ // TODO: Remove the cast on `dirp->buffer` once the witx is updated with char8 support.
+ __wasi_fd_readdir(fd, (uint8_t *)dirp->buffer, DIRENT_DEFAULT_BUFFER_SIZE,
+ __WASI_DIRCOOKIE_START, &dirp->buffer_used);
+ if (error != 0) {
+ free(dirp->buffer);
+ free(dirp);
+ errno = error;
+ return NULL;
+ }
+
+ // Initialize other members.
+ dirp->fd = fd;
+ dirp->cookie = __WASI_DIRCOOKIE_START;
+ dirp->buffer_processed = 0;
+ dirp->buffer_size = DIRENT_DEFAULT_BUFFER_SIZE;
+ dirp->dirent = NULL;
+ dirp->dirent_size = 1;
+ return dirp;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/dirent/opendirat.c b/libc-bottom-half/cloudlibc/src/libc/dirent/opendirat.c
new file mode 100644
index 0000000..e6d1c2a
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/dirent/opendirat.c
@@ -0,0 +1,23 @@
+// Copyright (c) 2015 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/libc.h>
+#include <wasi/libc-nocwd.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <unistd.h>
+
+DIR *__wasilibc_nocwd_opendirat(int dir, const char *dirname) {
+ // Open directory.
+ int fd = __wasilibc_nocwd_openat_nomode(dir, dirname, O_RDONLY | O_NONBLOCK | O_DIRECTORY);
+ if (fd == -1)
+ return NULL;
+
+ // Create directory handle.
+ DIR *result = fdopendir(fd);
+ if (result == NULL)
+ close(fd);
+ return result;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/dirent/readdir.c b/libc-bottom-half/cloudlibc/src/libc/dirent/readdir.c
new file mode 100644
index 0000000..bfd1921
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/dirent/readdir.c
@@ -0,0 +1,132 @@
+// Copyright (c) 2015-2017 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include <assert.h>
+#include <wasi/api.h>
+#include <dirent.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "dirent_impl.h"
+
+static_assert(DT_BLK == __WASI_FILETYPE_BLOCK_DEVICE, "Value mismatch");
+static_assert(DT_CHR == __WASI_FILETYPE_CHARACTER_DEVICE, "Value mismatch");
+static_assert(DT_DIR == __WASI_FILETYPE_DIRECTORY, "Value mismatch");
+static_assert(DT_FIFO == __WASI_FILETYPE_SOCKET_STREAM, "Value mismatch");
+static_assert(DT_LNK == __WASI_FILETYPE_SYMBOLIC_LINK, "Value mismatch");
+static_assert(DT_REG == __WASI_FILETYPE_REGULAR_FILE, "Value mismatch");
+static_assert(DT_UNKNOWN == __WASI_FILETYPE_UNKNOWN, "Value mismatch");
+
+// Grows a buffer to be large enough to hold a certain amount of data.
+#define GROW(buffer, buffer_size, target_size) \
+ do { \
+ if ((buffer_size) < (target_size)) { \
+ size_t new_size = (buffer_size); \
+ while (new_size < (target_size)) \
+ new_size *= 2; \
+ void *new_buffer = realloc(buffer, new_size); \
+ if (new_buffer == NULL) \
+ return NULL; \
+ (buffer) = new_buffer; \
+ (buffer_size) = new_size; \
+ } \
+ } while (0)
+
+struct dirent *readdir(DIR *dirp) {
+ for (;;) {
+ // Extract the next dirent header.
+ size_t buffer_left = dirp->buffer_used - dirp->buffer_processed;
+ if (buffer_left < sizeof(__wasi_dirent_t)) {
+ // End-of-file.
+ if (dirp->buffer_used < dirp->buffer_size)
+ return NULL;
+ goto read_entries;
+ }
+ __wasi_dirent_t entry;
+ memcpy(&entry, dirp->buffer + dirp->buffer_processed, sizeof(entry));
+
+ size_t entry_size = sizeof(__wasi_dirent_t) + entry.d_namlen;
+ if (entry.d_namlen == 0) {
+ // Invalid pathname length. Skip the entry.
+ dirp->buffer_processed += entry_size;
+ continue;
+ }
+
+ // The entire entry must be present in buffer space. If not, read
+ // the entry another time. Ensure that the read buffer is large
+ // enough to fit at least this single entry.
+ if (buffer_left < entry_size) {
+ GROW(dirp->buffer, dirp->buffer_size, entry_size);
+ goto read_entries;
+ }
+
+ // Skip entries having null bytes in the filename.
+ const char *name = dirp->buffer + dirp->buffer_processed + sizeof(entry);
+ if (memchr(name, '\0', entry.d_namlen) != NULL) {
+ dirp->buffer_processed += entry_size;
+ continue;
+ }
+
+ // Return the next directory entry. Ensure that the dirent is large
+ // enough to fit the filename.
+ GROW(dirp->dirent, dirp->dirent_size,
+ offsetof(struct dirent, d_name) + entry.d_namlen + 1);
+ struct dirent *dirent = dirp->dirent;
+ dirent->d_type = entry.d_type;
+ memcpy(dirent->d_name, name, entry.d_namlen);
+ dirent->d_name[entry.d_namlen] = '\0';
+
+ // `fd_readdir` implementations may set the inode field to zero if the
+ // the inode number is unknown. In that case, do an `fstatat` to get the
+ // inode number.
+ off_t d_ino = entry.d_ino;
+ unsigned char d_type = entry.d_type;
+ if (d_ino == 0 && strcmp(dirent->d_name, "..") != 0) {
+ struct stat statbuf;
+ if (fstatat(dirp->fd, dirent->d_name, &statbuf, AT_SYMLINK_NOFOLLOW) != 0) {
+ if (errno == ENOENT) {
+ // The file disappeared before we could read it, so skip it.
+ dirp->buffer_processed += entry_size;
+ continue;
+ }
+ return NULL;
+ }
+
+ // Fill in the inode.
+ d_ino = statbuf.st_ino;
+
+ // In case someone raced with us and replaced the object with this name
+ // with another of a different type, update the type too.
+ d_type = __wasilibc_iftodt(statbuf.st_mode & S_IFMT);
+ }
+ dirent->d_ino = d_ino;
+ dirent->d_type = d_type;
+
+ dirp->cookie = entry.d_next;
+ dirp->buffer_processed += entry_size;
+ return dirent;
+
+ read_entries:
+ // Discard data currently stored in the input buffer.
+ dirp->buffer_used = dirp->buffer_processed = dirp->buffer_size;
+
+ // Load more directory entries and continue.
+ __wasi_errno_t error =
+ // TODO: Remove the cast on `dirp->buffer` once the witx is updated with char8 support.
+ __wasi_fd_readdir(dirp->fd, (uint8_t *)dirp->buffer, dirp->buffer_size,
+ dirp->cookie, &dirp->buffer_used);
+ if (error != 0) {
+ errno = error;
+ return NULL;
+ }
+ dirp->buffer_processed = 0;
+ }
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/dirent/rewinddir.c b/libc-bottom-half/cloudlibc/src/libc/dirent/rewinddir.c
new file mode 100644
index 0000000..8dd5882
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/dirent/rewinddir.c
@@ -0,0 +1,15 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <dirent.h>
+
+#include "dirent_impl.h"
+
+void rewinddir(DIR *dirp) {
+ // Update cookie.
+ dirp->cookie = __WASI_DIRCOOKIE_START;
+ // Mark entire buffer as processed to force a read of new data.
+ dirp->buffer_used = dirp->buffer_processed = dirp->buffer_size;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/dirent/scandirat.c b/libc-bottom-half/cloudlibc/src/libc/dirent/scandirat.c
new file mode 100644
index 0000000..079b3b3
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/dirent/scandirat.c
@@ -0,0 +1,168 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <wasi/libc.h>
+#include <wasi/libc-nocwd.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+#include "dirent_impl.h"
+
+static int sel_true(const struct dirent *de) {
+ return 1;
+}
+
+int __wasilibc_nocwd_scandirat(int dirfd, const char *dir, struct dirent ***namelist,
+ int (*sel)(const struct dirent *),
+ int (*compar)(const struct dirent **, const struct dirent **)) {
+ struct stat statbuf;
+
+ // Match all files if no select function is provided.
+ if (sel == NULL)
+ sel = sel_true;
+
+ // Open the directory.
+ int fd = __wasilibc_nocwd_openat_nomode(dirfd, dir, O_RDONLY | O_NONBLOCK | O_DIRECTORY);
+ if (fd == -1)
+ return -1;
+
+ // Allocate a read buffer for the directory entries.
+ size_t buffer_size = DIRENT_DEFAULT_BUFFER_SIZE;
+ char *buffer = malloc(buffer_size);
+ if (buffer == NULL) {
+ close(fd);
+ return -1;
+ }
+ size_t buffer_processed = buffer_size;
+ size_t buffer_used = buffer_size;
+
+ // Space for the array to return to the caller.
+ struct dirent **dirents = NULL;
+ size_t dirents_size = 0;
+ size_t dirents_used = 0;
+
+ __wasi_dircookie_t cookie = __WASI_DIRCOOKIE_START;
+ for (;;) {
+ // Extract the next dirent header.
+ size_t buffer_left = buffer_used - buffer_processed;
+ if (buffer_left < sizeof(__wasi_dirent_t)) {
+ // End-of-file.
+ if (buffer_used < buffer_size)
+ break;
+ goto read_entries;
+ }
+ __wasi_dirent_t entry;
+ memcpy(&entry, buffer + buffer_processed, sizeof(entry));
+
+ size_t entry_size = sizeof(__wasi_dirent_t) + entry.d_namlen;
+ if (entry.d_namlen == 0) {
+ // Invalid pathname length. Skip the entry.
+ buffer_processed += entry_size;
+ continue;
+ }
+
+ // The entire entry must be present in buffer space. If not, read
+ // the entry another time. Ensure that the read buffer is large
+ // enough to fit at least this single entry.
+ if (buffer_left < entry_size) {
+ while (buffer_size < entry_size)
+ buffer_size *= 2;
+ char *new_buffer = realloc(buffer, buffer_size);
+ if (new_buffer == NULL)
+ goto bad;
+ buffer = new_buffer;
+ goto read_entries;
+ }
+
+ // Skip entries having null bytes in the filename.
+ const char *name = buffer + buffer_processed + sizeof(entry);
+ buffer_processed += entry_size;
+ if (memchr(name, '\0', entry.d_namlen) != NULL)
+ continue;
+
+ // Create the new directory entry.
+ struct dirent *dirent =
+ malloc(offsetof(struct dirent, d_name) + entry.d_namlen + 1);
+ if (dirent == NULL)
+ goto bad;
+ dirent->d_type = entry.d_type;
+ memcpy(dirent->d_name, name, entry.d_namlen);
+ dirent->d_name[entry.d_namlen] = '\0';
+
+ // `fd_readdir` implementations may set the inode field to zero if the
+ // the inode number is unknown. In that case, do an `fstatat` to get the
+ // inode number.
+ off_t d_ino = entry.d_ino;
+ unsigned char d_type = entry.d_type;
+ if (d_ino == 0) {
+ if (fstatat(fd, dirent->d_name, &statbuf, AT_SYMLINK_NOFOLLOW) != 0) {
+ return -1;
+ }
+
+ // Fill in the inode.
+ d_ino = statbuf.st_ino;
+
+ // In case someone raced with us and replaced the object with this name
+ // with another of a different type, update the type too.
+ d_type = __wasilibc_iftodt(statbuf.st_mode & S_IFMT);
+ }
+ dirent->d_ino = d_ino;
+ dirent->d_type = d_type;
+
+ cookie = entry.d_next;
+
+ if (sel(dirent)) {
+ // Add the entry to the results.
+ if (dirents_used == dirents_size) {
+ dirents_size = dirents_size < 8 ? 8 : dirents_size * 2;
+ struct dirent **new_dirents =
+ realloc(dirents, dirents_size * sizeof(*dirents));
+ if (new_dirents == NULL) {
+ free(dirent);
+ goto bad;
+ }
+ dirents = new_dirents;
+ }
+ dirents[dirents_used++] = dirent;
+ } else {
+ // Discard the entry.
+ free(dirent);
+ }
+ continue;
+
+ read_entries:;
+ // Load more directory entries and continue.
+ // TODO: Remove the cast on `buffer` once the witx is updated with char8 support.
+ __wasi_errno_t error = __wasi_fd_readdir(fd, (uint8_t *)buffer, buffer_size,
+ cookie, &buffer_used);
+ if (error != 0) {
+ errno = error;
+ goto bad;
+ }
+ buffer_processed = 0;
+ }
+
+ // Sort results and return them.
+ free(buffer);
+ close(fd);
+ (qsort)(dirents, dirents_used, sizeof(*dirents),
+ (int (*)(const void *, const void *))compar);
+ *namelist = dirents;
+ return dirents_used;
+
+bad:
+ // Deallocate partially created results.
+ for (size_t i = 0; i < dirents_used; ++i)
+ free(dirents[i]);
+ free(dirents);
+ free(buffer);
+ close(fd);
+ return -1;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/dirent/seekdir.c b/libc-bottom-half/cloudlibc/src/libc/dirent/seekdir.c
new file mode 100644
index 0000000..a865d92
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/dirent/seekdir.c
@@ -0,0 +1,15 @@
+// Copyright (c) 2015 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <dirent.h>
+
+#include "dirent_impl.h"
+
+void seekdir(DIR *dirp, long loc) {
+ // Update cookie.
+ dirp->cookie = (unsigned long)loc;
+ // Mark entire buffer as processed to force a read of new data.
+ // TODO(ed): We could prevent a read if the offset is in the buffer.
+ dirp->buffer_used = dirp->buffer_processed = dirp->buffer_size;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/dirent/telldir.c b/libc-bottom-half/cloudlibc/src/libc/dirent/telldir.c
new file mode 100644
index 0000000..05687ee
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/dirent/telldir.c
@@ -0,0 +1,11 @@
+// Copyright (c) 2015 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <dirent.h>
+
+#include "dirent_impl.h"
+
+long telldir(DIR *dirp) {
+ return dirp->cookie;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/errno/errno.c b/libc-bottom-half/cloudlibc/src/libc/errno/errno.c
new file mode 100644
index 0000000..d7a27f3
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/errno/errno.c
@@ -0,0 +1,87 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <assert.h>
+#include <wasi/api.h>
+#include <errno.h>
+#include <threads.h>
+
+static_assert(E2BIG == __WASI_ERRNO_2BIG, "Value mismatch");
+static_assert(EACCES == __WASI_ERRNO_ACCES, "Value mismatch");
+static_assert(EADDRINUSE == __WASI_ERRNO_ADDRINUSE, "Value mismatch");
+static_assert(EADDRNOTAVAIL == __WASI_ERRNO_ADDRNOTAVAIL, "Value mismatch");
+static_assert(EAFNOSUPPORT == __WASI_ERRNO_AFNOSUPPORT, "Value mismatch");
+static_assert(EAGAIN == __WASI_ERRNO_AGAIN, "Value mismatch");
+static_assert(EALREADY == __WASI_ERRNO_ALREADY, "Value mismatch");
+static_assert(EBADF == __WASI_ERRNO_BADF, "Value mismatch");
+static_assert(EBADMSG == __WASI_ERRNO_BADMSG, "Value mismatch");
+static_assert(EBUSY == __WASI_ERRNO_BUSY, "Value mismatch");
+static_assert(ECANCELED == __WASI_ERRNO_CANCELED, "Value mismatch");
+static_assert(ECHILD == __WASI_ERRNO_CHILD, "Value mismatch");
+static_assert(ECONNABORTED == __WASI_ERRNO_CONNABORTED, "Value mismatch");
+static_assert(ECONNREFUSED == __WASI_ERRNO_CONNREFUSED, "Value mismatch");
+static_assert(ECONNRESET == __WASI_ERRNO_CONNRESET, "Value mismatch");
+static_assert(EDEADLK == __WASI_ERRNO_DEADLK, "Value mismatch");
+static_assert(EDESTADDRREQ == __WASI_ERRNO_DESTADDRREQ, "Value mismatch");
+static_assert(EDOM == __WASI_ERRNO_DOM, "Value mismatch");
+static_assert(EDQUOT == __WASI_ERRNO_DQUOT, "Value mismatch");
+static_assert(EEXIST == __WASI_ERRNO_EXIST, "Value mismatch");
+static_assert(EFAULT == __WASI_ERRNO_FAULT, "Value mismatch");
+static_assert(EFBIG == __WASI_ERRNO_FBIG, "Value mismatch");
+static_assert(EHOSTUNREACH == __WASI_ERRNO_HOSTUNREACH, "Value mismatch");
+static_assert(EIDRM == __WASI_ERRNO_IDRM, "Value mismatch");
+static_assert(EILSEQ == __WASI_ERRNO_ILSEQ, "Value mismatch");
+static_assert(EINPROGRESS == __WASI_ERRNO_INPROGRESS, "Value mismatch");
+static_assert(EINTR == __WASI_ERRNO_INTR, "Value mismatch");
+static_assert(EINVAL == __WASI_ERRNO_INVAL, "Value mismatch");
+static_assert(EIO == __WASI_ERRNO_IO, "Value mismatch");
+static_assert(EISCONN == __WASI_ERRNO_ISCONN, "Value mismatch");
+static_assert(EISDIR == __WASI_ERRNO_ISDIR, "Value mismatch");
+static_assert(ELOOP == __WASI_ERRNO_LOOP, "Value mismatch");
+static_assert(EMFILE == __WASI_ERRNO_MFILE, "Value mismatch");
+static_assert(EMLINK == __WASI_ERRNO_MLINK, "Value mismatch");
+static_assert(EMSGSIZE == __WASI_ERRNO_MSGSIZE, "Value mismatch");
+static_assert(EMULTIHOP == __WASI_ERRNO_MULTIHOP, "Value mismatch");
+static_assert(ENAMETOOLONG == __WASI_ERRNO_NAMETOOLONG, "Value mismatch");
+static_assert(ENETDOWN == __WASI_ERRNO_NETDOWN, "Value mismatch");
+static_assert(ENETRESET == __WASI_ERRNO_NETRESET, "Value mismatch");
+static_assert(ENETUNREACH == __WASI_ERRNO_NETUNREACH, "Value mismatch");
+static_assert(ENFILE == __WASI_ERRNO_NFILE, "Value mismatch");
+static_assert(ENOBUFS == __WASI_ERRNO_NOBUFS, "Value mismatch");
+static_assert(ENODEV == __WASI_ERRNO_NODEV, "Value mismatch");
+static_assert(ENOENT == __WASI_ERRNO_NOENT, "Value mismatch");
+static_assert(ENOEXEC == __WASI_ERRNO_NOEXEC, "Value mismatch");
+static_assert(ENOLCK == __WASI_ERRNO_NOLCK, "Value mismatch");
+static_assert(ENOLINK == __WASI_ERRNO_NOLINK, "Value mismatch");
+static_assert(ENOMEM == __WASI_ERRNO_NOMEM, "Value mismatch");
+static_assert(ENOMSG == __WASI_ERRNO_NOMSG, "Value mismatch");
+static_assert(ENOPROTOOPT == __WASI_ERRNO_NOPROTOOPT, "Value mismatch");
+static_assert(ENOSPC == __WASI_ERRNO_NOSPC, "Value mismatch");
+static_assert(ENOSYS == __WASI_ERRNO_NOSYS, "Value mismatch");
+static_assert(ENOTCAPABLE == __WASI_ERRNO_NOTCAPABLE, "Value mismatch");
+static_assert(ENOTCONN == __WASI_ERRNO_NOTCONN, "Value mismatch");
+static_assert(ENOTDIR == __WASI_ERRNO_NOTDIR, "Value mismatch");
+static_assert(ENOTEMPTY == __WASI_ERRNO_NOTEMPTY, "Value mismatch");
+static_assert(ENOTRECOVERABLE == __WASI_ERRNO_NOTRECOVERABLE, "Value mismatch");
+static_assert(ENOTSOCK == __WASI_ERRNO_NOTSOCK, "Value mismatch");
+static_assert(ENOTSUP == __WASI_ERRNO_NOTSUP, "Value mismatch");
+static_assert(ENOTTY == __WASI_ERRNO_NOTTY, "Value mismatch");
+static_assert(ENXIO == __WASI_ERRNO_NXIO, "Value mismatch");
+static_assert(EOVERFLOW == __WASI_ERRNO_OVERFLOW, "Value mismatch");
+static_assert(EOWNERDEAD == __WASI_ERRNO_OWNERDEAD, "Value mismatch");
+static_assert(EPERM == __WASI_ERRNO_PERM, "Value mismatch");
+static_assert(EPIPE == __WASI_ERRNO_PIPE, "Value mismatch");
+static_assert(EPROTO == __WASI_ERRNO_PROTO, "Value mismatch");
+static_assert(EPROTONOSUPPORT == __WASI_ERRNO_PROTONOSUPPORT, "Value mismatch");
+static_assert(EPROTOTYPE == __WASI_ERRNO_PROTOTYPE, "Value mismatch");
+static_assert(ERANGE == __WASI_ERRNO_RANGE, "Value mismatch");
+static_assert(EROFS == __WASI_ERRNO_ROFS, "Value mismatch");
+static_assert(ESPIPE == __WASI_ERRNO_SPIPE, "Value mismatch");
+static_assert(ESRCH == __WASI_ERRNO_SRCH, "Value mismatch");
+static_assert(ESTALE == __WASI_ERRNO_STALE, "Value mismatch");
+static_assert(ETIMEDOUT == __WASI_ERRNO_TIMEDOUT, "Value mismatch");
+static_assert(ETXTBSY == __WASI_ERRNO_TXTBSY, "Value mismatch");
+static_assert(EXDEV == __WASI_ERRNO_XDEV, "Value mismatch");
+
+thread_local int errno = 0;
diff --git a/libc-bottom-half/cloudlibc/src/libc/fcntl/fcntl.c b/libc-bottom-half/cloudlibc/src/libc/fcntl/fcntl.c
new file mode 100644
index 0000000..5d4055d
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/fcntl/fcntl.c
@@ -0,0 +1,62 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdarg.h>
+
+int fcntl(int fildes, int cmd, ...) {
+ switch (cmd) {
+ case F_GETFD:
+ // Act as if the close-on-exec flag is always set.
+ return FD_CLOEXEC;
+ case F_SETFD:
+ // The close-on-exec flag is ignored.
+ return 0;
+ case F_GETFL: {
+ // Obtain the flags and the rights of the descriptor.
+ __wasi_fdstat_t fds;
+ __wasi_errno_t error = __wasi_fd_fdstat_get(fildes, &fds);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+
+ // Roughly approximate the access mode by converting the rights.
+ int oflags = fds.fs_flags;
+ if ((fds.fs_rights_base &
+ (__WASI_RIGHTS_FD_READ | __WASI_RIGHTS_FD_READDIR)) != 0) {
+ if ((fds.fs_rights_base & __WASI_RIGHTS_FD_WRITE) != 0)
+ oflags |= O_RDWR;
+ else
+ oflags |= O_RDONLY;
+ } else if ((fds.fs_rights_base & __WASI_RIGHTS_FD_WRITE) != 0) {
+ oflags |= O_WRONLY;
+ } else {
+ oflags |= O_SEARCH;
+ }
+ return oflags;
+ }
+ case F_SETFL: {
+ // Set new file descriptor flags.
+ va_list ap;
+ va_start(ap, cmd);
+ int flags = va_arg(ap, int);
+ va_end(ap);
+
+ __wasi_fdflags_t fs_flags = flags & 0xfff;
+ __wasi_errno_t error =
+ __wasi_fd_fdstat_set_flags(fildes, fs_flags);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+ }
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/fcntl/openat.c b/libc-bottom-half/cloudlibc/src/libc/fcntl/openat.c
new file mode 100644
index 0000000..09cbbf8
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/fcntl/openat.c
@@ -0,0 +1,80 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <assert.h>
+#include <wasi/api.h>
+#include <wasi/libc.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+
+static_assert(O_APPEND == __WASI_FDFLAGS_APPEND, "Value mismatch");
+static_assert(O_DSYNC == __WASI_FDFLAGS_DSYNC, "Value mismatch");
+static_assert(O_NONBLOCK == __WASI_FDFLAGS_NONBLOCK, "Value mismatch");
+static_assert(O_RSYNC == __WASI_FDFLAGS_RSYNC, "Value mismatch");
+static_assert(O_SYNC == __WASI_FDFLAGS_SYNC, "Value mismatch");
+
+static_assert(O_CREAT >> 12 == __WASI_OFLAGS_CREAT, "Value mismatch");
+static_assert(O_DIRECTORY >> 12 == __WASI_OFLAGS_DIRECTORY, "Value mismatch");
+static_assert(O_EXCL >> 12 == __WASI_OFLAGS_EXCL, "Value mismatch");
+static_assert(O_TRUNC >> 12 == __WASI_OFLAGS_TRUNC, "Value mismatch");
+
+int __wasilibc_nocwd_openat_nomode(int fd, const char *path, int oflag) {
+ // Compute rights corresponding with the access modes provided.
+ // Attempt to obtain all rights, except the ones that contradict the
+ // access mode provided to openat().
+ __wasi_rights_t max =
+ ~(__WASI_RIGHTS_FD_DATASYNC | __WASI_RIGHTS_FD_READ |
+ __WASI_RIGHTS_FD_WRITE | __WASI_RIGHTS_FD_ALLOCATE |
+ __WASI_RIGHTS_FD_READDIR | __WASI_RIGHTS_FD_FILESTAT_SET_SIZE);
+ switch (oflag & O_ACCMODE) {
+ case O_RDONLY:
+ case O_RDWR:
+ case O_WRONLY:
+ if ((oflag & O_RDONLY) != 0) {
+ max |= __WASI_RIGHTS_FD_READ | __WASI_RIGHTS_FD_READDIR;
+ }
+ if ((oflag & O_WRONLY) != 0) {
+ max |= __WASI_RIGHTS_FD_DATASYNC | __WASI_RIGHTS_FD_WRITE |
+ __WASI_RIGHTS_FD_ALLOCATE |
+ __WASI_RIGHTS_FD_FILESTAT_SET_SIZE;
+ }
+ break;
+ case O_EXEC:
+ break;
+ case O_SEARCH:
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ // Ensure that we can actually obtain the minimal rights needed.
+ __wasi_fdstat_t fsb_cur;
+ __wasi_errno_t error = __wasi_fd_fdstat_get(fd, &fsb_cur);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+
+ // Path lookup properties.
+ __wasi_lookupflags_t lookup_flags = 0;
+ if ((oflag & O_NOFOLLOW) == 0)
+ lookup_flags |= __WASI_LOOKUPFLAGS_SYMLINK_FOLLOW;
+
+ // Open file with appropriate rights.
+ __wasi_fdflags_t fs_flags = oflag & 0xfff;
+ __wasi_rights_t fs_rights_base = max & fsb_cur.fs_rights_inheriting;
+ __wasi_rights_t fs_rights_inheriting = fsb_cur.fs_rights_inheriting;
+ __wasi_fd_t newfd;
+ error = __wasi_path_open(fd, lookup_flags, path,
+ (oflag >> 12) & 0xfff,
+ fs_rights_base, fs_rights_inheriting, fs_flags,
+ &newfd);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return newfd;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/fcntl/posix_fadvise.c b/libc-bottom-half/cloudlibc/src/libc/fcntl/posix_fadvise.c
new file mode 100644
index 0000000..d683d39
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/fcntl/posix_fadvise.c
@@ -0,0 +1,24 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <assert.h>
+#include <wasi/api.h>
+#include <errno.h>
+#include <fcntl.h>
+
+static_assert(POSIX_FADV_DONTNEED == __WASI_ADVICE_DONTNEED,
+ "Value mismatch");
+static_assert(POSIX_FADV_NOREUSE == __WASI_ADVICE_NOREUSE, "Value mismatch");
+static_assert(POSIX_FADV_NORMAL == __WASI_ADVICE_NORMAL, "Value mismatch");
+static_assert(POSIX_FADV_RANDOM == __WASI_ADVICE_RANDOM, "Value mismatch");
+static_assert(POSIX_FADV_SEQUENTIAL == __WASI_ADVICE_SEQUENTIAL,
+ "Value mismatch");
+static_assert(POSIX_FADV_WILLNEED == __WASI_ADVICE_WILLNEED,
+ "Value mismatch");
+
+int posix_fadvise(int fd, off_t offset, off_t len, int advice) {
+ if (offset < 0 || len < 0)
+ return EINVAL;
+ return __wasi_fd_advise(fd, offset, len, advice);
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/fcntl/posix_fallocate.c b/libc-bottom-half/cloudlibc/src/libc/fcntl/posix_fallocate.c
new file mode 100644
index 0000000..4b41c4b
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/fcntl/posix_fallocate.c
@@ -0,0 +1,13 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <fcntl.h>
+
+int posix_fallocate(int fd, off_t offset, off_t len) {
+ if (offset < 0 || len < 0)
+ return EINVAL;
+ return __wasi_fd_allocate(fd, offset, len);
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/poll/poll.c b/libc-bottom-half/cloudlibc/src/libc/poll/poll.c
new file mode 100644
index 0000000..cde4e81
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/poll/poll.c
@@ -0,0 +1,129 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <poll.h>
+#include <stdbool.h>
+
+int poll(struct pollfd *fds, size_t nfds, int timeout) {
+ // Construct events for poll().
+ size_t maxevents = 2 * nfds + 1;
+ __wasi_subscription_t subscriptions[maxevents];
+ size_t nsubscriptions = 0;
+ for (size_t i = 0; i < nfds; ++i) {
+ struct pollfd *pollfd = &fds[i];
+ if (pollfd->fd < 0)
+ continue;
+ bool created_events = false;
+ if ((pollfd->events & POLLRDNORM) != 0) {
+ __wasi_subscription_t *subscription = &subscriptions[nsubscriptions++];
+ *subscription = (__wasi_subscription_t){
+ .userdata = (uintptr_t)pollfd,
+ .u.tag = __WASI_EVENTTYPE_FD_READ,
+ .u.u.fd_read.file_descriptor = pollfd->fd,
+ };
+ created_events = true;
+ }
+ if ((pollfd->events & POLLWRNORM) != 0) {
+ __wasi_subscription_t *subscription = &subscriptions[nsubscriptions++];
+ *subscription = (__wasi_subscription_t){
+ .userdata = (uintptr_t)pollfd,
+ .u.tag = __WASI_EVENTTYPE_FD_WRITE,
+ .u.u.fd_write.file_descriptor = pollfd->fd,
+ };
+ created_events = true;
+ }
+
+ // As entries are decomposed into separate read/write subscriptions,
+ // we cannot detect POLLERR, POLLHUP and POLLNVAL if POLLRDNORM and
+ // POLLWRNORM are not specified. Disallow this for now.
+ if (!created_events) {
+ errno = ENOSYS;
+ return -1;
+ }
+ }
+
+ // Create extra event for the timeout.
+ if (timeout >= 0) {
+ __wasi_subscription_t *subscription = &subscriptions[nsubscriptions++];
+ *subscription = (__wasi_subscription_t){
+ .u.tag = __WASI_EVENTTYPE_CLOCK,
+ .u.u.clock.id = __WASI_CLOCKID_REALTIME,
+ .u.u.clock.timeout = (__wasi_timestamp_t)timeout * 1000000,
+ };
+ }
+
+ // Execute poll().
+ size_t nevents;
+ __wasi_event_t events[nsubscriptions];
+ __wasi_errno_t error =
+ __wasi_poll_oneoff(subscriptions, events, nsubscriptions, &nevents);
+ if (error != 0) {
+ // WASI's poll requires at least one subscription, or else it returns
+ // `EINVAL`. Since a `poll` with nothing to wait for is valid in POSIX,
+ // return `ENOTSUP` to indicate that we don't support that case.
+ //
+ // Wasm has no signal handling, so if none of the user-provided `pollfd`
+ // elements, nor the timeout, led us to producing even one subscription
+ // to wait for, there would be no way for the poll to wake up. WASI
+ // returns `EINVAL` in this case, but for users of `poll`, `ENOTSUP` is
+ // more likely to be understood.
+ if (nsubscriptions == 0)
+ errno = ENOTSUP;
+ else
+ errno = error;
+ return -1;
+ }
+
+ // Clear revents fields.
+ for (size_t i = 0; i < nfds; ++i) {
+ struct pollfd *pollfd = &fds[i];
+ pollfd->revents = 0;
+ }
+
+ // Set revents fields.
+ for (size_t i = 0; i < nevents; ++i) {
+ const __wasi_event_t *event = &events[i];
+ if (event->type == __WASI_EVENTTYPE_FD_READ ||
+ event->type == __WASI_EVENTTYPE_FD_WRITE) {
+ struct pollfd *pollfd = (struct pollfd *)(uintptr_t)event->userdata;
+ if (event->error == __WASI_ERRNO_BADF) {
+ // Invalid file descriptor.
+ pollfd->revents |= POLLNVAL;
+ } else if (event->error == __WASI_ERRNO_PIPE) {
+ // Hangup on write side of pipe.
+ pollfd->revents |= POLLHUP;
+ } else if (event->error != 0) {
+ // Another error occurred.
+ pollfd->revents |= POLLERR;
+ } else {
+ // Data can be read or written.
+ if (event->type == __WASI_EVENTTYPE_FD_READ) {
+ pollfd->revents |= POLLRDNORM;
+ if (event->fd_readwrite.flags & __WASI_EVENTRWFLAGS_FD_READWRITE_HANGUP) {
+ pollfd->revents |= POLLHUP;
+ }
+ } else if (event->type == __WASI_EVENTTYPE_FD_WRITE) {
+ pollfd->revents |= POLLWRNORM;
+ if (event->fd_readwrite.flags & __WASI_EVENTRWFLAGS_FD_READWRITE_HANGUP) {
+ pollfd->revents |= POLLHUP;
+ }
+ }
+ }
+ }
+ }
+
+ // Return the number of events with a non-zero revents value.
+ int retval = 0;
+ for (size_t i = 0; i < nfds; ++i) {
+ struct pollfd *pollfd = &fds[i];
+ // POLLHUP contradicts with POLLWRNORM.
+ if ((pollfd->revents & POLLHUP) != 0)
+ pollfd->revents &= ~POLLWRNORM;
+ if (pollfd->revents != 0)
+ ++retval;
+ }
+ return retval;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sched/sched_yield.c b/libc-bottom-half/cloudlibc/src/libc/sched/sched_yield.c
new file mode 100644
index 0000000..6100ea5
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sched/sched_yield.c
@@ -0,0 +1,16 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <sched.h>
+
+int sched_yield(void) {
+ __wasi_errno_t error = __wasi_sched_yield();
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/stdio/renameat.c b/libc-bottom-half/cloudlibc/src/libc/stdio/renameat.c
new file mode 100644
index 0000000..c1706db
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/stdio/renameat.c
@@ -0,0 +1,17 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+int __wasilibc_nocwd_renameat(int oldfd, const char *old, int newfd, const char *new) {
+ __wasi_errno_t error = __wasi_path_rename(oldfd, old, newfd, new);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/stdlib/_Exit.c b/libc-bottom-half/cloudlibc/src/libc/stdlib/_Exit.c
new file mode 100644
index 0000000..5e266f0
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/stdlib/_Exit.c
@@ -0,0 +1,14 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <_/cdefs.h>
+#include <stdnoreturn.h>
+#include <unistd.h>
+
+noreturn void _Exit(int status) {
+ __wasi_proc_exit(status);
+}
+
+__strong_reference(_Exit, _exit);
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/ioctl/ioctl.c b/libc-bottom-half/cloudlibc/src/libc/sys/ioctl/ioctl.c
new file mode 100644
index 0000000..7d03cc6
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/ioctl/ioctl.c
@@ -0,0 +1,88 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/ioctl.h>
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <stdarg.h>
+
+int ioctl(int fildes, int request, ...) {
+ switch (request) {
+ case FIONREAD: {
+ // Poll the file descriptor to determine how many bytes can be read.
+ __wasi_subscription_t subscriptions[2] = {
+ {
+ .u.tag = __WASI_EVENTTYPE_FD_READ,
+ .u.u.fd_read.file_descriptor = fildes,
+ },
+ {
+ .u.tag = __WASI_EVENTTYPE_CLOCK,
+ .u.u.clock.id = __WASI_CLOCKID_MONOTONIC,
+ },
+ };
+ __wasi_event_t events[__arraycount(subscriptions)];
+ size_t nevents;
+ __wasi_errno_t error = __wasi_poll_oneoff(
+ subscriptions, events, __arraycount(subscriptions), &nevents);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+
+ // Location where result should be written.
+ va_list ap;
+ va_start(ap, request);
+ int *result = va_arg(ap, int *);
+ va_end(ap);
+
+ // Extract number of bytes for reading from poll results.
+ for (size_t i = 0; i < nevents; ++i) {
+ __wasi_event_t *event = &events[i];
+ if (event->error != 0) {
+ errno = event->error;
+ return -1;
+ }
+ if (event->type == __WASI_EVENTTYPE_FD_READ) {
+ *result = event->fd_readwrite.nbytes;
+ return 0;
+ }
+ }
+
+ // No data available for reading.
+ *result = 0;
+ return 0;
+ }
+ case FIONBIO: {
+ // Obtain the current file descriptor flags.
+ __wasi_fdstat_t fds;
+ __wasi_errno_t error = __wasi_fd_fdstat_get(fildes, &fds);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+
+ // Toggle the non-blocking flag based on the argument.
+ va_list ap;
+ va_start(ap, request);
+ if (*va_arg(ap, const int *) != 0)
+ fds.fs_flags |= __WASI_FDFLAGS_NONBLOCK;
+ else
+ fds.fs_flags &= ~__WASI_FDFLAGS_NONBLOCK;
+ va_end(ap);
+
+ // Update the file descriptor flags.
+ error = __wasi_fd_fdstat_set_flags(fildes, fds.fs_flags);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+ }
+ default:
+ // Invalid request.
+ errno = EINVAL;
+ return -1;
+ }
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/select/pselect.c b/libc-bottom-half/cloudlibc/src/libc/sys/select/pselect.c
new file mode 100644
index 0000000..fdc470e
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/select/pselect.c
@@ -0,0 +1,125 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <common/time.h>
+
+#include <sys/select.h>
+
+#include <wasi/api.h>
+#include <errno.h>
+
+int pselect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
+ fd_set *restrict errorfds, const struct timespec *restrict timeout,
+ const sigset_t *sigmask) {
+ // Negative file descriptor upperbound.
+ if (nfds < 0) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ // This implementation does not support polling for exceptional
+ // conditions, such as out-of-band data on TCP sockets.
+ if (errorfds != NULL && errorfds->__nfds > 0) {
+ errno = ENOSYS;
+ return -1;
+ }
+
+ // Replace NULL pointers by the empty set.
+ fd_set empty;
+ FD_ZERO(&empty);
+ if (readfds == NULL)
+ readfds = &empty;
+ if (writefds == NULL)
+ writefds = &empty;
+
+ // Determine the maximum number of events.
+ size_t maxevents = readfds->__nfds + writefds->__nfds + 1;
+ __wasi_subscription_t subscriptions[maxevents];
+ size_t nsubscriptions = 0;
+
+ // Convert the readfds set.
+ for (size_t i = 0; i < readfds->__nfds; ++i) {
+ int fd = readfds->__fds[i];
+ if (fd < nfds) {
+ __wasi_subscription_t *subscription = &subscriptions[nsubscriptions++];
+ *subscription = (__wasi_subscription_t){
+ .userdata = fd,
+ .u.tag = __WASI_EVENTTYPE_FD_READ,
+ .u.u.fd_read.file_descriptor = fd,
+ };
+ }
+ }
+
+ // Convert the writefds set.
+ for (size_t i = 0; i < writefds->__nfds; ++i) {
+ int fd = writefds->__fds[i];
+ if (fd < nfds) {
+ __wasi_subscription_t *subscription = &subscriptions[nsubscriptions++];
+ *subscription = (__wasi_subscription_t){
+ .userdata = fd,
+ .u.tag = __WASI_EVENTTYPE_FD_WRITE,
+ .u.u.fd_write.file_descriptor = fd,
+ };
+ }
+ }
+
+ // Create extra event for the timeout.
+ if (timeout != NULL) {
+ __wasi_subscription_t *subscription = &subscriptions[nsubscriptions++];
+ *subscription = (__wasi_subscription_t){
+ .u.tag = __WASI_EVENTTYPE_CLOCK,
+ .u.u.clock.id = __WASI_CLOCKID_REALTIME,
+ };
+ if (!timespec_to_timestamp_clamp(timeout, &subscription->u.u.clock.timeout)) {
+ errno = EINVAL;
+ return -1;
+ }
+ }
+
+ // Execute poll().
+ size_t nevents;
+ __wasi_event_t events[nsubscriptions];
+ __wasi_errno_t error =
+ __wasi_poll_oneoff(subscriptions, events, nsubscriptions, &nevents);
+ if (error != 0) {
+ // WASI's poll requires at least one subscription, or else it returns
+ // `EINVAL`. Since a `pselect` with nothing to wait for is valid in POSIX,
+ // return `ENOTSUP` to indicate that we don't support that case.
+ //
+ // Wasm has no signal handling, so if none of the user-provided `pollfd`
+ // elements, nor the timeout, led us to producing even one subscription
+ // to wait for, there would be no way for the poll to wake up. WASI
+ // returns `EINVAL` in this case, but for users of `poll`, `ENOTSUP` is
+ // more likely to be understood.
+ if (nsubscriptions == 0)
+ errno = ENOTSUP;
+ else
+ errno = error;
+ return -1;
+ }
+
+ // Test for EBADF.
+ for (size_t i = 0; i < nevents; ++i) {
+ const __wasi_event_t *event = &events[i];
+ if ((event->type == __WASI_EVENTTYPE_FD_READ ||
+ event->type == __WASI_EVENTTYPE_FD_WRITE) &&
+ event->error == __WASI_ERRNO_BADF) {
+ errno = EBADF;
+ return -1;
+ }
+ }
+
+ // Clear and set entries in the result sets.
+ FD_ZERO(readfds);
+ FD_ZERO(writefds);
+ for (size_t i = 0; i < nevents; ++i) {
+ const __wasi_event_t *event = &events[i];
+ if (event->type == __WASI_EVENTTYPE_FD_READ) {
+ readfds->__fds[readfds->__nfds++] = event->userdata;
+ } else if (event->type == __WASI_EVENTTYPE_FD_WRITE) {
+ writefds->__fds[writefds->__nfds++] = event->userdata;
+ }
+ }
+ return readfds->__nfds + writefds->__nfds;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/select/select.c b/libc-bottom-half/cloudlibc/src/libc/sys/select/select.c
new file mode 100644
index 0000000..ebe5e8c
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/select/select.c
@@ -0,0 +1,25 @@
+// Copyright (c) 2015 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/select.h>
+
+#include <errno.h>
+#include <stddef.h>
+
+int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
+ fd_set *restrict errorfds, struct timeval *restrict timeout) {
+ if (timeout != NULL) {
+ // Timeout specified.
+ if (timeout->tv_usec < 0 || timeout->tv_usec >= 1000000) {
+ errno = EINVAL;
+ return -1;
+ }
+ struct timespec ts = {.tv_sec = timeout->tv_sec,
+ .tv_nsec = (long)timeout->tv_usec * 1000};
+ return pselect(nfds, readfds, writefds, errorfds, &ts, NULL);
+ } else {
+ // No timeout specified.
+ return pselect(nfds, readfds, writefds, errorfds, NULL, NULL);
+ }
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/socket/getsockopt.c b/libc-bottom-half/cloudlibc/src/libc/sys/socket/getsockopt.c
new file mode 100644
index 0000000..1fe41c4
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/socket/getsockopt.c
@@ -0,0 +1,48 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/socket.h>
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <string.h>
+
+int getsockopt(int socket, int level, int option_name,
+ void *restrict option_value, socklen_t *restrict option_len) {
+ // Only support SOL_SOCKET options for now.
+ if (level != SOL_SOCKET) {
+ errno = ENOPROTOOPT;
+ return -1;
+ }
+
+ int value;
+ switch (option_name) {
+ case SO_TYPE: {
+ // Return the type of the socket. This information can simply be
+ // obtained by looking at the file descriptor type.
+ __wasi_fdstat_t fsb;
+ if (__wasi_fd_fdstat_get(socket, &fsb) != 0) {
+ errno = EBADF;
+ return -1;
+ }
+ if (fsb.fs_filetype != __WASI_FILETYPE_SOCKET_DGRAM &&
+ fsb.fs_filetype != __WASI_FILETYPE_SOCKET_STREAM) {
+ errno = ENOTSOCK;
+ return -1;
+ }
+ value = fsb.fs_filetype;
+ break;
+ }
+ default: {
+ errno = ENOPROTOOPT;
+ return -1;
+ }
+ }
+
+ // Copy out integer value.
+ memcpy(option_value, &value,
+ *option_len < sizeof(int) ? *option_len : sizeof(int));
+ *option_len = sizeof(int);
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/socket/recv.c b/libc-bottom-half/cloudlibc/src/libc/sys/socket/recv.c
new file mode 100644
index 0000000..d35f889
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/socket/recv.c
@@ -0,0 +1,40 @@
+// Copyright (c) 2015-2017 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/socket.h>
+
+#include <assert.h>
+#include <wasi/api.h>
+#include <errno.h>
+#include <stdint.h>
+
+static_assert(MSG_PEEK == __WASI_RIFLAGS_RECV_PEEK, "Value mismatch");
+static_assert(MSG_WAITALL == __WASI_RIFLAGS_RECV_WAITALL, "Value mismatch");
+
+ssize_t recv(int socket, void *restrict buffer, size_t length, int flags) {
+ // Validate flags.
+ if ((flags & ~(MSG_PEEK | MSG_WAITALL)) != 0) {
+ errno = EOPNOTSUPP;
+ return -1;
+ }
+
+ // Prepare input parameters.
+ __wasi_iovec_t iov = {.buf = buffer, .buf_len = length};
+ __wasi_iovec_t *ri_data = &iov;
+ size_t ri_data_len = 1;
+ __wasi_riflags_t ri_flags = flags;
+
+ // Perform system call.
+ size_t ro_datalen;
+ __wasi_roflags_t ro_flags;
+ __wasi_errno_t error = __wasi_sock_recv(socket,
+ ri_data, ri_data_len, ri_flags,
+ &ro_datalen,
+ &ro_flags);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return ro_datalen;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/socket/send.c b/libc-bottom-half/cloudlibc/src/libc/sys/socket/send.c
new file mode 100644
index 0000000..85a298a
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/socket/send.c
@@ -0,0 +1,32 @@
+// Copyright (c) 2015-2017 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/socket.h>
+
+#include <assert.h>
+#include <wasi/api.h>
+#include <errno.h>
+
+ssize_t send(int socket, const void *buffer, size_t length, int flags) {
+ // This implementation does not support any flags.
+ if (flags != 0) {
+ errno = EOPNOTSUPP;
+ return -1;
+ }
+
+ // Prepare input parameters.
+ __wasi_ciovec_t iov = {.buf = buffer, .buf_len = length};
+ __wasi_ciovec_t *si_data = &iov;
+ size_t si_data_len = 1;
+ __wasi_siflags_t si_flags = 0;
+
+ // Perform system call.
+ size_t so_datalen;
+ __wasi_errno_t error = __wasi_sock_send(socket, si_data, si_data_len, si_flags, &so_datalen);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return so_datalen;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/socket/shutdown.c b/libc-bottom-half/cloudlibc/src/libc/sys/socket/shutdown.c
new file mode 100644
index 0000000..261fcb8
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/socket/shutdown.c
@@ -0,0 +1,27 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/socket.h>
+
+#include <assert.h>
+#include <wasi/api.h>
+#include <errno.h>
+
+static_assert(SHUT_RD == __WASI_SDFLAGS_RD, "Value mismatch");
+static_assert(SHUT_WR == __WASI_SDFLAGS_WR, "Value mismatch");
+
+int shutdown(int socket, int how) {
+ // Validate shutdown flags.
+ if (how != SHUT_RD && how != SHUT_WR && how != SHUT_RDWR) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ __wasi_errno_t error = __wasi_sock_shutdown(socket, how);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return error;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/socket/socket_impl.h b/libc-bottom-half/cloudlibc/src/libc/sys/socket/socket_impl.h
new file mode 100644
index 0000000..7b1a366
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/socket/socket_impl.h
@@ -0,0 +1,57 @@
+// Copyright (c) 2015-2017 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#ifndef SYS_SOCKET_SOCKET_IMPL_H
+#define SYS_SOCKET_SOCKET_IMPL_H
+
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#include <netinet/in.h>
+
+#include <assert.h>
+#include <stdalign.h>
+#include <stddef.h>
+#include <stdint.h>
+
+static_assert(sizeof(struct sockaddr_storage) >= sizeof(struct sockaddr),
+ "struct sockaddr_storage too small");
+static_assert(alignof(struct sockaddr_storage) == alignof(struct sockaddr),
+ "struct sockaddr alignment incorrect");
+static_assert(sizeof(struct sockaddr_storage) >= sizeof(struct sockaddr_in),
+ "struct sockaddr_storage too small");
+static_assert(alignof(struct sockaddr_storage) == alignof(struct sockaddr_in),
+ "struct sockaddr_in alignment incorrect");
+static_assert(sizeof(struct sockaddr_storage) >= sizeof(struct sockaddr_in6),
+ "struct sockaddr_storage too small");
+static_assert(alignof(struct sockaddr_storage) == alignof(struct sockaddr_in6),
+ "struct sockaddr_in6 alignment incorrect");
+static_assert(sizeof(struct sockaddr_storage) >= sizeof(struct sockaddr_un),
+ "struct sockaddr_storage too small");
+static_assert(alignof(struct sockaddr_storage) == alignof(struct sockaddr_un),
+ "struct sockaddr_un alignment incorrect");
+
+// Returns the control message header stored at a provided memory
+// address, ensuring that it is stored within the ancillary data buffer
+// of a message header.
+static inline struct cmsghdr *CMSG_GET(const struct msghdr *mhdr, void *cmsg) {
+ // Safety belt: require that the returned object is properly aligned.
+ assert((uintptr_t)cmsg % alignof(struct cmsghdr) == 0 &&
+ "Attempted to access unaligned control message header");
+
+ // Safety belt: the computed starting address of the control message
+ // header may only lie inside the ancillary data buffer, or right
+ // after it in case we've reached the end of the buffer.
+ const unsigned char *begin = mhdr->msg_control;
+ const unsigned char *end = begin + mhdr->msg_controllen;
+ assert((unsigned char *)cmsg >= begin &&
+ (unsigned char *)cmsg < end + alignof(struct cmsghdr) &&
+ "Computed object outside of buffer boundaries");
+
+ // Only return the control message header in case all of its fields
+ // lie within the ancillary data buffer.
+ return CMSG_DATA((struct cmsghdr *)cmsg) <= end ? cmsg : NULL;
+}
+
+#endif
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/stat/fstat.c b/libc-bottom-half/cloudlibc/src/libc/sys/stat/fstat.c
new file mode 100644
index 0000000..b8ffdb5
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/stat/fstat.c
@@ -0,0 +1,21 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/stat.h>
+
+#include <wasi/api.h>
+#include <errno.h>
+
+#include "stat_impl.h"
+
+int fstat(int fildes, struct stat *buf) {
+ __wasi_filestat_t internal_stat;
+ __wasi_errno_t error = __wasi_fd_filestat_get(fildes, &internal_stat);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ to_public_stat(&internal_stat, buf);
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/stat/fstatat.c b/libc-bottom-half/cloudlibc/src/libc/sys/stat/fstatat.c
new file mode 100644
index 0000000..25b29ac
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/stat/fstatat.c
@@ -0,0 +1,31 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/stat.h>
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include "stat_impl.h"
+
+int __wasilibc_nocwd_fstatat(int fd, const char *restrict path, struct stat *restrict buf,
+ int flag) {
+ // Create lookup properties.
+ __wasi_lookupflags_t lookup_flags = 0;
+ if ((flag & AT_SYMLINK_NOFOLLOW) == 0)
+ lookup_flags |= __WASI_LOOKUPFLAGS_SYMLINK_FOLLOW;
+
+ // Perform system call.
+ __wasi_filestat_t internal_stat;
+ __wasi_errno_t error =
+ __wasi_path_filestat_get(fd, lookup_flags, path, &internal_stat);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ to_public_stat(&internal_stat, buf);
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/stat/futimens.c b/libc-bottom-half/cloudlibc/src/libc/sys/stat/futimens.c
new file mode 100644
index 0000000..13357fc
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/stat/futimens.c
@@ -0,0 +1,29 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/stat.h>
+
+#include <wasi/api.h>
+#include <errno.h>
+
+#include "stat_impl.h"
+
+int futimens(int fd, const struct timespec *times) {
+ // Convert timestamps and extract NOW/OMIT flags.
+ __wasi_timestamp_t st_atim;
+ __wasi_timestamp_t st_mtim;
+ __wasi_fstflags_t flags;
+ if (!utimens_get_timestamps(times, &st_atim, &st_mtim, &flags)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ // Perform system call.
+ __wasi_errno_t error = __wasi_fd_filestat_set_times(fd, st_atim, st_mtim, flags);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/stat/mkdirat.c b/libc-bottom-half/cloudlibc/src/libc/sys/stat/mkdirat.c
new file mode 100644
index 0000000..fd27d5e
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/stat/mkdirat.c
@@ -0,0 +1,18 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/stat.h>
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <string.h>
+
+int __wasilibc_nocwd_mkdirat_nomode(int fd, const char *path) {
+ __wasi_errno_t error = __wasi_path_create_directory(fd, path);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/stat/stat_impl.h b/libc-bottom-half/cloudlibc/src/libc/sys/stat/stat_impl.h
new file mode 100644
index 0000000..9726b51
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/stat/stat_impl.h
@@ -0,0 +1,116 @@
+// Copyright (c) 2015-2017 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#ifndef SYS_STAT_STAT_IMPL_H
+#define SYS_STAT_STAT_IMPL_H
+
+#include <common/time.h>
+
+#include <sys/stat.h>
+
+#include <assert.h>
+#include <wasi/api.h>
+#include <stdbool.h>
+
+static_assert(S_ISBLK(S_IFBLK), "Value mismatch");
+static_assert(S_ISCHR(S_IFCHR), "Value mismatch");
+static_assert(S_ISDIR(S_IFDIR), "Value mismatch");
+static_assert(S_ISFIFO(S_IFIFO), "Value mismatch");
+static_assert(S_ISLNK(S_IFLNK), "Value mismatch");
+static_assert(S_ISREG(S_IFREG), "Value mismatch");
+static_assert(S_ISSOCK(S_IFSOCK), "Value mismatch");
+
+static inline void to_public_stat(const __wasi_filestat_t *in,
+ struct stat *out) {
+ // Ensure that we don't truncate any values.
+ static_assert(sizeof(in->dev) == sizeof(out->st_dev), "Size mismatch");
+ static_assert(sizeof(in->ino) == sizeof(out->st_ino), "Size mismatch");
+ /*
+ * The non-standard __st_filetype field appears to only be used for shared
+ * memory, which we don't currently support.
+ */
+ /* nlink_t is 64-bit on wasm32, following the x32 ABI. */
+ static_assert(sizeof(in->nlink) <= sizeof(out->st_nlink), "Size shortfall");
+ static_assert(sizeof(in->size) == sizeof(out->st_size), "Size mismatch");
+
+ *out = (struct stat){
+ .st_dev = in->dev,
+ .st_ino = in->ino,
+ .st_nlink = in->nlink,
+ .st_size = in->size,
+ .st_atim = timestamp_to_timespec(in->atim),
+ .st_mtim = timestamp_to_timespec(in->mtim),
+ .st_ctim = timestamp_to_timespec(in->ctim),
+ };
+
+ // Convert file type to legacy types encoded in st_mode.
+ switch (in->filetype) {
+ case __WASI_FILETYPE_BLOCK_DEVICE:
+ out->st_mode |= S_IFBLK;
+ break;
+ case __WASI_FILETYPE_CHARACTER_DEVICE:
+ out->st_mode |= S_IFCHR;
+ break;
+ case __WASI_FILETYPE_DIRECTORY:
+ out->st_mode |= S_IFDIR;
+ break;
+ case __WASI_FILETYPE_REGULAR_FILE:
+ out->st_mode |= S_IFREG;
+ break;
+ case __WASI_FILETYPE_SOCKET_DGRAM:
+ case __WASI_FILETYPE_SOCKET_STREAM:
+ out->st_mode |= S_IFSOCK;
+ break;
+ case __WASI_FILETYPE_SYMBOLIC_LINK:
+ out->st_mode |= S_IFLNK;
+ break;
+ }
+}
+
+static inline bool utimens_get_timestamps(const struct timespec *times,
+ __wasi_timestamp_t *st_atim,
+ __wasi_timestamp_t *st_mtim,
+ __wasi_fstflags_t *flags) {
+ if (times == NULL) {
+ // Update both timestamps.
+ *flags = __WASI_FSTFLAGS_ATIM_NOW | __WASI_FSTFLAGS_MTIM_NOW;
+ *st_atim = (__wasi_timestamp_t) { 0 };
+ *st_mtim = (__wasi_timestamp_t) { 0 };
+ } else {
+ // Set individual timestamps.
+ *flags = 0;
+ switch (times[0].tv_nsec) {
+ case UTIME_NOW:
+ *flags |= __WASI_FSTFLAGS_ATIM_NOW;
+ *st_atim = (__wasi_timestamp_t) { 0 };
+ break;
+ case UTIME_OMIT:
+ *st_atim = (__wasi_timestamp_t) { 0 };
+ break;
+ default:
+ *flags |= __WASI_FSTFLAGS_ATIM;
+ if (!timespec_to_timestamp_exact(&times[0], st_atim))
+ return false;
+ break;
+ }
+
+ switch (times[1].tv_nsec) {
+ case UTIME_NOW:
+ *flags |= __WASI_FSTFLAGS_MTIM_NOW;
+ *st_mtim = (__wasi_timestamp_t) { 0 };
+ break;
+ case UTIME_OMIT:
+ *st_mtim = (__wasi_timestamp_t) { 0 };
+ break;
+ default:
+ *flags |= __WASI_FSTFLAGS_MTIM;
+ if (!timespec_to_timestamp_exact(&times[1], st_mtim))
+ return false;
+ break;
+ }
+ }
+ return true;
+}
+
+#endif
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/stat/utimensat.c b/libc-bottom-half/cloudlibc/src/libc/sys/stat/utimensat.c
new file mode 100644
index 0000000..19508a1
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/stat/utimensat.c
@@ -0,0 +1,38 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/stat.h>
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include "stat_impl.h"
+
+int __wasilibc_nocwd_utimensat(int fd, const char *path, const struct timespec times[2],
+ int flag) {
+ // Convert timestamps and extract NOW/OMIT flags.
+ __wasi_timestamp_t st_atim;
+ __wasi_timestamp_t st_mtim;
+ __wasi_fstflags_t flags;
+ if (!utimens_get_timestamps(times, &st_atim, &st_mtim, &flags)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ // Create lookup properties.
+ __wasi_lookupflags_t lookup_flags = 0;
+ if ((flag & AT_SYMLINK_NOFOLLOW) == 0)
+ lookup_flags |= __WASI_LOOKUPFLAGS_SYMLINK_FOLLOW;
+
+ // Perform system call.
+ __wasi_errno_t error =
+ __wasi_path_filestat_set_times(fd, lookup_flags, path, st_atim, st_mtim, flags);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/time/gettimeofday.c b/libc-bottom-half/cloudlibc/src/libc/sys/time/gettimeofday.c
new file mode 100644
index 0000000..596bdff
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/time/gettimeofday.c
@@ -0,0 +1,18 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <common/time.h>
+
+#include <sys/time.h>
+
+#include <wasi/api.h>
+
+int gettimeofday(struct timeval *restrict tp, void *tz) {
+ if (tp != NULL) {
+ __wasi_timestamp_t ts = 0;
+ (void)__wasi_clock_time_get(__WASI_CLOCKID_REALTIME, 1000, &ts);
+ *tp = timestamp_to_timeval(ts);
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/uio/preadv.c b/libc-bottom-half/cloudlibc/src/libc/sys/uio/preadv.c
new file mode 100644
index 0000000..36f882d
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/uio/preadv.c
@@ -0,0 +1,24 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/types.h>
+#include <sys/uio.h>
+
+#include <wasi/api.h>
+#include <errno.h>
+
+ssize_t preadv(int fildes, const struct iovec *iov, int iovcnt, off_t offset) {
+ if (iovcnt < 0 || offset < 0) {
+ errno = EINVAL;
+ return -1;
+ }
+ size_t bytes_read;
+ __wasi_errno_t error = __wasi_fd_pread(
+ fildes, (const __wasi_iovec_t *)iov, iovcnt, offset, &bytes_read);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return bytes_read;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/uio/pwritev.c b/libc-bottom-half/cloudlibc/src/libc/sys/uio/pwritev.c
new file mode 100644
index 0000000..d6f8851
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/uio/pwritev.c
@@ -0,0 +1,24 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/types.h>
+#include <sys/uio.h>
+
+#include <wasi/api.h>
+#include <errno.h>
+
+ssize_t pwritev(int fildes, const struct iovec *iov, int iovcnt, off_t offset) {
+ if (iovcnt < 0 || offset < 0) {
+ errno = EINVAL;
+ return -1;
+ }
+ size_t bytes_written;
+ __wasi_errno_t error = __wasi_fd_pwrite(
+ fildes, (const __wasi_ciovec_t *)iov, iovcnt, offset, &bytes_written);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return bytes_written;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/uio/readv.c b/libc-bottom-half/cloudlibc/src/libc/sys/uio/readv.c
new file mode 100644
index 0000000..e3eaebe
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/uio/readv.c
@@ -0,0 +1,40 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/uio.h>
+
+#include <assert.h>
+#include <wasi/api.h>
+#include <errno.h>
+#include <stddef.h>
+
+static_assert(offsetof(struct iovec, iov_base) ==
+ offsetof(__wasi_iovec_t, buf),
+ "Offset mismatch");
+static_assert(sizeof(((struct iovec *)0)->iov_base) ==
+ sizeof(((__wasi_iovec_t *)0)->buf),
+ "Size mismatch");
+static_assert(offsetof(struct iovec, iov_len) ==
+ offsetof(__wasi_iovec_t, buf_len),
+ "Offset mismatch");
+static_assert(sizeof(((struct iovec *)0)->iov_len) ==
+ sizeof(((__wasi_iovec_t *)0)->buf_len),
+ "Size mismatch");
+static_assert(sizeof(struct iovec) == sizeof(__wasi_iovec_t),
+ "Size mismatch");
+
+ssize_t readv(int fildes, const struct iovec *iov, int iovcnt) {
+ if (iovcnt < 0) {
+ errno = EINVAL;
+ return -1;
+ }
+ size_t bytes_read;
+ __wasi_errno_t error = __wasi_fd_read(
+ fildes, (const __wasi_iovec_t *)iov, iovcnt, &bytes_read);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return bytes_read;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/sys/uio/writev.c b/libc-bottom-half/cloudlibc/src/libc/sys/uio/writev.c
new file mode 100644
index 0000000..459b152
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/sys/uio/writev.c
@@ -0,0 +1,40 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/uio.h>
+
+#include <assert.h>
+#include <wasi/api.h>
+#include <errno.h>
+#include <stddef.h>
+
+static_assert(offsetof(struct iovec, iov_base) ==
+ offsetof(__wasi_ciovec_t, buf),
+ "Offset mismatch");
+static_assert(sizeof(((struct iovec *)0)->iov_base) ==
+ sizeof(((__wasi_ciovec_t *)0)->buf),
+ "Size mismatch");
+static_assert(offsetof(struct iovec, iov_len) ==
+ offsetof(__wasi_ciovec_t, buf_len),
+ "Offset mismatch");
+static_assert(sizeof(((struct iovec *)0)->iov_len) ==
+ sizeof(((__wasi_ciovec_t *)0)->buf_len),
+ "Size mismatch");
+static_assert(sizeof(struct iovec) == sizeof(__wasi_ciovec_t),
+ "Size mismatch");
+
+ssize_t writev(int fildes, const struct iovec *iov, int iovcnt) {
+ if (iovcnt < 0) {
+ errno = EINVAL;
+ return -1;
+ }
+ size_t bytes_written;
+ __wasi_errno_t error = __wasi_fd_write(
+ fildes, (const __wasi_ciovec_t *)iov, iovcnt, &bytes_written);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return bytes_written;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/time/CLOCK_MONOTONIC.c b/libc-bottom-half/cloudlibc/src/libc/time/CLOCK_MONOTONIC.c
new file mode 100644
index 0000000..a4c4a62
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/time/CLOCK_MONOTONIC.c
@@ -0,0 +1,12 @@
+// Copyright (c) 2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <common/clock.h>
+
+#include <wasi/api.h>
+#include <time.h>
+
+const struct __clockid _CLOCK_MONOTONIC = {
+ .id = __WASI_CLOCKID_MONOTONIC,
+};
diff --git a/libc-bottom-half/cloudlibc/src/libc/time/CLOCK_REALTIME.c b/libc-bottom-half/cloudlibc/src/libc/time/CLOCK_REALTIME.c
new file mode 100644
index 0000000..9523754
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/time/CLOCK_REALTIME.c
@@ -0,0 +1,12 @@
+// Copyright (c) 2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <common/clock.h>
+
+#include <wasi/api.h>
+#include <time.h>
+
+const struct __clockid _CLOCK_REALTIME = {
+ .id = __WASI_CLOCKID_REALTIME,
+};
diff --git a/libc-bottom-half/cloudlibc/src/libc/time/clock_getres.c b/libc-bottom-half/cloudlibc/src/libc/time/clock_getres.c
new file mode 100644
index 0000000..8030d4b
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/time/clock_getres.c
@@ -0,0 +1,21 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <common/clock.h>
+#include <common/time.h>
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <time.h>
+
+int clock_getres(clockid_t clock_id, struct timespec *res) {
+ __wasi_timestamp_t ts;
+ __wasi_errno_t error = __wasi_clock_res_get(clock_id->id, &ts);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ *res = timestamp_to_timespec(ts);
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/time/clock_gettime.c b/libc-bottom-half/cloudlibc/src/libc/time/clock_gettime.c
new file mode 100644
index 0000000..c7e1a60
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/time/clock_gettime.c
@@ -0,0 +1,22 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <common/clock.h>
+#include <common/time.h>
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <time.h>
+
+int __clock_gettime(clockid_t clock_id, struct timespec *tp) {
+ __wasi_timestamp_t ts;
+ __wasi_errno_t error = __wasi_clock_time_get(clock_id->id, 1, &ts);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ *tp = timestamp_to_timespec(ts);
+ return 0;
+}
+weak_alias(__clock_gettime, clock_gettime);
diff --git a/libc-bottom-half/cloudlibc/src/libc/time/clock_nanosleep.c b/libc-bottom-half/cloudlibc/src/libc/time/clock_nanosleep.c
new file mode 100644
index 0000000..d375056
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/time/clock_nanosleep.c
@@ -0,0 +1,37 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <common/clock.h>
+#include <common/time.h>
+
+#include <assert.h>
+#include <wasi/api.h>
+#include <errno.h>
+#include <time.h>
+
+static_assert(TIMER_ABSTIME == __WASI_SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME,
+ "Value mismatch");
+
+int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp,
+ struct timespec *rmtp) {
+ if ((flags & ~TIMER_ABSTIME) != 0)
+ return EINVAL;
+
+ // Prepare polling subscription.
+ __wasi_subscription_t sub = {
+ .u.tag = __WASI_EVENTTYPE_CLOCK,
+ .u.u.clock.id = clock_id->id,
+ .u.u.clock.flags = flags,
+ };
+ if (!timespec_to_timestamp_clamp(rqtp, &sub.u.u.clock.timeout))
+ return EINVAL;
+
+ // Block until polling event is triggered.
+ size_t nevents;
+ __wasi_event_t ev;
+ __wasi_errno_t error = __wasi_poll_oneoff(&sub, &ev, 1, &nevents);
+ return error == 0 && ev.error == 0 ? 0 : ENOTSUP;
+}
+
+weak_alias(clock_nanosleep, __clock_nanosleep);
diff --git a/libc-bottom-half/cloudlibc/src/libc/time/nanosleep.c b/libc-bottom-half/cloudlibc/src/libc/time/nanosleep.c
new file mode 100644
index 0000000..5f26c5c
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/time/nanosleep.c
@@ -0,0 +1,15 @@
+// Copyright (c) 2015 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <errno.h>
+#include <time.h>
+
+int nanosleep(const struct timespec *rqtp, struct timespec *rem) {
+ int error = clock_nanosleep(CLOCK_REALTIME, 0, rqtp, rem);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/time/time.c b/libc-bottom-half/cloudlibc/src/libc/time/time.c
new file mode 100644
index 0000000..52bc0e4
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/time/time.c
@@ -0,0 +1,16 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <common/time.h>
+
+#include <wasi/api.h>
+#include <time.h>
+
+time_t time(time_t *tloc) {
+ __wasi_timestamp_t ts = 0;
+ (void)__wasi_clock_time_get(__WASI_CLOCKID_REALTIME, NSEC_PER_SEC, &ts);
+ if (tloc != NULL)
+ *tloc = ts / NSEC_PER_SEC;
+ return ts / NSEC_PER_SEC;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/close.c b/libc-bottom-half/cloudlibc/src/libc/unistd/close.c
new file mode 100644
index 0000000..2f5814b
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/close.c
@@ -0,0 +1,16 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <unistd.h>
+
+int close(int fildes) {
+ __wasi_errno_t error = __wasi_fd_close(fildes);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/faccessat.c b/libc-bottom-half/cloudlibc/src/libc/unistd/faccessat.c
new file mode 100644
index 0000000..ffaef6e
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/faccessat.c
@@ -0,0 +1,53 @@
+// Copyright (c) 2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+
+int __wasilibc_nocwd_faccessat(int fd, const char *path, int amode, int flag) {
+ // Validate function parameters.
+ if ((amode & ~(F_OK | R_OK | W_OK | X_OK)) != 0 ||
+ (flag & ~AT_EACCESS) != 0) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ // Check for target file existence and obtain the file type.
+ __wasi_lookupflags_t lookup_flags = __WASI_LOOKUPFLAGS_SYMLINK_FOLLOW;
+ __wasi_filestat_t file;
+ __wasi_errno_t error =
+ __wasi_path_filestat_get(fd, lookup_flags, path, &file);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+
+ // Test whether the requested access rights are present on the
+ // directory file descriptor.
+ if (amode != 0) {
+ __wasi_fdstat_t directory;
+ error = __wasi_fd_fdstat_get(fd, &directory);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+
+ __wasi_rights_t min = 0;
+ if ((amode & R_OK) != 0)
+ min |= file.filetype == __WASI_FILETYPE_DIRECTORY
+ ? __WASI_RIGHTS_FD_READDIR
+ : __WASI_RIGHTS_FD_READ;
+ if ((amode & W_OK) != 0)
+ min |= __WASI_RIGHTS_FD_WRITE;
+
+ if ((min & directory.fs_rights_inheriting) != min) {
+ errno = EACCES;
+ return -1;
+ }
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/fdatasync.c b/libc-bottom-half/cloudlibc/src/libc/unistd/fdatasync.c
new file mode 100644
index 0000000..b821b06
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/fdatasync.c
@@ -0,0 +1,16 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <unistd.h>
+
+int fdatasync(int fildes) {
+ __wasi_errno_t error = __wasi_fd_datasync(fildes);
+ if (error != 0) {
+ errno = error == ENOTCAPABLE ? EBADF : error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/fsync.c b/libc-bottom-half/cloudlibc/src/libc/unistd/fsync.c
new file mode 100644
index 0000000..733e294
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/fsync.c
@@ -0,0 +1,16 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <unistd.h>
+
+int fsync(int fildes) {
+ __wasi_errno_t error = __wasi_fd_sync(fildes);
+ if (error != 0) {
+ errno = error == ENOTCAPABLE ? EINVAL : error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/ftruncate.c b/libc-bottom-half/cloudlibc/src/libc/unistd/ftruncate.c
new file mode 100644
index 0000000..7792597
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/ftruncate.c
@@ -0,0 +1,22 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <unistd.h>
+
+int ftruncate(int fildes, off_t length) {
+ if (length < 0) {
+ errno = EINVAL;
+ return -1;
+ }
+ __wasi_filesize_t st_size = length;
+ __wasi_errno_t error =
+ __wasi_fd_filestat_set_size(fildes, st_size);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/linkat.c b/libc-bottom-half/cloudlibc/src/libc/unistd/linkat.c
new file mode 100644
index 0000000..d57f562
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/linkat.c
@@ -0,0 +1,24 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+
+int __wasilibc_nocwd_linkat(int fd1, const char *path1, int fd2, const char *path2, int flag) {
+ // Create lookup properties.
+ __wasi_lookupflags_t lookup1_flags = 0;
+ if ((flag & AT_SYMLINK_FOLLOW) != 0)
+ lookup1_flags |= __WASI_LOOKUPFLAGS_SYMLINK_FOLLOW;
+
+ // Perform system call.
+ __wasi_errno_t error = __wasi_path_link(fd1, lookup1_flags, path1, fd2, path2);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/lseek.c b/libc-bottom-half/cloudlibc/src/libc/unistd/lseek.c
new file mode 100644
index 0000000..3e0429f
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/lseek.c
@@ -0,0 +1,25 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <assert.h>
+#include <wasi/api.h>
+#include <errno.h>
+#include <unistd.h>
+
+static_assert(SEEK_CUR == __WASI_WHENCE_CUR, "Value mismatch");
+static_assert(SEEK_END == __WASI_WHENCE_END, "Value mismatch");
+static_assert(SEEK_SET == __WASI_WHENCE_SET, "Value mismatch");
+
+off_t __lseek(int fildes, off_t offset, int whence) {
+ __wasi_filesize_t new_offset;
+ __wasi_errno_t error =
+ __wasi_fd_seek(fildes, offset, whence, &new_offset);
+ if (error != 0) {
+ errno = error == ENOTCAPABLE ? ESPIPE : error;
+ return -1;
+ }
+ return new_offset;
+}
+
+weak_alias(__lseek, lseek);
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/pread.c b/libc-bottom-half/cloudlibc/src/libc/unistd/pread.c
new file mode 100644
index 0000000..c9944bc
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/pread.c
@@ -0,0 +1,31 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <unistd.h>
+
+ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset) {
+ if (offset < 0) {
+ errno = EINVAL;
+ return -1;
+ }
+ __wasi_iovec_t iov = {.buf = buf, .buf_len = nbyte};
+ size_t bytes_read;
+ __wasi_errno_t error =
+ __wasi_fd_pread(fildes, &iov, 1, offset, &bytes_read);
+ if (error != 0) {
+ __wasi_fdstat_t fds;
+ if (error == ENOTCAPABLE && __wasi_fd_fdstat_get(fildes, &fds) == 0) {
+ // Determine why we got ENOTCAPABLE.
+ if ((fds.fs_rights_base & __WASI_RIGHTS_FD_READ) == 0)
+ error = EBADF;
+ else
+ error = ESPIPE;
+ }
+ errno = error;
+ return -1;
+ }
+ return bytes_read;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/pwrite.c b/libc-bottom-half/cloudlibc/src/libc/unistd/pwrite.c
new file mode 100644
index 0000000..f80bc40
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/pwrite.c
@@ -0,0 +1,31 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <unistd.h>
+
+ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset) {
+ if (offset < 0) {
+ errno = EINVAL;
+ return -1;
+ }
+ __wasi_ciovec_t iov = {.buf = buf, .buf_len = nbyte};
+ size_t bytes_written;
+ __wasi_errno_t error =
+ __wasi_fd_pwrite(fildes, &iov, 1, offset, &bytes_written);
+ if (error != 0) {
+ __wasi_fdstat_t fds;
+ if (error == ENOTCAPABLE && __wasi_fd_fdstat_get(fildes, &fds) == 0) {
+ // Determine why we got ENOTCAPABLE.
+ if ((fds.fs_rights_base & __WASI_RIGHTS_FD_WRITE) == 0)
+ error = EBADF;
+ else
+ error = ESPIPE;
+ }
+ errno = error;
+ return -1;
+ }
+ return bytes_written;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/read.c b/libc-bottom-half/cloudlibc/src/libc/unistd/read.c
new file mode 100644
index 0000000..1582126
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/read.c
@@ -0,0 +1,18 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <unistd.h>
+
+ssize_t read(int fildes, void *buf, size_t nbyte) {
+ __wasi_iovec_t iov = {.buf = buf, .buf_len = nbyte};
+ size_t bytes_read;
+ __wasi_errno_t error = __wasi_fd_read(fildes, &iov, 1, &bytes_read);
+ if (error != 0) {
+ errno = error == ENOTCAPABLE ? EBADF : error;
+ return -1;
+ }
+ return bytes_read;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/readlinkat.c b/libc-bottom-half/cloudlibc/src/libc/unistd/readlinkat.c
new file mode 100644
index 0000000..7a3bce2
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/readlinkat.c
@@ -0,0 +1,21 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+
+ssize_t __wasilibc_nocwd_readlinkat(int fd, const char *restrict path, char *restrict buf,
+ size_t bufsize) {
+ size_t bufused;
+ // TODO: Remove the cast on `buf` once the witx is updated with char8 support.
+ __wasi_errno_t error = __wasi_path_readlink(fd, path,
+ (uint8_t*)buf, bufsize, &bufused);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return bufused;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/sleep.c b/libc-bottom-half/cloudlibc/src/libc/unistd/sleep.c
new file mode 100644
index 0000000..970287b
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/sleep.c
@@ -0,0 +1,13 @@
+// Copyright (c) 2015 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <time.h>
+#include <unistd.h>
+
+unsigned int sleep(unsigned int seconds) {
+ struct timespec ts = {.tv_sec = seconds, .tv_nsec = 0};
+ if (clock_nanosleep(CLOCK_REALTIME, 0, &ts, NULL) != 0)
+ return seconds;
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/symlinkat.c b/libc-bottom-half/cloudlibc/src/libc/unistd/symlinkat.c
new file mode 100644
index 0000000..0aa38be
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/symlinkat.c
@@ -0,0 +1,17 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+
+int __wasilibc_nocwd_symlinkat(const char *path1, int fd, const char *path2) {
+ __wasi_errno_t error = __wasi_path_symlink(path1, fd, path2);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/unlinkat.c b/libc-bottom-half/cloudlibc/src/libc/unistd/unlinkat.c
new file mode 100644
index 0000000..351bf92
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/unlinkat.c
@@ -0,0 +1,17 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <wasi/libc.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+
+int unlinkat(int fd, const char *path, int flag) {
+ if ((flag & AT_REMOVEDIR) != 0) {
+ return __wasilibc_rmdirat(fd, path);
+ }
+ return __wasilibc_unlinkat(fd, path);
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/usleep.c b/libc-bottom-half/cloudlibc/src/libc/unistd/usleep.c
new file mode 100644
index 0000000..8005f17
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/usleep.c
@@ -0,0 +1,18 @@
+// Copyright (c) 2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <errno.h>
+#include <time.h>
+#include <unistd.h>
+
+int usleep(useconds_t useconds) {
+ struct timespec ts = {.tv_sec = useconds / 1000000,
+ .tv_nsec = useconds % 1000000 * 1000};
+ int error = clock_nanosleep(CLOCK_REALTIME, 0, &ts, NULL);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/cloudlibc/src/libc/unistd/write.c b/libc-bottom-half/cloudlibc/src/libc/unistd/write.c
new file mode 100644
index 0000000..a6567e8
--- /dev/null
+++ b/libc-bottom-half/cloudlibc/src/libc/unistd/write.c
@@ -0,0 +1,19 @@
+// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
+//
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <wasi/api.h>
+#include <errno.h>
+#include <unistd.h>
+
+ssize_t write(int fildes, const void *buf, size_t nbyte) {
+ __wasi_ciovec_t iov = {.buf = buf, .buf_len = nbyte};
+ size_t bytes_written;
+ __wasi_errno_t error =
+ __wasi_fd_write(fildes, &iov, 1, &bytes_written);
+ if (error != 0) {
+ errno = error == ENOTCAPABLE ? EBADF : error;
+ return -1;
+ }
+ return bytes_written;
+}
diff --git a/libc-bottom-half/crt/crt1-command.c b/libc-bottom-half/crt/crt1-command.c
new file mode 100644
index 0000000..fb9ee71
--- /dev/null
+++ b/libc-bottom-half/crt/crt1-command.c
@@ -0,0 +1,53 @@
+#ifdef _REENTRANT
+#include <stdatomic.h>
+extern void __wasi_init_tp(void);
+#endif
+#include <wasi/api.h>
+extern void __wasm_call_ctors(void);
+extern int __main_void(void);
+extern void __wasm_call_dtors(void);
+
+__attribute__((export_name("_start")))
+void _start(void) {
+ // Commands should only be called once per instance. This simple check
+ // ensures that the `_start` function isn't started more than once.
+ //
+ // We use `volatile` here to prevent the store to `started` from being
+ // sunk past any subsequent code, and to prevent any compiler from
+ // optimizing based on the knowledge that `_start` is the program
+ // entrypoint.
+#ifdef _REENTRANT
+ static volatile _Atomic int started = 0;
+ int expected = 0;
+ if (!atomic_compare_exchange_strong(&started, &expected, 1)) {
+ __builtin_trap();
+ }
+#else
+ static volatile int started = 0;
+ if (started != 0) {
+ __builtin_trap();
+ }
+ started = 1;
+#endif
+
+#ifdef _REENTRANT
+ __wasi_init_tp();
+#endif
+
+ // The linker synthesizes this to call constructors.
+ __wasm_call_ctors();
+
+ // Call `__main_void` which will either be the application's zero-argument
+ // `__main_void` function or a libc routine which obtains the command-line
+ // arguments and calls `__main_argv_argc`.
+ int r = __main_void();
+
+ // Call atexit functions, destructors, stdio cleanup, etc.
+ __wasm_call_dtors();
+
+ // If main exited successfully, just return, otherwise call
+ // `__wasi_proc_exit`.
+ if (r != 0) {
+ __wasi_proc_exit(r);
+ }
+}
diff --git a/libc-bottom-half/crt/crt1-reactor.c b/libc-bottom-half/crt/crt1-reactor.c
new file mode 100644
index 0000000..f507c9e
--- /dev/null
+++ b/libc-bottom-half/crt/crt1-reactor.c
@@ -0,0 +1,7 @@
+extern void __wasm_call_ctors(void);
+
+__attribute__((export_name("_initialize")))
+void _initialize(void) {
+ // The linker synthesizes this to call constructors.
+ __wasm_call_ctors();
+}
diff --git a/libc-bottom-half/crt/crt1.c b/libc-bottom-half/crt/crt1.c
new file mode 100644
index 0000000..cbbe073
--- /dev/null
+++ b/libc-bottom-half/crt/crt1.c
@@ -0,0 +1,3 @@
+// We compile a plain crt1.o for toolchain compatibility, but it's
+// identical to crt1-command.o.
+#include "crt1-command.c"
diff --git a/libc-bottom-half/getpid/getpid.c b/libc-bottom-half/getpid/getpid.c
new file mode 100644
index 0000000..d2920ac
--- /dev/null
+++ b/libc-bottom-half/getpid/getpid.c
@@ -0,0 +1,6 @@
+#include <unistd.h>
+
+pid_t getpid(void) {
+ // Return an arbitrary value, greater than 1 which is special.
+ return 42;
+}
diff --git a/libc-bottom-half/headers/private/_/limits.h b/libc-bottom-half/headers/private/_/limits.h
new file mode 100644
index 0000000..1e189a1
--- /dev/null
+++ b/libc-bottom-half/headers/private/_/limits.h
@@ -0,0 +1 @@
+#include <limits.h>
diff --git a/libc-bottom-half/headers/private/_/struct/timespec.h b/libc-bottom-half/headers/private/_/struct/timespec.h
new file mode 100644
index 0000000..fbe602a
--- /dev/null
+++ b/libc-bottom-half/headers/private/_/struct/timespec.h
@@ -0,0 +1 @@
+#include <__struct_timespec.h>
diff --git a/libc-bottom-half/headers/private/_/struct/timeval.h b/libc-bottom-half/headers/private/_/struct/timeval.h
new file mode 100644
index 0000000..9cabfd7
--- /dev/null
+++ b/libc-bottom-half/headers/private/_/struct/timeval.h
@@ -0,0 +1 @@
+#include <__struct_timeval.h>
diff --git a/libc-bottom-half/headers/private/_/types.h b/libc-bottom-half/headers/private/_/types.h
new file mode 100644
index 0000000..42b17e5
--- /dev/null
+++ b/libc-bottom-half/headers/private/_/types.h
@@ -0,0 +1,9 @@
+#include <_/cdefs.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <stdarg.h>
+#include <sys/types.h>
+
+typedef uint64_t __uint64_t;
+#define _UINT64_C UINT64_C
diff --git a/libc-bottom-half/headers/private/assert.h b/libc-bottom-half/headers/private/assert.h
new file mode 100644
index 0000000..8e19ff4
--- /dev/null
+++ b/libc-bottom-half/headers/private/assert.h
@@ -0,0 +1,7 @@
+#include <stdlib.h>
+
+#ifndef __cplusplus
+#define static_assert _Static_assert
+#endif
+
+#define assert(x) ((void)((x) || (abort(), 0)))
diff --git a/libc-bottom-half/headers/private/common/crt.h b/libc-bottom-half/headers/private/common/crt.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-bottom-half/headers/private/common/crt.h
diff --git a/libc-bottom-half/headers/private/errno.h b/libc-bottom-half/headers/private/errno.h
new file mode 100644
index 0000000..3b37313
--- /dev/null
+++ b/libc-bottom-half/headers/private/errno.h
@@ -0,0 +1,2 @@
+#include_next <errno.h>
+#define EOPNOTSUPP ENOTSUP
diff --git a/libc-bottom-half/headers/private/fcntl.h b/libc-bottom-half/headers/private/fcntl.h
new file mode 100644
index 0000000..3210418
--- /dev/null
+++ b/libc-bottom-half/headers/private/fcntl.h
@@ -0,0 +1,2 @@
+#include_next <fcntl.h>
+#include <_/types.h>
diff --git a/libc-bottom-half/headers/private/sched.h b/libc-bottom-half/headers/private/sched.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-bottom-half/headers/private/sched.h
diff --git a/libc-bottom-half/headers/private/stdarg.h b/libc-bottom-half/headers/private/stdarg.h
new file mode 100644
index 0000000..e019608
--- /dev/null
+++ b/libc-bottom-half/headers/private/stdarg.h
@@ -0,0 +1,2 @@
+#include_next <stdarg.h>
+#include <_/cdefs.h>
diff --git a/libc-bottom-half/headers/private/stdint.h b/libc-bottom-half/headers/private/stdint.h
new file mode 100644
index 0000000..1fed338
--- /dev/null
+++ b/libc-bottom-half/headers/private/stdint.h
@@ -0,0 +1,12 @@
+#include_next <stdint.h>
+
+#define __need_size_t
+#include <stddef.h>
+
+#include <__typedef_clock_t.h>
+#include <__typedef_time_t.h>
+#include <__typedef_blksize_t.h>
+#include <__typedef_off_t.h>
+#include <__typedef_ssize_t.h>
+#include <__typedef_suseconds_t.h>
+#include <__typedef_nlink_t.h>
diff --git a/libc-bottom-half/headers/private/stdio.h b/libc-bottom-half/headers/private/stdio.h
new file mode 100644
index 0000000..b135b6a
--- /dev/null
+++ b/libc-bottom-half/headers/private/stdio.h
@@ -0,0 +1,3 @@
+#include <_/cdefs.h>
+int snprintf(char *str, size_t size, const char *format, ...);
+int rename(const char *oldpath, const char *newpath);
diff --git a/libc-bottom-half/headers/private/stdlib.h b/libc-bottom-half/headers/private/stdlib.h
new file mode 100644
index 0000000..8c2b395
--- /dev/null
+++ b/libc-bottom-half/headers/private/stdlib.h
@@ -0,0 +1,8 @@
+#define __need_size_t
+#define __need_wchar_t
+#define __need_NULL
+#include <stddef.h>
+
+#include_next <stdlib.h>
+
+int clearenv(void);
diff --git a/libc-bottom-half/headers/private/string.h b/libc-bottom-half/headers/private/string.h
new file mode 100644
index 0000000..1c4ce19
--- /dev/null
+++ b/libc-bottom-half/headers/private/string.h
@@ -0,0 +1,2 @@
+#include_next <string.h>
+#include <_/cdefs.h>
diff --git a/libc-bottom-half/headers/private/sys/mman.h b/libc-bottom-half/headers/private/sys/mman.h
new file mode 100644
index 0000000..bdd5401
--- /dev/null
+++ b/libc-bottom-half/headers/private/sys/mman.h
@@ -0,0 +1,2 @@
+#include_next <sys/mman.h>
+#include <_/types.h>
diff --git a/libc-bottom-half/headers/private/threads.h b/libc-bottom-half/headers/private/threads.h
new file mode 100644
index 0000000..b51ef0d
--- /dev/null
+++ b/libc-bottom-half/headers/private/threads.h
@@ -0,0 +1,3 @@
+#ifndef __cplusplus
+#define thread_local _Thread_local
+#endif
diff --git a/libc-bottom-half/headers/public/__errno.h b/libc-bottom-half/headers/public/__errno.h
new file mode 100644
index 0000000..4fd983a
--- /dev/null
+++ b/libc-bottom-half/headers/public/__errno.h
@@ -0,0 +1,20 @@
+#ifndef __wasilibc___errno_h
+#define __wasilibc___errno_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+extern thread_local int errno;
+#else
+extern _Thread_local int errno;
+#endif
+
+#define errno errno
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__errno_values.h b/libc-bottom-half/headers/public/__errno_values.h
new file mode 100644
index 0000000..6d6d412
--- /dev/null
+++ b/libc-bottom-half/headers/public/__errno_values.h
@@ -0,0 +1,86 @@
+#ifndef __wasilibc___errno_values_h
+#define __wasilibc___errno_values_h
+
+#include <wasi/api.h>
+
+#define E2BIG __WASI_ERRNO_2BIG
+#define EACCES __WASI_ERRNO_ACCES
+#define EADDRINUSE __WASI_ERRNO_ADDRINUSE
+#define EADDRNOTAVAIL __WASI_ERRNO_ADDRNOTAVAIL
+#define EAFNOSUPPORT __WASI_ERRNO_AFNOSUPPORT
+#define EAGAIN __WASI_ERRNO_AGAIN
+#define EALREADY __WASI_ERRNO_ALREADY
+#define EBADF __WASI_ERRNO_BADF
+#define EBADMSG __WASI_ERRNO_BADMSG
+#define EBUSY __WASI_ERRNO_BUSY
+#define ECANCELED __WASI_ERRNO_CANCELED
+#define ECHILD __WASI_ERRNO_CHILD
+#define ECONNABORTED __WASI_ERRNO_CONNABORTED
+#define ECONNREFUSED __WASI_ERRNO_CONNREFUSED
+#define ECONNRESET __WASI_ERRNO_CONNRESET
+#define EDEADLK __WASI_ERRNO_DEADLK
+#define EDESTADDRREQ __WASI_ERRNO_DESTADDRREQ
+#define EDOM __WASI_ERRNO_DOM
+#define EDQUOT __WASI_ERRNO_DQUOT
+#define EEXIST __WASI_ERRNO_EXIST
+#define EFAULT __WASI_ERRNO_FAULT
+#define EFBIG __WASI_ERRNO_FBIG
+#define EHOSTUNREACH __WASI_ERRNO_HOSTUNREACH
+#define EIDRM __WASI_ERRNO_IDRM
+#define EILSEQ __WASI_ERRNO_ILSEQ
+#define EINPROGRESS __WASI_ERRNO_INPROGRESS
+#define EINTR __WASI_ERRNO_INTR
+#define EINVAL __WASI_ERRNO_INVAL
+#define EIO __WASI_ERRNO_IO
+#define EISCONN __WASI_ERRNO_ISCONN
+#define EISDIR __WASI_ERRNO_ISDIR
+#define ELOOP __WASI_ERRNO_LOOP
+#define EMFILE __WASI_ERRNO_MFILE
+#define EMLINK __WASI_ERRNO_MLINK
+#define EMSGSIZE __WASI_ERRNO_MSGSIZE
+#define EMULTIHOP __WASI_ERRNO_MULTIHOP
+#define ENAMETOOLONG __WASI_ERRNO_NAMETOOLONG
+#define ENETDOWN __WASI_ERRNO_NETDOWN
+#define ENETRESET __WASI_ERRNO_NETRESET
+#define ENETUNREACH __WASI_ERRNO_NETUNREACH
+#define ENFILE __WASI_ERRNO_NFILE
+#define ENOBUFS __WASI_ERRNO_NOBUFS
+#define ENODEV __WASI_ERRNO_NODEV
+#define ENOENT __WASI_ERRNO_NOENT
+#define ENOEXEC __WASI_ERRNO_NOEXEC
+#define ENOLCK __WASI_ERRNO_NOLCK
+#define ENOLINK __WASI_ERRNO_NOLINK
+#define ENOMEM __WASI_ERRNO_NOMEM
+#define ENOMSG __WASI_ERRNO_NOMSG
+#define ENOPROTOOPT __WASI_ERRNO_NOPROTOOPT
+#define ENOSPC __WASI_ERRNO_NOSPC
+#define ENOSYS __WASI_ERRNO_NOSYS
+#define ENOTCONN __WASI_ERRNO_NOTCONN
+#define ENOTDIR __WASI_ERRNO_NOTDIR
+#define ENOTEMPTY __WASI_ERRNO_NOTEMPTY
+#define ENOTRECOVERABLE __WASI_ERRNO_NOTRECOVERABLE
+#define ENOTSOCK __WASI_ERRNO_NOTSOCK
+#define ENOTSUP __WASI_ERRNO_NOTSUP
+#define ENOTTY __WASI_ERRNO_NOTTY
+#define ENXIO __WASI_ERRNO_NXIO
+#define EOVERFLOW __WASI_ERRNO_OVERFLOW
+#define EOWNERDEAD __WASI_ERRNO_OWNERDEAD
+#define EPERM __WASI_ERRNO_PERM
+#define EPIPE __WASI_ERRNO_PIPE
+#define EPROTO __WASI_ERRNO_PROTO
+#define EPROTONOSUPPORT __WASI_ERRNO_PROTONOSUPPORT
+#define EPROTOTYPE __WASI_ERRNO_PROTOTYPE
+#define ERANGE __WASI_ERRNO_RANGE
+#define EROFS __WASI_ERRNO_ROFS
+#define ESPIPE __WASI_ERRNO_SPIPE
+#define ESRCH __WASI_ERRNO_SRCH
+#define ESTALE __WASI_ERRNO_STALE
+#define ETIMEDOUT __WASI_ERRNO_TIMEDOUT
+#define ETXTBSY __WASI_ERRNO_TXTBSY
+#define EXDEV __WASI_ERRNO_XDEV
+#define ENOTCAPABLE __WASI_ERRNO_NOTCAPABLE
+
+#define EOPNOTSUPP ENOTSUP
+#define EWOULDBLOCK EAGAIN
+
+#endif
diff --git a/libc-bottom-half/headers/public/__fd_set.h b/libc-bottom-half/headers/public/__fd_set.h
new file mode 100644
index 0000000..7be0b9f
--- /dev/null
+++ b/libc-bottom-half/headers/public/__fd_set.h
@@ -0,0 +1,76 @@
+#ifndef __wasilibc___fd_set_h
+#define __wasilibc___fd_set_h
+
+#include <__typedef_fd_set.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static __inline void FD_CLR(int __fd, fd_set *__set) {
+ size_t __n = __set->__nfds;
+ for (int *__p = __set->__fds, *__e = __p + __n;
+ __p < __e; ++__p)
+ {
+ if (*__p == __fd) {
+ *__p = __e[-1];
+ __set->__nfds = __n - 1;
+ return;
+ }
+ }
+}
+
+static __inline
+#ifdef __cplusplus
+bool
+#else
+_Bool
+#endif
+FD_ISSET(int __fd, const fd_set *__set)
+{
+ size_t __n = __set->__nfds;
+ for (const int *__p = __set->__fds, *__e = __p + __n;
+ __p < __e; ++__p)
+ {
+ if (*__p == __fd) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static __inline void FD_SET(int __fd, fd_set *__set) {
+ size_t __n = __set->__nfds;
+ for (const int *__p = __set->__fds, *__e = __p + __n;
+ __p < __e; ++__p)
+ {
+ if (*__p == __fd) {
+ return;
+ }
+ }
+ __set->__nfds = __n + 1;
+ __set->__fds[__n] = __fd;
+}
+
+static __inline void FD_ZERO(fd_set *__set) {
+ __set->__nfds = 0;
+}
+
+static __inline void FD_COPY(const fd_set *__restrict __from,
+ fd_set *__restrict __to) {
+ size_t __n = __from->__nfds;
+ __to->__nfds = __n;
+ __builtin_memcpy(__to->__fds, __from->__fds, __n * sizeof(int));
+}
+
+#define FD_CLR(fd, set) (FD_CLR((fd), (set)))
+#define FD_ISSET(fd, set) (FD_ISSET((fd), (set)))
+#define FD_SET(fd, set) (FD_SET((fd), (set)))
+#define FD_ZERO(set) (FD_ZERO((set)))
+#define FD_COPY(from, to) (FD_COPY((from), (to)))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__function___isatty.h b/libc-bottom-half/headers/public/__function___isatty.h
new file mode 100644
index 0000000..7c04645
--- /dev/null
+++ b/libc-bottom-half/headers/public/__function___isatty.h
@@ -0,0 +1,14 @@
+#ifndef __wasilibc___function___isatty_h
+#define __wasilibc___function___isatty_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int __isatty(int fd);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__functions_malloc.h b/libc-bottom-half/headers/public/__functions_malloc.h
new file mode 100644
index 0000000..d516bc3
--- /dev/null
+++ b/libc-bottom-half/headers/public/__functions_malloc.h
@@ -0,0 +1,26 @@
+#ifndef __wasilibc___functions_malloc_h
+#define __wasilibc___functions_malloc_h
+
+#define __need_size_t
+#define __need_wchar_t
+#define __need_NULL
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void *malloc(size_t __size) __attribute__((__malloc__, __warn_unused_result__));
+void free(void *__ptr);
+void *calloc(size_t __nmemb, size_t __size) __attribute__((__malloc__, __warn_unused_result__));
+void *realloc(void *__ptr, size_t __size) __attribute__((__warn_unused_result__));
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+void *reallocarray(void *__ptr, size_t __nmemb, size_t __size) __attribute__((__warn_unused_result__));
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__functions_memcpy.h b/libc-bottom-half/headers/public/__functions_memcpy.h
new file mode 100644
index 0000000..253b065
--- /dev/null
+++ b/libc-bottom-half/headers/public/__functions_memcpy.h
@@ -0,0 +1,20 @@
+#ifndef __wasilibc___functions_memcpy_h
+#define __wasilibc___functions_memcpy_h
+
+#define __need_size_t
+#define __need_NULL
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void *memcpy(void *__restrict__ __dst, const void *__restrict__ __src, size_t __n) __attribute__((__nothrow__, __leaf__, __nonnull__(1, 2)));
+void *memmove(void *__dst, const void *__src, size_t __n) __attribute__((__nothrow__, __leaf__, __nonnull__(1, 2)));
+void *memset(void *__dst, int __c, size_t __n) __attribute__((__nothrow__, __leaf__, __nonnull__(1)));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__header_dirent.h b/libc-bottom-half/headers/public/__header_dirent.h
new file mode 100644
index 0000000..ccf3def
--- /dev/null
+++ b/libc-bottom-half/headers/public/__header_dirent.h
@@ -0,0 +1,45 @@
+#ifndef __wasilibc___header_dirent_h
+#define __wasilibc___header_dirent_h
+
+#include <wasi/api.h>
+
+#define DT_BLK __WASI_FILETYPE_BLOCK_DEVICE
+#define DT_CHR __WASI_FILETYPE_CHARACTER_DEVICE
+#define DT_DIR __WASI_FILETYPE_DIRECTORY
+#define DT_FIFO __WASI_FILETYPE_SOCKET_STREAM
+#define DT_LNK __WASI_FILETYPE_SYMBOLIC_LINK
+#define DT_REG __WASI_FILETYPE_REGULAR_FILE
+#define DT_UNKNOWN __WASI_FILETYPE_UNKNOWN
+
+#define IFTODT(x) (__wasilibc_iftodt(x))
+#define DTTOIF(x) (__wasilibc_dttoif(x))
+
+int __wasilibc_iftodt(int x);
+int __wasilibc_dttoif(int x);
+
+#include <__struct_dirent.h>
+#include <__typedef_DIR.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int closedir(DIR *);
+DIR *opendir(const char *);
+DIR *fdopendir(int);
+int fdclosedir(DIR *);
+struct dirent *readdir(DIR *);
+void rewinddir(DIR *);
+void seekdir(DIR *, long);
+long telldir(DIR *);
+DIR *opendirat(int, const char *);
+void rewinddir(DIR *);
+int scandirat(int, const char *, struct dirent ***,
+ int (*)(const struct dirent *),
+ int (*)(const struct dirent **, const struct dirent **));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__header_fcntl.h b/libc-bottom-half/headers/public/__header_fcntl.h
new file mode 100644
index 0000000..04252ac
--- /dev/null
+++ b/libc-bottom-half/headers/public/__header_fcntl.h
@@ -0,0 +1,61 @@
+#ifndef __wasilibc___header_fcntl_h
+#define __wasilibc___header_fcntl_h
+
+#include <wasi/api.h>
+#include <__seek.h>
+#include <__mode_t.h>
+
+#define O_APPEND __WASI_FDFLAGS_APPEND
+#define O_DSYNC __WASI_FDFLAGS_DSYNC
+#define O_NONBLOCK __WASI_FDFLAGS_NONBLOCK
+#define O_RSYNC __WASI_FDFLAGS_RSYNC
+#define O_SYNC __WASI_FDFLAGS_SYNC
+#define O_CREAT (__WASI_OFLAGS_CREAT << 12)
+#define O_DIRECTORY (__WASI_OFLAGS_DIRECTORY << 12)
+#define O_EXCL (__WASI_OFLAGS_EXCL << 12)
+#define O_TRUNC (__WASI_OFLAGS_TRUNC << 12)
+
+#define O_NOFOLLOW (0x01000000)
+#define O_EXEC (0x02000000)
+#define O_RDONLY (0x04000000)
+#define O_SEARCH (0x08000000)
+#define O_WRONLY (0x10000000)
+
+/*
+ * O_CLOEXEC is defined to be zero, as WASI has no exec-style functions.
+ */
+#define O_CLOEXEC (0)
+
+/*
+ * O_TTY_INIT is defined to be zero, meaning that WASI implementations are
+ * expected to always initialize a terminal the first time it's opened.
+ */
+#define O_TTY_INIT (0)
+
+#define O_NOCTTY (0)
+
+#define O_RDWR (O_RDONLY | O_WRONLY)
+#define O_ACCMODE (O_EXEC | O_RDWR | O_SEARCH)
+
+#define POSIX_FADV_DONTNEED __WASI_ADVICE_DONTNEED
+#define POSIX_FADV_NOREUSE __WASI_ADVICE_NOREUSE
+#define POSIX_FADV_NORMAL __WASI_ADVICE_NORMAL
+#define POSIX_FADV_RANDOM __WASI_ADVICE_RANDOM
+#define POSIX_FADV_SEQUENTIAL __WASI_ADVICE_SEQUENTIAL
+#define POSIX_FADV_WILLNEED __WASI_ADVICE_WILLNEED
+
+#define F_GETFD (1)
+#define F_SETFD (2)
+#define F_GETFL (3)
+#define F_SETFL (4)
+
+#define FD_CLOEXEC (1)
+
+#define AT_EACCESS (0x0)
+#define AT_SYMLINK_NOFOLLOW (0x1)
+#define AT_SYMLINK_FOLLOW (0x2)
+#define AT_REMOVEDIR (0x4)
+
+#define AT_FDCWD (-2)
+
+#endif
diff --git a/libc-bottom-half/headers/public/__header_inttypes.h b/libc-bottom-half/headers/public/__header_inttypes.h
new file mode 100644
index 0000000..47c5c9b
--- /dev/null
+++ b/libc-bottom-half/headers/public/__header_inttypes.h
@@ -0,0 +1,182 @@
+#ifndef __wasilibc___include_inttypes_h
+#define __wasilibc___include_inttypes_h
+
+#include <stdint.h>
+
+#define __need_wchar_t
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct { intmax_t quot, rem; } imaxdiv_t;
+
+intmax_t imaxabs(intmax_t);
+imaxdiv_t imaxdiv(intmax_t, intmax_t);
+intmax_t strtoimax(const char *__restrict, char **__restrict, int);
+uintmax_t strtoumax(const char *__restrict, char **__restrict, int);
+intmax_t wcstoimax(const wchar_t *__restrict, wchar_t **__restrict, int);
+uintmax_t wcstoumax(const wchar_t *__restrict, wchar_t **__restrict, int);
+
+#define PRId16 __INT16_FMTd__
+#define PRIi16 __INT16_FMTi__
+#define PRId32 __INT32_FMTd__
+#define PRIi32 __INT32_FMTi__
+#define PRId64 __INT64_FMTd__
+#define PRIi64 __INT64_FMTi__
+#define PRId8 __INT8_FMTd__
+#define PRIi8 __INT8_FMTi__
+#define PRIdMAX __INTMAX_FMTd__
+#define PRIiMAX __INTMAX_FMTi__
+#define PRIdPTR __INTPTR_FMTd__
+#define PRIiPTR __INTPTR_FMTi__
+#define PRIdFAST16 __INT_FAST16_FMTd__
+#define PRIiFAST16 __INT_FAST16_FMTi__
+#define PRIdFAST32 __INT_FAST32_FMTd__
+#define PRIiFAST32 __INT_FAST32_FMTi__
+#define PRIdFAST64 __INT_FAST64_FMTd__
+#define PRIiFAST64 __INT_FAST64_FMTi__
+#define PRIdFAST8 __INT_FAST8_FMTd__
+#define PRIiFAST8 __INT_FAST8_FMTi__
+#define PRIdLEAST16 __INT_LEAST16_FMTd__
+#define PRIiLEAST16 __INT_LEAST16_FMTi__
+#define PRIdLEAST32 __INT_LEAST32_FMTd__
+#define PRIiLEAST32 __INT_LEAST32_FMTi__
+#define PRIdLEAST64 __INT_LEAST64_FMTd__
+#define PRIiLEAST64 __INT_LEAST64_FMTi__
+#define PRIdLEAST8 __INT_LEAST8_FMTd__
+#define PRIiLEAST8 __INT_LEAST8_FMTi__
+#define PRIX16 __UINT16_FMTX__
+#define PRIo16 __UINT16_FMTo__
+#define PRIu16 __UINT16_FMTu__
+#define PRIx16 __UINT16_FMTx__
+#define PRIX32 __UINT32_FMTX__
+#define PRIo32 __UINT32_FMTo__
+#define PRIu32 __UINT32_FMTu__
+#define PRIx32 __UINT32_FMTx__
+#define PRIX64 __UINT64_FMTX__
+#define PRIo64 __UINT64_FMTo__
+#define PRIu64 __UINT64_FMTu__
+#define PRIx64 __UINT64_FMTx__
+#define PRIX8 __UINT8_FMTX__
+#define PRIo8 __UINT8_FMTo__
+#define PRIu8 __UINT8_FMTu__
+#define PRIx8 __UINT8_FMTx__
+#define PRIXMAX __UINTMAX_FMTX__
+#define PRIoMAX __UINTMAX_FMTo__
+#define PRIuMAX __UINTMAX_FMTu__
+#define PRIxMAX __UINTMAX_FMTx__
+#define PRIXPTR __UINTPTR_FMTX__
+#define PRIoPTR __UINTPTR_FMTo__
+#define PRIuPTR __UINTPTR_FMTu__
+#define PRIxPTR __UINTPTR_FMTx__
+#define PRIXFAST16 __UINT_FAST16_FMTX__
+#define PRIoFAST16 __UINT_FAST16_FMTo__
+#define PRIuFAST16 __UINT_FAST16_FMTu__
+#define PRIxFAST16 __UINT_FAST16_FMTx__
+#define PRIXFAST32 __UINT_FAST32_FMTX__
+#define PRIoFAST32 __UINT_FAST32_FMTo__
+#define PRIuFAST32 __UINT_FAST32_FMTu__
+#define PRIxFAST32 __UINT_FAST32_FMTx__
+#define PRIXFAST64 __UINT_FAST64_FMTX__
+#define PRIoFAST64 __UINT_FAST64_FMTo__
+#define PRIuFAST64 __UINT_FAST64_FMTu__
+#define PRIxFAST64 __UINT_FAST64_FMTx__
+#define PRIXFAST8 __UINT_FAST8_FMTX__
+#define PRIoFAST8 __UINT_FAST8_FMTo__
+#define PRIuFAST8 __UINT_FAST8_FMTu__
+#define PRIxFAST8 __UINT_FAST8_FMTx__
+#define PRIXLEAST16 __UINT_LEAST16_FMTX__
+#define PRIoLEAST16 __UINT_LEAST16_FMTo__
+#define PRIuLEAST16 __UINT_LEAST16_FMTu__
+#define PRIxLEAST16 __UINT_LEAST16_FMTx__
+#define PRIXLEAST32 __UINT_LEAST32_FMTX__
+#define PRIoLEAST32 __UINT_LEAST32_FMTo__
+#define PRIuLEAST32 __UINT_LEAST32_FMTu__
+#define PRIxLEAST32 __UINT_LEAST32_FMTx__
+#define PRIXLEAST64 __UINT_LEAST64_FMTX__
+#define PRIoLEAST64 __UINT_LEAST64_FMTo__
+#define PRIuLEAST64 __UINT_LEAST64_FMTu__
+#define PRIxLEAST64 __UINT_LEAST64_FMTx__
+#define PRIXLEAST8 __UINT_LEAST8_FMTX__
+#define PRIoLEAST8 __UINT_LEAST8_FMTo__
+#define PRIuLEAST8 __UINT_LEAST8_FMTu__
+#define PRIxLEAST8 __UINT_LEAST8_FMTx__
+
+#define SCNd16 __INT16_FMTd__
+#define SCNi16 __INT16_FMTi__
+#define SCNd32 __INT32_FMTd__
+#define SCNi32 __INT32_FMTi__
+#define SCNd64 __INT64_FMTd__
+#define SCNi64 __INT64_FMTi__
+#define SCNd8 __INT8_FMTd__
+#define SCNi8 __INT8_FMTi__
+#define SCNdMAX __INTMAX_FMTd__
+#define SCNiMAX __INTMAX_FMTi__
+#define SCNdPTR __INTPTR_FMTd__
+#define SCNiPTR __INTPTR_FMTi__
+#define SCNdFAST16 __INT_FAST16_FMTd__
+#define SCNiFAST16 __INT_FAST16_FMTi__
+#define SCNdFAST32 __INT_FAST32_FMTd__
+#define SCNiFAST32 __INT_FAST32_FMTi__
+#define SCNdFAST64 __INT_FAST64_FMTd__
+#define SCNiFAST64 __INT_FAST64_FMTi__
+#define SCNdFAST8 __INT_FAST8_FMTd__
+#define SCNiFAST8 __INT_FAST8_FMTi__
+#define SCNdLEAST16 __INT_LEAST16_FMTd__
+#define SCNiLEAST16 __INT_LEAST16_FMTi__
+#define SCNdLEAST32 __INT_LEAST32_FMTd__
+#define SCNiLEAST32 __INT_LEAST32_FMTi__
+#define SCNdLEAST64 __INT_LEAST64_FMTd__
+#define SCNiLEAST64 __INT_LEAST64_FMTi__
+#define SCNdLEAST8 __INT_LEAST8_FMTd__
+#define SCNiLEAST8 __INT_LEAST8_FMTi__
+#define SCNo16 __UINT16_FMTo__
+#define SCNu16 __UINT16_FMTu__
+#define SCNx16 __UINT16_FMTx__
+#define SCNo32 __UINT32_FMTo__
+#define SCNu32 __UINT32_FMTu__
+#define SCNx32 __UINT32_FMTx__
+#define SCNo64 __UINT64_FMTo__
+#define SCNu64 __UINT64_FMTu__
+#define SCNx64 __UINT64_FMTx__
+#define SCNo8 __UINT8_FMTo__
+#define SCNu8 __UINT8_FMTu__
+#define SCNx8 __UINT8_FMTx__
+#define SCNoMAX __UINTMAX_FMTo__
+#define SCNuMAX __UINTMAX_FMTu__
+#define SCNxMAX __UINTMAX_FMTx__
+#define SCNoPTR __UINTPTR_FMTo__
+#define SCNuPTR __UINTPTR_FMTu__
+#define SCNxPTR __UINTPTR_FMTx__
+#define SCNoFAST16 __UINT_FAST16_FMTo__
+#define SCNuFAST16 __UINT_FAST16_FMTu__
+#define SCNxFAST16 __UINT_FAST16_FMTx__
+#define SCNoFAST32 __UINT_FAST32_FMTo__
+#define SCNuFAST32 __UINT_FAST32_FMTu__
+#define SCNxFAST32 __UINT_FAST32_FMTx__
+#define SCNoFAST64 __UINT_FAST64_FMTo__
+#define SCNuFAST64 __UINT_FAST64_FMTu__
+#define SCNxFAST64 __UINT_FAST64_FMTx__
+#define SCNoFAST8 __UINT_FAST8_FMTo__
+#define SCNuFAST8 __UINT_FAST8_FMTu__
+#define SCNxFAST8 __UINT_FAST8_FMTx__
+#define SCNoLEAST16 __UINT_LEAST16_FMTo__
+#define SCNuLEAST16 __UINT_LEAST16_FMTu__
+#define SCNxLEAST16 __UINT_LEAST16_FMTx__
+#define SCNoLEAST32 __UINT_LEAST32_FMTo__
+#define SCNuLEAST32 __UINT_LEAST32_FMTu__
+#define SCNxLEAST32 __UINT_LEAST32_FMTx__
+#define SCNoLEAST64 __UINT_LEAST64_FMTo__
+#define SCNuLEAST64 __UINT_LEAST64_FMTu__
+#define SCNxLEAST64 __UINT_LEAST64_FMTx__
+#define SCNoLEAST8 __UINT_LEAST8_FMTo__
+#define SCNuLEAST8 __UINT_LEAST8_FMTu__
+#define SCNxLEAST8 __UINT_LEAST8_FMTx__
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__header_netinet_in.h b/libc-bottom-half/headers/public/__header_netinet_in.h
new file mode 100644
index 0000000..30359c8
--- /dev/null
+++ b/libc-bottom-half/headers/public/__header_netinet_in.h
@@ -0,0 +1,30 @@
+#ifndef __wasilibc___header_netinet_in_h
+#define __wasilibc___header_netinet_in_h
+
+#include <__struct_in_addr.h>
+#include <__struct_in6_addr.h>
+#include <__struct_sockaddr_in.h>
+#include <__struct_sockaddr_in6.h>
+
+#define IPPROTO_IP 0
+#define IPPROTO_ICMP 1
+#define IPPROTO_TCP 6
+#define IPPROTO_UDP 17
+#define IPPROTO_IPV6 41
+#define IPPROTO_RAW 255
+
+#define IN6ADDR_ANY_INIT { { \
+ 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00 \
+} }
+
+#define IN6ADDR_LOOPBACK_INIT { { \
+ 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x01 \
+} }
+
+#endif
diff --git a/libc-bottom-half/headers/public/__header_poll.h b/libc-bottom-half/headers/public/__header_poll.h
new file mode 100644
index 0000000..23b36f2
--- /dev/null
+++ b/libc-bottom-half/headers/public/__header_poll.h
@@ -0,0 +1,27 @@
+#ifndef __wasilibc___header_poll_h
+#define __wasilibc___header_poll_h
+
+#include <__struct_pollfd.h>
+#include <__typedef_nfds_t.h>
+
+#define POLLRDNORM 0x1
+#define POLLWRNORM 0x2
+
+#define POLLIN POLLRDNORM
+#define POLLOUT POLLWRNORM
+
+#define POLLERR 0x1000
+#define POLLHUP 0x2000
+#define POLLNVAL 0x4000
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int poll(struct pollfd[], nfds_t, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__header_stdlib.h b/libc-bottom-half/headers/public/__header_stdlib.h
new file mode 100644
index 0000000..a6c49a5
--- /dev/null
+++ b/libc-bottom-half/headers/public/__header_stdlib.h
@@ -0,0 +1,21 @@
+#ifndef __wasilibc___header_stdlib_h
+#define __wasilibc___header_stdlib_h
+
+#define __need_size_t
+#include <stddef.h>
+
+#include <__functions_malloc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void abort(void) __attribute__((__noreturn__));
+void qsort(void *, size_t, size_t, int (*)(const void *, const void *));
+void _Exit(int) __attribute__((__noreturn__));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__header_string.h b/libc-bottom-half/headers/public/__header_string.h
new file mode 100644
index 0000000..eb98a8a
--- /dev/null
+++ b/libc-bottom-half/headers/public/__header_string.h
@@ -0,0 +1,23 @@
+#ifndef __wasilibc___header_string_h
+#define __wasilibc___header_string_h
+
+#define __need_size_t
+#define __need_NULL
+#include <stddef.h>
+
+#include <__functions_memcpy.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+size_t strlen(const char *) __attribute__((__nothrow__, __leaf__, __pure__, __nonnull__(1)));
+char *strdup(const char *) __attribute__((__nothrow__, __nonnull__(1)));
+int strcmp(const char *, const char *) __attribute__((__nothrow__, __pure__, __nonnull__(1, 2)));
+void *memchr(const void *, int, size_t) __attribute__((__nothrow__, __pure__, __nonnull__(1)));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__header_sys_ioctl.h b/libc-bottom-half/headers/public/__header_sys_ioctl.h
new file mode 100644
index 0000000..f2cf4ee
--- /dev/null
+++ b/libc-bottom-half/headers/public/__header_sys_ioctl.h
@@ -0,0 +1,17 @@
+#ifndef __wasilibc___header_sys_ioctl_h
+#define __wasilibc___header_sys_ioctl_h
+
+#define FIONREAD 1
+#define FIONBIO 2
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int ioctl(int, int, ...);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__header_sys_resource.h b/libc-bottom-half/headers/public/__header_sys_resource.h
new file mode 100644
index 0000000..bae9d5a
--- /dev/null
+++ b/libc-bottom-half/headers/public/__header_sys_resource.h
@@ -0,0 +1,19 @@
+#ifndef __wasilibc___header_sys_resource_h
+#define __wasilibc___header_sys_resource_h
+
+#include <__struct_rusage.h>
+
+#define RUSAGE_SELF 1
+#define RUSAGE_CHILDREN 2
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int getrusage(int who, struct rusage *usage);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__header_sys_socket.h b/libc-bottom-half/headers/public/__header_sys_socket.h
new file mode 100644
index 0000000..9fa8684
--- /dev/null
+++ b/libc-bottom-half/headers/public/__header_sys_socket.h
@@ -0,0 +1,41 @@
+#ifndef __wasilibc___header_sys_socket_h
+#define __wasilibc___header_sys_socket_h
+
+#include <__struct_msghdr.h>
+#include <__struct_sockaddr.h>
+#include <__struct_sockaddr_storage.h>
+
+#include <wasi/api.h>
+
+#define SHUT_RD __WASI_SDFLAGS_RD
+#define SHUT_WR __WASI_SDFLAGS_WR
+#define SHUT_RDWR (SHUT_RD | SHUT_WR)
+
+#define MSG_PEEK __WASI_RIFLAGS_RECV_PEEK
+#define MSG_WAITALL __WASI_RIFLAGS_RECV_WAITALL
+#define MSG_TRUNC __WASI_RIFLAGS_RECV_DATA_TRUNCATED
+
+#define SOCK_DGRAM __WASI_FILETYPE_SOCKET_DGRAM
+#define SOCK_STREAM __WASI_FILETYPE_SOCKET_STREAM
+
+#define SOCK_NONBLOCK (0x00004000)
+#define SOCK_CLOEXEC (0x00002000)
+
+#define SOL_SOCKET 0x7fffffff
+
+#define SO_TYPE 3
+
+#define AF_UNSPEC 0
+#define AF_INET 1
+#define AF_INET6 2
+#define AF_UNIX 3
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__header_sys_stat.h b/libc-bottom-half/headers/public/__header_sys_stat.h
new file mode 100644
index 0000000..f965cf3
--- /dev/null
+++ b/libc-bottom-half/headers/public/__header_sys_stat.h
@@ -0,0 +1,15 @@
+#ifndef __wasilibc___header_sys_stat_h
+#define __wasilibc___header_sys_stat_h
+
+#include <__struct_stat.h>
+
+#define st_atime st_atim.tv_sec
+#define st_mtime st_mtim.tv_sec
+#define st_ctime st_ctim.tv_sec
+
+#include <__mode_t.h>
+
+#define UTIME_NOW (-1)
+#define UTIME_OMIT (-2)
+
+#endif
diff --git a/libc-bottom-half/headers/public/__header_time.h b/libc-bottom-half/headers/public/__header_time.h
new file mode 100644
index 0000000..2a2ff91
--- /dev/null
+++ b/libc-bottom-half/headers/public/__header_time.h
@@ -0,0 +1,33 @@
+#ifndef __wasilibc___header_time_h
+#define __wasilibc___header_time_h
+
+#define __need_size_t
+#define __need_NULL
+#include <stddef.h>
+
+#include <__typedef_time_t.h>
+#include <__struct_timespec.h>
+#include <__struct_tm.h>
+#include <__typedef_clockid_t.h>
+
+#include <wasi/api.h>
+
+#define TIMER_ABSTIME __WASI_SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME
+
+extern const struct __clockid _CLOCK_MONOTONIC;
+#define CLOCK_MONOTONIC (&_CLOCK_MONOTONIC)
+extern const struct __clockid _CLOCK_REALTIME;
+#define CLOCK_REALTIME (&_CLOCK_REALTIME)
+
+/*
+ * TIME_UTC is the only standardized time base value.
+ */
+#define TIME_UTC 1
+
+/*
+ * Note that XSI specifies CLOCKS_PER_SEC to be 1000000, rather than
+ * 1000000000; the clock API is providing more precision than XSI specifies.
+ */
+#define CLOCKS_PER_SEC ((clock_t)1000000000)
+
+#endif
diff --git a/libc-bottom-half/headers/public/__header_unistd.h b/libc-bottom-half/headers/public/__header_unistd.h
new file mode 100644
index 0000000..6b80d63
--- /dev/null
+++ b/libc-bottom-half/headers/public/__header_unistd.h
@@ -0,0 +1,28 @@
+#ifndef __wasilibc___header_unistd_h
+#define __wasilibc___header_unistd_h
+
+struct stat;
+
+#include <__seek.h>
+
+#define F_OK (0)
+#define X_OK (1)
+#define W_OK (2)
+#define R_OK (4)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int close(int fd);
+int faccessat(int, const char *, int, int);
+int fstatat(int, const char *__restrict, struct stat *__restrict, int);
+int renameat(int, const char *, int, const char *);
+int openat(int, const char *, int, ...);
+void *sbrk(intptr_t increment);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/__macro_FD_SETSIZE.h b/libc-bottom-half/headers/public/__macro_FD_SETSIZE.h
new file mode 100644
index 0000000..bb88e45
--- /dev/null
+++ b/libc-bottom-half/headers/public/__macro_FD_SETSIZE.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc___macro_FD_SETSIZE_h
+#define __wasilibc___macro_FD_SETSIZE_h
+
+#define FD_SETSIZE 1024
+
+#endif
diff --git a/libc-bottom-half/headers/public/__macro_PAGESIZE.h b/libc-bottom-half/headers/public/__macro_PAGESIZE.h
new file mode 100644
index 0000000..d892220
--- /dev/null
+++ b/libc-bottom-half/headers/public/__macro_PAGESIZE.h
@@ -0,0 +1,16 @@
+#ifndef __wasilibc___macro_PAGESIZE_h
+#define __wasilibc___macro_PAGESIZE_h
+
+/*
+ * The page size in WebAssembly is fixed at 64 KiB. If this ever changes,
+ * it's expected that applications will need to opt in, so we can change
+ * this.
+ *
+ * If this ever needs to be a value outside the range of an `int`, the
+ * `getpagesize` function which returns this value will need special
+ * consideration. POSIX has deprecated `getpagesize` in favor of
+ * `sysconf(_SC_PAGESIZE)` which does not have this problem.
+ */
+#define PAGESIZE (0x10000)
+
+#endif
diff --git a/libc-bottom-half/headers/public/__mode_t.h b/libc-bottom-half/headers/public/__mode_t.h
new file mode 100644
index 0000000..c0beef5
--- /dev/null
+++ b/libc-bottom-half/headers/public/__mode_t.h
@@ -0,0 +1,38 @@
+#ifndef __wasilibc___mode_t_h
+#define __wasilibc___mode_t_h
+
+#define S_IFMT \
+ (S_IFBLK | S_IFCHR | S_IFDIR | S_IFIFO | S_IFLNK | S_IFREG | S_IFSOCK)
+#define S_IFBLK (0x6000)
+#define S_IFCHR (0x2000)
+#define S_IFDIR (0x4000)
+#define S_IFLNK (0xa000)
+#define S_IFREG (0x8000)
+#define S_IFSOCK (0xc000)
+#define S_IFIFO (0xc000)
+
+#define S_ISBLK(m) (((m)&S_IFMT) == S_IFBLK)
+#define S_ISCHR(m) (((m)&S_IFMT) == S_IFCHR)
+#define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR)
+#define S_ISFIFO(m) (((m)&S_IFMT) == S_IFIFO)
+#define S_ISLNK(m) (((m)&S_IFMT) == S_IFLNK)
+#define S_ISREG(m) (((m)&S_IFMT) == S_IFREG)
+#define S_ISSOCK(m) (((m)&S_IFMT) == S_IFSOCK)
+
+#define S_IXOTH (0x1)
+#define S_IWOTH (0x2)
+#define S_IROTH (0x4)
+#define S_IRWXO (S_IXOTH | S_IWOTH | S_IROTH)
+#define S_IXGRP (0x8)
+#define S_IWGRP (0x10)
+#define S_IRGRP (0x20)
+#define S_IRWXG (S_IXGRP | S_IWGRP | S_IRGRP)
+#define S_IXUSR (0x40)
+#define S_IWUSR (0x80)
+#define S_IRUSR (0x100)
+#define S_IRWXU (S_IXUSR | S_IWUSR | S_IRUSR)
+#define S_ISVTX (0x200)
+#define S_ISGID (0x400)
+#define S_ISUID (0x800)
+
+#endif
diff --git a/libc-bottom-half/headers/public/__seek.h b/libc-bottom-half/headers/public/__seek.h
new file mode 100644
index 0000000..8824adb
--- /dev/null
+++ b/libc-bottom-half/headers/public/__seek.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc___seek_h
+#define __wasilibc___seek_h
+
+#include <wasi/api.h>
+
+#define SEEK_CUR __WASI_WHENCE_CUR
+#define SEEK_END __WASI_WHENCE_END
+#define SEEK_SET __WASI_WHENCE_SET
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_dirent.h b/libc-bottom-half/headers/public/__struct_dirent.h
new file mode 100644
index 0000000..9d2ece8
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_dirent.h
@@ -0,0 +1,14 @@
+#ifndef __wasilibc___struct_dirent_h
+#define __wasilibc___struct_dirent_h
+
+#include <__typedef_ino_t.h>
+
+#define _DIRENT_HAVE_D_TYPE
+
+struct dirent {
+ ino_t d_ino;
+ unsigned char d_type;
+ char d_name[];
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_in6_addr.h b/libc-bottom-half/headers/public/__struct_in6_addr.h
new file mode 100644
index 0000000..cf2fafe
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_in6_addr.h
@@ -0,0 +1,8 @@
+#ifndef __wasilibc___struct_in6_addr_h
+#define __wasilibc___struct_in6_addr_h
+
+struct in6_addr {
+ _Alignas(int32_t) unsigned char s6_addr[16];
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_in_addr.h b/libc-bottom-half/headers/public/__struct_in_addr.h
new file mode 100644
index 0000000..881ffa6
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_in_addr.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc___struct_in_addr_h
+#define __wasilibc___struct_in_addr_h
+
+#include <__typedef_in_addr_t.h>
+
+struct in_addr {
+ in_addr_t s_addr;
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_iovec.h b/libc-bottom-half/headers/public/__struct_iovec.h
new file mode 100644
index 0000000..da3e1c7
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_iovec.h
@@ -0,0 +1,12 @@
+#ifndef __wasilibc___struct_iovec_h
+#define __wasilibc___struct_iovec_h
+
+#define __need_size_t
+#include <stddef.h>
+
+struct iovec {
+ void *iov_base;
+ size_t iov_len;
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_msghdr.h b/libc-bottom-half/headers/public/__struct_msghdr.h
new file mode 100644
index 0000000..0c0877d
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_msghdr.h
@@ -0,0 +1,16 @@
+#ifndef __wasilibc___struct_msghdr_h
+#define __wasilibc___struct_msghdr_h
+
+#include <__typedef_socklen_t.h>
+
+struct msghdr {
+ void *msg_name;
+ socklen_t msg_namelen;
+ struct iovec *msg_iov;
+ int msg_iovlen;
+ void *msg_control;
+ socklen_t msg_controllen;
+ int msg_flags;
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_pollfd.h b/libc-bottom-half/headers/public/__struct_pollfd.h
new file mode 100644
index 0000000..45874c5
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_pollfd.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc___struct_pollfd_h
+#define __wasilibc___struct_pollfd_h
+
+struct pollfd {
+ int fd;
+ short events;
+ short revents;
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_rusage.h b/libc-bottom-half/headers/public/__struct_rusage.h
new file mode 100644
index 0000000..69fe2fe
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_rusage.h
@@ -0,0 +1,12 @@
+#ifndef __wasilibc___struct_rusage_h
+#define __wasilibc___struct_rusage_h
+
+#include <__struct_timeval.h>
+
+/* TODO: Add more features here. */
+struct rusage {
+ struct timeval ru_utime;
+ struct timeval ru_stime;
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_sockaddr.h b/libc-bottom-half/headers/public/__struct_sockaddr.h
new file mode 100644
index 0000000..9891b90
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_sockaddr.h
@@ -0,0 +1,14 @@
+#ifndef __wasilibc___struct_sockaddr_h
+#define __wasilibc___struct_sockaddr_h
+
+#define __need_STDDEF_H_misc
+#include <stddef.h>
+
+#include <__typedef_sa_family_t.h>
+
+struct sockaddr {
+ __attribute__((aligned(__BIGGEST_ALIGNMENT__))) sa_family_t sa_family;
+ char sa_data[0];
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_sockaddr_in.h b/libc-bottom-half/headers/public/__struct_sockaddr_in.h
new file mode 100644
index 0000000..73dc5c6
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_sockaddr_in.h
@@ -0,0 +1,17 @@
+#ifndef __wasilibc___struct_sockaddr_in_h
+#define __wasilibc___struct_sockaddr_in_h
+
+#define __need_STDDEF_H_misc
+#include <stddef.h>
+
+#include <__typedef_sa_family_t.h>
+#include <__typedef_in_port_t.h>
+#include <__struct_in_addr.h>
+
+struct sockaddr_in {
+ _Alignas(max_align_t) sa_family_t sin_family;
+ in_port_t sin_port;
+ struct in_addr sin_addr;
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_sockaddr_in6.h b/libc-bottom-half/headers/public/__struct_sockaddr_in6.h
new file mode 100644
index 0000000..a220f91
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_sockaddr_in6.h
@@ -0,0 +1,19 @@
+#ifndef __wasilibc___struct_sockaddr_in6_h
+#define __wasilibc___struct_sockaddr_in6_h
+
+#define __need_STDDEF_H_misc
+#include <stddef.h>
+
+#include <__typedef_sa_family_t.h>
+#include <__typedef_in_port_t.h>
+#include <__struct_in6_addr.h>
+
+struct sockaddr_in6 {
+ _Alignas(max_align_t) sa_family_t sin6_family;
+ in_port_t sin6_port;
+ unsigned sin6_flowinfo;
+ struct in6_addr sin6_addr;
+ unsigned sin6_scope_id;
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_sockaddr_storage.h b/libc-bottom-half/headers/public/__struct_sockaddr_storage.h
new file mode 100644
index 0000000..1ae26a7
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_sockaddr_storage.h
@@ -0,0 +1,14 @@
+#ifndef __wasilibc___struct_sockaddr_storage_h
+#define __wasilibc___struct_sockaddr_storage_h
+
+#define __need_STDDEF_H_misc
+#include <stddef.h>
+
+#include <__typedef_sa_family_t.h>
+
+struct sockaddr_storage {
+ _Alignas(max_align_t) sa_family_t ss_family;
+ char __ss_data[32];
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_sockaddr_un.h b/libc-bottom-half/headers/public/__struct_sockaddr_un.h
new file mode 100644
index 0000000..a5be6e5
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_sockaddr_un.h
@@ -0,0 +1,13 @@
+#ifndef __wasilibc___struct_sockaddr_un_h
+#define __wasilibc___struct_sockaddr_un_h
+
+#define __need_STDDEF_H_misc
+#include <stddef.h>
+
+#include <__typedef_sa_family_t.h>
+
+struct sockaddr_un {
+ _Alignas(max_align_t) sa_family_t sun_family;
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_stat.h b/libc-bottom-half/headers/public/__struct_stat.h
new file mode 100644
index 0000000..5e345da
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_stat.h
@@ -0,0 +1,35 @@
+#ifndef __wasilibc___struct_stat_h
+#define __wasilibc___struct_stat_h
+
+#include <__typedef_dev_t.h>
+#include <__typedef_ino_t.h>
+#include <__typedef_nlink_t.h>
+#include <__typedef_mode_t.h>
+#include <__typedef_uid_t.h>
+#include <__typedef_gid_t.h>
+#include <__typedef_off_t.h>
+#include <__typedef_blksize_t.h>
+#include <__typedef_blkcnt_t.h>
+#include <__struct_timespec.h>
+
+struct stat {
+ dev_t st_dev;
+ ino_t st_ino;
+ nlink_t st_nlink;
+
+ mode_t st_mode;
+ uid_t st_uid;
+ gid_t st_gid;
+ unsigned int __pad0;
+ dev_t st_rdev;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+ long long __reserved[3];
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_timespec.h b/libc-bottom-half/headers/public/__struct_timespec.h
new file mode 100644
index 0000000..10d83f9
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_timespec.h
@@ -0,0 +1,12 @@
+#ifndef __wasilibc___struct_timespec_h
+#define __wasilibc___struct_timespec_h
+
+#include <__typedef_time_t.h>
+
+/* As specified in POSIX. */
+struct timespec {
+ time_t tv_sec;
+ long tv_nsec;
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_timeval.h b/libc-bottom-half/headers/public/__struct_timeval.h
new file mode 100644
index 0000000..b09f1a9
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_timeval.h
@@ -0,0 +1,13 @@
+#ifndef __wasilibc___struct_timeval_h
+#define __wasilibc___struct_timeval_h
+
+#include <__typedef_time_t.h>
+#include <__typedef_suseconds_t.h>
+
+/* As specified in POSIX. */
+struct timeval {
+ time_t tv_sec;
+ suseconds_t tv_usec;
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_tm.h b/libc-bottom-half/headers/public/__struct_tm.h
new file mode 100644
index 0000000..3c83dc5
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_tm.h
@@ -0,0 +1,19 @@
+#ifndef __wasilibc___struct_tm_h
+#define __wasilibc___struct_tm_h
+
+struct tm {
+ int tm_sec;
+ int tm_min;
+ int tm_hour;
+ int tm_mday;
+ int tm_mon;
+ int tm_year;
+ int tm_wday;
+ int tm_yday;
+ int tm_isdst;
+ int __tm_gmtoff;
+ const char *__tm_zone;
+ int __tm_nsec;
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__struct_tms.h b/libc-bottom-half/headers/public/__struct_tms.h
new file mode 100644
index 0000000..9914097
--- /dev/null
+++ b/libc-bottom-half/headers/public/__struct_tms.h
@@ -0,0 +1,13 @@
+#ifndef __wasilibc___struct_tms_h
+#define __wasilibc___struct_tms_h
+
+#include <__typedef_clock_t.h>
+
+struct tms {
+ clock_t tms_utime;
+ clock_t tms_stime;
+ clock_t tms_cutime;
+ clock_t tms_cstime;
+};
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_DIR.h b/libc-bottom-half/headers/public/__typedef_DIR.h
new file mode 100644
index 0000000..f07cfc1
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_DIR.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc___typedef_DIR_h
+#define __wasilibc___typedef_DIR_h
+
+typedef struct _DIR DIR;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_blkcnt_t.h b/libc-bottom-half/headers/public/__typedef_blkcnt_t.h
new file mode 100644
index 0000000..e8d7b3d
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_blkcnt_t.h
@@ -0,0 +1,7 @@
+#ifndef __wasilibc___typedef_blkcnt_t_h
+#define __wasilibc___typedef_blkcnt_t_h
+
+/* Define these as 64-bit signed integers to support files larger than 2 GiB. */
+typedef long long blkcnt_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_blksize_t.h b/libc-bottom-half/headers/public/__typedef_blksize_t.h
new file mode 100644
index 0000000..8816e0a
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_blksize_t.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc___typedef_blksize_t_h
+#define __wasilibc___typedef_blksize_t_h
+
+typedef long blksize_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_clock_t.h b/libc-bottom-half/headers/public/__typedef_clock_t.h
new file mode 100644
index 0000000..68cb588
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_clock_t.h
@@ -0,0 +1,7 @@
+#ifndef __wasilibc___typedef_clock_t_h
+#define __wasilibc___typedef_clock_t_h
+
+/* Define this as a 64-bit signed integer to avoid wraparounds. */
+typedef long long clock_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_clockid_t.h b/libc-bottom-half/headers/public/__typedef_clockid_t.h
new file mode 100644
index 0000000..6de4244
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_clockid_t.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc___typedef_clockid_t_h
+#define __wasilibc___typedef_clockid_t_h
+
+typedef const struct __clockid *clockid_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_dev_t.h b/libc-bottom-half/headers/public/__typedef_dev_t.h
new file mode 100644
index 0000000..353e94f
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_dev_t.h
@@ -0,0 +1,7 @@
+#ifndef __wasilibc___typedef_dev_t_h
+#define __wasilibc___typedef_dev_t_h
+
+/* Define these as 64-bit integers to support billions of devices. */
+typedef unsigned long long dev_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_fd_set.h b/libc-bottom-half/headers/public/__typedef_fd_set.h
new file mode 100644
index 0000000..35ea958
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_fd_set.h
@@ -0,0 +1,14 @@
+#ifndef __wasilibc___typedef_fd_set_h
+#define __wasilibc___typedef_fd_set_h
+
+#define __need_size_t
+#include <stddef.h>
+
+#include <__macro_FD_SETSIZE.h>
+
+typedef struct {
+ size_t __nfds;
+ int __fds[FD_SETSIZE];
+} fd_set;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_gid_t.h b/libc-bottom-half/headers/public/__typedef_gid_t.h
new file mode 100644
index 0000000..6eb82f2
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_gid_t.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc___typedef_gid_t_h
+#define __wasilibc___typedef_gid_t_h
+
+typedef unsigned gid_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_in_addr_t.h b/libc-bottom-half/headers/public/__typedef_in_addr_t.h
new file mode 100644
index 0000000..68ab512
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_in_addr_t.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc___typedef_in_addr_t_h
+#define __wasilibc___typedef_in_addr_t_h
+
+typedef unsigned in_addr_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_in_port_t.h b/libc-bottom-half/headers/public/__typedef_in_port_t.h
new file mode 100644
index 0000000..890a2c8
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_in_port_t.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc___typedef_in_port_t_h
+#define __wasilibc___typedef_in_port_t_h
+
+typedef unsigned short in_port_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_ino_t.h b/libc-bottom-half/headers/public/__typedef_ino_t.h
new file mode 100644
index 0000000..f3e11e4
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_ino_t.h
@@ -0,0 +1,7 @@
+#ifndef __wasilibc___typedef_ino_t_h
+#define __wasilibc___typedef_ino_t_h
+
+/* Define these as 64-bit integers to support billions of inodes. */
+typedef unsigned long long ino_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_mode_t.h b/libc-bottom-half/headers/public/__typedef_mode_t.h
new file mode 100644
index 0000000..51b927d
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_mode_t.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc___typedef_mode_t_h
+#define __wasilibc___typedef_mode_t_h
+
+typedef unsigned mode_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_nfds_t.h b/libc-bottom-half/headers/public/__typedef_nfds_t.h
new file mode 100644
index 0000000..ea0a93e
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_nfds_t.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc___typedef_nfds_t_h
+#define __wasilibc___typedef_nfds_t_h
+
+typedef unsigned long nfds_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_nlink_t.h b/libc-bottom-half/headers/public/__typedef_nlink_t.h
new file mode 100644
index 0000000..ae34c79
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_nlink_t.h
@@ -0,0 +1,7 @@
+#ifndef __wasilibc___typedef_nlink_t_h
+#define __wasilibc___typedef_nlink_t_h
+
+/* Define these as 64-bit unsigned integers to support billions of links. */
+typedef unsigned long long nlink_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_off_t.h b/libc-bottom-half/headers/public/__typedef_off_t.h
new file mode 100644
index 0000000..115ffdd
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_off_t.h
@@ -0,0 +1,7 @@
+#ifndef __wasilibc___typedef_off_t_h
+#define __wasilibc___typedef_off_t_h
+
+/* Define these as 64-bit signed integers to support files larger than 2 GiB. */
+typedef long long off_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_sa_family_t.h b/libc-bottom-half/headers/public/__typedef_sa_family_t.h
new file mode 100644
index 0000000..0ad18c9
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_sa_family_t.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc___typedef_sa_family_t_h
+#define __wasilibc___typedef_sa_family_t_h
+
+typedef unsigned short sa_family_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_sigset_t.h b/libc-bottom-half/headers/public/__typedef_sigset_t.h
new file mode 100644
index 0000000..f7e4867
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_sigset_t.h
@@ -0,0 +1,7 @@
+#ifndef __wasilibc___typedef_sigset_t_h
+#define __wasilibc___typedef_sigset_t_h
+
+/* TODO: This is just a placeholder for now. Keep this in sync with musl. */
+typedef unsigned char sigset_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_socklen_t.h b/libc-bottom-half/headers/public/__typedef_socklen_t.h
new file mode 100644
index 0000000..bd68e55
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_socklen_t.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc___typedef_socklen_t_h
+#define __wasilibc___typedef_socklen_t_h
+
+typedef unsigned socklen_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_ssize_t.h b/libc-bottom-half/headers/public/__typedef_ssize_t.h
new file mode 100644
index 0000000..25dc15a
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_ssize_t.h
@@ -0,0 +1,7 @@
+#ifndef __wasilibc___typedef_ssize_t_h
+#define __wasilibc___typedef_ssize_t_h
+
+/* This is defined to be the same size as size_t. */
+typedef long ssize_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_suseconds_t.h b/libc-bottom-half/headers/public/__typedef_suseconds_t.h
new file mode 100644
index 0000000..92667e2
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_suseconds_t.h
@@ -0,0 +1,8 @@
+#ifndef __wasilibc___typedef_suseconds_t_h
+#define __wasilibc___typedef_suseconds_t_h
+
+/* Define this to be 64-bit as its main use is in struct timeval where the
+ extra space would otherwise be padding. */
+typedef long long suseconds_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_time_t.h b/libc-bottom-half/headers/public/__typedef_time_t.h
new file mode 100644
index 0000000..6ee0f86
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_time_t.h
@@ -0,0 +1,7 @@
+#ifndef __wasilibc___typedef_time_t_h
+#define __wasilibc___typedef_time_t_h
+
+/* Define this as a 64-bit signed integer to avoid the 2038 bug. */
+typedef long long time_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/__typedef_uid_t.h b/libc-bottom-half/headers/public/__typedef_uid_t.h
new file mode 100644
index 0000000..c9da300
--- /dev/null
+++ b/libc-bottom-half/headers/public/__typedef_uid_t.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc___typedef_uid_t_h
+#define __wasilibc___typedef_uid_t_h
+
+typedef unsigned uid_t;
+
+#endif
diff --git a/libc-bottom-half/headers/public/dirent.h b/libc-bottom-half/headers/public/dirent.h
new file mode 100644
index 0000000..ce1364a
--- /dev/null
+++ b/libc-bottom-half/headers/public/dirent.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc_dirent_h
+#define __wasilibc_dirent_h
+
+/*
+ * Include the real implementation, which is factored into a separate file so
+ * that it can be reused by other libc dirent implementations.
+ */
+#include <__header_dirent.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/errno.h b/libc-bottom-half/headers/public/errno.h
new file mode 100644
index 0000000..f3914ee
--- /dev/null
+++ b/libc-bottom-half/headers/public/errno.h
@@ -0,0 +1,7 @@
+#ifndef __wasilibc_errno_h
+#define __wasilibc_errno_h
+
+#include <__errno.h>
+#include <__errno_values.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/fcntl.h b/libc-bottom-half/headers/public/fcntl.h
new file mode 100644
index 0000000..0ca3e86
--- /dev/null
+++ b/libc-bottom-half/headers/public/fcntl.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc_fcntl_h
+#define __wasilibc_fcntl_h
+
+/*
+ * Include the real implementation, which is factored into a separate file so
+ * that it can be reused by other libc fcntl implementations.
+ */
+#include <__header_fcntl.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/inttypes.h b/libc-bottom-half/headers/public/inttypes.h
new file mode 100644
index 0000000..a237857
--- /dev/null
+++ b/libc-bottom-half/headers/public/inttypes.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc_inttypes_h
+#define __wasilibc_inttypes_h
+
+/*
+ * Include the real implementation, which is factored into a separate file so
+ * that it can be reused by other libc stdlib implementations.
+ */
+#include <__header_inttypes.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/netinet/in.h b/libc-bottom-half/headers/public/netinet/in.h
new file mode 100644
index 0000000..b27bffe
--- /dev/null
+++ b/libc-bottom-half/headers/public/netinet/in.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc_netinet_in_h
+#define __wasilibc_netinet_in_h
+
+#include <__header_netinet_in.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/poll.h b/libc-bottom-half/headers/public/poll.h
new file mode 100644
index 0000000..22f4b6c
--- /dev/null
+++ b/libc-bottom-half/headers/public/poll.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc_poll_h
+#define __wasilibc_poll_h
+
+/*
+ * Include the real implementation, which is factored into a separate file so
+ * that it can be reused by other libc poll implementations.
+ */
+#include <__header_poll.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/stdlib.h b/libc-bottom-half/headers/public/stdlib.h
new file mode 100644
index 0000000..8425cb8
--- /dev/null
+++ b/libc-bottom-half/headers/public/stdlib.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc_stdlib_h
+#define __wasilibc_stdlib_h
+
+/*
+ * Include the real implementation, which is factored into a separate file so
+ * that it can be reused by other libc stdlib implementations.
+ */
+#include <__functions_malloc.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/string.h b/libc-bottom-half/headers/public/string.h
new file mode 100644
index 0000000..fee51ef
--- /dev/null
+++ b/libc-bottom-half/headers/public/string.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc_string_h
+#define __wasilibc_string_h
+
+/*
+ * Include the real implementation, which is factored into a separate file so
+ * that it can be reused by other libc string implementations.
+ */
+#include <__header_string.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/sys/ioctl.h b/libc-bottom-half/headers/public/sys/ioctl.h
new file mode 100644
index 0000000..085b314
--- /dev/null
+++ b/libc-bottom-half/headers/public/sys/ioctl.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc_sys_ioctl_h
+#define __wasilibc_sys_ioctl_h
+
+/*
+ * Include the real implementation, which is factored into a separate file so
+ * that it can be reused by other libc ioctl implementations.
+ */
+#include <__header_sys_ioctl.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/sys/resource.h b/libc-bottom-half/headers/public/sys/resource.h
new file mode 100644
index 0000000..5896861
--- /dev/null
+++ b/libc-bottom-half/headers/public/sys/resource.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc_sys_resource_h
+#define __wasilibc_sys_resource_h
+
+/*
+ * Include the real implementation, which is factored into a separate file so
+ * that it can be reused by other libc resource implementations.
+ */
+#include <__header_sys_resource.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/sys/select.h b/libc-bottom-half/headers/public/sys/select.h
new file mode 100644
index 0000000..7570f14
--- /dev/null
+++ b/libc-bottom-half/headers/public/sys/select.h
@@ -0,0 +1,18 @@
+#ifndef __wasilibc_sys_select_h
+#define __wasilibc_sys_select_h
+
+#include <__fd_set.h>
+#include <__struct_timespec.h>
+#include <__struct_timeval.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int pselect(int, fd_set *, fd_set *, fd_set *, const struct timespec *, const sigset_t *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/sys/socket.h b/libc-bottom-half/headers/public/sys/socket.h
new file mode 100644
index 0000000..874f605
--- /dev/null
+++ b/libc-bottom-half/headers/public/sys/socket.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc_sys_socket_h
+#define __wasilibc_sys_socket_h
+
+#include <__header_sys_socket.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/sys/stat.h b/libc-bottom-half/headers/public/sys/stat.h
new file mode 100644
index 0000000..586b41f
--- /dev/null
+++ b/libc-bottom-half/headers/public/sys/stat.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc_sys_stat_h
+#define __wasilibc_sys_stat_h
+
+/*
+ * Include the real implementation, which is factored into a separate file so
+ * that it can be reused by other libc stat implementations.
+ */
+#include <__header_sys_stat.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/sys/time.h b/libc-bottom-half/headers/public/sys/time.h
new file mode 100644
index 0000000..3ee0b3b
--- /dev/null
+++ b/libc-bottom-half/headers/public/sys/time.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc_sys_time_h
+#define __wasilibc_sys_time_h
+
+#include <__struct_timeval.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/sys/times.h b/libc-bottom-half/headers/public/sys/times.h
new file mode 100644
index 0000000..986bc0d
--- /dev/null
+++ b/libc-bottom-half/headers/public/sys/times.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc_sys_times_h
+#define __wasilibc_sys_times_h
+
+#include <__struct_tms.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/sys/types.h b/libc-bottom-half/headers/public/sys/types.h
new file mode 100644
index 0000000..3bce96f
--- /dev/null
+++ b/libc-bottom-half/headers/public/sys/types.h
@@ -0,0 +1,16 @@
+#ifndef __wasilibc_sys_types_h
+#define __wasilibc_sys_types_h
+
+#define __need_size_t
+#include <stddef.h>
+
+#include <__typedef_clock_t.h>
+#include <__typedef_time_t.h>
+#include <__typedef_blksize_t.h>
+#include <__typedef_off_t.h>
+#include <__typedef_ssize_t.h>
+#include <__typedef_suseconds_t.h>
+#include <__typedef_nlink_t.h>
+#include <__typedef_clockid_t.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/sys/uio.h b/libc-bottom-half/headers/public/sys/uio.h
new file mode 100644
index 0000000..bb502a1
--- /dev/null
+++ b/libc-bottom-half/headers/public/sys/uio.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc_sys_uio_h
+#define __wasilibc_sys_uio_h
+
+#include <__struct_iovec.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/sys/un.h b/libc-bottom-half/headers/public/sys/un.h
new file mode 100644
index 0000000..997e613
--- /dev/null
+++ b/libc-bottom-half/headers/public/sys/un.h
@@ -0,0 +1,6 @@
+#ifndef __wasilibc_sys_un_h
+#define __wasilibc_sys_un_h
+
+#include <__struct_sockaddr_un.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/time.h b/libc-bottom-half/headers/public/time.h
new file mode 100644
index 0000000..646e599
--- /dev/null
+++ b/libc-bottom-half/headers/public/time.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc_time_h
+#define __wasilibc_time_h
+
+/*
+ * Include the real implementation, which is factored into a separate file so
+ * that it can be reused by other libc time implementations.
+ */
+#include <__header_time.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/unistd.h b/libc-bottom-half/headers/public/unistd.h
new file mode 100644
index 0000000..5f8edfa
--- /dev/null
+++ b/libc-bottom-half/headers/public/unistd.h
@@ -0,0 +1,10 @@
+#ifndef __wasilibc_unistd_h
+#define __wasilibc_unistd_h
+
+/*
+ * Include the real implementation, which is factored into a separate file so
+ * that it can be reused by other libc unistd implementations.
+ */
+#include <__header_unistd.h>
+
+#endif
diff --git a/libc-bottom-half/headers/public/wasi/api.h b/libc-bottom-half/headers/public/wasi/api.h
new file mode 100644
index 0000000..1ab7699
--- /dev/null
+++ b/libc-bottom-half/headers/public/wasi/api.h
@@ -0,0 +1,2115 @@
+/**
+ * <wasi/api.h>. This file contains declarations describing the WASI ABI
+ * as of "snapshot preview1". It was originally auto-generated from
+ * wasi_snapshot_preview1.witx, however WASI is in the process of
+ * transitioning to a new IDL and header file generator, and this file
+ * is temporarily being manually maintained.
+ *
+ * @file
+ * This file describes the [WASI] interface, consisting of functions, types,
+ * and defined values (macros).
+ *
+ * The interface described here is greatly inspired by [CloudABI]'s clean,
+ * thoughtfully-designed, capability-oriented, POSIX-style API.
+ *
+ * [CloudABI]: https://github.com/NuxiNL/cloudlibc
+ * [WASI]: https://github.com/WebAssembly/WASI/
+ */
+
+#ifndef __wasi_api_h
+#define __wasi_api_h
+
+#ifndef __wasi__
+#error <wasi/api.h> is only supported on WASI platforms.
+#endif
+
+#ifndef __wasm32__
+#error <wasi/api.h> only supports wasm32; doesn't yet support wasm64
+#endif
+
+#include <stddef.h>
+#include <stdint.h>
+
+_Static_assert(_Alignof(int8_t) == 1, "non-wasi data layout");
+_Static_assert(_Alignof(uint8_t) == 1, "non-wasi data layout");
+_Static_assert(_Alignof(int16_t) == 2, "non-wasi data layout");
+_Static_assert(_Alignof(uint16_t) == 2, "non-wasi data layout");
+_Static_assert(_Alignof(int32_t) == 4, "non-wasi data layout");
+_Static_assert(_Alignof(uint32_t) == 4, "non-wasi data layout");
+_Static_assert(_Alignof(int64_t) == 8, "non-wasi data layout");
+_Static_assert(_Alignof(uint64_t) == 8, "non-wasi data layout");
+_Static_assert(_Alignof(void*) == 4, "non-wasi data layout");
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// TODO: Encoding this in witx.
+#define __WASI_DIRCOOKIE_START (UINT64_C(0))
+typedef __SIZE_TYPE__ __wasi_size_t;
+
+_Static_assert(sizeof(__wasi_size_t) == 4, "witx calculated size");
+_Static_assert(_Alignof(__wasi_size_t) == 4, "witx calculated align");
+
+/**
+ * Non-negative file size or length of a region within a file.
+ */
+typedef uint64_t __wasi_filesize_t;
+
+_Static_assert(sizeof(__wasi_filesize_t) == 8, "witx calculated size");
+_Static_assert(_Alignof(__wasi_filesize_t) == 8, "witx calculated align");
+
+/**
+ * Timestamp in nanoseconds.
+ */
+typedef uint64_t __wasi_timestamp_t;
+
+_Static_assert(sizeof(__wasi_timestamp_t) == 8, "witx calculated size");
+_Static_assert(_Alignof(__wasi_timestamp_t) == 8, "witx calculated align");
+
+/**
+ * Identifiers for clocks.
+ */
+typedef uint32_t __wasi_clockid_t;
+
+/**
+ * The clock measuring real time. Time value zero corresponds with
+ * 1970-01-01T00:00:00Z.
+ */
+#define __WASI_CLOCKID_REALTIME (UINT32_C(0))
+
+/**
+ * The store-wide monotonic clock, which is defined as a clock measuring
+ * real time, whose value cannot be adjusted and which cannot have negative
+ * clock jumps. The epoch of this clock is undefined. The absolute time
+ * value of this clock therefore has no meaning.
+ */
+#define __WASI_CLOCKID_MONOTONIC (UINT32_C(1))
+
+/**
+ * The CPU-time clock associated with the current process.
+ */
+#define __WASI_CLOCKID_PROCESS_CPUTIME_ID (UINT32_C(2))
+
+/**
+ * The CPU-time clock associated with the current thread.
+ */
+#define __WASI_CLOCKID_THREAD_CPUTIME_ID (UINT32_C(3))
+
+_Static_assert(sizeof(__wasi_clockid_t) == 4, "witx calculated size");
+_Static_assert(_Alignof(__wasi_clockid_t) == 4, "witx calculated align");
+
+/**
+ * Error codes returned by functions.
+ * Not all of these error codes are returned by the functions provided by this
+ * API; some are used in higher-level library layers, and others are provided
+ * merely for alignment with POSIX.
+ */
+typedef uint16_t __wasi_errno_t;
+
+/**
+ * No error occurred. System call completed successfully.
+ */
+#define __WASI_ERRNO_SUCCESS (UINT16_C(0))
+
+/**
+ * Argument list too long.
+ */
+#define __WASI_ERRNO_2BIG (UINT16_C(1))
+
+/**
+ * Permission denied.
+ */
+#define __WASI_ERRNO_ACCES (UINT16_C(2))
+
+/**
+ * Address in use.
+ */
+#define __WASI_ERRNO_ADDRINUSE (UINT16_C(3))
+
+/**
+ * Address not available.
+ */
+#define __WASI_ERRNO_ADDRNOTAVAIL (UINT16_C(4))
+
+/**
+ * Address family not supported.
+ */
+#define __WASI_ERRNO_AFNOSUPPORT (UINT16_C(5))
+
+/**
+ * Resource unavailable, or operation would block.
+ */
+#define __WASI_ERRNO_AGAIN (UINT16_C(6))
+
+/**
+ * Connection already in progress.
+ */
+#define __WASI_ERRNO_ALREADY (UINT16_C(7))
+
+/**
+ * Bad file descriptor.
+ */
+#define __WASI_ERRNO_BADF (UINT16_C(8))
+
+/**
+ * Bad message.
+ */
+#define __WASI_ERRNO_BADMSG (UINT16_C(9))
+
+/**
+ * Device or resource busy.
+ */
+#define __WASI_ERRNO_BUSY (UINT16_C(10))
+
+/**
+ * Operation canceled.
+ */
+#define __WASI_ERRNO_CANCELED (UINT16_C(11))
+
+/**
+ * No child processes.
+ */
+#define __WASI_ERRNO_CHILD (UINT16_C(12))
+
+/**
+ * Connection aborted.
+ */
+#define __WASI_ERRNO_CONNABORTED (UINT16_C(13))
+
+/**
+ * Connection refused.
+ */
+#define __WASI_ERRNO_CONNREFUSED (UINT16_C(14))
+
+/**
+ * Connection reset.
+ */
+#define __WASI_ERRNO_CONNRESET (UINT16_C(15))
+
+/**
+ * Resource deadlock would occur.
+ */
+#define __WASI_ERRNO_DEADLK (UINT16_C(16))
+
+/**
+ * Destination address required.
+ */
+#define __WASI_ERRNO_DESTADDRREQ (UINT16_C(17))
+
+/**
+ * Mathematics argument out of domain of function.
+ */
+#define __WASI_ERRNO_DOM (UINT16_C(18))
+
+/**
+ * Reserved.
+ */
+#define __WASI_ERRNO_DQUOT (UINT16_C(19))
+
+/**
+ * File exists.
+ */
+#define __WASI_ERRNO_EXIST (UINT16_C(20))
+
+/**
+ * Bad address.
+ */
+#define __WASI_ERRNO_FAULT (UINT16_C(21))
+
+/**
+ * File too large.
+ */
+#define __WASI_ERRNO_FBIG (UINT16_C(22))
+
+/**
+ * Host is unreachable.
+ */
+#define __WASI_ERRNO_HOSTUNREACH (UINT16_C(23))
+
+/**
+ * Identifier removed.
+ */
+#define __WASI_ERRNO_IDRM (UINT16_C(24))
+
+/**
+ * Illegal byte sequence.
+ */
+#define __WASI_ERRNO_ILSEQ (UINT16_C(25))
+
+/**
+ * Operation in progress.
+ */
+#define __WASI_ERRNO_INPROGRESS (UINT16_C(26))
+
+/**
+ * Interrupted function.
+ */
+#define __WASI_ERRNO_INTR (UINT16_C(27))
+
+/**
+ * Invalid argument.
+ */
+#define __WASI_ERRNO_INVAL (UINT16_C(28))
+
+/**
+ * I/O error.
+ */
+#define __WASI_ERRNO_IO (UINT16_C(29))
+
+/**
+ * Socket is connected.
+ */
+#define __WASI_ERRNO_ISCONN (UINT16_C(30))
+
+/**
+ * Is a directory.
+ */
+#define __WASI_ERRNO_ISDIR (UINT16_C(31))
+
+/**
+ * Too many levels of symbolic links.
+ */
+#define __WASI_ERRNO_LOOP (UINT16_C(32))
+
+/**
+ * File descriptor value too large.
+ */
+#define __WASI_ERRNO_MFILE (UINT16_C(33))
+
+/**
+ * Too many links.
+ */
+#define __WASI_ERRNO_MLINK (UINT16_C(34))
+
+/**
+ * Message too large.
+ */
+#define __WASI_ERRNO_MSGSIZE (UINT16_C(35))
+
+/**
+ * Reserved.
+ */
+#define __WASI_ERRNO_MULTIHOP (UINT16_C(36))
+
+/**
+ * Filename too long.
+ */
+#define __WASI_ERRNO_NAMETOOLONG (UINT16_C(37))
+
+/**
+ * Network is down.
+ */
+#define __WASI_ERRNO_NETDOWN (UINT16_C(38))
+
+/**
+ * Connection aborted by network.
+ */
+#define __WASI_ERRNO_NETRESET (UINT16_C(39))
+
+/**
+ * Network unreachable.
+ */
+#define __WASI_ERRNO_NETUNREACH (UINT16_C(40))
+
+/**
+ * Too many files open in system.
+ */
+#define __WASI_ERRNO_NFILE (UINT16_C(41))
+
+/**
+ * No buffer space available.
+ */
+#define __WASI_ERRNO_NOBUFS (UINT16_C(42))
+
+/**
+ * No such device.
+ */
+#define __WASI_ERRNO_NODEV (UINT16_C(43))
+
+/**
+ * No such file or directory.
+ */
+#define __WASI_ERRNO_NOENT (UINT16_C(44))
+
+/**
+ * Executable file format error.
+ */
+#define __WASI_ERRNO_NOEXEC (UINT16_C(45))
+
+/**
+ * No locks available.
+ */
+#define __WASI_ERRNO_NOLCK (UINT16_C(46))
+
+/**
+ * Reserved.
+ */
+#define __WASI_ERRNO_NOLINK (UINT16_C(47))
+
+/**
+ * Not enough space.
+ */
+#define __WASI_ERRNO_NOMEM (UINT16_C(48))
+
+/**
+ * No message of the desired type.
+ */
+#define __WASI_ERRNO_NOMSG (UINT16_C(49))
+
+/**
+ * Protocol not available.
+ */
+#define __WASI_ERRNO_NOPROTOOPT (UINT16_C(50))
+
+/**
+ * No space left on device.
+ */
+#define __WASI_ERRNO_NOSPC (UINT16_C(51))
+
+/**
+ * Function not supported.
+ */
+#define __WASI_ERRNO_NOSYS (UINT16_C(52))
+
+/**
+ * The socket is not connected.
+ */
+#define __WASI_ERRNO_NOTCONN (UINT16_C(53))
+
+/**
+ * Not a directory or a symbolic link to a directory.
+ */
+#define __WASI_ERRNO_NOTDIR (UINT16_C(54))
+
+/**
+ * Directory not empty.
+ */
+#define __WASI_ERRNO_NOTEMPTY (UINT16_C(55))
+
+/**
+ * State not recoverable.
+ */
+#define __WASI_ERRNO_NOTRECOVERABLE (UINT16_C(56))
+
+/**
+ * Not a socket.
+ */
+#define __WASI_ERRNO_NOTSOCK (UINT16_C(57))
+
+/**
+ * Not supported, or operation not supported on socket.
+ */
+#define __WASI_ERRNO_NOTSUP (UINT16_C(58))
+
+/**
+ * Inappropriate I/O control operation.
+ */
+#define __WASI_ERRNO_NOTTY (UINT16_C(59))
+
+/**
+ * No such device or address.
+ */
+#define __WASI_ERRNO_NXIO (UINT16_C(60))
+
+/**
+ * Value too large to be stored in data type.
+ */
+#define __WASI_ERRNO_OVERFLOW (UINT16_C(61))
+
+/**
+ * Previous owner died.
+ */
+#define __WASI_ERRNO_OWNERDEAD (UINT16_C(62))
+
+/**
+ * Operation not permitted.
+ */
+#define __WASI_ERRNO_PERM (UINT16_C(63))
+
+/**
+ * Broken pipe.
+ */
+#define __WASI_ERRNO_PIPE (UINT16_C(64))
+
+/**
+ * Protocol error.
+ */
+#define __WASI_ERRNO_PROTO (UINT16_C(65))
+
+/**
+ * Protocol not supported.
+ */
+#define __WASI_ERRNO_PROTONOSUPPORT (UINT16_C(66))
+
+/**
+ * Protocol wrong type for socket.
+ */
+#define __WASI_ERRNO_PROTOTYPE (UINT16_C(67))
+
+/**
+ * Result too large.
+ */
+#define __WASI_ERRNO_RANGE (UINT16_C(68))
+
+/**
+ * Read-only file system.
+ */
+#define __WASI_ERRNO_ROFS (UINT16_C(69))
+
+/**
+ * Invalid seek.
+ */
+#define __WASI_ERRNO_SPIPE (UINT16_C(70))
+
+/**
+ * No such process.
+ */
+#define __WASI_ERRNO_SRCH (UINT16_C(71))
+
+/**
+ * Reserved.
+ */
+#define __WASI_ERRNO_STALE (UINT16_C(72))
+
+/**
+ * Connection timed out.
+ */
+#define __WASI_ERRNO_TIMEDOUT (UINT16_C(73))
+
+/**
+ * Text file busy.
+ */
+#define __WASI_ERRNO_TXTBSY (UINT16_C(74))
+
+/**
+ * Cross-device link.
+ */
+#define __WASI_ERRNO_XDEV (UINT16_C(75))
+
+/**
+ * Extension: Capabilities insufficient.
+ */
+#define __WASI_ERRNO_NOTCAPABLE (UINT16_C(76))
+
+_Static_assert(sizeof(__wasi_errno_t) == 2, "witx calculated size");
+_Static_assert(_Alignof(__wasi_errno_t) == 2, "witx calculated align");
+
+/**
+ * File descriptor rights, determining which actions may be performed.
+ */
+typedef uint64_t __wasi_rights_t;
+
+/**
+ * The right to invoke `fd_datasync`.
+ * If `path_open` is set, includes the right to invoke
+ * `path_open` with `fdflags::dsync`.
+ */
+#define __WASI_RIGHTS_FD_DATASYNC ((__wasi_rights_t)(1 << 0))
+
+/**
+ * The right to invoke `fd_read` and `sock_recv`.
+ * If `rights::fd_seek` is set, includes the right to invoke `fd_pread`.
+ */
+#define __WASI_RIGHTS_FD_READ ((__wasi_rights_t)(1 << 1))
+
+/**
+ * The right to invoke `fd_seek`. This flag implies `rights::fd_tell`.
+ */
+#define __WASI_RIGHTS_FD_SEEK ((__wasi_rights_t)(1 << 2))
+
+/**
+ * The right to invoke `fd_fdstat_set_flags`.
+ */
+#define __WASI_RIGHTS_FD_FDSTAT_SET_FLAGS ((__wasi_rights_t)(1 << 3))
+
+/**
+ * The right to invoke `fd_sync`.
+ * If `path_open` is set, includes the right to invoke
+ * `path_open` with `fdflags::rsync` and `fdflags::dsync`.
+ */
+#define __WASI_RIGHTS_FD_SYNC ((__wasi_rights_t)(1 << 4))
+
+/**
+ * The right to invoke `fd_seek` in such a way that the file offset
+ * remains unaltered (i.e., `whence::cur` with offset zero), or to
+ * invoke `fd_tell`.
+ */
+#define __WASI_RIGHTS_FD_TELL ((__wasi_rights_t)(1 << 5))
+
+/**
+ * The right to invoke `fd_write` and `sock_send`.
+ * If `rights::fd_seek` is set, includes the right to invoke `fd_pwrite`.
+ */
+#define __WASI_RIGHTS_FD_WRITE ((__wasi_rights_t)(1 << 6))
+
+/**
+ * The right to invoke `fd_advise`.
+ */
+#define __WASI_RIGHTS_FD_ADVISE ((__wasi_rights_t)(1 << 7))
+
+/**
+ * The right to invoke `fd_allocate`.
+ */
+#define __WASI_RIGHTS_FD_ALLOCATE ((__wasi_rights_t)(1 << 8))
+
+/**
+ * The right to invoke `path_create_directory`.
+ */
+#define __WASI_RIGHTS_PATH_CREATE_DIRECTORY ((__wasi_rights_t)(1 << 9))
+
+/**
+ * If `path_open` is set, the right to invoke `path_open` with `oflags::creat`.
+ */
+#define __WASI_RIGHTS_PATH_CREATE_FILE ((__wasi_rights_t)(1 << 10))
+
+/**
+ * The right to invoke `path_link` with the file descriptor as the
+ * source directory.
+ */
+#define __WASI_RIGHTS_PATH_LINK_SOURCE ((__wasi_rights_t)(1 << 11))
+
+/**
+ * The right to invoke `path_link` with the file descriptor as the
+ * target directory.
+ */
+#define __WASI_RIGHTS_PATH_LINK_TARGET ((__wasi_rights_t)(1 << 12))
+
+/**
+ * The right to invoke `path_open`.
+ */
+#define __WASI_RIGHTS_PATH_OPEN ((__wasi_rights_t)(1 << 13))
+
+/**
+ * The right to invoke `fd_readdir`.
+ */
+#define __WASI_RIGHTS_FD_READDIR ((__wasi_rights_t)(1 << 14))
+
+/**
+ * The right to invoke `path_readlink`.
+ */
+#define __WASI_RIGHTS_PATH_READLINK ((__wasi_rights_t)(1 << 15))
+
+/**
+ * The right to invoke `path_rename` with the file descriptor as the source directory.
+ */
+#define __WASI_RIGHTS_PATH_RENAME_SOURCE ((__wasi_rights_t)(1 << 16))
+
+/**
+ * The right to invoke `path_rename` with the file descriptor as the target directory.
+ */
+#define __WASI_RIGHTS_PATH_RENAME_TARGET ((__wasi_rights_t)(1 << 17))
+
+/**
+ * The right to invoke `path_filestat_get`.
+ */
+#define __WASI_RIGHTS_PATH_FILESTAT_GET ((__wasi_rights_t)(1 << 18))
+
+/**
+ * The right to change a file's size (there is no `path_filestat_set_size`).
+ * If `path_open` is set, includes the right to invoke `path_open` with `oflags::trunc`.
+ */
+#define __WASI_RIGHTS_PATH_FILESTAT_SET_SIZE ((__wasi_rights_t)(1 << 19))
+
+/**
+ * The right to invoke `path_filestat_set_times`.
+ */
+#define __WASI_RIGHTS_PATH_FILESTAT_SET_TIMES ((__wasi_rights_t)(1 << 20))
+
+/**
+ * The right to invoke `fd_filestat_get`.
+ */
+#define __WASI_RIGHTS_FD_FILESTAT_GET ((__wasi_rights_t)(1 << 21))
+
+/**
+ * The right to invoke `fd_filestat_set_size`.
+ */
+#define __WASI_RIGHTS_FD_FILESTAT_SET_SIZE ((__wasi_rights_t)(1 << 22))
+
+/**
+ * The right to invoke `fd_filestat_set_times`.
+ */
+#define __WASI_RIGHTS_FD_FILESTAT_SET_TIMES ((__wasi_rights_t)(1 << 23))
+
+/**
+ * The right to invoke `path_symlink`.
+ */
+#define __WASI_RIGHTS_PATH_SYMLINK ((__wasi_rights_t)(1 << 24))
+
+/**
+ * The right to invoke `path_remove_directory`.
+ */
+#define __WASI_RIGHTS_PATH_REMOVE_DIRECTORY ((__wasi_rights_t)(1 << 25))
+
+/**
+ * The right to invoke `path_unlink_file`.
+ */
+#define __WASI_RIGHTS_PATH_UNLINK_FILE ((__wasi_rights_t)(1 << 26))
+
+/**
+ * If `rights::fd_read` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype::fd_read`.
+ * If `rights::fd_write` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype::fd_write`.
+ */
+#define __WASI_RIGHTS_POLL_FD_READWRITE ((__wasi_rights_t)(1 << 27))
+
+/**
+ * The right to invoke `sock_shutdown`.
+ */
+#define __WASI_RIGHTS_SOCK_SHUTDOWN ((__wasi_rights_t)(1 << 28))
+
+/**
+ * The right to invoke `sock_accept`.
+ */
+#define __WASI_RIGHTS_SOCK_ACCEPT ((__wasi_rights_t)(1 << 29))
+
+/**
+ * A file descriptor handle.
+ */
+typedef int __wasi_fd_t;
+
+_Static_assert(sizeof(__wasi_fd_t) == 4, "witx calculated size");
+_Static_assert(_Alignof(__wasi_fd_t) == 4, "witx calculated align");
+
+/**
+ * A region of memory for scatter/gather reads.
+ */
+typedef struct __wasi_iovec_t {
+ /**
+ * The address of the buffer to be filled.
+ */
+ uint8_t * buf;
+
+ /**
+ * The length of the buffer to be filled.
+ */
+ __wasi_size_t buf_len;
+
+} __wasi_iovec_t;
+
+_Static_assert(sizeof(__wasi_iovec_t) == 8, "witx calculated size");
+_Static_assert(_Alignof(__wasi_iovec_t) == 4, "witx calculated align");
+_Static_assert(offsetof(__wasi_iovec_t, buf) == 0, "witx calculated offset");
+_Static_assert(offsetof(__wasi_iovec_t, buf_len) == 4, "witx calculated offset");
+
+/**
+ * A region of memory for scatter/gather writes.
+ */
+typedef struct __wasi_ciovec_t {
+ /**
+ * The address of the buffer to be written.
+ */
+ const uint8_t * buf;
+
+ /**
+ * The length of the buffer to be written.
+ */
+ __wasi_size_t buf_len;
+
+} __wasi_ciovec_t;
+
+_Static_assert(sizeof(__wasi_ciovec_t) == 8, "witx calculated size");
+_Static_assert(_Alignof(__wasi_ciovec_t) == 4, "witx calculated align");
+_Static_assert(offsetof(__wasi_ciovec_t, buf) == 0, "witx calculated offset");
+_Static_assert(offsetof(__wasi_ciovec_t, buf_len) == 4, "witx calculated offset");
+
+/**
+ * Relative offset within a file.
+ */
+typedef int64_t __wasi_filedelta_t;
+
+_Static_assert(sizeof(__wasi_filedelta_t) == 8, "witx calculated size");
+_Static_assert(_Alignof(__wasi_filedelta_t) == 8, "witx calculated align");
+
+/**
+ * The position relative to which to set the offset of the file descriptor.
+ */
+typedef uint8_t __wasi_whence_t;
+
+/**
+ * Seek relative to start-of-file.
+ */
+#define __WASI_WHENCE_SET (UINT8_C(0))
+
+/**
+ * Seek relative to current position.
+ */
+#define __WASI_WHENCE_CUR (UINT8_C(1))
+
+/**
+ * Seek relative to end-of-file.
+ */
+#define __WASI_WHENCE_END (UINT8_C(2))
+
+_Static_assert(sizeof(__wasi_whence_t) == 1, "witx calculated size");
+_Static_assert(_Alignof(__wasi_whence_t) == 1, "witx calculated align");
+
+/**
+ * A reference to the offset of a directory entry.
+ *
+ * The value 0 signifies the start of the directory.
+ */
+typedef uint64_t __wasi_dircookie_t;
+
+_Static_assert(sizeof(__wasi_dircookie_t) == 8, "witx calculated size");
+_Static_assert(_Alignof(__wasi_dircookie_t) == 8, "witx calculated align");
+
+/**
+ * The type for the `dirent::d_namlen` field of `dirent` struct.
+ */
+typedef uint32_t __wasi_dirnamlen_t;
+
+_Static_assert(sizeof(__wasi_dirnamlen_t) == 4, "witx calculated size");
+_Static_assert(_Alignof(__wasi_dirnamlen_t) == 4, "witx calculated align");
+
+/**
+ * File serial number that is unique within its file system.
+ */
+typedef uint64_t __wasi_inode_t;
+
+_Static_assert(sizeof(__wasi_inode_t) == 8, "witx calculated size");
+_Static_assert(_Alignof(__wasi_inode_t) == 8, "witx calculated align");
+
+/**
+ * The type of a file descriptor or file.
+ */
+typedef uint8_t __wasi_filetype_t;
+
+/**
+ * The type of the file descriptor or file is unknown or is different from any of the other types specified.
+ */
+#define __WASI_FILETYPE_UNKNOWN (UINT8_C(0))
+
+/**
+ * The file descriptor or file refers to a block device inode.
+ */
+#define __WASI_FILETYPE_BLOCK_DEVICE (UINT8_C(1))
+
+/**
+ * The file descriptor or file refers to a character device inode.
+ */
+#define __WASI_FILETYPE_CHARACTER_DEVICE (UINT8_C(2))
+
+/**
+ * The file descriptor or file refers to a directory inode.
+ */
+#define __WASI_FILETYPE_DIRECTORY (UINT8_C(3))
+
+/**
+ * The file descriptor or file refers to a regular file inode.
+ */
+#define __WASI_FILETYPE_REGULAR_FILE (UINT8_C(4))
+
+/**
+ * The file descriptor or file refers to a datagram socket.
+ */
+#define __WASI_FILETYPE_SOCKET_DGRAM (UINT8_C(5))
+
+/**
+ * The file descriptor or file refers to a byte-stream socket.
+ */
+#define __WASI_FILETYPE_SOCKET_STREAM (UINT8_C(6))
+
+/**
+ * The file refers to a symbolic link inode.
+ */
+#define __WASI_FILETYPE_SYMBOLIC_LINK (UINT8_C(7))
+
+_Static_assert(sizeof(__wasi_filetype_t) == 1, "witx calculated size");
+_Static_assert(_Alignof(__wasi_filetype_t) == 1, "witx calculated align");
+
+/**
+ * A directory entry.
+ */
+typedef struct __wasi_dirent_t {
+ /**
+ * The offset of the next directory entry stored in this directory.
+ */
+ __wasi_dircookie_t d_next;
+
+ /**
+ * The serial number of the file referred to by this directory entry.
+ */
+ __wasi_inode_t d_ino;
+
+ /**
+ * The length of the name of the directory entry.
+ */
+ __wasi_dirnamlen_t d_namlen;
+
+ /**
+ * The type of the file referred to by this directory entry.
+ */
+ __wasi_filetype_t d_type;
+
+} __wasi_dirent_t;
+
+_Static_assert(sizeof(__wasi_dirent_t) == 24, "witx calculated size");
+_Static_assert(_Alignof(__wasi_dirent_t) == 8, "witx calculated align");
+_Static_assert(offsetof(__wasi_dirent_t, d_next) == 0, "witx calculated offset");
+_Static_assert(offsetof(__wasi_dirent_t, d_ino) == 8, "witx calculated offset");
+_Static_assert(offsetof(__wasi_dirent_t, d_namlen) == 16, "witx calculated offset");
+_Static_assert(offsetof(__wasi_dirent_t, d_type) == 20, "witx calculated offset");
+
+/**
+ * File or memory access pattern advisory information.
+ */
+typedef uint8_t __wasi_advice_t;
+
+/**
+ * The application has no advice to give on its behavior with respect to the specified data.
+ */
+#define __WASI_ADVICE_NORMAL (UINT8_C(0))
+
+/**
+ * The application expects to access the specified data sequentially from lower offsets to higher offsets.
+ */
+#define __WASI_ADVICE_SEQUENTIAL (UINT8_C(1))
+
+/**
+ * The application expects to access the specified data in a random order.
+ */
+#define __WASI_ADVICE_RANDOM (UINT8_C(2))
+
+/**
+ * The application expects to access the specified data in the near future.
+ */
+#define __WASI_ADVICE_WILLNEED (UINT8_C(3))
+
+/**
+ * The application expects that it will not access the specified data in the near future.
+ */
+#define __WASI_ADVICE_DONTNEED (UINT8_C(4))
+
+/**
+ * The application expects to access the specified data once and then not reuse it thereafter.
+ */
+#define __WASI_ADVICE_NOREUSE (UINT8_C(5))
+
+_Static_assert(sizeof(__wasi_advice_t) == 1, "witx calculated size");
+_Static_assert(_Alignof(__wasi_advice_t) == 1, "witx calculated align");
+
+/**
+ * File descriptor flags.
+ */
+typedef uint16_t __wasi_fdflags_t;
+
+/**
+ * Append mode: Data written to the file is always appended to the file's end.
+ */
+#define __WASI_FDFLAGS_APPEND ((__wasi_fdflags_t)(1 << 0))
+
+/**
+ * Write according to synchronized I/O data integrity completion. Only the data stored in the file is synchronized.
+ */
+#define __WASI_FDFLAGS_DSYNC ((__wasi_fdflags_t)(1 << 1))
+
+/**
+ * Non-blocking mode.
+ */
+#define __WASI_FDFLAGS_NONBLOCK ((__wasi_fdflags_t)(1 << 2))
+
+/**
+ * Synchronized read I/O operations.
+ */
+#define __WASI_FDFLAGS_RSYNC ((__wasi_fdflags_t)(1 << 3))
+
+/**
+ * Write according to synchronized I/O file integrity completion. In
+ * addition to synchronizing the data stored in the file, the implementation
+ * may also synchronously update the file's metadata.
+ */
+#define __WASI_FDFLAGS_SYNC ((__wasi_fdflags_t)(1 << 4))
+
+/**
+ * File descriptor attributes.
+ */
+typedef struct __wasi_fdstat_t {
+ /**
+ * File type.
+ */
+ __wasi_filetype_t fs_filetype;
+
+ /**
+ * File descriptor flags.
+ */
+ __wasi_fdflags_t fs_flags;
+
+ /**
+ * Rights that apply to this file descriptor.
+ */
+ __wasi_rights_t fs_rights_base;
+
+ /**
+ * Maximum set of rights that may be installed on new file descriptors that
+ * are created through this file descriptor, e.g., through `path_open`.
+ */
+ __wasi_rights_t fs_rights_inheriting;
+
+} __wasi_fdstat_t;
+
+_Static_assert(sizeof(__wasi_fdstat_t) == 24, "witx calculated size");
+_Static_assert(_Alignof(__wasi_fdstat_t) == 8, "witx calculated align");
+_Static_assert(offsetof(__wasi_fdstat_t, fs_filetype) == 0, "witx calculated offset");
+_Static_assert(offsetof(__wasi_fdstat_t, fs_flags) == 2, "witx calculated offset");
+_Static_assert(offsetof(__wasi_fdstat_t, fs_rights_base) == 8, "witx calculated offset");
+_Static_assert(offsetof(__wasi_fdstat_t, fs_rights_inheriting) == 16, "witx calculated offset");
+
+/**
+ * Identifier for a device containing a file system. Can be used in combination
+ * with `inode` to uniquely identify a file or directory in the filesystem.
+ */
+typedef uint64_t __wasi_device_t;
+
+_Static_assert(sizeof(__wasi_device_t) == 8, "witx calculated size");
+_Static_assert(_Alignof(__wasi_device_t) == 8, "witx calculated align");
+
+/**
+ * Which file time attributes to adjust.
+ */
+typedef uint16_t __wasi_fstflags_t;
+
+/**
+ * Adjust the last data access timestamp to the value stored in `filestat::atim`.
+ */
+#define __WASI_FSTFLAGS_ATIM ((__wasi_fstflags_t)(1 << 0))
+
+/**
+ * Adjust the last data access timestamp to the time of clock `clockid::realtime`.
+ */
+#define __WASI_FSTFLAGS_ATIM_NOW ((__wasi_fstflags_t)(1 << 1))
+
+/**
+ * Adjust the last data modification timestamp to the value stored in `filestat::mtim`.
+ */
+#define __WASI_FSTFLAGS_MTIM ((__wasi_fstflags_t)(1 << 2))
+
+/**
+ * Adjust the last data modification timestamp to the time of clock `clockid::realtime`.
+ */
+#define __WASI_FSTFLAGS_MTIM_NOW ((__wasi_fstflags_t)(1 << 3))
+
+/**
+ * Flags determining the method of how paths are resolved.
+ */
+typedef uint32_t __wasi_lookupflags_t;
+
+/**
+ * As long as the resolved path corresponds to a symbolic link, it is expanded.
+ */
+#define __WASI_LOOKUPFLAGS_SYMLINK_FOLLOW ((__wasi_lookupflags_t)(1 << 0))
+
+/**
+ * Open flags used by `path_open`.
+ */
+typedef uint16_t __wasi_oflags_t;
+
+/**
+ * Create file if it does not exist.
+ */
+#define __WASI_OFLAGS_CREAT ((__wasi_oflags_t)(1 << 0))
+
+/**
+ * Fail if not a directory.
+ */
+#define __WASI_OFLAGS_DIRECTORY ((__wasi_oflags_t)(1 << 1))
+
+/**
+ * Fail if file already exists.
+ */
+#define __WASI_OFLAGS_EXCL ((__wasi_oflags_t)(1 << 2))
+
+/**
+ * Truncate file to size 0.
+ */
+#define __WASI_OFLAGS_TRUNC ((__wasi_oflags_t)(1 << 3))
+
+/**
+ * Number of hard links to an inode.
+ */
+typedef uint64_t __wasi_linkcount_t;
+
+_Static_assert(sizeof(__wasi_linkcount_t) == 8, "witx calculated size");
+_Static_assert(_Alignof(__wasi_linkcount_t) == 8, "witx calculated align");
+
+/**
+ * File attributes.
+ */
+typedef struct __wasi_filestat_t {
+ /**
+ * Device ID of device containing the file.
+ */
+ __wasi_device_t dev;
+
+ /**
+ * File serial number.
+ */
+ __wasi_inode_t ino;
+
+ /**
+ * File type.
+ */
+ __wasi_filetype_t filetype;
+
+ /**
+ * Number of hard links to the file.
+ */
+ __wasi_linkcount_t nlink;
+
+ /**
+ * For regular files, the file size in bytes. For symbolic links, the length in bytes of the pathname contained in the symbolic link.
+ */
+ __wasi_filesize_t size;
+
+ /**
+ * Last data access timestamp.
+ */
+ __wasi_timestamp_t atim;
+
+ /**
+ * Last data modification timestamp.
+ */
+ __wasi_timestamp_t mtim;
+
+ /**
+ * Last file status change timestamp.
+ */
+ __wasi_timestamp_t ctim;
+
+} __wasi_filestat_t;
+
+_Static_assert(sizeof(__wasi_filestat_t) == 64, "witx calculated size");
+_Static_assert(_Alignof(__wasi_filestat_t) == 8, "witx calculated align");
+_Static_assert(offsetof(__wasi_filestat_t, dev) == 0, "witx calculated offset");
+_Static_assert(offsetof(__wasi_filestat_t, ino) == 8, "witx calculated offset");
+_Static_assert(offsetof(__wasi_filestat_t, filetype) == 16, "witx calculated offset");
+_Static_assert(offsetof(__wasi_filestat_t, nlink) == 24, "witx calculated offset");
+_Static_assert(offsetof(__wasi_filestat_t, size) == 32, "witx calculated offset");
+_Static_assert(offsetof(__wasi_filestat_t, atim) == 40, "witx calculated offset");
+_Static_assert(offsetof(__wasi_filestat_t, mtim) == 48, "witx calculated offset");
+_Static_assert(offsetof(__wasi_filestat_t, ctim) == 56, "witx calculated offset");
+
+/**
+ * User-provided value that may be attached to objects that is retained when
+ * extracted from the implementation.
+ */
+typedef uint64_t __wasi_userdata_t;
+
+_Static_assert(sizeof(__wasi_userdata_t) == 8, "witx calculated size");
+_Static_assert(_Alignof(__wasi_userdata_t) == 8, "witx calculated align");
+
+/**
+ * Type of a subscription to an event or its occurrence.
+ */
+typedef uint8_t __wasi_eventtype_t;
+
+/**
+ * The time value of clock `subscription_clock::id` has
+ * reached timestamp `subscription_clock::timeout`.
+ */
+#define __WASI_EVENTTYPE_CLOCK (UINT8_C(0))
+
+/**
+ * File descriptor `subscription_fd_readwrite::file_descriptor` has data
+ * available for reading. This event always triggers for regular files.
+ */
+#define __WASI_EVENTTYPE_FD_READ (UINT8_C(1))
+
+/**
+ * File descriptor `subscription_fd_readwrite::file_descriptor` has capacity
+ * available for writing. This event always triggers for regular files.
+ */
+#define __WASI_EVENTTYPE_FD_WRITE (UINT8_C(2))
+
+_Static_assert(sizeof(__wasi_eventtype_t) == 1, "witx calculated size");
+_Static_assert(_Alignof(__wasi_eventtype_t) == 1, "witx calculated align");
+
+/**
+ * The state of the file descriptor subscribed to with
+ * `eventtype::fd_read` or `eventtype::fd_write`.
+ */
+typedef uint16_t __wasi_eventrwflags_t;
+
+/**
+ * The peer of this socket has closed or disconnected.
+ */
+#define __WASI_EVENTRWFLAGS_FD_READWRITE_HANGUP ((__wasi_eventrwflags_t)(1 << 0))
+
+/**
+ * The contents of an `event` when type is `eventtype::fd_read` or
+ * `eventtype::fd_write`.
+ */
+typedef struct __wasi_event_fd_readwrite_t {
+ /**
+ * The number of bytes available for reading or writing.
+ */
+ __wasi_filesize_t nbytes;
+
+ /**
+ * The state of the file descriptor.
+ */
+ __wasi_eventrwflags_t flags;
+
+} __wasi_event_fd_readwrite_t;
+
+_Static_assert(sizeof(__wasi_event_fd_readwrite_t) == 16, "witx calculated size");
+_Static_assert(_Alignof(__wasi_event_fd_readwrite_t) == 8, "witx calculated align");
+_Static_assert(offsetof(__wasi_event_fd_readwrite_t, nbytes) == 0, "witx calculated offset");
+_Static_assert(offsetof(__wasi_event_fd_readwrite_t, flags) == 8, "witx calculated offset");
+
+/**
+ * An event that occurred.
+ */
+typedef struct __wasi_event_t {
+ /**
+ * User-provided value that got attached to `subscription::userdata`.
+ */
+ __wasi_userdata_t userdata;
+
+ /**
+ * If non-zero, an error that occurred while processing the subscription request.
+ */
+ __wasi_errno_t error;
+
+ /**
+ * The type of event that occured
+ */
+ __wasi_eventtype_t type;
+
+ /**
+ * The contents of the event, if it is an `eventtype::fd_read` or
+ * `eventtype::fd_write`. `eventtype::clock` events ignore this field.
+ */
+ __wasi_event_fd_readwrite_t fd_readwrite;
+
+} __wasi_event_t;
+
+_Static_assert(sizeof(__wasi_event_t) == 32, "witx calculated size");
+_Static_assert(_Alignof(__wasi_event_t) == 8, "witx calculated align");
+_Static_assert(offsetof(__wasi_event_t, userdata) == 0, "witx calculated offset");
+_Static_assert(offsetof(__wasi_event_t, error) == 8, "witx calculated offset");
+_Static_assert(offsetof(__wasi_event_t, type) == 10, "witx calculated offset");
+_Static_assert(offsetof(__wasi_event_t, fd_readwrite) == 16, "witx calculated offset");
+
+/**
+ * Flags determining how to interpret the timestamp provided in
+ * `subscription_clock::timeout`.
+ */
+typedef uint16_t __wasi_subclockflags_t;
+
+/**
+ * If set, treat the timestamp provided in
+ * `subscription_clock::timeout` as an absolute timestamp of clock
+ * `subscription_clock::id`. If clear, treat the timestamp
+ * provided in `subscription_clock::timeout` relative to the
+ * current time value of clock `subscription_clock::id`.
+ */
+#define __WASI_SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME ((__wasi_subclockflags_t)(1 << 0))
+
+/**
+ * The contents of a `subscription` when type is `eventtype::clock`.
+ */
+typedef struct __wasi_subscription_clock_t {
+ /**
+ * The clock against which to compare the timestamp.
+ */
+ __wasi_clockid_t id;
+
+ /**
+ * The absolute or relative timestamp.
+ */
+ __wasi_timestamp_t timeout;
+
+ /**
+ * The amount of time that the implementation may wait additionally
+ * to coalesce with other events.
+ */
+ __wasi_timestamp_t precision;
+
+ /**
+ * Flags specifying whether the timeout is absolute or relative
+ */
+ __wasi_subclockflags_t flags;
+
+} __wasi_subscription_clock_t;
+
+_Static_assert(sizeof(__wasi_subscription_clock_t) == 32, "witx calculated size");
+_Static_assert(_Alignof(__wasi_subscription_clock_t) == 8, "witx calculated align");
+_Static_assert(offsetof(__wasi_subscription_clock_t, id) == 0, "witx calculated offset");
+_Static_assert(offsetof(__wasi_subscription_clock_t, timeout) == 8, "witx calculated offset");
+_Static_assert(offsetof(__wasi_subscription_clock_t, precision) == 16, "witx calculated offset");
+_Static_assert(offsetof(__wasi_subscription_clock_t, flags) == 24, "witx calculated offset");
+
+/**
+ * The contents of a `subscription` when type is type is
+ * `eventtype::fd_read` or `eventtype::fd_write`.
+ */
+typedef struct __wasi_subscription_fd_readwrite_t {
+ /**
+ * The file descriptor on which to wait for it to become ready for reading or writing.
+ */
+ __wasi_fd_t file_descriptor;
+
+} __wasi_subscription_fd_readwrite_t;
+
+_Static_assert(sizeof(__wasi_subscription_fd_readwrite_t) == 4, "witx calculated size");
+_Static_assert(_Alignof(__wasi_subscription_fd_readwrite_t) == 4, "witx calculated align");
+_Static_assert(offsetof(__wasi_subscription_fd_readwrite_t, file_descriptor) == 0, "witx calculated offset");
+
+/**
+ * The contents of a `subscription`.
+ */
+typedef union __wasi_subscription_u_u_t {
+ __wasi_subscription_clock_t clock;
+ __wasi_subscription_fd_readwrite_t fd_read;
+ __wasi_subscription_fd_readwrite_t fd_write;
+} __wasi_subscription_u_u_t;
+typedef struct __wasi_subscription_u_t {
+ uint8_t tag;
+ __wasi_subscription_u_u_t u;
+} __wasi_subscription_u_t;
+
+_Static_assert(sizeof(__wasi_subscription_u_t) == 40, "witx calculated size");
+_Static_assert(_Alignof(__wasi_subscription_u_t) == 8, "witx calculated align");
+
+/**
+ * Subscription to an event.
+ */
+typedef struct __wasi_subscription_t {
+ /**
+ * User-provided value that is attached to the subscription in the
+ * implementation and returned through `event::userdata`.
+ */
+ __wasi_userdata_t userdata;
+
+ /**
+ * The type of the event to which to subscribe, and its contents
+ */
+ __wasi_subscription_u_t u;
+
+} __wasi_subscription_t;
+
+_Static_assert(sizeof(__wasi_subscription_t) == 48, "witx calculated size");
+_Static_assert(_Alignof(__wasi_subscription_t) == 8, "witx calculated align");
+_Static_assert(offsetof(__wasi_subscription_t, userdata) == 0, "witx calculated offset");
+_Static_assert(offsetof(__wasi_subscription_t, u) == 8, "witx calculated offset");
+
+/**
+ * Exit code generated by a process when exiting.
+ */
+typedef uint32_t __wasi_exitcode_t;
+
+_Static_assert(sizeof(__wasi_exitcode_t) == 4, "witx calculated size");
+_Static_assert(_Alignof(__wasi_exitcode_t) == 4, "witx calculated align");
+
+/**
+ * Flags provided to `sock_recv`.
+ */
+typedef uint16_t __wasi_riflags_t;
+
+/**
+ * Returns the message without removing it from the socket's receive queue.
+ */
+#define __WASI_RIFLAGS_RECV_PEEK ((__wasi_riflags_t)(1 << 0))
+
+/**
+ * On byte-stream sockets, block until the full amount of data can be returned.
+ */
+#define __WASI_RIFLAGS_RECV_WAITALL ((__wasi_riflags_t)(1 << 1))
+
+/**
+ * Flags returned by `sock_recv`.
+ */
+typedef uint16_t __wasi_roflags_t;
+
+/**
+ * Returned by `sock_recv`: Message data has been truncated.
+ */
+#define __WASI_ROFLAGS_RECV_DATA_TRUNCATED ((__wasi_roflags_t)(1 << 0))
+
+/**
+ * Flags provided to `sock_send`. As there are currently no flags
+ * defined, it must be set to zero.
+ */
+typedef uint16_t __wasi_siflags_t;
+
+_Static_assert(sizeof(__wasi_siflags_t) == 2, "witx calculated size");
+_Static_assert(_Alignof(__wasi_siflags_t) == 2, "witx calculated align");
+
+/**
+ * Which channels on a socket to shut down.
+ */
+typedef uint8_t __wasi_sdflags_t;
+
+/**
+ * Disables further receive operations.
+ */
+#define __WASI_SDFLAGS_RD ((__wasi_sdflags_t)(1 << 0))
+
+/**
+ * Disables further send operations.
+ */
+#define __WASI_SDFLAGS_WR ((__wasi_sdflags_t)(1 << 1))
+
+/**
+ * Identifiers for preopened capabilities.
+ */
+typedef uint8_t __wasi_preopentype_t;
+
+/**
+ * A pre-opened directory.
+ */
+#define __WASI_PREOPENTYPE_DIR (UINT8_C(0))
+
+_Static_assert(sizeof(__wasi_preopentype_t) == 1, "witx calculated size");
+_Static_assert(_Alignof(__wasi_preopentype_t) == 1, "witx calculated align");
+
+/**
+ * The contents of a $prestat when type is `preopentype::dir`.
+ */
+typedef struct __wasi_prestat_dir_t {
+ /**
+ * The length of the directory name for use with `fd_prestat_dir_name`.
+ */
+ __wasi_size_t pr_name_len;
+
+} __wasi_prestat_dir_t;
+
+_Static_assert(sizeof(__wasi_prestat_dir_t) == 4, "witx calculated size");
+_Static_assert(_Alignof(__wasi_prestat_dir_t) == 4, "witx calculated align");
+_Static_assert(offsetof(__wasi_prestat_dir_t, pr_name_len) == 0, "witx calculated offset");
+
+/**
+ * Information about a pre-opened capability.
+ */
+typedef union __wasi_prestat_u_t {
+ __wasi_prestat_dir_t dir;
+} __wasi_prestat_u_t;
+typedef struct __wasi_prestat_t {
+ uint8_t tag;
+ __wasi_prestat_u_t u;
+} __wasi_prestat_t;
+
+_Static_assert(sizeof(__wasi_prestat_t) == 8, "witx calculated size");
+_Static_assert(_Alignof(__wasi_prestat_t) == 4, "witx calculated align");
+
+/**
+ * @defgroup wasi_snapshot_preview1
+ * @{
+ */
+
+/**
+ * Read command-line argument data.
+ * The size of the array should match that returned by `args_sizes_get`.
+ * Each argument is expected to be `\0` terminated.
+ */
+__wasi_errno_t __wasi_args_get(
+ uint8_t * * argv,
+ uint8_t * argv_buf
+) __attribute__((__warn_unused_result__));
+/**
+ * Return command-line argument data sizes.
+ * @return
+ * Returns the number of arguments and the size of the argument string
+ * data, or an error.
+ */
+__wasi_errno_t __wasi_args_sizes_get(
+ __wasi_size_t *retptr0,
+ __wasi_size_t *retptr1
+) __attribute__((__warn_unused_result__));
+/**
+ * Read environment variable data.
+ * The sizes of the buffers should match that returned by `environ_sizes_get`.
+ * Key/value pairs are expected to be joined with `=`s, and terminated with `\0`s.
+ */
+__wasi_errno_t __wasi_environ_get(
+ uint8_t * * environ,
+ uint8_t * environ_buf
+) __attribute__((__warn_unused_result__));
+/**
+ * Return environment variable data sizes.
+ * @return
+ * Returns the number of environment variable arguments and the size of the
+ * environment variable data.
+ */
+__wasi_errno_t __wasi_environ_sizes_get(
+ __wasi_size_t *retptr0,
+ __wasi_size_t *retptr1
+) __attribute__((__warn_unused_result__));
+/**
+ * Return the resolution of a clock.
+ * Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks,
+ * return `errno::inval`.
+ * Note: This is similar to `clock_getres` in POSIX.
+ * @return
+ * The resolution of the clock, or an error if one happened.
+ */
+__wasi_errno_t __wasi_clock_res_get(
+ /**
+ * The clock for which to return the resolution.
+ */
+ __wasi_clockid_t id,
+ __wasi_timestamp_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Return the time value of a clock.
+ * Note: This is similar to `clock_gettime` in POSIX.
+ * @return
+ * The time value of the clock.
+ */
+__wasi_errno_t __wasi_clock_time_get(
+ /**
+ * The clock for which to return the time.
+ */
+ __wasi_clockid_t id,
+ /**
+ * The maximum lag (exclusive) that the returned time value may have, compared to its actual value.
+ */
+ __wasi_timestamp_t precision,
+ __wasi_timestamp_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Provide file advisory information on a file descriptor.
+ * Note: This is similar to `posix_fadvise` in POSIX.
+ */
+__wasi_errno_t __wasi_fd_advise(
+ __wasi_fd_t fd,
+ /**
+ * The offset within the file to which the advisory applies.
+ */
+ __wasi_filesize_t offset,
+ /**
+ * The length of the region to which the advisory applies.
+ */
+ __wasi_filesize_t len,
+ /**
+ * The advice.
+ */
+ __wasi_advice_t advice
+) __attribute__((__warn_unused_result__));
+/**
+ * Force the allocation of space in a file.
+ * Note: This is similar to `posix_fallocate` in POSIX.
+ */
+__wasi_errno_t __wasi_fd_allocate(
+ __wasi_fd_t fd,
+ /**
+ * The offset at which to start the allocation.
+ */
+ __wasi_filesize_t offset,
+ /**
+ * The length of the area that is allocated.
+ */
+ __wasi_filesize_t len
+) __attribute__((__warn_unused_result__));
+/**
+ * Close a file descriptor.
+ * Note: This is similar to `close` in POSIX.
+ */
+__wasi_errno_t __wasi_fd_close(
+ __wasi_fd_t fd
+) __attribute__((__warn_unused_result__));
+/**
+ * Synchronize the data of a file to disk.
+ * Note: This is similar to `fdatasync` in POSIX.
+ */
+__wasi_errno_t __wasi_fd_datasync(
+ __wasi_fd_t fd
+) __attribute__((__warn_unused_result__));
+/**
+ * Get the attributes of a file descriptor.
+ * Note: This returns similar flags to `fsync(fd, F_GETFL)` in POSIX, as well as additional fields.
+ * @return
+ * The buffer where the file descriptor's attributes are stored.
+ */
+__wasi_errno_t __wasi_fd_fdstat_get(
+ __wasi_fd_t fd,
+ __wasi_fdstat_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Adjust the flags associated with a file descriptor.
+ * Note: This is similar to `fcntl(fd, F_SETFL, flags)` in POSIX.
+ */
+__wasi_errno_t __wasi_fd_fdstat_set_flags(
+ __wasi_fd_t fd,
+ /**
+ * The desired values of the file descriptor flags.
+ */
+ __wasi_fdflags_t flags
+) __attribute__((__warn_unused_result__));
+/**
+ * Adjust the rights associated with a file descriptor.
+ * This can only be used to remove rights, and returns `errno::notcapable` if called in a way that would attempt to add rights
+ */
+__wasi_errno_t __wasi_fd_fdstat_set_rights(
+ __wasi_fd_t fd,
+ /**
+ * The desired rights of the file descriptor.
+ */
+ __wasi_rights_t fs_rights_base,
+ __wasi_rights_t fs_rights_inheriting
+) __attribute__((__warn_unused_result__));
+/**
+ * Return the attributes of an open file.
+ * @return
+ * The buffer where the file's attributes are stored.
+ */
+__wasi_errno_t __wasi_fd_filestat_get(
+ __wasi_fd_t fd,
+ __wasi_filestat_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Adjust the size of an open file. If this increases the file's size, the extra bytes are filled with zeros.
+ * Note: This is similar to `ftruncate` in POSIX.
+ */
+__wasi_errno_t __wasi_fd_filestat_set_size(
+ __wasi_fd_t fd,
+ /**
+ * The desired file size.
+ */
+ __wasi_filesize_t size
+) __attribute__((__warn_unused_result__));
+/**
+ * Adjust the timestamps of an open file or directory.
+ * Note: This is similar to `futimens` in POSIX.
+ */
+__wasi_errno_t __wasi_fd_filestat_set_times(
+ __wasi_fd_t fd,
+ /**
+ * The desired values of the data access timestamp.
+ */
+ __wasi_timestamp_t atim,
+ /**
+ * The desired values of the data modification timestamp.
+ */
+ __wasi_timestamp_t mtim,
+ /**
+ * A bitmask indicating which timestamps to adjust.
+ */
+ __wasi_fstflags_t fst_flags
+) __attribute__((__warn_unused_result__));
+/**
+ * Read from a file descriptor, without using and updating the file descriptor's offset.
+ * Note: This is similar to `preadv` in POSIX.
+ * @return
+ * The number of bytes read.
+ */
+__wasi_errno_t __wasi_fd_pread(
+ __wasi_fd_t fd,
+ /**
+ * List of scatter/gather vectors in which to store data.
+ */
+ const __wasi_iovec_t *iovs,
+ /**
+ * The length of the array pointed to by `iovs`.
+ */
+ size_t iovs_len,
+ /**
+ * The offset within the file at which to read.
+ */
+ __wasi_filesize_t offset,
+ __wasi_size_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Return a description of the given preopened file descriptor.
+ * @return
+ * The buffer where the description is stored.
+ */
+__wasi_errno_t __wasi_fd_prestat_get(
+ __wasi_fd_t fd,
+ __wasi_prestat_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Return a description of the given preopened file descriptor.
+ */
+__wasi_errno_t __wasi_fd_prestat_dir_name(
+ __wasi_fd_t fd,
+ /**
+ * A buffer into which to write the preopened directory name.
+ */
+ uint8_t * path,
+ __wasi_size_t path_len
+) __attribute__((__warn_unused_result__));
+/**
+ * Write to a file descriptor, without using and updating the file descriptor's offset.
+ * Note: This is similar to `pwritev` in POSIX.
+ * @return
+ * The number of bytes written.
+ */
+__wasi_errno_t __wasi_fd_pwrite(
+ __wasi_fd_t fd,
+ /**
+ * List of scatter/gather vectors from which to retrieve data.
+ */
+ const __wasi_ciovec_t *iovs,
+ /**
+ * The length of the array pointed to by `iovs`.
+ */
+ size_t iovs_len,
+ /**
+ * The offset within the file at which to write.
+ */
+ __wasi_filesize_t offset,
+ __wasi_size_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Read from a file descriptor.
+ * Note: This is similar to `readv` in POSIX.
+ * @return
+ * The number of bytes read.
+ */
+__wasi_errno_t __wasi_fd_read(
+ __wasi_fd_t fd,
+ /**
+ * List of scatter/gather vectors to which to store data.
+ */
+ const __wasi_iovec_t *iovs,
+ /**
+ * The length of the array pointed to by `iovs`.
+ */
+ size_t iovs_len,
+ __wasi_size_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Read directory entries from a directory.
+ * When successful, the contents of the output buffer consist of a sequence of
+ * directory entries. Each directory entry consists of a `dirent` object,
+ * followed by `dirent::d_namlen` bytes holding the name of the directory
+ * entry.
+ * This function fills the output buffer as much as possible, potentially
+ * truncating the last directory entry. This allows the caller to grow its
+ * read buffer size in case it's too small to fit a single large directory
+ * entry, or skip the oversized directory entry.
+ * @return
+ * The number of bytes stored in the read buffer. If less than the size of the read buffer, the end of the directory has been reached.
+ */
+__wasi_errno_t __wasi_fd_readdir(
+ __wasi_fd_t fd,
+ /**
+ * The buffer where directory entries are stored
+ */
+ uint8_t * buf,
+ __wasi_size_t buf_len,
+ /**
+ * The location within the directory to start reading
+ */
+ __wasi_dircookie_t cookie,
+ __wasi_size_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Atomically replace a file descriptor by renumbering another file descriptor.
+ * Due to the strong focus on thread safety, this environment does not provide
+ * a mechanism to duplicate or renumber a file descriptor to an arbitrary
+ * number, like `dup2()`. This would be prone to race conditions, as an actual
+ * file descriptor with the same number could be allocated by a different
+ * thread at the same time.
+ * This function provides a way to atomically renumber file descriptors, which
+ * would disappear if `dup2()` were to be removed entirely.
+ */
+__wasi_errno_t __wasi_fd_renumber(
+ __wasi_fd_t fd,
+ /**
+ * The file descriptor to overwrite.
+ */
+ __wasi_fd_t to
+) __attribute__((__warn_unused_result__));
+/**
+ * Move the offset of a file descriptor.
+ * Note: This is similar to `lseek` in POSIX.
+ * @return
+ * The new offset of the file descriptor, relative to the start of the file.
+ */
+__wasi_errno_t __wasi_fd_seek(
+ __wasi_fd_t fd,
+ /**
+ * The number of bytes to move.
+ */
+ __wasi_filedelta_t offset,
+ /**
+ * The base from which the offset is relative.
+ */
+ __wasi_whence_t whence,
+ __wasi_filesize_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Synchronize the data and metadata of a file to disk.
+ * Note: This is similar to `fsync` in POSIX.
+ */
+__wasi_errno_t __wasi_fd_sync(
+ __wasi_fd_t fd
+) __attribute__((__warn_unused_result__));
+/**
+ * Return the current offset of a file descriptor.
+ * Note: This is similar to `lseek(fd, 0, SEEK_CUR)` in POSIX.
+ * @return
+ * The current offset of the file descriptor, relative to the start of the file.
+ */
+__wasi_errno_t __wasi_fd_tell(
+ __wasi_fd_t fd,
+ __wasi_filesize_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Write to a file descriptor.
+ * Note: This is similar to `writev` in POSIX.
+ */
+__wasi_errno_t __wasi_fd_write(
+ __wasi_fd_t fd,
+ /**
+ * List of scatter/gather vectors from which to retrieve data.
+ */
+ const __wasi_ciovec_t *iovs,
+ /**
+ * The length of the array pointed to by `iovs`.
+ */
+ size_t iovs_len,
+ __wasi_size_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Create a directory.
+ * Note: This is similar to `mkdirat` in POSIX.
+ */
+__wasi_errno_t __wasi_path_create_directory(
+ __wasi_fd_t fd,
+ /**
+ * The path at which to create the directory.
+ */
+ const char *path
+) __attribute__((__warn_unused_result__));
+/**
+ * Return the attributes of a file or directory.
+ * Note: This is similar to `stat` in POSIX.
+ * @return
+ * The buffer where the file's attributes are stored.
+ */
+__wasi_errno_t __wasi_path_filestat_get(
+ __wasi_fd_t fd,
+ /**
+ * Flags determining the method of how the path is resolved.
+ */
+ __wasi_lookupflags_t flags,
+ /**
+ * The path of the file or directory to inspect.
+ */
+ const char *path,
+ __wasi_filestat_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Adjust the timestamps of a file or directory.
+ * Note: This is similar to `utimensat` in POSIX.
+ */
+__wasi_errno_t __wasi_path_filestat_set_times(
+ __wasi_fd_t fd,
+ /**
+ * Flags determining the method of how the path is resolved.
+ */
+ __wasi_lookupflags_t flags,
+ /**
+ * The path of the file or directory to operate on.
+ */
+ const char *path,
+ /**
+ * The desired values of the data access timestamp.
+ */
+ __wasi_timestamp_t atim,
+ /**
+ * The desired values of the data modification timestamp.
+ */
+ __wasi_timestamp_t mtim,
+ /**
+ * A bitmask indicating which timestamps to adjust.
+ */
+ __wasi_fstflags_t fst_flags
+) __attribute__((__warn_unused_result__));
+/**
+ * Create a hard link.
+ * Note: This is similar to `linkat` in POSIX.
+ */
+__wasi_errno_t __wasi_path_link(
+ __wasi_fd_t old_fd,
+ /**
+ * Flags determining the method of how the path is resolved.
+ */
+ __wasi_lookupflags_t old_flags,
+ /**
+ * The source path from which to link.
+ */
+ const char *old_path,
+ /**
+ * The working directory at which the resolution of the new path starts.
+ */
+ __wasi_fd_t new_fd,
+ /**
+ * The destination path at which to create the hard link.
+ */
+ const char *new_path
+) __attribute__((__warn_unused_result__));
+/**
+ * Open a file or directory.
+ * The returned file descriptor is not guaranteed to be the lowest-numbered
+ * file descriptor not currently open; it is randomized to prevent
+ * applications from depending on making assumptions about indexes, since this
+ * is error-prone in multi-threaded contexts. The returned file descriptor is
+ * guaranteed to be less than 2**31.
+ * Note: This is similar to `openat` in POSIX.
+ * @return
+ * The file descriptor of the file that has been opened.
+ */
+__wasi_errno_t __wasi_path_open(
+ __wasi_fd_t fd,
+ /**
+ * Flags determining the method of how the path is resolved.
+ */
+ __wasi_lookupflags_t dirflags,
+ /**
+ * The relative path of the file or directory to open, relative to the
+ * `path_open::fd` directory.
+ */
+ const char *path,
+ /**
+ * The method by which to open the file.
+ */
+ __wasi_oflags_t oflags,
+ /**
+ * The initial rights of the newly created file descriptor. The
+ * implementation is allowed to return a file descriptor with fewer rights
+ * than specified, if and only if those rights do not apply to the type of
+ * file being opened.
+ * The *base* rights are rights that will apply to operations using the file
+ * descriptor itself, while the *inheriting* rights are rights that apply to
+ * file descriptors derived from it.
+ */
+ __wasi_rights_t fs_rights_base,
+ __wasi_rights_t fs_rights_inheriting,
+ __wasi_fdflags_t fdflags,
+ __wasi_fd_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Read the contents of a symbolic link.
+ * Note: This is similar to `readlinkat` in POSIX.
+ * @return
+ * The number of bytes placed in the buffer.
+ */
+__wasi_errno_t __wasi_path_readlink(
+ __wasi_fd_t fd,
+ /**
+ * The path of the symbolic link from which to read.
+ */
+ const char *path,
+ /**
+ * The buffer to which to write the contents of the symbolic link.
+ */
+ uint8_t * buf,
+ __wasi_size_t buf_len,
+ __wasi_size_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Remove a directory.
+ * Return `errno::notempty` if the directory is not empty.
+ * Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX.
+ */
+__wasi_errno_t __wasi_path_remove_directory(
+ __wasi_fd_t fd,
+ /**
+ * The path to a directory to remove.
+ */
+ const char *path
+) __attribute__((__warn_unused_result__));
+/**
+ * Rename a file or directory.
+ * Note: This is similar to `renameat` in POSIX.
+ */
+__wasi_errno_t __wasi_path_rename(
+ __wasi_fd_t fd,
+ /**
+ * The source path of the file or directory to rename.
+ */
+ const char *old_path,
+ /**
+ * The working directory at which the resolution of the new path starts.
+ */
+ __wasi_fd_t new_fd,
+ /**
+ * The destination path to which to rename the file or directory.
+ */
+ const char *new_path
+) __attribute__((__warn_unused_result__));
+/**
+ * Create a symbolic link.
+ * Note: This is similar to `symlinkat` in POSIX.
+ */
+__wasi_errno_t __wasi_path_symlink(
+ /**
+ * The contents of the symbolic link.
+ */
+ const char *old_path,
+ __wasi_fd_t fd,
+ /**
+ * The destination path at which to create the symbolic link.
+ */
+ const char *new_path
+) __attribute__((__warn_unused_result__));
+/**
+ * Unlink a file.
+ * Return `errno::isdir` if the path refers to a directory.
+ * Note: This is similar to `unlinkat(fd, path, 0)` in POSIX.
+ */
+__wasi_errno_t __wasi_path_unlink_file(
+ __wasi_fd_t fd,
+ /**
+ * The path to a file to unlink.
+ */
+ const char *path
+) __attribute__((__warn_unused_result__));
+/**
+ * Concurrently poll for the occurrence of a set of events.
+ * @return
+ * The number of events stored.
+ */
+__wasi_errno_t __wasi_poll_oneoff(
+ /**
+ * The events to which to subscribe.
+ */
+ const __wasi_subscription_t * in,
+ /**
+ * The events that have occurred.
+ */
+ __wasi_event_t * out,
+ /**
+ * Both the number of subscriptions and events.
+ */
+ __wasi_size_t nsubscriptions,
+ __wasi_size_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Terminate the process normally. An exit code of 0 indicates successful
+ * termination of the program. The meanings of other values is dependent on
+ * the environment.
+ */
+_Noreturn void __wasi_proc_exit(
+ /**
+ * The exit code returned by the process.
+ */
+ __wasi_exitcode_t rval
+);
+/**
+ * Temporarily yield execution of the calling thread.
+ * Note: This is similar to `sched_yield` in POSIX.
+ */
+__wasi_errno_t __wasi_sched_yield(
+ void
+) __attribute__((__warn_unused_result__));
+/**
+ * Write high-quality random data into a buffer.
+ * This function blocks when the implementation is unable to immediately
+ * provide sufficient high-quality random data.
+ * This function may execute slowly, so when large mounts of random data are
+ * required, it's advisable to use this function to seed a pseudo-random
+ * number generator, rather than to provide the random data directly.
+ */
+__wasi_errno_t __wasi_random_get(
+ /**
+ * The buffer to fill with random data.
+ */
+ uint8_t * buf,
+ __wasi_size_t buf_len
+) __attribute__((__warn_unused_result__));
+/**
+ * Accept a new incoming connection.
+ * Note: This is similar to `accept` in POSIX.
+ * @return
+ * New socket connection
+ */
+__wasi_errno_t __wasi_sock_accept(
+ /**
+ * The listening socket.
+ */
+ __wasi_fd_t fd,
+ /**
+ * The desired values of the file descriptor flags.
+ */
+ __wasi_fdflags_t flags,
+ __wasi_fd_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Receive a message from a socket.
+ * Note: This is similar to `recv` in POSIX, though it also supports reading
+ * the data into multiple buffers in the manner of `readv`.
+ * @return
+ * Number of bytes stored in ri_data and message flags.
+ */
+__wasi_errno_t __wasi_sock_recv(
+ __wasi_fd_t fd,
+ /**
+ * List of scatter/gather vectors to which to store data.
+ */
+ const __wasi_iovec_t *ri_data,
+ /**
+ * The length of the array pointed to by `ri_data`.
+ */
+ size_t ri_data_len,
+ /**
+ * Message flags.
+ */
+ __wasi_riflags_t ri_flags,
+ __wasi_size_t *retptr0,
+ __wasi_roflags_t *retptr1
+) __attribute__((__warn_unused_result__));
+/**
+ * Send a message on a socket.
+ * Note: This is similar to `send` in POSIX, though it also supports writing
+ * the data from multiple buffers in the manner of `writev`.
+ * @return
+ * Number of bytes transmitted.
+ */
+__wasi_errno_t __wasi_sock_send(
+ __wasi_fd_t fd,
+ /**
+ * List of scatter/gather vectors to which to retrieve data
+ */
+ const __wasi_ciovec_t *si_data,
+ /**
+ * The length of the array pointed to by `si_data`.
+ */
+ size_t si_data_len,
+ /**
+ * Message flags.
+ */
+ __wasi_siflags_t si_flags,
+ __wasi_size_t *retptr0
+) __attribute__((__warn_unused_result__));
+/**
+ * Shut down socket send and receive channels.
+ * Note: This is similar to `shutdown` in POSIX.
+ */
+__wasi_errno_t __wasi_sock_shutdown(
+ __wasi_fd_t fd,
+ /**
+ * Which channels on the socket to shut down.
+ */
+ __wasi_sdflags_t how
+) __attribute__((__warn_unused_result__));
+/** @} */
+
+#ifdef _REENTRANT
+/**
+ * Request a new thread to be created by the host.
+ *
+ * The host will create a new instance of the current module sharing its
+ * memory, find an exported entry function--`wasi_thread_start`--, and call the
+ * entry function with `start_arg` in the new thread.
+ *
+ * @see https://github.com/WebAssembly/wasi-threads/#readme
+ */
+__wasi_errno_t __wasi_thread_spawn(
+ /**
+ * A pointer to an opaque struct to be passed to the module's entry
+ * function.
+ */
+ void *start_arg
+) __attribute__((__warn_unused_result__));
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/wasi/libc-environ.h b/libc-bottom-half/headers/public/wasi/libc-environ.h
new file mode 100644
index 0000000..f84ba8e
--- /dev/null
+++ b/libc-bottom-half/headers/public/wasi/libc-environ.h
@@ -0,0 +1,36 @@
+#ifndef __wasi_libc_environ_h
+#define __wasi_libc_environ_h
+
+/// This header file is a WASI-libc-specific interface, and is not needed by
+/// most programs. Most programs should just use the standard `getenv` and
+/// related APIs, which take care of all of the details automatically.
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/// Initialize the global environment variable state. Only needs to be
+/// called once; most users should call `__wasilibc_ensure_environ` instead.
+void __wasilibc_initialize_environ(void);
+
+/// If `__wasilibc_initialize_environ` has not yet been called, call it.
+void __wasilibc_ensure_environ(void);
+
+/// De-initialize the global environment variable state, so that subsequent
+/// calls to `__wasilibc_ensure_environ` call `__wasilibc_initialize_environ`.
+void __wasilibc_deinitialize_environ(void);
+
+/// Call `__wasilibc_initialize_environ` only if `environ` and `_environ` are
+/// referenced in the program.
+void __wasilibc_maybe_reinitialize_environ_eagerly(void);
+
+/// Return the value of the `environ` variable. Using `environ` directly
+/// requires eager initialization of the environment variables. Using this
+/// function instead of `environ` allows initialization to happen lazily.
+char **__wasilibc_get_environ(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/wasi/libc-find-relpath.h b/libc-bottom-half/headers/public/wasi/libc-find-relpath.h
new file mode 100644
index 0000000..32dbb03
--- /dev/null
+++ b/libc-bottom-half/headers/public/wasi/libc-find-relpath.h
@@ -0,0 +1,79 @@
+#ifndef __wasi_libc_find_relpath_h
+#define __wasi_libc_find_relpath_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Look up the given `path`, relative to the cwd, in the preopened directory
+ * map. If a suitable entry is found, then the file descriptor for that entry
+ * is returned. Additionally the absolute path of the directory's file
+ * descriptor is returned in `abs_prefix` and the relative portion that needs
+ * to be opened is stored in `*relative_path`.
+ *
+ * The `relative_path` argument must be a pointer to a buffer valid for
+ * `relative_path_len` bytes, and this may be used as storage for the relative
+ * portion of the path being returned through `*relative_path`.
+ *
+ * See documentation on `__wasilibc_find_abspath` for more info about what the
+ * paths look like.
+ *
+ * Returns -1 on failure. Errno is set to either:
+ *
+ * * ENOMEM - failed to allocate memory for internal routines.
+ * * ENOENT - the `path` could not be found relative to any preopened dir.
+ * * ERANGE - the `relative_path` buffer is too small to hold the relative path.
+ */
+int __wasilibc_find_relpath(const char *path,
+ const char **__restrict__ abs_prefix,
+ char **relative_path,
+ size_t relative_path_len);
+
+/**
+ * Look up the given `path`, which is interpreted as absolute, in the preopened
+ * directory map. If a suitable entry is found, then the file descriptor for
+ * that entry is returned. Additionally the relative portion of the path to
+ * where the fd is opened is returned through `relative_path`, the absolute
+ * prefix which was matched is stored to `abs_prefix`, and `relative_path` may
+ * be an interior pointer to the `abspath` string.
+ *
+ * The `abs_prefix` returned string will not contain a leading `/`. Note that
+ * this may be the empty string. Additionally the returned `relative_path` will
+ * not contain a leading `/`. The `relative_path` return will not return an
+ * empty string, it will return `"."` instead if it would otherwise do so.
+ *
+ * Returns -1 on failure. Errno is set to either:
+ *
+ * * ENOMEM - failed to allocate memory for internal routines.
+ * * ENOENT - the `path` could not be found relative to any preopened dir.
+ */
+int __wasilibc_find_abspath(const char *abspath,
+ const char **__restrict__ abs_prefix,
+ const char **__restrict__ relative_path);
+
+/**
+ * Same as `__wasilibc_find_relpath`, except that this function will interpret
+ * `relative` as a malloc'd buffer that will be `realloc`'d to the appropriate
+ * size to contain the relative path.
+ *
+ * Note that this is a weak symbol and if it's not defined you can use
+ * `__wasilibc_find_relpath`. The weak-nature of this symbols means that if it's
+ * not otherwise included in the compilation then `chdir` wasn't used an there's
+ * no need for this symbol.
+ *
+ * See documentation on `__wasilibc_find_relpath` for more information.
+ */
+int __wasilibc_find_relpath_alloc(
+ const char *path,
+ const char **abs,
+ char **relative,
+ size_t *relative_len,
+ int can_realloc
+) __attribute__((__weak__));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/wasi/libc-nocwd.h b/libc-bottom-half/headers/public/wasi/libc-nocwd.h
new file mode 100644
index 0000000..a988503
--- /dev/null
+++ b/libc-bottom-half/headers/public/wasi/libc-nocwd.h
@@ -0,0 +1,58 @@
+#ifndef __wasi_libc_nocwd_h
+#define __wasi_libc_nocwd_h
+
+/*
+ * In order to support AT_FDCWD, we need to wrap the *at functions to handle
+ * it by calling back into the non-at versions which perform libpreopen
+ * queries. These __wasilibc_nocwd_* forms are the underlying calls which
+ * assume AT_FDCWD has already been resolved.
+ */
+
+#define __need_size_t
+#include <stddef.h>
+#include <__typedef_ssize_t.h>
+#include <__typedef_mode_t.h>
+#include <__typedef_DIR.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct timespec;
+struct stat;
+struct dirent;
+
+int __wasilibc_nocwd___wasilibc_unlinkat(int, const char *)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_nocwd___wasilibc_rmdirat(int, const char *)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_nocwd_linkat(int, const char *, int, const char *, int)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_nocwd_symlinkat(const char *, int, const char *)
+ __attribute__((__warn_unused_result__));
+ssize_t __wasilibc_nocwd_readlinkat(int, const char *__restrict, char *__restrict, size_t)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_nocwd_faccessat(int, const char *, int, int)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_nocwd_renameat(int, const char *, int, const char *)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_nocwd_openat_nomode(int, const char *, int)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_nocwd_fstatat(int, const char *__restrict, struct stat *__restrict, int)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_nocwd_mkdirat_nomode(int, const char *)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_nocwd_utimensat(int, const char *, const struct timespec [2], int)
+ __attribute__((__warn_unused_result__));
+DIR *__wasilibc_nocwd_opendirat(int, const char *)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_nocwd_scandirat(int, const char *, struct dirent ***,
+ int (*)(const struct dirent *),
+ int (*)(const struct dirent **, const struct dirent **))
+ __attribute__((__warn_unused_result__));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/wasi/libc.h b/libc-bottom-half/headers/public/wasi/libc.h
new file mode 100644
index 0000000..b50518b
--- /dev/null
+++ b/libc-bottom-half/headers/public/wasi/libc.h
@@ -0,0 +1,65 @@
+#ifndef __wasi_libc_h
+#define __wasi_libc_h
+
+#include <__typedef_off_t.h>
+#include <__struct_timespec.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct stat;
+struct timespec;
+
+/// Register the given pre-opened file descriptor under the given path.
+///
+/// This function does not take ownership of `prefix` (it makes its own copy).
+int __wasilibc_register_preopened_fd(int fd, const char *prefix);
+
+/// Renumber `fd` to `newfd`; similar to `dup2` but does a move rather than a
+/// copy.
+int __wasilibc_fd_renumber(int fd, int newfd)
+ __attribute__((__warn_unused_result__));
+
+/// Like `unlinkat`, but without depending on `__wasi_path_remove_directory`.
+int __wasilibc_unlinkat(int fd, const char *path)
+ __attribute__((__warn_unused_result__));
+
+/// An `*at` version of rmdir.
+int __wasilibc_rmdirat(int fd, const char *path)
+ __attribute__((__warn_unused_result__));
+
+/// Like `open`, but without the varargs in the signature.
+int __wasilibc_open_nomode(const char *path, int oflag);
+
+/// Like `openat`, but without the varargs in the signature.
+int __wasilibc_openat_nomode(int fd, const char *path, int oflag);
+
+/// Return the current file offset. Like `lseek(fd, 0, SEEK_CUR)`, but without
+/// depending on `lseek`.
+off_t __wasilibc_tell(int fd)
+ __attribute__((__warn_unused_result__));
+
+/* Non-`at` forms of various `*at` functions. */
+int __wasilibc_access(const char *pathname, int mode, int flags)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_stat(const char *__restrict pathname, struct stat *__restrict statbuf, int flags)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_utimens(const char *pathname, const struct timespec times[2], int flags)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_link(const char *oldpath, const char *newpath, int flags)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_link_oldat(int olddirfd, const char *oldpath, const char *newpath, int flags)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_link_newat(const char *oldpath, int newdirfd, const char *newpath, int flags)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_rename_oldat(int olddirfd, const char *oldpath, const char *newpath)
+ __attribute__((__warn_unused_result__));
+int __wasilibc_rename_newat(const char *oldpath, int newdirfd, const char *newpath)
+ __attribute__((__warn_unused_result__));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-bottom-half/headers/public/wchar.h b/libc-bottom-half/headers/public/wchar.h
new file mode 100644
index 0000000..f43d72f
--- /dev/null
+++ b/libc-bottom-half/headers/public/wchar.h
@@ -0,0 +1,9 @@
+#ifndef __wasilibc_wchar_h
+#define __wasilibc_wchar_h
+
+#define __need_size_t
+#define __need_wchar_t
+#define __need_NULL
+#include <stddef.h>
+
+#endif
diff --git a/libc-bottom-half/mman/mman.c b/libc-bottom-half/mman/mman.c
new file mode 100644
index 0000000..f02b136
--- /dev/null
+++ b/libc-bottom-half/mman/mman.c
@@ -0,0 +1,124 @@
+// Userspace emulation of mmap and munmap. Restrictions apply.
+//
+// This is meant to be complete enough to be compatible with code that uses
+// mmap for simple file I/O. It just allocates memory with malloc and reads
+// and writes data with pread and pwrite.
+
+#define _WASI_EMULATED_MMAN
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+
+struct map {
+ int prot;
+ int flags;
+ off_t offset;
+ size_t length;
+};
+
+void *mmap(void *addr, size_t length, int prot, int flags,
+ int fd, off_t offset) {
+ // Check for unsupported flags.
+ if ((flags & (MAP_PRIVATE | MAP_SHARED)) == 0 ||
+ (flags & MAP_FIXED) != 0 ||
+#ifdef MAP_SHARED_VALIDATE
+ (flags & MAP_SHARED_VALIDATE) == MAP_SHARED_VALIDATE ||
+#endif
+#ifdef MAP_NORESERVE
+ (flags & MAP_NORESERVE) != 0 ||
+#endif
+#ifdef MAP_GROWSDOWN
+ (flags & MAP_GROWSDOWN) != 0 ||
+#endif
+#ifdef MAP_HUGETLB
+ (flags & MAP_HUGETLB) != 0 ||
+#endif
+#ifdef MAP_FIXED_NOREPLACE
+ (flags & MAP_FIXED_NOREPLACE) != 0 ||
+#endif
+ 0)
+ {
+ errno = EINVAL;
+ return MAP_FAILED;
+ }
+
+ // Check for unsupported protection requests.
+ if (prot == PROT_NONE ||
+#ifdef PROT_EXEC
+ (prot & PROT_EXEC) != 0 ||
+#endif
+ 0)
+ {
+ errno = EINVAL;
+ return MAP_FAILED;
+ }
+
+ // To be consistent with POSIX.
+ if (length == 0) {
+ errno = EINVAL;
+ return MAP_FAILED;
+ }
+
+ // Check for integer overflow.
+ size_t buf_len = 0;
+ if (__builtin_add_overflow(length, sizeof(struct map), &buf_len)) {
+ errno = ENOMEM;
+ return MAP_FAILED;
+ }
+
+ // Allocate the memory.
+ struct map *map = malloc(buf_len);
+ if (!map) {
+ errno = ENOMEM;
+ return MAP_FAILED;
+ }
+
+ // Initialize the header.
+ map->prot = prot;
+ map->flags = flags;
+ map->offset = offset;
+ map->length = length;
+
+ // Initialize the main memory buffer, either with the contents of a file,
+ // or with zeros.
+ addr = map + 1;
+ if ((flags & MAP_ANON) == 0) {
+ char *body = (char *)addr;
+ while (length > 0) {
+ const ssize_t nread = pread(fd, body, length, offset);
+ if (nread < 0) {
+ if (errno == EINTR)
+ continue;
+ return MAP_FAILED;
+ }
+ if (nread == 0)
+ break;
+ length -= (size_t)nread;
+ offset += (size_t)nread;
+ body += (size_t)nread;
+ }
+ } else {
+ memset(addr, 0, length);
+ }
+
+ return addr;
+}
+
+int munmap(void *addr, size_t length) {
+ struct map *map = (struct map *)addr - 1;
+
+ // We don't support partial munmapping.
+ if (map->length != length) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ // Release the memory.
+ free(map);
+
+ // Success!
+ return 0;
+}
diff --git a/libc-bottom-half/signal/signal.c b/libc-bottom-half/signal/signal.c
new file mode 100644
index 0000000..290d6b2
--- /dev/null
+++ b/libc-bottom-half/signal/signal.c
@@ -0,0 +1,142 @@
+// Userspace emulation of `raise` and `signal`.
+//
+// WebAssembly doesn't support asynchronous signal delivery, so we can't
+// support it in WASI libc. But we can make things like `raise` work.
+
+#define _WASI_EMULATED_SIGNAL
+#define _ALL_SOURCE
+#define _GNU_SOURCE
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <assert.h>
+
+void __SIG_IGN(int sig) {
+ // do nothing
+}
+
+_Noreturn
+void __SIG_ERR(int sig) {
+ __builtin_trap();
+}
+
+_Noreturn
+static void core_handler(int sig) {
+ fprintf(stderr, "Program received fatal signal: %s\n", strsignal(sig));
+ abort();
+}
+
+_Noreturn
+static void terminate_handler(int sig) {
+ fprintf(stderr, "Program recieved termination signal: %s\n", strsignal(sig));
+ abort();
+}
+
+_Noreturn
+static void stop_handler(int sig) {
+ fprintf(stderr, "Program recieved stop signal: %s\n", strsignal(sig));
+ abort();
+}
+
+static void continue_handler(int sig) {
+ // do nothing
+}
+
+static const sighandler_t default_handlers[_NSIG] = {
+ // Default behavior: "core".
+ [SIGABRT] = core_handler,
+ [SIGBUS] = core_handler,
+ [SIGFPE] = core_handler,
+ [SIGILL] = core_handler,
+#if SIGIOT != SIGABRT
+ [SIGIOT] = core_handler,
+#endif
+ [SIGQUIT] = core_handler,
+ [SIGSEGV] = core_handler,
+ [SIGSYS] = core_handler,
+ [SIGTRAP] = core_handler,
+ [SIGXCPU] = core_handler,
+ [SIGXFSZ] = core_handler,
+#if defined(SIGUNUSED) && SIGUNUSED != SIGSYS
+ [SIGUNUSED] = core_handler,
+#endif
+
+ // Default behavior: ignore.
+ [SIGCHLD] = SIG_IGN,
+#if defined(SIGCLD) && SIGCLD != SIGCHLD
+ [SIGCLD] = SIG_IGN,
+#endif
+ [SIGURG] = SIG_IGN,
+ [SIGWINCH] = SIG_IGN,
+
+ // Default behavior: "continue".
+ [SIGCONT] = continue_handler,
+
+ // Default behavior: "stop".
+ [SIGSTOP] = stop_handler,
+ [SIGTSTP] = stop_handler,
+ [SIGTTIN] = stop_handler,
+ [SIGTTOU] = stop_handler,
+
+ // Default behavior: "terminate".
+ [SIGHUP] = terminate_handler,
+ [SIGINT] = terminate_handler,
+ [SIGKILL] = terminate_handler,
+ [SIGUSR1] = terminate_handler,
+ [SIGUSR2] = terminate_handler,
+ [SIGPIPE] = terminate_handler,
+ [SIGALRM] = terminate_handler,
+ [SIGTERM] = terminate_handler,
+ [SIGSTKFLT] = terminate_handler,
+ [SIGVTALRM] = terminate_handler,
+ [SIGPROF] = terminate_handler,
+ [SIGIO] = terminate_handler,
+#if SIGPOLL != SIGIO
+ [SIGPOLL] = terminate_handler,
+#endif
+ [SIGPWR] = terminate_handler,
+};
+
+static sighandler_t handlers[_NSIG];
+
+int raise(int sig) {
+ if (sig < 0 || sig >= _NSIG) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ sighandler_t func = handlers[sig];
+
+ if (func == NULL) {
+ default_handlers[sig](sig);
+ } else {
+ func(sig);
+ }
+
+ return 0;
+}
+
+void (*signal(int sig, void (*func)(int)))(int) {
+ assert(SIG_DFL == NULL);
+
+ if (sig < 0 || sig >= _NSIG) {
+ errno = EINVAL;
+ return SIG_ERR;
+ }
+
+ if (sig == SIGKILL || sig == SIGSTOP) {
+ errno = EINVAL;
+ return SIG_ERR;
+ }
+
+ sighandler_t old = handlers[sig];
+
+ handlers[sig] = func;
+
+ return old;
+}
+
+extern __typeof(signal) bsd_signal __attribute__((weak, alias("signal")));
+extern __typeof(signal) __sysv_signal __attribute__((weak, alias("signal")));
diff --git a/libc-bottom-half/sources/__errno_location.c b/libc-bottom-half/sources/__errno_location.c
new file mode 100644
index 0000000..5e6ef5e
--- /dev/null
+++ b/libc-bottom-half/sources/__errno_location.c
@@ -0,0 +1,5 @@
+#include <errno.h>
+
+int *__errno_location(void) {
+ return &errno;
+}
diff --git a/libc-bottom-half/sources/__main_void.c b/libc-bottom-half/sources/__main_void.c
new file mode 100644
index 0000000..cba22ef
--- /dev/null
+++ b/libc-bottom-half/sources/__main_void.c
@@ -0,0 +1,54 @@
+#include <wasi/api.h>
+#include <stdlib.h>
+#include <sysexits.h>
+
+// The user's `main` function, expecting arguments.
+int __main_argc_argv(int argc, char *argv[]);
+
+// If the user's `main` function expects arguments, the compiler will rename
+// it to `__main_argc_argv`, and this version will get linked in, which
+// initializes the argument data and calls `__main_argc_argv`.
+__attribute__((__weak__, nodebug))
+int __main_void(void) {
+ __wasi_errno_t err;
+
+ // Get the sizes of the arrays we'll have to create to copy in the args.
+ size_t argv_buf_size;
+ size_t argc;
+ err = __wasi_args_sizes_get(&argc, &argv_buf_size);
+ if (err != __WASI_ERRNO_SUCCESS) {
+ _Exit(EX_OSERR);
+ }
+
+ // Add 1 for the NULL pointer to mark the end, and check for overflow.
+ size_t num_ptrs = argc + 1;
+ if (num_ptrs == 0) {
+ _Exit(EX_SOFTWARE);
+ }
+
+ // Allocate memory for storing the argument chars.
+ char *argv_buf = malloc(argv_buf_size);
+ if (argv_buf == NULL) {
+ _Exit(EX_SOFTWARE);
+ }
+
+ // Allocate memory for the array of pointers. This uses `calloc` both to
+ // handle overflow and to initialize the NULL pointer at the end.
+ char **argv = calloc(num_ptrs, sizeof(char *));
+ if (argv == NULL) {
+ free(argv_buf);
+ _Exit(EX_SOFTWARE);
+ }
+
+ // Fill the argument chars, and the argv array with pointers into those chars.
+ // TODO: Remove the casts on `argv_ptrs` and `argv_buf` once the witx is updated with char8 support.
+ err = __wasi_args_get((uint8_t **)argv, (uint8_t *)argv_buf);
+ if (err != __WASI_ERRNO_SUCCESS) {
+ free(argv_buf);
+ free(argv);
+ _Exit(EX_OSERR);
+ }
+
+ // Call `__main_argc_argv` with the arguments!
+ return __main_argc_argv(argc, argv);
+}
diff --git a/libc-bottom-half/sources/__wasilibc_dt.c b/libc-bottom-half/sources/__wasilibc_dt.c
new file mode 100644
index 0000000..b06460f
--- /dev/null
+++ b/libc-bottom-half/sources/__wasilibc_dt.c
@@ -0,0 +1,34 @@
+#include <__header_dirent.h>
+#include <__mode_t.h>
+
+int __wasilibc_iftodt(int x) {
+ switch (x) {
+ case S_IFDIR: return DT_DIR;
+ case S_IFCHR: return DT_CHR;
+ case S_IFBLK: return DT_BLK;
+ case S_IFREG: return DT_REG;
+ case S_IFIFO: return DT_FIFO;
+ case S_IFLNK: return DT_LNK;
+#ifdef DT_SOCK
+ case S_IFSOCK: return DT_SOCK;
+#endif
+ default: return DT_UNKNOWN;
+ }
+}
+
+int __wasilibc_dttoif(int x) {
+ switch (x) {
+ case DT_DIR: return S_IFDIR;
+ case DT_CHR: return S_IFCHR;
+ case DT_BLK: return S_IFBLK;
+ case DT_REG: return S_IFREG;
+ case DT_FIFO: return S_IFIFO;
+ case DT_LNK: return S_IFLNK;
+#ifdef DT_SOCK
+ case DT_SOCK: return S_IFSOCK;
+#endif
+ case DT_UNKNOWN:
+ default:
+ return S_IFSOCK;
+ }
+}
diff --git a/libc-bottom-half/sources/__wasilibc_environ.c b/libc-bottom-half/sources/__wasilibc_environ.c
new file mode 100644
index 0000000..53d0a55
--- /dev/null
+++ b/libc-bottom-half/sources/__wasilibc_environ.c
@@ -0,0 +1,14 @@
+#include <wasi/libc-environ.h>
+
+extern char **__wasilibc_environ;
+
+// See the comments in libc-environ.h.
+char **__wasilibc_get_environ(void) {
+ // Perform lazy initialization if needed.
+ __wasilibc_ensure_environ();
+
+ // Return `environ`. Use the `__wasilibc_`-prefixed name so that we don't
+ // pull in the `environ` symbol directly, which would lead to eager
+ // initialization being done instead.
+ return __wasilibc_environ;
+}
diff --git a/libc-bottom-half/sources/__wasilibc_fd_renumber.c b/libc-bottom-half/sources/__wasilibc_fd_renumber.c
new file mode 100644
index 0000000..aa9d8dc
--- /dev/null
+++ b/libc-bottom-half/sources/__wasilibc_fd_renumber.c
@@ -0,0 +1,13 @@
+#include <wasi/api.h>
+#include <wasi/libc.h>
+#include <errno.h>
+#include <unistd.h>
+
+int __wasilibc_fd_renumber(int fd, int newfd) {
+ __wasi_errno_t error = __wasi_fd_renumber(fd, newfd);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/sources/__wasilibc_initialize_environ.c b/libc-bottom-half/sources/__wasilibc_initialize_environ.c
new file mode 100644
index 0000000..2d31c5d
--- /dev/null
+++ b/libc-bottom-half/sources/__wasilibc_initialize_environ.c
@@ -0,0 +1,93 @@
+#include <unistd.h>
+#include <stdlib.h>
+#include <sysexits.h>
+#include <wasi/api.h>
+#include <wasi/libc.h>
+#include <wasi/libc-environ.h>
+
+/// If the program doesn't use `environ`, it'll get this version of
+/// `__wasilibc_environ`, which isn't initialized with a constructor function.
+/// `getenv` etc. call `__wasilibc_ensure_environ()` before accessing it.
+/// Statically-initialize it to an invalid pointer value so that we can
+/// detect if it's been explicitly initialized (we can't use `NULL` because
+/// `clearenv` sets it to NULL.
+weak char **__wasilibc_environ = (char **)-1;
+
+// See the comments in libc-environ.h.
+void __wasilibc_ensure_environ(void) {
+ if (__wasilibc_environ == (char **)-1) {
+ __wasilibc_initialize_environ();
+ }
+}
+
+/// Avoid dynamic allocation for the case where there are no environment
+/// variables, but we still need a non-NULL pointer to an (empty) array.
+static char *empty_environ[1] = { NULL };
+
+// See the comments in libc-environ.h.
+void __wasilibc_initialize_environ(void) {
+ // Get the sizes of the arrays we'll have to create to copy in the environment.
+ size_t environ_count;
+ size_t environ_buf_size;
+ __wasi_errno_t err = __wasi_environ_sizes_get(&environ_count, &environ_buf_size);
+ if (err != __WASI_ERRNO_SUCCESS) {
+ goto oserr;
+ }
+ if (environ_count == 0) {
+ __wasilibc_environ = empty_environ;
+ return;
+ }
+
+ // Add 1 for the NULL pointer to mark the end, and check for overflow.
+ size_t num_ptrs = environ_count + 1;
+ if (num_ptrs == 0) {
+ goto software;
+ }
+
+ // Allocate memory for storing the environment chars.
+ char *environ_buf = malloc(environ_buf_size);
+ if (environ_buf == NULL) {
+ goto software;
+ }
+
+ // Allocate memory for the array of pointers. This uses `calloc` both to
+ // handle overflow and to initialize the NULL pointer at the end.
+ char **environ_ptrs = calloc(num_ptrs, sizeof(char *));
+ if (environ_ptrs == NULL) {
+ free(environ_buf);
+ goto software;
+ }
+
+ // Fill the environment chars, and the `__wasilibc_environ` array with
+ // pointers into those chars.
+ // TODO: Remove the casts on `environ_ptrs` and `environ_buf` once the witx is updated with char8 support.
+ err = __wasi_environ_get((uint8_t **)environ_ptrs, (uint8_t *)environ_buf);
+ if (err != __WASI_ERRNO_SUCCESS) {
+ free(environ_buf);
+ free(environ_ptrs);
+ goto oserr;
+ }
+
+ __wasilibc_environ = environ_ptrs;
+ return;
+oserr:
+ _Exit(EX_OSERR);
+software:
+ _Exit(EX_SOFTWARE);
+}
+
+// See the comments in libc-environ.h.
+void __wasilibc_deinitialize_environ(void) {
+ if (__wasilibc_environ != (char **)-1) {
+ // Let libc-top-half clear the old environment-variable strings.
+ clearenv();
+ // Set the pointer to the special init value.
+ __wasilibc_environ = (char **)-1;
+ }
+}
+
+// See the comments in libc-environ.h.
+weak void __wasilibc_maybe_reinitialize_environ_eagerly(void) {
+ // This version does nothing. It may be overridden by a version which does
+ // something if `environ` is used.
+}
diff --git a/libc-bottom-half/sources/__wasilibc_real.c b/libc-bottom-half/sources/__wasilibc_real.c
new file mode 100644
index 0000000..855a2c6
--- /dev/null
+++ b/libc-bottom-half/sources/__wasilibc_real.c
@@ -0,0 +1,672 @@
+/**
+ * THIS FILE IS AUTO-GENERATED from the following files:
+ * wasi_snapshot_preview1.witx
+ *
+ * To regenerate this file execute:
+ *
+ * cargo run --manifest-path tools/wasi-headers/Cargo.toml generate-libc
+ *
+ * Modifications to this file will cause CI to fail, the code generator tool
+ * must be modified to change this file.
+ */
+
+#include <wasi/api.h>
+#include <string.h>
+
+int32_t __imported_wasi_snapshot_preview1_args_get(int32_t arg0, int32_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("args_get")
+));
+
+__wasi_errno_t __wasi_args_get(
+ uint8_t * * argv,
+ uint8_t * argv_buf
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_args_get((int32_t) argv, (int32_t) argv_buf);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_args_sizes_get(int32_t arg0, int32_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("args_sizes_get")
+));
+
+__wasi_errno_t __wasi_args_sizes_get(
+ __wasi_size_t *retptr0,
+ __wasi_size_t *retptr1
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_args_sizes_get((int32_t) retptr0, (int32_t) retptr1);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_environ_get(int32_t arg0, int32_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("environ_get")
+));
+
+__wasi_errno_t __wasi_environ_get(
+ uint8_t * * environ,
+ uint8_t * environ_buf
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_environ_get((int32_t) environ, (int32_t) environ_buf);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_environ_sizes_get(int32_t arg0, int32_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("environ_sizes_get")
+));
+
+__wasi_errno_t __wasi_environ_sizes_get(
+ __wasi_size_t *retptr0,
+ __wasi_size_t *retptr1
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_environ_sizes_get((int32_t) retptr0, (int32_t) retptr1);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_clock_res_get(int32_t arg0, int32_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("clock_res_get")
+));
+
+__wasi_errno_t __wasi_clock_res_get(
+ __wasi_clockid_t id,
+ __wasi_timestamp_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_clock_res_get((int32_t) id, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_clock_time_get(int32_t arg0, int64_t arg1, int32_t arg2) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("clock_time_get")
+));
+
+__wasi_errno_t __wasi_clock_time_get(
+ __wasi_clockid_t id,
+ __wasi_timestamp_t precision,
+ __wasi_timestamp_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_clock_time_get((int32_t) id, (int64_t) precision, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_advise(int32_t arg0, int64_t arg1, int64_t arg2, int32_t arg3) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_advise")
+));
+
+__wasi_errno_t __wasi_fd_advise(
+ __wasi_fd_t fd,
+ __wasi_filesize_t offset,
+ __wasi_filesize_t len,
+ __wasi_advice_t advice
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_advise((int32_t) fd, (int64_t) offset, (int64_t) len, (int32_t) advice);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_allocate(int32_t arg0, int64_t arg1, int64_t arg2) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_allocate")
+));
+
+__wasi_errno_t __wasi_fd_allocate(
+ __wasi_fd_t fd,
+ __wasi_filesize_t offset,
+ __wasi_filesize_t len
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_allocate((int32_t) fd, (int64_t) offset, (int64_t) len);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_close(int32_t arg0) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_close")
+));
+
+__wasi_errno_t __wasi_fd_close(
+ __wasi_fd_t fd
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_close((int32_t) fd);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_datasync(int32_t arg0) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_datasync")
+));
+
+__wasi_errno_t __wasi_fd_datasync(
+ __wasi_fd_t fd
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_datasync((int32_t) fd);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_fdstat_get(int32_t arg0, int32_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_fdstat_get")
+));
+
+__wasi_errno_t __wasi_fd_fdstat_get(
+ __wasi_fd_t fd,
+ __wasi_fdstat_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_fdstat_get((int32_t) fd, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_fdstat_set_flags(int32_t arg0, int32_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_fdstat_set_flags")
+));
+
+__wasi_errno_t __wasi_fd_fdstat_set_flags(
+ __wasi_fd_t fd,
+ __wasi_fdflags_t flags
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_fdstat_set_flags((int32_t) fd, flags);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_fdstat_set_rights(int32_t arg0, int64_t arg1, int64_t arg2) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_fdstat_set_rights")
+));
+
+__wasi_errno_t __wasi_fd_fdstat_set_rights(
+ __wasi_fd_t fd,
+ __wasi_rights_t fs_rights_base,
+ __wasi_rights_t fs_rights_inheriting
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_fdstat_set_rights((int32_t) fd, fs_rights_base, fs_rights_inheriting);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_filestat_get(int32_t arg0, int32_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_filestat_get")
+));
+
+__wasi_errno_t __wasi_fd_filestat_get(
+ __wasi_fd_t fd,
+ __wasi_filestat_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_filestat_get((int32_t) fd, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_filestat_set_size(int32_t arg0, int64_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_filestat_set_size")
+));
+
+__wasi_errno_t __wasi_fd_filestat_set_size(
+ __wasi_fd_t fd,
+ __wasi_filesize_t size
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_filestat_set_size((int32_t) fd, (int64_t) size);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_filestat_set_times(int32_t arg0, int64_t arg1, int64_t arg2, int32_t arg3) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_filestat_set_times")
+));
+
+__wasi_errno_t __wasi_fd_filestat_set_times(
+ __wasi_fd_t fd,
+ __wasi_timestamp_t atim,
+ __wasi_timestamp_t mtim,
+ __wasi_fstflags_t fst_flags
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_filestat_set_times((int32_t) fd, (int64_t) atim, (int64_t) mtim, fst_flags);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_pread(int32_t arg0, int32_t arg1, int32_t arg2, int64_t arg3, int32_t arg4) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_pread")
+));
+
+__wasi_errno_t __wasi_fd_pread(
+ __wasi_fd_t fd,
+ const __wasi_iovec_t *iovs,
+ size_t iovs_len,
+ __wasi_filesize_t offset,
+ __wasi_size_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_pread((int32_t) fd, (int32_t) iovs, (int32_t) iovs_len, (int64_t) offset, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_prestat_get(int32_t arg0, int32_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_prestat_get")
+));
+
+__wasi_errno_t __wasi_fd_prestat_get(
+ __wasi_fd_t fd,
+ __wasi_prestat_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_prestat_get((int32_t) fd, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_prestat_dir_name(int32_t arg0, int32_t arg1, int32_t arg2) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_prestat_dir_name")
+));
+
+__wasi_errno_t __wasi_fd_prestat_dir_name(
+ __wasi_fd_t fd,
+ uint8_t * path,
+ __wasi_size_t path_len
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_prestat_dir_name((int32_t) fd, (int32_t) path, (int32_t) path_len);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_pwrite(int32_t arg0, int32_t arg1, int32_t arg2, int64_t arg3, int32_t arg4) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_pwrite")
+));
+
+__wasi_errno_t __wasi_fd_pwrite(
+ __wasi_fd_t fd,
+ const __wasi_ciovec_t *iovs,
+ size_t iovs_len,
+ __wasi_filesize_t offset,
+ __wasi_size_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_pwrite((int32_t) fd, (int32_t) iovs, (int32_t) iovs_len, (int64_t) offset, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_read(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_read")
+));
+
+__wasi_errno_t __wasi_fd_read(
+ __wasi_fd_t fd,
+ const __wasi_iovec_t *iovs,
+ size_t iovs_len,
+ __wasi_size_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_read((int32_t) fd, (int32_t) iovs, (int32_t) iovs_len, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_readdir(int32_t arg0, int32_t arg1, int32_t arg2, int64_t arg3, int32_t arg4) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_readdir")
+));
+
+__wasi_errno_t __wasi_fd_readdir(
+ __wasi_fd_t fd,
+ uint8_t * buf,
+ __wasi_size_t buf_len,
+ __wasi_dircookie_t cookie,
+ __wasi_size_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_readdir((int32_t) fd, (int32_t) buf, (int32_t) buf_len, (int64_t) cookie, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_renumber(int32_t arg0, int32_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_renumber")
+));
+
+__wasi_errno_t __wasi_fd_renumber(
+ __wasi_fd_t fd,
+ __wasi_fd_t to
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_renumber((int32_t) fd, (int32_t) to);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_seek(int32_t arg0, int64_t arg1, int32_t arg2, int32_t arg3) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_seek")
+));
+
+__wasi_errno_t __wasi_fd_seek(
+ __wasi_fd_t fd,
+ __wasi_filedelta_t offset,
+ __wasi_whence_t whence,
+ __wasi_filesize_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_seek((int32_t) fd, offset, (int32_t) whence, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_sync(int32_t arg0) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_sync")
+));
+
+__wasi_errno_t __wasi_fd_sync(
+ __wasi_fd_t fd
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_sync((int32_t) fd);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_tell(int32_t arg0, int32_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_tell")
+));
+
+__wasi_errno_t __wasi_fd_tell(
+ __wasi_fd_t fd,
+ __wasi_filesize_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_tell((int32_t) fd, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_fd_write(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("fd_write")
+));
+
+__wasi_errno_t __wasi_fd_write(
+ __wasi_fd_t fd,
+ const __wasi_ciovec_t *iovs,
+ size_t iovs_len,
+ __wasi_size_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_fd_write((int32_t) fd, (int32_t) iovs, (int32_t) iovs_len, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_path_create_directory(int32_t arg0, int32_t arg1, int32_t arg2) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("path_create_directory")
+));
+
+__wasi_errno_t __wasi_path_create_directory(
+ __wasi_fd_t fd,
+ const char *path
+){
+ size_t path_len = strlen(path);
+ int32_t ret = __imported_wasi_snapshot_preview1_path_create_directory((int32_t) fd, (int32_t) path, (int32_t) path_len);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_path_filestat_get(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("path_filestat_get")
+));
+
+__wasi_errno_t __wasi_path_filestat_get(
+ __wasi_fd_t fd,
+ __wasi_lookupflags_t flags,
+ const char *path,
+ __wasi_filestat_t *retptr0
+){
+ size_t path_len = strlen(path);
+ int32_t ret = __imported_wasi_snapshot_preview1_path_filestat_get((int32_t) fd, flags, (int32_t) path, (int32_t) path_len, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_path_filestat_set_times(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3, int64_t arg4, int64_t arg5, int32_t arg6) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("path_filestat_set_times")
+));
+
+__wasi_errno_t __wasi_path_filestat_set_times(
+ __wasi_fd_t fd,
+ __wasi_lookupflags_t flags,
+ const char *path,
+ __wasi_timestamp_t atim,
+ __wasi_timestamp_t mtim,
+ __wasi_fstflags_t fst_flags
+){
+ size_t path_len = strlen(path);
+ int32_t ret = __imported_wasi_snapshot_preview1_path_filestat_set_times((int32_t) fd, flags, (int32_t) path, (int32_t) path_len, (int64_t) atim, (int64_t) mtim, fst_flags);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_path_link(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4, int32_t arg5, int32_t arg6) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("path_link")
+));
+
+__wasi_errno_t __wasi_path_link(
+ __wasi_fd_t old_fd,
+ __wasi_lookupflags_t old_flags,
+ const char *old_path,
+ __wasi_fd_t new_fd,
+ const char *new_path
+){
+ size_t old_path_len = strlen(old_path);
+ size_t new_path_len = strlen(new_path);
+ int32_t ret = __imported_wasi_snapshot_preview1_path_link((int32_t) old_fd, old_flags, (int32_t) old_path, (int32_t) old_path_len, (int32_t) new_fd, (int32_t) new_path, (int32_t) new_path_len);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_path_open(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4, int64_t arg5, int64_t arg6, int32_t arg7, int32_t arg8) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("path_open")
+));
+
+__wasi_errno_t __wasi_path_open(
+ __wasi_fd_t fd,
+ __wasi_lookupflags_t dirflags,
+ const char *path,
+ __wasi_oflags_t oflags,
+ __wasi_rights_t fs_rights_base,
+ __wasi_rights_t fs_rights_inheriting,
+ __wasi_fdflags_t fdflags,
+ __wasi_fd_t *retptr0
+){
+ size_t path_len = strlen(path);
+ int32_t ret = __imported_wasi_snapshot_preview1_path_open((int32_t) fd, dirflags, (int32_t) path, (int32_t) path_len, oflags, fs_rights_base, fs_rights_inheriting, fdflags, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_path_readlink(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4, int32_t arg5) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("path_readlink")
+));
+
+__wasi_errno_t __wasi_path_readlink(
+ __wasi_fd_t fd,
+ const char *path,
+ uint8_t * buf,
+ __wasi_size_t buf_len,
+ __wasi_size_t *retptr0
+){
+ size_t path_len = strlen(path);
+ int32_t ret = __imported_wasi_snapshot_preview1_path_readlink((int32_t) fd, (int32_t) path, (int32_t) path_len, (int32_t) buf, (int32_t) buf_len, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_path_remove_directory(int32_t arg0, int32_t arg1, int32_t arg2) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("path_remove_directory")
+));
+
+__wasi_errno_t __wasi_path_remove_directory(
+ __wasi_fd_t fd,
+ const char *path
+){
+ size_t path_len = strlen(path);
+ int32_t ret = __imported_wasi_snapshot_preview1_path_remove_directory((int32_t) fd, (int32_t) path, (int32_t) path_len);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_path_rename(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4, int32_t arg5) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("path_rename")
+));
+
+__wasi_errno_t __wasi_path_rename(
+ __wasi_fd_t fd,
+ const char *old_path,
+ __wasi_fd_t new_fd,
+ const char *new_path
+){
+ size_t old_path_len = strlen(old_path);
+ size_t new_path_len = strlen(new_path);
+ int32_t ret = __imported_wasi_snapshot_preview1_path_rename((int32_t) fd, (int32_t) old_path, (int32_t) old_path_len, (int32_t) new_fd, (int32_t) new_path, (int32_t) new_path_len);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_path_symlink(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("path_symlink")
+));
+
+__wasi_errno_t __wasi_path_symlink(
+ const char *old_path,
+ __wasi_fd_t fd,
+ const char *new_path
+){
+ size_t old_path_len = strlen(old_path);
+ size_t new_path_len = strlen(new_path);
+ int32_t ret = __imported_wasi_snapshot_preview1_path_symlink((int32_t) old_path, (int32_t) old_path_len, (int32_t) fd, (int32_t) new_path, (int32_t) new_path_len);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_path_unlink_file(int32_t arg0, int32_t arg1, int32_t arg2) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("path_unlink_file")
+));
+
+__wasi_errno_t __wasi_path_unlink_file(
+ __wasi_fd_t fd,
+ const char *path
+){
+ size_t path_len = strlen(path);
+ int32_t ret = __imported_wasi_snapshot_preview1_path_unlink_file((int32_t) fd, (int32_t) path, (int32_t) path_len);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_poll_oneoff(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("poll_oneoff")
+));
+
+__wasi_errno_t __wasi_poll_oneoff(
+ const __wasi_subscription_t * in,
+ __wasi_event_t * out,
+ __wasi_size_t nsubscriptions,
+ __wasi_size_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_poll_oneoff((int32_t) in, (int32_t) out, (int32_t) nsubscriptions, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+_Noreturn void __imported_wasi_snapshot_preview1_proc_exit(int32_t arg0) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("proc_exit")
+));
+
+_Noreturn void __wasi_proc_exit(
+ __wasi_exitcode_t rval
+){
+ __imported_wasi_snapshot_preview1_proc_exit((int32_t) rval);
+}
+
+int32_t __imported_wasi_snapshot_preview1_sched_yield() __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("sched_yield")
+));
+
+__wasi_errno_t __wasi_sched_yield(
+ void
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_sched_yield();
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_random_get(int32_t arg0, int32_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("random_get")
+));
+
+__wasi_errno_t __wasi_random_get(
+ uint8_t * buf,
+ __wasi_size_t buf_len
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_random_get((int32_t) buf, (int32_t) buf_len);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_sock_accept(int32_t arg0, int32_t arg1, int32_t arg2) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("sock_accept")
+));
+
+__wasi_errno_t __wasi_sock_accept(
+ __wasi_fd_t fd,
+ __wasi_fdflags_t flags,
+ __wasi_fd_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_sock_accept((int32_t) fd, flags, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_sock_recv(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4, int32_t arg5) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("sock_recv")
+));
+
+__wasi_errno_t __wasi_sock_recv(
+ __wasi_fd_t fd,
+ const __wasi_iovec_t *ri_data,
+ size_t ri_data_len,
+ __wasi_riflags_t ri_flags,
+ __wasi_size_t *retptr0,
+ __wasi_roflags_t *retptr1
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_sock_recv((int32_t) fd, (int32_t) ri_data, (int32_t) ri_data_len, ri_flags, (int32_t) retptr0, (int32_t) retptr1);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_sock_send(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("sock_send")
+));
+
+__wasi_errno_t __wasi_sock_send(
+ __wasi_fd_t fd,
+ const __wasi_ciovec_t *si_data,
+ size_t si_data_len,
+ __wasi_siflags_t si_flags,
+ __wasi_size_t *retptr0
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_sock_send((int32_t) fd, (int32_t) si_data, (int32_t) si_data_len, (int32_t) si_flags, (int32_t) retptr0);
+ return (uint16_t) ret;
+}
+
+int32_t __imported_wasi_snapshot_preview1_sock_shutdown(int32_t arg0, int32_t arg1) __attribute__((
+ __import_module__("wasi_snapshot_preview1"),
+ __import_name__("sock_shutdown")
+));
+
+__wasi_errno_t __wasi_sock_shutdown(
+ __wasi_fd_t fd,
+ __wasi_sdflags_t how
+){
+ int32_t ret = __imported_wasi_snapshot_preview1_sock_shutdown((int32_t) fd, how);
+ return (uint16_t) ret;
+}
+
+#ifdef _REENTRANT
+int32_t __imported_wasi_thread_spawn(int32_t arg0) __attribute__((
+ __import_module__("wasi"),
+ __import_name__("thread_spawn")
+));
+
+__wasi_errno_t __wasi_thread_spawn(void* start_arg) {
+ int32_t ret = __imported_wasi_thread_spawn((int32_t) start_arg);
+ return (uint16_t) ret;
+}
+#endif
diff --git a/libc-bottom-half/sources/__wasilibc_rmdirat.c b/libc-bottom-half/sources/__wasilibc_rmdirat.c
new file mode 100644
index 0000000..b2b906a
--- /dev/null
+++ b/libc-bottom-half/sources/__wasilibc_rmdirat.c
@@ -0,0 +1,12 @@
+#include <wasi/api.h>
+#include <wasi/libc.h>
+#include <errno.h>
+
+int __wasilibc_nocwd___wasilibc_rmdirat(int fd, const char *path) {
+ __wasi_errno_t error = __wasi_path_remove_directory(fd, path);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/sources/__wasilibc_tell.c b/libc-bottom-half/sources/__wasilibc_tell.c
new file mode 100644
index 0000000..358d0ca
--- /dev/null
+++ b/libc-bottom-half/sources/__wasilibc_tell.c
@@ -0,0 +1,14 @@
+#include <wasi/api.h>
+#include <errno.h>
+
+off_t __wasilibc_tell(int fildes) {
+ __wasi_filesize_t offset;
+ __wasi_errno_t error = __wasi_fd_tell(fildes, &offset);
+ if (error != 0) {
+ // lseek returns ESPIPE on when called on a pipe, socket, or fifo,
+ // which on WASI would translate into ENOTCAPABLE.
+ errno = error == ENOTCAPABLE ? ESPIPE : error;
+ return -1;
+ }
+ return offset;
+}
diff --git a/libc-bottom-half/sources/__wasilibc_unlinkat.c b/libc-bottom-half/sources/__wasilibc_unlinkat.c
new file mode 100644
index 0000000..8b4f6b5
--- /dev/null
+++ b/libc-bottom-half/sources/__wasilibc_unlinkat.c
@@ -0,0 +1,12 @@
+#include <wasi/api.h>
+#include <wasi/libc.h>
+#include <errno.h>
+
+int __wasilibc_nocwd___wasilibc_unlinkat(int fd, const char *path) {
+ __wasi_errno_t error = __wasi_path_unlink_file(fd, path);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
diff --git a/libc-bottom-half/sources/abort.c b/libc-bottom-half/sources/abort.c
new file mode 100644
index 0000000..95fe2be
--- /dev/null
+++ b/libc-bottom-half/sources/abort.c
@@ -0,0 +1,6 @@
+#include <stdlib.h>
+
+void abort(void) {
+ // wasm doesn't support signals, so just trap to halt the program.
+ __builtin_trap();
+}
diff --git a/libc-bottom-half/sources/accept.c b/libc-bottom-half/sources/accept.c
new file mode 100644
index 0000000..902e731
--- /dev/null
+++ b/libc-bottom-half/sources/accept.c
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <sys/socket.h>
+
+#include <assert.h>
+#include <wasi/api.h>
+#include <errno.h>
+#include <string.h>
+
+int accept(int socket, struct sockaddr *restrict addr, socklen_t *restrict addrlen) {
+ int ret = -1;
+
+ __wasi_errno_t error = __wasi_sock_accept(socket, 0, &ret);
+
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+
+ // Clear sockaddr to indicate undefined address
+ memset(addr, 0, *addrlen);
+ // might be AF_UNIX or AF_INET
+ addr->sa_family = AF_UNSPEC;
+ *addrlen = sizeof(struct sockaddr);
+
+ return ret;
+}
+
+int accept4(int socket, struct sockaddr *restrict addr, socklen_t *restrict addrlen, int flags) {
+ int ret = -1;
+
+ if (flags & ~(SOCK_NONBLOCK | SOCK_CLOEXEC)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ __wasi_errno_t error = __wasi_sock_accept(socket, (flags & SOCK_NONBLOCK) ? __WASI_FDFLAGS_NONBLOCK : 0, &ret);
+
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+
+ // Clear sockaddr to indicate undefined address
+ memset(addr, 0, *addrlen);
+ // might be AF_UNIX or AF_INET
+ addr->sa_family = AF_UNSPEC;
+ *addrlen = sizeof(struct sockaddr);
+
+ return ret;
+}
diff --git a/libc-bottom-half/sources/at_fdcwd.c b/libc-bottom-half/sources/at_fdcwd.c
new file mode 100644
index 0000000..c83797d
--- /dev/null
+++ b/libc-bottom-half/sources/at_fdcwd.c
@@ -0,0 +1,141 @@
+// Handle AT_FDCWD and absolute paths for the *at functions.
+//
+// In the case of an AT_FDCWD file descriptor or an absolute path, call the
+// corresponding non-`at` function. This will send it through the libpreopen
+// wrappers to convert the path into a directory file descriptor and relative
+// path before translating it into the corresponding `__wasilibc_nocwd_*at`
+// function, which then calls the appropriate WASI function.
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <wasi/libc.h>
+#include <wasi/libc-nocwd.h>
+
+// If the platform doesn't define O_TMPFILE, we don't need to worry about it.
+#ifndef O_TMPFILE
+#define O_TMPFILE 0
+#endif
+
+int openat(int dirfd, const char *pathname, int flags, ...) {
+ if (dirfd == AT_FDCWD || pathname[0] == '/') {
+ return open(pathname, flags);
+ }
+
+ return __wasilibc_nocwd_openat_nomode(dirfd, pathname, flags);
+}
+
+int symlinkat(const char *target, int dirfd, const char *linkpath) {
+ if (dirfd == AT_FDCWD || linkpath[0] == '/') {
+ return symlink(target, linkpath);
+ }
+
+ return __wasilibc_nocwd_symlinkat(target, dirfd, linkpath);
+}
+
+ssize_t readlinkat(int dirfd, const char *__restrict pathname, char *__restrict buf, size_t bufsiz) {
+ if (dirfd == AT_FDCWD || pathname[0] == '/') {
+ return readlink(pathname, buf, bufsiz);
+ }
+
+ return __wasilibc_nocwd_readlinkat(dirfd, pathname, buf, bufsiz);
+}
+
+int mkdirat(int dirfd, const char *pathname, mode_t mode) {
+ if (dirfd == AT_FDCWD || pathname[0] == '/') {
+ return mkdir(pathname, mode);
+ }
+
+ return __wasilibc_nocwd_mkdirat_nomode(dirfd, pathname);
+}
+
+DIR *opendirat(int dirfd, const char *path) {
+ if (dirfd == AT_FDCWD || path[0] == '/') {
+ return opendir(path);
+ }
+
+ return __wasilibc_nocwd_opendirat(dirfd, path);
+}
+
+int scandirat(int dirfd, const char *dirp, struct dirent ***namelist,
+ int (*filter)(const struct dirent *),
+ int (*compar)(const struct dirent **, const struct dirent **)) {
+ if (dirfd == AT_FDCWD || dirp[0] == '/') {
+ return scandir(dirp, namelist, filter, compar);
+ }
+
+ return __wasilibc_nocwd_scandirat(dirfd, dirp, namelist, filter, compar);
+}
+
+int faccessat(int dirfd, const char *pathname, int mode, int flags) {
+ if (dirfd == AT_FDCWD || pathname[0] == '/') {
+ return __wasilibc_access(pathname, mode, flags);
+ }
+
+ return __wasilibc_nocwd_faccessat(dirfd, pathname, mode, flags);
+}
+
+int fstatat(int dirfd, const char *__restrict pathname, struct stat *__restrict statbuf, int flags) {
+ if (dirfd == AT_FDCWD || pathname[0] == '/') {
+ return __wasilibc_stat(pathname, statbuf, flags);
+ }
+
+ return __wasilibc_nocwd_fstatat(dirfd, pathname, statbuf, flags);
+}
+
+int utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags) {
+ if (dirfd == AT_FDCWD || pathname[0] == '/') {
+ return __wasilibc_utimens(pathname, times, flags);
+ }
+
+ return __wasilibc_nocwd_utimensat(dirfd, pathname, times, flags);
+}
+
+int linkat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags) {
+ if ((olddirfd == AT_FDCWD || oldpath[0] == '/') &&
+ (newdirfd == AT_FDCWD || newpath[0] == '/')) {
+ return __wasilibc_link(oldpath, newpath, flags);
+ }
+ if (olddirfd == AT_FDCWD || oldpath[0] == '/') {
+ return __wasilibc_link_newat(oldpath, newdirfd, newpath, flags);
+ }
+ if (newdirfd == AT_FDCWD || newpath[0] == '/') {
+ return __wasilibc_link_oldat(olddirfd, oldpath, newpath, flags);
+ }
+
+ return __wasilibc_nocwd_linkat(olddirfd, oldpath, newdirfd, newpath, flags);
+}
+
+int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath) {
+ if ((olddirfd == AT_FDCWD || oldpath[0] == '/') &&
+ (newdirfd == AT_FDCWD || newpath[0] == '/')) {
+ return rename(oldpath, newpath);
+ }
+ if (olddirfd == AT_FDCWD || oldpath[0] == '/') {
+ return __wasilibc_rename_newat(oldpath, newdirfd, newpath);
+ }
+ if (newdirfd == AT_FDCWD || newpath[0] == '/') {
+ return __wasilibc_rename_oldat(olddirfd, oldpath, newpath);
+ }
+
+ return __wasilibc_nocwd_renameat(olddirfd, oldpath, newdirfd, newpath);
+}
+
+int __wasilibc_unlinkat(int dirfd, const char *path) {
+ if (dirfd == AT_FDCWD || path[0] == '/') {
+ return unlink(path);
+ }
+
+ return __wasilibc_nocwd___wasilibc_unlinkat(dirfd, path);
+}
+
+int __wasilibc_rmdirat(int dirfd, const char *path) {
+ if (dirfd == AT_FDCWD || path[0] == '/') {
+ return rmdir(path);
+ }
+
+ return __wasilibc_nocwd___wasilibc_rmdirat(dirfd, path);
+}
diff --git a/libc-bottom-half/sources/chdir.c b/libc-bottom-half/sources/chdir.c
new file mode 100644
index 0000000..37c95a4
--- /dev/null
+++ b/libc-bottom-half/sources/chdir.c
@@ -0,0 +1,171 @@
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <wasi/libc-find-relpath.h>
+#include <wasi/libc.h>
+
+#ifdef _REENTRANT
+void __wasilibc_cwd_lock(void);
+void __wasilibc_cwd_unlock(void);
+#else
+#define __wasilibc_cwd_lock() (void)0
+#define __wasilibc_cwd_unlock() (void)0
+#endif
+extern char *__wasilibc_cwd;
+static int __wasilibc_cwd_mallocd = 0;
+
+int chdir(const char *path)
+{
+ static char *relative_buf = NULL;
+ static size_t relative_buf_len = 0;
+
+ // Find a preopen'd directory as well as a relative path we're anchored
+ // from which we're changing directories to.
+ const char *abs;
+ int parent_fd = __wasilibc_find_relpath_alloc(path, &abs, &relative_buf, &relative_buf_len, 1);
+ if (parent_fd == -1)
+ return -1;
+
+ // Make sure that this directory we're accessing is indeed a directory.
+ struct stat dirinfo;
+ int ret = fstatat(parent_fd, relative_buf, &dirinfo, 0);
+ if (ret == -1)
+ return -1;
+ if (!S_ISDIR(dirinfo.st_mode)) {
+ errno = ENOTDIR;
+ return -1;
+ }
+
+ // Create a string that looks like:
+ //
+ // __wasilibc_cwd = "/" + abs + "/" + relative_buf
+ //
+ // If `relative_buf` is equal to "." or `abs` is equal to the empty string,
+ // however, we skip that part and the middle slash.
+ size_t abs_len = strlen(abs);
+ int copy_relative = strcmp(relative_buf, ".") != 0;
+ int mid = copy_relative && abs[0] != 0;
+ char *new_cwd = malloc(1 + abs_len + mid + (copy_relative ? strlen(relative_buf) : 0) + 1);
+ if (new_cwd == NULL) {
+ errno = ENOMEM;
+ return -1;
+ }
+ new_cwd[0] = '/';
+ strcpy(new_cwd + 1, abs);
+ if (mid)
+ new_cwd[1 + abs_len] = '/';
+ if (copy_relative)
+ strcpy(new_cwd + 1 + abs_len + mid, relative_buf);
+
+ // And set our new malloc'd buffer into the global cwd, freeing the
+ // previous one if necessary.
+ __wasilibc_cwd_lock();
+ char *prev_cwd = __wasilibc_cwd;
+ __wasilibc_cwd = new_cwd;
+ __wasilibc_cwd_unlock();
+ if (__wasilibc_cwd_mallocd)
+ free(prev_cwd);
+ __wasilibc_cwd_mallocd = 1;
+ return 0;
+}
+
+static const char *make_absolute(const char *path) {
+ static char *make_absolute_buf = NULL;
+ static size_t make_absolute_len = 0;
+
+ // If this path is absolute, then we return it as-is.
+ if (path[0] == '/') {
+ return path;
+ }
+
+#ifndef _REENTRANT
+ // If the path is empty, or points to the current directory, then return
+ // the current directory.
+ if (path[0] == 0 || !strcmp(path, ".") || !strcmp(path, "./")) {
+ return __wasilibc_cwd;
+ }
+#endif
+
+ // If the path starts with `./` then we won't be appending that to the cwd.
+ if (path[0] == '.' && path[1] == '/')
+ path += 2;
+
+ // Otherwise we'll take the current directory, add a `/`, and then add the
+ // input `path`. Note that this doesn't do any normalization (like removing
+ // `/./`).
+ __wasilibc_cwd_lock();
+ size_t cwd_len = strlen(__wasilibc_cwd);
+ size_t path_len = path ? strlen(path) : 0;
+ __wasilibc_cwd_unlock();
+ int need_slash = __wasilibc_cwd[cwd_len - 1] == '/' ? 0 : 1;
+ size_t alloc_len = cwd_len + path_len + 1 + need_slash;
+ if (alloc_len > make_absolute_len) {
+ char *tmp = realloc(make_absolute_buf, alloc_len);
+ if (tmp == NULL) {
+ __wasilibc_cwd_unlock();
+ return NULL;
+ }
+ make_absolute_buf = tmp;
+ make_absolute_len = alloc_len;
+ }
+ strcpy(make_absolute_buf, __wasilibc_cwd);
+ __wasilibc_cwd_unlock();
+
+#ifdef _REENTRANT
+ if (path[0] == 0 || !strcmp(path, ".") || !strcmp(path, "./")) {
+ return make_absolute_buf;
+ }
+#endif
+
+ if (need_slash)
+ strcpy(make_absolute_buf + cwd_len, "/");
+ strcpy(make_absolute_buf + cwd_len + need_slash, path);
+ return make_absolute_buf;
+}
+
+// Helper function defined only in this object file and weakly referenced from
+// `preopens.c` and `posix.c` This function isn't necessary unless `chdir` is
+// pulled in because all paths are otherwise absolute or relative to the root.
+int __wasilibc_find_relpath_alloc(
+ const char *path,
+ const char **abs_prefix,
+ char **relative_buf,
+ size_t *relative_buf_len,
+ int can_realloc
+) {
+ // First, make our path absolute taking the cwd into account.
+ const char *abspath = make_absolute(path);
+ if (abspath == NULL) {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ // Next use our absolute path and split it. Find the preopened `fd` parent
+ // directory and set `abs_prefix`. Next up we'll be trying to fit `rel`
+ // into `relative_buf`.
+ const char *rel;
+ int fd = __wasilibc_find_abspath(abspath, abs_prefix, &rel);
+ if (fd == -1)
+ return -1;
+
+ size_t rel_len = strlen(rel);
+ if (*relative_buf_len < rel_len + 1) {
+ if (!can_realloc) {
+ errno = ERANGE;
+ return -1;
+ }
+ char *tmp = realloc(*relative_buf, rel_len + 1);
+ if (tmp == NULL) {
+ errno = ENOMEM;
+ return -1;
+ }
+ *relative_buf = tmp;
+ *relative_buf_len = rel_len + 1;
+ }
+ strcpy(*relative_buf, rel);
+ return fd;
+}
diff --git a/libc-bottom-half/sources/complex-builtins.c b/libc-bottom-half/sources/complex-builtins.c
new file mode 100644
index 0000000..971d57e
--- /dev/null
+++ b/libc-bottom-half/sources/complex-builtins.c
@@ -0,0 +1,29 @@
+// Each of the following complex functions can be implemented with a single
+// wasm instruction, so use that implementation rather than the portable
+// one in libm.
+
+#include <complex.h>
+
+float (crealf)(float _Complex x) {
+ return __builtin_crealf(x);
+}
+
+double (creal)(double _Complex x) {
+ return __builtin_creal(x);
+}
+
+long double (creall)(long double _Complex x) {
+ return __builtin_creall(x);
+}
+
+float (cimagf)(float _Complex x) {
+ return __builtin_cimagf(x);
+}
+
+double (cimag)(double _Complex x) {
+ return __builtin_cimag(x);
+}
+
+long double (cimagl)(long double _Complex x) {
+ return __builtin_cimagl(x);
+}
diff --git a/libc-bottom-half/sources/environ.c b/libc-bottom-half/sources/environ.c
new file mode 100644
index 0000000..50d60de
--- /dev/null
+++ b/libc-bottom-half/sources/environ.c
@@ -0,0 +1,31 @@
+#include <unistd.h>
+#include <stdlib.h>
+#include <sysexits.h>
+#include <wasi/api.h>
+#include <wasi/libc.h>
+#include <wasi/libc-environ.h>
+
+// If the program does use `environ`, it'll get this version of
+// `__wasilibc_environ`, which is initialized with a constructor function, so
+// that it's initialized whenever user code might want to access it.
+char **__wasilibc_environ;
+weak_alias(__wasilibc_environ, _environ);
+weak_alias(__wasilibc_environ, environ);
+
+// We define this function here in the same source file as
+// `__wasilibc_environ`, so that this function is called in iff environment
+// variable support is used.
+// Concerning the 50 -- levels up to 100 are reserved for the implementation,
+// so we an arbitrary number in the middle of the range to allow other
+// reserved things to go before or after.
+__attribute__((constructor(50)))
+static void __wasilibc_initialize_environ_eagerly(void) {
+ __wasilibc_initialize_environ();
+}
+
+// See the comments in libc-environ.h.
+void __wasilibc_maybe_reinitialize_environ_eagerly(void) {
+ // This translation unit is linked in if `environ` is used, meaning we need
+ // to eagerly reinitialize the environment variables.
+ __wasilibc_initialize_environ();
+}
diff --git a/libc-bottom-half/sources/errno.c b/libc-bottom-half/sources/errno.c
new file mode 100644
index 0000000..4e98a5b
--- /dev/null
+++ b/libc-bottom-half/sources/errno.c
@@ -0,0 +1,5 @@
+#include <errno.h>
+
+// These values are used by reference-sysroot's dlmalloc.
+const int __EINVAL = EINVAL;
+const int __ENOMEM = ENOMEM;
diff --git a/libc-bottom-half/sources/getcwd.c b/libc-bottom-half/sources/getcwd.c
new file mode 100644
index 0000000..3b1ce70
--- /dev/null
+++ b/libc-bottom-half/sources/getcwd.c
@@ -0,0 +1,39 @@
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include "lock.h"
+
+char *__wasilibc_cwd = "/";
+
+#ifdef _REENTRANT
+static volatile int lock[1];
+void __wasilibc_cwd_lock(void) { LOCK(lock); }
+void __wasilibc_cwd_unlock(void) { UNLOCK(lock); }
+#else
+#define __wasilibc_cwd_lock() (void)0
+#define __wasilibc_cwd_unlock() (void)0
+#endif
+
+char *getcwd(char *buf, size_t size)
+{
+ __wasilibc_cwd_lock();
+ if (!buf) {
+ buf = strdup(__wasilibc_cwd);
+ if (!buf) {
+ errno = ENOMEM;
+ __wasilibc_cwd_unlock();
+ return NULL;
+ }
+ } else {
+ size_t len = strlen(__wasilibc_cwd);
+ if (size < len + 1) {
+ errno = ERANGE;
+ __wasilibc_cwd_unlock();
+ return NULL;
+ }
+ strcpy(buf, __wasilibc_cwd);
+ }
+ __wasilibc_cwd_unlock();
+ return buf;
+}
+
diff --git a/libc-bottom-half/sources/getentropy.c b/libc-bottom-half/sources/getentropy.c
new file mode 100644
index 0000000..e540e7e
--- /dev/null
+++ b/libc-bottom-half/sources/getentropy.c
@@ -0,0 +1,20 @@
+#include <errno.h>
+#include <unistd.h>
+#include <wasi/api.h>
+
+int __getentropy(void *buffer, size_t len) {
+ if (len > 256) {
+ errno = EIO;
+ return -1;
+ }
+
+ int r = __wasi_random_get(buffer, len);
+
+ if (r != 0) {
+ errno = r;
+ return -1;
+ }
+
+ return 0;
+}
+weak_alias(__getentropy, getentropy);
diff --git a/libc-bottom-half/sources/isatty.c b/libc-bottom-half/sources/isatty.c
new file mode 100644
index 0000000..c6f8662
--- /dev/null
+++ b/libc-bottom-half/sources/isatty.c
@@ -0,0 +1,22 @@
+#include <wasi/api.h>
+#include <__errno.h>
+#include <__function___isatty.h>
+
+int __isatty(int fd) {
+ __wasi_fdstat_t statbuf;
+ int r = __wasi_fd_fdstat_get(fd, &statbuf);
+ if (r != 0) {
+ errno = r;
+ return 0;
+ }
+
+ // A tty is a character device that we can't seek or tell on.
+ if (statbuf.fs_filetype != __WASI_FILETYPE_CHARACTER_DEVICE ||
+ (statbuf.fs_rights_base & (__WASI_RIGHTS_FD_SEEK | __WASI_RIGHTS_FD_TELL)) != 0) {
+ errno = __WASI_ERRNO_NOTTY;
+ return 0;
+ }
+
+ return 1;
+}
+extern __typeof(__isatty) isatty __attribute__((weak, alias("__isatty")));
diff --git a/libc-bottom-half/sources/math/fmin-fmax.c b/libc-bottom-half/sources/math/fmin-fmax.c
new file mode 100644
index 0000000..9293798
--- /dev/null
+++ b/libc-bottom-half/sources/math/fmin-fmax.c
@@ -0,0 +1,34 @@
+// Wasm's `min` and `max` operators implement the IEEE 754-2019
+// `minimum` and `maximum` operations, meaning that given a choice
+// between NaN and a number, they return NaN. This differs from
+// the C standard library's `fmin` and `fmax` functions, which
+// return the number. However, we can still use wasm's builtins
+// by handling the NaN cases explicitly, and it still turns out
+// to be faster than doing the whole operation in
+// target-independent C. And, it's smaller.
+
+#include <math.h>
+
+float fminf(float x, float y) {
+ if (isnan(x)) return y;
+ if (isnan(y)) return x;
+ return __builtin_wasm_min_f32(x, y);
+}
+
+float fmaxf(float x, float y) {
+ if (isnan(x)) return y;
+ if (isnan(y)) return x;
+ return __builtin_wasm_max_f32(x, y);
+}
+
+double fmin(double x, double y) {
+ if (isnan(x)) return y;
+ if (isnan(y)) return x;
+ return __builtin_wasm_min_f64(x, y);
+}
+
+double fmax(double x, double y) {
+ if (isnan(x)) return y;
+ if (isnan(y)) return x;
+ return __builtin_wasm_max_f64(x, y);
+}
diff --git a/libc-bottom-half/sources/math/math-builtins.c b/libc-bottom-half/sources/math/math-builtins.c
new file mode 100644
index 0000000..a5eb7cd
--- /dev/null
+++ b/libc-bottom-half/sources/math/math-builtins.c
@@ -0,0 +1,69 @@
+// Each of the following math functions can be implemented with a single
+// wasm instruction, so use that implementation rather than the portable
+// one in libm.
+
+#include <math.h>
+
+float fabsf(float x) {
+ return __builtin_fabsf(x);
+}
+
+double fabs(double x) {
+ return __builtin_fabs(x);
+}
+
+float sqrtf(float x) {
+ return __builtin_sqrtf(x);
+}
+
+double sqrt(double x) {
+ return __builtin_sqrt(x);
+}
+
+float copysignf(float x, float y) {
+ return __builtin_copysignf(x, y);
+}
+
+double copysign(double x, double y) {
+ return __builtin_copysign(x, y);
+}
+
+float ceilf(float x) {
+ return __builtin_ceilf(x);
+}
+
+double ceil(double x) {
+ return __builtin_ceil(x);
+}
+
+float floorf(float x) {
+ return __builtin_floorf(x);
+}
+
+double floor(double x) {
+ return __builtin_floor(x);
+}
+
+float truncf(float x) {
+ return __builtin_truncf(x);
+}
+
+double trunc(double x) {
+ return __builtin_trunc(x);
+}
+
+float nearbyintf(float x) {
+ return __builtin_nearbyintf(x);
+}
+
+double nearbyint(double x) {
+ return __builtin_nearbyint(x);
+}
+
+float rintf(float x) {
+ return __builtin_rintf(x);
+}
+
+double rint(double x) {
+ return __builtin_rint(x);
+}
diff --git a/libc-bottom-half/sources/posix.c b/libc-bottom-half/sources/posix.c
new file mode 100644
index 0000000..35dd99b
--- /dev/null
+++ b/libc-bottom-half/sources/posix.c
@@ -0,0 +1,449 @@
+//! POSIX-like functions supporting absolute path arguments, implemented in
+//! terms of `__wasilibc_find_relpath` and `*at`-style functions.
+
+#include <errno.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <utime.h>
+#include <wasi/libc.h>
+#include <wasi/libc-find-relpath.h>
+#include <wasi/libc-nocwd.h>
+
+static int find_relpath2(
+ const char *path,
+ char **relative,
+ size_t *relative_len
+) {
+ // See comments in `preopens.c` for what this trick is doing.
+ const char *abs;
+ if (__wasilibc_find_relpath_alloc)
+ return __wasilibc_find_relpath_alloc(path, &abs, relative, relative_len, 1);
+ return __wasilibc_find_relpath(path, &abs, relative, *relative_len);
+}
+
+// Helper to call `__wasilibc_find_relpath` and return an already-managed
+// pointer for the `relative` path. This function is not reentrant since the
+// `relative` pointer will point to static data that cannot be reused until
+// `relative` is no longer used.
+static int find_relpath(const char *path, char **relative) {
+ static __thread char *relative_buf = NULL;
+ static __thread size_t relative_buf_len = 0;
+ int fd = find_relpath2(path, &relative_buf, &relative_buf_len);
+ // find_relpath2 can update relative_buf, so assign it after the call
+ *relative = relative_buf;
+ return fd;
+}
+
+// same as `find_relpath`, but uses another set of static variables to cache
+static int find_relpath_alt(const char *path, char **relative) {
+ static __thread char *relative_buf = NULL;
+ static __thread size_t relative_buf_len = 0;
+ int fd = find_relpath2(path, &relative_buf, &relative_buf_len);
+ // find_relpath2 can update relative_buf, so assign it after the call
+ *relative = relative_buf;
+ return fd;
+}
+
+int open(const char *path, int oflag, ...) {
+ // WASI libc's `openat` ignores the mode argument, so call a special
+ // entrypoint which avoids the varargs calling convention.
+ return __wasilibc_open_nomode(path, oflag);
+}
+
+// See the documentation in libc.h
+int __wasilibc_open_nomode(const char *path, int oflag) {
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_openat_nomode(dirfd, relative_path, oflag);
+}
+
+int access(const char *path, int amode) {
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_faccessat(dirfd, relative_path, amode, 0);
+}
+
+ssize_t readlink(
+ const char *restrict path,
+ char *restrict buf,
+ size_t bufsize)
+{
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_readlinkat(dirfd, relative_path, buf, bufsize);
+}
+
+int stat(const char *restrict path, struct stat *restrict buf) {
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_fstatat(dirfd, relative_path, buf, 0);
+}
+
+int lstat(const char *restrict path, struct stat *restrict buf) {
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_fstatat(dirfd, relative_path, buf, AT_SYMLINK_NOFOLLOW);
+}
+
+int utime(const char *path, const struct utimbuf *times) {
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_utimensat(
+ dirfd, relative_path,
+ times ? ((struct timespec [2]) {
+ { .tv_sec = times->actime },
+ { .tv_sec = times->modtime }
+ })
+ : NULL,
+ 0);
+}
+
+int utimes(const char *path, const struct timeval times[2]) {
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_utimensat(
+ dirfd, relative_path,
+ times ? ((struct timespec [2]) {
+ { .tv_sec = times[0].tv_sec,
+ .tv_nsec = times[0].tv_usec * 1000 },
+ { .tv_sec = times[1].tv_sec,
+ .tv_nsec = times[1].tv_usec * 1000 },
+ })
+ : NULL,
+ 0);
+}
+
+int unlink(const char *path) {
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ // `unlinkat` imports `__wasi_path_remove_directory` even when
+ // `AT_REMOVEDIR` isn't passed. Instead, use a specialized function which
+ // just imports `__wasi_path_unlink_file`.
+ return __wasilibc_nocwd___wasilibc_unlinkat(dirfd, relative_path);
+}
+
+int rmdir(const char *path) {
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd___wasilibc_rmdirat(dirfd, relative_path);
+}
+
+int remove(const char *path) {
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ // First try to remove it as a file.
+ int r = __wasilibc_nocwd___wasilibc_unlinkat(dirfd, relative_path);
+ if (r != 0 && (errno == EISDIR || errno == ENOTCAPABLE)) {
+ // That failed, but it might be a directory.
+ r = __wasilibc_nocwd___wasilibc_rmdirat(dirfd, relative_path);
+
+ // If it isn't a directory, we lack capabilities to remove it as a file.
+ if (errno == ENOTDIR)
+ errno = ENOTCAPABLE;
+ }
+ return r;
+}
+
+int mkdir(const char *path, mode_t mode) {
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_mkdirat_nomode(dirfd, relative_path);
+}
+
+DIR *opendir(const char *dirname) {
+ char *relative_path;
+ int dirfd = find_relpath(dirname, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return NULL;
+ }
+
+ return __wasilibc_nocwd_opendirat(dirfd, relative_path);
+}
+
+int scandir(
+ const char *restrict dir,
+ struct dirent ***restrict namelist,
+ int (*filter)(const struct dirent *),
+ int (*compar)(const struct dirent **, const struct dirent **)
+) {
+ char *relative_path;
+ int dirfd = find_relpath(dir, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_scandirat(dirfd, relative_path, namelist, filter, compar);
+}
+
+int symlink(const char *target, const char *linkpath) {
+ char *relative_path;
+ int dirfd = find_relpath(linkpath, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_symlinkat(target, dirfd, relative_path);
+}
+
+int link(const char *old, const char *new) {
+ char *old_relative_path;
+ int old_dirfd = find_relpath_alt(old, &old_relative_path);
+
+ if (old_dirfd != -1) {
+ char *new_relative_path;
+ int new_dirfd = find_relpath(new, &new_relative_path);
+
+ if (new_dirfd != -1)
+ return __wasilibc_nocwd_linkat(old_dirfd, old_relative_path,
+ new_dirfd, new_relative_path, 0);
+ }
+
+ // We couldn't find a preopen for it; indicate that we lack capabilities.
+ errno = ENOTCAPABLE;
+ return -1;
+}
+
+int rename(const char *old, const char *new) {
+ char *old_relative_path;
+ int old_dirfd = find_relpath_alt(old, &old_relative_path);
+
+ if (old_dirfd != -1) {
+ char *new_relative_path;
+ int new_dirfd = find_relpath(new, &new_relative_path);
+
+ if (new_dirfd != -1)
+ return __wasilibc_nocwd_renameat(old_dirfd, old_relative_path,
+ new_dirfd, new_relative_path);
+ }
+
+ // We couldn't find a preopen for it; indicate that we lack capabilities.
+ errno = ENOTCAPABLE;
+ return -1;
+}
+
+// Like `access`, but with `faccessat`'s flags argument.
+int
+__wasilibc_access(const char *path, int mode, int flags)
+{
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_faccessat(dirfd, relative_path,
+ mode, flags);
+}
+
+// Like `utimensat`, but without the `at` part.
+int
+__wasilibc_utimens(const char *path, const struct timespec times[2], int flags)
+{
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_utimensat(dirfd, relative_path,
+ times, flags);
+}
+
+// Like `stat`, but with `fstatat`'s flags argument.
+int
+__wasilibc_stat(const char *__restrict path, struct stat *__restrict st, int flags)
+{
+ char *relative_path;
+ int dirfd = find_relpath(path, &relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_fstatat(dirfd, relative_path, st, flags);
+}
+
+// Like `link`, but with `linkat`'s flags argument.
+int
+__wasilibc_link(const char *oldpath, const char *newpath, int flags)
+{
+ char *old_relative_path;
+ char *new_relative_path;
+ int old_dirfd = find_relpath(oldpath, &old_relative_path);
+ int new_dirfd = find_relpath(newpath, &new_relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (old_dirfd == -1 || new_dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_linkat(old_dirfd, old_relative_path,
+ new_dirfd, new_relative_path,
+ flags);
+}
+
+// Like `__wasilibc_link`, but oldpath is relative to olddirfd.
+int
+__wasilibc_link_oldat(int olddirfd, const char *oldpath, const char *newpath, int flags)
+{
+ char *new_relative_path;
+ int new_dirfd = find_relpath(newpath, &new_relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (new_dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_linkat(olddirfd, oldpath,
+ new_dirfd, new_relative_path,
+ flags);
+}
+
+// Like `__wasilibc_link`, but newpath is relative to newdirfd.
+int
+__wasilibc_link_newat(const char *oldpath, int newdirfd, const char *newpath, int flags)
+{
+ char *old_relative_path;
+ int old_dirfd = find_relpath(oldpath, &old_relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (old_dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_linkat(old_dirfd, old_relative_path,
+ newdirfd, newpath,
+ flags);
+}
+
+// Like `rename`, but from is relative to fromdirfd.
+int
+__wasilibc_rename_oldat(int fromdirfd, const char *from, const char *to)
+{
+ char *to_relative_path;
+ int to_dirfd = find_relpath(to, &to_relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (to_dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_renameat(fromdirfd, from, to_dirfd, to_relative_path);
+}
+
+// Like `rename`, but to is relative to todirfd.
+int
+__wasilibc_rename_newat(const char *from, int todirfd, const char *to)
+{
+ char *from_relative_path;
+ int from_dirfd = find_relpath(from, &from_relative_path);
+
+ // If we can't find a preopen for it, indicate that we lack capabilities.
+ if (from_dirfd == -1) {
+ errno = ENOTCAPABLE;
+ return -1;
+ }
+
+ return __wasilibc_nocwd_renameat(from_dirfd, from_relative_path, todirfd, to);
+}
diff --git a/libc-bottom-half/sources/preopens.c b/libc-bottom-half/sources/preopens.c
new file mode 100644
index 0000000..7293c8c
--- /dev/null
+++ b/libc-bottom-half/sources/preopens.c
@@ -0,0 +1,268 @@
+//! Support for "preopens", file descriptors passed into the program from the
+//! environment, with associated path prefixes, which can be used to map
+//! absolute paths to capabilities with relative paths.
+
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <lock.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sysexits.h>
+#include <wasi/api.h>
+#include <wasi/libc-find-relpath.h>
+#include <wasi/libc.h>
+
+/// A name and file descriptor pair.
+typedef struct preopen {
+ /// The path prefix associated with the file descriptor.
+ const char *prefix;
+
+ /// The file descriptor.
+ __wasi_fd_t fd;
+} preopen;
+
+/// A simple growable array of `preopen`.
+static preopen *preopens;
+static size_t num_preopens;
+static size_t preopen_capacity;
+
+/// Access to the the above preopen must be protected in the presence of
+/// threads.
+#ifdef _REENTRANT
+static volatile int lock[1];
+#endif
+
+#ifdef NDEBUG
+#define assert_invariants() // assertions disabled
+#else
+static void assert_invariants(void) {
+ assert(num_preopens <= preopen_capacity);
+ assert(preopen_capacity == 0 || preopens != NULL);
+ assert(preopen_capacity == 0 ||
+ preopen_capacity * sizeof(preopen) > preopen_capacity);
+
+ for (size_t i = 0; i < num_preopens; ++i) {
+ const preopen *pre = &preopens[i];
+ assert(pre->prefix != NULL);
+ assert(pre->fd != (__wasi_fd_t)-1);
+#ifdef __wasm__
+ assert((uintptr_t)pre->prefix <
+ (__uint128_t)__builtin_wasm_memory_size(0) * PAGESIZE);
+#endif
+ }
+}
+#endif
+
+/// Allocate space for more preopens. Returns 0 on success and -1 on failure.
+static int resize(void) {
+ LOCK(lock);
+ size_t start_capacity = 4;
+ size_t old_capacity = preopen_capacity;
+ size_t new_capacity = old_capacity == 0 ? start_capacity : old_capacity * 2;
+
+ preopen *old_preopens = preopens;
+ preopen *new_preopens = calloc(sizeof(preopen), new_capacity);
+ if (new_preopens == NULL) {
+ UNLOCK(lock);
+ return -1;
+ }
+
+ memcpy(new_preopens, old_preopens, num_preopens * sizeof(preopen));
+ preopens = new_preopens;
+ preopen_capacity = new_capacity;
+ free(old_preopens);
+
+ assert_invariants();
+ UNLOCK(lock);
+ return 0;
+}
+
+// Normalize an absolute path. Removes leading `/` and leading `./`, so the
+// first character is the start of a directory name. This works because our
+// process always starts with a working directory of `/`. Additionally translate
+// `.` to the empty string.
+static const char *strip_prefixes(const char *path) {
+ while (1) {
+ if (path[0] == '/') {
+ path++;
+ } else if (path[0] == '.' && path[1] == '/') {
+ path += 2;
+ } else if (path[0] == '.' && path[1] == 0) {
+ path++;
+ } else {
+ break;
+ }
+ }
+
+ return path;
+}
+
+/// Register the given preopened file descriptor under the given path.
+///
+/// This function takes ownership of `prefix`.
+static int internal_register_preopened_fd(__wasi_fd_t fd, const char *relprefix) {
+ LOCK(lock);
+
+ // Check preconditions.
+ assert_invariants();
+ assert(fd != AT_FDCWD);
+ assert(fd != -1);
+ assert(relprefix != NULL);
+
+ if (num_preopens == preopen_capacity && resize() != 0) {
+ UNLOCK(lock);
+ return -1;
+ }
+
+ char *prefix = strdup(strip_prefixes(relprefix));
+ if (prefix == NULL) {
+ UNLOCK(lock);
+ return -1;
+ }
+ preopens[num_preopens++] = (preopen) { prefix, fd, };
+
+ assert_invariants();
+ UNLOCK(lock);
+ return 0;
+}
+
+/// Are the `prefix_len` bytes pointed to by `prefix` a prefix of `path`?
+static bool prefix_matches(const char *prefix, size_t prefix_len, const char *path) {
+ // Allow an empty string as a prefix of any relative path.
+ if (path[0] != '/' && prefix_len == 0)
+ return true;
+
+ // Check whether any bytes of the prefix differ.
+ if (memcmp(path, prefix, prefix_len) != 0)
+ return false;
+
+ // Ignore trailing slashes in directory names.
+ size_t i = prefix_len;
+ while (i > 0 && prefix[i - 1] == '/') {
+ --i;
+ }
+
+ // Match only complete path components.
+ char last = path[i];
+ return last == '/' || last == '\0';
+}
+
+// See the documentation in libc.h
+int __wasilibc_register_preopened_fd(int fd, const char *prefix) {
+ return internal_register_preopened_fd((__wasi_fd_t)fd, prefix);
+}
+
+// See the documentation in libc-find-relpath.h.
+int __wasilibc_find_relpath(const char *path,
+ const char **abs_prefix,
+ char **relative_path,
+ size_t relative_path_len) {
+ // If `chdir` is linked, whose object file defines this symbol, then we
+ // call that. Otherwise if the program can't `chdir` then `path` is
+ // absolute (or relative to the root dir), so we delegate to `find_abspath`
+ if (__wasilibc_find_relpath_alloc)
+ return __wasilibc_find_relpath_alloc(path, abs_prefix, relative_path, &relative_path_len, 0);
+ return __wasilibc_find_abspath(path, abs_prefix, (const char**) relative_path);
+}
+
+// See the documentation in libc-find-relpath.h.
+int __wasilibc_find_abspath(const char *path,
+ const char **abs_prefix,
+ const char **relative_path) {
+ // Strip leading `/` characters, the prefixes we're mataching won't have
+ // them.
+ while (*path == '/')
+ path++;
+ // Search through the preopens table. Iterate in reverse so that more
+ // recently added preopens take precedence over less recently addded ones.
+ size_t match_len = 0;
+ int fd = -1;
+ LOCK(lock);
+ for (size_t i = num_preopens; i > 0; --i) {
+ const preopen *pre = &preopens[i - 1];
+ const char *prefix = pre->prefix;
+ size_t len = strlen(prefix);
+
+ // If we haven't had a match yet, or the candidate path is longer than
+ // our current best match's path, and the candidate path is a prefix of
+ // the requested path, take that as the new best path.
+ if ((fd == -1 || len > match_len) &&
+ prefix_matches(prefix, len, path))
+ {
+ fd = pre->fd;
+ match_len = len;
+ *abs_prefix = prefix;
+ }
+ }
+ UNLOCK(lock);
+
+ if (fd == -1) {
+ errno = ENOENT;
+ return -1;
+ }
+
+ // The relative path is the substring after the portion that was matched.
+ const char *computed = path + match_len;
+
+ // Omit leading slashes in the relative path.
+ while (*computed == '/')
+ ++computed;
+
+ // *at syscalls don't accept empty relative paths, so use "." instead.
+ if (*computed == '\0')
+ computed = ".";
+
+ *relative_path = computed;
+ return fd;
+}
+
+/// This is referenced by weak reference from crt1.c and lives in the same
+/// source file as `__wasilibc_find_relpath` so that it's linked in when it's
+/// needed.
+// Concerning the 51 -- see the comment by the constructor priority in
+// libc-bottom-half/sources/environ.c.
+__attribute__((constructor(51)))
+static void __wasilibc_populate_preopens(void) {
+ // Skip stdin, stdout, and stderr, and count up until we reach an invalid
+ // file descriptor.
+ for (__wasi_fd_t fd = 3; fd != 0; ++fd) {
+ __wasi_prestat_t prestat;
+ __wasi_errno_t ret = __wasi_fd_prestat_get(fd, &prestat);
+ if (ret == __WASI_ERRNO_BADF)
+ break;
+ if (ret != __WASI_ERRNO_SUCCESS)
+ goto oserr;
+ switch (prestat.tag) {
+ case __WASI_PREOPENTYPE_DIR: {
+ char *prefix = malloc(prestat.u.dir.pr_name_len + 1);
+ if (prefix == NULL)
+ goto software;
+
+ // TODO: Remove the cast on `path` once the witx is updated with
+ // char8 support.
+ ret = __wasi_fd_prestat_dir_name(fd, (uint8_t *)prefix,
+ prestat.u.dir.pr_name_len);
+ if (ret != __WASI_ERRNO_SUCCESS)
+ goto oserr;
+ prefix[prestat.u.dir.pr_name_len] = '\0';
+
+ if (internal_register_preopened_fd(fd, prefix) != 0)
+ goto software;
+ free(prefix);
+
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ return;
+oserr:
+ _Exit(EX_OSERR);
+software:
+ _Exit(EX_SOFTWARE);
+}
diff --git a/libc-bottom-half/sources/reallocarray.c b/libc-bottom-half/sources/reallocarray.c
new file mode 100644
index 0000000..3e828cc
--- /dev/null
+++ b/libc-bottom-half/sources/reallocarray.c
@@ -0,0 +1,14 @@
+#include <stdlib.h>
+#include <errno.h>
+
+void *__reallocarray(void *ptr, size_t nmemb, size_t size) {
+ size_t bytes;
+ if (__builtin_umull_overflow(nmemb, size, &bytes)) {
+ errno = ENOMEM;
+ return NULL;
+ }
+ return realloc(ptr, bytes);
+}
+
+void *reallocarray(void *ptr, size_t nmemb, size_t size)
+ __attribute__((__weak__, __alias__("__reallocarray")));
diff --git a/libc-bottom-half/sources/sbrk.c b/libc-bottom-half/sources/sbrk.c
new file mode 100644
index 0000000..a26b75e
--- /dev/null
+++ b/libc-bottom-half/sources/sbrk.c
@@ -0,0 +1,32 @@
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <__macro_PAGESIZE.h>
+
+// Bare-bones implementation of sbrk.
+void *sbrk(intptr_t increment) {
+ // sbrk(0) returns the current memory size.
+ if (increment == 0) {
+ // The wasm spec doesn't guarantee that memory.grow of 0 always succeeds.
+ return (void *)(__builtin_wasm_memory_size(0) * PAGESIZE);
+ }
+
+ // We only support page-size increments.
+ if (increment % PAGESIZE != 0) {
+ abort();
+ }
+
+ // WebAssembly doesn't support shrinking linear memory.
+ if (increment < 0) {
+ abort();
+ }
+
+ uintptr_t old = __builtin_wasm_memory_grow(0, (uintptr_t)increment / PAGESIZE);
+
+ if (old == SIZE_MAX) {
+ errno = ENOMEM;
+ return (void *)-1;
+ }
+
+ return (void *)(old * PAGESIZE);
+}
diff --git a/libc-bottom-half/sources/truncate.c b/libc-bottom-half/sources/truncate.c
new file mode 100644
index 0000000..24ae28f
--- /dev/null
+++ b/libc-bottom-half/sources/truncate.c
@@ -0,0 +1,21 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <wasi/libc.h>
+
+int truncate(const char *path, off_t length)
+{
+ int fd = __wasilibc_open_nomode(path, O_WRONLY | O_CLOEXEC | O_NOCTTY);
+ if (fd < 0)
+ return -1;
+
+ int result = ftruncate(fd, length);
+ if (result != 0) {
+ int save_errno = errno;
+ (void)close(fd);
+ errno = save_errno;
+ return -1;
+ }
+
+ return close(fd);
+}
diff --git a/libc-top-half/README.md b/libc-top-half/README.md
new file mode 100644
index 0000000..c4b81b8
--- /dev/null
+++ b/libc-top-half/README.md
@@ -0,0 +1,25 @@
+# WASI libc "top half".
+
+The WASI libc "top half" is conceptually the upper half of a traditional libc
+implementation, consisting of C standard library and other relatively
+higher-level functionality.
+
+Code in the musl directory is based on musl revision
+040c1d16b468c50c04fc94edff521f1637708328, which is v1.2.0, from
+git://git.musl-libc.org/musl.
+
+Whole files which are unused are omitted. Changes to upstream code are wrapped
+in preprocessor directives controlled by the macro `__wasilibc_unmodified_upstream`.
+
+Some major known missing areas include:
+ - threads
+ - aio
+ - setjmp
+ - signals
+ - ipc
+ - termios
+ - nss
+ - timezones
+ - non-builtin locales
+ - TIOCGWINSZ (because cloudabi lacks it; affects isatty, line buffering for stdout)
+ - O\_CLOEXEC, O\_NOCTTY (because cloudabi lacks them)
diff --git a/libc-top-half/headers/private/printscan.h b/libc-top-half/headers/private/printscan.h
new file mode 100644
index 0000000..7c21f99
--- /dev/null
+++ b/libc-top-half/headers/private/printscan.h
@@ -0,0 +1,59 @@
+#if defined(__wasilibc_printscan_no_floating_point)
+
+#include <stdio.h>
+
+__attribute__((__cold__, __noreturn__))
+static void floating_point_not_supported(void) {
+ void abort(void) __attribute__((__noreturn__));
+ fputs("Support for floating-point formatting is currently disabled.\n"
+ "To enable it, " __wasilibc_printscan_floating_point_support_option ".\n", stderr);
+ abort();
+}
+
+#elif defined(__wasilibc_printscan_no_long_double)
+
+#include <stdio.h>
+
+typedef double long_double;
+#undef LDBL_TRUE_MIN
+#define LDBL_TRUE_MIN DBL_DENORM_MIN
+#undef LDBL_MIN
+#define LDBL_MIN DBL_MIN
+#undef LDBL_MAX
+#define LDBL_MAX DBL_MAX
+#undef LDBL_EPSILON
+#define LDBL_EPSILON DBL_EPSILON
+#undef LDBL_MANT_DIG
+#define LDBL_MANT_DIG DBL_MANT_DIG
+#undef LDBL_MIN_EXP
+#define LDBL_MIN_EXP DBL_MIN_EXP
+#undef LDBL_MAX_EXP
+#define LDBL_MAX_EXP DBL_MAX_EXP
+#undef LDBL_DIG
+#define LDBL_DIG DBL_DIG
+#undef LDBL_MIN_10_EXP
+#define LDBL_MIN_10_EXP DBL_MIN_10_EXP
+#undef LDBL_MAX_10_EXP
+#define LDBL_MAX_10_EXP DBL_MAX_10_EXP
+#undef frexpl
+#define frexpl(x, exp) frexp(x, exp)
+#undef copysignl
+#define copysignl(x, y) copysign(x, y)
+#undef fmodl
+#define fmodl(x, y) fmod(x, y)
+#undef scalbnl
+#define scalbnl(arg, exp) scalbn(arg, exp)
+__attribute__((__cold__, __noreturn__))
+static void long_double_not_supported(void) {
+ void abort(void) __attribute__((__noreturn__));
+ fputs("Support for formatting long double values is currently disabled.\n"
+ "To enable it, " __wasilibc_printscan_full_support_option ".\n", &__stderr_FILE);
+ abort();
+}
+
+#else
+
+// Full long double support.
+typedef long double long_double;
+
+#endif
diff --git a/libc-top-half/headers/private/wasi/libc-environ-compat.h b/libc-top-half/headers/private/wasi/libc-environ-compat.h
new file mode 100644
index 0000000..fa2747d
--- /dev/null
+++ b/libc-top-half/headers/private/wasi/libc-environ-compat.h
@@ -0,0 +1,12 @@
+// This header file is meant to be included withinin the body of a function
+// which uses `__environ`. Code using `__environ` expects it will be initialized
+// eagerly. `__wasilibc_environ` is initialized lazily. Provide `__environ` as
+// an alias and arrange for the lazy initialization to be performed.
+
+extern char **__wasilibc_environ;
+
+__wasilibc_ensure_environ();
+
+#ifndef __wasilibc_environ
+#define __environ __wasilibc_environ
+#endif
diff --git a/libc-top-half/musl/.mailmap b/libc-top-half/musl/.mailmap
new file mode 100644
index 0000000..aede9ec
--- /dev/null
+++ b/libc-top-half/musl/.mailmap
@@ -0,0 +1 @@
+Ada Worcester <oss@ada.pikhq.com> <josiahw@gmail.com>
diff --git a/libc-top-half/musl/COPYRIGHT b/libc-top-half/musl/COPYRIGHT
new file mode 100644
index 0000000..c1628e9
--- /dev/null
+++ b/libc-top-half/musl/COPYRIGHT
@@ -0,0 +1,193 @@
+musl as a whole is licensed under the following standard MIT license:
+
+----------------------------------------------------------------------
+Copyright © 2005-2020 Rich Felker, et al.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+----------------------------------------------------------------------
+
+Authors/contributors include:
+
+A. Wilcox
+Ada Worcester
+Alex Dowad
+Alex Suykov
+Alexander Monakov
+Andre McCurdy
+Andrew Kelley
+Anthony G. Basile
+Aric Belsito
+Arvid Picciani
+Bartosz Brachaczek
+Benjamin Peterson
+Bobby Bingham
+Boris Brezillon
+Brent Cook
+Chris Spiegel
+Clément Vasseur
+Daniel Micay
+Daniel Sabogal
+Daurnimator
+David Carlier
+David Edelsohn
+Denys Vlasenko
+Dmitry Ivanov
+Dmitry V. Levin
+Drew DeVault
+Emil Renner Berthing
+Fangrui Song
+Felix Fietkau
+Felix Janda
+Gianluca Anzolin
+Hauke Mehrtens
+He X
+Hiltjo Posthuma
+Isaac Dunham
+Jaydeep Patil
+Jens Gustedt
+Jeremy Huntwork
+Jo-Philipp Wich
+Joakim Sindholt
+John Spencer
+Julien Ramseier
+Justin Cormack
+Kaarle Ritvanen
+Khem Raj
+Kylie McClain
+Leah Neukirchen
+Luca Barbato
+Luka Perkov
+M Farkas-Dyck (Strake)
+Mahesh Bodapati
+Markus Wichmann
+Masanori Ogino
+Michael Clark
+Michael Forney
+Mikhail Kremnyov
+Natanael Copa
+Nicholas J. Kain
+orc
+Pascal Cuoq
+Patrick Oppenlander
+Petr Hosek
+Petr Skocik
+Pierre Carrier
+Reini Urban
+Rich Felker
+Richard Pennington
+Ryan Fairfax
+Samuel Holland
+Segev Finer
+Shiz
+sin
+Solar Designer
+Stefan Kristiansson
+Stefan O'Rear
+Szabolcs Nagy
+Timo Teräs
+Trutz Behn
+Valentin Ochs
+Will Dietz
+William Haddon
+William Pitcock
+
+Portions of this software are derived from third-party works licensed
+under terms compatible with the above MIT license:
+
+The TRE regular expression implementation (src/regex/reg* and
+src/regex/tre*) is Copyright © 2001-2008 Ville Laurikari and licensed
+under a 2-clause BSD license (license text in the source files). The
+included version has been heavily modified by Rich Felker in 2012, in
+the interests of size, simplicity, and namespace cleanliness.
+
+Much of the math library code (src/math/* and src/complex/*) is
+Copyright © 1993,2004 Sun Microsystems or
+Copyright © 2003-2011 David Schultz or
+Copyright © 2003-2009 Steven G. Kargl or
+Copyright © 2003-2009 Bruce D. Evans or
+Copyright © 2008 Stephen L. Moshier or
+Copyright © 2017-2018 Arm Limited
+and labelled as such in comments in the individual source files. All
+have been licensed under extremely permissive terms.
+
+The ARM memcpy code (src/string/arm/memcpy.S) is Copyright © 2008
+The Android Open Source Project and is licensed under a two-clause BSD
+license. It was taken from Bionic libc, used on Android.
+
+The AArch64 memcpy and memset code (src/string/aarch64/*) are
+Copyright © 1999-2019, Arm Limited.
+
+The implementation of DES for crypt (src/crypt/crypt_des.c) is
+Copyright © 1994 David Burren. It is licensed under a BSD license.
+
+The implementation of blowfish crypt (src/crypt/crypt_blowfish.c) was
+originally written by Solar Designer and placed into the public
+domain. The code also comes with a fallback permissive license for use
+in jurisdictions that may not recognize the public domain.
+
+The smoothsort implementation (src/stdlib/qsort.c) is Copyright © 2011
+Valentin Ochs and is licensed under an MIT-style license.
+
+The x86_64 port was written by Nicholas J. Kain and is licensed under
+the standard MIT terms.
+
+The mips and microblaze ports were originally written by Richard
+Pennington for use in the ellcc project. The original code was adapted
+by Rich Felker for build system and code conventions during upstream
+integration. It is licensed under the standard MIT terms.
+
+The mips64 port was contributed by Imagination Technologies and is
+licensed under the standard MIT terms.
+
+The powerpc port was also originally written by Richard Pennington,
+and later supplemented and integrated by John Spencer. It is licensed
+under the standard MIT terms.
+
+All other files which have no copyright comments are original works
+produced specifically for use as part of this library, written either
+by Rich Felker, the main author of the library, or by one or more
+contibutors listed above. Details on authorship of individual files
+can be found in the git version control history of the project. The
+omission of copyright and license comments in each file is in the
+interest of source tree size.
+
+In addition, permission is hereby granted for all public header files
+(include/* and arch/*/bits/*) and crt files intended to be linked into
+applications (crt/*, ldso/dlstart.c, and arch/*/crt_arch.h) to omit
+the copyright notice and permission notice otherwise required by the
+license, and to use these files without any requirement of
+attribution. These files include substantial contributions from:
+
+Bobby Bingham
+John Spencer
+Nicholas J. Kain
+Rich Felker
+Richard Pennington
+Stefan Kristiansson
+Szabolcs Nagy
+
+all of whom have explicitly granted such permission.
+
+This file previously contained text expressing a belief that most of
+the files covered by the above exception were sufficiently trivial not
+to be subject to copyright, resulting in confusion over whether it
+negated the permissions granted in the license. In the spirit of
+permissive licensing, and of not having licensing issues being an
+obstacle to adoption, that text has been removed.
diff --git a/libc-top-half/musl/INSTALL b/libc-top-half/musl/INSTALL
new file mode 100644
index 0000000..c583691
--- /dev/null
+++ b/libc-top-half/musl/INSTALL
@@ -0,0 +1,191 @@
+
+Quick Installation Guide for musl libc
+======================================
+
+There are many different ways to install musl depending on your usage
+case. This document covers only the build and installation of musl by
+itself, which is useful for upgrading an existing musl-based system or
+compiler toolchain, or for using the provided musl-gcc wrapper with an
+existing non-musl-based compiler.
+
+Building complete native or cross-compiler toolchains is outside the
+scope of this INSTALL file. More information can be found on the musl
+website and community wiki.
+
+
+Build Prerequisites
+-------------------
+
+The only build-time prerequisites for musl are GNU Make and a
+freestanding C99 compiler toolchain targeting the desired instruction
+set architecture and ABI, with support for a minimal subset of "GNU C"
+extensions consisting mainly of gcc-style inline assembly, weak
+aliases, hidden visibility, and stand-alone assembly source files.
+
+GCC, LLVM/clang, Firm/cparser, and PCC have all successfully built
+musl, but GCC is the most widely used/tested. Recent compiler (and
+binutils) versions should be used if possible since some older
+versions have bugs which affect musl.
+
+The system used to build musl does not need to be Linux-based, nor do
+the Linux kernel headers need to be available.
+
+
+
+Supported Targets
+-----------------
+
+musl can be built for the following CPU instruction set architecture
+and ABI combinations:
+
+* i386
+ * Minimum CPU model is actually 80486 unless kernel emulation of
+ the `cmpxchg` instruction is added
+
+* x86_64
+ * ILP32 ABI (x32) is available as a separate arch but is still
+ experimental
+
+* ARM
+ * EABI, standard or hard-float VFP variant
+ * Little-endian default; big-endian variants also supported
+ * Compiler toolchains only support armv4t and later
+
+* AArch64
+ * Little-endian default; big-endian variants also supported
+
+* MIPS
+ * ABI is o32, fp32/fpxx (except on r6 which is fp64)
+ * Big-endian default; little-endian variants also supported
+ * Default ABI variant uses FPU registers; alternate soft-float ABI
+ that does not use FPU registers or instructions is available
+ * MIPS2 or later, or kernel emulation of ll/sc (standard in Linux)
+ is required
+ * MIPS32r6, an incompatible ISA, is supported as a variant "mipsr6"
+
+* MIPS64
+ * ABI is n64 (LP64) or n32 (ILP32)
+ * Big-endian default; little-endian variants also supported
+ * Default ABI variant uses FPU registers; alternate soft-float ABI
+ that does not use FPU registers or instructions is available
+
+* PowerPC
+ * Compiler toolchain must provide 64-bit long double, not IBM
+ double-double or IEEE quad
+ * For dynamic linking, compiler toolchain must be configured for
+ "secure PLT" variant
+
+* PowerPC64
+ * Both little and big endian variants are supported
+ * Compiler toolchain must provide 64-bit long double, not IBM
+ double-double or IEEE quad
+ * Compiler toolchain must use the new (ELFv2) ABI regardless of
+ whether it is for little or big endian
+
+* S390X (64-bit S390)
+
+* SuperH (SH)
+ * Standard ELF ABI or FDPIC ABI (shared-text without MMU)
+ * Little-endian by default; big-endian variant also supported
+ * Full FPU ABI or soft-float ABI is supported, but the
+ single-precision-only FPU ABI is not
+
+* Microblaze
+ * Big-endian default; little-endian variants also supported
+ * Soft-float
+ * Requires support for lwx/swx instructions
+
+* OpenRISC 1000 (or1k)
+
+* RISC-V 64
+ * Little endian
+ * Hard, soft, and hard-single/soft-double floating point ABIs
+ * Standard ELF; no shared-text NOMMU support
+
+
+
+Build and Installation Procedure
+--------------------------------
+
+To build and install musl:
+
+1. Run the provided configure script from the top-level source
+ directory, passing on its command line any desired options.
+
+2. Run "make" to compile.
+
+3. Run "make install" with appropriate privileges to write to the
+ target locations.
+
+The configure script attempts to determine automatically the correct
+target architecture based on the compiler being used. For some
+compilers, this may not be possible. If detection fails or selects the
+wrong architecture, you can provide an explicit selection on the
+configure command line.
+
+By default, configure installs to a prefix of "/usr/local/musl". This
+differs from the behavior of most configure scripts, and is chosen
+specifically to avoid clashing with libraries already present on the
+system. DO NOT set the prefix to "/usr", "/usr/local", or "/" unless
+you're upgrading libc on an existing musl-based system. Doing so will
+break your existing system when you run "make install" and it may be
+difficult to recover.
+
+
+
+Notes on Dynamic Linking
+------------------------
+
+If dynamic linking is enabled, one file needs to be installed outside
+of the installation prefix: /lib/ld-musl-$ARCH.so.1. This is the
+dynamic linker. Its pathname is hard-coded into all dynamic-linked
+programs, so for the sake of being able to share binaries between
+systems, a consistent location should be used everywhere. Note that
+the same applies to glibc and its dynamic linker, which is named
+/lib/ld-linux.so.2 on i386 systems.
+
+If for some reason it is impossible to install the dynamic linker in
+its standard location (for example, if you are installing without root
+privileges), the --syslibdir option to configure can be used to
+provide a different location
+
+At runtime, the dynamic linker needs to know the paths to search for
+shared libraries. You should create a text file named
+/etc/ld-musl-$ARCH.path (where $ARCH matches the architecture name
+used in the dynamic linker) containing a list of directories where you
+want the dynamic linker to search for shared libraries, separated by
+colons or newlines. If the dynamic linker has been installed in a
+non-default location, the path file also needs to reside at that
+location (../etc relative to the chosen syslibdir).
+
+If you do not intend to use dynamic linking, you may disable it by
+passing --disable-shared to configure; this also cuts the build time
+in half.
+
+
+
+Checking for Successful Installation
+------------------------------------
+
+After installing, you should be able to use musl via the musl-gcc
+wrapper. For example:
+
+cat > hello.c <<EOF
+#include <stdio.h>
+int main()
+{
+ printf("hello, world!\n");
+ return 0;
+}
+EOF
+/usr/local/musl/bin/musl-gcc hello.c
+./a.out
+
+To configure autoconf-based program to compile and link against musl,
+set the CC variable to musl-gcc when running configure, as in:
+
+CC=musl-gcc ./configure ...
+
+You will probably also want to use --prefix when building libraries to
+ensure that they are installed under the musl prefix and not in the
+main host system library directories.
diff --git a/libc-top-half/musl/Makefile b/libc-top-half/musl/Makefile
new file mode 100644
index 0000000..e8cc443
--- /dev/null
+++ b/libc-top-half/musl/Makefile
@@ -0,0 +1,237 @@
+#
+# Makefile for musl (requires GNU make)
+#
+# This is how simple every makefile should be...
+# No, I take that back - actually most should be less than half this size.
+#
+# Use config.mak to override any of the following variables.
+# Do not make changes here.
+#
+
+srcdir = .
+exec_prefix = /usr/local
+bindir = $(exec_prefix)/bin
+
+prefix = /usr/local/musl
+includedir = $(prefix)/include
+libdir = $(prefix)/lib
+syslibdir = /lib
+
+MALLOC_DIR = mallocng
+SRC_DIRS = $(addprefix $(srcdir)/,src/* src/malloc/$(MALLOC_DIR) crt ldso $(COMPAT_SRC_DIRS))
+BASE_GLOBS = $(addsuffix /*.c,$(SRC_DIRS))
+ARCH_GLOBS = $(addsuffix /$(ARCH)/*.[csS],$(SRC_DIRS))
+BASE_SRCS = $(sort $(wildcard $(BASE_GLOBS)))
+ARCH_SRCS = $(sort $(wildcard $(ARCH_GLOBS)))
+BASE_OBJS = $(patsubst $(srcdir)/%,%.o,$(basename $(BASE_SRCS)))
+ARCH_OBJS = $(patsubst $(srcdir)/%,%.o,$(basename $(ARCH_SRCS)))
+REPLACED_OBJS = $(sort $(subst /$(ARCH)/,/,$(ARCH_OBJS)))
+ALL_OBJS = $(addprefix obj/, $(filter-out $(REPLACED_OBJS), $(sort $(BASE_OBJS) $(ARCH_OBJS))))
+
+LIBC_OBJS = $(filter obj/src/%,$(ALL_OBJS)) $(filter obj/compat/%,$(ALL_OBJS))
+LDSO_OBJS = $(filter obj/ldso/%,$(ALL_OBJS:%.o=%.lo))
+CRT_OBJS = $(filter obj/crt/%,$(ALL_OBJS))
+
+AOBJS = $(LIBC_OBJS)
+LOBJS = $(LIBC_OBJS:.o=.lo)
+GENH = obj/include/bits/alltypes.h obj/include/bits/syscall.h
+GENH_INT = obj/src/internal/version.h
+IMPH = $(addprefix $(srcdir)/, src/internal/stdio_impl.h src/internal/pthread_impl.h src/internal/locale_impl.h src/internal/libc.h)
+
+LDFLAGS =
+LDFLAGS_AUTO =
+LIBCC = -lgcc
+CPPFLAGS =
+CFLAGS =
+CFLAGS_AUTO = -Os -pipe
+CFLAGS_C99FSE = -std=c99 -ffreestanding -nostdinc
+
+CFLAGS_ALL = $(CFLAGS_C99FSE)
+CFLAGS_ALL += -D_XOPEN_SOURCE=700 -I$(srcdir)/arch/$(ARCH) -I$(srcdir)/arch/generic -Iobj/src/internal -I$(srcdir)/src/include -I$(srcdir)/src/internal -Iobj/include -I$(srcdir)/include
+CFLAGS_ALL += $(CPPFLAGS) $(CFLAGS_AUTO) $(CFLAGS)
+
+LDFLAGS_ALL = $(LDFLAGS_AUTO) $(LDFLAGS)
+
+AR = $(CROSS_COMPILE)ar
+RANLIB = $(CROSS_COMPILE)ranlib
+INSTALL = $(srcdir)/tools/install.sh
+
+ARCH_INCLUDES = $(wildcard $(srcdir)/arch/$(ARCH)/bits/*.h)
+GENERIC_INCLUDES = $(wildcard $(srcdir)/arch/generic/bits/*.h)
+INCLUDES = $(wildcard $(srcdir)/include/*.h $(srcdir)/include/*/*.h)
+ALL_INCLUDES = $(sort $(INCLUDES:$(srcdir)/%=%) $(GENH:obj/%=%) $(ARCH_INCLUDES:$(srcdir)/arch/$(ARCH)/%=include/%) $(GENERIC_INCLUDES:$(srcdir)/arch/generic/%=include/%))
+
+EMPTY_LIB_NAMES = m rt pthread crypt util xnet resolv dl
+EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a)
+CRT_LIBS = $(addprefix lib/,$(notdir $(CRT_OBJS)))
+STATIC_LIBS = lib/libc.a
+SHARED_LIBS = lib/libc.so
+TOOL_LIBS = lib/musl-gcc.specs
+ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS) $(EMPTY_LIBS) $(TOOL_LIBS)
+ALL_TOOLS = obj/musl-gcc
+
+WRAPCC_GCC = gcc
+WRAPCC_CLANG = clang
+
+LDSO_PATHNAME = $(syslibdir)/ld-musl-$(ARCH)$(SUBARCH).so.1
+
+-include config.mak
+-include $(srcdir)/arch/$(ARCH)/arch.mak
+
+ifeq ($(ARCH),)
+
+all:
+ @echo "Please set ARCH in config.mak before running make."
+ @exit 1
+
+else
+
+all: $(ALL_LIBS) $(ALL_TOOLS)
+
+OBJ_DIRS = $(sort $(patsubst %/,%,$(dir $(ALL_LIBS) $(ALL_TOOLS) $(ALL_OBJS) $(GENH) $(GENH_INT))) obj/include)
+
+$(ALL_LIBS) $(ALL_TOOLS) $(ALL_OBJS) $(ALL_OBJS:%.o=%.lo) $(GENH) $(GENH_INT): | $(OBJ_DIRS)
+
+$(OBJ_DIRS):
+ mkdir -p $@
+
+obj/include/bits/alltypes.h: $(srcdir)/arch/$(ARCH)/bits/alltypes.h.in $(srcdir)/include/alltypes.h.in $(srcdir)/tools/mkalltypes.sed
+ sed -f $(srcdir)/tools/mkalltypes.sed $(srcdir)/arch/$(ARCH)/bits/alltypes.h.in $(srcdir)/include/alltypes.h.in > $@
+
+obj/include/bits/syscall.h: $(srcdir)/arch/$(ARCH)/bits/syscall.h.in
+ cp $< $@
+ sed -n -e s/__NR_/SYS_/p < $< >> $@
+
+obj/src/internal/version.h: $(wildcard $(srcdir)/VERSION $(srcdir)/.git)
+ printf '#define VERSION "%s"\n' "$$(cd $(srcdir); sh tools/version.sh)" > $@
+
+obj/src/internal/version.o obj/src/internal/version.lo: obj/src/internal/version.h
+
+obj/crt/rcrt1.o obj/ldso/dlstart.lo obj/ldso/dynlink.lo: $(srcdir)/src/internal/dynlink.h $(srcdir)/arch/$(ARCH)/reloc.h
+
+obj/crt/crt1.o obj/crt/scrt1.o obj/crt/rcrt1.o obj/ldso/dlstart.lo: $(srcdir)/arch/$(ARCH)/crt_arch.h
+
+obj/crt/rcrt1.o: $(srcdir)/ldso/dlstart.c
+
+obj/crt/Scrt1.o obj/crt/rcrt1.o: CFLAGS_ALL += -fPIC
+
+OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=$(srcdir)/src/%))
+$(OPTIMIZE_SRCS:$(srcdir)/%.c=obj/%.o) $(OPTIMIZE_SRCS:$(srcdir)/%.c=obj/%.lo): CFLAGS += -O3
+
+MEMOPS_OBJS = $(filter %/memcpy.o %/memmove.o %/memcmp.o %/memset.o, $(LIBC_OBJS))
+$(MEMOPS_OBJS) $(MEMOPS_OBJS:%.o=%.lo): CFLAGS_ALL += $(CFLAGS_MEMOPS)
+
+NOSSP_OBJS = $(CRT_OBJS) $(LDSO_OBJS) $(filter \
+ %/__libc_start_main.o %/__init_tls.o %/__stack_chk_fail.o \
+ %/__set_thread_area.o %/memset.o %/memcpy.o \
+ , $(LIBC_OBJS))
+$(NOSSP_OBJS) $(NOSSP_OBJS:%.o=%.lo): CFLAGS_ALL += $(CFLAGS_NOSSP)
+
+$(CRT_OBJS): CFLAGS_ALL += -DCRT
+
+$(LOBJS) $(LDSO_OBJS): CFLAGS_ALL += -fPIC
+
+CC_CMD = $(CC) $(CFLAGS_ALL) -c -o $@ $<
+
+# Choose invocation of assembler to be used
+ifeq ($(ADD_CFI),yes)
+ AS_CMD = LC_ALL=C awk -f $(srcdir)/tools/add-cfi.common.awk -f $(srcdir)/tools/add-cfi.$(ARCH).awk $< | $(CC) $(CFLAGS_ALL) -x assembler -c -o $@ -
+else
+ AS_CMD = $(CC_CMD)
+endif
+
+obj/%.o: $(srcdir)/%.s
+ $(AS_CMD)
+
+obj/%.o: $(srcdir)/%.S
+ $(CC_CMD)
+
+obj/%.o: $(srcdir)/%.c $(GENH) $(IMPH)
+ $(CC_CMD)
+
+obj/%.lo: $(srcdir)/%.s
+ $(AS_CMD)
+
+obj/%.lo: $(srcdir)/%.S
+ $(CC_CMD)
+
+obj/%.lo: $(srcdir)/%.c $(GENH) $(IMPH)
+ $(CC_CMD)
+
+lib/libc.so: $(LOBJS) $(LDSO_OBJS)
+ $(CC) $(CFLAGS_ALL) $(LDFLAGS_ALL) -nostdlib -shared \
+ -Wl,-e,_dlstart -o $@ $(LOBJS) $(LDSO_OBJS) $(LIBCC)
+
+lib/libc.a: $(AOBJS)
+ rm -f $@
+ $(AR) rc $@ $(AOBJS)
+ $(RANLIB) $@
+
+$(EMPTY_LIBS):
+ rm -f $@
+ $(AR) rc $@
+
+lib/%.o: obj/crt/$(ARCH)/%.o
+ cp $< $@
+
+lib/%.o: obj/crt/%.o
+ cp $< $@
+
+lib/musl-gcc.specs: $(srcdir)/tools/musl-gcc.specs.sh config.mak
+ sh $< "$(includedir)" "$(libdir)" "$(LDSO_PATHNAME)" > $@
+
+obj/musl-gcc: config.mak
+ printf '#!/bin/sh\nexec "$${REALGCC:-$(WRAPCC_GCC)}" "$$@" -specs "%s/musl-gcc.specs"\n' "$(libdir)" > $@
+ chmod +x $@
+
+obj/%-clang: $(srcdir)/tools/%-clang.in config.mak
+ sed -e 's!@CC@!$(WRAPCC_CLANG)!g' -e 's!@PREFIX@!$(prefix)!g' -e 's!@INCDIR@!$(includedir)!g' -e 's!@LIBDIR@!$(libdir)!g' -e 's!@LDSO@!$(LDSO_PATHNAME)!g' $< > $@
+ chmod +x $@
+
+$(DESTDIR)$(bindir)/%: obj/%
+ $(INSTALL) -D $< $@
+
+$(DESTDIR)$(libdir)/%.so: lib/%.so
+ $(INSTALL) -D -m 755 $< $@
+
+$(DESTDIR)$(libdir)/%: lib/%
+ $(INSTALL) -D -m 644 $< $@
+
+$(DESTDIR)$(includedir)/bits/%: $(srcdir)/arch/$(ARCH)/bits/%
+ $(INSTALL) -D -m 644 $< $@
+
+$(DESTDIR)$(includedir)/bits/%: $(srcdir)/arch/generic/bits/%
+ $(INSTALL) -D -m 644 $< $@
+
+$(DESTDIR)$(includedir)/bits/%: obj/include/bits/%
+ $(INSTALL) -D -m 644 $< $@
+
+$(DESTDIR)$(includedir)/%: $(srcdir)/include/%
+ $(INSTALL) -D -m 644 $< $@
+
+$(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(libdir)/libc.so
+ $(INSTALL) -D -l $(libdir)/libc.so $@ || true
+
+install-libs: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(if $(SHARED_LIBS),$(DESTDIR)$(LDSO_PATHNAME),)
+
+install-headers: $(ALL_INCLUDES:include/%=$(DESTDIR)$(includedir)/%)
+
+install-tools: $(ALL_TOOLS:obj/%=$(DESTDIR)$(bindir)/%)
+
+install: install-libs install-headers install-tools
+
+musl-git-%.tar.gz: .git
+ git --git-dir=$(srcdir)/.git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ $(patsubst musl-git-%.tar.gz,%,$@)
+
+musl-%.tar.gz: .git
+ git --git-dir=$(srcdir)/.git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ v$(patsubst musl-%.tar.gz,%,$@)
+
+endif
+
+clean:
+ rm -rf obj lib
+
+distclean: clean
+ rm -f config.mak
+
+.PHONY: all clean install install-libs install-headers install-tools
diff --git a/libc-top-half/musl/README b/libc-top-half/musl/README
new file mode 100644
index 0000000..9870f73
--- /dev/null
+++ b/libc-top-half/musl/README
@@ -0,0 +1,23 @@
+
+ musl libc
+
+musl, pronounced like the word "mussel", is an MIT-licensed
+implementation of the standard C library targetting the Linux syscall
+API, suitable for use in a wide range of deployment environments. musl
+offers efficient static and dynamic linking support, lightweight code
+and low runtime overhead, strong fail-safe guarantees under correct
+usage, and correctness in the sense of standards conformance and
+safety. musl is built on the principle that these goals are best
+achieved through simple code that is easy to understand and maintain.
+
+The 1.1 release series for musl features coverage for all interfaces
+defined in ISO C99 and POSIX 2008 base, along with a number of
+non-standardized interfaces for compatibility with Linux, BSD, and
+glibc functionality.
+
+For basic installation instructions, see the included INSTALL file.
+Information on full musl-targeted compiler toolchains, system
+bootstrapping, and Linux distributions built on musl can be found on
+the project website:
+
+ https://musl.libc.org/
diff --git a/libc-top-half/musl/VERSION b/libc-top-half/musl/VERSION
new file mode 100644
index 0000000..0495c4a
--- /dev/null
+++ b/libc-top-half/musl/VERSION
@@ -0,0 +1 @@
+1.2.3
diff --git a/libc-top-half/musl/WHATSNEW b/libc-top-half/musl/WHATSNEW
new file mode 100644
index 0000000..f9bb248
--- /dev/null
+++ b/libc-top-half/musl/WHATSNEW
@@ -0,0 +1,2329 @@
+0.5.0 - initial release
+
+
+
+0.5.9 - signal ABI bugfix, various cleanup and fixes:
+
+sigset_t was wrongly defined as 1024 bytes instead of 1024 bits,
+breaking the intended ABI compatibility with the LSB/glibc sigaction
+structure. users should upgrade immediately and rebuild any libraries
+or object files that might be using the incorrect definitions.
+
+improved security against DoS with tcb shadow passwords by checking
+that the file opened was really an ordinary file.
+
+fixed a bug in the implementation of atomic ops that could have
+allowed the compiler to incorrectly reorder them (in practice, gcc
+with the default settings on i386 was not reordering them).
+
+greatly improved conformance to the C and POSIX standards regarding
+what the standard header files make visible. _POSIX_C_SOURCE is now
+needed to get POSIX functions in standard C headers, and _XOPEN_SOURCE
+or _GNU_SOURCE are required to get XSI interfaces or GNU extensions,
+respectively.
+
+many internal improvements have been made to the syscall-related code
+in preparation for porting to x86_64 and other archs.
+
+
+
+0.6.0 - x86_64 port, various important bugs fixed
+
+new x86_64 (amd64) architecture port, contributed by Nicholas J. Kain,
+along with PORTING guide. source tree layout and build system have
+been improved to accommodate further ports.
+
+various bugs that were introduced while making the headers respect C
+and POSIX namespace standards have been fixed. conformance to the
+standards has been improved.
+
+fixed an inefficiency in qsort that triggered a bug (occasionaly
+internal compiler error) in some versions of gcc.
+
+fixed a major bug in the printf %n specifier that prevented it from
+working and caused memory corruption.
+
+
+
+0.7.0 - major improvements to posix conformance and completeness
+
+implemented posix shared memory and semaphore interfaces.
+
+implemented all remaining required pthread and clock interfaces.
+
+major fixes to signal semantics.
+
+greatly improved temporary file name generation for safety against
+denial of service due to intentional name collisions.
+
+added syscall wrappers for the linux inotify interface.
+
+malloc(0) now returns a non-null pointer.
+
+fixed printf %n specifier (again), pthread_once (it was always
+hanging), and non-default-type mutex behavior.
+
+added ucontext/sigcontext support in headers to facilitate building
+libgcc with dwarf2 unwind support, and possibly other low-level tools.
+
+improved musl-gcc compiler wrapper.
+
+implemented many small missing functions here and there, minor header
+fixes, etc.
+
+
+
+0.7.1 - improvements to completeness, bug fixes
+
+implemented flockfile, wprintf, and robust mutex functions.
+
+fixed stack corruption bug in times(), minor header bugs, and some
+error return value bugs in thread interfaces.
+
+
+
+0.7.5 - new features, major optimization, and robustness
+
+implemented POSIX timers.
+
+optimized and simplified many thread-related functions.
+
+eliminated resource leak races in thread cancellation. (almost all
+existing implementations, including glibc, have these leaks.)
+
+overhauled stdio implementation to take advantage of readv/writev for
+reduced syscall load, and improved stdio's handling of error status.
+
+added syscall header and interface for applications to use and
+greatly simplified internal system for making syscalls.
+
+strangthened tmpnam/tempnam/tmpfile filename generation and made the
+straight C functions not depend on POSIX symbols.
+
+fixed pthread cancellation ABI on i386 to match the LSB/glibc ABI
+
+better double-free handling in malloc
+
+various minor bug fixes
+
+
+
+0.7.6 - major bug fixes
+
+fixed rare but serious under-allocation bug in malloc.
+
+fixed signedness bug in strchr that prevented finding high bytes.
+
+fixed serious parsing bugs in strtold.
+
+fixed statvfs syscall (it was always failing with EINVAL).
+
+fixed race condition in set*id() functions with threads (possible
+deadlock). further audit still needed though.
+
+fseek no longer sets the stream error flag on failed seeks (this was
+wrong and broke some programs, notably GNU m4).
+
+nl_langinfo is no longer a dummy function. (the functionality was
+previously implemented but accidentally left unused).
+
+various small fixes have been made to the implementations and
+prototypes for nonstandard and obsolete functions
+
+
+
+0.7.7 - more bug fixes and program-compatibility improvements
+
+fixed floating point formatting and rounding bugs in printf.
+
+fixed broken %N$ positional argument specifiers in printf.
+
+fixed misaligned read/overread bug in strchr which could lead to
+crashes scanning tiny strings at the end of a page when the next page
+is not readable, or on archs (not yet supported) that forbid
+misaligned reads.
+
+fixed breakage of statvfs on x86_64
+
+fixed crash in getmntent_r
+
+fixed bug in POSIX timers created with NULL sigevent argument
+
+improved semaphore performance, and sem_wait is now interruptable by
+signals, as required by POSIX.
+
+added many compatibility and system-level interfaces, increasing the
+proportion of busybox that works with musl.
+
+
+
+0.7.8 - more bug fixes and compatibility improvements
+
+fixed problems with ipv6 dns and address printing code that made ipv6
+support practically unusable, and some other getaddrinfo bugs.
+
+fixed broken sendmsg/recvmsg functions on x86_64 (caused by incorrect
+msghdr structure).
+
+fixed broken sigsetjmp asm on x86_64.
+
+worked around a problem with input buffering on terminals reblocking
+after getting a blank line, due to a bug in the linux readv syscall.
+
+various improvements to the "rsyscall" system used to implement
+threaded setuid, setgid, etc.
+
+exiting/cancelling the a timer handler thread no longer kills the
+timer.
+
+fixed incorrect trailing zeros on some %g conversions in printf.
+
+fixed buggy byte-swapping functions and moved them to inlines in
+byteswap.h.
+
+many small improvements to header/application compatibility, support
+for nonstandard macros, etc.
+
+
+
+0.7.9 release notes
+
+new pthread cancellation implementation:
+- safe against resource-leak/side-effect-leak race conditions
+- safe against interruption by signal handlers
+- reduced bloat in all cancellable functions
+- reduced bloat for blocking cancellation
+
+new interfaces implemented:
+- realpath (limited functionality)
+- wordexp (limited functionality)
+- flock (nonstandard)
+- forkpty (nonstandard)
+- posix_fadvise
+- posix_fallocate
+
+general bug fixes:
+- syslog function failure to communicate with syslogd
+- bug in siginfo_t definition if wait.h was included before signal.h
+- incorrect struct definitions for most of sysv ipc
+- pthread_exit/cancel on timer handler wrongly destroying the timer
+- linux dup2 ebusy workaround
+- obscure issues in non-threaded programs using some pthread functions
+- getopt_long allowed mismatch in last char of option name
+- incorrect parsing of obscure ip address forms
+- initgroups not working reliably (uninitialized var)
+- shadow pass treating empty expiry field as pass-expired-in-1970
+- bogus longjmp if pthread_exit was called from cancellation handlers
+
+x86_64-specific bug fixes:
+- fcntl file locking
+- thread stack alignment
+- broken select timeouts due to incorrect timeval definition
+
+
+
+0.7.10 release notes
+
+new features:
+- ipv6 numeric string parsing
+- eventfd syscall wrappers
+
+optimizations:
+- new qsort implementation using the smoothsort algorithm
+- much smaller/faster sigset_t handling functions
+- lowered spin count before futex wait in synchronization functions
+
+general bug fixes:
+- incorrect floating point round-to-even behavior in printf
+- major bugs in pthread barrier implementation
+- off-by-one error in scanf %n results
+- scanf failure to report EOF when scanning for literal text
+- minor missing/incorrect prototype issues
+- dependency on undefined call order in fclose
+
+compiler issue workarounds:
+- incorrect inlining of variadic functions on recent gcc versions
+- pcc preprocessor bug with recursive macro expansion
+
+
+
+0.7.11 release notes
+
+new features:
+- integrated dynamic linker
+- dynamic loading (dlopen/dlsym) (for dynamic-linked programs only)
+- XSI search.h API
+- POSIX message queues
+- POSIX spawn interfaces
+- BSD pseudo-random number generator API (random/srandom/initstate/etc.)
+- floating point environment (limited usefulness due to gcc bugs)
+
+general bug fixes:
+- possible crashes with wordexp due to uninitialized variable
+- race condition in pthread_kill (also present and unfixed in glibc/nptl)
+- pthread exit destructors called too late
+- dangerous unbounded vla in glob
+- brk/sbrk legacy functions mismatching legacy semantics
+- wcsncpy dest buffer overflow
+- strncat and wcsncat possible overflows due to double-termination
+
+
+
+0.7.12 release notes
+
+new features:
+- support for textrels in shared objects
+- rpath support in dynamic linker
+- stdio_ext.h functions (for better gnu software compatibility)
+
+bug fixes:
+- some compilers miscompiling dlopen due to misuse of longjmp
+- safe handling of invalid long-double bit patterns (affects printf)
+- workaround for bugs in linux mprotect syscall
+- thread-safety for random() functions
+- various minor issues
+
+
+
+0.8.0 release notes
+
+new features:
+- chinese and japanese legacy charset support in iconv
+- zero-syscall clock_gettime support (dynamic-linked x86_64 only)
+- futex-based locking for stdio (previously used spinlocks)
+- LD_PRELOAD and RTLD_NEXT support in dynamic linker
+- strptime (mostly working but incomplete)
+- posix aio (mostly working but not entirely conformant)
+- memory streams (fmemopen, open_memstream, ...)
+- stub/dummy implementations for various useless legacy functions
+- if_nameindex
+
+security hardening:
+- setuid, etc. should not longer be able to "partially fail" with threads
+- ensure suid programs start with fd 0,1,2 open
+- improved openpty/forkpty failure checks
+
+threads/synchronization bug fixes:
+- dangerous spurious wakeup in pthread_join lead to early return
+- race condition enabling async cancellation (delayed/lost cancellation)
+- destruction/unmapping race conditions in semaphores, mutexes, rwlocks
+- recursive rwlock_rdlock deadlock when a writer is waiting
+- race condition in sigqueue with fork
+- timer expiration thread exit wasn't running dtors
+- timer threads weren't blocking signals
+- close was wrongly cancellable after succeeding on some devices
+- robust mutex list was not reset on fork
+
+general bug fixes:
+- incorrect logic in fread (spurious blocking; crash on write-only files)
+- many corner cases and overflow cases for strtol-family functions
+- various printf integer formatting issues with flags/width/precision
+- incorrect iconv return value on failure
+- broken FD_* macros on 64-bit targets
+- clock function returning wrong value (real time not cpu time)
+- siglongjmp signal mask clobbering (off-by-one pointer error)
+- dynamic linker weak symbol resolution issues
+- fdopendir failure to set errno
+- various minor header fixes
+
+
+
+0.8.1 release notes
+
+bug fixes:
+- mismatching prototypes caused build failure on 64-bit
+- other minor prototype errors in the headers have been fixed
+- various other small omissions fixed
+
+
+
+0.8.2 release notes
+
+new features:
+- ptrace syscall support
+
+bug fixes:
+- const error (only a warning with many compilers) in lio_listio
+- minor portability fixes aimed at supporting new arch targets
+
+
+
+0.8.3 release notes
+
+new features:
+- arm port (experimental)
+- better musl-gcc wrapper script for building against musl
+- added clone system call
+
+bug fixes:
+- numerous header file typos, copy/paste errors, omissions
+- statfs and statvfs ABI are now LSB-conformant (and actually work)
+
+
+
+0.8.4 release notes
+
+new features:
+- arm dynamic linker support
+- process-shared pthread barriers now work
+- efficient futex-requeue-based cond var broadcast
+- more optional cancellation points are now cancellable
+- printf accepts null pointers with %s, prints as "(null)"
+- recursive mutexes are now fully reentrant
+- __cxa_atexit support
+- real vfork
+- dynamic linker now gold-compatible
+- prlimit syscall
+- support for large limits with setrlimit/getrlimit (even on 32-bit)
+- glob now supports GLOB_PERIOD option (GNU extension)
+
+bug fixes:
+- many serious issues in condition variables
+- rwlock failure-to-wake deadlock issues
+- various small header files bugs/omissions
+- wrong failure return for pthread_create
+- path handling issues on execvp
+- lock count corruption with robust recursive mutexes on owner death
+- integer overflows in atoi, etc. reading most-negative value
+- spurious mremaps on every realloc of large memory chunks
+- pthread cancellation failure in single-threaded programs
+
+security:
+- avoid fd_set overflow in dns lookups
+
+
+
+0.8.5 release notes
+
+new features:
+- stdio operations are now cancellable (only when low-level io happens)
+- global ctor/dtor support in main program start code and shared libs
+- dynamic linker support for PIE executables (but missing startup code)
+- vfork support on x86_64
+- complete set of locale_t functions (all ignore the locale argument)
+- provide define float_t and double_t in math.h
+- lighter/faster cancellation cleanup handler register/unregister
+
+bug fixes:
+- gcc wrapper now supports -shared, -nostdlib, -nostartfiles
+- removed one wrongly-classified character from iswspace set (zwsp)
+- fixed crashes in dns lookup on some errors, e.g. resolv.conf missing
+- "make install" no longer tries to build shared libc if disabled
+- ptrace argument handling bugs fixed
+- work around visibility-hidden bugs in gcc 3.x
+- fix thread-pointer-loss issue when it's initialized in signal handlers
+- various minor typo/misc fixes in headers
+
+compatibility:
+- glob behaves more like traditional implementations w.r.t. GLOB_MARK
+- added legacy futimes, lutimes functions
+- more compatibility macros in sys/param.h (nonstandard header)
+- setfs[ug]id syscall wrappers (linux specific)
+- fgetpwent function (nonstandard)
+- utmp.h matches traditional version more closely
+- caddr_t now matches glibc type (void * instead of long)
+- dummy (always-fail) dlopen and dlsym functions for static linked programs
+- [efg]cvt functions (previously posix, removed from standard)
+- get_current_dir_name function (nonstandard)
+
+
+
+0.8.6 release notes
+
+bug fixes:
+- fix crash in dns lookups for all static-linked, non-threaded programs
+
+
+
+0.8.7 release notes
+
+new features:
+- c++ support with g++'s libstdc++
+- c99 math library (float, long double, complex, etc.)
+- numerous wchar_t functions
+- a64l, l64a functions
+- getdate function
+
+compatibility:
+- c89 compatibility in math.h
+- syscall.h alias for sys/syscall.h
+- memory.h alias for string.h
+- getcwd supports null buffer argument (auto-allocation)
+
+bug fixes:
+- major fenv (floating point environment) fixes and optimizations
+- strptime mishandling of day/month names
+- strtoull wrongly rejecting the highest 16 possible values as overflow
+- math.h constant expression fixes for INFINITY/NAN/etc.
+- scanf mishandling of "0" with "%x"
+
+
+
+0.8.8 release notes
+
+new feature:
+- major math correctness and performance improvements
+- many math functions implemented in asm for i386
+- some math functions (mostly long double) in asm for x86_64
+- new floating point parser/converter with correct rounding
+- implement wcstod, wcstof, and wcstold
+- new scanf implementation - cleaner, faster, more correct
+- minimal/incomplete strfmon implementation
+
+compatibility:
+- header fixes for c++
+- regex code resync with TRE; support common regex extensions
+- support for compiling apps with gcc's -funsigned-char
+- sysconf now returns dynamic limits for open files, processes
+- give dlerror proper error status stickiness
+- make alloca work even with -fno-builtin
+
+critical security fixes:
+- stack-based buffer overflow in fprintf on unbuffered files
+
+other bug fixes:
+- rare gcc register allocation (miscompilation) bug in syscall wrappers
+- printf was rejecting the valid (but redundant) %lf format specifier
+- fixed big data bloat (missing const) in math functions
+- many math fixes related to floating point exceptions and rounding
+- corrected DECIMAL_DIG definitions
+- tgammal was wrongly setting global signgam
+- crash in wordfree with uninitialized we_offs
+- fix wordexp not null-initializing the we_offs initial slots
+
+
+
+0.8.9 release notes
+
+bug fixes:
+- major breakage in strtol and family: failure to accept leading spaces
+- incorrect name for MATH_ERREXCEPT in math.h
+
+compatibility:
+- prototypes for a few additional nonstandard functions
+
+
+
+0.8.10 release notes
+
+new features:
+- correct over/underflow detection (ERANGE setting) for strtod
+- new musl-gcc wrapper, specfile based, faster and more robust
+- meaningful return strings for dlerror
+- new iswalpha, iswpunct, and wcwidth; sync'd to Unicode 6.1
+- towupper/towlower sync'd with Unicode 6.1
+- new futex-based libc-internal locks instead of spinlocks
+- experimental stack protector support (minimal; no random canary)
+- experimental gdb shared library tracking support
+
+compatibility:
+- getusershell family functions
+- getresuid and getresgid syscall wrappers
+- byte swapping macros in endian.h
+- getdtablesize was wrongly declared in unistd.h for _XOPEN_SOURCE
+
+bug fixes:
+- iconv_open wrongly rejecting most dest charsets (broken in 0.8.0)
+- sysconf failure when correct value is -1 (broken in 0.8.8)
+- scanf and strtod family functions overreading past NAN (4 bytes vs 3)
+- scanf and strtod wrongly treating "0.00000000001", etc. as 0
+- many bugs in towupper/towlower (never seriously tested before)
+- int8_t definition was wrong when gcc -funsigned-char was used
+
+
+
+0.9.0 release notes
+
+license change: MIT
+
+new features:
+- configure script, improved build system
+- full stack protector support
+- PIE support on x86 and x86_64
+- new O(1) space, O(nm) time implementation of fnmatch
+- improved support for sse2 floating point mode on x86
+
+compatibility:
+- added linux unshare syscall
+- exp10/pow10 function
+- sqrtl support on arm (previously missing)
+- removed minimal linux/*.h headers that could conflict with real ones
+- support for _LARGEFILE64_SOURCE (mapped to standard fcns with #define)
+- better c89 compatibility in headers
+- stub versions of sched_* functions (previously missing)
+- pthread stacks no longer executable (compat with hardened kernels)
+- new ar.h and lastlog.h (legacy junk)
+- various other header improvements
+
+optimization:
+- additional x86_64 math asm
+- better formula for acos use in i386 asm
+
+bug fixes:
+- large (up to a few %) errors in strtod for certain values due to bug
+- mbsnrtowcs and wcsnrtombs were completely broken (bad exit logic)
+- wide printf %.0s could fail due to uninitialized variable
+- missing dlerror strings for dlsym in some cases
+
+
+
+0.9.1 release notes
+
+new features:
+- dynamic linker can be used as a program to explicitly load/run executables
+- ldd command, usable by making a symlink to the dynamic linker named ldd
+
+bug fixes:
+- major bugs in POSIX BRE parsing inherited from TRE regex code
+- character matching bug in regex on ARM: WCHAR_MAX was assumed to be signed
+- various obscure fixes related to signals and pthread cancellation
+- remquot subnormal remainder bug
+- buggy macros in (nonstandard) sys/param.h
+- major bug in pthread barriers on x86_64 (out of bounds write)
+- utimes (legacy) function was making wrong syscall (utime instead of utimes)
+- avoid using "old" syscalls that don't exist on arm eabi linux
+- broken strrchr(str, 0)
+- broken mbsinit(0)
+- broken wcsncmp
+- syntax error in nextafter macro in tgmath.h
+- missing support for -pie in musl-gcc wrapper
+- abort could wrongly fail to terminate the program in some cases
+
+compatibility:
+- increase default thread stack size to 80k
+- support _BSD_SOURCE feature test macro
+- support _LARGEFILE64_SOURCE feature test macro (merely exposes alt names)
+- lots of legacy-compatibility improvements in headers
+- various minor GNU extension functions
+- sysconf reporting number of available CPUs/cores
+- various LSB/glibc ABI interfaces aimed at compatibility with some binaries
+- use fistpll asm mnemonic instead of fistpq for compat with clang
+
+
+
+0.9.2 release notes
+
+bug fixes:
+- pointer overflow in printf (crash on 32bit userspace, 64bit kernel)
+- printf %ls over-read bug
+- strtod failure to read -0x as negative zero
+- flush stdio after dtors, not before
+- wrong file position for buffered input streams on exit
+- popen was broken when stdin/out were already closed
+- broken wcwidth tables (missing many characters)
+- fwrite: wrong return value of partial/failed write
+- broken utf-16 conversions
+- bad buffer length check in getlogin_r
+- bad perror("") behavior; did not match perror(0)
+- broken sysinfo syscall/structure
+- stdint.h const macro signedness bugs
+- broken include guards in some headers
+- bogus localeconv values
+- cancellation-safety for popen and pclose
+- fma corner cases wrong on i386
+- fcntl F_GETOWN errno missing on failure.
+- char signedness bug in dynamic linker broke dlopen on arm
+- mprotect failure in dynamic linker caused crash instead of error
+
+build system:
+- configure check to work around hacked-up gcc versions
+- test for old binutils that can't support musl dynamic linker
+
+compatibility:
+- make _GNU_SOURCE imply _LARGEFILE64_SOURCE
+- syscall wrapper for lots of nonstandard and/or legacy linux syscalls
+- versionsort stub
+- timegm function (inverse of gmtime)
+- various minor header tweaks
+- make __freading/__fwriting semantics match traditional ones
+- added gnulib-compatibility stdio interfaces
+- added pthread_attr_setstack interface
+- make strerror_r return partial string when buffer is too small
+- duplocale should accept LC_GLOBAL_LOCALE
+- align ptsname_r to upcoming posix requirements
+- support invalid ld80 bit patterns as extra nans.
+
+
+
+0.9.3 release notes
+
+new features:
+- mips (32-bit, o32 abi) port, currently static-linked only
+- newly overhauled crypt implementation
+- improved library pathname info for debugger from the dynamic linker
+- getaddrinfo (and getservbyname) now support /etc/services lookups
+- pipe2 syscall wrapper
+- splice and vmsplice syscall wrappers
+- syscall wrappers for extended attribute interfaces
+- ioperm/iopl syscall wrappers on archs that support these operations
+
+bug fixes:
+- dlsym RTLD_NEXT library search order was wrong
+- multiple dlopen pathname and library name handling errors
+- potential race condition in detached thread exit
+- broken internal-lock-handling code not updated for futex-based __lock
+- sem_trywait spurious EAGAIN errors arising from CAS failures
+- workaround kernel bug in cmsghdr size_t vs socklen_t issue (64-bit)
+- getservby* crash on null protocol argument
+- logic error skipping failed interfaces in if_nameindex
+- various minor header/declaration related issues
+
+arm-specific bug fixes:
+- broken crti/crtn startup code when gcc crtbegin/end files are linked
+- sigsetjmp tail call optimization failure broke the function
+- incorrect little-endian assumptions in atomic.h functions
+- use of blx instruction in asm (not supported on pre-v5 arm)
+
+build system:
+- only use expensive -ffloat-store cflag on archs/compilers that need it
+- make musl-gcc wrapper support -lgcc (mainly for self-hosting)
+
+
+
+0.9.4 release notes
+
+new features:
+- blowfish crypt
+- dynamic linking on mips
+- arm hard float support
+- BSD fgetln function in stdio
+- minor header improvements for compatibility
+- support for CROSS_COMPILE variable to configure
+- legacy significand function
+- better support for SUSv3-targeted programs
+
+performance:
+- assembly (string ops based) memcpy for i386 and x86_64
+- reduce printf overhead
+
+bug fixes:
+- failure of strtod, etc. to process extremely long strings correctly
+- read overrun in wcsstr for short needles
+- various major mips issues that prevented most software from working
+- erroneous floating point exception behavior in i386/x86_64 exp asm
+- crashes on null arguments to legacy err.h functions
+- various header file/type issues
+- extremely rare/obscure race condition with robust mutexes
+- crypt now never returns null (most programs don't check, then crash)
+- missing xattr remove functions
+
+
+
+0.9.5 release notes
+
+compatibility and headers:
+- POSIX+XSI+BSD features enabled by default with no macros defined
+- most programs can now be built without adding -D_GNU_SOURCE
+- added C99 restrict keyword where required in all prototypes
+- greater C89 compatibility
+- cleaner, more-compatible public syscall.h
+- many other header fixes
+- support for compiling musl with clang/llvm
+
+new features:
+- sha 256/512 password hash functions in crypt
+- GNU hash support in dynamic linker
+- partial C11 coverage
+- dladdr function added
+- dynamic linker reports all errors instead of exiting on first error
+- syscall wrappers added for most remaining linux syscalls
+- provide POSIX O_SEARCH open mode using linux O_PATH
+
+bug fixes:
+- most atexit functions were being skipped when exiting
+- some BSD functions were not being exposed under _BSD_SOURCE
+- issues loading ssp-protected DSO into non-ssp program with dlopen
+
+debloating:
+- eliminate .eh_frame (10-15% loaded size bloat)
+- optimal inline syscall asm for ARM and MIPS
+- no longer force -O3 for shared libs
+
+
+
+0.9.6 release notes
+
+bug fixes:
+- serious breakage in definition of O_ACCMODE mask (missing a bit)
+
+new features:
+- O_EXEC open mode
+- md5 crypt hash function
+
+
+
+0.9.7 release notes
+
+new features:
+- thread-local storage (__thread/_Thread_local)
+- microblaze port
+- getopt option parsing reset support
+- vsyscall (sysenter, etc.) support on i386 (faster syscalls)
+- memmem function (GNU extension)
+- mips fenv support
+- accept "nan(n-char-sequence)" in strtod/scanf family functions
+- configure now supports compiling with pcc
+
+quality and correctness improvements:
+- close-on-exec flag for all library-internal file descriptors
+- cancellation-safety and corner-case overhaul in shm_open/sem_open
+- close EINTR vs EINPROGRESS issue
+- mark binaries as not requiring executable stack
+- better gdb compatibility in dynamic linker
+- support recursive dlopen (dlopen called from constructors)
+- posix_spawn/system/popen no longer momentarily double commit charge
+- all stdio functions wait for locks
+
+bug fixes:
+- broken sysvipc *ctl functions on 64-bit archs
+- broken shmdt on some archs
+- getaddrinfo failure with port "0"
+- dirname handling of trailing slash
+- vfork race in posix_spawn
+
+
+
+0.9.8 release notes
+
+new features:
+- powerpc port
+- dl_iterate_phdr interface
+- added mips-specific syscalls
+- thread priority scheduling
+- C11 CMPLX macro in complex.h
+- x86 port io functions in sys/io.h
+
+compatibility:
+- improved headers for trace/debugging/machine-access
+- stub functions for unsupported thread-related functionality
+
+bug fixes:
+- numerous math bugs (mostly exception flags and excess-precision issues)
+- register clobber error in i386 vsyscall asm (did not affect most callers)
+- various incorrect definitions in mips headers
+- broken dlsym asm on mips
+- empty prefix handling in configure script (--prefix="")
+- ldso search path logic issues
+- lock handling for stdio memory streams at exit time
+- invalid SO_REUSEPORT definition in socket.h (not supported by Linux)
+- broken redirection attempt to /dev/null in configure script
+
+
+
+0.9.9 release notes
+
+new features:
+- tgamma implementation (no longer lgamma wrapper with low precision)
+- various gnu extensions: sigandset, sigorset, etc.
+- futimesat function (obsolete)
+- various linux syscalls: arch_prctl, personality, etc.
+
+optimizations:
+- hyperbolic, inverse hyperbolic, and inverse trig, bessel functions
+- is* comparison macros in math.h now expand inline properly
+
+library bugs fixed:
+- calling getenv from shared library ctors was broken
+- invalid read in mmap-serviced aligned_alloc/memalign (possible crash)
+- wrong errno result in fallback path of pipe2
+- various math functions raising spurious exceptions
+- mmap errno value on invalid offsets
+- backwards alignment logic in strlcpy
+- integer overflows in bessel functions
+- large (up to 60ulp) error in erfcf
+- dlsym/dlclose crashing on invalid library handles
+- failure to handle arch variations for cloexec/nonblock flags
+- lio_listio wrong return value for LIO_WAIT mode
+- dladdr failure to resolve PLT addresses
+- time_t/struct tm conversion off-by-one-day in december
+- malloc corruption on nonstandard kernels with non-page-aligned brk
+
+arch-specific bugs fixed:
+- arm ctors/dtors were not working with recent gcc versions
+- arm and mips setjmp/longjmp wrongly saved/restored fenv state
+- loss of precision in i386/x86_64 expl
+
+header bugs fixed:
+- incorrect PRI/SCN macros in inttypes.h for some types
+- arm sys/user.h regressions
+- failure of offsetof() to be an integer constant expression
+- tgmath return value type problems
+
+header compatibility improvements:
+- _GNU_SOURCE now enables everything; _ALL_SOURCE also works
+- scsi/scsi.h and scsi/sg.h are now provided
+- additional MAP_* flags for mmap
+- additional F_* commands and flags for fcntl
+- additional socket option, IPPROTO_* values, and multicase macros
+- thread-related waitpid flags
+- EHWPOISON added to errno.h
+- additional macros for mount, swap, and reboot operations
+- expose additional link.h structures
+- always ensure sizeof(NULL)==sizeof(void *), even in c++
+- additional flags for poll, epoll, inotify, timerfd, timex, dlfcn
+- register names in signal.h/ucontext.h for x86
+- ipc.h ipc_perm nonstandard struct field name compatibility improve
+
+
+
+0.9.10 release notes
+
+new features:
+- getifaddrs
+- pthread_getattr_np (widely used by garbage collectors)
+- mkostemps, mkostemp, mkstemps functions (mkostemp is future-POSIX)
+- strcasestr and strverscmp (previously stubs)
+
+improvements:
+- major performance improvements in mbtowc
+- avoid filling caller-provided thread stacks with large TLS
+- debloat unnecessary static buffers
+- robust posix_spawn based on CLONE_VM instead of vfork
+- new system() and popen() based on posix_spawn
+- better strerror strings
+- further emulation of atomic close-on-exec/nonblock options for old kernels
+- provide macro constants for new-ish kernel features
+
+compatibility:
+- several nonstandard but widely-available pwd/grp/shadow functions
+- program_invocation_[short_]name
+- re-added useconds_t type used by some programs
+- some legacy arpa headers
+- dn_skipname function (legacy resolver API)
+- additional ABI aliases for supporting glibc-linked libraries/binaries
+
+general bugs fixed:
+- stale locks and bogus munmap call when pthread_create fails
+- uninitialized argument to munmap when dynlink load_library fails
+- incorrect error returns in gethostby*_r
+- memory leak in gethostbyname family
+- blank ai_canonname in getaddrinfo for non-CNAME records
+- undefined HZ macro in scsi/sg.h
+- wrong return value for wmemmove on forward-copy
+- namespace conformance in strings.h
+- various utmp.h bugs
+- unnecessary DT_SONAME in libc.so caused problems on some systems
+- multiple bugs in syslog, some possibly dangerous
+- non-functional setpriority function
+- slight mishandling of 0xf5 byte in UTF-8 decoder
+- misaligned memory accesses in mbsrtowcs
+
+arch-specific bugs fixed:
+- crash in shared library loading on arm
+- missing __aeabi_atexit needed by arm eabi
+- wrong float_t definition on x86_64
+- various low-impact type size/alignment mismatches in some headers
+- epoll struct alignment wrong on non-x86[_64] archs
+- broken pipe2 fallback code on mips with old kernels
+
+
+
+0.9.11 release notes
+
+new features:
+- %m allocation modifier for scanf
+- week number and ISO week-based-year functionality in strftime
+- per-process and per-thread cputime clocks
+- ethernet address conversion interfaces
+- legacy classful ipv4 network address interfaces
+- minimal dlinfo function (nonstandard)
+
+other improvements:
+- dynamic linker path file can now use newlines to separate paths
+- math optimizations for archs with extended precision (i386)
+- musl-gcc wrapper now exposes gcc's intrinsic headers
+- quality of rand and rand_r pseudo-random sequences
+- support for large device minor numbers (greater than 8 bits)
+- various header conformance and compatibility fixes
+
+directly user-visible bugs fixed:
+- scanf losing characters on unbuffered streams and fmemopen streams
+- failure of mbsrtowcs to record stop position when dest is full
+- failure of iconv to convert to legacy codepages
+- non-working pthread_[sg]etschedparam functions (wrong syscall arguments)
+
+other potentially-serious bugs fixed:
+- resource leaks in sem_open
+- various bugs in thread exit synchronization
+- invalid access in aio notification after aiocb free/reuse
+- synchronization in dynamic linker when new thread dlopens during ctors
+- lack of error handling for failure to read dynamic linker path file
+- creation by mmap or shmget of objects larger than PTRDIFF_MAX
+
+minor conformance bugs fixed:
+- overflow handling for the clock function
+- workaround for incorrect exceptions in fma due to compiler bugs
+- workaround wrong kernel type for sem_nsems field in struct semid_ds
+
+arch-specific bugs fixed:
+- x86_64 sigsetjmp clobbered the signal mask rather than saving it
+- misaligned stack when calling ctors/dtors (crashing on x86_64)
+
+
+
+0.9.12 release notes
+
+new features:
+- zoneinfo time zone support
+- PIE support on all supported archs
+- named sub-archs for endian and float ABI variants
+- improved support for non-root installs of the dynamic linker
+- ability to selectively build only performance-critical modules with -O3
+- simple buffer overflow detection in free/realloc
+- inet_ntop now presents v4-mapped addresses in ::ffff:a.b.c.d form
+- ldd now reports libc and the dynamic linker in its output
+
+compatibility:
+- support for new init/fini array (needed for ctors/dtors on newer gcc)
+- C++ ABI fully matches glibc/LSB, at least on x86
+- many added ABI compatibility symbols for using glibc-linked libs
+- support for STB_GNU_UNIQUE symbol bindings (found in some C++ libs)
+- macros/types for new Linux kernel features in headers
+
+bugs fixed:
+- crashes in scanf on literal mismatches (regression from adding %m)
+- dl_iterate_phdr was passing invalid phdr pointers to its callback
+- getaddrinfo with null host and AF_UNSPEC was failing to report IPv6
+- integer overflows in date/time conversion code
+- misinterpretation of pre-1930s dates as post-2038 on 32-bit archs
+- make install failed to install bits headers if make was not run first
+- shm_open was wrongly cancellable
+- low- or no-impact heap corruption in memalign
+- explicitly running the dynamic linker on PIE programs did not work
+- missing macros and sysconf for some supported POSIX option groups
+- missing close-on-exec flags for several internal fd uses
+
+arch-specific bugs:
+- wrong SIG_ATOMIC_MIN/MAX macros on x86_64
+- erfcl was missing on archs where long double is same as double
+- broken dynamic-model TLS in static-linked arm/mips/powerpc programs
+
+
+
+0.9.13 release notes
+
+new features:
+- iconv support for EUC-KR and Big5 (including HKSCS) encodings
+- field widths (POSIX 2008 feature) in strftime
+- recursive rpath and $ORIGIN support in dynamic linker
+- cpu affinity interfaces
+- support for armhf (hardfloat) floating point environment (fenv)
+- support for SSE fenv on i386 (for apps using -mfpmath=sse -msse2)
+- strftime %s format (seconds since the epoch, future POSIX requirement)
+- configure script now saves its command line as a comment in config.mak
+- legacy functions valloc and euidaccess
+
+performance:
+- optimized asm memcpy for arm
+- optimized asm memset for i386 and x86_64
+- optimized C versions of memcpy and memset for all archs
+- eliminated major spurious syscalls from posix_spawn
+- some math asm for armhf (hardfloat)
+
+workarounds for:
+- qemu-user's rt_sigaction syscall does not allow old to alias new
+- qemu-user's madvise always succeeds (broke pthread_getattr_np)
+- passing PT_INTERP to dlopen attempted to double-load libc
+- gcc 4.8.x generating self-referential (infinite recursion) memcpy/memset
+- linux's lack of support for fchdir, fchmod, fchown, fstat on O_PATH fds
+
+bugs fixed:
+- failure to honor flags for fchmodat and faccessat (linux syscall api flaws)
+- SIGEV_THREAD timer id corruption and race condition issues
+- timer thread TLS incorrectly keeping values from previous expiry run
+- ecvt/fcvt decimal position off-by-one
+- in symbol-versioned libs, symbol resolved to oldest instead of newest
+- posix_spawn not correctly reporting errno from exec failure
+- "make install" was not atomic (overwrote files rather than replacing)
+- integer overflows in strftime
+- unset/empty TZ variable was mishandled
+- strftime could crash if the struct tm did not have valid tm_zone field
+- failure of fenv functions to handle invalid arguments (required by ISO C)
+- failure of some math functions (C and i386 asm) to raise underflow flag
+- broken dn_expand function (previously not used internally)
+- race conditions with signals during fork
+- incorrect access check in mktemp (obsolete function)
+- unnecessary arbitrary limits on size of program headers in dynamic loader
+- text formatting bugs in output of err.h functions
+
+arch-specific bugs:
+- fesetenv(FE_DFL_ENV) crashed on i386
+- breakage of arm crt code when libc is compiled as thumb
+- arm/armhf (hardfloat) misidentified by configure
+- ambiguity of wait (exit status) macros on mips with signal number 127
+- wrong value of _NSIG and SIGRTMAX on mips
+
+
+
+0.9.14 release notes
+
+bugs fixed:
+- failure to properly install dynamic linker with DESTDIR set (symlink wrong)
+- rare deadlock in libc-internal locking routines
+- dynamic linker used fallback paths wrongly on (possibly transient) errors
+- popen broken when stdin or stdout was already closed in parent
+- deadlock/memory-corruption in multithreaded set*id and setrlimit functions
+- realpath failed when file was not readable
+- readpath mistakenly had cancellation points in it
+- crashes in scanf with invalid %m conversion specifiers
+- misclassificiation of some invalid ld80 float representation in fpclassify
+- various overflow and underflow flag issues in math functions
+- domain handling errors for acoshf and acoshl
+- wrong values for some sysconf properties
+- lack of proper memory barriers on arm
+
+mips-specific bugs:
+- broken sysv ipc structures
+- multiple stack-related bugs in clone, leading to crashes in parent or child
+- overflow writing sigset_t in multithreaded set*id and setrlimit functions
+
+other improvements:
+- size and performance improvements to various math functions
+- wait.h as a compatibility alias for sys/wait.h
+- various header improvements
+- support for runtime-variable page size on archs that need it (mainly mips)
+
+
+
+0.9.15 release notes
+
+new features:
+- support for mixing IPv4 and v6 nameserver addresses in resolv.conf
+- RFC 3678 multicast structures/macros in netinet/in.h
+- putspent and fgetspent functions (shadow password API)
+- timef function (obsolete, removed in POSIX 2008)
+- fanotify syscalls (Linux-specific feature)
+- semtimedop syscall (Linux-specific sysvipc extension)
+- quotactl syscall and header (filesystem quotas support)
+- drem and finite functions (obsolete BSD functions)
+- getloadavg function (non-standard)
+- herror function (non-standard and obsolete)
+- libc.so now stores and prints its version information
+- expose constants for new Linux features including O_TMPFILE
+- implement FNM_LEADING_DIR option to fnmatch (GNU extension)
+- posix_close function (accepted for inclusion in next POSIX issue)
+
+bugs fixed:
+- buffer overflow in mbsrtowcs
+- clobbering of gr_name in getgrnam_r and getgrgid_r
+- execle ignoring the environment argument
+- setenv crash on malloc failure
+- out-of-bounds access in fnmatch with FNM_PATHNAME and certain patterns
+- failure of malloc to set errno when failing to extend heap
+- incorrect errno value from getcwd with zero size
+- spurious failure in faccessat with AT_EACCESS flag with suid/sgid programs
+- several fd leaks due to missing close-on-exec flag
+- misspellings/typos in macro names in several headers
+- incorrect failure return value in inet_pton
+- various numeric ip address parsing and validation fixes
+- namespace conformance issues in several headers
+- minor header issues
+- zombie processes left by faccessat with AT_EACCESS
+- timezone file parser failing/crashing on 64-bit archs
+- hang in localtime with near-overflowing time_t values on 64-bit archs
+- timezone path search was only trying first path
+- incorrect handling of excessive-length TZ environment strings
+- timezone file loading was wrongly enforcing O_NOFOLLOW/rejecting symlinks
+- iswspace was wrongly returning true for the null character
+- various bugs in wordexp
+- putgrent could write corrupt lines after write failures
+- dn_expand misinterpreted in-packet offsets greater than 255
+- spurious strftime/wcsftime failure on len+1==bufsize case
+- incorrect underflow flag in fma corner cases
+- log*(0) wrongly returned +inf in downward-rounding mode
+- failure of fchmod, fstat, fchdir, and fchown to produce EBADF
+
+arch-specific bugs fixed:
+- i386: failure of fesetround to set sse rounding mode
+- i386: floating point limit constants misinterpreted due to excess precision
+- powerpc: broken thread pointer access when compiled with clang
+- microblaze: dynamic linker entry point code possibly clobbering argv
+
+strict conformance issues:
+- NULL definition re-aligned with POSIX (requires (void *) cast)
+- alignment of math.h is* comparison functions with C11 annex F requirements
+
+
+
+1.0.0 release notes
+
+new features:
+- support for mips softfloat ABI variant
+- legacy setkey and encrypt API for DES
+- support for BSD version of struct tcphdr in addition to GNU version
+- added ipv6 and icmpv6 protocol lookups to getprotoent-family functions
+
+new experimental ports:
+- sh (SuperH)
+- x32 (ILP32 ABI for x86_64)
+
+compatibility:
+- improved c89 compiler support in math.h
+- eliminate some compiler warnings in public headers
+- added some missing things for LFS64 APIs
+- added fallback emulation of accept4 for older kernels
+
+bugs fixed:
+- buffer overflow in printf when printing smallest denormal exactly
+- rounding errors in printf in some just-over-halfway cases
+- posix_spawn did not accept null pid pointer (crashed)
+- ftello gave incorrect result for unflushed append-mode streams
+- mishandling of n=0 case in wcsxfrm (wild buffer overrun)
+- possible system breakage during libc upgrade due to install.sh bugs
+- nftw FTW_MOUNT flag prevented walking any directories at all
+- ptsname/ptsname_r returned negated error codes
+- getprotoent function returned junk after listing valid protocols
+- wrong error code from readdir when the directory has been deleted
+- various prototype/argument-type fixes, mostly to legacy functions
+- various header namespace violations
+
+arch-specific bugs fixed:
+- fesetenv(FE_DFL_ENV) was broken on i386 and x86_64
+- strerror(EDQUOT) did not work on mips
+- recvmsg/sendmsg were broken on powerpc
+- sysv ipc was broken on powerpc and mips
+- statfs/statvfs were broken on mips
+- sigaltstack was broken on mips
+
+
+
+1.1.0 release notes
+
+new features:
+- relro memory protection in dynamic linker
+- malloc can now extend heap with mmap if brk fails
+- vdso clock_gettime/gettimeofday/time acceleration on x86_64
+- thread/library-safe versions of search.h functions (nonstandard)
+- getauxval function (nonstandard)
+- sysconf extensions to query physical memory size
+
+bugs fixed:
+- floating point printf output corruption from carry into uninitialized slot
+- possible runaway carry overflow in printf floating point
+- printf %g failure to strip trailing zeros in some cases
+- search past end of haystack in memmem
+- off-by-one error in confstr return value
+- crashes in some near-empty static programs that use stack protector
+- deadlock race in pthread_once
+- non-working clock_gettime fallback for old kernels
+
+arch-specific bugs fixed:
+- crash from missing syscall asm register clobbers on real microblaze kernel
+- crash in all nontrivial dynamic linker use on microblaze
+- incorrect rlimit constants on mips
+- broken, possibly dangerous, use of getrlimit syscall on x32 in sysconf
+
+
+
+1.1.1 release notes
+
+new features:
+- new options --preload and --library-path to dynamic linker
+- public execvpe function (nonstandard extension)
+- iconv support for cp437 and cp850
+
+bugs fixed:
+- false negatives with some periodic needles in strstr, wcsstr, and memmem
+- crash on invalid zoneinfo files
+- incorrect zero-padding of some outputs for strftime %s specifier
+- misreporting of errors in configure script when $CC does not work at all
+- treating not-yet-implemented strptime specifiers as errors
+
+compatibility:
+- configure now detects serious constant-folding bug in gcc 4.9.0
+- removed __yield symbol (unused) that clashed with some compilers
+- improvements to sysconf's handling of unsupported/invalid arguments
+
+arch-specific bugs fixed:
+- misdetection of superh ABI variant by configure on gcc 3.x
+- missing SO_RCVBUFFORCE and SO_SNDBUFFORCE in mips socket.h
+- build regression on armv6 and later with -mthumb
+
+
+
+1.1.2 release notes
+
+new features:
+- multi-protocol matches (tcp and udp) in getaddrinfo
+- support for AI_V4MAPPED and AI_ALL flags to getaddrinfo
+- reverse name lookups from /etc/hosts
+- reverse service lookups from /etc/services
+- support for service aliases in /etc/services
+- ipsec and tunneling protocols to getprotoent-family functions
+- res_send, res_mkquery, res_querydomain, and dn_comp functions
+- ipv6 scope id handling for link-local scope addresses
+- previously-unimplemented %C and %y in strptime now work
+- vdso clock_gettime acceleration on i386 (new kernel feature)
+- better O_CLOEXEC/SOCK_CLOEXEC fallbacks for old kernels
+
+bugs fixed:
+- buffer overflow in dns response parsing (CVE-2014-3484)
+- possible infinite loop in dns response parsing
+- sendfile off_t 32/64-bit size mismatch
+- incorrect end pointer in some cases when wcsrtombs stops early
+- incorrect if_nametoindex return value when interface does not exist
+- dummy "ent" function aliases that possibly shadowed real ones
+- tmpfile fd leak on memory exhaustion
+- getaddrinfo returning EAI_NONAME for some transient failures
+
+arch-specific bugs fixed:
+- broken kernel side RLIM_INFINITY on mips
+- incorrect syscall argument 6/7 types for pselect on x32
+
+
+
+1.1.3 release notes
+
+new features:
+- address sorting in getaddrinfo, etc. modeled on rfc 3484/6724
+- default timezone taken from /etc/localtime when $TZ is unset
+- getopt double-colon extension for optional arguments
+- support for TLSDESC-based (gnu2) TLS dialect on i386 and x86_64
+- sendmmsg/recvmmsg (linux-specific)
+- fmtmsg (last mandatory XSI function that was missing)
+
+compatibility:
+- treat dns rcode=2 as temporary failure, not negative result
+- working thread-pointer for pre-2.6 kernels on i386
+- further ABI-compat symbols: __xmknod[at], __sysv_signal
+
+bugs fixed:
+- memmem false positives/false negatives/crashes from invalid logic
+- gethostby*_r not setting result pointer to null on failure
+- aliasing violations in syscall.h SYSLOG_NAMES feature
+- fanotify_mark syscall arguments wrong
+
+arch-specific bugs fixed:
+- various subtle relocation bugs in powerpc and sh dynamic linker
+
+
+
+1.1.4 release notes
+
+new features:
+- experimental locale support for LC_MESSAGES and LC_TIME
+- non-stub gettext family functions for message translation
+- or1k (OpenRISC 1000) port
+- syslog options LOG_CONS and LOG_PERROR
+- issetugid function (from OpenBSD)
+- improved if_nameindex and getifaddrs functions
+
+compatibility:
+- work around bug #61144 in gcc 4.9.0 and 4.9.1
+- support getauxval(AT_SECURE) even on kernels without AT_SECURE
+
+bugs fixed:
+- empty dynamic linker error messages (regression in 1.1.3)
+- if_nameindex omitted unconfigured and ipv6-only interfaces
+- incorrect return value for fwide function
+- failure of wide printf/scanf functions to set wide orientation
+- multiple issues in legacy function getpass
+- dynamic linker did not accept colon as a separator for LD_PRELOAD
+- errno clobber in syslog caused wrong output for %m specifier
+- crash in regexec for nonzero nmatch argument with REG_NOSUB
+- minor bugs in rarely-used nl_langinfo item lookups
+
+arch-specific bugs fixed:
+- broken relocations in mips dynamic linker (regression in 1.1.3)
+- register state corruption in setjmp asm for microblaze
+- broken struct stat st_ino field on microblaze
+- broken struct stat st_dev field on big endian mips
+- broken asm register constraints in atomics on powerpc
+- missing barriers in atomics on mips, powerpc, microblaze, and sh
+
+
+
+1.1.5 release notes
+
+new features:
+- full C11 coverage (threads, UTF-16/32 API, timespec_get, etc.)
+- malloc_usable_size function (nonstandard)
+- support for new F_OFD_* fcntl operations (linux 3.15, POSIX-future)
+- new _DEFAULT_SOURCE feature test macro to request default profile
+
+performance:
+- private-futex support
+- redesigned cond var implementation with major performance improvement
+- tweaked spinning in userspace before performing futex waits
+
+bugs fixed:
+- failure of dn_expand to null-terminate name for crafted DNS packets
+- corruption of cond var mutex state when switching mutexes
+- use of uninitialized memory with application-provided thread stacks
+- false ownership of orphaned mutexes due to tid reuse
+- possible failure-to-wake for robust mutexes on owner death
+- subtle errors in robust mutex unrecoverable status handling
+- missing memory/compiler barrier spinning to obtain locks
+- wrong behavior in various zero-length stdio operations
+- buffer overflow in swab with odd argument
+- incorrect sequence generation in the rand48 family of prng functions
+- missing cancellation check in non-wait paths of sem_wait, pthread_join
+- missing barrier in pthread_once fast path
+- memory leak in regexec when input contains illegal sequence
+- various parser bugs in regcomp
+- wrong return value on overflow in some strtoul-family functions
+- broken CPU_EQUAL macro in sched.h
+- dlerror not working in static-linked programs
+- mishandling of negative non-whole-hour TZ offsets
+- incorrect case mappings for U+00DF
+- namespace pollution via accidentally-non-static function named "dummy"
+- missing __fpclassifyl and __signbitl definitions for ld64 archs
+
+
+
+1.1.6 release notes
+
+new features:
+- getopt '-' flag for processing non-option arguments
+- getopt_long argument permutation extension
+- getopt_long abbreviated options
+- ns_parserr and related DNS-packet-parsing functions
+- fnmatch FNM_CASEFOLD extension
+- support for translation of getopt error messages
+- login_tty function (legacy)
+
+performance:
+- efficient atomics on armv7+ targets
+- pthread_once shrink-wrapping of fast path
+
+compatibility:
+- baseline arm binaries now work on new cpus/kernels without kuser_helper
+- dynamic linker now honors DT_RUNPATH without DT_RPATH (new binutils)
+- arm asm is now compatible with clang's internal assembler
+- suppress macro implementations of functions when headers are used in C++
+- increased message length limit for syslog
+
+bugs fixed:
+- open ignored file creation mode argument for O_TMPFILE
+- wrong printf formatting for %#.0o with value zero
+- missing private state for uchar.h functions (null ps pointer)
+- sched_getaffinity left uninitialized data in output bit array
+- wrong return values for pthread_getaffinity_np and pthread_setaffinity_np
+- buggy handling of multibyte option chars with arguments in getopt
+- printf failed to report or stop on write errors
+- printf failed to honor '+' modifier when printing NANs
+- wcsnrtombs returned the wrong value in one code path
+- syslog failed to check for connect error
+- multi-threaded set*id() had spurious failures from ugly workaround code
+- various minor header conformance bugs (signedness, constant expressions, ...)
+
+arch-specific bugs fixed:
+- on or1k, some syscalls with 64-bit arguments were broken (misaligned)
+- usage of sahf instruction on x86_64 crashed on some early cpu models
+
+
+
+1.1.7 release notes
+
+new features:
+- alternate passwd/group backend support via nscd protocol
+- masked cancellation mode extension (experimental)
+- aio cancellation
+- aarch64 port (experimental)
+
+performance:
+- significant memset asm optimizations on i386 and x86_64
+
+compatibility:
+- suppress EINTR in semaphores for old kernels where futex restart is broken
+- always set optarg in getopt_long
+- support SOCK_RAW socket type in getaddrinfo
+- report success instead of EINPROGRESS when close is interrupted
+
+bugs fixed:
+- multithreaded set*id() was not async-signal safe, had various race bugs
+- getspnam_r returned results for partial username matches
+- wordexp bad character checker mis-counted parentheses
+- close on fd with pending aio could lead to file corruption
+- old aio implementation had numerous conformance bugs
+- malloc init code could deadlock due to race condition
+- pthread_exit did not disable cancellation
+- pthread_cond_wait could wrongly consume signal on cancellation
+- execvp wrongly stopped path search on EACCESS
+- fsync, fdatasync, and msync were not honored as cancellation points
+- fchmodat was subject to fd leak race (missing O_CLOEXEC)
+- fchmodat failed to report EOPNOTSUPP in race path
+- passwd/group lookup functions had various minor error-reporting bugs
+- isatty had false-positives/device-state-corruption for OSS sound devices
+- configure script failed to detect gcc with translated messages
+- FLT_ROUNDS macro failed to reflect rounding mode changes in fenv
+
+arch-specific bugs fixed:
+- mips fesetenv did not handle FE_DFL_ENV
+- mips POLLWRNORM and POLLWRBAND macros had wrong values
+- x32 pthread synchronization object type definitions were wrong
+- powerpc minimum signal stack size was insufficient
+
+
+
+1.1.8 release notes
+
+bugs fixed:
+- stack-based buffer overflow in inet_pton (CVE-2015-1817)
+- regcomp crash/mem-corruption with illegal bytes after backslash
+- regcomp wrongly allowed backrefs in ER
+- regcomp miscompiled character class brace-repetitions
+- regcomp wrongly processed \0 as an unmatchable backref
+- new FLT_ROUNDS definition failed to work in C++ code
+
+arch-specific bugs fixed:
+- aarch64 was missing max_align_t definition
+
+
+
+1.1.9 release notes
+
+new features:
+- ability to protect libc code itself with stack protector
+- sigsetjmp now restores signal mask after restoring context, not before
+- thread-local dlerror status/messages
+- dlerror messages are no longer truncated
+- diagnostics for constraint violations with ctype.h macros
+
+optimizations:
+- reduce cost of PIC on archs where PLT calls need a fixed GOT register
+- spin locks no longer constantly invalidate cache lines while spinning
+- code size reduction in static-linked TLS init
+
+bugs fixed:
+- failure to process robust mutexes on detached-thread exit
+- possible memory corruption due to robust mutex list on detached-thread exit
+- crash on memory exhaustion in getgr* internals
+- misaligned memory accesses in static binaries with low-alignment TLS blocks
+- multiple cases of wrongful path search continuation after transient failure
+- small memory leak on failure of dlopen with RPATH $ORIGIN
+- several small math bugs related to exception flags with non-finite args
+- mmap leak in sem_open failure path for link call
+- duplocale clobbered new locale struct with memcpy of old
+- futimes crashed with null timeval argument
+
+arch-specific bugs fixed:
+- stack protector spuriously aborted after forking on x32
+- stack protector spuriously aborted with flockfile on powerpc
+- theoretically-possible clobbering of syscall return value on mips
+- random thread-pointer setup failure on sh (uninitialized return value)
+- possible crash in dlsym on sh due to incorrectly-computed branch target
+- broken fesetenv(FE_DFL_ENV) on mips
+- dynamic linker name for sh ignored fpu/nofpu and endianness
+- various minor aarch64 bugs
+- dangling pointers in x32 syscall timespec fixup code
+
+
+
+1.1.10 release notes
+
+new features:
+- fail-safe (allocation-free) C locale for newlocale to return
+- all locale categories track requested locale name
+- rcrt1.o start file for static PIE
+
+optimizations:
+- inline atomics for sh4a
+- removed heavy atomics from locale-related code paths
+- removed global data accesses from CURRENT_LOCALE macro & callers
+- dynamic linker stage 1 size reduction
+
+compatibility:
+- better configure detection of unsupported compiler options
+- support for more relocation types in libc.so, not currently used
+- iconv_open accepts "" and "CHAR" as aliases for native (UTF-8)
+- additional LFS64 macros in sys/resource.h
+
+regressions fixed:
+- dynamic linker crash on NONE-type relocations (only mips affected)
+- inability to build as thumb2 on arm
+- failure to run under qemu-i386 user-level emulation
+- inability to access globals from libc on powerpc
+- PIE link errors in Scrt1.o under unusual usage on some archs
+
+other bugs fixed:
+- failure of ungetc/ungetwc to work on FILE streams in EOF state
+- possible null pointer dereference in gettext
+- possible initial stack misalignment on mips with PIE
+
+
+
+1.1.11 release notes
+
+new features:
+- byte-based C locale
+- vdso clock_gettime on arm
+- musl-clang wrapper
+- sh2 nommu target support
+
+performance:
+- major speed-up for dynamic linker symbol lookups with GNU hash
+
+compatibility:
+- strverscmp now matches GNU behavior in corner cases
+- empty TZ environment variable gives GMT rather than system default
+- reconnection on syslog server socket loss (syslogd restart)
+- mmap fallback in simple_malloc when brk fails
+- support for %m and %s with null pointers in wide printf variants
+- call frame information in i386 asm for improved debugger support
+
+bugs fixed:
+- spurious errors from pwd/grp functions when nscd backend is absent
+- possible invalid access on calloc with simple_malloc
+- null pointer dereferences after calling uselocale((locale_t)0)
+- erroneous support for cancellation in stdio caused data loss
+- inconsistent handling of atexit called from atexit handler
+- missing locking in error paths for ungetwc
+- btowc mishandling of out-of-range non-EOF inputs
+- negated return value of ns_skiprr, failure in related functions
+- incorrect void return type for syncfs, missing error status
+- possible failure of tempnam due to missing null termination
+- negated tm_gmtoff field in struct tm
+- off-by-one error in getsubopt leaving equals sign in value result
+
+arch-specific bugs fixed:
+- soft deadlocks on i386/x86_64 due to missing barrier in internal locks
+- regression in arm pre-v7 support for kernels with kuser helper removed
+- runaway PC on mips detached thread exit (due to kernel regression)
+- mismatched ABI for local-dynamic model TLS on mips and powerpc
+- incorrect value of some SO_* constants on mips
+- broken 64-bit syscall argument passing on aarch64
+
+
+
+1.1.12 release notes
+
+new features:
+- fdpic abi on sh2 for shareable text segment without mmu
+- general fdpic elf support in dynamic linker
+- CFI generation for x86_64 asm source files
+- protection against silently building a libc.so with missing symbols
+
+compatibility:
+- nl_langinfo(CODESET) now returns "ASCII" in byte-based C locale
+- fixed build regression due to buggy .SECONDARY in some GNU make versions
+- additional arm eabi functions needed by llvm arm backend
+- added format argument attributes to gettext function prototypes
+- static PIE no longer requires linking with -E/-rdynamic
+- eliminated spurious protected-data warnings linking against libc.so
+- avoided spurious fpu asm errors with some armhf toolchains
+
+bugs fixed:
+- fclose of stdin/stdout caused deadlock at exit
+- missing memory barrier in pthread_join
+- open_[w]memstream produced no buffer when no writes took place
+- uninitialized scopeid in address lookups from hosts file and ip literals
+- ip literals for mismatching family (v4 vs v6) were queried as hostnames
+- possible crash on OOM in regcomp
+- incorrect contents in localeconv structure (-1 instead of CHAR_MAX)
+- strftime mishandling of out-of-range struct tm members
+- wrongful attribute((const)) on pthread_self and errno location function
+
+arch-specific bugs fixed:
+- arm crt1 entry point failed to align stack pointer in some cases
+- mips fesetround failed to actually set rounding mode
+- i386 asm source CFI generation had multiple bugs
+
+
+
+1.1.13 release notes
+
+new features:
+- out-of-tree builds
+- search domains in resolv.conf
+- sh arch supports j-core (j2) cas.l atomics
+- dynamic linker includes arch/abi in output when run as a command
+- header support for new kernel features through linux 4.4
+- mips vdso clock_gettime support
+- regex BRE extensions: \|, \+, \?
+
+performance:
+- improved atomics performance on all archs with ll/sc model
+- atomic instructions are now inlined on armv6
+- use fpu sqrt for arm softfp abi on targets with vfp
+
+compatibility:
+- getnameinfo now accepts sockaddr sizes larger than needed
+- new default CFLAGS/LDFLAGS avoid entire classes of toolchain bugs
+- explicit use of float_t/double_t avoids compiler float spill bugs
+- i386 max_align_t definition now works with g++ 4.7's pseudo-c++11
+- all known protocols are added to protoent functions
+- stub utmpname, utmpxname functions
+- linker support for -Bsymbolic-functions is no longer mandatory
+- regex parsing size limits increased
+- malloc_usable_size now accepts null pointer input
+
+bugs fixed:
+- potential single-byte heap overflow in getdelim
+- mishandling of transient failure opening hosts, services, resolv.conf
+- mremap was sometimes able to allocate objects larger than PTRDIFF_MAX
+- nl_langinfo wrongly returned NULL instead of "" for invalid items
+- out-of-bounds dynamic tls allocation due to pointer/index scaling error
+- getifaddrs misreported point-to-point interface addresses
+- tdelete left tsearch trees misbalanced
+- tsearch crashed on allocation failure
+- tsearch, tfind, and tdelete failed to handle null pointer input
+- passing signal number 0 to sigaction resulted in a crash
+- getdelim updated caller's size wrongly when realloc failed
+- getdelim realloc strategy was wasteful
+- if_nametoindex returned wrong value on failure
+- missing ssp-suppression for some source files called from early-init
+- various minor resolv.conf parsing bugs
+- fwrite wrongly reported success on write errors in line-buffered flush
+- fwrite and fread wrongly returned nmemb (not 0) when size was 0
+
+nommu-specific bugs fix:
+- failure to zero bss in FDPIC shared library loader
+- unsafe writes to read-only file mapping in non-FDPIC library loader
+
+arch-specific bugs fixed:
+- sh[eb]-nofpu-fdpic was using fpu-dependent setjmp/longjmp variants
+- dynamic linker path file name was wrong for arm "softfp" targets
+- mips siginfo_t and related macros were defined incorrectly
+- possibly misaligned pointer globals on arm (from an asm source file)
+- mips dynamic linker failed to provide info needed by debugger
+- mips cancellation asm wrongly assumed validity of $gp register value
+
+
+
+1.1.14 release notes
+
+regressions fixed:
+- treatment of empty string argument as error by puts and fputs
+- make clean and distclean failure in unconfigured trees
+- sh/fdpic dynamic linker entry point hang due to wrong code
+- armhf (and arm softfp model) build failure with clang
+
+other bugs fixed:
+- wrongly clamping (rather than failing) excessive rounds in crypt-sha*
+
+
+
+1.1.15 release notes
+
+new features:
+- mips64 (full 64-bit and n32) port
+- mips r6 isa support (subarch for mips, mips64, and mipsn32 archs)
+- powerpc64 port
+- powerpc (32-bit) soft-float ABI support (subarch)
+- pthread_tryjoin_np and pthread_timedjoin_np (nonstandard extensions)
+- header-level support for linux 4.5 and 4.6 features
+- sched_getcpu (nonstandard extension) support, including vdso version
+- __STDC_ISO_10646__, __STDC_IEC_559__ macros predefined via stdc-predef.h
+- support for new elf/arch features in elf.h
+
+compatibility:
+- configure now correctly chooses cross-prefix based on build/host/target
+- abort now successfully terminates pid 1 in a container (or top-level)
+
+bugs fixed:
+- memmem read past end of haystack, possible false positives or crashes
+- buffer underflow (reverse-overflow) in ungetwc
+- double-free under certain usage of putenv
+- incorrect treatment by regcomp of * at start of BRE subexpression
+- gethostbyname[2][_r] produced ip addresses in misaligned buffers
+- looking up some invalid hostnames caused malformed dns queries
+- lookups from hosts file were inconsistent with non-matching family
+- missing h_length value in gethostbyaddr results
+- a64l function produced wrong-signed results on 64-bit archs
+- broken padding of string formats to width in wide printf variants
+- wrong results for expf(-NAN) and exp2f(-NAN)
+- wrong value for RUSAGE_CHILDREN prevented it from working
+- abort failed to provide abnormal termination with SIGABRT blocked
+
+arch-specific bugs fixed:
+- broken posix_fadvise on arm and powerpc (32-bit)
+- thread structure/dtv corruption on powerpc at thread startup
+- various wrong mips and powerpc ioctl and termios constant values
+
+
+
+1.1.16 release notes
+
+new features:
+- s390x (64-bit S/390) port
+- pthread_setname_np extension function
+- limited pthread_setattr_default_np function to set stack size defaults
+- header-level support for linux 4.7, 4.8, and 4.9 features
+- confstr _CS_V6_ENV and _CS_V7_ENV items
+
+compatibility:
+- public prototypes for abi-compat *_unlocked symbols, etc.
+- fflush_unlocked(NULL) now works
+- resolv.h __RES version macro now matches supported APIs
+- workaround for gdb bugs backtracing across signals on x86_64
+- anchors ^ and $ are now accepted in BRE subexpressions
+- building for thumb2-only arm isa levels is now possible
+
+bugs fixed:
+- integer overflows in regexec buffer allocation (CVE-2016-8859)
+- failure of regexec to report matches at offsets past INT_MAX
+- static-pie executables with initialized thread-local storage crashed
+- printf failed to catch EOVERFLOW in some cases, wrongly produced it in others
+- printf produced wrong output, result for float with precision near INT_MAX
+- printf produced wrong results with alt-form octal, zero flag, & field width
+- printf float rounding was wrong for some midpoint cases
+- swprintf printed junk after internal (256-byte) buffer filled up
+- strtod family rounded incorrectly in several corner cases
+- getmntent failed to handle long records
+- getopt_long_only wrongly treated "--" as an option
+- asctime output wrongly varied by locale
+- strftime %y specifier produced wrong output for negative tm_year
+- time zone names quoted with <> were misparsed
+- corner case integer overflow in tm_year for some date conversions
+- failure to load shared libs whose names were prefixes of standard lib names
+- wrong error codes for several failure cases in various functions
+- various asymptomatic undefined behavior
+- various minor namespace issues in headers
+
+arch-specific bugs fixed:
+- tcsetattr regression on mips (completely non-working)
+- wrong pread/pwrite syscall calling convention on sh
+- wrong preadv2/pwritev2 syscall numbers on x32
+- mrand48/jrand48 produced wrong-signedness results on 64-bit archs
+
+
+1.1.17 release notes
+
+new features:
+- RTLD_LAZY deferred symbol binding, functionally equivalent to lazy binding
+- safeguard against dlopen of multiple libc versions/instances
+- new posix_spawn flag POSIX_SPAWN_SETSID
+- posix_spawnattr_setflags now reports unknown flags as error
+- ldso option --argv0 to set argv[0]
+- added _NL_LOCALE_NAME extension to nl_langinfo
+
+compatibility:
+- dlopen local-to-global promotion no longer changes existing symbols
+- gettext now searches locale name variants for translation files
+- increased locale name length limit from 15 to 23 bytes
+- setlocale(LC_ALL, 0) returns single name if all categories are same
+- realloc no longer fails when mremap doesn't work
+- getservby* no longer treat numeric port strings as service records
+- mmap now works around incorrect EPERM error codes from kernel
+- impact of REG_* namespace pollution in x86[_64] signal.h is reduced
+- arm atomic asm now assembles correctly with new binutils
+- PAGE_SIZE on arm is no longer constant (quiet upstream ABI relaxation)
+- lsearch/lfind now pass args to compare callback in canonical order
+- STB_WEAK and STB_GNU_UNIQUE symbols now behave same as STB_GLOBAL
+- better clang CFLAGS checks in configure
+- global vis.h hack, which made lld refuse to link to libc.so, is disabled
+
+performance:
+- single-instruction optimized math functions for aarch64, s390x, powerpc64
+- fast path for ASCII in towupper/towlower
+- new mostly-integer-math fma function
+
+semantic bugs fixed:
+- POSIX-format TZ dst time transitions were wrong for southern hemisphere
+- regex REG_NEWLINE semantics were wrong with negated brackets
+- various bugs in strptime %j, %p, %C formats
+- iconv mapped some characters to legacy 8bit encodings incorrectly
+- glob failed to match "/"
+- UTF-8 decoder accepted invalid f4 9x xx xx code sequences
+- scanf %% conversion failed to consume whitespace
+- glob with GLOB_PERIOD wrongly descended into . and ..
+- nftw gave incorrect base name offset when pathname ends in "/"
+- functional regression in resolv.conf attempts option
+- scalbn could produce wrong result due to double rounding in subnormal range
+- strftime %y format wrong with negative years
+- mbsnrtowcs and wcsnrtombs mishandled input limits
+- minor issues with error codes for various functions
+
+safety/consistency bugs fixed:
+- stack-based buffer overflow in dns response processing
+- invalid free in regexec on certain error paths
+- invalid free in globfree after failed glob
+- one-byte buffer overflow in legacy getpass function
+- failed dlopen corrupted thread-local storage module list
+- race in pthread_create with priority attributes could leave signals masked
+- multithreaded set*id() functions could induce spurious EINTRs
+- dl_iterate_phdr reported wrong base address in static PIE
+- fd leak and wrong cancellation state after dns socket failure
+- memory leaks and other issues in environment-modification functions
+- read-after-free race in pthread_detach
+- memmem performed single-byte over-read in short-needle code paths
+- read via uninitialized pointer in gettext core
+- bindtextdomain broke bindings for all other domains
+- various silent undefined behavior
+- getopt clobbered optopt on success
+
+arch-specific bugs fixed:
+- x32 dynamic TLS accesses crashed
+- s390x was missing dlsym entry point (needed for RTLD_NEXT)
+- powerpc64 ldso startup could crash depending on link order
+- powerpc64 setjmp/longjmp didn't properly save/restore TOC pointer
+- thumb2 setjmp/longjmp silently broke at ld-time with text not aligned
+- fchown was broken on archs without SYS_fchown syscall
+- fstatat was broken on mips64
+- various incorrect constants in powerpc64 and mips headers
+
+
+1.1.18 release notes
+
+regression fixes:
+- glob failed to match literal . and .. path components
+- build for armv4t ISA level was broken
+
+other bug fixes:
+- stack overflow in posix_spawnp with large PATH variable in environment
+
+
+1.1.19 release notes
+
+new features:
+- iconv framework for processing stateful encodings
+- iconv support for iso-2022-jp
+- iconv support for converting to legacy JIS-based Japanese encodings
+- iconv support for UTF-16/32 with BOM-determined endianness
+- iconv ibm1047 (ebcdic latin1-equivalent) support
+- iconv cp866 (dos cyrillic) support
+- character data tables & case mappings updated to Unicode 10.0
+- fopencookie stdio extension
+- strftime padding character extensions
+- header-level support for new linux features through 4.13
+
+compatibility:
+- UTC timezone is now called UTC instead of GMT
+- _DIRENT_HAVE_D_* macros in dirent.h
+- dladdr dli_fbase definition now matches other implementations
+- pthread_getattr_np now reports guard size
+- strftime '+' modifier better matches apparent intent of POSIX
+- getopt_long handles long option names containing '='
+- better compatibility with linux uapi headers
+- workaround linux bug where getcwd can return non-absolute pathname
+- configure logic for finding compiler_rt with clang
+- execvp path search now continues after ENOTDIR components
+
+bugs fixed:
+- fgetwc failed when character crossed buffer boundary
+- memory corruption after failing to dlopen a second libc
+- sysconf reported infinite rlimits incorrectly
+- getopt_long --opt=arg did not work with partial matches
+- printf was wrong for alt-form octal with value 0, no explicit precision
+- endian errors in arpa/nameser.h and netinet/icmp6.h (missing endian.h)
+- atfork handler could clobber fork's errno
+- iconv could wrongly output surrogate pairs in ucs2
+- fmemopen buffer underallocation with extreme size argument
+- getaddrinfo AI_NUMERICSERV wrong error code
+- data race in at_quick_exit
+- ldd failed to honor rpath $ORIGIN for program in . without "./" prefix
+
+arch-specfic bugs fixed:
+- x32 unistd.h wrongly reported LP64 instead of ILP32
+- aarch64 signal.h had wrong type for ucontext_t uc_link member
+
+
+1.1.20 release notes
+
+new features:
+- m68k port
+- replacement of malloc is now allowed/supported
+- setvbuf now accepts caller-provided buffers for stdio streams
+- getrandom syscall wrapper, getentropy function
+- mlock2 syscall wrapper
+- memfd_create syscall wrapper
+- explicit_bzero function
+- header-level support for new linux features through 4.17
+- wcsftime now supports padding specifier extensions
+- dynamic linker's reclaim_gaps now works on fdpic archs
+- getaddrinfo now honors AI_ADDRCONFIG
+- pthread_attr_init now honors pthread_setattr_default_np defaults
+
+hardening:
+- prevent bypass of guarantee that suids start with fd 0/1/2 open
+- dlopen now rejects libraries with initial-exec refs to dynamic TLS
+
+compatibility:
+- elf.h: new flags, aux vector entry types, etc.
+- minor namespace issues in several headers
+- intNN_t types used in bitfields now safe against -funsigned-bitfields
+- complex arc trig/hyperbolic functions were badly broken
+- nice function returned wrong value
+- stdio locks no longer depend on read-after-free not faulting
+- avoid excessive stack usage in getcwd
+- inet_ntop no longer compresses single zeros in IPv6 (RFC 5952)
+- resolver routability probe for sorting results works on no-IPv6 systems
+- added missing ST_RELATIME definition to statvfs.h
+- uchar.h now works with old C++ profiles
+- added missing and arch-specific commands to ptrace.h
+- musl-gcc wrapper now works with default-pie host toolchains
+
+bugs fixed:
+- getopt wrongly treating colons in optstring as valid option chars
+- nl_langinfo_l(CODESET, loc) reported wrong locale's value
+- out-of-tree build produced broken crt files with stack protector enabled
+- fmaf produced wrong result for some corner cases
+- out of bounds write for zero length buffer passed to gethostname
+- getopt_long_only wrongly prefix-matched long-options over short ones
+- pthread_kill wrongly returned ESRCH for exited by valid pthread_t's
+- iconv buffer overflow converting to legacy JIS-based encodings
+- iconv conversion to "UTF-32" (no explicit endianness) failed (regression)
+- iconv mishandled big5-hkscs characters that map to two unicode chars
+- dynamic linker didn't map/clear bss for libraries with single LOAD segment
+- resolver wrongly duplicated trailing dot from query into canonical name
+- some futex waits omitted timeout arg to syscall, thereby spun on EFAULT
+- dladdr mishandled addresses not matching symbols
+- alignment of dirent structures from readdir was broken (regression)
+- strftime %z output wrong sign for offsets <1 hour west of UTC
+- limits.h, pathconf erroneously defined SYMLINK_MAX
+- FP_ILOGB0 and FP_ILOGBNAN definitions were not valid for use in #if
+- getopt failed to update optarg and optind correctly on missing argument
+- EMULTIHOP error lacked strerror text
+- mktime malfunctioned with tm_isdst>0 but no-DST POSIX-format time zone
+- async thread self-cancellation produced a deadlock condition
+- pthread_barrierattr_setpshared failed to produce EINVAL for bad argument
+- fileno failed to produce EBADF for non-fd-associated FILEs
+- fmemopen's w+ mode failed to truncate buffer at open
+- open_[w]memstream did not bind stream orientation at open time
+- system wrongly returned 0x7f00 instead of -1 on error
+- wide printf functions ignored field width for %c formats
+- fprintf failed to set stream orientation for unbuffered stream or no output
+- psignal, psiginfo, and perror wrongly set stream orientation for stderr
+- psignal, psiginfo potentially clobbered errno on success
+
+arch-specfic bugs fixed:
+- on arm/aarch64/sh, local-exec TLS layout mismatched ABI with large align
+- on arm/microblaze/sh, struct ipc_perm mismatched (buggy) kernel ABI
+- SO_PEERSEC definition was wrong on mips
+- on mips, return from start function passed to clone crashed (runaway exec)
+- printf %a precision specifier malfunctioned except on ld80 archs
+- async thread cancellation crashed on powerpc64 and sh-fdpic
+
+
+1.1.21 release notes
+
+new features:
+- setting default thread stack size via PT_GNU_STACK program header
+- arm vfork implementation
+- arm tlsdesc/gnu2 tls dialect support
+- name_to_handle_at and name_to_handle_at syscall wrappers
+- header-level support for new linux features through 4.18
+
+optimizations:
+- glob rewrite with much better performance and stack usage properties
+- single-threaded and already-locked fast paths for getc/putc variants
+- single-instruction fma implementations for arm, s390x, powerpc, & x86_64
+- single-instruction fabs and sqrt implementations for powerpc
+- size and performance from making all internal-only functions/data hidden
+- made &errno and pthread_self results cachable again (attribute((const)))
+- significant speedup in strtod with short inputs
+- new tsearch AVL tree implementation, smaller and faster
+- special-cased nop calls to wmemmove
+- fixed erroneously suboptimal skip conditions in strstr and memmem
+
+hardening:
+- default thread stack guard size increased from 4k to 8k
+
+compatibility:
+- default thread stack size increased from 80k to 128k
+- building for arm as thumb2 with clang internal assembler now works
+- aio threads could overflow stack on kernels that break MINSIGSTKSZ ABI
+- aio threads no longer call malloc (problematic with malloc replacement)
+- pthread_sigmask/sigprocmask now ignore an invalid how when not changing mask
+
+bugs fixed:
+- soft deadlock regression in stdio FILE locks with >2 threads contending
+- deadlock and buffered data loss race in fclose
+- race condition leading to possible crash in dcngettext plural forms
+- glob failed to see past searchable-but-unreadable path components
+- getdelim wrongly realloc'd buffer that was already exactly right size
+- getdelim failed to set stream orientation on early error
+- ttyname[_r] reported wrong error when given bad fd
+- pthread_key_delete left old tsd values exposed if slot was reused
+- freeaddrinfo failed to support freeing sublists
+- access to optopt was broken by copy relocations
+- memccpy returned wrong result if first byte past buffer end matched
+- wordexp read past end of input string ending in backslash
+- sem_wait and sem_timedwait were wrongly not interruptible by signals
+- getspnam[_r] wrongly treated not-found as an error
+
+arch-specfic bugs fixed:
+- soft deadlocks (missing futex wake) on powerpc locking
+- dlsym returned wrong address for thread-local symbols on ppc/mips/m68k
+
+
+1.1.22 release notes
+
+new features:
+- priority-inheritance mutexes
+- membarrier syscall, pre-registration to use it, fallback emulation
+- header-level support for new linux features in 4.19, 4.20, 5.0
+
+major internal changes:
+- complete, async-safe view of all existent threads as global list
+- robust __synccall based on new thread list
+- new dynamic TLS is installed synchronously at dlopen
+- TLSDESC resolver functions no longer make bad ABI assumptions to call C
+- resolved shared library dependencies are now recorded
+
+compatibility & conformance:
+- dependency-order shared library constructor execution
+- sigaltstack no longer rejects SS_AUTODISARM, future flags
+- FILE is now a complete (dummy) type in pre-C11 feature profiles
+- setvbuf reports failure on invalid arguments
+- TSVTX is exposed unconditionally in tar.h
+- multithreaded set*id() no longer depends on /proc
+- key slot reuse after pthread_key_delete no longer depends on /proc
+
+bugs fixed:
+- failures in multithreaded set*id() with concurrent thread creation/exit
+- interposed free was called from invalid/inconsistent contexts
+- freeaddrinfo performed invalid free of some partial results lists
+- dlsym dependency order search had false negatives and false positives
+- dn_skipname gave wrong results for labels with 8-bit content
+- dcngettext clobbered errno, often breaking printing of error messages
+- sscanf read past end of buffer under certain conditions (1.1.21 regression)
+- pthread_key_create spuriously failed under race condition (1.1.21 regression)
+- fdopendir wrongly succeeded with O_PATH file descriptors
+- gets behaved incorrectly in presence of null bytes
+- namespace violations in c11 tsd and mutex function dependencies
+- incorrect prototype for makecontext (unimplemented)
+
+arch-specfic bugs fixed:
+- s390x had wrong values for POSIX_FADV_DONTNEED/_NOREUSE
+
+
+
+1.1.23 release notes
+
+new features:
+- riscv64 port
+- configure now allows customizing AR and RANLIB vars
+- header-level support for new linux features in 5.1
+
+major internal changes:
+- removed extern __syscall; syscall header code is now fully self-contained
+
+performance:
+- new math library implementation for log/exp/pow
+- aarch64 dynamic tlsdesc function is streamlined
+
+compatibility & conformance:
+- O_TTY_INIT is now defined
+- sys/types.h no longer pollutes namespace with sys/sysmacros.h in any profile
+- powerpc asm is now compatible with clang internal assembler
+
+changes for new POSIX interpretations:
+- fgetwc now sets stream error indicator on encoding errors
+- fmemopen no longer rejects 0 size
+
+bugs fixed:
+- static TLS for shared libraries was allocated wrong on "Variant I" archs
+- crash in dladdr reading through uninitialized pointer on non-match
+- sigaltstack wrongly errored out on invalid ss_size when doing SS_DISABLE
+- getdents function misbehaved with buffer length larger than INT_MAX
+- set*id could deadlock after fork from multithreaded process
+
+arch-specfic bugs fixed:
+- s390x SO_PEERSEC definition was wrong
+- passing of 64-bit syscall arguments was broken on microblaze
+- posix_fadvise was broken on mips due to missing 7-arg syscall support
+- vrregset_t layout and member naming was wrong on powerpc64
+
+
+
+1.1.24 release notes
+
+new features:
+- GLOB_TILDE extension to glob
+- non-stub catgets localization API, using netbsd binary catalog format
+- posix_spawn file actions for [f]chdir (extension, pending future standard)
+- secure_getenv function (extension)
+- copy_file_range syscall wrapper (Linux extension)
+- header-level support for new linux features in 5.2
+
+performance:
+- new fast path for lrint (generic C version) on 32-bit archs
+
+major internal changes:
+- functions involving time are overhauled to be time64-ready in 32-bit archs
+- x32 uses the new time64 code paths to replace nasty hacks in syscall glue
+
+compatibility & conformance:
+- support for powerpc[64] unaligned relocation types
+- powerpc[64] and sh sys/user.h no longer clash with kernel asm/ptrace.h
+- select no longer modifies timeout on failure (or at all)
+- mips64 stat results are no longer limited to 32-bit time range
+- optreset (BSD extension) now has a public declaration
+- support for clang inconsistencies in wchar_t type vs some 32-bit archs
+- mips r6 syscall asm no longer has invalid lo/hi register clobbers
+- vestigial asm declarations of __tls_get_new are removed (broke some tooling)
+- riscv64 mcontext_t mismatch glibc's member naming is corrected
+
+bugs fixed:
+- glob failed to match broken symlinks consistently
+- invalid use of interposed calloc to allocate initial TLS
+- various dlsym symbol resolution logic errors
+- semctl with SEM_STAT_ANY didn't work
+- pthread_create with explicit scheduling was subject to priority inversion
+- pthread_create failure path had data race for thread count
+- timer_create with SIGEV_THREAD notification had data race getting timer id
+- wide printf family failed to support l modifier for float formats
+
+arch-specific bugs fixed:
+- x87 floating point stack imbalance in math asm (i386-only CVE-2019-14697)
+- x32 clock_adjtime, getrusage, wait3, wait4 produced junk (struct mismatches)
+- lseek broken on x32 and mipsn32 with large file offsets
+- riscv64 atomics weren't compiler barriers
+- riscv64 atomics had broken asm constraints (missing earlyclobber flag)
+- arm clone() was broken when compiled as thumb if start function returned
+- mipsr6 setjmp/longjmp did not preserve fpu register state correctly
+
+
+
+1.2.0 release notes
+
+new features:
+- time_t is now 64-bit on all archs (not just 64-bit archs)
+- character type & case mapping data updated to Unicode 12.1.0
+- header-level support for new linux features in 5.3 and 5.4
+
+performance:
+- new O(1) wchar_t case mapping implementation
+- i386 now uses C math code for exp, faster than old asm
+- mips math asm
+
+compatibility & conformance:
+- endian.h now aims to conform to future POSIX definition
+- support older compilers that don't accept powerpc math asm constraints
+- fdpic code in ldso was incompatible with valid optimizations in gcc 9+
+- RLIMIT_RTTIME was missing from sys/resource.h
+
+bugs fixed:
+- wcwidth wrongly returned 0 for most of planes 4 and up
+- missing case mapping between U+03F3 and U+037F
+- wrong cacosh results for arguments with negative imaginary part
+- wrong catanf/catanl results for various classes of arguments
+- wrong return value for ungetc with argument outside [0,UCHAR_MAX]
+- posix_openpt with no ptys available produced wrong errno
+
+arch-specific bugs fixed:
+- sigcontext/regset definition mistakes & omissions on m68k, powerpc64
+- fesetenv(FE_DFL_ENV) crashed on riscv64
+- sh2 dynamic linker was broken since 1.1.21 (crash in stage 2b)
+- arm dynamic linker chose wrong tls/atomic variants since 1.1.21
+- some math library functions returned excess precision on i386
+- unconfirmed regression in fchmodat AT_SYMLINK_NOFOLLOW on mips*
+
+
+
+1.2.1 release notes
+
+major changes:
+- new malloc implementation (mallocng & overhauled bump allocator)
+
+new features:
+- DNS queries via res_* now set AD flag, report zone signedness (DNSSEC)
+- PTHREAD_NULL macro (POSIX-future)
+
+performance:
+- optimized memcpy and memset for aarch64
+- optimized memcpy for arm now supports big endian
+- optimized x86_64 remquol
+- improved strerror without linear search
+
+bugs fixed:
+- lock-skipping for processes that returned to single-threaded was wrong
+- AF_UNSPEC dns lookups mishandled single failure in paired A+AAAA
+- res_send and res_query returned wrong value on errors from nameserver
+- corrupted sysvipc timestamps on 32-bit archs with old kernels
+- incorrect parsing of timezone offsets after overly-long zone name
+- clock_adjtime was broken on 32-bit archs (time64)
+- pthread_kill as not async-signal-safe
+- pthread_cancel was not async-cancel-safe
+- large-ulp errors in various math functions in non-default rounding modes
+
+arch-specific bugs fixed:
+- arm clock_gettime was broken on some hw due to bad time64 vdso
+- m68k sqrtl lacked long double precision
+- mips* syscall mechanism regressions on older kernels
+- mips* had negated error codes for some syscalls (kernel bug)
+- mips* SIGEMT was wrongly called SIGSTKFLT
+- sh fesetround didn't work correctly on sh
+
+
+
+1.2.2 release notes
+
+major changes:
+- child restrictions lifted after fork of multithreaded parent
+
+new features:
+- _Fork function (POSIX-future)
+- reallocarray function (extension from OpenBSD, now widespread)
+- gettid function (kernel tid as supported concept)
+- SIGEV_THREAD_ID sigevent API (Linux extension)
+- tcgetwinsize and tcsetwinsize functions (POSIX-future)
+
+performance:
+- faster software sqrt on archs without native sqrt instruction
+
+compatibility:
+- realpath no longer depends on procfs availability & accuracy
+- time zone parser now always prefers 64-bit tables if present
+- crypt_blowfish now supports $2b$ prefix
+- res_query now reports errors via h_errno
+- set*id and setrlimit are now safe in vforked/cloned child
+- setgroups now applies to all threads
+- dlopen debugger notification is improved, should work with lldb
+- setrlimit no longer needs __synccall broadcast on linux 2.6.36+
+- faccessat with AT_EACCESS no longer needs child process on linux 5.8+
+
+bugs fixed:
+- buffer overflow and infinite loop errors in wcsnrtombs (CVE-2020-28928)
+- sem_close unmapped still-referenced semaphores
+- fork of process with active aio could deadlock or crash paren
+- pthread_cond_wait was broken with priority-inheritance mutex
+- getgrouplist wrongly failed when nscd reported an empty list
+- abort could leak modified SIGABRT disposition to fork or posix_spawn child
+- regression with mallocng: malloc_usable_size(0) crashed
+- readlink wrongly gave EINVAL on zero length dest buffer
+- sqrtl was severely inaccurate (not correctly rounded) on ldquad archs
+- assert failure wrongly flushed stdio (possible deadlock)
+- MUSL_LOCPATH search was broken with multiple components
+- missing newline in herror output
+- possible deadlock in pthread_exit with pshared mutex or barrier usage
+- pthread_mutexattr_getprotocol didn't read back protocol
+- v4l2 ioctl translation for pre-time64 kernels didn't work
+
+arch-specific bugs fixed:
+- x86_64 longjmp failed to handle 0 argument reliably
+- i386 __set_thread_area fallback for pre-2.6 kernels didn't work
+- missing O_LARGEFILE macro value on x86_64, x32, mips64
+- unpredictable s390x breakage from failure to preserve call-saved registers
+
+
+
+1.2.3 release notes
+
+new features:
+- qsort_r function (POSIX-future)
+- pthread_getname_np extension function
+- hard float on SPE FPU for powerpc-sf
+- SEEK_DATA and SEEK_HOLE exposed in unistd.h (Linux extensions)
+
+compatibility:
+- free now preserves errno (POSIX-future requirement)
+- setjmp is declared explicitly with returns_twice for non-GCC compilers
+- macro version of isascii is no longer defined for C++
+- dynamic linker now tolerates zero-length LOAD segments
+- epoll_[p]wait is now a cancellation point
+- pwd/grp functions no longer fail on systems without AF_UNIX support
+- POSIX TZ parsing is stricter to allow more names to fallback to files
+- NULL is now defined as nullptr when used in C++11 or later
+- gettext now accepts null pointer as argument
+
+bugs fixed:
+- old regression in wcwidth of Hangul combining (vowel/final) letters
+- duplocale used wrong malloc when malloc was replaced (1.2.2 regression)
+- fmaf rounded wrong on archs without FE_TOWARDZERO (all softfloat archs)
+- popen didn't honor requirement not to leak other popen pipe fds to child
+- aligned_alloc and variants crashed on allocation failure
+- dl_iterate_phdr reported incorrect module TLS pointers
+- mishandling of some inputs in acoshf and expm1f and functions using them
+- potentially wrong-sign zero in cproj functions at infinity
+- multiple bugs in legacy function cuserid
+- minor posix_spawn file actions API conformance issues
+- pthread_setname_np fd leak
+- out-of-bound read in zoneinfo handling with distant-past times
+- out-of-tree builds lacked generated debug cfi for x86 asm
+
+arch-specific bugs fixed:
+- powerpc (32-bit) struct shmid_ds layout was wrong for some fields
+- time64 struct layout was wrong in sound ioctl fallback (32-bit archs)
diff --git a/libc-top-half/musl/arch/aarch64/atomic_arch.h b/libc-top-half/musl/arch/aarch64/atomic_arch.h
new file mode 100644
index 0000000..40fefc2
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/atomic_arch.h
@@ -0,0 +1,82 @@
+#define a_ll a_ll
+static inline int a_ll(volatile int *p)
+{
+ int v;
+ __asm__ __volatile__ ("ldaxr %w0,%1" : "=r"(v) : "Q"(*p));
+ return v;
+}
+
+#define a_sc a_sc
+static inline int a_sc(volatile int *p, int v)
+{
+ int r;
+ __asm__ __volatile__ ("stlxr %w0,%w2,%1" : "=&r"(r), "=Q"(*p) : "r"(v) : "memory");
+ return !r;
+}
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ __asm__ __volatile__ ("dmb ish" : : : "memory");
+}
+
+#define a_cas a_cas
+static inline int a_cas(volatile int *p, int t, int s)
+{
+ int old;
+ do {
+ old = a_ll(p);
+ if (old != t) {
+ a_barrier();
+ break;
+ }
+ } while (!a_sc(p, s));
+ return old;
+}
+
+#define a_ll_p a_ll_p
+static inline void *a_ll_p(volatile void *p)
+{
+ void *v;
+ __asm__ __volatile__ ("ldaxr %0, %1" : "=r"(v) : "Q"(*(void *volatile *)p));
+ return v;
+}
+
+#define a_sc_p a_sc_p
+static inline int a_sc_p(volatile int *p, void *v)
+{
+ int r;
+ __asm__ __volatile__ ("stlxr %w0,%2,%1" : "=&r"(r), "=Q"(*(void *volatile *)p) : "r"(v) : "memory");
+ return !r;
+}
+
+#define a_cas_p a_cas_p
+static inline void *a_cas_p(volatile void *p, void *t, void *s)
+{
+ void *old;
+ do {
+ old = a_ll_p(p);
+ if (old != t) {
+ a_barrier();
+ break;
+ }
+ } while (!a_sc_p(p, s));
+ return old;
+}
+
+#define a_ctz_64 a_ctz_64
+static inline int a_ctz_64(uint64_t x)
+{
+ __asm__(
+ " rbit %0, %1\n"
+ " clz %0, %0\n"
+ : "=r"(x) : "r"(x));
+ return x;
+}
+
+#define a_clz_64 a_clz_64
+static inline int a_clz_64(uint64_t x)
+{
+ __asm__("clz %0, %1" : "=r"(x) : "r"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/arch/aarch64/bits/alltypes.h.in b/libc-top-half/musl/arch/aarch64/bits/alltypes.h.in
new file mode 100644
index 0000000..c547ca0
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/alltypes.h.in
@@ -0,0 +1,24 @@
+#define _Addr long
+#define _Int64 long
+#define _Reg long
+
+#if __AARCH64EB__
+#define __BYTE_ORDER 4321
+#else
+#define __BYTE_ORDER 1234
+#endif
+
+#define __LONG_MAX 0x7fffffffffffffffL
+
+#ifndef __cplusplus
+TYPEDEF unsigned wchar_t;
+#endif
+TYPEDEF unsigned wint_t;
+
+TYPEDEF int blksize_t;
+TYPEDEF unsigned int nlink_t;
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/aarch64/bits/fcntl.h b/libc-top-half/musl/arch/aarch64/bits/fcntl.h
new file mode 100644
index 0000000..9278797
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/fcntl.h
@@ -0,0 +1,38 @@
+#define O_CREAT 0100
+#define O_EXCL 0200
+#define O_NOCTTY 0400
+#define O_TRUNC 01000
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_DSYNC 010000
+#define O_SYNC 04010000
+#define O_RSYNC 04010000
+#define O_DIRECTORY 040000
+#define O_NOFOLLOW 0100000
+#define O_CLOEXEC 02000000
+
+#define O_ASYNC 020000
+#define O_DIRECT 0200000
+#define O_LARGEFILE 0400000
+#define O_NOATIME 01000000
+#define O_PATH 010000000
+#define O_TMPFILE 020040000
+#define O_NDELAY O_NONBLOCK
+
+#define F_DUPFD 0
+#define F_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+#define F_GETLK 5
+#define F_SETLK 6
+#define F_SETLKW 7
+#define F_SETOWN 8
+#define F_GETOWN 9
+#define F_SETSIG 10
+#define F_GETSIG 11
+
+#define F_SETOWN_EX 15
+#define F_GETOWN_EX 16
+
+#define F_GETOWNER_UIDS 17
diff --git a/libc-top-half/musl/arch/aarch64/bits/fenv.h b/libc-top-half/musl/arch/aarch64/bits/fenv.h
new file mode 100644
index 0000000..2f3279a
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/fenv.h
@@ -0,0 +1,19 @@
+#define FE_INVALID 1
+#define FE_DIVBYZERO 2
+#define FE_OVERFLOW 4
+#define FE_UNDERFLOW 8
+#define FE_INEXACT 16
+#define FE_ALL_EXCEPT 31
+#define FE_TONEAREST 0
+#define FE_DOWNWARD 0x800000
+#define FE_UPWARD 0x400000
+#define FE_TOWARDZERO 0xc00000
+
+typedef unsigned int fexcept_t;
+
+typedef struct {
+ unsigned int __fpcr;
+ unsigned int __fpsr;
+} fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *) -1)
diff --git a/libc-top-half/musl/arch/aarch64/bits/float.h b/libc-top-half/musl/arch/aarch64/bits/float.h
new file mode 100644
index 0000000..719c790
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L
+#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
+#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L
+#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L
+
+#define LDBL_MANT_DIG 113
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_MAX_EXP 16384
+
+#define LDBL_DIG 33
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MAX_10_EXP 4932
+
+#define DECIMAL_DIG 36
diff --git a/libc-top-half/musl/arch/aarch64/bits/hwcap.h b/libc-top-half/musl/arch/aarch64/bits/hwcap.h
new file mode 100644
index 0000000..424cc4d
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/hwcap.h
@@ -0,0 +1,52 @@
+#define HWCAP_FP (1 << 0)
+#define HWCAP_ASIMD (1 << 1)
+#define HWCAP_EVTSTRM (1 << 2)
+#define HWCAP_AES (1 << 3)
+#define HWCAP_PMULL (1 << 4)
+#define HWCAP_SHA1 (1 << 5)
+#define HWCAP_SHA2 (1 << 6)
+#define HWCAP_CRC32 (1 << 7)
+#define HWCAP_ATOMICS (1 << 8)
+#define HWCAP_FPHP (1 << 9)
+#define HWCAP_ASIMDHP (1 << 10)
+#define HWCAP_CPUID (1 << 11)
+#define HWCAP_ASIMDRDM (1 << 12)
+#define HWCAP_JSCVT (1 << 13)
+#define HWCAP_FCMA (1 << 14)
+#define HWCAP_LRCPC (1 << 15)
+#define HWCAP_DCPOP (1 << 16)
+#define HWCAP_SHA3 (1 << 17)
+#define HWCAP_SM3 (1 << 18)
+#define HWCAP_SM4 (1 << 19)
+#define HWCAP_ASIMDDP (1 << 20)
+#define HWCAP_SHA512 (1 << 21)
+#define HWCAP_SVE (1 << 22)
+#define HWCAP_ASIMDFHM (1 << 23)
+#define HWCAP_DIT (1 << 24)
+#define HWCAP_USCAT (1 << 25)
+#define HWCAP_ILRCPC (1 << 26)
+#define HWCAP_FLAGM (1 << 27)
+#define HWCAP_SSBS (1 << 28)
+#define HWCAP_SB (1 << 29)
+#define HWCAP_PACA (1 << 30)
+#define HWCAP_PACG (1UL << 31)
+
+#define HWCAP2_DCPODP (1 << 0)
+#define HWCAP2_SVE2 (1 << 1)
+#define HWCAP2_SVEAES (1 << 2)
+#define HWCAP2_SVEPMULL (1 << 3)
+#define HWCAP2_SVEBITPERM (1 << 4)
+#define HWCAP2_SVESHA3 (1 << 5)
+#define HWCAP2_SVESM4 (1 << 6)
+#define HWCAP2_FLAGM2 (1 << 7)
+#define HWCAP2_FRINT (1 << 8)
+#define HWCAP2_SVEI8MM (1 << 9)
+#define HWCAP2_SVEF32MM (1 << 10)
+#define HWCAP2_SVEF64MM (1 << 11)
+#define HWCAP2_SVEBF16 (1 << 12)
+#define HWCAP2_I8MM (1 << 13)
+#define HWCAP2_BF16 (1 << 14)
+#define HWCAP2_DGH (1 << 15)
+#define HWCAP2_RNG (1 << 16)
+#define HWCAP2_BTI (1 << 17)
+#define HWCAP2_MTE (1 << 18)
diff --git a/libc-top-half/musl/arch/aarch64/bits/mman.h b/libc-top-half/musl/arch/aarch64/bits/mman.h
new file mode 100644
index 0000000..8fad5ce
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/mman.h
@@ -0,0 +1,2 @@
+#define PROT_BTI 0x10
+#define PROT_MTE 0x20
diff --git a/libc-top-half/musl/arch/aarch64/bits/posix.h b/libc-top-half/musl/arch/aarch64/bits/posix.h
new file mode 100644
index 0000000..c37b94c
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_LP64_OFF64 1
+#define _POSIX_V7_LP64_OFF64 1
diff --git a/libc-top-half/musl/arch/aarch64/bits/reg.h b/libc-top-half/musl/arch/aarch64/bits/reg.h
new file mode 100644
index 0000000..2633f39
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/reg.h
@@ -0,0 +1,2 @@
+#undef __WORDSIZE
+#define __WORDSIZE 64
diff --git a/libc-top-half/musl/arch/aarch64/bits/setjmp.h b/libc-top-half/musl/arch/aarch64/bits/setjmp.h
new file mode 100644
index 0000000..54bc261
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long __jmp_buf[22];
diff --git a/libc-top-half/musl/arch/aarch64/bits/signal.h b/libc-top-half/musl/arch/aarch64/bits/signal.h
new file mode 100644
index 0000000..5098c73
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/signal.h
@@ -0,0 +1,153 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 6144
+#define SIGSTKSZ 12288
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef unsigned long greg_t;
+typedef unsigned long gregset_t[34];
+
+typedef struct {
+ __uint128_t vregs[32];
+ unsigned int fpsr;
+ unsigned int fpcr;
+} fpregset_t;
+typedef struct sigcontext {
+ unsigned long fault_address;
+ unsigned long regs[31];
+ unsigned long sp, pc, pstate;
+ long double __reserved[256];
+} mcontext_t;
+
+#define FPSIMD_MAGIC 0x46508001
+#define ESR_MAGIC 0x45535201
+#define EXTRA_MAGIC 0x45585401
+#define SVE_MAGIC 0x53564501
+struct _aarch64_ctx {
+ unsigned int magic;
+ unsigned int size;
+};
+struct fpsimd_context {
+ struct _aarch64_ctx head;
+ unsigned int fpsr;
+ unsigned int fpcr;
+ __uint128_t vregs[32];
+};
+struct esr_context {
+ struct _aarch64_ctx head;
+ unsigned long esr;
+};
+struct extra_context {
+ struct _aarch64_ctx head;
+ unsigned long datap;
+ unsigned int size;
+ unsigned int __reserved[3];
+};
+struct sve_context {
+ struct _aarch64_ctx head;
+ unsigned short vl;
+ unsigned short __reserved[3];
+};
+#define SVE_VQ_BYTES 16
+#define SVE_VQ_MIN 1
+#define SVE_VQ_MAX 512
+#define SVE_VL_MIN (SVE_VQ_MIN * SVE_VQ_BYTES)
+#define SVE_VL_MAX (SVE_VQ_MAX * SVE_VQ_BYTES)
+#define SVE_NUM_ZREGS 32
+#define SVE_NUM_PREGS 16
+#define sve_vl_valid(vl) \
+ ((vl) % SVE_VQ_BYTES == 0 && (vl) >= SVE_VL_MIN && (vl) <= SVE_VL_MAX)
+#define sve_vq_from_vl(vl) ((vl) / SVE_VQ_BYTES)
+#define sve_vl_from_vq(vq) ((vq) * SVE_VQ_BYTES)
+#define SVE_SIG_ZREG_SIZE(vq) ((unsigned)(vq) * SVE_VQ_BYTES)
+#define SVE_SIG_PREG_SIZE(vq) ((unsigned)(vq) * (SVE_VQ_BYTES / 8))
+#define SVE_SIG_FFR_SIZE(vq) SVE_SIG_PREG_SIZE(vq)
+#define SVE_SIG_REGS_OFFSET \
+ ((sizeof(struct sve_context) + (SVE_VQ_BYTES - 1)) \
+ / SVE_VQ_BYTES * SVE_VQ_BYTES)
+#define SVE_SIG_ZREGS_OFFSET SVE_SIG_REGS_OFFSET
+#define SVE_SIG_ZREG_OFFSET(vq, n) \
+ (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREG_SIZE(vq) * (n))
+#define SVE_SIG_ZREGS_SIZE(vq) \
+ (SVE_SIG_ZREG_OFFSET(vq, SVE_NUM_ZREGS) - SVE_SIG_ZREGS_OFFSET)
+#define SVE_SIG_PREGS_OFFSET(vq) \
+ (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREGS_SIZE(vq))
+#define SVE_SIG_PREG_OFFSET(vq, n) \
+ (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREG_SIZE(vq) * (n))
+#define SVE_SIG_PREGS_SIZE(vq) \
+ (SVE_SIG_PREG_OFFSET(vq, SVE_NUM_PREGS) - SVE_SIG_PREGS_OFFSET(vq))
+#define SVE_SIG_FFR_OFFSET(vq) \
+ (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREGS_SIZE(vq))
+#define SVE_SIG_REGS_SIZE(vq) \
+ (SVE_SIG_FFR_OFFSET(vq) + SVE_SIG_FFR_SIZE(vq) - SVE_SIG_REGS_OFFSET)
+#define SVE_SIG_CONTEXT_SIZE(vq) (SVE_SIG_REGS_OFFSET + SVE_SIG_REGS_SIZE(vq))
+#else
+typedef struct {
+ long double __regs[18+256];
+} 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;
+ stack_t uc_stack;
+ sigset_t uc_sigmask;
+ mcontext_t uc_mcontext;
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 2
+#define SA_SIGINFO 4
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL 29
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
diff --git a/libc-top-half/musl/arch/aarch64/bits/stat.h b/libc-top-half/musl/arch/aarch64/bits/stat.h
new file mode 100644
index 0000000..b7f4221
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/stat.h
@@ -0,0 +1,18 @@
+struct stat {
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ unsigned long __pad;
+ off_t st_size;
+ blksize_t st_blksize;
+ int __pad2;
+ blkcnt_t st_blocks;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+ unsigned __unused[2];
+};
diff --git a/libc-top-half/musl/arch/aarch64/bits/stdint.h b/libc-top-half/musl/arch/aarch64/bits/stdint.h
new file mode 100644
index 0000000..1bb147f
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#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
diff --git a/libc-top-half/musl/arch/aarch64/bits/syscall.h.in b/libc-top-half/musl/arch/aarch64/bits/syscall.h.in
new file mode 100644
index 0000000..5f420e6
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/syscall.h.in
@@ -0,0 +1,302 @@
+#define __NR_io_setup 0
+#define __NR_io_destroy 1
+#define __NR_io_submit 2
+#define __NR_io_cancel 3
+#define __NR_io_getevents 4
+#define __NR_setxattr 5
+#define __NR_lsetxattr 6
+#define __NR_fsetxattr 7
+#define __NR_getxattr 8
+#define __NR_lgetxattr 9
+#define __NR_fgetxattr 10
+#define __NR_listxattr 11
+#define __NR_llistxattr 12
+#define __NR_flistxattr 13
+#define __NR_removexattr 14
+#define __NR_lremovexattr 15
+#define __NR_fremovexattr 16
+#define __NR_getcwd 17
+#define __NR_lookup_dcookie 18
+#define __NR_eventfd2 19
+#define __NR_epoll_create1 20
+#define __NR_epoll_ctl 21
+#define __NR_epoll_pwait 22
+#define __NR_dup 23
+#define __NR_dup3 24
+#define __NR_fcntl 25
+#define __NR_inotify_init1 26
+#define __NR_inotify_add_watch 27
+#define __NR_inotify_rm_watch 28
+#define __NR_ioctl 29
+#define __NR_ioprio_set 30
+#define __NR_ioprio_get 31
+#define __NR_flock 32
+#define __NR_mknodat 33
+#define __NR_mkdirat 34
+#define __NR_unlinkat 35
+#define __NR_symlinkat 36
+#define __NR_linkat 37
+#define __NR_renameat 38
+#define __NR_umount2 39
+#define __NR_mount 40
+#define __NR_pivot_root 41
+#define __NR_nfsservctl 42
+#define __NR_statfs 43
+#define __NR_fstatfs 44
+#define __NR_truncate 45
+#define __NR_ftruncate 46
+#define __NR_fallocate 47
+#define __NR_faccessat 48
+#define __NR_chdir 49
+#define __NR_fchdir 50
+#define __NR_chroot 51
+#define __NR_fchmod 52
+#define __NR_fchmodat 53
+#define __NR_fchownat 54
+#define __NR_fchown 55
+#define __NR_openat 56
+#define __NR_close 57
+#define __NR_vhangup 58
+#define __NR_pipe2 59
+#define __NR_quotactl 60
+#define __NR_getdents64 61
+#define __NR_lseek 62
+#define __NR_read 63
+#define __NR_write 64
+#define __NR_readv 65
+#define __NR_writev 66
+#define __NR_pread64 67
+#define __NR_pwrite64 68
+#define __NR_preadv 69
+#define __NR_pwritev 70
+#define __NR_sendfile 71
+#define __NR_pselect6 72
+#define __NR_ppoll 73
+#define __NR_signalfd4 74
+#define __NR_vmsplice 75
+#define __NR_splice 76
+#define __NR_tee 77
+#define __NR_readlinkat 78
+#define __NR_newfstatat 79
+#define __NR_fstat 80
+#define __NR_sync 81
+#define __NR_fsync 82
+#define __NR_fdatasync 83
+#define __NR_sync_file_range 84
+#define __NR_timerfd_create 85
+#define __NR_timerfd_settime 86
+#define __NR_timerfd_gettime 87
+#define __NR_utimensat 88
+#define __NR_acct 89
+#define __NR_capget 90
+#define __NR_capset 91
+#define __NR_personality 92
+#define __NR_exit 93
+#define __NR_exit_group 94
+#define __NR_waitid 95
+#define __NR_set_tid_address 96
+#define __NR_unshare 97
+#define __NR_futex 98
+#define __NR_set_robust_list 99
+#define __NR_get_robust_list 100
+#define __NR_nanosleep 101
+#define __NR_getitimer 102
+#define __NR_setitimer 103
+#define __NR_kexec_load 104
+#define __NR_init_module 105
+#define __NR_delete_module 106
+#define __NR_timer_create 107
+#define __NR_timer_gettime 108
+#define __NR_timer_getoverrun 109
+#define __NR_timer_settime 110
+#define __NR_timer_delete 111
+#define __NR_clock_settime 112
+#define __NR_clock_gettime 113
+#define __NR_clock_getres 114
+#define __NR_clock_nanosleep 115
+#define __NR_syslog 116
+#define __NR_ptrace 117
+#define __NR_sched_setparam 118
+#define __NR_sched_setscheduler 119
+#define __NR_sched_getscheduler 120
+#define __NR_sched_getparam 121
+#define __NR_sched_setaffinity 122
+#define __NR_sched_getaffinity 123
+#define __NR_sched_yield 124
+#define __NR_sched_get_priority_max 125
+#define __NR_sched_get_priority_min 126
+#define __NR_sched_rr_get_interval 127
+#define __NR_restart_syscall 128
+#define __NR_kill 129
+#define __NR_tkill 130
+#define __NR_tgkill 131
+#define __NR_sigaltstack 132
+#define __NR_rt_sigsuspend 133
+#define __NR_rt_sigaction 134
+#define __NR_rt_sigprocmask 135
+#define __NR_rt_sigpending 136
+#define __NR_rt_sigtimedwait 137
+#define __NR_rt_sigqueueinfo 138
+#define __NR_rt_sigreturn 139
+#define __NR_setpriority 140
+#define __NR_getpriority 141
+#define __NR_reboot 142
+#define __NR_setregid 143
+#define __NR_setgid 144
+#define __NR_setreuid 145
+#define __NR_setuid 146
+#define __NR_setresuid 147
+#define __NR_getresuid 148
+#define __NR_setresgid 149
+#define __NR_getresgid 150
+#define __NR_setfsuid 151
+#define __NR_setfsgid 152
+#define __NR_times 153
+#define __NR_setpgid 154
+#define __NR_getpgid 155
+#define __NR_getsid 156
+#define __NR_setsid 157
+#define __NR_getgroups 158
+#define __NR_setgroups 159
+#define __NR_uname 160
+#define __NR_sethostname 161
+#define __NR_setdomainname 162
+#define __NR_getrlimit 163
+#define __NR_setrlimit 164
+#define __NR_getrusage 165
+#define __NR_umask 166
+#define __NR_prctl 167
+#define __NR_getcpu 168
+#define __NR_gettimeofday 169
+#define __NR_settimeofday 170
+#define __NR_adjtimex 171
+#define __NR_getpid 172
+#define __NR_getppid 173
+#define __NR_getuid 174
+#define __NR_geteuid 175
+#define __NR_getgid 176
+#define __NR_getegid 177
+#define __NR_gettid 178
+#define __NR_sysinfo 179
+#define __NR_mq_open 180
+#define __NR_mq_unlink 181
+#define __NR_mq_timedsend 182
+#define __NR_mq_timedreceive 183
+#define __NR_mq_notify 184
+#define __NR_mq_getsetattr 185
+#define __NR_msgget 186
+#define __NR_msgctl 187
+#define __NR_msgrcv 188
+#define __NR_msgsnd 189
+#define __NR_semget 190
+#define __NR_semctl 191
+#define __NR_semtimedop 192
+#define __NR_semop 193
+#define __NR_shmget 194
+#define __NR_shmctl 195
+#define __NR_shmat 196
+#define __NR_shmdt 197
+#define __NR_socket 198
+#define __NR_socketpair 199
+#define __NR_bind 200
+#define __NR_listen 201
+#define __NR_accept 202
+#define __NR_connect 203
+#define __NR_getsockname 204
+#define __NR_getpeername 205
+#define __NR_sendto 206
+#define __NR_recvfrom 207
+#define __NR_setsockopt 208
+#define __NR_getsockopt 209
+#define __NR_shutdown 210
+#define __NR_sendmsg 211
+#define __NR_recvmsg 212
+#define __NR_readahead 213
+#define __NR_brk 214
+#define __NR_munmap 215
+#define __NR_mremap 216
+#define __NR_add_key 217
+#define __NR_request_key 218
+#define __NR_keyctl 219
+#define __NR_clone 220
+#define __NR_execve 221
+#define __NR_mmap 222
+#define __NR_fadvise64 223
+#define __NR_swapon 224
+#define __NR_swapoff 225
+#define __NR_mprotect 226
+#define __NR_msync 227
+#define __NR_mlock 228
+#define __NR_munlock 229
+#define __NR_mlockall 230
+#define __NR_munlockall 231
+#define __NR_mincore 232
+#define __NR_madvise 233
+#define __NR_remap_file_pages 234
+#define __NR_mbind 235
+#define __NR_get_mempolicy 236
+#define __NR_set_mempolicy 237
+#define __NR_migrate_pages 238
+#define __NR_move_pages 239
+#define __NR_rt_tgsigqueueinfo 240
+#define __NR_perf_event_open 241
+#define __NR_accept4 242
+#define __NR_recvmmsg 243
+#define __NR_wait4 260
+#define __NR_prlimit64 261
+#define __NR_fanotify_init 262
+#define __NR_fanotify_mark 263
+#define __NR_name_to_handle_at 264
+#define __NR_open_by_handle_at 265
+#define __NR_clock_adjtime 266
+#define __NR_syncfs 267
+#define __NR_setns 268
+#define __NR_sendmmsg 269
+#define __NR_process_vm_readv 270
+#define __NR_process_vm_writev 271
+#define __NR_kcmp 272
+#define __NR_finit_module 273
+#define __NR_sched_setattr 274
+#define __NR_sched_getattr 275
+#define __NR_renameat2 276
+#define __NR_seccomp 277
+#define __NR_getrandom 278
+#define __NR_memfd_create 279
+#define __NR_bpf 280
+#define __NR_execveat 281
+#define __NR_userfaultfd 282
+#define __NR_membarrier 283
+#define __NR_mlock2 284
+#define __NR_copy_file_range 285
+#define __NR_preadv2 286
+#define __NR_pwritev2 287
+#define __NR_pkey_mprotect 288
+#define __NR_pkey_alloc 289
+#define __NR_pkey_free 290
+#define __NR_statx 291
+#define __NR_io_pgetevents 292
+#define __NR_rseq 293
+#define __NR_kexec_file_load 294
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_clone3 435
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_epoll_pwait2 441
+#define __NR_mount_setattr 442
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_restrict_self 446
+
diff --git a/libc-top-half/musl/arch/aarch64/bits/user.h b/libc-top-half/musl/arch/aarch64/bits/user.h
new file mode 100644
index 0000000..8a1002a
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/bits/user.h
@@ -0,0 +1,16 @@
+struct user_regs_struct {
+ unsigned long long regs[31];
+ unsigned long long sp;
+ unsigned long long pc;
+ unsigned long long pstate;
+};
+
+struct user_fpsimd_struct {
+ __uint128_t vregs[32];
+ unsigned int fpsr;
+ unsigned int fpcr;
+};
+
+#define ELF_NREG 34
+typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NREG];
+typedef struct user_fpsimd_struct elf_fpregset_t;
diff --git a/libc-top-half/musl/arch/aarch64/crt_arch.h b/libc-top-half/musl/arch/aarch64/crt_arch.h
new file mode 100644
index 0000000..b64fb3d
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/crt_arch.h
@@ -0,0 +1,15 @@
+__asm__(
+".text \n"
+".global " START "\n"
+".type " START ",%function\n"
+START ":\n"
+" mov x29, #0\n"
+" mov x30, #0\n"
+" mov x0, sp\n"
+".weak _DYNAMIC\n"
+".hidden _DYNAMIC\n"
+" adrp x1, _DYNAMIC\n"
+" add x1, x1, #:lo12:_DYNAMIC\n"
+" and sp, x0, #-16\n"
+" b " START "_c\n"
+);
diff --git a/libc-top-half/musl/arch/aarch64/fp_arch.h b/libc-top-half/musl/arch/aarch64/fp_arch.h
new file mode 100644
index 0000000..f3d445b
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/fp_arch.h
@@ -0,0 +1,25 @@
+#define fp_barrierf fp_barrierf
+static inline float fp_barrierf(float x)
+{
+ __asm__ __volatile__ ("" : "+w"(x));
+ return x;
+}
+
+#define fp_barrier fp_barrier
+static inline double fp_barrier(double x)
+{
+ __asm__ __volatile__ ("" : "+w"(x));
+ return x;
+}
+
+#define fp_force_evalf fp_force_evalf
+static inline void fp_force_evalf(float x)
+{
+ __asm__ __volatile__ ("" : "+w"(x));
+}
+
+#define fp_force_eval fp_force_eval
+static inline void fp_force_eval(double x)
+{
+ __asm__ __volatile__ ("" : "+w"(x));
+}
diff --git a/libc-top-half/musl/arch/aarch64/kstat.h b/libc-top-half/musl/arch/aarch64/kstat.h
new file mode 100644
index 0000000..92625f3
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/kstat.h
@@ -0,0 +1,21 @@
+struct kstat {
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ unsigned long __pad;
+ off_t st_size;
+ blksize_t st_blksize;
+ int __pad2;
+ blkcnt_t st_blocks;
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ unsigned __unused[2];
+};
diff --git a/libc-top-half/musl/arch/aarch64/pthread_arch.h b/libc-top-half/musl/arch/aarch64/pthread_arch.h
new file mode 100644
index 0000000..3909616
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/pthread_arch.h
@@ -0,0 +1,11 @@
+static inline uintptr_t __get_tp()
+{
+ uintptr_t tp;
+ __asm__ ("mrs %0,tpidr_el0" : "=r"(tp));
+ return tp;
+}
+
+#define TLS_ABOVE_TP
+#define GAP_ABOVE_TP 16
+
+#define MC_PC pc
diff --git a/libc-top-half/musl/arch/aarch64/reloc.h b/libc-top-half/musl/arch/aarch64/reloc.h
new file mode 100644
index 0000000..b1b68c7
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/reloc.h
@@ -0,0 +1,24 @@
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define ENDIAN_SUFFIX "_be"
+#else
+#define ENDIAN_SUFFIX ""
+#endif
+
+#define LDSO_ARCH "aarch64" ENDIAN_SUFFIX
+
+#define NO_LEGACY_INITFINI
+
+#define TPOFF_K 0
+
+#define REL_SYMBOLIC R_AARCH64_ABS64
+#define REL_GOT R_AARCH64_GLOB_DAT
+#define REL_PLT R_AARCH64_JUMP_SLOT
+#define REL_RELATIVE R_AARCH64_RELATIVE
+#define REL_COPY R_AARCH64_COPY
+#define REL_DTPMOD R_AARCH64_TLS_DTPMOD64
+#define REL_DTPOFF R_AARCH64_TLS_DTPREL64
+#define REL_TPOFF R_AARCH64_TLS_TPREL64
+#define REL_TLSDESC R_AARCH64_TLSDESC
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "mov sp,%1 ; br %0" : : "r"(pc), "r"(sp) : "memory" )
diff --git a/libc-top-half/musl/arch/aarch64/syscall_arch.h b/libc-top-half/musl/arch/aarch64/syscall_arch.h
new file mode 100644
index 0000000..504983a
--- /dev/null
+++ b/libc-top-half/musl/arch/aarch64/syscall_arch.h
@@ -0,0 +1,78 @@
+#define __SYSCALL_LL_E(x) (x)
+#define __SYSCALL_LL_O(x) (x)
+
+#define __asm_syscall(...) do { \
+ __asm__ __volatile__ ( "svc 0" \
+ : "=r"(x0) : __VA_ARGS__ : "memory", "cc"); \
+ return x0; \
+ } while (0)
+
+static inline long __syscall0(long n)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0");
+ __asm_syscall("r"(x8));
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0") = a;
+ __asm_syscall("r"(x8), "0"(x0));
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0") = a;
+ register long x1 __asm__("x1") = b;
+ __asm_syscall("r"(x8), "0"(x0), "r"(x1));
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0") = a;
+ register long x1 __asm__("x1") = b;
+ register long x2 __asm__("x2") = c;
+ __asm_syscall("r"(x8), "0"(x0), "r"(x1), "r"(x2));
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0") = a;
+ register long x1 __asm__("x1") = b;
+ register long x2 __asm__("x2") = c;
+ register long x3 __asm__("x3") = d;
+ __asm_syscall("r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3));
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0") = a;
+ register long x1 __asm__("x1") = b;
+ register long x2 __asm__("x2") = c;
+ register long x3 __asm__("x3") = d;
+ register long x4 __asm__("x4") = e;
+ __asm_syscall("r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4));
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0") = a;
+ register long x1 __asm__("x1") = b;
+ register long x2 __asm__("x2") = c;
+ register long x3 __asm__("x3") = d;
+ register long x4 __asm__("x4") = e;
+ register long x5 __asm__("x5") = f;
+ __asm_syscall("r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4), "r"(x5));
+}
+
+#define VDSO_USEFUL
+#define VDSO_CGT_SYM "__kernel_clock_gettime"
+#define VDSO_CGT_VER "LINUX_2.6.39"
+
+#define IPC_64 0
diff --git a/libc-top-half/musl/arch/arm/arch.mak b/libc-top-half/musl/arch/arm/arch.mak
new file mode 100644
index 0000000..aa4d05c
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/arch.mak
@@ -0,0 +1 @@
+COMPAT_SRC_DIRS = compat/time32
diff --git a/libc-top-half/musl/arch/arm/atomic_arch.h b/libc-top-half/musl/arch/arm/atomic_arch.h
new file mode 100644
index 0000000..9e3937c
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/atomic_arch.h
@@ -0,0 +1,107 @@
+#include "libc.h"
+
+#if __ARM_ARCH_4__ || __ARM_ARCH_4T__ || __ARM_ARCH == 4
+#define BLX "mov lr,pc\n\tbx"
+#else
+#define BLX "blx"
+#endif
+
+extern hidden uintptr_t __a_cas_ptr, __a_barrier_ptr;
+
+#if ((__ARM_ARCH_6__ || __ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
+ || __ARM_ARCH_6T2__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
+
+#define a_ll a_ll
+static inline int a_ll(volatile int *p)
+{
+ int v;
+ __asm__ __volatile__ ("ldrex %0, %1" : "=r"(v) : "Q"(*p));
+ return v;
+}
+
+#define a_sc a_sc
+static inline int a_sc(volatile int *p, int v)
+{
+ int r;
+ __asm__ __volatile__ ("strex %0,%2,%1" : "=&r"(r), "=Q"(*p) : "r"(v) : "memory");
+ return !r;
+}
+
+#if __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ __asm__ __volatile__ ("dmb ish" : : : "memory");
+}
+
+#endif
+
+#define a_pre_llsc a_barrier
+#define a_post_llsc a_barrier
+
+#else
+
+#define a_cas a_cas
+static inline int a_cas(volatile int *p, int t, int s)
+{
+ for (;;) {
+ register int r0 __asm__("r0") = t;
+ register int r1 __asm__("r1") = s;
+ register volatile int *r2 __asm__("r2") = p;
+ register uintptr_t r3 __asm__("r3") = __a_cas_ptr;
+ int old;
+ __asm__ __volatile__ (
+ BLX " r3"
+ : "+r"(r0), "+r"(r3) : "r"(r1), "r"(r2)
+ : "memory", "lr", "ip", "cc" );
+ if (!r0) return t;
+ if ((old=*p)!=t) return old;
+ }
+}
+
+#endif
+
+#ifndef a_barrier
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ register uintptr_t ip __asm__("ip") = __a_barrier_ptr;
+ __asm__ __volatile__( BLX " ip" : "+r"(ip) : : "memory", "cc", "lr" );
+}
+#endif
+
+#define a_crash a_crash
+static inline void a_crash()
+{
+ __asm__ __volatile__(
+#ifndef __thumb__
+ ".word 0xe7f000f0"
+#else
+ ".short 0xdeff"
+#endif
+ : : : "memory");
+}
+
+#if __ARM_ARCH >= 5 && (!__thumb__ || __thumb2__)
+
+#define a_clz_32 a_clz_32
+static inline int a_clz_32(uint32_t x)
+{
+ __asm__ ("clz %0, %1" : "=r"(x) : "r"(x));
+ return x;
+}
+
+#if __ARM_ARCH_6T2__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
+
+#define a_ctz_32 a_ctz_32
+static inline int a_ctz_32(uint32_t x)
+{
+ uint32_t xr;
+ __asm__ ("rbit %0, %1" : "=r"(xr) : "r"(x));
+ return a_clz_32(xr);
+}
+
+#endif
+
+#endif
diff --git a/libc-top-half/musl/arch/arm/bits/alltypes.h.in b/libc-top-half/musl/arch/arm/bits/alltypes.h.in
new file mode 100644
index 0000000..d62bd7b
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/alltypes.h.in
@@ -0,0 +1,21 @@
+#define _REDIR_TIME64 1
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+#if __ARMEB__
+#define __BYTE_ORDER 4321
+#else
+#define __BYTE_ORDER 1234
+#endif
+
+#define __LONG_MAX 0x7fffffffL
+
+#ifndef __cplusplus
+TYPEDEF unsigned wchar_t;
+#endif
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/arm/bits/fcntl.h b/libc-top-half/musl/arch/arm/bits/fcntl.h
new file mode 100644
index 0000000..4cb1753
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/fcntl.h
@@ -0,0 +1,40 @@
+#define O_CREAT 0100
+#define O_EXCL 0200
+#define O_NOCTTY 0400
+#define O_TRUNC 01000
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_DSYNC 010000
+#define O_SYNC 04010000
+#define O_RSYNC 04010000
+#define O_DIRECTORY 040000
+#define O_NOFOLLOW 0100000
+#define O_CLOEXEC 02000000
+
+#define O_ASYNC 020000
+#define O_DIRECT 0200000
+#define O_LARGEFILE 0400000
+#define O_NOATIME 01000000
+#define O_PATH 010000000
+#define O_TMPFILE 020040000
+#define O_NDELAY O_NONBLOCK
+
+#define F_DUPFD 0
+#define F_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+
+#define F_SETOWN 8
+#define F_GETOWN 9
+#define F_SETSIG 10
+#define F_GETSIG 11
+
+#define F_GETLK 12
+#define F_SETLK 13
+#define F_SETLKW 14
+
+#define F_SETOWN_EX 15
+#define F_GETOWN_EX 16
+
+#define F_GETOWNER_UIDS 17
diff --git a/libc-top-half/musl/arch/arm/bits/fenv.h b/libc-top-half/musl/arch/arm/bits/fenv.h
new file mode 100644
index 0000000..d85fc86
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/fenv.h
@@ -0,0 +1,23 @@
+#ifndef __ARM_PCS_VFP
+#define FE_ALL_EXCEPT 0
+#define FE_TONEAREST 0
+#else
+#define FE_INVALID 1
+#define FE_DIVBYZERO 2
+#define FE_OVERFLOW 4
+#define FE_UNDERFLOW 8
+#define FE_INEXACT 16
+#define FE_ALL_EXCEPT 31
+#define FE_TONEAREST 0
+#define FE_DOWNWARD 0x800000
+#define FE_UPWARD 0x400000
+#define FE_TOWARDZERO 0xc00000
+#endif
+
+typedef unsigned long fexcept_t;
+
+typedef struct {
+ unsigned long __cw;
+} fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *) -1)
diff --git a/libc-top-half/musl/arch/arm/bits/float.h b/libc-top-half/musl/arch/arm/bits/float.h
new file mode 100644
index 0000000..c4a655e
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 4.94065645841246544177e-324L
+#define LDBL_MIN 2.22507385850720138309e-308L
+#define LDBL_MAX 1.79769313486231570815e+308L
+#define LDBL_EPSILON 2.22044604925031308085e-16L
+
+#define LDBL_MANT_DIG 53
+#define LDBL_MIN_EXP (-1021)
+#define LDBL_MAX_EXP 1024
+
+#define LDBL_DIG 15
+#define LDBL_MIN_10_EXP (-307)
+#define LDBL_MAX_10_EXP 308
+
+#define DECIMAL_DIG 17
diff --git a/libc-top-half/musl/arch/arm/bits/hwcap.h b/libc-top-half/musl/arch/arm/bits/hwcap.h
new file mode 100644
index 0000000..a3d8731
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/hwcap.h
@@ -0,0 +1,53 @@
+#define HWCAP_SWP (1 << 0)
+#define HWCAP_HALF (1 << 1)
+#define HWCAP_THUMB (1 << 2)
+#define HWCAP_26BIT (1 << 3)
+#define HWCAP_FAST_MULT (1 << 4)
+#define HWCAP_FPA (1 << 5)
+#define HWCAP_VFP (1 << 6)
+#define HWCAP_EDSP (1 << 7)
+#define HWCAP_JAVA (1 << 8)
+#define HWCAP_IWMMXT (1 << 9)
+#define HWCAP_CRUNCH (1 << 10)
+#define HWCAP_THUMBEE (1 << 11)
+#define HWCAP_NEON (1 << 12)
+#define HWCAP_VFPv3 (1 << 13)
+#define HWCAP_VFPv3D16 (1 << 14)
+#define HWCAP_TLS (1 << 15)
+#define HWCAP_VFPv4 (1 << 16)
+#define HWCAP_IDIVA (1 << 17)
+#define HWCAP_IDIVT (1 << 18)
+#define HWCAP_VFPD32 (1 << 19)
+#define HWCAP_IDIV (HWCAP_IDIVA | HWCAP_IDIVT)
+#define HWCAP_LPAE (1 << 20)
+#define HWCAP_EVTSTRM (1 << 21)
+
+#define HWCAP2_AES (1 << 0)
+#define HWCAP2_PMULL (1 << 1)
+#define HWCAP2_SHA1 (1 << 2)
+#define HWCAP2_SHA2 (1 << 3)
+#define HWCAP2_CRC32 (1 << 4)
+
+#define HWCAP_ARM_SWP (1 << 0)
+#define HWCAP_ARM_HALF (1 << 1)
+#define HWCAP_ARM_THUMB (1 << 2)
+#define HWCAP_ARM_26BIT (1 << 3)
+#define HWCAP_ARM_FAST_MULT (1 << 4)
+#define HWCAP_ARM_FPA (1 << 5)
+#define HWCAP_ARM_VFP (1 << 6)
+#define HWCAP_ARM_EDSP (1 << 7)
+#define HWCAP_ARM_JAVA (1 << 8)
+#define HWCAP_ARM_IWMMXT (1 << 9)
+#define HWCAP_ARM_CRUNCH (1 << 10)
+#define HWCAP_ARM_THUMBEE (1 << 11)
+#define HWCAP_ARM_NEON (1 << 12)
+#define HWCAP_ARM_VFPv3 (1 << 13)
+#define HWCAP_ARM_VFPv3D16 (1 << 14)
+#define HWCAP_ARM_TLS (1 << 15)
+#define HWCAP_ARM_VFPv4 (1 << 16)
+#define HWCAP_ARM_IDIVA (1 << 17)
+#define HWCAP_ARM_IDIVT (1 << 18)
+#define HWCAP_ARM_VFPD32 (1 << 19)
+#define HWCAP_ARM_IDIV (HWCAP_ARM_IDIVA | HWCAP_ARM_IDIVT)
+#define HWCAP_ARM_LPAE (1 << 20)
+#define HWCAP_ARM_EVTSTRM (1 << 21)
diff --git a/libc-top-half/musl/arch/arm/bits/ioctl_fix.h b/libc-top-half/musl/arch/arm/bits/ioctl_fix.h
new file mode 100644
index 0000000..ebb383d
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/ioctl_fix.h
@@ -0,0 +1,2 @@
+#undef FIOQSIZE
+#define FIOQSIZE 0x545e
diff --git a/libc-top-half/musl/arch/arm/bits/ipcstat.h b/libc-top-half/musl/arch/arm/bits/ipcstat.h
new file mode 100644
index 0000000..4f4fcb0
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/ipcstat.h
@@ -0,0 +1 @@
+#define IPC_STAT 0x102
diff --git a/libc-top-half/musl/arch/arm/bits/msg.h b/libc-top-half/musl/arch/arm/bits/msg.h
new file mode 100644
index 0000000..7bbbb2b
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/msg.h
@@ -0,0 +1,18 @@
+struct msqid_ds {
+ struct ipc_perm msg_perm;
+ unsigned long __msg_stime_lo;
+ unsigned long __msg_stime_hi;
+ unsigned long __msg_rtime_lo;
+ unsigned long __msg_rtime_hi;
+ unsigned long __msg_ctime_lo;
+ unsigned long __msg_ctime_hi;
+ unsigned long msg_cbytes;
+ msgqnum_t msg_qnum;
+ msglen_t msg_qbytes;
+ pid_t msg_lspid;
+ pid_t msg_lrpid;
+ unsigned long __unused[2];
+ time_t msg_stime;
+ time_t msg_rtime;
+ time_t msg_ctime;
+};
diff --git a/libc-top-half/musl/arch/arm/bits/posix.h b/libc-top-half/musl/arch/arm/bits/posix.h
new file mode 100644
index 0000000..30a3871
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_ILP32_OFFBIG 1
+#define _POSIX_V7_ILP32_OFFBIG 1
diff --git a/libc-top-half/musl/arch/arm/bits/ptrace.h b/libc-top-half/musl/arch/arm/bits/ptrace.h
new file mode 100644
index 0000000..9556ef4
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/ptrace.h
@@ -0,0 +1,25 @@
+#define PTRACE_GETWMMXREGS 18
+#define PTRACE_SETWMMXREGS 19
+#define PTRACE_GET_THREAD_AREA 22
+#define PTRACE_SET_SYSCALL 23
+#define PTRACE_GETCRUNCHREGS 25
+#define PTRACE_SETCRUNCHREGS 26
+#define PTRACE_GETVFPREGS 27
+#define PTRACE_SETVFPREGS 28
+#define PTRACE_GETHBPREGS 29
+#define PTRACE_SETHBPREGS 30
+#define PTRACE_GETFDPIC 31
+#define PTRACE_GETFDPIC_EXEC 0
+#define PTRACE_GETFDPIC_INTERP 1
+
+#define PT_GETWMMXREGS PTRACE_GETWMMXREGS
+#define PT_SETWMMXREGS PTRACE_SETWMMXREGS
+#define PT_GET_THREAD_AREA PTRACE_GET_THREAD_AREA
+#define PT_SET_SYSCALL PTRACE_SET_SYSCALL
+#define PT_GETCRUNCHREGS PTRACE_GETCRUNCHREGS
+#define PT_SETCRUNCHREGS PTRACE_SETCRUNCHREGS
+#define PT_GETVFPREGS PTRACE_GETVFPREGS
+#define PT_SETVFPREGS PTRACE_SETVFPREGS
+#define PT_GETHBPREGS PTRACE_GETHBPREGS
+#define PT_SETHBPREGS PTRACE_SETHBPREGS
+#define PT_GETFDPIC PTRACE_GETFDPIC
diff --git a/libc-top-half/musl/arch/arm/bits/reg.h b/libc-top-half/musl/arch/arm/bits/reg.h
new file mode 100644
index 0000000..0c7bffc
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/reg.h
@@ -0,0 +1,3 @@
+#undef __WORDSIZE
+#define __WORDSIZE 32
+/* FIXME */
diff --git a/libc-top-half/musl/arch/arm/bits/sem.h b/libc-top-half/musl/arch/arm/bits/sem.h
new file mode 100644
index 0000000..544e3d2
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/sem.h
@@ -0,0 +1,18 @@
+struct semid_ds {
+ struct ipc_perm sem_perm;
+ unsigned long __sem_otime_lo;
+ unsigned long __sem_otime_hi;
+ unsigned long __sem_ctime_lo;
+ unsigned long __sem_ctime_hi;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned short sem_nsems;
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+#else
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+ unsigned short sem_nsems;
+#endif
+ long __unused3;
+ long __unused4;
+ time_t sem_otime;
+ time_t sem_ctime;
+};
diff --git a/libc-top-half/musl/arch/arm/bits/setjmp.h b/libc-top-half/musl/arch/arm/bits/setjmp.h
new file mode 100644
index 0000000..55e3a95
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long long __jmp_buf[32];
diff --git a/libc-top-half/musl/arch/arm/bits/shm.h b/libc-top-half/musl/arch/arm/bits/shm.h
new file mode 100644
index 0000000..725fb46
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/shm.h
@@ -0,0 +1,31 @@
+#define SHMLBA 4096
+
+struct shmid_ds {
+ struct ipc_perm shm_perm;
+ size_t shm_segsz;
+ unsigned long __shm_atime_lo;
+ unsigned long __shm_atime_hi;
+ unsigned long __shm_dtime_lo;
+ unsigned long __shm_dtime_hi;
+ unsigned long __shm_ctime_lo;
+ unsigned long __shm_ctime_hi;
+ pid_t shm_cpid;
+ pid_t shm_lpid;
+ unsigned long shm_nattch;
+ unsigned long __pad1;
+ unsigned long __pad2;
+ unsigned long __pad3;
+ time_t shm_atime;
+ time_t shm_dtime;
+ time_t shm_ctime;
+};
+
+struct shminfo {
+ unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+};
+
+struct shm_info {
+ int __used_ids;
+ unsigned long shm_tot, shm_rss, shm_swp;
+ unsigned long __swap_attempts, __swap_successes;
+};
diff --git a/libc-top-half/musl/arch/arm/bits/signal.h b/libc-top-half/musl/arch/arm/bits/signal.h
new file mode 100644
index 0000000..3c78985
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/signal.h
@@ -0,0 +1,86 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef int greg_t, gregset_t[18];
+typedef struct sigcontext {
+ unsigned long trap_no, error_code, oldmask;
+ unsigned long arm_r0, arm_r1, arm_r2, arm_r3;
+ unsigned long arm_r4, arm_r5, arm_r6, arm_r7;
+ unsigned long arm_r8, arm_r9, arm_r10, arm_fp;
+ unsigned long arm_ip, arm_sp, arm_lr, arm_pc;
+ unsigned long arm_cpsr, fault_address;
+} mcontext_t;
+#else
+typedef struct {
+ unsigned long __regs[21];
+} 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;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ sigset_t uc_sigmask;
+ unsigned long long uc_regspace[64];
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 2
+#define SA_SIGINFO 4
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL 29
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
diff --git a/libc-top-half/musl/arch/arm/bits/stat.h b/libc-top-half/musl/arch/arm/bits/stat.h
new file mode 100644
index 0000000..5d7828c
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/stat.h
@@ -0,0 +1,25 @@
+/* copied from kernel definition, but with padding replaced
+ * by the corresponding correctly-sized userspace types. */
+
+struct stat {
+ dev_t st_dev;
+ int __st_dev_padding;
+ long __st_ino_truncated;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ int __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ struct {
+ long tv_sec;
+ long tv_nsec;
+ } __st_atim32, __st_mtim32, __st_ctim32;
+ ino_t st_ino;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+};
diff --git a/libc-top-half/musl/arch/arm/bits/stdint.h b/libc-top-half/musl/arch/arm/bits/stdint.h
new file mode 100644
index 0000000..d1b2712
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#define SIZE_MAX UINT32_MAX
diff --git a/libc-top-half/musl/arch/arm/bits/syscall.h.in b/libc-top-half/musl/arch/arm/bits/syscall.h.in
new file mode 100644
index 0000000..048fdea
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/syscall.h.in
@@ -0,0 +1,409 @@
+#define __NR_restart_syscall 0
+#define __NR_exit 1
+#define __NR_fork 2
+#define __NR_read 3
+#define __NR_write 4
+#define __NR_open 5
+#define __NR_close 6
+#define __NR_creat 8
+#define __NR_link 9
+#define __NR_unlink 10
+#define __NR_execve 11
+#define __NR_chdir 12
+#define __NR_mknod 14
+#define __NR_chmod 15
+#define __NR_lchown 16
+#define __NR_lseek 19
+#define __NR_getpid 20
+#define __NR_mount 21
+#define __NR_setuid 23
+#define __NR_getuid 24
+#define __NR_ptrace 26
+#define __NR_pause 29
+#define __NR_access 33
+#define __NR_nice 34
+#define __NR_sync 36
+#define __NR_kill 37
+#define __NR_rename 38
+#define __NR_mkdir 39
+#define __NR_rmdir 40
+#define __NR_dup 41
+#define __NR_pipe 42
+#define __NR_times 43
+#define __NR_brk 45
+#define __NR_setgid 46
+#define __NR_getgid 47
+#define __NR_geteuid 49
+#define __NR_getegid 50
+#define __NR_acct 51
+#define __NR_umount2 52
+#define __NR_ioctl 54
+#define __NR_fcntl 55
+#define __NR_setpgid 57
+#define __NR_umask 60
+#define __NR_chroot 61
+#define __NR_ustat 62
+#define __NR_dup2 63
+#define __NR_getppid 64
+#define __NR_getpgrp 65
+#define __NR_setsid 66
+#define __NR_sigaction 67
+#define __NR_setreuid 70
+#define __NR_setregid 71
+#define __NR_sigsuspend 72
+#define __NR_sigpending 73
+#define __NR_sethostname 74
+#define __NR_setrlimit 75
+#define __NR_getrusage 77
+#define __NR_gettimeofday_time32 78
+#define __NR_settimeofday_time32 79
+#define __NR_getgroups 80
+#define __NR_setgroups 81
+#define __NR_symlink 83
+#define __NR_readlink 85
+#define __NR_uselib 86
+#define __NR_swapon 87
+#define __NR_reboot 88
+#define __NR_munmap 91
+#define __NR_truncate 92
+#define __NR_ftruncate 93
+#define __NR_fchmod 94
+#define __NR_fchown 95
+#define __NR_getpriority 96
+#define __NR_setpriority 97
+#define __NR_statfs 99
+#define __NR_fstatfs 100
+#define __NR_syslog 103
+#define __NR_setitimer 104
+#define __NR_getitimer 105
+#define __NR_stat 106
+#define __NR_lstat 107
+#define __NR_fstat 108
+#define __NR_vhangup 111
+#define __NR_wait4 114
+#define __NR_swapoff 115
+#define __NR_sysinfo 116
+#define __NR_fsync 118
+#define __NR_sigreturn 119
+#define __NR_clone 120
+#define __NR_setdomainname 121
+#define __NR_uname 122
+#define __NR_adjtimex 124
+#define __NR_mprotect 125
+#define __NR_sigprocmask 126
+#define __NR_init_module 128
+#define __NR_delete_module 129
+#define __NR_quotactl 131
+#define __NR_getpgid 132
+#define __NR_fchdir 133
+#define __NR_bdflush 134
+#define __NR_sysfs 135
+#define __NR_personality 136
+#define __NR_setfsuid 138
+#define __NR_setfsgid 139
+#define __NR__llseek 140
+#define __NR_getdents 141
+#define __NR__newselect 142
+#define __NR_flock 143
+#define __NR_msync 144
+#define __NR_readv 145
+#define __NR_writev 146
+#define __NR_getsid 147
+#define __NR_fdatasync 148
+#define __NR__sysctl 149
+#define __NR_mlock 150
+#define __NR_munlock 151
+#define __NR_mlockall 152
+#define __NR_munlockall 153
+#define __NR_sched_setparam 154
+#define __NR_sched_getparam 155
+#define __NR_sched_setscheduler 156
+#define __NR_sched_getscheduler 157
+#define __NR_sched_yield 158
+#define __NR_sched_get_priority_max 159
+#define __NR_sched_get_priority_min 160
+#define __NR_sched_rr_get_interval 161
+#define __NR_nanosleep 162
+#define __NR_mremap 163
+#define __NR_setresuid 164
+#define __NR_getresuid 165
+#define __NR_poll 168
+#define __NR_nfsservctl 169
+#define __NR_setresgid 170
+#define __NR_getresgid 171
+#define __NR_prctl 172
+#define __NR_rt_sigreturn 173
+#define __NR_rt_sigaction 174
+#define __NR_rt_sigprocmask 175
+#define __NR_rt_sigpending 176
+#define __NR_rt_sigtimedwait 177
+#define __NR_rt_sigqueueinfo 178
+#define __NR_rt_sigsuspend 179
+#define __NR_pread64 180
+#define __NR_pwrite64 181
+#define __NR_chown 182
+#define __NR_getcwd 183
+#define __NR_capget 184
+#define __NR_capset 185
+#define __NR_sigaltstack 186
+#define __NR_sendfile 187
+#define __NR_vfork 190
+#define __NR_ugetrlimit 191
+#define __NR_mmap2 192
+#define __NR_truncate64 193
+#define __NR_ftruncate64 194
+#define __NR_stat64 195
+#define __NR_lstat64 196
+#define __NR_fstat64 197
+#define __NR_lchown32 198
+#define __NR_getuid32 199
+#define __NR_getgid32 200
+#define __NR_geteuid32 201
+#define __NR_getegid32 202
+#define __NR_setreuid32 203
+#define __NR_setregid32 204
+#define __NR_getgroups32 205
+#define __NR_setgroups32 206
+#define __NR_fchown32 207
+#define __NR_setresuid32 208
+#define __NR_getresuid32 209
+#define __NR_setresgid32 210
+#define __NR_getresgid32 211
+#define __NR_chown32 212
+#define __NR_setuid32 213
+#define __NR_setgid32 214
+#define __NR_setfsuid32 215
+#define __NR_setfsgid32 216
+#define __NR_getdents64 217
+#define __NR_pivot_root 218
+#define __NR_mincore 219
+#define __NR_madvise 220
+#define __NR_fcntl64 221
+#define __NR_gettid 224
+#define __NR_readahead 225
+#define __NR_setxattr 226
+#define __NR_lsetxattr 227
+#define __NR_fsetxattr 228
+#define __NR_getxattr 229
+#define __NR_lgetxattr 230
+#define __NR_fgetxattr 231
+#define __NR_listxattr 232
+#define __NR_llistxattr 233
+#define __NR_flistxattr 234
+#define __NR_removexattr 235
+#define __NR_lremovexattr 236
+#define __NR_fremovexattr 237
+#define __NR_tkill 238
+#define __NR_sendfile64 239
+#define __NR_futex 240
+#define __NR_sched_setaffinity 241
+#define __NR_sched_getaffinity 242
+#define __NR_io_setup 243
+#define __NR_io_destroy 244
+#define __NR_io_getevents 245
+#define __NR_io_submit 246
+#define __NR_io_cancel 247
+#define __NR_exit_group 248
+#define __NR_lookup_dcookie 249
+#define __NR_epoll_create 250
+#define __NR_epoll_ctl 251
+#define __NR_epoll_wait 252
+#define __NR_remap_file_pages 253
+#define __NR_set_tid_address 256
+#define __NR_timer_create 257
+#define __NR_timer_settime32 258
+#define __NR_timer_gettime32 259
+#define __NR_timer_getoverrun 260
+#define __NR_timer_delete 261
+#define __NR_clock_settime32 262
+#define __NR_clock_gettime32 263
+#define __NR_clock_getres_time32 264
+#define __NR_clock_nanosleep_time32 265
+#define __NR_statfs64 266
+#define __NR_fstatfs64 267
+#define __NR_tgkill 268
+#define __NR_utimes 269
+#define __NR_fadvise64_64 270
+#define __NR_arm_fadvise64_64 270
+#define __NR_pciconfig_iobase 271
+#define __NR_pciconfig_read 272
+#define __NR_pciconfig_write 273
+#define __NR_mq_open 274
+#define __NR_mq_unlink 275
+#define __NR_mq_timedsend 276
+#define __NR_mq_timedreceive 277
+#define __NR_mq_notify 278
+#define __NR_mq_getsetattr 279
+#define __NR_waitid 280
+#define __NR_socket 281
+#define __NR_bind 282
+#define __NR_connect 283
+#define __NR_listen 284
+#define __NR_accept 285
+#define __NR_getsockname 286
+#define __NR_getpeername 287
+#define __NR_socketpair 288
+#define __NR_send 289
+#define __NR_sendto 290
+#define __NR_recv 291
+#define __NR_recvfrom 292
+#define __NR_shutdown 293
+#define __NR_setsockopt 294
+#define __NR_getsockopt 295
+#define __NR_sendmsg 296
+#define __NR_recvmsg 297
+#define __NR_semop 298
+#define __NR_semget 299
+#define __NR_semctl 300
+#define __NR_msgsnd 301
+#define __NR_msgrcv 302
+#define __NR_msgget 303
+#define __NR_msgctl 304
+#define __NR_shmat 305
+#define __NR_shmdt 306
+#define __NR_shmget 307
+#define __NR_shmctl 308
+#define __NR_add_key 309
+#define __NR_request_key 310
+#define __NR_keyctl 311
+#define __NR_semtimedop 312
+#define __NR_vserver 313
+#define __NR_ioprio_set 314
+#define __NR_ioprio_get 315
+#define __NR_inotify_init 316
+#define __NR_inotify_add_watch 317
+#define __NR_inotify_rm_watch 318
+#define __NR_mbind 319
+#define __NR_get_mempolicy 320
+#define __NR_set_mempolicy 321
+#define __NR_openat 322
+#define __NR_mkdirat 323
+#define __NR_mknodat 324
+#define __NR_fchownat 325
+#define __NR_futimesat 326
+#define __NR_fstatat64 327
+#define __NR_unlinkat 328
+#define __NR_renameat 329
+#define __NR_linkat 330
+#define __NR_symlinkat 331
+#define __NR_readlinkat 332
+#define __NR_fchmodat 333
+#define __NR_faccessat 334
+#define __NR_pselect6 335
+#define __NR_ppoll 336
+#define __NR_unshare 337
+#define __NR_set_robust_list 338
+#define __NR_get_robust_list 339
+#define __NR_splice 340
+#define __NR_sync_file_range2 341
+#define __NR_arm_sync_file_range 341
+#define __NR_tee 342
+#define __NR_vmsplice 343
+#define __NR_move_pages 344
+#define __NR_getcpu 345
+#define __NR_epoll_pwait 346
+#define __NR_kexec_load 347
+#define __NR_utimensat 348
+#define __NR_signalfd 349
+#define __NR_timerfd_create 350
+#define __NR_eventfd 351
+#define __NR_fallocate 352
+#define __NR_timerfd_settime32 353
+#define __NR_timerfd_gettime32 354
+#define __NR_signalfd4 355
+#define __NR_eventfd2 356
+#define __NR_epoll_create1 357
+#define __NR_dup3 358
+#define __NR_pipe2 359
+#define __NR_inotify_init1 360
+#define __NR_preadv 361
+#define __NR_pwritev 362
+#define __NR_rt_tgsigqueueinfo 363
+#define __NR_perf_event_open 364
+#define __NR_recvmmsg 365
+#define __NR_accept4 366
+#define __NR_fanotify_init 367
+#define __NR_fanotify_mark 368
+#define __NR_prlimit64 369
+#define __NR_name_to_handle_at 370
+#define __NR_open_by_handle_at 371
+#define __NR_clock_adjtime 372
+#define __NR_syncfs 373
+#define __NR_sendmmsg 374
+#define __NR_setns 375
+#define __NR_process_vm_readv 376
+#define __NR_process_vm_writev 377
+#define __NR_kcmp 378
+#define __NR_finit_module 379
+#define __NR_sched_setattr 380
+#define __NR_sched_getattr 381
+#define __NR_renameat2 382
+#define __NR_seccomp 383
+#define __NR_getrandom 384
+#define __NR_memfd_create 385
+#define __NR_bpf 386
+#define __NR_execveat 387
+#define __NR_userfaultfd 388
+#define __NR_membarrier 389
+#define __NR_mlock2 390
+#define __NR_copy_file_range 391
+#define __NR_preadv2 392
+#define __NR_pwritev2 393
+#define __NR_pkey_mprotect 394
+#define __NR_pkey_alloc 395
+#define __NR_pkey_free 396
+#define __NR_statx 397
+#define __NR_rseq 398
+#define __NR_io_pgetevents 399
+#define __NR_migrate_pages 400
+#define __NR_kexec_file_load 401
+#define __NR_clock_gettime64 403
+#define __NR_clock_settime64 404
+#define __NR_clock_adjtime64 405
+#define __NR_clock_getres_time64 406
+#define __NR_clock_nanosleep_time64 407
+#define __NR_timer_gettime64 408
+#define __NR_timer_settime64 409
+#define __NR_timerfd_gettime64 410
+#define __NR_timerfd_settime64 411
+#define __NR_utimensat_time64 412
+#define __NR_pselect6_time64 413
+#define __NR_ppoll_time64 414
+#define __NR_io_pgetevents_time64 416
+#define __NR_recvmmsg_time64 417
+#define __NR_mq_timedsend_time64 418
+#define __NR_mq_timedreceive_time64 419
+#define __NR_semtimedop_time64 420
+#define __NR_rt_sigtimedwait_time64 421
+#define __NR_futex_time64 422
+#define __NR_sched_rr_get_interval_time64 423
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_clone3 435
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_epoll_pwait2 441
+#define __NR_mount_setattr 442
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_restrict_self 446
+
+#define __ARM_NR_breakpoint 0x0f0001
+#define __ARM_NR_cacheflush 0x0f0002
+#define __ARM_NR_usr26 0x0f0003
+#define __ARM_NR_usr32 0x0f0004
+#define __ARM_NR_set_tls 0x0f0005
+#define __ARM_NR_get_tls 0x0f0006
+
diff --git a/libc-top-half/musl/arch/arm/bits/user.h b/libc-top-half/musl/arch/arm/bits/user.h
new file mode 100644
index 0000000..3e5a4d2
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/bits/user.h
@@ -0,0 +1,36 @@
+typedef struct user_fpregs {
+ struct fp_reg {
+ unsigned sign1:1;
+ unsigned unused:15;
+ unsigned sign2:1;
+ unsigned exponent:14;
+ unsigned j:1;
+ unsigned mantissa1:31;
+ unsigned mantissa0:32;
+ } fpregs[8];
+ unsigned fpsr:32;
+ unsigned fpcr:32;
+ unsigned char ftype[8];
+ unsigned int init_flag;
+} elf_fpregset_t;
+
+struct user_regs {
+ unsigned long uregs[18];
+};
+#define ELF_NGREG 18
+typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG];
+
+struct user {
+ struct user_regs regs;
+ int u_fpvalid;
+ unsigned long u_tsize, u_dsize, u_ssize;
+ unsigned long start_code, start_stack;
+ long signal;
+ int reserved;
+ struct user_regs *u_ar0;
+ unsigned long magic;
+ char u_comm[32];
+ int u_debugreg[8];
+ struct user_fpregs u_fp;
+ struct user_fpregs *u_fp0;
+};
diff --git a/libc-top-half/musl/arch/arm/crt_arch.h b/libc-top-half/musl/arch/arm/crt_arch.h
new file mode 100644
index 0000000..99508b1
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/crt_arch.h
@@ -0,0 +1,18 @@
+__asm__(
+".text \n"
+".global " START " \n"
+".type " START ",%function \n"
+START ": \n"
+" mov fp, #0 \n"
+" mov lr, #0 \n"
+" ldr a2, 1f \n"
+" add a2, pc, a2 \n"
+" mov a1, sp \n"
+"2: and ip, a1, #-16 \n"
+" mov sp, ip \n"
+" bl " START "_c \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+".align 2 \n"
+"1: .word _DYNAMIC-2b \n"
+);
diff --git a/libc-top-half/musl/arch/arm/kstat.h b/libc-top-half/musl/arch/arm/kstat.h
new file mode 100644
index 0000000..af449c9
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/kstat.h
@@ -0,0 +1,21 @@
+struct kstat {
+ dev_t st_dev;
+ int __st_dev_padding;
+ long __st_ino_truncated;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ int __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ ino_t st_ino;
+};
diff --git a/libc-top-half/musl/arch/arm/pthread_arch.h b/libc-top-half/musl/arch/arm/pthread_arch.h
new file mode 100644
index 0000000..157e2ea
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/pthread_arch.h
@@ -0,0 +1,32 @@
+#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
+ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
+
+static inline uintptr_t __get_tp()
+{
+ uintptr_t tp;
+ __asm__ ( "mrc p15,0,%0,c13,c0,3" : "=r"(tp) );
+ return tp;
+}
+
+#else
+
+#if __ARM_ARCH_4__ || __ARM_ARCH_4T__ || __ARM_ARCH == 4
+#define BLX "mov lr,pc\n\tbx"
+#else
+#define BLX "blx"
+#endif
+
+static inline uintptr_t __get_tp()
+{
+ extern hidden uintptr_t __a_gettp_ptr;
+ register uintptr_t tp __asm__("r0");
+ __asm__ ( BLX " %1" : "=r"(tp) : "r"(__a_gettp_ptr) : "cc", "lr" );
+ return tp;
+}
+
+#endif
+
+#define TLS_ABOVE_TP
+#define GAP_ABOVE_TP 8
+
+#define MC_PC arm_pc
diff --git a/libc-top-half/musl/arch/arm/reloc.h b/libc-top-half/musl/arch/arm/reloc.h
new file mode 100644
index 0000000..d091d2a
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/reloc.h
@@ -0,0 +1,32 @@
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define ENDIAN_SUFFIX "eb"
+#else
+#define ENDIAN_SUFFIX ""
+#endif
+
+#if __ARM_PCS_VFP
+#define FP_SUFFIX "hf"
+#else
+#define FP_SUFFIX ""
+#endif
+
+#define LDSO_ARCH "arm" ENDIAN_SUFFIX FP_SUFFIX
+
+#define NO_LEGACY_INITFINI
+
+#define TPOFF_K 0
+
+#define REL_SYMBOLIC R_ARM_ABS32
+#define REL_GOT R_ARM_GLOB_DAT
+#define REL_PLT R_ARM_JUMP_SLOT
+#define REL_RELATIVE R_ARM_RELATIVE
+#define REL_COPY R_ARM_COPY
+#define REL_DTPMOD R_ARM_TLS_DTPMOD32
+#define REL_DTPOFF R_ARM_TLS_DTPOFF32
+#define REL_TPOFF R_ARM_TLS_TPOFF32
+#define REL_TLSDESC R_ARM_TLS_DESC
+
+#define TLSDESC_BACKWARDS
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "mov sp,%1 ; bx %0" : : "r"(pc), "r"(sp) : "memory" )
diff --git a/libc-top-half/musl/arch/arm/syscall_arch.h b/libc-top-half/musl/arch/arm/syscall_arch.h
new file mode 100644
index 0000000..a877b2c
--- /dev/null
+++ b/libc-top-half/musl/arch/arm/syscall_arch.h
@@ -0,0 +1,103 @@
+#define __SYSCALL_LL_E(x) \
+((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
+((union { long long ll; long l[2]; }){ .ll = x }).l[1]
+#define __SYSCALL_LL_O(x) 0, __SYSCALL_LL_E((x))
+
+#ifdef __thumb__
+
+/* Avoid use of r7 in asm constraints when producing thumb code,
+ * since it's reserved as frame pointer and might not be supported. */
+#define __ASM____R7__
+#define __asm_syscall(...) do { \
+ __asm__ __volatile__ ( "mov %1,r7 ; mov r7,%2 ; svc 0 ; mov r7,%1" \
+ : "=r"(r0), "=&r"((int){0}) : __VA_ARGS__ : "memory"); \
+ return r0; \
+ } while (0)
+
+#else
+
+#define __ASM____R7__ __asm__("r7")
+#define __asm_syscall(...) do { \
+ __asm__ __volatile__ ( "svc 0" \
+ : "=r"(r0) : __VA_ARGS__ : "memory"); \
+ return r0; \
+ } while (0)
+#endif
+
+/* For thumb2, we can allow 8-bit immediate syscall numbers, saving a
+ * register in the above dance around r7. Does not work for thumb1 where
+ * only movs, not mov, supports immediates, and we can't use movs because
+ * it doesn't support high regs. */
+#ifdef __thumb2__
+#define R7_OPERAND "rI"(r7)
+#else
+#define R7_OPERAND "r"(r7)
+#endif
+
+static inline long __syscall0(long n)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0");
+ __asm_syscall(R7_OPERAND);
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0") = a;
+ __asm_syscall(R7_OPERAND, "0"(r0));
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0") = a;
+ register long r1 __asm__("r1") = b;
+ __asm_syscall(R7_OPERAND, "0"(r0), "r"(r1));
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0") = a;
+ register long r1 __asm__("r1") = b;
+ register long r2 __asm__("r2") = c;
+ __asm_syscall(R7_OPERAND, "0"(r0), "r"(r1), "r"(r2));
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0") = a;
+ register long r1 __asm__("r1") = b;
+ register long r2 __asm__("r2") = c;
+ register long r3 __asm__("r3") = d;
+ __asm_syscall(R7_OPERAND, "0"(r0), "r"(r1), "r"(r2), "r"(r3));
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0") = a;
+ register long r1 __asm__("r1") = b;
+ register long r2 __asm__("r2") = c;
+ register long r3 __asm__("r3") = d;
+ register long r4 __asm__("r4") = e;
+ __asm_syscall(R7_OPERAND, "0"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4));
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0") = a;
+ register long r1 __asm__("r1") = b;
+ register long r2 __asm__("r2") = c;
+ register long r3 __asm__("r3") = d;
+ register long r4 __asm__("r4") = e;
+ register long r5 __asm__("r5") = f;
+ __asm_syscall(R7_OPERAND, "0"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4), "r"(r5));
+}
+
+#define SYSCALL_FADVISE_6_ARG
+
+#define SYSCALL_IPC_BROKEN_MODE
diff --git a/libc-top-half/musl/arch/generic/bits/dirent.h b/libc-top-half/musl/arch/generic/bits/dirent.h
new file mode 100644
index 0000000..c845fe8
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/dirent.h
@@ -0,0 +1,11 @@
+#define _DIRENT_HAVE_D_RECLEN
+#define _DIRENT_HAVE_D_OFF
+#define _DIRENT_HAVE_D_TYPE
+
+struct dirent {
+ ino_t d_ino;
+ off_t d_off;
+ unsigned short d_reclen;
+ unsigned char d_type;
+ char d_name[256];
+};
diff --git a/libc-top-half/musl/arch/generic/bits/errno.h b/libc-top-half/musl/arch/generic/bits/errno.h
new file mode 100644
index 0000000..d2e1eee
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/errno.h
@@ -0,0 +1,134 @@
+#define EPERM 1
+#define ENOENT 2
+#define ESRCH 3
+#define EINTR 4
+#define EIO 5
+#define ENXIO 6
+#define E2BIG 7
+#define ENOEXEC 8
+#define EBADF 9
+#define ECHILD 10
+#define EAGAIN 11
+#define ENOMEM 12
+#define EACCES 13
+#define EFAULT 14
+#define ENOTBLK 15
+#define EBUSY 16
+#define EEXIST 17
+#define EXDEV 18
+#define ENODEV 19
+#define ENOTDIR 20
+#define EISDIR 21
+#define EINVAL 22
+#define ENFILE 23
+#define EMFILE 24
+#define ENOTTY 25
+#define ETXTBSY 26
+#define EFBIG 27
+#define ENOSPC 28
+#define ESPIPE 29
+#define EROFS 30
+#define EMLINK 31
+#define EPIPE 32
+#define EDOM 33
+#define ERANGE 34
+#define EDEADLK 35
+#define ENAMETOOLONG 36
+#define ENOLCK 37
+#define ENOSYS 38
+#define ENOTEMPTY 39
+#define ELOOP 40
+#define EWOULDBLOCK EAGAIN
+#define ENOMSG 42
+#define EIDRM 43
+#define ECHRNG 44
+#define EL2NSYNC 45
+#define EL3HLT 46
+#define EL3RST 47
+#define ELNRNG 48
+#define EUNATCH 49
+#define ENOCSI 50
+#define EL2HLT 51
+#define EBADE 52
+#define EBADR 53
+#define EXFULL 54
+#define ENOANO 55
+#define EBADRQC 56
+#define EBADSLT 57
+#define EDEADLOCK EDEADLK
+#define EBFONT 59
+#define ENOSTR 60
+#define ENODATA 61
+#define ETIME 62
+#define ENOSR 63
+#define ENONET 64
+#define ENOPKG 65
+#define EREMOTE 66
+#define ENOLINK 67
+#define EADV 68
+#define ESRMNT 69
+#define ECOMM 70
+#define EPROTO 71
+#define EMULTIHOP 72
+#define EDOTDOT 73
+#define EBADMSG 74
+#define EOVERFLOW 75
+#define ENOTUNIQ 76
+#define EBADFD 77
+#define EREMCHG 78
+#define ELIBACC 79
+#define ELIBBAD 80
+#define ELIBSCN 81
+#define ELIBMAX 82
+#define ELIBEXEC 83
+#define EILSEQ 84
+#define ERESTART 85
+#define ESTRPIPE 86
+#define EUSERS 87
+#define ENOTSOCK 88
+#define EDESTADDRREQ 89
+#define EMSGSIZE 90
+#define EPROTOTYPE 91
+#define ENOPROTOOPT 92
+#define EPROTONOSUPPORT 93
+#define ESOCKTNOSUPPORT 94
+#define EOPNOTSUPP 95
+#define ENOTSUP EOPNOTSUPP
+#define EPFNOSUPPORT 96
+#define EAFNOSUPPORT 97
+#define EADDRINUSE 98
+#define EADDRNOTAVAIL 99
+#define ENETDOWN 100
+#define ENETUNREACH 101
+#define ENETRESET 102
+#define ECONNABORTED 103
+#define ECONNRESET 104
+#define ENOBUFS 105
+#define EISCONN 106
+#define ENOTCONN 107
+#define ESHUTDOWN 108
+#define ETOOMANYREFS 109
+#define ETIMEDOUT 110
+#define ECONNREFUSED 111
+#define EHOSTDOWN 112
+#define EHOSTUNREACH 113
+#define EALREADY 114
+#define EINPROGRESS 115
+#define ESTALE 116
+#define EUCLEAN 117
+#define ENOTNAM 118
+#define ENAVAIL 119
+#define EISNAM 120
+#define EREMOTEIO 121
+#define EDQUOT 122
+#define ENOMEDIUM 123
+#define EMEDIUMTYPE 124
+#define ECANCELED 125
+#define ENOKEY 126
+#define EKEYEXPIRED 127
+#define EKEYREVOKED 128
+#define EKEYREJECTED 129
+#define EOWNERDEAD 130
+#define ENOTRECOVERABLE 131
+#define ERFKILL 132
+#define EHWPOISON 133
diff --git a/libc-top-half/musl/arch/generic/bits/fcntl.h b/libc-top-half/musl/arch/generic/bits/fcntl.h
new file mode 100644
index 0000000..730a98c
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/fcntl.h
@@ -0,0 +1,46 @@
+#define O_CREAT 0100
+#define O_EXCL 0200
+#define O_NOCTTY 0400
+#define O_TRUNC 01000
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_DSYNC 010000
+#define O_SYNC 04010000
+#define O_RSYNC 04010000
+#define O_DIRECTORY 0200000
+#define O_NOFOLLOW 0400000
+#define O_CLOEXEC 02000000
+
+#define O_ASYNC 020000
+#define O_DIRECT 040000
+#define O_LARGEFILE 0100000
+#define O_NOATIME 01000000
+#define O_PATH 010000000
+#define O_TMPFILE 020200000
+#define O_NDELAY O_NONBLOCK
+
+#define F_DUPFD 0
+#define F_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+
+#define F_SETOWN 8
+#define F_GETOWN 9
+#define F_SETSIG 10
+#define F_GETSIG 11
+
+#if __LONG_MAX == 0x7fffffffL
+#define F_GETLK 12
+#define F_SETLK 13
+#define F_SETLKW 14
+#else
+#define F_GETLK 5
+#define F_SETLK 6
+#define F_SETLKW 7
+#endif
+
+#define F_SETOWN_EX 15
+#define F_GETOWN_EX 16
+
+#define F_GETOWNER_UIDS 17
diff --git a/libc-top-half/musl/arch/generic/bits/fenv.h b/libc-top-half/musl/arch/generic/bits/fenv.h
new file mode 100644
index 0000000..edbdea2
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/fenv.h
@@ -0,0 +1,10 @@
+#define FE_ALL_EXCEPT 0
+#define FE_TONEAREST 0
+
+typedef unsigned long fexcept_t;
+
+typedef struct {
+ unsigned long __cw;
+} fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *) -1)
diff --git a/libc-top-half/musl/arch/generic/bits/hwcap.h b/libc-top-half/musl/arch/generic/bits/hwcap.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/hwcap.h
diff --git a/libc-top-half/musl/arch/generic/bits/io.h b/libc-top-half/musl/arch/generic/bits/io.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/io.h
diff --git a/libc-top-half/musl/arch/generic/bits/ioctl.h b/libc-top-half/musl/arch/generic/bits/ioctl.h
new file mode 100644
index 0000000..60ae8b8
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/ioctl.h
@@ -0,0 +1,115 @@
+#define _IOC(a,b,c,d) ( ((a)<<30) | ((b)<<8) | (c) | ((d)<<16) )
+#define _IOC_NONE 0U
+#define _IOC_WRITE 1U
+#define _IOC_READ 2U
+
+#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0)
+#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c))
+#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c))
+#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c))
+
+#define TCGETS 0x5401
+#define TCSETS 0x5402
+#define TCSETSW 0x5403
+#define TCSETSF 0x5404
+#define TCGETA 0x5405
+#define TCSETA 0x5406
+#define TCSETAW 0x5407
+#define TCSETAF 0x5408
+#define TCSBRK 0x5409
+#define TCXONC 0x540A
+#define TCFLSH 0x540B
+#define TIOCEXCL 0x540C
+#define TIOCNXCL 0x540D
+#define TIOCSCTTY 0x540E
+#define TIOCGPGRP 0x540F
+#define TIOCSPGRP 0x5410
+#define TIOCOUTQ 0x5411
+#define TIOCSTI 0x5412
+#define TIOCGWINSZ 0x5413
+#define TIOCSWINSZ 0x5414
+#define TIOCMGET 0x5415
+#define TIOCMBIS 0x5416
+#define TIOCMBIC 0x5417
+#define TIOCMSET 0x5418
+#define TIOCGSOFTCAR 0x5419
+#define TIOCSSOFTCAR 0x541A
+#define FIONREAD 0x541B
+#define TIOCINQ FIONREAD
+#define TIOCLINUX 0x541C
+#define TIOCCONS 0x541D
+#define TIOCGSERIAL 0x541E
+#define TIOCSSERIAL 0x541F
+#define TIOCPKT 0x5420
+#define FIONBIO 0x5421
+#define TIOCNOTTY 0x5422
+#define TIOCSETD 0x5423
+#define TIOCGETD 0x5424
+#define TCSBRKP 0x5425
+#define TIOCSBRK 0x5427
+#define TIOCCBRK 0x5428
+#define TIOCGSID 0x5429
+#define TIOCGRS485 0x542E
+#define TIOCSRS485 0x542F
+#define TIOCGPTN 0x80045430
+#define TIOCSPTLCK 0x40045431
+#define TIOCGDEV 0x80045432
+#define TCGETX 0x5432
+#define TCSETX 0x5433
+#define TCSETXF 0x5434
+#define TCSETXW 0x5435
+#define TIOCSIG 0x40045436
+#define TIOCVHANGUP 0x5437
+#define TIOCGPKT 0x80045438
+#define TIOCGPTLCK 0x80045439
+#define TIOCGEXCL 0x80045440
+#define TIOCGPTPEER 0x5441
+#define TIOCGISO7816 0x80285442
+#define TIOCSISO7816 0xc0285443
+
+#define FIONCLEX 0x5450
+#define FIOCLEX 0x5451
+#define FIOASYNC 0x5452
+#define TIOCSERCONFIG 0x5453
+#define TIOCSERGWILD 0x5454
+#define TIOCSERSWILD 0x5455
+#define TIOCGLCKTRMIOS 0x5456
+#define TIOCSLCKTRMIOS 0x5457
+#define TIOCSERGSTRUCT 0x5458
+#define TIOCSERGETLSR 0x5459
+#define TIOCSERGETMULTI 0x545A
+#define TIOCSERSETMULTI 0x545B
+
+#define TIOCMIWAIT 0x545C
+#define TIOCGICOUNT 0x545D
+#define FIOQSIZE 0x5460
+
+#define TIOCM_LE 0x001
+#define TIOCM_DTR 0x002
+#define TIOCM_RTS 0x004
+#define TIOCM_ST 0x008
+#define TIOCM_SR 0x010
+#define TIOCM_CTS 0x020
+#define TIOCM_CAR 0x040
+#define TIOCM_RNG 0x080
+#define TIOCM_DSR 0x100
+#define TIOCM_CD TIOCM_CAR
+#define TIOCM_RI TIOCM_RNG
+#define TIOCM_OUT1 0x2000
+#define TIOCM_OUT2 0x4000
+#define TIOCM_LOOP 0x8000
+
+#define FIOSETOWN 0x8901
+#define SIOCSPGRP 0x8902
+#define FIOGETOWN 0x8903
+#define SIOCGPGRP 0x8904
+#define SIOCATMARK 0x8905
+#if __LONG_MAX == 0x7fffffff
+#define SIOCGSTAMP _IOR(0x89, 6, char[16])
+#define SIOCGSTAMPNS _IOR(0x89, 7, char[16])
+#else
+#define SIOCGSTAMP 0x8906
+#define SIOCGSTAMPNS 0x8907
+#endif
+
+#include <bits/ioctl_fix.h>
diff --git a/libc-top-half/musl/arch/generic/bits/ioctl_fix.h b/libc-top-half/musl/arch/generic/bits/ioctl_fix.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/ioctl_fix.h
diff --git a/libc-top-half/musl/arch/generic/bits/ipc.h b/libc-top-half/musl/arch/generic/bits/ipc.h
new file mode 100644
index 0000000..40d6f3a
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/ipc.h
@@ -0,0 +1,11 @@
+struct ipc_perm {
+ key_t __ipc_perm_key;
+ uid_t uid;
+ gid_t gid;
+ uid_t cuid;
+ gid_t cgid;
+ mode_t mode;
+ int __ipc_perm_seq;
+ long __pad1;
+ long __pad2;
+};
diff --git a/libc-top-half/musl/arch/generic/bits/ipcstat.h b/libc-top-half/musl/arch/generic/bits/ipcstat.h
new file mode 100644
index 0000000..0018ad1
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/ipcstat.h
@@ -0,0 +1 @@
+#define IPC_STAT 2
diff --git a/libc-top-half/musl/arch/generic/bits/kd.h b/libc-top-half/musl/arch/generic/bits/kd.h
new file mode 100644
index 0000000..33b873f
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/kd.h
@@ -0,0 +1 @@
+#include <linux/kd.h>
diff --git a/libc-top-half/musl/arch/generic/bits/limits.h b/libc-top-half/musl/arch/generic/bits/limits.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/limits.h
diff --git a/libc-top-half/musl/arch/generic/bits/link.h b/libc-top-half/musl/arch/generic/bits/link.h
new file mode 100644
index 0000000..4a94d8f
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/link.h
@@ -0,0 +1 @@
+typedef uint32_t Elf_Symndx;
diff --git a/libc-top-half/musl/arch/generic/bits/mman.h b/libc-top-half/musl/arch/generic/bits/mman.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/mman.h
diff --git a/libc-top-half/musl/arch/generic/bits/msg.h b/libc-top-half/musl/arch/generic/bits/msg.h
new file mode 100644
index 0000000..2e23ca2
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/msg.h
@@ -0,0 +1,12 @@
+struct msqid_ds {
+ struct ipc_perm msg_perm;
+ time_t msg_stime;
+ time_t msg_rtime;
+ time_t msg_ctime;
+ unsigned long msg_cbytes;
+ msgqnum_t msg_qnum;
+ msglen_t msg_qbytes;
+ pid_t msg_lspid;
+ pid_t msg_lrpid;
+ unsigned long __unused[2];
+};
diff --git a/libc-top-half/musl/arch/generic/bits/poll.h b/libc-top-half/musl/arch/generic/bits/poll.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/poll.h
diff --git a/libc-top-half/musl/arch/generic/bits/ptrace.h b/libc-top-half/musl/arch/generic/bits/ptrace.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/ptrace.h
diff --git a/libc-top-half/musl/arch/generic/bits/resource.h b/libc-top-half/musl/arch/generic/bits/resource.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/resource.h
diff --git a/libc-top-half/musl/arch/generic/bits/sem.h b/libc-top-half/musl/arch/generic/bits/sem.h
new file mode 100644
index 0000000..5184eb5
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/sem.h
@@ -0,0 +1,14 @@
+struct semid_ds {
+ struct ipc_perm sem_perm;
+ time_t sem_otime;
+ time_t sem_ctime;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned short sem_nsems;
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+#else
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+ unsigned short sem_nsems;
+#endif
+ long __unused3;
+ long __unused4;
+};
diff --git a/libc-top-half/musl/arch/generic/bits/shm.h b/libc-top-half/musl/arch/generic/bits/shm.h
new file mode 100644
index 0000000..8d19378
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/shm.h
@@ -0,0 +1,24 @@
+#define SHMLBA 4096
+
+struct shmid_ds {
+ struct ipc_perm shm_perm;
+ size_t shm_segsz;
+ time_t shm_atime;
+ time_t shm_dtime;
+ time_t shm_ctime;
+ pid_t shm_cpid;
+ pid_t shm_lpid;
+ unsigned long shm_nattch;
+ unsigned long __pad1;
+ unsigned long __pad2;
+};
+
+struct shminfo {
+ unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+};
+
+struct shm_info {
+ int __used_ids;
+ unsigned long shm_tot, shm_rss, shm_swp;
+ unsigned long __swap_attempts, __swap_successes;
+};
diff --git a/libc-top-half/musl/arch/generic/bits/socket.h b/libc-top-half/musl/arch/generic/bits/socket.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/socket.h
diff --git a/libc-top-half/musl/arch/generic/bits/soundcard.h b/libc-top-half/musl/arch/generic/bits/soundcard.h
new file mode 100644
index 0000000..fade986
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/soundcard.h
@@ -0,0 +1 @@
+#include <linux/soundcard.h>
diff --git a/libc-top-half/musl/arch/generic/bits/statfs.h b/libc-top-half/musl/arch/generic/bits/statfs.h
new file mode 100644
index 0000000..f103f4e
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/statfs.h
@@ -0,0 +1,7 @@
+struct statfs {
+ unsigned long f_type, f_bsize;
+ fsblkcnt_t f_blocks, f_bfree, f_bavail;
+ fsfilcnt_t f_files, f_ffree;
+ fsid_t f_fsid;
+ unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
+};
diff --git a/libc-top-half/musl/arch/generic/bits/termios.h b/libc-top-half/musl/arch/generic/bits/termios.h
new file mode 100644
index 0000000..124f71d
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/termios.h
@@ -0,0 +1,166 @@
+struct termios {
+ tcflag_t c_iflag;
+ tcflag_t c_oflag;
+ tcflag_t c_cflag;
+ tcflag_t c_lflag;
+ cc_t c_line;
+ cc_t c_cc[NCCS];
+ speed_t __c_ispeed;
+ speed_t __c_ospeed;
+};
+
+#define VINTR 0
+#define VQUIT 1
+#define VERASE 2
+#define VKILL 3
+#define VEOF 4
+#define VTIME 5
+#define VMIN 6
+#define VSWTC 7
+#define VSTART 8
+#define VSTOP 9
+#define VSUSP 10
+#define VEOL 11
+#define VREPRINT 12
+#define VDISCARD 13
+#define VWERASE 14
+#define VLNEXT 15
+#define VEOL2 16
+
+#define IGNBRK 0000001
+#define BRKINT 0000002
+#define IGNPAR 0000004
+#define PARMRK 0000010
+#define INPCK 0000020
+#define ISTRIP 0000040
+#define INLCR 0000100
+#define IGNCR 0000200
+#define ICRNL 0000400
+#define IUCLC 0001000
+#define IXON 0002000
+#define IXANY 0004000
+#define IXOFF 0010000
+#define IMAXBEL 0020000
+#define IUTF8 0040000
+
+#define OPOST 0000001
+#define OLCUC 0000002
+#define ONLCR 0000004
+#define OCRNL 0000010
+#define ONOCR 0000020
+#define ONLRET 0000040
+#define OFILL 0000100
+#define OFDEL 0000200
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE)
+#define NLDLY 0000400
+#define NL0 0000000
+#define NL1 0000400
+#define CRDLY 0003000
+#define CR0 0000000
+#define CR1 0001000
+#define CR2 0002000
+#define CR3 0003000
+#define TABDLY 0014000
+#define TAB0 0000000
+#define TAB1 0004000
+#define TAB2 0010000
+#define TAB3 0014000
+#define BSDLY 0020000
+#define BS0 0000000
+#define BS1 0020000
+#define FFDLY 0100000
+#define FF0 0000000
+#define FF1 0100000
+#endif
+
+#define VTDLY 0040000
+#define VT0 0000000
+#define VT1 0040000
+
+#define B0 0000000
+#define B50 0000001
+#define B75 0000002
+#define B110 0000003
+#define B134 0000004
+#define B150 0000005
+#define B200 0000006
+#define B300 0000007
+#define B600 0000010
+#define B1200 0000011
+#define B1800 0000012
+#define B2400 0000013
+#define B4800 0000014
+#define B9600 0000015
+#define B19200 0000016
+#define B38400 0000017
+
+#define B57600 0010001
+#define B115200 0010002
+#define B230400 0010003
+#define B460800 0010004
+#define B500000 0010005
+#define B576000 0010006
+#define B921600 0010007
+#define B1000000 0010010
+#define B1152000 0010011
+#define B1500000 0010012
+#define B2000000 0010013
+#define B2500000 0010014
+#define B3000000 0010015
+#define B3500000 0010016
+#define B4000000 0010017
+
+#define CSIZE 0000060
+#define CS5 0000000
+#define CS6 0000020
+#define CS7 0000040
+#define CS8 0000060
+#define CSTOPB 0000100
+#define CREAD 0000200
+#define PARENB 0000400
+#define PARODD 0001000
+#define HUPCL 0002000
+#define CLOCAL 0004000
+
+#define ISIG 0000001
+#define ICANON 0000002
+#define ECHO 0000010
+#define ECHOE 0000020
+#define ECHOK 0000040
+#define ECHONL 0000100
+#define NOFLSH 0000200
+#define TOSTOP 0000400
+#define IEXTEN 0100000
+
+#define TCOOFF 0
+#define TCOON 1
+#define TCIOFF 2
+#define TCION 3
+
+#define TCIFLUSH 0
+#define TCOFLUSH 1
+#define TCIOFLUSH 2
+
+#define TCSANOW 0
+#define TCSADRAIN 1
+#define TCSAFLUSH 2
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define EXTA 0000016
+#define EXTB 0000017
+#define CBAUD 0010017
+#define CBAUDEX 0010000
+#define CIBAUD 002003600000
+#define CMSPAR 010000000000
+#define CRTSCTS 020000000000
+
+#define XCASE 0000004
+#define ECHOCTL 0001000
+#define ECHOPRT 0002000
+#define ECHOKE 0004000
+#define FLUSHO 0010000
+#define PENDIN 0040000
+#define EXTPROC 0200000
+
+#define XTABS 0014000
+#endif
diff --git a/libc-top-half/musl/arch/generic/bits/vt.h b/libc-top-half/musl/arch/generic/bits/vt.h
new file mode 100644
index 0000000..834abfb
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/bits/vt.h
@@ -0,0 +1 @@
+#include <linux/vt.h>
diff --git a/libc-top-half/musl/arch/generic/fp_arch.h b/libc-top-half/musl/arch/generic/fp_arch.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/arch/generic/fp_arch.h
diff --git a/libc-top-half/musl/arch/i386/arch.mak b/libc-top-half/musl/arch/i386/arch.mak
new file mode 100644
index 0000000..aa4d05c
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/arch.mak
@@ -0,0 +1 @@
+COMPAT_SRC_DIRS = compat/time32
diff --git a/libc-top-half/musl/arch/i386/atomic_arch.h b/libc-top-half/musl/arch/i386/atomic_arch.h
new file mode 100644
index 0000000..047fb68
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/atomic_arch.h
@@ -0,0 +1,108 @@
+#define a_cas a_cas
+static inline int a_cas(volatile int *p, int t, int s)
+{
+ __asm__ __volatile__ (
+ "lock ; cmpxchg %3, %1"
+ : "=a"(t), "=m"(*p) : "a"(t), "r"(s) : "memory" );
+ return t;
+}
+
+#define a_swap a_swap
+static inline int a_swap(volatile int *p, int v)
+{
+ __asm__ __volatile__(
+ "xchg %0, %1"
+ : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
+ return v;
+}
+
+#define a_fetch_add a_fetch_add
+static inline int a_fetch_add(volatile int *p, int v)
+{
+ __asm__ __volatile__(
+ "lock ; xadd %0, %1"
+ : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
+ return v;
+}
+
+#define a_and a_and
+static inline void a_and(volatile int *p, int v)
+{
+ __asm__ __volatile__(
+ "lock ; and %1, %0"
+ : "=m"(*p) : "r"(v) : "memory" );
+}
+
+#define a_or a_or
+static inline void a_or(volatile int *p, int v)
+{
+ __asm__ __volatile__(
+ "lock ; or %1, %0"
+ : "=m"(*p) : "r"(v) : "memory" );
+}
+
+#define a_inc a_inc
+static inline void a_inc(volatile int *p)
+{
+ __asm__ __volatile__(
+ "lock ; incl %0"
+ : "=m"(*p) : "m"(*p) : "memory" );
+}
+
+#define a_dec a_dec
+static inline void a_dec(volatile int *p)
+{
+ __asm__ __volatile__(
+ "lock ; decl %0"
+ : "=m"(*p) : "m"(*p) : "memory" );
+}
+
+#define a_store a_store
+static inline void a_store(volatile int *p, int x)
+{
+ __asm__ __volatile__(
+ "mov %1, %0 ; lock ; orl $0,(%%esp)"
+ : "=m"(*p) : "r"(x) : "memory" );
+}
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ __asm__ __volatile__( "" : : : "memory" );
+}
+
+#define a_spin a_spin
+static inline void a_spin()
+{
+ __asm__ __volatile__( "pause" : : : "memory" );
+}
+
+#define a_crash a_crash
+static inline void a_crash()
+{
+ __asm__ __volatile__( "hlt" : : : "memory" );
+}
+
+#define a_ctz_64 a_ctz_64
+static inline int a_ctz_64(uint64_t x)
+{
+ int r;
+ __asm__( "bsf %1,%0 ; jnz 1f ; bsf %2,%0 ; add $32,%0\n1:"
+ : "=&r"(r) : "r"((unsigned)x), "r"((unsigned)(x>>32)) );
+ return r;
+}
+
+#define a_ctz_32 a_ctz_32
+static inline int a_ctz_32(uint32_t x)
+{
+ int r;
+ __asm__( "bsf %1,%0" : "=r"(r) : "r"(x) );
+ return r;
+}
+
+#define a_clz_32 a_clz_32
+static inline int a_clz_32(uint32_t x)
+{
+ __asm__( "bsr %1,%0 ; xor $31,%0" : "=r"(x) : "r"(x) );
+ return x;
+}
diff --git a/libc-top-half/musl/arch/i386/bits/alltypes.h.in b/libc-top-half/musl/arch/i386/bits/alltypes.h.in
new file mode 100644
index 0000000..6feb03a
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/alltypes.h.in
@@ -0,0 +1,31 @@
+#define _REDIR_TIME64 1
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+#define __BYTE_ORDER 1234
+#define __LONG_MAX 0x7fffffffL
+
+#ifndef __cplusplus
+#ifdef __WCHAR_TYPE__
+TYPEDEF __WCHAR_TYPE__ wchar_t;
+#else
+TYPEDEF long wchar_t;
+#endif
+#endif
+
+#if defined(__FLT_EVAL_METHOD__) && __FLT_EVAL_METHOD__ == 0
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+#else
+TYPEDEF long double float_t;
+TYPEDEF long double double_t;
+#endif
+
+#if !defined(__cplusplus)
+TYPEDEF struct { _Alignas(8) long long __ll; long double __ld; } max_align_t;
+#elif defined(__GNUC__)
+TYPEDEF struct { __attribute__((__aligned__(8))) long long __ll; long double __ld; } max_align_t;
+#else
+TYPEDEF struct { alignas(8) long long __ll; long double __ld; } max_align_t;
+#endif
diff --git a/libc-top-half/musl/arch/i386/bits/fenv.h b/libc-top-half/musl/arch/i386/bits/fenv.h
new file mode 100644
index 0000000..4430009
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/fenv.h
@@ -0,0 +1,33 @@
+#define FE_INVALID 1
+#define __FE_DENORM 2
+#define FE_DIVBYZERO 4
+#define FE_OVERFLOW 8
+#define FE_UNDERFLOW 16
+#define FE_INEXACT 32
+
+#define FE_ALL_EXCEPT 63
+
+#define FE_TONEAREST 0
+#define FE_DOWNWARD 0x400
+#define FE_UPWARD 0x800
+#define FE_TOWARDZERO 0xc00
+
+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;
+} fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *) -1)
diff --git a/libc-top-half/musl/arch/i386/bits/float.h b/libc-top-half/musl/arch/i386/bits/float.h
new file mode 100644
index 0000000..dd6e402
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/float.h
@@ -0,0 +1,20 @@
+#ifdef __FLT_EVAL_METHOD__
+#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
+#else
+#define FLT_EVAL_METHOD 2
+#endif
+
+#define LDBL_TRUE_MIN 3.6451995318824746025e-4951L
+#define LDBL_MIN 3.3621031431120935063e-4932L
+#define LDBL_MAX 1.1897314953572317650e+4932L
+#define LDBL_EPSILON 1.0842021724855044340e-19L
+
+#define LDBL_MANT_DIG 64
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_MAX_EXP 16384
+
+#define LDBL_DIG 18
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MAX_10_EXP 4932
+
+#define DECIMAL_DIG 21
diff --git a/libc-top-half/musl/arch/i386/bits/io.h b/libc-top-half/musl/arch/i386/bits/io.h
new file mode 100644
index 0000000..dd5bddc
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/io.h
@@ -0,0 +1,77 @@
+static __inline void outb(unsigned char __val, unsigned short __port)
+{
+ __asm__ volatile ("outb %0,%1" : : "a" (__val), "dN" (__port));
+}
+
+static __inline void outw(unsigned short __val, unsigned short __port)
+{
+ __asm__ volatile ("outw %0,%1" : : "a" (__val), "dN" (__port));
+}
+
+static __inline void outl(unsigned int __val, unsigned short __port)
+{
+ __asm__ volatile ("outl %0,%1" : : "a" (__val), "dN" (__port));
+}
+
+static __inline unsigned char inb(unsigned short __port)
+{
+ unsigned char __val;
+ __asm__ volatile ("inb %1,%0" : "=a" (__val) : "dN" (__port));
+ return __val;
+}
+
+static __inline unsigned short inw(unsigned short __port)
+{
+ unsigned short __val;
+ __asm__ volatile ("inw %1,%0" : "=a" (__val) : "dN" (__port));
+ return __val;
+}
+
+static __inline unsigned int inl(unsigned short __port)
+{
+ unsigned int __val;
+ __asm__ volatile ("inl %1,%0" : "=a" (__val) : "dN" (__port));
+ return __val;
+}
+
+static __inline void outsb(unsigned short __port, const void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; outsb"
+ : "+S" (__buf), "+c" (__n)
+ : "d" (__port));
+}
+
+static __inline void outsw(unsigned short __port, const void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; outsw"
+ : "+S" (__buf), "+c" (__n)
+ : "d" (__port));
+}
+
+static __inline void outsl(unsigned short __port, const void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; outsl"
+ : "+S" (__buf), "+c"(__n)
+ : "d" (__port));
+}
+
+static __inline void insb(unsigned short __port, void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; insb"
+ : "+D" (__buf), "+c" (__n)
+ : "d" (__port));
+}
+
+static __inline void insw(unsigned short __port, void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; insw"
+ : "+D" (__buf), "+c" (__n)
+ : "d" (__port));
+}
+
+static __inline void insl(unsigned short __port, void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; insl"
+ : "+D" (__buf), "+c" (__n)
+ : "d" (__port));
+}
diff --git a/libc-top-half/musl/arch/i386/bits/ipcstat.h b/libc-top-half/musl/arch/i386/bits/ipcstat.h
new file mode 100644
index 0000000..4f4fcb0
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/ipcstat.h
@@ -0,0 +1 @@
+#define IPC_STAT 0x102
diff --git a/libc-top-half/musl/arch/i386/bits/limits.h b/libc-top-half/musl/arch/i386/bits/limits.h
new file mode 100644
index 0000000..07743b6
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/limits.h
@@ -0,0 +1 @@
+#define PAGESIZE 4096
diff --git a/libc-top-half/musl/arch/i386/bits/mman.h b/libc-top-half/musl/arch/i386/bits/mman.h
new file mode 100644
index 0000000..ba2d6f7
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/mman.h
@@ -0,0 +1 @@
+#define MAP_32BIT 0x40
diff --git a/libc-top-half/musl/arch/i386/bits/msg.h b/libc-top-half/musl/arch/i386/bits/msg.h
new file mode 100644
index 0000000..7bbbb2b
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/msg.h
@@ -0,0 +1,18 @@
+struct msqid_ds {
+ struct ipc_perm msg_perm;
+ unsigned long __msg_stime_lo;
+ unsigned long __msg_stime_hi;
+ unsigned long __msg_rtime_lo;
+ unsigned long __msg_rtime_hi;
+ unsigned long __msg_ctime_lo;
+ unsigned long __msg_ctime_hi;
+ unsigned long msg_cbytes;
+ msgqnum_t msg_qnum;
+ msglen_t msg_qbytes;
+ pid_t msg_lspid;
+ pid_t msg_lrpid;
+ unsigned long __unused[2];
+ time_t msg_stime;
+ time_t msg_rtime;
+ time_t msg_ctime;
+};
diff --git a/libc-top-half/musl/arch/i386/bits/posix.h b/libc-top-half/musl/arch/i386/bits/posix.h
new file mode 100644
index 0000000..30a3871
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_ILP32_OFFBIG 1
+#define _POSIX_V7_ILP32_OFFBIG 1
diff --git a/libc-top-half/musl/arch/i386/bits/ptrace.h b/libc-top-half/musl/arch/i386/bits/ptrace.h
new file mode 100644
index 0000000..7d0efbf
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/ptrace.h
@@ -0,0 +1,11 @@
+#define PTRACE_GET_THREAD_AREA 25
+#define PTRACE_SET_THREAD_AREA 26
+#define PTRACE_SYSEMU 31
+#define PTRACE_SYSEMU_SINGLESTEP 32
+#define PTRACE_SINGLEBLOCK 33
+
+#define PT_GET_THREAD_AREA PTRACE_GET_THREAD_AREA
+#define PT_SET_THREAD_AREA PTRACE_SET_THREAD_AREA
+#define PT_SYSEMU PTRACE_SYSEMU
+#define PT_SYSEMU_SINGLESTEP PTRACE_SYSEMU_SINGLESTEP
+#define PT_STEPBLOCK PTRACE_SINGLEBLOCK
diff --git a/libc-top-half/musl/arch/i386/bits/reg.h b/libc-top-half/musl/arch/i386/bits/reg.h
new file mode 100644
index 0000000..8bc2582
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/reg.h
@@ -0,0 +1,19 @@
+#undef __WORDSIZE
+#define __WORDSIZE 32
+#define EBX 0
+#define ECX 1
+#define EDX 2
+#define ESI 3
+#define EDI 4
+#define EBP 5
+#define EAX 6
+#define DS 7
+#define ES 8
+#define FS 9
+#define GS 10
+#define ORIG_EAX 11
+#define EIP 12
+#define CS 13
+#define EFL 14
+#define UESP 15
+#define SS 16
diff --git a/libc-top-half/musl/arch/i386/bits/sem.h b/libc-top-half/musl/arch/i386/bits/sem.h
new file mode 100644
index 0000000..6566154
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/sem.h
@@ -0,0 +1,13 @@
+struct semid_ds {
+ struct ipc_perm sem_perm;
+ unsigned long __sem_otime_lo;
+ unsigned long __sem_otime_hi;
+ unsigned long __sem_ctime_lo;
+ unsigned long __sem_ctime_hi;
+ unsigned short sem_nsems;
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+ long __unused3;
+ long __unused4;
+ time_t sem_otime;
+ time_t sem_ctime;
+};
diff --git a/libc-top-half/musl/arch/i386/bits/setjmp.h b/libc-top-half/musl/arch/i386/bits/setjmp.h
new file mode 100644
index 0000000..decd26d
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long __jmp_buf[6];
diff --git a/libc-top-half/musl/arch/i386/bits/shm.h b/libc-top-half/musl/arch/i386/bits/shm.h
new file mode 100644
index 0000000..725fb46
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/shm.h
@@ -0,0 +1,31 @@
+#define SHMLBA 4096
+
+struct shmid_ds {
+ struct ipc_perm shm_perm;
+ size_t shm_segsz;
+ unsigned long __shm_atime_lo;
+ unsigned long __shm_atime_hi;
+ unsigned long __shm_dtime_lo;
+ unsigned long __shm_dtime_hi;
+ unsigned long __shm_ctime_lo;
+ unsigned long __shm_ctime_hi;
+ pid_t shm_cpid;
+ pid_t shm_lpid;
+ unsigned long shm_nattch;
+ unsigned long __pad1;
+ unsigned long __pad2;
+ unsigned long __pad3;
+ time_t shm_atime;
+ time_t shm_dtime;
+ time_t shm_ctime;
+};
+
+struct shminfo {
+ unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+};
+
+struct shm_info {
+ int __used_ids;
+ unsigned long shm_tot, shm_rss, shm_swp;
+ unsigned long __swap_attempts, __swap_successes;
+};
diff --git a/libc-top-half/musl/arch/i386/bits/signal.h b/libc-top-half/musl/arch/i386/bits/signal.h
new file mode 100644
index 0000000..9931ee9
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/signal.h
@@ -0,0 +1,142 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
+#ifdef _GNU_SOURCE
+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
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef int greg_t, gregset_t[19];
+typedef struct _fpstate {
+ unsigned long cw, sw, tag, ipoff, cssel, dataoff, datasel;
+ struct {
+ unsigned short significand[4], exponent;
+ } _st[8];
+ unsigned long status;
+} *fpregset_t;
+struct sigcontext {
+ unsigned short gs, __gsh, fs, __fsh, es, __esh, ds, __dsh;
+ unsigned long edi, esi, ebp, esp, ebx, edx, ecx, eax;
+ unsigned long trapno, err, eip;
+ unsigned short cs, __csh;
+ unsigned long eflags, esp_at_signal;
+ unsigned short ss, __ssh;
+ struct _fpstate *fpstate;
+ unsigned long oldmask, cr2;
+};
+typedef struct {
+ gregset_t gregs;
+ fpregset_t fpregs;
+ unsigned long oldmask, cr2;
+} mcontext_t;
+#else
+typedef struct {
+ unsigned __space[22];
+} 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;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ sigset_t uc_sigmask;
+ unsigned long __fpregs_mem[28];
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 2
+#define SA_SIGINFO 4
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL 29
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
+
diff --git a/libc-top-half/musl/arch/i386/bits/stat.h b/libc-top-half/musl/arch/i386/bits/stat.h
new file mode 100644
index 0000000..5d7828c
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/stat.h
@@ -0,0 +1,25 @@
+/* copied from kernel definition, but with padding replaced
+ * by the corresponding correctly-sized userspace types. */
+
+struct stat {
+ dev_t st_dev;
+ int __st_dev_padding;
+ long __st_ino_truncated;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ int __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ struct {
+ long tv_sec;
+ long tv_nsec;
+ } __st_atim32, __st_mtim32, __st_ctim32;
+ ino_t st_ino;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+};
diff --git a/libc-top-half/musl/arch/i386/bits/stdint.h b/libc-top-half/musl/arch/i386/bits/stdint.h
new file mode 100644
index 0000000..d1b2712
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#define SIZE_MAX UINT32_MAX
diff --git a/libc-top-half/musl/arch/i386/bits/syscall.h.in b/libc-top-half/musl/arch/i386/bits/syscall.h.in
new file mode 100644
index 0000000..46ffe1d
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/syscall.h.in
@@ -0,0 +1,439 @@
+#define __NR_restart_syscall 0
+#define __NR_exit 1
+#define __NR_fork 2
+#define __NR_read 3
+#define __NR_write 4
+#define __NR_open 5
+#define __NR_close 6
+#define __NR_waitpid 7
+#define __NR_creat 8
+#define __NR_link 9
+#define __NR_unlink 10
+#define __NR_execve 11
+#define __NR_chdir 12
+#define __NR_time 13
+#define __NR_mknod 14
+#define __NR_chmod 15
+#define __NR_lchown 16
+#define __NR_break 17
+#define __NR_oldstat 18
+#define __NR_lseek 19
+#define __NR_getpid 20
+#define __NR_mount 21
+#define __NR_umount 22
+#define __NR_setuid 23
+#define __NR_getuid 24
+#define __NR_stime 25
+#define __NR_ptrace 26
+#define __NR_alarm 27
+#define __NR_oldfstat 28
+#define __NR_pause 29
+#define __NR_utime 30
+#define __NR_stty 31
+#define __NR_gtty 32
+#define __NR_access 33
+#define __NR_nice 34
+#define __NR_ftime 35
+#define __NR_sync 36
+#define __NR_kill 37
+#define __NR_rename 38
+#define __NR_mkdir 39
+#define __NR_rmdir 40
+#define __NR_dup 41
+#define __NR_pipe 42
+#define __NR_times 43
+#define __NR_prof 44
+#define __NR_brk 45
+#define __NR_setgid 46
+#define __NR_getgid 47
+#define __NR_signal 48
+#define __NR_geteuid 49
+#define __NR_getegid 50
+#define __NR_acct 51
+#define __NR_umount2 52
+#define __NR_lock 53
+#define __NR_ioctl 54
+#define __NR_fcntl 55
+#define __NR_mpx 56
+#define __NR_setpgid 57
+#define __NR_ulimit 58
+#define __NR_oldolduname 59
+#define __NR_umask 60
+#define __NR_chroot 61
+#define __NR_ustat 62
+#define __NR_dup2 63
+#define __NR_getppid 64
+#define __NR_getpgrp 65
+#define __NR_setsid 66
+#define __NR_sigaction 67
+#define __NR_sgetmask 68
+#define __NR_ssetmask 69
+#define __NR_setreuid 70
+#define __NR_setregid 71
+#define __NR_sigsuspend 72
+#define __NR_sigpending 73
+#define __NR_sethostname 74
+#define __NR_setrlimit 75
+#define __NR_getrlimit 76 /* Back compatible 2Gig limited rlimit */
+#define __NR_getrusage 77
+#define __NR_gettimeofday_time32 78
+#define __NR_settimeofday_time32 79
+#define __NR_getgroups 80
+#define __NR_setgroups 81
+#define __NR_select 82
+#define __NR_symlink 83
+#define __NR_oldlstat 84
+#define __NR_readlink 85
+#define __NR_uselib 86
+#define __NR_swapon 87
+#define __NR_reboot 88
+#define __NR_readdir 89
+#define __NR_mmap 90
+#define __NR_munmap 91
+#define __NR_truncate 92
+#define __NR_ftruncate 93
+#define __NR_fchmod 94
+#define __NR_fchown 95
+#define __NR_getpriority 96
+#define __NR_setpriority 97
+#define __NR_profil 98
+#define __NR_statfs 99
+#define __NR_fstatfs 100
+#define __NR_ioperm 101
+#define __NR_socketcall 102
+#define __NR_syslog 103
+#define __NR_setitimer 104
+#define __NR_getitimer 105
+#define __NR_stat 106
+#define __NR_lstat 107
+#define __NR_fstat 108
+#define __NR_olduname 109
+#define __NR_iopl 110
+#define __NR_vhangup 111
+#define __NR_idle 112
+#define __NR_vm86old 113
+#define __NR_wait4 114
+#define __NR_swapoff 115
+#define __NR_sysinfo 116
+#define __NR_ipc 117
+#define __NR_fsync 118
+#define __NR_sigreturn 119
+#define __NR_clone 120
+#define __NR_setdomainname 121
+#define __NR_uname 122
+#define __NR_modify_ldt 123
+#define __NR_adjtimex 124
+#define __NR_mprotect 125
+#define __NR_sigprocmask 126
+#define __NR_create_module 127
+#define __NR_init_module 128
+#define __NR_delete_module 129
+#define __NR_get_kernel_syms 130
+#define __NR_quotactl 131
+#define __NR_getpgid 132
+#define __NR_fchdir 133
+#define __NR_bdflush 134
+#define __NR_sysfs 135
+#define __NR_personality 136
+#define __NR_afs_syscall 137
+#define __NR_setfsuid 138
+#define __NR_setfsgid 139
+#define __NR__llseek 140
+#define __NR_getdents 141
+#define __NR__newselect 142
+#define __NR_flock 143
+#define __NR_msync 144
+#define __NR_readv 145
+#define __NR_writev 146
+#define __NR_getsid 147
+#define __NR_fdatasync 148
+#define __NR__sysctl 149
+#define __NR_mlock 150
+#define __NR_munlock 151
+#define __NR_mlockall 152
+#define __NR_munlockall 153
+#define __NR_sched_setparam 154
+#define __NR_sched_getparam 155
+#define __NR_sched_setscheduler 156
+#define __NR_sched_getscheduler 157
+#define __NR_sched_yield 158
+#define __NR_sched_get_priority_max 159
+#define __NR_sched_get_priority_min 160
+#define __NR_sched_rr_get_interval 161
+#define __NR_nanosleep 162
+#define __NR_mremap 163
+#define __NR_setresuid 164
+#define __NR_getresuid 165
+#define __NR_vm86 166
+#define __NR_query_module 167
+#define __NR_poll 168
+#define __NR_nfsservctl 169
+#define __NR_setresgid 170
+#define __NR_getresgid 171
+#define __NR_prctl 172
+#define __NR_rt_sigreturn 173
+#define __NR_rt_sigaction 174
+#define __NR_rt_sigprocmask 175
+#define __NR_rt_sigpending 176
+#define __NR_rt_sigtimedwait 177
+#define __NR_rt_sigqueueinfo 178
+#define __NR_rt_sigsuspend 179
+#define __NR_pread64 180
+#define __NR_pwrite64 181
+#define __NR_chown 182
+#define __NR_getcwd 183
+#define __NR_capget 184
+#define __NR_capset 185
+#define __NR_sigaltstack 186
+#define __NR_sendfile 187
+#define __NR_getpmsg 188
+#define __NR_putpmsg 189
+#define __NR_vfork 190
+#define __NR_ugetrlimit 191
+#define __NR_mmap2 192
+#define __NR_truncate64 193
+#define __NR_ftruncate64 194
+#define __NR_stat64 195
+#define __NR_lstat64 196
+#define __NR_fstat64 197
+#define __NR_lchown32 198
+#define __NR_getuid32 199
+#define __NR_getgid32 200
+#define __NR_geteuid32 201
+#define __NR_getegid32 202
+#define __NR_setreuid32 203
+#define __NR_setregid32 204
+#define __NR_getgroups32 205
+#define __NR_setgroups32 206
+#define __NR_fchown32 207
+#define __NR_setresuid32 208
+#define __NR_getresuid32 209
+#define __NR_setresgid32 210
+#define __NR_getresgid32 211
+#define __NR_chown32 212
+#define __NR_setuid32 213
+#define __NR_setgid32 214
+#define __NR_setfsuid32 215
+#define __NR_setfsgid32 216
+#define __NR_pivot_root 217
+#define __NR_mincore 218
+#define __NR_madvise 219
+#define __NR_getdents64 220
+#define __NR_fcntl64 221
+/* 223 is unused */
+#define __NR_gettid 224
+#define __NR_readahead 225
+#define __NR_setxattr 226
+#define __NR_lsetxattr 227
+#define __NR_fsetxattr 228
+#define __NR_getxattr 229
+#define __NR_lgetxattr 230
+#define __NR_fgetxattr 231
+#define __NR_listxattr 232
+#define __NR_llistxattr 233
+#define __NR_flistxattr 234
+#define __NR_removexattr 235
+#define __NR_lremovexattr 236
+#define __NR_fremovexattr 237
+#define __NR_tkill 238
+#define __NR_sendfile64 239
+#define __NR_futex 240
+#define __NR_sched_setaffinity 241
+#define __NR_sched_getaffinity 242
+#define __NR_set_thread_area 243
+#define __NR_get_thread_area 244
+#define __NR_io_setup 245
+#define __NR_io_destroy 246
+#define __NR_io_getevents 247
+#define __NR_io_submit 248
+#define __NR_io_cancel 249
+#define __NR_fadvise64 250
+/* 251 is available for reuse (was briefly sys_set_zone_reclaim) */
+#define __NR_exit_group 252
+#define __NR_lookup_dcookie 253
+#define __NR_epoll_create 254
+#define __NR_epoll_ctl 255
+#define __NR_epoll_wait 256
+#define __NR_remap_file_pages 257
+#define __NR_set_tid_address 258
+#define __NR_timer_create 259
+#define __NR_timer_settime32 (__NR_timer_create+1)
+#define __NR_timer_gettime32 (__NR_timer_create+2)
+#define __NR_timer_getoverrun (__NR_timer_create+3)
+#define __NR_timer_delete (__NR_timer_create+4)
+#define __NR_clock_settime32 (__NR_timer_create+5)
+#define __NR_clock_gettime32 (__NR_timer_create+6)
+#define __NR_clock_getres_time32 (__NR_timer_create+7)
+#define __NR_clock_nanosleep_time32 (__NR_timer_create+8)
+#define __NR_statfs64 268
+#define __NR_fstatfs64 269
+#define __NR_tgkill 270
+#define __NR_utimes 271
+#define __NR_fadvise64_64 272
+#define __NR_vserver 273
+#define __NR_mbind 274
+#define __NR_get_mempolicy 275
+#define __NR_set_mempolicy 276
+#define __NR_mq_open 277
+#define __NR_mq_unlink (__NR_mq_open+1)
+#define __NR_mq_timedsend (__NR_mq_open+2)
+#define __NR_mq_timedreceive (__NR_mq_open+3)
+#define __NR_mq_notify (__NR_mq_open+4)
+#define __NR_mq_getsetattr (__NR_mq_open+5)
+#define __NR_kexec_load 283
+#define __NR_waitid 284
+/* #define __NR_sys_setaltroot 285 */
+#define __NR_add_key 286
+#define __NR_request_key 287
+#define __NR_keyctl 288
+#define __NR_ioprio_set 289
+#define __NR_ioprio_get 290
+#define __NR_inotify_init 291
+#define __NR_inotify_add_watch 292
+#define __NR_inotify_rm_watch 293
+#define __NR_migrate_pages 294
+#define __NR_openat 295
+#define __NR_mkdirat 296
+#define __NR_mknodat 297
+#define __NR_fchownat 298
+#define __NR_futimesat 299
+#define __NR_fstatat64 300
+#define __NR_unlinkat 301
+#define __NR_renameat 302
+#define __NR_linkat 303
+#define __NR_symlinkat 304
+#define __NR_readlinkat 305
+#define __NR_fchmodat 306
+#define __NR_faccessat 307
+#define __NR_pselect6 308
+#define __NR_ppoll 309
+#define __NR_unshare 310
+#define __NR_set_robust_list 311
+#define __NR_get_robust_list 312
+#define __NR_splice 313
+#define __NR_sync_file_range 314
+#define __NR_tee 315
+#define __NR_vmsplice 316
+#define __NR_move_pages 317
+#define __NR_getcpu 318
+#define __NR_epoll_pwait 319
+#define __NR_utimensat 320
+#define __NR_signalfd 321
+#define __NR_timerfd_create 322
+#define __NR_eventfd 323
+#define __NR_fallocate 324
+#define __NR_timerfd_settime32 325
+#define __NR_timerfd_gettime32 326
+#define __NR_signalfd4 327
+#define __NR_eventfd2 328
+#define __NR_epoll_create1 329
+#define __NR_dup3 330
+#define __NR_pipe2 331
+#define __NR_inotify_init1 332
+#define __NR_preadv 333
+#define __NR_pwritev 334
+#define __NR_rt_tgsigqueueinfo 335
+#define __NR_perf_event_open 336
+#define __NR_recvmmsg 337
+#define __NR_fanotify_init 338
+#define __NR_fanotify_mark 339
+#define __NR_prlimit64 340
+#define __NR_name_to_handle_at 341
+#define __NR_open_by_handle_at 342
+#define __NR_clock_adjtime 343
+#define __NR_syncfs 344
+#define __NR_sendmmsg 345
+#define __NR_setns 346
+#define __NR_process_vm_readv 347
+#define __NR_process_vm_writev 348
+#define __NR_kcmp 349
+#define __NR_finit_module 350
+#define __NR_sched_setattr 351
+#define __NR_sched_getattr 352
+#define __NR_renameat2 353
+#define __NR_seccomp 354
+#define __NR_getrandom 355
+#define __NR_memfd_create 356
+#define __NR_bpf 357
+#define __NR_execveat 358
+#define __NR_socket 359
+#define __NR_socketpair 360
+#define __NR_bind 361
+#define __NR_connect 362
+#define __NR_listen 363
+#define __NR_accept4 364
+#define __NR_getsockopt 365
+#define __NR_setsockopt 366
+#define __NR_getsockname 367
+#define __NR_getpeername 368
+#define __NR_sendto 369
+#define __NR_sendmsg 370
+#define __NR_recvfrom 371
+#define __NR_recvmsg 372
+#define __NR_shutdown 373
+#define __NR_userfaultfd 374
+#define __NR_membarrier 375
+#define __NR_mlock2 376
+#define __NR_copy_file_range 377
+#define __NR_preadv2 378
+#define __NR_pwritev2 379
+#define __NR_pkey_mprotect 380
+#define __NR_pkey_alloc 381
+#define __NR_pkey_free 382
+#define __NR_statx 383
+#define __NR_arch_prctl 384
+#define __NR_io_pgetevents 385
+#define __NR_rseq 386
+#define __NR_semget 393
+#define __NR_semctl 394
+#define __NR_shmget 395
+#define __NR_shmctl 396
+#define __NR_shmat 397
+#define __NR_shmdt 398
+#define __NR_msgget 399
+#define __NR_msgsnd 400
+#define __NR_msgrcv 401
+#define __NR_msgctl 402
+#define __NR_clock_gettime64 403
+#define __NR_clock_settime64 404
+#define __NR_clock_adjtime64 405
+#define __NR_clock_getres_time64 406
+#define __NR_clock_nanosleep_time64 407
+#define __NR_timer_gettime64 408
+#define __NR_timer_settime64 409
+#define __NR_timerfd_gettime64 410
+#define __NR_timerfd_settime64 411
+#define __NR_utimensat_time64 412
+#define __NR_pselect6_time64 413
+#define __NR_ppoll_time64 414
+#define __NR_io_pgetevents_time64 416
+#define __NR_recvmmsg_time64 417
+#define __NR_mq_timedsend_time64 418
+#define __NR_mq_timedreceive_time64 419
+#define __NR_semtimedop_time64 420
+#define __NR_rt_sigtimedwait_time64 421
+#define __NR_futex_time64 422
+#define __NR_sched_rr_get_interval_time64 423
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_clone3 435
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_epoll_pwait2 441
+#define __NR_mount_setattr 442
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_restrict_self 446
+
diff --git a/libc-top-half/musl/arch/i386/bits/user.h b/libc-top-half/musl/arch/i386/bits/user.h
new file mode 100644
index 0000000..33fea98
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/bits/user.h
@@ -0,0 +1,44 @@
+#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 (~(PAGESIZE-1))
+#define NBPG PAGESIZE
+#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/libc-top-half/musl/arch/i386/crt_arch.h b/libc-top-half/musl/arch/i386/crt_arch.h
new file mode 100644
index 0000000..43c8477
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/crt_arch.h
@@ -0,0 +1,16 @@
+__asm__(
+".text\n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+".global " START "\n"
+START ":\n"
+" xor %ebp,%ebp \n"
+" mov %esp,%eax \n"
+" and $-16,%esp \n"
+" push %eax \n"
+" push %eax \n"
+" call 1f \n"
+"1: addl $_DYNAMIC-1b,(%esp) \n"
+" push %eax \n"
+" call " START "_c \n"
+);
diff --git a/libc-top-half/musl/arch/i386/kstat.h b/libc-top-half/musl/arch/i386/kstat.h
new file mode 100644
index 0000000..af449c9
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/kstat.h
@@ -0,0 +1,21 @@
+struct kstat {
+ dev_t st_dev;
+ int __st_dev_padding;
+ long __st_ino_truncated;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ int __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ ino_t st_ino;
+};
diff --git a/libc-top-half/musl/arch/i386/pthread_arch.h b/libc-top-half/musl/arch/i386/pthread_arch.h
new file mode 100644
index 0000000..a639c38
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/pthread_arch.h
@@ -0,0 +1,8 @@
+static inline uintptr_t __get_tp()
+{
+ uintptr_t tp;
+ __asm__ ("movl %%gs:0,%0" : "=r" (tp) );
+ return tp;
+}
+
+#define MC_PC gregs[REG_EIP]
diff --git a/libc-top-half/musl/arch/i386/reloc.h b/libc-top-half/musl/arch/i386/reloc.h
new file mode 100644
index 0000000..032f454
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/reloc.h
@@ -0,0 +1,23 @@
+#define LDSO_ARCH "i386"
+
+#define REL_SYMBOLIC R_386_32
+#define REL_OFFSET R_386_PC32
+#define REL_GOT R_386_GLOB_DAT
+#define REL_PLT R_386_JMP_SLOT
+#define REL_RELATIVE R_386_RELATIVE
+#define REL_COPY R_386_COPY
+#define REL_DTPMOD R_386_TLS_DTPMOD32
+#define REL_DTPOFF R_386_TLS_DTPOFF32
+#define REL_TPOFF R_386_TLS_TPOFF
+#define REL_TPOFF_NEG R_386_TLS_TPOFF32
+#define REL_TLSDESC R_386_TLS_DESC
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "mov %1,%%esp ; jmp *%0" : : "r"(pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+ ".hidden " #sym "\n" \
+ " call 1f\n" \
+ "1: addl $" #sym "-.,(%%esp)\n" \
+ " pop %0" \
+ : "=r"(*fp) : : "memory" )
diff --git a/libc-top-half/musl/arch/i386/syscall_arch.h b/libc-top-half/musl/arch/i386/syscall_arch.h
new file mode 100644
index 0000000..f92b7aa
--- /dev/null
+++ b/libc-top-half/musl/arch/i386/syscall_arch.h
@@ -0,0 +1,89 @@
+#define __SYSCALL_LL_E(x) \
+((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
+((union { long long ll; long l[2]; }){ .ll = x }).l[1]
+#define __SYSCALL_LL_O(x) __SYSCALL_LL_E((x))
+
+#if SYSCALL_NO_TLS
+#define SYSCALL_INSNS "int $128"
+#else
+#define SYSCALL_INSNS "call *%%gs:16"
+#endif
+
+#define SYSCALL_INSNS_12 "xchg %%ebx,%%edx ; " SYSCALL_INSNS " ; xchg %%ebx,%%edx"
+#define SYSCALL_INSNS_34 "xchg %%ebx,%%edi ; " SYSCALL_INSNS " ; xchg %%ebx,%%edi"
+
+static inline long __syscall0(long n)
+{
+ unsigned long __ret;
+ __asm__ __volatile__ (SYSCALL_INSNS : "=a"(__ret) : "a"(n) : "memory");
+ return __ret;
+}
+
+static inline long __syscall1(long n, long a1)
+{
+ unsigned long __ret;
+ __asm__ __volatile__ (SYSCALL_INSNS_12 : "=a"(__ret) : "a"(n), "d"(a1) : "memory");
+ return __ret;
+}
+
+static inline long __syscall2(long n, long a1, long a2)
+{
+ unsigned long __ret;
+ __asm__ __volatile__ (SYSCALL_INSNS_12 : "=a"(__ret) : "a"(n), "d"(a1), "c"(a2) : "memory");
+ return __ret;
+}
+
+static inline long __syscall3(long n, long a1, long a2, long a3)
+{
+ unsigned long __ret;
+#if !defined(__PIC__) || !defined(BROKEN_EBX_ASM)
+ __asm__ __volatile__ (SYSCALL_INSNS : "=a"(__ret) : "a"(n), "b"(a1), "c"(a2), "d"(a3) : "memory");
+#else
+ __asm__ __volatile__ (SYSCALL_INSNS_34 : "=a"(__ret) : "a"(n), "D"(a1), "c"(a2), "d"(a3) : "memory");
+#endif
+ return __ret;
+}
+
+static inline long __syscall4(long n, long a1, long a2, long a3, long a4)
+{
+ unsigned long __ret;
+#if !defined(__PIC__) || !defined(BROKEN_EBX_ASM)
+ __asm__ __volatile__ (SYSCALL_INSNS : "=a"(__ret) : "a"(n), "b"(a1), "c"(a2), "d"(a3), "S"(a4) : "memory");
+#else
+ __asm__ __volatile__ (SYSCALL_INSNS_34 : "=a"(__ret) : "a"(n), "D"(a1), "c"(a2), "d"(a3), "S"(a4) : "memory");
+#endif
+ return __ret;
+}
+
+static inline long __syscall5(long n, long a1, long a2, long a3, long a4, long a5)
+{
+ unsigned long __ret;
+#if !defined(__PIC__) || !defined(BROKEN_EBX_ASM)
+ __asm__ __volatile__ (SYSCALL_INSNS
+ : "=a"(__ret) : "a"(n), "b"(a1), "c"(a2), "d"(a3), "S"(a4), "D"(a5) : "memory");
+#else
+ __asm__ __volatile__ ("pushl %2 ; push %%ebx ; mov 4(%%esp),%%ebx ; " SYSCALL_INSNS " ; pop %%ebx ; add $4,%%esp"
+ : "=a"(__ret) : "a"(n), "g"(a1), "c"(a2), "d"(a3), "S"(a4), "D"(a5) : "memory");
+#endif
+ return __ret;
+}
+
+static inline long __syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6)
+{
+ unsigned long __ret;
+#if !defined(__PIC__) || !defined(BROKEN_EBX_ASM)
+ __asm__ __volatile__ ("pushl %7 ; push %%ebp ; mov 4(%%esp),%%ebp ; " SYSCALL_INSNS " ; pop %%ebp ; add $4,%%esp"
+ : "=a"(__ret) : "a"(n), "b"(a1), "c"(a2), "d"(a3), "S"(a4), "D"(a5), "g"(a6) : "memory");
+#else
+ unsigned long a1a6[2] = { a1, a6 };
+ __asm__ __volatile__ ("pushl %1 ; push %%ebx ; push %%ebp ; mov 8(%%esp),%%ebx ; mov 4(%%ebx),%%ebp ; mov (%%ebx),%%ebx ; " SYSCALL_INSNS " ; pop %%ebp ; pop %%ebx ; add $4,%%esp"
+ : "=a"(__ret) : "g"(&a1a6), "a"(n), "c"(a2), "d"(a3), "S"(a4), "D"(a5) : "memory");
+#endif
+ return __ret;
+}
+
+#define VDSO_USEFUL
+#define VDSO_CGT32_SYM "__vdso_clock_gettime"
+#define VDSO_CGT32_VER "LINUX_2.6"
+#define VDSO_CGT_SYM "__vdso_clock_gettime64"
+#define VDSO_CGT_VER "LINUX_2.6"
diff --git a/libc-top-half/musl/arch/m68k/arch.mak b/libc-top-half/musl/arch/m68k/arch.mak
new file mode 100644
index 0000000..aa4d05c
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/arch.mak
@@ -0,0 +1 @@
+COMPAT_SRC_DIRS = compat/time32
diff --git a/libc-top-half/musl/arch/m68k/atomic_arch.h b/libc-top-half/musl/arch/m68k/atomic_arch.h
new file mode 100644
index 0000000..b369649
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/atomic_arch.h
@@ -0,0 +1,8 @@
+#define a_cas a_cas
+static inline int a_cas(volatile int *p, int t, int s)
+{
+ __asm__ __volatile__ (
+ "cas.l %0, %2, (%1)"
+ : "+d"(t) : "a"(p), "d"(s) : "memory", "cc");
+ return t;
+}
diff --git a/libc-top-half/musl/arch/m68k/bits/alltypes.h.in b/libc-top-half/musl/arch/m68k/bits/alltypes.h.in
new file mode 100644
index 0000000..f564690
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/alltypes.h.in
@@ -0,0 +1,25 @@
+#define _REDIR_TIME64 1
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+#define __BYTE_ORDER 4321
+#define __LONG_MAX 0x7fffffffL
+
+#ifndef __cplusplus
+#ifdef __WCHAR_TYPE__
+TYPEDEF __WCHAR_TYPE__ wchar_t;
+#else
+TYPEDEF long wchar_t;
+#endif
+#endif
+
+#if __mcffpu__
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+#else
+TYPEDEF long double float_t;
+TYPEDEF long double double_t;
+#endif
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/m68k/bits/fcntl.h b/libc-top-half/musl/arch/m68k/bits/fcntl.h
new file mode 100644
index 0000000..f1c8400
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/fcntl.h
@@ -0,0 +1,40 @@
+#define O_CREAT 0100
+#define O_EXCL 0200
+#define O_NOCTTY 0400
+#define O_TRUNC 01000
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_DSYNC 010000
+#define O_SYNC 04010000
+#define O_RSYNC 04010000
+#define O_DIRECTORY 040000
+#define O_NOFOLLOW 0100000
+#define O_CLOEXEC 02000000
+
+#define O_ASYNC 020000
+#define O_DIRECT 0200000
+#define O_LARGEFILE 0400000
+#define O_NOATIME 01000000
+#define O_PATH 010000000
+#define O_TMPFILE 020200000
+#define O_NDELAY O_NONBLOCK
+
+#define F_DUPFD 0
+#define F_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+
+#define F_SETOWN 8
+#define F_GETOWN 9
+#define F_SETSIG 10
+#define F_GETSIG 11
+
+#define F_GETLK 12
+#define F_SETLK 13
+#define F_SETLKW 14
+
+#define F_SETOWN_EX 15
+#define F_GETOWN_EX 16
+
+#define F_GETOWNER_UIDS 17
diff --git a/libc-top-half/musl/arch/m68k/bits/fenv.h b/libc-top-half/musl/arch/m68k/bits/fenv.h
new file mode 100644
index 0000000..c90a4a5
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/fenv.h
@@ -0,0 +1,29 @@
+#if __HAVE_68881__ || __mcffpu__
+
+#define FE_INEXACT 8
+#define FE_DIVBYZERO 16
+#define FE_UNDERFLOW 32
+#define FE_OVERFLOW 64
+#define FE_INVALID 128
+
+#define FE_ALL_EXCEPT 0xf8
+
+#define FE_TONEAREST 0
+#define FE_TOWARDZERO 16
+#define FE_DOWNWARD 32
+#define FE_UPWARD 48
+
+#else
+
+#define FE_ALL_EXCEPT 0
+#define FE_TONEAREST 0
+
+#endif
+
+typedef unsigned fexcept_t;
+
+typedef struct {
+ unsigned __control_register, __status_register, __instruction_address;
+} fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *) -1)
diff --git a/libc-top-half/musl/arch/m68k/bits/float.h b/libc-top-half/musl/arch/m68k/bits/float.h
new file mode 100644
index 0000000..0e6899d
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/float.h
@@ -0,0 +1,39 @@
+#if !__mcffpu__
+
+#define FLT_EVAL_METHOD 2
+
+#define LDBL_TRUE_MIN 3.6451995318824746025e-4951L
+#define LDBL_MIN 1.68105157155604675313e-4932L
+#define LDBL_MAX 1.1897314953572317650e+4932L
+#define LDBL_EPSILON 1.0842021724855044340e-19L
+
+#define LDBL_MANT_DIG 64
+#define LDBL_MIN_EXP (-16382)
+#define LDBL_MAX_EXP 16384
+
+#define LDBL_DIG 18
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MAX_10_EXP 4932
+
+#define DECIMAL_DIG 21
+
+#else
+
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 4.94065645841246544177e-324L
+#define LDBL_MIN 2.22507385850720138309e-308L
+#define LDBL_MAX 1.79769313486231570815e+308L
+#define LDBL_EPSILON 2.22044604925031308085e-16L
+
+#define LDBL_MANT_DIG 53
+#define LDBL_MIN_EXP (-1021)
+#define LDBL_MAX_EXP 1024
+
+#define LDBL_DIG 15
+#define LDBL_MIN_10_EXP (-307)
+#define LDBL_MAX_10_EXP 308
+
+#define DECIMAL_DIG 17
+
+#endif
diff --git a/libc-top-half/musl/arch/m68k/bits/ipcstat.h b/libc-top-half/musl/arch/m68k/bits/ipcstat.h
new file mode 100644
index 0000000..4f4fcb0
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/ipcstat.h
@@ -0,0 +1 @@
+#define IPC_STAT 0x102
diff --git a/libc-top-half/musl/arch/m68k/bits/msg.h b/libc-top-half/musl/arch/m68k/bits/msg.h
new file mode 100644
index 0000000..7bbbb2b
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/msg.h
@@ -0,0 +1,18 @@
+struct msqid_ds {
+ struct ipc_perm msg_perm;
+ unsigned long __msg_stime_lo;
+ unsigned long __msg_stime_hi;
+ unsigned long __msg_rtime_lo;
+ unsigned long __msg_rtime_hi;
+ unsigned long __msg_ctime_lo;
+ unsigned long __msg_ctime_hi;
+ unsigned long msg_cbytes;
+ msgqnum_t msg_qnum;
+ msglen_t msg_qbytes;
+ pid_t msg_lspid;
+ pid_t msg_lrpid;
+ unsigned long __unused[2];
+ time_t msg_stime;
+ time_t msg_rtime;
+ time_t msg_ctime;
+};
diff --git a/libc-top-half/musl/arch/m68k/bits/posix.h b/libc-top-half/musl/arch/m68k/bits/posix.h
new file mode 100644
index 0000000..30a3871
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_ILP32_OFFBIG 1
+#define _POSIX_V7_ILP32_OFFBIG 1
diff --git a/libc-top-half/musl/arch/m68k/bits/ptrace.h b/libc-top-half/musl/arch/m68k/bits/ptrace.h
new file mode 100644
index 0000000..da93e7a
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/ptrace.h
@@ -0,0 +1,2 @@
+#define PTRACE_GET_THREAD_AREA 25
+#define PTRACE_SINGLEBLOCK 33
diff --git a/libc-top-half/musl/arch/m68k/bits/reg.h b/libc-top-half/musl/arch/m68k/bits/reg.h
new file mode 100644
index 0000000..99201f7
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/reg.h
@@ -0,0 +1,45 @@
+#undef __WORDSIZE
+#define __WORDSIZE 32
+#define PT_D1 0
+#define PT_D2 1
+#define PT_D3 2
+#define PT_D4 3
+#define PT_D5 4
+#define PT_D6 5
+#define PT_D7 6
+#define PT_A0 7
+#define PT_A1 8
+#define PT_A2 9
+#define PT_A3 10
+#define PT_A4 11
+#define PT_A5 12
+#define PT_A6 13
+#define PT_D0 14
+#define PT_USP 15
+#define PT_ORIG_D0 16
+#define PT_SR 17
+#define PT_PC 18
+
+#if __mcffpu__
+#define PT_FP0 21
+#define PT_FP1 23
+#define PT_FP2 25
+#define PT_FP3 27
+#define PT_FP4 29
+#define PT_FP5 31
+#define PT_FP6 33
+#define PT_FP7 35
+#else
+#define PT_FP0 21
+#define PT_FP1 24
+#define PT_FP2 27
+#define PT_FP3 30
+#define PT_FP4 33
+#define PT_FP5 36
+#define PT_FP6 39
+#define PT_FP7 42
+#endif
+
+#define PT_FPCR 45
+#define PT_FPSR 46
+#define PT_FPIAR 47
diff --git a/libc-top-half/musl/arch/m68k/bits/sem.h b/libc-top-half/musl/arch/m68k/bits/sem.h
new file mode 100644
index 0000000..d88338e
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/sem.h
@@ -0,0 +1,13 @@
+struct semid_ds {
+ struct ipc_perm sem_perm;
+ unsigned long __sem_otime_lo;
+ unsigned long __sem_otime_hi;
+ unsigned long __sem_ctime_lo;
+ unsigned long __sem_ctime_hi;
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+ unsigned short sem_nsems;
+ long __unused3;
+ long __unused4;
+ time_t sem_otime;
+ time_t sem_ctime;
+};
diff --git a/libc-top-half/musl/arch/m68k/bits/setjmp.h b/libc-top-half/musl/arch/m68k/bits/setjmp.h
new file mode 100644
index 0000000..5e091fb
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long __jmp_buf[39];
diff --git a/libc-top-half/musl/arch/m68k/bits/shm.h b/libc-top-half/musl/arch/m68k/bits/shm.h
new file mode 100644
index 0000000..725fb46
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/shm.h
@@ -0,0 +1,31 @@
+#define SHMLBA 4096
+
+struct shmid_ds {
+ struct ipc_perm shm_perm;
+ size_t shm_segsz;
+ unsigned long __shm_atime_lo;
+ unsigned long __shm_atime_hi;
+ unsigned long __shm_dtime_lo;
+ unsigned long __shm_dtime_hi;
+ unsigned long __shm_ctime_lo;
+ unsigned long __shm_ctime_hi;
+ pid_t shm_cpid;
+ pid_t shm_lpid;
+ unsigned long shm_nattch;
+ unsigned long __pad1;
+ unsigned long __pad2;
+ unsigned long __pad3;
+ time_t shm_atime;
+ time_t shm_dtime;
+ time_t shm_ctime;
+};
+
+struct shminfo {
+ unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+};
+
+struct shm_info {
+ int __used_ids;
+ unsigned long shm_tot, shm_rss, shm_swp;
+ unsigned long __swap_attempts, __swap_successes;
+};
diff --git a/libc-top-half/musl/arch/m68k/bits/signal.h b/libc-top-half/musl/arch/m68k/bits/signal.h
new file mode 100644
index 0000000..2c369ca
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/signal.h
@@ -0,0 +1,140 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
+#ifdef _GNU_SOURCE
+enum { R_D0 = 0 };
+#define R_D0 R_D0
+enum { R_D1 = 1 };
+#define R_D1 R_D1
+enum { R_D2 = 2 };
+#define R_D2 R_D2
+enum { R_D3 = 3 };
+#define R_D3 R_D3
+enum { R_D4 = 4 };
+#define R_D4 R_D4
+enum { R_D5 = 5 };
+#define R_D5 R_D5
+enum { R_D6 = 6 };
+#define R_D6 R_D6
+enum { R_D7 = 7 };
+#define R_D7 R_D7
+enum { R_A0 = 8 };
+#define R_A0 R_A0
+enum { R_A1 = 9 };
+#define R_A1 R_A1
+enum { R_A2 = 10 };
+#define R_A2 R_A2
+enum { R_A3 = 11 };
+#define R_A3 R_A3
+enum { R_A4 = 12 };
+#define R_A4 R_A4
+enum { R_A5 = 13 };
+#define R_A5 R_A5
+enum { R_A6 = 14 };
+#define R_A6 R_A6
+enum { R_A7 = 15 };
+#define R_A7 R_A7
+enum { R_SP = 15 };
+#define R_SP R_SP
+enum { R_PC = 16 };
+#define R_PC R_PC
+enum { R_PS = 17 };
+#define R_PS R_PS
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+struct sigcontext {
+ unsigned long sc_mask, sc_usp, sc_d0, sc_d1, sc_a0, sc_a1;
+ unsigned short sc_sr;
+ unsigned long sc_pc;
+ unsigned short sc_formatvec;
+ unsigned long sc_fpregs[6], sc_fpcntl[3];
+ unsigned char sc_fpstate[216];
+};
+
+typedef int greg_t, gregset_t[18];
+typedef struct {
+ int f_pcr, f_psr, f_fpiaddr, f_fpregs[8][3];
+} fpregset_t;
+
+typedef struct {
+ int version;
+ gregset_t gregs;
+ fpregset_t fpregs;
+} mcontext_t;
+#else
+typedef struct {
+ int __version;
+ int __gregs[18];
+ int __fpregs[27];
+} 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;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ long __reserved[80];
+ sigset_t uc_sigmask;
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 2
+#define SA_SIGINFO 4
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL 29
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
diff --git a/libc-top-half/musl/arch/m68k/bits/stat.h b/libc-top-half/musl/arch/m68k/bits/stat.h
new file mode 100644
index 0000000..f876814
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/stat.h
@@ -0,0 +1,25 @@
+/* copied from kernel definition, but with padding replaced
+ * by the corresponding correctly-sized userspace types. */
+
+struct stat {
+ dev_t st_dev;
+ short __st_dev_padding;
+ long __st_ino_truncated;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ short __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ struct {
+ long tv_sec;
+ long tv_nsec;
+ } __st_atim32, __st_mtim32, __st_ctim32;
+ ino_t st_ino;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+};
diff --git a/libc-top-half/musl/arch/m68k/bits/stdint.h b/libc-top-half/musl/arch/m68k/bits/stdint.h
new file mode 100644
index 0000000..d1b2712
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#define SIZE_MAX UINT32_MAX
diff --git a/libc-top-half/musl/arch/m68k/bits/syscall.h.in b/libc-top-half/musl/arch/m68k/bits/syscall.h.in
new file mode 100644
index 0000000..a0c6332
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/syscall.h.in
@@ -0,0 +1,418 @@
+#define __NR_restart_syscall 0
+#define __NR_exit 1
+#define __NR_fork 2
+#define __NR_read 3
+#define __NR_write 4
+#define __NR_open 5
+#define __NR_close 6
+#define __NR_waitpid 7
+#define __NR_creat 8
+#define __NR_link 9
+#define __NR_unlink 10
+#define __NR_execve 11
+#define __NR_chdir 12
+#define __NR_time 13
+#define __NR_mknod 14
+#define __NR_chmod 15
+#define __NR_chown 16
+#define __NR_oldstat 18
+#define __NR_lseek 19
+#define __NR_getpid 20
+#define __NR_mount 21
+#define __NR_umount 22
+#define __NR_setuid 23
+#define __NR_getuid 24
+#define __NR_stime 25
+#define __NR_ptrace 26
+#define __NR_alarm 27
+#define __NR_oldfstat 28
+#define __NR_pause 29
+#define __NR_utime 30
+#define __NR_access 33
+#define __NR_nice 34
+#define __NR_sync 36
+#define __NR_kill 37
+#define __NR_rename 38
+#define __NR_mkdir 39
+#define __NR_rmdir 40
+#define __NR_dup 41
+#define __NR_pipe 42
+#define __NR_times 43
+#define __NR_brk 45
+#define __NR_setgid 46
+#define __NR_getgid 47
+#define __NR_signal 48
+#define __NR_geteuid 49
+#define __NR_getegid 50
+#define __NR_acct 51
+#define __NR_umount2 52
+#define __NR_ioctl 54
+#define __NR_fcntl 55
+#define __NR_setpgid 57
+#define __NR_umask 60
+#define __NR_chroot 61
+#define __NR_ustat 62
+#define __NR_dup2 63
+#define __NR_getppid 64
+#define __NR_getpgrp 65
+#define __NR_setsid 66
+#define __NR_sigaction 67
+#define __NR_sgetmask 68
+#define __NR_ssetmask 69
+#define __NR_setreuid 70
+#define __NR_setregid 71
+#define __NR_sigsuspend 72
+#define __NR_sigpending 73
+#define __NR_sethostname 74
+#define __NR_setrlimit 75
+#define __NR_getrlimit 76
+#define __NR_getrusage 77
+#define __NR_gettimeofday_time32 78
+#define __NR_settimeofday_time32 79
+#define __NR_getgroups 80
+#define __NR_setgroups 81
+#define __NR_select 82
+#define __NR_symlink 83
+#define __NR_oldlstat 84
+#define __NR_readlink 85
+#define __NR_uselib 86
+#define __NR_swapon 87
+#define __NR_reboot 88
+#define __NR_readdir 89
+#define __NR_mmap 90
+#define __NR_munmap 91
+#define __NR_truncate 92
+#define __NR_ftruncate 93
+#define __NR_fchmod 94
+#define __NR_fchown 95
+#define __NR_getpriority 96
+#define __NR_setpriority 97
+#define __NR_statfs 99
+#define __NR_fstatfs 100
+#define __NR_socketcall 102
+#define __NR_syslog 103
+#define __NR_setitimer 104
+#define __NR_getitimer 105
+#define __NR_stat 106
+#define __NR_lstat 107
+#define __NR_fstat 108
+#define __NR_vhangup 111
+#define __NR_wait4 114
+#define __NR_swapoff 115
+#define __NR_sysinfo 116
+#define __NR_ipc 117
+#define __NR_fsync 118
+#define __NR_sigreturn 119
+#define __NR_clone 120
+#define __NR_setdomainname 121
+#define __NR_uname 122
+#define __NR_cacheflush 123
+#define __NR_adjtimex 124
+#define __NR_mprotect 125
+#define __NR_sigprocmask 126
+#define __NR_create_module 127
+#define __NR_init_module 128
+#define __NR_delete_module 129
+#define __NR_get_kernel_syms 130
+#define __NR_quotactl 131
+#define __NR_getpgid 132
+#define __NR_fchdir 133
+#define __NR_bdflush 134
+#define __NR_sysfs 135
+#define __NR_personality 136
+#define __NR_setfsuid 138
+#define __NR_setfsgid 139
+#define __NR__llseek 140
+#define __NR_getdents 141
+#define __NR__newselect 142
+#define __NR_flock 143
+#define __NR_msync 144
+#define __NR_readv 145
+#define __NR_writev 146
+#define __NR_getsid 147
+#define __NR_fdatasync 148
+#define __NR__sysctl 149
+#define __NR_mlock 150
+#define __NR_munlock 151
+#define __NR_mlockall 152
+#define __NR_munlockall 153
+#define __NR_sched_setparam 154
+#define __NR_sched_getparam 155
+#define __NR_sched_setscheduler 156
+#define __NR_sched_getscheduler 157
+#define __NR_sched_yield 158
+#define __NR_sched_get_priority_max 159
+#define __NR_sched_get_priority_min 160
+#define __NR_sched_rr_get_interval 161
+#define __NR_nanosleep 162
+#define __NR_mremap 163
+#define __NR_setresuid 164
+#define __NR_getresuid 165
+#define __NR_getpagesize 166
+#define __NR_query_module 167
+#define __NR_poll 168
+#define __NR_nfsservctl 169
+#define __NR_setresgid 170
+#define __NR_getresgid 171
+#define __NR_prctl 172
+#define __NR_rt_sigreturn 173
+#define __NR_rt_sigaction 174
+#define __NR_rt_sigprocmask 175
+#define __NR_rt_sigpending 176
+#define __NR_rt_sigtimedwait 177
+#define __NR_rt_sigqueueinfo 178
+#define __NR_rt_sigsuspend 179
+#define __NR_pread64 180
+#define __NR_pwrite64 181
+#define __NR_lchown 182
+#define __NR_getcwd 183
+#define __NR_capget 184
+#define __NR_capset 185
+#define __NR_sigaltstack 186
+#define __NR_sendfile 187
+#define __NR_getpmsg 188
+#define __NR_putpmsg 189
+#define __NR_vfork 190
+#define __NR_ugetrlimit 191
+#define __NR_mmap2 192
+#define __NR_truncate64 193
+#define __NR_ftruncate64 194
+#define __NR_stat64 195
+#define __NR_lstat64 196
+#define __NR_fstat64 197
+#define __NR_chown32 198
+#define __NR_getuid32 199
+#define __NR_getgid32 200
+#define __NR_geteuid32 201
+#define __NR_getegid32 202
+#define __NR_setreuid32 203
+#define __NR_setregid32 204
+#define __NR_getgroups32 205
+#define __NR_setgroups32 206
+#define __NR_fchown32 207
+#define __NR_setresuid32 208
+#define __NR_getresuid32 209
+#define __NR_setresgid32 210
+#define __NR_getresgid32 211
+#define __NR_lchown32 212
+#define __NR_setuid32 213
+#define __NR_setgid32 214
+#define __NR_setfsuid32 215
+#define __NR_setfsgid32 216
+#define __NR_pivot_root 217
+#define __NR_getdents64 220
+#define __NR_gettid 221
+#define __NR_tkill 222
+#define __NR_setxattr 223
+#define __NR_lsetxattr 224
+#define __NR_fsetxattr 225
+#define __NR_getxattr 226
+#define __NR_lgetxattr 227
+#define __NR_fgetxattr 228
+#define __NR_listxattr 229
+#define __NR_llistxattr 230
+#define __NR_flistxattr 231
+#define __NR_removexattr 232
+#define __NR_lremovexattr 233
+#define __NR_fremovexattr 234
+#define __NR_futex 235
+#define __NR_sendfile64 236
+#define __NR_mincore 237
+#define __NR_madvise 238
+#define __NR_fcntl64 239
+#define __NR_readahead 240
+#define __NR_io_setup 241
+#define __NR_io_destroy 242
+#define __NR_io_getevents 243
+#define __NR_io_submit 244
+#define __NR_io_cancel 245
+#define __NR_fadvise64 246
+#define __NR_exit_group 247
+#define __NR_lookup_dcookie 248
+#define __NR_epoll_create 249
+#define __NR_epoll_ctl 250
+#define __NR_epoll_wait 251
+#define __NR_remap_file_pages 252
+#define __NR_set_tid_address 253
+#define __NR_timer_create 254
+#define __NR_timer_settime32 255
+#define __NR_timer_gettime32 256
+#define __NR_timer_getoverrun 257
+#define __NR_timer_delete 258
+#define __NR_clock_settime32 259
+#define __NR_clock_gettime32 260
+#define __NR_clock_getres_time32 261
+#define __NR_clock_nanosleep_time32 262
+#define __NR_statfs64 263
+#define __NR_fstatfs64 264
+#define __NR_tgkill 265
+#define __NR_utimes 266
+#define __NR_fadvise64_64 267
+#define __NR_mbind 268
+#define __NR_get_mempolicy 269
+#define __NR_set_mempolicy 270
+#define __NR_mq_open 271
+#define __NR_mq_unlink 272
+#define __NR_mq_timedsend 273
+#define __NR_mq_timedreceive 274
+#define __NR_mq_notify 275
+#define __NR_mq_getsetattr 276
+#define __NR_waitid 277
+#define __NR_add_key 279
+#define __NR_request_key 280
+#define __NR_keyctl 281
+#define __NR_ioprio_set 282
+#define __NR_ioprio_get 283
+#define __NR_inotify_init 284
+#define __NR_inotify_add_watch 285
+#define __NR_inotify_rm_watch 286
+#define __NR_migrate_pages 287
+#define __NR_openat 288
+#define __NR_mkdirat 289
+#define __NR_mknodat 290
+#define __NR_fchownat 291
+#define __NR_futimesat 292
+#define __NR_fstatat64 293
+#define __NR_unlinkat 294
+#define __NR_renameat 295
+#define __NR_linkat 296
+#define __NR_symlinkat 297
+#define __NR_readlinkat 298
+#define __NR_fchmodat 299
+#define __NR_faccessat 300
+#define __NR_pselect6 301
+#define __NR_ppoll 302
+#define __NR_unshare 303
+#define __NR_set_robust_list 304
+#define __NR_get_robust_list 305
+#define __NR_splice 306
+#define __NR_sync_file_range 307
+#define __NR_tee 308
+#define __NR_vmsplice 309
+#define __NR_move_pages 310
+#define __NR_sched_setaffinity 311
+#define __NR_sched_getaffinity 312
+#define __NR_kexec_load 313
+#define __NR_getcpu 314
+#define __NR_epoll_pwait 315
+#define __NR_utimensat 316
+#define __NR_signalfd 317
+#define __NR_timerfd_create 318
+#define __NR_eventfd 319
+#define __NR_fallocate 320
+#define __NR_timerfd_settime32 321
+#define __NR_timerfd_gettime32 322
+#define __NR_signalfd4 323
+#define __NR_eventfd2 324
+#define __NR_epoll_create1 325
+#define __NR_dup3 326
+#define __NR_pipe2 327
+#define __NR_inotify_init1 328
+#define __NR_preadv 329
+#define __NR_pwritev 330
+#define __NR_rt_tgsigqueueinfo 331
+#define __NR_perf_event_open 332
+#define __NR_get_thread_area 333
+#define __NR_set_thread_area 334
+#define __NR_atomic_cmpxchg_32 335
+#define __NR_atomic_barrier 336
+#define __NR_fanotify_init 337
+#define __NR_fanotify_mark 338
+#define __NR_prlimit64 339
+#define __NR_name_to_handle_at 340
+#define __NR_open_by_handle_at 341
+#define __NR_clock_adjtime 342
+#define __NR_syncfs 343
+#define __NR_setns 344
+#define __NR_process_vm_readv 345
+#define __NR_process_vm_writev 346
+#define __NR_kcmp 347
+#define __NR_finit_module 348
+#define __NR_sched_setattr 349
+#define __NR_sched_getattr 350
+#define __NR_renameat2 351
+#define __NR_getrandom 352
+#define __NR_memfd_create 353
+#define __NR_bpf 354
+#define __NR_execveat 355
+#define __NR_socket 356
+#define __NR_socketpair 357
+#define __NR_bind 358
+#define __NR_connect 359
+#define __NR_listen 360
+#define __NR_accept4 361
+#define __NR_getsockopt 362
+#define __NR_setsockopt 363
+#define __NR_getsockname 364
+#define __NR_getpeername 365
+#define __NR_sendto 366
+#define __NR_sendmsg 367
+#define __NR_recvfrom 368
+#define __NR_recvmsg 369
+#define __NR_shutdown 370
+#define __NR_recvmmsg 371
+#define __NR_sendmmsg 372
+#define __NR_userfaultfd 373
+#define __NR_membarrier 374
+#define __NR_mlock2 375
+#define __NR_copy_file_range 376
+#define __NR_preadv2 377
+#define __NR_pwritev2 378
+#define __NR_statx 379
+#define __NR_seccomp 380
+#define __NR_pkey_mprotect 381
+#define __NR_pkey_alloc 382
+#define __NR_pkey_free 383
+#define __NR_rseq 384
+#define __NR_semget 393
+#define __NR_semctl 394
+#define __NR_shmget 395
+#define __NR_shmctl 396
+#define __NR_shmat 397
+#define __NR_shmdt 398
+#define __NR_msgget 399
+#define __NR_msgsnd 400
+#define __NR_msgrcv 401
+#define __NR_msgctl 402
+#define __NR_clock_gettime64 403
+#define __NR_clock_settime64 404
+#define __NR_clock_adjtime64 405
+#define __NR_clock_getres_time64 406
+#define __NR_clock_nanosleep_time64 407
+#define __NR_timer_gettime64 408
+#define __NR_timer_settime64 409
+#define __NR_timerfd_gettime64 410
+#define __NR_timerfd_settime64 411
+#define __NR_utimensat_time64 412
+#define __NR_pselect6_time64 413
+#define __NR_ppoll_time64 414
+#define __NR_io_pgetevents_time64 416
+#define __NR_recvmmsg_time64 417
+#define __NR_mq_timedsend_time64 418
+#define __NR_mq_timedreceive_time64 419
+#define __NR_semtimedop_time64 420
+#define __NR_rt_sigtimedwait_time64 421
+#define __NR_futex_time64 422
+#define __NR_sched_rr_get_interval_time64 423
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_clone3 435
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_epoll_pwait2 441
+#define __NR_mount_setattr 442
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_restrict_self 446
diff --git a/libc-top-half/musl/arch/m68k/bits/user.h b/libc-top-half/musl/arch/m68k/bits/user.h
new file mode 100644
index 0000000..6a44391
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/bits/user.h
@@ -0,0 +1,38 @@
+#undef __WORDSIZE
+#define __WORDSIZE 32
+
+struct user_m68kfp_struct {
+ unsigned long fpregs[24], fpcntl[3];
+};
+
+struct user_regs_struct {
+ long d1, d2, d3, d4, d5, d6, d7;
+ long a0, a1, a2, a3, a4, a5, a6;
+ long d0, usp, orig_d0;
+ short stkadj, sr;
+ long pc;
+ short fmtvec, __pad;
+};
+
+struct user {
+ struct user_regs_struct regs;
+ int u_fpvalid;
+ struct user_m68kfp_struct m68kfp;
+ unsigned long u_tsize, u_dsize, u_ssize, start_code, start_stack;
+ long signal;
+ int reserved;
+ unsigned long u_ar0;
+ struct user_m68kfp_struct *u_fpstate;
+ unsigned long magic;
+ char u_comm[32];
+};
+
+#define ELF_NGREG 20
+typedef unsigned long elf_greg_t;
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+typedef struct user_m68kfp_struct elf_fpregset_t;
+
+#define NBPG 4096
+#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/libc-top-half/musl/arch/m68k/crt_arch.h b/libc-top-half/musl/arch/m68k/crt_arch.h
new file mode 100644
index 0000000..48a42f2
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/crt_arch.h
@@ -0,0 +1,14 @@
+__asm__(
+".text\n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+".global " START "\n"
+START ":\n"
+" suba.l %fp,%fp \n"
+" movea.l %sp,%a0 \n"
+" lea _DYNAMIC-.-8,%a1 \n"
+" pea (%pc,%a1) \n"
+" pea (%a0) \n"
+" lea " START "_c-.-8,%a1 \n"
+" jsr (%pc,%a1) \n"
+);
diff --git a/libc-top-half/musl/arch/m68k/kstat.h b/libc-top-half/musl/arch/m68k/kstat.h
new file mode 100644
index 0000000..ac13e27
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/kstat.h
@@ -0,0 +1,21 @@
+struct kstat {
+ dev_t st_dev;
+ short __st_dev_padding;
+ long __st_ino_truncated;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ short __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ ino_t st_ino;
+};
diff --git a/libc-top-half/musl/arch/m68k/pthread_arch.h b/libc-top-half/musl/arch/m68k/pthread_arch.h
new file mode 100644
index 0000000..5bea4e1
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/pthread_arch.h
@@ -0,0 +1,12 @@
+static inline uintptr_t __get_tp()
+{
+ return __syscall(SYS_get_thread_area);
+}
+
+#define TLS_ABOVE_TP
+#define GAP_ABOVE_TP 0
+
+#define TP_OFFSET 0x7000
+#define DTP_OFFSET 0x8000
+
+#define MC_PC gregs[R_PC]
diff --git a/libc-top-half/musl/arch/m68k/reloc.h b/libc-top-half/musl/arch/m68k/reloc.h
new file mode 100644
index 0000000..f920b39
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/reloc.h
@@ -0,0 +1,30 @@
+#if __HAVE_68881__
+#define FP_SUFFIX ""
+#elif __mcffpu__
+#define FP_SUFFIX "-fp64"
+#else
+#define FP_SUFFIX "-sf"
+#endif
+
+#define LDSO_ARCH "m68k" FP_SUFFIX
+
+#define TPOFF_K (-0x7000)
+
+#define REL_SYMBOLIC R_68K_32
+#define REL_OFFSET R_68K_PC32
+#define REL_GOT R_68K_GLOB_DAT
+#define REL_PLT R_68K_JMP_SLOT
+#define REL_RELATIVE R_68K_RELATIVE
+#define REL_COPY R_68K_COPY
+#define REL_DTPMOD R_68K_TLS_DTPMOD32
+#define REL_DTPOFF R_68K_TLS_DTPREL32
+#define REL_TPOFF R_68K_TLS_TPREL32
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "move.l %1,%%sp ; jmp (%0)" : : "r"(pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+ ".hidden " #sym "\n" \
+ "lea " #sym "-.-8,%0 \n" \
+ "lea (%%pc,%0),%0 \n" \
+ : "=a"(*fp) : : "memory" )
diff --git a/libc-top-half/musl/arch/m68k/syscall_arch.h b/libc-top-half/musl/arch/m68k/syscall_arch.h
new file mode 100644
index 0000000..6a9d0ae
--- /dev/null
+++ b/libc-top-half/musl/arch/m68k/syscall_arch.h
@@ -0,0 +1,90 @@
+#define __SYSCALL_LL_E(x) \
+((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
+((union { long long ll; long l[2]; }){ .ll = x }).l[1]
+#define __SYSCALL_LL_O(x) __SYSCALL_LL_E((x))
+
+static __inline long __syscall0(long n)
+{
+ register unsigned long d0 __asm__("d0") = n;
+ __asm__ __volatile__ ("trap #0" : "+r"(d0)
+ :
+ : "memory");
+ return d0;
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register unsigned long d0 __asm__("d0") = n;
+ register unsigned long d1 __asm__("d1") = a;
+ __asm__ __volatile__ ("trap #0" : "+r"(d0)
+ : "r"(d1)
+ : "memory");
+ return d0;
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register unsigned long d0 __asm__("d0") = n;
+ register unsigned long d1 __asm__("d1") = a;
+ register unsigned long d2 __asm__("d2") = b;
+ __asm__ __volatile__ ("trap #0" : "+r"(d0)
+ : "r"(d1), "r"(d2)
+ : "memory");
+ return d0;
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register unsigned long d0 __asm__("d0") = n;
+ register unsigned long d1 __asm__("d1") = a;
+ register unsigned long d2 __asm__("d2") = b;
+ register unsigned long d3 __asm__("d3") = c;
+ __asm__ __volatile__ ("trap #0" : "+r"(d0)
+ : "r"(d1), "r"(d2), "r"(d3)
+ : "memory");
+ return d0;
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register unsigned long d0 __asm__("d0") = n;
+ register unsigned long d1 __asm__("d1") = a;
+ register unsigned long d2 __asm__("d2") = b;
+ register unsigned long d3 __asm__("d3") = c;
+ register unsigned long d4 __asm__("d4") = d;
+ __asm__ __volatile__ ("trap #0" : "+r"(d0)
+ : "r"(d1), "r"(d2), "r"(d3), "r"(d4)
+ : "memory");
+ return d0;
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register unsigned long d0 __asm__("d0") = n;
+ register unsigned long d1 __asm__("d1") = a;
+ register unsigned long d2 __asm__("d2") = b;
+ register unsigned long d3 __asm__("d3") = c;
+ register unsigned long d4 __asm__("d4") = d;
+ register unsigned long d5 __asm__("d5") = e;
+ __asm__ __volatile__ ("trap #0" : "+r"(d0)
+ : "r"(d1), "r"(d2), "r"(d3), "r"(d4), "r"(d5)
+ : "memory");
+ return d0;
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register unsigned long d0 __asm__("d0") = n;
+ register unsigned long d1 __asm__("d1") = a;
+ register unsigned long d2 __asm__("d2") = b;
+ register unsigned long d3 __asm__("d3") = c;
+ register unsigned long d4 __asm__("d4") = d;
+ register unsigned long d5 __asm__("d5") = e;
+ register unsigned long a0 __asm__("a0") = f;
+ __asm__ __volatile__ ("trap #0" : "+r"(d0)
+ : "r"(d1), "r"(d2), "r"(d3), "r"(d4), "r"(d5), "r"(a0)
+ : "memory");
+ return d0;
+}
+
+#define SYSCALL_IPC_BROKEN_MODE
diff --git a/libc-top-half/musl/arch/microblaze/arch.mak b/libc-top-half/musl/arch/microblaze/arch.mak
new file mode 100644
index 0000000..aa4d05c
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/arch.mak
@@ -0,0 +1 @@
+COMPAT_SRC_DIRS = compat/time32
diff --git a/libc-top-half/musl/arch/microblaze/atomic_arch.h b/libc-top-half/musl/arch/microblaze/atomic_arch.h
new file mode 100644
index 0000000..1152e8c
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/atomic_arch.h
@@ -0,0 +1,53 @@
+#define a_cas a_cas
+static inline int a_cas(volatile int *p, int t, int s)
+{
+ register int old, tmp;
+ __asm__ __volatile__ (
+ " addi %0, r0, 0\n"
+ "1: lwx %0, %2, r0\n"
+ " rsubk %1, %0, %3\n"
+ " bnei %1, 1f\n"
+ " swx %4, %2, r0\n"
+ " addic %1, r0, 0\n"
+ " bnei %1, 1b\n"
+ "1: "
+ : "=&r"(old), "=&r"(tmp)
+ : "r"(p), "r"(t), "r"(s)
+ : "cc", "memory" );
+ return old;
+}
+
+#define a_swap a_swap
+static inline int a_swap(volatile int *x, int v)
+{
+ register int old, tmp;
+ __asm__ __volatile__ (
+ " addi %0, r0, 0\n"
+ "1: lwx %0, %2, r0\n"
+ " swx %3, %2, r0\n"
+ " addic %1, r0, 0\n"
+ " bnei %1, 1b\n"
+ "1: "
+ : "=&r"(old), "=&r"(tmp)
+ : "r"(x), "r"(v)
+ : "cc", "memory" );
+ return old;
+}
+
+#define a_fetch_add a_fetch_add
+static inline int a_fetch_add(volatile int *x, int v)
+{
+ register int new, tmp;
+ __asm__ __volatile__ (
+ " addi %0, r0, 0\n"
+ "1: lwx %0, %2, r0\n"
+ " addk %0, %0, %3\n"
+ " swx %0, %2, r0\n"
+ " addic %1, r0, 0\n"
+ " bnei %1, 1b\n"
+ "1: "
+ : "=&r"(new), "=&r"(tmp)
+ : "r"(x), "r"(v)
+ : "cc", "memory" );
+ return new-v;
+}
diff --git a/libc-top-half/musl/arch/microblaze/bits/alltypes.h.in b/libc-top-half/musl/arch/microblaze/bits/alltypes.h.in
new file mode 100644
index 0000000..9a4ce29
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/alltypes.h.in
@@ -0,0 +1,21 @@
+#define _REDIR_TIME64 1
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+#if __MICROBLAZEEL__
+#define __BYTE_ORDER 1234
+#else
+#define __BYTE_ORDER 4321
+#endif
+
+#define __LONG_MAX 0x7fffffffL
+
+#ifndef __cplusplus
+TYPEDEF int wchar_t;
+#endif
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/microblaze/bits/float.h b/libc-top-half/musl/arch/microblaze/bits/float.h
new file mode 100644
index 0000000..c4a655e
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 4.94065645841246544177e-324L
+#define LDBL_MIN 2.22507385850720138309e-308L
+#define LDBL_MAX 1.79769313486231570815e+308L
+#define LDBL_EPSILON 2.22044604925031308085e-16L
+
+#define LDBL_MANT_DIG 53
+#define LDBL_MIN_EXP (-1021)
+#define LDBL_MAX_EXP 1024
+
+#define LDBL_DIG 15
+#define LDBL_MIN_10_EXP (-307)
+#define LDBL_MAX_10_EXP 308
+
+#define DECIMAL_DIG 17
diff --git a/libc-top-half/musl/arch/microblaze/bits/ipcstat.h b/libc-top-half/musl/arch/microblaze/bits/ipcstat.h
new file mode 100644
index 0000000..4f4fcb0
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/ipcstat.h
@@ -0,0 +1 @@
+#define IPC_STAT 0x102
diff --git a/libc-top-half/musl/arch/microblaze/bits/msg.h b/libc-top-half/musl/arch/microblaze/bits/msg.h
new file mode 100644
index 0000000..7bbbb2b
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/msg.h
@@ -0,0 +1,18 @@
+struct msqid_ds {
+ struct ipc_perm msg_perm;
+ unsigned long __msg_stime_lo;
+ unsigned long __msg_stime_hi;
+ unsigned long __msg_rtime_lo;
+ unsigned long __msg_rtime_hi;
+ unsigned long __msg_ctime_lo;
+ unsigned long __msg_ctime_hi;
+ unsigned long msg_cbytes;
+ msgqnum_t msg_qnum;
+ msglen_t msg_qbytes;
+ pid_t msg_lspid;
+ pid_t msg_lrpid;
+ unsigned long __unused[2];
+ time_t msg_stime;
+ time_t msg_rtime;
+ time_t msg_ctime;
+};
diff --git a/libc-top-half/musl/arch/microblaze/bits/posix.h b/libc-top-half/musl/arch/microblaze/bits/posix.h
new file mode 100644
index 0000000..30a3871
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_ILP32_OFFBIG 1
+#define _POSIX_V7_ILP32_OFFBIG 1
diff --git a/libc-top-half/musl/arch/microblaze/bits/reg.h b/libc-top-half/musl/arch/microblaze/bits/reg.h
new file mode 100644
index 0000000..0c7bffc
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/reg.h
@@ -0,0 +1,3 @@
+#undef __WORDSIZE
+#define __WORDSIZE 32
+/* FIXME */
diff --git a/libc-top-half/musl/arch/microblaze/bits/sem.h b/libc-top-half/musl/arch/microblaze/bits/sem.h
new file mode 100644
index 0000000..544e3d2
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/sem.h
@@ -0,0 +1,18 @@
+struct semid_ds {
+ struct ipc_perm sem_perm;
+ unsigned long __sem_otime_lo;
+ unsigned long __sem_otime_hi;
+ unsigned long __sem_ctime_lo;
+ unsigned long __sem_ctime_hi;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned short sem_nsems;
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+#else
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+ unsigned short sem_nsems;
+#endif
+ long __unused3;
+ long __unused4;
+ time_t sem_otime;
+ time_t sem_ctime;
+};
diff --git a/libc-top-half/musl/arch/microblaze/bits/setjmp.h b/libc-top-half/musl/arch/microblaze/bits/setjmp.h
new file mode 100644
index 0000000..b2bd974
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long __jmp_buf[18];
diff --git a/libc-top-half/musl/arch/microblaze/bits/shm.h b/libc-top-half/musl/arch/microblaze/bits/shm.h
new file mode 100644
index 0000000..725fb46
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/shm.h
@@ -0,0 +1,31 @@
+#define SHMLBA 4096
+
+struct shmid_ds {
+ struct ipc_perm shm_perm;
+ size_t shm_segsz;
+ unsigned long __shm_atime_lo;
+ unsigned long __shm_atime_hi;
+ unsigned long __shm_dtime_lo;
+ unsigned long __shm_dtime_hi;
+ unsigned long __shm_ctime_lo;
+ unsigned long __shm_ctime_hi;
+ pid_t shm_cpid;
+ pid_t shm_lpid;
+ unsigned long shm_nattch;
+ unsigned long __pad1;
+ unsigned long __pad2;
+ unsigned long __pad3;
+ time_t shm_atime;
+ time_t shm_dtime;
+ time_t shm_ctime;
+};
+
+struct shminfo {
+ unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+};
+
+struct shm_info {
+ int __used_ids;
+ unsigned long shm_tot, shm_rss, shm_swp;
+ unsigned long __swap_attempts, __swap_successes;
+};
diff --git a/libc-top-half/musl/arch/microblaze/bits/signal.h b/libc-top-half/musl/arch/microblaze/bits/signal.h
new file mode 100644
index 0000000..490f83b
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/signal.h
@@ -0,0 +1,88 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef unsigned long greg_t, gregset_t[38];
+typedef struct sigcontext {
+ struct {
+ unsigned long r0, r1, r2, r3, r4, r5, r6, r7;
+ unsigned long r8, r9, r10, r11, r12, r13, r14, r15;
+ unsigned long r16, r17, r18, r19, r20, r21, r22, r23;
+ unsigned long r24, r25, r26, r27, r28, r29, r30, r31;
+ unsigned long pc, msr, ear, esr, fsr;
+ int pt_mode;
+ } regs;
+ unsigned long oldmask;
+} mcontext_t;
+#else
+typedef struct {
+ unsigned long __regs[39];
+} 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;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ sigset_t uc_sigmask;
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 2
+#define SA_SIGINFO 4
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL 29
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
diff --git a/libc-top-half/musl/arch/microblaze/bits/stat.h b/libc-top-half/musl/arch/microblaze/bits/stat.h
new file mode 100644
index 0000000..8a4d509
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/stat.h
@@ -0,0 +1,25 @@
+/* copied from kernel definition, but with padding replaced
+ * by the corresponding correctly-sized userspace types. */
+
+struct stat {
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ long long __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ int __st_blksize_padding;
+ blkcnt_t st_blocks;
+ struct {
+ long tv_sec;
+ long tv_nsec;
+ } __st_atim32, __st_mtim32, __st_ctim32;
+ unsigned __unused[2];
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+};
diff --git a/libc-top-half/musl/arch/microblaze/bits/stdint.h b/libc-top-half/musl/arch/microblaze/bits/stdint.h
new file mode 100644
index 0000000..d1b2712
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#define SIZE_MAX UINT32_MAX
diff --git a/libc-top-half/musl/arch/microblaze/bits/syscall.h.in b/libc-top-half/musl/arch/microblaze/bits/syscall.h.in
new file mode 100644
index 0000000..931d791
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/syscall.h.in
@@ -0,0 +1,440 @@
+#define __NR_restart_syscall 0
+#define __NR_exit 1
+#define __NR_fork 2
+#define __NR_read 3
+#define __NR_write 4
+#define __NR_open 5
+#define __NR_close 6
+#define __NR_waitpid 7
+#define __NR_creat 8
+#define __NR_link 9
+#define __NR_unlink 10
+#define __NR_execve 11
+#define __NR_chdir 12
+#define __NR_time 13
+#define __NR_mknod 14
+#define __NR_chmod 15
+#define __NR_lchown 16
+#define __NR_break 17
+#define __NR_oldstat 18
+#define __NR_lseek 19
+#define __NR_getpid 20
+#define __NR_mount 21
+#define __NR_umount 22
+#define __NR_setuid 23
+#define __NR_getuid 24
+#define __NR_stime 25
+#define __NR_ptrace 26
+#define __NR_alarm 27
+#define __NR_oldfstat 28
+#define __NR_pause 29
+#define __NR_utime 30
+#define __NR_stty 31
+#define __NR_gtty 32
+#define __NR_access 33
+#define __NR_nice 34
+#define __NR_ftime 35
+#define __NR_sync 36
+#define __NR_kill 37
+#define __NR_rename 38
+#define __NR_mkdir 39
+#define __NR_rmdir 40
+#define __NR_dup 41
+#define __NR_pipe 42
+#define __NR_times 43
+#define __NR_prof 44
+#define __NR_brk 45
+#define __NR_setgid 46
+#define __NR_getgid 47
+#define __NR_signal 48
+#define __NR_geteuid 49
+#define __NR_getegid 50
+#define __NR_acct 51
+#define __NR_umount2 52
+#define __NR_lock 53
+#define __NR_ioctl 54
+#define __NR_fcntl 55
+#define __NR_mpx 56
+#define __NR_setpgid 57
+#define __NR_ulimit 58
+#define __NR_oldolduname 59
+#define __NR_umask 60
+#define __NR_chroot 61
+#define __NR_ustat 62
+#define __NR_dup2 63
+#define __NR_getppid 64
+#define __NR_getpgrp 65
+#define __NR_setsid 66
+#define __NR_sigaction 67
+#define __NR_sgetmask 68
+#define __NR_ssetmask 69
+#define __NR_setreuid 70
+#define __NR_setregid 71
+#define __NR_sigsuspend 72
+#define __NR_sigpending 73
+#define __NR_sethostname 74
+#define __NR_setrlimit 75
+#define __NR_getrlimit 76
+#define __NR_getrusage 77
+#define __NR_gettimeofday_time32 78
+#define __NR_settimeofday_time32 79
+#define __NR_getgroups 80
+#define __NR_setgroups 81
+#define __NR_select 82
+#define __NR_symlink 83
+#define __NR_oldlstat 84
+#define __NR_readlink 85
+#define __NR_uselib 86
+#define __NR_swapon 87
+#define __NR_reboot 88
+#define __NR_readdir 89
+#define __NR_mmap 90
+#define __NR_munmap 91
+#define __NR_truncate 92
+#define __NR_ftruncate 93
+#define __NR_fchmod 94
+#define __NR_fchown 95
+#define __NR_getpriority 96
+#define __NR_setpriority 97
+#define __NR_profil 98
+#define __NR_statfs 99
+#define __NR_fstatfs 100
+#define __NR_ioperm 101
+#define __NR_socketcall 102
+#define __NR_syslog 103
+#define __NR_setitimer 104
+#define __NR_getitimer 105
+#define __NR_stat 106
+#define __NR_lstat 107
+#define __NR_fstat 108
+#define __NR_olduname 109
+#define __NR_iopl 110
+#define __NR_vhangup 111
+#define __NR_idle 112
+#define __NR_vm86old 113
+#define __NR_wait4 114
+#define __NR_swapoff 115
+#define __NR_sysinfo 116
+#define __NR_ipc 117
+#define __NR_fsync 118
+#define __NR_sigreturn 119
+#define __NR_clone 120
+#define __NR_setdomainname 121
+#define __NR_uname 122
+#define __NR_modify_ldt 123
+#define __NR_adjtimex 124
+#define __NR_mprotect 125
+#define __NR_sigprocmask 126
+#define __NR_create_module 127
+#define __NR_init_module 128
+#define __NR_delete_module 129
+#define __NR_get_kernel_syms 130
+#define __NR_quotactl 131
+#define __NR_getpgid 132
+#define __NR_fchdir 133
+#define __NR_bdflush 134
+#define __NR_sysfs 135
+#define __NR_personality 136
+#define __NR_afs_syscall 137
+#define __NR_setfsuid 138
+#define __NR_setfsgid 139
+#define __NR__llseek 140
+#define __NR_getdents 141
+#define __NR__newselect 142
+#define __NR_flock 143
+#define __NR_msync 144
+#define __NR_readv 145
+#define __NR_writev 146
+#define __NR_getsid 147
+#define __NR_fdatasync 148
+#define __NR__sysctl 149
+#define __NR_mlock 150
+#define __NR_munlock 151
+#define __NR_mlockall 152
+#define __NR_munlockall 153
+#define __NR_sched_setparam 154
+#define __NR_sched_getparam 155
+#define __NR_sched_setscheduler 156
+#define __NR_sched_getscheduler 157
+#define __NR_sched_yield 158
+#define __NR_sched_get_priority_max 159
+#define __NR_sched_get_priority_min 160
+#define __NR_sched_rr_get_interval 161
+#define __NR_nanosleep 162
+#define __NR_mremap 163
+#define __NR_setresuid 164
+#define __NR_getresuid 165
+#define __NR_vm86 166
+#define __NR_query_module 167
+#define __NR_poll 168
+#define __NR_nfsservctl 169
+#define __NR_setresgid 170
+#define __NR_getresgid 171
+#define __NR_prctl 172
+#define __NR_rt_sigreturn 173
+#define __NR_rt_sigaction 174
+#define __NR_rt_sigprocmask 175
+#define __NR_rt_sigpending 176
+#define __NR_rt_sigtimedwait 177
+#define __NR_rt_sigqueueinfo 178
+#define __NR_rt_sigsuspend 179
+#define __NR_pread64 180
+#define __NR_pwrite64 181
+#define __NR_chown 182
+#define __NR_getcwd 183
+#define __NR_capget 184
+#define __NR_capset 185
+#define __NR_sigaltstack 186
+#define __NR_sendfile 187
+#define __NR_getpmsg 188
+#define __NR_putpmsg 189
+#define __NR_vfork 190
+#define __NR_ugetrlimit 191
+#define __NR_mmap2 192
+#define __NR_truncate64 193
+#define __NR_ftruncate64 194
+#define __NR_stat64 195
+#define __NR_lstat64 196
+#define __NR_fstat64 197
+#define __NR_lchown32 198
+#define __NR_getuid32 199
+#define __NR_getgid32 200
+#define __NR_geteuid32 201
+#define __NR_getegid32 202
+#define __NR_setreuid32 203
+#define __NR_setregid32 204
+#define __NR_getgroups32 205
+#define __NR_setgroups32 206
+#define __NR_fchown32 207
+#define __NR_setresuid32 208
+#define __NR_getresuid32 209
+#define __NR_setresgid32 210
+#define __NR_getresgid32 211
+#define __NR_chown32 212
+#define __NR_setuid32 213
+#define __NR_setgid32 214
+#define __NR_setfsuid32 215
+#define __NR_setfsgid32 216
+#define __NR_pivot_root 217
+#define __NR_mincore 218
+#define __NR_madvise 219
+#define __NR_getdents64 220
+#define __NR_fcntl64 221
+#define __NR_gettid 224
+#define __NR_readahead 225
+#define __NR_setxattr 226
+#define __NR_lsetxattr 227
+#define __NR_fsetxattr 228
+#define __NR_getxattr 229
+#define __NR_lgetxattr 230
+#define __NR_fgetxattr 231
+#define __NR_listxattr 232
+#define __NR_llistxattr 233
+#define __NR_flistxattr 234
+#define __NR_removexattr 235
+#define __NR_lremovexattr 236
+#define __NR_fremovexattr 237
+#define __NR_tkill 238
+#define __NR_sendfile64 239
+#define __NR_futex 240
+#define __NR_sched_setaffinity 241
+#define __NR_sched_getaffinity 242
+#define __NR_set_thread_area 243
+#define __NR_get_thread_area 244
+#define __NR_io_setup 245
+#define __NR_io_destroy 246
+#define __NR_io_getevents 247
+#define __NR_io_submit 248
+#define __NR_io_cancel 249
+#define __NR_fadvise64 250
+#define __NR_exit_group 252
+#define __NR_lookup_dcookie 253
+#define __NR_epoll_create 254
+#define __NR_epoll_ctl 255
+#define __NR_epoll_wait 256
+#define __NR_remap_file_pages 257
+#define __NR_set_tid_address 258
+#define __NR_timer_create 259
+#define __NR_timer_settime32 260
+#define __NR_timer_gettime32 261
+#define __NR_timer_getoverrun 262
+#define __NR_timer_delete 263
+#define __NR_clock_settime32 264
+#define __NR_clock_gettime32 265
+#define __NR_clock_getres_time32 266
+#define __NR_clock_nanosleep_time32 267
+#define __NR_statfs64 268
+#define __NR_fstatfs64 269
+#define __NR_tgkill 270
+#define __NR_utimes 271
+#define __NR_fadvise64_64 272
+#define __NR_vserver 273
+#define __NR_mbind 274
+#define __NR_get_mempolicy 275
+#define __NR_set_mempolicy 276
+#define __NR_mq_open 277
+#define __NR_mq_unlink 278
+#define __NR_mq_timedsend 279
+#define __NR_mq_timedreceive 280
+#define __NR_mq_notify 281
+#define __NR_mq_getsetattr 282
+#define __NR_kexec_load 283
+#define __NR_waitid 284
+#define __NR_add_key 286
+#define __NR_request_key 287
+#define __NR_keyctl 288
+#define __NR_ioprio_set 289
+#define __NR_ioprio_get 290
+#define __NR_inotify_init 291
+#define __NR_inotify_add_watch 292
+#define __NR_inotify_rm_watch 293
+#define __NR_migrate_pages 294
+#define __NR_openat 295
+#define __NR_mkdirat 296
+#define __NR_mknodat 297
+#define __NR_fchownat 298
+#define __NR_futimesat 299
+#define __NR_fstatat64 300
+#define __NR_unlinkat 301
+#define __NR_renameat 302
+#define __NR_linkat 303
+#define __NR_symlinkat 304
+#define __NR_readlinkat 305
+#define __NR_fchmodat 306
+#define __NR_faccessat 307
+#define __NR_pselect6 308
+#define __NR_ppoll 309
+#define __NR_unshare 310
+#define __NR_set_robust_list 311
+#define __NR_get_robust_list 312
+#define __NR_splice 313
+#define __NR_sync_file_range 314
+#define __NR_tee 315
+#define __NR_vmsplice 316
+#define __NR_move_pages 317
+#define __NR_getcpu 318
+#define __NR_epoll_pwait 319
+#define __NR_utimensat 320
+#define __NR_signalfd 321
+#define __NR_timerfd_create 322
+#define __NR_eventfd 323
+#define __NR_fallocate 324
+#define __NR_semtimedop 325
+#define __NR_timerfd_settime32 326
+#define __NR_timerfd_gettime32 327
+#define __NR_semctl 328
+#define __NR_semget 329
+#define __NR_semop 330
+#define __NR_msgctl 331
+#define __NR_msgget 332
+#define __NR_msgrcv 333
+#define __NR_msgsnd 334
+#define __NR_shmat 335
+#define __NR_shmctl 336
+#define __NR_shmdt 337
+#define __NR_shmget 338
+#define __NR_signalfd4 339
+#define __NR_eventfd2 340
+#define __NR_epoll_create1 341
+#define __NR_dup3 342
+#define __NR_pipe2 343
+#define __NR_inotify_init1 344
+#define __NR_socket 345
+#define __NR_socketpair 346
+#define __NR_bind 347
+#define __NR_listen 348
+#define __NR_accept 349
+#define __NR_connect 350
+#define __NR_getsockname 351
+#define __NR_getpeername 352
+#define __NR_sendto 353
+#define __NR_send 354
+#define __NR_recvfrom 355
+#define __NR_recv 356
+#define __NR_setsockopt 357
+#define __NR_getsockopt 358
+#define __NR_shutdown 359
+#define __NR_sendmsg 360
+#define __NR_recvmsg 361
+#define __NR_accept4 362
+#define __NR_preadv 363
+#define __NR_pwritev 364
+#define __NR_rt_tgsigqueueinfo 365
+#define __NR_perf_event_open 366
+#define __NR_recvmmsg 367
+#define __NR_fanotify_init 368
+#define __NR_fanotify_mark 369
+#define __NR_prlimit64 370
+#define __NR_name_to_handle_at 371
+#define __NR_open_by_handle_at 372
+#define __NR_clock_adjtime 373
+#define __NR_syncfs 374
+#define __NR_setns 375
+#define __NR_sendmmsg 376
+#define __NR_process_vm_readv 377
+#define __NR_process_vm_writev 378
+#define __NR_kcmp 379
+#define __NR_finit_module 380
+#define __NR_sched_setattr 381
+#define __NR_sched_getattr 382
+#define __NR_renameat2 383
+#define __NR_seccomp 384
+#define __NR_getrandom 385
+#define __NR_memfd_create 386
+#define __NR_bpf 387
+#define __NR_execveat 388
+#define __NR_userfaultfd 389
+#define __NR_membarrier 390
+#define __NR_mlock2 391
+#define __NR_copy_file_range 392
+#define __NR_preadv2 393
+#define __NR_pwritev2 394
+#define __NR_pkey_mprotect 395
+#define __NR_pkey_alloc 396
+#define __NR_pkey_free 397
+#define __NR_statx 398
+#define __NR_io_pgetevents 399
+#define __NR_rseq 400
+#define __NR_clock_gettime64 403
+#define __NR_clock_settime64 404
+#define __NR_clock_adjtime64 405
+#define __NR_clock_getres_time64 406
+#define __NR_clock_nanosleep_time64 407
+#define __NR_timer_gettime64 408
+#define __NR_timer_settime64 409
+#define __NR_timerfd_gettime64 410
+#define __NR_timerfd_settime64 411
+#define __NR_utimensat_time64 412
+#define __NR_pselect6_time64 413
+#define __NR_ppoll_time64 414
+#define __NR_io_pgetevents_time64 416
+#define __NR_recvmmsg_time64 417
+#define __NR_mq_timedsend_time64 418
+#define __NR_mq_timedreceive_time64 419
+#define __NR_semtimedop_time64 420
+#define __NR_rt_sigtimedwait_time64 421
+#define __NR_futex_time64 422
+#define __NR_sched_rr_get_interval_time64 423
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_clone3 435
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_epoll_pwait2 441
+#define __NR_mount_setattr 442
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_restrict_self 446
+
diff --git a/libc-top-half/musl/arch/microblaze/bits/user.h b/libc-top-half/musl/arch/microblaze/bits/user.h
new file mode 100644
index 0000000..dbc25e0
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/bits/user.h
@@ -0,0 +1,25 @@
+struct user_fpregs_struct {
+ long cwd, swd, twd, fip, fcs, foo, fos, st_space[20];
+};
+
+struct user_regs_struct {
+ unsigned grp[32], pc, msr, ear, esr, fsr, btr, pvr[12];
+};
+
+struct user {
+ struct user_regs_struct regs;
+ int u_fpvalid;
+ struct user_fpregs_struct elf_fpregset_t;
+ unsigned long u_tsize, u_dsize, u_ssize, start_code, 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 ELF_NGREG 50
+typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG];
+typedef struct user_fpregs_struct elf_fpregset_t;
diff --git a/libc-top-half/musl/arch/microblaze/crt_arch.h b/libc-top-half/musl/arch/microblaze/crt_arch.h
new file mode 100644
index 0000000..bca78bf
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/crt_arch.h
@@ -0,0 +1,17 @@
+__asm__(
+".text \n"
+".global " START " \n"
+".align 2 \n"
+START ": \n"
+" add r19, r0, r0 \n"
+" ori r5, r1, 0 \n"
+"1: mfs r6, rpc \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+" addik r6, r6, _GLOBAL_OFFSET_TABLE_+8 \n"
+" addik r6, r6, _DYNAMIC@GOTOFF \n"
+" andi r1, r1, -8 \n"
+" addik r1, r1, -8 \n"
+" bri " START "_c \n"
+" nop \n"
+);
diff --git a/libc-top-half/musl/arch/microblaze/kstat.h b/libc-top-half/musl/arch/microblaze/kstat.h
new file mode 100644
index 0000000..c144957
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/kstat.h
@@ -0,0 +1,21 @@
+struct kstat {
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ long long __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ int __st_blksize_padding;
+ blkcnt_t st_blocks;
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ unsigned __unused[2];
+};
diff --git a/libc-top-half/musl/arch/microblaze/pthread_arch.h b/libc-top-half/musl/arch/microblaze/pthread_arch.h
new file mode 100644
index 0000000..ff26624
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/pthread_arch.h
@@ -0,0 +1,8 @@
+static inline uintptr_t __get_tp()
+{
+ uintptr_t tp;
+ __asm__ ("ori %0, r21, 0" : "=r" (tp) );
+ return tp;
+}
+
+#define MC_PC regs.pc
diff --git a/libc-top-half/musl/arch/microblaze/reloc.h b/libc-top-half/musl/arch/microblaze/reloc.h
new file mode 100644
index 0000000..6302c6e
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/reloc.h
@@ -0,0 +1,27 @@
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define ENDIAN_SUFFIX "el"
+#else
+#define ENDIAN_SUFFIX ""
+#endif
+
+#define LDSO_ARCH "microblaze" ENDIAN_SUFFIX
+
+#define TPOFF_K 0
+
+#define REL_SYMBOLIC R_MICROBLAZE_32
+#define REL_GOT R_MICROBLAZE_GLOB_DAT
+#define REL_PLT R_MICROBLAZE_JUMP_SLOT
+#define REL_RELATIVE R_MICROBLAZE_REL
+#define REL_COPY R_MICROBLAZE_COPY
+#define REL_DTPMOD R_MICROBLAZE_TLSDTPMOD32
+#define REL_DTPOFF R_MICROBLAZE_TLSDTPREL32
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "addik r1,%1,0 ; bra %0" : : "r"(pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+ ".hidden " #sym " \n" \
+ " mfs %0, rpc \n" \
+ " addik %0, %0, _GLOBAL_OFFSET_TABLE_+8 \n" \
+ " addik %0, %0, " #sym "@GOTOFF \n" \
+ : "=r"(*(fp)) : : "memory" )
diff --git a/libc-top-half/musl/arch/microblaze/syscall_arch.h b/libc-top-half/musl/arch/microblaze/syscall_arch.h
new file mode 100644
index 0000000..61d8248
--- /dev/null
+++ b/libc-top-half/musl/arch/microblaze/syscall_arch.h
@@ -0,0 +1,99 @@
+#define __SYSCALL_LL_E(x) \
+((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
+((union { long long ll; long l[2]; }){ .ll = x }).l[1]
+#define __SYSCALL_LL_O(x) __SYSCALL_LL_E((x))
+
+static __inline long __syscall0(long n)
+{
+ register unsigned long r12 __asm__("r12") = n;
+ register unsigned long r3 __asm__("r3");
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12)
+ : "memory", "r4");
+ return r3;
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register unsigned long r12 __asm__("r12") = n;
+ register unsigned long r3 __asm__("r3");
+ register unsigned long r5 __asm__("r5") = a;
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12), "r"(r5)
+ : "memory", "r4");
+ return r3;
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register unsigned long r12 __asm__("r12") = n;
+ register unsigned long r3 __asm__("r3");
+ register unsigned long r5 __asm__("r5") = a;
+ register unsigned long r6 __asm__("r6") = b;
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12), "r"(r5), "r"(r6)
+ : "memory", "r4");
+ return r3;
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register unsigned long r12 __asm__("r12") = n;
+ register unsigned long r3 __asm__("r3");
+ register unsigned long r5 __asm__("r5") = a;
+ register unsigned long r6 __asm__("r6") = b;
+ register unsigned long r7 __asm__("r7") = c;
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12), "r"(r5), "r"(r6), "r"(r7)
+ : "memory", "r4");
+ return r3;
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register unsigned long r12 __asm__("r12") = n;
+ register unsigned long r3 __asm__("r3");
+ register unsigned long r5 __asm__("r5") = a;
+ register unsigned long r6 __asm__("r6") = b;
+ register unsigned long r7 __asm__("r7") = c;
+ register unsigned long r8 __asm__("r8") = d;
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12), "r"(r5), "r"(r6), "r"(r7), "r"(r8)
+ : "memory", "r4");
+ return r3;
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register unsigned long r12 __asm__("r12") = n;
+ register unsigned long r3 __asm__("r3");
+ register unsigned long r5 __asm__("r5") = a;
+ register unsigned long r6 __asm__("r6") = b;
+ register unsigned long r7 __asm__("r7") = c;
+ register unsigned long r8 __asm__("r8") = d;
+ register unsigned long r9 __asm__("r9") = e;
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12), "r"(r5), "r"(r6), "r"(r7), "r"(r8), "r"(r9)
+ : "memory", "r4");
+ return r3;
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register unsigned long r12 __asm__("r12") = n;
+ register unsigned long r3 __asm__("r3");
+ register unsigned long r5 __asm__("r5") = a;
+ register unsigned long r6 __asm__("r6") = b;
+ register unsigned long r7 __asm__("r7") = c;
+ register unsigned long r8 __asm__("r8") = d;
+ register unsigned long r9 __asm__("r9") = e;
+ register unsigned long r10 __asm__("r10") = f;
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12), "r"(r5), "r"(r6), "r"(r7), "r"(r8), "r"(r9), "r"(r10)
+ : "memory", "r4");
+ return r3;
+}
+
+#define SYSCALL_IPC_BROKEN_MODE
+
+#undef SYS_socketcall
diff --git a/libc-top-half/musl/arch/mips/arch.mak b/libc-top-half/musl/arch/mips/arch.mak
new file mode 100644
index 0000000..aa4d05c
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/arch.mak
@@ -0,0 +1 @@
+COMPAT_SRC_DIRS = compat/time32
diff --git a/libc-top-half/musl/arch/mips/atomic_arch.h b/libc-top-half/musl/arch/mips/atomic_arch.h
new file mode 100644
index 0000000..1248d17
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/atomic_arch.h
@@ -0,0 +1,58 @@
+#if __mips_isa_rev < 6
+#define LLSC_M "m"
+#else
+#define LLSC_M "ZC"
+#endif
+
+#define a_ll a_ll
+static inline int a_ll(volatile int *p)
+{
+ int v;
+#if __mips < 2
+ __asm__ __volatile__ (
+ ".set push ; .set mips2\n\t"
+ "ll %0, %1"
+ "\n\t.set pop"
+ : "=r"(v) : "m"(*p));
+#else
+ __asm__ __volatile__ (
+ "ll %0, %1"
+ : "=r"(v) : LLSC_M(*p));
+#endif
+ return v;
+}
+
+#define a_sc a_sc
+static inline int a_sc(volatile int *p, int v)
+{
+ int r;
+#if __mips < 2
+ __asm__ __volatile__ (
+ ".set push ; .set mips2\n\t"
+ "sc %0, %1"
+ "\n\t.set pop"
+ : "=r"(r), "=m"(*p) : "0"(v) : "memory");
+#else
+ __asm__ __volatile__ (
+ "sc %0, %1"
+ : "=r"(r), "="LLSC_M(*p) : "0"(v) : "memory");
+#endif
+ return r;
+}
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+#if __mips < 2
+ /* mips2 sync, but using too many directives causes
+ * gcc not to inline it, so encode with .long instead. */
+ __asm__ __volatile__ (".long 0xf" : : : "memory");
+#else
+ __asm__ __volatile__ ("sync" : : : "memory");
+#endif
+}
+
+#define a_pre_llsc a_barrier
+#define a_post_llsc a_barrier
+
+#undef LLSC_M
diff --git a/libc-top-half/musl/arch/mips/bits/alltypes.h.in b/libc-top-half/musl/arch/mips/bits/alltypes.h.in
new file mode 100644
index 0000000..ff934a4
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/alltypes.h.in
@@ -0,0 +1,21 @@
+#define _REDIR_TIME64 1
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+#if _MIPSEL || __MIPSEL || __MIPSEL__
+#define __BYTE_ORDER 1234
+#else
+#define __BYTE_ORDER 4321
+#endif
+
+#define __LONG_MAX 0x7fffffffL
+
+#ifndef __cplusplus
+TYPEDEF int wchar_t;
+#endif
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/mips/bits/errno.h b/libc-top-half/musl/arch/mips/bits/errno.h
new file mode 100644
index 0000000..1bb91e3
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/errno.h
@@ -0,0 +1,134 @@
+#define EPERM 1
+#define ENOENT 2
+#define ESRCH 3
+#define EINTR 4
+#define EIO 5
+#define ENXIO 6
+#define E2BIG 7
+#define ENOEXEC 8
+#define EBADF 9
+#define ECHILD 10
+#define EAGAIN 11
+#define ENOMEM 12
+#define EACCES 13
+#define EFAULT 14
+#define ENOTBLK 15
+#define EBUSY 16
+#define EEXIST 17
+#define EXDEV 18
+#define ENODEV 19
+#define ENOTDIR 20
+#define EISDIR 21
+#define EINVAL 22
+#define ENFILE 23
+#define EMFILE 24
+#define ENOTTY 25
+#define ETXTBSY 26
+#define EFBIG 27
+#define ENOSPC 28
+#define ESPIPE 29
+#define EROFS 30
+#define EMLINK 31
+#define EPIPE 32
+#define EDOM 33
+#define ERANGE 34
+#define ENOMSG 35
+#define EIDRM 36
+#define ECHRNG 37
+#define EL2NSYNC 38
+#define EL3HLT 39
+#define EL3RST 40
+#define ELNRNG 41
+#define EUNATCH 42
+#define ENOCSI 43
+#define EL2HLT 44
+#define EDEADLK 45
+#define ENOLCK 46
+#define EBADE 50
+#define EBADR 51
+#define EXFULL 52
+#define ENOANO 53
+#define EBADRQC 54
+#define EBADSLT 55
+#define EDEADLOCK 56
+#define EBFONT 59
+#define ENOSTR 60
+#define ENODATA 61
+#define ETIME 62
+#define ENOSR 63
+#define ENONET 64
+#define ENOPKG 65
+#define EREMOTE 66
+#define ENOLINK 67
+#define EADV 68
+#define ESRMNT 69
+#define ECOMM 70
+#define EPROTO 71
+#define EDOTDOT 73
+#define EMULTIHOP 74
+#define EBADMSG 77
+#define ENAMETOOLONG 78
+#define EOVERFLOW 79
+#define ENOTUNIQ 80
+#define EBADFD 81
+#define EREMCHG 82
+#define ELIBACC 83
+#define ELIBBAD 84
+#define ELIBSCN 85
+#define ELIBMAX 86
+#define ELIBEXEC 87
+#define EILSEQ 88
+#define ENOSYS 89
+#define ELOOP 90
+#define ERESTART 91
+#define ESTRPIPE 92
+#define ENOTEMPTY 93
+#define EUSERS 94
+#define ENOTSOCK 95
+#define EDESTADDRREQ 96
+#define EMSGSIZE 97
+#define EPROTOTYPE 98
+#define ENOPROTOOPT 99
+#define EPROTONOSUPPORT 120
+#define ESOCKTNOSUPPORT 121
+#define EOPNOTSUPP 122
+#define ENOTSUP EOPNOTSUPP
+#define EPFNOSUPPORT 123
+#define EAFNOSUPPORT 124
+#define EADDRINUSE 125
+#define EADDRNOTAVAIL 126
+#define ENETDOWN 127
+#define ENETUNREACH 128
+#define ENETRESET 129
+#define ECONNABORTED 130
+#define ECONNRESET 131
+#define ENOBUFS 132
+#define EISCONN 133
+#define ENOTCONN 134
+#define EUCLEAN 135
+#define ENOTNAM 137
+#define ENAVAIL 138
+#define EISNAM 139
+#define EREMOTEIO 140
+#define ESHUTDOWN 143
+#define ETOOMANYREFS 144
+#define ETIMEDOUT 145
+#define ECONNREFUSED 146
+#define EHOSTDOWN 147
+#define EHOSTUNREACH 148
+#define EWOULDBLOCK EAGAIN
+#define EALREADY 149
+#define EINPROGRESS 150
+#define ESTALE 151
+#define ECANCELED 158
+#define ENOMEDIUM 159
+#define EMEDIUMTYPE 160
+#define ENOKEY 161
+#define EKEYEXPIRED 162
+#define EKEYREVOKED 163
+#define EKEYREJECTED 164
+#define EOWNERDEAD 165
+#define ENOTRECOVERABLE 166
+#define ERFKILL 167
+#define EHWPOISON 168
+#define EDQUOT 1133
diff --git a/libc-top-half/musl/arch/mips/bits/fcntl.h b/libc-top-half/musl/arch/mips/bits/fcntl.h
new file mode 100644
index 0000000..9fd8c23
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/fcntl.h
@@ -0,0 +1,40 @@
+#define O_CREAT 0400
+#define O_EXCL 02000
+#define O_NOCTTY 04000
+#define O_TRUNC 01000
+#define O_APPEND 0010
+#define O_NONBLOCK 0200
+#define O_DSYNC 0020
+#define O_SYNC 040020
+#define O_RSYNC 040020
+#define O_DIRECTORY 0200000
+#define O_NOFOLLOW 0400000
+#define O_CLOEXEC 02000000
+
+#define O_ASYNC 010000
+#define O_DIRECT 0100000
+#define O_LARGEFILE 020000
+#define O_NOATIME 01000000
+#define O_PATH 010000000
+#define O_TMPFILE 020200000
+#define O_NDELAY O_NONBLOCK
+
+#define F_DUPFD 0
+#define F_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+
+#define F_SETOWN 24
+#define F_GETOWN 23
+#define F_SETSIG 10
+#define F_GETSIG 11
+
+#define F_GETLK 33
+#define F_SETLK 34
+#define F_SETLKW 35
+
+#define F_SETOWN_EX 15
+#define F_GETOWN_EX 16
+
+#define F_GETOWNER_UIDS 17
diff --git a/libc-top-half/musl/arch/mips/bits/fenv.h b/libc-top-half/musl/arch/mips/bits/fenv.h
new file mode 100644
index 0000000..589e71c
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/fenv.h
@@ -0,0 +1,25 @@
+#ifdef __mips_soft_float
+#define FE_ALL_EXCEPT 0
+#define FE_TONEAREST 0
+#else
+#define FE_INEXACT 4
+#define FE_UNDERFLOW 8
+#define FE_OVERFLOW 16
+#define FE_DIVBYZERO 32
+#define FE_INVALID 64
+
+#define FE_ALL_EXCEPT 124
+
+#define FE_TONEAREST 0
+#define FE_TOWARDZERO 1
+#define FE_UPWARD 2
+#define FE_DOWNWARD 3
+#endif
+
+typedef unsigned short fexcept_t;
+
+typedef struct {
+ unsigned __cw;
+} fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *) -1)
diff --git a/libc-top-half/musl/arch/mips/bits/float.h b/libc-top-half/musl/arch/mips/bits/float.h
new file mode 100644
index 0000000..c4a655e
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 4.94065645841246544177e-324L
+#define LDBL_MIN 2.22507385850720138309e-308L
+#define LDBL_MAX 1.79769313486231570815e+308L
+#define LDBL_EPSILON 2.22044604925031308085e-16L
+
+#define LDBL_MANT_DIG 53
+#define LDBL_MIN_EXP (-1021)
+#define LDBL_MAX_EXP 1024
+
+#define LDBL_DIG 15
+#define LDBL_MIN_10_EXP (-307)
+#define LDBL_MAX_10_EXP 308
+
+#define DECIMAL_DIG 17
diff --git a/libc-top-half/musl/arch/mips/bits/hwcap.h b/libc-top-half/musl/arch/mips/bits/hwcap.h
new file mode 100644
index 0000000..7986deb
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/hwcap.h
@@ -0,0 +1,14 @@
+#define HWCAP_MIPS_R6 (1 << 0)
+#define HWCAP_MIPS_MSA (1 << 1)
+#define HWCAP_MIPS_CRC32 (1 << 2)
+#define HWCAP_MIPS_MIPS16 (1 << 3)
+#define HWCAP_MIPS_MDMX (1 << 4)
+#define HWCAP_MIPS_MIPS3D (1 << 5)
+#define HWCAP_MIPS_SMARTMIPS (1 << 6)
+#define HWCAP_MIPS_DSP (1 << 7)
+#define HWCAP_MIPS_DSP2 (1 << 8)
+#define HWCAP_MIPS_DSP3 (1 << 9)
+#define HWCAP_MIPS_MIPS16E2 (1 << 10)
+#define HWCAP_LOONGSON_MMI (1 << 11)
+#define HWCAP_LOONGSON_EXT (1 << 12)
+#define HWCAP_LOONGSON_EXT2 (1 << 13)
diff --git a/libc-top-half/musl/arch/mips/bits/ioctl.h b/libc-top-half/musl/arch/mips/bits/ioctl.h
new file mode 100644
index 0000000..e20bf19
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/ioctl.h
@@ -0,0 +1,114 @@
+#define _IOC(a,b,c,d) ( ((a)<<29) | ((b)<<8) | (c) | ((d)<<16) )
+#define _IOC_NONE 1U
+#define _IOC_READ 2U
+#define _IOC_WRITE 4U
+
+#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0)
+#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c))
+#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c))
+#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c))
+
+#define TCGETA 0x5401
+#define TCSETA 0x5402
+#define TCSETAW 0x5403
+#define TCSETAF 0x5404
+#define TCSBRK 0x5405
+#define TCXONC 0x5406
+#define TCFLSH 0x5407
+#define TCGETS 0x540D
+#define TCSETS 0x540E
+#define TCSETSW 0x540F
+#define TCSETSF 0x5410
+
+#define TIOCEXCL 0x740D
+#define TIOCNXCL 0x740E
+#define TIOCOUTQ 0x7472
+#define TIOCSTI 0x5472
+#define TIOCMGET 0x741D
+#define TIOCMBIS 0x741B
+#define TIOCMBIC 0x741C
+#define TIOCMSET 0x741A
+
+#define TIOCPKT 0x5470
+#define TIOCSWINSZ _IOW('t', 103, struct winsize)
+#define TIOCGWINSZ _IOR('t', 104, struct winsize)
+#define TIOCNOTTY 0x5471
+#define TIOCSETD 0x7401
+#define TIOCGETD 0x7400
+
+#define FIOCLEX 0x6601
+#define FIONCLEX 0x6602
+#define FIOASYNC 0x667D
+#define FIONBIO 0x667E
+#define FIOQSIZE 0x667F
+
+#define TIOCGLTC 0x7474
+#define TIOCSLTC 0x7475
+#define TIOCSPGRP _IOW('t', 118, int)
+#define TIOCGPGRP _IOR('t', 119, int)
+#define TIOCCONS _IOW('t', 120, int)
+
+#define FIONREAD 0x467F
+#define TIOCINQ FIONREAD
+
+#define TIOCGETP 0x7408
+#define TIOCSETP 0x7409
+#define TIOCSETN 0x740A
+
+#define TIOCSBRK 0x5427
+#define TIOCCBRK 0x5428
+#define TIOCGSID 0x7416
+#define TIOCGRS485 _IOR('T', 0x2E, char[32])
+#define TIOCSRS485 _IOWR('T', 0x2F, char[32])
+#define TIOCGPTN _IOR('T', 0x30, unsigned int)
+#define TIOCSPTLCK _IOW('T', 0x31, int)
+#define TIOCGDEV _IOR('T', 0x32, unsigned int)
+#define TIOCSIG _IOW('T', 0x36, int)
+#define TIOCVHANGUP 0x5437
+#define TIOCGPKT _IOR('T', 0x38, int)
+#define TIOCGPTLCK _IOR('T', 0x39, int)
+#define TIOCGEXCL _IOR('T', 0x40, int)
+#define TIOCGPTPEER _IO('T', 0x41)
+
+#define TIOCSCTTY 0x5480
+#define TIOCGSOFTCAR 0x5481
+#define TIOCSSOFTCAR 0x5482
+#define TIOCLINUX 0x5483
+#define TIOCGSERIAL 0x5484
+#define TIOCSSERIAL 0x5485
+#define TCSBRKP 0x5486
+
+#define TIOCSERCONFIG 0x5488
+#define TIOCSERGWILD 0x5489
+#define TIOCSERSWILD 0x548A
+#define TIOCGLCKTRMIOS 0x548B
+#define TIOCSLCKTRMIOS 0x548C
+#define TIOCSERGSTRUCT 0x548D
+#define TIOCSERGETLSR 0x548E
+#define TIOCSERGETMULTI 0x548F
+#define TIOCSERSETMULTI 0x5490
+#define TIOCMIWAIT 0x5491
+#define TIOCGICOUNT 0x5492
+
+#define TIOCM_LE 0x001
+#define TIOCM_DTR 0x002
+#define TIOCM_RTS 0x004
+#define TIOCM_ST 0x010
+#define TIOCM_SR 0x020
+#define TIOCM_CTS 0x040
+#define TIOCM_CAR 0x100
+#define TIOCM_CD TIOCM_CAR
+#define TIOCM_RNG 0x200
+#define TIOCM_RI TIOCM_RNG
+#define TIOCM_DSR 0x400
+#define TIOCM_OUT1 0x2000
+#define TIOCM_OUT2 0x4000
+#define TIOCM_LOOP 0x8000
+
+#define FIOGETOWN _IOR('f', 123, int)
+#define FIOSETOWN _IOW('f', 124, int)
+#define SIOCATMARK _IOR('s', 7, int)
+#define SIOCSPGRP _IOW('s', 8, pid_t)
+#define SIOCGPGRP _IOR('s', 9, pid_t)
+#define SIOCGSTAMP _IOR(0x89, 6, char[16])
+#define SIOCGSTAMPNS _IOR(0x89, 7, char[16])
diff --git a/libc-top-half/musl/arch/mips/bits/ipcstat.h b/libc-top-half/musl/arch/mips/bits/ipcstat.h
new file mode 100644
index 0000000..4f4fcb0
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/ipcstat.h
@@ -0,0 +1 @@
+#define IPC_STAT 0x102
diff --git a/libc-top-half/musl/arch/mips/bits/mman.h b/libc-top-half/musl/arch/mips/bits/mman.h
new file mode 100644
index 0000000..9027bb6
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/mman.h
@@ -0,0 +1,25 @@
+#undef MAP_ANON
+#define MAP_ANON 0x800
+#undef MAP_NORESERVE
+#define MAP_NORESERVE 0x0400
+#undef MAP_GROWSDOWN
+#define MAP_GROWSDOWN 0x1000
+#undef MAP_DENYWRITE
+#define MAP_DENYWRITE 0x2000
+#undef MAP_EXECUTABLE
+#define MAP_EXECUTABLE 0x4000
+#undef MAP_LOCKED
+#define MAP_LOCKED 0x8000
+#undef MAP_POPULATE
+#define MAP_POPULATE 0x10000
+#undef MAP_NONBLOCK
+#define MAP_NONBLOCK 0x20000
+#undef MAP_STACK
+#define MAP_STACK 0x40000
+#undef MAP_HUGETLB
+#define MAP_HUGETLB 0x80000
+#undef MAP_SYNC
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#undef MADV_SOFT_OFFLINE
+#endif
diff --git a/libc-top-half/musl/arch/mips/bits/msg.h b/libc-top-half/musl/arch/mips/bits/msg.h
new file mode 100644
index 0000000..c734dbb
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/msg.h
@@ -0,0 +1,27 @@
+struct msqid_ds {
+ struct ipc_perm msg_perm;
+#if _MIPSEL || __MIPSEL || __MIPSEL__
+ unsigned long __msg_stime_lo;
+ unsigned long __msg_stime_hi;
+ unsigned long __msg_rtime_lo;
+ unsigned long __msg_rtime_hi;
+ unsigned long __msg_ctime_lo;
+ unsigned long __msg_ctime_hi;
+#else
+ unsigned long __msg_stime_hi;
+ unsigned long __msg_stime_lo;
+ unsigned long __msg_rtime_hi;
+ unsigned long __msg_rtime_lo;
+ unsigned long __msg_ctime_hi;
+ unsigned long __msg_ctime_lo;
+#endif
+ unsigned long msg_cbytes;
+ msgqnum_t msg_qnum;
+ msglen_t msg_qbytes;
+ pid_t msg_lspid;
+ pid_t msg_lrpid;
+ unsigned long __unused[2];
+ time_t msg_stime;
+ time_t msg_rtime;
+ time_t msg_ctime;
+};
diff --git a/libc-top-half/musl/arch/mips/bits/poll.h b/libc-top-half/musl/arch/mips/bits/poll.h
new file mode 100644
index 0000000..b0b1ed6
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/poll.h
@@ -0,0 +1,2 @@
+#define POLLWRNORM POLLOUT
+#define POLLWRBAND 0x100
diff --git a/libc-top-half/musl/arch/mips/bits/posix.h b/libc-top-half/musl/arch/mips/bits/posix.h
new file mode 100644
index 0000000..30a3871
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_ILP32_OFFBIG 1
+#define _POSIX_V7_ILP32_OFFBIG 1
diff --git a/libc-top-half/musl/arch/mips/bits/ptrace.h b/libc-top-half/musl/arch/mips/bits/ptrace.h
new file mode 100644
index 0000000..77a01c0
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/ptrace.h
@@ -0,0 +1,9 @@
+#define PTRACE_GET_THREAD_AREA 25
+#define PTRACE_SET_THREAD_AREA 26
+#define PTRACE_PEEKTEXT_3264 0xc0
+#define PTRACE_PEEKDATA_3264 0xc1
+#define PTRACE_POKETEXT_3264 0xc2
+#define PTRACE_POKEDATA_3264 0xc3
+#define PTRACE_GET_THREAD_AREA_3264 0xc4
+#define PTRACE_GET_WATCH_REGS 0xd0
+#define PTRACE_SET_WATCH_REGS 0xd1
diff --git a/libc-top-half/musl/arch/mips/bits/reg.h b/libc-top-half/musl/arch/mips/bits/reg.h
new file mode 100644
index 0000000..0c37098
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/reg.h
@@ -0,0 +1,47 @@
+#undef __WORDSIZE
+#define __WORDSIZE 32
+
+#define EF_R0 6
+#define EF_R1 7
+#define EF_R2 8
+#define EF_R3 9
+#define EF_R4 10
+#define EF_R5 11
+#define EF_R6 12
+#define EF_R7 13
+#define EF_R8 14
+#define EF_R9 15
+#define EF_R10 16
+#define EF_R11 17
+#define EF_R12 18
+#define EF_R13 19
+#define EF_R14 20
+#define EF_R15 21
+#define EF_R16 22
+#define EF_R17 23
+#define EF_R18 24
+#define EF_R19 25
+#define EF_R20 26
+#define EF_R21 27
+#define EF_R22 28
+#define EF_R23 29
+#define EF_R24 30
+#define EF_R25 31
+
+#define EF_R26 32
+#define EF_R27 33
+#define EF_R28 34
+#define EF_R29 35
+#define EF_R30 36
+#define EF_R31 37
+
+#define EF_LO 38
+#define EF_HI 39
+
+#define EF_CP0_EPC 40
+#define EF_CP0_BADVADDR 41
+#define EF_CP0_STATUS 42
+#define EF_CP0_CAUSE 43
+#define EF_UNUSED0 44
+
+#define EF_SIZE 180
diff --git a/libc-top-half/musl/arch/mips/bits/resource.h b/libc-top-half/musl/arch/mips/bits/resource.h
new file mode 100644
index 0000000..414a405
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/resource.h
@@ -0,0 +1,5 @@
+#define RLIMIT_NOFILE 5
+#define RLIMIT_AS 6
+#define RLIMIT_RSS 7
+#define RLIMIT_NPROC 8
+#define RLIMIT_MEMLOCK 9
diff --git a/libc-top-half/musl/arch/mips/bits/sem.h b/libc-top-half/musl/arch/mips/bits/sem.h
new file mode 100644
index 0000000..fe6f094
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/sem.h
@@ -0,0 +1,16 @@
+struct semid_ds {
+ struct ipc_perm sem_perm;
+ unsigned long __sem_otime_lo;
+ unsigned long __sem_ctime_lo;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned short sem_nsems;
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+#else
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+ unsigned short sem_nsems;
+#endif
+ unsigned long __sem_otime_hi;
+ unsigned long __sem_ctime_hi;
+ time_t sem_otime;
+ time_t sem_ctime;
+};
diff --git a/libc-top-half/musl/arch/mips/bits/setjmp.h b/libc-top-half/musl/arch/mips/bits/setjmp.h
new file mode 100644
index 0000000..30229a0
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long long __jmp_buf[13];
diff --git a/libc-top-half/musl/arch/mips/bits/shm.h b/libc-top-half/musl/arch/mips/bits/shm.h
new file mode 100644
index 0000000..ab8c642
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/shm.h
@@ -0,0 +1,29 @@
+#define SHMLBA 4096
+
+struct shmid_ds {
+ struct ipc_perm shm_perm;
+ size_t shm_segsz;
+ unsigned long __shm_atime_lo;
+ unsigned long __shm_dtime_lo;
+ unsigned long __shm_ctime_lo;
+ pid_t shm_cpid;
+ pid_t shm_lpid;
+ unsigned long shm_nattch;
+ unsigned short __shm_atime_hi;
+ unsigned short __shm_dtime_hi;
+ unsigned short __shm_ctime_hi;
+ unsigned short __pad1;
+ time_t shm_atime;
+ time_t shm_dtime;
+ time_t shm_ctime;
+};
+
+struct shminfo {
+ unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+};
+
+struct shm_info {
+ int __used_ids;
+ unsigned long shm_tot, shm_rss, shm_swp;
+ unsigned long __swap_attempts, __swap_successes;
+};
diff --git a/libc-top-half/musl/arch/mips/bits/signal.h b/libc-top-half/musl/arch/mips/bits/signal.h
new file mode 100644
index 0000000..1b69e76
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/signal.h
@@ -0,0 +1,124 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef unsigned long long greg_t, gregset_t[32];
+typedef struct {
+ union {
+ double fp_dregs[32];
+ struct {
+ float _fp_fregs;
+ unsigned _fp_pad;
+ } fp_fregs[32];
+ } fp_r;
+} fpregset_t;
+struct sigcontext {
+ unsigned sc_regmask, sc_status;
+ unsigned long long sc_pc;
+ gregset_t sc_regs;
+ fpregset_t sc_fpregs;
+ unsigned sc_ownedfp, sc_fpc_csr, sc_fpc_eir, sc_used_math, sc_dsp;
+ unsigned long long sc_mdhi, sc_mdlo;
+ unsigned long sc_hi1, sc_lo1, sc_hi2, sc_lo2, sc_hi3, sc_lo3;
+};
+typedef struct {
+ unsigned regmask, status;
+ unsigned long long pc;
+ gregset_t gregs;
+ fpregset_t fpregs;
+ unsigned ownedfp, fpc_csr, fpc_eir, used_math, dsp;
+ unsigned long long mdhi, mdlo;
+ unsigned long hi1, lo1, hi2, lo2, hi3, lo3;
+} mcontext_t;
+#else
+typedef struct {
+ unsigned __mc1[2];
+ unsigned long long __mc2[65];
+ unsigned __mc3[5];
+ unsigned long long __mc4[2];
+ unsigned __mc5[6];
+} mcontext_t;
+#endif
+
+struct sigaltstack {
+ void *ss_sp;
+ size_t ss_size;
+ int ss_flags;
+};
+
+typedef struct __ucontext {
+ unsigned long uc_flags;
+ struct __ucontext *uc_link;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ sigset_t uc_sigmask;
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 0x10000
+#define SA_SIGINFO 8
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#undef SIG_BLOCK
+#undef SIG_UNBLOCK
+#undef SIG_SETMASK
+#define SIG_BLOCK 1
+#define SIG_UNBLOCK 2
+#define SIG_SETMASK 3
+
+#undef SI_ASYNCIO
+#undef SI_MESGQ
+#undef SI_TIMER
+#define SI_ASYNCIO (-2)
+#define SI_MESGQ (-4)
+#define SI_TIMER (-3)
+
+#define __SI_SWAP_ERRNO_CODE
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGEMT 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGBUS 10
+#define SIGSEGV 11
+#define SIGSYS 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGUSR1 16
+#define SIGUSR2 17
+#define SIGCHLD 18
+#define SIGPWR 19
+#define SIGWINCH 20
+#define SIGURG 21
+#define SIGIO 22
+#define SIGPOLL SIGIO
+#define SIGSTOP 23
+#define SIGTSTP 24
+#define SIGCONT 25
+#define SIGTTIN 26
+#define SIGTTOU 27
+#define SIGVTALRM 28
+#define SIGPROF 29
+#define SIGXCPU 30
+#define SIGXFSZ 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 128
diff --git a/libc-top-half/musl/arch/mips/bits/socket.h b/libc-top-half/musl/arch/mips/bits/socket.h
new file mode 100644
index 0000000..02fbb88
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/socket.h
@@ -0,0 +1,35 @@
+#define SOCK_STREAM 2
+#define SOCK_DGRAM 1
+
+#define SOL_SOCKET 65535
+
+#define SO_DEBUG 1
+
+#define SO_REUSEADDR 0x0004
+#define SO_KEEPALIVE 0x0008
+#define SO_DONTROUTE 0x0010
+#define SO_BROADCAST 0x0020
+#define SO_LINGER 0x0080
+#define SO_OOBINLINE 0x0100
+#define SO_REUSEPORT 0x0200
+#define SO_SNDBUF 0x1001
+#define SO_RCVBUF 0x1002
+#define SO_SNDLOWAT 0x1003
+#define SO_RCVLOWAT 0x1004
+#define SO_ERROR 0x1007
+#define SO_TYPE 0x1008
+#define SO_ACCEPTCONN 0x1009
+#define SO_PROTOCOL 0x1028
+#define SO_DOMAIN 0x1029
+
+#define SO_NO_CHECK 11
+#define SO_PRIORITY 12
+#define SO_BSDCOMPAT 14
+#define SO_PASSCRED 17
+#define SO_PEERCRED 18
+#define SO_PEERSEC 30
+#define SO_SNDBUFFORCE 31
+#define SO_RCVBUFFORCE 33
+
+#define SOCK_NONBLOCK 0200
+#define SOCK_CLOEXEC 02000000
diff --git a/libc-top-half/musl/arch/mips/bits/stat.h b/libc-top-half/musl/arch/mips/bits/stat.h
new file mode 100644
index 0000000..48d4ac8
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/stat.h
@@ -0,0 +1,26 @@
+/* copied from kernel definition, but with padding replaced
+ * by the corresponding correctly-sized userspace types. */
+
+struct stat {
+ dev_t st_dev;
+ long __st_padding1[2];
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ long __st_padding2[2];
+ off_t st_size;
+ struct {
+ long tv_sec;
+ long tv_nsec;
+ } __st_atim32, __st_mtim32, __st_ctim32;
+ blksize_t st_blksize;
+ long __st_padding3;
+ blkcnt_t st_blocks;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+ long __st_padding4[2];
+};
diff --git a/libc-top-half/musl/arch/mips/bits/statfs.h b/libc-top-half/musl/arch/mips/bits/statfs.h
new file mode 100644
index 0000000..a73bd54
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/statfs.h
@@ -0,0 +1,8 @@
+struct statfs {
+ unsigned long f_type, f_bsize, f_frsize;
+ fsblkcnt_t f_blocks, f_bfree;
+ fsfilcnt_t f_files, f_ffree;
+ fsblkcnt_t f_bavail;
+ fsid_t f_fsid;
+ unsigned long f_namelen, f_flags, f_spare[5];
+};
diff --git a/libc-top-half/musl/arch/mips/bits/stdint.h b/libc-top-half/musl/arch/mips/bits/stdint.h
new file mode 100644
index 0000000..d1b2712
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#define SIZE_MAX UINT32_MAX
diff --git a/libc-top-half/musl/arch/mips/bits/syscall.h.in b/libc-top-half/musl/arch/mips/bits/syscall.h.in
new file mode 100644
index 0000000..63e3503
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/syscall.h.in
@@ -0,0 +1,421 @@
+#define __NR_syscall 4000
+#define __NR_exit 4001
+#define __NR_fork 4002
+#define __NR_read 4003
+#define __NR_write 4004
+#define __NR_open 4005
+#define __NR_close 4006
+#define __NR_waitpid 4007
+#define __NR_creat 4008
+#define __NR_link 4009
+#define __NR_unlink 4010
+#define __NR_execve 4011
+#define __NR_chdir 4012
+#define __NR_time 4013
+#define __NR_mknod 4014
+#define __NR_chmod 4015
+#define __NR_lchown 4016
+#define __NR_break 4017
+#define __NR_unused18 4018
+#define __NR_lseek 4019
+#define __NR_getpid 4020
+#define __NR_mount 4021
+#define __NR_umount 4022
+#define __NR_setuid 4023
+#define __NR_getuid 4024
+#define __NR_stime 4025
+#define __NR_ptrace 4026
+#define __NR_alarm 4027
+#define __NR_unused28 4028
+#define __NR_pause 4029
+#define __NR_utime 4030
+#define __NR_stty 4031
+#define __NR_gtty 4032
+#define __NR_access 4033
+#define __NR_nice 4034
+#define __NR_ftime 4035
+#define __NR_sync 4036
+#define __NR_kill 4037
+#define __NR_rename 4038
+#define __NR_mkdir 4039
+#define __NR_rmdir 4040
+#define __NR_dup 4041
+#define __NR_pipe 4042
+#define __NR_times 4043
+#define __NR_prof 4044
+#define __NR_brk 4045
+#define __NR_setgid 4046
+#define __NR_getgid 4047
+#define __NR_signal 4048
+#define __NR_geteuid 4049
+#define __NR_getegid 4050
+#define __NR_acct 4051
+#define __NR_umount2 4052
+#define __NR_lock 4053
+#define __NR_ioctl 4054
+#define __NR_fcntl 4055
+#define __NR_mpx 4056
+#define __NR_setpgid 4057
+#define __NR_ulimit 4058
+#define __NR_unused59 4059
+#define __NR_umask 4060
+#define __NR_chroot 4061
+#define __NR_ustat 4062
+#define __NR_dup2 4063
+#define __NR_getppid 4064
+#define __NR_getpgrp 4065
+#define __NR_setsid 4066
+#define __NR_sigaction 4067
+#define __NR_sgetmask 4068
+#define __NR_ssetmask 4069
+#define __NR_setreuid 4070
+#define __NR_setregid 4071
+#define __NR_sigsuspend 4072
+#define __NR_sigpending 4073
+#define __NR_sethostname 4074
+#define __NR_setrlimit 4075
+#define __NR_getrlimit 4076
+#define __NR_getrusage 4077
+#define __NR_gettimeofday_time32 4078
+#define __NR_settimeofday_time32 4079
+#define __NR_getgroups 4080
+#define __NR_setgroups 4081
+#define __NR_reserved82 4082
+#define __NR_symlink 4083
+#define __NR_unused84 4084
+#define __NR_readlink 4085
+#define __NR_uselib 4086
+#define __NR_swapon 4087
+#define __NR_reboot 4088
+#define __NR_readdir 4089
+#define __NR_mmap 4090
+#define __NR_munmap 4091
+#define __NR_truncate 4092
+#define __NR_ftruncate 4093
+#define __NR_fchmod 4094
+#define __NR_fchown 4095
+#define __NR_getpriority 4096
+#define __NR_setpriority 4097
+#define __NR_profil 4098
+#define __NR_statfs 4099
+#define __NR_fstatfs 4100
+#define __NR_ioperm 4101
+#define __NR_socketcall 4102
+#define __NR_syslog 4103
+#define __NR_setitimer 4104
+#define __NR_getitimer 4105
+#define __NR_stat 4106
+#define __NR_lstat 4107
+#define __NR_fstat 4108
+#define __NR_unused109 4109
+#define __NR_iopl 4110
+#define __NR_vhangup 4111
+#define __NR_idle 4112
+#define __NR_vm86 4113
+#define __NR_wait4 4114
+#define __NR_swapoff 4115
+#define __NR_sysinfo 4116
+#define __NR_ipc 4117
+#define __NR_fsync 4118
+#define __NR_sigreturn 4119
+#define __NR_clone 4120
+#define __NR_setdomainname 4121
+#define __NR_uname 4122
+#define __NR_modify_ldt 4123
+#define __NR_adjtimex 4124
+#define __NR_mprotect 4125
+#define __NR_sigprocmask 4126
+#define __NR_create_module 4127
+#define __NR_init_module 4128
+#define __NR_delete_module 4129
+#define __NR_get_kernel_syms 4130
+#define __NR_quotactl 4131
+#define __NR_getpgid 4132
+#define __NR_fchdir 4133
+#define __NR_bdflush 4134
+#define __NR_sysfs 4135
+#define __NR_personality 4136
+#define __NR_afs_syscall 4137
+#define __NR_setfsuid 4138
+#define __NR_setfsgid 4139
+#define __NR__llseek 4140
+#define __NR_getdents 4141
+#define __NR__newselect 4142
+#define __NR_flock 4143
+#define __NR_msync 4144
+#define __NR_readv 4145
+#define __NR_writev 4146
+#define __NR_cacheflush 4147
+#define __NR_cachectl 4148
+#define __NR_sysmips 4149
+#define __NR_unused150 4150
+#define __NR_getsid 4151
+#define __NR_fdatasync 4152
+#define __NR__sysctl 4153
+#define __NR_mlock 4154
+#define __NR_munlock 4155
+#define __NR_mlockall 4156
+#define __NR_munlockall 4157
+#define __NR_sched_setparam 4158
+#define __NR_sched_getparam 4159
+#define __NR_sched_setscheduler 4160
+#define __NR_sched_getscheduler 4161
+#define __NR_sched_yield 4162
+#define __NR_sched_get_priority_max 4163
+#define __NR_sched_get_priority_min 4164
+#define __NR_sched_rr_get_interval 4165
+#define __NR_nanosleep 4166
+#define __NR_mremap 4167
+#define __NR_accept 4168
+#define __NR_bind 4169
+#define __NR_connect 4170
+#define __NR_getpeername 4171
+#define __NR_getsockname 4172
+#define __NR_getsockopt 4173
+#define __NR_listen 4174
+#define __NR_recv 4175
+#define __NR_recvfrom 4176
+#define __NR_recvmsg 4177
+#define __NR_send 4178
+#define __NR_sendmsg 4179
+#define __NR_sendto 4180
+#define __NR_setsockopt 4181
+#define __NR_shutdown 4182
+#define __NR_socket 4183
+#define __NR_socketpair 4184
+#define __NR_setresuid 4185
+#define __NR_getresuid 4186
+#define __NR_query_module 4187
+#define __NR_poll 4188
+#define __NR_nfsservctl 4189
+#define __NR_setresgid 4190
+#define __NR_getresgid 4191
+#define __NR_prctl 4192
+#define __NR_rt_sigreturn 4193
+#define __NR_rt_sigaction 4194
+#define __NR_rt_sigprocmask 4195
+#define __NR_rt_sigpending 4196
+#define __NR_rt_sigtimedwait 4197
+#define __NR_rt_sigqueueinfo 4198
+#define __NR_rt_sigsuspend 4199
+#define __NR_pread64 4200
+#define __NR_pwrite64 4201
+#define __NR_chown 4202
+#define __NR_getcwd 4203
+#define __NR_capget 4204
+#define __NR_capset 4205
+#define __NR_sigaltstack 4206
+#define __NR_sendfile 4207
+#define __NR_getpmsg 4208
+#define __NR_putpmsg 4209
+#define __NR_mmap2 4210
+#define __NR_truncate64 4211
+#define __NR_ftruncate64 4212
+#define __NR_stat64 4213
+#define __NR_lstat64 4214
+#define __NR_fstat64 4215
+#define __NR_pivot_root 4216
+#define __NR_mincore 4217
+#define __NR_madvise 4218
+#define __NR_getdents64 4219
+#define __NR_fcntl64 4220
+#define __NR_reserved221 4221
+#define __NR_gettid 4222
+#define __NR_readahead 4223
+#define __NR_setxattr 4224
+#define __NR_lsetxattr 4225
+#define __NR_fsetxattr 4226
+#define __NR_getxattr 4227
+#define __NR_lgetxattr 4228
+#define __NR_fgetxattr 4229
+#define __NR_listxattr 4230
+#define __NR_llistxattr 4231
+#define __NR_flistxattr 4232
+#define __NR_removexattr 4233
+#define __NR_lremovexattr 4234
+#define __NR_fremovexattr 4235
+#define __NR_tkill 4236
+#define __NR_sendfile64 4237
+#define __NR_futex 4238
+#define __NR_sched_setaffinity 4239
+#define __NR_sched_getaffinity 4240
+#define __NR_io_setup 4241
+#define __NR_io_destroy 4242
+#define __NR_io_getevents 4243
+#define __NR_io_submit 4244
+#define __NR_io_cancel 4245
+#define __NR_exit_group 4246
+#define __NR_lookup_dcookie 4247
+#define __NR_epoll_create 4248
+#define __NR_epoll_ctl 4249
+#define __NR_epoll_wait 4250
+#define __NR_remap_file_pages 4251
+#define __NR_set_tid_address 4252
+#define __NR_restart_syscall 4253
+#define __NR_fadvise64 4254
+#define __NR_statfs64 4255
+#define __NR_fstatfs64 4256
+#define __NR_timer_create 4257
+#define __NR_timer_settime32 4258
+#define __NR_timer_gettime32 4259
+#define __NR_timer_getoverrun 4260
+#define __NR_timer_delete 4261
+#define __NR_clock_settime32 4262
+#define __NR_clock_gettime32 4263
+#define __NR_clock_getres_time32 4264
+#define __NR_clock_nanosleep_time32 4265
+#define __NR_tgkill 4266
+#define __NR_utimes 4267
+#define __NR_mbind 4268
+#define __NR_get_mempolicy 4269
+#define __NR_set_mempolicy 4270
+#define __NR_mq_open 4271
+#define __NR_mq_unlink 4272
+#define __NR_mq_timedsend 4273
+#define __NR_mq_timedreceive 4274
+#define __NR_mq_notify 4275
+#define __NR_mq_getsetattr 4276
+#define __NR_vserver 4277
+#define __NR_waitid 4278
+#define __NR_add_key 4280
+#define __NR_request_key 4281
+#define __NR_keyctl 4282
+#define __NR_set_thread_area 4283
+#define __NR_inotify_init 4284
+#define __NR_inotify_add_watch 4285
+#define __NR_inotify_rm_watch 4286
+#define __NR_migrate_pages 4287
+#define __NR_openat 4288
+#define __NR_mkdirat 4289
+#define __NR_mknodat 4290
+#define __NR_fchownat 4291
+#define __NR_futimesat 4292
+#define __NR_fstatat64 4293
+#define __NR_unlinkat 4294
+#define __NR_renameat 4295
+#define __NR_linkat 4296
+#define __NR_symlinkat 4297
+#define __NR_readlinkat 4298
+#define __NR_fchmodat 4299
+#define __NR_faccessat 4300
+#define __NR_pselect6 4301
+#define __NR_ppoll 4302
+#define __NR_unshare 4303
+#define __NR_splice 4304
+#define __NR_sync_file_range 4305
+#define __NR_tee 4306
+#define __NR_vmsplice 4307
+#define __NR_move_pages 4308
+#define __NR_set_robust_list 4309
+#define __NR_get_robust_list 4310
+#define __NR_kexec_load 4311
+#define __NR_getcpu 4312
+#define __NR_epoll_pwait 4313
+#define __NR_ioprio_set 4314
+#define __NR_ioprio_get 4315
+#define __NR_utimensat 4316
+#define __NR_signalfd 4317
+#define __NR_timerfd 4318
+#define __NR_eventfd 4319
+#define __NR_fallocate 4320
+#define __NR_timerfd_create 4321
+#define __NR_timerfd_gettime32 4322
+#define __NR_timerfd_settime32 4323
+#define __NR_signalfd4 4324
+#define __NR_eventfd2 4325
+#define __NR_epoll_create1 4326
+#define __NR_dup3 4327
+#define __NR_pipe2 4328
+#define __NR_inotify_init1 4329
+#define __NR_preadv 4330
+#define __NR_pwritev 4331
+#define __NR_rt_tgsigqueueinfo 4332
+#define __NR_perf_event_open 4333
+#define __NR_accept4 4334
+#define __NR_recvmmsg 4335
+#define __NR_fanotify_init 4336
+#define __NR_fanotify_mark 4337
+#define __NR_prlimit64 4338
+#define __NR_name_to_handle_at 4339
+#define __NR_open_by_handle_at 4340
+#define __NR_clock_adjtime 4341
+#define __NR_syncfs 4342
+#define __NR_sendmmsg 4343
+#define __NR_setns 4344
+#define __NR_process_vm_readv 4345
+#define __NR_process_vm_writev 4346
+#define __NR_kcmp 4347
+#define __NR_finit_module 4348
+#define __NR_sched_setattr 4349
+#define __NR_sched_getattr 4350
+#define __NR_renameat2 4351
+#define __NR_seccomp 4352
+#define __NR_getrandom 4353
+#define __NR_memfd_create 4354
+#define __NR_bpf 4355
+#define __NR_execveat 4356
+#define __NR_userfaultfd 4357
+#define __NR_membarrier 4358
+#define __NR_mlock2 4359
+#define __NR_copy_file_range 4360
+#define __NR_preadv2 4361
+#define __NR_pwritev2 4362
+#define __NR_pkey_mprotect 4363
+#define __NR_pkey_alloc 4364
+#define __NR_pkey_free 4365
+#define __NR_statx 4366
+#define __NR_rseq 4367
+#define __NR_io_pgetevents 4368
+#define __NR_semget 4393
+#define __NR_semctl 4394
+#define __NR_shmget 4395
+#define __NR_shmctl 4396
+#define __NR_shmat 4397
+#define __NR_shmdt 4398
+#define __NR_msgget 4399
+#define __NR_msgsnd 4400
+#define __NR_msgrcv 4401
+#define __NR_msgctl 4402
+#define __NR_clock_gettime64 4403
+#define __NR_clock_settime64 4404
+#define __NR_clock_adjtime64 4405
+#define __NR_clock_getres_time64 4406
+#define __NR_clock_nanosleep_time64 4407
+#define __NR_timer_gettime64 4408
+#define __NR_timer_settime64 4409
+#define __NR_timerfd_gettime64 4410
+#define __NR_timerfd_settime64 4411
+#define __NR_utimensat_time64 4412
+#define __NR_pselect6_time64 4413
+#define __NR_ppoll_time64 4414
+#define __NR_io_pgetevents_time64 4416
+#define __NR_recvmmsg_time64 4417
+#define __NR_mq_timedsend_time64 4418
+#define __NR_mq_timedreceive_time64 4419
+#define __NR_semtimedop_time64 4420
+#define __NR_rt_sigtimedwait_time64 4421
+#define __NR_futex_time64 4422
+#define __NR_sched_rr_get_interval_time64 4423
+#define __NR_pidfd_send_signal 4424
+#define __NR_io_uring_setup 4425
+#define __NR_io_uring_enter 4426
+#define __NR_io_uring_register 4427
+#define __NR_open_tree 4428
+#define __NR_move_mount 4429
+#define __NR_fsopen 4430
+#define __NR_fsconfig 4431
+#define __NR_fsmount 4432
+#define __NR_fspick 4433
+#define __NR_pidfd_open 4434
+#define __NR_clone3 4435
+#define __NR_close_range 4436
+#define __NR_openat2 4437
+#define __NR_pidfd_getfd 4438
+#define __NR_faccessat2 4439
+#define __NR_process_madvise 4440
+#define __NR_epoll_pwait2 4441
+#define __NR_mount_setattr 4442
+#define __NR_landlock_create_ruleset 4444
+#define __NR_landlock_add_rule 4445
+#define __NR_landlock_restrict_self 4446
+
diff --git a/libc-top-half/musl/arch/mips/bits/termios.h b/libc-top-half/musl/arch/mips/bits/termios.h
new file mode 100644
index 0000000..9d571f7
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/termios.h
@@ -0,0 +1,169 @@
+struct termios {
+ tcflag_t c_iflag;
+ tcflag_t c_oflag;
+ tcflag_t c_cflag;
+ tcflag_t c_lflag;
+ cc_t c_line;
+ cc_t c_cc[NCCS];
+ speed_t __c_ispeed;
+ speed_t __c_ospeed;
+};
+
+#define VINTR 0
+#define VQUIT 1
+#define VERASE 2
+#define VKILL 3
+#define VMIN 4
+#define VTIME 5
+#define VEOL2 6
+#define VSWTC 7
+#define VSWTCH 7
+#define VSTART 8
+#define VSTOP 9
+#define VSUSP 10
+#define VREPRINT 12
+#define VDISCARD 13
+#define VWERASE 14
+#define VLNEXT 15
+#define VEOF 16
+#define VEOL 17
+
+#define IGNBRK 0000001
+#define BRKINT 0000002
+#define IGNPAR 0000004
+#define PARMRK 0000010
+#define INPCK 0000020
+#define ISTRIP 0000040
+#define INLCR 0000100
+#define IGNCR 0000200
+#define ICRNL 0000400
+#define IUCLC 0001000
+#define IXON 0002000
+#define IXANY 0004000
+#define IXOFF 0010000
+#define IMAXBEL 0020000
+#define IUTF8 0040000
+
+#define OPOST 0000001
+#define OLCUC 0000002
+#define ONLCR 0000004
+#define OCRNL 0000010
+#define ONOCR 0000020
+#define ONLRET 0000040
+#define OFILL 0000100
+#define OFDEL 0000200
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE)
+#define NLDLY 0000400
+#define NL0 0000000
+#define NL1 0000400
+#define CRDLY 0003000
+#define CR0 0000000
+#define CR1 0001000
+#define CR2 0002000
+#define CR3 0003000
+#define TABDLY 0014000
+#define TAB0 0000000
+#define TAB1 0004000
+#define TAB2 0010000
+#define TAB3 0014000
+#define BSDLY 0020000
+#define BS0 0000000
+#define BS1 0020000
+#define FFDLY 0100000
+#define FF0 0000000
+#define FF1 0100000
+#endif
+
+#define VTDLY 0040000
+#define VT0 0000000
+#define VT1 0040000
+
+#define B0 0000000
+#define B50 0000001
+#define B75 0000002
+#define B110 0000003
+#define B134 0000004
+#define B150 0000005
+#define B200 0000006
+#define B300 0000007
+#define B600 0000010
+#define B1200 0000011
+#define B1800 0000012
+#define B2400 0000013
+#define B4800 0000014
+#define B9600 0000015
+#define B19200 0000016
+#define B38400 0000017
+
+#define B57600 0010001
+#define B115200 0010002
+#define B230400 0010003
+#define B460800 0010004
+#define B500000 0010005
+#define B576000 0010006
+#define B921600 0010007
+#define B1000000 0010010
+#define B1152000 0010011
+#define B1500000 0010012
+#define B2000000 0010013
+#define B2500000 0010014
+#define B3000000 0010015
+#define B3500000 0010016
+#define B4000000 0010017
+
+#define CSIZE 0000060
+#define CS5 0000000
+#define CS6 0000020
+#define CS7 0000040
+#define CS8 0000060
+#define CSTOPB 0000100
+#define CREAD 0000200
+#define PARENB 0000400
+#define PARODD 0001000
+#define HUPCL 0002000
+#define CLOCAL 0004000
+
+#define ISIG 0000001
+#define ICANON 0000002
+#define ECHO 0000010
+#define ECHOE 0000020
+#define ECHOK 0000040
+#define ECHONL 0000100
+#define NOFLSH 0000200
+#define IEXTEN 0000400
+#define TOSTOP 0100000
+#define ITOSTOP 0100000
+
+#define TCOOFF 0
+#define TCOON 1
+#define TCIOFF 2
+#define TCION 3
+
+#define TCIFLUSH 0
+#define TCOFLUSH 1
+#define TCIOFLUSH 2
+
+#define TCSANOW 0
+#define TCSADRAIN 1
+#define TCSAFLUSH 2
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define EXTA 0000016
+#define EXTB 0000017
+#define CBAUD 0010017
+#define CBAUDEX 0010000
+#define CIBAUD 002003600000
+#define CMSPAR 010000000000
+#define CRTSCTS 020000000000
+
+#define XCASE 0000004
+#define ECHOCTL 0001000
+#define ECHOPRT 0002000
+#define ECHOKE 0004000
+#define FLUSHO 0020000
+#define PENDIN 0040000
+#define EXTPROC 0200000
+
+#define XTABS 0014000
+#define TIOCSER_TEMT 1
+#endif
diff --git a/libc-top-half/musl/arch/mips/bits/user.h b/libc-top-half/musl/arch/mips/bits/user.h
new file mode 100644
index 0000000..3e26249
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/bits/user.h
@@ -0,0 +1,13 @@
+struct user {
+ unsigned long regs[45+64];
+ unsigned long u_tsize, u_dsize, u_ssize;
+ unsigned long start_code, start_data, start_stack;
+ long signal;
+ void *u_ar0;
+ unsigned long magic;
+ char u_comm[32];
+};
+#define ELF_NGREG 45
+#define ELF_NFPREG 33
+typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG];
+typedef double elf_fpreg_t, elf_fpregset_t[ELF_NFPREG];
diff --git a/libc-top-half/musl/arch/mips/crt_arch.h b/libc-top-half/musl/arch/mips/crt_arch.h
new file mode 100644
index 0000000..9fc50d7
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/crt_arch.h
@@ -0,0 +1,29 @@
+__asm__(
+".set push\n"
+".set noreorder\n"
+".text \n"
+".global _" START "\n"
+".global " START "\n"
+".type _" START ", @function\n"
+".type " START ", @function\n"
+"_" START ":\n"
+"" START ":\n"
+" bal 1f \n"
+" move $fp, $0 \n"
+" .gpword . \n"
+" .gpword " START "_c \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+" .gpword _DYNAMIC \n"
+"1: lw $gp, 0($ra) \n"
+" subu $gp, $ra, $gp \n"
+" move $4, $sp \n"
+" lw $5, 8($ra) \n"
+" addu $5, $5, $gp \n"
+" lw $25, 4($ra) \n"
+" addu $25, $25, $gp \n"
+" and $sp, $sp, -8 \n"
+" jalr $25 \n"
+" subu $sp, $sp, 16 \n"
+".set pop \n"
+);
diff --git a/libc-top-half/musl/arch/mips/ksigaction.h b/libc-top-half/musl/arch/mips/ksigaction.h
new file mode 100644
index 0000000..63fdfab
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/ksigaction.h
@@ -0,0 +1,13 @@
+#include <features.h>
+
+struct k_sigaction {
+ unsigned flags;
+ void (*handler)(int);
+ unsigned long mask[4];
+ /* The following field is past the end of the structure the
+ * kernel will read or write, and exists only to avoid having
+ * mips-specific preprocessor conditionals in sigaction.c. */
+ void (*restorer)();
+};
+
+hidden void __restore(), __restore_rt();
diff --git a/libc-top-half/musl/arch/mips/kstat.h b/libc-top-half/musl/arch/mips/kstat.h
new file mode 100644
index 0000000..5e637ea
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/kstat.h
@@ -0,0 +1,22 @@
+struct kstat {
+ unsigned st_dev;
+ long __st_padding1[3];
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ unsigned st_rdev;
+ long __st_padding2[3];
+ off_t st_size;
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ blksize_t st_blksize;
+ long __st_padding3;
+ blkcnt_t st_blocks;
+ long __st_padding4[14];
+};
diff --git a/libc-top-half/musl/arch/mips/pthread_arch.h b/libc-top-half/musl/arch/mips/pthread_arch.h
new file mode 100644
index 0000000..376b774
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/pthread_arch.h
@@ -0,0 +1,18 @@
+static inline uintptr_t __get_tp()
+{
+ register uintptr_t tp __asm__("$3");
+#if __mips_isa_rev < 2
+ __asm__ (".word 0x7c03e83b" : "=r" (tp) );
+#else
+ __asm__ ("rdhwr %0, $29" : "=r" (tp) );
+#endif
+ return tp;
+}
+
+#define TLS_ABOVE_TP
+#define GAP_ABOVE_TP 0
+
+#define TP_OFFSET 0x7000
+#define DTP_OFFSET 0x8000
+
+#define MC_PC pc
diff --git a/libc-top-half/musl/arch/mips/reloc.h b/libc-top-half/musl/arch/mips/reloc.h
new file mode 100644
index 0000000..88d2363
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/reloc.h
@@ -0,0 +1,50 @@
+#if __mips_isa_rev >= 6
+#define ISA_SUFFIX "r6"
+#else
+#define ISA_SUFFIX ""
+#endif
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define ENDIAN_SUFFIX "el"
+#else
+#define ENDIAN_SUFFIX ""
+#endif
+
+#ifdef __mips_soft_float
+#define FP_SUFFIX "-sf"
+#else
+#define FP_SUFFIX ""
+#endif
+
+#define LDSO_ARCH "mips" ISA_SUFFIX ENDIAN_SUFFIX FP_SUFFIX
+
+#define TPOFF_K (-0x7000)
+
+#define REL_SYM_OR_REL R_MIPS_REL32
+#define REL_PLT R_MIPS_JUMP_SLOT
+#define REL_COPY R_MIPS_COPY
+#define REL_DTPMOD R_MIPS_TLS_DTPMOD32
+#define REL_DTPOFF R_MIPS_TLS_DTPREL32
+#define REL_TPOFF R_MIPS_TLS_TPREL32
+
+#define NEED_MIPS_GOT_RELOCS 1
+#define DT_DEBUG_INDIRECT DT_MIPS_RLD_MAP
+#define ARCH_SYM_REJECT_UND(s) (!((s)->st_other & STO_MIPS_PLT))
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "move $sp,%1 ; jr %0" : : "r"(pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+ ".hidden " #sym "\n" \
+ ".set push \n" \
+ ".set noreorder \n" \
+ " bal 1f \n" \
+ " nop \n" \
+ " .gpword . \n" \
+ " .gpword " #sym " \n" \
+ "1: lw %0, ($ra) \n" \
+ " subu %0, $ra, %0 \n" \
+ " lw $ra, 4($ra) \n" \
+ " addu %0, %0, $ra \n" \
+ ".set pop \n" \
+ : "=r"(*(fp)) : : "memory", "ra" )
diff --git a/libc-top-half/musl/arch/mips/syscall_arch.h b/libc-top-half/musl/arch/mips/syscall_arch.h
new file mode 100644
index 0000000..5b7c38d
--- /dev/null
+++ b/libc-top-half/musl/arch/mips/syscall_arch.h
@@ -0,0 +1,153 @@
+#define __SYSCALL_LL_E(x) \
+((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
+((union { long long ll; long l[2]; }){ .ll = x }).l[1]
+#define __SYSCALL_LL_O(x) 0, __SYSCALL_LL_E((x))
+
+#define SYSCALL_RLIM_INFINITY (-1UL/2)
+
+#if __mips_isa_rev >= 6
+#define SYSCALL_CLOBBERLIST \
+ "$1", "$3", "$11", "$12", "$13", \
+ "$14", "$15", "$24", "$25", "memory"
+#else
+#define SYSCALL_CLOBBERLIST \
+ "$1", "$3", "$11", "$12", "$13", \
+ "$14", "$15", "$24", "$25", "hi", "lo", "memory"
+#endif
+
+static inline long __syscall0(long n)
+{
+ register long r7 __asm__("$7");
+ register long r2 __asm__("$2");
+ __asm__ __volatile__ (
+ "addu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "=r"(r7)
+ : "ir"(n), "0"(r2)
+ : SYSCALL_CLOBBERLIST, "$8", "$9", "$10");
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register long r4 __asm__("$4") = a;
+ register long r7 __asm__("$7");
+ register long r2 __asm__("$2");
+ __asm__ __volatile__ (
+ "addu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "=r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4)
+ : SYSCALL_CLOBBERLIST, "$8", "$9", "$10");
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r7 __asm__("$7");
+ register long r2 __asm__("$2");
+ __asm__ __volatile__ (
+ "addu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "=r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5)
+ : SYSCALL_CLOBBERLIST, "$8", "$9", "$10");
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r6 __asm__("$6") = c;
+ register long r7 __asm__("$7");
+ register long r2 __asm__("$2");
+ __asm__ __volatile__ (
+ "addu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "=r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5), "r"(r6)
+ : SYSCALL_CLOBBERLIST, "$8", "$9", "$10");
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r6 __asm__("$6") = c;
+ register long r7 __asm__("$7") = d;
+ register long r2 __asm__("$2");
+ __asm__ __volatile__ (
+ "addu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "+r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5), "r"(r6)
+ : SYSCALL_CLOBBERLIST, "$8", "$9", "$10");
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r6 __asm__("$6") = c;
+ register long r7 __asm__("$7") = d;
+ register long r8 __asm__("$8") = e;
+ register long r2 __asm__("$2");
+ __asm__ __volatile__ (
+ "subu $sp,$sp,32 ; sw $8,16($sp) ; "
+ "addu $2,$0,%3 ; syscall ;"
+ "addu $sp,$sp,32"
+ : "=&r"(r2), "+r"(r7), "+r"(r8)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5), "r"(r6)
+ : SYSCALL_CLOBBERLIST, "$9", "$10");
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r6 __asm__("$6") = c;
+ register long r7 __asm__("$7") = d;
+ register long r8 __asm__("$8") = e;
+ register long r9 __asm__("$9") = f;
+ register long r2 __asm__("$2");
+ __asm__ __volatile__ (
+ "subu $sp,$sp,32 ; sw $8,16($sp) ; sw $9,20($sp) ; "
+ "addu $2,$0,%4 ; syscall ;"
+ "addu $sp,$sp,32"
+ : "=&r"(r2), "+r"(r7), "+r"(r8), "+r"(r9)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5), "r"(r6)
+ : SYSCALL_CLOBBERLIST, "$10");
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall7(long n, long a, long b, long c, long d, long e, long f, long g)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r6 __asm__("$6") = c;
+ register long r7 __asm__("$7") = d;
+ register long r8 __asm__("$8") = e;
+ register long r9 __asm__("$9") = f;
+ register long r10 __asm__("$10") = g;
+ register long r2 __asm__("$2");
+ __asm__ __volatile__ (
+ "subu $sp,$sp,32 ; sw $8,16($sp) ; sw $9,20($sp) ; sw $10,24($sp) ; "
+ "addu $2,$0,%5 ; syscall ;"
+ "addu $sp,$sp,32"
+ : "=&r"(r2), "+r"(r7), "+r"(r8), "+r"(r9), "+r"(r10)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5), "r"(r6)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+#define VDSO_USEFUL
+#define VDSO_CGT32_SYM "__vdso_clock_gettime"
+#define VDSO_CGT32_VER "LINUX_2.6"
+#define VDSO_CGT_SYM "__vdso_clock_gettime64"
+#define VDSO_CGT_VER "LINUX_2.6"
+
+#define SO_SNDTIMEO_OLD 0x1005
+#define SO_RCVTIMEO_OLD 0x1006
+
+#undef SYS_socketcall
diff --git a/libc-top-half/musl/arch/mips64/atomic_arch.h b/libc-top-half/musl/arch/mips64/atomic_arch.h
new file mode 100644
index 0000000..d0f8b4a
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/atomic_arch.h
@@ -0,0 +1,56 @@
+#if __mips_isa_rev < 6
+#define LLSC_M "m"
+#else
+#define LLSC_M "ZC"
+#endif
+
+#define a_ll a_ll
+static inline int a_ll(volatile int *p)
+{
+ int v;
+ __asm__ __volatile__ (
+ "ll %0, %1"
+ : "=r"(v) : LLSC_M(*p));
+ return v;
+}
+
+#define a_sc a_sc
+static inline int a_sc(volatile int *p, int v)
+{
+ int r;
+ __asm__ __volatile__ (
+ "sc %0, %1"
+ : "=r"(r), "="LLSC_M(*p) : "0"(v) : "memory");
+ return r;
+}
+
+#define a_ll_p a_ll_p
+static inline void *a_ll_p(volatile void *p)
+{
+ void *v;
+ __asm__ __volatile__ (
+ "lld %0, %1"
+ : "=r"(v) : LLSC_M(*(void *volatile *)p));
+ return v;
+}
+
+#define a_sc_p a_sc_p
+static inline int a_sc_p(volatile void *p, void *v)
+{
+ long r;
+ __asm__ __volatile__ (
+ "scd %0, %1"
+ : "=r"(r), "="LLSC_M(*(void *volatile *)p) : "0"(v) : "memory");
+ return r;
+}
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ __asm__ __volatile__ ("sync" : : : "memory");
+}
+
+#define a_pre_llsc a_barrier
+#define a_post_llsc a_barrier
+
+#undef LLSC_M
diff --git a/libc-top-half/musl/arch/mips64/bits/alltypes.h.in b/libc-top-half/musl/arch/mips64/bits/alltypes.h.in
new file mode 100644
index 0000000..fcd61ee
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/alltypes.h.in
@@ -0,0 +1,22 @@
+#define _Addr long
+#define _Int64 long
+#define _Reg long
+
+#if _MIPSEL || __MIPSEL || __MIPSEL__
+#define __BYTE_ORDER 1234
+#else
+#define __BYTE_ORDER 4321
+#endif
+
+#define __LONG_MAX 0x7fffffffffffffffL
+
+#ifndef __cplusplus
+TYPEDEF int wchar_t;
+#endif
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
+
+TYPEDEF unsigned nlink_t;
diff --git a/libc-top-half/musl/arch/mips64/bits/errno.h b/libc-top-half/musl/arch/mips64/bits/errno.h
new file mode 100644
index 0000000..1bb91e3
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/errno.h
@@ -0,0 +1,134 @@
+#define EPERM 1
+#define ENOENT 2
+#define ESRCH 3
+#define EINTR 4
+#define EIO 5
+#define ENXIO 6
+#define E2BIG 7
+#define ENOEXEC 8
+#define EBADF 9
+#define ECHILD 10
+#define EAGAIN 11
+#define ENOMEM 12
+#define EACCES 13
+#define EFAULT 14
+#define ENOTBLK 15
+#define EBUSY 16
+#define EEXIST 17
+#define EXDEV 18
+#define ENODEV 19
+#define ENOTDIR 20
+#define EISDIR 21
+#define EINVAL 22
+#define ENFILE 23
+#define EMFILE 24
+#define ENOTTY 25
+#define ETXTBSY 26
+#define EFBIG 27
+#define ENOSPC 28
+#define ESPIPE 29
+#define EROFS 30
+#define EMLINK 31
+#define EPIPE 32
+#define EDOM 33
+#define ERANGE 34
+#define ENOMSG 35
+#define EIDRM 36
+#define ECHRNG 37
+#define EL2NSYNC 38
+#define EL3HLT 39
+#define EL3RST 40
+#define ELNRNG 41
+#define EUNATCH 42
+#define ENOCSI 43
+#define EL2HLT 44
+#define EDEADLK 45
+#define ENOLCK 46
+#define EBADE 50
+#define EBADR 51
+#define EXFULL 52
+#define ENOANO 53
+#define EBADRQC 54
+#define EBADSLT 55
+#define EDEADLOCK 56
+#define EBFONT 59
+#define ENOSTR 60
+#define ENODATA 61
+#define ETIME 62
+#define ENOSR 63
+#define ENONET 64
+#define ENOPKG 65
+#define EREMOTE 66
+#define ENOLINK 67
+#define EADV 68
+#define ESRMNT 69
+#define ECOMM 70
+#define EPROTO 71
+#define EDOTDOT 73
+#define EMULTIHOP 74
+#define EBADMSG 77
+#define ENAMETOOLONG 78
+#define EOVERFLOW 79
+#define ENOTUNIQ 80
+#define EBADFD 81
+#define EREMCHG 82
+#define ELIBACC 83
+#define ELIBBAD 84
+#define ELIBSCN 85
+#define ELIBMAX 86
+#define ELIBEXEC 87
+#define EILSEQ 88
+#define ENOSYS 89
+#define ELOOP 90
+#define ERESTART 91
+#define ESTRPIPE 92
+#define ENOTEMPTY 93
+#define EUSERS 94
+#define ENOTSOCK 95
+#define EDESTADDRREQ 96
+#define EMSGSIZE 97
+#define EPROTOTYPE 98
+#define ENOPROTOOPT 99
+#define EPROTONOSUPPORT 120
+#define ESOCKTNOSUPPORT 121
+#define EOPNOTSUPP 122
+#define ENOTSUP EOPNOTSUPP
+#define EPFNOSUPPORT 123
+#define EAFNOSUPPORT 124
+#define EADDRINUSE 125
+#define EADDRNOTAVAIL 126
+#define ENETDOWN 127
+#define ENETUNREACH 128
+#define ENETRESET 129
+#define ECONNABORTED 130
+#define ECONNRESET 131
+#define ENOBUFS 132
+#define EISCONN 133
+#define ENOTCONN 134
+#define EUCLEAN 135
+#define ENOTNAM 137
+#define ENAVAIL 138
+#define EISNAM 139
+#define EREMOTEIO 140
+#define ESHUTDOWN 143
+#define ETOOMANYREFS 144
+#define ETIMEDOUT 145
+#define ECONNREFUSED 146
+#define EHOSTDOWN 147
+#define EHOSTUNREACH 148
+#define EWOULDBLOCK EAGAIN
+#define EALREADY 149
+#define EINPROGRESS 150
+#define ESTALE 151
+#define ECANCELED 158
+#define ENOMEDIUM 159
+#define EMEDIUMTYPE 160
+#define ENOKEY 161
+#define EKEYEXPIRED 162
+#define EKEYREVOKED 163
+#define EKEYREJECTED 164
+#define EOWNERDEAD 165
+#define ENOTRECOVERABLE 166
+#define ERFKILL 167
+#define EHWPOISON 168
+#define EDQUOT 1133
diff --git a/libc-top-half/musl/arch/mips64/bits/fcntl.h b/libc-top-half/musl/arch/mips64/bits/fcntl.h
new file mode 100644
index 0000000..5da1eef
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/fcntl.h
@@ -0,0 +1,40 @@
+#define O_CREAT 0400
+#define O_EXCL 02000
+#define O_NOCTTY 04000
+#define O_TRUNC 01000
+#define O_APPEND 0010
+#define O_NONBLOCK 0200
+#define O_DSYNC 0020
+#define O_SYNC 040020
+#define O_RSYNC 040020
+#define O_DIRECTORY 0200000
+#define O_NOFOLLOW 0400000
+#define O_CLOEXEC 02000000
+
+#define O_ASYNC 010000
+#define O_DIRECT 0100000
+#define O_LARGEFILE 020000
+#define O_NOATIME 01000000
+#define O_PATH 010000000
+#define O_TMPFILE 020200000
+#define O_NDELAY O_NONBLOCK
+
+#define F_DUPFD 0
+#define F_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+
+#define F_SETOWN 24
+#define F_GETOWN 23
+#define F_SETSIG 10
+#define F_GETSIG 11
+
+#define F_GETLK 14
+#define F_SETLK 6
+#define F_SETLKW 7
+
+#define F_SETOWN_EX 15
+#define F_GETOWN_EX 16
+
+#define F_GETOWNER_UIDS 17
diff --git a/libc-top-half/musl/arch/mips64/bits/fenv.h b/libc-top-half/musl/arch/mips64/bits/fenv.h
new file mode 100644
index 0000000..2762089
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/fenv.h
@@ -0,0 +1,25 @@
+#ifdef __mips_soft_float
+#define FE_ALL_EXCEPT 0
+#define FE_TONEAREST 0
+#else
+#define FE_INEXACT 4
+#define FE_UNDERFLOW 8
+#define FE_OVERFLOW 16
+#define FE_DIVBYZERO 32
+#define FE_INVALID 64
+
+#define FE_ALL_EXCEPT 124
+
+#define FE_TONEAREST 0
+#define FE_TOWARDZERO 1
+#define FE_UPWARD 2
+#define FE_DOWNWARD 3
+#endif
+
+typedef unsigned short fexcept_t;
+
+typedef struct {
+ unsigned __cw;
+} fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *) -1)
diff --git a/libc-top-half/musl/arch/mips64/bits/float.h b/libc-top-half/musl/arch/mips64/bits/float.h
new file mode 100644
index 0000000..719c790
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L
+#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
+#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L
+#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L
+
+#define LDBL_MANT_DIG 113
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_MAX_EXP 16384
+
+#define LDBL_DIG 33
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MAX_10_EXP 4932
+
+#define DECIMAL_DIG 36
diff --git a/libc-top-half/musl/arch/mips64/bits/hwcap.h b/libc-top-half/musl/arch/mips64/bits/hwcap.h
new file mode 100644
index 0000000..13e86fe
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/hwcap.h
@@ -0,0 +1,3 @@
+#define HWCAP_MIPS_R6 (1 << 0)
+#define HWCAP_MIPS_MSA (1 << 1)
+#define HWCAP_MIPS_CRC32 (1 << 2)
diff --git a/libc-top-half/musl/arch/mips64/bits/ioctl.h b/libc-top-half/musl/arch/mips64/bits/ioctl.h
new file mode 100644
index 0000000..e277c3f
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/ioctl.h
@@ -0,0 +1,114 @@
+#define _IOC(a,b,c,d) ( ((a)<<29) | ((b)<<8) | (c) | ((d)<<16) )
+#define _IOC_NONE 1U
+#define _IOC_READ 2U
+#define _IOC_WRITE 4U
+
+#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0)
+#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c))
+#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c))
+#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c))
+
+#define TCGETA 0x5401
+#define TCSETA 0x5402
+#define TCSETAW 0x5403
+#define TCSETAF 0x5404
+#define TCSBRK 0x5405
+#define TCXONC 0x5406
+#define TCFLSH 0x5407
+#define TCGETS 0x540D
+#define TCSETS 0x540E
+#define TCSETSW 0x540F
+#define TCSETSF 0x5410
+
+#define TIOCEXCL 0x740D
+#define TIOCNXCL 0x740E
+#define TIOCOUTQ 0x7472
+#define TIOCSTI 0x5472
+#define TIOCMGET 0x741D
+#define TIOCMBIS 0x741B
+#define TIOCMBIC 0x741C
+#define TIOCMSET 0x741A
+
+#define TIOCPKT 0x5470
+#define TIOCSWINSZ _IOW('t', 103, struct winsize)
+#define TIOCGWINSZ _IOR('t', 104, struct winsize)
+#define TIOCNOTTY 0x5471
+#define TIOCSETD 0x7401
+#define TIOCGETD 0x7400
+
+#define FIOCLEX 0x6601
+#define FIONCLEX 0x6602
+#define FIOASYNC 0x667D
+#define FIONBIO 0x667E
+#define FIOQSIZE 0x667F
+
+#define TIOCGLTC 0x7474
+#define TIOCSLTC 0x7475
+#define TIOCSPGRP _IOW('t', 118, int)
+#define TIOCGPGRP _IOR('t', 119, int)
+#define TIOCCONS _IOW('t', 120, int)
+
+#define FIONREAD 0x467F
+#define TIOCINQ FIONREAD
+
+#define TIOCGETP 0x7408
+#define TIOCSETP 0x7409
+#define TIOCSETN 0x740A
+
+#define TIOCSBRK 0x5427
+#define TIOCCBRK 0x5428
+#define TIOCGSID 0x7416
+#define TIOCGRS485 _IOR('T', 0x2E, char[32])
+#define TIOCSRS485 _IOWR('T', 0x2F, char[32])
+#define TIOCGPTN _IOR('T', 0x30, unsigned int)
+#define TIOCSPTLCK _IOW('T', 0x31, int)
+#define TIOCGDEV _IOR('T', 0x32, unsigned int)
+#define TIOCSIG _IOW('T', 0x36, int)
+#define TIOCVHANGUP 0x5437
+#define TIOCGPKT _IOR('T', 0x38, int)
+#define TIOCGPTLCK _IOR('T', 0x39, int)
+#define TIOCGEXCL _IOR('T', 0x40, int)
+#define TIOCGPTPEER _IO('T', 0x41)
+
+#define TIOCSCTTY 0x5480
+#define TIOCGSOFTCAR 0x5481
+#define TIOCSSOFTCAR 0x5482
+#define TIOCLINUX 0x5483
+#define TIOCGSERIAL 0x5484
+#define TIOCSSERIAL 0x5485
+#define TCSBRKP 0x5486
+
+#define TIOCSERCONFIG 0x5488
+#define TIOCSERGWILD 0x5489
+#define TIOCSERSWILD 0x548A
+#define TIOCGLCKTRMIOS 0x548B
+#define TIOCSLCKTRMIOS 0x548C
+#define TIOCSERGSTRUCT 0x548D
+#define TIOCSERGETLSR 0x548E
+#define TIOCSERGETMULTI 0x548F
+#define TIOCSERSETMULTI 0x5490
+#define TIOCMIWAIT 0x5491
+#define TIOCGICOUNT 0x5492
+
+#define TIOCM_LE 0x001
+#define TIOCM_DTR 0x002
+#define TIOCM_RTS 0x004
+#define TIOCM_ST 0x010
+#define TIOCM_SR 0x020
+#define TIOCM_CTS 0x040
+#define TIOCM_CAR 0x100
+#define TIOCM_CD TIOCM_CAR
+#define TIOCM_RNG 0x200
+#define TIOCM_RI TIOCM_RNG
+#define TIOCM_DSR 0x400
+#define TIOCM_OUT1 0x2000
+#define TIOCM_OUT2 0x4000
+#define TIOCM_LOOP 0x8000
+
+#define FIOGETOWN _IOR('f', 123, int)
+#define FIOSETOWN _IOW('f', 124, int)
+#define SIOCATMARK _IOR('s', 7, int)
+#define SIOCSPGRP _IOW('s', 8, pid_t)
+#define SIOCGPGRP _IOR('s', 9, pid_t)
+#define SIOCGSTAMP 0x8906
+#define SIOCGSTAMPNS 0x8907
diff --git a/libc-top-half/musl/arch/mips64/bits/ipc.h b/libc-top-half/musl/arch/mips64/bits/ipc.h
new file mode 100644
index 0000000..df22716
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/ipc.h
@@ -0,0 +1,12 @@
+struct ipc_perm {
+ key_t __ipc_perm_key;
+ uid_t uid;
+ gid_t gid;
+ uid_t cuid;
+ gid_t cgid;
+ mode_t mode;
+ int __ipc_perm_seq;
+ int __pad1;
+ unsigned long __unused1;
+ unsigned long __unused2;
+};
diff --git a/libc-top-half/musl/arch/mips64/bits/mman.h b/libc-top-half/musl/arch/mips64/bits/mman.h
new file mode 100644
index 0000000..9027bb6
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/mman.h
@@ -0,0 +1,25 @@
+#undef MAP_ANON
+#define MAP_ANON 0x800
+#undef MAP_NORESERVE
+#define MAP_NORESERVE 0x0400
+#undef MAP_GROWSDOWN
+#define MAP_GROWSDOWN 0x1000
+#undef MAP_DENYWRITE
+#define MAP_DENYWRITE 0x2000
+#undef MAP_EXECUTABLE
+#define MAP_EXECUTABLE 0x4000
+#undef MAP_LOCKED
+#define MAP_LOCKED 0x8000
+#undef MAP_POPULATE
+#define MAP_POPULATE 0x10000
+#undef MAP_NONBLOCK
+#define MAP_NONBLOCK 0x20000
+#undef MAP_STACK
+#define MAP_STACK 0x40000
+#undef MAP_HUGETLB
+#define MAP_HUGETLB 0x80000
+#undef MAP_SYNC
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#undef MADV_SOFT_OFFLINE
+#endif
diff --git a/libc-top-half/musl/arch/mips64/bits/poll.h b/libc-top-half/musl/arch/mips64/bits/poll.h
new file mode 100644
index 0000000..b0b1ed6
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/poll.h
@@ -0,0 +1,2 @@
+#define POLLWRNORM POLLOUT
+#define POLLWRBAND 0x100
diff --git a/libc-top-half/musl/arch/mips64/bits/posix.h b/libc-top-half/musl/arch/mips64/bits/posix.h
new file mode 100644
index 0000000..acf4294
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_LP64_OFFBIG 1
+#define _POSIX_V7_LP64_OFFBIG 1
diff --git a/libc-top-half/musl/arch/mips64/bits/ptrace.h b/libc-top-half/musl/arch/mips64/bits/ptrace.h
new file mode 100644
index 0000000..77a01c0
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/ptrace.h
@@ -0,0 +1,9 @@
+#define PTRACE_GET_THREAD_AREA 25
+#define PTRACE_SET_THREAD_AREA 26
+#define PTRACE_PEEKTEXT_3264 0xc0
+#define PTRACE_PEEKDATA_3264 0xc1
+#define PTRACE_POKETEXT_3264 0xc2
+#define PTRACE_POKEDATA_3264 0xc3
+#define PTRACE_GET_THREAD_AREA_3264 0xc4
+#define PTRACE_GET_WATCH_REGS 0xd0
+#define PTRACE_SET_WATCH_REGS 0xd1
diff --git a/libc-top-half/musl/arch/mips64/bits/reg.h b/libc-top-half/musl/arch/mips64/bits/reg.h
new file mode 100644
index 0000000..a3f63ac
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/reg.h
@@ -0,0 +1,47 @@
+#undef __WORDSIZE
+#define __WORDSIZE 64
+
+#define EF_R0 0
+#define EF_R1 1
+#define EF_R2 2
+#define EF_R3 3
+#define EF_R4 4
+#define EF_R5 5
+#define EF_R6 6
+#define EF_R7 7
+#define EF_R8 8
+#define EF_R9 9
+#define EF_R10 10
+#define EF_R11 11
+#define EF_R12 12
+#define EF_R13 13
+#define EF_R14 14
+#define EF_R15 15
+#define EF_R16 16
+#define EF_R17 17
+#define EF_R18 18
+#define EF_R19 19
+#define EF_R20 20
+#define EF_R21 21
+#define EF_R22 22
+#define EF_R23 23
+#define EF_R24 24
+#define EF_R25 25
+
+#define EF_R26 26
+#define EF_R27 27
+#define EF_R28 28
+#define EF_R29 29
+#define EF_R30 30
+#define EF_R31 31
+
+#define EF_LO 32
+#define EF_HI 33
+
+#define EF_CP0_EPC 34
+#define EF_CP0_BADVADDR 35
+#define EF_CP0_STATUS 36
+#define EF_CP0_CAUSE 37
+#define EF_UNUSED0 38
+
+#define EF_SIZE 304
diff --git a/libc-top-half/musl/arch/mips64/bits/resource.h b/libc-top-half/musl/arch/mips64/bits/resource.h
new file mode 100644
index 0000000..414a405
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/resource.h
@@ -0,0 +1,5 @@
+#define RLIMIT_NOFILE 5
+#define RLIMIT_AS 6
+#define RLIMIT_RSS 7
+#define RLIMIT_NPROC 8
+#define RLIMIT_MEMLOCK 9
diff --git a/libc-top-half/musl/arch/mips64/bits/setjmp.h b/libc-top-half/musl/arch/mips64/bits/setjmp.h
new file mode 100644
index 0000000..4d93267
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long long __jmp_buf[23];
diff --git a/libc-top-half/musl/arch/mips64/bits/signal.h b/libc-top-half/musl/arch/mips64/bits/signal.h
new file mode 100644
index 0000000..4f91c9f
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/signal.h
@@ -0,0 +1,143 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef unsigned long long greg_t, gregset_t[32];
+
+typedef struct {
+ union {
+ double fp_dregs[32];
+ struct {
+ float _fp_fregs;
+ unsigned _fp_pad;
+ } fp_fregs[32];
+ } fp_r;
+} fpregset_t;
+
+struct sigcontext {
+ unsigned long long sc_regs[32];
+ unsigned long long sc_fpregs[32];
+ unsigned long long sc_mdhi;
+ unsigned long long sc_hi1;
+ unsigned long long sc_hi2;
+ unsigned long long sc_hi3;
+ unsigned long long sc_mdlo;
+ unsigned long long sc_lo1;
+ unsigned long long sc_lo2;
+ unsigned long long sc_lo3;
+ unsigned long long sc_pc;
+ unsigned int sc_fpc_csr;
+ unsigned int sc_used_math;
+ unsigned int sc_dsp;
+ unsigned int sc_reserved;
+};
+
+typedef struct {
+ gregset_t gregs;
+ fpregset_t fpregs;
+ greg_t mdhi;
+ greg_t hi1;
+ greg_t hi2;
+ greg_t hi3;
+ greg_t mdlo;
+ greg_t lo1;
+ greg_t lo2;
+ greg_t lo3;
+ greg_t pc;
+ unsigned int fpc_csr;
+ unsigned int used_math;
+ unsigned int dsp;
+ unsigned int reserved;
+} mcontext_t;
+
+#else
+typedef struct {
+ unsigned long long __mc1[32];
+ double __mc2[32];
+ unsigned long long __mc3[9];
+ unsigned __mc4[4];
+} mcontext_t;
+#endif
+
+struct sigaltstack {
+ void *ss_sp;
+ size_t ss_size;
+ int ss_flags;
+};
+
+typedef struct __ucontext {
+ unsigned long uc_flags;
+ struct __ucontext *uc_link;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ sigset_t uc_sigmask;
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 0x10000
+#define SA_SIGINFO 8
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#undef SIG_BLOCK
+#undef SIG_UNBLOCK
+#undef SIG_SETMASK
+#define SIG_BLOCK 1
+#define SIG_UNBLOCK 2
+#define SIG_SETMASK 3
+
+#undef SI_ASYNCIO
+#undef SI_MESGQ
+#undef SI_TIMER
+#define SI_ASYNCIO (-2)
+#define SI_MESGQ (-4)
+#define SI_TIMER (-3)
+
+#define __SI_SWAP_ERRNO_CODE
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGEMT 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGBUS 10
+#define SIGSEGV 11
+#define SIGSYS 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGUSR1 16
+#define SIGUSR2 17
+#define SIGCHLD 18
+#define SIGPWR 19
+#define SIGWINCH 20
+#define SIGURG 21
+#define SIGIO 22
+#define SIGPOLL SIGIO
+#define SIGSTOP 23
+#define SIGTSTP 24
+#define SIGCONT 25
+#define SIGTTIN 26
+#define SIGTTOU 27
+#define SIGVTALRM 28
+#define SIGPROF 29
+#define SIGXCPU 30
+#define SIGXFSZ 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 128
diff --git a/libc-top-half/musl/arch/mips64/bits/socket.h b/libc-top-half/musl/arch/mips64/bits/socket.h
new file mode 100644
index 0000000..519b9c8
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/socket.h
@@ -0,0 +1,35 @@
+#define SOCK_STREAM 2
+#define SOCK_DGRAM 1
+#define SOL_SOCKET 65535
+#define SO_DEBUG 1
+
+#define SO_REUSEADDR 0x0004
+#define SO_KEEPALIVE 0x0008
+#define SO_DONTROUTE 0x0010
+#define SO_BROADCAST 0x0020
+#define SO_LINGER 0x0080
+#define SO_OOBINLINE 0x0100
+#define SO_REUSEPORT 0x0200
+#define SO_SNDBUF 0x1001
+#define SO_RCVBUF 0x1002
+#define SO_SNDLOWAT 0x1003
+#define SO_RCVLOWAT 0x1004
+#define SO_RCVTIMEO 0x1006
+#define SO_SNDTIMEO 0x1005
+#define SO_ERROR 0x1007
+#define SO_TYPE 0x1008
+#define SO_ACCEPTCONN 0x1009
+#define SO_PROTOCOL 0x1028
+#define SO_DOMAIN 0x1029
+
+#define SO_NO_CHECK 11
+#define SO_PRIORITY 12
+#define SO_BSDCOMPAT 14
+#define SO_PASSCRED 17
+#define SO_PEERCRED 18
+#define SO_PEERSEC 30
+#define SO_SNDBUFFORCE 31
+#define SO_RCVBUFFORCE 33
+
+#define SOCK_NONBLOCK 0200
+#define SOCK_CLOEXEC 02000000
diff --git a/libc-top-half/musl/arch/mips64/bits/stat.h b/libc-top-half/musl/arch/mips64/bits/stat.h
new file mode 100644
index 0000000..b620e14
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/stat.h
@@ -0,0 +1,20 @@
+struct stat {
+ dev_t st_dev;
+ int __pad1[3];
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ unsigned int __pad2[2];
+ off_t st_size;
+ int __pad3;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+ blksize_t st_blksize;
+ unsigned int __pad4;
+ blkcnt_t st_blocks;
+ int __pad5[14];
+};
diff --git a/libc-top-half/musl/arch/mips64/bits/statfs.h b/libc-top-half/musl/arch/mips64/bits/statfs.h
new file mode 100644
index 0000000..a73bd54
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/statfs.h
@@ -0,0 +1,8 @@
+struct statfs {
+ unsigned long f_type, f_bsize, f_frsize;
+ fsblkcnt_t f_blocks, f_bfree;
+ fsfilcnt_t f_files, f_ffree;
+ fsblkcnt_t f_bavail;
+ fsid_t f_fsid;
+ unsigned long f_namelen, f_flags, f_spare[5];
+};
diff --git a/libc-top-half/musl/arch/mips64/bits/stdint.h b/libc-top-half/musl/arch/mips64/bits/stdint.h
new file mode 100644
index 0000000..1bb147f
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#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
diff --git a/libc-top-half/musl/arch/mips64/bits/syscall.h.in b/libc-top-half/musl/arch/mips64/bits/syscall.h.in
new file mode 100644
index 0000000..b89965d
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/syscall.h.in
@@ -0,0 +1,351 @@
+#define __NR_read 5000
+#define __NR_write 5001
+#define __NR_open 5002
+#define __NR_close 5003
+#define __NR_stat 5004
+#define __NR_fstat 5005
+#define __NR_lstat 5006
+#define __NR_poll 5007
+#define __NR_lseek 5008
+#define __NR_mmap 5009
+#define __NR_mprotect 5010
+#define __NR_munmap 5011
+#define __NR_brk 5012
+#define __NR_rt_sigaction 5013
+#define __NR_rt_sigprocmask 5014
+#define __NR_ioctl 5015
+#define __NR_pread64 5016
+#define __NR_pwrite64 5017
+#define __NR_readv 5018
+#define __NR_writev 5019
+#define __NR_access 5020
+#define __NR_pipe 5021
+#define __NR__newselect 5022
+#define __NR_sched_yield 5023
+#define __NR_mremap 5024
+#define __NR_msync 5025
+#define __NR_mincore 5026
+#define __NR_madvise 5027
+#define __NR_shmget 5028
+#define __NR_shmat 5029
+#define __NR_shmctl 5030
+#define __NR_dup 5031
+#define __NR_dup2 5032
+#define __NR_pause 5033
+#define __NR_nanosleep 5034
+#define __NR_getitimer 5035
+#define __NR_setitimer 5036
+#define __NR_alarm 5037
+#define __NR_getpid 5038
+#define __NR_sendfile 5039
+#define __NR_socket 5040
+#define __NR_connect 5041
+#define __NR_accept 5042
+#define __NR_sendto 5043
+#define __NR_recvfrom 5044
+#define __NR_sendmsg 5045
+#define __NR_recvmsg 5046
+#define __NR_shutdown 5047
+#define __NR_bind 5048
+#define __NR_listen 5049
+#define __NR_getsockname 5050
+#define __NR_getpeername 5051
+#define __NR_socketpair 5052
+#define __NR_setsockopt 5053
+#define __NR_getsockopt 5054
+#define __NR_clone 5055
+#define __NR_fork 5056
+#define __NR_execve 5057
+#define __NR_exit 5058
+#define __NR_wait4 5059
+#define __NR_kill 5060
+#define __NR_uname 5061
+#define __NR_semget 5062
+#define __NR_semop 5063
+#define __NR_semctl 5064
+#define __NR_shmdt 5065
+#define __NR_msgget 5066
+#define __NR_msgsnd 5067
+#define __NR_msgrcv 5068
+#define __NR_msgctl 5069
+#define __NR_fcntl 5070
+#define __NR_flock 5071
+#define __NR_fsync 5072
+#define __NR_fdatasync 5073
+#define __NR_truncate 5074
+#define __NR_ftruncate 5075
+#define __NR_getdents 5076
+#define __NR_getcwd 5077
+#define __NR_chdir 5078
+#define __NR_fchdir 5079
+#define __NR_rename 5080
+#define __NR_mkdir 5081
+#define __NR_rmdir 5082
+#define __NR_creat 5083
+#define __NR_link 5084
+#define __NR_unlink 5085
+#define __NR_symlink 5086
+#define __NR_readlink 5087
+#define __NR_chmod 5088
+#define __NR_fchmod 5089
+#define __NR_chown 5090
+#define __NR_fchown 5091
+#define __NR_lchown 5092
+#define __NR_umask 5093
+#define __NR_gettimeofday 5094
+#define __NR_getrlimit 5095
+#define __NR_getrusage 5096
+#define __NR_sysinfo 5097
+#define __NR_times 5098
+#define __NR_ptrace 5099
+#define __NR_getuid 5100
+#define __NR_syslog 5101
+#define __NR_getgid 5102
+#define __NR_setuid 5103
+#define __NR_setgid 5104
+#define __NR_geteuid 5105
+#define __NR_getegid 5106
+#define __NR_setpgid 5107
+#define __NR_getppid 5108
+#define __NR_getpgrp 5109
+#define __NR_setsid 5110
+#define __NR_setreuid 5111
+#define __NR_setregid 5112
+#define __NR_getgroups 5113
+#define __NR_setgroups 5114
+#define __NR_setresuid 5115
+#define __NR_getresuid 5116
+#define __NR_setresgid 5117
+#define __NR_getresgid 5118
+#define __NR_getpgid 5119
+#define __NR_setfsuid 5120
+#define __NR_setfsgid 5121
+#define __NR_getsid 5122
+#define __NR_capget 5123
+#define __NR_capset 5124
+#define __NR_rt_sigpending 5125
+#define __NR_rt_sigtimedwait 5126
+#define __NR_rt_sigqueueinfo 5127
+#define __NR_rt_sigsuspend 5128
+#define __NR_sigaltstack 5129
+#define __NR_utime 5130
+#define __NR_mknod 5131
+#define __NR_personality 5132
+#define __NR_ustat 5133
+#define __NR_statfs 5134
+#define __NR_fstatfs 5135
+#define __NR_sysfs 5136
+#define __NR_getpriority 5137
+#define __NR_setpriority 5138
+#define __NR_sched_setparam 5139
+#define __NR_sched_getparam 5140
+#define __NR_sched_setscheduler 5141
+#define __NR_sched_getscheduler 5142
+#define __NR_sched_get_priority_max 5143
+#define __NR_sched_get_priority_min 5144
+#define __NR_sched_rr_get_interval 5145
+#define __NR_mlock 5146
+#define __NR_munlock 5147
+#define __NR_mlockall 5148
+#define __NR_munlockall 5149
+#define __NR_vhangup 5150
+#define __NR_pivot_root 5151
+#define __NR__sysctl 5152
+#define __NR_prctl 5153
+#define __NR_adjtimex 5154
+#define __NR_setrlimit 5155
+#define __NR_chroot 5156
+#define __NR_sync 5157
+#define __NR_acct 5158
+#define __NR_settimeofday 5159
+#define __NR_mount 5160
+#define __NR_umount2 5161
+#define __NR_swapon 5162
+#define __NR_swapoff 5163
+#define __NR_reboot 5164
+#define __NR_sethostname 5165
+#define __NR_setdomainname 5166
+#define __NR_create_module 5167
+#define __NR_init_module 5168
+#define __NR_delete_module 5169
+#define __NR_get_kernel_syms 5170
+#define __NR_query_module 5171
+#define __NR_quotactl 5172
+#define __NR_nfsservctl 5173
+#define __NR_getpmsg 5174
+#define __NR_putpmsg 5175
+#define __NR_afs_syscall 5176
+#define __NR_reserved177 5177
+#define __NR_gettid 5178
+#define __NR_readahead 5179
+#define __NR_setxattr 5180
+#define __NR_lsetxattr 5181
+#define __NR_fsetxattr 5182
+#define __NR_getxattr 5183
+#define __NR_lgetxattr 5184
+#define __NR_fgetxattr 5185
+#define __NR_listxattr 5186
+#define __NR_llistxattr 5187
+#define __NR_flistxattr 5188
+#define __NR_removexattr 5189
+#define __NR_lremovexattr 5190
+#define __NR_fremovexattr 5191
+#define __NR_tkill 5192
+#define __NR_reserved193 5193
+#define __NR_futex 5194
+#define __NR_sched_setaffinity 5195
+#define __NR_sched_getaffinity 5196
+#define __NR_cacheflush 5197
+#define __NR_cachectl 5198
+#define __NR_sysmips 5199
+#define __NR_io_setup 5200
+#define __NR_io_destroy 5201
+#define __NR_io_getevents 5202
+#define __NR_io_submit 5203
+#define __NR_io_cancel 5204
+#define __NR_exit_group 5205
+#define __NR_lookup_dcookie 5206
+#define __NR_epoll_create 5207
+#define __NR_epoll_ctl 5208
+#define __NR_epoll_wait 5209
+#define __NR_remap_file_pages 5210
+#define __NR_rt_sigreturn 5211
+#define __NR_set_tid_address 5212
+#define __NR_restart_syscall 5213
+#define __NR_semtimedop 5214
+#define __NR_fadvise64 5215
+#define __NR_timer_create 5216
+#define __NR_timer_settime 5217
+#define __NR_timer_gettime 5218
+#define __NR_timer_getoverrun 5219
+#define __NR_timer_delete 5220
+#define __NR_clock_settime 5221
+#define __NR_clock_gettime 5222
+#define __NR_clock_getres 5223
+#define __NR_clock_nanosleep 5224
+#define __NR_tgkill 5225
+#define __NR_utimes 5226
+#define __NR_mbind 5227
+#define __NR_get_mempolicy 5228
+#define __NR_set_mempolicy 5229
+#define __NR_mq_open 5230
+#define __NR_mq_unlink 5231
+#define __NR_mq_timedsend 5232
+#define __NR_mq_timedreceive 5233
+#define __NR_mq_notify 5234
+#define __NR_mq_getsetattr 5235
+#define __NR_vserver 5236
+#define __NR_waitid 5237
+#define __NR_add_key 5239
+#define __NR_request_key 5240
+#define __NR_keyctl 5241
+#define __NR_set_thread_area 5242
+#define __NR_inotify_init 5243
+#define __NR_inotify_add_watch 5244
+#define __NR_inotify_rm_watch 5245
+#define __NR_migrate_pages 5246
+#define __NR_openat 5247
+#define __NR_mkdirat 5248
+#define __NR_mknodat 5249
+#define __NR_fchownat 5250
+#define __NR_futimesat 5251
+#define __NR_newfstatat 5252
+#define __NR_unlinkat 5253
+#define __NR_renameat 5254
+#define __NR_linkat 5255
+#define __NR_symlinkat 5256
+#define __NR_readlinkat 5257
+#define __NR_fchmodat 5258
+#define __NR_faccessat 5259
+#define __NR_pselect6 5260
+#define __NR_ppoll 5261
+#define __NR_unshare 5262
+#define __NR_splice 5263
+#define __NR_sync_file_range 5264
+#define __NR_tee 5265
+#define __NR_vmsplice 5266
+#define __NR_move_pages 5267
+#define __NR_set_robust_list 5268
+#define __NR_get_robust_list 5269
+#define __NR_kexec_load 5270
+#define __NR_getcpu 5271
+#define __NR_epoll_pwait 5272
+#define __NR_ioprio_set 5273
+#define __NR_ioprio_get 5274
+#define __NR_utimensat 5275
+#define __NR_signalfd 5276
+#define __NR_timerfd 5277
+#define __NR_eventfd 5278
+#define __NR_fallocate 5279
+#define __NR_timerfd_create 5280
+#define __NR_timerfd_gettime 5281
+#define __NR_timerfd_settime 5282
+#define __NR_signalfd4 5283
+#define __NR_eventfd2 5284
+#define __NR_epoll_create1 5285
+#define __NR_dup3 5286
+#define __NR_pipe2 5287
+#define __NR_inotify_init1 5288
+#define __NR_preadv 5289
+#define __NR_pwritev 5290
+#define __NR_rt_tgsigqueueinfo 5291
+#define __NR_perf_event_open 5292
+#define __NR_accept4 5293
+#define __NR_recvmmsg 5294
+#define __NR_fanotify_init 5295
+#define __NR_fanotify_mark 5296
+#define __NR_prlimit64 5297
+#define __NR_name_to_handle_at 5298
+#define __NR_open_by_handle_at 5299
+#define __NR_clock_adjtime 5300
+#define __NR_syncfs 5301
+#define __NR_sendmmsg 5302
+#define __NR_setns 5303
+#define __NR_process_vm_readv 5304
+#define __NR_process_vm_writev 5305
+#define __NR_kcmp 5306
+#define __NR_finit_module 5307
+#define __NR_getdents64 5308
+#define __NR_sched_setattr 5309
+#define __NR_sched_getattr 5310
+#define __NR_renameat2 5311
+#define __NR_seccomp 5312
+#define __NR_getrandom 5313
+#define __NR_memfd_create 5314
+#define __NR_bpf 5315
+#define __NR_execveat 5316
+#define __NR_userfaultfd 5317
+#define __NR_membarrier 5318
+#define __NR_mlock2 5319
+#define __NR_copy_file_range 5320
+#define __NR_preadv2 5321
+#define __NR_pwritev2 5322
+#define __NR_pkey_mprotect 5323
+#define __NR_pkey_alloc 5324
+#define __NR_pkey_free 5325
+#define __NR_statx 5326
+#define __NR_rseq 5327
+#define __NR_io_pgetevents 5328
+#define __NR_pidfd_send_signal 5424
+#define __NR_io_uring_setup 5425
+#define __NR_io_uring_enter 5426
+#define __NR_io_uring_register 5427
+#define __NR_open_tree 5428
+#define __NR_move_mount 5429
+#define __NR_fsopen 5430
+#define __NR_fsconfig 5431
+#define __NR_fsmount 5432
+#define __NR_fspick 5433
+#define __NR_pidfd_open 5434
+#define __NR_clone3 5435
+#define __NR_close_range 5436
+#define __NR_openat2 5437
+#define __NR_pidfd_getfd 5438
+#define __NR_faccessat2 5439
+#define __NR_process_madvise 5440
+#define __NR_epoll_pwait2 5441
+#define __NR_mount_setattr 5442
+#define __NR_landlock_create_ruleset 5444
+#define __NR_landlock_add_rule 5445
+#define __NR_landlock_restrict_self 5446
+
diff --git a/libc-top-half/musl/arch/mips64/bits/termios.h b/libc-top-half/musl/arch/mips64/bits/termios.h
new file mode 100644
index 0000000..9d571f7
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/termios.h
@@ -0,0 +1,169 @@
+struct termios {
+ tcflag_t c_iflag;
+ tcflag_t c_oflag;
+ tcflag_t c_cflag;
+ tcflag_t c_lflag;
+ cc_t c_line;
+ cc_t c_cc[NCCS];
+ speed_t __c_ispeed;
+ speed_t __c_ospeed;
+};
+
+#define VINTR 0
+#define VQUIT 1
+#define VERASE 2
+#define VKILL 3
+#define VMIN 4
+#define VTIME 5
+#define VEOL2 6
+#define VSWTC 7
+#define VSWTCH 7
+#define VSTART 8
+#define VSTOP 9
+#define VSUSP 10
+#define VREPRINT 12
+#define VDISCARD 13
+#define VWERASE 14
+#define VLNEXT 15
+#define VEOF 16
+#define VEOL 17
+
+#define IGNBRK 0000001
+#define BRKINT 0000002
+#define IGNPAR 0000004
+#define PARMRK 0000010
+#define INPCK 0000020
+#define ISTRIP 0000040
+#define INLCR 0000100
+#define IGNCR 0000200
+#define ICRNL 0000400
+#define IUCLC 0001000
+#define IXON 0002000
+#define IXANY 0004000
+#define IXOFF 0010000
+#define IMAXBEL 0020000
+#define IUTF8 0040000
+
+#define OPOST 0000001
+#define OLCUC 0000002
+#define ONLCR 0000004
+#define OCRNL 0000010
+#define ONOCR 0000020
+#define ONLRET 0000040
+#define OFILL 0000100
+#define OFDEL 0000200
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE)
+#define NLDLY 0000400
+#define NL0 0000000
+#define NL1 0000400
+#define CRDLY 0003000
+#define CR0 0000000
+#define CR1 0001000
+#define CR2 0002000
+#define CR3 0003000
+#define TABDLY 0014000
+#define TAB0 0000000
+#define TAB1 0004000
+#define TAB2 0010000
+#define TAB3 0014000
+#define BSDLY 0020000
+#define BS0 0000000
+#define BS1 0020000
+#define FFDLY 0100000
+#define FF0 0000000
+#define FF1 0100000
+#endif
+
+#define VTDLY 0040000
+#define VT0 0000000
+#define VT1 0040000
+
+#define B0 0000000
+#define B50 0000001
+#define B75 0000002
+#define B110 0000003
+#define B134 0000004
+#define B150 0000005
+#define B200 0000006
+#define B300 0000007
+#define B600 0000010
+#define B1200 0000011
+#define B1800 0000012
+#define B2400 0000013
+#define B4800 0000014
+#define B9600 0000015
+#define B19200 0000016
+#define B38400 0000017
+
+#define B57600 0010001
+#define B115200 0010002
+#define B230400 0010003
+#define B460800 0010004
+#define B500000 0010005
+#define B576000 0010006
+#define B921600 0010007
+#define B1000000 0010010
+#define B1152000 0010011
+#define B1500000 0010012
+#define B2000000 0010013
+#define B2500000 0010014
+#define B3000000 0010015
+#define B3500000 0010016
+#define B4000000 0010017
+
+#define CSIZE 0000060
+#define CS5 0000000
+#define CS6 0000020
+#define CS7 0000040
+#define CS8 0000060
+#define CSTOPB 0000100
+#define CREAD 0000200
+#define PARENB 0000400
+#define PARODD 0001000
+#define HUPCL 0002000
+#define CLOCAL 0004000
+
+#define ISIG 0000001
+#define ICANON 0000002
+#define ECHO 0000010
+#define ECHOE 0000020
+#define ECHOK 0000040
+#define ECHONL 0000100
+#define NOFLSH 0000200
+#define IEXTEN 0000400
+#define TOSTOP 0100000
+#define ITOSTOP 0100000
+
+#define TCOOFF 0
+#define TCOON 1
+#define TCIOFF 2
+#define TCION 3
+
+#define TCIFLUSH 0
+#define TCOFLUSH 1
+#define TCIOFLUSH 2
+
+#define TCSANOW 0
+#define TCSADRAIN 1
+#define TCSAFLUSH 2
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define EXTA 0000016
+#define EXTB 0000017
+#define CBAUD 0010017
+#define CBAUDEX 0010000
+#define CIBAUD 002003600000
+#define CMSPAR 010000000000
+#define CRTSCTS 020000000000
+
+#define XCASE 0000004
+#define ECHOCTL 0001000
+#define ECHOPRT 0002000
+#define ECHOKE 0004000
+#define FLUSHO 0020000
+#define PENDIN 0040000
+#define EXTPROC 0200000
+
+#define XTABS 0014000
+#define TIOCSER_TEMT 1
+#endif
diff --git a/libc-top-half/musl/arch/mips64/bits/user.h b/libc-top-half/musl/arch/mips64/bits/user.h
new file mode 100644
index 0000000..60fa1fd
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/bits/user.h
@@ -0,0 +1,15 @@
+struct user {
+ unsigned long regs[102];
+ unsigned long u_tsize, u_dsize, u_ssize;
+ unsigned long long start_code, start_data, start_stack;
+ long long signal;
+ unsigned long long *u_ar0;
+ unsigned long long magic;
+ char u_comm[32];
+};
+
+#define ELF_NGREG 45
+#define ELF_NFPREG 33
+
+typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG];
+typedef double elf_fpreg_t, elf_fpregset_t[ELF_NFPREG];
diff --git a/libc-top-half/musl/arch/mips64/crt_arch.h b/libc-top-half/musl/arch/mips64/crt_arch.h
new file mode 100644
index 0000000..d148f97
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/crt_arch.h
@@ -0,0 +1,33 @@
+__asm__(
+".set push\n"
+".set noreorder\n"
+".text \n"
+".global _" START "\n"
+".global " START "\n"
+".global " START "_data\n"
+".type _" START ", @function\n"
+".type " START ", @function\n"
+".type " START "_data, @function\n"
+"_" START ":\n"
+"" START ":\n"
+".align 8 \n"
+" bal 1f \n"
+" move $fp, $0 \n"
+"" START "_data: \n"
+" .gpdword " START "_data \n"
+" .gpdword " START "_c \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+" .gpdword _DYNAMIC \n"
+"1: ld $gp, 0($ra) \n"
+" dsubu $gp, $ra, $gp \n"
+" move $4, $sp \n"
+" ld $5, 16($ra) \n"
+" daddu $5, $5, $gp \n"
+" ld $25, 8($ra) \n"
+" daddu $25, $25, $gp \n"
+" and $sp, $sp, -16 \n"
+" jalr $25 \n"
+" nop \n"
+".set pop \n"
+);
diff --git a/libc-top-half/musl/arch/mips64/ksigaction.h b/libc-top-half/musl/arch/mips64/ksigaction.h
new file mode 100644
index 0000000..c16e473
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/ksigaction.h
@@ -0,0 +1,10 @@
+#include <features.h>
+
+struct k_sigaction {
+ unsigned flags;
+ void (*handler)(int);
+ unsigned long mask[2];
+ void (*restorer)();
+};
+
+hidden void __restore(), __restore_rt();
diff --git a/libc-top-half/musl/arch/mips64/kstat.h b/libc-top-half/musl/arch/mips64/kstat.h
new file mode 100644
index 0000000..9a4468b
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/kstat.h
@@ -0,0 +1,21 @@
+struct kstat {
+ unsigned st_dev;
+ int __pad1[3];
+ ino_t st_ino;
+ mode_t st_mode;
+ unsigned st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ unsigned st_rdev;
+ int __pad2[3];
+ off_t st_size;
+ int st_atime_sec;
+ int st_atime_nsec;
+ int st_mtime_sec;
+ int st_mtime_nsec;
+ int st_ctime_sec;
+ int st_ctime_nsec;
+ unsigned st_blksize;
+ unsigned __pad3;
+ blkcnt_t st_blocks;
+};
diff --git a/libc-top-half/musl/arch/mips64/pthread_arch.h b/libc-top-half/musl/arch/mips64/pthread_arch.h
new file mode 100644
index 0000000..c45347a
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/pthread_arch.h
@@ -0,0 +1,19 @@
+static inline uintptr_t __get_tp()
+{
+#if __mips_isa_rev < 2
+ register uintptr_t tp __asm__("$3");
+ __asm__ (".word 0x7c03e83b" : "=r" (tp) );
+#else
+ uintptr_t tp;
+ __asm__ ("rdhwr %0, $29" : "=r" (tp) );
+#endif
+ return tp;
+}
+
+#define TLS_ABOVE_TP
+#define GAP_ABOVE_TP 0
+
+#define TP_OFFSET 0x7000
+#define DTP_OFFSET 0x8000
+
+#define MC_PC pc
diff --git a/libc-top-half/musl/arch/mips64/reloc.h b/libc-top-half/musl/arch/mips64/reloc.h
new file mode 100644
index 0000000..fdb5edc
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/reloc.h
@@ -0,0 +1,60 @@
+#if __mips_isa_rev >= 6
+#define ISA_SUFFIX "r6"
+#else
+#define ISA_SUFFIX ""
+#endif
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define ENDIAN_SUFFIX "el"
+#else
+#define ENDIAN_SUFFIX ""
+#endif
+
+#ifdef __mips_soft_float
+#define FP_SUFFIX "-sf"
+#else
+#define FP_SUFFIX ""
+#endif
+
+#define LDSO_ARCH "mips64" ISA_SUFFIX ENDIAN_SUFFIX FP_SUFFIX
+
+#define TPOFF_K (-0x7000)
+
+#define REL_SYM_OR_REL 4611
+#define REL_PLT R_MIPS_JUMP_SLOT
+#define REL_COPY R_MIPS_COPY
+#define REL_DTPMOD R_MIPS_TLS_DTPMOD64
+#define REL_DTPOFF R_MIPS_TLS_DTPREL64
+#define REL_TPOFF R_MIPS_TLS_TPREL64
+
+#include <endian.h>
+
+#undef R_TYPE
+#undef R_SYM
+#undef R_INFO
+#define R_TYPE(x) (be64toh(x)&0x7fffffff)
+#define R_SYM(x) (be32toh(be64toh(x)>>32))
+#define R_INFO(s,t) (htobe64((uint64_t)htobe32(s)<<32 | (uint64_t)t))
+
+#define NEED_MIPS_GOT_RELOCS 1
+#define DT_DEBUG_INDIRECT DT_MIPS_RLD_MAP
+#define ARCH_SYM_REJECT_UND(s) (!((s)->st_other & STO_MIPS_PLT))
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "move $sp,%1 ; jr %0" : : "r"(pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+ ".hidden " #sym "\n" \
+ ".set push \n" \
+ ".set noreorder \n" \
+ ".align 8 \n" \
+ " bal 1f \n" \
+ " nop \n" \
+ " .gpdword . \n" \
+ " .gpdword " #sym " \n" \
+ "1: ld %0, ($ra) \n" \
+ " dsubu %0, $ra, %0 \n" \
+ " ld $ra, 8($ra) \n" \
+ " daddu %0, %0, $ra \n" \
+ ".set pop \n" \
+ : "=r"(*(fp)) : : "memory", "ra" )
diff --git a/libc-top-half/musl/arch/mips64/syscall_arch.h b/libc-top-half/musl/arch/mips64/syscall_arch.h
new file mode 100644
index 0000000..ae6532f
--- /dev/null
+++ b/libc-top-half/musl/arch/mips64/syscall_arch.h
@@ -0,0 +1,128 @@
+#define __SYSCALL_LL_E(x) (x)
+#define __SYSCALL_LL_O(x) (x)
+
+#define SYSCALL_RLIM_INFINITY (-1UL/2)
+
+#if __mips_isa_rev >= 6
+#define SYSCALL_CLOBBERLIST \
+ "$1", "$3", "$10", "$11", "$12", "$13", \
+ "$14", "$15", "$24", "$25", "memory"
+#else
+#define SYSCALL_CLOBBERLIST \
+ "$1", "$3", "$10", "$11", "$12", "$13", \
+ "$14", "$15", "$24", "$25", "hi", "lo", "memory"
+#endif
+
+static inline long __syscall0(long n)
+{
+ register long r7 __asm__("$7");
+ register long r2 __asm__("$2");
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "=r"(r7)
+ : "ir"(n), "0"(r2)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register long r4 __asm__("$4") = a;
+ register long r7 __asm__("$7");
+ register long r2 __asm__("$2");
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "=r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r7 __asm__("$7");
+ register long r2 __asm__("$2");
+
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "=r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r6 __asm__("$6") = c;
+ register long r7 __asm__("$7");
+ register long r2 __asm__("$2");
+
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "=r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5), "r"(r6)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r6 __asm__("$6") = c;
+ register long r7 __asm__("$7") = d;
+ register long r2 __asm__("$2");
+
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "+r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5), "r"(r6)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r6 __asm__("$6") = c;
+ register long r7 __asm__("$7") = d;
+ register long r8 __asm__("$8") = e;
+ register long r2 __asm__("$2");
+
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "+r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5), "r"(r6), "r"(r8)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r6 __asm__("$6") = c;
+ register long r7 __asm__("$7") = d;
+ register long r8 __asm__("$8") = e;
+ register long r9 __asm__("$9") = f;
+ register long r2 __asm__("$2");
+
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "+r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5), "r"(r6), "r"(r8), "r"(r9)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+#define VDSO_USEFUL
+#define VDSO_CGT_SYM "__vdso_clock_gettime"
+#define VDSO_CGT_VER "LINUX_2.6"
+
+#define SO_SNDTIMEO_OLD 0x1005
+#define SO_RCVTIMEO_OLD 0x1006
diff --git a/libc-top-half/musl/arch/mipsn32/arch.mak b/libc-top-half/musl/arch/mipsn32/arch.mak
new file mode 100644
index 0000000..aa4d05c
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/arch.mak
@@ -0,0 +1 @@
+COMPAT_SRC_DIRS = compat/time32
diff --git a/libc-top-half/musl/arch/mipsn32/atomic_arch.h b/libc-top-half/musl/arch/mipsn32/atomic_arch.h
new file mode 100644
index 0000000..ccc3878
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/atomic_arch.h
@@ -0,0 +1,52 @@
+#if __mips_isa_rev < 6
+#define LLSC_M "m"
+#else
+#define LLSC_M "ZC"
+#endif
+
+#define a_ll a_ll
+static inline int a_ll(volatile int *p)
+{
+ int v;
+#if __mips < 2
+ __asm__ __volatile__ (
+ ".set push ; .set mips2\n\t"
+ "ll %0, %1"
+ "\n\t.set pop"
+ : "=r"(v) : "m"(*p));
+#else
+ __asm__ __volatile__ (
+ "ll %0, %1"
+ : "=r"(v) : LLSC_M(*p));
+#endif
+ return v;
+}
+
+#define a_sc a_sc
+static inline int a_sc(volatile int *p, int v)
+{
+ int r;
+#if __mips < 2
+ __asm__ __volatile__ (
+ ".set push ; .set mips2\n\t"
+ "sc %0, %1"
+ "\n\t.set pop"
+ : "=r"(r), "=m"(*p) : "0"(v) : "memory");
+#else
+ __asm__ __volatile__ (
+ "sc %0, %1"
+ : "=r"(r), "="LLSC_M(*p) : "0"(v) : "memory");
+#endif
+ return r;
+}
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ __asm__ __volatile__ ("sync" : : : "memory");
+}
+
+#define a_pre_llsc a_barrier
+#define a_post_llsc a_barrier
+
+#undef LLSC_M
diff --git a/libc-top-half/musl/arch/mipsn32/bits/alltypes.h.in b/libc-top-half/musl/arch/mipsn32/bits/alltypes.h.in
new file mode 100644
index 0000000..ff934a4
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/alltypes.h.in
@@ -0,0 +1,21 @@
+#define _REDIR_TIME64 1
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+#if _MIPSEL || __MIPSEL || __MIPSEL__
+#define __BYTE_ORDER 1234
+#else
+#define __BYTE_ORDER 4321
+#endif
+
+#define __LONG_MAX 0x7fffffffL
+
+#ifndef __cplusplus
+TYPEDEF int wchar_t;
+#endif
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/mipsn32/bits/errno.h b/libc-top-half/musl/arch/mipsn32/bits/errno.h
new file mode 100644
index 0000000..1bb91e3
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/errno.h
@@ -0,0 +1,134 @@
+#define EPERM 1
+#define ENOENT 2
+#define ESRCH 3
+#define EINTR 4
+#define EIO 5
+#define ENXIO 6
+#define E2BIG 7
+#define ENOEXEC 8
+#define EBADF 9
+#define ECHILD 10
+#define EAGAIN 11
+#define ENOMEM 12
+#define EACCES 13
+#define EFAULT 14
+#define ENOTBLK 15
+#define EBUSY 16
+#define EEXIST 17
+#define EXDEV 18
+#define ENODEV 19
+#define ENOTDIR 20
+#define EISDIR 21
+#define EINVAL 22
+#define ENFILE 23
+#define EMFILE 24
+#define ENOTTY 25
+#define ETXTBSY 26
+#define EFBIG 27
+#define ENOSPC 28
+#define ESPIPE 29
+#define EROFS 30
+#define EMLINK 31
+#define EPIPE 32
+#define EDOM 33
+#define ERANGE 34
+#define ENOMSG 35
+#define EIDRM 36
+#define ECHRNG 37
+#define EL2NSYNC 38
+#define EL3HLT 39
+#define EL3RST 40
+#define ELNRNG 41
+#define EUNATCH 42
+#define ENOCSI 43
+#define EL2HLT 44
+#define EDEADLK 45
+#define ENOLCK 46
+#define EBADE 50
+#define EBADR 51
+#define EXFULL 52
+#define ENOANO 53
+#define EBADRQC 54
+#define EBADSLT 55
+#define EDEADLOCK 56
+#define EBFONT 59
+#define ENOSTR 60
+#define ENODATA 61
+#define ETIME 62
+#define ENOSR 63
+#define ENONET 64
+#define ENOPKG 65
+#define EREMOTE 66
+#define ENOLINK 67
+#define EADV 68
+#define ESRMNT 69
+#define ECOMM 70
+#define EPROTO 71
+#define EDOTDOT 73
+#define EMULTIHOP 74
+#define EBADMSG 77
+#define ENAMETOOLONG 78
+#define EOVERFLOW 79
+#define ENOTUNIQ 80
+#define EBADFD 81
+#define EREMCHG 82
+#define ELIBACC 83
+#define ELIBBAD 84
+#define ELIBSCN 85
+#define ELIBMAX 86
+#define ELIBEXEC 87
+#define EILSEQ 88
+#define ENOSYS 89
+#define ELOOP 90
+#define ERESTART 91
+#define ESTRPIPE 92
+#define ENOTEMPTY 93
+#define EUSERS 94
+#define ENOTSOCK 95
+#define EDESTADDRREQ 96
+#define EMSGSIZE 97
+#define EPROTOTYPE 98
+#define ENOPROTOOPT 99
+#define EPROTONOSUPPORT 120
+#define ESOCKTNOSUPPORT 121
+#define EOPNOTSUPP 122
+#define ENOTSUP EOPNOTSUPP
+#define EPFNOSUPPORT 123
+#define EAFNOSUPPORT 124
+#define EADDRINUSE 125
+#define EADDRNOTAVAIL 126
+#define ENETDOWN 127
+#define ENETUNREACH 128
+#define ENETRESET 129
+#define ECONNABORTED 130
+#define ECONNRESET 131
+#define ENOBUFS 132
+#define EISCONN 133
+#define ENOTCONN 134
+#define EUCLEAN 135
+#define ENOTNAM 137
+#define ENAVAIL 138
+#define EISNAM 139
+#define EREMOTEIO 140
+#define ESHUTDOWN 143
+#define ETOOMANYREFS 144
+#define ETIMEDOUT 145
+#define ECONNREFUSED 146
+#define EHOSTDOWN 147
+#define EHOSTUNREACH 148
+#define EWOULDBLOCK EAGAIN
+#define EALREADY 149
+#define EINPROGRESS 150
+#define ESTALE 151
+#define ECANCELED 158
+#define ENOMEDIUM 159
+#define EMEDIUMTYPE 160
+#define ENOKEY 161
+#define EKEYEXPIRED 162
+#define EKEYREVOKED 163
+#define EKEYREJECTED 164
+#define EOWNERDEAD 165
+#define ENOTRECOVERABLE 166
+#define ERFKILL 167
+#define EHWPOISON 168
+#define EDQUOT 1133
diff --git a/libc-top-half/musl/arch/mipsn32/bits/fcntl.h b/libc-top-half/musl/arch/mipsn32/bits/fcntl.h
new file mode 100644
index 0000000..9fd8c23
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/fcntl.h
@@ -0,0 +1,40 @@
+#define O_CREAT 0400
+#define O_EXCL 02000
+#define O_NOCTTY 04000
+#define O_TRUNC 01000
+#define O_APPEND 0010
+#define O_NONBLOCK 0200
+#define O_DSYNC 0020
+#define O_SYNC 040020
+#define O_RSYNC 040020
+#define O_DIRECTORY 0200000
+#define O_NOFOLLOW 0400000
+#define O_CLOEXEC 02000000
+
+#define O_ASYNC 010000
+#define O_DIRECT 0100000
+#define O_LARGEFILE 020000
+#define O_NOATIME 01000000
+#define O_PATH 010000000
+#define O_TMPFILE 020200000
+#define O_NDELAY O_NONBLOCK
+
+#define F_DUPFD 0
+#define F_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+
+#define F_SETOWN 24
+#define F_GETOWN 23
+#define F_SETSIG 10
+#define F_GETSIG 11
+
+#define F_GETLK 33
+#define F_SETLK 34
+#define F_SETLKW 35
+
+#define F_SETOWN_EX 15
+#define F_GETOWN_EX 16
+
+#define F_GETOWNER_UIDS 17
diff --git a/libc-top-half/musl/arch/mipsn32/bits/fenv.h b/libc-top-half/musl/arch/mipsn32/bits/fenv.h
new file mode 100644
index 0000000..589e71c
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/fenv.h
@@ -0,0 +1,25 @@
+#ifdef __mips_soft_float
+#define FE_ALL_EXCEPT 0
+#define FE_TONEAREST 0
+#else
+#define FE_INEXACT 4
+#define FE_UNDERFLOW 8
+#define FE_OVERFLOW 16
+#define FE_DIVBYZERO 32
+#define FE_INVALID 64
+
+#define FE_ALL_EXCEPT 124
+
+#define FE_TONEAREST 0
+#define FE_TOWARDZERO 1
+#define FE_UPWARD 2
+#define FE_DOWNWARD 3
+#endif
+
+typedef unsigned short fexcept_t;
+
+typedef struct {
+ unsigned __cw;
+} fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *) -1)
diff --git a/libc-top-half/musl/arch/mipsn32/bits/float.h b/libc-top-half/musl/arch/mipsn32/bits/float.h
new file mode 100644
index 0000000..719c790
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L
+#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
+#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L
+#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L
+
+#define LDBL_MANT_DIG 113
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_MAX_EXP 16384
+
+#define LDBL_DIG 33
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MAX_10_EXP 4932
+
+#define DECIMAL_DIG 36
diff --git a/libc-top-half/musl/arch/mipsn32/bits/hwcap.h b/libc-top-half/musl/arch/mipsn32/bits/hwcap.h
new file mode 100644
index 0000000..13e86fe
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/hwcap.h
@@ -0,0 +1,3 @@
+#define HWCAP_MIPS_R6 (1 << 0)
+#define HWCAP_MIPS_MSA (1 << 1)
+#define HWCAP_MIPS_CRC32 (1 << 2)
diff --git a/libc-top-half/musl/arch/mipsn32/bits/ioctl.h b/libc-top-half/musl/arch/mipsn32/bits/ioctl.h
new file mode 100644
index 0000000..e20bf19
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/ioctl.h
@@ -0,0 +1,114 @@
+#define _IOC(a,b,c,d) ( ((a)<<29) | ((b)<<8) | (c) | ((d)<<16) )
+#define _IOC_NONE 1U
+#define _IOC_READ 2U
+#define _IOC_WRITE 4U
+
+#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0)
+#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c))
+#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c))
+#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c))
+
+#define TCGETA 0x5401
+#define TCSETA 0x5402
+#define TCSETAW 0x5403
+#define TCSETAF 0x5404
+#define TCSBRK 0x5405
+#define TCXONC 0x5406
+#define TCFLSH 0x5407
+#define TCGETS 0x540D
+#define TCSETS 0x540E
+#define TCSETSW 0x540F
+#define TCSETSF 0x5410
+
+#define TIOCEXCL 0x740D
+#define TIOCNXCL 0x740E
+#define TIOCOUTQ 0x7472
+#define TIOCSTI 0x5472
+#define TIOCMGET 0x741D
+#define TIOCMBIS 0x741B
+#define TIOCMBIC 0x741C
+#define TIOCMSET 0x741A
+
+#define TIOCPKT 0x5470
+#define TIOCSWINSZ _IOW('t', 103, struct winsize)
+#define TIOCGWINSZ _IOR('t', 104, struct winsize)
+#define TIOCNOTTY 0x5471
+#define TIOCSETD 0x7401
+#define TIOCGETD 0x7400
+
+#define FIOCLEX 0x6601
+#define FIONCLEX 0x6602
+#define FIOASYNC 0x667D
+#define FIONBIO 0x667E
+#define FIOQSIZE 0x667F
+
+#define TIOCGLTC 0x7474
+#define TIOCSLTC 0x7475
+#define TIOCSPGRP _IOW('t', 118, int)
+#define TIOCGPGRP _IOR('t', 119, int)
+#define TIOCCONS _IOW('t', 120, int)
+
+#define FIONREAD 0x467F
+#define TIOCINQ FIONREAD
+
+#define TIOCGETP 0x7408
+#define TIOCSETP 0x7409
+#define TIOCSETN 0x740A
+
+#define TIOCSBRK 0x5427
+#define TIOCCBRK 0x5428
+#define TIOCGSID 0x7416
+#define TIOCGRS485 _IOR('T', 0x2E, char[32])
+#define TIOCSRS485 _IOWR('T', 0x2F, char[32])
+#define TIOCGPTN _IOR('T', 0x30, unsigned int)
+#define TIOCSPTLCK _IOW('T', 0x31, int)
+#define TIOCGDEV _IOR('T', 0x32, unsigned int)
+#define TIOCSIG _IOW('T', 0x36, int)
+#define TIOCVHANGUP 0x5437
+#define TIOCGPKT _IOR('T', 0x38, int)
+#define TIOCGPTLCK _IOR('T', 0x39, int)
+#define TIOCGEXCL _IOR('T', 0x40, int)
+#define TIOCGPTPEER _IO('T', 0x41)
+
+#define TIOCSCTTY 0x5480
+#define TIOCGSOFTCAR 0x5481
+#define TIOCSSOFTCAR 0x5482
+#define TIOCLINUX 0x5483
+#define TIOCGSERIAL 0x5484
+#define TIOCSSERIAL 0x5485
+#define TCSBRKP 0x5486
+
+#define TIOCSERCONFIG 0x5488
+#define TIOCSERGWILD 0x5489
+#define TIOCSERSWILD 0x548A
+#define TIOCGLCKTRMIOS 0x548B
+#define TIOCSLCKTRMIOS 0x548C
+#define TIOCSERGSTRUCT 0x548D
+#define TIOCSERGETLSR 0x548E
+#define TIOCSERGETMULTI 0x548F
+#define TIOCSERSETMULTI 0x5490
+#define TIOCMIWAIT 0x5491
+#define TIOCGICOUNT 0x5492
+
+#define TIOCM_LE 0x001
+#define TIOCM_DTR 0x002
+#define TIOCM_RTS 0x004
+#define TIOCM_ST 0x010
+#define TIOCM_SR 0x020
+#define TIOCM_CTS 0x040
+#define TIOCM_CAR 0x100
+#define TIOCM_CD TIOCM_CAR
+#define TIOCM_RNG 0x200
+#define TIOCM_RI TIOCM_RNG
+#define TIOCM_DSR 0x400
+#define TIOCM_OUT1 0x2000
+#define TIOCM_OUT2 0x4000
+#define TIOCM_LOOP 0x8000
+
+#define FIOGETOWN _IOR('f', 123, int)
+#define FIOSETOWN _IOW('f', 124, int)
+#define SIOCATMARK _IOR('s', 7, int)
+#define SIOCSPGRP _IOW('s', 8, pid_t)
+#define SIOCGPGRP _IOR('s', 9, pid_t)
+#define SIOCGSTAMP _IOR(0x89, 6, char[16])
+#define SIOCGSTAMPNS _IOR(0x89, 7, char[16])
diff --git a/libc-top-half/musl/arch/mipsn32/bits/ipcstat.h b/libc-top-half/musl/arch/mipsn32/bits/ipcstat.h
new file mode 100644
index 0000000..4f4fcb0
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/ipcstat.h
@@ -0,0 +1 @@
+#define IPC_STAT 0x102
diff --git a/libc-top-half/musl/arch/mipsn32/bits/mman.h b/libc-top-half/musl/arch/mipsn32/bits/mman.h
new file mode 100644
index 0000000..9027bb6
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/mman.h
@@ -0,0 +1,25 @@
+#undef MAP_ANON
+#define MAP_ANON 0x800
+#undef MAP_NORESERVE
+#define MAP_NORESERVE 0x0400
+#undef MAP_GROWSDOWN
+#define MAP_GROWSDOWN 0x1000
+#undef MAP_DENYWRITE
+#define MAP_DENYWRITE 0x2000
+#undef MAP_EXECUTABLE
+#define MAP_EXECUTABLE 0x4000
+#undef MAP_LOCKED
+#define MAP_LOCKED 0x8000
+#undef MAP_POPULATE
+#define MAP_POPULATE 0x10000
+#undef MAP_NONBLOCK
+#define MAP_NONBLOCK 0x20000
+#undef MAP_STACK
+#define MAP_STACK 0x40000
+#undef MAP_HUGETLB
+#define MAP_HUGETLB 0x80000
+#undef MAP_SYNC
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#undef MADV_SOFT_OFFLINE
+#endif
diff --git a/libc-top-half/musl/arch/mipsn32/bits/msg.h b/libc-top-half/musl/arch/mipsn32/bits/msg.h
new file mode 100644
index 0000000..c734dbb
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/msg.h
@@ -0,0 +1,27 @@
+struct msqid_ds {
+ struct ipc_perm msg_perm;
+#if _MIPSEL || __MIPSEL || __MIPSEL__
+ unsigned long __msg_stime_lo;
+ unsigned long __msg_stime_hi;
+ unsigned long __msg_rtime_lo;
+ unsigned long __msg_rtime_hi;
+ unsigned long __msg_ctime_lo;
+ unsigned long __msg_ctime_hi;
+#else
+ unsigned long __msg_stime_hi;
+ unsigned long __msg_stime_lo;
+ unsigned long __msg_rtime_hi;
+ unsigned long __msg_rtime_lo;
+ unsigned long __msg_ctime_hi;
+ unsigned long __msg_ctime_lo;
+#endif
+ unsigned long msg_cbytes;
+ msgqnum_t msg_qnum;
+ msglen_t msg_qbytes;
+ pid_t msg_lspid;
+ pid_t msg_lrpid;
+ unsigned long __unused[2];
+ time_t msg_stime;
+ time_t msg_rtime;
+ time_t msg_ctime;
+};
diff --git a/libc-top-half/musl/arch/mipsn32/bits/poll.h b/libc-top-half/musl/arch/mipsn32/bits/poll.h
new file mode 100644
index 0000000..b0b1ed6
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/poll.h
@@ -0,0 +1,2 @@
+#define POLLWRNORM POLLOUT
+#define POLLWRBAND 0x100
diff --git a/libc-top-half/musl/arch/mipsn32/bits/posix.h b/libc-top-half/musl/arch/mipsn32/bits/posix.h
new file mode 100644
index 0000000..30a3871
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_ILP32_OFFBIG 1
+#define _POSIX_V7_ILP32_OFFBIG 1
diff --git a/libc-top-half/musl/arch/mipsn32/bits/ptrace.h b/libc-top-half/musl/arch/mipsn32/bits/ptrace.h
new file mode 100644
index 0000000..77a01c0
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/ptrace.h
@@ -0,0 +1,9 @@
+#define PTRACE_GET_THREAD_AREA 25
+#define PTRACE_SET_THREAD_AREA 26
+#define PTRACE_PEEKTEXT_3264 0xc0
+#define PTRACE_PEEKDATA_3264 0xc1
+#define PTRACE_POKETEXT_3264 0xc2
+#define PTRACE_POKEDATA_3264 0xc3
+#define PTRACE_GET_THREAD_AREA_3264 0xc4
+#define PTRACE_GET_WATCH_REGS 0xd0
+#define PTRACE_SET_WATCH_REGS 0xd1
diff --git a/libc-top-half/musl/arch/mipsn32/bits/reg.h b/libc-top-half/musl/arch/mipsn32/bits/reg.h
new file mode 100644
index 0000000..a3f63ac
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/reg.h
@@ -0,0 +1,47 @@
+#undef __WORDSIZE
+#define __WORDSIZE 64
+
+#define EF_R0 0
+#define EF_R1 1
+#define EF_R2 2
+#define EF_R3 3
+#define EF_R4 4
+#define EF_R5 5
+#define EF_R6 6
+#define EF_R7 7
+#define EF_R8 8
+#define EF_R9 9
+#define EF_R10 10
+#define EF_R11 11
+#define EF_R12 12
+#define EF_R13 13
+#define EF_R14 14
+#define EF_R15 15
+#define EF_R16 16
+#define EF_R17 17
+#define EF_R18 18
+#define EF_R19 19
+#define EF_R20 20
+#define EF_R21 21
+#define EF_R22 22
+#define EF_R23 23
+#define EF_R24 24
+#define EF_R25 25
+
+#define EF_R26 26
+#define EF_R27 27
+#define EF_R28 28
+#define EF_R29 29
+#define EF_R30 30
+#define EF_R31 31
+
+#define EF_LO 32
+#define EF_HI 33
+
+#define EF_CP0_EPC 34
+#define EF_CP0_BADVADDR 35
+#define EF_CP0_STATUS 36
+#define EF_CP0_CAUSE 37
+#define EF_UNUSED0 38
+
+#define EF_SIZE 304
diff --git a/libc-top-half/musl/arch/mipsn32/bits/resource.h b/libc-top-half/musl/arch/mipsn32/bits/resource.h
new file mode 100644
index 0000000..414a405
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/resource.h
@@ -0,0 +1,5 @@
+#define RLIMIT_NOFILE 5
+#define RLIMIT_AS 6
+#define RLIMIT_RSS 7
+#define RLIMIT_NPROC 8
+#define RLIMIT_MEMLOCK 9
diff --git a/libc-top-half/musl/arch/mipsn32/bits/sem.h b/libc-top-half/musl/arch/mipsn32/bits/sem.h
new file mode 100644
index 0000000..fe6f094
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/sem.h
@@ -0,0 +1,16 @@
+struct semid_ds {
+ struct ipc_perm sem_perm;
+ unsigned long __sem_otime_lo;
+ unsigned long __sem_ctime_lo;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned short sem_nsems;
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+#else
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+ unsigned short sem_nsems;
+#endif
+ unsigned long __sem_otime_hi;
+ unsigned long __sem_ctime_hi;
+ time_t sem_otime;
+ time_t sem_ctime;
+};
diff --git a/libc-top-half/musl/arch/mipsn32/bits/setjmp.h b/libc-top-half/musl/arch/mipsn32/bits/setjmp.h
new file mode 100644
index 0000000..4d93267
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long long __jmp_buf[23];
diff --git a/libc-top-half/musl/arch/mipsn32/bits/shm.h b/libc-top-half/musl/arch/mipsn32/bits/shm.h
new file mode 100644
index 0000000..ab8c642
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/shm.h
@@ -0,0 +1,29 @@
+#define SHMLBA 4096
+
+struct shmid_ds {
+ struct ipc_perm shm_perm;
+ size_t shm_segsz;
+ unsigned long __shm_atime_lo;
+ unsigned long __shm_dtime_lo;
+ unsigned long __shm_ctime_lo;
+ pid_t shm_cpid;
+ pid_t shm_lpid;
+ unsigned long shm_nattch;
+ unsigned short __shm_atime_hi;
+ unsigned short __shm_dtime_hi;
+ unsigned short __shm_ctime_hi;
+ unsigned short __pad1;
+ time_t shm_atime;
+ time_t shm_dtime;
+ time_t shm_ctime;
+};
+
+struct shminfo {
+ unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+};
+
+struct shm_info {
+ int __used_ids;
+ unsigned long shm_tot, shm_rss, shm_swp;
+ unsigned long __swap_attempts, __swap_successes;
+};
diff --git a/libc-top-half/musl/arch/mipsn32/bits/signal.h b/libc-top-half/musl/arch/mipsn32/bits/signal.h
new file mode 100644
index 0000000..4f91c9f
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/signal.h
@@ -0,0 +1,143 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef unsigned long long greg_t, gregset_t[32];
+
+typedef struct {
+ union {
+ double fp_dregs[32];
+ struct {
+ float _fp_fregs;
+ unsigned _fp_pad;
+ } fp_fregs[32];
+ } fp_r;
+} fpregset_t;
+
+struct sigcontext {
+ unsigned long long sc_regs[32];
+ unsigned long long sc_fpregs[32];
+ unsigned long long sc_mdhi;
+ unsigned long long sc_hi1;
+ unsigned long long sc_hi2;
+ unsigned long long sc_hi3;
+ unsigned long long sc_mdlo;
+ unsigned long long sc_lo1;
+ unsigned long long sc_lo2;
+ unsigned long long sc_lo3;
+ unsigned long long sc_pc;
+ unsigned int sc_fpc_csr;
+ unsigned int sc_used_math;
+ unsigned int sc_dsp;
+ unsigned int sc_reserved;
+};
+
+typedef struct {
+ gregset_t gregs;
+ fpregset_t fpregs;
+ greg_t mdhi;
+ greg_t hi1;
+ greg_t hi2;
+ greg_t hi3;
+ greg_t mdlo;
+ greg_t lo1;
+ greg_t lo2;
+ greg_t lo3;
+ greg_t pc;
+ unsigned int fpc_csr;
+ unsigned int used_math;
+ unsigned int dsp;
+ unsigned int reserved;
+} mcontext_t;
+
+#else
+typedef struct {
+ unsigned long long __mc1[32];
+ double __mc2[32];
+ unsigned long long __mc3[9];
+ unsigned __mc4[4];
+} mcontext_t;
+#endif
+
+struct sigaltstack {
+ void *ss_sp;
+ size_t ss_size;
+ int ss_flags;
+};
+
+typedef struct __ucontext {
+ unsigned long uc_flags;
+ struct __ucontext *uc_link;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ sigset_t uc_sigmask;
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 0x10000
+#define SA_SIGINFO 8
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#undef SIG_BLOCK
+#undef SIG_UNBLOCK
+#undef SIG_SETMASK
+#define SIG_BLOCK 1
+#define SIG_UNBLOCK 2
+#define SIG_SETMASK 3
+
+#undef SI_ASYNCIO
+#undef SI_MESGQ
+#undef SI_TIMER
+#define SI_ASYNCIO (-2)
+#define SI_MESGQ (-4)
+#define SI_TIMER (-3)
+
+#define __SI_SWAP_ERRNO_CODE
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGEMT 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGBUS 10
+#define SIGSEGV 11
+#define SIGSYS 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGUSR1 16
+#define SIGUSR2 17
+#define SIGCHLD 18
+#define SIGPWR 19
+#define SIGWINCH 20
+#define SIGURG 21
+#define SIGIO 22
+#define SIGPOLL SIGIO
+#define SIGSTOP 23
+#define SIGTSTP 24
+#define SIGCONT 25
+#define SIGTTIN 26
+#define SIGTTOU 27
+#define SIGVTALRM 28
+#define SIGPROF 29
+#define SIGXCPU 30
+#define SIGXFSZ 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 128
diff --git a/libc-top-half/musl/arch/mipsn32/bits/socket.h b/libc-top-half/musl/arch/mipsn32/bits/socket.h
new file mode 100644
index 0000000..02fbb88
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/socket.h
@@ -0,0 +1,35 @@
+#define SOCK_STREAM 2
+#define SOCK_DGRAM 1
+
+#define SOL_SOCKET 65535
+
+#define SO_DEBUG 1
+
+#define SO_REUSEADDR 0x0004
+#define SO_KEEPALIVE 0x0008
+#define SO_DONTROUTE 0x0010
+#define SO_BROADCAST 0x0020
+#define SO_LINGER 0x0080
+#define SO_OOBINLINE 0x0100
+#define SO_REUSEPORT 0x0200
+#define SO_SNDBUF 0x1001
+#define SO_RCVBUF 0x1002
+#define SO_SNDLOWAT 0x1003
+#define SO_RCVLOWAT 0x1004
+#define SO_ERROR 0x1007
+#define SO_TYPE 0x1008
+#define SO_ACCEPTCONN 0x1009
+#define SO_PROTOCOL 0x1028
+#define SO_DOMAIN 0x1029
+
+#define SO_NO_CHECK 11
+#define SO_PRIORITY 12
+#define SO_BSDCOMPAT 14
+#define SO_PASSCRED 17
+#define SO_PEERCRED 18
+#define SO_PEERSEC 30
+#define SO_SNDBUFFORCE 31
+#define SO_RCVBUFFORCE 33
+
+#define SOCK_NONBLOCK 0200
+#define SOCK_CLOEXEC 02000000
diff --git a/libc-top-half/musl/arch/mipsn32/bits/stat.h b/libc-top-half/musl/arch/mipsn32/bits/stat.h
new file mode 100644
index 0000000..6e2f280
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/stat.h
@@ -0,0 +1,23 @@
+struct stat {
+ dev_t st_dev;
+ long __pad1[2];
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ long __pad2[2];
+ off_t st_size;
+ struct {
+ long tv_sec;
+ long tv_nsec;
+ } __st_atim32, __st_mtim32, __st_ctim32;
+ blksize_t st_blksize;
+ long __pad3;
+ blkcnt_t st_blocks;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+ long __pad4[2];
+};
diff --git a/libc-top-half/musl/arch/mipsn32/bits/statfs.h b/libc-top-half/musl/arch/mipsn32/bits/statfs.h
new file mode 100644
index 0000000..a73bd54
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/statfs.h
@@ -0,0 +1,8 @@
+struct statfs {
+ unsigned long f_type, f_bsize, f_frsize;
+ fsblkcnt_t f_blocks, f_bfree;
+ fsfilcnt_t f_files, f_ffree;
+ fsblkcnt_t f_bavail;
+ fsid_t f_fsid;
+ unsigned long f_namelen, f_flags, f_spare[5];
+};
diff --git a/libc-top-half/musl/arch/mipsn32/bits/stdint.h b/libc-top-half/musl/arch/mipsn32/bits/stdint.h
new file mode 100644
index 0000000..d1b2712
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#define SIZE_MAX UINT32_MAX
diff --git a/libc-top-half/musl/arch/mipsn32/bits/syscall.h.in b/libc-top-half/musl/arch/mipsn32/bits/syscall.h.in
new file mode 100644
index 0000000..bb2d04a
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/syscall.h.in
@@ -0,0 +1,375 @@
+#define __NR_read 6000
+#define __NR_write 6001
+#define __NR_open 6002
+#define __NR_close 6003
+#define __NR_stat 6004
+#define __NR_fstat 6005
+#define __NR_lstat 6006
+#define __NR_poll 6007
+#define __NR_lseek 6008
+#define __NR_mmap 6009
+#define __NR_mprotect 6010
+#define __NR_munmap 6011
+#define __NR_brk 6012
+#define __NR_rt_sigaction 6013
+#define __NR_rt_sigprocmask 6014
+#define __NR_ioctl 6015
+#define __NR_pread64 6016
+#define __NR_pwrite64 6017
+#define __NR_readv 6018
+#define __NR_writev 6019
+#define __NR_access 6020
+#define __NR_pipe 6021
+#define __NR__newselect 6022
+#define __NR_sched_yield 6023
+#define __NR_mremap 6024
+#define __NR_msync 6025
+#define __NR_mincore 6026
+#define __NR_madvise 6027
+#define __NR_shmget 6028
+#define __NR_shmat 6029
+#define __NR_shmctl 6030
+#define __NR_dup 6031
+#define __NR_dup2 6032
+#define __NR_pause 6033
+#define __NR_nanosleep 6034
+#define __NR_getitimer 6035
+#define __NR_setitimer 6036
+#define __NR_alarm 6037
+#define __NR_getpid 6038
+#define __NR_sendfile 6039
+#define __NR_socket 6040
+#define __NR_connect 6041
+#define __NR_accept 6042
+#define __NR_sendto 6043
+#define __NR_recvfrom 6044
+#define __NR_sendmsg 6045
+#define __NR_recvmsg 6046
+#define __NR_shutdown 6047
+#define __NR_bind 6048
+#define __NR_listen 6049
+#define __NR_getsockname 6050
+#define __NR_getpeername 6051
+#define __NR_socketpair 6052
+#define __NR_setsockopt 6053
+#define __NR_getsockopt 6054
+#define __NR_clone 6055
+#define __NR_fork 6056
+#define __NR_execve 6057
+#define __NR_exit 6058
+#define __NR_wait4 6059
+#define __NR_kill 6060
+#define __NR_uname 6061
+#define __NR_semget 6062
+#define __NR_semop 6063
+#define __NR_semctl 6064
+#define __NR_shmdt 6065
+#define __NR_msgget 6066
+#define __NR_msgsnd 6067
+#define __NR_msgrcv 6068
+#define __NR_msgctl 6069
+#define __NR_fcntl 6070
+#define __NR_flock 6071
+#define __NR_fsync 6072
+#define __NR_fdatasync 6073
+#define __NR_truncate 6074
+#define __NR_ftruncate 6075
+#define __NR_getdents 6076
+#define __NR_getcwd 6077
+#define __NR_chdir 6078
+#define __NR_fchdir 6079
+#define __NR_rename 6080
+#define __NR_mkdir 6081
+#define __NR_rmdir 6082
+#define __NR_creat 6083
+#define __NR_link 6084
+#define __NR_unlink 6085
+#define __NR_symlink 6086
+#define __NR_readlink 6087
+#define __NR_chmod 6088
+#define __NR_fchmod 6089
+#define __NR_chown 6090
+#define __NR_fchown 6091
+#define __NR_lchown 6092
+#define __NR_umask 6093
+#define __NR_gettimeofday_time32 6094
+#define __NR_getrlimit 6095
+#define __NR_getrusage 6096
+#define __NR_sysinfo 6097
+#define __NR_times 6098
+#define __NR_ptrace 6099
+#define __NR_getuid 6100
+#define __NR_syslog 6101
+#define __NR_getgid 6102
+#define __NR_setuid 6103
+#define __NR_setgid 6104
+#define __NR_geteuid 6105
+#define __NR_getegid 6106
+#define __NR_setpgid 6107
+#define __NR_getppid 6108
+#define __NR_getpgrp 6109
+#define __NR_setsid 6110
+#define __NR_setreuid 6111
+#define __NR_setregid 6112
+#define __NR_getgroups 6113
+#define __NR_setgroups 6114
+#define __NR_setresuid 6115
+#define __NR_getresuid 6116
+#define __NR_setresgid 6117
+#define __NR_getresgid 6118
+#define __NR_getpgid 6119
+#define __NR_setfsuid 6120
+#define __NR_setfsgid 6121
+#define __NR_getsid 6122
+#define __NR_capget 6123
+#define __NR_capset 6124
+#define __NR_rt_sigpending 6125
+#define __NR_rt_sigtimedwait 6126
+#define __NR_rt_sigqueueinfo 6127
+#define __NR_rt_sigsuspend 6128
+#define __NR_sigaltstack 6129
+#define __NR_utime 6130
+#define __NR_mknod 6131
+#define __NR_personality 6132
+#define __NR_ustat 6133
+#define __NR_statfs 6134
+#define __NR_fstatfs 6135
+#define __NR_sysfs 6136
+#define __NR_getpriority 6137
+#define __NR_setpriority 6138
+#define __NR_sched_setparam 6139
+#define __NR_sched_getparam 6140
+#define __NR_sched_setscheduler 6141
+#define __NR_sched_getscheduler 6142
+#define __NR_sched_get_priority_max 6143
+#define __NR_sched_get_priority_min 6144
+#define __NR_sched_rr_get_interval 6145
+#define __NR_mlock 6146
+#define __NR_munlock 6147
+#define __NR_mlockall 6148
+#define __NR_munlockall 6149
+#define __NR_vhangup 6150
+#define __NR_pivot_root 6151
+#define __NR__sysctl 6152
+#define __NR_prctl 6153
+#define __NR_adjtimex 6154
+#define __NR_setrlimit 6155
+#define __NR_chroot 6156
+#define __NR_sync 6157
+#define __NR_acct 6158
+#define __NR_settimeofday_time32 6159
+#define __NR_mount 6160
+#define __NR_umount2 6161
+#define __NR_swapon 6162
+#define __NR_swapoff 6163
+#define __NR_reboot 6164
+#define __NR_sethostname 6165
+#define __NR_setdomainname 6166
+#define __NR_create_module 6167
+#define __NR_init_module 6168
+#define __NR_delete_module 6169
+#define __NR_get_kernel_syms 6170
+#define __NR_query_module 6171
+#define __NR_quotactl 6172
+#define __NR_nfsservctl 6173
+#define __NR_getpmsg 6174
+#define __NR_putpmsg 6175
+#define __NR_afs_syscall 6176
+#define __NR_reserved177 6177
+#define __NR_gettid 6178
+#define __NR_readahead 6179
+#define __NR_setxattr 6180
+#define __NR_lsetxattr 6181
+#define __NR_fsetxattr 6182
+#define __NR_getxattr 6183
+#define __NR_lgetxattr 6184
+#define __NR_fgetxattr 6185
+#define __NR_listxattr 6186
+#define __NR_llistxattr 6187
+#define __NR_flistxattr 6188
+#define __NR_removexattr 6189
+#define __NR_lremovexattr 6190
+#define __NR_fremovexattr 6191
+#define __NR_tkill 6192
+#define __NR_reserved193 6193
+#define __NR_futex 6194
+#define __NR_sched_setaffinity 6195
+#define __NR_sched_getaffinity 6196
+#define __NR_cacheflush 6197
+#define __NR_cachectl 6198
+#define __NR_sysmips 6199
+#define __NR_io_setup 6200
+#define __NR_io_destroy 6201
+#define __NR_io_getevents 6202
+#define __NR_io_submit 6203
+#define __NR_io_cancel 6204
+#define __NR_exit_group 6205
+#define __NR_lookup_dcookie 6206
+#define __NR_epoll_create 6207
+#define __NR_epoll_ctl 6208
+#define __NR_epoll_wait 6209
+#define __NR_remap_file_pages 6210
+#define __NR_rt_sigreturn 6211
+#define __NR_fcntl64 6212
+#define __NR_set_tid_address 6213
+#define __NR_restart_syscall 6214
+#define __NR_semtimedop 6215
+#define __NR_fadvise64 6216
+#define __NR_statfs64 6217
+#define __NR_fstatfs64 6218
+#define __NR_sendfile64 6219
+#define __NR_timer_create 6220
+#define __NR_timer_settime32 6221
+#define __NR_timer_gettime32 6222
+#define __NR_timer_getoverrun 6223
+#define __NR_timer_delete 6224
+#define __NR_clock_settime32 6225
+#define __NR_clock_gettime32 6226
+#define __NR_clock_getres_time32 6227
+#define __NR_clock_nanosleep_time32 6228
+#define __NR_tgkill 6229
+#define __NR_utimes 6230
+#define __NR_mbind 6231
+#define __NR_get_mempolicy 6232
+#define __NR_set_mempolicy 6233
+#define __NR_mq_open 6234
+#define __NR_mq_unlink 6235
+#define __NR_mq_timedsend 6236
+#define __NR_mq_timedreceive 6237
+#define __NR_mq_notify 6238
+#define __NR_mq_getsetattr 6239
+#define __NR_vserver 6240
+#define __NR_waitid 6241
+#define __NR_add_key 6243
+#define __NR_request_key 6244
+#define __NR_keyctl 6245
+#define __NR_set_thread_area 6246
+#define __NR_inotify_init 6247
+#define __NR_inotify_add_watch 6248
+#define __NR_inotify_rm_watch 6249
+#define __NR_migrate_pages 6250
+#define __NR_openat 6251
+#define __NR_mkdirat 6252
+#define __NR_mknodat 6253
+#define __NR_fchownat 6254
+#define __NR_futimesat 6255
+#define __NR_newfstatat 6256
+#define __NR_unlinkat 6257
+#define __NR_renameat 6258
+#define __NR_linkat 6259
+#define __NR_symlinkat 6260
+#define __NR_readlinkat 6261
+#define __NR_fchmodat 6262
+#define __NR_faccessat 6263
+#define __NR_pselect6 6264
+#define __NR_ppoll 6265
+#define __NR_unshare 6266
+#define __NR_splice 6267
+#define __NR_sync_file_range 6268
+#define __NR_tee 6269
+#define __NR_vmsplice 6270
+#define __NR_move_pages 6271
+#define __NR_set_robust_list 6272
+#define __NR_get_robust_list 6273
+#define __NR_kexec_load 6274
+#define __NR_getcpu 6275
+#define __NR_epoll_pwait 6276
+#define __NR_ioprio_set 6277
+#define __NR_ioprio_get 6278
+#define __NR_utimensat 6279
+#define __NR_signalfd 6280
+#define __NR_timerfd 6281
+#define __NR_eventfd 6282
+#define __NR_fallocate 6283
+#define __NR_timerfd_create 6284
+#define __NR_timerfd_gettime32 6285
+#define __NR_timerfd_settime32 6286
+#define __NR_signalfd4 6287
+#define __NR_eventfd2 6288
+#define __NR_epoll_create1 6289
+#define __NR_dup3 6290
+#define __NR_pipe2 6291
+#define __NR_inotify_init1 6292
+#define __NR_preadv 6293
+#define __NR_pwritev 6294
+#define __NR_rt_tgsigqueueinfo 6295
+#define __NR_perf_event_open 6296
+#define __NR_accept4 6297
+#define __NR_recvmmsg 6298
+#define __NR_getdents64 6299
+#define __NR_fanotify_init 6300
+#define __NR_fanotify_mark 6301
+#define __NR_prlimit64 6302
+#define __NR_name_to_handle_at 6303
+#define __NR_open_by_handle_at 6304
+#define __NR_clock_adjtime 6305
+#define __NR_syncfs 6306
+#define __NR_sendmmsg 6307
+#define __NR_setns 6308
+#define __NR_process_vm_readv 6309
+#define __NR_process_vm_writev 6310
+#define __NR_kcmp 6311
+#define __NR_finit_module 6312
+#define __NR_sched_setattr 6313
+#define __NR_sched_getattr 6314
+#define __NR_renameat2 6315
+#define __NR_seccomp 6316
+#define __NR_getrandom 6317
+#define __NR_memfd_create 6318
+#define __NR_bpf 6319
+#define __NR_execveat 6320
+#define __NR_userfaultfd 6321
+#define __NR_membarrier 6322
+#define __NR_mlock2 6323
+#define __NR_copy_file_range 6324
+#define __NR_preadv2 6325
+#define __NR_pwritev2 6326
+#define __NR_pkey_mprotect 6327
+#define __NR_pkey_alloc 6328
+#define __NR_pkey_free 6329
+#define __NR_statx 6330
+#define __NR_rseq 6331
+#define __NR_io_pgetevents 6332
+#define __NR_clock_gettime64 6403
+#define __NR_clock_settime64 6404
+#define __NR_clock_adjtime64 6405
+#define __NR_clock_getres_time64 6406
+#define __NR_clock_nanosleep_time64 6407
+#define __NR_timer_gettime64 6408
+#define __NR_timer_settime64 6409
+#define __NR_timerfd_gettime64 6410
+#define __NR_timerfd_settime64 6411
+#define __NR_utimensat_time64 6412
+#define __NR_pselect6_time64 6413
+#define __NR_ppoll_time64 6414
+#define __NR_io_pgetevents_time64 6416
+#define __NR_recvmmsg_time64 6417
+#define __NR_mq_timedsend_time64 6418
+#define __NR_mq_timedreceive_time64 6419
+#define __NR_semtimedop_time64 6420
+#define __NR_rt_sigtimedwait_time64 6421
+#define __NR_futex_time64 6422
+#define __NR_sched_rr_get_interval_time64 6423
+#define __NR_pidfd_send_signal 6424
+#define __NR_io_uring_setup 6425
+#define __NR_io_uring_enter 6426
+#define __NR_io_uring_register 6427
+#define __NR_open_tree 6428
+#define __NR_move_mount 6429
+#define __NR_fsopen 6430
+#define __NR_fsconfig 6431
+#define __NR_fsmount 6432
+#define __NR_fspick 6433
+#define __NR_pidfd_open 6434
+#define __NR_clone3 6435
+#define __NR_close_range 6436
+#define __NR_openat2 6437
+#define __NR_pidfd_getfd 6438
+#define __NR_faccessat2 6439
+#define __NR_process_madvise 6440
+#define __NR_epoll_pwait2 6441
+#define __NR_mount_setattr 6442
+#define __NR_landlock_create_ruleset 6444
+#define __NR_landlock_add_rule 6445
+#define __NR_landlock_restrict_self 6446
+
diff --git a/libc-top-half/musl/arch/mipsn32/bits/termios.h b/libc-top-half/musl/arch/mipsn32/bits/termios.h
new file mode 100644
index 0000000..9d571f7
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/termios.h
@@ -0,0 +1,169 @@
+struct termios {
+ tcflag_t c_iflag;
+ tcflag_t c_oflag;
+ tcflag_t c_cflag;
+ tcflag_t c_lflag;
+ cc_t c_line;
+ cc_t c_cc[NCCS];
+ speed_t __c_ispeed;
+ speed_t __c_ospeed;
+};
+
+#define VINTR 0
+#define VQUIT 1
+#define VERASE 2
+#define VKILL 3
+#define VMIN 4
+#define VTIME 5
+#define VEOL2 6
+#define VSWTC 7
+#define VSWTCH 7
+#define VSTART 8
+#define VSTOP 9
+#define VSUSP 10
+#define VREPRINT 12
+#define VDISCARD 13
+#define VWERASE 14
+#define VLNEXT 15
+#define VEOF 16
+#define VEOL 17
+
+#define IGNBRK 0000001
+#define BRKINT 0000002
+#define IGNPAR 0000004
+#define PARMRK 0000010
+#define INPCK 0000020
+#define ISTRIP 0000040
+#define INLCR 0000100
+#define IGNCR 0000200
+#define ICRNL 0000400
+#define IUCLC 0001000
+#define IXON 0002000
+#define IXANY 0004000
+#define IXOFF 0010000
+#define IMAXBEL 0020000
+#define IUTF8 0040000
+
+#define OPOST 0000001
+#define OLCUC 0000002
+#define ONLCR 0000004
+#define OCRNL 0000010
+#define ONOCR 0000020
+#define ONLRET 0000040
+#define OFILL 0000100
+#define OFDEL 0000200
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE)
+#define NLDLY 0000400
+#define NL0 0000000
+#define NL1 0000400
+#define CRDLY 0003000
+#define CR0 0000000
+#define CR1 0001000
+#define CR2 0002000
+#define CR3 0003000
+#define TABDLY 0014000
+#define TAB0 0000000
+#define TAB1 0004000
+#define TAB2 0010000
+#define TAB3 0014000
+#define BSDLY 0020000
+#define BS0 0000000
+#define BS1 0020000
+#define FFDLY 0100000
+#define FF0 0000000
+#define FF1 0100000
+#endif
+
+#define VTDLY 0040000
+#define VT0 0000000
+#define VT1 0040000
+
+#define B0 0000000
+#define B50 0000001
+#define B75 0000002
+#define B110 0000003
+#define B134 0000004
+#define B150 0000005
+#define B200 0000006
+#define B300 0000007
+#define B600 0000010
+#define B1200 0000011
+#define B1800 0000012
+#define B2400 0000013
+#define B4800 0000014
+#define B9600 0000015
+#define B19200 0000016
+#define B38400 0000017
+
+#define B57600 0010001
+#define B115200 0010002
+#define B230400 0010003
+#define B460800 0010004
+#define B500000 0010005
+#define B576000 0010006
+#define B921600 0010007
+#define B1000000 0010010
+#define B1152000 0010011
+#define B1500000 0010012
+#define B2000000 0010013
+#define B2500000 0010014
+#define B3000000 0010015
+#define B3500000 0010016
+#define B4000000 0010017
+
+#define CSIZE 0000060
+#define CS5 0000000
+#define CS6 0000020
+#define CS7 0000040
+#define CS8 0000060
+#define CSTOPB 0000100
+#define CREAD 0000200
+#define PARENB 0000400
+#define PARODD 0001000
+#define HUPCL 0002000
+#define CLOCAL 0004000
+
+#define ISIG 0000001
+#define ICANON 0000002
+#define ECHO 0000010
+#define ECHOE 0000020
+#define ECHOK 0000040
+#define ECHONL 0000100
+#define NOFLSH 0000200
+#define IEXTEN 0000400
+#define TOSTOP 0100000
+#define ITOSTOP 0100000
+
+#define TCOOFF 0
+#define TCOON 1
+#define TCIOFF 2
+#define TCION 3
+
+#define TCIFLUSH 0
+#define TCOFLUSH 1
+#define TCIOFLUSH 2
+
+#define TCSANOW 0
+#define TCSADRAIN 1
+#define TCSAFLUSH 2
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define EXTA 0000016
+#define EXTB 0000017
+#define CBAUD 0010017
+#define CBAUDEX 0010000
+#define CIBAUD 002003600000
+#define CMSPAR 010000000000
+#define CRTSCTS 020000000000
+
+#define XCASE 0000004
+#define ECHOCTL 0001000
+#define ECHOPRT 0002000
+#define ECHOKE 0004000
+#define FLUSHO 0020000
+#define PENDIN 0040000
+#define EXTPROC 0200000
+
+#define XTABS 0014000
+#define TIOCSER_TEMT 1
+#endif
diff --git a/libc-top-half/musl/arch/mipsn32/bits/user.h b/libc-top-half/musl/arch/mipsn32/bits/user.h
new file mode 100644
index 0000000..60fa1fd
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/bits/user.h
@@ -0,0 +1,15 @@
+struct user {
+ unsigned long regs[102];
+ unsigned long u_tsize, u_dsize, u_ssize;
+ unsigned long long start_code, start_data, start_stack;
+ long long signal;
+ unsigned long long *u_ar0;
+ unsigned long long magic;
+ char u_comm[32];
+};
+
+#define ELF_NGREG 45
+#define ELF_NFPREG 33
+
+typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG];
+typedef double elf_fpreg_t, elf_fpregset_t[ELF_NFPREG];
diff --git a/libc-top-half/musl/arch/mipsn32/crt_arch.h b/libc-top-half/musl/arch/mipsn32/crt_arch.h
new file mode 100644
index 0000000..eb5928c
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/crt_arch.h
@@ -0,0 +1,32 @@
+__asm__(
+".set push\n"
+".set noreorder\n"
+".text \n"
+".global _" START "\n"
+".global " START "\n"
+".global " START "_data\n"
+".type _" START ", @function\n"
+".type " START ", @function\n"
+".type " START "_data, @function\n"
+"_" START ":\n"
+"" START ":\n"
+" bal 1f \n"
+" move $fp, $0 \n"
+"" START "_data: \n"
+" .gpword " START "_data \n"
+" .gpword " START "_c \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+" .gpword _DYNAMIC \n"
+"1: lw $gp, 0($ra) \n"
+" subu $gp, $ra, $gp \n"
+" move $4, $sp \n"
+" lw $5, 8($ra) \n"
+" addu $5, $5, $gp \n"
+" lw $25, 4($ra) \n"
+" addu $25, $25, $gp \n"
+" and $sp, $sp, -8 \n"
+" jalr $25 \n"
+" subu $sp, $sp, 16 \n"
+".set pop \n"
+);
diff --git a/libc-top-half/musl/arch/mipsn32/ksigaction.h b/libc-top-half/musl/arch/mipsn32/ksigaction.h
new file mode 100644
index 0000000..b565f1f
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/ksigaction.h
@@ -0,0 +1,10 @@
+#include <features.h>
+
+struct k_sigaction {
+ unsigned flags;
+ void (*handler)(int);
+ unsigned long mask[4];
+ void (*restorer)();
+};
+
+hidden void __restore(), __restore_rt();
diff --git a/libc-top-half/musl/arch/mipsn32/kstat.h b/libc-top-half/musl/arch/mipsn32/kstat.h
new file mode 100644
index 0000000..3841559
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/kstat.h
@@ -0,0 +1,22 @@
+struct kstat {
+ unsigned st_dev;
+ long __pad1[3];
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ unsigned st_rdev;
+ long __pad2[3];
+ off_t st_size;
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ blksize_t st_blksize;
+ long __pad3;
+ blkcnt_t st_blocks;
+ long __pad4[14];
+};
diff --git a/libc-top-half/musl/arch/mipsn32/pthread_arch.h b/libc-top-half/musl/arch/mipsn32/pthread_arch.h
new file mode 100644
index 0000000..c45347a
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/pthread_arch.h
@@ -0,0 +1,19 @@
+static inline uintptr_t __get_tp()
+{
+#if __mips_isa_rev < 2
+ register uintptr_t tp __asm__("$3");
+ __asm__ (".word 0x7c03e83b" : "=r" (tp) );
+#else
+ uintptr_t tp;
+ __asm__ ("rdhwr %0, $29" : "=r" (tp) );
+#endif
+ return tp;
+}
+
+#define TLS_ABOVE_TP
+#define GAP_ABOVE_TP 0
+
+#define TP_OFFSET 0x7000
+#define DTP_OFFSET 0x8000
+
+#define MC_PC pc
diff --git a/libc-top-half/musl/arch/mipsn32/reloc.h b/libc-top-half/musl/arch/mipsn32/reloc.h
new file mode 100644
index 0000000..47c6e59
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/reloc.h
@@ -0,0 +1,50 @@
+#if __mips_isa_rev >= 6
+#define ISA_SUFFIX "r6"
+#else
+#define ISA_SUFFIX ""
+#endif
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define ENDIAN_SUFFIX "el"
+#else
+#define ENDIAN_SUFFIX ""
+#endif
+
+#ifdef __mips_soft_float
+#define FP_SUFFIX "-sf"
+#else
+#define FP_SUFFIX ""
+#endif
+
+#define LDSO_ARCH "mipsn32" ISA_SUFFIX ENDIAN_SUFFIX FP_SUFFIX
+
+#define TPOFF_K (-0x7000)
+
+#define REL_SYM_OR_REL R_MIPS_REL32
+#define REL_PLT R_MIPS_JUMP_SLOT
+#define REL_COPY R_MIPS_COPY
+#define REL_DTPMOD R_MIPS_TLS_DTPMOD32
+#define REL_DTPOFF R_MIPS_TLS_DTPREL32
+#define REL_TPOFF R_MIPS_TLS_TPREL32
+
+#define NEED_MIPS_GOT_RELOCS 1
+#define DT_DEBUG_INDIRECT DT_MIPS_RLD_MAP
+#define ARCH_SYM_REJECT_UND(s) (!((s)->st_other & STO_MIPS_PLT))
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "move $sp,%1 ; jr %0" : : "r"(pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+ ".hidden " #sym "\n" \
+ ".set push \n" \
+ ".set noreorder \n" \
+ " bal 1f \n" \
+ " nop \n" \
+ " .gpword . \n" \
+ " .gpword " #sym " \n" \
+ "1: lw %0, ($ra) \n" \
+ " subu %0, $ra, %0 \n" \
+ " lw $ra, 4($ra) \n" \
+ " addu %0, %0, $ra \n" \
+ ".set pop \n" \
+ : "=r"(*(fp)) : : "memory", "ra" )
diff --git a/libc-top-half/musl/arch/mipsn32/syscall_arch.h b/libc-top-half/musl/arch/mipsn32/syscall_arch.h
new file mode 100644
index 0000000..c681905
--- /dev/null
+++ b/libc-top-half/musl/arch/mipsn32/syscall_arch.h
@@ -0,0 +1,130 @@
+#define __SYSCALL_LL_E(x) (x)
+#define __SYSCALL_LL_O(x) (x)
+
+#define SYSCALL_RLIM_INFINITY (-1UL/2)
+
+#if __mips_isa_rev >= 6
+#define SYSCALL_CLOBBERLIST \
+ "$1", "$3", "$10", "$11", "$12", "$13", \
+ "$14", "$15", "$24", "$25", "memory"
+#else
+#define SYSCALL_CLOBBERLIST \
+ "$1", "$3", "$10", "$11", "$12", "$13", \
+ "$14", "$15", "$24", "$25", "hi", "lo", "memory"
+#endif
+
+static inline long __syscall0(long n)
+{
+ register long r7 __asm__("$7");
+ register long r2 __asm__("$2");
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "=r"(r7)
+ : "ir"(n), "0"(r2)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register long r4 __asm__("$4") = a;
+ register long r7 __asm__("$7");
+ register long r2 __asm__("$2");
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "=r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r7 __asm__("$7");
+ register long r2 __asm__("$2");
+
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "=r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r6 __asm__("$6") = c;
+ register long r7 __asm__("$7");
+ register long r2 __asm__("$2");
+
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "=r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5), "r"(r6)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r6 __asm__("$6") = c;
+ register long r7 __asm__("$7") = d;
+ register long r2 __asm__("$2");
+
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "+r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5), "r"(r6)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r6 __asm__("$6") = c;
+ register long r7 __asm__("$7") = d;
+ register long r8 __asm__("$8") = e;
+ register long r2 __asm__("$2");
+
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "+r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5), "r"(r6), "r"(r8)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register long r4 __asm__("$4") = a;
+ register long r5 __asm__("$5") = b;
+ register long r6 __asm__("$6") = c;
+ register long r7 __asm__("$7") = d;
+ register long r8 __asm__("$8") = e;
+ register long r9 __asm__("$9") = f;
+ register long r2 __asm__("$2");
+
+ __asm__ __volatile__ (
+ "daddu $2,$0,%2 ; syscall"
+ : "=&r"(r2), "+r"(r7)
+ : "ir"(n), "0"(r2), "r"(r4), "r"(r5), "r"(r6), "r"(r8), "r"(r9)
+ : SYSCALL_CLOBBERLIST);
+ return r7 && r2>0 ? -r2 : r2;
+}
+
+#define VDSO_USEFUL
+#define VDSO_CGT32_SYM "__vdso_clock_gettime"
+#define VDSO_CGT32_VER "LINUX_2.6"
+#define VDSO_CGT_SYM "__vdso_clock_gettime64"
+#define VDSO_CGT_VER "LINUX_2.6"
+
+#define SO_SNDTIMEO_OLD 0x1005
+#define SO_RCVTIMEO_OLD 0x1006
diff --git a/libc-top-half/musl/arch/or1k/arch.mak b/libc-top-half/musl/arch/or1k/arch.mak
new file mode 100644
index 0000000..aa4d05c
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/arch.mak
@@ -0,0 +1 @@
+COMPAT_SRC_DIRS = compat/time32
diff --git a/libc-top-half/musl/arch/or1k/atomic_arch.h b/libc-top-half/musl/arch/or1k/atomic_arch.h
new file mode 100644
index 0000000..11a5429
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/atomic_arch.h
@@ -0,0 +1,14 @@
+#define a_cas a_cas
+static inline int a_cas(volatile int *p, int t, int s)
+{
+ __asm__("1: l.lwa %0, %1\n"
+ " l.sfeq %0, %2\n"
+ " l.bnf 1f\n"
+ " l.nop\n"
+ " l.swa %1, %3\n"
+ " l.bnf 1b\n"
+ " l.nop\n"
+ "1: \n"
+ : "=&r"(t), "+m"(*p) : "r"(t), "r"(s) : "cc", "memory" );
+ return t;
+}
diff --git a/libc-top-half/musl/arch/or1k/bits/alltypes.h.in b/libc-top-half/musl/arch/or1k/bits/alltypes.h.in
new file mode 100644
index 0000000..7d3e291
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/alltypes.h.in
@@ -0,0 +1,16 @@
+#define _REDIR_TIME64 1
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+#define __BYTE_ORDER 4321
+#define __LONG_MAX 0x7fffffffL
+
+#ifndef __cplusplus
+TYPEDEF unsigned wchar_t;
+#endif
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/or1k/bits/float.h b/libc-top-half/musl/arch/or1k/bits/float.h
new file mode 100644
index 0000000..c4a655e
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 4.94065645841246544177e-324L
+#define LDBL_MIN 2.22507385850720138309e-308L
+#define LDBL_MAX 1.79769313486231570815e+308L
+#define LDBL_EPSILON 2.22044604925031308085e-16L
+
+#define LDBL_MANT_DIG 53
+#define LDBL_MIN_EXP (-1021)
+#define LDBL_MAX_EXP 1024
+
+#define LDBL_DIG 15
+#define LDBL_MIN_10_EXP (-307)
+#define LDBL_MAX_10_EXP 308
+
+#define DECIMAL_DIG 17
diff --git a/libc-top-half/musl/arch/or1k/bits/ipcstat.h b/libc-top-half/musl/arch/or1k/bits/ipcstat.h
new file mode 100644
index 0000000..4f4fcb0
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/ipcstat.h
@@ -0,0 +1 @@
+#define IPC_STAT 0x102
diff --git a/libc-top-half/musl/arch/or1k/bits/limits.h b/libc-top-half/musl/arch/or1k/bits/limits.h
new file mode 100644
index 0000000..fac47aa
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/limits.h
@@ -0,0 +1 @@
+#define PAGESIZE 8192
diff --git a/libc-top-half/musl/arch/or1k/bits/msg.h b/libc-top-half/musl/arch/or1k/bits/msg.h
new file mode 100644
index 0000000..7bbbb2b
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/msg.h
@@ -0,0 +1,18 @@
+struct msqid_ds {
+ struct ipc_perm msg_perm;
+ unsigned long __msg_stime_lo;
+ unsigned long __msg_stime_hi;
+ unsigned long __msg_rtime_lo;
+ unsigned long __msg_rtime_hi;
+ unsigned long __msg_ctime_lo;
+ unsigned long __msg_ctime_hi;
+ unsigned long msg_cbytes;
+ msgqnum_t msg_qnum;
+ msglen_t msg_qbytes;
+ pid_t msg_lspid;
+ pid_t msg_lrpid;
+ unsigned long __unused[2];
+ time_t msg_stime;
+ time_t msg_rtime;
+ time_t msg_ctime;
+};
diff --git a/libc-top-half/musl/arch/or1k/bits/posix.h b/libc-top-half/musl/arch/or1k/bits/posix.h
new file mode 100644
index 0000000..30a3871
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_ILP32_OFFBIG 1
+#define _POSIX_V7_ILP32_OFFBIG 1
diff --git a/libc-top-half/musl/arch/or1k/bits/reg.h b/libc-top-half/musl/arch/or1k/bits/reg.h
new file mode 100644
index 0000000..0c7bffc
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/reg.h
@@ -0,0 +1,3 @@
+#undef __WORDSIZE
+#define __WORDSIZE 32
+/* FIXME */
diff --git a/libc-top-half/musl/arch/or1k/bits/sem.h b/libc-top-half/musl/arch/or1k/bits/sem.h
new file mode 100644
index 0000000..d88338e
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/sem.h
@@ -0,0 +1,13 @@
+struct semid_ds {
+ struct ipc_perm sem_perm;
+ unsigned long __sem_otime_lo;
+ unsigned long __sem_otime_hi;
+ unsigned long __sem_ctime_lo;
+ unsigned long __sem_ctime_hi;
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+ unsigned short sem_nsems;
+ long __unused3;
+ long __unused4;
+ time_t sem_otime;
+ time_t sem_ctime;
+};
diff --git a/libc-top-half/musl/arch/or1k/bits/setjmp.h b/libc-top-half/musl/arch/or1k/bits/setjmp.h
new file mode 100644
index 0000000..bef7fe2
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long __jmp_buf[13];
diff --git a/libc-top-half/musl/arch/or1k/bits/shm.h b/libc-top-half/musl/arch/or1k/bits/shm.h
new file mode 100644
index 0000000..725fb46
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/shm.h
@@ -0,0 +1,31 @@
+#define SHMLBA 4096
+
+struct shmid_ds {
+ struct ipc_perm shm_perm;
+ size_t shm_segsz;
+ unsigned long __shm_atime_lo;
+ unsigned long __shm_atime_hi;
+ unsigned long __shm_dtime_lo;
+ unsigned long __shm_dtime_hi;
+ unsigned long __shm_ctime_lo;
+ unsigned long __shm_ctime_hi;
+ pid_t shm_cpid;
+ pid_t shm_lpid;
+ unsigned long shm_nattch;
+ unsigned long __pad1;
+ unsigned long __pad2;
+ unsigned long __pad3;
+ time_t shm_atime;
+ time_t shm_dtime;
+ time_t shm_ctime;
+};
+
+struct shminfo {
+ unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+};
+
+struct shm_info {
+ int __used_ids;
+ unsigned long shm_tot, shm_rss, shm_swp;
+ unsigned long __swap_attempts, __swap_successes;
+};
diff --git a/libc-top-half/musl/arch/or1k/bits/signal.h b/libc-top-half/musl/arch/or1k/bits/signal.h
new file mode 100644
index 0000000..be576d1
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/signal.h
@@ -0,0 +1,85 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef unsigned long greg_t, gregset_t[34];
+typedef struct sigcontext {
+ struct {
+ unsigned long gpr[32];
+ unsigned long pc;
+ unsigned long sr;
+ } regs;
+ unsigned long oldmask;
+} mcontext_t;
+#else
+typedef struct {
+ unsigned long __regs[35];
+} 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;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ sigset_t uc_sigmask;
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 2
+#define SA_SIGINFO 4
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL 29
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
diff --git a/libc-top-half/musl/arch/or1k/bits/stat.h b/libc-top-half/musl/arch/or1k/bits/stat.h
new file mode 100644
index 0000000..cde3fd0
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/stat.h
@@ -0,0 +1,25 @@
+/* copied from kernel definition, but with padding replaced
+ * by the corresponding correctly-sized userspace types. */
+
+struct stat {
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ long long __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ int __st_blksize_padding;
+ blkcnt_t st_blocks;
+ struct {
+ long tv_sec;
+ long tv_nsec;
+ } __st_atim32, __st_mtim32, __st_ctim32;
+ unsigned __unused[2];
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+};
diff --git a/libc-top-half/musl/arch/or1k/bits/stdint.h b/libc-top-half/musl/arch/or1k/bits/stdint.h
new file mode 100644
index 0000000..d1b2712
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#define SIZE_MAX UINT32_MAX
diff --git a/libc-top-half/musl/arch/or1k/bits/syscall.h.in b/libc-top-half/musl/arch/or1k/bits/syscall.h.in
new file mode 100644
index 0000000..2b5f205
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/syscall.h.in
@@ -0,0 +1,324 @@
+#define __NR_io_setup 0
+#define __NR_io_destroy 1
+#define __NR_io_submit 2
+#define __NR_io_cancel 3
+#define __NR_io_getevents 4
+#define __NR_setxattr 5
+#define __NR_lsetxattr 6
+#define __NR_fsetxattr 7
+#define __NR_getxattr 8
+#define __NR_lgetxattr 9
+#define __NR_fgetxattr 10
+#define __NR_listxattr 11
+#define __NR_llistxattr 12
+#define __NR_flistxattr 13
+#define __NR_removexattr 14
+#define __NR_lremovexattr 15
+#define __NR_fremovexattr 16
+#define __NR_getcwd 17
+#define __NR_lookup_dcookie 18
+#define __NR_eventfd2 19
+#define __NR_epoll_create1 20
+#define __NR_epoll_ctl 21
+#define __NR_epoll_pwait 22
+#define __NR_dup 23
+#define __NR_dup3 24
+#define __NR_fcntl64 25
+#define __NR_inotify_init1 26
+#define __NR_inotify_add_watch 27
+#define __NR_inotify_rm_watch 28
+#define __NR_ioctl 29
+#define __NR_ioprio_set 30
+#define __NR_ioprio_get 31
+#define __NR_flock 32
+#define __NR_mknodat 33
+#define __NR_mkdirat 34
+#define __NR_unlinkat 35
+#define __NR_symlinkat 36
+#define __NR_linkat 37
+#define __NR_renameat 38
+#define __NR_umount2 39
+#define __NR_mount 40
+#define __NR_pivot_root 41
+#define __NR_nfsservctl 42
+#define __NR_statfs64 43
+#define __NR_fstatfs64 44
+#define __NR_truncate64 45
+#define __NR_ftruncate64 46
+#define __NR_fallocate 47
+#define __NR_faccessat 48
+#define __NR_chdir 49
+#define __NR_fchdir 50
+#define __NR_chroot 51
+#define __NR_fchmod 52
+#define __NR_fchmodat 53
+#define __NR_fchownat 54
+#define __NR_fchown 55
+#define __NR_openat 56
+#define __NR_close 57
+#define __NR_vhangup 58
+#define __NR_pipe2 59
+#define __NR_quotactl 60
+#define __NR_getdents64 61
+#define __NR__llseek 62
+#define __NR_llseek 62
+#define __NR_read 63
+#define __NR_write 64
+#define __NR_readv 65
+#define __NR_writev 66
+#define __NR_pread64 67
+#define __NR_pwrite64 68
+#define __NR_preadv 69
+#define __NR_pwritev 70
+#define __NR_sendfile64 71
+#define __NR_pselect6 72
+#define __NR_ppoll 73
+#define __NR_signalfd4 74
+#define __NR_vmsplice 75
+#define __NR_splice 76
+#define __NR_tee 77
+#define __NR_readlinkat 78
+#define __NR_fstatat64 79
+#define __NR_fstat64 80
+#define __NR_sync 81
+#define __NR_fsync 82
+#define __NR_fdatasync 83
+#define __NR_sync_file_range 84
+#define __NR_timerfd_create 85
+#define __NR_timerfd_settime32 86
+#define __NR_timerfd_gettime32 87
+#define __NR_utimensat 88
+#define __NR_acct 89
+#define __NR_capget 90
+#define __NR_capset 91
+#define __NR_personality 92
+#define __NR_exit 93
+#define __NR_exit_group 94
+#define __NR_waitid 95
+#define __NR_set_tid_address 96
+#define __NR_unshare 97
+#define __NR_futex 98
+#define __NR_set_robust_list 99
+#define __NR_get_robust_list 100
+#define __NR_nanosleep 101
+#define __NR_getitimer 102
+#define __NR_setitimer 103
+#define __NR_kexec_load 104
+#define __NR_init_module 105
+#define __NR_delete_module 106
+#define __NR_timer_create 107
+#define __NR_timer_gettime32 108
+#define __NR_timer_getoverrun 109
+#define __NR_timer_settime32 110
+#define __NR_timer_delete 111
+#define __NR_clock_settime32 112
+#define __NR_clock_gettime32 113
+#define __NR_clock_getres_time32 114
+#define __NR_clock_nanosleep_time32 115
+#define __NR_syslog 116
+#define __NR_ptrace 117
+#define __NR_sched_setparam 118
+#define __NR_sched_setscheduler 119
+#define __NR_sched_getscheduler 120
+#define __NR_sched_getparam 121
+#define __NR_sched_setaffinity 122
+#define __NR_sched_getaffinity 123
+#define __NR_sched_yield 124
+#define __NR_sched_get_priority_max 125
+#define __NR_sched_get_priority_min 126
+#define __NR_sched_rr_get_interval 127
+#define __NR_restart_syscall 128
+#define __NR_kill 129
+#define __NR_tkill 130
+#define __NR_tgkill 131
+#define __NR_sigaltstack 132
+#define __NR_rt_sigsuspend 133
+#define __NR_rt_sigaction 134
+#define __NR_rt_sigprocmask 135
+#define __NR_rt_sigpending 136
+#define __NR_rt_sigtimedwait 137
+#define __NR_rt_sigqueueinfo 138
+#define __NR_rt_sigreturn 139
+#define __NR_setpriority 140
+#define __NR_getpriority 141
+#define __NR_reboot 142
+#define __NR_setregid 143
+#define __NR_setgid 144
+#define __NR_setreuid 145
+#define __NR_setuid 146
+#define __NR_setresuid 147
+#define __NR_getresuid 148
+#define __NR_setresgid 149
+#define __NR_getresgid 150
+#define __NR_setfsuid 151
+#define __NR_setfsgid 152
+#define __NR_times 153
+#define __NR_setpgid 154
+#define __NR_getpgid 155
+#define __NR_getsid 156
+#define __NR_setsid 157
+#define __NR_getgroups 158
+#define __NR_setgroups 159
+#define __NR_uname 160
+#define __NR_sethostname 161
+#define __NR_setdomainname 162
+#define __NR_getrlimit 163
+#define __NR_setrlimit 164
+#define __NR_getrusage 165
+#define __NR_umask 166
+#define __NR_prctl 167
+#define __NR_getcpu 168
+#define __NR_gettimeofday_time32 169
+#define __NR_settimeofday_time32 170
+#define __NR_adjtimex 171
+#define __NR_getpid 172
+#define __NR_getppid 173
+#define __NR_getuid 174
+#define __NR_geteuid 175
+#define __NR_getgid 176
+#define __NR_getegid 177
+#define __NR_gettid 178
+#define __NR_sysinfo 179
+#define __NR_mq_open 180
+#define __NR_mq_unlink 181
+#define __NR_mq_timedsend 182
+#define __NR_mq_timedreceive 183
+#define __NR_mq_notify 184
+#define __NR_mq_getsetattr 185
+#define __NR_msgget 186
+#define __NR_msgctl 187
+#define __NR_msgrcv 188
+#define __NR_msgsnd 189
+#define __NR_semget 190
+#define __NR_semctl 191
+#define __NR_semtimedop 192
+#define __NR_semop 193
+#define __NR_shmget 194
+#define __NR_shmctl 195
+#define __NR_shmat 196
+#define __NR_shmdt 197
+#define __NR_socket 198
+#define __NR_socketpair 199
+#define __NR_bind 200
+#define __NR_listen 201
+#define __NR_accept 202
+#define __NR_connect 203
+#define __NR_getsockname 204
+#define __NR_getpeername 205
+#define __NR_sendto 206
+#define __NR_recvfrom 207
+#define __NR_setsockopt 208
+#define __NR_getsockopt 209
+#define __NR_shutdown 210
+#define __NR_sendmsg 211
+#define __NR_recvmsg 212
+#define __NR_readahead 213
+#define __NR_brk 214
+#define __NR_munmap 215
+#define __NR_mremap 216
+#define __NR_add_key 217
+#define __NR_request_key 218
+#define __NR_keyctl 219
+#define __NR_clone 220
+#define __NR_execve 221
+#define __NR_mmap2 222
+#define __NR_fadvise64_64 223
+#define __NR_swapon 224
+#define __NR_swapoff 225
+#define __NR_mprotect 226
+#define __NR_msync 227
+#define __NR_mlock 228
+#define __NR_munlock 229
+#define __NR_mlockall 230
+#define __NR_munlockall 231
+#define __NR_mincore 232
+#define __NR_madvise 233
+#define __NR_remap_file_pages 234
+#define __NR_mbind 235
+#define __NR_get_mempolicy 236
+#define __NR_set_mempolicy 237
+#define __NR_migrate_pages 238
+#define __NR_move_pages 239
+#define __NR_rt_tgsigqueueinfo 240
+#define __NR_perf_event_open 241
+#define __NR_accept4 242
+#define __NR_recvmmsg 243
+#define __NR_or1k_atomic 244
+#define __NR_wait4 260
+#define __NR_prlimit64 261
+#define __NR_fanotify_init 262
+#define __NR_fanotify_mark 263
+#define __NR_name_to_handle_at 264
+#define __NR_open_by_handle_at 265
+#define __NR_clock_adjtime 266
+#define __NR_syncfs 267
+#define __NR_setns 268
+#define __NR_sendmmsg 269
+#define __NR_process_vm_readv 270
+#define __NR_process_vm_writev 271
+#define __NR_kcmp 272
+#define __NR_finit_module 273
+#define __NR_sched_setattr 274
+#define __NR_sched_getattr 275
+#define __NR_renameat2 276
+#define __NR_seccomp 277
+#define __NR_getrandom 278
+#define __NR_memfd_create 279
+#define __NR_bpf 280
+#define __NR_execveat 281
+#define __NR_userfaultfd 282
+#define __NR_membarrier 283
+#define __NR_mlock2 284
+#define __NR_copy_file_range 285
+#define __NR_preadv2 286
+#define __NR_pwritev2 287
+#define __NR_pkey_mprotect 288
+#define __NR_pkey_alloc 289
+#define __NR_pkey_free 290
+#define __NR_statx 291
+#define __NR_io_pgetevents 292
+#define __NR_rseq 293
+#define __NR_kexec_file_load 294
+#define __NR_clock_gettime64 403
+#define __NR_clock_settime64 404
+#define __NR_clock_adjtime64 405
+#define __NR_clock_getres_time64 406
+#define __NR_clock_nanosleep_time64 407
+#define __NR_timer_gettime64 408
+#define __NR_timer_settime64 409
+#define __NR_timerfd_gettime64 410
+#define __NR_timerfd_settime64 411
+#define __NR_utimensat_time64 412
+#define __NR_pselect6_time64 413
+#define __NR_ppoll_time64 414
+#define __NR_io_pgetevents_time64 416
+#define __NR_recvmmsg_time64 417
+#define __NR_mq_timedsend_time64 418
+#define __NR_mq_timedreceive_time64 419
+#define __NR_semtimedop_time64 420
+#define __NR_rt_sigtimedwait_time64 421
+#define __NR_futex_time64 422
+#define __NR_sched_rr_get_interval_time64 423
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_clone3 435
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_epoll_pwait2 441
+#define __NR_mount_setattr 442
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_restrict_self 446
+
diff --git a/libc-top-half/musl/arch/or1k/bits/user.h b/libc-top-half/musl/arch/or1k/bits/user.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/bits/user.h
diff --git a/libc-top-half/musl/arch/or1k/crt_arch.h b/libc-top-half/musl/arch/or1k/crt_arch.h
new file mode 100644
index 0000000..9e310ca
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/crt_arch.h
@@ -0,0 +1,18 @@
+__asm__(
+".text \n"
+".global " START " \n"
+".align 4 \n"
+START ": \n"
+" l.jal 1f \n"
+" l.ori r3, r1, 0 \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+" .word _DYNAMIC-. \n"
+"1: l.lwz r4, 0(r9) \n"
+" l.add r4, r4, r9 \n"
+" l.addi r2, r0, -8 \n"
+" l.and r1, r1, r2 \n"
+" l.addi r1, r1, -16 \n"
+" l.jal " START "_c \n"
+" l.ori r2, r0, 0 \n"
+);
diff --git a/libc-top-half/musl/arch/or1k/kstat.h b/libc-top-half/musl/arch/or1k/kstat.h
new file mode 100644
index 0000000..c144957
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/kstat.h
@@ -0,0 +1,21 @@
+struct kstat {
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ long long __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ int __st_blksize_padding;
+ blkcnt_t st_blocks;
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ unsigned __unused[2];
+};
diff --git a/libc-top-half/musl/arch/or1k/pthread_arch.h b/libc-top-half/musl/arch/or1k/pthread_arch.h
new file mode 100644
index 0000000..f75ea7e
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/pthread_arch.h
@@ -0,0 +1,16 @@
+static inline uintptr_t __get_tp()
+{
+#ifdef __clang__
+ uintptr_t tp;
+ __asm__ ("l.ori %0, r10, 0" : "=r" (tp) );
+#else
+ register uintptr_t tp __asm__("r10");
+ __asm__ ("" : "=r" (tp) );
+#endif
+ return tp;
+}
+
+#define TLS_ABOVE_TP
+#define GAP_ABOVE_TP 0
+
+#define MC_PC regs.pc
diff --git a/libc-top-half/musl/arch/or1k/reloc.h b/libc-top-half/musl/arch/or1k/reloc.h
new file mode 100644
index 0000000..128089c
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/reloc.h
@@ -0,0 +1,24 @@
+#define LDSO_ARCH "or1k"
+
+#define TPOFF_K 0
+
+#define REL_SYMBOLIC R_OR1K_32
+#define REL_GOT R_OR1K_GLOB_DAT
+#define REL_PLT R_OR1K_JMP_SLOT
+#define REL_RELATIVE R_OR1K_RELATIVE
+#define REL_COPY R_OR1K_COPY
+#define REL_DTPMOD R_OR1K_TLS_DTPMOD
+#define REL_DTPOFF R_OR1K_TLS_DTPOFF
+#define REL_TPOFF R_OR1K_TLS_TPOFF
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "l.jr %0 ; l.ori r1,%1,0" : : "r"(pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+ ".hidden " #sym " \n" \
+ " l.jal 1f \n" \
+ " l.nop \n" \
+ " .word " #sym "-. \n" \
+ "1: l.lwz %0, 0(r9) \n" \
+ " l.add %0, %0, r9 \n" \
+ : "=r"(*(fp)) : : "memory", "r9" )
diff --git a/libc-top-half/musl/arch/or1k/syscall_arch.h b/libc-top-half/musl/arch/or1k/syscall_arch.h
new file mode 100644
index 0000000..21738ce
--- /dev/null
+++ b/libc-top-half/musl/arch/or1k/syscall_arch.h
@@ -0,0 +1,115 @@
+#define __SYSCALL_LL_E(x) \
+((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
+((union { long long ll; long l[2]; }){ .ll = x }).l[1]
+#define __SYSCALL_LL_O(x) __SYSCALL_LL_E((x))
+
+#define SYSCALL_MMAP2_UNIT 8192ULL
+
+static __inline long __syscall0(long n)
+{
+ register unsigned long r11 __asm__("r11") = n;
+ __asm__ __volatile__ ("l.sys 1"
+ : "=r"(r11)
+ : "r"(r11)
+ : "memory", "r3", "r4", "r5", "r6", "r7", "r8",
+ "r12", "r13", "r15", "r17", "r19", "r21",
+ "r23", "r25", "r27", "r29", "r31");
+ return r11;
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register unsigned long r11 __asm__("r11") = n;
+ register unsigned long r3 __asm__("r3") = a;
+ __asm__ __volatile__ ("l.sys 1"
+ : "=r"(r11)
+ : "r"(r11), "r"(r3)
+ : "memory", "r4", "r5", "r6", "r7", "r8",
+ "r12", "r13", "r15", "r17", "r19", "r21",
+ "r23", "r25", "r27", "r29", "r31");
+ return r11;
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register unsigned long r11 __asm__("r11") = n;
+ register unsigned long r3 __asm__("r3") = a;
+ register unsigned long r4 __asm__("r4") = b;
+ __asm__ __volatile__ ("l.sys 1"
+ : "=r"(r11)
+ : "r"(r11), "r"(r3), "r"(r4)
+ : "memory", "r5", "r6", "r7", "r8",
+ "r12", "r13", "r15", "r17", "r19", "r21",
+ "r23", "r25", "r27", "r29", "r31");
+ return r11;
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register unsigned long r11 __asm__("r11") = n;
+ register unsigned long r3 __asm__("r3") = a;
+ register unsigned long r4 __asm__("r4") = b;
+ register unsigned long r5 __asm__("r5") = c;
+ __asm__ __volatile__ ("l.sys 1"
+ : "=r"(r11)
+ : "r"(r11), "r"(r3), "r"(r4), "r"(r5)
+ : "memory", "r6", "r7", "r8",
+ "r12", "r13", "r15", "r17", "r19", "r21",
+ "r23", "r25", "r27", "r29", "r31");
+ return r11;
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register unsigned long r11 __asm__("r11") = n;
+ register unsigned long r3 __asm__("r3") = a;
+ register unsigned long r4 __asm__("r4") = b;
+ register unsigned long r5 __asm__("r5") = c;
+ register unsigned long r6 __asm__("r6") = d;
+ __asm__ __volatile__ ("l.sys 1"
+ : "=r"(r11)
+ : "r"(r11), "r"(r3), "r"(r4), "r"(r5), "r"(r6)
+ : "memory", "r7", "r8",
+ "r12", "r13", "r15", "r17", "r19", "r21",
+ "r23", "r25", "r27", "r29", "r31");
+ return r11;
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register unsigned long r11 __asm__("r11") = n;
+ register unsigned long r3 __asm__("r3") = a;
+ register unsigned long r4 __asm__("r4") = b;
+ register unsigned long r5 __asm__("r5") = c;
+ register unsigned long r6 __asm__("r6") = d;
+ register unsigned long r7 __asm__("r7") = e;
+ __asm__ __volatile__ ("l.sys 1"
+ : "=r"(r11)
+ : "r"(r11), "r"(r3), "r"(r4), "r"(r5), "r"(r6),
+ "r"(r7)
+ : "memory", "r8",
+ "r12", "r13", "r15", "r17", "r19", "r21",
+ "r23", "r25", "r27", "r29", "r31");
+ return r11;
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register unsigned long r11 __asm__("r11") = n;
+ register unsigned long r3 __asm__("r3") = a;
+ register unsigned long r4 __asm__("r4") = b;
+ register unsigned long r5 __asm__("r5") = c;
+ register unsigned long r6 __asm__("r6") = d;
+ register unsigned long r7 __asm__("r7") = e;
+ register unsigned long r8 __asm__("r8") = f;
+ __asm__ __volatile__ ("l.sys 1"
+ : "=r"(r11)
+ : "r"(r11), "r"(r3), "r"(r4), "r"(r5), "r"(r6),
+ "r"(r7), "r"(r8)
+ : "memory",
+ "r12", "r13", "r15", "r17", "r19", "r21",
+ "r23", "r25", "r27", "r29", "r31");
+ return r11;
+}
+
+#define IPC_64 0
diff --git a/libc-top-half/musl/arch/powerpc/arch.mak b/libc-top-half/musl/arch/powerpc/arch.mak
new file mode 100644
index 0000000..aa4d05c
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/arch.mak
@@ -0,0 +1 @@
+COMPAT_SRC_DIRS = compat/time32
diff --git a/libc-top-half/musl/arch/powerpc/atomic_arch.h b/libc-top-half/musl/arch/powerpc/atomic_arch.h
new file mode 100644
index 0000000..c267391
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/atomic_arch.h
@@ -0,0 +1,38 @@
+#define a_ll a_ll
+static inline int a_ll(volatile int *p)
+{
+ int v;
+ __asm__ __volatile__ ("lwarx %0, 0, %2" : "=r"(v) : "m"(*p), "r"(p));
+ return v;
+}
+
+#define a_sc a_sc
+static inline int a_sc(volatile int *p, int v)
+{
+ int r;
+ __asm__ __volatile__ (
+ "stwcx. %2, 0, %3 ; mfcr %0"
+ : "=r"(r), "=m"(*p) : "r"(v), "r"(p) : "memory", "cc");
+ return r & 0x20000000; /* "bit 2" of "cr0" (backwards bit order) */
+}
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ __asm__ __volatile__ ("sync" : : : "memory");
+}
+
+#define a_pre_llsc a_barrier
+
+#define a_post_llsc a_post_llsc
+static inline void a_post_llsc()
+{
+ __asm__ __volatile__ ("isync" : : : "memory");
+}
+
+#define a_clz_32 a_clz_32
+static inline int a_clz_32(uint32_t x)
+{
+ __asm__ ("cntlzw %0, %1" : "=r"(x) : "r"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/arch/powerpc/bits/alltypes.h.in b/libc-top-half/musl/arch/powerpc/bits/alltypes.h.in
new file mode 100644
index 0000000..b48df6a
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/alltypes.h.in
@@ -0,0 +1,20 @@
+#define _REDIR_TIME64 1
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+#define __BYTE_ORDER 4321
+#define __LONG_MAX 0x7fffffffL
+
+#ifndef __cplusplus
+#ifdef __WCHAR_TYPE__
+TYPEDEF __WCHAR_TYPE__ wchar_t;
+#else
+TYPEDEF long wchar_t;
+#endif
+#endif
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/powerpc/bits/errno.h b/libc-top-half/musl/arch/powerpc/bits/errno.h
new file mode 100644
index 0000000..cae3f38
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/errno.h
@@ -0,0 +1,134 @@
+#define EPERM 1
+#define ENOENT 2
+#define ESRCH 3
+#define EINTR 4
+#define EIO 5
+#define ENXIO 6
+#define E2BIG 7
+#define ENOEXEC 8
+#define EBADF 9
+#define ECHILD 10
+#define EAGAIN 11
+#define ENOMEM 12
+#define EACCES 13
+#define EFAULT 14
+#define ENOTBLK 15
+#define EBUSY 16
+#define EEXIST 17
+#define EXDEV 18
+#define ENODEV 19
+#define ENOTDIR 20
+#define EISDIR 21
+#define EINVAL 22
+#define ENFILE 23
+#define EMFILE 24
+#define ENOTTY 25
+#define ETXTBSY 26
+#define EFBIG 27
+#define ENOSPC 28
+#define ESPIPE 29
+#define EROFS 30
+#define EMLINK 31
+#define EPIPE 32
+#define EDOM 33
+#define ERANGE 34
+#define EDEADLK 35
+#define ENAMETOOLONG 36
+#define ENOLCK 37
+#define ENOSYS 38
+#define ENOTEMPTY 39
+#define ELOOP 40
+#define EWOULDBLOCK EAGAIN
+#define ENOMSG 42
+#define EIDRM 43
+#define ECHRNG 44
+#define EL2NSYNC 45
+#define EL3HLT 46
+#define EL3RST 47
+#define ELNRNG 48
+#define EUNATCH 49
+#define ENOCSI 50
+#define EL2HLT 51
+#define EBADE 52
+#define EBADR 53
+#define EXFULL 54
+#define ENOANO 55
+#define EBADRQC 56
+#define EBADSLT 57
+#define EDEADLOCK 58
+#define EBFONT 59
+#define ENOSTR 60
+#define ENODATA 61
+#define ETIME 62
+#define ENOSR 63
+#define ENONET 64
+#define ENOPKG 65
+#define EREMOTE 66
+#define ENOLINK 67
+#define EADV 68
+#define ESRMNT 69
+#define ECOMM 70
+#define EPROTO 71
+#define EMULTIHOP 72
+#define EDOTDOT 73
+#define EBADMSG 74
+#define EOVERFLOW 75
+#define ENOTUNIQ 76
+#define EBADFD 77
+#define EREMCHG 78
+#define ELIBACC 79
+#define ELIBBAD 80
+#define ELIBSCN 81
+#define ELIBMAX 82
+#define ELIBEXEC 83
+#define EILSEQ 84
+#define ERESTART 85
+#define ESTRPIPE 86
+#define EUSERS 87
+#define ENOTSOCK 88
+#define EDESTADDRREQ 89
+#define EMSGSIZE 90
+#define EPROTOTYPE 91
+#define ENOPROTOOPT 92
+#define EPROTONOSUPPORT 93
+#define ESOCKTNOSUPPORT 94
+#define EOPNOTSUPP 95
+#define ENOTSUP EOPNOTSUPP
+#define EPFNOSUPPORT 96
+#define EAFNOSUPPORT 97
+#define EADDRINUSE 98
+#define EADDRNOTAVAIL 99
+#define ENETDOWN 100
+#define ENETUNREACH 101
+#define ENETRESET 102
+#define ECONNABORTED 103
+#define ECONNRESET 104
+#define ENOBUFS 105
+#define EISCONN 106
+#define ENOTCONN 107
+#define ESHUTDOWN 108
+#define ETOOMANYREFS 109
+#define ETIMEDOUT 110
+#define ECONNREFUSED 111
+#define EHOSTDOWN 112
+#define EHOSTUNREACH 113
+#define EALREADY 114
+#define EINPROGRESS 115
+#define ESTALE 116
+#define EUCLEAN 117
+#define ENOTNAM 118
+#define ENAVAIL 119
+#define EISNAM 120
+#define EREMOTEIO 121
+#define EDQUOT 122
+#define ENOMEDIUM 123
+#define EMEDIUMTYPE 124
+#define ECANCELED 125
+#define ENOKEY 126
+#define EKEYEXPIRED 127
+#define EKEYREVOKED 128
+#define EKEYREJECTED 129
+#define EOWNERDEAD 130
+#define ENOTRECOVERABLE 131
+#define ERFKILL 132
+#define EHWPOISON 133
diff --git a/libc-top-half/musl/arch/powerpc/bits/fcntl.h b/libc-top-half/musl/arch/powerpc/bits/fcntl.h
new file mode 100644
index 0000000..c3f875e
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/fcntl.h
@@ -0,0 +1,40 @@
+#define O_CREAT 0100
+#define O_EXCL 0200
+#define O_NOCTTY 0400
+#define O_TRUNC 01000
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_DSYNC 010000
+#define O_SYNC 04010000
+#define O_RSYNC 04010000
+#define O_DIRECTORY 040000
+#define O_NOFOLLOW 0100000
+#define O_CLOEXEC 02000000
+
+#define O_ASYNC 020000
+#define O_DIRECT 0400000
+#define O_LARGEFILE 0200000
+#define O_NOATIME 01000000
+#define O_PATH 010000000
+#define O_TMPFILE 020040000
+#define O_NDELAY O_NONBLOCK
+
+#define F_DUPFD 0
+#define F_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+
+#define F_SETOWN 8
+#define F_GETOWN 9
+#define F_SETSIG 10
+#define F_GETSIG 11
+
+#define F_GETLK 12
+#define F_SETLK 13
+#define F_SETLKW 14
+
+#define F_SETOWN_EX 15
+#define F_GETOWN_EX 16
+
+#define F_GETOWNER_UIDS 17
diff --git a/libc-top-half/musl/arch/powerpc/bits/fenv.h b/libc-top-half/musl/arch/powerpc/bits/fenv.h
new file mode 100644
index 0000000..5b15c69
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/fenv.h
@@ -0,0 +1,36 @@
+#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
+#define FE_ALL_EXCEPT 0
+#define FE_TONEAREST 0
+#else
+#define FE_TONEAREST 0
+#define FE_TOWARDZERO 1
+#define FE_UPWARD 2
+#define FE_DOWNWARD 3
+
+#define FE_INEXACT 0x02000000
+#define FE_DIVBYZERO 0x04000000
+#define FE_UNDERFLOW 0x08000000
+#define FE_OVERFLOW 0x10000000
+#define FE_INVALID 0x20000000
+
+#define FE_ALL_EXCEPT 0x3e000000
+
+#ifdef _GNU_SOURCE
+#define FE_INVALID_SNAN 0x01000000
+#define FE_INVALID_ISI 0x00800000
+#define FE_INVALID_IDI 0x00400000
+#define FE_INVALID_ZDZ 0x00200000
+#define FE_INVALID_IMZ 0x00100000
+#define FE_INVALID_COMPARE 0x00080000
+#define FE_INVALID_SOFTWARE 0x00000400
+#define FE_INVALID_SQRT 0x00000200
+#define FE_INVALID_INTEGER_CONVERSION 0x00000100
+
+#define FE_ALL_INVALID 0x01f80700
+#endif
+#endif
+
+typedef unsigned fexcept_t;
+typedef double fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *)-1)
diff --git a/libc-top-half/musl/arch/powerpc/bits/float.h b/libc-top-half/musl/arch/powerpc/bits/float.h
new file mode 100644
index 0000000..c4a655e
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 4.94065645841246544177e-324L
+#define LDBL_MIN 2.22507385850720138309e-308L
+#define LDBL_MAX 1.79769313486231570815e+308L
+#define LDBL_EPSILON 2.22044604925031308085e-16L
+
+#define LDBL_MANT_DIG 53
+#define LDBL_MIN_EXP (-1021)
+#define LDBL_MAX_EXP 1024
+
+#define LDBL_DIG 15
+#define LDBL_MIN_10_EXP (-307)
+#define LDBL_MAX_10_EXP 308
+
+#define DECIMAL_DIG 17
diff --git a/libc-top-half/musl/arch/powerpc/bits/hwcap.h b/libc-top-half/musl/arch/powerpc/bits/hwcap.h
new file mode 100644
index 0000000..803de9b
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/hwcap.h
@@ -0,0 +1,43 @@
+#define PPC_FEATURE_32 0x80000000
+#define PPC_FEATURE_64 0x40000000
+#define PPC_FEATURE_601_INSTR 0x20000000
+#define PPC_FEATURE_HAS_ALTIVEC 0x10000000
+#define PPC_FEATURE_HAS_FPU 0x08000000
+#define PPC_FEATURE_HAS_MMU 0x04000000
+#define PPC_FEATURE_HAS_4xxMAC 0x02000000
+#define PPC_FEATURE_UNIFIED_CACHE 0x01000000
+#define PPC_FEATURE_HAS_SPE 0x00800000
+#define PPC_FEATURE_HAS_EFP_SINGLE 0x00400000
+#define PPC_FEATURE_HAS_EFP_DOUBLE 0x00200000
+#define PPC_FEATURE_NO_TB 0x00100000
+#define PPC_FEATURE_POWER4 0x00080000
+#define PPC_FEATURE_POWER5 0x00040000
+#define PPC_FEATURE_POWER5_PLUS 0x00020000
+#define PPC_FEATURE_CELL 0x00010000
+#define PPC_FEATURE_BOOKE 0x00008000
+#define PPC_FEATURE_SMT 0x00004000
+#define PPC_FEATURE_ICACHE_SNOOP 0x00002000
+#define PPC_FEATURE_ARCH_2_05 0x00001000
+#define PPC_FEATURE_PA6T 0x00000800
+#define PPC_FEATURE_HAS_DFP 0x00000400
+#define PPC_FEATURE_POWER6_EXT 0x00000200
+#define PPC_FEATURE_ARCH_2_06 0x00000100
+#define PPC_FEATURE_HAS_VSX 0x00000080
+#define PPC_FEATURE_PSERIES_PERFMON_COMPAT 0x00000040
+
+#define PPC_FEATURE_TRUE_LE 0x00000002
+#define PPC_FEATURE_PPC_LE 0x00000001
+
+#define PPC_FEATURE2_ARCH_2_07 0x80000000
+#define PPC_FEATURE2_HTM 0x40000000
+#define PPC_FEATURE2_DSCR 0x20000000
+#define PPC_FEATURE2_EBB 0x10000000
+#define PPC_FEATURE2_ISEL 0x08000000
+#define PPC_FEATURE2_TAR 0x04000000
+#define PPC_FEATURE2_VEC_CRYPTO 0x02000000
+#define PPC_FEATURE2_HTM_NOSC 0x01000000
+#define PPC_FEATURE2_ARCH_3_00 0x00800000
+#define PPC_FEATURE2_HAS_IEEE128 0x00400000
+#define PPC_FEATURE2_DARN 0x00200000
+#define PPC_FEATURE2_SCV 0x00100000
+#define PPC_FEATURE2_HTM_NO_SUSPEND 0x00080000
diff --git a/libc-top-half/musl/arch/powerpc/bits/ioctl.h b/libc-top-half/musl/arch/powerpc/bits/ioctl.h
new file mode 100644
index 0000000..ac9bfd2
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/ioctl.h
@@ -0,0 +1,120 @@
+#define _IOC(a,b,c,d) ( ((a)<<29) | ((b)<<8) | (c) | ((d)<<16) )
+#define _IOC_NONE 1U
+#define _IOC_WRITE 4U
+#define _IOC_READ 2U
+
+#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0)
+#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c))
+#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c))
+#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c))
+
+#define FIONCLEX _IO('f', 2)
+#define FIOCLEX _IO('f', 1)
+#define FIOASYNC _IOW('f', 125, int)
+#define FIONBIO _IOW('f', 126, int)
+#define FIONREAD _IOR('f', 127, int)
+#define TIOCINQ FIONREAD
+#define FIOQSIZE _IOR('f', 128, char[8])
+#define TIOCGETP _IOR('t', 8, char[6])
+#define TIOCSETP _IOW('t', 9, char[6])
+#define TIOCSETN _IOW('t', 10, char[6])
+
+#define TIOCSETC _IOW('t', 17, char[6])
+#define TIOCGETC _IOR('t', 18, char[6])
+#define TCGETS _IOR('t', 19, char[44])
+#define TCSETS _IOW('t', 20, char[44])
+#define TCSETSW _IOW('t', 21, char[44])
+#define TCSETSF _IOW('t', 22, char[44])
+
+#define TCGETA _IOR('t', 23, char[20])
+#define TCSETA _IOW('t', 24, char[20])
+#define TCSETAW _IOW('t', 25, char[20])
+#define TCSETAF _IOW('t', 28, char[20])
+
+#define TCSBRK _IO('t', 29)
+#define TCXONC _IO('t', 30)
+#define TCFLSH _IO('t', 31)
+
+#define TIOCSWINSZ _IOW('t', 103, char[8])
+#define TIOCGWINSZ _IOR('t', 104, char[8])
+#define TIOCSTART _IO('t', 110)
+#define TIOCSTOP _IO('t', 111)
+
+#define TIOCOUTQ _IOR('t', 115, int)
+
+#define TIOCGLTC _IOR('t', 116, char[6])
+#define TIOCSLTC _IOW('t', 117, char[6])
+#define TIOCSPGRP _IOW('t', 118, int)
+#define TIOCGPGRP _IOR('t', 119, int)
+
+#define TIOCEXCL 0x540C
+#define TIOCNXCL 0x540D
+#define TIOCSCTTY 0x540E
+
+#define TIOCSTI 0x5412
+#define TIOCMGET 0x5415
+#define TIOCMBIS 0x5416
+#define TIOCMBIC 0x5417
+#define TIOCMSET 0x5418
+#define TIOCM_LE 0x001
+#define TIOCM_DTR 0x002
+#define TIOCM_RTS 0x004
+#define TIOCM_ST 0x008
+#define TIOCM_SR 0x010
+#define TIOCM_CTS 0x020
+#define TIOCM_CAR 0x040
+#define TIOCM_RNG 0x080
+#define TIOCM_DSR 0x100
+#define TIOCM_CD TIOCM_CAR
+#define TIOCM_RI TIOCM_RNG
+#define TIOCM_OUT1 0x2000
+#define TIOCM_OUT2 0x4000
+#define TIOCM_LOOP 0x8000
+
+#define TIOCGSOFTCAR 0x5419
+#define TIOCSSOFTCAR 0x541A
+#define TIOCLINUX 0x541C
+#define TIOCCONS 0x541D
+#define TIOCGSERIAL 0x541E
+#define TIOCSSERIAL 0x541F
+#define TIOCPKT 0x5420
+
+#define TIOCNOTTY 0x5422
+#define TIOCSETD 0x5423
+#define TIOCGETD 0x5424
+#define TCSBRKP 0x5425
+#define TIOCSBRK 0x5427
+#define TIOCCBRK 0x5428
+#define TIOCGSID 0x5429
+#define TIOCGRS485 0x542e
+#define TIOCSRS485 0x542f
+#define TIOCGPTN _IOR('T',0x30, unsigned int)
+#define TIOCSPTLCK _IOW('T',0x31, int)
+#define TIOCGDEV _IOR('T',0x32, unsigned int)
+#define TIOCSIG _IOW('T',0x36, int)
+#define TIOCVHANGUP 0x5437
+#define TIOCGPKT _IOR('T', 0x38, int)
+#define TIOCGPTLCK _IOR('T', 0x39, int)
+#define TIOCGEXCL _IOR('T', 0x40, int)
+#define TIOCGPTPEER _IO('T', 0x41)
+
+#define TIOCSERCONFIG 0x5453
+#define TIOCSERGWILD 0x5454
+#define TIOCSERSWILD 0x5455
+#define TIOCGLCKTRMIOS 0x5456
+#define TIOCSLCKTRMIOS 0x5457
+#define TIOCSERGSTRUCT 0x5458
+#define TIOCSERGETLSR 0x5459
+#define TIOCSERGETMULTI 0x545A
+#define TIOCSERSETMULTI 0x545B
+
+#define TIOCMIWAIT 0x545C
+#define TIOCGICOUNT 0x545D
+
+#define FIOSETOWN 0x8901
+#define SIOCSPGRP 0x8902
+#define FIOGETOWN 0x8903
+#define SIOCGPGRP 0x8904
+#define SIOCATMARK 0x8905
+#define SIOCGSTAMP _IOR(0x89, 6, char[16])
+#define SIOCGSTAMPNS _IOR(0x89, 7, char[16])
diff --git a/libc-top-half/musl/arch/powerpc/bits/ipc.h b/libc-top-half/musl/arch/powerpc/bits/ipc.h
new file mode 100644
index 0000000..a388d56
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/ipc.h
@@ -0,0 +1,12 @@
+struct ipc_perm {
+ key_t __ipc_perm_key;
+ uid_t uid;
+ gid_t gid;
+ uid_t cuid;
+ gid_t cgid;
+ mode_t mode;
+ int __ipc_perm_seq;
+ int __pad1;
+ long long __pad2;
+ long long __pad3;
+};
diff --git a/libc-top-half/musl/arch/powerpc/bits/ipcstat.h b/libc-top-half/musl/arch/powerpc/bits/ipcstat.h
new file mode 100644
index 0000000..4f4fcb0
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/ipcstat.h
@@ -0,0 +1 @@
+#define IPC_STAT 0x102
diff --git a/libc-top-half/musl/arch/powerpc/bits/mman.h b/libc-top-half/musl/arch/powerpc/bits/mman.h
new file mode 100644
index 0000000..95ec435
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/mman.h
@@ -0,0 +1,13 @@
+#define PROT_SAO 0x10
+
+#undef MAP_NORESERVE
+#define MAP_NORESERVE 0x40
+#undef MAP_LOCKED
+#define MAP_LOCKED 0x80
+
+#undef MCL_CURRENT
+#define MCL_CURRENT 0x2000
+#undef MCL_FUTURE
+#define MCL_FUTURE 0x4000
+#undef MCL_ONFAULT
+#define MCL_ONFAULT 0x8000
diff --git a/libc-top-half/musl/arch/powerpc/bits/msg.h b/libc-top-half/musl/arch/powerpc/bits/msg.h
new file mode 100644
index 0000000..9fb15dc
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/msg.h
@@ -0,0 +1,18 @@
+struct msqid_ds {
+ struct ipc_perm msg_perm;
+ unsigned long __msg_stime_hi;
+ unsigned long __msg_stime_lo;
+ unsigned long __msg_rtime_hi;
+ unsigned long __msg_rtime_lo;
+ unsigned long __msg_ctime_hi;
+ unsigned long __msg_ctime_lo;
+ unsigned long msg_cbytes;
+ msgqnum_t msg_qnum;
+ msglen_t msg_qbytes;
+ pid_t msg_lspid;
+ pid_t msg_lrpid;
+ unsigned long __unused[2];
+ time_t msg_stime;
+ time_t msg_rtime;
+ time_t msg_ctime;
+};
diff --git a/libc-top-half/musl/arch/powerpc/bits/posix.h b/libc-top-half/musl/arch/powerpc/bits/posix.h
new file mode 100644
index 0000000..30a3871
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_ILP32_OFFBIG 1
+#define _POSIX_V7_ILP32_OFFBIG 1
diff --git a/libc-top-half/musl/arch/powerpc/bits/ptrace.h b/libc-top-half/musl/arch/powerpc/bits/ptrace.h
new file mode 100644
index 0000000..303a073
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/ptrace.h
@@ -0,0 +1,25 @@
+#define PTRACE_GETVRREGS 0x12
+#define PTRACE_SETVRREGS 0x13
+#define PTRACE_GETEVRREGS 0x14
+#define PTRACE_SETEVRREGS 0x15
+#define PTRACE_GETREGS64 0x16
+#define PTRACE_SETREGS64 0x17
+#define PTRACE_GET_DEBUGREG 0x19
+#define PTRACE_SET_DEBUGREG 0x1a
+#define PTRACE_GETVSRREGS 0x1b
+#define PTRACE_SETVSRREGS 0x1c
+#define PTRACE_SYSEMU 0x1d
+#define PTRACE_SYSEMU_SINGLESTEP 0x1e
+#define PTRACE_SINGLEBLOCK 0x100
+
+#define PT_GETVRREGS PTRACE_GETVRREGS
+#define PT_SETVRREGS PTRACE_SETVRREGS
+#define PT_GETEVRREGS PTRACE_GETEVRREGS
+#define PT_SETEVRREGS PTRACE_SETEVRREGS
+#define PT_GETREGS64 PTRACE_GETREGS64
+#define PT_SETREGS64 PTRACE_SETREGS64
+#define PT_GET_DEBUGREG PTRACE_GET_DEBUGREG
+#define PT_SET_DEBUGREG PTRACE_SET_DEBUGREG
+#define PT_GETVSRREGS PTRACE_GETVSRREGS
+#define PT_SETVSRREGS PTRACE_SETVSRREGS
+#define PT_STEPBLOCK PTRACE_SINGLEBLOCK
diff --git a/libc-top-half/musl/arch/powerpc/bits/reg.h b/libc-top-half/musl/arch/powerpc/bits/reg.h
new file mode 100644
index 0000000..0c7bffc
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/reg.h
@@ -0,0 +1,3 @@
+#undef __WORDSIZE
+#define __WORDSIZE 32
+/* FIXME */
diff --git a/libc-top-half/musl/arch/powerpc/bits/sem.h b/libc-top-half/musl/arch/powerpc/bits/sem.h
new file mode 100644
index 0000000..28be484
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/sem.h
@@ -0,0 +1,12 @@
+struct semid_ds {
+ struct ipc_perm sem_perm;
+ unsigned long __sem_otime_hi;
+ unsigned long __sem_otime_lo;
+ unsigned long __sem_ctime_hi;
+ unsigned long __sem_ctime_lo;
+ unsigned short __sem_nsems_pad, sem_nsems;
+ long __unused3;
+ long __unused4;
+ time_t sem_otime;
+ time_t sem_ctime;
+};
diff --git a/libc-top-half/musl/arch/powerpc/bits/setjmp.h b/libc-top-half/musl/arch/powerpc/bits/setjmp.h
new file mode 100644
index 0000000..1cb0f26
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long long __jmp_buf[56];
diff --git a/libc-top-half/musl/arch/powerpc/bits/shm.h b/libc-top-half/musl/arch/powerpc/bits/shm.h
new file mode 100644
index 0000000..7f1ca17
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/shm.h
@@ -0,0 +1,30 @@
+#define SHMLBA 4096
+
+struct shmid_ds {
+ struct ipc_perm shm_perm;
+ unsigned long __shm_atime_hi;
+ unsigned long __shm_atime_lo;
+ unsigned long __shm_dtime_hi;
+ unsigned long __shm_dtime_lo;
+ unsigned long __shm_ctime_hi;
+ unsigned long __shm_ctime_lo;
+ unsigned long __pad1;
+ size_t shm_segsz;
+ pid_t shm_cpid;
+ pid_t shm_lpid;
+ unsigned long shm_nattch;
+ unsigned long __pad2;
+ time_t shm_atime;
+ time_t shm_dtime;
+ time_t shm_ctime;
+};
+
+struct shminfo {
+ unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+};
+
+struct shm_info {
+ int __used_ids;
+ unsigned long shm_tot, shm_rss, shm_swp;
+ unsigned long __swap_attempts, __swap_successes;
+};
diff --git a/libc-top-half/musl/arch/powerpc/bits/signal.h b/libc-top-half/musl/arch/powerpc/bits/signal.h
new file mode 100644
index 0000000..c1bf3ca
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/signal.h
@@ -0,0 +1,119 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 4096
+#define SIGSTKSZ 10240
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+typedef unsigned long greg_t, gregset_t[48];
+
+typedef struct {
+ double fpregs[32];
+ double fpscr;
+ unsigned _pad[2];
+} fpregset_t;
+
+typedef struct {
+ unsigned vrregs[32][4];
+ unsigned vrsave;
+ unsigned _pad[2];
+ unsigned vscr;
+} vrregset_t;
+
+struct sigcontext {
+ unsigned long _unused[4];
+ int signal;
+ unsigned long handler;
+ unsigned long oldmask;
+ struct pt_regs *regs;
+};
+
+typedef struct {
+ gregset_t gregs;
+ fpregset_t fpregs;
+ vrregset_t vrregs
+#ifdef __GNUC__
+ __attribute__((__aligned__(16)))
+#endif
+ ;
+} mcontext_t;
+
+#else
+
+typedef struct {
+ long __regs[48+68+4*32+4]
+#ifdef __GNUC__
+ __attribute__((__aligned__(16)))
+#endif
+ ;
+} 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;
+ stack_t uc_stack;
+ int uc_pad[7];
+ mcontext_t *uc_regs;
+ sigset_t uc_sigmask;
+ int uc_pad2[3];
+ mcontext_t uc_mcontext;
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1U
+#define SA_NOCLDWAIT 2U
+#define SA_SIGINFO 4U
+#define SA_ONSTACK 0x08000000U
+#define SA_RESTART 0x10000000U
+#define SA_NODEFER 0x40000000U
+#define SA_RESETHAND 0x80000000U
+#define SA_RESTORER 0x04000000U
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL 29
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
diff --git a/libc-top-half/musl/arch/powerpc/bits/socket.h b/libc-top-half/musl/arch/powerpc/bits/socket.h
new file mode 100644
index 0000000..b19ed42
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/socket.h
@@ -0,0 +1,25 @@
+#define SO_DEBUG 1
+#define SO_REUSEADDR 2
+#define SO_TYPE 3
+#define SO_ERROR 4
+#define SO_DONTROUTE 5
+#define SO_BROADCAST 6
+#define SO_SNDBUF 7
+#define SO_RCVBUF 8
+#define SO_KEEPALIVE 9
+#define SO_OOBINLINE 10
+#define SO_NO_CHECK 11
+#define SO_PRIORITY 12
+#define SO_LINGER 13
+#define SO_BSDCOMPAT 14
+#define SO_REUSEPORT 15
+#define SO_RCVLOWAT 16
+#define SO_SNDLOWAT 17
+#define SO_PASSCRED 20
+#define SO_PEERCRED 21
+#define SO_ACCEPTCONN 30
+#define SO_PEERSEC 31
+#define SO_SNDBUFFORCE 32
+#define SO_RCVBUFFORCE 33
+#define SO_PROTOCOL 38
+#define SO_DOMAIN 39
diff --git a/libc-top-half/musl/arch/powerpc/bits/stat.h b/libc-top-half/musl/arch/powerpc/bits/stat.h
new file mode 100644
index 0000000..585d98e
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/stat.h
@@ -0,0 +1,24 @@
+/* copied from kernel definition, but with padding replaced
+ * by the corresponding correctly-sized userspace types. */
+
+struct stat {
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ short __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ struct {
+ long tv_sec;
+ long tv_nsec;
+ } __st_atim32, __st_mtim32, __st_ctim32;
+ unsigned __unused[2];
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+};
diff --git a/libc-top-half/musl/arch/powerpc/bits/stdint.h b/libc-top-half/musl/arch/powerpc/bits/stdint.h
new file mode 100644
index 0000000..d1b2712
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#define SIZE_MAX UINT32_MAX
diff --git a/libc-top-half/musl/arch/powerpc/bits/syscall.h.in b/libc-top-half/musl/arch/powerpc/bits/syscall.h.in
new file mode 100644
index 0000000..b1605a5
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/syscall.h.in
@@ -0,0 +1,428 @@
+#define __NR_restart_syscall 0
+#define __NR_exit 1
+#define __NR_fork 2
+#define __NR_read 3
+#define __NR_write 4
+#define __NR_open 5
+#define __NR_close 6
+#define __NR_waitpid 7
+#define __NR_creat 8
+#define __NR_link 9
+#define __NR_unlink 10
+#define __NR_execve 11
+#define __NR_chdir 12
+#define __NR_time 13
+#define __NR_mknod 14
+#define __NR_chmod 15
+#define __NR_lchown 16
+#define __NR_break 17
+#define __NR_oldstat 18
+#define __NR_lseek 19
+#define __NR_getpid 20
+#define __NR_mount 21
+#define __NR_umount 22
+#define __NR_setuid 23
+#define __NR_getuid 24
+#define __NR_stime 25
+#define __NR_ptrace 26
+#define __NR_alarm 27
+#define __NR_oldfstat 28
+#define __NR_pause 29
+#define __NR_utime 30
+#define __NR_stty 31
+#define __NR_gtty 32
+#define __NR_access 33
+#define __NR_nice 34
+#define __NR_ftime 35
+#define __NR_sync 36
+#define __NR_kill 37
+#define __NR_rename 38
+#define __NR_mkdir 39
+#define __NR_rmdir 40
+#define __NR_dup 41
+#define __NR_pipe 42
+#define __NR_times 43
+#define __NR_prof 44
+#define __NR_brk 45
+#define __NR_setgid 46
+#define __NR_getgid 47
+#define __NR_signal 48
+#define __NR_geteuid 49
+#define __NR_getegid 50
+#define __NR_acct 51
+#define __NR_umount2 52
+#define __NR_lock 53
+#define __NR_ioctl 54
+#define __NR_fcntl 55
+#define __NR_mpx 56
+#define __NR_setpgid 57
+#define __NR_ulimit 58
+#define __NR_oldolduname 59
+#define __NR_umask 60
+#define __NR_chroot 61
+#define __NR_ustat 62
+#define __NR_dup2 63
+#define __NR_getppid 64
+#define __NR_getpgrp 65
+#define __NR_setsid 66
+#define __NR_sigaction 67
+#define __NR_sgetmask 68
+#define __NR_ssetmask 69
+#define __NR_setreuid 70
+#define __NR_setregid 71
+#define __NR_sigsuspend 72
+#define __NR_sigpending 73
+#define __NR_sethostname 74
+#define __NR_setrlimit 75
+#define __NR_getrlimit 76
+#define __NR_getrusage 77
+#define __NR_gettimeofday_time32 78
+#define __NR_settimeofday_time32 79
+#define __NR_getgroups 80
+#define __NR_setgroups 81
+#define __NR_select 82
+#define __NR_symlink 83
+#define __NR_oldlstat 84
+#define __NR_readlink 85
+#define __NR_uselib 86
+#define __NR_swapon 87
+#define __NR_reboot 88
+#define __NR_readdir 89
+#define __NR_mmap 90
+#define __NR_munmap 91
+#define __NR_truncate 92
+#define __NR_ftruncate 93
+#define __NR_fchmod 94
+#define __NR_fchown 95
+#define __NR_getpriority 96
+#define __NR_setpriority 97
+#define __NR_profil 98
+#define __NR_statfs 99
+#define __NR_fstatfs 100
+#define __NR_ioperm 101
+#define __NR_socketcall 102
+#define __NR_syslog 103
+#define __NR_setitimer 104
+#define __NR_getitimer 105
+#define __NR_stat 106
+#define __NR_lstat 107
+#define __NR_fstat 108
+#define __NR_olduname 109
+#define __NR_iopl 110
+#define __NR_vhangup 111
+#define __NR_idle 112
+#define __NR_vm86 113
+#define __NR_wait4 114
+#define __NR_swapoff 115
+#define __NR_sysinfo 116
+#define __NR_ipc 117
+#define __NR_fsync 118
+#define __NR_sigreturn 119
+#define __NR_clone 120
+#define __NR_setdomainname 121
+#define __NR_uname 122
+#define __NR_modify_ldt 123
+#define __NR_adjtimex 124
+#define __NR_mprotect 125
+#define __NR_sigprocmask 126
+#define __NR_create_module 127
+#define __NR_init_module 128
+#define __NR_delete_module 129
+#define __NR_get_kernel_syms 130
+#define __NR_quotactl 131
+#define __NR_getpgid 132
+#define __NR_fchdir 133
+#define __NR_bdflush 134
+#define __NR_sysfs 135
+#define __NR_personality 136
+#define __NR_afs_syscall 137
+#define __NR_setfsuid 138
+#define __NR_setfsgid 139
+#define __NR__llseek 140
+#define __NR_getdents 141
+#define __NR__newselect 142
+#define __NR_flock 143
+#define __NR_msync 144
+#define __NR_readv 145
+#define __NR_writev 146
+#define __NR_getsid 147
+#define __NR_fdatasync 148
+#define __NR__sysctl 149
+#define __NR_mlock 150
+#define __NR_munlock 151
+#define __NR_mlockall 152
+#define __NR_munlockall 153
+#define __NR_sched_setparam 154
+#define __NR_sched_getparam 155
+#define __NR_sched_setscheduler 156
+#define __NR_sched_getscheduler 157
+#define __NR_sched_yield 158
+#define __NR_sched_get_priority_max 159
+#define __NR_sched_get_priority_min 160
+#define __NR_sched_rr_get_interval 161
+#define __NR_nanosleep 162
+#define __NR_mremap 163
+#define __NR_setresuid 164
+#define __NR_getresuid 165
+#define __NR_query_module 166
+#define __NR_poll 167
+#define __NR_nfsservctl 168
+#define __NR_setresgid 169
+#define __NR_getresgid 170
+#define __NR_prctl 171
+#define __NR_rt_sigreturn 172
+#define __NR_rt_sigaction 173
+#define __NR_rt_sigprocmask 174
+#define __NR_rt_sigpending 175
+#define __NR_rt_sigtimedwait 176
+#define __NR_rt_sigqueueinfo 177
+#define __NR_rt_sigsuspend 178
+#define __NR_pread64 179
+#define __NR_pwrite64 180
+#define __NR_chown 181
+#define __NR_getcwd 182
+#define __NR_capget 183
+#define __NR_capset 184
+#define __NR_sigaltstack 185
+#define __NR_sendfile 186
+#define __NR_getpmsg 187
+#define __NR_putpmsg 188
+#define __NR_vfork 189
+#define __NR_ugetrlimit 190
+#define __NR_readahead 191
+#define __NR_mmap2 192
+#define __NR_truncate64 193
+#define __NR_ftruncate64 194
+#define __NR_stat64 195
+#define __NR_lstat64 196
+#define __NR_fstat64 197
+#define __NR_pciconfig_read 198
+#define __NR_pciconfig_write 199
+#define __NR_pciconfig_iobase 200
+#define __NR_multiplexer 201
+#define __NR_getdents64 202
+#define __NR_pivot_root 203
+#define __NR_fcntl64 204
+#define __NR_madvise 205
+#define __NR_mincore 206
+#define __NR_gettid 207
+#define __NR_tkill 208
+#define __NR_setxattr 209
+#define __NR_lsetxattr 210
+#define __NR_fsetxattr 211
+#define __NR_getxattr 212
+#define __NR_lgetxattr 213
+#define __NR_fgetxattr 214
+#define __NR_listxattr 215
+#define __NR_llistxattr 216
+#define __NR_flistxattr 217
+#define __NR_removexattr 218
+#define __NR_lremovexattr 219
+#define __NR_fremovexattr 220
+#define __NR_futex 221
+#define __NR_sched_setaffinity 222
+#define __NR_sched_getaffinity 223
+#define __NR_tuxcall 225
+#define __NR_sendfile64 226
+#define __NR_io_setup 227
+#define __NR_io_destroy 228
+#define __NR_io_getevents 229
+#define __NR_io_submit 230
+#define __NR_io_cancel 231
+#define __NR_set_tid_address 232
+#define __NR_fadvise64 233
+#define __NR_exit_group 234
+#define __NR_lookup_dcookie 235
+#define __NR_epoll_create 236
+#define __NR_epoll_ctl 237
+#define __NR_epoll_wait 238
+#define __NR_remap_file_pages 239
+#define __NR_timer_create 240
+#define __NR_timer_settime32 241
+#define __NR_timer_gettime32 242
+#define __NR_timer_getoverrun 243
+#define __NR_timer_delete 244
+#define __NR_clock_settime32 245
+#define __NR_clock_gettime32 246
+#define __NR_clock_getres_time32 247
+#define __NR_clock_nanosleep_time32 248
+#define __NR_swapcontext 249
+#define __NR_tgkill 250
+#define __NR_utimes 251
+#define __NR_statfs64 252
+#define __NR_fstatfs64 253
+#define __NR_fadvise64_64 254
+#define __NR_rtas 255
+#define __NR_sys_debug_setcontext 256
+#define __NR_migrate_pages 258
+#define __NR_mbind 259
+#define __NR_get_mempolicy 260
+#define __NR_set_mempolicy 261
+#define __NR_mq_open 262
+#define __NR_mq_unlink 263
+#define __NR_mq_timedsend 264
+#define __NR_mq_timedreceive 265
+#define __NR_mq_notify 266
+#define __NR_mq_getsetattr 267
+#define __NR_kexec_load 268
+#define __NR_add_key 269
+#define __NR_request_key 270
+#define __NR_keyctl 271
+#define __NR_waitid 272
+#define __NR_ioprio_set 273
+#define __NR_ioprio_get 274
+#define __NR_inotify_init 275
+#define __NR_inotify_add_watch 276
+#define __NR_inotify_rm_watch 277
+#define __NR_spu_run 278
+#define __NR_spu_create 279
+#define __NR_pselect6 280
+#define __NR_ppoll 281
+#define __NR_unshare 282
+#define __NR_splice 283
+#define __NR_tee 284
+#define __NR_vmsplice 285
+#define __NR_openat 286
+#define __NR_mkdirat 287
+#define __NR_mknodat 288
+#define __NR_fchownat 289
+#define __NR_futimesat 290
+#define __NR_fstatat64 291
+#define __NR_unlinkat 292
+#define __NR_renameat 293
+#define __NR_linkat 294
+#define __NR_symlinkat 295
+#define __NR_readlinkat 296
+#define __NR_fchmodat 297
+#define __NR_faccessat 298
+#define __NR_get_robust_list 299
+#define __NR_set_robust_list 300
+#define __NR_move_pages 301
+#define __NR_getcpu 302
+#define __NR_epoll_pwait 303
+#define __NR_utimensat 304
+#define __NR_signalfd 305
+#define __NR_timerfd_create 306
+#define __NR_eventfd 307
+#define __NR_sync_file_range2 308
+#define __NR_fallocate 309
+#define __NR_subpage_prot 310
+#define __NR_timerfd_settime32 311
+#define __NR_timerfd_gettime32 312
+#define __NR_signalfd4 313
+#define __NR_eventfd2 314
+#define __NR_epoll_create1 315
+#define __NR_dup3 316
+#define __NR_pipe2 317
+#define __NR_inotify_init1 318
+#define __NR_perf_event_open 319
+#define __NR_preadv 320
+#define __NR_pwritev 321
+#define __NR_rt_tgsigqueueinfo 322
+#define __NR_fanotify_init 323
+#define __NR_fanotify_mark 324
+#define __NR_prlimit64 325
+#define __NR_socket 326
+#define __NR_bind 327
+#define __NR_connect 328
+#define __NR_listen 329
+#define __NR_accept 330
+#define __NR_getsockname 331
+#define __NR_getpeername 332
+#define __NR_socketpair 333
+#define __NR_send 334
+#define __NR_sendto 335
+#define __NR_recv 336
+#define __NR_recvfrom 337
+#define __NR_shutdown 338
+#define __NR_setsockopt 339
+#define __NR_getsockopt 340
+#define __NR_sendmsg 341
+#define __NR_recvmsg 342
+#define __NR_recvmmsg 343
+#define __NR_accept4 344
+#define __NR_name_to_handle_at 345
+#define __NR_open_by_handle_at 346
+#define __NR_clock_adjtime 347
+#define __NR_syncfs 348
+#define __NR_sendmmsg 349
+#define __NR_setns 350
+#define __NR_process_vm_readv 351
+#define __NR_process_vm_writev 352
+#define __NR_finit_module 353
+#define __NR_kcmp 354
+#define __NR_sched_setattr 355
+#define __NR_sched_getattr 356
+#define __NR_renameat2 357
+#define __NR_seccomp 358
+#define __NR_getrandom 359
+#define __NR_memfd_create 360
+#define __NR_bpf 361
+#define __NR_execveat 362
+#define __NR_switch_endian 363
+#define __NR_userfaultfd 364
+#define __NR_membarrier 365
+#define __NR_mlock2 378
+#define __NR_copy_file_range 379
+#define __NR_preadv2 380
+#define __NR_pwritev2 381
+#define __NR_kexec_file_load 382
+#define __NR_statx 383
+#define __NR_pkey_alloc 384
+#define __NR_pkey_free 385
+#define __NR_pkey_mprotect 386
+#define __NR_rseq 387
+#define __NR_io_pgetevents 388
+#define __NR_semget 393
+#define __NR_semctl 394
+#define __NR_shmget 395
+#define __NR_shmctl 396
+#define __NR_shmat 397
+#define __NR_shmdt 398
+#define __NR_msgget 399
+#define __NR_msgsnd 400
+#define __NR_msgrcv 401
+#define __NR_msgctl 402
+#define __NR_clock_gettime64 403
+#define __NR_clock_settime64 404
+#define __NR_clock_adjtime64 405
+#define __NR_clock_getres_time64 406
+#define __NR_clock_nanosleep_time64 407
+#define __NR_timer_gettime64 408
+#define __NR_timer_settime64 409
+#define __NR_timerfd_gettime64 410
+#define __NR_timerfd_settime64 411
+#define __NR_utimensat_time64 412
+#define __NR_pselect6_time64 413
+#define __NR_ppoll_time64 414
+#define __NR_io_pgetevents_time64 416
+#define __NR_recvmmsg_time64 417
+#define __NR_mq_timedsend_time64 418
+#define __NR_mq_timedreceive_time64 419
+#define __NR_semtimedop_time64 420
+#define __NR_rt_sigtimedwait_time64 421
+#define __NR_futex_time64 422
+#define __NR_sched_rr_get_interval_time64 423
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_clone3 435
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_epoll_pwait2 441
+#define __NR_mount_setattr 442
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_restrict_self 446
+
diff --git a/libc-top-half/musl/arch/powerpc/bits/termios.h b/libc-top-half/musl/arch/powerpc/bits/termios.h
new file mode 100644
index 0000000..da1f406
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/termios.h
@@ -0,0 +1,171 @@
+#undef NCCS
+#define NCCS 19
+struct termios {
+ tcflag_t c_iflag;
+ tcflag_t c_oflag;
+ tcflag_t c_cflag;
+ tcflag_t c_lflag;
+ cc_t c_cc[NCCS];
+ cc_t c_line;
+ speed_t __c_ispeed;
+ speed_t __c_ospeed;
+};
+
+#define VINTR 0
+#define VQUIT 1
+#define VERASE 2
+#define VKILL 3
+#define VEOF 4
+#define VMIN 5
+#define VEOL 6
+#define VTIME 7
+#define VEOL2 8
+#define VSWTC 9
+#define VWERASE 10
+#define VREPRINT 11
+#define VSUSP 12
+#define VSTART 13
+#define VSTOP 14
+#define VLNEXT 15
+#define VDISCARD 16
+
+#define IGNBRK 0000001
+#define BRKINT 0000002
+#define IGNPAR 0000004
+#define PARMRK 0000010
+#define INPCK 0000020
+#define ISTRIP 0000040
+#define INLCR 0000100
+#define IGNCR 0000200
+#define ICRNL 0000400
+#define IXON 0001000
+#define IXOFF 0002000
+#define IXANY 0004000
+#define IUCLC 0010000
+#define IMAXBEL 0020000
+#define IUTF8 0040000
+
+#define OPOST 0000001
+#define ONLCR 0000002
+#define OLCUC 0000004
+#define OCRNL 0000010
+#define ONOCR 0000020
+#define ONLRET 0000040
+#define OFILL 0000100
+#define OFDEL 0000200
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE)
+#define NLDLY 0001400
+#define NL0 0000000
+#define NL1 0000400
+#define NL2 0001000
+#define NL3 0001400
+#define TABDLY 0006000
+#define TAB0 0000000
+#define TAB1 0002000
+#define TAB2 0004000
+#define TAB3 0006000
+#define CRDLY 0030000
+#define CR0 0000000
+#define CR1 0010000
+#define CR2 0020000
+#define CR3 0030000
+#define FFDLY 0040000
+#define FF0 0000000
+#define FF1 0040000
+#define BSDLY 0100000
+#define BS0 0000000
+#define BS1 0100000
+#endif
+
+#define VTDLY 0200000
+#define VT0 0000000
+#define VT1 0200000
+
+#define B0 0000000
+#define B50 0000001
+#define B75 0000002
+#define B110 0000003
+#define B134 0000004
+#define B150 0000005
+#define B200 0000006
+#define B300 0000007
+#define B600 0000010
+#define B1200 0000011
+#define B1800 0000012
+#define B2400 0000013
+#define B4800 0000014
+#define B9600 0000015
+#define B19200 0000016
+#define B38400 0000017
+
+#define B57600 00020
+#define B115200 00021
+#define B230400 00022
+#define B460800 00023
+#define B500000 00024
+#define B576000 00025
+#define B921600 00026
+#define B1000000 00027
+#define B1152000 00030
+#define B1500000 00031
+#define B2000000 00032
+#define B2500000 00033
+#define B3000000 00034
+#define B3500000 00035
+#define B4000000 00036
+
+#define CSIZE 00001400
+#define CS5 00000000
+#define CS6 00000400
+#define CS7 00001000
+#define CS8 00001400
+#define CSTOPB 00002000
+#define CREAD 00004000
+#define PARENB 00010000
+#define PARODD 00020000
+#define HUPCL 00040000
+#define CLOCAL 00100000
+
+#define ECHOE 0x00000002
+#define ECHOK 0x00000004
+#define ECHO 0x00000008
+#define ECHONL 0x00000010
+#define ISIG 0x00000080
+#define ICANON 0x00000100
+#define IEXTEN 0x00000400
+#define TOSTOP 0x00400000
+#define NOFLSH 0x80000000
+
+#define TCOOFF 0
+#define TCOON 1
+#define TCIOFF 2
+#define TCION 3
+
+#define TCIFLUSH 0
+#define TCOFLUSH 1
+#define TCIOFLUSH 2
+
+#define TCSANOW 0
+#define TCSADRAIN 1
+#define TCSAFLUSH 2
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define EXTA 0000016
+#define EXTB 0000017
+#define CBAUD 00377
+#define CBAUDEX 0000020
+#define CIBAUD 077600000
+#define CMSPAR 010000000000
+#define CRTSCTS 020000000000
+
+#define XCASE 0x00004000
+#define ECHOCTL 0x00000040
+#define ECHOPRT 0x00000020
+#define ECHOKE 0x00000001
+#define FLUSHO 0x00800000
+#define PENDIN 0x20000000
+#define EXTPROC 0x10000000
+
+#define XTABS 00006000
+#define TIOCSER_TEMT 1
+#endif
diff --git a/libc-top-half/musl/arch/powerpc/bits/user.h b/libc-top-half/musl/arch/powerpc/bits/user.h
new file mode 100644
index 0000000..7f52874
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/bits/user.h
@@ -0,0 +1,23 @@
+struct user {
+ struct {
+ unsigned long gpr[32], nip, msr, orig_gpr3, ctr, link, xer, ccr, mq;
+ unsigned long trap, dar, dsisr, result;
+ } regs;
+ unsigned long u_tsize, u_dsize, u_ssize;
+ unsigned long start_code, start_data, start_stack;
+ long signal;
+ void *u_ar0;
+ unsigned long magic;
+ char u_comm[32];
+};
+
+#define ELF_NGREG 48
+#define ELF_NFPREG 33
+#define ELF_NVRREG 33
+typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG];
+typedef double elf_fpreg_t, elf_fpregset_t[ELF_NFPREG];
+typedef struct { unsigned u[4]; }
+#ifdef __GNUC__
+__attribute__((__aligned__(16)))
+#endif
+ elf_vrreg_t, elf_vrregset_t[ELF_NVRREG];
diff --git a/libc-top-half/musl/arch/powerpc/crt_arch.h b/libc-top-half/musl/arch/powerpc/crt_arch.h
new file mode 100644
index 0000000..9b65886
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/crt_arch.h
@@ -0,0 +1,20 @@
+__asm__(
+".text \n"
+".global " START " \n"
+".type " START ", %function \n"
+START ": \n"
+" bl 1f \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+" .long _DYNAMIC-. \n"
+"1: mflr 4 \n"
+" lwz 3, 0(4) \n"
+" add 4, 3, 4 \n"
+" mr 3, 1 \n"
+" clrrwi 1, 1, 4 \n"
+" li 0, 0 \n"
+" stwu 1, -16(1) \n"
+" mtlr 0 \n"
+" stw 0, 0(1) \n"
+" bl " START "_c \n"
+);
diff --git a/libc-top-half/musl/arch/powerpc/kstat.h b/libc-top-half/musl/arch/powerpc/kstat.h
new file mode 100644
index 0000000..5a611e7
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/kstat.h
@@ -0,0 +1,20 @@
+struct kstat {
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ short __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ unsigned __unused[2];
+};
diff --git a/libc-top-half/musl/arch/powerpc/pthread_arch.h b/libc-top-half/musl/arch/powerpc/pthread_arch.h
new file mode 100644
index 0000000..42e88b0
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/pthread_arch.h
@@ -0,0 +1,16 @@
+static inline uintptr_t __get_tp()
+{
+ register uintptr_t tp __asm__("r2");
+ __asm__ ("" : "=r" (tp) );
+ return tp;
+}
+
+#define TLS_ABOVE_TP
+#define GAP_ABOVE_TP 0
+
+#define TP_OFFSET 0x7000
+#define DTP_OFFSET 0x8000
+
+// the kernel calls the ip "nip", it's the first saved value after the 32
+// GPRs.
+#define MC_PC gregs[32]
diff --git a/libc-top-half/musl/arch/powerpc/reloc.h b/libc-top-half/musl/arch/powerpc/reloc.h
new file mode 100644
index 0000000..fdfbf82
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/reloc.h
@@ -0,0 +1,31 @@
+#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
+#define FP_SUFFIX "-sf"
+#else
+#define FP_SUFFIX ""
+#endif
+
+#define LDSO_ARCH "powerpc" FP_SUFFIX
+
+#define TPOFF_K (-0x7000)
+
+#define REL_SYMBOLIC R_PPC_ADDR32
+#define REL_USYMBOLIC R_PPC_UADDR32
+#define REL_GOT R_PPC_GLOB_DAT
+#define REL_PLT R_PPC_JMP_SLOT
+#define REL_RELATIVE R_PPC_RELATIVE
+#define REL_COPY R_PPC_COPY
+#define REL_DTPMOD R_PPC_DTPMOD32
+#define REL_DTPOFF R_PPC_DTPREL32
+#define REL_TPOFF R_PPC_TPREL32
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "mr 1,%1 ; mtlr %0 ; blr" : : "r"(pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+ ".hidden " #sym " \n" \
+ " bl 1f \n" \
+ " .long " #sym "-. \n" \
+ "1: mflr %1 \n" \
+ " lwz %0, 0(%1) \n" \
+ " add %0, %0, %1 \n" \
+ : "=r"(*(fp)), "=r"((int){0}) : : "memory", "lr" )
diff --git a/libc-top-half/musl/arch/powerpc/syscall_arch.h b/libc-top-half/musl/arch/powerpc/syscall_arch.h
new file mode 100644
index 0000000..ede97c1
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc/syscall_arch.h
@@ -0,0 +1,94 @@
+#define __SYSCALL_LL_E(x) \
+((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
+((union { long long ll; long l[2]; }){ .ll = x }).l[1]
+#define __SYSCALL_LL_O(x) 0, __SYSCALL_LL_E((x))
+
+static inline long __syscall0(long n)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3");
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "=r"(r3)
+ :: "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3") = a;
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "+r"(r3)
+ :: "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3") = a;
+ register long r4 __asm__("r4") = b;
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "+r"(r3), "+r"(r4)
+ :: "memory", "cr0", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3") = a;
+ register long r4 __asm__("r4") = b;
+ register long r5 __asm__("r5") = c;
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "+r"(r3), "+r"(r4), "+r"(r5)
+ :: "memory", "cr0", "r6", "r7", "r8", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3") = a;
+ register long r4 __asm__("r4") = b;
+ register long r5 __asm__("r5") = c;
+ register long r6 __asm__("r6") = d;
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "+r"(r3), "+r"(r4), "+r"(r5), "+r"(r6)
+ :: "memory", "cr0", "r7", "r8", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3") = a;
+ register long r4 __asm__("r4") = b;
+ register long r5 __asm__("r5") = c;
+ register long r6 __asm__("r6") = d;
+ register long r7 __asm__("r7") = e;
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "+r"(r3), "+r"(r4), "+r"(r5), "+r"(r6), "+r"(r7)
+ :: "memory", "cr0", "r8", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3") = a;
+ register long r4 __asm__("r4") = b;
+ register long r5 __asm__("r5") = c;
+ register long r6 __asm__("r6") = d;
+ register long r7 __asm__("r7") = e;
+ register long r8 __asm__("r8") = f;
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "+r"(r3), "+r"(r4), "+r"(r5), "+r"(r6), "+r"(r7), "+r"(r8)
+ :: "memory", "cr0", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+#define SYSCALL_FADVISE_6_ARG
+
+#define SO_RCVTIMEO_OLD 18
+#define SO_SNDTIMEO_OLD 19
diff --git a/libc-top-half/musl/arch/powerpc64/atomic_arch.h b/libc-top-half/musl/arch/powerpc64/atomic_arch.h
new file mode 100644
index 0000000..2bed82b
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/atomic_arch.h
@@ -0,0 +1,62 @@
+#define a_ll a_ll
+static inline int a_ll(volatile int *p)
+{
+ int v;
+ __asm__ __volatile__ ("lwarx %0, 0, %2" : "=r"(v) : "m"(*p), "r"(p));
+ return v;
+}
+
+#define a_sc a_sc
+static inline int a_sc(volatile int *p, int v)
+{
+ int r;
+ __asm__ __volatile__ (
+ "stwcx. %2, 0, %3 ; mfcr %0"
+ : "=r"(r), "=m"(*p) : "r"(v), "r"(p) : "memory", "cc");
+ return r & 0x20000000; /* "bit 2" of "cr0" (backwards bit order) */
+}
+
+#define a_ll_p a_ll_p
+static inline void *a_ll_p(volatile void *p)
+{
+ void *v;
+ __asm__ __volatile__ ("ldarx %0, 0, %2" : "=r"(v) : "m"(*(void *volatile *)p), "r"(p));
+ return v;
+}
+
+#define a_sc_p a_sc_p
+static inline int a_sc_p(volatile void *p, void *v)
+{
+ int r;
+ __asm__ __volatile__ (
+ "stdcx. %2, 0, %3 ; mfcr %0"
+ : "=r"(r), "=m"(*(void *volatile *)p) : "r"(v), "r"(p) : "memory", "cc");
+ return r & 0x20000000; /* "bit 2" of "cr0" (backwards bit order) */
+}
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ __asm__ __volatile__ ("sync" : : : "memory");
+}
+
+#define a_pre_llsc a_barrier
+
+#define a_post_llsc a_post_llsc
+static inline void a_post_llsc()
+{
+ __asm__ __volatile__ ("isync" : : : "memory");
+}
+
+#define a_crash a_crash
+static inline void a_crash()
+{
+ __asm__ __volatile__ (".long 0");
+}
+
+#define a_clz_64 a_clz_64
+static inline int a_clz_64(uint64_t x)
+{
+ __asm__ ("cntlzd %0, %1" : "=r"(x) : "r"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/arch/powerpc64/bits/alltypes.h.in b/libc-top-half/musl/arch/powerpc64/bits/alltypes.h.in
new file mode 100644
index 0000000..143ffa8
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/alltypes.h.in
@@ -0,0 +1,20 @@
+#define _Addr long
+#define _Int64 long
+#define _Reg long
+
+#if __BIG_ENDIAN__
+#define __BYTE_ORDER 4321
+#else
+#define __BYTE_ORDER 1234
+#endif
+
+#define __LONG_MAX 0x7fffffffffffffffL
+
+#ifndef __cplusplus
+TYPEDEF int wchar_t;
+#endif
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/powerpc64/bits/errno.h b/libc-top-half/musl/arch/powerpc64/bits/errno.h
new file mode 100644
index 0000000..cae3f38
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/errno.h
@@ -0,0 +1,134 @@
+#define EPERM 1
+#define ENOENT 2
+#define ESRCH 3
+#define EINTR 4
+#define EIO 5
+#define ENXIO 6
+#define E2BIG 7
+#define ENOEXEC 8
+#define EBADF 9
+#define ECHILD 10
+#define EAGAIN 11
+#define ENOMEM 12
+#define EACCES 13
+#define EFAULT 14
+#define ENOTBLK 15
+#define EBUSY 16
+#define EEXIST 17
+#define EXDEV 18
+#define ENODEV 19
+#define ENOTDIR 20
+#define EISDIR 21
+#define EINVAL 22
+#define ENFILE 23
+#define EMFILE 24
+#define ENOTTY 25
+#define ETXTBSY 26
+#define EFBIG 27
+#define ENOSPC 28
+#define ESPIPE 29
+#define EROFS 30
+#define EMLINK 31
+#define EPIPE 32
+#define EDOM 33
+#define ERANGE 34
+#define EDEADLK 35
+#define ENAMETOOLONG 36
+#define ENOLCK 37
+#define ENOSYS 38
+#define ENOTEMPTY 39
+#define ELOOP 40
+#define EWOULDBLOCK EAGAIN
+#define ENOMSG 42
+#define EIDRM 43
+#define ECHRNG 44
+#define EL2NSYNC 45
+#define EL3HLT 46
+#define EL3RST 47
+#define ELNRNG 48
+#define EUNATCH 49
+#define ENOCSI 50
+#define EL2HLT 51
+#define EBADE 52
+#define EBADR 53
+#define EXFULL 54
+#define ENOANO 55
+#define EBADRQC 56
+#define EBADSLT 57
+#define EDEADLOCK 58
+#define EBFONT 59
+#define ENOSTR 60
+#define ENODATA 61
+#define ETIME 62
+#define ENOSR 63
+#define ENONET 64
+#define ENOPKG 65
+#define EREMOTE 66
+#define ENOLINK 67
+#define EADV 68
+#define ESRMNT 69
+#define ECOMM 70
+#define EPROTO 71
+#define EMULTIHOP 72
+#define EDOTDOT 73
+#define EBADMSG 74
+#define EOVERFLOW 75
+#define ENOTUNIQ 76
+#define EBADFD 77
+#define EREMCHG 78
+#define ELIBACC 79
+#define ELIBBAD 80
+#define ELIBSCN 81
+#define ELIBMAX 82
+#define ELIBEXEC 83
+#define EILSEQ 84
+#define ERESTART 85
+#define ESTRPIPE 86
+#define EUSERS 87
+#define ENOTSOCK 88
+#define EDESTADDRREQ 89
+#define EMSGSIZE 90
+#define EPROTOTYPE 91
+#define ENOPROTOOPT 92
+#define EPROTONOSUPPORT 93
+#define ESOCKTNOSUPPORT 94
+#define EOPNOTSUPP 95
+#define ENOTSUP EOPNOTSUPP
+#define EPFNOSUPPORT 96
+#define EAFNOSUPPORT 97
+#define EADDRINUSE 98
+#define EADDRNOTAVAIL 99
+#define ENETDOWN 100
+#define ENETUNREACH 101
+#define ENETRESET 102
+#define ECONNABORTED 103
+#define ECONNRESET 104
+#define ENOBUFS 105
+#define EISCONN 106
+#define ENOTCONN 107
+#define ESHUTDOWN 108
+#define ETOOMANYREFS 109
+#define ETIMEDOUT 110
+#define ECONNREFUSED 111
+#define EHOSTDOWN 112
+#define EHOSTUNREACH 113
+#define EALREADY 114
+#define EINPROGRESS 115
+#define ESTALE 116
+#define EUCLEAN 117
+#define ENOTNAM 118
+#define ENAVAIL 119
+#define EISNAM 120
+#define EREMOTEIO 121
+#define EDQUOT 122
+#define ENOMEDIUM 123
+#define EMEDIUMTYPE 124
+#define ECANCELED 125
+#define ENOKEY 126
+#define EKEYEXPIRED 127
+#define EKEYREVOKED 128
+#define EKEYREJECTED 129
+#define EOWNERDEAD 130
+#define ENOTRECOVERABLE 131
+#define ERFKILL 132
+#define EHWPOISON 133
diff --git a/libc-top-half/musl/arch/powerpc64/bits/fcntl.h b/libc-top-half/musl/arch/powerpc64/bits/fcntl.h
new file mode 100644
index 0000000..6f20bac
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/fcntl.h
@@ -0,0 +1,40 @@
+#define O_CREAT 0100
+#define O_EXCL 0200
+#define O_NOCTTY 0400
+#define O_TRUNC 01000
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_DSYNC 010000
+#define O_SYNC 04010000
+#define O_RSYNC 04010000
+#define O_DIRECTORY 040000
+#define O_NOFOLLOW 0100000
+#define O_CLOEXEC 02000000
+
+#define O_ASYNC 020000
+#define O_DIRECT 0400000
+#define O_LARGEFILE 0200000
+#define O_NOATIME 01000000
+#define O_PATH 010000000
+#define O_TMPFILE 020040000
+#define O_NDELAY O_NONBLOCK
+
+#define F_DUPFD 0
+#define F_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+
+#define F_GETLK 5
+#define F_SETLK 6
+#define F_SETLKW 7
+
+#define F_SETOWN 8
+#define F_GETOWN 9
+#define F_SETSIG 10
+#define F_GETSIG 11
+
+#define F_SETOWN_EX 15
+#define F_GETOWN_EX 16
+
+#define F_GETOWNER_UIDS 17
diff --git a/libc-top-half/musl/arch/powerpc64/bits/fenv.h b/libc-top-half/musl/arch/powerpc64/bits/fenv.h
new file mode 100644
index 0000000..2f722e6
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/fenv.h
@@ -0,0 +1,31 @@
+#define FE_TONEAREST 0
+#define FE_TOWARDZERO 1
+#define FE_UPWARD 2
+#define FE_DOWNWARD 3
+
+#define FE_INEXACT 0x02000000
+#define FE_DIVBYZERO 0x04000000
+#define FE_UNDERFLOW 0x08000000
+#define FE_OVERFLOW 0x10000000
+#define FE_INVALID 0x20000000
+
+#define FE_ALL_EXCEPT 0x3e000000
+
+#ifdef _GNU_SOURCE
+#define FE_INVALID_SNAN 0x01000000
+#define FE_INVALID_ISI 0x00800000
+#define FE_INVALID_IDI 0x00400000
+#define FE_INVALID_ZDZ 0x00200000
+#define FE_INVALID_IMZ 0x00100000
+#define FE_INVALID_COMPARE 0x00080000
+#define FE_INVALID_SOFTWARE 0x00000400
+#define FE_INVALID_SQRT 0x00000200
+#define FE_INVALID_INTEGER_CONVERSION 0x00000100
+
+#define FE_ALL_INVALID 0x01f80700
+#endif
+
+typedef unsigned fexcept_t;
+typedef double fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *)-1)
diff --git a/libc-top-half/musl/arch/powerpc64/bits/float.h b/libc-top-half/musl/arch/powerpc64/bits/float.h
new file mode 100644
index 0000000..c4a655e
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 4.94065645841246544177e-324L
+#define LDBL_MIN 2.22507385850720138309e-308L
+#define LDBL_MAX 1.79769313486231570815e+308L
+#define LDBL_EPSILON 2.22044604925031308085e-16L
+
+#define LDBL_MANT_DIG 53
+#define LDBL_MIN_EXP (-1021)
+#define LDBL_MAX_EXP 1024
+
+#define LDBL_DIG 15
+#define LDBL_MIN_10_EXP (-307)
+#define LDBL_MAX_10_EXP 308
+
+#define DECIMAL_DIG 17
diff --git a/libc-top-half/musl/arch/powerpc64/bits/hwcap.h b/libc-top-half/musl/arch/powerpc64/bits/hwcap.h
new file mode 100644
index 0000000..803de9b
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/hwcap.h
@@ -0,0 +1,43 @@
+#define PPC_FEATURE_32 0x80000000
+#define PPC_FEATURE_64 0x40000000
+#define PPC_FEATURE_601_INSTR 0x20000000
+#define PPC_FEATURE_HAS_ALTIVEC 0x10000000
+#define PPC_FEATURE_HAS_FPU 0x08000000
+#define PPC_FEATURE_HAS_MMU 0x04000000
+#define PPC_FEATURE_HAS_4xxMAC 0x02000000
+#define PPC_FEATURE_UNIFIED_CACHE 0x01000000
+#define PPC_FEATURE_HAS_SPE 0x00800000
+#define PPC_FEATURE_HAS_EFP_SINGLE 0x00400000
+#define PPC_FEATURE_HAS_EFP_DOUBLE 0x00200000
+#define PPC_FEATURE_NO_TB 0x00100000
+#define PPC_FEATURE_POWER4 0x00080000
+#define PPC_FEATURE_POWER5 0x00040000
+#define PPC_FEATURE_POWER5_PLUS 0x00020000
+#define PPC_FEATURE_CELL 0x00010000
+#define PPC_FEATURE_BOOKE 0x00008000
+#define PPC_FEATURE_SMT 0x00004000
+#define PPC_FEATURE_ICACHE_SNOOP 0x00002000
+#define PPC_FEATURE_ARCH_2_05 0x00001000
+#define PPC_FEATURE_PA6T 0x00000800
+#define PPC_FEATURE_HAS_DFP 0x00000400
+#define PPC_FEATURE_POWER6_EXT 0x00000200
+#define PPC_FEATURE_ARCH_2_06 0x00000100
+#define PPC_FEATURE_HAS_VSX 0x00000080
+#define PPC_FEATURE_PSERIES_PERFMON_COMPAT 0x00000040
+
+#define PPC_FEATURE_TRUE_LE 0x00000002
+#define PPC_FEATURE_PPC_LE 0x00000001
+
+#define PPC_FEATURE2_ARCH_2_07 0x80000000
+#define PPC_FEATURE2_HTM 0x40000000
+#define PPC_FEATURE2_DSCR 0x20000000
+#define PPC_FEATURE2_EBB 0x10000000
+#define PPC_FEATURE2_ISEL 0x08000000
+#define PPC_FEATURE2_TAR 0x04000000
+#define PPC_FEATURE2_VEC_CRYPTO 0x02000000
+#define PPC_FEATURE2_HTM_NOSC 0x01000000
+#define PPC_FEATURE2_ARCH_3_00 0x00800000
+#define PPC_FEATURE2_HAS_IEEE128 0x00400000
+#define PPC_FEATURE2_DARN 0x00200000
+#define PPC_FEATURE2_SCV 0x00100000
+#define PPC_FEATURE2_HTM_NO_SUSPEND 0x00080000
diff --git a/libc-top-half/musl/arch/powerpc64/bits/ioctl.h b/libc-top-half/musl/arch/powerpc64/bits/ioctl.h
new file mode 100644
index 0000000..b6cbb18
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/ioctl.h
@@ -0,0 +1,120 @@
+#define _IOC(a,b,c,d) ( ((a)<<29) | ((b)<<8) | (c) | ((d)<<16) )
+#define _IOC_NONE 1U
+#define _IOC_WRITE 4U
+#define _IOC_READ 2U
+
+#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0)
+#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c))
+#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c))
+#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c))
+
+#define FIONCLEX _IO('f', 2)
+#define FIOCLEX _IO('f', 1)
+#define FIOASYNC _IOW('f', 125, int)
+#define FIONBIO _IOW('f', 126, int)
+#define FIONREAD _IOR('f', 127, int)
+#define TIOCINQ FIONREAD
+#define FIOQSIZE _IOR('f', 128, char[8])
+#define TIOCGETP _IOR('t', 8, char[6])
+#define TIOCSETP _IOW('t', 9, char[6])
+#define TIOCSETN _IOW('t', 10, char[6])
+
+#define TIOCSETC _IOW('t', 17, char[6])
+#define TIOCGETC _IOR('t', 18, char[6])
+#define TCGETS _IOR('t', 19, char[44])
+#define TCSETS _IOW('t', 20, char[44])
+#define TCSETSW _IOW('t', 21, char[44])
+#define TCSETSF _IOW('t', 22, char[44])
+
+#define TCGETA _IOR('t', 23, char[20])
+#define TCSETA _IOW('t', 24, char[20])
+#define TCSETAW _IOW('t', 25, char[20])
+#define TCSETAF _IOW('t', 28, char[20])
+
+#define TCSBRK _IO('t', 29)
+#define TCXONC _IO('t', 30)
+#define TCFLSH _IO('t', 31)
+
+#define TIOCSWINSZ _IOW('t', 103, char[8])
+#define TIOCGWINSZ _IOR('t', 104, char[8])
+#define TIOCSTART _IO('t', 110)
+#define TIOCSTOP _IO('t', 111)
+
+#define TIOCOUTQ _IOR('t', 115, int)
+
+#define TIOCGLTC _IOR('t', 116, char[6])
+#define TIOCSLTC _IOW('t', 117, char[6])
+#define TIOCSPGRP _IOW('t', 118, int)
+#define TIOCGPGRP _IOR('t', 119, int)
+
+#define TIOCEXCL 0x540C
+#define TIOCNXCL 0x540D
+#define TIOCSCTTY 0x540E
+
+#define TIOCSTI 0x5412
+#define TIOCMGET 0x5415
+#define TIOCMBIS 0x5416
+#define TIOCMBIC 0x5417
+#define TIOCMSET 0x5418
+#define TIOCM_LE 0x001
+#define TIOCM_DTR 0x002
+#define TIOCM_RTS 0x004
+#define TIOCM_ST 0x008
+#define TIOCM_SR 0x010
+#define TIOCM_CTS 0x020
+#define TIOCM_CAR 0x040
+#define TIOCM_RNG 0x080
+#define TIOCM_DSR 0x100
+#define TIOCM_CD TIOCM_CAR
+#define TIOCM_RI TIOCM_RNG
+#define TIOCM_OUT1 0x2000
+#define TIOCM_OUT2 0x4000
+#define TIOCM_LOOP 0x8000
+
+#define TIOCGSOFTCAR 0x5419
+#define TIOCSSOFTCAR 0x541A
+#define TIOCLINUX 0x541C
+#define TIOCCONS 0x541D
+#define TIOCGSERIAL 0x541E
+#define TIOCSSERIAL 0x541F
+#define TIOCPKT 0x5420
+
+#define TIOCNOTTY 0x5422
+#define TIOCSETD 0x5423
+#define TIOCGETD 0x5424
+#define TCSBRKP 0x5425
+#define TIOCSBRK 0x5427
+#define TIOCCBRK 0x5428
+#define TIOCGSID 0x5429
+#define TIOCGRS485 0x542e
+#define TIOCSRS485 0x542f
+#define TIOCGPTN _IOR('T',0x30, unsigned int)
+#define TIOCSPTLCK _IOW('T',0x31, int)
+#define TIOCGDEV _IOR('T',0x32, unsigned int)
+#define TIOCSIG _IOW('T',0x36, int)
+#define TIOCVHANGUP 0x5437
+#define TIOCGPKT _IOR('T', 0x38, int)
+#define TIOCGPTLCK _IOR('T', 0x39, int)
+#define TIOCGEXCL _IOR('T', 0x40, int)
+#define TIOCGPTPEER _IO('T', 0x41)
+
+#define TIOCSERCONFIG 0x5453
+#define TIOCSERGWILD 0x5454
+#define TIOCSERSWILD 0x5455
+#define TIOCGLCKTRMIOS 0x5456
+#define TIOCSLCKTRMIOS 0x5457
+#define TIOCSERGSTRUCT 0x5458
+#define TIOCSERGETLSR 0x5459
+#define TIOCSERGETMULTI 0x545A
+#define TIOCSERSETMULTI 0x545B
+
+#define TIOCMIWAIT 0x545C
+#define TIOCGICOUNT 0x545D
+
+#define FIOSETOWN 0x8901
+#define SIOCSPGRP 0x8902
+#define FIOGETOWN 0x8903
+#define SIOCGPGRP 0x8904
+#define SIOCATMARK 0x8905
+#define SIOCGSTAMP 0x8906
+#define SIOCGSTAMPNS 0x8907
diff --git a/libc-top-half/musl/arch/powerpc64/bits/ipc.h b/libc-top-half/musl/arch/powerpc64/bits/ipc.h
new file mode 100644
index 0000000..a388d56
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/ipc.h
@@ -0,0 +1,12 @@
+struct ipc_perm {
+ key_t __ipc_perm_key;
+ uid_t uid;
+ gid_t gid;
+ uid_t cuid;
+ gid_t cgid;
+ mode_t mode;
+ int __ipc_perm_seq;
+ int __pad1;
+ long long __pad2;
+ long long __pad3;
+};
diff --git a/libc-top-half/musl/arch/powerpc64/bits/mman.h b/libc-top-half/musl/arch/powerpc64/bits/mman.h
new file mode 100644
index 0000000..95ec435
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/mman.h
@@ -0,0 +1,13 @@
+#define PROT_SAO 0x10
+
+#undef MAP_NORESERVE
+#define MAP_NORESERVE 0x40
+#undef MAP_LOCKED
+#define MAP_LOCKED 0x80
+
+#undef MCL_CURRENT
+#define MCL_CURRENT 0x2000
+#undef MCL_FUTURE
+#define MCL_FUTURE 0x4000
+#undef MCL_ONFAULT
+#define MCL_ONFAULT 0x8000
diff --git a/libc-top-half/musl/arch/powerpc64/bits/posix.h b/libc-top-half/musl/arch/powerpc64/bits/posix.h
new file mode 100644
index 0000000..c37b94c
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_LP64_OFF64 1
+#define _POSIX_V7_LP64_OFF64 1
diff --git a/libc-top-half/musl/arch/powerpc64/bits/ptrace.h b/libc-top-half/musl/arch/powerpc64/bits/ptrace.h
new file mode 100644
index 0000000..303a073
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/ptrace.h
@@ -0,0 +1,25 @@
+#define PTRACE_GETVRREGS 0x12
+#define PTRACE_SETVRREGS 0x13
+#define PTRACE_GETEVRREGS 0x14
+#define PTRACE_SETEVRREGS 0x15
+#define PTRACE_GETREGS64 0x16
+#define PTRACE_SETREGS64 0x17
+#define PTRACE_GET_DEBUGREG 0x19
+#define PTRACE_SET_DEBUGREG 0x1a
+#define PTRACE_GETVSRREGS 0x1b
+#define PTRACE_SETVSRREGS 0x1c
+#define PTRACE_SYSEMU 0x1d
+#define PTRACE_SYSEMU_SINGLESTEP 0x1e
+#define PTRACE_SINGLEBLOCK 0x100
+
+#define PT_GETVRREGS PTRACE_GETVRREGS
+#define PT_SETVRREGS PTRACE_SETVRREGS
+#define PT_GETEVRREGS PTRACE_GETEVRREGS
+#define PT_SETEVRREGS PTRACE_SETEVRREGS
+#define PT_GETREGS64 PTRACE_GETREGS64
+#define PT_SETREGS64 PTRACE_SETREGS64
+#define PT_GET_DEBUGREG PTRACE_GET_DEBUGREG
+#define PT_SET_DEBUGREG PTRACE_SET_DEBUGREG
+#define PT_GETVSRREGS PTRACE_GETVSRREGS
+#define PT_SETVSRREGS PTRACE_SETVSRREGS
+#define PT_STEPBLOCK PTRACE_SINGLEBLOCK
diff --git a/libc-top-half/musl/arch/powerpc64/bits/reg.h b/libc-top-half/musl/arch/powerpc64/bits/reg.h
new file mode 100644
index 0000000..49382c8
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/reg.h
@@ -0,0 +1,3 @@
+#undef __WORDSIZE
+#define __WORDSIZE 64
+/* FIXME */
diff --git a/libc-top-half/musl/arch/powerpc64/bits/setjmp.h b/libc-top-half/musl/arch/powerpc64/bits/setjmp.h
new file mode 100644
index 0000000..f7370e3
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned __int128 __jmp_buf[32];
diff --git a/libc-top-half/musl/arch/powerpc64/bits/shm.h b/libc-top-half/musl/arch/powerpc64/bits/shm.h
new file mode 100644
index 0000000..b7f73a8
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/shm.h
@@ -0,0 +1,23 @@
+#define SHMLBA 4096
+
+struct shmid_ds {
+ struct ipc_perm shm_perm;
+ time_t shm_atime;
+ time_t shm_dtime;
+ time_t shm_ctime;
+ size_t shm_segsz;
+ pid_t shm_cpid;
+ pid_t shm_lpid;
+ unsigned long shm_nattch;
+ unsigned long __unused[2];
+};
+
+struct shminfo {
+ unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+};
+
+struct shm_info {
+ int __used_ids;
+ unsigned long shm_tot, shm_rss, shm_swp;
+ unsigned long __swap_attempts, __swap_successes;
+};
diff --git a/libc-top-half/musl/arch/powerpc64/bits/signal.h b/libc-top-half/musl/arch/powerpc64/bits/signal.h
new file mode 100644
index 0000000..d5493b1
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/signal.h
@@ -0,0 +1,110 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 4096
+#define SIGSTKSZ 10240
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+typedef unsigned long greg_t, gregset_t[48];
+typedef double fpregset_t[33];
+
+typedef struct {
+#ifdef __GNUC__
+ __attribute__((__aligned__(16)))
+#endif
+ unsigned vrregs[32][4];
+ struct {
+#if __BIG_ENDIAN__
+ unsigned _pad[3], vscr_word;
+#else
+ unsigned vscr_word, _pad[3];
+#endif
+ } vscr;
+ unsigned vrsave, _pad[3];
+} vrregset_t;
+
+typedef struct sigcontext {
+ unsigned long _unused[4];
+ int signal;
+ int _pad0;
+ unsigned long handler;
+ unsigned long oldmask;
+ struct pt_regs *regs;
+ gregset_t gp_regs;
+ fpregset_t fp_regs;
+ vrregset_t *v_regs;
+ long vmx_reserve[34+34+32+1];
+} mcontext_t;
+
+#else
+
+typedef struct {
+ long __regs[4+4+48+33+1+34+34+32+1];
+} 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;
+ stack_t uc_stack;
+ sigset_t uc_sigmask;
+ mcontext_t uc_mcontext;
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1U
+#define SA_NOCLDWAIT 2U
+#define SA_SIGINFO 4U
+#define SA_ONSTACK 0x08000000U
+#define SA_RESTART 0x10000000U
+#define SA_NODEFER 0x40000000U
+#define SA_RESETHAND 0x80000000U
+#define SA_RESTORER 0x04000000U
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL SIGIO
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
diff --git a/libc-top-half/musl/arch/powerpc64/bits/socket.h b/libc-top-half/musl/arch/powerpc64/bits/socket.h
new file mode 100644
index 0000000..557e324
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/socket.h
@@ -0,0 +1,27 @@
+#define SO_DEBUG 1
+#define SO_REUSEADDR 2
+#define SO_TYPE 3
+#define SO_ERROR 4
+#define SO_DONTROUTE 5
+#define SO_BROADCAST 6
+#define SO_SNDBUF 7
+#define SO_RCVBUF 8
+#define SO_KEEPALIVE 9
+#define SO_OOBINLINE 10
+#define SO_NO_CHECK 11
+#define SO_PRIORITY 12
+#define SO_LINGER 13
+#define SO_BSDCOMPAT 14
+#define SO_REUSEPORT 15
+#define SO_RCVLOWAT 16
+#define SO_SNDLOWAT 17
+#define SO_RCVTIMEO 18
+#define SO_SNDTIMEO 19
+#define SO_PASSCRED 20
+#define SO_PEERCRED 21
+#define SO_ACCEPTCONN 30
+#define SO_PEERSEC 31
+#define SO_SNDBUFFORCE 32
+#define SO_RCVBUFFORCE 33
+#define SO_PROTOCOL 38
+#define SO_DOMAIN 39
diff --git a/libc-top-half/musl/arch/powerpc64/bits/stat.h b/libc-top-half/musl/arch/powerpc64/bits/stat.h
new file mode 100644
index 0000000..320b49b
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/stat.h
@@ -0,0 +1,16 @@
+struct stat {
+ dev_t st_dev;
+ ino_t st_ino;
+ nlink_t st_nlink;
+ mode_t st_mode;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+ unsigned long __unused[3];
+};
diff --git a/libc-top-half/musl/arch/powerpc64/bits/stdint.h b/libc-top-half/musl/arch/powerpc64/bits/stdint.h
new file mode 100644
index 0000000..1bb147f
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#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
diff --git a/libc-top-half/musl/arch/powerpc64/bits/syscall.h.in b/libc-top-half/musl/arch/powerpc64/bits/syscall.h.in
new file mode 100644
index 0000000..b3a8fba
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/syscall.h.in
@@ -0,0 +1,400 @@
+#define __NR_restart_syscall 0
+#define __NR_exit 1
+#define __NR_fork 2
+#define __NR_read 3
+#define __NR_write 4
+#define __NR_open 5
+#define __NR_close 6
+#define __NR_waitpid 7
+#define __NR_creat 8
+#define __NR_link 9
+#define __NR_unlink 10
+#define __NR_execve 11
+#define __NR_chdir 12
+#define __NR_time 13
+#define __NR_mknod 14
+#define __NR_chmod 15
+#define __NR_lchown 16
+#define __NR_break 17
+#define __NR_oldstat 18
+#define __NR_lseek 19
+#define __NR_getpid 20
+#define __NR_mount 21
+#define __NR_umount 22
+#define __NR_setuid 23
+#define __NR_getuid 24
+#define __NR_stime 25
+#define __NR_ptrace 26
+#define __NR_alarm 27
+#define __NR_oldfstat 28
+#define __NR_pause 29
+#define __NR_utime 30
+#define __NR_stty 31
+#define __NR_gtty 32
+#define __NR_access 33
+#define __NR_nice 34
+#define __NR_ftime 35
+#define __NR_sync 36
+#define __NR_kill 37
+#define __NR_rename 38
+#define __NR_mkdir 39
+#define __NR_rmdir 40
+#define __NR_dup 41
+#define __NR_pipe 42
+#define __NR_times 43
+#define __NR_prof 44
+#define __NR_brk 45
+#define __NR_setgid 46
+#define __NR_getgid 47
+#define __NR_signal 48
+#define __NR_geteuid 49
+#define __NR_getegid 50
+#define __NR_acct 51
+#define __NR_umount2 52
+#define __NR_lock 53
+#define __NR_ioctl 54
+#define __NR_fcntl 55
+#define __NR_mpx 56
+#define __NR_setpgid 57
+#define __NR_ulimit 58
+#define __NR_oldolduname 59
+#define __NR_umask 60
+#define __NR_chroot 61
+#define __NR_ustat 62
+#define __NR_dup2 63
+#define __NR_getppid 64
+#define __NR_getpgrp 65
+#define __NR_setsid 66
+#define __NR_sigaction 67
+#define __NR_sgetmask 68
+#define __NR_ssetmask 69
+#define __NR_setreuid 70
+#define __NR_setregid 71
+#define __NR_sigsuspend 72
+#define __NR_sigpending 73
+#define __NR_sethostname 74
+#define __NR_setrlimit 75
+#define __NR_getrlimit 76
+#define __NR_getrusage 77
+#define __NR_gettimeofday 78
+#define __NR_settimeofday 79
+#define __NR_getgroups 80
+#define __NR_setgroups 81
+#define __NR_select 82
+#define __NR_symlink 83
+#define __NR_oldlstat 84
+#define __NR_readlink 85
+#define __NR_uselib 86
+#define __NR_swapon 87
+#define __NR_reboot 88
+#define __NR_readdir 89
+#define __NR_mmap 90
+#define __NR_munmap 91
+#define __NR_truncate 92
+#define __NR_ftruncate 93
+#define __NR_fchmod 94
+#define __NR_fchown 95
+#define __NR_getpriority 96
+#define __NR_setpriority 97
+#define __NR_profil 98
+#define __NR_statfs 99
+#define __NR_fstatfs 100
+#define __NR_ioperm 101
+#define __NR_socketcall 102
+#define __NR_syslog 103
+#define __NR_setitimer 104
+#define __NR_getitimer 105
+#define __NR_stat 106
+#define __NR_lstat 107
+#define __NR_fstat 108
+#define __NR_olduname 109
+#define __NR_iopl 110
+#define __NR_vhangup 111
+#define __NR_idle 112
+#define __NR_vm86 113
+#define __NR_wait4 114
+#define __NR_swapoff 115
+#define __NR_sysinfo 116
+#define __NR_ipc 117
+#define __NR_fsync 118
+#define __NR_sigreturn 119
+#define __NR_clone 120
+#define __NR_setdomainname 121
+#define __NR_uname 122
+#define __NR_modify_ldt 123
+#define __NR_adjtimex 124
+#define __NR_mprotect 125
+#define __NR_sigprocmask 126
+#define __NR_create_module 127
+#define __NR_init_module 128
+#define __NR_delete_module 129
+#define __NR_get_kernel_syms 130
+#define __NR_quotactl 131
+#define __NR_getpgid 132
+#define __NR_fchdir 133
+#define __NR_bdflush 134
+#define __NR_sysfs 135
+#define __NR_personality 136
+#define __NR_afs_syscall 137
+#define __NR_setfsuid 138
+#define __NR_setfsgid 139
+#define __NR__llseek 140
+#define __NR_getdents 141
+#define __NR__newselect 142
+#define __NR_flock 143
+#define __NR_msync 144
+#define __NR_readv 145
+#define __NR_writev 146
+#define __NR_getsid 147
+#define __NR_fdatasync 148
+#define __NR__sysctl 149
+#define __NR_mlock 150
+#define __NR_munlock 151
+#define __NR_mlockall 152
+#define __NR_munlockall 153
+#define __NR_sched_setparam 154
+#define __NR_sched_getparam 155
+#define __NR_sched_setscheduler 156
+#define __NR_sched_getscheduler 157
+#define __NR_sched_yield 158
+#define __NR_sched_get_priority_max 159
+#define __NR_sched_get_priority_min 160
+#define __NR_sched_rr_get_interval 161
+#define __NR_nanosleep 162
+#define __NR_mremap 163
+#define __NR_setresuid 164
+#define __NR_getresuid 165
+#define __NR_query_module 166
+#define __NR_poll 167
+#define __NR_nfsservctl 168
+#define __NR_setresgid 169
+#define __NR_getresgid 170
+#define __NR_prctl 171
+#define __NR_rt_sigreturn 172
+#define __NR_rt_sigaction 173
+#define __NR_rt_sigprocmask 174
+#define __NR_rt_sigpending 175
+#define __NR_rt_sigtimedwait 176
+#define __NR_rt_sigqueueinfo 177
+#define __NR_rt_sigsuspend 178
+#define __NR_pread64 179
+#define __NR_pwrite64 180
+#define __NR_chown 181
+#define __NR_getcwd 182
+#define __NR_capget 183
+#define __NR_capset 184
+#define __NR_sigaltstack 185
+#define __NR_sendfile 186
+#define __NR_getpmsg 187
+#define __NR_putpmsg 188
+#define __NR_vfork 189
+#define __NR_ugetrlimit 190
+#define __NR_readahead 191
+#define __NR_pciconfig_read 198
+#define __NR_pciconfig_write 199
+#define __NR_pciconfig_iobase 200
+#define __NR_multiplexer 201
+#define __NR_getdents64 202
+#define __NR_pivot_root 203
+#define __NR_madvise 205
+#define __NR_mincore 206
+#define __NR_gettid 207
+#define __NR_tkill 208
+#define __NR_setxattr 209
+#define __NR_lsetxattr 210
+#define __NR_fsetxattr 211
+#define __NR_getxattr 212
+#define __NR_lgetxattr 213
+#define __NR_fgetxattr 214
+#define __NR_listxattr 215
+#define __NR_llistxattr 216
+#define __NR_flistxattr 217
+#define __NR_removexattr 218
+#define __NR_lremovexattr 219
+#define __NR_fremovexattr 220
+#define __NR_futex 221
+#define __NR_sched_setaffinity 222
+#define __NR_sched_getaffinity 223
+#define __NR_tuxcall 225
+#define __NR_io_setup 227
+#define __NR_io_destroy 228
+#define __NR_io_getevents 229
+#define __NR_io_submit 230
+#define __NR_io_cancel 231
+#define __NR_set_tid_address 232
+#define __NR_fadvise64 233
+#define __NR_exit_group 234
+#define __NR_lookup_dcookie 235
+#define __NR_epoll_create 236
+#define __NR_epoll_ctl 237
+#define __NR_epoll_wait 238
+#define __NR_remap_file_pages 239
+#define __NR_timer_create 240
+#define __NR_timer_settime 241
+#define __NR_timer_gettime 242
+#define __NR_timer_getoverrun 243
+#define __NR_timer_delete 244
+#define __NR_clock_settime 245
+#define __NR_clock_gettime 246
+#define __NR_clock_getres 247
+#define __NR_clock_nanosleep 248
+#define __NR_swapcontext 249
+#define __NR_tgkill 250
+#define __NR_utimes 251
+#define __NR_statfs64 252
+#define __NR_fstatfs64 253
+#define __NR_rtas 255
+#define __NR_sys_debug_setcontext 256
+#define __NR_migrate_pages 258
+#define __NR_mbind 259
+#define __NR_get_mempolicy 260
+#define __NR_set_mempolicy 261
+#define __NR_mq_open 262
+#define __NR_mq_unlink 263
+#define __NR_mq_timedsend 264
+#define __NR_mq_timedreceive 265
+#define __NR_mq_notify 266
+#define __NR_mq_getsetattr 267
+#define __NR_kexec_load 268
+#define __NR_add_key 269
+#define __NR_request_key 270
+#define __NR_keyctl 271
+#define __NR_waitid 272
+#define __NR_ioprio_set 273
+#define __NR_ioprio_get 274
+#define __NR_inotify_init 275
+#define __NR_inotify_add_watch 276
+#define __NR_inotify_rm_watch 277
+#define __NR_spu_run 278
+#define __NR_spu_create 279
+#define __NR_pselect6 280
+#define __NR_ppoll 281
+#define __NR_unshare 282
+#define __NR_splice 283
+#define __NR_tee 284
+#define __NR_vmsplice 285
+#define __NR_openat 286
+#define __NR_mkdirat 287
+#define __NR_mknodat 288
+#define __NR_fchownat 289
+#define __NR_futimesat 290
+#define __NR_newfstatat 291
+#define __NR_unlinkat 292
+#define __NR_renameat 293
+#define __NR_linkat 294
+#define __NR_symlinkat 295
+#define __NR_readlinkat 296
+#define __NR_fchmodat 297
+#define __NR_faccessat 298
+#define __NR_get_robust_list 299
+#define __NR_set_robust_list 300
+#define __NR_move_pages 301
+#define __NR_getcpu 302
+#define __NR_epoll_pwait 303
+#define __NR_utimensat 304
+#define __NR_signalfd 305
+#define __NR_timerfd_create 306
+#define __NR_eventfd 307
+#define __NR_sync_file_range2 308
+#define __NR_fallocate 309
+#define __NR_subpage_prot 310
+#define __NR_timerfd_settime 311
+#define __NR_timerfd_gettime 312
+#define __NR_signalfd4 313
+#define __NR_eventfd2 314
+#define __NR_epoll_create1 315
+#define __NR_dup3 316
+#define __NR_pipe2 317
+#define __NR_inotify_init1 318
+#define __NR_perf_event_open 319
+#define __NR_preadv 320
+#define __NR_pwritev 321
+#define __NR_rt_tgsigqueueinfo 322
+#define __NR_fanotify_init 323
+#define __NR_fanotify_mark 324
+#define __NR_prlimit64 325
+#define __NR_socket 326
+#define __NR_bind 327
+#define __NR_connect 328
+#define __NR_listen 329
+#define __NR_accept 330
+#define __NR_getsockname 331
+#define __NR_getpeername 332
+#define __NR_socketpair 333
+#define __NR_send 334
+#define __NR_sendto 335
+#define __NR_recv 336
+#define __NR_recvfrom 337
+#define __NR_shutdown 338
+#define __NR_setsockopt 339
+#define __NR_getsockopt 340
+#define __NR_sendmsg 341
+#define __NR_recvmsg 342
+#define __NR_recvmmsg 343
+#define __NR_accept4 344
+#define __NR_name_to_handle_at 345
+#define __NR_open_by_handle_at 346
+#define __NR_clock_adjtime 347
+#define __NR_syncfs 348
+#define __NR_sendmmsg 349
+#define __NR_setns 350
+#define __NR_process_vm_readv 351
+#define __NR_process_vm_writev 352
+#define __NR_finit_module 353
+#define __NR_kcmp 354
+#define __NR_sched_setattr 355
+#define __NR_sched_getattr 356
+#define __NR_renameat2 357
+#define __NR_seccomp 358
+#define __NR_getrandom 359
+#define __NR_memfd_create 360
+#define __NR_bpf 361
+#define __NR_execveat 362
+#define __NR_switch_endian 363
+#define __NR_userfaultfd 364
+#define __NR_membarrier 365
+#define __NR_mlock2 378
+#define __NR_copy_file_range 379
+#define __NR_preadv2 380
+#define __NR_pwritev2 381
+#define __NR_kexec_file_load 382
+#define __NR_statx 383
+#define __NR_pkey_alloc 384
+#define __NR_pkey_free 385
+#define __NR_pkey_mprotect 386
+#define __NR_rseq 387
+#define __NR_io_pgetevents 388
+#define __NR_semtimedop 392
+#define __NR_semget 393
+#define __NR_semctl 394
+#define __NR_shmget 395
+#define __NR_shmctl 396
+#define __NR_shmat 397
+#define __NR_shmdt 398
+#define __NR_msgget 399
+#define __NR_msgsnd 400
+#define __NR_msgrcv 401
+#define __NR_msgctl 402
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_clone3 435
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_epoll_pwait2 441
+#define __NR_mount_setattr 442
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_restrict_self 446
+
diff --git a/libc-top-half/musl/arch/powerpc64/bits/termios.h b/libc-top-half/musl/arch/powerpc64/bits/termios.h
new file mode 100644
index 0000000..da1f406
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/termios.h
@@ -0,0 +1,171 @@
+#undef NCCS
+#define NCCS 19
+struct termios {
+ tcflag_t c_iflag;
+ tcflag_t c_oflag;
+ tcflag_t c_cflag;
+ tcflag_t c_lflag;
+ cc_t c_cc[NCCS];
+ cc_t c_line;
+ speed_t __c_ispeed;
+ speed_t __c_ospeed;
+};
+
+#define VINTR 0
+#define VQUIT 1
+#define VERASE 2
+#define VKILL 3
+#define VEOF 4
+#define VMIN 5
+#define VEOL 6
+#define VTIME 7
+#define VEOL2 8
+#define VSWTC 9
+#define VWERASE 10
+#define VREPRINT 11
+#define VSUSP 12
+#define VSTART 13
+#define VSTOP 14
+#define VLNEXT 15
+#define VDISCARD 16
+
+#define IGNBRK 0000001
+#define BRKINT 0000002
+#define IGNPAR 0000004
+#define PARMRK 0000010
+#define INPCK 0000020
+#define ISTRIP 0000040
+#define INLCR 0000100
+#define IGNCR 0000200
+#define ICRNL 0000400
+#define IXON 0001000
+#define IXOFF 0002000
+#define IXANY 0004000
+#define IUCLC 0010000
+#define IMAXBEL 0020000
+#define IUTF8 0040000
+
+#define OPOST 0000001
+#define ONLCR 0000002
+#define OLCUC 0000004
+#define OCRNL 0000010
+#define ONOCR 0000020
+#define ONLRET 0000040
+#define OFILL 0000100
+#define OFDEL 0000200
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE)
+#define NLDLY 0001400
+#define NL0 0000000
+#define NL1 0000400
+#define NL2 0001000
+#define NL3 0001400
+#define TABDLY 0006000
+#define TAB0 0000000
+#define TAB1 0002000
+#define TAB2 0004000
+#define TAB3 0006000
+#define CRDLY 0030000
+#define CR0 0000000
+#define CR1 0010000
+#define CR2 0020000
+#define CR3 0030000
+#define FFDLY 0040000
+#define FF0 0000000
+#define FF1 0040000
+#define BSDLY 0100000
+#define BS0 0000000
+#define BS1 0100000
+#endif
+
+#define VTDLY 0200000
+#define VT0 0000000
+#define VT1 0200000
+
+#define B0 0000000
+#define B50 0000001
+#define B75 0000002
+#define B110 0000003
+#define B134 0000004
+#define B150 0000005
+#define B200 0000006
+#define B300 0000007
+#define B600 0000010
+#define B1200 0000011
+#define B1800 0000012
+#define B2400 0000013
+#define B4800 0000014
+#define B9600 0000015
+#define B19200 0000016
+#define B38400 0000017
+
+#define B57600 00020
+#define B115200 00021
+#define B230400 00022
+#define B460800 00023
+#define B500000 00024
+#define B576000 00025
+#define B921600 00026
+#define B1000000 00027
+#define B1152000 00030
+#define B1500000 00031
+#define B2000000 00032
+#define B2500000 00033
+#define B3000000 00034
+#define B3500000 00035
+#define B4000000 00036
+
+#define CSIZE 00001400
+#define CS5 00000000
+#define CS6 00000400
+#define CS7 00001000
+#define CS8 00001400
+#define CSTOPB 00002000
+#define CREAD 00004000
+#define PARENB 00010000
+#define PARODD 00020000
+#define HUPCL 00040000
+#define CLOCAL 00100000
+
+#define ECHOE 0x00000002
+#define ECHOK 0x00000004
+#define ECHO 0x00000008
+#define ECHONL 0x00000010
+#define ISIG 0x00000080
+#define ICANON 0x00000100
+#define IEXTEN 0x00000400
+#define TOSTOP 0x00400000
+#define NOFLSH 0x80000000
+
+#define TCOOFF 0
+#define TCOON 1
+#define TCIOFF 2
+#define TCION 3
+
+#define TCIFLUSH 0
+#define TCOFLUSH 1
+#define TCIOFLUSH 2
+
+#define TCSANOW 0
+#define TCSADRAIN 1
+#define TCSAFLUSH 2
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define EXTA 0000016
+#define EXTB 0000017
+#define CBAUD 00377
+#define CBAUDEX 0000020
+#define CIBAUD 077600000
+#define CMSPAR 010000000000
+#define CRTSCTS 020000000000
+
+#define XCASE 0x00004000
+#define ECHOCTL 0x00000040
+#define ECHOPRT 0x00000020
+#define ECHOKE 0x00000001
+#define FLUSHO 0x00800000
+#define PENDIN 0x20000000
+#define EXTPROC 0x10000000
+
+#define XTABS 00006000
+#define TIOCSER_TEMT 1
+#endif
diff --git a/libc-top-half/musl/arch/powerpc64/bits/user.h b/libc-top-half/musl/arch/powerpc64/bits/user.h
new file mode 100644
index 0000000..7e75d20
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/bits/user.h
@@ -0,0 +1,23 @@
+struct user {
+ struct {
+ unsigned long gpr[32], nip, msr, orig_gpr3, ctr, link, xer, ccr, softe;
+ unsigned long trap, dar, dsisr, result;
+ } regs;
+ unsigned long u_tsize, u_dsize, u_ssize;
+ unsigned long start_code, start_data, start_stack;
+ long signal;
+ void *u_ar0;
+ unsigned long magic;
+ char u_comm[32];
+};
+
+#define ELF_NGREG 48
+#define ELF_NFPREG 33
+#define ELF_NVRREG 34
+typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG];
+typedef double elf_fpreg_t, elf_fpregset_t[ELF_NFPREG];
+typedef struct { unsigned u[4]; }
+#ifdef __GNUC__
+__attribute__((__aligned__(16)))
+#endif
+ elf_vrreg_t, elf_vrregset_t[ELF_NVRREG];
diff --git a/libc-top-half/musl/arch/powerpc64/crt_arch.h b/libc-top-half/musl/arch/powerpc64/crt_arch.h
new file mode 100644
index 0000000..168669a
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/crt_arch.h
@@ -0,0 +1,19 @@
+__asm__(
+".text \n"
+".global " START " \n"
+".type " START ", %function \n"
+START ": \n"
+" addis 2, 12, .TOC.-" START "@ha \n"
+" addi 2, 2, .TOC.-" START "@l \n"
+" lwz 4, 1f-" START "(12)\n"
+" add 4, 4, 12 \n"
+" mr 3, 1 \n"
+" clrrdi 1, 1, 4 \n"
+" li 0, 0 \n"
+" stdu 0, -32(1) \n"
+" mtlr 0 \n"
+" bl " START "_c \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+"1: .long _DYNAMIC-" START "\n"
+);
diff --git a/libc-top-half/musl/arch/powerpc64/kstat.h b/libc-top-half/musl/arch/powerpc64/kstat.h
new file mode 100644
index 0000000..887b3e2
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/kstat.h
@@ -0,0 +1,19 @@
+struct kstat {
+ dev_t st_dev;
+ ino_t st_ino;
+ nlink_t st_nlink;
+ mode_t st_mode;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ unsigned long __unused[3];
+};
diff --git a/libc-top-half/musl/arch/powerpc64/pthread_arch.h b/libc-top-half/musl/arch/powerpc64/pthread_arch.h
new file mode 100644
index 0000000..1b7b907
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/pthread_arch.h
@@ -0,0 +1,16 @@
+static inline uintptr_t __get_tp()
+{
+ register uintptr_t tp __asm__("r13");
+ __asm__ ("" : "=r" (tp) );
+ return tp;
+}
+
+#define TLS_ABOVE_TP
+#define GAP_ABOVE_TP 0
+
+#define TP_OFFSET 0x7000
+#define DTP_OFFSET 0x8000
+
+// the kernel calls the ip "nip", it's the first saved value after the 32
+// GPRs.
+#define MC_PC gp_regs[32]
diff --git a/libc-top-half/musl/arch/powerpc64/reloc.h b/libc-top-half/musl/arch/powerpc64/reloc.h
new file mode 100644
index 0000000..2f1bba0
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/reloc.h
@@ -0,0 +1,31 @@
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define ENDIAN_SUFFIX "le"
+#else
+#define ENDIAN_SUFFIX ""
+#endif
+
+#define LDSO_ARCH "powerpc64" ENDIAN_SUFFIX
+
+#define TPOFF_K (-0x7000)
+
+#define REL_SYMBOLIC R_PPC64_ADDR64
+#define REL_USYMBOLIC R_PPC64_UADDR64
+#define REL_GOT R_PPC64_GLOB_DAT
+#define REL_PLT R_PPC64_JMP_SLOT
+#define REL_RELATIVE R_PPC64_RELATIVE
+#define REL_COPY R_PPC64_COPY
+#define REL_DTPMOD R_PPC64_DTPMOD64
+#define REL_DTPOFF R_PPC64_DTPREL64
+#define REL_TPOFF R_PPC64_TPREL64
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "mr 1,%1; mr 12,%0; mtctr 12; bctrl" : : "r"(pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+ ".hidden " #sym " \n" \
+ " bl 1f \n" \
+ " .long " #sym "-. \n" \
+ "1: mflr %1 \n" \
+ " lwa %0, 0(%1) \n" \
+ " add %0, %0, %1 \n" \
+ : "=r"(*(fp)), "=r"((long){0}) : : "memory", "lr" )
diff --git a/libc-top-half/musl/arch/powerpc64/syscall_arch.h b/libc-top-half/musl/arch/powerpc64/syscall_arch.h
new file mode 100644
index 0000000..76b4e33
--- /dev/null
+++ b/libc-top-half/musl/arch/powerpc64/syscall_arch.h
@@ -0,0 +1,90 @@
+#define __SYSCALL_LL_E(x) (x)
+#define __SYSCALL_LL_O(x) (x)
+
+static inline long __syscall0(long n)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3");
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "=r"(r3)
+ :: "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3") = a;
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "+r"(r3)
+ :: "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3") = a;
+ register long r4 __asm__("r4") = b;
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "+r"(r3), "+r"(r4)
+ :: "memory", "cr0", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3") = a;
+ register long r4 __asm__("r4") = b;
+ register long r5 __asm__("r5") = c;
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "+r"(r3), "+r"(r4), "+r"(r5)
+ :: "memory", "cr0", "r6", "r7", "r8", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3") = a;
+ register long r4 __asm__("r4") = b;
+ register long r5 __asm__("r5") = c;
+ register long r6 __asm__("r6") = d;
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "+r"(r3), "+r"(r4), "+r"(r5), "+r"(r6)
+ :: "memory", "cr0", "r7", "r8", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3") = a;
+ register long r4 __asm__("r4") = b;
+ register long r5 __asm__("r5") = c;
+ register long r6 __asm__("r6") = d;
+ register long r7 __asm__("r7") = e;
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "+r"(r3), "+r"(r4), "+r"(r5), "+r"(r6), "+r"(r7)
+ :: "memory", "cr0", "r8", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register long r0 __asm__("r0") = n;
+ register long r3 __asm__("r3") = a;
+ register long r4 __asm__("r4") = b;
+ register long r5 __asm__("r5") = c;
+ register long r6 __asm__("r6") = d;
+ register long r7 __asm__("r7") = e;
+ register long r8 __asm__("r8") = f;
+ __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:"
+ : "+r"(r0), "+r"(r3), "+r"(r4), "+r"(r5), "+r"(r6), "+r"(r7), "+r"(r8)
+ :: "memory", "cr0", "r9", "r10", "r11", "r12");
+ return r3;
+}
+
+#define SO_RCVTIMEO_OLD 18
+#define SO_SNDTIMEO_OLD 19
diff --git a/libc-top-half/musl/arch/riscv64/atomic_arch.h b/libc-top-half/musl/arch/riscv64/atomic_arch.h
new file mode 100644
index 0000000..0c38258
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/atomic_arch.h
@@ -0,0 +1,38 @@
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ __asm__ __volatile__ ("fence rw,rw" : : : "memory");
+}
+
+#define a_cas a_cas
+static inline int a_cas(volatile int *p, int t, int s)
+{
+ int old, tmp;
+ __asm__ __volatile__ (
+ "\n1: lr.w.aqrl %0, (%2)\n"
+ " bne %0, %3, 1f\n"
+ " sc.w.aqrl %1, %4, (%2)\n"
+ " bnez %1, 1b\n"
+ "1:"
+ : "=&r"(old), "=&r"(tmp)
+ : "r"(p), "r"((long)t), "r"((long)s)
+ : "memory");
+ return old;
+}
+
+#define a_cas_p a_cas_p
+static inline void *a_cas_p(volatile void *p, void *t, void *s)
+{
+ void *old;
+ int tmp;
+ __asm__ __volatile__ (
+ "\n1: lr.d.aqrl %0, (%2)\n"
+ " bne %0, %3, 1f\n"
+ " sc.d.aqrl %1, %4, (%2)\n"
+ " bnez %1, 1b\n"
+ "1:"
+ : "=&r"(old), "=&r"(tmp)
+ : "r"(p), "r"(t), "r"(s)
+ : "memory");
+ return old;
+}
diff --git a/libc-top-half/musl/arch/riscv64/bits/alltypes.h.in b/libc-top-half/musl/arch/riscv64/bits/alltypes.h.in
new file mode 100644
index 0000000..4579d17
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/bits/alltypes.h.in
@@ -0,0 +1,18 @@
+#define _Addr long
+#define _Int64 long
+#define _Reg long
+
+#define __BYTE_ORDER 1234
+#define __LONG_MAX 0x7fffffffffffffffL
+
+#ifndef __cplusplus
+TYPEDEF int wchar_t;
+#endif
+
+TYPEDEF int blksize_t;
+TYPEDEF unsigned int nlink_t;
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/riscv64/bits/fenv.h b/libc-top-half/musl/arch/riscv64/bits/fenv.h
new file mode 100644
index 0000000..806ec40
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/bits/fenv.h
@@ -0,0 +1,17 @@
+#define FE_INVALID 16
+#define FE_DIVBYZERO 8
+#define FE_OVERFLOW 4
+#define FE_UNDERFLOW 2
+#define FE_INEXACT 1
+
+#define FE_ALL_EXCEPT 31
+
+#define FE_TONEAREST 0
+#define FE_DOWNWARD 2
+#define FE_UPWARD 3
+#define FE_TOWARDZERO 1
+
+typedef unsigned int fexcept_t;
+typedef unsigned int fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *) -1)
diff --git a/libc-top-half/musl/arch/riscv64/bits/float.h b/libc-top-half/musl/arch/riscv64/bits/float.h
new file mode 100644
index 0000000..719c790
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L
+#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
+#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L
+#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L
+
+#define LDBL_MANT_DIG 113
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_MAX_EXP 16384
+
+#define LDBL_DIG 33
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MAX_10_EXP 4932
+
+#define DECIMAL_DIG 36
diff --git a/libc-top-half/musl/arch/riscv64/bits/posix.h b/libc-top-half/musl/arch/riscv64/bits/posix.h
new file mode 100644
index 0000000..8068ce9
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_LP64_OFF64 1
+#define _POSIX_V7_LP64_OFF64 1
diff --git a/libc-top-half/musl/arch/riscv64/bits/reg.h b/libc-top-half/musl/arch/riscv64/bits/reg.h
new file mode 100644
index 0000000..2633f39
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/bits/reg.h
@@ -0,0 +1,2 @@
+#undef __WORDSIZE
+#define __WORDSIZE 64
diff --git a/libc-top-half/musl/arch/riscv64/bits/setjmp.h b/libc-top-half/musl/arch/riscv64/bits/setjmp.h
new file mode 100644
index 0000000..ad7e401
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long __jmp_buf[26];
diff --git a/libc-top-half/musl/arch/riscv64/bits/signal.h b/libc-top-half/musl/arch/riscv64/bits/signal.h
new file mode 100644
index 0000000..287367d
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/bits/signal.h
@@ -0,0 +1,118 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+# define MINSIGSTKSZ 2048
+# define SIGSTKSZ 8192
+#endif
+
+typedef unsigned long __riscv_mc_gp_state[32];
+
+struct __riscv_mc_f_ext_state {
+ unsigned int __f[32];
+ unsigned int __fcsr;
+};
+
+struct __riscv_mc_d_ext_state {
+ unsigned long long __f[32];
+ unsigned int __fcsr;
+};
+
+struct __riscv_mc_q_ext_state {
+ unsigned long long __f[64] __attribute__((aligned(16)));
+ unsigned int __fcsr;
+ unsigned int __reserved[3];
+};
+
+union __riscv_mc_fp_state {
+ struct __riscv_mc_f_ext_state __f;
+ struct __riscv_mc_d_ext_state __d;
+ struct __riscv_mc_q_ext_state __q;
+};
+
+typedef struct mcontext_t {
+ __riscv_mc_gp_state __gregs;
+ union __riscv_mc_fp_state __fpregs;
+} mcontext_t;
+
+#if defined(_GNU_SOURCE)
+#define REG_PC 0
+#define REG_RA 1
+#define REG_SP 2
+#define REG_TP 4
+#define REG_S0 8
+#define REG_A0 10
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef unsigned long greg_t;
+typedef unsigned long gregset_t[32];
+typedef union __riscv_mc_fp_state fpregset_t;
+struct sigcontext {
+ gregset_t gregs;
+ fpregset_t fpregs;
+};
+#endif
+
+struct sigaltstack {
+ void *ss_sp;
+ int ss_flags;
+ size_t ss_size;
+};
+
+typedef struct __ucontext
+{
+ unsigned long uc_flags;
+ struct __ucontext *uc_link;
+ stack_t uc_stack;
+ sigset_t uc_sigmask;
+ mcontext_t uc_mcontext;
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 2
+#define SA_SIGINFO 4
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL SIGIO
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
diff --git a/libc-top-half/musl/arch/riscv64/bits/stat.h b/libc-top-half/musl/arch/riscv64/bits/stat.h
new file mode 100644
index 0000000..b7f4221
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/bits/stat.h
@@ -0,0 +1,18 @@
+struct stat {
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ unsigned long __pad;
+ off_t st_size;
+ blksize_t st_blksize;
+ int __pad2;
+ blkcnt_t st_blocks;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+ unsigned __unused[2];
+};
diff --git a/libc-top-half/musl/arch/riscv64/bits/stdint.h b/libc-top-half/musl/arch/riscv64/bits/stdint.h
new file mode 100644
index 0000000..1bb147f
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#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
diff --git a/libc-top-half/musl/arch/riscv64/bits/syscall.h.in b/libc-top-half/musl/arch/riscv64/bits/syscall.h.in
new file mode 100644
index 0000000..b534afe
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/bits/syscall.h.in
@@ -0,0 +1,304 @@
+#define __NR_io_setup 0
+#define __NR_io_destroy 1
+#define __NR_io_submit 2
+#define __NR_io_cancel 3
+#define __NR_io_getevents 4
+#define __NR_setxattr 5
+#define __NR_lsetxattr 6
+#define __NR_fsetxattr 7
+#define __NR_getxattr 8
+#define __NR_lgetxattr 9
+#define __NR_fgetxattr 10
+#define __NR_listxattr 11
+#define __NR_llistxattr 12
+#define __NR_flistxattr 13
+#define __NR_removexattr 14
+#define __NR_lremovexattr 15
+#define __NR_fremovexattr 16
+#define __NR_getcwd 17
+#define __NR_lookup_dcookie 18
+#define __NR_eventfd2 19
+#define __NR_epoll_create1 20
+#define __NR_epoll_ctl 21
+#define __NR_epoll_pwait 22
+#define __NR_dup 23
+#define __NR_dup3 24
+#define __NR_fcntl 25
+#define __NR_inotify_init1 26
+#define __NR_inotify_add_watch 27
+#define __NR_inotify_rm_watch 28
+#define __NR_ioctl 29
+#define __NR_ioprio_set 30
+#define __NR_ioprio_get 31
+#define __NR_flock 32
+#define __NR_mknodat 33
+#define __NR_mkdirat 34
+#define __NR_unlinkat 35
+#define __NR_symlinkat 36
+#define __NR_linkat 37
+#define __NR_umount2 39
+#define __NR_mount 40
+#define __NR_pivot_root 41
+#define __NR_nfsservctl 42
+#define __NR_statfs 43
+#define __NR_fstatfs 44
+#define __NR_truncate 45
+#define __NR_ftruncate 46
+#define __NR_fallocate 47
+#define __NR_faccessat 48
+#define __NR_chdir 49
+#define __NR_fchdir 50
+#define __NR_chroot 51
+#define __NR_fchmod 52
+#define __NR_fchmodat 53
+#define __NR_fchownat 54
+#define __NR_fchown 55
+#define __NR_openat 56
+#define __NR_close 57
+#define __NR_vhangup 58
+#define __NR_pipe2 59
+#define __NR_quotactl 60
+#define __NR_getdents64 61
+#define __NR_lseek 62
+#define __NR_read 63
+#define __NR_write 64
+#define __NR_readv 65
+#define __NR_writev 66
+#define __NR_pread64 67
+#define __NR_pwrite64 68
+#define __NR_preadv 69
+#define __NR_pwritev 70
+#define __NR_sendfile 71
+#define __NR_pselect6 72
+#define __NR_ppoll 73
+#define __NR_signalfd4 74
+#define __NR_vmsplice 75
+#define __NR_splice 76
+#define __NR_tee 77
+#define __NR_readlinkat 78
+#define __NR_newfstatat 79
+#define __NR_fstat 80
+#define __NR_sync 81
+#define __NR_fsync 82
+#define __NR_fdatasync 83
+#define __NR_sync_file_range 84
+#define __NR_timerfd_create 85
+#define __NR_timerfd_settime 86
+#define __NR_timerfd_gettime 87
+#define __NR_utimensat 88
+#define __NR_acct 89
+#define __NR_capget 90
+#define __NR_capset 91
+#define __NR_personality 92
+#define __NR_exit 93
+#define __NR_exit_group 94
+#define __NR_waitid 95
+#define __NR_set_tid_address 96
+#define __NR_unshare 97
+#define __NR_futex 98
+#define __NR_set_robust_list 99
+#define __NR_get_robust_list 100
+#define __NR_nanosleep 101
+#define __NR_getitimer 102
+#define __NR_setitimer 103
+#define __NR_kexec_load 104
+#define __NR_init_module 105
+#define __NR_delete_module 106
+#define __NR_timer_create 107
+#define __NR_timer_gettime 108
+#define __NR_timer_getoverrun 109
+#define __NR_timer_settime 110
+#define __NR_timer_delete 111
+#define __NR_clock_settime 112
+#define __NR_clock_gettime 113
+#define __NR_clock_getres 114
+#define __NR_clock_nanosleep 115
+#define __NR_syslog 116
+#define __NR_ptrace 117
+#define __NR_sched_setparam 118
+#define __NR_sched_setscheduler 119
+#define __NR_sched_getscheduler 120
+#define __NR_sched_getparam 121
+#define __NR_sched_setaffinity 122
+#define __NR_sched_getaffinity 123
+#define __NR_sched_yield 124
+#define __NR_sched_get_priority_max 125
+#define __NR_sched_get_priority_min 126
+#define __NR_sched_rr_get_interval 127
+#define __NR_restart_syscall 128
+#define __NR_kill 129
+#define __NR_tkill 130
+#define __NR_tgkill 131
+#define __NR_sigaltstack 132
+#define __NR_rt_sigsuspend 133
+#define __NR_rt_sigaction 134
+#define __NR_rt_sigprocmask 135
+#define __NR_rt_sigpending 136
+#define __NR_rt_sigtimedwait 137
+#define __NR_rt_sigqueueinfo 138
+#define __NR_rt_sigreturn 139
+#define __NR_setpriority 140
+#define __NR_getpriority 141
+#define __NR_reboot 142
+#define __NR_setregid 143
+#define __NR_setgid 144
+#define __NR_setreuid 145
+#define __NR_setuid 146
+#define __NR_setresuid 147
+#define __NR_getresuid 148
+#define __NR_setresgid 149
+#define __NR_getresgid 150
+#define __NR_setfsuid 151
+#define __NR_setfsgid 152
+#define __NR_times 153
+#define __NR_setpgid 154
+#define __NR_getpgid 155
+#define __NR_getsid 156
+#define __NR_setsid 157
+#define __NR_getgroups 158
+#define __NR_setgroups 159
+#define __NR_uname 160
+#define __NR_sethostname 161
+#define __NR_setdomainname 162
+#define __NR_getrlimit 163
+#define __NR_setrlimit 164
+#define __NR_getrusage 165
+#define __NR_umask 166
+#define __NR_prctl 167
+#define __NR_getcpu 168
+#define __NR_gettimeofday 169
+#define __NR_settimeofday 170
+#define __NR_adjtimex 171
+#define __NR_getpid 172
+#define __NR_getppid 173
+#define __NR_getuid 174
+#define __NR_geteuid 175
+#define __NR_getgid 176
+#define __NR_getegid 177
+#define __NR_gettid 178
+#define __NR_sysinfo 179
+#define __NR_mq_open 180
+#define __NR_mq_unlink 181
+#define __NR_mq_timedsend 182
+#define __NR_mq_timedreceive 183
+#define __NR_mq_notify 184
+#define __NR_mq_getsetattr 185
+#define __NR_msgget 186
+#define __NR_msgctl 187
+#define __NR_msgrcv 188
+#define __NR_msgsnd 189
+#define __NR_semget 190
+#define __NR_semctl 191
+#define __NR_semtimedop 192
+#define __NR_semop 193
+#define __NR_shmget 194
+#define __NR_shmctl 195
+#define __NR_shmat 196
+#define __NR_shmdt 197
+#define __NR_socket 198
+#define __NR_socketpair 199
+#define __NR_bind 200
+#define __NR_listen 201
+#define __NR_accept 202
+#define __NR_connect 203
+#define __NR_getsockname 204
+#define __NR_getpeername 205
+#define __NR_sendto 206
+#define __NR_recvfrom 207
+#define __NR_setsockopt 208
+#define __NR_getsockopt 209
+#define __NR_shutdown 210
+#define __NR_sendmsg 211
+#define __NR_recvmsg 212
+#define __NR_readahead 213
+#define __NR_brk 214
+#define __NR_munmap 215
+#define __NR_mremap 216
+#define __NR_add_key 217
+#define __NR_request_key 218
+#define __NR_keyctl 219
+#define __NR_clone 220
+#define __NR_execve 221
+#define __NR_mmap 222
+#define __NR_fadvise64 223
+#define __NR_swapon 224
+#define __NR_swapoff 225
+#define __NR_mprotect 226
+#define __NR_msync 227
+#define __NR_mlock 228
+#define __NR_munlock 229
+#define __NR_mlockall 230
+#define __NR_munlockall 231
+#define __NR_mincore 232
+#define __NR_madvise 233
+#define __NR_remap_file_pages 234
+#define __NR_mbind 235
+#define __NR_get_mempolicy 236
+#define __NR_set_mempolicy 237
+#define __NR_migrate_pages 238
+#define __NR_move_pages 239
+#define __NR_rt_tgsigqueueinfo 240
+#define __NR_perf_event_open 241
+#define __NR_accept4 242
+#define __NR_recvmmsg 243
+#define __NR_arch_specific_syscall 244
+#define __NR_wait4 260
+#define __NR_prlimit64 261
+#define __NR_fanotify_init 262
+#define __NR_fanotify_mark 263
+#define __NR_name_to_handle_at 264
+#define __NR_open_by_handle_at 265
+#define __NR_clock_adjtime 266
+#define __NR_syncfs 267
+#define __NR_setns 268
+#define __NR_sendmmsg 269
+#define __NR_process_vm_readv 270
+#define __NR_process_vm_writev 271
+#define __NR_kcmp 272
+#define __NR_finit_module 273
+#define __NR_sched_setattr 274
+#define __NR_sched_getattr 275
+#define __NR_renameat2 276
+#define __NR_seccomp 277
+#define __NR_getrandom 278
+#define __NR_memfd_create 279
+#define __NR_bpf 280
+#define __NR_execveat 281
+#define __NR_userfaultfd 282
+#define __NR_membarrier 283
+#define __NR_mlock2 284
+#define __NR_copy_file_range 285
+#define __NR_preadv2 286
+#define __NR_pwritev2 287
+#define __NR_pkey_mprotect 288
+#define __NR_pkey_alloc 289
+#define __NR_pkey_free 290
+#define __NR_statx 291
+#define __NR_io_pgetevents 292
+#define __NR_rseq 293
+#define __NR_kexec_file_load 294
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_clone3 435
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_epoll_pwait2 441
+#define __NR_mount_setattr 442
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_restrict_self 446
+
+#define __NR_sysriscv __NR_arch_specific_syscall
+#define __NR_riscv_flush_icache (__NR_sysriscv + 15)
diff --git a/libc-top-half/musl/arch/riscv64/bits/user.h b/libc-top-half/musl/arch/riscv64/bits/user.h
new file mode 100644
index 0000000..0d37de0
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/bits/user.h
@@ -0,0 +1,6 @@
+#include <signal.h>
+
+#define ELF_NGREG 32
+#define ELF_NFPREG 33
+typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG];
+typedef union __riscv_mc_fp_state elf_fpregset_t;
diff --git a/libc-top-half/musl/arch/riscv64/crt_arch.h b/libc-top-half/musl/arch/riscv64/crt_arch.h
new file mode 100644
index 0000000..6b93fcf
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/crt_arch.h
@@ -0,0 +1,19 @@
+__asm__(
+".section .sdata,\"aw\"\n"
+".text\n"
+".global " START "\n"
+".type " START ",%function\n"
+START ":\n"
+".weak __global_pointer$\n"
+".hidden __global_pointer$\n"
+".option push\n"
+".option norelax\n\t"
+"lla gp, __global_pointer$\n"
+".option pop\n\t"
+"mv a0, sp\n"
+".weak _DYNAMIC\n"
+".hidden _DYNAMIC\n\t"
+"lla a1, _DYNAMIC\n\t"
+"andi sp, sp, -16\n\t"
+"tail " START "_c"
+);
diff --git a/libc-top-half/musl/arch/riscv64/kstat.h b/libc-top-half/musl/arch/riscv64/kstat.h
new file mode 100644
index 0000000..92625f3
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/kstat.h
@@ -0,0 +1,21 @@
+struct kstat {
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ unsigned long __pad;
+ off_t st_size;
+ blksize_t st_blksize;
+ int __pad2;
+ blkcnt_t st_blocks;
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ unsigned __unused[2];
+};
diff --git a/libc-top-half/musl/arch/riscv64/pthread_arch.h b/libc-top-half/musl/arch/riscv64/pthread_arch.h
new file mode 100644
index 0000000..a20d7fb
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/pthread_arch.h
@@ -0,0 +1,13 @@
+static inline uintptr_t __get_tp()
+{
+ uintptr_t tp;
+ __asm__ __volatile__("mv %0, tp" : "=r"(tp));
+ return tp;
+}
+
+#define TLS_ABOVE_TP
+#define GAP_ABOVE_TP 0
+
+#define DTP_OFFSET 0x800
+
+#define MC_PC __gregs[0]
diff --git a/libc-top-half/musl/arch/riscv64/reloc.h b/libc-top-half/musl/arch/riscv64/reloc.h
new file mode 100644
index 0000000..1ca1381
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/reloc.h
@@ -0,0 +1,22 @@
+#if defined __riscv_float_abi_soft
+#define RISCV_FP_SUFFIX "-sf"
+#elif defined __riscv_float_abi_single
+#define RISCV_FP_SUFFIX "-sp"
+#elif defined __riscv_float_abi_double
+#define RISCV_FP_SUFFIX ""
+#endif
+
+#define LDSO_ARCH "riscv64" RISCV_FP_SUFFIX
+
+#define TPOFF_K 0
+
+#define REL_SYMBOLIC R_RISCV_64
+#define REL_PLT R_RISCV_JUMP_SLOT
+#define REL_RELATIVE R_RISCV_RELATIVE
+#define REL_COPY R_RISCV_COPY
+#define REL_DTPMOD R_RISCV_TLS_DTPMOD64
+#define REL_DTPOFF R_RISCV_TLS_DTPREL64
+#define REL_TPOFF R_RISCV_TLS_TPREL64
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "mv sp, %1 ; jr %0" : : "r"(pc), "r"(sp) : "memory" )
diff --git a/libc-top-half/musl/arch/riscv64/syscall_arch.h b/libc-top-half/musl/arch/riscv64/syscall_arch.h
new file mode 100644
index 0000000..7fd042c
--- /dev/null
+++ b/libc-top-half/musl/arch/riscv64/syscall_arch.h
@@ -0,0 +1,78 @@
+#define __SYSCALL_LL_E(x) (x)
+#define __SYSCALL_LL_O(x) (x)
+
+#define __asm_syscall(...) \
+ __asm__ __volatile__ ("ecall\n\t" \
+ : "=r"(a0) : __VA_ARGS__ : "memory"); \
+ return a0; \
+
+static inline long __syscall0(long n)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0");
+ __asm_syscall("r"(a7))
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0") = a;
+ __asm_syscall("r"(a7), "0"(a0))
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0") = a;
+ register long a1 __asm__("a1") = b;
+ __asm_syscall("r"(a7), "0"(a0), "r"(a1))
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0") = a;
+ register long a1 __asm__("a1") = b;
+ register long a2 __asm__("a2") = c;
+ __asm_syscall("r"(a7), "0"(a0), "r"(a1), "r"(a2))
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0") = a;
+ register long a1 __asm__("a1") = b;
+ register long a2 __asm__("a2") = c;
+ register long a3 __asm__("a3") = d;
+ __asm_syscall("r"(a7), "0"(a0), "r"(a1), "r"(a2), "r"(a3))
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0") = a;
+ register long a1 __asm__("a1") = b;
+ register long a2 __asm__("a2") = c;
+ register long a3 __asm__("a3") = d;
+ register long a4 __asm__("a4") = e;
+ __asm_syscall("r"(a7), "0"(a0), "r"(a1), "r"(a2), "r"(a3), "r"(a4))
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0") = a;
+ register long a1 __asm__("a1") = b;
+ register long a2 __asm__("a2") = c;
+ register long a3 __asm__("a3") = d;
+ register long a4 __asm__("a4") = e;
+ register long a5 __asm__("a5") = f;
+ __asm_syscall("r"(a7), "0"(a0), "r"(a1), "r"(a2), "r"(a3), "r"(a4), "r"(a5))
+}
+
+#define VDSO_USEFUL
+/* We don't have a clock_gettime function.
+#define VDSO_CGT_SYM "__vdso_clock_gettime"
+#define VDSO_CGT_VER "LINUX_2.6" */
+
+#define IPC_64 0
diff --git a/libc-top-half/musl/arch/s390x/atomic_arch.h b/libc-top-half/musl/arch/s390x/atomic_arch.h
new file mode 100644
index 0000000..9b0e1df
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/atomic_arch.h
@@ -0,0 +1,30 @@
+#define a_cas a_cas
+static inline int a_cas(volatile int *p, int t, int s)
+{
+ __asm__ __volatile__ (
+ "cs %0, %2, %1"
+ : "+d"(t), "+Q"(*p) : "d"(s) : "memory", "cc");
+ return t;
+}
+
+#define a_cas_p a_cas_p
+static inline void *a_cas_p(volatile void *p, void *t, void *s)
+{
+ __asm__ __volatile__ (
+ "csg %0, %2, %1"
+ : "+d"(t), "+Q"(*(void *volatile *)p) : "d"(s)
+ : "memory", "cc");
+ return t;
+}
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ __asm__ __volatile__ ("bcr 15,0" : : : "memory");
+}
+
+#define a_crash a_crash
+static inline void a_crash()
+{
+ __asm__ __volatile__ (".insn e,0");
+}
diff --git a/libc-top-half/musl/arch/s390x/bits/alltypes.h.in b/libc-top-half/musl/arch/s390x/bits/alltypes.h.in
new file mode 100644
index 0000000..6c0eb7f
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/alltypes.h.in
@@ -0,0 +1,19 @@
+#define _Addr long
+#define _Int64 long
+#define _Reg long
+
+#define __BYTE_ORDER 4321
+#define __LONG_MAX 0x7fffffffffffffffL
+
+#ifndef __cplusplus
+TYPEDEF int wchar_t;
+#endif
+
+#if defined(__FLT_EVAL_METHOD__) && __FLT_EVAL_METHOD__ == 1
+TYPEDEF double float_t;
+#else
+TYPEDEF float float_t;
+#endif
+TYPEDEF double double_t;
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/s390x/bits/fcntl.h b/libc-top-half/musl/arch/s390x/bits/fcntl.h
new file mode 100644
index 0000000..a231efb
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/fcntl.h
@@ -0,0 +1,43 @@
+#define O_CREAT 0100
+#define O_EXCL 0200
+#define O_NOCTTY 0400
+#define O_TRUNC 01000
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_DSYNC 010000
+#define O_SYNC 04010000
+#define O_RSYNC 04010000
+#define O_DIRECTORY 0200000
+#define O_NOFOLLOW 0400000
+#define O_CLOEXEC 02000000
+
+#define O_ASYNC 020000
+#define O_DIRECT 040000
+#define O_LARGEFILE 0100000
+#define O_NOATIME 01000000
+#define O_PATH 010000000
+#define O_TMPFILE 020200000
+#define O_NDELAY O_NONBLOCK
+
+#define F_DUPFD 0
+#define F_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+
+#define F_GETLK 5
+#define F_SETLK 6
+#define F_SETLKW 7
+
+#define F_SETOWN 8
+#define F_GETOWN 9
+#define F_SETSIG 10
+#define F_GETSIG 11
+
+#define F_SETOWN_EX 15
+#define F_GETOWN_EX 16
+
+#define F_GETOWNER_UIDS 17
+
+#define POSIX_FADV_DONTNEED 6
+#define POSIX_FADV_NOREUSE 7
diff --git a/libc-top-half/musl/arch/s390x/bits/fenv.h b/libc-top-half/musl/arch/s390x/bits/fenv.h
new file mode 100644
index 0000000..773dad9
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/fenv.h
@@ -0,0 +1,17 @@
+#define FE_TONEAREST 0
+#define FE_TOWARDZERO 1
+#define FE_UPWARD 2
+#define FE_DOWNWARD 3
+
+#define FE_INEXACT 0x00080000
+#define FE_UNDERFLOW 0x00100000
+#define FE_OVERFLOW 0x00200000
+#define FE_DIVBYZERO 0x00400000
+#define FE_INVALID 0x00800000
+
+#define FE_ALL_EXCEPT 0x00f80000
+
+typedef unsigned fexcept_t;
+typedef unsigned fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *)-1)
diff --git a/libc-top-half/musl/arch/s390x/bits/float.h b/libc-top-half/musl/arch/s390x/bits/float.h
new file mode 100644
index 0000000..e188cb6
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/float.h
@@ -0,0 +1,20 @@
+#ifdef __FLT_EVAL_METHOD__
+#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
+#else
+#define FLT_EVAL_METHOD 0
+#endif
+
+#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L
+#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
+#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L
+#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L
+
+#define LDBL_MANT_DIG 113
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_MAX_EXP 16384
+
+#define LDBL_DIG 33
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MAX_10_EXP 4932
+
+#define DECIMAL_DIG 36
diff --git a/libc-top-half/musl/arch/s390x/bits/hwcap.h b/libc-top-half/musl/arch/s390x/bits/hwcap.h
new file mode 100644
index 0000000..ecc6ce1
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/hwcap.h
@@ -0,0 +1,15 @@
+#define HWCAP_S390_ESAN3 1
+#define HWCAP_S390_ZARCH 2
+#define HWCAP_S390_STFLE 4
+#define HWCAP_S390_MSA 8
+#define HWCAP_S390_LDISP 16
+#define HWCAP_S390_EIMM 32
+#define HWCAP_S390_DFP 64
+#define HWCAP_S390_HPAGE 128
+#define HWCAP_S390_ETF3EH 256
+#define HWCAP_S390_HIGH_GPRS 512
+#define HWCAP_S390_TE 1024
+#define HWCAP_S390_VXRS 2048
+#define HWCAP_S390_VXRS_BCD 4096
+#define HWCAP_S390_VXRS_EXT 8192
+#define HWCAP_S390_GS 16384
diff --git a/libc-top-half/musl/arch/s390x/bits/ioctl_fix.h b/libc-top-half/musl/arch/s390x/bits/ioctl_fix.h
new file mode 100644
index 0000000..ebb383d
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/ioctl_fix.h
@@ -0,0 +1,2 @@
+#undef FIOQSIZE
+#define FIOQSIZE 0x545e
diff --git a/libc-top-half/musl/arch/s390x/bits/limits.h b/libc-top-half/musl/arch/s390x/bits/limits.h
new file mode 100644
index 0000000..07743b6
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/limits.h
@@ -0,0 +1 @@
+#define PAGESIZE 4096
diff --git a/libc-top-half/musl/arch/s390x/bits/link.h b/libc-top-half/musl/arch/s390x/bits/link.h
new file mode 100644
index 0000000..923aac5
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/link.h
@@ -0,0 +1 @@
+typedef uint64_t Elf_Symndx;
diff --git a/libc-top-half/musl/arch/s390x/bits/posix.h b/libc-top-half/musl/arch/s390x/bits/posix.h
new file mode 100644
index 0000000..c37b94c
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_LP64_OFF64 1
+#define _POSIX_V7_LP64_OFF64 1
diff --git a/libc-top-half/musl/arch/s390x/bits/ptrace.h b/libc-top-half/musl/arch/s390x/bits/ptrace.h
new file mode 100644
index 0000000..a06cb07
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/ptrace.h
@@ -0,0 +1,12 @@
+#define PTRACE_SINGLEBLOCK 12
+#define PTRACE_OLDSETOPTIONS 21
+#define PTRACE_SYSEMU 31
+#define PTRACE_SYSEMU_SINGLESTEP 32
+#define PTRACE_PEEKUSR_AREA 0x5000
+#define PTRACE_POKEUSR_AREA 0x5001
+#define PTRACE_GET_LAST_BREAK 0x5006
+#define PTRACE_ENABLE_TE 0x5009
+#define PTRACE_DISABLE_TE 0x5010
+#define PTRACE_TE_ABORT_RAND 0x5011
+
+#define PT_STEPBLOCK PTRACE_SINGLEBLOCK
diff --git a/libc-top-half/musl/arch/s390x/bits/reg.h b/libc-top-half/musl/arch/s390x/bits/reg.h
new file mode 100644
index 0000000..2633f39
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/reg.h
@@ -0,0 +1,2 @@
+#undef __WORDSIZE
+#define __WORDSIZE 64
diff --git a/libc-top-half/musl/arch/s390x/bits/setjmp.h b/libc-top-half/musl/arch/s390x/bits/setjmp.h
new file mode 100644
index 0000000..b2bd974
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long __jmp_buf[18];
diff --git a/libc-top-half/musl/arch/s390x/bits/signal.h b/libc-top-half/musl/arch/s390x/bits/signal.h
new file mode 100644
index 0000000..e5aca4b
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/signal.h
@@ -0,0 +1,121 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 4096
+#define SIGSTKSZ 10240
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+typedef unsigned long greg_t, gregset_t[27];
+
+typedef struct {
+ unsigned long mask;
+ unsigned long addr;
+} __psw_t;
+
+typedef union {
+ double d;
+ float f;
+} fpreg_t;
+
+typedef struct {
+ unsigned fpc;
+ fpreg_t fprs[16];
+} fpregset_t;
+
+typedef struct
+{
+ __psw_t psw;
+ unsigned long gregs[16];
+ unsigned aregs[16];
+ fpregset_t fpregs;
+} mcontext_t;
+
+struct sigcontext {
+ unsigned long oldmask[1];
+ struct {
+ struct {
+ __psw_t psw;
+ unsigned long gprs[16];
+ unsigned acrs[16];
+ } regs;
+ struct {
+ unsigned fpc;
+ double fprs[16];
+ } fpregs;
+ } *sregs;
+};
+
+#else
+
+typedef struct {
+ unsigned long __regs1[18];
+ unsigned __regs2[18];
+ double __regs3[16];
+} 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;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ sigset_t uc_sigmask;
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1U
+#define SA_NOCLDWAIT 2U
+#define SA_SIGINFO 4U
+#define SA_ONSTACK 0x08000000U
+#define SA_RESTART 0x10000000U
+#define SA_NODEFER 0x40000000U
+#define SA_RESETHAND 0x80000000U
+#define SA_RESTORER 0x04000000U
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL SIGIO
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
diff --git a/libc-top-half/musl/arch/s390x/bits/stat.h b/libc-top-half/musl/arch/s390x/bits/stat.h
new file mode 100644
index 0000000..2db4ad0
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/stat.h
@@ -0,0 +1,16 @@
+struct stat {
+ dev_t st_dev;
+ ino_t st_ino;
+ nlink_t st_nlink;
+ mode_t st_mode;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ off_t st_size;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ unsigned long __unused[3];
+};
diff --git a/libc-top-half/musl/arch/s390x/bits/statfs.h b/libc-top-half/musl/arch/s390x/bits/statfs.h
new file mode 100644
index 0000000..6617358
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/statfs.h
@@ -0,0 +1,7 @@
+struct statfs {
+ unsigned f_type, f_bsize;
+ fsblkcnt_t f_blocks, f_bfree, f_bavail;
+ fsfilcnt_t f_files, f_ffree;
+ fsid_t f_fsid;
+ unsigned f_namelen, f_frsize, f_flags, f_spare[4];
+};
diff --git a/libc-top-half/musl/arch/s390x/bits/stdint.h b/libc-top-half/musl/arch/s390x/bits/stdint.h
new file mode 100644
index 0000000..1bb147f
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#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
diff --git a/libc-top-half/musl/arch/s390x/bits/syscall.h.in b/libc-top-half/musl/arch/s390x/bits/syscall.h.in
new file mode 100644
index 0000000..dfc3847
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/syscall.h.in
@@ -0,0 +1,365 @@
+#define __NR_exit 1
+#define __NR_fork 2
+#define __NR_read 3
+#define __NR_write 4
+#define __NR_open 5
+#define __NR_close 6
+#define __NR_restart_syscall 7
+#define __NR_creat 8
+#define __NR_link 9
+#define __NR_unlink 10
+#define __NR_execve 11
+#define __NR_chdir 12
+#define __NR_mknod 14
+#define __NR_chmod 15
+#define __NR_lseek 19
+#define __NR_getpid 20
+#define __NR_mount 21
+#define __NR_umount 22
+#define __NR_ptrace 26
+#define __NR_alarm 27
+#define __NR_pause 29
+#define __NR_utime 30
+#define __NR_access 33
+#define __NR_nice 34
+#define __NR_sync 36
+#define __NR_kill 37
+#define __NR_rename 38
+#define __NR_mkdir 39
+#define __NR_rmdir 40
+#define __NR_dup 41
+#define __NR_pipe 42
+#define __NR_times 43
+#define __NR_brk 45
+#define __NR_signal 48
+#define __NR_acct 51
+#define __NR_umount2 52
+#define __NR_ioctl 54
+#define __NR_fcntl 55
+#define __NR_setpgid 57
+#define __NR_umask 60
+#define __NR_chroot 61
+#define __NR_ustat 62
+#define __NR_dup2 63
+#define __NR_getppid 64
+#define __NR_getpgrp 65
+#define __NR_setsid 66
+#define __NR_sigaction 67
+#define __NR_sigsuspend 72
+#define __NR_sigpending 73
+#define __NR_sethostname 74
+#define __NR_setrlimit 75
+#define __NR_getrusage 77
+#define __NR_gettimeofday 78
+#define __NR_settimeofday 79
+#define __NR_symlink 83
+#define __NR_readlink 85
+#define __NR_uselib 86
+#define __NR_swapon 87
+#define __NR_reboot 88
+#define __NR_readdir 89
+#define __NR_mmap 90
+#define __NR_munmap 91
+#define __NR_truncate 92
+#define __NR_ftruncate 93
+#define __NR_fchmod 94
+#define __NR_getpriority 96
+#define __NR_setpriority 97
+#define __NR_statfs 99
+#define __NR_fstatfs 100
+#define __NR_socketcall 102
+#define __NR_syslog 103
+#define __NR_setitimer 104
+#define __NR_getitimer 105
+#define __NR_stat 106
+#define __NR_lstat 107
+#define __NR_fstat 108
+#define __NR_lookup_dcookie 110
+#define __NR_vhangup 111
+#define __NR_idle 112
+#define __NR_wait4 114
+#define __NR_swapoff 115
+#define __NR_sysinfo 116
+#define __NR_ipc 117
+#define __NR_fsync 118
+#define __NR_sigreturn 119
+#define __NR_clone 120
+#define __NR_setdomainname 121
+#define __NR_uname 122
+#define __NR_adjtimex 124
+#define __NR_mprotect 125
+#define __NR_sigprocmask 126
+#define __NR_create_module 127
+#define __NR_init_module 128
+#define __NR_delete_module 129
+#define __NR_get_kernel_syms 130
+#define __NR_quotactl 131
+#define __NR_getpgid 132
+#define __NR_fchdir 133
+#define __NR_bdflush 134
+#define __NR_sysfs 135
+#define __NR_personality 136
+#define __NR_afs_syscall 137
+#define __NR_getdents 141
+#define __NR_select 142
+#define __NR_flock 143
+#define __NR_msync 144
+#define __NR_readv 145
+#define __NR_writev 146
+#define __NR_getsid 147
+#define __NR_fdatasync 148
+#define __NR__sysctl 149
+#define __NR_mlock 150
+#define __NR_munlock 151
+#define __NR_mlockall 152
+#define __NR_munlockall 153
+#define __NR_sched_setparam 154
+#define __NR_sched_getparam 155
+#define __NR_sched_setscheduler 156
+#define __NR_sched_getscheduler 157
+#define __NR_sched_yield 158
+#define __NR_sched_get_priority_max 159
+#define __NR_sched_get_priority_min 160
+#define __NR_sched_rr_get_interval 161
+#define __NR_nanosleep 162
+#define __NR_mremap 163
+#define __NR_query_module 167
+#define __NR_poll 168
+#define __NR_nfsservctl 169
+#define __NR_prctl 172
+#define __NR_rt_sigreturn 173
+#define __NR_rt_sigaction 174
+#define __NR_rt_sigprocmask 175
+#define __NR_rt_sigpending 176
+#define __NR_rt_sigtimedwait 177
+#define __NR_rt_sigqueueinfo 178
+#define __NR_rt_sigsuspend 179
+#define __NR_pread64 180
+#define __NR_pwrite64 181
+#define __NR_getcwd 183
+#define __NR_capget 184
+#define __NR_capset 185
+#define __NR_sigaltstack 186
+#define __NR_sendfile 187
+#define __NR_getpmsg 188
+#define __NR_putpmsg 189
+#define __NR_vfork 190
+#define __NR_getrlimit 191
+#define __NR_lchown 198
+#define __NR_getuid 199
+#define __NR_getgid 200
+#define __NR_geteuid 201
+#define __NR_getegid 202
+#define __NR_setreuid 203
+#define __NR_setregid 204
+#define __NR_getgroups 205
+#define __NR_setgroups 206
+#define __NR_fchown 207
+#define __NR_setresuid 208
+#define __NR_getresuid 209
+#define __NR_setresgid 210
+#define __NR_getresgid 211
+#define __NR_chown 212
+#define __NR_setuid 213
+#define __NR_setgid 214
+#define __NR_setfsuid 215
+#define __NR_setfsgid 216
+#define __NR_pivot_root 217
+#define __NR_mincore 218
+#define __NR_madvise 219
+#define __NR_getdents64 220
+#define __NR_readahead 222
+#define __NR_setxattr 224
+#define __NR_lsetxattr 225
+#define __NR_fsetxattr 226
+#define __NR_getxattr 227
+#define __NR_lgetxattr 228
+#define __NR_fgetxattr 229
+#define __NR_listxattr 230
+#define __NR_llistxattr 231
+#define __NR_flistxattr 232
+#define __NR_removexattr 233
+#define __NR_lremovexattr 234
+#define __NR_fremovexattr 235
+#define __NR_gettid 236
+#define __NR_tkill 237
+#define __NR_futex 238
+#define __NR_sched_setaffinity 239
+#define __NR_sched_getaffinity 240
+#define __NR_tgkill 241
+#define __NR_io_setup 243
+#define __NR_io_destroy 244
+#define __NR_io_getevents 245
+#define __NR_io_submit 246
+#define __NR_io_cancel 247
+#define __NR_exit_group 248
+#define __NR_epoll_create 249
+#define __NR_epoll_ctl 250
+#define __NR_epoll_wait 251
+#define __NR_set_tid_address 252
+#define __NR_fadvise64 253
+#define __NR_timer_create 254
+#define __NR_timer_settime 255
+#define __NR_timer_gettime 256
+#define __NR_timer_getoverrun 257
+#define __NR_timer_delete 258
+#define __NR_clock_settime 259
+#define __NR_clock_gettime 260
+#define __NR_clock_getres 261
+#define __NR_clock_nanosleep 262
+#define __NR_statfs64 265
+#define __NR_fstatfs64 266
+#define __NR_remap_file_pages 267
+#define __NR_mbind 268
+#define __NR_get_mempolicy 269
+#define __NR_set_mempolicy 270
+#define __NR_mq_open 271
+#define __NR_mq_unlink 272
+#define __NR_mq_timedsend 273
+#define __NR_mq_timedreceive 274
+#define __NR_mq_notify 275
+#define __NR_mq_getsetattr 276
+#define __NR_kexec_load 277
+#define __NR_add_key 278
+#define __NR_request_key 279
+#define __NR_keyctl 280
+#define __NR_waitid 281
+#define __NR_ioprio_set 282
+#define __NR_ioprio_get 283
+#define __NR_inotify_init 284
+#define __NR_inotify_add_watch 285
+#define __NR_inotify_rm_watch 286
+#define __NR_migrate_pages 287
+#define __NR_openat 288
+#define __NR_mkdirat 289
+#define __NR_mknodat 290
+#define __NR_fchownat 291
+#define __NR_futimesat 292
+#define __NR_newfstatat 293
+#define __NR_unlinkat 294
+#define __NR_renameat 295
+#define __NR_linkat 296
+#define __NR_symlinkat 297
+#define __NR_readlinkat 298
+#define __NR_fchmodat 299
+#define __NR_faccessat 300
+#define __NR_pselect6 301
+#define __NR_ppoll 302
+#define __NR_unshare 303
+#define __NR_set_robust_list 304
+#define __NR_get_robust_list 305
+#define __NR_splice 306
+#define __NR_sync_file_range 307
+#define __NR_tee 308
+#define __NR_vmsplice 309
+#define __NR_move_pages 310
+#define __NR_getcpu 311
+#define __NR_epoll_pwait 312
+#define __NR_utimes 313
+#define __NR_fallocate 314
+#define __NR_utimensat 315
+#define __NR_signalfd 316
+#define __NR_timerfd 317
+#define __NR_eventfd 318
+#define __NR_timerfd_create 319
+#define __NR_timerfd_settime 320
+#define __NR_timerfd_gettime 321
+#define __NR_signalfd4 322
+#define __NR_eventfd2 323
+#define __NR_inotify_init1 324
+#define __NR_pipe2 325
+#define __NR_dup3 326
+#define __NR_epoll_create1 327
+#define __NR_preadv 328
+#define __NR_pwritev 329
+#define __NR_rt_tgsigqueueinfo 330
+#define __NR_perf_event_open 331
+#define __NR_fanotify_init 332
+#define __NR_fanotify_mark 333
+#define __NR_prlimit64 334
+#define __NR_name_to_handle_at 335
+#define __NR_open_by_handle_at 336
+#define __NR_clock_adjtime 337
+#define __NR_syncfs 338
+#define __NR_setns 339
+#define __NR_process_vm_readv 340
+#define __NR_process_vm_writev 341
+#define __NR_s390_runtime_instr 342
+#define __NR_kcmp 343
+#define __NR_finit_module 344
+#define __NR_sched_setattr 345
+#define __NR_sched_getattr 346
+#define __NR_renameat2 347
+#define __NR_seccomp 348
+#define __NR_getrandom 349
+#define __NR_memfd_create 350
+#define __NR_bpf 351
+#define __NR_s390_pci_mmio_write 352
+#define __NR_s390_pci_mmio_read 353
+#define __NR_execveat 354
+#define __NR_userfaultfd 355
+#define __NR_membarrier 356
+#define __NR_recvmmsg 357
+#define __NR_sendmmsg 358
+#define __NR_socket 359
+#define __NR_socketpair 360
+#define __NR_bind 361
+#define __NR_connect 362
+#define __NR_listen 363
+#define __NR_accept4 364
+#define __NR_getsockopt 365
+#define __NR_setsockopt 366
+#define __NR_getsockname 367
+#define __NR_getpeername 368
+#define __NR_sendto 369
+#define __NR_sendmsg 370
+#define __NR_recvfrom 371
+#define __NR_recvmsg 372
+#define __NR_shutdown 373
+#define __NR_mlock2 374
+#define __NR_copy_file_range 375
+#define __NR_preadv2 376
+#define __NR_pwritev2 377
+#define __NR_s390_guarded_storage 378
+#define __NR_statx 379
+#define __NR_s390_sthyi 380
+#define __NR_kexec_file_load 381
+#define __NR_io_pgetevents 382
+#define __NR_rseq 383
+#define __NR_pkey_mprotect 384
+#define __NR_pkey_alloc 385
+#define __NR_pkey_free 386
+#define __NR_semtimedop 392
+#define __NR_semget 393
+#define __NR_semctl 394
+#define __NR_shmget 395
+#define __NR_shmctl 396
+#define __NR_shmat 397
+#define __NR_shmdt 398
+#define __NR_msgget 399
+#define __NR_msgsnd 400
+#define __NR_msgrcv 401
+#define __NR_msgctl 402
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_clone3 435
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_epoll_pwait2 441
+#define __NR_mount_setattr 442
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_restrict_self 446
+
diff --git a/libc-top-half/musl/arch/s390x/bits/user.h b/libc-top-half/musl/arch/s390x/bits/user.h
new file mode 100644
index 0000000..ff3f048
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/bits/user.h
@@ -0,0 +1,62 @@
+#undef __WORDSIZE
+#define __WORDSIZE 64
+
+typedef union {
+ double d;
+ float f;
+} elf_fpreg_t;
+
+typedef struct {
+ unsigned fpc;
+ elf_fpreg_t fprs[16];
+} elf_fpregset_t;
+
+#define ELF_NGREG 27
+typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG];
+
+struct _user_psw_struct {
+ unsigned long mask, addr;
+};
+
+struct _user_fpregs_struct {
+ unsigned fpc;
+ double fprs[16];
+};
+
+struct _user_per_struct {
+ unsigned long control_regs[3];
+ unsigned single_step : 1;
+ unsigned instruction_fetch : 1;
+ unsigned : 30;
+ unsigned long starting_addr, ending_addr;
+ unsigned short perc_atmid;
+ unsigned long address;
+ unsigned char access_id;
+};
+
+struct _user_regs_struct {
+ struct _user_psw_struct psw;
+ unsigned long gprs[16];
+ unsigned acrs[16];
+ unsigned long orig_gpr2;
+ struct _user_fpregs_struct fp_regs;
+ struct _user_per_struct per_info;
+ unsigned long ieee_instruction_pointer;
+};
+
+struct user {
+ struct _user_regs_struct regs;
+ unsigned long u_tsize, u_dsize, u_ssize;
+ unsigned long start_code, start_stack;
+ long signal;
+ struct _user_regs_struct *u_ar0;
+ unsigned long magic;
+ char u_comm[32];
+};
+
+#define PAGE_MASK (~(PAGESIZE-1))
+#define NBPG PAGESIZE
+#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/libc-top-half/musl/arch/s390x/crt_arch.h b/libc-top-half/musl/arch/s390x/crt_arch.h
new file mode 100644
index 0000000..92091a1
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/crt_arch.h
@@ -0,0 +1,17 @@
+__asm__(
+".text\n"
+".global " START "\n"
+".type " START ", %function\n"
+START ":\n"
+" lgr %r2, %r15\n"
+" larl %r3, 1f\n"
+" agf %r3, 0(%r3)\n"
+" aghi %r15, -160\n"
+" lghi %r0, 0\n"
+" stg %r0, 0(%r15)\n"
+" jg " START "_c\n"
+" .align 8\n"
+".weak _DYNAMIC\n"
+".hidden _DYNAMIC\n"
+"1: .long _DYNAMIC-.\n"
+);
diff --git a/libc-top-half/musl/arch/s390x/kstat.h b/libc-top-half/musl/arch/s390x/kstat.h
new file mode 100644
index 0000000..001c10b
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/kstat.h
@@ -0,0 +1,19 @@
+struct kstat {
+ dev_t st_dev;
+ ino_t st_ino;
+ nlink_t st_nlink;
+ mode_t st_mode;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ off_t st_size;
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ unsigned long __unused[3];
+};
diff --git a/libc-top-half/musl/arch/s390x/pthread_arch.h b/libc-top-half/musl/arch/s390x/pthread_arch.h
new file mode 100644
index 0000000..e54fec3
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/pthread_arch.h
@@ -0,0 +1,12 @@
+static inline uintptr_t __get_tp()
+{
+ uintptr_t tp;
+ __asm__ (
+ "ear %0, %%a0\n"
+ "sllg %0, %0, 32\n"
+ "ear %0, %%a1\n"
+ : "=r"(tp));
+ return tp;
+}
+
+#define MC_PC psw.addr
diff --git a/libc-top-half/musl/arch/s390x/reloc.h b/libc-top-half/musl/arch/s390x/reloc.h
new file mode 100644
index 0000000..6e5c1fb
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/reloc.h
@@ -0,0 +1,13 @@
+#define LDSO_ARCH "s390x"
+
+#define REL_SYMBOLIC R_390_64
+#define REL_GOT R_390_GLOB_DAT
+#define REL_PLT R_390_JMP_SLOT
+#define REL_RELATIVE R_390_RELATIVE
+#define REL_COPY R_390_COPY
+#define REL_DTPMOD R_390_TLS_DTPMOD
+#define REL_DTPOFF R_390_TLS_DTPOFF
+#define REL_TPOFF R_390_TLS_TPOFF
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "lgr %%r15,%1; br %0" : : "r"(pc), "r"(sp) : "memory" )
diff --git a/libc-top-half/musl/arch/s390x/syscall_arch.h b/libc-top-half/musl/arch/s390x/syscall_arch.h
new file mode 100644
index 0000000..83cc9a2
--- /dev/null
+++ b/libc-top-half/musl/arch/s390x/syscall_arch.h
@@ -0,0 +1,74 @@
+#define __SYSCALL_LL_E(x) (x)
+#define __SYSCALL_LL_O(x) (x)
+
+#define __asm_syscall(ret, ...) do { \
+ __asm__ __volatile__ ("svc 0\n" \
+ : ret : __VA_ARGS__ : "memory"); \
+ return r2; \
+ } while (0)
+
+static inline long __syscall0(long n)
+{
+ register long r1 __asm__("r1") = n;
+ register long r2 __asm__("r2");
+ __asm_syscall("=r"(r2), "r"(r1));
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register long r1 __asm__("r1") = n;
+ register long r2 __asm__("r2") = a;
+ __asm_syscall("+r"(r2), "r"(r1));
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register long r1 __asm__("r1") = n;
+ register long r2 __asm__("r2") = a;
+ register long r3 __asm__("r3") = b;
+ __asm_syscall("+r"(r2), "r"(r1), "r"(r3));
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register long r1 __asm__("r1") = n;
+ register long r2 __asm__("r2") = a;
+ register long r3 __asm__("r3") = b;
+ register long r4 __asm__("r4") = c;
+ __asm_syscall("+r"(r2), "r"(r1), "r"(r3), "r"(r4));
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register long r1 __asm__("r1") = n;
+ register long r2 __asm__("r2") = a;
+ register long r3 __asm__("r3") = b;
+ register long r4 __asm__("r4") = c;
+ register long r5 __asm__("r5") = d;
+ __asm_syscall("+r"(r2), "r"(r1), "r"(r3), "r"(r4), "r"(r5));
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long r1 __asm__("r1") = n;
+ register long r2 __asm__("r2") = a;
+ register long r3 __asm__("r3") = b;
+ register long r4 __asm__("r4") = c;
+ register long r5 __asm__("r5") = d;
+ register long r6 __asm__("r6") = e;
+ __asm_syscall("+r"(r2), "r"(r1), "r"(r3), "r"(r4), "r"(r5), "r"(r6));
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ if (n == SYS_mmap) return __syscall1(n, (long)(long[]){a,b,c,d,e,f});
+
+ register long r1 __asm__("r1") = n;
+ register long r2 __asm__("r2") = a;
+ register long r3 __asm__("r3") = b;
+ register long r4 __asm__("r4") = c;
+ register long r5 __asm__("r5") = d;
+ register long r6 __asm__("r6") = e;
+ register long r7 __asm__("r7") = f;
+ __asm_syscall("+r"(r2), "r"(r1), "r"(r3), "r"(r4), "r"(r5), "r"(r6), "r"(r7));
+}
diff --git a/libc-top-half/musl/arch/sh/arch.mak b/libc-top-half/musl/arch/sh/arch.mak
new file mode 100644
index 0000000..aa4d05c
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/arch.mak
@@ -0,0 +1 @@
+COMPAT_SRC_DIRS = compat/time32
diff --git a/libc-top-half/musl/arch/sh/atomic_arch.h b/libc-top-half/musl/arch/sh/atomic_arch.h
new file mode 100644
index 0000000..0a4d0c1
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/atomic_arch.h
@@ -0,0 +1,48 @@
+#include "libc.h"
+
+#if defined(__SH4A__)
+
+#define a_ll a_ll
+static inline int a_ll(volatile int *p)
+{
+ int v;
+ __asm__ __volatile__ ("movli.l @%1, %0" : "=z"(v) : "r"(p), "m"(*p));
+ return v;
+}
+
+#define a_sc a_sc
+static inline int a_sc(volatile int *p, int v)
+{
+ int r;
+ __asm__ __volatile__ (
+ "movco.l %2, @%3 ; movt %0"
+ : "=r"(r), "=m"(*p) : "z"(v), "r"(p) : "memory", "cc");
+ return r;
+}
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ __asm__ __volatile__ ("synco" ::: "memory");
+}
+
+#define a_pre_llsc a_barrier
+#define a_post_llsc a_barrier
+
+#else
+
+#define a_cas a_cas
+extern hidden const void *__sh_cas_ptr;
+static inline int a_cas(volatile int *p, int t, int s)
+{
+ register int r1 __asm__("r1");
+ register int r2 __asm__("r2") = t;
+ register int r3 __asm__("r3") = s;
+ __asm__ __volatile__ (
+ "jsr @%4 ; nop"
+ : "=r"(r1), "+r"(r3) : "z"(p), "r"(r2), "r"(__sh_cas_ptr)
+ : "memory", "pr", "cc");
+ return r3;
+}
+
+#endif
diff --git a/libc-top-half/musl/arch/sh/bits/alltypes.h.in b/libc-top-half/musl/arch/sh/bits/alltypes.h.in
new file mode 100644
index 0000000..6a53835
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/alltypes.h.in
@@ -0,0 +1,25 @@
+#define _REDIR_TIME64 1
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+#if __BIG_ENDIAN__
+#define __BYTE_ORDER 4321
+#else
+#define __BYTE_ORDER 1234
+#endif
+
+#define __LONG_MAX 0x7fffffffL
+
+#ifndef __cplusplus
+#ifdef __WCHAR_TYPE__
+TYPEDEF __WCHAR_TYPE__ wchar_t;
+#else
+TYPEDEF long wchar_t;
+#endif
+#endif
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/sh/bits/fenv.h b/libc-top-half/musl/arch/sh/bits/fenv.h
new file mode 100644
index 0000000..7f1b8b6
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/fenv.h
@@ -0,0 +1,26 @@
+#ifndef __SH_FPU_ANY__
+
+#define FE_ALL_EXCEPT 0
+#define FE_TONEAREST 0
+
+#else
+
+#define FE_TONEAREST 0
+#define FE_TOWARDZERO 1
+
+#define FE_INEXACT 0x04
+#define FE_UNDERFLOW 0x08
+#define FE_OVERFLOW 0x10
+#define FE_DIVBYZERO 0x20
+#define FE_INVALID 0x40
+#define FE_ALL_EXCEPT 0x7c
+
+#endif
+
+typedef unsigned long fexcept_t;
+
+typedef struct {
+ unsigned long __cw;
+} fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *) -1)
diff --git a/libc-top-half/musl/arch/sh/bits/float.h b/libc-top-half/musl/arch/sh/bits/float.h
new file mode 100644
index 0000000..c4a655e
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 4.94065645841246544177e-324L
+#define LDBL_MIN 2.22507385850720138309e-308L
+#define LDBL_MAX 1.79769313486231570815e+308L
+#define LDBL_EPSILON 2.22044604925031308085e-16L
+
+#define LDBL_MANT_DIG 53
+#define LDBL_MIN_EXP (-1021)
+#define LDBL_MAX_EXP 1024
+
+#define LDBL_DIG 15
+#define LDBL_MIN_10_EXP (-307)
+#define LDBL_MAX_10_EXP 308
+
+#define DECIMAL_DIG 17
diff --git a/libc-top-half/musl/arch/sh/bits/hwcap.h b/libc-top-half/musl/arch/sh/bits/hwcap.h
new file mode 100644
index 0000000..f85121d
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/hwcap.h
@@ -0,0 +1,11 @@
+#define CPU_HAS_FPU 0x0001
+#define CPU_HAS_P2_FLUSH_BUG 0x0002
+#define CPU_HAS_MMU_PAGE_ASSOC 0x0004
+#define CPU_HAS_DSP 0x0008
+#define CPU_HAS_PERF_COUNTER 0x0010
+#define CPU_HAS_PTEA 0x0020
+#define CPU_HAS_LLSC 0x0040
+#define CPU_HAS_L2_CACHE 0x0080
+#define CPU_HAS_OP32 0x0100
+#define CPU_HAS_PTEAEX 0x0200
+#define CPU_HAS_CAS_L 0x0400
diff --git a/libc-top-half/musl/arch/sh/bits/ioctl.h b/libc-top-half/musl/arch/sh/bits/ioctl.h
new file mode 100644
index 0000000..370b690
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/ioctl.h
@@ -0,0 +1,112 @@
+#define _IOC(a,b,c,d) ( ((a)<<30) | ((b)<<8) | (c) | ((d)<<16) )
+#define _IOC_NONE 0U
+#define _IOC_WRITE 1U
+#define _IOC_READ 2U
+
+#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0)
+#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c))
+#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c))
+#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c))
+
+#define FIOCLEX _IO('f', 1)
+#define FIONCLEX _IO('f', 2)
+#define FIOASYNC _IOW('f', 125, int)
+#define FIONBIO _IOW('f', 126, int)
+#define FIONREAD _IOR('f', 127, int)
+#define TIOCINQ FIONREAD
+#define FIOQSIZE _IOR('f', 128, char[8])
+
+#define TCGETA _IOR('t', 23, char[18])
+#define TCSETA _IOW('t', 24, char[18])
+#define TCSETAW _IOW('t', 25, char[18])
+#define TCSETAF _IOW('t', 28, char[18])
+
+#define TCSBRK _IO('t', 29)
+#define TCXONC _IO('t', 30)
+#define TCFLSH _IO('t', 31)
+
+#define TIOCSWINSZ _IOW('t', 103, char[8])
+#define TIOCGWINSZ _IOR('t', 104, char[8])
+#define TIOCSTART _IO('t', 110)
+#define TIOCSTOP _IO('t', 111)
+#define TIOCOUTQ _IOR('t', 115, int)
+
+#define TIOCSPGRP _IOW('t', 118, int)
+#define TIOCGPGRP _IOR('t', 119, int)
+
+#define TIOCEXCL _IO('T', 12)
+#define TIOCNXCL _IO('T', 13)
+#define TIOCSCTTY _IO('T', 14)
+
+#define TIOCSTI _IOW('T', 18, char)
+#define TIOCMGET _IOR('T', 21, unsigned int)
+#define TIOCMBIS _IOW('T', 22, unsigned int)
+#define TIOCMBIC _IOW('T', 23, unsigned int)
+#define TIOCMSET _IOW('T', 24, unsigned int)
+#define TIOCM_LE 0x001
+#define TIOCM_DTR 0x002
+#define TIOCM_RTS 0x004
+#define TIOCM_ST 0x008
+#define TIOCM_SR 0x010
+#define TIOCM_CTS 0x020
+#define TIOCM_CAR 0x040
+#define TIOCM_RNG 0x080
+#define TIOCM_DSR 0x100
+#define TIOCM_CD TIOCM_CAR
+#define TIOCM_RI TIOCM_RNG
+#define TIOCM_OUT1 0x2000
+#define TIOCM_OUT2 0x4000
+#define TIOCM_LOOP 0x8000
+
+#define TIOCGSOFTCAR _IOR('T', 25, unsigned int)
+#define TIOCSSOFTCAR _IOW('T', 26, unsigned int)
+#define TIOCLINUX _IOW('T', 28, char)
+#define TIOCCONS _IO('T', 29)
+#define TIOCGSERIAL _IOR('T', 30, char[60])
+#define TIOCSSERIAL _IOW('T', 31, char[60])
+#define TIOCPKT _IOW('T', 32, int)
+
+#define TIOCNOTTY _IO('T', 34)
+#define TIOCSETD _IOW('T', 35, int)
+#define TIOCGETD _IOR('T', 36, int)
+#define TCSBRKP _IOW('T', 37, int)
+#define TIOCSBRK _IO('T', 39)
+#define TIOCCBRK _IO('T', 40)
+#define TIOCGSID _IOR('T', 41, int)
+#define TCGETS _IO('T', 1)
+#define TCSETS _IO('T', 2)
+#define TCSETSW _IO('T', 3)
+#define TCSETSF _IO('T', 4)
+#define TIOCGRS485 _IOR('T', 46, char[32])
+#define TIOCSRS485 _IOWR('T', 47, char[32])
+#define TIOCGPTN _IOR('T', 48, unsigned int)
+#define TIOCSPTLCK _IOW('T', 49, int)
+#define TIOCGDEV _IOR('T', 50, unsigned int)
+#define TIOCSIG _IOW('T', 54, int)
+#define TIOCVHANGUP _IO('T', 55)
+#define TIOCGPKT _IOR('T', 56, int)
+#define TIOCGPTLCK _IOR('T', 57, int)
+#define TIOCGEXCL _IOR('T', 64, int)
+#define TIOCGPTPEER _IO('T', 0x41)
+
+#define TIOCSERCONFIG _IO('T', 83)
+#define TIOCSERGWILD _IOR('T', 84, int)
+#define TIOCSERSWILD _IOW('T', 85, int)
+#define TIOCGLCKTRMIOS _IO('T', 86)
+#define TIOCSLCKTRMIOS _IO('T', 87)
+#define TIOCSERGSTRUCT _IOR('T', 88, char[216])
+#define TIOCSERGETLSR _IOR('T', 89, unsigned int)
+#define TIOCSERGETMULTI _IOR('T', 90, char[168])
+#define TIOCSERSETMULTI _IOW('T', 91, char[168])
+
+#define TIOCMIWAIT _IO('T', 92)
+#define TIOCGICOUNT _IO('T', 93)
+
+#define FIOGETOWN _IOR('f', 123, int)
+#define FIOSETOWN _IOW('f', 124, int)
+
+#define SIOCATMARK _IOR('s', 7, int)
+#define SIOCSPGRP _IOW('s', 8, int)
+#define SIOCGPGRP _IOW('s', 9, int)
+#define SIOCGSTAMP _IOR(0x89, 6, char[16])
+#define SIOCGSTAMPNS _IOR(0x89, 7, char[16])
diff --git a/libc-top-half/musl/arch/sh/bits/ipcstat.h b/libc-top-half/musl/arch/sh/bits/ipcstat.h
new file mode 100644
index 0000000..4f4fcb0
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/ipcstat.h
@@ -0,0 +1 @@
+#define IPC_STAT 0x102
diff --git a/libc-top-half/musl/arch/sh/bits/limits.h b/libc-top-half/musl/arch/sh/bits/limits.h
new file mode 100644
index 0000000..07743b6
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/limits.h
@@ -0,0 +1 @@
+#define PAGESIZE 4096
diff --git a/libc-top-half/musl/arch/sh/bits/msg.h b/libc-top-half/musl/arch/sh/bits/msg.h
new file mode 100644
index 0000000..7bbbb2b
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/msg.h
@@ -0,0 +1,18 @@
+struct msqid_ds {
+ struct ipc_perm msg_perm;
+ unsigned long __msg_stime_lo;
+ unsigned long __msg_stime_hi;
+ unsigned long __msg_rtime_lo;
+ unsigned long __msg_rtime_hi;
+ unsigned long __msg_ctime_lo;
+ unsigned long __msg_ctime_hi;
+ unsigned long msg_cbytes;
+ msgqnum_t msg_qnum;
+ msglen_t msg_qbytes;
+ pid_t msg_lspid;
+ pid_t msg_lrpid;
+ unsigned long __unused[2];
+ time_t msg_stime;
+ time_t msg_rtime;
+ time_t msg_ctime;
+};
diff --git a/libc-top-half/musl/arch/sh/bits/posix.h b/libc-top-half/musl/arch/sh/bits/posix.h
new file mode 100644
index 0000000..30a3871
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_ILP32_OFFBIG 1
+#define _POSIX_V7_ILP32_OFFBIG 1
diff --git a/libc-top-half/musl/arch/sh/bits/ptrace.h b/libc-top-half/musl/arch/sh/bits/ptrace.h
new file mode 100644
index 0000000..4435ca1
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/ptrace.h
@@ -0,0 +1,5 @@
+#define PTRACE_GETFDPIC 31
+#define PTRACE_GETFDPIC_EXEC 0
+#define PTRACE_GETFDPIC_INTERP 1
+#define PTRACE_GETDSPREGS 55
+#define PTRACE_SETDSPREGS 56
diff --git a/libc-top-half/musl/arch/sh/bits/sem.h b/libc-top-half/musl/arch/sh/bits/sem.h
new file mode 100644
index 0000000..544e3d2
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/sem.h
@@ -0,0 +1,18 @@
+struct semid_ds {
+ struct ipc_perm sem_perm;
+ unsigned long __sem_otime_lo;
+ unsigned long __sem_otime_hi;
+ unsigned long __sem_ctime_lo;
+ unsigned long __sem_ctime_hi;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned short sem_nsems;
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+#else
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+ unsigned short sem_nsems;
+#endif
+ long __unused3;
+ long __unused4;
+ time_t sem_otime;
+ time_t sem_ctime;
+};
diff --git a/libc-top-half/musl/arch/sh/bits/setjmp.h b/libc-top-half/musl/arch/sh/bits/setjmp.h
new file mode 100644
index 0000000..05dbdc7
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long __jmp_buf[15];
diff --git a/libc-top-half/musl/arch/sh/bits/shm.h b/libc-top-half/musl/arch/sh/bits/shm.h
new file mode 100644
index 0000000..adc01e3
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/shm.h
@@ -0,0 +1,31 @@
+#define SHMLBA 16384
+
+struct shmid_ds {
+ struct ipc_perm shm_perm;
+ size_t shm_segsz;
+ unsigned long __shm_atime_lo;
+ unsigned long __shm_atime_hi;
+ unsigned long __shm_dtime_lo;
+ unsigned long __shm_dtime_hi;
+ unsigned long __shm_ctime_lo;
+ unsigned long __shm_ctime_hi;
+ pid_t shm_cpid;
+ pid_t shm_lpid;
+ unsigned long shm_nattch;
+ unsigned long __pad1;
+ unsigned long __pad2;
+ unsigned long __pad3;
+ time_t shm_atime;
+ time_t shm_dtime;
+ time_t shm_ctime;
+};
+
+struct shminfo {
+ unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+};
+
+struct shm_info {
+ int __used_ids;
+ unsigned long shm_tot, shm_rss, shm_swp;
+ unsigned long __swap_attempts, __swap_successes;
+};
diff --git a/libc-top-half/musl/arch/sh/bits/signal.h b/libc-top-half/musl/arch/sh/bits/signal.h
new file mode 100644
index 0000000..d0b1482
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/signal.h
@@ -0,0 +1,96 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef int greg_t, gregset_t[16];
+typedef int freg_t, fpregset_t[16];
+typedef struct {
+ unsigned long oldmask;
+ unsigned long gregs[16];
+ unsigned long pc, pr, sr;
+ unsigned long gbr, mach, macl;
+ unsigned long fpregs[16];
+ unsigned long xfpregs[16];
+ unsigned int fpscr, fpul, ownedfp;
+} mcontext_t;
+struct sigcontext {
+ unsigned long oldmask;
+ unsigned long sc_regs[16];
+ unsigned long sc_pc, sc_pr, sc_sr;
+ unsigned long sc_gbr, sc_mach, sc_macl;
+ unsigned long sc_fpregs[16];
+ unsigned long sc_xfpregs[16];
+ unsigned int sc_fpscr, sc_fpul, sc_ownedfp;
+};
+#else
+typedef struct {
+ unsigned long __regs[58];
+} 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;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ sigset_t uc_sigmask;
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 2
+#define SA_SIGINFO 4
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL 29
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
diff --git a/libc-top-half/musl/arch/sh/bits/stat.h b/libc-top-half/musl/arch/sh/bits/stat.h
new file mode 100644
index 0000000..5d7828c
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/stat.h
@@ -0,0 +1,25 @@
+/* copied from kernel definition, but with padding replaced
+ * by the corresponding correctly-sized userspace types. */
+
+struct stat {
+ dev_t st_dev;
+ int __st_dev_padding;
+ long __st_ino_truncated;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ int __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ struct {
+ long tv_sec;
+ long tv_nsec;
+ } __st_atim32, __st_mtim32, __st_ctim32;
+ ino_t st_ino;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+};
diff --git a/libc-top-half/musl/arch/sh/bits/stdint.h b/libc-top-half/musl/arch/sh/bits/stdint.h
new file mode 100644
index 0000000..d1b2712
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#define SIZE_MAX UINT32_MAX
diff --git a/libc-top-half/musl/arch/sh/bits/syscall.h.in b/libc-top-half/musl/arch/sh/bits/syscall.h.in
new file mode 100644
index 0000000..ff14f54
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/syscall.h.in
@@ -0,0 +1,412 @@
+#define __NR_restart_syscall 0
+#define __NR_exit 1
+#define __NR_fork 2
+#define __NR_read 3
+#define __NR_write 4
+#define __NR_open 5
+#define __NR_close 6
+#define __NR_waitpid 7
+#define __NR_creat 8
+#define __NR_link 9
+#define __NR_unlink 10
+#define __NR_execve 11
+#define __NR_chdir 12
+#define __NR_time 13
+#define __NR_mknod 14
+#define __NR_chmod 15
+#define __NR_lchown 16
+#define __NR_oldstat 18
+#define __NR_lseek 19
+#define __NR_getpid 20
+#define __NR_mount 21
+#define __NR_umount 22
+#define __NR_setuid 23
+#define __NR_getuid 24
+#define __NR_stime 25
+#define __NR_ptrace 26
+#define __NR_alarm 27
+#define __NR_oldfstat 28
+#define __NR_pause 29
+#define __NR_utime 30
+#define __NR_access 33
+#define __NR_nice 34
+#define __NR_sync 36
+#define __NR_kill 37
+#define __NR_rename 38
+#define __NR_mkdir 39
+#define __NR_rmdir 40
+#define __NR_dup 41
+#define __NR_pipe 42
+#define __NR_times 43
+#define __NR_brk 45
+#define __NR_setgid 46
+#define __NR_getgid 47
+#define __NR_signal 48
+#define __NR_geteuid 49
+#define __NR_getegid 50
+#define __NR_acct 51
+#define __NR_umount2 52
+#define __NR_ioctl 54
+#define __NR_fcntl 55
+#define __NR_setpgid 57
+#define __NR_umask 60
+#define __NR_chroot 61
+#define __NR_ustat 62
+#define __NR_dup2 63
+#define __NR_getppid 64
+#define __NR_getpgrp 65
+#define __NR_setsid 66
+#define __NR_sigaction 67
+#define __NR_sgetmask 68
+#define __NR_ssetmask 69
+#define __NR_setreuid 70
+#define __NR_setregid 71
+#define __NR_sigsuspend 72
+#define __NR_sigpending 73
+#define __NR_sethostname 74
+#define __NR_setrlimit 75
+#define __NR_getrlimit 76
+#define __NR_getrusage 77
+#define __NR_gettimeofday_time32 78
+#define __NR_settimeofday_time32 79
+#define __NR_getgroups 80
+#define __NR_setgroups 81
+#define __NR_symlink 83
+#define __NR_oldlstat 84
+#define __NR_readlink 85
+#define __NR_uselib 86
+#define __NR_swapon 87
+#define __NR_reboot 88
+#define __NR_readdir 89
+#define __NR_mmap 90
+#define __NR_munmap 91
+#define __NR_truncate 92
+#define __NR_ftruncate 93
+#define __NR_fchmod 94
+#define __NR_fchown 95
+#define __NR_getpriority 96
+#define __NR_setpriority 97
+#define __NR_statfs 99
+#define __NR_fstatfs 100
+#define __NR_socketcall 102
+#define __NR_syslog 103
+#define __NR_setitimer 104
+#define __NR_getitimer 105
+#define __NR_stat 106
+#define __NR_lstat 107
+#define __NR_fstat 108
+#define __NR_olduname 109
+#define __NR_vhangup 111
+#define __NR_wait4 114
+#define __NR_swapoff 115
+#define __NR_sysinfo 116
+#define __NR_ipc 117
+#define __NR_fsync 118
+#define __NR_sigreturn 119
+#define __NR_clone 120
+#define __NR_setdomainname 121
+#define __NR_uname 122
+#define __NR_cacheflush 123
+#define __NR_adjtimex 124
+#define __NR_mprotect 125
+#define __NR_sigprocmask 126
+#define __NR_init_module 128
+#define __NR_delete_module 129
+#define __NR_quotactl 131
+#define __NR_getpgid 132
+#define __NR_fchdir 133
+#define __NR_bdflush 134
+#define __NR_sysfs 135
+#define __NR_personality 136
+#define __NR_setfsuid 138
+#define __NR_setfsgid 139
+#define __NR__llseek 140
+#define __NR_getdents 141
+#define __NR__newselect 142
+#define __NR_flock 143
+#define __NR_msync 144
+#define __NR_readv 145
+#define __NR_writev 146
+#define __NR_getsid 147
+#define __NR_fdatasync 148
+#define __NR__sysctl 149
+#define __NR_mlock 150
+#define __NR_munlock 151
+#define __NR_mlockall 152
+#define __NR_munlockall 153
+#define __NR_sched_setparam 154
+#define __NR_sched_getparam 155
+#define __NR_sched_setscheduler 156
+#define __NR_sched_getscheduler 157
+#define __NR_sched_yield 158
+#define __NR_sched_get_priority_max 159
+#define __NR_sched_get_priority_min 160
+#define __NR_sched_rr_get_interval 161
+#define __NR_nanosleep 162
+#define __NR_mremap 163
+#define __NR_setresuid 164
+#define __NR_getresuid 165
+#define __NR_poll 168
+#define __NR_nfsservctl 169
+#define __NR_setresgid 170
+#define __NR_getresgid 171
+#define __NR_prctl 172
+#define __NR_rt_sigreturn 173
+#define __NR_rt_sigaction 174
+#define __NR_rt_sigprocmask 175
+#define __NR_rt_sigpending 176
+#define __NR_rt_sigtimedwait 177
+#define __NR_rt_sigqueueinfo 178
+#define __NR_rt_sigsuspend 179
+#define __NR_pread64 180
+#define __NR_pwrite64 181
+#define __NR_chown 182
+#define __NR_getcwd 183
+#define __NR_capget 184
+#define __NR_capset 185
+#define __NR_sigaltstack 186
+#define __NR_sendfile 187
+#define __NR_vfork 190
+#define __NR_ugetrlimit 191
+#define __NR_mmap2 192
+#define __NR_truncate64 193
+#define __NR_ftruncate64 194
+#define __NR_stat64 195
+#define __NR_lstat64 196
+#define __NR_fstat64 197
+#define __NR_lchown32 198
+#define __NR_getuid32 199
+#define __NR_getgid32 200
+#define __NR_geteuid32 201
+#define __NR_getegid32 202
+#define __NR_setreuid32 203
+#define __NR_setregid32 204
+#define __NR_getgroups32 205
+#define __NR_setgroups32 206
+#define __NR_fchown32 207
+#define __NR_setresuid32 208
+#define __NR_getresuid32 209
+#define __NR_setresgid32 210
+#define __NR_getresgid32 211
+#define __NR_chown32 212
+#define __NR_setuid32 213
+#define __NR_setgid32 214
+#define __NR_setfsuid32 215
+#define __NR_setfsgid32 216
+#define __NR_pivot_root 217
+#define __NR_mincore 218
+#define __NR_madvise 219
+#define __NR_getdents64 220
+#define __NR_fcntl64 221
+#define __NR_gettid 224
+#define __NR_readahead 225
+#define __NR_setxattr 226
+#define __NR_lsetxattr 227
+#define __NR_fsetxattr 228
+#define __NR_getxattr 229
+#define __NR_lgetxattr 230
+#define __NR_fgetxattr 231
+#define __NR_listxattr 232
+#define __NR_llistxattr 233
+#define __NR_flistxattr 234
+#define __NR_removexattr 235
+#define __NR_lremovexattr 236
+#define __NR_fremovexattr 237
+#define __NR_tkill 238
+#define __NR_sendfile64 239
+#define __NR_futex 240
+#define __NR_sched_setaffinity 241
+#define __NR_sched_getaffinity 242
+#define __NR_io_setup 245
+#define __NR_io_destroy 246
+#define __NR_io_getevents 247
+#define __NR_io_submit 248
+#define __NR_io_cancel 249
+#define __NR_fadvise64 250
+#define __NR_exit_group 252
+#define __NR_lookup_dcookie 253
+#define __NR_epoll_create 254
+#define __NR_epoll_ctl 255
+#define __NR_epoll_wait 256
+#define __NR_remap_file_pages 257
+#define __NR_set_tid_address 258
+#define __NR_timer_create 259
+#define __NR_timer_settime32 260
+#define __NR_timer_gettime32 261
+#define __NR_timer_getoverrun 262
+#define __NR_timer_delete 263
+#define __NR_clock_settime32 264
+#define __NR_clock_gettime32 265
+#define __NR_clock_getres_time32 266
+#define __NR_clock_nanosleep_time32 267
+#define __NR_statfs64 268
+#define __NR_fstatfs64 269
+#define __NR_tgkill 270
+#define __NR_utimes 271
+#define __NR_fadvise64_64 272
+#define __NR_mbind 274
+#define __NR_get_mempolicy 275
+#define __NR_set_mempolicy 276
+#define __NR_mq_open 277
+#define __NR_mq_unlink 278
+#define __NR_mq_timedsend 279
+#define __NR_mq_timedreceive 280
+#define __NR_mq_notify 281
+#define __NR_mq_getsetattr 282
+#define __NR_kexec_load 283
+#define __NR_waitid 284
+#define __NR_add_key 285
+#define __NR_request_key 286
+#define __NR_keyctl 287
+#define __NR_ioprio_set 288
+#define __NR_ioprio_get 289
+#define __NR_inotify_init 290
+#define __NR_inotify_add_watch 291
+#define __NR_inotify_rm_watch 292
+#define __NR_migrate_pages 294
+#define __NR_openat 295
+#define __NR_mkdirat 296
+#define __NR_mknodat 297
+#define __NR_fchownat 298
+#define __NR_futimesat 299
+#define __NR_fstatat64 300
+#define __NR_unlinkat 301
+#define __NR_renameat 302
+#define __NR_linkat 303
+#define __NR_symlinkat 304
+#define __NR_readlinkat 305
+#define __NR_fchmodat 306
+#define __NR_faccessat 307
+#define __NR_pselect6 308
+#define __NR_ppoll 309
+#define __NR_unshare 310
+#define __NR_set_robust_list 311
+#define __NR_get_robust_list 312
+#define __NR_splice 313
+#define __NR_sync_file_range 314
+#define __NR_tee 315
+#define __NR_vmsplice 316
+#define __NR_move_pages 317
+#define __NR_getcpu 318
+#define __NR_epoll_pwait 319
+#define __NR_utimensat 320
+#define __NR_signalfd 321
+#define __NR_timerfd_create 322
+#define __NR_eventfd 323
+#define __NR_fallocate 324
+#define __NR_timerfd_settime32 325
+#define __NR_timerfd_gettime32 326
+#define __NR_signalfd4 327
+#define __NR_eventfd2 328
+#define __NR_epoll_create1 329
+#define __NR_dup3 330
+#define __NR_pipe2 331
+#define __NR_inotify_init1 332
+#define __NR_preadv 333
+#define __NR_pwritev 334
+#define __NR_rt_tgsigqueueinfo 335
+#define __NR_perf_event_open 336
+#define __NR_fanotify_init 337
+#define __NR_fanotify_mark 338
+#define __NR_prlimit64 339
+#define __NR_socket 340
+#define __NR_bind 341
+#define __NR_connect 342
+#define __NR_listen 343
+#define __NR_accept 344
+#define __NR_getsockname 345
+#define __NR_getpeername 346
+#define __NR_socketpair 347
+#define __NR_send 348
+#define __NR_sendto 349
+#define __NR_recv 350
+#define __NR_recvfrom 351
+#define __NR_shutdown 352
+#define __NR_setsockopt 353
+#define __NR_getsockopt 354
+#define __NR_sendmsg 355
+#define __NR_recvmsg 356
+#define __NR_recvmmsg 357
+#define __NR_accept4 358
+#define __NR_name_to_handle_at 359
+#define __NR_open_by_handle_at 360
+#define __NR_clock_adjtime 361
+#define __NR_syncfs 362
+#define __NR_sendmmsg 363
+#define __NR_setns 364
+#define __NR_process_vm_readv 365
+#define __NR_process_vm_writev 366
+#define __NR_kcmp 367
+#define __NR_finit_module 368
+#define __NR_sched_getattr 369
+#define __NR_sched_setattr 370
+#define __NR_renameat2 371
+#define __NR_seccomp 372
+#define __NR_getrandom 373
+#define __NR_memfd_create 374
+#define __NR_bpf 375
+#define __NR_execveat 376
+#define __NR_userfaultfd 377
+#define __NR_membarrier 378
+#define __NR_mlock2 379
+#define __NR_copy_file_range 380
+#define __NR_preadv2 381
+#define __NR_pwritev2 382
+#define __NR_statx 383
+#define __NR_pkey_mprotect 384
+#define __NR_pkey_alloc 385
+#define __NR_pkey_free 386
+#define __NR_rseq 387
+#define __NR_semget 393
+#define __NR_semctl 394
+#define __NR_shmget 395
+#define __NR_shmctl 396
+#define __NR_shmat 397
+#define __NR_shmdt 398
+#define __NR_msgget 399
+#define __NR_msgsnd 400
+#define __NR_msgrcv 401
+#define __NR_msgctl 402
+#define __NR_clock_gettime64 403
+#define __NR_clock_settime64 404
+#define __NR_clock_adjtime64 405
+#define __NR_clock_getres_time64 406
+#define __NR_clock_nanosleep_time64 407
+#define __NR_timer_gettime64 408
+#define __NR_timer_settime64 409
+#define __NR_timerfd_gettime64 410
+#define __NR_timerfd_settime64 411
+#define __NR_utimensat_time64 412
+#define __NR_pselect6_time64 413
+#define __NR_ppoll_time64 414
+#define __NR_io_pgetevents_time64 416
+#define __NR_recvmmsg_time64 417
+#define __NR_mq_timedsend_time64 418
+#define __NR_mq_timedreceive_time64 419
+#define __NR_semtimedop_time64 420
+#define __NR_rt_sigtimedwait_time64 421
+#define __NR_futex_time64 422
+#define __NR_sched_rr_get_interval_time64 423
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_clone3 435
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_epoll_pwait2 441
+#define __NR_mount_setattr 442
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_restrict_self 446
+
diff --git a/libc-top-half/musl/arch/sh/bits/user.h b/libc-top-half/musl/arch/sh/bits/user.h
new file mode 100644
index 0000000..07fe843
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/bits/user.h
@@ -0,0 +1,51 @@
+#undef __WORDSIZE
+#define __WORDSIZE 32
+
+#define REG_REG0 0
+#define REG_REG15 15
+#define REG_PC 16
+#define REG_PR 17
+#define REG_SR 18
+#define REG_GBR 19
+#define REG_MACH 20
+#define REG_MACL 21
+#define REG_SYSCALL 22
+#define REG_FPREG0 23
+#define REG_FPREG15 38
+#define REG_XFREG0 39
+#define REG_XFREG15 54
+#define REG_FPSCR 55
+#define REG_FPUL 56
+
+struct user_fpu_struct {
+ unsigned long fp_regs[16];
+ unsigned long xfp_regs[16];
+ unsigned long fpscr;
+ unsigned long fpul;
+};
+
+#define ELF_NGREG 23
+typedef unsigned long elf_greg_t;
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+typedef struct user_fpu_struct elf_fpregset_t;
+
+struct user {
+ struct {
+ unsigned long regs[16];
+ unsigned long pc, pr, sr, gbr, mach, macl;
+ long tra;
+ } regs;
+ struct user_fpu_struct fpu;
+ int u_fpvalid;
+ unsigned long u_tsize;
+ unsigned long u_dsize;
+ unsigned long u_ssize;
+ unsigned long start_code;
+ unsigned long start_data;
+ unsigned long start_stack;
+ long int signal;
+ unsigned long u_ar0;
+ struct user_fpu_struct *u_fpstate;
+ unsigned long magic;
+ char u_comm[32];
+};
diff --git a/libc-top-half/musl/arch/sh/crt_arch.h b/libc-top-half/musl/arch/sh/crt_arch.h
new file mode 100644
index 0000000..f341c8f
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/crt_arch.h
@@ -0,0 +1,78 @@
+#ifdef __SH_FDPIC__
+
+__asm__(
+".text \n"
+".global " START " \n"
+START ": \n"
+" tst r8, r8 \n"
+" bf 1f \n"
+" mov #68, r3 \n"
+" add r3, r3 \n"
+" mov #8, r4 \n"
+" swap.w r4, r4 \n"
+" trapa #31 \n"
+" nop \n"
+" nop \n"
+" nop \n"
+" nop \n"
+"1: nop \n"
+#ifndef SHARED
+" mov r8, r4 \n"
+" mova 1f, r0 \n"
+" mov.l 1f, r5 \n"
+" mov.l 1f+4, r6 \n"
+" add r0, r5 \n"
+" mov.l 4f, r1 \n"
+"5: bsrf r1 \n"
+" add r0, r6 \n"
+" mov r0, r12 \n"
+#endif
+" mov r10, r5 \n"
+" mov r15, r4 \n"
+" mov.l r9, @-r15 \n"
+" mov.l r8, @-r15 \n"
+" mov #-16, r0 \n"
+" mov.l 2f, r1 \n"
+"3: bsrf r1 \n"
+" and r0, r15 \n"
+".align 2 \n"
+"1: .long __ROFIXUP_LIST__@PCREL \n"
+" .long __ROFIXUP_END__@PCREL + 4 \n"
+"2: .long " START "_c@PCREL - (3b+4-.) \n"
+#ifndef SHARED
+"4: .long __fdpic_fixup@PCREL - (5b+4-.) \n"
+#endif
+);
+
+#ifndef SHARED
+#include "fdpic_crt.h"
+#endif
+
+#else
+
+__asm__(
+".text \n"
+".global " START " \n"
+START ": \n"
+" mova 1f, r0 \n"
+" mov.l 1f, r5 \n"
+" add r0, r5 \n"
+" mov r15, r4 \n"
+" mov #-16, r0 \n"
+" mov.l 2f, r1 \n"
+"3: bsrf r1 \n"
+" and r0, r15 \n"
+".align 2 \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+"1: .long _DYNAMIC-. \n"
+"2: .long " START "_c@PCREL - (3b+4-.) \n"
+);
+
+#endif
+
+/* used by gcc for switching the FPU between single and double precision */
+#ifdef SHARED
+__attribute__((__visibility__("hidden")))
+#endif
+const unsigned long __fpscr_values[2] = { 0, 0x80000 };
diff --git a/libc-top-half/musl/arch/sh/ksigaction.h b/libc-top-half/musl/arch/sh/ksigaction.h
new file mode 100644
index 0000000..714ae61
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/ksigaction.h
@@ -0,0 +1,10 @@
+#include <features.h>
+
+struct k_sigaction {
+ void (*handler)(int);
+ unsigned long flags;
+ void *restorer;
+ unsigned mask[2];
+};
+
+extern hidden unsigned char __restore[], __restore_rt[];
diff --git a/libc-top-half/musl/arch/sh/kstat.h b/libc-top-half/musl/arch/sh/kstat.h
new file mode 100644
index 0000000..af449c9
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/kstat.h
@@ -0,0 +1,21 @@
+struct kstat {
+ dev_t st_dev;
+ int __st_dev_padding;
+ long __st_ino_truncated;
+ mode_t st_mode;
+ nlink_t st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ int __st_rdev_padding;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ ino_t st_ino;
+};
diff --git a/libc-top-half/musl/arch/sh/pthread_arch.h b/libc-top-half/musl/arch/sh/pthread_arch.h
new file mode 100644
index 0000000..199c2d5
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/pthread_arch.h
@@ -0,0 +1,16 @@
+static inline uintptr_t __get_tp()
+{
+ uintptr_t tp;
+ __asm__ ("stc gbr,%0" : "=r" (tp) );
+ return tp;
+}
+
+#define TLS_ABOVE_TP
+#define GAP_ABOVE_TP 8
+
+#define MC_PC pc
+
+#ifdef __FDPIC__
+#define MC_GOT gregs[12]
+#define CANCEL_GOT (*(uintptr_t *)((char *)__syscall_cp_asm+sizeof(uintptr_t)))
+#endif
diff --git a/libc-top-half/musl/arch/sh/reloc.h b/libc-top-half/musl/arch/sh/reloc.h
new file mode 100644
index 0000000..17b1a9a
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/reloc.h
@@ -0,0 +1,52 @@
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define ENDIAN_SUFFIX "eb"
+#else
+#define ENDIAN_SUFFIX ""
+#endif
+
+#if __SH_FPU_ANY__ || __SH4__
+#define FP_SUFFIX ""
+#else
+#define FP_SUFFIX "-nofpu"
+#endif
+
+#if __SH_FDPIC__
+#define ABI_SUFFIX "-fdpic"
+#else
+#define ABI_SUFFIX ""
+#endif
+
+#define LDSO_ARCH "sh" ENDIAN_SUFFIX FP_SUFFIX ABI_SUFFIX
+
+#define TPOFF_K 0
+
+#define REL_SYMBOLIC R_SH_DIR32
+#define REL_OFFSET R_SH_REL32
+#define REL_GOT R_SH_GLOB_DAT
+#define REL_PLT R_SH_JMP_SLOT
+#define REL_RELATIVE R_SH_RELATIVE
+#define REL_COPY R_SH_COPY
+#define REL_DTPMOD R_SH_TLS_DTPMOD32
+#define REL_DTPOFF R_SH_TLS_DTPOFF32
+#define REL_TPOFF R_SH_TLS_TPOFF32
+
+#define DL_NOMMU_SUPPORT 1
+
+#if __SH_FDPIC__
+#define REL_FUNCDESC R_SH_FUNCDESC
+#define REL_FUNCDESC_VAL R_SH_FUNCDESC_VALUE
+#undef REL_RELATIVE
+#define DL_FDPIC 1
+#define FDPIC_CONSTDISP_FLAG 0x100
+#define CRTJMP(pc,sp) do { \
+ register size_t r8 __asm__("r8") = ((size_t *)(sp))[-2]; \
+ __asm__ __volatile__( "jmp @%0 ; mov %1,r15" \
+ : : "r"(pc), "r"(sp), "r"(r8) : "memory" ); } while(0)
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+ "mov.l 1f,%0 ; add %1,%0 ; bra 2f ; nop ; .align 2 \n" \
+ "1: .long " #sym "@GOTOFFFUNCDESC \n2:" \
+ : "=&r"(*fp) : "r"(got) : "memory" )
+#else
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "jmp @%0 ; mov %1,r15" : : "r"(pc), "r"(sp) : "memory" )
+#endif
diff --git a/libc-top-half/musl/arch/sh/syscall_arch.h b/libc-top-half/musl/arch/sh/syscall_arch.h
new file mode 100644
index 0000000..628d8d3
--- /dev/null
+++ b/libc-top-half/musl/arch/sh/syscall_arch.h
@@ -0,0 +1,93 @@
+#define __SYSCALL_LL_E(x) \
+((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
+((union { long long ll; long l[2]; }){ .ll = x }).l[1]
+#define __SYSCALL_LL_O(x) __SYSCALL_LL_E((x))
+#define __SYSCALL_LL_PRW(x) 0, __SYSCALL_LL_E((x))
+
+/* The extra OR instructions are to work around a hardware bug:
+ * http://documentation.renesas.com/doc/products/mpumcu/tu/tnsh7456ae.pdf
+ */
+#define __asm_syscall(trapno, ...) do { \
+ __asm__ __volatile__ ( \
+ "trapa #31\n" \
+ "or r0, r0\n" \
+ "or r0, r0\n" \
+ "or r0, r0\n" \
+ "or r0, r0\n" \
+ "or r0, r0\n" \
+ : "=r"(r0) : __VA_ARGS__ : "memory"); \
+ return r0; \
+ } while (0)
+
+static inline long __syscall0(long n)
+{
+ register long r3 __asm__("r3") = n;
+ register long r0 __asm__("r0");
+ __asm_syscall(16, "r"(r3));
+}
+
+static inline long __syscall1(long n, long a)
+{
+ register long r3 __asm__("r3") = n;
+ register long r4 __asm__("r4") = a;
+ register long r0 __asm__("r0");
+ __asm_syscall(17, "r"(r3), "r"(r4));
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+ register long r3 __asm__("r3") = n;
+ register long r4 __asm__("r4") = a;
+ register long r5 __asm__("r5") = b;
+ register long r0 __asm__("r0");
+ __asm_syscall(18, "r"(r3), "r"(r4), "r"(r5));
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+ register long r3 __asm__("r3") = n;
+ register long r4 __asm__("r4") = a;
+ register long r5 __asm__("r5") = b;
+ register long r6 __asm__("r6") = c;
+ register long r0 __asm__("r0");
+ __asm_syscall(19, "r"(r3), "r"(r4), "r"(r5), "r"(r6));
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+ register long r3 __asm__("r3") = n;
+ register long r4 __asm__("r4") = a;
+ register long r5 __asm__("r5") = b;
+ register long r6 __asm__("r6") = c;
+ register long r7 __asm__("r7") = d;
+ register long r0 __asm__("r0");
+ __asm_syscall(20, "r"(r3), "r"(r4), "r"(r5), "r"(r6), "r"(r7));
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long r3 __asm__("r3") = n;
+ register long r4 __asm__("r4") = a;
+ register long r5 __asm__("r5") = b;
+ register long r6 __asm__("r6") = c;
+ register long r7 __asm__("r7") = d;
+ register long r0 __asm__("r0") = e;
+ __asm_syscall(21, "r"(r3), "r"(r4), "r"(r5), "r"(r6), "r"(r7), "0"(r0));
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register long r3 __asm__("r3") = n;
+ register long r4 __asm__("r4") = a;
+ register long r5 __asm__("r5") = b;
+ register long r6 __asm__("r6") = c;
+ register long r7 __asm__("r7") = d;
+ register long r0 __asm__("r0") = e;
+ register long r1 __asm__("r1") = f;
+ __asm_syscall(22, "r"(r3), "r"(r4), "r"(r5), "r"(r6), "r"(r7), "0"(r0), "r"(r1));
+}
+
+#define SYSCALL_IPC_BROKEN_MODE
+
+#define SIOCGSTAMP_OLD (2U<<30 | 's'<<8 | 100 | 8<<16)
+#define SIOCGSTAMPNS_OLD (2U<<30 | 's'<<8 | 101 | 8<<16)
diff --git a/libc-top-half/musl/arch/wasm32/atomic_arch.h b/libc-top-half/musl/arch/wasm32/atomic_arch.h
new file mode 100644
index 0000000..dd9428c
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/atomic_arch.h
@@ -0,0 +1,7 @@
+#define a_barrier() (__sync_synchronize())
+#define a_cas(p, t, s) (__sync_val_compare_and_swap((p), (t), (s)))
+#define a_crash() (__builtin_trap())
+#define a_clz_32 __builtin_clz
+#define a_clz_64 __builtin_clzll
+#define a_ctz_32 __builtin_ctz
+#define a_ctz_64 __builtin_ctzll
diff --git a/libc-top-half/musl/arch/wasm32/bits/alltypes.h.in b/libc-top-half/musl/arch/wasm32/bits/alltypes.h.in
new file mode 100644
index 0000000..5dcfc9a
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/bits/alltypes.h.in
@@ -0,0 +1,58 @@
+#define _Addr long
+#define _Int64 long long
+#define _Reg long long
+
+#define __BYTE_ORDER __BYTE_ORDER__
+
+#define __LONG_MAX __LONG_MAX__
+
+/*
+ * Rather than define everything ourselves here in the musl layer, for
+ * WASI, reference the definitions in the lower layers.
+ */
+
+#if defined(__NEED_wchar_t) && !defined(__DEFINED_wchar_t)
+#define __need_wchar_t
+#include <stddef.h>
+#define __DEFINED_wchar_t
+#endif
+
+#if defined(__NEED_wint_t) && !defined(__DEFINED_wint_t)
+#define __need_wint_t
+#include <stddef.h>
+#define __DEFINED_wint_t
+#endif
+
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+
+#if defined(__NEED_max_align_t) && !defined(__DEFINED_max_align_t)
+#define __need_max_align_t
+#include <stddef.h>
+#define __DEFINED_max_align_t
+#endif
+
+#if defined(__NEED_time_t) && !defined(__DEFINED_time_t)
+#include <__typedef_time_t.h>
+#define __DEFINED_time_t
+#endif
+
+#if defined(__NEED_suseconds_t) && !defined(__DEFINED_suseconds_t)
+#include <__typedef_suseconds_t.h>
+#define __DEFINED_suseconds_t
+#endif
+
+#if defined(__NEED_clockid_t) && !defined(__DEFINED_clockid_t)
+#include <__typedef_clockid_t.h>
+#define __DEFINED_clockid_t
+#endif
+
+#if defined(__NEED_sigset_t) && !defined(__DEFINED_sigset_t)
+#include <__typedef_sigset_t.h>
+#define __DEFINED_sigset_t
+#endif
+
+#if defined(__NEED_clock_t) && !defined(__DEFINED_clock_t)
+#include <__typedef_clock_t.h>
+#define __DEFINED_clock_t
+#endif
diff --git a/libc-top-half/musl/arch/wasm32/bits/dirent.h b/libc-top-half/musl/arch/wasm32/bits/dirent.h
new file mode 100644
index 0000000..55f2bc9
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/bits/dirent.h
@@ -0,0 +1 @@
+#include <__struct_dirent.h>
diff --git a/libc-top-half/musl/arch/wasm32/bits/fcntl.h b/libc-top-half/musl/arch/wasm32/bits/fcntl.h
new file mode 100644
index 0000000..a2f3341
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/bits/fcntl.h
@@ -0,0 +1 @@
+/* Use the WASI libc fcntl implementation bits. */
diff --git a/libc-top-half/musl/arch/wasm32/bits/float.h b/libc-top-half/musl/arch/wasm32/bits/float.h
new file mode 100644
index 0000000..719c790
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/bits/float.h
@@ -0,0 +1,16 @@
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L
+#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
+#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L
+#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L
+
+#define LDBL_MANT_DIG 113
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_MAX_EXP 16384
+
+#define LDBL_DIG 33
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MAX_10_EXP 4932
+
+#define DECIMAL_DIG 36
diff --git a/libc-top-half/musl/arch/wasm32/bits/ioctl.h b/libc-top-half/musl/arch/wasm32/bits/ioctl.h
new file mode 100644
index 0000000..b4bf7c7
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/bits/ioctl.h
@@ -0,0 +1 @@
+/* Use the WASI libc ioctl implementation bits. */
diff --git a/libc-top-half/musl/arch/wasm32/bits/limits.h b/libc-top-half/musl/arch/wasm32/bits/limits.h
new file mode 100644
index 0000000..801bc48
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/bits/limits.h
@@ -0,0 +1 @@
+#include <__macro_PAGESIZE.h>
diff --git a/libc-top-half/musl/arch/wasm32/bits/posix.h b/libc-top-half/musl/arch/wasm32/bits/posix.h
new file mode 100644
index 0000000..387a3e4
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_ILP32_OFFBIG (1)
+#define _POSIX_V7_ILP32_OFFBIG (1)
diff --git a/libc-top-half/musl/arch/wasm32/bits/reg.h b/libc-top-half/musl/arch/wasm32/bits/reg.h
new file mode 100644
index 0000000..2633f39
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/bits/reg.h
@@ -0,0 +1,2 @@
+#undef __WORDSIZE
+#define __WORDSIZE 64
diff --git a/libc-top-half/musl/arch/wasm32/bits/signal.h b/libc-top-half/musl/arch/wasm32/bits/signal.h
new file mode 100644
index 0000000..77e8d8c
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/bits/signal.h
@@ -0,0 +1,40 @@
+#ifdef _WASI_EMULATED_SIGNAL
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL 29
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
+
+#endif
diff --git a/libc-top-half/musl/arch/wasm32/bits/stat.h b/libc-top-half/musl/arch/wasm32/bits/stat.h
new file mode 100644
index 0000000..67a0e72
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/bits/stat.h
@@ -0,0 +1 @@
+#include <__struct_stat.h>
diff --git a/libc-top-half/musl/arch/wasm32/bits/stdint.h b/libc-top-half/musl/arch/wasm32/bits/stdint.h
new file mode 100644
index 0000000..6e7c770
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/bits/stdint.h
@@ -0,0 +1,20 @@
+typedef int16_t int_fast16_t;
+typedef int32_t int_fast32_t;
+typedef uint16_t uint_fast16_t;
+typedef uint32_t uint_fast32_t;
+
+#define INT_FAST16_MIN INT16_MIN
+#define INT_FAST32_MIN INT32_MIN
+
+#define INT_FAST16_MAX INT16_MAX
+#define INT_FAST32_MAX INT32_MAX
+
+#define UINT_FAST16_MAX UINT16_MAX
+#define UINT_FAST32_MAX UINT32_MAX
+
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#define SIZE_MAX UINT32_MAX
diff --git a/libc-top-half/musl/arch/wasm32/fp_arch.h b/libc-top-half/musl/arch/wasm32/fp_arch.h
new file mode 100644
index 0000000..707d512
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/fp_arch.h
@@ -0,0 +1,25 @@
+// WebAssembly has no floating-point exceptions or alternate rounding modes,
+// so there's no need to prevent expressions from moving or force their
+// evaluation.
+
+#define fp_barrierf fp_barrierf
+static inline float fp_barrierf(float x)
+{
+ return x;
+}
+
+#define fp_barrier fp_barrier
+static inline double fp_barrier(double x)
+{
+ return x;
+}
+
+#define fp_force_evalf fp_force_evalf
+static inline void fp_force_evalf(float x)
+{
+}
+
+#define fp_force_eval fp_force_eval
+static inline void fp_force_eval(double x)
+{
+}
diff --git a/libc-top-half/musl/arch/wasm32/pthread_arch.h b/libc-top-half/musl/arch/wasm32/pthread_arch.h
new file mode 100644
index 0000000..58e76ab
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/pthread_arch.h
@@ -0,0 +1,5 @@
+extern _Thread_local struct __pthread __wasilibc_pthread_self;
+
+static inline uintptr_t __get_tp() {
+ return (uintptr_t)&__wasilibc_pthread_self;
+}
diff --git a/libc-top-half/musl/arch/wasm32/reloc.h b/libc-top-half/musl/arch/wasm32/reloc.h
new file mode 100644
index 0000000..91b4840
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/reloc.h
@@ -0,0 +1 @@
+#define LDSO_ARCH "wasm32"
diff --git a/libc-top-half/musl/arch/wasm32/syscall_arch.h b/libc-top-half/musl/arch/wasm32/syscall_arch.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/arch/wasm32/syscall_arch.h
diff --git a/libc-top-half/musl/arch/x32/atomic_arch.h b/libc-top-half/musl/arch/x32/atomic_arch.h
new file mode 100644
index 0000000..918c2d4
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/atomic_arch.h
@@ -0,0 +1,121 @@
+#define a_cas a_cas
+static inline int a_cas(volatile int *p, int t, int s)
+{
+ __asm__ __volatile__ (
+ "lock ; cmpxchg %3, %1"
+ : "=a"(t), "=m"(*p) : "a"(t), "r"(s) : "memory" );
+ return t;
+}
+
+#define a_swap a_swap
+static inline int a_swap(volatile int *p, int v)
+{
+ __asm__ __volatile__(
+ "xchg %0, %1"
+ : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
+ return v;
+}
+
+#define a_fetch_add a_fetch_add
+static inline int a_fetch_add(volatile int *p, int v)
+{
+ __asm__ __volatile__(
+ "lock ; xadd %0, %1"
+ : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
+ return v;
+}
+
+#define a_and a_and
+static inline void a_and(volatile int *p, int v)
+{
+ __asm__ __volatile__(
+ "lock ; and %1, %0"
+ : "=m"(*p) : "r"(v) : "memory" );
+}
+
+#define a_or a_or
+static inline void a_or(volatile int *p, int v)
+{
+ __asm__ __volatile__(
+ "lock ; or %1, %0"
+ : "=m"(*p) : "r"(v) : "memory" );
+}
+
+#define a_and_64 a_and_64
+static inline void a_and_64(volatile uint64_t *p, uint64_t v)
+{
+ __asm__ __volatile(
+ "lock ; and %1, %0"
+ : "=m"(*p) : "r"(v) : "memory" );
+}
+
+#define a_or_64 a_or_64
+static inline void a_or_64(volatile uint64_t *p, uint64_t v)
+{
+ __asm__ __volatile__(
+ "lock ; or %1, %0"
+ : "=m"(*p) : "r"(v) : "memory" );
+}
+
+#define a_inc a_inc
+static inline void a_inc(volatile int *p)
+{
+ __asm__ __volatile__(
+ "lock ; incl %0"
+ : "=m"(*p) : "m"(*p) : "memory" );
+}
+
+#define a_dec a_dec
+static inline void a_dec(volatile int *p)
+{
+ __asm__ __volatile__(
+ "lock ; decl %0"
+ : "=m"(*p) : "m"(*p) : "memory" );
+}
+
+#define a_store a_store
+static inline void a_store(volatile int *p, int x)
+{
+ __asm__ __volatile__(
+ "mov %1, %0 ; lock ; orl $0,(%%rsp)"
+ : "=m"(*p) : "r"(x) : "memory" );
+}
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ __asm__ __volatile__( "" : : : "memory" );
+}
+
+#define a_spin a_spin
+static inline void a_spin()
+{
+ __asm__ __volatile__( "pause" : : : "memory" );
+}
+
+#define a_crash a_crash
+static inline void a_crash()
+{
+ __asm__ __volatile__( "hlt" : : : "memory" );
+}
+
+#define a_ctz_64 a_ctz_64
+static inline int a_ctz_64(uint64_t x)
+{
+ __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) );
+ return x;
+}
+
+#define a_ctz_32 a_ctz_32
+static inline int a_ctz_32(uint32_t x)
+{
+ __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) );
+ return x;
+}
+
+#define a_clz_64 a_clz_64
+static inline int a_clz_64(uint64_t x)
+{
+ __asm__( "bsr %1,%0 ; xor $63,%0" : "=r"(x) : "r"(x) );
+ return x;
+}
diff --git a/libc-top-half/musl/arch/x32/bits/alltypes.h.in b/libc-top-half/musl/arch/x32/bits/alltypes.h.in
new file mode 100644
index 0000000..9f9d241
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/alltypes.h.in
@@ -0,0 +1,24 @@
+#define _Addr int
+#define _Int64 long long
+#define _Reg long long
+
+#define __BYTE_ORDER 1234
+#define __LONG_MAX 0x7fffffffL
+
+#ifndef __cplusplus
+#ifdef __WCHAR_TYPE__
+TYPEDEF __WCHAR_TYPE__ wchar_t;
+#else
+TYPEDEF long wchar_t;
+#endif
+#endif
+
+#if defined(__FLT_EVAL_METHOD__) && __FLT_EVAL_METHOD__ == 2
+TYPEDEF long double float_t;
+TYPEDEF long double double_t;
+#else
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+#endif
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/x32/bits/fcntl.h b/libc-top-half/musl/arch/x32/bits/fcntl.h
new file mode 100644
index 0000000..08627f8
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/fcntl.h
@@ -0,0 +1,40 @@
+#define O_CREAT 0100
+#define O_EXCL 0200
+#define O_NOCTTY 0400
+#define O_TRUNC 01000
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_DSYNC 010000
+#define O_SYNC 04010000
+#define O_RSYNC 04010000
+#define O_DIRECTORY 0200000
+#define O_NOFOLLOW 0400000
+#define O_CLOEXEC 02000000
+
+#define O_ASYNC 020000
+#define O_DIRECT 040000
+#define O_LARGEFILE 0100000
+#define O_NOATIME 01000000
+#define O_PATH 010000000
+#define O_TMPFILE 020200000
+#define O_NDELAY O_NONBLOCK
+
+#define F_DUPFD 0
+#define F_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+
+#define F_SETOWN 8
+#define F_GETOWN 9
+#define F_SETSIG 10
+#define F_GETSIG 11
+
+#define F_GETLK 5
+#define F_SETLK 6
+#define F_SETLKW 7
+
+#define F_SETOWN_EX 15
+#define F_GETOWN_EX 16
+
+#define F_GETOWNER_UIDS 17
diff --git a/libc-top-half/musl/arch/x32/bits/fenv.h b/libc-top-half/musl/arch/x32/bits/fenv.h
new file mode 100644
index 0000000..24df041
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/fenv.h
@@ -0,0 +1,34 @@
+#define FE_INVALID 1
+#define __FE_DENORM 2
+#define FE_DIVBYZERO 4
+#define FE_OVERFLOW 8
+#define FE_UNDERFLOW 16
+#define FE_INEXACT 32
+
+#define FE_ALL_EXCEPT 63
+
+#define FE_TONEAREST 0
+#define FE_DOWNWARD 0x400
+#define FE_UPWARD 0x800
+#define FE_TOWARDZERO 0xc00
+
+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;
+} fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *) -1)
diff --git a/libc-top-half/musl/arch/x32/bits/float.h b/libc-top-half/musl/arch/x32/bits/float.h
new file mode 100644
index 0000000..4d8e786
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/float.h
@@ -0,0 +1,20 @@
+#ifdef __FLT_EVAL_METHOD__
+#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
+#else
+#define FLT_EVAL_METHOD 0
+#endif
+
+#define LDBL_TRUE_MIN 3.6451995318824746025e-4951L
+#define LDBL_MIN 3.3621031431120935063e-4932L
+#define LDBL_MAX 1.1897314953572317650e+4932L
+#define LDBL_EPSILON 1.0842021724855044340e-19L
+
+#define LDBL_MANT_DIG 64
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_MAX_EXP 16384
+
+#define LDBL_DIG 18
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MAX_10_EXP 4932
+
+#define DECIMAL_DIG 21
diff --git a/libc-top-half/musl/arch/x32/bits/io.h b/libc-top-half/musl/arch/x32/bits/io.h
new file mode 100644
index 0000000..dd5bddc
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/io.h
@@ -0,0 +1,77 @@
+static __inline void outb(unsigned char __val, unsigned short __port)
+{
+ __asm__ volatile ("outb %0,%1" : : "a" (__val), "dN" (__port));
+}
+
+static __inline void outw(unsigned short __val, unsigned short __port)
+{
+ __asm__ volatile ("outw %0,%1" : : "a" (__val), "dN" (__port));
+}
+
+static __inline void outl(unsigned int __val, unsigned short __port)
+{
+ __asm__ volatile ("outl %0,%1" : : "a" (__val), "dN" (__port));
+}
+
+static __inline unsigned char inb(unsigned short __port)
+{
+ unsigned char __val;
+ __asm__ volatile ("inb %1,%0" : "=a" (__val) : "dN" (__port));
+ return __val;
+}
+
+static __inline unsigned short inw(unsigned short __port)
+{
+ unsigned short __val;
+ __asm__ volatile ("inw %1,%0" : "=a" (__val) : "dN" (__port));
+ return __val;
+}
+
+static __inline unsigned int inl(unsigned short __port)
+{
+ unsigned int __val;
+ __asm__ volatile ("inl %1,%0" : "=a" (__val) : "dN" (__port));
+ return __val;
+}
+
+static __inline void outsb(unsigned short __port, const void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; outsb"
+ : "+S" (__buf), "+c" (__n)
+ : "d" (__port));
+}
+
+static __inline void outsw(unsigned short __port, const void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; outsw"
+ : "+S" (__buf), "+c" (__n)
+ : "d" (__port));
+}
+
+static __inline void outsl(unsigned short __port, const void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; outsl"
+ : "+S" (__buf), "+c"(__n)
+ : "d" (__port));
+}
+
+static __inline void insb(unsigned short __port, void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; insb"
+ : "+D" (__buf), "+c" (__n)
+ : "d" (__port));
+}
+
+static __inline void insw(unsigned short __port, void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; insw"
+ : "+D" (__buf), "+c" (__n)
+ : "d" (__port));
+}
+
+static __inline void insl(unsigned short __port, void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; insl"
+ : "+D" (__buf), "+c" (__n)
+ : "d" (__port));
+}
diff --git a/libc-top-half/musl/arch/x32/bits/ioctl_fix.h b/libc-top-half/musl/arch/x32/bits/ioctl_fix.h
new file mode 100644
index 0000000..83b957b
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/ioctl_fix.h
@@ -0,0 +1,4 @@
+#undef SIOCGSTAMP
+#undef SIOCGSTAMPNS
+#define SIOCGSTAMP 0x8906
+#define SIOCGSTAMPNS 0x8907
diff --git a/libc-top-half/musl/arch/x32/bits/ipc.h b/libc-top-half/musl/arch/x32/bits/ipc.h
new file mode 100644
index 0000000..a12380f
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/ipc.h
@@ -0,0 +1,11 @@
+struct ipc_perm {
+ key_t __ipc_perm_key;
+ uid_t uid;
+ gid_t gid;
+ uid_t cuid;
+ gid_t cgid;
+ mode_t mode;
+ int __ipc_perm_seq;
+ long long __pad1;
+ long long __pad2;
+};
diff --git a/libc-top-half/musl/arch/x32/bits/limits.h b/libc-top-half/musl/arch/x32/bits/limits.h
new file mode 100644
index 0000000..07743b6
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/limits.h
@@ -0,0 +1 @@
+#define PAGESIZE 4096
diff --git a/libc-top-half/musl/arch/x32/bits/mman.h b/libc-top-half/musl/arch/x32/bits/mman.h
new file mode 100644
index 0000000..ba2d6f7
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/mman.h
@@ -0,0 +1 @@
+#define MAP_32BIT 0x40
diff --git a/libc-top-half/musl/arch/x32/bits/msg.h b/libc-top-half/musl/arch/x32/bits/msg.h
new file mode 100644
index 0000000..63ae987
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/msg.h
@@ -0,0 +1,15 @@
+struct msqid_ds {
+ struct ipc_perm msg_perm;
+ time_t msg_stime;
+ time_t msg_rtime;
+ time_t msg_ctime;
+ unsigned long msg_cbytes;
+ long __unused1;
+ msgqnum_t msg_qnum;
+ long __unused2;
+ msglen_t msg_qbytes;
+ long __unused3;
+ pid_t msg_lspid;
+ pid_t msg_lrpid;
+ unsigned long long __unused[2];
+};
diff --git a/libc-top-half/musl/arch/x32/bits/posix.h b/libc-top-half/musl/arch/x32/bits/posix.h
new file mode 100644
index 0000000..30a3871
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_ILP32_OFFBIG 1
+#define _POSIX_V7_ILP32_OFFBIG 1
diff --git a/libc-top-half/musl/arch/x32/bits/ptrace.h b/libc-top-half/musl/arch/x32/bits/ptrace.h
new file mode 100644
index 0000000..7f8a09b
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/ptrace.h
@@ -0,0 +1,13 @@
+#define PTRACE_GET_THREAD_AREA 25
+#define PTRACE_SET_THREAD_AREA 26
+#define PTRACE_ARCH_PRCTL 30
+#define PTRACE_SYSEMU 31
+#define PTRACE_SYSEMU_SINGLESTEP 32
+#define PTRACE_SINGLEBLOCK 33
+
+#define PT_GET_THREAD_AREA PTRACE_GET_THREAD_AREA
+#define PT_SET_THREAD_AREA PTRACE_SET_THREAD_AREA
+#define PT_ARCH_PRCTL PTRACE_ARCH_PRCTL
+#define PT_SYSEMU PTRACE_SYSEMU
+#define PT_SYSEMU_SINGLESTEP PTRACE_SYSEMU_SINGLESTEP
+#define PT_STEPBLOCK PTRACE_SINGLEBLOCK
diff --git a/libc-top-half/musl/arch/x32/bits/reg.h b/libc-top-half/musl/arch/x32/bits/reg.h
new file mode 100644
index 0000000..5faaef1
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/reg.h
@@ -0,0 +1,29 @@
+#undef __WORDSIZE
+#define __WORDSIZE 32
+#define R15 0
+#define R14 1
+#define R13 2
+#define R12 3
+#define RBP 4
+#define RBX 5
+#define R11 6
+#define R10 7
+#define R9 8
+#define R8 9
+#define RAX 10
+#define RCX 11
+#define RDX 12
+#define RSI 13
+#define RDI 14
+#define ORIG_RAX 15
+#define RIP 16
+#define CS 17
+#define EFLAGS 18
+#define RSP 19
+#define SS 20
+#define FS_BASE 21
+#define GS_BASE 22
+#define DS 23
+#define ES 24
+#define FS 25
+#define GS 26
diff --git a/libc-top-half/musl/arch/x32/bits/sem.h b/libc-top-half/musl/arch/x32/bits/sem.h
new file mode 100644
index 0000000..18745f4
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/sem.h
@@ -0,0 +1,11 @@
+struct semid_ds {
+ struct ipc_perm sem_perm;
+ time_t sem_otime;
+ long long __unused1;
+ time_t sem_ctime;
+ long long __unused2;
+ unsigned short sem_nsems;
+ char __sem_nsems_pad[sizeof(long long)-sizeof(short)];
+ long long __unused3;
+ long long __unused4;
+};
diff --git a/libc-top-half/musl/arch/x32/bits/setjmp.h b/libc-top-half/musl/arch/x32/bits/setjmp.h
new file mode 100644
index 0000000..a9262a6
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long long __jmp_buf[8];
diff --git a/libc-top-half/musl/arch/x32/bits/shm.h b/libc-top-half/musl/arch/x32/bits/shm.h
new file mode 100644
index 0000000..fa88c1e
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/shm.h
@@ -0,0 +1,32 @@
+#define SHMLBA 4096
+
+struct shmid_ds {
+ struct ipc_perm shm_perm;
+ size_t shm_segsz;
+ time_t shm_atime;
+ time_t shm_dtime;
+ time_t shm_ctime;
+ pid_t shm_cpid;
+ pid_t shm_lpid;
+ unsigned long shm_nattch;
+ unsigned long __pad0;
+ unsigned long long __pad1;
+ unsigned long long __pad2;
+};
+
+struct shminfo {
+ unsigned long shmmax, __pad0, shmmin, __pad1, shmmni, __pad2,
+ shmseg, __pad3, shmall, __pad4;
+ unsigned long long __unused[4];
+};
+
+struct shm_info {
+ int __used_ids;
+ int __pad_ids;
+ unsigned long shm_tot, __pad0, shm_rss, __pad1, shm_swp, __pad2;
+ unsigned long __swap_attempts, __pad3, __swap_successes, __pad4;
+}
+#ifdef __GNUC__
+__attribute__((__aligned__(8)))
+#endif
+;
diff --git a/libc-top-half/musl/arch/x32/bits/signal.h b/libc-top-half/musl/arch/x32/bits/signal.h
new file mode 100644
index 0000000..097be6f
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/signal.h
@@ -0,0 +1,153 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
+#ifdef _GNU_SOURCE
+enum { REG_R8 = 0 };
+#define REG_R8 REG_R8
+enum { REG_R9 = 1 };
+#define REG_R9 REG_R9
+enum { REG_R10 = 2 };
+#define REG_R10 REG_R10
+enum { REG_R11 = 3 };
+#define REG_R11 REG_R11
+enum { REG_R12 = 4 };
+#define REG_R12 REG_R12
+enum { REG_R13 = 5 };
+#define REG_R13 REG_R13
+enum { REG_R14 = 6 };
+#define REG_R14 REG_R14
+enum { REG_R15 = 7 };
+#define REG_R15 REG_R15
+enum { REG_RDI = 8 };
+#define REG_RDI REG_RDI
+enum { REG_RSI = 9 };
+#define REG_RSI REG_RSI
+enum { REG_RBP = 10 };
+#define REG_RBP REG_RBP
+enum { REG_RBX = 11 };
+#define REG_RBX REG_RBX
+enum { REG_RDX = 12 };
+#define REG_RDX REG_RDX
+enum { REG_RAX = 13 };
+#define REG_RAX REG_RAX
+enum { REG_RCX = 14 };
+#define REG_RCX REG_RCX
+enum { REG_RSP = 15 };
+#define REG_RSP REG_RSP
+enum { REG_RIP = 16 };
+#define REG_RIP REG_RIP
+enum { REG_EFL = 17 };
+#define REG_EFL REG_EFL
+enum { REG_CSGSFS = 18 };
+#define REG_CSGSFS REG_CSGSFS
+enum { REG_ERR = 19 };
+#define REG_ERR REG_ERR
+enum { REG_TRAPNO = 20 };
+#define REG_TRAPNO REG_TRAPNO
+enum { REG_OLDMASK = 21 };
+#define REG_OLDMASK REG_OLDMASK
+enum { REG_CR2 = 22 };
+#define REG_CR2 REG_CR2
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef long long greg_t, gregset_t[23];
+typedef struct _fpstate {
+ unsigned short cwd, swd, ftw, fop;
+ unsigned long long rip, rdp;
+ unsigned mxcsr, mxcr_mask;
+ struct {
+ unsigned short significand[4], exponent, padding[3];
+ } _st[8];
+ struct {
+ unsigned element[4];
+ } _xmm[16];
+ unsigned padding[24];
+} *fpregset_t;
+struct sigcontext {
+ unsigned long long r8, r9, r10, r11, r12, r13, r14, r15;
+ unsigned long long rdi, rsi, rbp, rbx, rdx, rax, rcx, rsp, rip, eflags;
+ unsigned short cs, gs, fs, __pad0;
+ unsigned long long err, trapno, oldmask, cr2;
+ struct _fpstate *fpstate;
+ unsigned long long __reserved1[8];
+};
+typedef struct {
+ gregset_t gregs;
+ fpregset_t fpregs;
+ unsigned long long __reserved1[8];
+} mcontext_t;
+#else
+typedef struct {
+ unsigned long long __space[32];
+} 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;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ sigset_t uc_sigmask;
+ unsigned long long __fpregs_mem[64];
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 2
+#define SA_SIGINFO 4
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL 29
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
+
diff --git a/libc-top-half/musl/arch/x32/bits/socket.h b/libc-top-half/musl/arch/x32/bits/socket.h
new file mode 100644
index 0000000..8d83001
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/socket.h
@@ -0,0 +1,5 @@
+#define SO_RCVTIMEO 20
+#define SO_SNDTIMEO 21
+#define SO_TIMESTAMP 29
+#define SO_TIMESTAMPNS 35
+#define SO_TIMESTAMPING 37
diff --git a/libc-top-half/musl/arch/x32/bits/stat.h b/libc-top-half/musl/arch/x32/bits/stat.h
new file mode 100644
index 0000000..1f3aa1e
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/stat.h
@@ -0,0 +1,22 @@
+/* copied from kernel definition, but with padding replaced
+ * by the corresponding correctly-sized userspace types. */
+
+struct stat {
+ dev_t st_dev;
+ ino_t st_ino;
+ nlink_t st_nlink;
+
+ mode_t st_mode;
+ uid_t st_uid;
+ gid_t st_gid;
+ unsigned int __pad0;
+ dev_t st_rdev;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+ long long __unused[3];
+};
diff --git a/libc-top-half/musl/arch/x32/bits/statfs.h b/libc-top-half/musl/arch/x32/bits/statfs.h
new file mode 100644
index 0000000..79aec35
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/statfs.h
@@ -0,0 +1,9 @@
+struct statfs {
+ unsigned long f_type, __pad0, f_bsize, __pad1;
+ fsblkcnt_t f_blocks, f_bfree, f_bavail;
+ fsfilcnt_t f_files, f_ffree;
+ fsid_t f_fsid;
+ unsigned long f_namelen, __pad2, f_frsize, __pad3;
+ unsigned long f_flags, __pad4;
+ unsigned long long f_spare[4];
+};
diff --git a/libc-top-half/musl/arch/x32/bits/stdint.h b/libc-top-half/musl/arch/x32/bits/stdint.h
new file mode 100644
index 0000000..d1b2712
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#define SIZE_MAX UINT32_MAX
diff --git a/libc-top-half/musl/arch/x32/bits/syscall.h.in b/libc-top-half/musl/arch/x32/bits/syscall.h.in
new file mode 100644
index 0000000..5d22fa1
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/syscall.h.in
@@ -0,0 +1,349 @@
+#define __NR_read (0x40000000 + 0)
+#define __NR_write (0x40000000 + 1)
+#define __NR_open (0x40000000 + 2)
+#define __NR_close (0x40000000 + 3)
+#define __NR_stat (0x40000000 + 4)
+#define __NR_fstat (0x40000000 + 5)
+#define __NR_lstat (0x40000000 + 6)
+#define __NR_poll (0x40000000 + 7)
+#define __NR_lseek (0x40000000 + 8)
+#define __NR_mmap (0x40000000 + 9)
+#define __NR_mprotect (0x40000000 + 10)
+#define __NR_munmap (0x40000000 + 11)
+#define __NR_brk (0x40000000 + 12)
+#define __NR_rt_sigprocmask (0x40000000 + 14)
+#define __NR_pread64 (0x40000000 + 17)
+#define __NR_pwrite64 (0x40000000 + 18)
+#define __NR_access (0x40000000 + 21)
+#define __NR_pipe (0x40000000 + 22)
+#define __NR_select (0x40000000 + 23)
+#define __NR_sched_yield (0x40000000 + 24)
+#define __NR_mremap (0x40000000 + 25)
+#define __NR_msync (0x40000000 + 26)
+#define __NR_mincore (0x40000000 + 27)
+#define __NR_madvise (0x40000000 + 28)
+#define __NR_shmget (0x40000000 + 29)
+#define __NR_shmat (0x40000000 + 30)
+#define __NR_shmctl (0x40000000 + 31)
+#define __NR_dup (0x40000000 + 32)
+#define __NR_dup2 (0x40000000 + 33)
+#define __NR_pause (0x40000000 + 34)
+#define __NR_nanosleep (0x40000000 + 35)
+#define __NR_getitimer (0x40000000 + 36)
+#define __NR_alarm (0x40000000 + 37)
+#define __NR_setitimer (0x40000000 + 38)
+#define __NR_getpid (0x40000000 + 39)
+#define __NR_sendfile (0x40000000 + 40)
+#define __NR_socket (0x40000000 + 41)
+#define __NR_connect (0x40000000 + 42)
+#define __NR_accept (0x40000000 + 43)
+#define __NR_sendto (0x40000000 + 44)
+#define __NR_shutdown (0x40000000 + 48)
+#define __NR_bind (0x40000000 + 49)
+#define __NR_listen (0x40000000 + 50)
+#define __NR_getsockname (0x40000000 + 51)
+#define __NR_getpeername (0x40000000 + 52)
+#define __NR_socketpair (0x40000000 + 53)
+#define __NR_clone (0x40000000 + 56)
+#define __NR_fork (0x40000000 + 57)
+#define __NR_vfork (0x40000000 + 58)
+#define __NR_exit (0x40000000 + 60)
+#define __NR_wait4 (0x40000000 + 61)
+#define __NR_kill (0x40000000 + 62)
+#define __NR_uname (0x40000000 + 63)
+#define __NR_semget (0x40000000 + 64)
+#define __NR_semop (0x40000000 + 65)
+#define __NR_semctl (0x40000000 + 66)
+#define __NR_shmdt (0x40000000 + 67)
+#define __NR_msgget (0x40000000 + 68)
+#define __NR_msgsnd (0x40000000 + 69)
+#define __NR_msgrcv (0x40000000 + 70)
+#define __NR_msgctl (0x40000000 + 71)
+#define __NR_fcntl (0x40000000 + 72)
+#define __NR_flock (0x40000000 + 73)
+#define __NR_fsync (0x40000000 + 74)
+#define __NR_fdatasync (0x40000000 + 75)
+#define __NR_truncate (0x40000000 + 76)
+#define __NR_ftruncate (0x40000000 + 77)
+#define __NR_getdents (0x40000000 + 78)
+#define __NR_getcwd (0x40000000 + 79)
+#define __NR_chdir (0x40000000 + 80)
+#define __NR_fchdir (0x40000000 + 81)
+#define __NR_rename (0x40000000 + 82)
+#define __NR_mkdir (0x40000000 + 83)
+#define __NR_rmdir (0x40000000 + 84)
+#define __NR_creat (0x40000000 + 85)
+#define __NR_link (0x40000000 + 86)
+#define __NR_unlink (0x40000000 + 87)
+#define __NR_symlink (0x40000000 + 88)
+#define __NR_readlink (0x40000000 + 89)
+#define __NR_chmod (0x40000000 + 90)
+#define __NR_fchmod (0x40000000 + 91)
+#define __NR_chown (0x40000000 + 92)
+#define __NR_fchown (0x40000000 + 93)
+#define __NR_lchown (0x40000000 + 94)
+#define __NR_umask (0x40000000 + 95)
+#define __NR_gettimeofday (0x40000000 + 96)
+#define __NR_getrlimit (0x40000000 + 97)
+#define __NR_getrusage (0x40000000 + 98)
+#define __NR_sysinfo (0x40000000 + 99)
+#define __NR_times (0x40000000 + 100)
+#define __NR_getuid (0x40000000 + 102)
+#define __NR_syslog (0x40000000 + 103)
+#define __NR_getgid (0x40000000 + 104)
+#define __NR_setuid (0x40000000 + 105)
+#define __NR_setgid (0x40000000 + 106)
+#define __NR_geteuid (0x40000000 + 107)
+#define __NR_getegid (0x40000000 + 108)
+#define __NR_setpgid (0x40000000 + 109)
+#define __NR_getppid (0x40000000 + 110)
+#define __NR_getpgrp (0x40000000 + 111)
+#define __NR_setsid (0x40000000 + 112)
+#define __NR_setreuid (0x40000000 + 113)
+#define __NR_setregid (0x40000000 + 114)
+#define __NR_getgroups (0x40000000 + 115)
+#define __NR_setgroups (0x40000000 + 116)
+#define __NR_setresuid (0x40000000 + 117)
+#define __NR_getresuid (0x40000000 + 118)
+#define __NR_setresgid (0x40000000 + 119)
+#define __NR_getresgid (0x40000000 + 120)
+#define __NR_getpgid (0x40000000 + 121)
+#define __NR_setfsuid (0x40000000 + 122)
+#define __NR_setfsgid (0x40000000 + 123)
+#define __NR_getsid (0x40000000 + 124)
+#define __NR_capget (0x40000000 + 125)
+#define __NR_capset (0x40000000 + 126)
+#define __NR_rt_sigsuspend (0x40000000 + 130)
+#define __NR_utime (0x40000000 + 132)
+#define __NR_mknod (0x40000000 + 133)
+#define __NR_personality (0x40000000 + 135)
+#define __NR_ustat (0x40000000 + 136)
+#define __NR_statfs (0x40000000 + 137)
+#define __NR_fstatfs (0x40000000 + 138)
+#define __NR_sysfs (0x40000000 + 139)
+#define __NR_getpriority (0x40000000 + 140)
+#define __NR_setpriority (0x40000000 + 141)
+#define __NR_sched_setparam (0x40000000 + 142)
+#define __NR_sched_getparam (0x40000000 + 143)
+#define __NR_sched_setscheduler (0x40000000 + 144)
+#define __NR_sched_getscheduler (0x40000000 + 145)
+#define __NR_sched_get_priority_max (0x40000000 + 146)
+#define __NR_sched_get_priority_min (0x40000000 + 147)
+#define __NR_sched_rr_get_interval (0x40000000 + 148)
+#define __NR_mlock (0x40000000 + 149)
+#define __NR_munlock (0x40000000 + 150)
+#define __NR_mlockall (0x40000000 + 151)
+#define __NR_munlockall (0x40000000 + 152)
+#define __NR_vhangup (0x40000000 + 153)
+#define __NR_modify_ldt (0x40000000 + 154)
+#define __NR_pivot_root (0x40000000 + 155)
+#define __NR_prctl (0x40000000 + 157)
+#define __NR_arch_prctl (0x40000000 + 158)
+#define __NR_adjtimex (0x40000000 + 159)
+#define __NR_setrlimit (0x40000000 + 160)
+#define __NR_chroot (0x40000000 + 161)
+#define __NR_sync (0x40000000 + 162)
+#define __NR_acct (0x40000000 + 163)
+#define __NR_settimeofday (0x40000000 + 164)
+#define __NR_mount (0x40000000 + 165)
+#define __NR_umount2 (0x40000000 + 166)
+#define __NR_swapon (0x40000000 + 167)
+#define __NR_swapoff (0x40000000 + 168)
+#define __NR_reboot (0x40000000 + 169)
+#define __NR_sethostname (0x40000000 + 170)
+#define __NR_setdomainname (0x40000000 + 171)
+#define __NR_iopl (0x40000000 + 172)
+#define __NR_ioperm (0x40000000 + 173)
+#define __NR_init_module (0x40000000 + 175)
+#define __NR_delete_module (0x40000000 + 176)
+#define __NR_quotactl (0x40000000 + 179)
+#define __NR_getpmsg (0x40000000 + 181)
+#define __NR_putpmsg (0x40000000 + 182)
+#define __NR_afs_syscall (0x40000000 + 183)
+#define __NR_tuxcall (0x40000000 + 184)
+#define __NR_security (0x40000000 + 185)
+#define __NR_gettid (0x40000000 + 186)
+#define __NR_readahead (0x40000000 + 187)
+#define __NR_setxattr (0x40000000 + 188)
+#define __NR_lsetxattr (0x40000000 + 189)
+#define __NR_fsetxattr (0x40000000 + 190)
+#define __NR_getxattr (0x40000000 + 191)
+#define __NR_lgetxattr (0x40000000 + 192)
+#define __NR_fgetxattr (0x40000000 + 193)
+#define __NR_listxattr (0x40000000 + 194)
+#define __NR_llistxattr (0x40000000 + 195)
+#define __NR_flistxattr (0x40000000 + 196)
+#define __NR_removexattr (0x40000000 + 197)
+#define __NR_lremovexattr (0x40000000 + 198)
+#define __NR_fremovexattr (0x40000000 + 199)
+#define __NR_tkill (0x40000000 + 200)
+#define __NR_time (0x40000000 + 201)
+#define __NR_futex (0x40000000 + 202)
+#define __NR_sched_setaffinity (0x40000000 + 203)
+#define __NR_sched_getaffinity (0x40000000 + 204)
+#define __NR_io_destroy (0x40000000 + 207)
+#define __NR_io_getevents (0x40000000 + 208)
+#define __NR_io_cancel (0x40000000 + 210)
+#define __NR_lookup_dcookie (0x40000000 + 212)
+#define __NR_epoll_create (0x40000000 + 213)
+#define __NR_remap_file_pages (0x40000000 + 216)
+#define __NR_getdents64 (0x40000000 + 217)
+#define __NR_set_tid_address (0x40000000 + 218)
+#define __NR_restart_syscall (0x40000000 + 219)
+#define __NR_semtimedop (0x40000000 + 220)
+#define __NR_fadvise64 (0x40000000 + 221)
+#define __NR_timer_settime (0x40000000 + 223)
+#define __NR_timer_gettime (0x40000000 + 224)
+#define __NR_timer_getoverrun (0x40000000 + 225)
+#define __NR_timer_delete (0x40000000 + 226)
+#define __NR_clock_settime (0x40000000 + 227)
+#define __NR_clock_gettime (0x40000000 + 228)
+#define __NR_clock_getres (0x40000000 + 229)
+#define __NR_clock_nanosleep (0x40000000 + 230)
+#define __NR_exit_group (0x40000000 + 231)
+#define __NR_epoll_wait (0x40000000 + 232)
+#define __NR_epoll_ctl (0x40000000 + 233)
+#define __NR_tgkill (0x40000000 + 234)
+#define __NR_utimes (0x40000000 + 235)
+#define __NR_mbind (0x40000000 + 237)
+#define __NR_set_mempolicy (0x40000000 + 238)
+#define __NR_get_mempolicy (0x40000000 + 239)
+#define __NR_mq_open (0x40000000 + 240)
+#define __NR_mq_unlink (0x40000000 + 241)
+#define __NR_mq_timedsend (0x40000000 + 242)
+#define __NR_mq_timedreceive (0x40000000 + 243)
+#define __NR_mq_getsetattr (0x40000000 + 245)
+#define __NR_add_key (0x40000000 + 248)
+#define __NR_request_key (0x40000000 + 249)
+#define __NR_keyctl (0x40000000 + 250)
+#define __NR_ioprio_set (0x40000000 + 251)
+#define __NR_ioprio_get (0x40000000 + 252)
+#define __NR_inotify_init (0x40000000 + 253)
+#define __NR_inotify_add_watch (0x40000000 + 254)
+#define __NR_inotify_rm_watch (0x40000000 + 255)
+#define __NR_migrate_pages (0x40000000 + 256)
+#define __NR_openat (0x40000000 + 257)
+#define __NR_mkdirat (0x40000000 + 258)
+#define __NR_mknodat (0x40000000 + 259)
+#define __NR_fchownat (0x40000000 + 260)
+#define __NR_futimesat (0x40000000 + 261)
+#define __NR_newfstatat (0x40000000 + 262)
+#define __NR_unlinkat (0x40000000 + 263)
+#define __NR_renameat (0x40000000 + 264)
+#define __NR_linkat (0x40000000 + 265)
+#define __NR_symlinkat (0x40000000 + 266)
+#define __NR_readlinkat (0x40000000 + 267)
+#define __NR_fchmodat (0x40000000 + 268)
+#define __NR_faccessat (0x40000000 + 269)
+#define __NR_pselect6 (0x40000000 + 270)
+#define __NR_ppoll (0x40000000 + 271)
+#define __NR_unshare (0x40000000 + 272)
+#define __NR_splice (0x40000000 + 275)
+#define __NR_tee (0x40000000 + 276)
+#define __NR_sync_file_range (0x40000000 + 277)
+#define __NR_utimensat (0x40000000 + 280)
+#define __NR_epoll_pwait (0x40000000 + 281)
+#define __NR_signalfd (0x40000000 + 282)
+#define __NR_timerfd_create (0x40000000 + 283)
+#define __NR_eventfd (0x40000000 + 284)
+#define __NR_fallocate (0x40000000 + 285)
+#define __NR_timerfd_settime (0x40000000 + 286)
+#define __NR_timerfd_gettime (0x40000000 + 287)
+#define __NR_accept4 (0x40000000 + 288)
+#define __NR_signalfd4 (0x40000000 + 289)
+#define __NR_eventfd2 (0x40000000 + 290)
+#define __NR_epoll_create1 (0x40000000 + 291)
+#define __NR_dup3 (0x40000000 + 292)
+#define __NR_pipe2 (0x40000000 + 293)
+#define __NR_inotify_init1 (0x40000000 + 294)
+#define __NR_perf_event_open (0x40000000 + 298)
+#define __NR_fanotify_init (0x40000000 + 300)
+#define __NR_fanotify_mark (0x40000000 + 301)
+#define __NR_prlimit64 (0x40000000 + 302)
+#define __NR_name_to_handle_at (0x40000000 + 303)
+#define __NR_open_by_handle_at (0x40000000 + 304)
+#define __NR_clock_adjtime (0x40000000 + 305)
+#define __NR_syncfs (0x40000000 + 306)
+#define __NR_setns (0x40000000 + 308)
+#define __NR_getcpu (0x40000000 + 309)
+#define __NR_kcmp (0x40000000 + 312)
+#define __NR_finit_module (0x40000000 + 313)
+#define __NR_sched_setattr (0x40000000 + 314)
+#define __NR_sched_getattr (0x40000000 + 315)
+#define __NR_renameat2 (0x40000000 + 316)
+#define __NR_seccomp (0x40000000 + 317)
+#define __NR_getrandom (0x40000000 + 318)
+#define __NR_memfd_create (0x40000000 + 319)
+#define __NR_kexec_file_load (0x40000000 + 320)
+#define __NR_bpf (0x40000000 + 321)
+#define __NR_userfaultfd (0x40000000 + 323)
+#define __NR_membarrier (0x40000000 + 324)
+#define __NR_mlock2 (0x40000000 + 325)
+#define __NR_copy_file_range (0x40000000 + 326)
+#define __NR_pkey_mprotect (0x40000000 + 329)
+#define __NR_pkey_alloc (0x40000000 + 330)
+#define __NR_pkey_free (0x40000000 + 331)
+#define __NR_statx (0x40000000 + 332)
+#define __NR_io_pgetevents (0x40000000 + 333)
+#define __NR_rseq (0x40000000 + 334)
+#define __NR_pidfd_send_signal (0x40000000 + 424)
+#define __NR_io_uring_setup (0x40000000 + 425)
+#define __NR_io_uring_enter (0x40000000 + 426)
+#define __NR_io_uring_register (0x40000000 + 427)
+#define __NR_open_tree (0x40000000 + 428)
+#define __NR_move_mount (0x40000000 + 429)
+#define __NR_fsopen (0x40000000 + 430)
+#define __NR_fsconfig (0x40000000 + 431)
+#define __NR_fsmount (0x40000000 + 432)
+#define __NR_fspick (0x40000000 + 433)
+#define __NR_pidfd_open (0x40000000 + 434)
+#define __NR_clone3 (0x40000000 + 435)
+#define __NR_close_range (0x40000000 + 436)
+#define __NR_openat2 (0x40000000 + 437)
+#define __NR_pidfd_getfd (0x40000000 + 438)
+#define __NR_faccessat2 (0x40000000 + 439)
+#define __NR_process_madvise (0x40000000 + 440)
+#define __NR_epoll_pwait2 (0x40000000 + 441)
+#define __NR_mount_setattr (0x40000000 + 442)
+#define __NR_landlock_create_ruleset (0x40000000 + 444)
+#define __NR_landlock_add_rule (0x40000000 + 445)
+#define __NR_landlock_restrict_self (0x40000000 + 446)
+
+
+#define __NR_rt_sigaction (0x40000000 + 512)
+#define __NR_rt_sigreturn (0x40000000 + 513)
+#define __NR_ioctl (0x40000000 + 514)
+#define __NR_readv (0x40000000 + 515)
+#define __NR_writev (0x40000000 + 516)
+#define __NR_recvfrom (0x40000000 + 517)
+#define __NR_sendmsg (0x40000000 + 518)
+#define __NR_recvmsg (0x40000000 + 519)
+#define __NR_execve (0x40000000 + 520)
+#define __NR_ptrace (0x40000000 + 521)
+#define __NR_rt_sigpending (0x40000000 + 522)
+#define __NR_rt_sigtimedwait (0x40000000 + 523)
+#define __NR_rt_sigqueueinfo (0x40000000 + 524)
+#define __NR_sigaltstack (0x40000000 + 525)
+#define __NR_timer_create (0x40000000 + 526)
+#define __NR_mq_notify (0x40000000 + 527)
+#define __NR_kexec_load (0x40000000 + 528)
+#define __NR_waitid (0x40000000 + 529)
+#define __NR_set_robust_list (0x40000000 + 530)
+#define __NR_get_robust_list (0x40000000 + 531)
+#define __NR_vmsplice (0x40000000 + 532)
+#define __NR_move_pages (0x40000000 + 533)
+#define __NR_preadv (0x40000000 + 534)
+#define __NR_pwritev (0x40000000 + 535)
+#define __NR_rt_tgsigqueueinfo (0x40000000 + 536)
+#define __NR_recvmmsg (0x40000000 + 537)
+#define __NR_sendmmsg (0x40000000 + 538)
+#define __NR_process_vm_readv (0x40000000 + 539)
+#define __NR_process_vm_writev (0x40000000 + 540)
+#define __NR_setsockopt (0x40000000 + 541)
+#define __NR_getsockopt (0x40000000 + 542)
+#define __NR_io_setup (0x40000000 + 543)
+#define __NR_io_submit (0x40000000 + 544)
+#define __NR_execveat (0x40000000 + 545)
+#define __NR_preadv2 (0x40000000 + 546)
+#define __NR_pwritev2 (0x40000000 + 547)
+
diff --git a/libc-top-half/musl/arch/x32/bits/user.h b/libc-top-half/musl/arch/x32/bits/user.h
new file mode 100644
index 0000000..eac82a1
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/bits/user.h
@@ -0,0 +1,41 @@
+#undef __WORDSIZE
+#define __WORDSIZE 32
+
+typedef struct user_fpregs_struct {
+ uint16_t cwd, swd, ftw, fop;
+ uint64_t rip, rdp;
+ uint32_t mxcsr, mxcr_mask;
+ uint32_t st_space[32], xmm_space[64], padding[24];
+} elf_fpregset_t;
+
+struct user_regs_struct {
+ unsigned long r15, r14, r13, r12, rbp, rbx, r11, r10, r9, r8;
+ unsigned long rax, rcx, rdx, rsi, rdi, orig_rax, rip;
+ unsigned long cs, eflags, rsp, ss, fs_base, gs_base, ds, es, fs, gs;
+};
+#define ELF_NGREG 27
+typedef unsigned long 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];
+ unsigned long u_debugreg[8];
+};
+
+#define PAGE_MASK (~(PAGESIZE-1))
+#define NBPG PAGESIZE
+#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/libc-top-half/musl/arch/x32/crt_arch.h b/libc-top-half/musl/arch/x32/crt_arch.h
new file mode 100644
index 0000000..3eec61b
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/crt_arch.h
@@ -0,0 +1,12 @@
+__asm__(
+".text \n"
+".global " START " \n"
+START ": \n"
+" xor %rbp,%rbp \n"
+" mov %rsp,%rdi \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+" lea _DYNAMIC(%rip),%rsi \n"
+" andq $-16,%rsp \n"
+" call " START "_c \n"
+);
diff --git a/libc-top-half/musl/arch/x32/ksigaction.h b/libc-top-half/musl/arch/x32/ksigaction.h
new file mode 100644
index 0000000..c40e356
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/ksigaction.h
@@ -0,0 +1,11 @@
+#include <features.h>
+
+struct k_sigaction {
+ void (*handler)(int);
+ unsigned long flags;
+ void (*restorer)(void);
+ unsigned mask[2];
+};
+
+hidden void __restore_rt();
+#define __restore __restore_rt
diff --git a/libc-top-half/musl/arch/x32/kstat.h b/libc-top-half/musl/arch/x32/kstat.h
new file mode 100644
index 0000000..ce25fce
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/kstat.h
@@ -0,0 +1,22 @@
+struct kstat {
+ dev_t st_dev;
+ ino_t st_ino;
+ nlink_t st_nlink;
+
+ mode_t st_mode;
+ uid_t st_uid;
+ gid_t st_gid;
+ unsigned int __pad0;
+ dev_t st_rdev;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+
+ long long st_atime_sec;
+ long st_atime_nsec;
+ long long st_mtime_sec;
+ long st_mtime_nsec;
+ long long st_ctime_sec;
+ long st_ctime_nsec;
+ long long __unused[3];
+};
diff --git a/libc-top-half/musl/arch/x32/pthread_arch.h b/libc-top-half/musl/arch/x32/pthread_arch.h
new file mode 100644
index 0000000..c1e7716
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/pthread_arch.h
@@ -0,0 +1,12 @@
+static inline uintptr_t __get_tp()
+{
+ uintptr_t tp;
+ __asm__ ("mov %%fs:0,%0" : "=r" (tp) );
+ return tp;
+}
+
+#define MC_PC gregs[REG_RIP]
+
+#define CANARY_PAD
+
+#define tls_mod_off_t unsigned long long
diff --git a/libc-top-half/musl/arch/x32/reloc.h b/libc-top-half/musl/arch/x32/reloc.h
new file mode 100644
index 0000000..dc039ad
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/reloc.h
@@ -0,0 +1,31 @@
+#define LDSO_ARCH "x32"
+
+/* FIXME: x32 is very strange in its use of 64-bit relocation types in
+ * a 32-bit environment. As long as the memory at reloc_addr is
+ * zero-filled prior to relocations, just treating 64-bit relocations
+ * as operating on 32-bit slots should be fine, but this should be
+ * checked. In particular, R_X86_64_64, R_X86_64_DTPOFF64, and
+ * R_X86_64_TPOFF64 may need checking. */
+
+/* The R_X86_64_64, R_X86_64_DTPOFF32, and R_X86_64_TPOFF32 reloc types
+ * were previously mapped in the switch table form of this file; however,
+ * they do not seem to be used/usable for anything. If needed, new
+ * mappings will have to be added. */
+
+#define REL_SYMBOLIC R_X86_64_32
+#define REL_OFFSET R_X86_64_PC32
+#define REL_GOT R_X86_64_GLOB_DAT
+#define REL_PLT R_X86_64_JUMP_SLOT
+#define REL_RELATIVE R_X86_64_RELATIVE
+#define REL_COPY R_X86_64_COPY
+#define REL_DTPMOD R_X86_64_DTPMOD64
+#define REL_DTPOFF R_X86_64_DTPOFF64
+#define REL_TPOFF R_X86_64_TPOFF64
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "mov %1,%%esp ; jmp *%0" : : "r"((uint64_t)(uintptr_t)pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+ ".hidden " #sym "\n" \
+ " lea " #sym "(%%rip),%0\n" \
+ : "=r"(*fp) : : "memory" )
diff --git a/libc-top-half/musl/arch/x32/syscall_arch.h b/libc-top-half/musl/arch/x32/syscall_arch.h
new file mode 100644
index 0000000..e0111cc
--- /dev/null
+++ b/libc-top-half/musl/arch/x32/syscall_arch.h
@@ -0,0 +1,93 @@
+#define __SYSCALL_LL_E(x) (x)
+#define __SYSCALL_LL_O(x) (x)
+
+#define __scc(X) sizeof(1?(X):0ULL) < 8 ? (unsigned long) (X) : (long long) (X)
+typedef long long syscall_arg_t;
+
+static __inline long __syscall0(long long n)
+{
+ unsigned long ret;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n) : "rcx", "r11", "memory");
+ return ret;
+}
+
+static __inline long __syscall1(long long n, long long a1)
+{
+ unsigned long ret;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1) : "rcx", "r11", "memory");
+ return ret;
+}
+
+static __inline long __syscall2(long long n, long long a1, long long a2)
+{
+ unsigned long ret;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2)
+ : "rcx", "r11", "memory");
+ return ret;
+}
+
+static __inline long __syscall3(long long n, long long a1, long long a2, long long a3)
+{
+ unsigned long ret;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
+ "d"(a3) : "rcx", "r11", "memory");
+ return ret;
+}
+
+static __inline long __syscall4(long long n, long long a1, long long a2, long long a3,
+ long long a4_)
+{
+ unsigned long ret;
+ register long long a4 __asm__("r10") = a4_;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
+ "d"(a3), "r"(a4): "rcx", "r11", "memory");
+ return ret;
+}
+
+static __inline long __syscall5(long long n, long long a1, long long a2, long long a3,
+ long long a4_, long long a5_)
+{
+ unsigned long ret;
+ register long long a4 __asm__("r10") = a4_;
+ register long long a5 __asm__("r8") = a5_;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
+ "d"(a3), "r"(a4), "r"(a5) : "rcx", "r11", "memory");
+ return ret;
+}
+
+static __inline long __syscall6(long long n, long long a1, long long a2, long long a3,
+ long long a4_, long long a5_, long long a6_)
+{
+ unsigned long ret;
+ register long long a4 __asm__("r10") = a4_;
+ register long long a5 __asm__("r8") = a5_;
+ register long long a6 __asm__("r9") = a6_;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
+ "d"(a3), "r"(a4), "r"(a5), "r"(a6) : "rcx", "r11", "memory");
+ return ret;
+}
+
+#undef SYS_futimesat
+
+#define SYS_clock_gettime64 SYS_clock_gettime
+#define SYS_clock_settime64 SYS_clock_settime
+#define SYS_clock_adjtime64 SYS_clock_adjtime
+#define SYS_clock_nanosleep_time64 SYS_clock_nanosleep
+#define SYS_timer_gettime64 SYS_timer_gettime
+#define SYS_timer_settime64 SYS_timer_settime
+#define SYS_timerfd_gettime64 SYS_timerfd_gettime
+#define SYS_timerfd_settime64 SYS_timerfd_settime
+#define SYS_utimensat_time64 SYS_utimensat
+#define SYS_pselect6_time64 SYS_pselect6
+#define SYS_ppoll_time64 SYS_ppoll
+#define SYS_recvmmsg_time64 SYS_recvmmsg
+#define SYS_mq_timedsend_time64 SYS_mq_timedsend
+#define SYS_mq_timedreceive_time64 SYS_mq_timedreceive
+#define SYS_semtimedop_time64 SYS_semtimedop
+#define SYS_rt_sigtimedwait_time64 SYS_rt_sigtimedwait
+#define SYS_futex_time64 SYS_futex
+#define SYS_sched_rr_get_interval_time64 SYS_sched_rr_get_interval
+#define SYS_getrusage_time64 SYS_getrusage
+#define SYS_wait4_time64 SYS_wait4
+
+#define IPC_64 0
diff --git a/libc-top-half/musl/arch/x86_64/atomic_arch.h b/libc-top-half/musl/arch/x86_64/atomic_arch.h
new file mode 100644
index 0000000..da4e203
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/atomic_arch.h
@@ -0,0 +1,123 @@
+#define a_cas a_cas
+static inline int a_cas(volatile int *p, int t, int s)
+{
+ __asm__ __volatile__ (
+ "lock ; cmpxchg %3, %1"
+ : "=a"(t), "=m"(*p) : "a"(t), "r"(s) : "memory" );
+ return t;
+}
+
+#define a_cas_p a_cas_p
+static inline void *a_cas_p(volatile void *p, void *t, void *s)
+{
+ __asm__( "lock ; cmpxchg %3, %1"
+ : "=a"(t), "=m"(*(void *volatile *)p)
+ : "a"(t), "r"(s) : "memory" );
+ return t;
+}
+
+#define a_swap a_swap
+static inline int a_swap(volatile int *p, int v)
+{
+ __asm__ __volatile__(
+ "xchg %0, %1"
+ : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
+ return v;
+}
+
+#define a_fetch_add a_fetch_add
+static inline int a_fetch_add(volatile int *p, int v)
+{
+ __asm__ __volatile__(
+ "lock ; xadd %0, %1"
+ : "=r"(v), "=m"(*p) : "0"(v) : "memory" );
+ return v;
+}
+
+#define a_and a_and
+static inline void a_and(volatile int *p, int v)
+{
+ __asm__ __volatile__(
+ "lock ; and %1, %0"
+ : "=m"(*p) : "r"(v) : "memory" );
+}
+
+#define a_or a_or
+static inline void a_or(volatile int *p, int v)
+{
+ __asm__ __volatile__(
+ "lock ; or %1, %0"
+ : "=m"(*p) : "r"(v) : "memory" );
+}
+
+#define a_and_64 a_and_64
+static inline void a_and_64(volatile uint64_t *p, uint64_t v)
+{
+ __asm__ __volatile(
+ "lock ; and %1, %0"
+ : "=m"(*p) : "r"(v) : "memory" );
+}
+
+#define a_or_64 a_or_64
+static inline void a_or_64(volatile uint64_t *p, uint64_t v)
+{
+ __asm__ __volatile__(
+ "lock ; or %1, %0"
+ : "=m"(*p) : "r"(v) : "memory" );
+}
+
+#define a_inc a_inc
+static inline void a_inc(volatile int *p)
+{
+ __asm__ __volatile__(
+ "lock ; incl %0"
+ : "=m"(*p) : "m"(*p) : "memory" );
+}
+
+#define a_dec a_dec
+static inline void a_dec(volatile int *p)
+{
+ __asm__ __volatile__(
+ "lock ; decl %0"
+ : "=m"(*p) : "m"(*p) : "memory" );
+}
+
+#define a_store a_store
+static inline void a_store(volatile int *p, int x)
+{
+ __asm__ __volatile__(
+ "mov %1, %0 ; lock ; orl $0,(%%rsp)"
+ : "=m"(*p) : "r"(x) : "memory" );
+}
+
+#define a_barrier a_barrier
+static inline void a_barrier()
+{
+ __asm__ __volatile__( "" : : : "memory" );
+}
+
+#define a_spin a_spin
+static inline void a_spin()
+{
+ __asm__ __volatile__( "pause" : : : "memory" );
+}
+
+#define a_crash a_crash
+static inline void a_crash()
+{
+ __asm__ __volatile__( "hlt" : : : "memory" );
+}
+
+#define a_ctz_64 a_ctz_64
+static inline int a_ctz_64(uint64_t x)
+{
+ __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) );
+ return x;
+}
+
+#define a_clz_64 a_clz_64
+static inline int a_clz_64(uint64_t x)
+{
+ __asm__( "bsr %1,%0 ; xor $63,%0" : "=r"(x) : "r"(x) );
+ return x;
+}
diff --git a/libc-top-half/musl/arch/x86_64/bits/alltypes.h.in b/libc-top-half/musl/arch/x86_64/bits/alltypes.h.in
new file mode 100644
index 0000000..5cd8a29
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/alltypes.h.in
@@ -0,0 +1,20 @@
+#define _Addr long
+#define _Int64 long
+#define _Reg long
+
+#define __BYTE_ORDER 1234
+#define __LONG_MAX 0x7fffffffffffffffL
+
+#ifndef __cplusplus
+TYPEDEF int wchar_t;
+#endif
+
+#if defined(__FLT_EVAL_METHOD__) && __FLT_EVAL_METHOD__ == 2
+TYPEDEF long double float_t;
+TYPEDEF long double double_t;
+#else
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+#endif
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
diff --git a/libc-top-half/musl/arch/x86_64/bits/fenv.h b/libc-top-half/musl/arch/x86_64/bits/fenv.h
new file mode 100644
index 0000000..24df041
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/fenv.h
@@ -0,0 +1,34 @@
+#define FE_INVALID 1
+#define __FE_DENORM 2
+#define FE_DIVBYZERO 4
+#define FE_OVERFLOW 8
+#define FE_UNDERFLOW 16
+#define FE_INEXACT 32
+
+#define FE_ALL_EXCEPT 63
+
+#define FE_TONEAREST 0
+#define FE_DOWNWARD 0x400
+#define FE_UPWARD 0x800
+#define FE_TOWARDZERO 0xc00
+
+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;
+} fenv_t;
+
+#define FE_DFL_ENV ((const fenv_t *) -1)
diff --git a/libc-top-half/musl/arch/x86_64/bits/float.h b/libc-top-half/musl/arch/x86_64/bits/float.h
new file mode 100644
index 0000000..4d8e786
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/float.h
@@ -0,0 +1,20 @@
+#ifdef __FLT_EVAL_METHOD__
+#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
+#else
+#define FLT_EVAL_METHOD 0
+#endif
+
+#define LDBL_TRUE_MIN 3.6451995318824746025e-4951L
+#define LDBL_MIN 3.3621031431120935063e-4932L
+#define LDBL_MAX 1.1897314953572317650e+4932L
+#define LDBL_EPSILON 1.0842021724855044340e-19L
+
+#define LDBL_MANT_DIG 64
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_MAX_EXP 16384
+
+#define LDBL_DIG 18
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MAX_10_EXP 4932
+
+#define DECIMAL_DIG 21
diff --git a/libc-top-half/musl/arch/x86_64/bits/io.h b/libc-top-half/musl/arch/x86_64/bits/io.h
new file mode 100644
index 0000000..dd5bddc
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/io.h
@@ -0,0 +1,77 @@
+static __inline void outb(unsigned char __val, unsigned short __port)
+{
+ __asm__ volatile ("outb %0,%1" : : "a" (__val), "dN" (__port));
+}
+
+static __inline void outw(unsigned short __val, unsigned short __port)
+{
+ __asm__ volatile ("outw %0,%1" : : "a" (__val), "dN" (__port));
+}
+
+static __inline void outl(unsigned int __val, unsigned short __port)
+{
+ __asm__ volatile ("outl %0,%1" : : "a" (__val), "dN" (__port));
+}
+
+static __inline unsigned char inb(unsigned short __port)
+{
+ unsigned char __val;
+ __asm__ volatile ("inb %1,%0" : "=a" (__val) : "dN" (__port));
+ return __val;
+}
+
+static __inline unsigned short inw(unsigned short __port)
+{
+ unsigned short __val;
+ __asm__ volatile ("inw %1,%0" : "=a" (__val) : "dN" (__port));
+ return __val;
+}
+
+static __inline unsigned int inl(unsigned short __port)
+{
+ unsigned int __val;
+ __asm__ volatile ("inl %1,%0" : "=a" (__val) : "dN" (__port));
+ return __val;
+}
+
+static __inline void outsb(unsigned short __port, const void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; outsb"
+ : "+S" (__buf), "+c" (__n)
+ : "d" (__port));
+}
+
+static __inline void outsw(unsigned short __port, const void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; outsw"
+ : "+S" (__buf), "+c" (__n)
+ : "d" (__port));
+}
+
+static __inline void outsl(unsigned short __port, const void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; outsl"
+ : "+S" (__buf), "+c"(__n)
+ : "d" (__port));
+}
+
+static __inline void insb(unsigned short __port, void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; insb"
+ : "+D" (__buf), "+c" (__n)
+ : "d" (__port));
+}
+
+static __inline void insw(unsigned short __port, void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; insw"
+ : "+D" (__buf), "+c" (__n)
+ : "d" (__port));
+}
+
+static __inline void insl(unsigned short __port, void *__buf, unsigned long __n)
+{
+ __asm__ volatile ("cld; rep; insl"
+ : "+D" (__buf), "+c" (__n)
+ : "d" (__port));
+}
diff --git a/libc-top-half/musl/arch/x86_64/bits/limits.h b/libc-top-half/musl/arch/x86_64/bits/limits.h
new file mode 100644
index 0000000..07743b6
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/limits.h
@@ -0,0 +1 @@
+#define PAGESIZE 4096
diff --git a/libc-top-half/musl/arch/x86_64/bits/mman.h b/libc-top-half/musl/arch/x86_64/bits/mman.h
new file mode 100644
index 0000000..ba2d6f7
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/mman.h
@@ -0,0 +1 @@
+#define MAP_32BIT 0x40
diff --git a/libc-top-half/musl/arch/x86_64/bits/posix.h b/libc-top-half/musl/arch/x86_64/bits/posix.h
new file mode 100644
index 0000000..c37b94c
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/posix.h
@@ -0,0 +1,2 @@
+#define _POSIX_V6_LP64_OFF64 1
+#define _POSIX_V7_LP64_OFF64 1
diff --git a/libc-top-half/musl/arch/x86_64/bits/ptrace.h b/libc-top-half/musl/arch/x86_64/bits/ptrace.h
new file mode 100644
index 0000000..7f8a09b
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/ptrace.h
@@ -0,0 +1,13 @@
+#define PTRACE_GET_THREAD_AREA 25
+#define PTRACE_SET_THREAD_AREA 26
+#define PTRACE_ARCH_PRCTL 30
+#define PTRACE_SYSEMU 31
+#define PTRACE_SYSEMU_SINGLESTEP 32
+#define PTRACE_SINGLEBLOCK 33
+
+#define PT_GET_THREAD_AREA PTRACE_GET_THREAD_AREA
+#define PT_SET_THREAD_AREA PTRACE_SET_THREAD_AREA
+#define PT_ARCH_PRCTL PTRACE_ARCH_PRCTL
+#define PT_SYSEMU PTRACE_SYSEMU
+#define PT_SYSEMU_SINGLESTEP PTRACE_SYSEMU_SINGLESTEP
+#define PT_STEPBLOCK PTRACE_SINGLEBLOCK
diff --git a/libc-top-half/musl/arch/x86_64/bits/reg.h b/libc-top-half/musl/arch/x86_64/bits/reg.h
new file mode 100644
index 0000000..a4df04c
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/reg.h
@@ -0,0 +1,29 @@
+#undef __WORDSIZE
+#define __WORDSIZE 64
+#define R15 0
+#define R14 1
+#define R13 2
+#define R12 3
+#define RBP 4
+#define RBX 5
+#define R11 6
+#define R10 7
+#define R9 8
+#define R8 9
+#define RAX 10
+#define RCX 11
+#define RDX 12
+#define RSI 13
+#define RDI 14
+#define ORIG_RAX 15
+#define RIP 16
+#define CS 17
+#define EFLAGS 18
+#define RSP 19
+#define SS 20
+#define FS_BASE 21
+#define GS_BASE 22
+#define DS 23
+#define ES 24
+#define FS 25
+#define GS 26
diff --git a/libc-top-half/musl/arch/x86_64/bits/sem.h b/libc-top-half/musl/arch/x86_64/bits/sem.h
new file mode 100644
index 0000000..e61571c
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/sem.h
@@ -0,0 +1,11 @@
+struct semid_ds {
+ struct ipc_perm sem_perm;
+ time_t sem_otime;
+ long __unused1;
+ time_t sem_ctime;
+ long __unused2;
+ unsigned short sem_nsems;
+ char __sem_nsems_pad[sizeof(long)-sizeof(short)];
+ long __unused3;
+ long __unused4;
+};
diff --git a/libc-top-half/musl/arch/x86_64/bits/setjmp.h b/libc-top-half/musl/arch/x86_64/bits/setjmp.h
new file mode 100644
index 0000000..63973a8
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/setjmp.h
@@ -0,0 +1 @@
+typedef unsigned long __jmp_buf[8];
diff --git a/libc-top-half/musl/arch/x86_64/bits/signal.h b/libc-top-half/musl/arch/x86_64/bits/signal.h
new file mode 100644
index 0000000..c99317d
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/signal.h
@@ -0,0 +1,153 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
+#ifdef _GNU_SOURCE
+enum { REG_R8 = 0 };
+#define REG_R8 REG_R8
+enum { REG_R9 = 1 };
+#define REG_R9 REG_R9
+enum { REG_R10 = 2 };
+#define REG_R10 REG_R10
+enum { REG_R11 = 3 };
+#define REG_R11 REG_R11
+enum { REG_R12 = 4 };
+#define REG_R12 REG_R12
+enum { REG_R13 = 5 };
+#define REG_R13 REG_R13
+enum { REG_R14 = 6 };
+#define REG_R14 REG_R14
+enum { REG_R15 = 7 };
+#define REG_R15 REG_R15
+enum { REG_RDI = 8 };
+#define REG_RDI REG_RDI
+enum { REG_RSI = 9 };
+#define REG_RSI REG_RSI
+enum { REG_RBP = 10 };
+#define REG_RBP REG_RBP
+enum { REG_RBX = 11 };
+#define REG_RBX REG_RBX
+enum { REG_RDX = 12 };
+#define REG_RDX REG_RDX
+enum { REG_RAX = 13 };
+#define REG_RAX REG_RAX
+enum { REG_RCX = 14 };
+#define REG_RCX REG_RCX
+enum { REG_RSP = 15 };
+#define REG_RSP REG_RSP
+enum { REG_RIP = 16 };
+#define REG_RIP REG_RIP
+enum { REG_EFL = 17 };
+#define REG_EFL REG_EFL
+enum { REG_CSGSFS = 18 };
+#define REG_CSGSFS REG_CSGSFS
+enum { REG_ERR = 19 };
+#define REG_ERR REG_ERR
+enum { REG_TRAPNO = 20 };
+#define REG_TRAPNO REG_TRAPNO
+enum { REG_OLDMASK = 21 };
+#define REG_OLDMASK REG_OLDMASK
+enum { REG_CR2 = 22 };
+#define REG_CR2 REG_CR2
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef long long greg_t, gregset_t[23];
+typedef struct _fpstate {
+ unsigned short cwd, swd, ftw, fop;
+ unsigned long long rip, rdp;
+ unsigned mxcsr, mxcr_mask;
+ struct {
+ unsigned short significand[4], exponent, padding[3];
+ } _st[8];
+ struct {
+ unsigned element[4];
+ } _xmm[16];
+ unsigned padding[24];
+} *fpregset_t;
+struct sigcontext {
+ unsigned long r8, r9, r10, r11, r12, r13, r14, r15;
+ unsigned long rdi, rsi, rbp, rbx, rdx, rax, rcx, rsp, rip, eflags;
+ unsigned short cs, gs, fs, __pad0;
+ unsigned long err, trapno, oldmask, cr2;
+ struct _fpstate *fpstate;
+ unsigned long __reserved1[8];
+};
+typedef struct {
+ gregset_t gregs;
+ fpregset_t fpregs;
+ unsigned long long __reserved1[8];
+} mcontext_t;
+#else
+typedef struct {
+ unsigned long __space[32];
+} 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;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ sigset_t uc_sigmask;
+ unsigned long __fpregs_mem[64];
+} ucontext_t;
+
+#define SA_NOCLDSTOP 1
+#define SA_NOCLDWAIT 2
+#define SA_SIGINFO 4
+#define SA_ONSTACK 0x08000000
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_RESTORER 0x04000000
+
+#endif
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT SIGABRT
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+#define SIGPOLL 29
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
+
diff --git a/libc-top-half/musl/arch/x86_64/bits/stat.h b/libc-top-half/musl/arch/x86_64/bits/stat.h
new file mode 100644
index 0000000..081237c
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/stat.h
@@ -0,0 +1,22 @@
+/* copied from kernel definition, but with padding replaced
+ * by the corresponding correctly-sized userspace types. */
+
+struct stat {
+ dev_t st_dev;
+ ino_t st_ino;
+ nlink_t st_nlink;
+
+ mode_t st_mode;
+ uid_t st_uid;
+ gid_t st_gid;
+ unsigned int __pad0;
+ dev_t st_rdev;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+ long __unused[3];
+};
diff --git a/libc-top-half/musl/arch/x86_64/bits/stdint.h b/libc-top-half/musl/arch/x86_64/bits/stdint.h
new file mode 100644
index 0000000..1bb147f
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/stdint.h
@@ -0,0 +1,20 @@
+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
+
+#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
diff --git a/libc-top-half/musl/arch/x86_64/bits/syscall.h.in b/libc-top-half/musl/arch/x86_64/bits/syscall.h.in
new file mode 100644
index 0000000..c3882de
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/syscall.h.in
@@ -0,0 +1,358 @@
+#define __NR_read 0
+#define __NR_write 1
+#define __NR_open 2
+#define __NR_close 3
+#define __NR_stat 4
+#define __NR_fstat 5
+#define __NR_lstat 6
+#define __NR_poll 7
+#define __NR_lseek 8
+#define __NR_mmap 9
+#define __NR_mprotect 10
+#define __NR_munmap 11
+#define __NR_brk 12
+#define __NR_rt_sigaction 13
+#define __NR_rt_sigprocmask 14
+#define __NR_rt_sigreturn 15
+#define __NR_ioctl 16
+#define __NR_pread64 17
+#define __NR_pwrite64 18
+#define __NR_readv 19
+#define __NR_writev 20
+#define __NR_access 21
+#define __NR_pipe 22
+#define __NR_select 23
+#define __NR_sched_yield 24
+#define __NR_mremap 25
+#define __NR_msync 26
+#define __NR_mincore 27
+#define __NR_madvise 28
+#define __NR_shmget 29
+#define __NR_shmat 30
+#define __NR_shmctl 31
+#define __NR_dup 32
+#define __NR_dup2 33
+#define __NR_pause 34
+#define __NR_nanosleep 35
+#define __NR_getitimer 36
+#define __NR_alarm 37
+#define __NR_setitimer 38
+#define __NR_getpid 39
+#define __NR_sendfile 40
+#define __NR_socket 41
+#define __NR_connect 42
+#define __NR_accept 43
+#define __NR_sendto 44
+#define __NR_recvfrom 45
+#define __NR_sendmsg 46
+#define __NR_recvmsg 47
+#define __NR_shutdown 48
+#define __NR_bind 49
+#define __NR_listen 50
+#define __NR_getsockname 51
+#define __NR_getpeername 52
+#define __NR_socketpair 53
+#define __NR_setsockopt 54
+#define __NR_getsockopt 55
+#define __NR_clone 56
+#define __NR_fork 57
+#define __NR_vfork 58
+#define __NR_execve 59
+#define __NR_exit 60
+#define __NR_wait4 61
+#define __NR_kill 62
+#define __NR_uname 63
+#define __NR_semget 64
+#define __NR_semop 65
+#define __NR_semctl 66
+#define __NR_shmdt 67
+#define __NR_msgget 68
+#define __NR_msgsnd 69
+#define __NR_msgrcv 70
+#define __NR_msgctl 71
+#define __NR_fcntl 72
+#define __NR_flock 73
+#define __NR_fsync 74
+#define __NR_fdatasync 75
+#define __NR_truncate 76
+#define __NR_ftruncate 77
+#define __NR_getdents 78
+#define __NR_getcwd 79
+#define __NR_chdir 80
+#define __NR_fchdir 81
+#define __NR_rename 82
+#define __NR_mkdir 83
+#define __NR_rmdir 84
+#define __NR_creat 85
+#define __NR_link 86
+#define __NR_unlink 87
+#define __NR_symlink 88
+#define __NR_readlink 89
+#define __NR_chmod 90
+#define __NR_fchmod 91
+#define __NR_chown 92
+#define __NR_fchown 93
+#define __NR_lchown 94
+#define __NR_umask 95
+#define __NR_gettimeofday 96
+#define __NR_getrlimit 97
+#define __NR_getrusage 98
+#define __NR_sysinfo 99
+#define __NR_times 100
+#define __NR_ptrace 101
+#define __NR_getuid 102
+#define __NR_syslog 103
+#define __NR_getgid 104
+#define __NR_setuid 105
+#define __NR_setgid 106
+#define __NR_geteuid 107
+#define __NR_getegid 108
+#define __NR_setpgid 109
+#define __NR_getppid 110
+#define __NR_getpgrp 111
+#define __NR_setsid 112
+#define __NR_setreuid 113
+#define __NR_setregid 114
+#define __NR_getgroups 115
+#define __NR_setgroups 116
+#define __NR_setresuid 117
+#define __NR_getresuid 118
+#define __NR_setresgid 119
+#define __NR_getresgid 120
+#define __NR_getpgid 121
+#define __NR_setfsuid 122
+#define __NR_setfsgid 123
+#define __NR_getsid 124
+#define __NR_capget 125
+#define __NR_capset 126
+#define __NR_rt_sigpending 127
+#define __NR_rt_sigtimedwait 128
+#define __NR_rt_sigqueueinfo 129
+#define __NR_rt_sigsuspend 130
+#define __NR_sigaltstack 131
+#define __NR_utime 132
+#define __NR_mknod 133
+#define __NR_uselib 134
+#define __NR_personality 135
+#define __NR_ustat 136
+#define __NR_statfs 137
+#define __NR_fstatfs 138
+#define __NR_sysfs 139
+#define __NR_getpriority 140
+#define __NR_setpriority 141
+#define __NR_sched_setparam 142
+#define __NR_sched_getparam 143
+#define __NR_sched_setscheduler 144
+#define __NR_sched_getscheduler 145
+#define __NR_sched_get_priority_max 146
+#define __NR_sched_get_priority_min 147
+#define __NR_sched_rr_get_interval 148
+#define __NR_mlock 149
+#define __NR_munlock 150
+#define __NR_mlockall 151
+#define __NR_munlockall 152
+#define __NR_vhangup 153
+#define __NR_modify_ldt 154
+#define __NR_pivot_root 155
+#define __NR__sysctl 156
+#define __NR_prctl 157
+#define __NR_arch_prctl 158
+#define __NR_adjtimex 159
+#define __NR_setrlimit 160
+#define __NR_chroot 161
+#define __NR_sync 162
+#define __NR_acct 163
+#define __NR_settimeofday 164
+#define __NR_mount 165
+#define __NR_umount2 166
+#define __NR_swapon 167
+#define __NR_swapoff 168
+#define __NR_reboot 169
+#define __NR_sethostname 170
+#define __NR_setdomainname 171
+#define __NR_iopl 172
+#define __NR_ioperm 173
+#define __NR_create_module 174
+#define __NR_init_module 175
+#define __NR_delete_module 176
+#define __NR_get_kernel_syms 177
+#define __NR_query_module 178
+#define __NR_quotactl 179
+#define __NR_nfsservctl 180
+#define __NR_getpmsg 181
+#define __NR_putpmsg 182
+#define __NR_afs_syscall 183
+#define __NR_tuxcall 184
+#define __NR_security 185
+#define __NR_gettid 186
+#define __NR_readahead 187
+#define __NR_setxattr 188
+#define __NR_lsetxattr 189
+#define __NR_fsetxattr 190
+#define __NR_getxattr 191
+#define __NR_lgetxattr 192
+#define __NR_fgetxattr 193
+#define __NR_listxattr 194
+#define __NR_llistxattr 195
+#define __NR_flistxattr 196
+#define __NR_removexattr 197
+#define __NR_lremovexattr 198
+#define __NR_fremovexattr 199
+#define __NR_tkill 200
+#define __NR_time 201
+#define __NR_futex 202
+#define __NR_sched_setaffinity 203
+#define __NR_sched_getaffinity 204
+#define __NR_set_thread_area 205
+#define __NR_io_setup 206
+#define __NR_io_destroy 207
+#define __NR_io_getevents 208
+#define __NR_io_submit 209
+#define __NR_io_cancel 210
+#define __NR_get_thread_area 211
+#define __NR_lookup_dcookie 212
+#define __NR_epoll_create 213
+#define __NR_epoll_ctl_old 214
+#define __NR_epoll_wait_old 215
+#define __NR_remap_file_pages 216
+#define __NR_getdents64 217
+#define __NR_set_tid_address 218
+#define __NR_restart_syscall 219
+#define __NR_semtimedop 220
+#define __NR_fadvise64 221
+#define __NR_timer_create 222
+#define __NR_timer_settime 223
+#define __NR_timer_gettime 224
+#define __NR_timer_getoverrun 225
+#define __NR_timer_delete 226
+#define __NR_clock_settime 227
+#define __NR_clock_gettime 228
+#define __NR_clock_getres 229
+#define __NR_clock_nanosleep 230
+#define __NR_exit_group 231
+#define __NR_epoll_wait 232
+#define __NR_epoll_ctl 233
+#define __NR_tgkill 234
+#define __NR_utimes 235
+#define __NR_vserver 236
+#define __NR_mbind 237
+#define __NR_set_mempolicy 238
+#define __NR_get_mempolicy 239
+#define __NR_mq_open 240
+#define __NR_mq_unlink 241
+#define __NR_mq_timedsend 242
+#define __NR_mq_timedreceive 243
+#define __NR_mq_notify 244
+#define __NR_mq_getsetattr 245
+#define __NR_kexec_load 246
+#define __NR_waitid 247
+#define __NR_add_key 248
+#define __NR_request_key 249
+#define __NR_keyctl 250
+#define __NR_ioprio_set 251
+#define __NR_ioprio_get 252
+#define __NR_inotify_init 253
+#define __NR_inotify_add_watch 254
+#define __NR_inotify_rm_watch 255
+#define __NR_migrate_pages 256
+#define __NR_openat 257
+#define __NR_mkdirat 258
+#define __NR_mknodat 259
+#define __NR_fchownat 260
+#define __NR_futimesat 261
+#define __NR_newfstatat 262
+#define __NR_unlinkat 263
+#define __NR_renameat 264
+#define __NR_linkat 265
+#define __NR_symlinkat 266
+#define __NR_readlinkat 267
+#define __NR_fchmodat 268
+#define __NR_faccessat 269
+#define __NR_pselect6 270
+#define __NR_ppoll 271
+#define __NR_unshare 272
+#define __NR_set_robust_list 273
+#define __NR_get_robust_list 274
+#define __NR_splice 275
+#define __NR_tee 276
+#define __NR_sync_file_range 277
+#define __NR_vmsplice 278
+#define __NR_move_pages 279
+#define __NR_utimensat 280
+#define __NR_epoll_pwait 281
+#define __NR_signalfd 282
+#define __NR_timerfd_create 283
+#define __NR_eventfd 284
+#define __NR_fallocate 285
+#define __NR_timerfd_settime 286
+#define __NR_timerfd_gettime 287
+#define __NR_accept4 288
+#define __NR_signalfd4 289
+#define __NR_eventfd2 290
+#define __NR_epoll_create1 291
+#define __NR_dup3 292
+#define __NR_pipe2 293
+#define __NR_inotify_init1 294
+#define __NR_preadv 295
+#define __NR_pwritev 296
+#define __NR_rt_tgsigqueueinfo 297
+#define __NR_perf_event_open 298
+#define __NR_recvmmsg 299
+#define __NR_fanotify_init 300
+#define __NR_fanotify_mark 301
+#define __NR_prlimit64 302
+#define __NR_name_to_handle_at 303
+#define __NR_open_by_handle_at 304
+#define __NR_clock_adjtime 305
+#define __NR_syncfs 306
+#define __NR_sendmmsg 307
+#define __NR_setns 308
+#define __NR_getcpu 309
+#define __NR_process_vm_readv 310
+#define __NR_process_vm_writev 311
+#define __NR_kcmp 312
+#define __NR_finit_module 313
+#define __NR_sched_setattr 314
+#define __NR_sched_getattr 315
+#define __NR_renameat2 316
+#define __NR_seccomp 317
+#define __NR_getrandom 318
+#define __NR_memfd_create 319
+#define __NR_kexec_file_load 320
+#define __NR_bpf 321
+#define __NR_execveat 322
+#define __NR_userfaultfd 323
+#define __NR_membarrier 324
+#define __NR_mlock2 325
+#define __NR_copy_file_range 326
+#define __NR_preadv2 327
+#define __NR_pwritev2 328
+#define __NR_pkey_mprotect 329
+#define __NR_pkey_alloc 330
+#define __NR_pkey_free 331
+#define __NR_statx 332
+#define __NR_io_pgetevents 333
+#define __NR_rseq 334
+#define __NR_pidfd_send_signal 424
+#define __NR_io_uring_setup 425
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_open_tree 428
+#define __NR_move_mount 429
+#define __NR_fsopen 430
+#define __NR_fsconfig 431
+#define __NR_fsmount 432
+#define __NR_fspick 433
+#define __NR_pidfd_open 434
+#define __NR_clone3 435
+#define __NR_close_range 436
+#define __NR_openat2 437
+#define __NR_pidfd_getfd 438
+#define __NR_faccessat2 439
+#define __NR_process_madvise 440
+#define __NR_epoll_pwait2 441
+#define __NR_mount_setattr 442
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_restrict_self 446
+
diff --git a/libc-top-half/musl/arch/x86_64/bits/user.h b/libc-top-half/musl/arch/x86_64/bits/user.h
new file mode 100644
index 0000000..4073cc0
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/bits/user.h
@@ -0,0 +1,41 @@
+#undef __WORDSIZE
+#define __WORDSIZE 64
+
+typedef struct user_fpregs_struct {
+ uint16_t cwd, swd, ftw, fop;
+ uint64_t rip, rdp;
+ uint32_t mxcsr, mxcr_mask;
+ uint32_t st_space[32], xmm_space[64], padding[24];
+} elf_fpregset_t;
+
+struct user_regs_struct {
+ unsigned long r15, r14, r13, r12, rbp, rbx, r11, r10, r9, r8;
+ unsigned long rax, rcx, rdx, rsi, rdi, orig_rax, rip;
+ unsigned long cs, eflags, rsp, ss, fs_base, gs_base, ds, es, fs, gs;
+};
+#define ELF_NGREG 27
+typedef unsigned long 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];
+ unsigned long u_debugreg[8];
+};
+
+#define PAGE_MASK (~(PAGESIZE-1))
+#define NBPG PAGESIZE
+#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/libc-top-half/musl/arch/x86_64/crt_arch.h b/libc-top-half/musl/arch/x86_64/crt_arch.h
new file mode 100644
index 0000000..3eec61b
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/crt_arch.h
@@ -0,0 +1,12 @@
+__asm__(
+".text \n"
+".global " START " \n"
+START ": \n"
+" xor %rbp,%rbp \n"
+" mov %rsp,%rdi \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+" lea _DYNAMIC(%rip),%rsi \n"
+" andq $-16,%rsp \n"
+" call " START "_c \n"
+);
diff --git a/libc-top-half/musl/arch/x86_64/ksigaction.h b/libc-top-half/musl/arch/x86_64/ksigaction.h
new file mode 100644
index 0000000..c40e356
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/ksigaction.h
@@ -0,0 +1,11 @@
+#include <features.h>
+
+struct k_sigaction {
+ void (*handler)(int);
+ unsigned long flags;
+ void (*restorer)(void);
+ unsigned mask[2];
+};
+
+hidden void __restore_rt();
+#define __restore __restore_rt
diff --git a/libc-top-half/musl/arch/x86_64/kstat.h b/libc-top-half/musl/arch/x86_64/kstat.h
new file mode 100644
index 0000000..5976c04
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/kstat.h
@@ -0,0 +1,22 @@
+struct kstat {
+ dev_t st_dev;
+ ino_t st_ino;
+ nlink_t st_nlink;
+
+ mode_t st_mode;
+ uid_t st_uid;
+ gid_t st_gid;
+ unsigned int __pad0;
+ dev_t st_rdev;
+ off_t st_size;
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+
+ long st_atime_sec;
+ long st_atime_nsec;
+ long st_mtime_sec;
+ long st_mtime_nsec;
+ long st_ctime_sec;
+ long st_ctime_nsec;
+ long __unused[3];
+};
diff --git a/libc-top-half/musl/arch/x86_64/pthread_arch.h b/libc-top-half/musl/arch/x86_64/pthread_arch.h
new file mode 100644
index 0000000..c8c63f2
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/pthread_arch.h
@@ -0,0 +1,8 @@
+static inline uintptr_t __get_tp()
+{
+ uintptr_t tp;
+ __asm__ ("mov %%fs:0,%0" : "=r" (tp) );
+ return tp;
+}
+
+#define MC_PC gregs[REG_RIP]
diff --git a/libc-top-half/musl/arch/x86_64/reloc.h b/libc-top-half/musl/arch/x86_64/reloc.h
new file mode 100644
index 0000000..fac0c0a
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/reloc.h
@@ -0,0 +1,20 @@
+#define LDSO_ARCH "x86_64"
+
+#define REL_SYMBOLIC R_X86_64_64
+#define REL_OFFSET32 R_X86_64_PC32
+#define REL_GOT R_X86_64_GLOB_DAT
+#define REL_PLT R_X86_64_JUMP_SLOT
+#define REL_RELATIVE R_X86_64_RELATIVE
+#define REL_COPY R_X86_64_COPY
+#define REL_DTPMOD R_X86_64_DTPMOD64
+#define REL_DTPOFF R_X86_64_DTPOFF64
+#define REL_TPOFF R_X86_64_TPOFF64
+#define REL_TLSDESC R_X86_64_TLSDESC
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "mov %1,%%rsp ; jmp *%0" : : "r"(pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+ ".hidden " #sym "\n" \
+ " lea " #sym "(%%rip),%0\n" \
+ : "=r"(*fp) : : "memory" )
diff --git a/libc-top-half/musl/arch/x86_64/syscall_arch.h b/libc-top-half/musl/arch/x86_64/syscall_arch.h
new file mode 100644
index 0000000..92d5c17
--- /dev/null
+++ b/libc-top-half/musl/arch/x86_64/syscall_arch.h
@@ -0,0 +1,70 @@
+#define __SYSCALL_LL_E(x) (x)
+#define __SYSCALL_LL_O(x) (x)
+
+static __inline long __syscall0(long n)
+{
+ unsigned long ret;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n) : "rcx", "r11", "memory");
+ return ret;
+}
+
+static __inline long __syscall1(long n, long a1)
+{
+ unsigned long ret;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1) : "rcx", "r11", "memory");
+ return ret;
+}
+
+static __inline long __syscall2(long n, long a1, long a2)
+{
+ unsigned long ret;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2)
+ : "rcx", "r11", "memory");
+ return ret;
+}
+
+static __inline long __syscall3(long n, long a1, long a2, long a3)
+{
+ unsigned long ret;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
+ "d"(a3) : "rcx", "r11", "memory");
+ return ret;
+}
+
+static __inline long __syscall4(long n, long a1, long a2, long a3, long a4)
+{
+ unsigned long ret;
+ register long r10 __asm__("r10") = a4;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
+ "d"(a3), "r"(r10): "rcx", "r11", "memory");
+ return ret;
+}
+
+static __inline long __syscall5(long n, long a1, long a2, long a3, long a4, long a5)
+{
+ unsigned long ret;
+ register long r10 __asm__("r10") = a4;
+ register long r8 __asm__("r8") = a5;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
+ "d"(a3), "r"(r10), "r"(r8) : "rcx", "r11", "memory");
+ return ret;
+}
+
+static __inline long __syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6)
+{
+ unsigned long ret;
+ register long r10 __asm__("r10") = a4;
+ register long r8 __asm__("r8") = a5;
+ register long r9 __asm__("r9") = a6;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
+ "d"(a3), "r"(r10), "r"(r8), "r"(r9) : "rcx", "r11", "memory");
+ return ret;
+}
+
+#define VDSO_USEFUL
+#define VDSO_CGT_SYM "__vdso_clock_gettime"
+#define VDSO_CGT_VER "LINUX_2.6"
+#define VDSO_GETCPU_SYM "__vdso_getcpu"
+#define VDSO_GETCPU_VER "LINUX_2.6"
+
+#define IPC_64 0
diff --git a/libc-top-half/musl/compat/time32/__xstat.c b/libc-top-half/musl/compat/time32/__xstat.c
new file mode 100644
index 0000000..acfbd3c
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/__xstat.c
@@ -0,0 +1,24 @@
+#include "time32.h"
+#include <sys/stat.h>
+
+struct stat32;
+
+int __fxstat64(int ver, int fd, struct stat32 *buf)
+{
+ return __fstat_time32(fd, buf);
+}
+
+int __fxstatat64(int ver, int fd, const char *path, struct stat32 *buf, int flag)
+{
+ return __fstatat_time32(fd, path, buf, flag);
+}
+
+int __lxstat64(int ver, const char *path, struct stat32 *buf)
+{
+ return __lstat_time32(path, buf);
+}
+
+int __xstat64(int ver, const char *path, struct stat32 *buf)
+{
+ return __stat_time32(path, buf);
+}
diff --git a/libc-top-half/musl/compat/time32/adjtime32.c b/libc-top-half/musl/compat/time32/adjtime32.c
new file mode 100644
index 0000000..b0042c6
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/adjtime32.c
@@ -0,0 +1,21 @@
+#define _GNU_SOURCE
+#include "time32.h"
+#include <time.h>
+#include <sys/time.h>
+#include <sys/timex.h>
+
+int __adjtime32(const struct timeval32 *in32, struct timeval32 *out32)
+{
+ struct timeval out;
+ int r = adjtime((&(struct timeval){
+ .tv_sec = in32->tv_sec,
+ .tv_usec = in32->tv_usec}), &out);
+ if (r) return r;
+ /* We can't range-check the result because success was already
+ * committed by the above call. */
+ if (out32) {
+ out32->tv_sec = out.tv_sec;
+ out32->tv_usec = out.tv_usec;
+ }
+ return r;
+}
diff --git a/libc-top-half/musl/compat/time32/adjtimex_time32.c b/libc-top-half/musl/compat/time32/adjtimex_time32.c
new file mode 100644
index 0000000..9c6f190
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/adjtimex_time32.c
@@ -0,0 +1,10 @@
+#include "time32.h"
+#include <time.h>
+#include <sys/timex.h>
+
+struct timex32;
+
+int __adjtimex_time32(struct timex32 *tx32)
+{
+ return __clock_adjtime32(CLOCK_REALTIME, tx32);
+}
diff --git a/libc-top-half/musl/compat/time32/aio_suspend_time32.c b/libc-top-half/musl/compat/time32/aio_suspend_time32.c
new file mode 100644
index 0000000..ed5119b
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/aio_suspend_time32.c
@@ -0,0 +1,11 @@
+#include "time32.h"
+#include <time.h>
+#include <aio.h>
+
+int __aio_suspend_time32(const struct aiocb *const cbs[], int cnt, const struct timespec32 *ts32)
+{
+ return aio_suspend(cbs, cnt, ts32 ? (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}) : 0);
+}
+
+weak_alias(aio_suspend, aio_suspend64);
diff --git a/libc-top-half/musl/compat/time32/clock_adjtime32.c b/libc-top-half/musl/compat/time32/clock_adjtime32.c
new file mode 100644
index 0000000..5a25b8a
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/clock_adjtime32.c
@@ -0,0 +1,70 @@
+#include "time32.h"
+#include <time.h>
+#include <sys/time.h>
+#include <sys/timex.h>
+#include <string.h>
+#include <stddef.h>
+
+struct timex32 {
+ unsigned modes;
+ long offset, freq, maxerror, esterror;
+ int status;
+ long constant, precision, tolerance;
+ struct timeval32 time;
+ long tick, ppsfreq, jitter;
+ int shift;
+ long stabil, jitcnt, calcnt, errcnt, stbcnt;
+ int tai;
+ int __padding[11];
+};
+
+int __clock_adjtime32(clockid_t clock_id, struct timex32 *tx32)
+{
+ struct timex utx = {
+ .modes = tx32->modes,
+ .offset = tx32->offset,
+ .freq = tx32->freq,
+ .maxerror = tx32->maxerror,
+ .esterror = tx32->esterror,
+ .status = tx32->status,
+ .constant = tx32->constant,
+ .precision = tx32->precision,
+ .tolerance = tx32->tolerance,
+ .time.tv_sec = tx32->time.tv_sec,
+ .time.tv_usec = tx32->time.tv_usec,
+ .tick = tx32->tick,
+ .ppsfreq = tx32->ppsfreq,
+ .jitter = tx32->jitter,
+ .shift = tx32->shift,
+ .stabil = tx32->stabil,
+ .jitcnt = tx32->jitcnt,
+ .calcnt = tx32->calcnt,
+ .errcnt = tx32->errcnt,
+ .stbcnt = tx32->stbcnt,
+ .tai = tx32->tai,
+ };
+ int r = clock_adjtime(clock_id, &utx);
+ if (r<0) return r;
+ tx32->modes = utx.modes;
+ tx32->offset = utx.offset;
+ tx32->freq = utx.freq;
+ tx32->maxerror = utx.maxerror;
+ tx32->esterror = utx.esterror;
+ tx32->status = utx.status;
+ tx32->constant = utx.constant;
+ tx32->precision = utx.precision;
+ tx32->tolerance = utx.tolerance;
+ tx32->time.tv_sec = utx.time.tv_sec;
+ tx32->time.tv_usec = utx.time.tv_usec;
+ tx32->tick = utx.tick;
+ tx32->ppsfreq = utx.ppsfreq;
+ tx32->jitter = utx.jitter;
+ tx32->shift = utx.shift;
+ tx32->stabil = utx.stabil;
+ tx32->jitcnt = utx.jitcnt;
+ tx32->calcnt = utx.calcnt;
+ tx32->errcnt = utx.errcnt;
+ tx32->stbcnt = utx.stbcnt;
+ tx32->tai = utx.tai;
+ return r;
+}
diff --git a/libc-top-half/musl/compat/time32/clock_getres_time32.c b/libc-top-half/musl/compat/time32/clock_getres_time32.c
new file mode 100644
index 0000000..47a24c1
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/clock_getres_time32.c
@@ -0,0 +1,13 @@
+#include "time32.h"
+#include <time.h>
+
+int __clock_getres_time32(clockid_t clk, struct timespec32 *ts32)
+{
+ struct timespec ts;
+ int r = clock_getres(clk, &ts);
+ if (!r && ts32) {
+ ts32->tv_sec = ts.tv_sec;
+ ts32->tv_nsec = ts.tv_nsec;
+ }
+ return r;
+}
diff --git a/libc-top-half/musl/compat/time32/clock_gettime32.c b/libc-top-half/musl/compat/time32/clock_gettime32.c
new file mode 100644
index 0000000..0cac7bb
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/clock_gettime32.c
@@ -0,0 +1,18 @@
+#include "time32.h"
+#include <time.h>
+#include <errno.h>
+#include <stdint.h>
+
+int __clock_gettime32(clockid_t clk, struct timespec32 *ts32)
+{
+ struct timespec ts;
+ int r = clock_gettime(clk, &ts);
+ if (r) return r;
+ if (ts.tv_sec < INT32_MIN || ts.tv_sec > INT32_MAX) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ ts32->tv_sec = ts.tv_sec;
+ ts32->tv_nsec = ts.tv_nsec;
+ return 0;
+}
diff --git a/libc-top-half/musl/compat/time32/clock_nanosleep_time32.c b/libc-top-half/musl/compat/time32/clock_nanosleep_time32.c
new file mode 100644
index 0000000..91ef067
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/clock_nanosleep_time32.c
@@ -0,0 +1,15 @@
+#include "time32.h"
+#include <time.h>
+#include <errno.h>
+
+int __clock_nanosleep_time32(clockid_t clk, int flags, const struct timespec32 *req32, struct timespec32 *rem32)
+{
+ struct timespec rem;
+ int ret = clock_nanosleep(clk, flags, (&(struct timespec){
+ .tv_sec = req32->tv_sec, .tv_nsec = req32->tv_nsec}), &rem);
+ if (ret==EINTR && rem32 && !(flags & TIMER_ABSTIME)) {
+ rem32->tv_sec = rem.tv_sec;
+ rem32->tv_nsec = rem.tv_nsec;
+ }
+ return ret;
+}
diff --git a/libc-top-half/musl/compat/time32/clock_settime32.c b/libc-top-half/musl/compat/time32/clock_settime32.c
new file mode 100644
index 0000000..7ca4f0e
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/clock_settime32.c
@@ -0,0 +1,9 @@
+#include "time32.h"
+#include <time.h>
+
+int __clock_settime32(clockid_t clk, const struct timespec32 *ts32)
+{
+ return clock_settime(clk, (&(struct timespec){
+ .tv_sec = ts32->tv_sec,
+ .tv_nsec = ts32->tv_nsec}));
+}
diff --git a/libc-top-half/musl/compat/time32/cnd_timedwait_time32.c b/libc-top-half/musl/compat/time32/cnd_timedwait_time32.c
new file mode 100644
index 0000000..314251d
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/cnd_timedwait_time32.c
@@ -0,0 +1,9 @@
+#include "time32.h"
+#include <time.h>
+#include <threads.h>
+
+int __cnd_timedwait_time32(cnd_t *restrict c, mtx_t *restrict m, const struct timespec32 *restrict ts32)
+{
+ return cnd_timedwait(c, m, ts32 ? (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}) : 0);
+}
diff --git a/libc-top-half/musl/compat/time32/ctime32.c b/libc-top-half/musl/compat/time32/ctime32.c
new file mode 100644
index 0000000..a057274
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/ctime32.c
@@ -0,0 +1,7 @@
+#include "time32.h"
+#include <time.h>
+
+char *__ctime32(time32_t *t)
+{
+ return ctime(&(time_t){*t});
+}
diff --git a/libc-top-half/musl/compat/time32/ctime32_r.c b/libc-top-half/musl/compat/time32/ctime32_r.c
new file mode 100644
index 0000000..e1ad2e2
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/ctime32_r.c
@@ -0,0 +1,7 @@
+#include "time32.h"
+#include <time.h>
+
+char *__ctime32_r(time32_t *t, char *buf)
+{
+ return ctime_r(&(time_t){*t}, buf);
+}
diff --git a/libc-top-half/musl/compat/time32/difftime32.c b/libc-top-half/musl/compat/time32/difftime32.c
new file mode 100644
index 0000000..5950943
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/difftime32.c
@@ -0,0 +1,7 @@
+#include "time32.h"
+#include <time.h>
+
+double __difftime32(time32_t t1, time32_t t2)
+{
+ return difftime(t1, t2);
+}
diff --git a/libc-top-half/musl/compat/time32/fstat_time32.c b/libc-top-half/musl/compat/time32/fstat_time32.c
new file mode 100644
index 0000000..3e08439
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/fstat_time32.c
@@ -0,0 +1,17 @@
+#include "time32.h"
+#include <time.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <stddef.h>
+
+struct stat32;
+
+int __fstat_time32(int fd, struct stat32 *restrict st32)
+{
+ struct stat st;
+ int r = fstat(fd, &st);
+ if (!r) memcpy(st32, &st, offsetof(struct stat, st_atim));
+ return r;
+}
+
+weak_alias(fstat, fstat64);
diff --git a/libc-top-half/musl/compat/time32/fstatat_time32.c b/libc-top-half/musl/compat/time32/fstatat_time32.c
new file mode 100644
index 0000000..85dcb00
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/fstatat_time32.c
@@ -0,0 +1,17 @@
+#include "time32.h"
+#include <time.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <stddef.h>
+
+struct stat32;
+
+int __fstatat_time32(int fd, const char *restrict path, struct stat32 *restrict st32, int flag)
+{
+ struct stat st;
+ int r = fstatat(fd, path, &st, flag);
+ if (!r) memcpy(st32, &st, offsetof(struct stat, st_atim));
+ return r;
+}
+
+weak_alias(fstatat, fstatat64);
diff --git a/libc-top-half/musl/compat/time32/ftime32.c b/libc-top-half/musl/compat/time32/ftime32.c
new file mode 100644
index 0000000..166a6da
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/ftime32.c
@@ -0,0 +1,25 @@
+#include "time32.h"
+#include <sys/timeb.h>
+#include <errno.h>
+#include <stdint.h>
+
+struct timeb32 {
+ int32_t time;
+ unsigned short millitm;
+ short timezone, dstflag;
+};
+
+int __ftime32(struct timeb32 *tp)
+{
+ struct timeb tb;
+ if (ftime(&tb) < 0) return -1;
+ if (tb.time < INT32_MIN || tb.time > INT32_MAX) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ tp->time = tb.time;
+ tp->millitm = tb.millitm;
+ tp->timezone = tb.timezone;
+ tp->dstflag = tb.dstflag;
+ return 0;
+}
diff --git a/libc-top-half/musl/compat/time32/futimens_time32.c b/libc-top-half/musl/compat/time32/futimens_time32.c
new file mode 100644
index 0000000..7856f17
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/futimens_time32.c
@@ -0,0 +1,10 @@
+#include "time32.h"
+#include <time.h>
+#include <sys/stat.h>
+
+int __futimens_time32(int fd, const struct timespec32 *times32)
+{
+ return futimens(fd, !times32 ? 0 : ((struct timespec[2]){
+ {.tv_sec = times32[0].tv_sec,.tv_nsec = times32[0].tv_nsec},
+ {.tv_sec = times32[1].tv_sec,.tv_nsec = times32[1].tv_nsec}}));
+}
diff --git a/libc-top-half/musl/compat/time32/futimes_time32.c b/libc-top-half/musl/compat/time32/futimes_time32.c
new file mode 100644
index 0000000..f29533f
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/futimes_time32.c
@@ -0,0 +1,12 @@
+#define _GNU_SOURCE
+#include "time32.h"
+#include <time.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+
+int __futimes_time32(int fd, const struct timeval32 times32[2])
+{
+ return futimes(fd, !times32 ? 0 : ((struct timeval[2]){
+ {.tv_sec = times32[0].tv_sec,.tv_usec = times32[0].tv_usec},
+ {.tv_sec = times32[1].tv_sec,.tv_usec = times32[1].tv_usec}}));
+}
diff --git a/libc-top-half/musl/compat/time32/futimesat_time32.c b/libc-top-half/musl/compat/time32/futimesat_time32.c
new file mode 100644
index 0000000..5a1295b
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/futimesat_time32.c
@@ -0,0 +1,12 @@
+#define _GNU_SOURCE
+#include "time32.h"
+#include <time.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+
+int __futimesat_time32(int dirfd, const char *pathname, const struct timeval32 times32[2])
+{
+ return futimesat(dirfd, pathname, !times32 ? 0 : ((struct timeval[2]){
+ {.tv_sec = times32[0].tv_sec,.tv_usec = times32[0].tv_usec},
+ {.tv_sec = times32[1].tv_sec,.tv_usec = times32[1].tv_usec}}));
+}
diff --git a/libc-top-half/musl/compat/time32/getitimer_time32.c b/libc-top-half/musl/compat/time32/getitimer_time32.c
new file mode 100644
index 0000000..4bac4bf
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/getitimer_time32.c
@@ -0,0 +1,15 @@
+#include "time32.h"
+#include <time.h>
+#include <sys/time.h>
+
+int __getitimer_time32(int which, struct itimerval32 *old32)
+{
+ struct itimerval old;
+ int r = getitimer(which, &old);
+ if (r) return r;
+ old32->it_interval.tv_sec = old.it_interval.tv_sec;
+ old32->it_interval.tv_usec = old.it_interval.tv_usec;
+ old32->it_value.tv_sec = old.it_value.tv_sec;
+ old32->it_value.tv_usec = old.it_value.tv_usec;
+ return 0;
+}
diff --git a/libc-top-half/musl/compat/time32/getrusage_time32.c b/libc-top-half/musl/compat/time32/getrusage_time32.c
new file mode 100644
index 0000000..d7487de
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/getrusage_time32.c
@@ -0,0 +1,39 @@
+#include "time32.h"
+#include <string.h>
+#include <stddef.h>
+#include <sys/resource.h>
+
+struct compat_rusage {
+ struct timeval32 ru_utime;
+ struct timeval32 ru_stime;
+ long ru_maxrss;
+ long ru_ixrss;
+ long ru_idrss;
+ long ru_isrss;
+ long ru_minflt;
+ long ru_majflt;
+ long ru_nswap;
+ long ru_inblock;
+ long ru_oublock;
+ long ru_msgsnd;
+ long ru_msgrcv;
+ long ru_nsignals;
+ long ru_nvcsw;
+ long ru_nivcsw;
+};
+
+int __getrusage_time32(int who, struct compat_rusage *usage)
+{
+ struct rusage ru;
+ int r = getrusage(who, &ru);
+ if (!r) {
+ usage->ru_utime.tv_sec = ru.ru_utime.tv_sec;
+ usage->ru_utime.tv_usec = ru.ru_utime.tv_usec;
+ usage->ru_stime.tv_sec = ru.ru_stime.tv_sec;
+ usage->ru_stime.tv_usec = ru.ru_stime.tv_usec;
+ memcpy(&usage->ru_maxrss, &ru.ru_maxrss,
+ sizeof(struct compat_rusage) -
+ offsetof(struct compat_rusage, ru_maxrss));
+ }
+ return r;
+}
diff --git a/libc-top-half/musl/compat/time32/gettimeofday_time32.c b/libc-top-half/musl/compat/time32/gettimeofday_time32.c
new file mode 100644
index 0000000..1f3ce68
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/gettimeofday_time32.c
@@ -0,0 +1,19 @@
+#include "time32.h"
+#include <sys/time.h>
+#include <errno.h>
+#include <stdint.h>
+
+int __gettimeofday_time32(struct timeval32 *tv32, void *tz)
+{
+ struct timeval tv;
+ if (!tv32) return 0;
+ int r = gettimeofday(&tv, 0);
+ if (r) return r;
+ if (tv.tv_sec < INT32_MIN || tv.tv_sec > INT32_MAX) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ tv32->tv_sec = tv.tv_sec;
+ tv32->tv_usec = tv.tv_usec;
+ return 0;
+}
diff --git a/libc-top-half/musl/compat/time32/gmtime32.c b/libc-top-half/musl/compat/time32/gmtime32.c
new file mode 100644
index 0000000..963f0e0
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/gmtime32.c
@@ -0,0 +1,7 @@
+#include "time32.h"
+#include <time.h>
+
+struct tm *__gmtime32(time32_t *t)
+{
+ return gmtime(&(time_t){*t});
+}
diff --git a/libc-top-half/musl/compat/time32/gmtime32_r.c b/libc-top-half/musl/compat/time32/gmtime32_r.c
new file mode 100644
index 0000000..7d72bfb
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/gmtime32_r.c
@@ -0,0 +1,7 @@
+#include "time32.h"
+#include <time.h>
+
+struct tm *__gmtime32_r(time32_t *t, struct tm *tm)
+{
+ return gmtime_r(&(time_t){*t}, tm);
+}
diff --git a/libc-top-half/musl/compat/time32/localtime32.c b/libc-top-half/musl/compat/time32/localtime32.c
new file mode 100644
index 0000000..96bc303
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/localtime32.c
@@ -0,0 +1,7 @@
+#include "time32.h"
+#include <time.h>
+
+struct tm *__localtime32(time32_t *t)
+{
+ return localtime(&(time_t){*t});
+}
diff --git a/libc-top-half/musl/compat/time32/localtime32_r.c b/libc-top-half/musl/compat/time32/localtime32_r.c
new file mode 100644
index 0000000..633ec82
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/localtime32_r.c
@@ -0,0 +1,7 @@
+#include "time32.h"
+#include <time.h>
+
+struct tm *__localtime32_r(time32_t *t, struct tm *tm)
+{
+ return localtime_r(&(time_t){*t}, tm);
+}
diff --git a/libc-top-half/musl/compat/time32/lstat_time32.c b/libc-top-half/musl/compat/time32/lstat_time32.c
new file mode 100644
index 0000000..c1257a1
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/lstat_time32.c
@@ -0,0 +1,17 @@
+#include "time32.h"
+#include <time.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <stddef.h>
+
+struct stat32;
+
+int __lstat_time32(const char *restrict path, struct stat32 *restrict st32)
+{
+ struct stat st;
+ int r = lstat(path, &st);
+ if (!r) memcpy(st32, &st, offsetof(struct stat, st_atim));
+ return r;
+}
+
+weak_alias(lstat, lstat64);
diff --git a/libc-top-half/musl/compat/time32/lutimes_time32.c b/libc-top-half/musl/compat/time32/lutimes_time32.c
new file mode 100644
index 0000000..7f75cd4
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/lutimes_time32.c
@@ -0,0 +1,12 @@
+#define _GNU_SOURCE
+#include "time32.h"
+#include <time.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+
+int __lutimes_time32(const char *path, const struct timeval32 times32[2])
+{
+ return lutimes(path, !times32 ? 0 : ((struct timeval[2]){
+ {.tv_sec = times32[0].tv_sec,.tv_usec = times32[0].tv_usec},
+ {.tv_sec = times32[1].tv_sec,.tv_usec = times32[1].tv_usec}}));
+}
diff --git a/libc-top-half/musl/compat/time32/mktime32.c b/libc-top-half/musl/compat/time32/mktime32.c
new file mode 100644
index 0000000..e6f15d5
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/mktime32.c
@@ -0,0 +1,16 @@
+#include "time32.h"
+#include <time.h>
+#include <errno.h>
+#include <stdint.h>
+
+time32_t __mktime32(struct tm *tm)
+{
+ struct tm tmp = *tm;
+ time_t t = mktime(&tmp);
+ if (t < INT32_MIN || t > INT32_MAX) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ *tm = tmp;
+ return t;
+}
diff --git a/libc-top-half/musl/compat/time32/mq_timedreceive_time32.c b/libc-top-half/musl/compat/time32/mq_timedreceive_time32.c
new file mode 100644
index 0000000..211cea4
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/mq_timedreceive_time32.c
@@ -0,0 +1,9 @@
+#include "time32.h"
+#include <mqueue.h>
+#include <time.h>
+
+ssize_t __mq_timedreceive_time32(mqd_t mqd, char *restrict msg, size_t len, unsigned *restrict prio, const struct timespec32 *restrict ts32)
+{
+ return mq_timedreceive(mqd, msg, len, prio, ts32 ? (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}) : 0);
+}
diff --git a/libc-top-half/musl/compat/time32/mq_timedsend_time32.c b/libc-top-half/musl/compat/time32/mq_timedsend_time32.c
new file mode 100644
index 0000000..93b697a
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/mq_timedsend_time32.c
@@ -0,0 +1,9 @@
+#include "time32.h"
+#include <mqueue.h>
+#include <time.h>
+
+int __mq_timedsend_time32(mqd_t mqd, const char *msg, size_t len, unsigned prio, const struct timespec32 *ts32)
+{
+ return mq_timedsend(mqd, msg, len, prio, ts32 ? (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}) : 0);
+}
diff --git a/libc-top-half/musl/compat/time32/mtx_timedlock_time32.c b/libc-top-half/musl/compat/time32/mtx_timedlock_time32.c
new file mode 100644
index 0000000..a01f09b
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/mtx_timedlock_time32.c
@@ -0,0 +1,9 @@
+#include "time32.h"
+#include <time.h>
+#include <threads.h>
+
+int __mtx_timedlock_time32(mtx_t *restrict m, const struct timespec32 *restrict ts32)
+{
+ return mtx_timedlock(m, !ts32 ? 0 : (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}));
+}
diff --git a/libc-top-half/musl/compat/time32/nanosleep_time32.c b/libc-top-half/musl/compat/time32/nanosleep_time32.c
new file mode 100644
index 0000000..ea6bdd8
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/nanosleep_time32.c
@@ -0,0 +1,15 @@
+#include "time32.h"
+#include <time.h>
+#include <errno.h>
+
+int __nanosleep_time32(const struct timespec32 *req32, struct timespec32 *rem32)
+{
+ struct timespec rem;
+ int ret = nanosleep((&(struct timespec){
+ .tv_sec = req32->tv_sec, .tv_nsec = req32->tv_nsec}), &rem);
+ if (ret<0 && errno==EINTR && rem32) {
+ rem32->tv_sec = rem.tv_sec;
+ rem32->tv_nsec = rem.tv_nsec;
+ }
+ return ret;
+}
diff --git a/libc-top-half/musl/compat/time32/ppoll_time32.c b/libc-top-half/musl/compat/time32/ppoll_time32.c
new file mode 100644
index 0000000..43b4b0d
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/ppoll_time32.c
@@ -0,0 +1,10 @@
+#include "time32.h"
+#define _GNU_SOURCE
+#include <time.h>
+#include <poll.h>
+
+int __ppoll_time32(struct pollfd *fds, nfds_t n, const struct timespec32 *ts32, const sigset_t *mask)
+{
+ return ppoll(fds, n, !ts32 ? 0 : (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}), mask);
+}
diff --git a/libc-top-half/musl/compat/time32/pselect_time32.c b/libc-top-half/musl/compat/time32/pselect_time32.c
new file mode 100644
index 0000000..ecaa8f8
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/pselect_time32.c
@@ -0,0 +1,9 @@
+#include "time32.h"
+#include <time.h>
+#include <sys/select.h>
+
+int __pselect_time32(int n, fd_set *restrict rfds, fd_set *restrict wfds, fd_set *restrict efds, const struct timespec32 *restrict ts32, const sigset_t *restrict mask)
+{
+ return pselect(n, rfds, wfds, efds, !ts32 ? 0 : (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}), mask);
+}
diff --git a/libc-top-half/musl/compat/time32/pthread_cond_timedwait_time32.c b/libc-top-half/musl/compat/time32/pthread_cond_timedwait_time32.c
new file mode 100644
index 0000000..fba1f2a
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/pthread_cond_timedwait_time32.c
@@ -0,0 +1,9 @@
+#include "time32.h"
+#include <time.h>
+#include <pthread.h>
+
+int __pthread_cond_timedwait_time32(pthread_cond_t *restrict c, pthread_mutex_t *restrict m, const struct timespec32 *restrict ts32)
+{
+ return pthread_cond_timedwait(c, m, !ts32 ? 0 : (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}));
+}
diff --git a/libc-top-half/musl/compat/time32/pthread_mutex_timedlock_time32.c b/libc-top-half/musl/compat/time32/pthread_mutex_timedlock_time32.c
new file mode 100644
index 0000000..2d29602
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/pthread_mutex_timedlock_time32.c
@@ -0,0 +1,9 @@
+#include "time32.h"
+#include <time.h>
+#include <pthread.h>
+
+int __pthread_mutex_timedlock_time32(pthread_mutex_t *restrict m, const struct timespec32 *restrict ts32)
+{
+ return pthread_mutex_timedlock(m, !ts32 ? 0 : (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}));
+}
diff --git a/libc-top-half/musl/compat/time32/pthread_rwlock_timedrdlock_time32.c b/libc-top-half/musl/compat/time32/pthread_rwlock_timedrdlock_time32.c
new file mode 100644
index 0000000..33df27a
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/pthread_rwlock_timedrdlock_time32.c
@@ -0,0 +1,9 @@
+#include "time32.h"
+#include <time.h>
+#include <pthread.h>
+
+int __pthread_rwlock_timedrdlock_time32(pthread_rwlock_t *restrict rw, const struct timespec32 *restrict ts32)
+{
+ return pthread_rwlock_timedrdlock(rw, !ts32 ? 0 : (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}));
+}
diff --git a/libc-top-half/musl/compat/time32/pthread_rwlock_timedwrlock_time32.c b/libc-top-half/musl/compat/time32/pthread_rwlock_timedwrlock_time32.c
new file mode 100644
index 0000000..99f24f7
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/pthread_rwlock_timedwrlock_time32.c
@@ -0,0 +1,9 @@
+#include "time32.h"
+#include <time.h>
+#include <pthread.h>
+
+int __pthread_rwlock_timedwrlock_time32(pthread_rwlock_t *restrict rw, const struct timespec32 *restrict ts32)
+{
+ return pthread_rwlock_timedwrlock(rw, !ts32 ? 0 : (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}));
+}
diff --git a/libc-top-half/musl/compat/time32/pthread_timedjoin_np_time32.c b/libc-top-half/musl/compat/time32/pthread_timedjoin_np_time32.c
new file mode 100644
index 0000000..3ec2995
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/pthread_timedjoin_np_time32.c
@@ -0,0 +1,10 @@
+#define _GNU_SOURCE
+#include "time32.h"
+#include <time.h>
+#include <pthread.h>
+
+int __pthread_timedjoin_np_time32(pthread_t t, void **res, const struct timespec32 *at32)
+{
+ return pthread_timedjoin_np(t, res, !at32 ? 0 : (&(struct timespec){
+ .tv_sec = at32->tv_sec, .tv_nsec = at32->tv_nsec}));
+}
diff --git a/libc-top-half/musl/compat/time32/recvmmsg_time32.c b/libc-top-half/musl/compat/time32/recvmmsg_time32.c
new file mode 100644
index 0000000..acf1cfb
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/recvmmsg_time32.c
@@ -0,0 +1,10 @@
+#include "time32.h"
+#define _GNU_SOURCE
+#include <time.h>
+#include <sys/socket.h>
+
+int __recvmmsg_time32(int fd, struct mmsghdr *msgvec, unsigned int vlen, unsigned int flags, struct timespec32 *ts32)
+{
+ return recvmmsg(fd, msgvec, vlen, flags, ts32 ? (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}) : 0);
+}
diff --git a/libc-top-half/musl/compat/time32/sched_rr_get_interval_time32.c b/libc-top-half/musl/compat/time32/sched_rr_get_interval_time32.c
new file mode 100644
index 0000000..36cbbac
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/sched_rr_get_interval_time32.c
@@ -0,0 +1,13 @@
+#include "time32.h"
+#include <time.h>
+#include <sched.h>
+
+int __sched_rr_get_interval_time32(pid_t pid, struct timespec32 *ts32)
+{
+ struct timespec ts;
+ int r = sched_rr_get_interval(pid, &ts);
+ if (r) return r;
+ ts32->tv_sec = ts.tv_sec;
+ ts32->tv_nsec = ts.tv_nsec;
+ return r;
+}
diff --git a/libc-top-half/musl/compat/time32/select_time32.c b/libc-top-half/musl/compat/time32/select_time32.c
new file mode 100644
index 0000000..2d8df9a
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/select_time32.c
@@ -0,0 +1,10 @@
+#include "time32.h"
+#include <time.h>
+#include <sys/time.h>
+#include <sys/select.h>
+
+int __select_time32(int n, fd_set *restrict rfds, fd_set *restrict wfds, fd_set *restrict efds, struct timeval32 *restrict tv32)
+{
+ return select(n, rfds, wfds, efds, !tv32 ? 0 : (&(struct timeval){
+ .tv_sec = tv32->tv_sec, .tv_usec = tv32->tv_usec}));
+}
diff --git a/libc-top-half/musl/compat/time32/sem_timedwait_time32.c b/libc-top-half/musl/compat/time32/sem_timedwait_time32.c
new file mode 100644
index 0000000..c3469f9
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/sem_timedwait_time32.c
@@ -0,0 +1,9 @@
+#include "time32.h"
+#include <time.h>
+#include <semaphore.h>
+
+int __sem_timedwait_time32(sem_t *sem, const struct timespec32 *restrict ts32)
+{
+ return sem_timedwait(sem, !ts32 ? 0 : (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}));
+}
diff --git a/libc-top-half/musl/compat/time32/semtimedop_time32.c b/libc-top-half/musl/compat/time32/semtimedop_time32.c
new file mode 100644
index 0000000..34ec528
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/semtimedop_time32.c
@@ -0,0 +1,10 @@
+#include "time32.h"
+#define _GNU_SOURCE
+#include <sys/sem.h>
+#include <time.h>
+
+int __semtimedop_time32(int id, struct sembuf *buf, size_t n, const struct timespec32 *ts32)
+{
+ return semtimedop(id, buf, n, !ts32 ? 0 : (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}));
+}
diff --git a/libc-top-half/musl/compat/time32/setitimer_time32.c b/libc-top-half/musl/compat/time32/setitimer_time32.c
new file mode 100644
index 0000000..2475fd8
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/setitimer_time32.c
@@ -0,0 +1,25 @@
+#include "time32.h"
+#include <time.h>
+#include <sys/time.h>
+
+int __setitimer_time32(int which, const struct itimerval32 *restrict new32, struct itimerval32 *restrict old32)
+{
+ struct itimerval old;
+ int r = setitimer(which, (&(struct itimerval){
+ .it_interval.tv_sec = new32->it_interval.tv_sec,
+ .it_interval.tv_usec = new32->it_interval.tv_usec,
+ .it_value.tv_sec = new32->it_value.tv_sec,
+ .it_value.tv_usec = new32->it_value.tv_usec}), &old);
+ if (r) return r;
+ /* The above call has already committed to success by changing the
+ * timer setting, so we can't fail on out-of-range old value.
+ * Since these are relative times, values large enough to overflow
+ * don't make sense anyway. */
+ if (old32) {
+ old32->it_interval.tv_sec = old.it_interval.tv_sec;
+ old32->it_interval.tv_usec = old.it_interval.tv_usec;
+ old32->it_value.tv_sec = old.it_value.tv_sec;
+ old32->it_value.tv_usec = old.it_value.tv_usec;
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/compat/time32/settimeofday_time32.c b/libc-top-half/musl/compat/time32/settimeofday_time32.c
new file mode 100644
index 0000000..09e625c
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/settimeofday_time32.c
@@ -0,0 +1,10 @@
+#define _BSD_SOURCE
+#include "time32.h"
+#include <sys/time.h>
+
+int __settimeofday_time32(const struct timeval32 *tv32, const void *tz)
+{
+ return settimeofday(!tv32 ? 0 : (&(struct timeval){
+ .tv_sec = tv32->tv_sec,
+ .tv_usec = tv32->tv_usec}), 0);
+}
diff --git a/libc-top-half/musl/compat/time32/sigtimedwait_time32.c b/libc-top-half/musl/compat/time32/sigtimedwait_time32.c
new file mode 100644
index 0000000..6b3aa39
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/sigtimedwait_time32.c
@@ -0,0 +1,9 @@
+#include "time32.h"
+#include <time.h>
+#include <signal.h>
+
+int __sigtimedwait_time32(const sigset_t *restrict set, siginfo_t *restrict si, const struct timespec32 *restrict ts32)
+{
+ return sigtimedwait(set, si, !ts32 ? 0 : (&(struct timespec){
+ .tv_sec = ts32->tv_sec, .tv_nsec = ts32->tv_nsec}));
+}
diff --git a/libc-top-half/musl/compat/time32/stat_time32.c b/libc-top-half/musl/compat/time32/stat_time32.c
new file mode 100644
index 0000000..8c6121d
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/stat_time32.c
@@ -0,0 +1,17 @@
+#include "time32.h"
+#include <time.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <stddef.h>
+
+struct stat32;
+
+int __stat_time32(const char *restrict path, struct stat32 *restrict st32)
+{
+ struct stat st;
+ int r = stat(path, &st);
+ if (!r) memcpy(st32, &st, offsetof(struct stat, st_atim));
+ return r;
+}
+
+weak_alias(stat, stat64);
diff --git a/libc-top-half/musl/compat/time32/stime32.c b/libc-top-half/musl/compat/time32/stime32.c
new file mode 100644
index 0000000..cc76364
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/stime32.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include "time32.h"
+#include <time.h>
+
+int __stime32(const time32_t *t)
+{
+ return stime(&(time_t){*t});
+}
diff --git a/libc-top-half/musl/compat/time32/thrd_sleep_time32.c b/libc-top-half/musl/compat/time32/thrd_sleep_time32.c
new file mode 100644
index 0000000..5908800
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/thrd_sleep_time32.c
@@ -0,0 +1,16 @@
+#include "time32.h"
+#include <time.h>
+#include <threads.h>
+#include <errno.h>
+
+int __thrd_sleep_time32(const struct timespec32 *req32, struct timespec32 *rem32)
+{
+ struct timespec rem;
+ int ret = thrd_sleep((&(struct timespec){
+ .tv_sec = req32->tv_sec, .tv_nsec = req32->tv_nsec}), &rem);
+ if (ret<0 && errno==EINTR && rem32) {
+ rem32->tv_sec = rem.tv_sec;
+ rem32->tv_nsec = rem.tv_nsec;
+ }
+ return ret;
+}
diff --git a/libc-top-half/musl/compat/time32/time32.c b/libc-top-half/musl/compat/time32/time32.c
new file mode 100644
index 0000000..4b8fac1
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/time32.c
@@ -0,0 +1,15 @@
+#include "time32.h"
+#include <time.h>
+#include <errno.h>
+#include <stdint.h>
+
+time32_t __time32(time32_t *p)
+{
+ time_t t = time(0);
+ if (t < INT32_MIN || t > INT32_MAX) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ if (p) *p = t;
+ return t;
+}
diff --git a/libc-top-half/musl/compat/time32/time32.h b/libc-top-half/musl/compat/time32/time32.h
new file mode 100644
index 0000000..fdec17c
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/time32.h
@@ -0,0 +1,91 @@
+#ifndef TIME32_H
+#define TIME32_H
+
+#include <sys/types.h>
+
+typedef long time32_t;
+
+struct timeval32 {
+ long tv_sec;
+ long tv_usec;
+};
+
+struct itimerval32 {
+ struct timeval32 it_interval;
+ struct timeval32 it_value;
+};
+
+struct timespec32 {
+ long tv_sec;
+ long tv_nsec;
+};
+
+struct itimerspec32 {
+ struct timespec32 it_interval;
+ struct timespec32 it_value;
+};
+
+int __adjtime32() __asm__("adjtime");
+int __adjtimex_time32() __asm__("adjtimex");
+int __aio_suspend_time32() __asm__("aio_suspend");
+int __clock_adjtime32() __asm__("clock_adjtime");
+int __clock_getres_time32() __asm__("clock_getres");
+int __clock_gettime32() __asm__("clock_gettime");
+int __clock_nanosleep_time32() __asm__("clock_nanosleep");
+int __clock_settime32() __asm__("clock_settime");
+int __cnd_timedwait_time32() __asm__("cnd_timedwait");
+char *__ctime32() __asm__("ctime");
+char *__ctime32_r() __asm__("ctime_r");
+double __difftime32() __asm__("difftime");
+int __fstat_time32() __asm__("fstat");
+int __fstatat_time32() __asm__("fstatat");
+int __ftime32() __asm__("ftime");
+int __futimens_time32() __asm__("futimens");
+int __futimes_time32() __asm__("futimes");
+int __futimesat_time32() __asm__("futimesat");
+int __getitimer_time32() __asm__("getitimer");
+int __getrusage_time32() __asm__("getrusage");
+int __gettimeofday_time32() __asm__("gettimeofday");
+struct tm *__gmtime32() __asm__("gmtime");
+struct tm *__gmtime32_r() __asm__("gmtime_r");
+struct tm *__localtime32() __asm__("localtime");
+struct tm *__localtime32_r() __asm__("localtime_r");
+int __lstat_time32() __asm__("lstat");
+int __lutimes_time32() __asm__("lutimes");
+time32_t __mktime32() __asm__("mktime");
+ssize_t __mq_timedreceive_time32() __asm__("mq_timedreceive");
+int __mq_timedsend_time32() __asm__("mq_timedsend");
+int __mtx_timedlock_time32() __asm__("mtx_timedlock");
+int __nanosleep_time32() __asm__("nanosleep");
+int __ppoll_time32() __asm__("ppoll");
+int __pselect_time32() __asm__("pselect");
+int __pthread_cond_timedwait_time32() __asm__("pthread_cond_timedwait");
+int __pthread_mutex_timedlock_time32() __asm__("pthread_mutex_timedlock");
+int __pthread_rwlock_timedrdlock_time32() __asm__("pthread_rwlock_timedrdlock");
+int __pthread_rwlock_timedwrlock_time32() __asm__("pthread_rwlock_timedwrlock");
+int __pthread_timedjoin_np_time32() __asm__("pthread_timedjoin_np");
+int __recvmmsg_time32() __asm__("recvmmsg");
+int __sched_rr_get_interval_time32() __asm__("sched_rr_get_interval");
+int __select_time32() __asm__("select");
+int __sem_timedwait_time32() __asm__("sem_timedwait");
+int __semtimedop_time32() __asm__("semtimedop");
+int __setitimer_time32() __asm__("setitimer");
+int __settimeofday_time32() __asm__("settimeofday");
+int __sigtimedwait_time32() __asm__("sigtimedwait");
+int __stat_time32() __asm__("stat");
+int __stime32() __asm__("stime");
+int __thrd_sleep_time32() __asm__("thrd_sleep");
+time32_t __time32() __asm__("time");
+time32_t __time32gm() __asm__("timegm");
+int __timer_gettime32() __asm__("timer_gettime");
+int __timer_settime32() __asm__("timer_settime");
+int __timerfd_gettime32() __asm__("timerfd_gettime");
+int __timerfd_settime32() __asm__("timerfd_settime");
+int __timespec_get_time32() __asm__("timespec_get");
+int __utime_time32() __asm__("utime");
+int __utimensat_time32() __asm__("utimensat");
+int __utimes_time32() __asm__("utimes");
+pid_t __wait3_time32() __asm__("wait3");
+pid_t __wait4_time32() __asm__("wait4");
+
+#endif
diff --git a/libc-top-half/musl/compat/time32/time32gm.c b/libc-top-half/musl/compat/time32/time32gm.c
new file mode 100644
index 0000000..60d68fb
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/time32gm.c
@@ -0,0 +1,15 @@
+#define _GNU_SOURCE
+#include "time32.h"
+#include <time.h>
+#include <errno.h>
+#include <stdint.h>
+
+time32_t __time32gm(struct tm *tm)
+{
+ time_t t = timegm(tm);
+ if (t < INT32_MIN || t > INT32_MAX) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ return t;
+}
diff --git a/libc-top-half/musl/compat/time32/timer_gettime32.c b/libc-top-half/musl/compat/time32/timer_gettime32.c
new file mode 100644
index 0000000..b4184cc
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/timer_gettime32.c
@@ -0,0 +1,15 @@
+#include "time32.h"
+#include <time.h>
+
+int __timer_gettime32(timer_t t, struct itimerspec32 *val32)
+{
+ struct itimerspec old;
+ int r = timer_gettime(t, &old);
+ if (r) return r;
+ /* No range checking for consistency with settime */
+ val32->it_interval.tv_sec = old.it_interval.tv_sec;
+ val32->it_interval.tv_nsec = old.it_interval.tv_nsec;
+ val32->it_value.tv_sec = old.it_value.tv_sec;
+ val32->it_value.tv_nsec = old.it_value.tv_nsec;
+ return 0;
+}
diff --git a/libc-top-half/musl/compat/time32/timer_settime32.c b/libc-top-half/musl/compat/time32/timer_settime32.c
new file mode 100644
index 0000000..a447e7d
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/timer_settime32.c
@@ -0,0 +1,25 @@
+#include "time32.h"
+#include <time.h>
+
+int __timer_settime32(timer_t t, int flags, const struct itimerspec32 *restrict val32, struct itimerspec32 *restrict old32)
+{
+ struct itimerspec old;
+ int r = timer_settime(t, flags, (&(struct itimerspec){
+ .it_interval.tv_sec = val32->it_interval.tv_sec,
+ .it_interval.tv_nsec = val32->it_interval.tv_nsec,
+ .it_value.tv_sec = val32->it_value.tv_sec,
+ .it_value.tv_nsec = val32->it_value.tv_nsec}),
+ old32 ? &old : 0);
+ if (r) return r;
+ /* The above call has already committed to success by changing the
+ * timer setting, so we can't fail on out-of-range old value.
+ * Since these are relative times, values large enough to overflow
+ * don't make sense anyway. */
+ if (old32) {
+ old32->it_interval.tv_sec = old.it_interval.tv_sec;
+ old32->it_interval.tv_nsec = old.it_interval.tv_nsec;
+ old32->it_value.tv_sec = old.it_value.tv_sec;
+ old32->it_value.tv_nsec = old.it_value.tv_nsec;
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/compat/time32/timerfd_gettime32.c b/libc-top-half/musl/compat/time32/timerfd_gettime32.c
new file mode 100644
index 0000000..75e5435
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/timerfd_gettime32.c
@@ -0,0 +1,16 @@
+#include "time32.h"
+#include <time.h>
+#include <sys/timerfd.h>
+
+int __timerfd_gettime32(int t, struct itimerspec32 *val32)
+{
+ struct itimerspec old;
+ int r = timerfd_gettime(t, &old);
+ if (r) return r;
+ /* No range checking for consistency with settime */
+ val32->it_interval.tv_sec = old.it_interval.tv_sec;
+ val32->it_interval.tv_nsec = old.it_interval.tv_nsec;
+ val32->it_value.tv_sec = old.it_value.tv_sec;
+ val32->it_value.tv_nsec = old.it_value.tv_nsec;
+ return 0;
+}
diff --git a/libc-top-half/musl/compat/time32/timerfd_settime32.c b/libc-top-half/musl/compat/time32/timerfd_settime32.c
new file mode 100644
index 0000000..67830d3
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/timerfd_settime32.c
@@ -0,0 +1,26 @@
+#include "time32.h"
+#include <time.h>
+#include <sys/timerfd.h>
+
+int __timerfd_settime32(int t, int flags, const struct itimerspec32 *restrict val32, struct itimerspec32 *restrict old32)
+{
+ struct itimerspec old;
+ int r = timerfd_settime(t, flags, (&(struct itimerspec){
+ .it_interval.tv_sec = val32->it_interval.tv_sec,
+ .it_interval.tv_nsec = val32->it_interval.tv_nsec,
+ .it_value.tv_sec = val32->it_value.tv_sec,
+ .it_value.tv_nsec = val32->it_value.tv_nsec}),
+ old32 ? &old : 0);
+ if (r) return r;
+ /* The above call has already committed to success by changing the
+ * timer setting, so we can't fail on out-of-range old value.
+ * Since these are relative times, values large enough to overflow
+ * don't make sense anyway. */
+ if (old32) {
+ old32->it_interval.tv_sec = old.it_interval.tv_sec;
+ old32->it_interval.tv_nsec = old.it_interval.tv_nsec;
+ old32->it_value.tv_sec = old.it_value.tv_sec;
+ old32->it_value.tv_nsec = old.it_value.tv_nsec;
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/compat/time32/timespec_get_time32.c b/libc-top-half/musl/compat/time32/timespec_get_time32.c
new file mode 100644
index 0000000..e9ca94c
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/timespec_get_time32.c
@@ -0,0 +1,18 @@
+#include "time32.h"
+#include <time.h>
+#include <errno.h>
+#include <stdint.h>
+
+int __timespec_get_time32(struct timespec32 *ts32, int base)
+{
+ struct timespec ts;
+ int r = timespec_get(&ts, base);
+ if (!r) return r;
+ if (ts.tv_sec < INT32_MIN || ts.tv_sec > INT32_MAX) {
+ errno = EOVERFLOW;
+ return 0;
+ }
+ ts32->tv_sec = ts.tv_sec;
+ ts32->tv_nsec = ts.tv_nsec;
+ return r;
+}
diff --git a/libc-top-half/musl/compat/time32/utime_time32.c b/libc-top-half/musl/compat/time32/utime_time32.c
new file mode 100644
index 0000000..65f11d4
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/utime_time32.c
@@ -0,0 +1,14 @@
+#include "time32.h"
+#include <time.h>
+#include <utime.h>
+
+struct utimbuf32 {
+ time32_t actime;
+ time32_t modtime;
+};
+
+int __utime_time32(const char *path, const struct utimbuf32 *times32)
+{
+ return utime(path, !times32 ? 0 : (&(struct utimbuf){
+ .actime = times32->actime, .modtime = times32->modtime}));
+}
diff --git a/libc-top-half/musl/compat/time32/utimensat_time32.c b/libc-top-half/musl/compat/time32/utimensat_time32.c
new file mode 100644
index 0000000..c687b8d
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/utimensat_time32.c
@@ -0,0 +1,11 @@
+#include "time32.h"
+#include <time.h>
+#include <sys/stat.h>
+
+int __utimensat_time32(int fd, const char *path, const struct timespec32 times32[2], int flags)
+{
+ return utimensat(fd, path, !times32 ? 0 : ((struct timespec[2]){
+ {.tv_sec = times32[0].tv_sec,.tv_nsec = times32[0].tv_nsec},
+ {.tv_sec = times32[1].tv_sec,.tv_nsec = times32[1].tv_nsec}}),
+ flags);
+}
diff --git a/libc-top-half/musl/compat/time32/utimes_time32.c b/libc-top-half/musl/compat/time32/utimes_time32.c
new file mode 100644
index 0000000..59248f6
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/utimes_time32.c
@@ -0,0 +1,11 @@
+#include "time32.h"
+#include <time.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+
+int __utimes_time32(const char *path, const struct timeval32 times32[2])
+{
+ return utimes(path, !times32 ? 0 : ((struct timeval[2]){
+ {.tv_sec = times32[0].tv_sec,.tv_usec = times32[0].tv_usec},
+ {.tv_sec = times32[1].tv_sec,.tv_usec = times32[1].tv_usec}}));
+}
diff --git a/libc-top-half/musl/compat/time32/wait3_time32.c b/libc-top-half/musl/compat/time32/wait3_time32.c
new file mode 100644
index 0000000..8fe128e
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/wait3_time32.c
@@ -0,0 +1,40 @@
+#define _BSD_SOURCE
+#include "time32.h"
+#include <string.h>
+#include <stddef.h>
+#include <sys/wait.h>
+
+struct compat_rusage {
+ struct timeval32 ru_utime;
+ struct timeval32 ru_stime;
+ long ru_maxrss;
+ long ru_ixrss;
+ long ru_idrss;
+ long ru_isrss;
+ long ru_minflt;
+ long ru_majflt;
+ long ru_nswap;
+ long ru_inblock;
+ long ru_oublock;
+ long ru_msgsnd;
+ long ru_msgrcv;
+ long ru_nsignals;
+ long ru_nvcsw;
+ long ru_nivcsw;
+};
+
+pid_t __wait3_time32(int *status, int options, struct compat_rusage *usage)
+{
+ struct rusage ru;
+ int r = wait3(status, options, usage ? &ru : 0);
+ if (!r && usage) {
+ usage->ru_utime.tv_sec = ru.ru_utime.tv_sec;
+ usage->ru_utime.tv_usec = ru.ru_utime.tv_usec;
+ usage->ru_stime.tv_sec = ru.ru_stime.tv_sec;
+ usage->ru_stime.tv_usec = ru.ru_stime.tv_usec;
+ memcpy(&usage->ru_maxrss, &ru.ru_maxrss,
+ sizeof(struct compat_rusage) -
+ offsetof(struct compat_rusage, ru_maxrss));
+ }
+ return r;
+}
diff --git a/libc-top-half/musl/compat/time32/wait4_time32.c b/libc-top-half/musl/compat/time32/wait4_time32.c
new file mode 100644
index 0000000..918548e
--- /dev/null
+++ b/libc-top-half/musl/compat/time32/wait4_time32.c
@@ -0,0 +1,40 @@
+#define _BSD_SOURCE
+#include "time32.h"
+#include <string.h>
+#include <stddef.h>
+#include <sys/wait.h>
+
+struct compat_rusage {
+ struct timeval32 ru_utime;
+ struct timeval32 ru_stime;
+ long ru_maxrss;
+ long ru_ixrss;
+ long ru_idrss;
+ long ru_isrss;
+ long ru_minflt;
+ long ru_majflt;
+ long ru_nswap;
+ long ru_inblock;
+ long ru_oublock;
+ long ru_msgsnd;
+ long ru_msgrcv;
+ long ru_nsignals;
+ long ru_nvcsw;
+ long ru_nivcsw;
+};
+
+pid_t __wait4_time32(pid_t pid, int *status, int options, struct compat_rusage *usage)
+{
+ struct rusage ru;
+ int r = wait4(pid, status, options, usage ? &ru : 0);
+ if (!r && usage) {
+ usage->ru_utime.tv_sec = ru.ru_utime.tv_sec;
+ usage->ru_utime.tv_usec = ru.ru_utime.tv_usec;
+ usage->ru_stime.tv_sec = ru.ru_stime.tv_sec;
+ usage->ru_stime.tv_usec = ru.ru_stime.tv_usec;
+ memcpy(&usage->ru_maxrss, &ru.ru_maxrss,
+ sizeof(struct compat_rusage) -
+ offsetof(struct compat_rusage, ru_maxrss));
+ }
+ return r;
+}
diff --git a/libc-top-half/musl/configure b/libc-top-half/musl/configure
new file mode 100755
index 0000000..931d556
--- /dev/null
+++ b/libc-top-half/musl/configure
@@ -0,0 +1,814 @@
+#!/bin/sh
+
+usage () {
+cat <<EOF
+Usage: $0 [OPTION]... [VAR=VALUE]... [TARGET]
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ --srcdir=DIR source directory [detected]
+
+Installation directories:
+ --prefix=PREFIX main installation prefix [/usr/local/musl]
+ --exec-prefix=EPREFIX installation prefix for executable files [PREFIX]
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --libdir=DIR library files for the linker [PREFIX/lib]
+ --includedir=DIR include files for the C compiler [PREFIX/include]
+ --syslibdir=DIR location for the dynamic linker [/lib]
+
+System types:
+ --target=TARGET configure to run on target TARGET [detected]
+ --host=HOST same as --target
+ --build=BUILD build system type; used only to infer cross-compiling
+
+Optional features:
+ --enable-optimize=... optimize listed components for speed over size [auto]
+ --enable-debug build with debugging information [disabled]
+ --disable-warnings build with recommended warnings flags [enabled]
+ --enable-wrapper=... build given musl toolchain wrapper [auto]
+ --disable-shared inhibit building shared library [enabled]
+ --disable-static inhibit building static library [enabled]
+
+Optional packages:
+ --with-malloc=... choose malloc implementation [mallocng]
+
+Some influential environment variables:
+ CC C compiler command [detected]
+ CFLAGS C compiler flags [-Os -pipe ...]
+ CROSS_COMPILE prefix for cross compiler and tools [none]
+ LIBCC compiler runtime library [detected]
+
+Use these variables to override the choices made by configure.
+
+EOF
+exit 0
+}
+
+# Helper functions
+
+quote () {
+tr '\n' ' ' <<EOF | grep '^[-[:alnum:]_=,./:]* $' >/dev/null 2>&1 && { echo "$1" ; return 0 ; }
+$1
+EOF
+printf %s\\n "$1" | sed -e "s/'/'\\\\''/g" -e "1s/^/'/" -e "\$s/\$/'/" -e "s#^'\([-[:alnum:]_,./:]*\)=\(.*\)\$#\1='\2#"
+}
+echo () { printf "%s\n" "$*" ; }
+fail () { echo "$*" ; exit 1 ; }
+fnmatch () { eval "case \"\$2\" in $1) return 0 ;; *) return 1 ;; esac" ; }
+cmdexists () { type "$1" >/dev/null 2>&1 ; }
+trycc () { test -z "$CC" && cmdexists "$1" && CC=$1 ; }
+
+stripdir () {
+while eval "fnmatch '*/' \"\${$1}\"" ; do eval "$1=\${$1%/}" ; done
+}
+
+trycppif () {
+printf "checking preprocessor condition %s... " "$1"
+echo "typedef int x;" > "$tmpc"
+echo "#if $1" >> "$tmpc"
+echo "#error yes" >> "$tmpc"
+echo "#endif" >> "$tmpc"
+if $CC $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+printf "false\n"
+return 1
+else
+printf "true\n"
+return 0
+fi
+}
+
+tryflag () {
+printf "checking whether compiler accepts %s... " "$2"
+echo "typedef int x;" > "$tmpc"
+if $CC $CFLAGS_TRY $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+printf "yes\n"
+eval "$1=\"\${$1} \$2\""
+eval "$1=\${$1# }"
+return 0
+else
+printf "no\n"
+return 1
+fi
+}
+
+tryldflag () {
+printf "checking whether linker accepts %s... " "$2"
+echo "typedef int x;" > "$tmpc"
+if $CC $LDFLAGS_TRY -nostdlib -shared "$2" -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+printf "yes\n"
+eval "$1=\"\${$1} \$2\""
+eval "$1=\${$1# }"
+return 0
+else
+printf "no\n"
+return 1
+fi
+}
+
+
+
+# Beginning of actual script
+
+CFLAGS_C99FSE=
+CFLAGS_AUTO=
+CFLAGS_MEMOPS=
+CFLAGS_NOSSP=
+CFLAGS_TRY=
+LDFLAGS_AUTO=
+LDFLAGS_TRY=
+OPTIMIZE_GLOBS=
+srcdir=
+prefix=/usr/local/musl
+exec_prefix='$(prefix)'
+bindir='$(exec_prefix)/bin'
+libdir='$(prefix)/lib'
+includedir='$(prefix)/include'
+syslibdir='/lib'
+tools=
+tool_libs=
+build=
+target=
+optimize=auto
+debug=no
+warnings=yes
+shared=auto
+static=yes
+wrapper=auto
+gcc_wrapper=no
+clang_wrapper=no
+malloc_dir=mallocng
+
+for arg ; do
+case "$arg" in
+--help|-h) usage ;;
+--srcdir=*) srcdir=${arg#*=} ;;
+--prefix=*) prefix=${arg#*=} ;;
+--exec-prefix=*) exec_prefix=${arg#*=} ;;
+--bindir=*) bindir=${arg#*=} ;;
+--libdir=*) libdir=${arg#*=} ;;
+--includedir=*) includedir=${arg#*=} ;;
+--syslibdir=*) syslibdir=${arg#*=} ;;
+--enable-shared|--enable-shared=yes) shared=yes ;;
+--disable-shared|--enable-shared=no) shared=no ;;
+--enable-static|--enable-static=yes) static=yes ;;
+--disable-static|--enable-static=no) static=no ;;
+--enable-optimize) optimize=yes ;;
+--enable-optimize=*) optimize=${arg#*=} ;;
+--disable-optimize) optimize=no ;;
+--enable-debug|--enable-debug=yes) debug=yes ;;
+--disable-debug|--enable-debug=no) debug=no ;;
+--enable-warnings|--enable-warnings=yes) warnings=yes ;;
+--disable-warnings|--enable-warnings=no) warnings=no ;;
+--enable-wrapper|--enable-wrapper=yes) wrapper=detect ;;
+--enable-wrapper=all) wrapper=yes ; gcc_wrapper=yes ; clang_wrapper=yes ;;
+--enable-wrapper=gcc) wrapper=yes ; gcc_wrapper=yes ;;
+--enable-wrapper=clang) wrapper=yes ; clang_wrapper=yes ;;
+--disable-wrapper|--enable-wrapper=no) wrapper=no ;;
+--enable-gcc-wrapper|--enable-gcc-wrapper=yes) wrapper=yes ; gcc_wrapper=yes ;;
+--disable-gcc-wrapper|--enable-gcc-wrapper=no) wrapper=no ;;
+--with-malloc=*) malloc_dir=${arg#*=} ;;
+--enable-*|--disable-*|--with-*|--without-*|--*dir=*) ;;
+--host=*|--target=*) target=${arg#*=} ;;
+--build=*) build=${arg#*=} ;;
+-* ) echo "$0: unknown option $arg" ;;
+AR=*) AR=${arg#*=} ;;
+RANLIB=*) RANLIB=${arg#*=} ;;
+CC=*) CC=${arg#*=} ;;
+CFLAGS=*) CFLAGS=${arg#*=} ;;
+CPPFLAGS=*) CPPFLAGS=${arg#*=} ;;
+LDFLAGS=*) LDFLAGS=${arg#*=} ;;
+CROSS_COMPILE=*) CROSS_COMPILE=${arg#*=} ;;
+LIBCC=*) LIBCC=${arg#*=} ;;
+*=*) ;;
+*) build=$arg ; target=$arg ;;
+esac
+done
+
+for i in srcdir prefix exec_prefix bindir libdir includedir syslibdir ; do
+stripdir $i
+done
+
+#
+# Get the source dir for out-of-tree builds
+#
+if test -z "$srcdir" ; then
+srcdir="${0%/configure}"
+stripdir srcdir
+fi
+abs_builddir="$(pwd)" || fail "$0: cannot determine working directory"
+abs_srcdir="$(cd $srcdir && pwd)" || fail "$0: invalid source directory $srcdir"
+test "$abs_srcdir" = "$abs_builddir" && srcdir=.
+test "$srcdir" != "." && test -f Makefile && test ! -h Makefile && fail "$0: Makefile already exists in the working directory"
+
+#
+# Get a temp filename we can use
+#
+i=0
+set -C
+while : ; do i=$(($i+1))
+tmpc="./conf$$-$PPID-$i.c"
+2>|/dev/null > "$tmpc" && break
+test "$i" -gt 50 && fail "$0: cannot create temporary file $tmpc"
+done
+set +C
+trap 'rm "$tmpc"' EXIT INT QUIT TERM HUP
+
+#
+# Check that the requested malloc implementation exists
+#
+test -d "$srcdir/src/malloc/$malloc_dir" \
+|| fail "$0: error: chosen malloc implementation '$malloc_dir' does not exist"
+
+#
+# Check whether we are cross-compiling, and set a default
+# CROSS_COMPILE prefix if none was provided.
+#
+test "$target" && \
+test "$target" != "$build" && \
+test -z "$CROSS_COMPILE" && \
+CROSS_COMPILE="$target-"
+
+#
+# Find a C compiler to use
+#
+printf "checking for C compiler... "
+trycc ${CROSS_COMPILE}gcc
+trycc ${CROSS_COMPILE}c99
+trycc ${CROSS_COMPILE}cc
+printf "%s\n" "$CC"
+test -n "$CC" || { echo "$0: cannot find a C compiler" ; exit 1 ; }
+
+printf "checking whether C compiler works... "
+echo "typedef int x;" > "$tmpc"
+if output=$($CC $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" 2>&1) ; then
+printf "yes\n"
+else
+printf "no; compiler output follows:\n%s\n" "$output"
+exit 1
+fi
+
+#
+# Figure out options to force errors on unknown flags.
+#
+tryflag CFLAGS_TRY -Werror=unknown-warning-option
+tryflag CFLAGS_TRY -Werror=unused-command-line-argument
+tryflag CFLAGS_TRY -Werror=ignored-optimization-argument
+tryldflag LDFLAGS_TRY -Werror=unknown-warning-option
+tryldflag LDFLAGS_TRY -Werror=unused-command-line-argument
+
+#
+# Need to know if the compiler is gcc or clang to decide which toolchain
+# wrappers to build.
+#
+printf "checking for C compiler family... "
+cc_ver="$(LC_ALL=C $CC -v 2>&1)"
+cc_family=unknown
+if fnmatch '*gcc\ version*' "$cc_ver" ; then
+cc_family=gcc
+elif fnmatch '*clang\ version*' "$cc_ver" ; then
+cc_family=clang
+fi
+echo "$cc_family"
+
+#
+# Figure out toolchain wrapper to build
+#
+if test "$wrapper" = auto || test "$wrapper" = detect ; then
+echo "#include <stdlib.h>" > "$tmpc"
+echo "#if ! __GLIBC__" >> "$tmpc"
+echo "#error no" >> "$tmpc"
+echo "#endif" >> "$tmpc"
+printf "checking for toolchain wrapper to build... "
+if test "$wrapper" = auto && ! $CC -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+echo "none"
+elif test "$cc_family" = gcc ; then
+gcc_wrapper=yes
+echo "gcc"
+elif test "$cc_family" = clang ; then
+clang_wrapper=yes
+echo "clang"
+else
+echo "none"
+if test "$wrapper" = detect ; then
+fail "$0: could not find an appropriate toolchain wrapper"
+fi
+fi
+fi
+
+if test "$gcc_wrapper" = yes ; then
+tools="$tools obj/musl-gcc"
+tool_libs="$tool_libs lib/musl-gcc.specs"
+fi
+if test "$clang_wrapper" = yes ; then
+tools="$tools obj/musl-clang obj/ld.musl-clang"
+fi
+
+#
+# Find the target architecture
+#
+printf "checking target system type... "
+test -n "$target" || target=$($CC -dumpmachine 2>/dev/null) || target=unknown
+printf "%s\n" "$target"
+
+#
+# Convert to just ARCH
+#
+case "$target" in
+# Catch these early to simplify matching for 32-bit archs
+arm*) ARCH=arm ;;
+aarch64*) ARCH=aarch64 ;;
+i?86-nt32*) ARCH=nt32 ;;
+i?86*) ARCH=i386 ;;
+x86_64-x32*|x32*|x86_64*x32) ARCH=x32 ;;
+x86_64-nt64*) ARCH=nt64 ;;
+x86_64*) ARCH=x86_64 ;;
+m68k*) ARCH=m68k ;;
+mips64*|mipsisa64*) ARCH=mips64 ;;
+mips*) ARCH=mips ;;
+microblaze*) ARCH=microblaze ;;
+or1k*) ARCH=or1k ;;
+powerpc64*|ppc64*) ARCH=powerpc64 ;;
+powerpc*|ppc*) ARCH=powerpc ;;
+riscv64*) ARCH=riscv64 ;;
+sh[1-9bel-]*|sh|superh*) ARCH=sh ;;
+s390x*) ARCH=s390x ;;
+wasm32) ARCH=wasm32 ;;
+wasm64) ARCH=wasm64 ;;
+unknown) fail "$0: unable to detect target arch; try $0 --target=..." ;;
+*) fail "$0: unknown or unsupported target \"$target\"" ;;
+esac
+
+#
+# Try to get a conforming C99 freestanding environment
+#
+tryflag CFLAGS_C99FSE -std=c99
+tryflag CFLAGS_C99FSE -nostdinc
+tryflag CFLAGS_C99FSE -ffreestanding \
+|| tryflag CFLAGS_C99FSE -fno-builtin
+tryflag CFLAGS_C99FSE -fexcess-precision=standard \
+|| { test "$ARCH" = i386 && tryflag CFLAGS_C99FSE -ffloat-store ; }
+tryflag CFLAGS_C99FSE -frounding-math
+
+#
+# We may use the may_alias attribute if __GNUC__ is defined, so
+# if the compiler defines __GNUC__ but does not provide it,
+# it must be defined away as part of the CFLAGS.
+#
+printf "checking whether compiler needs attribute((may_alias)) suppression... "
+cat > "$tmpc" <<EOF
+typedef int
+#ifdef __GNUC__
+__attribute__((__may_alias__))
+#endif
+x;
+EOF
+if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS \
+ -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+printf "no\n"
+else
+printf "yes\n"
+CFLAGS_C99FSE="$CFLAGS_C99FSE -D__may_alias__="
+fi
+
+#
+# The GNU toolchain defaults to assuming unmarked files need an
+# executable stack, potentially exposing vulnerabilities in programs
+# linked with such object files. Fix this.
+#
+tryflag CFLAGS_C99FSE -Wa,--noexecstack
+
+#
+# Check for options to disable stack protector, which needs to be
+# disabled for a few early-bootstrap translation units. If not found,
+# this is not an error; we assume the toolchain does not do ssp.
+#
+tryflag CFLAGS_NOSSP -fno-stack-protector
+
+#
+# Check for options that may be needed to prevent the compiler from
+# generating self-referential versions of memcpy,, memmove, memcmp,
+# and memset. Really, we should add a check to determine if this
+# option is sufficient, and if not, add a macro to cripple these
+# functions with volatile...
+#
+tryflag CFLAGS_MEMOPS -fno-tree-loop-distribute-patterns
+
+#
+# Enable debugging if requessted.
+#
+test "$debug" = yes && CFLAGS_AUTO=-g
+
+#
+# Preprocess asm files to add extra debugging information if debug is
+# enabled, our assembler supports the needed directives, and the
+# preprocessing script has been written for our architecture.
+#
+printf "checking whether we should preprocess assembly to add debugging information... "
+if fnmatch '-g*|*\ -g*' "$CFLAGS_AUTO $CFLAGS" &&
+ test -f "$srcdir/tools/add-cfi.$ARCH.awk" &&
+ printf ".file 1 \"srcfile.s\"\n.line 1\n.cfi_startproc\n.cfi_endproc" | $CC -g -x assembler -c -o /dev/null 2>/dev/null -
+then
+ ADD_CFI=yes
+else
+ ADD_CFI=no
+fi
+printf "%s\n" "$ADD_CFI"
+
+#
+# Possibly add a -O option to CFLAGS and select modules to optimize with
+# -O3 based on the status of --enable-optimize and provided CFLAGS.
+#
+printf "checking for optimization settings... "
+case "x$optimize" in
+xauto)
+if fnmatch '-O*|*\ -O*' "$CFLAGS_AUTO $CFLAGS" ; then
+printf "using provided CFLAGS\n" ;optimize=no
+else
+printf "using defaults\n" ; optimize=yes
+fi
+;;
+xsize|xnone) printf "minimize size\n" ; optimize=size ;;
+xno|x) printf "disabled\n" ; optimize=no ;;
+*) printf "custom\n" ;;
+esac
+
+test "$optimize" = no || tryflag CFLAGS_AUTO -Os || tryflag CFLAGS_AUTO -O2
+test "$optimize" = yes && optimize="internal,malloc,string"
+
+if fnmatch 'no|size' "$optimize" ; then :
+else
+printf "components to be optimized for speed:"
+while test "$optimize" ; do
+case "$optimize" in
+*,*) this=${optimize%%,*} optimize=${optimize#*,} ;;
+*) this=$optimize optimize=
+esac
+printf " $this"
+case "$this" in
+*/*.c) ;;
+*/*) this=$this*.c ;;
+*) this=$this/*.c ;;
+esac
+OPTIMIZE_GLOBS="$OPTIMIZE_GLOBS $this"
+done
+OPTIMIZE_GLOBS=${OPTIMIZE_GLOBS# }
+printf "\n"
+fi
+
+# Always try -pipe
+tryflag CFLAGS_AUTO -pipe
+
+#
+# If debugging is disabled, omit frame pointer. Modern GCC does this
+# anyway on most archs even when debugging is enabled since the frame
+# pointer is no longer needed for debugging.
+#
+if fnmatch '-g*|*\ -g*' "$CFLAGS_AUTO $CFLAGS" ; then :
+else
+tryflag CFLAGS_AUTO -fomit-frame-pointer
+fi
+
+#
+# Modern GCC wants to put DWARF tables (used for debugging and
+# unwinding) in the loaded part of the program where they are
+# unstrippable. These options force them back to debug sections (and
+# cause them not to get generated at all if debugging is off).
+#
+tryflag CFLAGS_AUTO -fno-unwind-tables
+tryflag CFLAGS_AUTO -fno-asynchronous-unwind-tables
+
+#
+# Attempt to put each function and each data object in its own
+# section. This both allows additional size optimizations at link
+# time and works around a dangerous class of compiler/assembler bugs
+# whereby relative address expressions are constant-folded by the
+# assembler even when one or more of the symbols involved is
+# replaceable. See gas pr 18561 and gcc pr 66609, 68178, etc.
+#
+tryflag CFLAGS_AUTO -ffunction-sections
+tryflag CFLAGS_AUTO -fdata-sections
+
+#
+# On x86, make sure we don't have incompatible instruction set
+# extensions enabled by default. This is bad for making static binaries.
+# We cheat and use i486 rather than i386 because i386 really does not
+# work anyway (issues with atomic ops).
+# Some build environments pass -march and -mtune options via CC, so
+# check both CC and CFLAGS.
+#
+if test "$ARCH" = "i386" ; then
+fnmatch '-march=*|*\ -march=*' "$CC $CFLAGS" || tryldflag CFLAGS_AUTO -march=i486
+fnmatch '-mtune=*|*\ -mtune=*' "$CC $CFLAGS" || tryldflag CFLAGS_AUTO -mtune=generic
+fi
+
+#
+# GCC defines -w as overriding any -W options, regardless of order, but
+# clang has a bunch of annoying warnings enabled by default and needs -w
+# to start from a clean slate. So use -w if building with clang. Also
+# turn off a common on-by-default cast warning regardless of compiler.
+#
+test "$cc_family" = clang && tryflag CFLAGS_AUTO -w
+
+tryflag CFLAGS_AUTO -Wno-pointer-to-int-cast
+
+#
+# Even with -std=c99, gcc accepts some constructs which are constraint
+# violations. We want to treat these as errors regardless of whether
+# other purely stylistic warnings are enabled -- especially implicit
+# function declarations, which are a dangerous programming error.
+#
+tryflag CFLAGS_AUTO -Werror=implicit-function-declaration
+tryflag CFLAGS_AUTO -Werror=implicit-int
+tryflag CFLAGS_AUTO -Werror=pointer-sign
+tryflag CFLAGS_AUTO -Werror=pointer-arith
+tryflag CFLAGS_AUTO -Werror=int-conversion
+tryflag CFLAGS_AUTO -Werror=incompatible-pointer-types
+tryflag CFLAGS_AUTO -Werror=discarded-qualifiers
+tryflag CFLAGS_AUTO -Werror=discarded-array-qualifiers
+
+#
+# GCC ignores unused arguements by default, but Clang needs this extra
+# parameter to stop printing warnings about LDFLAGS passed during
+# compiling stage and CFLAGS passed during linking stage.
+#
+test "$cc_family" = clang && tryflag CFLAGS_AUTO -Qunused-arguments
+
+if test "x$warnings" = xyes ; then
+tryflag CFLAGS_AUTO -Waddress
+tryflag CFLAGS_AUTO -Warray-bounds
+tryflag CFLAGS_AUTO -Wchar-subscripts
+tryflag CFLAGS_AUTO -Wduplicate-decl-specifier
+tryflag CFLAGS_AUTO -Winit-self
+tryflag CFLAGS_AUTO -Wreturn-type
+tryflag CFLAGS_AUTO -Wsequence-point
+tryflag CFLAGS_AUTO -Wstrict-aliasing
+tryflag CFLAGS_AUTO -Wunused-function
+tryflag CFLAGS_AUTO -Wunused-label
+tryflag CFLAGS_AUTO -Wunused-variable
+fi
+
+# Determine if the compiler produces position-independent code (PIC)
+# by default. If so, we don't need to compile separate object files
+# for libc.a and libc.so.
+if trycppif __PIC__ "$CFLAGS_C99FSE $CPPFLAGS $CFLAGS" ; then
+pic_default=yes
+else
+pic_default=no
+fi
+
+# Reduce space lost to padding for alignment purposes by sorting data
+# objects according to their alignment reqirements. This approximates
+# optimal packing.
+tryldflag LDFLAGS_AUTO -Wl,--sort-section,alignment
+tryldflag LDFLAGS_AUTO -Wl,--sort-common
+
+# When linking shared library, drop dummy weak definitions that were
+# replaced by strong definitions from other translation units.
+tryldflag LDFLAGS_AUTO -Wl,--gc-sections
+
+# Some patched GCC builds have these defaults messed up...
+tryldflag LDFLAGS_AUTO -Wl,--hash-style=both
+
+# Prevent linking if there are undefined symbols; if any exist,
+# libc.so will crash at runtime during relocation processing.
+# The common way this can happen is failure to link the compiler
+# runtime library; implementation error is also a possibility.
+tryldflag LDFLAGS_AUTO -Wl,--no-undefined
+
+# Avoid exporting symbols from compiler runtime libraries. They
+# should be hidden anyway, but some toolchains including old gcc
+# versions built without shared library support and pcc are broken.
+tryldflag LDFLAGS_AUTO -Wl,--exclude-libs=ALL
+
+# Public data symbols must be interposable to allow for copy
+# relocations, but otherwise we want to bind symbols at libc link
+# time to eliminate startup relocations and PLT overhead. Use
+# --dynamic-list rather than -Bsymbolic-functions for greater
+# control over what symbols are left unbound.
+tryldflag LDFLAGS_AUTO -Wl,--dynamic-list="$srcdir/dynamic.list"
+
+# Find compiler runtime library
+test -z "$LIBCC" && tryldflag LIBCC -lgcc && tryldflag LIBCC -lgcc_eh
+test -z "$LIBCC" && tryldflag LIBCC -lcompiler_rt
+test -z "$LIBCC" && try_libcc=`$CC -print-libgcc-file-name 2>/dev/null` \
+ && tryldflag LIBCC "$try_libcc"
+test -z "$LIBCC" && try_libcc=`$CC -print-file-name=libpcc.a 2>/dev/null` \
+ && tryldflag LIBCC "$try_libcc"
+printf "using compiler runtime libraries: %s\n" "$LIBCC"
+
+# Figure out arch variants for archs with variants
+SUBARCH=
+t="$CFLAGS_C99FSE $CPPFLAGS $CFLAGS"
+
+if test "$ARCH" = "i386" ; then
+printf "checking whether compiler can use ebx in PIC asm constraints... "
+cat > "$tmpc" <<EOF
+int foo(int x) { __asm__ ( "" : "+b"(x) ); return x; }
+EOF
+if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -fPIC \
+ -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+printf "yes\n"
+else
+printf "no\n"
+CFLAGS_AUTO="$CFLAGS_AUTO -DBROKEN_EBX_ASM"
+fi
+fi
+
+if test "$ARCH" = "x86_64" ; then
+trycppif __ILP32__ "$t" && ARCH=x32
+fi
+
+if test "$ARCH" = "arm" ; then
+if trycppif __thumb2__ "$t" ; then
+tryflag CFLAGS_AUTO -mimplicit-it=always
+tryflag CFLAGS_AUTO -Wa,-mimplicit-it=always
+tryflag CFLAGS_AUTO -Wa,-mthumb
+fi
+trycppif __ARMEB__ "$t" && SUBARCH=${SUBARCH}eb
+trycppif __ARM_PCS_VFP "$t" && SUBARCH=${SUBARCH}hf
+# Versions of clang up until at least 3.8 have the wrong constraint codes
+# for floating point operands to inline asm. Detect this so the affected
+# source files can just disable the asm.
+if test "$cc_family" = clang ; then
+printf "checking whether clang's vfp asm constraints work... "
+echo 'float f(float x) { __asm__("":"+t"(x)); return x; }' > "$tmpc"
+if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+printf "yes\n"
+else
+printf "no\n"
+CFLAGS_AUTO="$CFLAGS_AUTO -DBROKEN_VFP_ASM"
+CFLAGS_AUTO="${CFLAGS_AUTO# }"
+fi
+fi
+fi
+
+if test "$ARCH" = "aarch64" ; then
+trycppif __AARCH64EB__ "$t" && SUBARCH=${SUBARCH}_be
+fi
+
+if test "$ARCH" = "m68k" ; then
+if trycppif "__HAVE_68881__" ; then : ;
+elif trycppif "__mcffpu__" ; then SUBARCH="-fp64"
+else SUBARCH="-sf"
+fi
+fi
+
+if test "$ARCH" = "mips" ; then
+trycppif "__mips_isa_rev >= 6" "$t" && SUBARCH=${SUBARCH}r6
+trycppif "_MIPSEL || __MIPSEL || __MIPSEL__" "$t" && SUBARCH=${SUBARCH}el
+trycppif __mips_soft_float "$t" && SUBARCH=${SUBARCH}-sf
+fi
+
+if test "$ARCH" = "mips64" ; then
+trycppif "_MIPS_SIM != _ABI64" "$t" && ARCH=mipsn32
+trycppif "__mips_isa_rev >= 6" "$t" && SUBARCH=${SUBARCH}r6
+trycppif "_MIPSEL || __MIPSEL || __MIPSEL__" "$t" && SUBARCH=${SUBARCH}el
+trycppif __mips_soft_float "$t" && SUBARCH=${SUBARCH}-sf
+fi
+
+if test "$ARCH" = "powerpc" ; then
+trycppif "_SOFT_FLOAT || __NO_FPRS__" "$t" && SUBARCH=${SUBARCH}-sf
+printf "checking whether compiler can use 'd' constraint in asm... "
+echo 'double f(double x) { __asm__ ("fabs %0, %1" : "=d"(x) : "d"(x)); return x; }' > "$tmpc"
+if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+printf "yes\n"
+else
+printf "no\n"
+CFLAGS_AUTO="$CFLAGS_AUTO -DBROKEN_PPC_D_ASM"
+CFLAGS_AUTO="${CFLAGS_AUTO# }"
+fi
+fi
+
+test "$ARCH" = "microblaze" && trycppif __MICROBLAZEEL__ "$t" \
+&& SUBARCH=${SUBARCH}el
+
+if test "$ARCH" = "powerpc64" ; then
+trycppif "_CALL_ELF == 2" "$t" || fail "$0: error: unsupported powerpc64 ABI"
+trycppif __LITTLE_ENDIAN__ "$t" && SUBARCH=${SUBARCH}le
+trycppif _SOFT_FLOAT "$t" && fail "$0: error: soft-float not supported on powerpc64"
+fi
+
+if test "$ARCH" = "riscv64" ; then
+trycppif __riscv_float_abi_soft "$t" && SUBARCH=${SUBARCH}-sf
+trycppif __riscv_float_abi_single "$t" && SUBARCH=${SUBARCH}-sp
+fi
+
+if test "$ARCH" = "sh" ; then
+tryflag CFLAGS_AUTO -Wa,--isa=any
+trycppif __BIG_ENDIAN__ "$t" && SUBARCH=${SUBARCH}eb
+if trycppif "__SH_FPU_ANY__ || __SH4__" "$t" ; then
+# Some sh configurations are broken and replace double with float
+# rather than using softfloat when the fpu is present but only
+# supports single precision. Reject them.
+printf "checking whether compiler's double type is IEEE double... "
+echo 'typedef char dblcheck[(int)sizeof(double)-5];' > "$tmpc"
+if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+printf "yes\n"
+else
+printf "no\n"
+fail "$0: error: compiler's floating point configuration is unsupported"
+fi
+else
+SUBARCH=${SUBARCH}-nofpu
+fi
+if trycppif __SH_FDPIC__ "$t" ; then
+SUBARCH=${SUBARCH}-fdpic
+fi
+fi
+
+test "$SUBARCH" \
+&& printf "configured for %s variant: %s\n" "$ARCH" "$ARCH$SUBARCH"
+
+case "$ARCH$SUBARCH" in
+arm) ASMSUBARCH=el ;;
+*) ASMSUBARCH=$SUBARCH ;;
+esac
+
+#
+# Some archs (powerpc) have different possible long double formats
+# that the compiler can be configured for. The logic for whether this
+# is supported is in bits/float.h; in general, it is not. We need to
+# check for mismatches here or code in printf, strotd, and scanf will
+# be dangerously incorrect because it depends on (1) the macros being
+# correct, and (2) IEEE semantics.
+#
+printf "checking whether compiler's long double definition matches float.h... "
+echo '#include <float.h>' > "$tmpc"
+echo '#define C(m,s) (m==LDBL_MANT_DIG && s==sizeof(long double))' >> "$tmpc"
+echo 'typedef char ldcheck[(C(53,8)||C(64,12)||C(64,16)||C(113,16))*2-1];' >> "$tmpc"
+if $CC $CFLAGS_C99FSE \
+ -I$srcdir/arch/$ARCH -I$srcdir/arch/generic -I$srcdir/include \
+ $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+printf "yes\n"
+else
+printf "no\n"
+fail "$0: error: unsupported long double type"
+fi
+
+#
+# Some build systems globally pass in broken CFLAGS like -ffast-math
+# for all packages. On recent GCC we can detect this and error out
+# early rather than producing a seriously-broken math library.
+#
+if trycppif "__FAST_MATH__" \
+ "$CFLAGS_C99FSE $CPPFLAGS $CFLAGS" ; then
+fail "$0: error: compiler has broken floating point; check CFLAGS"
+fi
+
+printf "creating config.mak... "
+
+cmdline=$(quote "$0")
+for i ; do cmdline="$cmdline $(quote "$i")" ; done
+
+exec 3>&1 1>config.mak
+
+
+cat << EOF
+# This version of config.mak was generated by:
+# $cmdline
+# Any changes made here will be lost if configure is re-run
+AR = ${AR:-\$(CROSS_COMPILE)ar}
+RANLIB = ${RANLIB:-\$(CROSS_COMPILE)ranlib}
+ARCH = $ARCH
+SUBARCH = $SUBARCH
+ASMSUBARCH = $ASMSUBARCH
+srcdir = $srcdir
+prefix = $prefix
+exec_prefix = $exec_prefix
+bindir = $bindir
+libdir = $libdir
+includedir = $includedir
+syslibdir = $syslibdir
+CC = $CC
+CFLAGS = $CFLAGS
+CFLAGS_AUTO = $CFLAGS_AUTO
+CFLAGS_C99FSE = $CFLAGS_C99FSE
+CFLAGS_MEMOPS = $CFLAGS_MEMOPS
+CFLAGS_NOSSP = $CFLAGS_NOSSP
+CPPFLAGS = $CPPFLAGS
+LDFLAGS = $LDFLAGS
+LDFLAGS_AUTO = $LDFLAGS_AUTO
+CROSS_COMPILE = $CROSS_COMPILE
+LIBCC = $LIBCC
+OPTIMIZE_GLOBS = $OPTIMIZE_GLOBS
+ALL_TOOLS = $tools
+TOOL_LIBS = $tool_libs
+ADD_CFI = $ADD_CFI
+MALLOC_DIR = $malloc_dir
+EOF
+test "x$static" = xno && echo "STATIC_LIBS ="
+test "x$shared" = xno && echo "SHARED_LIBS ="
+test "x$cc_family" = xgcc && echo 'WRAPCC_GCC = $(CC)'
+test "x$cc_family" = xclang && echo 'WRAPCC_CLANG = $(CC)'
+test "x$pic_default" = xyes && echo 'AOBJS = $(LOBJS)'
+exec 1>&3 3>&-
+
+test "$srcdir" = "." || ln -sf $srcdir/Makefile .
+
+printf "done\n"
diff --git a/libc-top-half/musl/crt/Scrt1.c b/libc-top-half/musl/crt/Scrt1.c
new file mode 100644
index 0000000..822f10b
--- /dev/null
+++ b/libc-top-half/musl/crt/Scrt1.c
@@ -0,0 +1 @@
+#include "crt1.c"
diff --git a/libc-top-half/musl/crt/aarch64/crti.s b/libc-top-half/musl/crt/aarch64/crti.s
new file mode 100644
index 0000000..775df0a
--- /dev/null
+++ b/libc-top-half/musl/crt/aarch64/crti.s
@@ -0,0 +1,13 @@
+.section .init
+.global _init
+.type _init,%function
+_init:
+ stp x29,x30,[sp,-16]!
+ mov x29,sp
+
+.section .fini
+.global _fini
+.type _fini,%function
+_fini:
+ stp x29,x30,[sp,-16]!
+ mov x29,sp
diff --git a/libc-top-half/musl/crt/aarch64/crtn.s b/libc-top-half/musl/crt/aarch64/crtn.s
new file mode 100644
index 0000000..73cab69
--- /dev/null
+++ b/libc-top-half/musl/crt/aarch64/crtn.s
@@ -0,0 +1,7 @@
+.section .init
+ ldp x29,x30,[sp],#16
+ ret
+
+.section .fini
+ ldp x29,x30,[sp],#16
+ ret
diff --git a/libc-top-half/musl/crt/arm/crti.s b/libc-top-half/musl/crt/arm/crti.s
new file mode 100644
index 0000000..18dc1e4
--- /dev/null
+++ b/libc-top-half/musl/crt/arm/crti.s
@@ -0,0 +1,13 @@
+.syntax unified
+
+.section .init
+.global _init
+.type _init,%function
+_init:
+ push {r0,lr}
+
+.section .fini
+.global _fini
+.type _fini,%function
+_fini:
+ push {r0,lr}
diff --git a/libc-top-half/musl/crt/arm/crtn.s b/libc-top-half/musl/crt/arm/crtn.s
new file mode 100644
index 0000000..dc020f9
--- /dev/null
+++ b/libc-top-half/musl/crt/arm/crtn.s
@@ -0,0 +1,9 @@
+.syntax unified
+
+.section .init
+ pop {r0,lr}
+ bx lr
+
+.section .fini
+ pop {r0,lr}
+ bx lr
diff --git a/libc-top-half/musl/crt/crt1.c b/libc-top-half/musl/crt/crt1.c
new file mode 100644
index 0000000..8fe8ab5
--- /dev/null
+++ b/libc-top-half/musl/crt/crt1.c
@@ -0,0 +1,19 @@
+#include <features.h>
+#include "libc.h"
+
+#define START "_start"
+
+#include "crt_arch.h"
+
+int main();
+weak void _init();
+weak void _fini();
+int __libc_start_main(int (*)(), int, char **,
+ void (*)(), void(*)(), void(*)());
+
+void _start_c(long *p)
+{
+ int argc = p[0];
+ char **argv = (void *)(p+1);
+ __libc_start_main(main, argc, argv, _init, _fini, 0);
+}
diff --git a/libc-top-half/musl/crt/crti.c b/libc-top-half/musl/crt/crti.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/crt/crti.c
diff --git a/libc-top-half/musl/crt/crtn.c b/libc-top-half/musl/crt/crtn.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/crt/crtn.c
diff --git a/libc-top-half/musl/crt/i386/crti.s b/libc-top-half/musl/crt/i386/crti.s
new file mode 100644
index 0000000..d2682a2
--- /dev/null
+++ b/libc-top-half/musl/crt/i386/crti.s
@@ -0,0 +1,9 @@
+.section .init
+.global _init
+_init:
+ sub $12,%esp
+
+.section .fini
+.global _fini
+_fini:
+ sub $12,%esp
diff --git a/libc-top-half/musl/crt/i386/crtn.s b/libc-top-half/musl/crt/i386/crtn.s
new file mode 100644
index 0000000..f3b61e0
--- /dev/null
+++ b/libc-top-half/musl/crt/i386/crtn.s
@@ -0,0 +1,7 @@
+.section .init
+ add $12,%esp
+ ret
+
+.section .fini
+ add $12,%esp
+ ret
diff --git a/libc-top-half/musl/crt/microblaze/crti.s b/libc-top-half/musl/crt/microblaze/crti.s
new file mode 100644
index 0000000..ed1c2fa
--- /dev/null
+++ b/libc-top-half/musl/crt/microblaze/crti.s
@@ -0,0 +1,13 @@
+.section .init
+.global _init
+.align 2
+_init:
+ addi r1, r1, -32
+ swi r15, r1, 0
+
+.section .fini
+.global _fini
+.align 2
+_fini:
+ addi r1, r1, -32
+ swi r15, r1, 0
diff --git a/libc-top-half/musl/crt/microblaze/crtn.s b/libc-top-half/musl/crt/microblaze/crtn.s
new file mode 100644
index 0000000..1e02c98
--- /dev/null
+++ b/libc-top-half/musl/crt/microblaze/crtn.s
@@ -0,0 +1,9 @@
+.section .init
+ lwi r15, r1, 0
+ rtsd r15, 8
+ addi r1, r1, 32
+
+.section .fini
+ lwi r15, r1, 0
+ rtsd r15, 8
+ addi r1, r1, 32
diff --git a/libc-top-half/musl/crt/mips/crti.s b/libc-top-half/musl/crt/mips/crti.s
new file mode 100644
index 0000000..39dee38
--- /dev/null
+++ b/libc-top-half/musl/crt/mips/crti.s
@@ -0,0 +1,19 @@
+.set noreorder
+
+.section .init
+.global _init
+.type _init,@function
+.align 2
+_init:
+ subu $sp,$sp,32
+ sw $gp,24($sp)
+ sw $ra,28($sp)
+
+.section .fini
+.global _fini
+.type _fini,@function
+.align 2
+_fini:
+ subu $sp,$sp,32
+ sw $gp,24($sp)
+ sw $ra,28($sp)
diff --git a/libc-top-half/musl/crt/mips/crtn.s b/libc-top-half/musl/crt/mips/crtn.s
new file mode 100644
index 0000000..506a04b
--- /dev/null
+++ b/libc-top-half/musl/crt/mips/crtn.s
@@ -0,0 +1,13 @@
+.set noreorder
+
+.section .init
+ lw $gp,24($sp)
+ lw $ra,28($sp)
+ j $ra
+ addu $sp,$sp,32
+
+.section .fini
+ lw $gp,24($sp)
+ lw $ra,28($sp)
+ j $ra
+ addu $sp,$sp,32
diff --git a/libc-top-half/musl/crt/mips64/crti.s b/libc-top-half/musl/crt/mips64/crti.s
new file mode 100644
index 0000000..c962dd0
--- /dev/null
+++ b/libc-top-half/musl/crt/mips64/crti.s
@@ -0,0 +1,17 @@
+.set noreorder
+
+.section .init
+.global _init
+.align 3
+_init:
+ dsubu $sp, $sp, 32
+ sd $gp, 16($sp)
+ sd $ra, 24($sp)
+
+.section .fini
+.global _fini
+.align 3
+_fini:
+ dsubu $sp, $sp, 32
+ sd $gp, 16($sp)
+ sd $ra, 24($sp)
diff --git a/libc-top-half/musl/crt/mips64/crtn.s b/libc-top-half/musl/crt/mips64/crtn.s
new file mode 100644
index 0000000..f3930b2
--- /dev/null
+++ b/libc-top-half/musl/crt/mips64/crtn.s
@@ -0,0 +1,13 @@
+.set noreorder
+
+.section .init
+ ld $gp,16($sp)
+ ld $ra,24($sp)
+ j $ra
+ daddu $sp,$sp,32
+
+.section .fini
+ ld $gp,16($sp)
+ ld $ra,24($sp)
+ j $ra
+ daddu $sp,$sp,32
diff --git a/libc-top-half/musl/crt/mipsn32/crti.s b/libc-top-half/musl/crt/mipsn32/crti.s
new file mode 100644
index 0000000..14fa28d
--- /dev/null
+++ b/libc-top-half/musl/crt/mipsn32/crti.s
@@ -0,0 +1,18 @@
+.set noreorder
+.section .init
+.global _init
+.type _init,@function
+.align 2
+_init:
+ subu $sp, $sp, 32
+ sd $gp, 16($sp)
+ sd $ra, 24($sp)
+
+.section .fini
+.global _fini
+.type _fini,@function
+.align 2
+_fini:
+ subu $sp, $sp, 32
+ sd $gp, 16($sp)
+ sd $ra, 24($sp)
diff --git a/libc-top-half/musl/crt/mipsn32/crtn.s b/libc-top-half/musl/crt/mipsn32/crtn.s
new file mode 100644
index 0000000..dccd7e8
--- /dev/null
+++ b/libc-top-half/musl/crt/mipsn32/crtn.s
@@ -0,0 +1,12 @@
+.set noreorder
+.section .init
+ ld $gp, 16($sp)
+ ld $ra, 24($sp)
+ j $ra
+ addu $sp, $sp, 32
+
+.section .fini
+ ld $gp, 16($sp)
+ ld $ra, 24($sp)
+ j $ra
+ addu $sp, $sp, 32
diff --git a/libc-top-half/musl/crt/or1k/crti.s b/libc-top-half/musl/crt/or1k/crti.s
new file mode 100644
index 0000000..7e74145
--- /dev/null
+++ b/libc-top-half/musl/crt/or1k/crti.s
@@ -0,0 +1,11 @@
+.section .init
+.global _init
+_init:
+ l.addi r1,r1,-4
+ l.sw 0(r1),r9
+
+.section .fini
+.global _fini
+_fini:
+ l.addi r1,r1,-4
+ l.sw 0(r1),r9
diff --git a/libc-top-half/musl/crt/or1k/crtn.s b/libc-top-half/musl/crt/or1k/crtn.s
new file mode 100644
index 0000000..4185a02
--- /dev/null
+++ b/libc-top-half/musl/crt/or1k/crtn.s
@@ -0,0 +1,9 @@
+.section .init
+ l.lwz r9,0(r1)
+ l.jr r9
+ l.addi r1,r1,4
+
+.section .fini
+ l.lwz r9,0(r1)
+ l.jr r9
+ l.addi r1,r1,4
diff --git a/libc-top-half/musl/crt/powerpc/crti.s b/libc-top-half/musl/crt/powerpc/crti.s
new file mode 100644
index 0000000..60461ca
--- /dev/null
+++ b/libc-top-half/musl/crt/powerpc/crti.s
@@ -0,0 +1,15 @@
+.section .init
+.align 2
+.global _init
+_init:
+ stwu 1,-32(1)
+ mflr 0
+ stw 0,36(1)
+
+.section .fini
+.align 2
+.global _fini
+_fini:
+ stwu 1,-32(1)
+ mflr 0
+ stw 0,36(1)
diff --git a/libc-top-half/musl/crt/powerpc/crtn.s b/libc-top-half/musl/crt/powerpc/crtn.s
new file mode 100644
index 0000000..2d14a6f
--- /dev/null
+++ b/libc-top-half/musl/crt/powerpc/crtn.s
@@ -0,0 +1,13 @@
+.section .init
+.align 2
+ lwz 0,36(1)
+ addi 1,1,32
+ mtlr 0
+ blr
+
+.section .fini
+.align 2
+ lwz 0,36(1)
+ addi 1,1,32
+ mtlr 0
+ blr
diff --git a/libc-top-half/musl/crt/powerpc64/crti.s b/libc-top-half/musl/crt/powerpc64/crti.s
new file mode 100644
index 0000000..9f712f0
--- /dev/null
+++ b/libc-top-half/musl/crt/powerpc64/crti.s
@@ -0,0 +1,21 @@
+.section .init
+.align 2
+.global _init
+_init:
+ addis 2, 12, .TOC.-_init@ha
+ addi 2, 2, .TOC.-_init@l
+ .localentry _init,.-_init
+ mflr 0
+ std 0, 16(1)
+ stdu 1,-32(1)
+
+.section .fini
+.align 2
+.global _fini
+_fini:
+ addis 2, 12, .TOC.-_fini@ha
+ addi 2, 2, .TOC.-_fini@l
+ .localentry _fini,.-_fini
+ mflr 0
+ std 0, 16(1)
+ stdu 1,-32(1)
diff --git a/libc-top-half/musl/crt/powerpc64/crtn.s b/libc-top-half/musl/crt/powerpc64/crtn.s
new file mode 100644
index 0000000..a7a9f4a
--- /dev/null
+++ b/libc-top-half/musl/crt/powerpc64/crtn.s
@@ -0,0 +1,13 @@
+.section .init
+.align 2
+ addi 1, 1, 32
+ ld 0, 16(1)
+ mtlr 0
+ blr
+
+.section .fini
+.align 2
+ addi 1, 1, 32
+ ld 0, 16(1)
+ mtlr 0
+ blr
diff --git a/libc-top-half/musl/crt/rcrt1.c b/libc-top-half/musl/crt/rcrt1.c
new file mode 100644
index 0000000..901dff6
--- /dev/null
+++ b/libc-top-half/musl/crt/rcrt1.c
@@ -0,0 +1,14 @@
+#define START "_start"
+#define _dlstart_c _start_c
+#include "../ldso/dlstart.c"
+
+int main();
+weak void _init();
+weak void _fini();
+int __libc_start_main(int (*)(), int, char **,
+ void (*)(), void(*)(), void(*)());
+
+hidden void __dls2(unsigned char *base, size_t *sp)
+{
+ __libc_start_main(main, *sp, (void *)(sp+1), _init, _fini, 0);
+}
diff --git a/libc-top-half/musl/crt/s390x/crti.s b/libc-top-half/musl/crt/s390x/crti.s
new file mode 100644
index 0000000..f453205
--- /dev/null
+++ b/libc-top-half/musl/crt/s390x/crti.s
@@ -0,0 +1,17 @@
+.section .init
+.align 2
+.global _init
+_init:
+ stmg %r14, %r15, 112(%r15)
+ lgr %r0, %r15
+ aghi %r15, -160
+ stg %r0, 0(%r15)
+
+.section .fini
+.align 2
+.global _fini
+_fini:
+ stmg %r14, %r15, 112(%r15)
+ lgr %r0, %r15
+ aghi %r15, -160
+ stg %r0, 0(%r15)
diff --git a/libc-top-half/musl/crt/s390x/crtn.s b/libc-top-half/musl/crt/s390x/crtn.s
new file mode 100644
index 0000000..06066dc
--- /dev/null
+++ b/libc-top-half/musl/crt/s390x/crtn.s
@@ -0,0 +1,9 @@
+.section .init
+.align 2
+ lmg %r14, %r15, 272(%r15)
+ br %r14
+
+.section .fini
+.align 2
+ lmg %r14, %r15, 272(%r15)
+ br %r14
diff --git a/libc-top-half/musl/crt/sh/crti.s b/libc-top-half/musl/crt/sh/crti.s
new file mode 100644
index 0000000..d99bfd5
--- /dev/null
+++ b/libc-top-half/musl/crt/sh/crti.s
@@ -0,0 +1,21 @@
+.section .init
+.global _init
+.type _init, @function
+_init:
+ add #-4, r15
+ mov.l r12, @-r15
+ mov.l r14, @-r15
+ sts.l pr, @-r15
+ mov r15, r14
+ nop
+
+.section .fini
+.global _fini
+.type _fini, @function
+_fini:
+ add #-4, r15
+ mov.l r12, @-r15
+ mov.l r14, @-r15
+ sts.l pr, @-r15
+ mov r15, r14
+ nop
diff --git a/libc-top-half/musl/crt/sh/crtn.s b/libc-top-half/musl/crt/sh/crtn.s
new file mode 100644
index 0000000..958ce95
--- /dev/null
+++ b/libc-top-half/musl/crt/sh/crtn.s
@@ -0,0 +1,13 @@
+.section .init
+ lds.l @r15+, pr
+ mov.l @r15+, r14
+ mov.l @r15+, r12
+ rts
+ add #4, r15
+
+.section .fini
+ lds.l @r15+, pr
+ mov.l @r15+, r14
+ mov.l @r15+, r12
+ rts
+ add #4, r15
diff --git a/libc-top-half/musl/crt/x32/crti.s b/libc-top-half/musl/crt/x32/crti.s
new file mode 100644
index 0000000..4788968
--- /dev/null
+++ b/libc-top-half/musl/crt/x32/crti.s
@@ -0,0 +1,9 @@
+.section .init
+.global _init
+_init:
+ push %rax
+
+.section .fini
+.global _fini
+_fini:
+ push %rax
diff --git a/libc-top-half/musl/crt/x32/crtn.s b/libc-top-half/musl/crt/x32/crtn.s
new file mode 100644
index 0000000..29198b7
--- /dev/null
+++ b/libc-top-half/musl/crt/x32/crtn.s
@@ -0,0 +1,7 @@
+.section .init
+ pop %rax
+ ret
+
+.section .fini
+ pop %rax
+ ret
diff --git a/libc-top-half/musl/crt/x86_64/crti.s b/libc-top-half/musl/crt/x86_64/crti.s
new file mode 100644
index 0000000..4788968
--- /dev/null
+++ b/libc-top-half/musl/crt/x86_64/crti.s
@@ -0,0 +1,9 @@
+.section .init
+.global _init
+_init:
+ push %rax
+
+.section .fini
+.global _fini
+_fini:
+ push %rax
diff --git a/libc-top-half/musl/crt/x86_64/crtn.s b/libc-top-half/musl/crt/x86_64/crtn.s
new file mode 100644
index 0000000..29198b7
--- /dev/null
+++ b/libc-top-half/musl/crt/x86_64/crtn.s
@@ -0,0 +1,7 @@
+.section .init
+ pop %rax
+ ret
+
+.section .fini
+ pop %rax
+ ret
diff --git a/libc-top-half/musl/dist/config.mak b/libc-top-half/musl/dist/config.mak
new file mode 100644
index 0000000..1fc4369
--- /dev/null
+++ b/libc-top-half/musl/dist/config.mak
@@ -0,0 +1,36 @@
+#
+# musl config.mak template (original in dist/config.mak)
+#
+
+# Target CPU architecture. Supported values: i386, x86_64
+ARCH = i386
+
+# Installation prefix. DO NOT use /, /usr, or /usr/local !
+prefix = /usr/local/musl
+
+# Installation prefix for musl-gcc compiler wrapper.
+exec_prefix = /usr/local
+
+# Location for the dynamic linker ld-musl-$(ARCH).so.1
+syslibdir = /lib
+
+# Uncomment if you want to build i386 musl on a 64-bit host
+#CFLAGS += -m32
+
+# Uncomment to fix broken distro-patched toolchains where hash-style=gnu(only)
+#LDFLAGS += -Wl,--hash-style,both
+
+# Uncomment to fix broken distro-patched toolchains where stack-protector=on
+#CFLAGS += -fno-stack-protector
+
+# Uncomment for smaller code size.
+#CFLAGS += -fomit-frame-pointer -mno-accumulate-outgoing-args
+
+# Uncomment to omit massive GCC4 DWARF2 bloat (only useful for debugging)
+#CFLAGS += -fno-asynchronous-unwind-tables
+
+# Uncomment for warnings (as errors). Might need tuning to your gcc version.
+#CFLAGS += -Werror -Wall -Wpointer-arith -Wcast-align -Wno-parentheses -Wno-char-subscripts -Wno-uninitialized -Wno-sequence-point -Wno-missing-braces -Wno-unused-value -Wno-overflow -Wno-int-to-pointer-cast
+
+# Uncomment if you want to disable building the shared library.
+#SHARED_LIBS =
diff --git a/libc-top-half/musl/dynamic.list b/libc-top-half/musl/dynamic.list
new file mode 100644
index 0000000..ee0d363
--- /dev/null
+++ b/libc-top-half/musl/dynamic.list
@@ -0,0 +1,45 @@
+{
+environ;
+__environ;
+
+stdin;
+stdout;
+stderr;
+
+malloc;
+calloc;
+realloc;
+free;
+memalign;
+posix_memalign;
+aligned_alloc;
+malloc_usable_size;
+
+timezone;
+daylight;
+tzname;
+__timezone;
+__daylight;
+__tzname;
+
+signgam;
+__signgam;
+
+optarg;
+optind;
+opterr;
+optopt;
+optreset;
+__optreset;
+
+getdate_err;
+
+h_errno;
+
+program_invocation_name;
+program_invocation_short_name;
+__progname;
+__progname_full;
+
+__stack_chk_guard;
+};
diff --git a/libc-top-half/musl/include/aio.h b/libc-top-half/musl/include/aio.h
new file mode 100644
index 0000000..453c41b
--- /dev/null
+++ b/libc-top-half/musl/include/aio.h
@@ -0,0 +1,73 @@
+#ifndef _AIO_H
+#define _AIO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+#include <signal.h>
+#include <time.h>
+
+#define __NEED_ssize_t
+#define __NEED_off_t
+
+#include <bits/alltypes.h>
+
+struct aiocb {
+ int aio_fildes, aio_lio_opcode, aio_reqprio;
+ volatile void *aio_buf;
+ size_t aio_nbytes;
+ struct sigevent aio_sigevent;
+ void *__td;
+ int __lock[2];
+ volatile int __err;
+ ssize_t __ret;
+ off_t aio_offset;
+ void *__next, *__prev;
+ char __dummy4[32-2*sizeof(void *)];
+};
+
+#define AIO_CANCELED 0
+#define AIO_NOTCANCELED 1
+#define AIO_ALLDONE 2
+
+#define LIO_READ 0
+#define LIO_WRITE 1
+#define LIO_NOP 2
+
+#define LIO_WAIT 0
+#define LIO_NOWAIT 1
+
+int aio_read(struct aiocb *);
+int aio_write(struct aiocb *);
+int aio_error(const struct aiocb *);
+ssize_t aio_return(struct aiocb *);
+int aio_cancel(int, struct aiocb *);
+int aio_suspend(const struct aiocb *const [], int, const struct timespec *);
+int aio_fsync(int, struct aiocb *);
+
+int lio_listio(int, struct aiocb *__restrict const *__restrict, int, struct sigevent *__restrict);
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#define aiocb64 aiocb
+#define aio_read64 aio_read
+#define aio_write64 aio_write
+#define aio_error64 aio_error
+#define aio_return64 aio_return
+#define aio_cancel64 aio_cancel
+#define aio_suspend64 aio_suspend
+#define aio_fsync64 aio_fsync
+#define lio_listio64 lio_listio
+#define off64_t off_t
+#endif
+
+#if _REDIR_TIME64
+__REDIR(aio_suspend, __aio_suspend_time64);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/alloca.h b/libc-top-half/musl/include/alloca.h
new file mode 100644
index 0000000..b8d183d
--- /dev/null
+++ b/libc-top-half/musl/include/alloca.h
@@ -0,0 +1,19 @@
+#ifndef _ALLOCA_H
+#define _ALLOCA_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __NEED_size_t
+#include <bits/alltypes.h>
+
+void *alloca(size_t);
+
+#define alloca __builtin_alloca
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/alltypes.h.in b/libc-top-half/musl/include/alltypes.h.in
new file mode 100644
index 0000000..dcd474f
--- /dev/null
+++ b/libc-top-half/musl/include/alltypes.h.in
@@ -0,0 +1,118 @@
+#define __LITTLE_ENDIAN 1234
+#define __BIG_ENDIAN 4321
+#define __USE_TIME_BITS64 1
+
+TYPEDEF unsigned _Addr size_t;
+TYPEDEF unsigned _Addr uintptr_t;
+TYPEDEF _Addr ptrdiff_t;
+TYPEDEF _Addr ssize_t;
+TYPEDEF _Addr intptr_t;
+TYPEDEF _Addr regoff_t;
+TYPEDEF _Reg register_t;
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+TYPEDEF _Int64 time_t;
+TYPEDEF _Int64 suseconds_t;
+#else
+#if defined(__NEED_time_t) && !defined(__DEFINED_time_t)
+#include <__typedef_time_t.h>
+#define __DEFINED_time_t
+#endif
+
+#if defined(__NEED_suseconds_t) && !defined(__DEFINED_suseconds_t)
+#include <__typedef_suseconds_t.h>
+#define __DEFINED_suseconds_t
+#endif
+#endif
+
+TYPEDEF signed char int8_t;
+TYPEDEF signed short int16_t;
+TYPEDEF signed int int32_t;
+TYPEDEF signed _Int64 int64_t;
+TYPEDEF signed _Int64 intmax_t;
+TYPEDEF unsigned char uint8_t;
+TYPEDEF unsigned short uint16_t;
+TYPEDEF unsigned int uint32_t;
+TYPEDEF unsigned _Int64 uint64_t;
+TYPEDEF unsigned _Int64 u_int64_t;
+TYPEDEF unsigned _Int64 uintmax_t;
+
+TYPEDEF unsigned mode_t;
+TYPEDEF unsigned _Reg nlink_t;
+TYPEDEF _Int64 off_t;
+TYPEDEF unsigned _Int64 ino_t;
+TYPEDEF unsigned _Int64 dev_t;
+TYPEDEF long blksize_t;
+TYPEDEF _Int64 blkcnt_t;
+TYPEDEF unsigned _Int64 fsblkcnt_t;
+TYPEDEF unsigned _Int64 fsfilcnt_t;
+
+TYPEDEF unsigned wint_t;
+TYPEDEF unsigned long wctype_t;
+
+TYPEDEF void * timer_t;
+TYPEDEF int clockid_t;
+TYPEDEF long clock_t;
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+STRUCT timeval { time_t tv_sec; suseconds_t tv_usec; };
+STRUCT timespec { time_t tv_sec; int :8*(sizeof(time_t)-sizeof(long))*(__BYTE_ORDER==4321); long tv_nsec; int :8*(sizeof(time_t)-sizeof(long))*(__BYTE_ORDER!=4321); };
+#else
+#include <__struct_timeval.h>
+#include <__struct_timespec.h>
+#endif
+
+TYPEDEF int pid_t;
+TYPEDEF unsigned id_t;
+TYPEDEF unsigned uid_t;
+TYPEDEF unsigned gid_t;
+TYPEDEF int key_t;
+TYPEDEF unsigned useconds_t;
+
+#ifdef __cplusplus
+TYPEDEF unsigned long pthread_t;
+#else
+TYPEDEF struct __pthread * pthread_t;
+#endif
+TYPEDEF int pthread_once_t;
+TYPEDEF unsigned pthread_key_t;
+TYPEDEF int pthread_spinlock_t;
+TYPEDEF struct { unsigned __attr; } pthread_mutexattr_t;
+TYPEDEF struct { unsigned __attr; } pthread_condattr_t;
+TYPEDEF struct { unsigned __attr; } pthread_barrierattr_t;
+TYPEDEF struct { unsigned __attr[2]; } pthread_rwlockattr_t;
+
+#ifdef __wasilibc_unmodified_upstream /* WASI doesn't need to define FILE as a complete type */
+STRUCT _IO_FILE { char __x; };
+#endif
+TYPEDEF struct _IO_FILE FILE;
+
+TYPEDEF __builtin_va_list va_list;
+TYPEDEF __builtin_va_list __isoc_va_list;
+
+TYPEDEF struct __mbstate_t { unsigned __opaque1, __opaque2; } mbstate_t;
+
+TYPEDEF struct __locale_struct * locale_t;
+
+TYPEDEF struct __sigset_t { unsigned long __bits[128/sizeof(long)]; } sigset_t;
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+STRUCT iovec { void *iov_base; size_t iov_len; };
+#else
+#include <__struct_iovec.h>
+#endif
+
+STRUCT winsize { unsigned short ws_row, ws_col, ws_xpixel, ws_ypixel; };
+
+TYPEDEF unsigned socklen_t;
+TYPEDEF unsigned short sa_family_t;
+
+TYPEDEF struct { union { int __i[sizeof(long)==8?14:9]; volatile int __vi[sizeof(long)==8?14:9]; unsigned long __s[sizeof(long)==8?7:9]; } __u; } pthread_attr_t;
+TYPEDEF struct { union { int __i[sizeof(long)==8?10:6]; volatile int __vi[sizeof(long)==8?10:6]; volatile void *volatile __p[sizeof(long)==8?5:6]; } __u; } pthread_mutex_t;
+TYPEDEF struct { union { int __i[sizeof(long)==8?10:6]; volatile int __vi[sizeof(long)==8?10:6]; volatile void *volatile __p[sizeof(long)==8?5:6]; } __u; } mtx_t;
+TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; void *__p[12*sizeof(int)/sizeof(void*)]; } __u; } pthread_cond_t;
+TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; void *__p[12*sizeof(int)/sizeof(void*)]; } __u; } cnd_t;
+TYPEDEF struct { union { int __i[sizeof(long)==8?14:8]; volatile int __vi[sizeof(long)==8?14:8]; void *__p[sizeof(long)==8?7:8]; } __u; } pthread_rwlock_t;
+TYPEDEF struct { union { int __i[sizeof(long)==8?8:5]; volatile int __vi[sizeof(long)==8?8:5]; void *__p[sizeof(long)==8?4:5]; } __u; } pthread_barrier_t;
+
+#undef _Addr
+#undef _Int64
+#undef _Reg
diff --git a/libc-top-half/musl/include/ar.h b/libc-top-half/musl/include/ar.h
new file mode 100644
index 0000000..eafd51d
--- /dev/null
+++ b/libc-top-half/musl/include/ar.h
@@ -0,0 +1,25 @@
+#ifndef _AR_H
+#define _AR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ARMAG "!<arch>\n"
+#define SARMAG 8
+#define ARFMAG "`\n"
+
+struct ar_hdr {
+ char ar_name[16];
+ char ar_date[12];
+ char ar_uid[6], ar_gid[6];
+ char ar_mode[8];
+ char ar_size[10];
+ char ar_fmag[2];
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/arpa/ftp.h b/libc-top-half/musl/include/arpa/ftp.h
new file mode 100644
index 0000000..fb0a46f
--- /dev/null
+++ b/libc-top-half/musl/include/arpa/ftp.h
@@ -0,0 +1,35 @@
+#ifndef _ARPA_FTP_H
+#define _ARPA_FTP_H
+#define PRELIM 1
+#define COMPLETE 2
+#define CONTINUE 3
+#define TRANSIENT 4
+#define ERROR 5
+#define TYPE_A 1
+#define TYPE_E 2
+#define TYPE_I 3
+#define TYPE_L 4
+#define FORM_N 1
+#define FORM_T 2
+#define FORM_C 3
+#define STRU_F 1
+#define STRU_R 2
+#define STRU_P 3
+#define MODE_S 1
+#define MODE_B 2
+#define MODE_C 3
+#define REC_ESC '\377'
+#define REC_EOR '\001'
+#define REC_EOF '\002'
+#define BLK_EOR 0x80
+#define BLK_EOF 0x40
+#define BLK_ERRORS 0x20
+#define BLK_RESTART 0x10
+#define BLK_BYTECOUNT 2
+#ifdef FTP_NAMES
+char *modenames[] = {"0", "Stream", "Block", "Compressed" };
+char *strunames[] = {"0", "File", "Record", "Page" };
+char *typenames[] = {"0", "ASCII", "EBCDIC", "Image", "Local" };
+char *formnames[] = {"0", "Nonprint", "Telnet", "Carriage-control" };
+#endif
+#endif
diff --git a/libc-top-half/musl/include/arpa/inet.h b/libc-top-half/musl/include/arpa/inet.h
new file mode 100644
index 0000000..f657c30
--- /dev/null
+++ b/libc-top-half/musl/include/arpa/inet.h
@@ -0,0 +1,35 @@
+#ifndef _ARPA_INET_H
+#define _ARPA_INET_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+#include <netinet/in.h>
+
+uint32_t htonl(uint32_t);
+uint16_t htons(uint16_t);
+uint32_t ntohl(uint32_t);
+uint16_t ntohs(uint16_t);
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no inet_addr */
+in_addr_t inet_addr (const char *);
+in_addr_t inet_network (const char *);
+char *inet_ntoa (struct in_addr);
+#endif
+int inet_pton (int, const char *__restrict, void *__restrict);
+const char *inet_ntop (int, const void *__restrict, char *__restrict, socklen_t);
+
+int inet_aton (const char *, struct in_addr *);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no inet_makeaddr */
+struct in_addr inet_makeaddr(in_addr_t, in_addr_t);
+in_addr_t inet_lnaof(struct in_addr);
+in_addr_t inet_netof(struct in_addr);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/arpa/nameser.h b/libc-top-half/musl/include/arpa/nameser.h
new file mode 100644
index 0000000..581925a
--- /dev/null
+++ b/libc-top-half/musl/include/arpa/nameser.h
@@ -0,0 +1,455 @@
+#ifndef _ARPA_NAMESER_H
+#define _ARPA_NAMESER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stddef.h>
+#include <stdint.h>
+
+#define __NAMESER 19991006
+#define NS_PACKETSZ 512
+#define NS_MAXDNAME 1025
+#define NS_MAXMSG 65535
+#define NS_MAXCDNAME 255
+#define NS_MAXLABEL 63
+#define NS_HFIXEDSZ 12
+#define NS_QFIXEDSZ 4
+#define NS_RRFIXEDSZ 10
+#define NS_INT32SZ 4
+#define NS_INT16SZ 2
+#define NS_INT8SZ 1
+#define NS_INADDRSZ 4
+#define NS_IN6ADDRSZ 16
+#define NS_CMPRSFLGS 0xc0
+#define NS_DEFAULTPORT 53
+
+typedef enum __ns_sect {
+ ns_s_qd = 0,
+ ns_s_zn = 0,
+ ns_s_an = 1,
+ ns_s_pr = 1,
+ ns_s_ns = 2,
+ ns_s_ud = 2,
+ ns_s_ar = 3,
+ ns_s_max = 4
+} ns_sect;
+
+typedef struct __ns_msg {
+ const unsigned char *_msg, *_eom;
+ uint16_t _id, _flags, _counts[ns_s_max];
+ const unsigned char *_sections[ns_s_max];
+ ns_sect _sect;
+ int _rrnum;
+ const unsigned char *_msg_ptr;
+} ns_msg;
+
+struct _ns_flagdata { int mask, shift; };
+extern const struct _ns_flagdata _ns_flagdata[];
+
+#define ns_msg_id(handle) ((handle)._id + 0)
+#define ns_msg_base(handle) ((handle)._msg + 0)
+#define ns_msg_end(handle) ((handle)._eom + 0)
+#define ns_msg_size(handle) ((handle)._eom - (handle)._msg)
+#define ns_msg_count(handle, section) ((handle)._counts[section] + 0)
+#define ns_msg_getflag(handle, flag) \
+ (((handle)._flags & _ns_flagdata[flag].mask) >> _ns_flagdata[flag].shift)
+
+typedef struct __ns_rr {
+ char name[NS_MAXDNAME];
+ uint16_t type;
+ uint16_t rr_class;
+ uint32_t ttl;
+ uint16_t rdlength;
+ const unsigned char *rdata;
+} ns_rr;
+
+#define ns_rr_name(rr) (((rr).name[0] != '\0') ? (rr).name : ".")
+#define ns_rr_type(rr) ((ns_type)((rr).type + 0))
+#define ns_rr_class(rr) ((ns_class)((rr).rr_class + 0))
+#define ns_rr_ttl(rr) ((rr).ttl + 0)
+#define ns_rr_rdlen(rr) ((rr).rdlength + 0)
+#define ns_rr_rdata(rr) ((rr).rdata + 0)
+
+typedef enum __ns_flag {
+ ns_f_qr,
+ ns_f_opcode,
+ ns_f_aa,
+ ns_f_tc,
+ ns_f_rd,
+ ns_f_ra,
+ ns_f_z,
+ ns_f_ad,
+ ns_f_cd,
+ ns_f_rcode,
+ ns_f_max
+} ns_flag;
+
+typedef enum __ns_opcode {
+ ns_o_query = 0,
+ ns_o_iquery = 1,
+ ns_o_status = 2,
+ ns_o_notify = 4,
+ ns_o_update = 5,
+ ns_o_max = 6
+} ns_opcode;
+
+typedef enum __ns_rcode {
+ ns_r_noerror = 0,
+ ns_r_formerr = 1,
+ ns_r_servfail = 2,
+ ns_r_nxdomain = 3,
+ ns_r_notimpl = 4,
+ ns_r_refused = 5,
+ ns_r_yxdomain = 6,
+ ns_r_yxrrset = 7,
+ ns_r_nxrrset = 8,
+ ns_r_notauth = 9,
+ ns_r_notzone = 10,
+ ns_r_max = 11,
+ ns_r_badvers = 16,
+ ns_r_badsig = 16,
+ ns_r_badkey = 17,
+ ns_r_badtime = 18
+} ns_rcode;
+
+typedef enum __ns_update_operation {
+ ns_uop_delete = 0,
+ ns_uop_add = 1,
+ ns_uop_max = 2
+} ns_update_operation;
+
+struct ns_tsig_key {
+ char name[NS_MAXDNAME], alg[NS_MAXDNAME];
+ unsigned char *data;
+ int len;
+};
+typedef struct ns_tsig_key ns_tsig_key;
+
+struct ns_tcp_tsig_state {
+ int counter;
+ struct dst_key *key;
+ void *ctx;
+ unsigned char sig[NS_PACKETSZ];
+ int siglen;
+};
+typedef struct ns_tcp_tsig_state ns_tcp_tsig_state;
+
+#define NS_TSIG_FUDGE 300
+#define NS_TSIG_TCP_COUNT 100
+#define NS_TSIG_ALG_HMAC_MD5 "HMAC-MD5.SIG-ALG.REG.INT"
+
+#define NS_TSIG_ERROR_NO_TSIG -10
+#define NS_TSIG_ERROR_NO_SPACE -11
+#define NS_TSIG_ERROR_FORMERR -12
+
+typedef enum __ns_type {
+ ns_t_invalid = 0,
+ ns_t_a = 1,
+ ns_t_ns = 2,
+ ns_t_md = 3,
+ ns_t_mf = 4,
+ ns_t_cname = 5,
+ ns_t_soa = 6,
+ ns_t_mb = 7,
+ ns_t_mg = 8,
+ ns_t_mr = 9,
+ ns_t_null = 10,
+ ns_t_wks = 11,
+ ns_t_ptr = 12,
+ ns_t_hinfo = 13,
+ ns_t_minfo = 14,
+ ns_t_mx = 15,
+ ns_t_txt = 16,
+ ns_t_rp = 17,
+ ns_t_afsdb = 18,
+ ns_t_x25 = 19,
+ ns_t_isdn = 20,
+ ns_t_rt = 21,
+ ns_t_nsap = 22,
+ ns_t_nsap_ptr = 23,
+ ns_t_sig = 24,
+ ns_t_key = 25,
+ ns_t_px = 26,
+ ns_t_gpos = 27,
+ ns_t_aaaa = 28,
+ ns_t_loc = 29,
+ ns_t_nxt = 30,
+ ns_t_eid = 31,
+ ns_t_nimloc = 32,
+ ns_t_srv = 33,
+ ns_t_atma = 34,
+ ns_t_naptr = 35,
+ ns_t_kx = 36,
+ ns_t_cert = 37,
+ ns_t_a6 = 38,
+ ns_t_dname = 39,
+ ns_t_sink = 40,
+ ns_t_opt = 41,
+ ns_t_apl = 42,
+ ns_t_tkey = 249,
+ ns_t_tsig = 250,
+ ns_t_ixfr = 251,
+ ns_t_axfr = 252,
+ ns_t_mailb = 253,
+ ns_t_maila = 254,
+ ns_t_any = 255,
+ ns_t_zxfr = 256,
+ ns_t_max = 65536
+} ns_type;
+
+#define ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || \
+ (t) == ns_t_mailb || (t) == ns_t_maila)
+#define ns_t_mrr_p(t) ((t) == ns_t_tsig || (t) == ns_t_opt)
+#define ns_t_rr_p(t) (!ns_t_qt_p(t) && !ns_t_mrr_p(t))
+#define ns_t_udp_p(t) ((t) != ns_t_axfr && (t) != ns_t_zxfr)
+#define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || \
+ (t) == ns_t_zxfr)
+
+typedef enum __ns_class {
+ ns_c_invalid = 0,
+ ns_c_in = 1,
+ ns_c_2 = 2,
+ ns_c_chaos = 3,
+ ns_c_hs = 4,
+ ns_c_none = 254,
+ ns_c_any = 255,
+ ns_c_max = 65536
+} ns_class;
+
+typedef enum __ns_key_types {
+ ns_kt_rsa = 1,
+ ns_kt_dh = 2,
+ ns_kt_dsa = 3,
+ ns_kt_private = 254
+} ns_key_types;
+
+typedef enum __ns_cert_types {
+ cert_t_pkix = 1,
+ cert_t_spki = 2,
+ cert_t_pgp = 3,
+ cert_t_url = 253,
+ cert_t_oid = 254
+} ns_cert_types;
+
+#define NS_KEY_TYPEMASK 0xC000
+#define NS_KEY_TYPE_AUTH_CONF 0x0000
+#define NS_KEY_TYPE_CONF_ONLY 0x8000
+#define NS_KEY_TYPE_AUTH_ONLY 0x4000
+#define NS_KEY_TYPE_NO_KEY 0xC000
+#define NS_KEY_NO_AUTH 0x8000
+#define NS_KEY_NO_CONF 0x4000
+#define NS_KEY_RESERVED2 0x2000
+#define NS_KEY_EXTENDED_FLAGS 0x1000
+#define NS_KEY_RESERVED4 0x0800
+#define NS_KEY_RESERVED5 0x0400
+#define NS_KEY_NAME_TYPE 0x0300
+#define NS_KEY_NAME_USER 0x0000
+#define NS_KEY_NAME_ENTITY 0x0200
+#define NS_KEY_NAME_ZONE 0x0100
+#define NS_KEY_NAME_RESERVED 0x0300
+#define NS_KEY_RESERVED8 0x0080
+#define NS_KEY_RESERVED9 0x0040
+#define NS_KEY_RESERVED10 0x0020
+#define NS_KEY_RESERVED11 0x0010
+#define NS_KEY_SIGNATORYMASK 0x000F
+#define NS_KEY_RESERVED_BITMASK ( NS_KEY_RESERVED2 | \
+ NS_KEY_RESERVED4 | \
+ NS_KEY_RESERVED5 | \
+ NS_KEY_RESERVED8 | \
+ NS_KEY_RESERVED9 | \
+ NS_KEY_RESERVED10 | \
+ NS_KEY_RESERVED11 )
+#define NS_KEY_RESERVED_BITMASK2 0xFFFF
+#define NS_ALG_MD5RSA 1
+#define NS_ALG_DH 2
+#define NS_ALG_DSA 3
+#define NS_ALG_DSS NS_ALG_DSA
+#define NS_ALG_EXPIRE_ONLY 253
+#define NS_ALG_PRIVATE_OID 254
+
+#define NS_KEY_PROT_TLS 1
+#define NS_KEY_PROT_EMAIL 2
+#define NS_KEY_PROT_DNSSEC 3
+#define NS_KEY_PROT_IPSEC 4
+#define NS_KEY_PROT_ANY 255
+
+#define NS_MD5RSA_MIN_BITS 512
+#define NS_MD5RSA_MAX_BITS 4096
+#define NS_MD5RSA_MAX_BYTES ((NS_MD5RSA_MAX_BITS+7/8)*2+3)
+#define NS_MD5RSA_MAX_BASE64 (((NS_MD5RSA_MAX_BYTES+2)/3)*4)
+#define NS_MD5RSA_MIN_SIZE ((NS_MD5RSA_MIN_BITS+7)/8)
+#define NS_MD5RSA_MAX_SIZE ((NS_MD5RSA_MAX_BITS+7)/8)
+
+#define NS_DSA_SIG_SIZE 41
+#define NS_DSA_MIN_SIZE 213
+#define NS_DSA_MAX_BYTES 405
+
+#define NS_SIG_TYPE 0
+#define NS_SIG_ALG 2
+#define NS_SIG_LABELS 3
+#define NS_SIG_OTTL 4
+#define NS_SIG_EXPIR 8
+#define NS_SIG_SIGNED 12
+#define NS_SIG_FOOT 16
+#define NS_SIG_SIGNER 18
+#define NS_NXT_BITS 8
+#define NS_NXT_BIT_SET( n,p) (p[(n)/NS_NXT_BITS] |= (0x80>>((n)%NS_NXT_BITS)))
+#define NS_NXT_BIT_CLEAR(n,p) (p[(n)/NS_NXT_BITS] &= ~(0x80>>((n)%NS_NXT_BITS)))
+#define NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] & (0x80>>((n)%NS_NXT_BITS)))
+#define NS_NXT_MAX 127
+
+#define NS_OPT_DNSSEC_OK 0x8000U
+#define NS_OPT_NSID 3
+
+#define NS_GET16(s, cp) (void)((s) = ns_get16(((cp)+=2)-2))
+#define NS_GET32(l, cp) (void)((l) = ns_get32(((cp)+=4)-4))
+#define NS_PUT16(s, cp) ns_put16((s), ((cp)+=2)-2)
+#define NS_PUT32(l, cp) ns_put32((l), ((cp)+=4)-4)
+
+unsigned ns_get16(const unsigned char *);
+unsigned long ns_get32(const unsigned char *);
+void ns_put16(unsigned, unsigned char *);
+void ns_put32(unsigned long, unsigned char *);
+
+int ns_initparse(const unsigned char *, int, ns_msg *);
+int ns_parserr(ns_msg *, ns_sect, int, ns_rr *);
+int ns_skiprr(const unsigned char *, const unsigned char *, ns_sect, int);
+int ns_name_uncompress(const unsigned char *, const unsigned char *, const unsigned char *, char *, size_t);
+
+
+#define __BIND 19950621
+
+typedef struct {
+ unsigned id :16;
+#if __BYTE_ORDER == __BIG_ENDIAN
+ unsigned qr: 1;
+ unsigned opcode: 4;
+ unsigned aa: 1;
+ unsigned tc: 1;
+ unsigned rd: 1;
+ unsigned ra: 1;
+ unsigned unused :1;
+ unsigned ad: 1;
+ unsigned cd: 1;
+ unsigned rcode :4;
+#else
+ unsigned rd :1;
+ unsigned tc :1;
+ unsigned aa :1;
+ unsigned opcode :4;
+ unsigned qr :1;
+ unsigned rcode :4;
+ unsigned cd: 1;
+ unsigned ad: 1;
+ unsigned unused :1;
+ unsigned ra :1;
+#endif
+ unsigned qdcount :16;
+ unsigned ancount :16;
+ unsigned nscount :16;
+ unsigned arcount :16;
+} HEADER;
+
+#define PACKETSZ NS_PACKETSZ
+#define MAXDNAME NS_MAXDNAME
+#define MAXCDNAME NS_MAXCDNAME
+#define MAXLABEL NS_MAXLABEL
+#define HFIXEDSZ NS_HFIXEDSZ
+#define QFIXEDSZ NS_QFIXEDSZ
+#define RRFIXEDSZ NS_RRFIXEDSZ
+#define INT32SZ NS_INT32SZ
+#define INT16SZ NS_INT16SZ
+#define INT8SZ NS_INT8SZ
+#define INADDRSZ NS_INADDRSZ
+#define IN6ADDRSZ NS_IN6ADDRSZ
+#define INDIR_MASK NS_CMPRSFLGS
+#define NAMESERVER_PORT NS_DEFAULTPORT
+
+#define S_ZONE ns_s_zn
+#define S_PREREQ ns_s_pr
+#define S_UPDATE ns_s_ud
+#define S_ADDT ns_s_ar
+
+#define QUERY ns_o_query
+#define IQUERY ns_o_iquery
+#define STATUS ns_o_status
+#define NS_NOTIFY_OP ns_o_notify
+#define NS_UPDATE_OP ns_o_update
+
+#define NOERROR ns_r_noerror
+#define FORMERR ns_r_formerr
+#define SERVFAIL ns_r_servfail
+#define NXDOMAIN ns_r_nxdomain
+#define NOTIMP ns_r_notimpl
+#define REFUSED ns_r_refused
+#define YXDOMAIN ns_r_yxdomain
+#define YXRRSET ns_r_yxrrset
+#define NXRRSET ns_r_nxrrset
+#define NOTAUTH ns_r_notauth
+#define NOTZONE ns_r_notzone
+
+#define DELETE ns_uop_delete
+#define ADD ns_uop_add
+
+#define T_A ns_t_a
+#define T_NS ns_t_ns
+#define T_MD ns_t_md
+#define T_MF ns_t_mf
+#define T_CNAME ns_t_cname
+#define T_SOA ns_t_soa
+#define T_MB ns_t_mb
+#define T_MG ns_t_mg
+#define T_MR ns_t_mr
+#define T_NULL ns_t_null
+#define T_WKS ns_t_wks
+#define T_PTR ns_t_ptr
+#define T_HINFO ns_t_hinfo
+#define T_MINFO ns_t_minfo
+#define T_MX ns_t_mx
+#define T_TXT ns_t_txt
+#define T_RP ns_t_rp
+#define T_AFSDB ns_t_afsdb
+#define T_X25 ns_t_x25
+#define T_ISDN ns_t_isdn
+#define T_RT ns_t_rt
+#define T_NSAP ns_t_nsap
+#define T_NSAP_PTR ns_t_nsap_ptr
+#define T_SIG ns_t_sig
+#define T_KEY ns_t_key
+#define T_PX ns_t_px
+#define T_GPOS ns_t_gpos
+#define T_AAAA ns_t_aaaa
+#define T_LOC ns_t_loc
+#define T_NXT ns_t_nxt
+#define T_EID ns_t_eid
+#define T_NIMLOC ns_t_nimloc
+#define T_SRV ns_t_srv
+#define T_ATMA ns_t_atma
+#define T_NAPTR ns_t_naptr
+#define T_A6 ns_t_a6
+#define T_DNAME ns_t_dname
+#define T_TSIG ns_t_tsig
+#define T_IXFR ns_t_ixfr
+#define T_AXFR ns_t_axfr
+#define T_MAILB ns_t_mailb
+#define T_MAILA ns_t_maila
+#define T_ANY ns_t_any
+
+#define C_IN ns_c_in
+#define C_CHAOS ns_c_chaos
+#define C_HS ns_c_hs
+#define C_NONE ns_c_none
+#define C_ANY ns_c_any
+
+#define GETSHORT NS_GET16
+#define GETLONG NS_GET32
+#define PUTSHORT NS_PUT16
+#define PUTLONG NS_PUT32
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/arpa/nameser_compat.h b/libc-top-half/musl/include/arpa/nameser_compat.h
new file mode 100644
index 0000000..3aac25c
--- /dev/null
+++ b/libc-top-half/musl/include/arpa/nameser_compat.h
@@ -0,0 +1,2 @@
+#include <arpa/nameser.h>
+
diff --git a/libc-top-half/musl/include/arpa/telnet.h b/libc-top-half/musl/include/arpa/telnet.h
new file mode 100644
index 0000000..e2ad974
--- /dev/null
+++ b/libc-top-half/musl/include/arpa/telnet.h
@@ -0,0 +1,251 @@
+#ifndef _ARPA_TELNET_H
+#define _ARPA_TELNET_H
+
+#define IAC 255
+#define DONT 254
+#define DO 253
+#define WONT 252
+#define WILL 251
+#define SB 250
+#define GA 249
+#define EL 248
+#define EC 247
+#define AYT 246
+#define AO 245
+#define IP 244
+#define BREAK 243
+#define DM 242
+#define NOP 241
+#define SE 240
+#define EOR 239
+#define ABORT 238
+#define SUSP 237
+#define xEOF 236
+
+#define SYNCH 242
+
+#define telcmds ((char [][6]){ "EOF", "SUSP", "ABORT", "EOR", "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC", "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0 })
+
+#define TELCMD_FIRST xEOF
+#define TELCMD_LAST IAC
+#define TELCMD_OK(x) ((unsigned int)(x) <= TELCMD_LAST && \
+ (unsigned int)(x) >= TELCMD_FIRST)
+#define TELCMD(x) telcmds[(x)-TELCMD_FIRST]
+
+#define TELOPT_BINARY 0
+#define TELOPT_ECHO 1
+#define TELOPT_RCP 2
+#define TELOPT_SGA 3
+#define TELOPT_NAMS 4
+#define TELOPT_STATUS 5
+#define TELOPT_TM 6
+#define TELOPT_RCTE 7
+#define TELOPT_NAOL 8
+#define TELOPT_NAOP 9
+#define TELOPT_NAOCRD 10
+#define TELOPT_NAOHTS 11
+#define TELOPT_NAOHTD 12
+#define TELOPT_NAOFFD 13
+#define TELOPT_NAOVTS 14
+#define TELOPT_NAOVTD 15
+#define TELOPT_NAOLFD 16
+#define TELOPT_XASCII 17
+#define TELOPT_LOGOUT 18
+#define TELOPT_BM 19
+#define TELOPT_DET 20
+#define TELOPT_SUPDUP 21
+#define TELOPT_SUPDUPOUTPUT 22
+#define TELOPT_SNDLOC 23
+#define TELOPT_TTYPE 24
+#define TELOPT_EOR 25
+#define TELOPT_TUID 26
+#define TELOPT_OUTMRK 27
+#define TELOPT_TTYLOC 28
+#define TELOPT_3270REGIME 29
+#define TELOPT_X3PAD 30
+#define TELOPT_NAWS 31
+#define TELOPT_TSPEED 32
+#define TELOPT_LFLOW 33
+#define TELOPT_LINEMODE 34
+#define TELOPT_XDISPLOC 35
+#define TELOPT_OLD_ENVIRON 36
+#define TELOPT_AUTHENTICATION 37/* Authenticate */
+#define TELOPT_ENCRYPT 38
+#define TELOPT_NEW_ENVIRON 39
+#define TELOPT_EXOPL 255
+
+
+#define NTELOPTS (1+TELOPT_NEW_ENVIRON)
+#ifdef TELOPTS
+char *telopts[NTELOPTS+1] = {
+ "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "NAME",
+ "STATUS", "TIMING MARK", "RCTE", "NAOL", "NAOP",
+ "NAOCRD", "NAOHTS", "NAOHTD", "NAOFFD", "NAOVTS",
+ "NAOVTD", "NAOLFD", "EXTEND ASCII", "LOGOUT", "BYTE MACRO",
+ "DATA ENTRY TERMINAL", "SUPDUP", "SUPDUP OUTPUT",
+ "SEND LOCATION", "TERMINAL TYPE", "END OF RECORD",
+ "TACACS UID", "OUTPUT MARKING", "TTYLOC",
+ "3270 REGIME", "X.3 PAD", "NAWS", "TSPEED", "LFLOW",
+ "LINEMODE", "XDISPLOC", "OLD-ENVIRON", "AUTHENTICATION",
+ "ENCRYPT", "NEW-ENVIRON",
+ 0,
+};
+#define TELOPT_FIRST TELOPT_BINARY
+#define TELOPT_LAST TELOPT_NEW_ENVIRON
+#define TELOPT_OK(x) ((unsigned int)(x) <= TELOPT_LAST)
+#define TELOPT(x) telopts[(x)-TELOPT_FIRST]
+#endif
+
+#define TELQUAL_IS 0
+#define TELQUAL_SEND 1
+#define TELQUAL_INFO 2
+#define TELQUAL_REPLY 2
+#define TELQUAL_NAME 3
+
+#define LFLOW_OFF 0
+#define LFLOW_ON 1
+#define LFLOW_RESTART_ANY 2
+#define LFLOW_RESTART_XON 3
+
+
+#define LM_MODE 1
+#define LM_FORWARDMASK 2
+#define LM_SLC 3
+
+#define MODE_EDIT 0x01
+#define MODE_TRAPSIG 0x02
+#define MODE_ACK 0x04
+#define MODE_SOFT_TAB 0x08
+#define MODE_LIT_ECHO 0x10
+
+#define MODE_MASK 0x1f
+
+#define MODE_FLOW 0x0100
+#define MODE_ECHO 0x0200
+#define MODE_INBIN 0x0400
+#define MODE_OUTBIN 0x0800
+#define MODE_FORCE 0x1000
+
+#define SLC_SYNCH 1
+#define SLC_BRK 2
+#define SLC_IP 3
+#define SLC_AO 4
+#define SLC_AYT 5
+#define SLC_EOR 6
+#define SLC_ABORT 7
+#define SLC_EOF 8
+#define SLC_SUSP 9
+#define SLC_EC 10
+#define SLC_EL 11
+#define SLC_EW 12
+#define SLC_RP 13
+#define SLC_LNEXT 14
+#define SLC_XON 15
+#define SLC_XOFF 16
+#define SLC_FORW1 17
+#define SLC_FORW2 18
+
+#define NSLC 18
+
+#define SLC_NAMELIST "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", \
+ "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \
+ "LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0,
+#ifdef SLC_NAMES
+char *slc_names[] = {
+ SLC_NAMELIST
+};
+#else
+extern char *slc_names[];
+#define SLC_NAMES SLC_NAMELIST
+#endif
+
+#define SLC_NAME_OK(x) ((unsigned int)(x) <= NSLC)
+#define SLC_NAME(x) slc_names[x]
+
+#define SLC_NOSUPPORT 0
+#define SLC_CANTCHANGE 1
+#define SLC_VARIABLE 2
+#define SLC_DEFAULT 3
+#define SLC_LEVELBITS 0x03
+
+#define SLC_FUNC 0
+#define SLC_FLAGS 1
+#define SLC_VALUE 2
+
+#define SLC_ACK 0x80
+#define SLC_FLUSHIN 0x40
+#define SLC_FLUSHOUT 0x20
+
+#define OLD_ENV_VAR 1
+#define OLD_ENV_VALUE 0
+#define NEW_ENV_VAR 0
+#define NEW_ENV_VALUE 1
+#define ENV_ESC 2
+#define ENV_USERVAR 3
+
+#define AUTH_WHO_CLIENT 0
+#define AUTH_WHO_SERVER 1
+#define AUTH_WHO_MASK 1
+
+#define AUTH_HOW_ONE_WAY 0
+#define AUTH_HOW_MUTUAL 2
+#define AUTH_HOW_MASK 2
+
+#define AUTHTYPE_NULL 0
+#define AUTHTYPE_KERBEROS_V4 1
+#define AUTHTYPE_KERBEROS_V5 2
+#define AUTHTYPE_SPX 3
+#define AUTHTYPE_MINK 4
+#define AUTHTYPE_CNT 5
+
+#define AUTHTYPE_TEST 99
+
+#ifdef AUTH_NAMES
+char *authtype_names[] = {
+ "NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK", 0,
+};
+#else
+extern char *authtype_names[];
+#endif
+
+#define AUTHTYPE_NAME_OK(x) ((unsigned int)(x) < AUTHTYPE_CNT)
+#define AUTHTYPE_NAME(x) authtype_names[x]
+
+#define ENCRYPT_IS 0
+#define ENCRYPT_SUPPORT 1
+#define ENCRYPT_REPLY 2
+#define ENCRYPT_START 3
+#define ENCRYPT_END 4
+#define ENCRYPT_REQSTART 5
+#define ENCRYPT_REQEND 6
+#define ENCRYPT_ENC_KEYID 7
+#define ENCRYPT_DEC_KEYID 8
+#define ENCRYPT_CNT 9
+
+#define ENCTYPE_ANY 0
+#define ENCTYPE_DES_CFB64 1
+#define ENCTYPE_DES_OFB64 2
+#define ENCTYPE_CNT 3
+
+#ifdef ENCRYPT_NAMES
+char *encrypt_names[] = {
+ "IS", "SUPPORT", "REPLY", "START", "END",
+ "REQUEST-START", "REQUEST-END", "ENC-KEYID", "DEC-KEYID",
+ 0,
+};
+char *enctype_names[] = {
+ "ANY", "DES_CFB64", "DES_OFB64", 0,
+};
+#else
+extern char *encrypt_names[];
+extern char *enctype_names[];
+#endif
+
+
+#define ENCRYPT_NAME_OK(x) ((unsigned int)(x) < ENCRYPT_CNT)
+#define ENCRYPT_NAME(x) encrypt_names[x]
+
+#define ENCTYPE_NAME_OK(x) ((unsigned int)(x) < ENCTYPE_CNT)
+#define ENCTYPE_NAME(x) enctype_names[x]
+
+#endif
diff --git a/libc-top-half/musl/include/arpa/tftp.h b/libc-top-half/musl/include/arpa/tftp.h
new file mode 100644
index 0000000..799c54f
--- /dev/null
+++ b/libc-top-half/musl/include/arpa/tftp.h
@@ -0,0 +1,31 @@
+#ifndef _ARPA_TFTP_H
+#define _ARPA_TFTP_H
+#define SEGSIZE 512
+#define RRQ 01
+#define WRQ 02
+#define DATA 03
+#define ACK 04
+#define ERROR 05
+struct tftphdr {
+ short th_opcode;
+ union {
+ unsigned short tu_block;
+ short tu_code;
+ char tu_stuff[1];
+ } th_u;
+ char th_data[1];
+};
+#define th_block th_u.tu_block
+#define th_code th_u.tu_code
+#define th_stuff th_u.tu_stuff
+#define th_msg th_data
+#define EUNDEF 0
+#define ENOTFOUND 1
+#define EACCESS 2
+#define ENOSPACE 3
+#define EBADOP 4
+#define EBADID 5
+#define EEXISTS 6
+#define ENOUSER 7
+#endif
+
diff --git a/libc-top-half/musl/include/assert.h b/libc-top-half/musl/include/assert.h
new file mode 100644
index 0000000..d14ec94
--- /dev/null
+++ b/libc-top-half/musl/include/assert.h
@@ -0,0 +1,23 @@
+#include <features.h>
+
+#undef assert
+
+#ifdef NDEBUG
+#define assert(x) (void)0
+#else
+#define assert(x) ((void)((x) || (__assert_fail(#x, __FILE__, __LINE__, __func__),0)))
+#endif
+
+#if __STDC_VERSION__ >= 201112L && !defined(__cplusplus)
+#define static_assert _Static_assert
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_Noreturn void __assert_fail (const char *, const char *, int, const char *);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/libc-top-half/musl/include/byteswap.h b/libc-top-half/musl/include/byteswap.h
new file mode 100644
index 0000000..00b9df3
--- /dev/null
+++ b/libc-top-half/musl/include/byteswap.h
@@ -0,0 +1,26 @@
+#ifndef _BYTESWAP_H
+#define _BYTESWAP_H
+
+#include <features.h>
+#include <stdint.h>
+
+static __inline uint16_t __bswap_16(uint16_t __x)
+{
+ return __x<<8 | __x>>8;
+}
+
+static __inline uint32_t __bswap_32(uint32_t __x)
+{
+ return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24;
+}
+
+static __inline uint64_t __bswap_64(uint64_t __x)
+{
+ return __bswap_32(__x)+0ULL<<32 | __bswap_32(__x>>32);
+}
+
+#define bswap_16(x) __bswap_16(x)
+#define bswap_32(x) __bswap_32(x)
+#define bswap_64(x) __bswap_64(x)
+
+#endif
diff --git a/libc-top-half/musl/include/complex.h b/libc-top-half/musl/include/complex.h
new file mode 100644
index 0000000..a645eb1
--- /dev/null
+++ b/libc-top-half/musl/include/complex.h
@@ -0,0 +1,143 @@
+#ifndef _COMPLEX_H
+#define _COMPLEX_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define complex _Complex
+#ifdef __GNUC__
+#define _Complex_I (__extension__ (0.0f+1.0fi))
+#else
+#define _Complex_I (0.0f+1.0fi)
+#endif
+#define I _Complex_I
+
+double complex cacos(double complex);
+float complex cacosf(float complex);
+long double complex cacosl(long double complex);
+
+double complex casin(double complex);
+float complex casinf(float complex);
+long double complex casinl(long double complex);
+
+double complex catan(double complex);
+float complex catanf(float complex);
+long double complex catanl(long double complex);
+
+double complex ccos(double complex);
+float complex ccosf(float complex);
+long double complex ccosl(long double complex);
+
+double complex csin(double complex);
+float complex csinf(float complex);
+long double complex csinl(long double complex);
+
+double complex ctan(double complex);
+float complex ctanf(float complex);
+long double complex ctanl(long double complex);
+
+double complex cacosh(double complex);
+float complex cacoshf(float complex);
+long double complex cacoshl(long double complex);
+
+double complex casinh(double complex);
+float complex casinhf(float complex);
+long double complex casinhl(long double complex);
+
+double complex catanh(double complex);
+float complex catanhf(float complex);
+long double complex catanhl(long double complex);
+
+double complex ccosh(double complex);
+float complex ccoshf(float complex);
+long double complex ccoshl(long double complex);
+
+double complex csinh(double complex);
+float complex csinhf(float complex);
+long double complex csinhl(long double complex);
+
+double complex ctanh(double complex);
+float complex ctanhf(float complex);
+long double complex ctanhl(long double complex);
+
+double complex cexp(double complex);
+float complex cexpf(float complex);
+long double complex cexpl(long double complex);
+
+double complex clog(double complex);
+float complex clogf(float complex);
+long double complex clogl(long double complex);
+
+double cabs(double complex);
+float cabsf(float complex);
+long double cabsl(long double complex);
+
+double complex cpow(double complex, double complex);
+float complex cpowf(float complex, float complex);
+long double complex cpowl(long double complex, long double complex);
+
+double complex csqrt(double complex);
+float complex csqrtf(float complex);
+long double complex csqrtl(long double complex);
+
+double carg(double complex);
+float cargf(float complex);
+long double cargl(long double complex);
+
+double cimag(double complex);
+float cimagf(float complex);
+long double cimagl(long double complex);
+
+double complex conj(double complex);
+float complex conjf(float complex);
+long double complex conjl(long double complex);
+
+double complex cproj(double complex);
+float complex cprojf(float complex);
+long double complex cprojl(long double complex);
+
+double creal(double complex);
+float crealf(float complex);
+long double creall(long double complex);
+
+#ifdef __wasilibc_unmodified_upstream /* Use the compiler's real/imag operators rather than union type punning */
+#ifndef __cplusplus
+#define __CIMAG(x, t) \
+ (+(union { _Complex t __z; t __xy[2]; }){(_Complex t)(x)}.__xy[1])
+
+#define creal(x) ((double)(x))
+#define crealf(x) ((float)(x))
+#define creall(x) ((long double)(x))
+
+#define cimag(x) __CIMAG(x, double)
+#define cimagf(x) __CIMAG(x, float)
+#define cimagl(x) __CIMAG(x, long double)
+#endif
+#else
+#define creal(x) (__builtin_creal(x))
+#define crealf(x) (__builtin_crealf(x))
+#define creall(x) (__builtin_creall(x))
+
+#define cimag(x) (__builtin_cimag(x))
+#define cimagf(x) (__builtin_cimagf(x))
+#define cimagl(x) (__builtin_cimagl(x))
+#endif
+
+#if __STDC_VERSION__ >= 201112L
+#if defined(_Imaginary_I)
+#define __CMPLX(x, y, t) ((t)(x) + _Imaginary_I*(t)(y))
+#elif defined(__clang__)
+#define __CMPLX(x, y, t) (+(_Complex t){ (t)(x), (t)(y) })
+#else
+#define __CMPLX(x, y, t) (__builtin_complex((t)(x), (t)(y)))
+#endif
+#define CMPLX(x, y) __CMPLX(x, y, double)
+#define CMPLXF(x, y) __CMPLX(x, y, float)
+#define CMPLXL(x, y) __CMPLX(x, y, long double)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/cpio.h b/libc-top-half/musl/include/cpio.h
new file mode 100644
index 0000000..39a1f8b
--- /dev/null
+++ b/libc-top-half/musl/include/cpio.h
@@ -0,0 +1,29 @@
+#ifndef _CPIO_H
+#define _CPIO_H
+
+#define MAGIC "070707"
+
+#define C_IRUSR 000400
+#define C_IWUSR 000200
+#define C_IXUSR 000100
+#define C_IRGRP 000040
+#define C_IWGRP 000020
+#define C_IXGRP 000010
+#define C_IROTH 000004
+#define C_IWOTH 000002
+#define C_IXOTH 000001
+
+#define C_ISUID 004000
+#define C_ISGID 002000
+#define C_ISVTX 001000
+
+#define C_ISBLK 060000
+#define C_ISCHR 020000
+#define C_ISDIR 040000
+#define C_ISFIFO 010000
+#define C_ISSOCK 0140000
+#define C_ISLNK 0120000
+#define C_ISCTG 0110000
+#define C_ISREG 0100000
+
+#endif
diff --git a/libc-top-half/musl/include/crypt.h b/libc-top-half/musl/include/crypt.h
new file mode 100644
index 0000000..07de216
--- /dev/null
+++ b/libc-top-half/musl/include/crypt.h
@@ -0,0 +1,20 @@
+#ifndef _CRYPT_H
+#define _CRYPT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct crypt_data {
+ int initialized;
+ char __buf[256];
+};
+
+char *crypt(const char *, const char *);
+char *crypt_r(const char *, const char *, struct crypt_data *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/ctype.h b/libc-top-half/musl/include/ctype.h
new file mode 100644
index 0000000..32bcef4
--- /dev/null
+++ b/libc-top-half/musl/include/ctype.h
@@ -0,0 +1,77 @@
+#ifndef _CTYPE_H
+#define _CTYPE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+int isalnum(int);
+int isalpha(int);
+int isblank(int);
+int iscntrl(int);
+int isdigit(int);
+int isgraph(int);
+int islower(int);
+int isprint(int);
+int ispunct(int);
+int isspace(int);
+int isupper(int);
+int isxdigit(int);
+int tolower(int);
+int toupper(int);
+
+#ifndef __cplusplus
+static __inline int __isspace(int _c)
+{
+ return _c == ' ' || (unsigned)_c-'\t' < 5;
+}
+
+#define isalpha(a) (0 ? isalpha(a) : (((unsigned)(a)|32)-'a') < 26)
+#define isdigit(a) (0 ? isdigit(a) : ((unsigned)(a)-'0') < 10)
+#define islower(a) (0 ? islower(a) : ((unsigned)(a)-'a') < 26)
+#define isupper(a) (0 ? isupper(a) : ((unsigned)(a)-'A') < 26)
+#define isprint(a) (0 ? isprint(a) : ((unsigned)(a)-0x20) < 0x5f)
+#define isgraph(a) (0 ? isgraph(a) : ((unsigned)(a)-0x21) < 0x5e)
+#define isspace(a) __isspace(a)
+#endif
+
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+
+#define __NEED_locale_t
+#include <bits/alltypes.h>
+
+int isalnum_l(int, locale_t);
+int isalpha_l(int, locale_t);
+int isblank_l(int, locale_t);
+int iscntrl_l(int, locale_t);
+int isdigit_l(int, locale_t);
+int isgraph_l(int, locale_t);
+int islower_l(int, locale_t);
+int isprint_l(int, locale_t);
+int ispunct_l(int, locale_t);
+int isspace_l(int, locale_t);
+int isupper_l(int, locale_t);
+int isxdigit_l(int, locale_t);
+int tolower_l(int, locale_t);
+int toupper_l(int, locale_t);
+
+int isascii(int);
+int toascii(int);
+#define _tolower(a) ((a)|0x20)
+#define _toupper(a) ((a)&0x5f)
+#ifndef __cplusplus
+#define isascii(a) (0 ? isascii(a) : (unsigned)(a) < 128)
+#endif
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/dirent.h b/libc-top-half/musl/include/dirent.h
new file mode 100644
index 0000000..52a3b16
--- /dev/null
+++ b/libc-top-half/musl/include/dirent.h
@@ -0,0 +1,89 @@
+#ifndef _DIRENT_H
+#define _DIRENT_H
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#else
+#include <__header_dirent.h>
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_ino_t
+#define __NEED_off_t
+#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
+#define __NEED_size_t
+#endif
+
+#include <bits/alltypes.h>
+
+#include <bits/dirent.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+typedef struct __dirstream DIR;
+#else
+#include <__typedef_DIR.h>
+#endif
+
+#define d_fileno d_ino
+
+int closedir(DIR *);
+DIR *fdopendir(int);
+DIR *opendir(const char *);
+struct dirent *readdir(DIR *);
+#ifdef __wasilibc_unmodified_upstream /* readdir_r is obsolete */
+int readdir_r(DIR *__restrict, struct dirent *__restrict, struct dirent **__restrict);
+#endif
+void rewinddir(DIR *);
+int dirfd(DIR *);
+
+int alphasort(const struct dirent **, const struct dirent **);
+int scandir(const char *, struct dirent ***, int (*)(const struct dirent *), int (*)(const struct dirent **, const struct dirent **));
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+void seekdir(DIR *, long);
+long telldir(DIR *);
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#define DT_UNKNOWN 0
+#define DT_FIFO 1
+#define DT_CHR 2
+#define DT_DIR 4
+#define DT_BLK 6
+#define DT_REG 8
+#define DT_LNK 10
+#define DT_SOCK 12
+#define DT_WHT 14
+#define IFTODT(x) ((x)>>12 & 017)
+#define DTTOIF(x) ((x)<<12)
+#endif
+int getdents(int, struct dirent *, size_t);
+#endif
+
+#ifdef _GNU_SOURCE
+int versionsort(const struct dirent **, const struct dirent **);
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#define dirent64 dirent
+#define readdir64 readdir
+#ifdef __wasilibc_unmodified_upstream /* readdir_r is obsolete */
+#define readdir64_r readdir_r
+#endif
+#define scandir64 scandir
+#define alphasort64 alphasort
+#define versionsort64 versionsort
+#define off64_t off_t
+#define ino64_t ino_t
+#define getdents64 getdents
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/dlfcn.h b/libc-top-half/musl/include/dlfcn.h
new file mode 100644
index 0000000..13ab71d
--- /dev/null
+++ b/libc-top-half/musl/include/dlfcn.h
@@ -0,0 +1,46 @@
+#ifndef _DLFCN_H
+#define _DLFCN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define RTLD_LAZY 1
+#define RTLD_NOW 2
+#define RTLD_NOLOAD 4
+#define RTLD_NODELETE 4096
+#define RTLD_GLOBAL 256
+#define RTLD_LOCAL 0
+
+#define RTLD_NEXT ((void *)-1)
+#define RTLD_DEFAULT ((void *)0)
+
+#define RTLD_DI_LINKMAP 2
+
+int dlclose(void *);
+char *dlerror(void);
+void *dlopen(const char *, int);
+void *dlsym(void *__restrict, const char *__restrict);
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef struct {
+ const char *dli_fname;
+ void *dli_fbase;
+ const char *dli_sname;
+ void *dli_saddr;
+} Dl_info;
+int dladdr(const void *, Dl_info *);
+int dlinfo(void *, int, void *);
+#endif
+
+#if _REDIR_TIME64
+__REDIR(dlsym, __dlsym_time64);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/elf.h b/libc-top-half/musl/include/elf.h
new file mode 100644
index 0000000..86e2f0b
--- /dev/null
+++ b/libc-top-half/musl/include/elf.h
@@ -0,0 +1,3296 @@
+#ifndef _ELF_H
+#define _ELF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+typedef uint16_t Elf32_Half;
+typedef uint16_t Elf64_Half;
+
+typedef uint32_t Elf32_Word;
+typedef int32_t Elf32_Sword;
+typedef uint32_t Elf64_Word;
+typedef int32_t Elf64_Sword;
+
+typedef uint64_t Elf32_Xword;
+typedef int64_t Elf32_Sxword;
+typedef uint64_t Elf64_Xword;
+typedef int64_t Elf64_Sxword;
+
+typedef uint32_t Elf32_Addr;
+typedef uint64_t Elf64_Addr;
+
+typedef uint32_t Elf32_Off;
+typedef uint64_t Elf64_Off;
+
+typedef uint16_t Elf32_Section;
+typedef uint16_t Elf64_Section;
+
+typedef Elf32_Half Elf32_Versym;
+typedef Elf64_Half Elf64_Versym;
+
+#define EI_NIDENT (16)
+
+typedef struct {
+ unsigned char e_ident[EI_NIDENT];
+ Elf32_Half e_type;
+ Elf32_Half e_machine;
+ Elf32_Word e_version;
+ Elf32_Addr e_entry;
+ Elf32_Off e_phoff;
+ Elf32_Off e_shoff;
+ Elf32_Word e_flags;
+ Elf32_Half e_ehsize;
+ Elf32_Half e_phentsize;
+ Elf32_Half e_phnum;
+ Elf32_Half e_shentsize;
+ Elf32_Half e_shnum;
+ Elf32_Half e_shstrndx;
+} Elf32_Ehdr;
+
+typedef struct {
+ unsigned char e_ident[EI_NIDENT];
+ Elf64_Half e_type;
+ Elf64_Half e_machine;
+ Elf64_Word e_version;
+ Elf64_Addr e_entry;
+ Elf64_Off e_phoff;
+ Elf64_Off e_shoff;
+ Elf64_Word e_flags;
+ Elf64_Half e_ehsize;
+ Elf64_Half e_phentsize;
+ Elf64_Half e_phnum;
+ Elf64_Half e_shentsize;
+ Elf64_Half e_shnum;
+ Elf64_Half e_shstrndx;
+} Elf64_Ehdr;
+
+#define EI_MAG0 0
+#define ELFMAG0 0x7f
+
+#define EI_MAG1 1
+#define ELFMAG1 'E'
+
+#define EI_MAG2 2
+#define ELFMAG2 'L'
+
+#define EI_MAG3 3
+#define ELFMAG3 'F'
+
+
+#define ELFMAG "\177ELF"
+#define SELFMAG 4
+
+#define EI_CLASS 4
+#define ELFCLASSNONE 0
+#define ELFCLASS32 1
+#define ELFCLASS64 2
+#define ELFCLASSNUM 3
+
+#define EI_DATA 5
+#define ELFDATANONE 0
+#define ELFDATA2LSB 1
+#define ELFDATA2MSB 2
+#define ELFDATANUM 3
+
+#define EI_VERSION 6
+
+
+#define EI_OSABI 7
+#define ELFOSABI_NONE 0
+#define ELFOSABI_SYSV 0
+#define ELFOSABI_HPUX 1
+#define ELFOSABI_NETBSD 2
+#define ELFOSABI_LINUX 3
+#define ELFOSABI_GNU 3
+#define ELFOSABI_SOLARIS 6
+#define ELFOSABI_AIX 7
+#define ELFOSABI_IRIX 8
+#define ELFOSABI_FREEBSD 9
+#define ELFOSABI_TRU64 10
+#define ELFOSABI_MODESTO 11
+#define ELFOSABI_OPENBSD 12
+#define ELFOSABI_ARM 97
+#define ELFOSABI_STANDALONE 255
+
+#define EI_ABIVERSION 8
+
+#define EI_PAD 9
+
+
+
+#define ET_NONE 0
+#define ET_REL 1
+#define ET_EXEC 2
+#define ET_DYN 3
+#define ET_CORE 4
+#define ET_NUM 5
+#define ET_LOOS 0xfe00
+#define ET_HIOS 0xfeff
+#define ET_LOPROC 0xff00
+#define ET_HIPROC 0xffff
+
+
+
+#define EM_NONE 0
+#define EM_M32 1
+#define EM_SPARC 2
+#define EM_386 3
+#define EM_68K 4
+#define EM_88K 5
+#define EM_860 7
+#define EM_MIPS 8
+#define EM_S370 9
+#define EM_MIPS_RS3_LE 10
+
+#define EM_PARISC 15
+#define EM_VPP500 17
+#define EM_SPARC32PLUS 18
+#define EM_960 19
+#define EM_PPC 20
+#define EM_PPC64 21
+#define EM_S390 22
+
+#define EM_V800 36
+#define EM_FR20 37
+#define EM_RH32 38
+#define EM_RCE 39
+#define EM_ARM 40
+#define EM_FAKE_ALPHA 41
+#define EM_SH 42
+#define EM_SPARCV9 43
+#define EM_TRICORE 44
+#define EM_ARC 45
+#define EM_H8_300 46
+#define EM_H8_300H 47
+#define EM_H8S 48
+#define EM_H8_500 49
+#define EM_IA_64 50
+#define EM_MIPS_X 51
+#define EM_COLDFIRE 52
+#define EM_68HC12 53
+#define EM_MMA 54
+#define EM_PCP 55
+#define EM_NCPU 56
+#define EM_NDR1 57
+#define EM_STARCORE 58
+#define EM_ME16 59
+#define EM_ST100 60
+#define EM_TINYJ 61
+#define EM_X86_64 62
+#define EM_PDSP 63
+
+#define EM_FX66 66
+#define EM_ST9PLUS 67
+#define EM_ST7 68
+#define EM_68HC16 69
+#define EM_68HC11 70
+#define EM_68HC08 71
+#define EM_68HC05 72
+#define EM_SVX 73
+#define EM_ST19 74
+#define EM_VAX 75
+#define EM_CRIS 76
+#define EM_JAVELIN 77
+#define EM_FIREPATH 78
+#define EM_ZSP 79
+#define EM_MMIX 80
+#define EM_HUANY 81
+#define EM_PRISM 82
+#define EM_AVR 83
+#define EM_FR30 84
+#define EM_D10V 85
+#define EM_D30V 86
+#define EM_V850 87
+#define EM_M32R 88
+#define EM_MN10300 89
+#define EM_MN10200 90
+#define EM_PJ 91
+#define EM_OR1K 92
+#define EM_OPENRISC 92
+#define EM_ARC_A5 93
+#define EM_ARC_COMPACT 93
+#define EM_XTENSA 94
+#define EM_VIDEOCORE 95
+#define EM_TMM_GPP 96
+#define EM_NS32K 97
+#define EM_TPC 98
+#define EM_SNP1K 99
+#define EM_ST200 100
+#define EM_IP2K 101
+#define EM_MAX 102
+#define EM_CR 103
+#define EM_F2MC16 104
+#define EM_MSP430 105
+#define EM_BLACKFIN 106
+#define EM_SE_C33 107
+#define EM_SEP 108
+#define EM_ARCA 109
+#define EM_UNICORE 110
+#define EM_EXCESS 111
+#define EM_DXP 112
+#define EM_ALTERA_NIOS2 113
+#define EM_CRX 114
+#define EM_XGATE 115
+#define EM_C166 116
+#define EM_M16C 117
+#define EM_DSPIC30F 118
+#define EM_CE 119
+#define EM_M32C 120
+#define EM_TSK3000 131
+#define EM_RS08 132
+#define EM_SHARC 133
+#define EM_ECOG2 134
+#define EM_SCORE7 135
+#define EM_DSP24 136
+#define EM_VIDEOCORE3 137
+#define EM_LATTICEMICO32 138
+#define EM_SE_C17 139
+#define EM_TI_C6000 140
+#define EM_TI_C2000 141
+#define EM_TI_C5500 142
+#define EM_TI_ARP32 143
+#define EM_TI_PRU 144
+#define EM_MMDSP_PLUS 160
+#define EM_CYPRESS_M8C 161
+#define EM_R32C 162
+#define EM_TRIMEDIA 163
+#define EM_QDSP6 164
+#define EM_8051 165
+#define EM_STXP7X 166
+#define EM_NDS32 167
+#define EM_ECOG1X 168
+#define EM_MAXQ30 169
+#define EM_XIMO16 170
+#define EM_MANIK 171
+#define EM_CRAYNV2 172
+#define EM_RX 173
+#define EM_METAG 174
+#define EM_MCST_ELBRUS 175
+#define EM_ECOG16 176
+#define EM_CR16 177
+#define EM_ETPU 178
+#define EM_SLE9X 179
+#define EM_L10M 180
+#define EM_K10M 181
+#define EM_AARCH64 183
+#define EM_AVR32 185
+#define EM_STM8 186
+#define EM_TILE64 187
+#define EM_TILEPRO 188
+#define EM_MICROBLAZE 189
+#define EM_CUDA 190
+#define EM_TILEGX 191
+#define EM_CLOUDSHIELD 192
+#define EM_COREA_1ST 193
+#define EM_COREA_2ND 194
+#define EM_ARC_COMPACT2 195
+#define EM_OPEN8 196
+#define EM_RL78 197
+#define EM_VIDEOCORE5 198
+#define EM_78KOR 199
+#define EM_56800EX 200
+#define EM_BA1 201
+#define EM_BA2 202
+#define EM_XCORE 203
+#define EM_MCHP_PIC 204
+#define EM_KM32 210
+#define EM_KMX32 211
+#define EM_EMX16 212
+#define EM_EMX8 213
+#define EM_KVARC 214
+#define EM_CDP 215
+#define EM_COGE 216
+#define EM_COOL 217
+#define EM_NORC 218
+#define EM_CSR_KALIMBA 219
+#define EM_Z80 220
+#define EM_VISIUM 221
+#define EM_FT32 222
+#define EM_MOXIE 223
+#define EM_AMDGPU 224
+#define EM_RISCV 243
+#define EM_BPF 247
+#define EM_CSKY 252
+#define EM_NUM 253
+
+#define EM_ALPHA 0x9026
+
+#define EV_NONE 0
+#define EV_CURRENT 1
+#define EV_NUM 2
+
+typedef struct {
+ Elf32_Word sh_name;
+ Elf32_Word sh_type;
+ Elf32_Word sh_flags;
+ Elf32_Addr sh_addr;
+ Elf32_Off sh_offset;
+ Elf32_Word sh_size;
+ Elf32_Word sh_link;
+ Elf32_Word sh_info;
+ Elf32_Word sh_addralign;
+ Elf32_Word sh_entsize;
+} Elf32_Shdr;
+
+typedef struct {
+ Elf64_Word sh_name;
+ Elf64_Word sh_type;
+ Elf64_Xword sh_flags;
+ Elf64_Addr sh_addr;
+ Elf64_Off sh_offset;
+ Elf64_Xword sh_size;
+ Elf64_Word sh_link;
+ Elf64_Word sh_info;
+ Elf64_Xword sh_addralign;
+ Elf64_Xword sh_entsize;
+} Elf64_Shdr;
+
+
+
+#define SHN_UNDEF 0
+#define SHN_LORESERVE 0xff00
+#define SHN_LOPROC 0xff00
+#define SHN_BEFORE 0xff00
+
+#define SHN_AFTER 0xff01
+
+#define SHN_HIPROC 0xff1f
+#define SHN_LOOS 0xff20
+#define SHN_HIOS 0xff3f
+#define SHN_ABS 0xfff1
+#define SHN_COMMON 0xfff2
+#define SHN_XINDEX 0xffff
+#define SHN_HIRESERVE 0xffff
+
+
+
+#define SHT_NULL 0
+#define SHT_PROGBITS 1
+#define SHT_SYMTAB 2
+#define SHT_STRTAB 3
+#define SHT_RELA 4
+#define SHT_HASH 5
+#define SHT_DYNAMIC 6
+#define SHT_NOTE 7
+#define SHT_NOBITS 8
+#define SHT_REL 9
+#define SHT_SHLIB 10
+#define SHT_DYNSYM 11
+#define SHT_INIT_ARRAY 14
+#define SHT_FINI_ARRAY 15
+#define SHT_PREINIT_ARRAY 16
+#define SHT_GROUP 17
+#define SHT_SYMTAB_SHNDX 18
+#define SHT_NUM 19
+#define SHT_LOOS 0x60000000
+#define SHT_GNU_ATTRIBUTES 0x6ffffff5
+#define SHT_GNU_HASH 0x6ffffff6
+#define SHT_GNU_LIBLIST 0x6ffffff7
+#define SHT_CHECKSUM 0x6ffffff8
+#define SHT_LOSUNW 0x6ffffffa
+#define SHT_SUNW_move 0x6ffffffa
+#define SHT_SUNW_COMDAT 0x6ffffffb
+#define SHT_SUNW_syminfo 0x6ffffffc
+#define SHT_GNU_verdef 0x6ffffffd
+#define SHT_GNU_verneed 0x6ffffffe
+#define SHT_GNU_versym 0x6fffffff
+#define SHT_HISUNW 0x6fffffff
+#define SHT_HIOS 0x6fffffff
+#define SHT_LOPROC 0x70000000
+#define SHT_HIPROC 0x7fffffff
+#define SHT_LOUSER 0x80000000
+#define SHT_HIUSER 0x8fffffff
+
+#define SHF_WRITE (1 << 0)
+#define SHF_ALLOC (1 << 1)
+#define SHF_EXECINSTR (1 << 2)
+#define SHF_MERGE (1 << 4)
+#define SHF_STRINGS (1 << 5)
+#define SHF_INFO_LINK (1 << 6)
+#define SHF_LINK_ORDER (1 << 7)
+#define SHF_OS_NONCONFORMING (1 << 8)
+
+#define SHF_GROUP (1 << 9)
+#define SHF_TLS (1 << 10)
+#define SHF_COMPRESSED (1 << 11)
+#define SHF_MASKOS 0x0ff00000
+#define SHF_MASKPROC 0xf0000000
+#define SHF_ORDERED (1 << 30)
+#define SHF_EXCLUDE (1U << 31)
+
+typedef struct {
+ Elf32_Word ch_type;
+ Elf32_Word ch_size;
+ Elf32_Word ch_addralign;
+} Elf32_Chdr;
+
+typedef struct {
+ Elf64_Word ch_type;
+ Elf64_Word ch_reserved;
+ Elf64_Xword ch_size;
+ Elf64_Xword ch_addralign;
+} Elf64_Chdr;
+
+#define ELFCOMPRESS_ZLIB 1
+#define ELFCOMPRESS_LOOS 0x60000000
+#define ELFCOMPRESS_HIOS 0x6fffffff
+#define ELFCOMPRESS_LOPROC 0x70000000
+#define ELFCOMPRESS_HIPROC 0x7fffffff
+
+
+#define GRP_COMDAT 0x1
+
+typedef struct {
+ Elf32_Word st_name;
+ Elf32_Addr st_value;
+ Elf32_Word st_size;
+ unsigned char st_info;
+ unsigned char st_other;
+ Elf32_Section st_shndx;
+} Elf32_Sym;
+
+typedef struct {
+ Elf64_Word st_name;
+ unsigned char st_info;
+ unsigned char st_other;
+ Elf64_Section st_shndx;
+ Elf64_Addr st_value;
+ Elf64_Xword st_size;
+} Elf64_Sym;
+
+typedef struct {
+ Elf32_Half si_boundto;
+ Elf32_Half si_flags;
+} Elf32_Syminfo;
+
+typedef struct {
+ Elf64_Half si_boundto;
+ Elf64_Half si_flags;
+} Elf64_Syminfo;
+
+#define SYMINFO_BT_SELF 0xffff
+#define SYMINFO_BT_PARENT 0xfffe
+#define SYMINFO_BT_LOWRESERVE 0xff00
+
+#define SYMINFO_FLG_DIRECT 0x0001
+#define SYMINFO_FLG_PASSTHRU 0x0002
+#define SYMINFO_FLG_COPY 0x0004
+#define SYMINFO_FLG_LAZYLOAD 0x0008
+
+#define SYMINFO_NONE 0
+#define SYMINFO_CURRENT 1
+#define SYMINFO_NUM 2
+
+#define ELF32_ST_BIND(val) (((unsigned char) (val)) >> 4)
+#define ELF32_ST_TYPE(val) ((val) & 0xf)
+#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
+
+#define ELF64_ST_BIND(val) ELF32_ST_BIND (val)
+#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val)
+#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO ((bind), (type))
+
+#define STB_LOCAL 0
+#define STB_GLOBAL 1
+#define STB_WEAK 2
+#define STB_NUM 3
+#define STB_LOOS 10
+#define STB_GNU_UNIQUE 10
+#define STB_HIOS 12
+#define STB_LOPROC 13
+#define STB_HIPROC 15
+
+#define STT_NOTYPE 0
+#define STT_OBJECT 1
+#define STT_FUNC 2
+#define STT_SECTION 3
+#define STT_FILE 4
+#define STT_COMMON 5
+#define STT_TLS 6
+#define STT_NUM 7
+#define STT_LOOS 10
+#define STT_GNU_IFUNC 10
+#define STT_HIOS 12
+#define STT_LOPROC 13
+#define STT_HIPROC 15
+
+#define STN_UNDEF 0
+
+#define ELF32_ST_VISIBILITY(o) ((o) & 0x03)
+#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o)
+
+#define STV_DEFAULT 0
+#define STV_INTERNAL 1
+#define STV_HIDDEN 2
+#define STV_PROTECTED 3
+
+
+
+
+typedef struct {
+ Elf32_Addr r_offset;
+ Elf32_Word r_info;
+} Elf32_Rel;
+
+typedef struct {
+ Elf64_Addr r_offset;
+ Elf64_Xword r_info;
+} Elf64_Rel;
+
+
+
+typedef struct {
+ Elf32_Addr r_offset;
+ Elf32_Word r_info;
+ Elf32_Sword r_addend;
+} Elf32_Rela;
+
+typedef struct {
+ Elf64_Addr r_offset;
+ Elf64_Xword r_info;
+ Elf64_Sxword r_addend;
+} Elf64_Rela;
+
+
+
+#define ELF32_R_SYM(val) ((val) >> 8)
+#define ELF32_R_TYPE(val) ((val) & 0xff)
+#define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff))
+
+#define ELF64_R_SYM(i) ((i) >> 32)
+#define ELF64_R_TYPE(i) ((i) & 0xffffffff)
+#define ELF64_R_INFO(sym,type) ((((Elf64_Xword) (sym)) << 32) + (type))
+
+
+
+typedef struct {
+ Elf32_Word p_type;
+ Elf32_Off p_offset;
+ Elf32_Addr p_vaddr;
+ Elf32_Addr p_paddr;
+ Elf32_Word p_filesz;
+ Elf32_Word p_memsz;
+ Elf32_Word p_flags;
+ Elf32_Word p_align;
+} Elf32_Phdr;
+
+typedef struct {
+ Elf64_Word p_type;
+ Elf64_Word p_flags;
+ Elf64_Off p_offset;
+ Elf64_Addr p_vaddr;
+ Elf64_Addr p_paddr;
+ Elf64_Xword p_filesz;
+ Elf64_Xword p_memsz;
+ Elf64_Xword p_align;
+} Elf64_Phdr;
+
+
+
+#define PT_NULL 0
+#define PT_LOAD 1
+#define PT_DYNAMIC 2
+#define PT_INTERP 3
+#define PT_NOTE 4
+#define PT_SHLIB 5
+#define PT_PHDR 6
+#define PT_TLS 7
+#define PT_NUM 8
+#define PT_LOOS 0x60000000
+#define PT_GNU_EH_FRAME 0x6474e550
+#define PT_GNU_STACK 0x6474e551
+#define PT_GNU_RELRO 0x6474e552
+#define PT_GNU_PROPERTY 0x6474e553
+#define PT_LOSUNW 0x6ffffffa
+#define PT_SUNWBSS 0x6ffffffa
+#define PT_SUNWSTACK 0x6ffffffb
+#define PT_HISUNW 0x6fffffff
+#define PT_HIOS 0x6fffffff
+#define PT_LOPROC 0x70000000
+#define PT_HIPROC 0x7fffffff
+
+
+#define PN_XNUM 0xffff
+
+
+#define PF_X (1 << 0)
+#define PF_W (1 << 1)
+#define PF_R (1 << 2)
+#define PF_MASKOS 0x0ff00000
+#define PF_MASKPROC 0xf0000000
+
+
+
+#define NT_PRSTATUS 1
+#define NT_PRFPREG 2
+#define NT_FPREGSET 2
+#define NT_PRPSINFO 3
+#define NT_PRXREG 4
+#define NT_TASKSTRUCT 4
+#define NT_PLATFORM 5
+#define NT_AUXV 6
+#define NT_GWINDOWS 7
+#define NT_ASRS 8
+#define NT_PSTATUS 10
+#define NT_PSINFO 13
+#define NT_PRCRED 14
+#define NT_UTSNAME 15
+#define NT_LWPSTATUS 16
+#define NT_LWPSINFO 17
+#define NT_PRFPXREG 20
+#define NT_SIGINFO 0x53494749
+#define NT_FILE 0x46494c45
+#define NT_PRXFPREG 0x46e62b7f
+#define NT_PPC_VMX 0x100
+#define NT_PPC_SPE 0x101
+#define NT_PPC_VSX 0x102
+#define NT_PPC_TAR 0x103
+#define NT_PPC_PPR 0x104
+#define NT_PPC_DSCR 0x105
+#define NT_PPC_EBB 0x106
+#define NT_PPC_PMU 0x107
+#define NT_PPC_TM_CGPR 0x108
+#define NT_PPC_TM_CFPR 0x109
+#define NT_PPC_TM_CVMX 0x10a
+#define NT_PPC_TM_CVSX 0x10b
+#define NT_PPC_TM_SPR 0x10c
+#define NT_PPC_TM_CTAR 0x10d
+#define NT_PPC_TM_CPPR 0x10e
+#define NT_PPC_TM_CDSCR 0x10f
+#define NT_386_TLS 0x200
+#define NT_386_IOPERM 0x201
+#define NT_X86_XSTATE 0x202
+#define NT_S390_HIGH_GPRS 0x300
+#define NT_S390_TIMER 0x301
+#define NT_S390_TODCMP 0x302
+#define NT_S390_TODPREG 0x303
+#define NT_S390_CTRS 0x304
+#define NT_S390_PREFIX 0x305
+#define NT_S390_LAST_BREAK 0x306
+#define NT_S390_SYSTEM_CALL 0x307
+#define NT_S390_TDB 0x308
+#define NT_S390_VXRS_LOW 0x309
+#define NT_S390_VXRS_HIGH 0x30a
+#define NT_S390_GS_CB 0x30b
+#define NT_S390_GS_BC 0x30c
+#define NT_S390_RI_CB 0x30d
+#define NT_ARM_VFP 0x400
+#define NT_ARM_TLS 0x401
+#define NT_ARM_HW_BREAK 0x402
+#define NT_ARM_HW_WATCH 0x403
+#define NT_ARM_SYSTEM_CALL 0x404
+#define NT_ARM_SVE 0x405
+#define NT_ARM_PAC_MASK 0x406
+#define NT_ARM_PACA_KEYS 0x407
+#define NT_ARM_PACG_KEYS 0x408
+#define NT_ARM_TAGGED_ADDR_CTRL 0x409
+#define NT_ARM_PAC_ENABLED_KEYS 0x40a
+#define NT_METAG_CBUF 0x500
+#define NT_METAG_RPIPE 0x501
+#define NT_METAG_TLS 0x502
+#define NT_ARC_V2 0x600
+#define NT_VMCOREDD 0x700
+#define NT_MIPS_DSP 0x800
+#define NT_MIPS_FP_MODE 0x801
+#define NT_MIPS_MSA 0x802
+#define NT_VERSION 1
+
+
+
+
+typedef struct {
+ Elf32_Sword d_tag;
+ union {
+ Elf32_Word d_val;
+ Elf32_Addr d_ptr;
+ } d_un;
+} Elf32_Dyn;
+
+typedef struct {
+ Elf64_Sxword d_tag;
+ union {
+ Elf64_Xword d_val;
+ Elf64_Addr d_ptr;
+ } d_un;
+} Elf64_Dyn;
+
+
+
+#define DT_NULL 0
+#define DT_NEEDED 1
+#define DT_PLTRELSZ 2
+#define DT_PLTGOT 3
+#define DT_HASH 4
+#define DT_STRTAB 5
+#define DT_SYMTAB 6
+#define DT_RELA 7
+#define DT_RELASZ 8
+#define DT_RELAENT 9
+#define DT_STRSZ 10
+#define DT_SYMENT 11
+#define DT_INIT 12
+#define DT_FINI 13
+#define DT_SONAME 14
+#define DT_RPATH 15
+#define DT_SYMBOLIC 16
+#define DT_REL 17
+#define DT_RELSZ 18
+#define DT_RELENT 19
+#define DT_PLTREL 20
+#define DT_DEBUG 21
+#define DT_TEXTREL 22
+#define DT_JMPREL 23
+#define DT_BIND_NOW 24
+#define DT_INIT_ARRAY 25
+#define DT_FINI_ARRAY 26
+#define DT_INIT_ARRAYSZ 27
+#define DT_FINI_ARRAYSZ 28
+#define DT_RUNPATH 29
+#define DT_FLAGS 30
+#define DT_ENCODING 32
+#define DT_PREINIT_ARRAY 32
+#define DT_PREINIT_ARRAYSZ 33
+#define DT_SYMTAB_SHNDX 34
+#define DT_NUM 35
+#define DT_LOOS 0x6000000d
+#define DT_HIOS 0x6ffff000
+#define DT_LOPROC 0x70000000
+#define DT_HIPROC 0x7fffffff
+#define DT_PROCNUM DT_MIPS_NUM
+
+#define DT_VALRNGLO 0x6ffffd00
+#define DT_GNU_PRELINKED 0x6ffffdf5
+#define DT_GNU_CONFLICTSZ 0x6ffffdf6
+#define DT_GNU_LIBLISTSZ 0x6ffffdf7
+#define DT_CHECKSUM 0x6ffffdf8
+#define DT_PLTPADSZ 0x6ffffdf9
+#define DT_MOVEENT 0x6ffffdfa
+#define DT_MOVESZ 0x6ffffdfb
+#define DT_FEATURE_1 0x6ffffdfc
+#define DT_POSFLAG_1 0x6ffffdfd
+
+#define DT_SYMINSZ 0x6ffffdfe
+#define DT_SYMINENT 0x6ffffdff
+#define DT_VALRNGHI 0x6ffffdff
+#define DT_VALTAGIDX(tag) (DT_VALRNGHI - (tag))
+#define DT_VALNUM 12
+
+#define DT_ADDRRNGLO 0x6ffffe00
+#define DT_GNU_HASH 0x6ffffef5
+#define DT_TLSDESC_PLT 0x6ffffef6
+#define DT_TLSDESC_GOT 0x6ffffef7
+#define DT_GNU_CONFLICT 0x6ffffef8
+#define DT_GNU_LIBLIST 0x6ffffef9
+#define DT_CONFIG 0x6ffffefa
+#define DT_DEPAUDIT 0x6ffffefb
+#define DT_AUDIT 0x6ffffefc
+#define DT_PLTPAD 0x6ffffefd
+#define DT_MOVETAB 0x6ffffefe
+#define DT_SYMINFO 0x6ffffeff
+#define DT_ADDRRNGHI 0x6ffffeff
+#define DT_ADDRTAGIDX(tag) (DT_ADDRRNGHI - (tag))
+#define DT_ADDRNUM 11
+
+
+
+#define DT_VERSYM 0x6ffffff0
+
+#define DT_RELACOUNT 0x6ffffff9
+#define DT_RELCOUNT 0x6ffffffa
+
+
+#define DT_FLAGS_1 0x6ffffffb
+#define DT_VERDEF 0x6ffffffc
+
+#define DT_VERDEFNUM 0x6ffffffd
+#define DT_VERNEED 0x6ffffffe
+
+#define DT_VERNEEDNUM 0x6fffffff
+#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag))
+#define DT_VERSIONTAGNUM 16
+
+
+
+#define DT_AUXILIARY 0x7ffffffd
+#define DT_FILTER 0x7fffffff
+#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
+#define DT_EXTRANUM 3
+
+
+#define DF_ORIGIN 0x00000001
+#define DF_SYMBOLIC 0x00000002
+#define DF_TEXTREL 0x00000004
+#define DF_BIND_NOW 0x00000008
+#define DF_STATIC_TLS 0x00000010
+
+
+
+#define DF_1_NOW 0x00000001
+#define DF_1_GLOBAL 0x00000002
+#define DF_1_GROUP 0x00000004
+#define DF_1_NODELETE 0x00000008
+#define DF_1_LOADFLTR 0x00000010
+#define DF_1_INITFIRST 0x00000020
+#define DF_1_NOOPEN 0x00000040
+#define DF_1_ORIGIN 0x00000080
+#define DF_1_DIRECT 0x00000100
+#define DF_1_TRANS 0x00000200
+#define DF_1_INTERPOSE 0x00000400
+#define DF_1_NODEFLIB 0x00000800
+#define DF_1_NODUMP 0x00001000
+#define DF_1_CONFALT 0x00002000
+#define DF_1_ENDFILTEE 0x00004000
+#define DF_1_DISPRELDNE 0x00008000
+#define DF_1_DISPRELPND 0x00010000
+#define DF_1_NODIRECT 0x00020000
+#define DF_1_IGNMULDEF 0x00040000
+#define DF_1_NOKSYMS 0x00080000
+#define DF_1_NOHDR 0x00100000
+#define DF_1_EDITED 0x00200000
+#define DF_1_NORELOC 0x00400000
+#define DF_1_SYMINTPOSE 0x00800000
+#define DF_1_GLOBAUDIT 0x01000000
+#define DF_1_SINGLETON 0x02000000
+#define DF_1_STUB 0x04000000
+#define DF_1_PIE 0x08000000
+
+#define DTF_1_PARINIT 0x00000001
+#define DTF_1_CONFEXP 0x00000002
+
+
+#define DF_P1_LAZYLOAD 0x00000001
+#define DF_P1_GROUPPERM 0x00000002
+
+
+
+
+typedef struct {
+ Elf32_Half vd_version;
+ Elf32_Half vd_flags;
+ Elf32_Half vd_ndx;
+ Elf32_Half vd_cnt;
+ Elf32_Word vd_hash;
+ Elf32_Word vd_aux;
+ Elf32_Word vd_next;
+} Elf32_Verdef;
+
+typedef struct {
+ Elf64_Half vd_version;
+ Elf64_Half vd_flags;
+ Elf64_Half vd_ndx;
+ Elf64_Half vd_cnt;
+ Elf64_Word vd_hash;
+ Elf64_Word vd_aux;
+ Elf64_Word vd_next;
+} Elf64_Verdef;
+
+
+
+#define VER_DEF_NONE 0
+#define VER_DEF_CURRENT 1
+#define VER_DEF_NUM 2
+
+
+#define VER_FLG_BASE 0x1
+#define VER_FLG_WEAK 0x2
+
+
+#define VER_NDX_LOCAL 0
+#define VER_NDX_GLOBAL 1
+#define VER_NDX_LORESERVE 0xff00
+#define VER_NDX_ELIMINATE 0xff01
+
+
+
+typedef struct {
+ Elf32_Word vda_name;
+ Elf32_Word vda_next;
+} Elf32_Verdaux;
+
+typedef struct {
+ Elf64_Word vda_name;
+ Elf64_Word vda_next;
+} Elf64_Verdaux;
+
+
+
+
+typedef struct {
+ Elf32_Half vn_version;
+ Elf32_Half vn_cnt;
+ Elf32_Word vn_file;
+ Elf32_Word vn_aux;
+ Elf32_Word vn_next;
+} Elf32_Verneed;
+
+typedef struct {
+ Elf64_Half vn_version;
+ Elf64_Half vn_cnt;
+ Elf64_Word vn_file;
+ Elf64_Word vn_aux;
+ Elf64_Word vn_next;
+} Elf64_Verneed;
+
+
+
+#define VER_NEED_NONE 0
+#define VER_NEED_CURRENT 1
+#define VER_NEED_NUM 2
+
+
+
+typedef struct {
+ Elf32_Word vna_hash;
+ Elf32_Half vna_flags;
+ Elf32_Half vna_other;
+ Elf32_Word vna_name;
+ Elf32_Word vna_next;
+} Elf32_Vernaux;
+
+typedef struct {
+ Elf64_Word vna_hash;
+ Elf64_Half vna_flags;
+ Elf64_Half vna_other;
+ Elf64_Word vna_name;
+ Elf64_Word vna_next;
+} Elf64_Vernaux;
+
+
+
+#define VER_FLG_WEAK 0x2
+
+
+
+typedef struct {
+ uint32_t a_type;
+ union {
+ uint32_t a_val;
+ } a_un;
+} Elf32_auxv_t;
+
+typedef struct {
+ uint64_t a_type;
+ union {
+ uint64_t a_val;
+ } a_un;
+} Elf64_auxv_t;
+
+
+
+#define AT_NULL 0
+#define AT_IGNORE 1
+#define AT_EXECFD 2
+#define AT_PHDR 3
+#define AT_PHENT 4
+#define AT_PHNUM 5
+#define AT_PAGESZ 6
+#define AT_BASE 7
+#define AT_FLAGS 8
+#define AT_ENTRY 9
+#define AT_NOTELF 10
+#define AT_UID 11
+#define AT_EUID 12
+#define AT_GID 13
+#define AT_EGID 14
+#define AT_CLKTCK 17
+
+
+#define AT_PLATFORM 15
+#define AT_HWCAP 16
+
+
+
+
+#define AT_FPUCW 18
+
+
+#define AT_DCACHEBSIZE 19
+#define AT_ICACHEBSIZE 20
+#define AT_UCACHEBSIZE 21
+
+
+
+#define AT_IGNOREPPC 22
+
+#define AT_SECURE 23
+
+#define AT_BASE_PLATFORM 24
+
+#define AT_RANDOM 25
+
+#define AT_HWCAP2 26
+
+#define AT_EXECFN 31
+
+
+
+#define AT_SYSINFO 32
+#define AT_SYSINFO_EHDR 33
+
+
+
+#define AT_L1I_CACHESHAPE 34
+#define AT_L1D_CACHESHAPE 35
+#define AT_L2_CACHESHAPE 36
+#define AT_L3_CACHESHAPE 37
+
+#define AT_L1I_CACHESIZE 40
+#define AT_L1I_CACHEGEOMETRY 41
+#define AT_L1D_CACHESIZE 42
+#define AT_L1D_CACHEGEOMETRY 43
+#define AT_L2_CACHESIZE 44
+#define AT_L2_CACHEGEOMETRY 45
+#define AT_L3_CACHESIZE 46
+#define AT_L3_CACHEGEOMETRY 47
+
+#define AT_MINSIGSTKSZ 51
+
+
+typedef struct {
+ Elf32_Word n_namesz;
+ Elf32_Word n_descsz;
+ Elf32_Word n_type;
+} Elf32_Nhdr;
+
+typedef struct {
+ Elf64_Word n_namesz;
+ Elf64_Word n_descsz;
+ Elf64_Word n_type;
+} Elf64_Nhdr;
+
+
+
+
+#define ELF_NOTE_SOLARIS "SUNW Solaris"
+
+
+#define ELF_NOTE_GNU "GNU"
+
+
+
+
+
+#define ELF_NOTE_PAGESIZE_HINT 1
+
+
+#define NT_GNU_ABI_TAG 1
+#define ELF_NOTE_ABI NT_GNU_ABI_TAG
+
+
+
+#define ELF_NOTE_OS_LINUX 0
+#define ELF_NOTE_OS_GNU 1
+#define ELF_NOTE_OS_SOLARIS2 2
+#define ELF_NOTE_OS_FREEBSD 3
+
+#define NT_GNU_BUILD_ID 3
+#define NT_GNU_GOLD_VERSION 4
+#define NT_GNU_PROPERTY_TYPE_0 5
+
+
+
+typedef struct {
+ Elf32_Xword m_value;
+ Elf32_Word m_info;
+ Elf32_Word m_poffset;
+ Elf32_Half m_repeat;
+ Elf32_Half m_stride;
+} Elf32_Move;
+
+typedef struct {
+ Elf64_Xword m_value;
+ Elf64_Xword m_info;
+ Elf64_Xword m_poffset;
+ Elf64_Half m_repeat;
+ Elf64_Half m_stride;
+} Elf64_Move;
+
+
+#define ELF32_M_SYM(info) ((info) >> 8)
+#define ELF32_M_SIZE(info) ((unsigned char) (info))
+#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size))
+
+#define ELF64_M_SYM(info) ELF32_M_SYM (info)
+#define ELF64_M_SIZE(info) ELF32_M_SIZE (info)
+#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size)
+
+#define EF_CPU32 0x00810000
+
+#define R_68K_NONE 0
+#define R_68K_32 1
+#define R_68K_16 2
+#define R_68K_8 3
+#define R_68K_PC32 4
+#define R_68K_PC16 5
+#define R_68K_PC8 6
+#define R_68K_GOT32 7
+#define R_68K_GOT16 8
+#define R_68K_GOT8 9
+#define R_68K_GOT32O 10
+#define R_68K_GOT16O 11
+#define R_68K_GOT8O 12
+#define R_68K_PLT32 13
+#define R_68K_PLT16 14
+#define R_68K_PLT8 15
+#define R_68K_PLT32O 16
+#define R_68K_PLT16O 17
+#define R_68K_PLT8O 18
+#define R_68K_COPY 19
+#define R_68K_GLOB_DAT 20
+#define R_68K_JMP_SLOT 21
+#define R_68K_RELATIVE 22
+#define R_68K_TLS_GD32 25
+#define R_68K_TLS_GD16 26
+#define R_68K_TLS_GD8 27
+#define R_68K_TLS_LDM32 28
+#define R_68K_TLS_LDM16 29
+#define R_68K_TLS_LDM8 30
+#define R_68K_TLS_LDO32 31
+#define R_68K_TLS_LDO16 32
+#define R_68K_TLS_LDO8 33
+#define R_68K_TLS_IE32 34
+#define R_68K_TLS_IE16 35
+#define R_68K_TLS_IE8 36
+#define R_68K_TLS_LE32 37
+#define R_68K_TLS_LE16 38
+#define R_68K_TLS_LE8 39
+#define R_68K_TLS_DTPMOD32 40
+#define R_68K_TLS_DTPREL32 41
+#define R_68K_TLS_TPREL32 42
+#define R_68K_NUM 43
+
+#define R_386_NONE 0
+#define R_386_32 1
+#define R_386_PC32 2
+#define R_386_GOT32 3
+#define R_386_PLT32 4
+#define R_386_COPY 5
+#define R_386_GLOB_DAT 6
+#define R_386_JMP_SLOT 7
+#define R_386_RELATIVE 8
+#define R_386_GOTOFF 9
+#define R_386_GOTPC 10
+#define R_386_32PLT 11
+#define R_386_TLS_TPOFF 14
+#define R_386_TLS_IE 15
+#define R_386_TLS_GOTIE 16
+#define R_386_TLS_LE 17
+#define R_386_TLS_GD 18
+#define R_386_TLS_LDM 19
+#define R_386_16 20
+#define R_386_PC16 21
+#define R_386_8 22
+#define R_386_PC8 23
+#define R_386_TLS_GD_32 24
+#define R_386_TLS_GD_PUSH 25
+#define R_386_TLS_GD_CALL 26
+#define R_386_TLS_GD_POP 27
+#define R_386_TLS_LDM_32 28
+#define R_386_TLS_LDM_PUSH 29
+#define R_386_TLS_LDM_CALL 30
+#define R_386_TLS_LDM_POP 31
+#define R_386_TLS_LDO_32 32
+#define R_386_TLS_IE_32 33
+#define R_386_TLS_LE_32 34
+#define R_386_TLS_DTPMOD32 35
+#define R_386_TLS_DTPOFF32 36
+#define R_386_TLS_TPOFF32 37
+#define R_386_SIZE32 38
+#define R_386_TLS_GOTDESC 39
+#define R_386_TLS_DESC_CALL 40
+#define R_386_TLS_DESC 41
+#define R_386_IRELATIVE 42
+#define R_386_GOT32X 43
+#define R_386_NUM 44
+
+
+
+
+
+#define STT_SPARC_REGISTER 13
+
+
+
+#define EF_SPARCV9_MM 3
+#define EF_SPARCV9_TSO 0
+#define EF_SPARCV9_PSO 1
+#define EF_SPARCV9_RMO 2
+#define EF_SPARC_LEDATA 0x800000
+#define EF_SPARC_EXT_MASK 0xFFFF00
+#define EF_SPARC_32PLUS 0x000100
+#define EF_SPARC_SUN_US1 0x000200
+#define EF_SPARC_HAL_R1 0x000400
+#define EF_SPARC_SUN_US3 0x000800
+
+
+
+#define R_SPARC_NONE 0
+#define R_SPARC_8 1
+#define R_SPARC_16 2
+#define R_SPARC_32 3
+#define R_SPARC_DISP8 4
+#define R_SPARC_DISP16 5
+#define R_SPARC_DISP32 6
+#define R_SPARC_WDISP30 7
+#define R_SPARC_WDISP22 8
+#define R_SPARC_HI22 9
+#define R_SPARC_22 10
+#define R_SPARC_13 11
+#define R_SPARC_LO10 12
+#define R_SPARC_GOT10 13
+#define R_SPARC_GOT13 14
+#define R_SPARC_GOT22 15
+#define R_SPARC_PC10 16
+#define R_SPARC_PC22 17
+#define R_SPARC_WPLT30 18
+#define R_SPARC_COPY 19
+#define R_SPARC_GLOB_DAT 20
+#define R_SPARC_JMP_SLOT 21
+#define R_SPARC_RELATIVE 22
+#define R_SPARC_UA32 23
+
+
+
+#define R_SPARC_PLT32 24
+#define R_SPARC_HIPLT22 25
+#define R_SPARC_LOPLT10 26
+#define R_SPARC_PCPLT32 27
+#define R_SPARC_PCPLT22 28
+#define R_SPARC_PCPLT10 29
+#define R_SPARC_10 30
+#define R_SPARC_11 31
+#define R_SPARC_64 32
+#define R_SPARC_OLO10 33
+#define R_SPARC_HH22 34
+#define R_SPARC_HM10 35
+#define R_SPARC_LM22 36
+#define R_SPARC_PC_HH22 37
+#define R_SPARC_PC_HM10 38
+#define R_SPARC_PC_LM22 39
+#define R_SPARC_WDISP16 40
+#define R_SPARC_WDISP19 41
+#define R_SPARC_GLOB_JMP 42
+#define R_SPARC_7 43
+#define R_SPARC_5 44
+#define R_SPARC_6 45
+#define R_SPARC_DISP64 46
+#define R_SPARC_PLT64 47
+#define R_SPARC_HIX22 48
+#define R_SPARC_LOX10 49
+#define R_SPARC_H44 50
+#define R_SPARC_M44 51
+#define R_SPARC_L44 52
+#define R_SPARC_REGISTER 53
+#define R_SPARC_UA64 54
+#define R_SPARC_UA16 55
+#define R_SPARC_TLS_GD_HI22 56
+#define R_SPARC_TLS_GD_LO10 57
+#define R_SPARC_TLS_GD_ADD 58
+#define R_SPARC_TLS_GD_CALL 59
+#define R_SPARC_TLS_LDM_HI22 60
+#define R_SPARC_TLS_LDM_LO10 61
+#define R_SPARC_TLS_LDM_ADD 62
+#define R_SPARC_TLS_LDM_CALL 63
+#define R_SPARC_TLS_LDO_HIX22 64
+#define R_SPARC_TLS_LDO_LOX10 65
+#define R_SPARC_TLS_LDO_ADD 66
+#define R_SPARC_TLS_IE_HI22 67
+#define R_SPARC_TLS_IE_LO10 68
+#define R_SPARC_TLS_IE_LD 69
+#define R_SPARC_TLS_IE_LDX 70
+#define R_SPARC_TLS_IE_ADD 71
+#define R_SPARC_TLS_LE_HIX22 72
+#define R_SPARC_TLS_LE_LOX10 73
+#define R_SPARC_TLS_DTPMOD32 74
+#define R_SPARC_TLS_DTPMOD64 75
+#define R_SPARC_TLS_DTPOFF32 76
+#define R_SPARC_TLS_DTPOFF64 77
+#define R_SPARC_TLS_TPOFF32 78
+#define R_SPARC_TLS_TPOFF64 79
+#define R_SPARC_GOTDATA_HIX22 80
+#define R_SPARC_GOTDATA_LOX10 81
+#define R_SPARC_GOTDATA_OP_HIX22 82
+#define R_SPARC_GOTDATA_OP_LOX10 83
+#define R_SPARC_GOTDATA_OP 84
+#define R_SPARC_H34 85
+#define R_SPARC_SIZE32 86
+#define R_SPARC_SIZE64 87
+#define R_SPARC_GNU_VTINHERIT 250
+#define R_SPARC_GNU_VTENTRY 251
+#define R_SPARC_REV32 252
+
+#define R_SPARC_NUM 253
+
+
+
+#define DT_SPARC_REGISTER 0x70000001
+#define DT_SPARC_NUM 2
+
+
+#define EF_MIPS_NOREORDER 1
+#define EF_MIPS_PIC 2
+#define EF_MIPS_CPIC 4
+#define EF_MIPS_XGOT 8
+#define EF_MIPS_64BIT_WHIRL 16
+#define EF_MIPS_ABI2 32
+#define EF_MIPS_ABI_ON32 64
+#define EF_MIPS_FP64 512
+#define EF_MIPS_NAN2008 1024
+#define EF_MIPS_ARCH 0xf0000000
+
+
+
+#define EF_MIPS_ARCH_1 0x00000000
+#define EF_MIPS_ARCH_2 0x10000000
+#define EF_MIPS_ARCH_3 0x20000000
+#define EF_MIPS_ARCH_4 0x30000000
+#define EF_MIPS_ARCH_5 0x40000000
+#define EF_MIPS_ARCH_32 0x50000000
+#define EF_MIPS_ARCH_64 0x60000000
+#define EF_MIPS_ARCH_32R2 0x70000000
+#define EF_MIPS_ARCH_64R2 0x80000000
+
+
+#define E_MIPS_ARCH_1 0x00000000
+#define E_MIPS_ARCH_2 0x10000000
+#define E_MIPS_ARCH_3 0x20000000
+#define E_MIPS_ARCH_4 0x30000000
+#define E_MIPS_ARCH_5 0x40000000
+#define E_MIPS_ARCH_32 0x50000000
+#define E_MIPS_ARCH_64 0x60000000
+
+
+
+#define SHN_MIPS_ACOMMON 0xff00
+#define SHN_MIPS_TEXT 0xff01
+#define SHN_MIPS_DATA 0xff02
+#define SHN_MIPS_SCOMMON 0xff03
+#define SHN_MIPS_SUNDEFINED 0xff04
+
+
+
+#define SHT_MIPS_LIBLIST 0x70000000
+#define SHT_MIPS_MSYM 0x70000001
+#define SHT_MIPS_CONFLICT 0x70000002
+#define SHT_MIPS_GPTAB 0x70000003
+#define SHT_MIPS_UCODE 0x70000004
+#define SHT_MIPS_DEBUG 0x70000005
+#define SHT_MIPS_REGINFO 0x70000006
+#define SHT_MIPS_PACKAGE 0x70000007
+#define SHT_MIPS_PACKSYM 0x70000008
+#define SHT_MIPS_RELD 0x70000009
+#define SHT_MIPS_IFACE 0x7000000b
+#define SHT_MIPS_CONTENT 0x7000000c
+#define SHT_MIPS_OPTIONS 0x7000000d
+#define SHT_MIPS_SHDR 0x70000010
+#define SHT_MIPS_FDESC 0x70000011
+#define SHT_MIPS_EXTSYM 0x70000012
+#define SHT_MIPS_DENSE 0x70000013
+#define SHT_MIPS_PDESC 0x70000014
+#define SHT_MIPS_LOCSYM 0x70000015
+#define SHT_MIPS_AUXSYM 0x70000016
+#define SHT_MIPS_OPTSYM 0x70000017
+#define SHT_MIPS_LOCSTR 0x70000018
+#define SHT_MIPS_LINE 0x70000019
+#define SHT_MIPS_RFDESC 0x7000001a
+#define SHT_MIPS_DELTASYM 0x7000001b
+#define SHT_MIPS_DELTAINST 0x7000001c
+#define SHT_MIPS_DELTACLASS 0x7000001d
+#define SHT_MIPS_DWARF 0x7000001e
+#define SHT_MIPS_DELTADECL 0x7000001f
+#define SHT_MIPS_SYMBOL_LIB 0x70000020
+#define SHT_MIPS_EVENTS 0x70000021
+#define SHT_MIPS_TRANSLATE 0x70000022
+#define SHT_MIPS_PIXIE 0x70000023
+#define SHT_MIPS_XLATE 0x70000024
+#define SHT_MIPS_XLATE_DEBUG 0x70000025
+#define SHT_MIPS_WHIRL 0x70000026
+#define SHT_MIPS_EH_REGION 0x70000027
+#define SHT_MIPS_XLATE_OLD 0x70000028
+#define SHT_MIPS_PDR_EXCEPTION 0x70000029
+
+
+
+#define SHF_MIPS_GPREL 0x10000000
+#define SHF_MIPS_MERGE 0x20000000
+#define SHF_MIPS_ADDR 0x40000000
+#define SHF_MIPS_STRINGS 0x80000000
+#define SHF_MIPS_NOSTRIP 0x08000000
+#define SHF_MIPS_LOCAL 0x04000000
+#define SHF_MIPS_NAMES 0x02000000
+#define SHF_MIPS_NODUPE 0x01000000
+
+
+
+
+
+#define STO_MIPS_DEFAULT 0x0
+#define STO_MIPS_INTERNAL 0x1
+#define STO_MIPS_HIDDEN 0x2
+#define STO_MIPS_PROTECTED 0x3
+#define STO_MIPS_PLT 0x8
+#define STO_MIPS_SC_ALIGN_UNUSED 0xff
+
+
+#define STB_MIPS_SPLIT_COMMON 13
+
+
+
+typedef union {
+ struct {
+ Elf32_Word gt_current_g_value;
+ Elf32_Word gt_unused;
+ } gt_header;
+ struct {
+ Elf32_Word gt_g_value;
+ Elf32_Word gt_bytes;
+ } gt_entry;
+} Elf32_gptab;
+
+
+
+typedef struct {
+ Elf32_Word ri_gprmask;
+ Elf32_Word ri_cprmask[4];
+ Elf32_Sword ri_gp_value;
+} Elf32_RegInfo;
+
+
+
+typedef struct {
+ unsigned char kind;
+
+ unsigned char size;
+ Elf32_Section section;
+
+ Elf32_Word info;
+} Elf_Options;
+
+
+
+#define ODK_NULL 0
+#define ODK_REGINFO 1
+#define ODK_EXCEPTIONS 2
+#define ODK_PAD 3
+#define ODK_HWPATCH 4
+#define ODK_FILL 5
+#define ODK_TAGS 6
+#define ODK_HWAND 7
+#define ODK_HWOR 8
+
+
+
+#define OEX_FPU_MIN 0x1f
+#define OEX_FPU_MAX 0x1f00
+#define OEX_PAGE0 0x10000
+#define OEX_SMM 0x20000
+#define OEX_FPDBUG 0x40000
+#define OEX_PRECISEFP OEX_FPDBUG
+#define OEX_DISMISS 0x80000
+
+#define OEX_FPU_INVAL 0x10
+#define OEX_FPU_DIV0 0x08
+#define OEX_FPU_OFLO 0x04
+#define OEX_FPU_UFLO 0x02
+#define OEX_FPU_INEX 0x01
+
+
+
+#define OHW_R4KEOP 0x1
+#define OHW_R8KPFETCH 0x2
+#define OHW_R5KEOP 0x4
+#define OHW_R5KCVTL 0x8
+
+#define OPAD_PREFIX 0x1
+#define OPAD_POSTFIX 0x2
+#define OPAD_SYMBOL 0x4
+
+
+
+typedef struct {
+ Elf32_Word hwp_flags1;
+ Elf32_Word hwp_flags2;
+} Elf_Options_Hw;
+
+
+
+#define OHWA0_R4KEOP_CHECKED 0x00000001
+#define OHWA1_R4KEOP_CLEAN 0x00000002
+
+
+
+#define R_MIPS_NONE 0
+#define R_MIPS_16 1
+#define R_MIPS_32 2
+#define R_MIPS_REL32 3
+#define R_MIPS_26 4
+#define R_MIPS_HI16 5
+#define R_MIPS_LO16 6
+#define R_MIPS_GPREL16 7
+#define R_MIPS_LITERAL 8
+#define R_MIPS_GOT16 9
+#define R_MIPS_PC16 10
+#define R_MIPS_CALL16 11
+#define R_MIPS_GPREL32 12
+
+#define R_MIPS_SHIFT5 16
+#define R_MIPS_SHIFT6 17
+#define R_MIPS_64 18
+#define R_MIPS_GOT_DISP 19
+#define R_MIPS_GOT_PAGE 20
+#define R_MIPS_GOT_OFST 21
+#define R_MIPS_GOT_HI16 22
+#define R_MIPS_GOT_LO16 23
+#define R_MIPS_SUB 24
+#define R_MIPS_INSERT_A 25
+#define R_MIPS_INSERT_B 26
+#define R_MIPS_DELETE 27
+#define R_MIPS_HIGHER 28
+#define R_MIPS_HIGHEST 29
+#define R_MIPS_CALL_HI16 30
+#define R_MIPS_CALL_LO16 31
+#define R_MIPS_SCN_DISP 32
+#define R_MIPS_REL16 33
+#define R_MIPS_ADD_IMMEDIATE 34
+#define R_MIPS_PJUMP 35
+#define R_MIPS_RELGOT 36
+#define R_MIPS_JALR 37
+#define R_MIPS_TLS_DTPMOD32 38
+#define R_MIPS_TLS_DTPREL32 39
+#define R_MIPS_TLS_DTPMOD64 40
+#define R_MIPS_TLS_DTPREL64 41
+#define R_MIPS_TLS_GD 42
+#define R_MIPS_TLS_LDM 43
+#define R_MIPS_TLS_DTPREL_HI16 44
+#define R_MIPS_TLS_DTPREL_LO16 45
+#define R_MIPS_TLS_GOTTPREL 46
+#define R_MIPS_TLS_TPREL32 47
+#define R_MIPS_TLS_TPREL64 48
+#define R_MIPS_TLS_TPREL_HI16 49
+#define R_MIPS_TLS_TPREL_LO16 50
+#define R_MIPS_GLOB_DAT 51
+#define R_MIPS_COPY 126
+#define R_MIPS_JUMP_SLOT 127
+
+#define R_MIPS_NUM 128
+
+
+
+#define PT_MIPS_REGINFO 0x70000000
+#define PT_MIPS_RTPROC 0x70000001
+#define PT_MIPS_OPTIONS 0x70000002
+#define PT_MIPS_ABIFLAGS 0x70000003
+
+
+
+#define PF_MIPS_LOCAL 0x10000000
+
+
+
+#define DT_MIPS_RLD_VERSION 0x70000001
+#define DT_MIPS_TIME_STAMP 0x70000002
+#define DT_MIPS_ICHECKSUM 0x70000003
+#define DT_MIPS_IVERSION 0x70000004
+#define DT_MIPS_FLAGS 0x70000005
+#define DT_MIPS_BASE_ADDRESS 0x70000006
+#define DT_MIPS_MSYM 0x70000007
+#define DT_MIPS_CONFLICT 0x70000008
+#define DT_MIPS_LIBLIST 0x70000009
+#define DT_MIPS_LOCAL_GOTNO 0x7000000a
+#define DT_MIPS_CONFLICTNO 0x7000000b
+#define DT_MIPS_LIBLISTNO 0x70000010
+#define DT_MIPS_SYMTABNO 0x70000011
+#define DT_MIPS_UNREFEXTNO 0x70000012
+#define DT_MIPS_GOTSYM 0x70000013
+#define DT_MIPS_HIPAGENO 0x70000014
+#define DT_MIPS_RLD_MAP 0x70000016
+#define DT_MIPS_DELTA_CLASS 0x70000017
+#define DT_MIPS_DELTA_CLASS_NO 0x70000018
+
+#define DT_MIPS_DELTA_INSTANCE 0x70000019
+#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a
+
+#define DT_MIPS_DELTA_RELOC 0x7000001b
+#define DT_MIPS_DELTA_RELOC_NO 0x7000001c
+
+#define DT_MIPS_DELTA_SYM 0x7000001d
+
+#define DT_MIPS_DELTA_SYM_NO 0x7000001e
+
+#define DT_MIPS_DELTA_CLASSSYM 0x70000020
+
+#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021
+
+#define DT_MIPS_CXX_FLAGS 0x70000022
+#define DT_MIPS_PIXIE_INIT 0x70000023
+#define DT_MIPS_SYMBOL_LIB 0x70000024
+#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025
+#define DT_MIPS_LOCAL_GOTIDX 0x70000026
+#define DT_MIPS_HIDDEN_GOTIDX 0x70000027
+#define DT_MIPS_PROTECTED_GOTIDX 0x70000028
+#define DT_MIPS_OPTIONS 0x70000029
+#define DT_MIPS_INTERFACE 0x7000002a
+#define DT_MIPS_DYNSTR_ALIGN 0x7000002b
+#define DT_MIPS_INTERFACE_SIZE 0x7000002c
+#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d
+
+#define DT_MIPS_PERF_SUFFIX 0x7000002e
+
+#define DT_MIPS_COMPACT_SIZE 0x7000002f
+#define DT_MIPS_GP_VALUE 0x70000030
+#define DT_MIPS_AUX_DYNAMIC 0x70000031
+
+#define DT_MIPS_PLTGOT 0x70000032
+
+#define DT_MIPS_RWPLT 0x70000034
+#define DT_MIPS_RLD_MAP_REL 0x70000035
+#define DT_MIPS_NUM 0x36
+
+
+
+#define RHF_NONE 0
+#define RHF_QUICKSTART (1 << 0)
+#define RHF_NOTPOT (1 << 1)
+#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2)
+#define RHF_NO_MOVE (1 << 3)
+#define RHF_SGI_ONLY (1 << 4)
+#define RHF_GUARANTEE_INIT (1 << 5)
+#define RHF_DELTA_C_PLUS_PLUS (1 << 6)
+#define RHF_GUARANTEE_START_INIT (1 << 7)
+#define RHF_PIXIE (1 << 8)
+#define RHF_DEFAULT_DELAY_LOAD (1 << 9)
+#define RHF_REQUICKSTART (1 << 10)
+#define RHF_REQUICKSTARTED (1 << 11)
+#define RHF_CORD (1 << 12)
+#define RHF_NO_UNRES_UNDEF (1 << 13)
+#define RHF_RLD_ORDER_SAFE (1 << 14)
+
+
+
+typedef struct {
+ Elf32_Word l_name;
+ Elf32_Word l_time_stamp;
+ Elf32_Word l_checksum;
+ Elf32_Word l_version;
+ Elf32_Word l_flags;
+} Elf32_Lib;
+
+typedef struct {
+ Elf64_Word l_name;
+ Elf64_Word l_time_stamp;
+ Elf64_Word l_checksum;
+ Elf64_Word l_version;
+ Elf64_Word l_flags;
+} Elf64_Lib;
+
+
+
+
+#define LL_NONE 0
+#define LL_EXACT_MATCH (1 << 0)
+#define LL_IGNORE_INT_VER (1 << 1)
+#define LL_REQUIRE_MINOR (1 << 2)
+#define LL_EXPORTS (1 << 3)
+#define LL_DELAY_LOAD (1 << 4)
+#define LL_DELTA (1 << 5)
+
+
+
+typedef Elf32_Addr Elf32_Conflict;
+
+typedef struct {
+ Elf32_Half version;
+ unsigned char isa_level;
+ unsigned char isa_rev;
+ unsigned char gpr_size;
+ unsigned char cpr1_size;
+ unsigned char cpr2_size;
+ unsigned char fp_abi;
+ Elf32_Word isa_ext;
+ Elf32_Word ases;
+ Elf32_Word flags1;
+ Elf32_Word flags2;
+} Elf_MIPS_ABIFlags_v0;
+
+#define MIPS_AFL_REG_NONE 0x00
+#define MIPS_AFL_REG_32 0x01
+#define MIPS_AFL_REG_64 0x02
+#define MIPS_AFL_REG_128 0x03
+
+#define MIPS_AFL_ASE_DSP 0x00000001
+#define MIPS_AFL_ASE_DSPR2 0x00000002
+#define MIPS_AFL_ASE_EVA 0x00000004
+#define MIPS_AFL_ASE_MCU 0x00000008
+#define MIPS_AFL_ASE_MDMX 0x00000010
+#define MIPS_AFL_ASE_MIPS3D 0x00000020
+#define MIPS_AFL_ASE_MT 0x00000040
+#define MIPS_AFL_ASE_SMARTMIPS 0x00000080
+#define MIPS_AFL_ASE_VIRT 0x00000100
+#define MIPS_AFL_ASE_MSA 0x00000200
+#define MIPS_AFL_ASE_MIPS16 0x00000400
+#define MIPS_AFL_ASE_MICROMIPS 0x00000800
+#define MIPS_AFL_ASE_XPA 0x00001000
+#define MIPS_AFL_ASE_MASK 0x00001fff
+
+#define MIPS_AFL_EXT_XLR 1
+#define MIPS_AFL_EXT_OCTEON2 2
+#define MIPS_AFL_EXT_OCTEONP 3
+#define MIPS_AFL_EXT_LOONGSON_3A 4
+#define MIPS_AFL_EXT_OCTEON 5
+#define MIPS_AFL_EXT_5900 6
+#define MIPS_AFL_EXT_4650 7
+#define MIPS_AFL_EXT_4010 8
+#define MIPS_AFL_EXT_4100 9
+#define MIPS_AFL_EXT_3900 10
+#define MIPS_AFL_EXT_10000 11
+#define MIPS_AFL_EXT_SB1 12
+#define MIPS_AFL_EXT_4111 13
+#define MIPS_AFL_EXT_4120 14
+#define MIPS_AFL_EXT_5400 15
+#define MIPS_AFL_EXT_5500 16
+#define MIPS_AFL_EXT_LOONGSON_2E 17
+#define MIPS_AFL_EXT_LOONGSON_2F 18
+
+#define MIPS_AFL_FLAGS1_ODDSPREG 1
+
+enum
+{
+ Val_GNU_MIPS_ABI_FP_ANY = 0,
+ Val_GNU_MIPS_ABI_FP_DOUBLE = 1,
+ Val_GNU_MIPS_ABI_FP_SINGLE = 2,
+ Val_GNU_MIPS_ABI_FP_SOFT = 3,
+ Val_GNU_MIPS_ABI_FP_OLD_64 = 4,
+ Val_GNU_MIPS_ABI_FP_XX = 5,
+ Val_GNU_MIPS_ABI_FP_64 = 6,
+ Val_GNU_MIPS_ABI_FP_64A = 7,
+ Val_GNU_MIPS_ABI_FP_MAX = 7
+};
+
+
+
+
+#define EF_PARISC_TRAPNIL 0x00010000
+#define EF_PARISC_EXT 0x00020000
+#define EF_PARISC_LSB 0x00040000
+#define EF_PARISC_WIDE 0x00080000
+#define EF_PARISC_NO_KABP 0x00100000
+
+#define EF_PARISC_LAZYSWAP 0x00400000
+#define EF_PARISC_ARCH 0x0000ffff
+
+
+
+#define EFA_PARISC_1_0 0x020b
+#define EFA_PARISC_1_1 0x0210
+#define EFA_PARISC_2_0 0x0214
+
+
+
+#define SHN_PARISC_ANSI_COMMON 0xff00
+
+#define SHN_PARISC_HUGE_COMMON 0xff01
+
+
+
+#define SHT_PARISC_EXT 0x70000000
+#define SHT_PARISC_UNWIND 0x70000001
+#define SHT_PARISC_DOC 0x70000002
+
+
+
+#define SHF_PARISC_SHORT 0x20000000
+#define SHF_PARISC_HUGE 0x40000000
+#define SHF_PARISC_SBP 0x80000000
+
+
+
+#define STT_PARISC_MILLICODE 13
+
+#define STT_HP_OPAQUE (STT_LOOS + 0x1)
+#define STT_HP_STUB (STT_LOOS + 0x2)
+
+
+
+#define R_PARISC_NONE 0
+#define R_PARISC_DIR32 1
+#define R_PARISC_DIR21L 2
+#define R_PARISC_DIR17R 3
+#define R_PARISC_DIR17F 4
+#define R_PARISC_DIR14R 6
+#define R_PARISC_PCREL32 9
+#define R_PARISC_PCREL21L 10
+#define R_PARISC_PCREL17R 11
+#define R_PARISC_PCREL17F 12
+#define R_PARISC_PCREL14R 14
+#define R_PARISC_DPREL21L 18
+#define R_PARISC_DPREL14R 22
+#define R_PARISC_GPREL21L 26
+#define R_PARISC_GPREL14R 30
+#define R_PARISC_LTOFF21L 34
+#define R_PARISC_LTOFF14R 38
+#define R_PARISC_SECREL32 41
+#define R_PARISC_SEGBASE 48
+#define R_PARISC_SEGREL32 49
+#define R_PARISC_PLTOFF21L 50
+#define R_PARISC_PLTOFF14R 54
+#define R_PARISC_LTOFF_FPTR32 57
+#define R_PARISC_LTOFF_FPTR21L 58
+#define R_PARISC_LTOFF_FPTR14R 62
+#define R_PARISC_FPTR64 64
+#define R_PARISC_PLABEL32 65
+#define R_PARISC_PLABEL21L 66
+#define R_PARISC_PLABEL14R 70
+#define R_PARISC_PCREL64 72
+#define R_PARISC_PCREL22F 74
+#define R_PARISC_PCREL14WR 75
+#define R_PARISC_PCREL14DR 76
+#define R_PARISC_PCREL16F 77
+#define R_PARISC_PCREL16WF 78
+#define R_PARISC_PCREL16DF 79
+#define R_PARISC_DIR64 80
+#define R_PARISC_DIR14WR 83
+#define R_PARISC_DIR14DR 84
+#define R_PARISC_DIR16F 85
+#define R_PARISC_DIR16WF 86
+#define R_PARISC_DIR16DF 87
+#define R_PARISC_GPREL64 88
+#define R_PARISC_GPREL14WR 91
+#define R_PARISC_GPREL14DR 92
+#define R_PARISC_GPREL16F 93
+#define R_PARISC_GPREL16WF 94
+#define R_PARISC_GPREL16DF 95
+#define R_PARISC_LTOFF64 96
+#define R_PARISC_LTOFF14WR 99
+#define R_PARISC_LTOFF14DR 100
+#define R_PARISC_LTOFF16F 101
+#define R_PARISC_LTOFF16WF 102
+#define R_PARISC_LTOFF16DF 103
+#define R_PARISC_SECREL64 104
+#define R_PARISC_SEGREL64 112
+#define R_PARISC_PLTOFF14WR 115
+#define R_PARISC_PLTOFF14DR 116
+#define R_PARISC_PLTOFF16F 117
+#define R_PARISC_PLTOFF16WF 118
+#define R_PARISC_PLTOFF16DF 119
+#define R_PARISC_LTOFF_FPTR64 120
+#define R_PARISC_LTOFF_FPTR14WR 123
+#define R_PARISC_LTOFF_FPTR14DR 124
+#define R_PARISC_LTOFF_FPTR16F 125
+#define R_PARISC_LTOFF_FPTR16WF 126
+#define R_PARISC_LTOFF_FPTR16DF 127
+#define R_PARISC_LORESERVE 128
+#define R_PARISC_COPY 128
+#define R_PARISC_IPLT 129
+#define R_PARISC_EPLT 130
+#define R_PARISC_TPREL32 153
+#define R_PARISC_TPREL21L 154
+#define R_PARISC_TPREL14R 158
+#define R_PARISC_LTOFF_TP21L 162
+#define R_PARISC_LTOFF_TP14R 166
+#define R_PARISC_LTOFF_TP14F 167
+#define R_PARISC_TPREL64 216
+#define R_PARISC_TPREL14WR 219
+#define R_PARISC_TPREL14DR 220
+#define R_PARISC_TPREL16F 221
+#define R_PARISC_TPREL16WF 222
+#define R_PARISC_TPREL16DF 223
+#define R_PARISC_LTOFF_TP64 224
+#define R_PARISC_LTOFF_TP14WR 227
+#define R_PARISC_LTOFF_TP14DR 228
+#define R_PARISC_LTOFF_TP16F 229
+#define R_PARISC_LTOFF_TP16WF 230
+#define R_PARISC_LTOFF_TP16DF 231
+#define R_PARISC_GNU_VTENTRY 232
+#define R_PARISC_GNU_VTINHERIT 233
+#define R_PARISC_TLS_GD21L 234
+#define R_PARISC_TLS_GD14R 235
+#define R_PARISC_TLS_GDCALL 236
+#define R_PARISC_TLS_LDM21L 237
+#define R_PARISC_TLS_LDM14R 238
+#define R_PARISC_TLS_LDMCALL 239
+#define R_PARISC_TLS_LDO21L 240
+#define R_PARISC_TLS_LDO14R 241
+#define R_PARISC_TLS_DTPMOD32 242
+#define R_PARISC_TLS_DTPMOD64 243
+#define R_PARISC_TLS_DTPOFF32 244
+#define R_PARISC_TLS_DTPOFF64 245
+#define R_PARISC_TLS_LE21L R_PARISC_TPREL21L
+#define R_PARISC_TLS_LE14R R_PARISC_TPREL14R
+#define R_PARISC_TLS_IE21L R_PARISC_LTOFF_TP21L
+#define R_PARISC_TLS_IE14R R_PARISC_LTOFF_TP14R
+#define R_PARISC_TLS_TPREL32 R_PARISC_TPREL32
+#define R_PARISC_TLS_TPREL64 R_PARISC_TPREL64
+#define R_PARISC_HIRESERVE 255
+
+
+
+#define PT_HP_TLS (PT_LOOS + 0x0)
+#define PT_HP_CORE_NONE (PT_LOOS + 0x1)
+#define PT_HP_CORE_VERSION (PT_LOOS + 0x2)
+#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3)
+#define PT_HP_CORE_COMM (PT_LOOS + 0x4)
+#define PT_HP_CORE_PROC (PT_LOOS + 0x5)
+#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6)
+#define PT_HP_CORE_STACK (PT_LOOS + 0x7)
+#define PT_HP_CORE_SHM (PT_LOOS + 0x8)
+#define PT_HP_CORE_MMF (PT_LOOS + 0x9)
+#define PT_HP_PARALLEL (PT_LOOS + 0x10)
+#define PT_HP_FASTBIND (PT_LOOS + 0x11)
+#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12)
+#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13)
+#define PT_HP_STACK (PT_LOOS + 0x14)
+
+#define PT_PARISC_ARCHEXT 0x70000000
+#define PT_PARISC_UNWIND 0x70000001
+
+
+
+#define PF_PARISC_SBP 0x08000000
+
+#define PF_HP_PAGE_SIZE 0x00100000
+#define PF_HP_FAR_SHARED 0x00200000
+#define PF_HP_NEAR_SHARED 0x00400000
+#define PF_HP_CODE 0x01000000
+#define PF_HP_MODIFY 0x02000000
+#define PF_HP_LAZYSWAP 0x04000000
+#define PF_HP_SBP 0x08000000
+
+
+
+
+
+
+#define EF_ALPHA_32BIT 1
+#define EF_ALPHA_CANRELAX 2
+
+
+
+
+#define SHT_ALPHA_DEBUG 0x70000001
+#define SHT_ALPHA_REGINFO 0x70000002
+
+
+
+#define SHF_ALPHA_GPREL 0x10000000
+
+
+#define STO_ALPHA_NOPV 0x80
+#define STO_ALPHA_STD_GPLOAD 0x88
+
+
+
+#define R_ALPHA_NONE 0
+#define R_ALPHA_REFLONG 1
+#define R_ALPHA_REFQUAD 2
+#define R_ALPHA_GPREL32 3
+#define R_ALPHA_LITERAL 4
+#define R_ALPHA_LITUSE 5
+#define R_ALPHA_GPDISP 6
+#define R_ALPHA_BRADDR 7
+#define R_ALPHA_HINT 8
+#define R_ALPHA_SREL16 9
+#define R_ALPHA_SREL32 10
+#define R_ALPHA_SREL64 11
+#define R_ALPHA_GPRELHIGH 17
+#define R_ALPHA_GPRELLOW 18
+#define R_ALPHA_GPREL16 19
+#define R_ALPHA_COPY 24
+#define R_ALPHA_GLOB_DAT 25
+#define R_ALPHA_JMP_SLOT 26
+#define R_ALPHA_RELATIVE 27
+#define R_ALPHA_TLS_GD_HI 28
+#define R_ALPHA_TLSGD 29
+#define R_ALPHA_TLS_LDM 30
+#define R_ALPHA_DTPMOD64 31
+#define R_ALPHA_GOTDTPREL 32
+#define R_ALPHA_DTPREL64 33
+#define R_ALPHA_DTPRELHI 34
+#define R_ALPHA_DTPRELLO 35
+#define R_ALPHA_DTPREL16 36
+#define R_ALPHA_GOTTPREL 37
+#define R_ALPHA_TPREL64 38
+#define R_ALPHA_TPRELHI 39
+#define R_ALPHA_TPRELLO 40
+#define R_ALPHA_TPREL16 41
+
+#define R_ALPHA_NUM 46
+
+
+#define LITUSE_ALPHA_ADDR 0
+#define LITUSE_ALPHA_BASE 1
+#define LITUSE_ALPHA_BYTOFF 2
+#define LITUSE_ALPHA_JSR 3
+#define LITUSE_ALPHA_TLS_GD 4
+#define LITUSE_ALPHA_TLS_LDM 5
+
+
+#define DT_ALPHA_PLTRO (DT_LOPROC + 0)
+#define DT_ALPHA_NUM 1
+
+
+
+
+#define EF_PPC_EMB 0x80000000
+
+
+#define EF_PPC_RELOCATABLE 0x00010000
+#define EF_PPC_RELOCATABLE_LIB 0x00008000
+
+
+
+#define R_PPC_NONE 0
+#define R_PPC_ADDR32 1
+#define R_PPC_ADDR24 2
+#define R_PPC_ADDR16 3
+#define R_PPC_ADDR16_LO 4
+#define R_PPC_ADDR16_HI 5
+#define R_PPC_ADDR16_HA 6
+#define R_PPC_ADDR14 7
+#define R_PPC_ADDR14_BRTAKEN 8
+#define R_PPC_ADDR14_BRNTAKEN 9
+#define R_PPC_REL24 10
+#define R_PPC_REL14 11
+#define R_PPC_REL14_BRTAKEN 12
+#define R_PPC_REL14_BRNTAKEN 13
+#define R_PPC_GOT16 14
+#define R_PPC_GOT16_LO 15
+#define R_PPC_GOT16_HI 16
+#define R_PPC_GOT16_HA 17
+#define R_PPC_PLTREL24 18
+#define R_PPC_COPY 19
+#define R_PPC_GLOB_DAT 20
+#define R_PPC_JMP_SLOT 21
+#define R_PPC_RELATIVE 22
+#define R_PPC_LOCAL24PC 23
+#define R_PPC_UADDR32 24
+#define R_PPC_UADDR16 25
+#define R_PPC_REL32 26
+#define R_PPC_PLT32 27
+#define R_PPC_PLTREL32 28
+#define R_PPC_PLT16_LO 29
+#define R_PPC_PLT16_HI 30
+#define R_PPC_PLT16_HA 31
+#define R_PPC_SDAREL16 32
+#define R_PPC_SECTOFF 33
+#define R_PPC_SECTOFF_LO 34
+#define R_PPC_SECTOFF_HI 35
+#define R_PPC_SECTOFF_HA 36
+
+
+#define R_PPC_TLS 67
+#define R_PPC_DTPMOD32 68
+#define R_PPC_TPREL16 69
+#define R_PPC_TPREL16_LO 70
+#define R_PPC_TPREL16_HI 71
+#define R_PPC_TPREL16_HA 72
+#define R_PPC_TPREL32 73
+#define R_PPC_DTPREL16 74
+#define R_PPC_DTPREL16_LO 75
+#define R_PPC_DTPREL16_HI 76
+#define R_PPC_DTPREL16_HA 77
+#define R_PPC_DTPREL32 78
+#define R_PPC_GOT_TLSGD16 79
+#define R_PPC_GOT_TLSGD16_LO 80
+#define R_PPC_GOT_TLSGD16_HI 81
+#define R_PPC_GOT_TLSGD16_HA 82
+#define R_PPC_GOT_TLSLD16 83
+#define R_PPC_GOT_TLSLD16_LO 84
+#define R_PPC_GOT_TLSLD16_HI 85
+#define R_PPC_GOT_TLSLD16_HA 86
+#define R_PPC_GOT_TPREL16 87
+#define R_PPC_GOT_TPREL16_LO 88
+#define R_PPC_GOT_TPREL16_HI 89
+#define R_PPC_GOT_TPREL16_HA 90
+#define R_PPC_GOT_DTPREL16 91
+#define R_PPC_GOT_DTPREL16_LO 92
+#define R_PPC_GOT_DTPREL16_HI 93
+#define R_PPC_GOT_DTPREL16_HA 94
+#define R_PPC_TLSGD 95
+#define R_PPC_TLSLD 96
+
+
+#define R_PPC_EMB_NADDR32 101
+#define R_PPC_EMB_NADDR16 102
+#define R_PPC_EMB_NADDR16_LO 103
+#define R_PPC_EMB_NADDR16_HI 104
+#define R_PPC_EMB_NADDR16_HA 105
+#define R_PPC_EMB_SDAI16 106
+#define R_PPC_EMB_SDA2I16 107
+#define R_PPC_EMB_SDA2REL 108
+#define R_PPC_EMB_SDA21 109
+#define R_PPC_EMB_MRKREF 110
+#define R_PPC_EMB_RELSEC16 111
+#define R_PPC_EMB_RELST_LO 112
+#define R_PPC_EMB_RELST_HI 113
+#define R_PPC_EMB_RELST_HA 114
+#define R_PPC_EMB_BIT_FLD 115
+#define R_PPC_EMB_RELSDA 116
+
+
+#define R_PPC_DIAB_SDA21_LO 180
+#define R_PPC_DIAB_SDA21_HI 181
+#define R_PPC_DIAB_SDA21_HA 182
+#define R_PPC_DIAB_RELSDA_LO 183
+#define R_PPC_DIAB_RELSDA_HI 184
+#define R_PPC_DIAB_RELSDA_HA 185
+
+
+#define R_PPC_IRELATIVE 248
+
+
+#define R_PPC_REL16 249
+#define R_PPC_REL16_LO 250
+#define R_PPC_REL16_HI 251
+#define R_PPC_REL16_HA 252
+
+
+
+#define R_PPC_TOC16 255
+
+
+#define DT_PPC_GOT (DT_LOPROC + 0)
+#define DT_PPC_OPT (DT_LOPROC + 1)
+#define DT_PPC_NUM 2
+
+#define PPC_OPT_TLS 1
+
+
+#define R_PPC64_NONE R_PPC_NONE
+#define R_PPC64_ADDR32 R_PPC_ADDR32
+#define R_PPC64_ADDR24 R_PPC_ADDR24
+#define R_PPC64_ADDR16 R_PPC_ADDR16
+#define R_PPC64_ADDR16_LO R_PPC_ADDR16_LO
+#define R_PPC64_ADDR16_HI R_PPC_ADDR16_HI
+#define R_PPC64_ADDR16_HA R_PPC_ADDR16_HA
+#define R_PPC64_ADDR14 R_PPC_ADDR14
+#define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN
+#define R_PPC64_ADDR14_BRNTAKEN R_PPC_ADDR14_BRNTAKEN
+#define R_PPC64_REL24 R_PPC_REL24
+#define R_PPC64_REL14 R_PPC_REL14
+#define R_PPC64_REL14_BRTAKEN R_PPC_REL14_BRTAKEN
+#define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN
+#define R_PPC64_GOT16 R_PPC_GOT16
+#define R_PPC64_GOT16_LO R_PPC_GOT16_LO
+#define R_PPC64_GOT16_HI R_PPC_GOT16_HI
+#define R_PPC64_GOT16_HA R_PPC_GOT16_HA
+
+#define R_PPC64_COPY R_PPC_COPY
+#define R_PPC64_GLOB_DAT R_PPC_GLOB_DAT
+#define R_PPC64_JMP_SLOT R_PPC_JMP_SLOT
+#define R_PPC64_RELATIVE R_PPC_RELATIVE
+
+#define R_PPC64_UADDR32 R_PPC_UADDR32
+#define R_PPC64_UADDR16 R_PPC_UADDR16
+#define R_PPC64_REL32 R_PPC_REL32
+#define R_PPC64_PLT32 R_PPC_PLT32
+#define R_PPC64_PLTREL32 R_PPC_PLTREL32
+#define R_PPC64_PLT16_LO R_PPC_PLT16_LO
+#define R_PPC64_PLT16_HI R_PPC_PLT16_HI
+#define R_PPC64_PLT16_HA R_PPC_PLT16_HA
+
+#define R_PPC64_SECTOFF R_PPC_SECTOFF
+#define R_PPC64_SECTOFF_LO R_PPC_SECTOFF_LO
+#define R_PPC64_SECTOFF_HI R_PPC_SECTOFF_HI
+#define R_PPC64_SECTOFF_HA R_PPC_SECTOFF_HA
+#define R_PPC64_ADDR30 37
+#define R_PPC64_ADDR64 38
+#define R_PPC64_ADDR16_HIGHER 39
+#define R_PPC64_ADDR16_HIGHERA 40
+#define R_PPC64_ADDR16_HIGHEST 41
+#define R_PPC64_ADDR16_HIGHESTA 42
+#define R_PPC64_UADDR64 43
+#define R_PPC64_REL64 44
+#define R_PPC64_PLT64 45
+#define R_PPC64_PLTREL64 46
+#define R_PPC64_TOC16 47
+#define R_PPC64_TOC16_LO 48
+#define R_PPC64_TOC16_HI 49
+#define R_PPC64_TOC16_HA 50
+#define R_PPC64_TOC 51
+#define R_PPC64_PLTGOT16 52
+#define R_PPC64_PLTGOT16_LO 53
+#define R_PPC64_PLTGOT16_HI 54
+#define R_PPC64_PLTGOT16_HA 55
+
+#define R_PPC64_ADDR16_DS 56
+#define R_PPC64_ADDR16_LO_DS 57
+#define R_PPC64_GOT16_DS 58
+#define R_PPC64_GOT16_LO_DS 59
+#define R_PPC64_PLT16_LO_DS 60
+#define R_PPC64_SECTOFF_DS 61
+#define R_PPC64_SECTOFF_LO_DS 62
+#define R_PPC64_TOC16_DS 63
+#define R_PPC64_TOC16_LO_DS 64
+#define R_PPC64_PLTGOT16_DS 65
+#define R_PPC64_PLTGOT16_LO_DS 66
+
+
+#define R_PPC64_TLS 67
+#define R_PPC64_DTPMOD64 68
+#define R_PPC64_TPREL16 69
+#define R_PPC64_TPREL16_LO 70
+#define R_PPC64_TPREL16_HI 71
+#define R_PPC64_TPREL16_HA 72
+#define R_PPC64_TPREL64 73
+#define R_PPC64_DTPREL16 74
+#define R_PPC64_DTPREL16_LO 75
+#define R_PPC64_DTPREL16_HI 76
+#define R_PPC64_DTPREL16_HA 77
+#define R_PPC64_DTPREL64 78
+#define R_PPC64_GOT_TLSGD16 79
+#define R_PPC64_GOT_TLSGD16_LO 80
+#define R_PPC64_GOT_TLSGD16_HI 81
+#define R_PPC64_GOT_TLSGD16_HA 82
+#define R_PPC64_GOT_TLSLD16 83
+#define R_PPC64_GOT_TLSLD16_LO 84
+#define R_PPC64_GOT_TLSLD16_HI 85
+#define R_PPC64_GOT_TLSLD16_HA 86
+#define R_PPC64_GOT_TPREL16_DS 87
+#define R_PPC64_GOT_TPREL16_LO_DS 88
+#define R_PPC64_GOT_TPREL16_HI 89
+#define R_PPC64_GOT_TPREL16_HA 90
+#define R_PPC64_GOT_DTPREL16_DS 91
+#define R_PPC64_GOT_DTPREL16_LO_DS 92
+#define R_PPC64_GOT_DTPREL16_HI 93
+#define R_PPC64_GOT_DTPREL16_HA 94
+#define R_PPC64_TPREL16_DS 95
+#define R_PPC64_TPREL16_LO_DS 96
+#define R_PPC64_TPREL16_HIGHER 97
+#define R_PPC64_TPREL16_HIGHERA 98
+#define R_PPC64_TPREL16_HIGHEST 99
+#define R_PPC64_TPREL16_HIGHESTA 100
+#define R_PPC64_DTPREL16_DS 101
+#define R_PPC64_DTPREL16_LO_DS 102
+#define R_PPC64_DTPREL16_HIGHER 103
+#define R_PPC64_DTPREL16_HIGHERA 104
+#define R_PPC64_DTPREL16_HIGHEST 105
+#define R_PPC64_DTPREL16_HIGHESTA 106
+#define R_PPC64_TLSGD 107
+#define R_PPC64_TLSLD 108
+#define R_PPC64_TOCSAVE 109
+#define R_PPC64_ADDR16_HIGH 110
+#define R_PPC64_ADDR16_HIGHA 111
+#define R_PPC64_TPREL16_HIGH 112
+#define R_PPC64_TPREL16_HIGHA 113
+#define R_PPC64_DTPREL16_HIGH 114
+#define R_PPC64_DTPREL16_HIGHA 115
+
+
+#define R_PPC64_JMP_IREL 247
+#define R_PPC64_IRELATIVE 248
+#define R_PPC64_REL16 249
+#define R_PPC64_REL16_LO 250
+#define R_PPC64_REL16_HI 251
+#define R_PPC64_REL16_HA 252
+
+#define EF_PPC64_ABI 3
+
+#define DT_PPC64_GLINK (DT_LOPROC + 0)
+#define DT_PPC64_OPD (DT_LOPROC + 1)
+#define DT_PPC64_OPDSZ (DT_LOPROC + 2)
+#define DT_PPC64_OPT (DT_LOPROC + 3)
+#define DT_PPC64_NUM 4
+
+#define PPC64_OPT_TLS 1
+#define PPC64_OPT_MULTI_TOC 2
+#define PPC64_OPT_LOCALENTRY 4
+
+#define STO_PPC64_LOCAL_BIT 5
+#define STO_PPC64_LOCAL_MASK 0xe0
+#define PPC64_LOCAL_ENTRY_OFFSET(x) (1 << (((x)&0xe0)>>5) & 0xfc)
+
+
+#define EF_ARM_RELEXEC 0x01
+#define EF_ARM_HASENTRY 0x02
+#define EF_ARM_INTERWORK 0x04
+#define EF_ARM_APCS_26 0x08
+#define EF_ARM_APCS_FLOAT 0x10
+#define EF_ARM_PIC 0x20
+#define EF_ARM_ALIGN8 0x40
+#define EF_ARM_NEW_ABI 0x80
+#define EF_ARM_OLD_ABI 0x100
+#define EF_ARM_SOFT_FLOAT 0x200
+#define EF_ARM_VFP_FLOAT 0x400
+#define EF_ARM_MAVERICK_FLOAT 0x800
+
+#define EF_ARM_ABI_FLOAT_SOFT 0x200
+#define EF_ARM_ABI_FLOAT_HARD 0x400
+
+
+#define EF_ARM_SYMSARESORTED 0x04
+#define EF_ARM_DYNSYMSUSESEGIDX 0x08
+#define EF_ARM_MAPSYMSFIRST 0x10
+#define EF_ARM_EABIMASK 0XFF000000
+
+
+#define EF_ARM_BE8 0x00800000
+#define EF_ARM_LE8 0x00400000
+
+#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK)
+#define EF_ARM_EABI_UNKNOWN 0x00000000
+#define EF_ARM_EABI_VER1 0x01000000
+#define EF_ARM_EABI_VER2 0x02000000
+#define EF_ARM_EABI_VER3 0x03000000
+#define EF_ARM_EABI_VER4 0x04000000
+#define EF_ARM_EABI_VER5 0x05000000
+
+
+#define STT_ARM_TFUNC STT_LOPROC
+#define STT_ARM_16BIT STT_HIPROC
+
+
+#define SHF_ARM_ENTRYSECT 0x10000000
+#define SHF_ARM_COMDEF 0x80000000
+
+
+
+#define PF_ARM_SB 0x10000000
+
+#define PF_ARM_PI 0x20000000
+#define PF_ARM_ABS 0x40000000
+
+
+#define PT_ARM_EXIDX (PT_LOPROC + 1)
+
+
+#define SHT_ARM_EXIDX (SHT_LOPROC + 1)
+#define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2)
+#define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3)
+
+#define R_AARCH64_NONE 0
+#define R_AARCH64_P32_ABS32 1
+#define R_AARCH64_P32_COPY 180
+#define R_AARCH64_P32_GLOB_DAT 181
+#define R_AARCH64_P32_JUMP_SLOT 182
+#define R_AARCH64_P32_RELATIVE 183
+#define R_AARCH64_P32_TLS_DTPMOD 184
+#define R_AARCH64_P32_TLS_DTPREL 185
+#define R_AARCH64_P32_TLS_TPREL 186
+#define R_AARCH64_P32_TLSDESC 187
+#define R_AARCH64_P32_IRELATIVE 188
+#define R_AARCH64_ABS64 257
+#define R_AARCH64_ABS32 258
+#define R_AARCH64_ABS16 259
+#define R_AARCH64_PREL64 260
+#define R_AARCH64_PREL32 261
+#define R_AARCH64_PREL16 262
+#define R_AARCH64_MOVW_UABS_G0 263
+#define R_AARCH64_MOVW_UABS_G0_NC 264
+#define R_AARCH64_MOVW_UABS_G1 265
+#define R_AARCH64_MOVW_UABS_G1_NC 266
+#define R_AARCH64_MOVW_UABS_G2 267
+#define R_AARCH64_MOVW_UABS_G2_NC 268
+#define R_AARCH64_MOVW_UABS_G3 269
+#define R_AARCH64_MOVW_SABS_G0 270
+#define R_AARCH64_MOVW_SABS_G1 271
+#define R_AARCH64_MOVW_SABS_G2 272
+#define R_AARCH64_LD_PREL_LO19 273
+#define R_AARCH64_ADR_PREL_LO21 274
+#define R_AARCH64_ADR_PREL_PG_HI21 275
+#define R_AARCH64_ADR_PREL_PG_HI21_NC 276
+#define R_AARCH64_ADD_ABS_LO12_NC 277
+#define R_AARCH64_LDST8_ABS_LO12_NC 278
+#define R_AARCH64_TSTBR14 279
+#define R_AARCH64_CONDBR19 280
+#define R_AARCH64_JUMP26 282
+#define R_AARCH64_CALL26 283
+#define R_AARCH64_LDST16_ABS_LO12_NC 284
+#define R_AARCH64_LDST32_ABS_LO12_NC 285
+#define R_AARCH64_LDST64_ABS_LO12_NC 286
+#define R_AARCH64_MOVW_PREL_G0 287
+#define R_AARCH64_MOVW_PREL_G0_NC 288
+#define R_AARCH64_MOVW_PREL_G1 289
+#define R_AARCH64_MOVW_PREL_G1_NC 290
+#define R_AARCH64_MOVW_PREL_G2 291
+#define R_AARCH64_MOVW_PREL_G2_NC 292
+#define R_AARCH64_MOVW_PREL_G3 293
+#define R_AARCH64_LDST128_ABS_LO12_NC 299
+#define R_AARCH64_MOVW_GOTOFF_G0 300
+#define R_AARCH64_MOVW_GOTOFF_G0_NC 301
+#define R_AARCH64_MOVW_GOTOFF_G1 302
+#define R_AARCH64_MOVW_GOTOFF_G1_NC 303
+#define R_AARCH64_MOVW_GOTOFF_G2 304
+#define R_AARCH64_MOVW_GOTOFF_G2_NC 305
+#define R_AARCH64_MOVW_GOTOFF_G3 306
+#define R_AARCH64_GOTREL64 307
+#define R_AARCH64_GOTREL32 308
+#define R_AARCH64_GOT_LD_PREL19 309
+#define R_AARCH64_LD64_GOTOFF_LO15 310
+#define R_AARCH64_ADR_GOT_PAGE 311
+#define R_AARCH64_LD64_GOT_LO12_NC 312
+#define R_AARCH64_LD64_GOTPAGE_LO15 313
+#define R_AARCH64_TLSGD_ADR_PREL21 512
+#define R_AARCH64_TLSGD_ADR_PAGE21 513
+#define R_AARCH64_TLSGD_ADD_LO12_NC 514
+#define R_AARCH64_TLSGD_MOVW_G1 515
+#define R_AARCH64_TLSGD_MOVW_G0_NC 516
+#define R_AARCH64_TLSLD_ADR_PREL21 517
+#define R_AARCH64_TLSLD_ADR_PAGE21 518
+#define R_AARCH64_TLSLD_ADD_LO12_NC 519
+#define R_AARCH64_TLSLD_MOVW_G1 520
+#define R_AARCH64_TLSLD_MOVW_G0_NC 521
+#define R_AARCH64_TLSLD_LD_PREL19 522
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527
+#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528
+#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529
+#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530
+#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531
+#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532
+#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533
+#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534
+#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535
+#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536
+#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537
+#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538
+#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539
+#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540
+#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541
+#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542
+#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543
+#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544
+#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545
+#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546
+#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547
+#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548
+#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549
+#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550
+#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551
+#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552
+#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553
+#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554
+#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555
+#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556
+#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557
+#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558
+#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559
+#define R_AARCH64_TLSDESC_LD_PREL19 560
+#define R_AARCH64_TLSDESC_ADR_PREL21 561
+#define R_AARCH64_TLSDESC_ADR_PAGE21 562
+#define R_AARCH64_TLSDESC_LD64_LO12 563
+#define R_AARCH64_TLSDESC_ADD_LO12 564
+#define R_AARCH64_TLSDESC_OFF_G1 565
+#define R_AARCH64_TLSDESC_OFF_G0_NC 566
+#define R_AARCH64_TLSDESC_LDR 567
+#define R_AARCH64_TLSDESC_ADD 568
+#define R_AARCH64_TLSDESC_CALL 569
+#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570
+#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571
+#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572
+#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573
+#define R_AARCH64_COPY 1024
+#define R_AARCH64_GLOB_DAT 1025
+#define R_AARCH64_JUMP_SLOT 1026
+#define R_AARCH64_RELATIVE 1027
+#define R_AARCH64_TLS_DTPMOD 1028
+#define R_AARCH64_TLS_DTPMOD64 1028
+#define R_AARCH64_TLS_DTPREL 1029
+#define R_AARCH64_TLS_DTPREL64 1029
+#define R_AARCH64_TLS_TPREL 1030
+#define R_AARCH64_TLS_TPREL64 1030
+#define R_AARCH64_TLSDESC 1031
+
+
+#define R_ARM_NONE 0
+#define R_ARM_PC24 1
+#define R_ARM_ABS32 2
+#define R_ARM_REL32 3
+#define R_ARM_PC13 4
+#define R_ARM_ABS16 5
+#define R_ARM_ABS12 6
+#define R_ARM_THM_ABS5 7
+#define R_ARM_ABS8 8
+#define R_ARM_SBREL32 9
+#define R_ARM_THM_PC22 10
+#define R_ARM_THM_PC8 11
+#define R_ARM_AMP_VCALL9 12
+#define R_ARM_TLS_DESC 13
+#define R_ARM_THM_SWI8 14
+#define R_ARM_XPC25 15
+#define R_ARM_THM_XPC22 16
+#define R_ARM_TLS_DTPMOD32 17
+#define R_ARM_TLS_DTPOFF32 18
+#define R_ARM_TLS_TPOFF32 19
+#define R_ARM_COPY 20
+#define R_ARM_GLOB_DAT 21
+#define R_ARM_JUMP_SLOT 22
+#define R_ARM_RELATIVE 23
+#define R_ARM_GOTOFF 24
+#define R_ARM_GOTPC 25
+#define R_ARM_GOT32 26
+#define R_ARM_PLT32 27
+#define R_ARM_CALL 28
+#define R_ARM_JUMP24 29
+#define R_ARM_THM_JUMP24 30
+#define R_ARM_BASE_ABS 31
+#define R_ARM_ALU_PCREL_7_0 32
+#define R_ARM_ALU_PCREL_15_8 33
+#define R_ARM_ALU_PCREL_23_15 34
+#define R_ARM_LDR_SBREL_11_0 35
+#define R_ARM_ALU_SBREL_19_12 36
+#define R_ARM_ALU_SBREL_27_20 37
+#define R_ARM_TARGET1 38
+#define R_ARM_SBREL31 39
+#define R_ARM_V4BX 40
+#define R_ARM_TARGET2 41
+#define R_ARM_PREL31 42
+#define R_ARM_MOVW_ABS_NC 43
+#define R_ARM_MOVT_ABS 44
+#define R_ARM_MOVW_PREL_NC 45
+#define R_ARM_MOVT_PREL 46
+#define R_ARM_THM_MOVW_ABS_NC 47
+#define R_ARM_THM_MOVT_ABS 48
+#define R_ARM_THM_MOVW_PREL_NC 49
+#define R_ARM_THM_MOVT_PREL 50
+#define R_ARM_THM_JUMP19 51
+#define R_ARM_THM_JUMP6 52
+#define R_ARM_THM_ALU_PREL_11_0 53
+#define R_ARM_THM_PC12 54
+#define R_ARM_ABS32_NOI 55
+#define R_ARM_REL32_NOI 56
+#define R_ARM_ALU_PC_G0_NC 57
+#define R_ARM_ALU_PC_G0 58
+#define R_ARM_ALU_PC_G1_NC 59
+#define R_ARM_ALU_PC_G1 60
+#define R_ARM_ALU_PC_G2 61
+#define R_ARM_LDR_PC_G1 62
+#define R_ARM_LDR_PC_G2 63
+#define R_ARM_LDRS_PC_G0 64
+#define R_ARM_LDRS_PC_G1 65
+#define R_ARM_LDRS_PC_G2 66
+#define R_ARM_LDC_PC_G0 67
+#define R_ARM_LDC_PC_G1 68
+#define R_ARM_LDC_PC_G2 69
+#define R_ARM_ALU_SB_G0_NC 70
+#define R_ARM_ALU_SB_G0 71
+#define R_ARM_ALU_SB_G1_NC 72
+#define R_ARM_ALU_SB_G1 73
+#define R_ARM_ALU_SB_G2 74
+#define R_ARM_LDR_SB_G0 75
+#define R_ARM_LDR_SB_G1 76
+#define R_ARM_LDR_SB_G2 77
+#define R_ARM_LDRS_SB_G0 78
+#define R_ARM_LDRS_SB_G1 79
+#define R_ARM_LDRS_SB_G2 80
+#define R_ARM_LDC_SB_G0 81
+#define R_ARM_LDC_SB_G1 82
+#define R_ARM_LDC_SB_G2 83
+#define R_ARM_MOVW_BREL_NC 84
+#define R_ARM_MOVT_BREL 85
+#define R_ARM_MOVW_BREL 86
+#define R_ARM_THM_MOVW_BREL_NC 87
+#define R_ARM_THM_MOVT_BREL 88
+#define R_ARM_THM_MOVW_BREL 89
+#define R_ARM_TLS_GOTDESC 90
+#define R_ARM_TLS_CALL 91
+#define R_ARM_TLS_DESCSEQ 92
+#define R_ARM_THM_TLS_CALL 93
+#define R_ARM_PLT32_ABS 94
+#define R_ARM_GOT_ABS 95
+#define R_ARM_GOT_PREL 96
+#define R_ARM_GOT_BREL12 97
+#define R_ARM_GOTOFF12 98
+#define R_ARM_GOTRELAX 99
+#define R_ARM_GNU_VTENTRY 100
+#define R_ARM_GNU_VTINHERIT 101
+#define R_ARM_THM_PC11 102
+#define R_ARM_THM_PC9 103
+#define R_ARM_TLS_GD32 104
+
+#define R_ARM_TLS_LDM32 105
+
+#define R_ARM_TLS_LDO32 106
+
+#define R_ARM_TLS_IE32 107
+
+#define R_ARM_TLS_LE32 108
+#define R_ARM_TLS_LDO12 109
+#define R_ARM_TLS_LE12 110
+#define R_ARM_TLS_IE12GP 111
+#define R_ARM_ME_TOO 128
+#define R_ARM_THM_TLS_DESCSEQ 129
+#define R_ARM_THM_TLS_DESCSEQ16 129
+#define R_ARM_THM_TLS_DESCSEQ32 130
+#define R_ARM_THM_GOT_BREL12 131
+#define R_ARM_IRELATIVE 160
+#define R_ARM_RXPC25 249
+#define R_ARM_RSBREL32 250
+#define R_ARM_THM_RPC22 251
+#define R_ARM_RREL32 252
+#define R_ARM_RABS22 253
+#define R_ARM_RPC24 254
+#define R_ARM_RBASE 255
+
+#define R_ARM_NUM 256
+
+
+#define R_CKCORE_NONE 0
+#define R_CKCORE_ADDR32 1
+#define R_CKCORE_PCRELIMM8BY4 2
+#define R_CKCORE_PCRELIMM11BY2 3
+#define R_CKCORE_PCREL32 5
+#define R_CKCORE_PCRELJSR_IMM11BY2 6
+#define R_CKCORE_RELATIVE 9
+#define R_CKCORE_COPY 10
+#define R_CKCORE_GLOB_DAT 11
+#define R_CKCORE_JUMP_SLOT 12
+#define R_CKCORE_GOTOFF 13
+#define R_CKCORE_GOTPC 14
+#define R_CKCORE_GOT32 15
+#define R_CKCORE_PLT32 16
+#define R_CKCORE_ADDRGOT 17
+#define R_CKCORE_ADDRPLT 18
+#define R_CKCORE_PCREL_IMM26BY2 19
+#define R_CKCORE_PCREL_IMM16BY2 20
+#define R_CKCORE_PCREL_IMM16BY4 21
+#define R_CKCORE_PCREL_IMM10BY2 22
+#define R_CKCORE_PCREL_IMM10BY4 23
+#define R_CKCORE_ADDR_HI16 24
+#define R_CKCORE_ADDR_LO16 25
+#define R_CKCORE_GOTPC_HI16 26
+#define R_CKCORE_GOTPC_LO16 27
+#define R_CKCORE_GOTOFF_HI16 28
+#define R_CKCORE_GOTOFF_LO16 29
+#define R_CKCORE_GOT12 30
+#define R_CKCORE_GOT_HI16 31
+#define R_CKCORE_GOT_LO16 32
+#define R_CKCORE_PLT12 33
+#define R_CKCORE_PLT_HI16 34
+#define R_CKCORE_PLT_LO16 35
+#define R_CKCORE_ADDRGOT_HI16 36
+#define R_CKCORE_ADDRGOT_LO16 37
+#define R_CKCORE_ADDRPLT_HI16 38
+#define R_CKCORE_ADDRPLT_LO16 39
+#define R_CKCORE_PCREL_JSR_IMM26BY2 40
+#define R_CKCORE_TOFFSET_LO16 41
+#define R_CKCORE_DOFFSET_LO16 42
+#define R_CKCORE_PCREL_IMM18BY2 43
+#define R_CKCORE_DOFFSET_IMM18 44
+#define R_CKCORE_DOFFSET_IMM18BY2 45
+#define R_CKCORE_DOFFSET_IMM18BY4 46
+#define R_CKCORE_GOT_IMM18BY4 48
+#define R_CKCORE_PLT_IMM18BY4 49
+#define R_CKCORE_PCREL_IMM7BY4 50
+#define R_CKCORE_TLS_LE32 51
+#define R_CKCORE_TLS_IE32 52
+#define R_CKCORE_TLS_GD32 53
+#define R_CKCORE_TLS_LDM32 54
+#define R_CKCORE_TLS_LDO32 55
+#define R_CKCORE_TLS_DTPMOD32 56
+#define R_CKCORE_TLS_DTPOFF32 57
+#define R_CKCORE_TLS_TPOFF32 58
+
+
+#define EF_IA_64_MASKOS 0x0000000f
+#define EF_IA_64_ABI64 0x00000010
+#define EF_IA_64_ARCH 0xff000000
+
+
+#define PT_IA_64_ARCHEXT (PT_LOPROC + 0)
+#define PT_IA_64_UNWIND (PT_LOPROC + 1)
+#define PT_IA_64_HP_OPT_ANOT (PT_LOOS + 0x12)
+#define PT_IA_64_HP_HSL_ANOT (PT_LOOS + 0x13)
+#define PT_IA_64_HP_STACK (PT_LOOS + 0x14)
+
+
+#define PF_IA_64_NORECOV 0x80000000
+
+
+#define SHT_IA_64_EXT (SHT_LOPROC + 0)
+#define SHT_IA_64_UNWIND (SHT_LOPROC + 1)
+
+
+#define SHF_IA_64_SHORT 0x10000000
+#define SHF_IA_64_NORECOV 0x20000000
+
+
+#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0)
+#define DT_IA_64_NUM 1
+
+
+#define R_IA64_NONE 0x00
+#define R_IA64_IMM14 0x21
+#define R_IA64_IMM22 0x22
+#define R_IA64_IMM64 0x23
+#define R_IA64_DIR32MSB 0x24
+#define R_IA64_DIR32LSB 0x25
+#define R_IA64_DIR64MSB 0x26
+#define R_IA64_DIR64LSB 0x27
+#define R_IA64_GPREL22 0x2a
+#define R_IA64_GPREL64I 0x2b
+#define R_IA64_GPREL32MSB 0x2c
+#define R_IA64_GPREL32LSB 0x2d
+#define R_IA64_GPREL64MSB 0x2e
+#define R_IA64_GPREL64LSB 0x2f
+#define R_IA64_LTOFF22 0x32
+#define R_IA64_LTOFF64I 0x33
+#define R_IA64_PLTOFF22 0x3a
+#define R_IA64_PLTOFF64I 0x3b
+#define R_IA64_PLTOFF64MSB 0x3e
+#define R_IA64_PLTOFF64LSB 0x3f
+#define R_IA64_FPTR64I 0x43
+#define R_IA64_FPTR32MSB 0x44
+#define R_IA64_FPTR32LSB 0x45
+#define R_IA64_FPTR64MSB 0x46
+#define R_IA64_FPTR64LSB 0x47
+#define R_IA64_PCREL60B 0x48
+#define R_IA64_PCREL21B 0x49
+#define R_IA64_PCREL21M 0x4a
+#define R_IA64_PCREL21F 0x4b
+#define R_IA64_PCREL32MSB 0x4c
+#define R_IA64_PCREL32LSB 0x4d
+#define R_IA64_PCREL64MSB 0x4e
+#define R_IA64_PCREL64LSB 0x4f
+#define R_IA64_LTOFF_FPTR22 0x52
+#define R_IA64_LTOFF_FPTR64I 0x53
+#define R_IA64_LTOFF_FPTR32MSB 0x54
+#define R_IA64_LTOFF_FPTR32LSB 0x55
+#define R_IA64_LTOFF_FPTR64MSB 0x56
+#define R_IA64_LTOFF_FPTR64LSB 0x57
+#define R_IA64_SEGREL32MSB 0x5c
+#define R_IA64_SEGREL32LSB 0x5d
+#define R_IA64_SEGREL64MSB 0x5e
+#define R_IA64_SEGREL64LSB 0x5f
+#define R_IA64_SECREL32MSB 0x64
+#define R_IA64_SECREL32LSB 0x65
+#define R_IA64_SECREL64MSB 0x66
+#define R_IA64_SECREL64LSB 0x67
+#define R_IA64_REL32MSB 0x6c
+#define R_IA64_REL32LSB 0x6d
+#define R_IA64_REL64MSB 0x6e
+#define R_IA64_REL64LSB 0x6f
+#define R_IA64_LTV32MSB 0x74
+#define R_IA64_LTV32LSB 0x75
+#define R_IA64_LTV64MSB 0x76
+#define R_IA64_LTV64LSB 0x77
+#define R_IA64_PCREL21BI 0x79
+#define R_IA64_PCREL22 0x7a
+#define R_IA64_PCREL64I 0x7b
+#define R_IA64_IPLTMSB 0x80
+#define R_IA64_IPLTLSB 0x81
+#define R_IA64_COPY 0x84
+#define R_IA64_SUB 0x85
+#define R_IA64_LTOFF22X 0x86
+#define R_IA64_LDXMOV 0x87
+#define R_IA64_TPREL14 0x91
+#define R_IA64_TPREL22 0x92
+#define R_IA64_TPREL64I 0x93
+#define R_IA64_TPREL64MSB 0x96
+#define R_IA64_TPREL64LSB 0x97
+#define R_IA64_LTOFF_TPREL22 0x9a
+#define R_IA64_DTPMOD64MSB 0xa6
+#define R_IA64_DTPMOD64LSB 0xa7
+#define R_IA64_LTOFF_DTPMOD22 0xaa
+#define R_IA64_DTPREL14 0xb1
+#define R_IA64_DTPREL22 0xb2
+#define R_IA64_DTPREL64I 0xb3
+#define R_IA64_DTPREL32MSB 0xb4
+#define R_IA64_DTPREL32LSB 0xb5
+#define R_IA64_DTPREL64MSB 0xb6
+#define R_IA64_DTPREL64LSB 0xb7
+#define R_IA64_LTOFF_DTPREL22 0xba
+
+
+#define EF_SH_MACH_MASK 0x1f
+#define EF_SH_UNKNOWN 0x0
+#define EF_SH1 0x1
+#define EF_SH2 0x2
+#define EF_SH3 0x3
+#define EF_SH_DSP 0x4
+#define EF_SH3_DSP 0x5
+#define EF_SH4AL_DSP 0x6
+#define EF_SH3E 0x8
+#define EF_SH4 0x9
+#define EF_SH2E 0xb
+#define EF_SH4A 0xc
+#define EF_SH2A 0xd
+#define EF_SH4_NOFPU 0x10
+#define EF_SH4A_NOFPU 0x11
+#define EF_SH4_NOMMU_NOFPU 0x12
+#define EF_SH2A_NOFPU 0x13
+#define EF_SH3_NOMMU 0x14
+#define EF_SH2A_SH4_NOFPU 0x15
+#define EF_SH2A_SH3_NOFPU 0x16
+#define EF_SH2A_SH4 0x17
+#define EF_SH2A_SH3E 0x18
+
+#define R_SH_NONE 0
+#define R_SH_DIR32 1
+#define R_SH_REL32 2
+#define R_SH_DIR8WPN 3
+#define R_SH_IND12W 4
+#define R_SH_DIR8WPL 5
+#define R_SH_DIR8WPZ 6
+#define R_SH_DIR8BP 7
+#define R_SH_DIR8W 8
+#define R_SH_DIR8L 9
+#define R_SH_SWITCH16 25
+#define R_SH_SWITCH32 26
+#define R_SH_USES 27
+#define R_SH_COUNT 28
+#define R_SH_ALIGN 29
+#define R_SH_CODE 30
+#define R_SH_DATA 31
+#define R_SH_LABEL 32
+#define R_SH_SWITCH8 33
+#define R_SH_GNU_VTINHERIT 34
+#define R_SH_GNU_VTENTRY 35
+#define R_SH_TLS_GD_32 144
+#define R_SH_TLS_LD_32 145
+#define R_SH_TLS_LDO_32 146
+#define R_SH_TLS_IE_32 147
+#define R_SH_TLS_LE_32 148
+#define R_SH_TLS_DTPMOD32 149
+#define R_SH_TLS_DTPOFF32 150
+#define R_SH_TLS_TPOFF32 151
+#define R_SH_GOT32 160
+#define R_SH_PLT32 161
+#define R_SH_COPY 162
+#define R_SH_GLOB_DAT 163
+#define R_SH_JMP_SLOT 164
+#define R_SH_RELATIVE 165
+#define R_SH_GOTOFF 166
+#define R_SH_GOTPC 167
+#define R_SH_GOT20 201
+#define R_SH_GOTOFF20 202
+#define R_SH_GOTFUNCDESC 203
+#define R_SH_GOTFUNCDEST20 204
+#define R_SH_GOTOFFFUNCDESC 205
+#define R_SH_GOTOFFFUNCDEST20 206
+#define R_SH_FUNCDESC 207
+#define R_SH_FUNCDESC_VALUE 208
+
+#define R_SH_NUM 256
+
+
+
+#define R_390_NONE 0
+#define R_390_8 1
+#define R_390_12 2
+#define R_390_16 3
+#define R_390_32 4
+#define R_390_PC32 5
+#define R_390_GOT12 6
+#define R_390_GOT32 7
+#define R_390_PLT32 8
+#define R_390_COPY 9
+#define R_390_GLOB_DAT 10
+#define R_390_JMP_SLOT 11
+#define R_390_RELATIVE 12
+#define R_390_GOTOFF32 13
+#define R_390_GOTPC 14
+#define R_390_GOT16 15
+#define R_390_PC16 16
+#define R_390_PC16DBL 17
+#define R_390_PLT16DBL 18
+#define R_390_PC32DBL 19
+#define R_390_PLT32DBL 20
+#define R_390_GOTPCDBL 21
+#define R_390_64 22
+#define R_390_PC64 23
+#define R_390_GOT64 24
+#define R_390_PLT64 25
+#define R_390_GOTENT 26
+#define R_390_GOTOFF16 27
+#define R_390_GOTOFF64 28
+#define R_390_GOTPLT12 29
+#define R_390_GOTPLT16 30
+#define R_390_GOTPLT32 31
+#define R_390_GOTPLT64 32
+#define R_390_GOTPLTENT 33
+#define R_390_PLTOFF16 34
+#define R_390_PLTOFF32 35
+#define R_390_PLTOFF64 36
+#define R_390_TLS_LOAD 37
+#define R_390_TLS_GDCALL 38
+
+#define R_390_TLS_LDCALL 39
+
+#define R_390_TLS_GD32 40
+
+#define R_390_TLS_GD64 41
+
+#define R_390_TLS_GOTIE12 42
+
+#define R_390_TLS_GOTIE32 43
+
+#define R_390_TLS_GOTIE64 44
+
+#define R_390_TLS_LDM32 45
+
+#define R_390_TLS_LDM64 46
+
+#define R_390_TLS_IE32 47
+
+#define R_390_TLS_IE64 48
+
+#define R_390_TLS_IEENT 49
+
+#define R_390_TLS_LE32 50
+
+#define R_390_TLS_LE64 51
+
+#define R_390_TLS_LDO32 52
+
+#define R_390_TLS_LDO64 53
+
+#define R_390_TLS_DTPMOD 54
+#define R_390_TLS_DTPOFF 55
+#define R_390_TLS_TPOFF 56
+
+#define R_390_20 57
+#define R_390_GOT20 58
+#define R_390_GOTPLT20 59
+#define R_390_TLS_GOTIE20 60
+
+
+#define R_390_NUM 61
+
+
+
+#define R_CRIS_NONE 0
+#define R_CRIS_8 1
+#define R_CRIS_16 2
+#define R_CRIS_32 3
+#define R_CRIS_8_PCREL 4
+#define R_CRIS_16_PCREL 5
+#define R_CRIS_32_PCREL 6
+#define R_CRIS_GNU_VTINHERIT 7
+#define R_CRIS_GNU_VTENTRY 8
+#define R_CRIS_COPY 9
+#define R_CRIS_GLOB_DAT 10
+#define R_CRIS_JUMP_SLOT 11
+#define R_CRIS_RELATIVE 12
+#define R_CRIS_16_GOT 13
+#define R_CRIS_32_GOT 14
+#define R_CRIS_16_GOTPLT 15
+#define R_CRIS_32_GOTPLT 16
+#define R_CRIS_32_GOTREL 17
+#define R_CRIS_32_PLT_GOTREL 18
+#define R_CRIS_32_PLT_PCREL 19
+
+#define R_CRIS_NUM 20
+
+
+
+#define R_X86_64_NONE 0
+#define R_X86_64_64 1
+#define R_X86_64_PC32 2
+#define R_X86_64_GOT32 3
+#define R_X86_64_PLT32 4
+#define R_X86_64_COPY 5
+#define R_X86_64_GLOB_DAT 6
+#define R_X86_64_JUMP_SLOT 7
+#define R_X86_64_RELATIVE 8
+#define R_X86_64_GOTPCREL 9
+
+#define R_X86_64_32 10
+#define R_X86_64_32S 11
+#define R_X86_64_16 12
+#define R_X86_64_PC16 13
+#define R_X86_64_8 14
+#define R_X86_64_PC8 15
+#define R_X86_64_DTPMOD64 16
+#define R_X86_64_DTPOFF64 17
+#define R_X86_64_TPOFF64 18
+#define R_X86_64_TLSGD 19
+
+#define R_X86_64_TLSLD 20
+
+#define R_X86_64_DTPOFF32 21
+#define R_X86_64_GOTTPOFF 22
+
+#define R_X86_64_TPOFF32 23
+#define R_X86_64_PC64 24
+#define R_X86_64_GOTOFF64 25
+#define R_X86_64_GOTPC32 26
+#define R_X86_64_GOT64 27
+#define R_X86_64_GOTPCREL64 28
+#define R_X86_64_GOTPC64 29
+#define R_X86_64_GOTPLT64 30
+#define R_X86_64_PLTOFF64 31
+#define R_X86_64_SIZE32 32
+#define R_X86_64_SIZE64 33
+
+#define R_X86_64_GOTPC32_TLSDESC 34
+#define R_X86_64_TLSDESC_CALL 35
+
+#define R_X86_64_TLSDESC 36
+#define R_X86_64_IRELATIVE 37
+#define R_X86_64_RELATIVE64 38
+#define R_X86_64_GOTPCRELX 41
+#define R_X86_64_REX_GOTPCRELX 42
+#define R_X86_64_NUM 43
+
+
+
+#define R_MN10300_NONE 0
+#define R_MN10300_32 1
+#define R_MN10300_16 2
+#define R_MN10300_8 3
+#define R_MN10300_PCREL32 4
+#define R_MN10300_PCREL16 5
+#define R_MN10300_PCREL8 6
+#define R_MN10300_GNU_VTINHERIT 7
+#define R_MN10300_GNU_VTENTRY 8
+#define R_MN10300_24 9
+#define R_MN10300_GOTPC32 10
+#define R_MN10300_GOTPC16 11
+#define R_MN10300_GOTOFF32 12
+#define R_MN10300_GOTOFF24 13
+#define R_MN10300_GOTOFF16 14
+#define R_MN10300_PLT32 15
+#define R_MN10300_PLT16 16
+#define R_MN10300_GOT32 17
+#define R_MN10300_GOT24 18
+#define R_MN10300_GOT16 19
+#define R_MN10300_COPY 20
+#define R_MN10300_GLOB_DAT 21
+#define R_MN10300_JMP_SLOT 22
+#define R_MN10300_RELATIVE 23
+
+#define R_MN10300_NUM 24
+
+
+
+#define R_M32R_NONE 0
+#define R_M32R_16 1
+#define R_M32R_32 2
+#define R_M32R_24 3
+#define R_M32R_10_PCREL 4
+#define R_M32R_18_PCREL 5
+#define R_M32R_26_PCREL 6
+#define R_M32R_HI16_ULO 7
+#define R_M32R_HI16_SLO 8
+#define R_M32R_LO16 9
+#define R_M32R_SDA16 10
+#define R_M32R_GNU_VTINHERIT 11
+#define R_M32R_GNU_VTENTRY 12
+
+#define R_M32R_16_RELA 33
+#define R_M32R_32_RELA 34
+#define R_M32R_24_RELA 35
+#define R_M32R_10_PCREL_RELA 36
+#define R_M32R_18_PCREL_RELA 37
+#define R_M32R_26_PCREL_RELA 38
+#define R_M32R_HI16_ULO_RELA 39
+#define R_M32R_HI16_SLO_RELA 40
+#define R_M32R_LO16_RELA 41
+#define R_M32R_SDA16_RELA 42
+#define R_M32R_RELA_GNU_VTINHERIT 43
+#define R_M32R_RELA_GNU_VTENTRY 44
+#define R_M32R_REL32 45
+
+#define R_M32R_GOT24 48
+#define R_M32R_26_PLTREL 49
+#define R_M32R_COPY 50
+#define R_M32R_GLOB_DAT 51
+#define R_M32R_JMP_SLOT 52
+#define R_M32R_RELATIVE 53
+#define R_M32R_GOTOFF 54
+#define R_M32R_GOTPC24 55
+#define R_M32R_GOT16_HI_ULO 56
+
+#define R_M32R_GOT16_HI_SLO 57
+
+#define R_M32R_GOT16_LO 58
+#define R_M32R_GOTPC_HI_ULO 59
+
+#define R_M32R_GOTPC_HI_SLO 60
+
+#define R_M32R_GOTPC_LO 61
+
+#define R_M32R_GOTOFF_HI_ULO 62
+
+#define R_M32R_GOTOFF_HI_SLO 63
+
+#define R_M32R_GOTOFF_LO 64
+#define R_M32R_NUM 256
+
+#define R_MICROBLAZE_NONE 0
+#define R_MICROBLAZE_32 1
+#define R_MICROBLAZE_32_PCREL 2
+#define R_MICROBLAZE_64_PCREL 3
+#define R_MICROBLAZE_32_PCREL_LO 4
+#define R_MICROBLAZE_64 5
+#define R_MICROBLAZE_32_LO 6
+#define R_MICROBLAZE_SRO32 7
+#define R_MICROBLAZE_SRW32 8
+#define R_MICROBLAZE_64_NONE 9
+#define R_MICROBLAZE_32_SYM_OP_SYM 10
+#define R_MICROBLAZE_GNU_VTINHERIT 11
+#define R_MICROBLAZE_GNU_VTENTRY 12
+#define R_MICROBLAZE_GOTPC_64 13
+#define R_MICROBLAZE_GOT_64 14
+#define R_MICROBLAZE_PLT_64 15
+#define R_MICROBLAZE_REL 16
+#define R_MICROBLAZE_JUMP_SLOT 17
+#define R_MICROBLAZE_GLOB_DAT 18
+#define R_MICROBLAZE_GOTOFF_64 19
+#define R_MICROBLAZE_GOTOFF_32 20
+#define R_MICROBLAZE_COPY 21
+#define R_MICROBLAZE_TLS 22
+#define R_MICROBLAZE_TLSGD 23
+#define R_MICROBLAZE_TLSLD 24
+#define R_MICROBLAZE_TLSDTPMOD32 25
+#define R_MICROBLAZE_TLSDTPREL32 26
+#define R_MICROBLAZE_TLSDTPREL64 27
+#define R_MICROBLAZE_TLSGOTTPREL32 28
+#define R_MICROBLAZE_TLSTPREL32 29
+
+#define DT_NIOS2_GP 0x70000002
+
+#define R_NIOS2_NONE 0
+#define R_NIOS2_S16 1
+#define R_NIOS2_U16 2
+#define R_NIOS2_PCREL16 3
+#define R_NIOS2_CALL26 4
+#define R_NIOS2_IMM5 5
+#define R_NIOS2_CACHE_OPX 6
+#define R_NIOS2_IMM6 7
+#define R_NIOS2_IMM8 8
+#define R_NIOS2_HI16 9
+#define R_NIOS2_LO16 10
+#define R_NIOS2_HIADJ16 11
+#define R_NIOS2_BFD_RELOC_32 12
+#define R_NIOS2_BFD_RELOC_16 13
+#define R_NIOS2_BFD_RELOC_8 14
+#define R_NIOS2_GPREL 15
+#define R_NIOS2_GNU_VTINHERIT 16
+#define R_NIOS2_GNU_VTENTRY 17
+#define R_NIOS2_UJMP 18
+#define R_NIOS2_CJMP 19
+#define R_NIOS2_CALLR 20
+#define R_NIOS2_ALIGN 21
+#define R_NIOS2_GOT16 22
+#define R_NIOS2_CALL16 23
+#define R_NIOS2_GOTOFF_LO 24
+#define R_NIOS2_GOTOFF_HA 25
+#define R_NIOS2_PCREL_LO 26
+#define R_NIOS2_PCREL_HA 27
+#define R_NIOS2_TLS_GD16 28
+#define R_NIOS2_TLS_LDM16 29
+#define R_NIOS2_TLS_LDO16 30
+#define R_NIOS2_TLS_IE16 31
+#define R_NIOS2_TLS_LE16 32
+#define R_NIOS2_TLS_DTPMOD 33
+#define R_NIOS2_TLS_DTPREL 34
+#define R_NIOS2_TLS_TPREL 35
+#define R_NIOS2_COPY 36
+#define R_NIOS2_GLOB_DAT 37
+#define R_NIOS2_JUMP_SLOT 38
+#define R_NIOS2_RELATIVE 39
+#define R_NIOS2_GOTOFF 40
+#define R_NIOS2_CALL26_NOAT 41
+#define R_NIOS2_GOT_LO 42
+#define R_NIOS2_GOT_HA 43
+#define R_NIOS2_CALL_LO 44
+#define R_NIOS2_CALL_HA 45
+
+#define R_OR1K_NONE 0
+#define R_OR1K_32 1
+#define R_OR1K_16 2
+#define R_OR1K_8 3
+#define R_OR1K_LO_16_IN_INSN 4
+#define R_OR1K_HI_16_IN_INSN 5
+#define R_OR1K_INSN_REL_26 6
+#define R_OR1K_GNU_VTENTRY 7
+#define R_OR1K_GNU_VTINHERIT 8
+#define R_OR1K_32_PCREL 9
+#define R_OR1K_16_PCREL 10
+#define R_OR1K_8_PCREL 11
+#define R_OR1K_GOTPC_HI16 12
+#define R_OR1K_GOTPC_LO16 13
+#define R_OR1K_GOT16 14
+#define R_OR1K_PLT26 15
+#define R_OR1K_GOTOFF_HI16 16
+#define R_OR1K_GOTOFF_LO16 17
+#define R_OR1K_COPY 18
+#define R_OR1K_GLOB_DAT 19
+#define R_OR1K_JMP_SLOT 20
+#define R_OR1K_RELATIVE 21
+#define R_OR1K_TLS_GD_HI16 22
+#define R_OR1K_TLS_GD_LO16 23
+#define R_OR1K_TLS_LDM_HI16 24
+#define R_OR1K_TLS_LDM_LO16 25
+#define R_OR1K_TLS_LDO_HI16 26
+#define R_OR1K_TLS_LDO_LO16 27
+#define R_OR1K_TLS_IE_HI16 28
+#define R_OR1K_TLS_IE_LO16 29
+#define R_OR1K_TLS_LE_HI16 30
+#define R_OR1K_TLS_LE_LO16 31
+#define R_OR1K_TLS_TPOFF 32
+#define R_OR1K_TLS_DTPOFF 33
+#define R_OR1K_TLS_DTPMOD 34
+
+#define R_BPF_NONE 0
+#define R_BPF_MAP_FD 1
+
+#define R_RISCV_NONE 0
+#define R_RISCV_32 1
+#define R_RISCV_64 2
+#define R_RISCV_RELATIVE 3
+#define R_RISCV_COPY 4
+#define R_RISCV_JUMP_SLOT 5
+#define R_RISCV_TLS_DTPMOD32 6
+#define R_RISCV_TLS_DTPMOD64 7
+#define R_RISCV_TLS_DTPREL32 8
+#define R_RISCV_TLS_DTPREL64 9
+#define R_RISCV_TLS_TPREL32 10
+#define R_RISCV_TLS_TPREL64 11
+
+#define R_RISCV_BRANCH 16
+#define R_RISCV_JAL 17
+#define R_RISCV_CALL 18
+#define R_RISCV_CALL_PLT 19
+#define R_RISCV_GOT_HI20 20
+#define R_RISCV_TLS_GOT_HI20 21
+#define R_RISCV_TLS_GD_HI20 22
+#define R_RISCV_PCREL_HI20 23
+#define R_RISCV_PCREL_LO12_I 24
+#define R_RISCV_PCREL_LO12_S 25
+#define R_RISCV_HI20 26
+#define R_RISCV_LO12_I 27
+#define R_RISCV_LO12_S 28
+#define R_RISCV_TPREL_HI20 29
+#define R_RISCV_TPREL_LO12_I 30
+#define R_RISCV_TPREL_LO12_S 31
+#define R_RISCV_TPREL_ADD 32
+#define R_RISCV_ADD8 33
+#define R_RISCV_ADD16 34
+#define R_RISCV_ADD32 35
+#define R_RISCV_ADD64 36
+#define R_RISCV_SUB8 37
+#define R_RISCV_SUB16 38
+#define R_RISCV_SUB32 39
+#define R_RISCV_SUB64 40
+#define R_RISCV_GNU_VTINHERIT 41
+#define R_RISCV_GNU_VTENTRY 42
+#define R_RISCV_ALIGN 43
+#define R_RISCV_RVC_BRANCH 44
+#define R_RISCV_RVC_JUMP 45
+#define R_RISCV_RVC_LUI 46
+#define R_RISCV_GPREL_I 47
+#define R_RISCV_GPREL_S 48
+#define R_RISCV_TPREL_I 49
+#define R_RISCV_TPREL_S 50
+#define R_RISCV_RELAX 51
+#define R_RISCV_SUB6 52
+#define R_RISCV_SET6 53
+#define R_RISCV_SET8 54
+#define R_RISCV_SET16 55
+#define R_RISCV_SET32 56
+#define R_RISCV_32_PCREL 57
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/libc-top-half/musl/include/endian.h b/libc-top-half/musl/include/endian.h
new file mode 100644
index 0000000..172c432
--- /dev/null
+++ b/libc-top-half/musl/include/endian.h
@@ -0,0 +1,80 @@
+#ifndef _ENDIAN_H
+#define _ENDIAN_H
+
+#include <features.h>
+
+#define __NEED_uint16_t
+#define __NEED_uint32_t
+#define __NEED_uint64_t
+
+#include <bits/alltypes.h>
+
+#define __PDP_ENDIAN 3412
+
+#define BIG_ENDIAN __BIG_ENDIAN
+#define LITTLE_ENDIAN __LITTLE_ENDIAN
+#define PDP_ENDIAN __PDP_ENDIAN
+#define BYTE_ORDER __BYTE_ORDER
+
+static __inline uint16_t __bswap16(uint16_t __x)
+{
+ return __x<<8 | __x>>8;
+}
+
+static __inline uint32_t __bswap32(uint32_t __x)
+{
+ return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24;
+}
+
+static __inline uint64_t __bswap64(uint64_t __x)
+{
+ return __bswap32(__x)+0ULL<<32 | __bswap32(__x>>32);
+}
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define htobe16(x) __bswap16(x)
+#define be16toh(x) __bswap16(x)
+#define htobe32(x) __bswap32(x)
+#define be32toh(x) __bswap32(x)
+#define htobe64(x) __bswap64(x)
+#define be64toh(x) __bswap64(x)
+#define htole16(x) (uint16_t)(x)
+#define le16toh(x) (uint16_t)(x)
+#define htole32(x) (uint32_t)(x)
+#define le32toh(x) (uint32_t)(x)
+#define htole64(x) (uint64_t)(x)
+#define le64toh(x) (uint64_t)(x)
+#else
+#define htobe16(x) (uint16_t)(x)
+#define be16toh(x) (uint16_t)(x)
+#define htobe32(x) (uint32_t)(x)
+#define be32toh(x) (uint32_t)(x)
+#define htobe64(x) (uint64_t)(x)
+#define be64toh(x) (uint64_t)(x)
+#define htole16(x) __bswap16(x)
+#define le16toh(x) __bswap16(x)
+#define htole32(x) __bswap32(x)
+#define le32toh(x) __bswap32(x)
+#define htole64(x) __bswap64(x)
+#define le64toh(x) __bswap64(x)
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define betoh16(x) __bswap16(x)
+#define betoh32(x) __bswap32(x)
+#define betoh64(x) __bswap64(x)
+#define letoh16(x) (uint16_t)(x)
+#define letoh32(x) (uint32_t)(x)
+#define letoh64(x) (uint64_t)(x)
+#else
+#define betoh16(x) (uint16_t)(x)
+#define betoh32(x) (uint32_t)(x)
+#define betoh64(x) (uint64_t)(x)
+#define letoh16(x) __bswap16(x)
+#define letoh32(x) __bswap32(x)
+#define letoh64(x) __bswap64(x)
+#endif
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/err.h b/libc-top-half/musl/include/err.h
new file mode 100644
index 0000000..9f5cb6b
--- /dev/null
+++ b/libc-top-half/musl/include/err.h
@@ -0,0 +1,25 @@
+#ifndef _ERR_H
+#define _ERR_H
+
+#include <features.h>
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void warn(const char *, ...);
+void vwarn(const char *, va_list);
+void warnx(const char *, ...);
+void vwarnx(const char *, va_list);
+
+_Noreturn void err(int, const char *, ...);
+_Noreturn void verr(int, const char *, va_list);
+_Noreturn void errx(int, const char *, ...);
+_Noreturn void verrx(int, const char *, va_list);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/errno.h b/libc-top-half/musl/include/errno.h
new file mode 100644
index 0000000..0252e1b
--- /dev/null
+++ b/libc-top-half/musl/include/errno.h
@@ -0,0 +1,32 @@
+#ifndef _ERRNO_H
+#define _ERRNO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#include <bits/errno.h>
+
+#ifdef __GNUC__
+__attribute__((const))
+#endif
+int *__errno_location(void);
+#define errno (*__errno_location())
+#else
+#include <__errno.h>
+#include <__errno_values.h>
+#endif
+
+#ifdef _GNU_SOURCE
+extern char *program_invocation_short_name, *program_invocation_name;
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/libc-top-half/musl/include/fcntl.h b/libc-top-half/musl/include/fcntl.h
new file mode 100644
index 0000000..15bef28
--- /dev/null
+++ b/libc-top-half/musl/include/fcntl.h
@@ -0,0 +1,246 @@
+#ifndef _FCNTL_H
+#define _FCNTL_H
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#else
+#include <__header_fcntl.h>
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_off_t
+#define __NEED_pid_t
+#define __NEED_mode_t
+
+#ifdef _GNU_SOURCE
+#define __NEED_size_t
+#define __NEED_ssize_t
+#define __NEED_struct_iovec
+#endif
+
+#include <bits/alltypes.h>
+
+#include <bits/fcntl.h>
+
+struct flock {
+ short l_type;
+ short l_whence;
+ off_t l_start;
+ off_t l_len;
+ pid_t l_pid;
+};
+
+int creat(const char *, mode_t);
+int fcntl(int, int, ...);
+int open(const char *, int, ...);
+int openat(int, const char *, int, ...);
+int posix_fadvise(int, off_t, off_t, int);
+int posix_fallocate(int, off_t, off_t);
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#define O_SEARCH O_PATH
+#define O_EXEC O_PATH
+#define O_TTY_INIT 0
+
+#define O_ACCMODE (03|O_SEARCH)
+#define O_RDONLY 00
+#define O_WRONLY 01
+#define O_RDWR 02
+
+#define F_OFD_GETLK 36
+#define F_OFD_SETLK 37
+#define F_OFD_SETLKW 38
+
+#define F_DUPFD_CLOEXEC 1030
+
+#define F_RDLCK 0
+#define F_WRLCK 1
+#define F_UNLCK 2
+
+#define FD_CLOEXEC 1
+
+#define AT_FDCWD (-100)
+#define AT_SYMLINK_NOFOLLOW 0x100
+#define AT_REMOVEDIR 0x200
+#define AT_SYMLINK_FOLLOW 0x400
+#define AT_EACCESS 0x200
+
+#define POSIX_FADV_NORMAL 0
+#define POSIX_FADV_RANDOM 1
+#define POSIX_FADV_SEQUENTIAL 2
+#define POSIX_FADV_WILLNEED 3
+#ifndef POSIX_FADV_DONTNEED
+#define POSIX_FADV_DONTNEED 4
+#define POSIX_FADV_NOREUSE 5
+#endif
+
+#undef SEEK_SET
+#undef SEEK_CUR
+#undef SEEK_END
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
+
+#ifndef S_IRUSR
+#define S_ISUID 04000
+#define S_ISGID 02000
+#define S_ISVTX 01000
+#define S_IRUSR 0400
+#define S_IWUSR 0200
+#define S_IXUSR 0100
+#define S_IRWXU 0700
+#define S_IRGRP 0040
+#define S_IWGRP 0020
+#define S_IXGRP 0010
+#define S_IRWXG 0070
+#define S_IROTH 0004
+#define S_IWOTH 0002
+#define S_IXOTH 0001
+#define S_IRWXO 0007
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define AT_NO_AUTOMOUNT 0x800
+#define AT_EMPTY_PATH 0x1000
+#define AT_STATX_SYNC_TYPE 0x6000
+#define AT_STATX_SYNC_AS_STAT 0x0000
+#define AT_STATX_FORCE_SYNC 0x2000
+#define AT_STATX_DONT_SYNC 0x4000
+#define AT_RECURSIVE 0x8000
+
+#define FAPPEND O_APPEND
+#define FFSYNC O_SYNC
+#define FASYNC O_ASYNC
+#define FNONBLOCK O_NONBLOCK
+#define FNDELAY O_NDELAY
+
+#define F_OK 0
+#define R_OK 4
+#define W_OK 2
+#define X_OK 1
+#define F_ULOCK 0
+#define F_LOCK 1
+#define F_TLOCK 2
+#define F_TEST 3
+
+#define F_SETLEASE 1024
+#define F_GETLEASE 1025
+#define F_NOTIFY 1026
+#define F_CANCELLK 1029
+#define F_SETPIPE_SZ 1031
+#define F_GETPIPE_SZ 1032
+#define F_ADD_SEALS 1033
+#define F_GET_SEALS 1034
+
+#define F_SEAL_SEAL 0x0001
+#define F_SEAL_SHRINK 0x0002
+#define F_SEAL_GROW 0x0004
+#define F_SEAL_WRITE 0x0008
+#define F_SEAL_FUTURE_WRITE 0x0010
+
+#define F_GET_RW_HINT 1035
+#define F_SET_RW_HINT 1036
+#define F_GET_FILE_RW_HINT 1037
+#define F_SET_FILE_RW_HINT 1038
+
+#define RWF_WRITE_LIFE_NOT_SET 0
+#define RWH_WRITE_LIFE_NONE 1
+#define RWH_WRITE_LIFE_SHORT 2
+#define RWH_WRITE_LIFE_MEDIUM 3
+#define RWH_WRITE_LIFE_LONG 4
+#define RWH_WRITE_LIFE_EXTREME 5
+
+#define DN_ACCESS 0x00000001
+#define DN_MODIFY 0x00000002
+#define DN_CREATE 0x00000004
+#define DN_DELETE 0x00000008
+#define DN_RENAME 0x00000010
+#define DN_ATTRIB 0x00000020
+#define DN_MULTISHOT 0x80000000
+
+int lockf(int, int, off_t);
+#endif
+#endif
+
+#if defined(_GNU_SOURCE)
+#ifdef __wasilibc_unmodified_upstream /* WASI has no name_to_handle_at */
+#define F_OWNER_TID 0
+#define F_OWNER_PID 1
+#define F_OWNER_PGRP 2
+#define F_OWNER_GID 2
+struct file_handle {
+ unsigned handle_bytes;
+ int handle_type;
+ unsigned char f_handle[];
+};
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no F_GETOWN_EX */
+struct f_owner_ex {
+ int type;
+ pid_t pid;
+};
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no fallocate */
+#define FALLOC_FL_KEEP_SIZE 1
+#define FALLOC_FL_PUNCH_HOLE 2
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no name_to_handle_at */
+#define MAX_HANDLE_SZ 128
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no syc_file_range */
+#define SYNC_FILE_RANGE_WAIT_BEFORE 1
+#define SYNC_FILE_RANGE_WRITE 2
+#define SYNC_FILE_RANGE_WAIT_AFTER 4
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no splice */
+#define SPLICE_F_MOVE 1
+#define SPLICE_F_NONBLOCK 2
+#define SPLICE_F_MORE 4
+#define SPLICE_F_GIFT 8
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no fallocate */
+int fallocate(int, int, off_t, off_t);
+#define fallocate64 fallocate
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no name_to_handle_at */
+int name_to_handle_at(int, const char *, struct file_handle *, int *, int);
+int open_by_handle_at(int, struct file_handle *, int);
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no readahead */
+ssize_t readahead(int, off_t, size_t);
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no splice, syc_file_range, or tee */
+int sync_file_range(int, off_t, off_t, unsigned);
+ssize_t vmsplice(int, const struct iovec *, size_t, unsigned);
+ssize_t splice(int, off_t *, int, off_t *, size_t, unsigned);
+ssize_t tee(int, int, size_t, unsigned);
+#endif
+#define loff_t off_t
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#ifdef __wasilibc_unmodified_upstream /* WASI has no POSIX file locking */
+#define F_GETLK64 F_GETLK
+#define F_SETLK64 F_SETLK
+#define F_SETLKW64 F_SETLKW
+#define flock64 flock
+#endif
+#define open64 open
+#define openat64 openat
+#define creat64 creat
+#ifdef __wasilibc_unmodified_upstream /* WASI has no POSIX file locking */
+#define lockf64 lockf
+#endif
+#define posix_fadvise64 posix_fadvise
+#define posix_fallocate64 posix_fallocate
+#define off64_t off_t
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/features.h b/libc-top-half/musl/include/features.h
new file mode 100644
index 0000000..85cfb72
--- /dev/null
+++ b/libc-top-half/musl/include/features.h
@@ -0,0 +1,40 @@
+#ifndef _FEATURES_H
+#define _FEATURES_H
+
+#if defined(_ALL_SOURCE) && !defined(_GNU_SOURCE)
+#define _GNU_SOURCE 1
+#endif
+
+#if defined(_DEFAULT_SOURCE) && !defined(_BSD_SOURCE)
+#define _BSD_SOURCE 1
+#endif
+
+#if !defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE) \
+ && !defined(_XOPEN_SOURCE) && !defined(_GNU_SOURCE) \
+ && !defined(_BSD_SOURCE) && !defined(__STRICT_ANSI__)
+#define _BSD_SOURCE 1
+#define _XOPEN_SOURCE 700
+#endif
+
+#if __STDC_VERSION__ >= 199901L
+#define __restrict restrict
+#elif !defined(__GNUC__)
+#define __restrict
+#endif
+
+#if __STDC_VERSION__ >= 199901L || defined(__cplusplus)
+#define __inline inline
+#elif !defined(__GNUC__)
+#define __inline
+#endif
+
+#if __STDC_VERSION__ >= 201112L
+#elif defined(__GNUC__)
+#define _Noreturn __attribute__((__noreturn__))
+#else
+#define _Noreturn
+#endif
+
+#define __REDIR(x,y) __typeof__(x) x __asm__(#y)
+
+#endif
diff --git a/libc-top-half/musl/include/fenv.h b/libc-top-half/musl/include/fenv.h
new file mode 100644
index 0000000..05de990
--- /dev/null
+++ b/libc-top-half/musl/include/fenv.h
@@ -0,0 +1,28 @@
+#ifndef _FENV_H
+#define _FENV_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <bits/fenv.h>
+
+int feclearexcept(int);
+int fegetexceptflag(fexcept_t *, int);
+int feraiseexcept(int);
+int fesetexceptflag(const fexcept_t *, int);
+int fetestexcept(int);
+
+int fegetround(void);
+int fesetround(int);
+
+int fegetenv(fenv_t *);
+int feholdexcept(fenv_t *);
+int fesetenv(const fenv_t *);
+int feupdateenv(const fenv_t *);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/libc-top-half/musl/include/float.h b/libc-top-half/musl/include/float.h
new file mode 100644
index 0000000..85ce20c
--- /dev/null
+++ b/libc-top-half/musl/include/float.h
@@ -0,0 +1,56 @@
+#ifndef _FLOAT_H
+#define _FLOAT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of FLT_ROUNDS */
+int __flt_rounds(void);
+#define FLT_ROUNDS (__flt_rounds())
+#else
+#define FLT_ROUNDS (__builtin_flt_rounds())
+#endif
+
+#define FLT_RADIX 2
+
+#define FLT_TRUE_MIN 1.40129846432481707092e-45F
+#define FLT_MIN 1.17549435082228750797e-38F
+#define FLT_MAX 3.40282346638528859812e+38F
+#define FLT_EPSILON 1.1920928955078125e-07F
+
+#define FLT_MANT_DIG 24
+#define FLT_MIN_EXP (-125)
+#define FLT_MAX_EXP 128
+#define FLT_HAS_SUBNORM 1
+
+#define FLT_DIG 6
+#define FLT_DECIMAL_DIG 9
+#define FLT_MIN_10_EXP (-37)
+#define FLT_MAX_10_EXP 38
+
+#define DBL_TRUE_MIN 4.94065645841246544177e-324
+#define DBL_MIN 2.22507385850720138309e-308
+#define DBL_MAX 1.79769313486231570815e+308
+#define DBL_EPSILON 2.22044604925031308085e-16
+
+#define DBL_MANT_DIG 53
+#define DBL_MIN_EXP (-1021)
+#define DBL_MAX_EXP 1024
+#define DBL_HAS_SUBNORM 1
+
+#define DBL_DIG 15
+#define DBL_DECIMAL_DIG 17
+#define DBL_MIN_10_EXP (-307)
+#define DBL_MAX_10_EXP 308
+
+#define LDBL_HAS_SUBNORM 1
+#define LDBL_DECIMAL_DIG DECIMAL_DIG
+
+#include <bits/float.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/fmtmsg.h b/libc-top-half/musl/include/fmtmsg.h
new file mode 100644
index 0000000..d944b06
--- /dev/null
+++ b/libc-top-half/musl/include/fmtmsg.h
@@ -0,0 +1,47 @@
+#ifndef _FMTMSG_H
+#define _FMTMSG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MM_HARD 1
+#define MM_SOFT 2
+#define MM_FIRM 4
+
+#define MM_APPL 8
+#define MM_UTIL 16
+#define MM_OPSYS 32
+
+#define MM_RECOVER 64
+#define MM_NRECOV 128
+
+#define MM_PRINT 256
+#define MM_CONSOLE 512
+
+#define MM_NULLMC 0L
+
+#define MM_HALT 1
+#define MM_ERROR 2
+#define MM_WARNING 3
+#define MM_INFO 4
+#define MM_NOSEV 0
+
+#define MM_OK 0
+#define MM_NOTOK (-1)
+#define MM_NOMSG 1
+#define MM_NOCON 4
+
+#define MM_NULLLBL ((char*)0)
+#define MM_NULLTXT ((char*)0)
+#define MM_NULLACT ((char*)0)
+#define MM_NULLTAG ((char*)0)
+#define MM_NULLSEV 0
+
+int fmtmsg(long, const char *, int, const char *, const char *, const char *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/fnmatch.h b/libc-top-half/musl/include/fnmatch.h
new file mode 100644
index 0000000..f959321
--- /dev/null
+++ b/libc-top-half/musl/include/fnmatch.h
@@ -0,0 +1,24 @@
+#ifndef _FNMATCH_H
+#define _FNMATCH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define FNM_PATHNAME 0x1
+#define FNM_NOESCAPE 0x2
+#define FNM_PERIOD 0x4
+#define FNM_LEADING_DIR 0x8
+#define FNM_CASEFOLD 0x10
+#define FNM_FILE_NAME FNM_PATHNAME
+
+#define FNM_NOMATCH 1
+#define FNM_NOSYS (-1)
+
+int fnmatch(const char *, const char *, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/ftw.h b/libc-top-half/musl/include/ftw.h
new file mode 100644
index 0000000..2b1b270
--- /dev/null
+++ b/libc-top-half/musl/include/ftw.h
@@ -0,0 +1,45 @@
+#ifndef _FTW_H
+#define _FTW_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+#include <sys/stat.h>
+
+#define FTW_F 1
+#define FTW_D 2
+#define FTW_DNR 3
+#define FTW_NS 4
+#define FTW_SL 5
+#define FTW_DP 6
+#define FTW_SLN 7
+
+#define FTW_PHYS 1
+#define FTW_MOUNT 2
+#define FTW_CHDIR 4
+#define FTW_DEPTH 8
+
+struct FTW {
+ int base;
+ int level;
+};
+
+#ifdef __wasilibc_unmodified_upstream /* WASI libc doesn't build the legacy functions */
+int ftw(const char *, int (*)(const char *, const struct stat *, int), int);
+#endif
+int nftw(const char *, int (*)(const char *, const struct stat *, int, struct FTW *), int, int);
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#ifdef __wasilibc_unmodified_upstream /* WASI libc doesn't build the legacy functions */
+#define ftw64 ftw
+#endif
+#define nftw64 nftw
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/getopt.h b/libc-top-half/musl/include/getopt.h
new file mode 100644
index 0000000..35cbd35
--- /dev/null
+++ b/libc-top-half/musl/include/getopt.h
@@ -0,0 +1,30 @@
+#ifndef _GETOPT_H
+#define _GETOPT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int getopt(int, char * const [], const char *);
+extern char *optarg;
+extern int optind, opterr, optopt, optreset;
+
+struct option {
+ const char *name;
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+int getopt_long(int, char *const *, const char *, const struct option *, int *);
+int getopt_long_only(int, char *const *, const char *, const struct option *, int *);
+
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/glob.h b/libc-top-half/musl/include/glob.h
new file mode 100644
index 0000000..8c4bf15
--- /dev/null
+++ b/libc-top-half/musl/include/glob.h
@@ -0,0 +1,54 @@
+#ifndef _GLOB_H
+#define _GLOB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_size_t
+
+#include <bits/alltypes.h>
+
+typedef struct {
+ size_t gl_pathc;
+ char **gl_pathv;
+ size_t gl_offs;
+ int __dummy1;
+ void *__dummy2[5];
+} glob_t;
+
+int glob(const char *__restrict, int, int (*)(const char *, int), glob_t *__restrict);
+void globfree(glob_t *);
+
+#define GLOB_ERR 0x01
+#define GLOB_MARK 0x02
+#define GLOB_NOSORT 0x04
+#define GLOB_DOOFFS 0x08
+#define GLOB_NOCHECK 0x10
+#define GLOB_APPEND 0x20
+#define GLOB_NOESCAPE 0x40
+#define GLOB_PERIOD 0x80
+
+#ifdef __wasilibc_unmodified_upstream // WASI has no usernames
+#define GLOB_TILDE 0x1000
+#define GLOB_TILDE_CHECK 0x4000
+#endif
+
+#define GLOB_NOSPACE 1
+#define GLOB_ABORTED 2
+#define GLOB_NOMATCH 3
+#define GLOB_NOSYS 4
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#define glob64 glob
+#define globfree64 globfree
+#define glob64_t glob_t
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/grp.h b/libc-top-half/musl/include/grp.h
new file mode 100644
index 0000000..27e8c5e
--- /dev/null
+++ b/libc-top-half/musl/include/grp.h
@@ -0,0 +1,53 @@
+#ifndef _GRP_H
+#define _GRP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_size_t
+#define __NEED_gid_t
+
+#ifdef _GNU_SOURCE
+#define __NEED_FILE
+#endif
+
+#include <bits/alltypes.h>
+
+struct group {
+ char *gr_name;
+ char *gr_passwd;
+ gid_t gr_gid;
+ char **gr_mem;
+};
+
+struct group *getgrgid(gid_t);
+struct group *getgrnam(const char *);
+
+int getgrgid_r(gid_t, struct group *, char *, size_t, struct group **);
+int getgrnam_r(const char *, struct group *, char *, size_t, struct group **);
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+struct group *getgrent(void);
+void endgrent(void);
+void setgrent(void);
+#endif
+
+#ifdef _GNU_SOURCE
+struct group *fgetgrent(FILE *);
+int putgrent(const struct group *, FILE *);
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+int getgrouplist(const char *, gid_t, gid_t *, int *);
+int setgroups(size_t, const gid_t *);
+int initgroups(const char *, gid_t);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/iconv.h b/libc-top-half/musl/include/iconv.h
new file mode 100644
index 0000000..ebe9bfd
--- /dev/null
+++ b/libc-top-half/musl/include/iconv.h
@@ -0,0 +1,24 @@
+#ifndef _ICONV_H
+#define _ICONV_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_size_t
+
+#include <bits/alltypes.h>
+
+typedef void *iconv_t;
+
+iconv_t iconv_open(const char *, const char *);
+size_t iconv(iconv_t, char **__restrict, size_t *__restrict, char **__restrict, size_t *__restrict);
+int iconv_close(iconv_t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/ifaddrs.h b/libc-top-half/musl/include/ifaddrs.h
new file mode 100644
index 0000000..c0328a8
--- /dev/null
+++ b/libc-top-half/musl/include/ifaddrs.h
@@ -0,0 +1,35 @@
+#ifndef _IFADDRS_H
+#define _IFADDRS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+
+struct ifaddrs {
+ struct ifaddrs *ifa_next;
+ char *ifa_name;
+ unsigned ifa_flags;
+ struct sockaddr *ifa_addr;
+ struct sockaddr *ifa_netmask;
+ union {
+ struct sockaddr *ifu_broadaddr;
+ struct sockaddr *ifu_dstaddr;
+ } ifa_ifu;
+ void *ifa_data;
+};
+#define ifa_broadaddr ifa_ifu.ifu_broadaddr
+#define ifa_dstaddr ifa_ifu.ifu_dstaddr
+
+void freeifaddrs(struct ifaddrs *);
+int getifaddrs(struct ifaddrs **);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/libc-top-half/musl/include/inttypes.h b/libc-top-half/musl/include/inttypes.h
new file mode 100644
index 0000000..71b3904
--- /dev/null
+++ b/libc-top-half/musl/include/inttypes.h
@@ -0,0 +1,233 @@
+#ifndef _INTTYPES_H
+#define _INTTYPES_H
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+#include <stdint.h>
+
+#define __NEED_wchar_t
+#include <bits/alltypes.h>
+
+typedef struct { intmax_t quot, rem; } imaxdiv_t;
+
+intmax_t imaxabs(intmax_t);
+imaxdiv_t imaxdiv(intmax_t, intmax_t);
+
+intmax_t strtoimax(const char *__restrict, char **__restrict, int);
+uintmax_t strtoumax(const char *__restrict, char **__restrict, int);
+
+intmax_t wcstoimax(const wchar_t *__restrict, wchar_t **__restrict, int);
+uintmax_t wcstoumax(const wchar_t *__restrict, wchar_t **__restrict, int);
+
+#if UINTPTR_MAX == UINT64_MAX
+#define __PRI64 "l"
+#define __PRIPTR "l"
+#else
+#define __PRI64 "ll"
+#define __PRIPTR ""
+#endif
+
+#define PRId8 "d"
+#define PRId16 "d"
+#define PRId32 "d"
+#define PRId64 __PRI64 "d"
+
+#define PRIdLEAST8 "d"
+#define PRIdLEAST16 "d"
+#define PRIdLEAST32 "d"
+#define PRIdLEAST64 __PRI64 "d"
+
+#define PRIdFAST8 "d"
+#define PRIdFAST16 "d"
+#define PRIdFAST32 "d"
+#define PRIdFAST64 __PRI64 "d"
+
+#define PRIi8 "i"
+#define PRIi16 "i"
+#define PRIi32 "i"
+#define PRIi64 __PRI64 "i"
+
+#define PRIiLEAST8 "i"
+#define PRIiLEAST16 "i"
+#define PRIiLEAST32 "i"
+#define PRIiLEAST64 __PRI64 "i"
+
+#define PRIiFAST8 "i"
+#define PRIiFAST16 "i"
+#define PRIiFAST32 "i"
+#define PRIiFAST64 __PRI64 "i"
+
+#define PRIo8 "o"
+#define PRIo16 "o"
+#define PRIo32 "o"
+#define PRIo64 __PRI64 "o"
+
+#define PRIoLEAST8 "o"
+#define PRIoLEAST16 "o"
+#define PRIoLEAST32 "o"
+#define PRIoLEAST64 __PRI64 "o"
+
+#define PRIoFAST8 "o"
+#define PRIoFAST16 "o"
+#define PRIoFAST32 "o"
+#define PRIoFAST64 __PRI64 "o"
+
+#define PRIu8 "u"
+#define PRIu16 "u"
+#define PRIu32 "u"
+#define PRIu64 __PRI64 "u"
+
+#define PRIuLEAST8 "u"
+#define PRIuLEAST16 "u"
+#define PRIuLEAST32 "u"
+#define PRIuLEAST64 __PRI64 "u"
+
+#define PRIuFAST8 "u"
+#define PRIuFAST16 "u"
+#define PRIuFAST32 "u"
+#define PRIuFAST64 __PRI64 "u"
+
+#define PRIx8 "x"
+#define PRIx16 "x"
+#define PRIx32 "x"
+#define PRIx64 __PRI64 "x"
+
+#define PRIxLEAST8 "x"
+#define PRIxLEAST16 "x"
+#define PRIxLEAST32 "x"
+#define PRIxLEAST64 __PRI64 "x"
+
+#define PRIxFAST8 "x"
+#define PRIxFAST16 "x"
+#define PRIxFAST32 "x"
+#define PRIxFAST64 __PRI64 "x"
+
+#define PRIX8 "X"
+#define PRIX16 "X"
+#define PRIX32 "X"
+#define PRIX64 __PRI64 "X"
+
+#define PRIXLEAST8 "X"
+#define PRIXLEAST16 "X"
+#define PRIXLEAST32 "X"
+#define PRIXLEAST64 __PRI64 "X"
+
+#define PRIXFAST8 "X"
+#define PRIXFAST16 "X"
+#define PRIXFAST32 "X"
+#define PRIXFAST64 __PRI64 "X"
+
+#define PRIdMAX __PRI64 "d"
+#define PRIiMAX __PRI64 "i"
+#define PRIoMAX __PRI64 "o"
+#define PRIuMAX __PRI64 "u"
+#define PRIxMAX __PRI64 "x"
+#define PRIXMAX __PRI64 "X"
+
+#define PRIdPTR __PRIPTR "d"
+#define PRIiPTR __PRIPTR "i"
+#define PRIoPTR __PRIPTR "o"
+#define PRIuPTR __PRIPTR "u"
+#define PRIxPTR __PRIPTR "x"
+#define PRIXPTR __PRIPTR "X"
+
+#define SCNd8 "hhd"
+#define SCNd16 "hd"
+#define SCNd32 "d"
+#define SCNd64 __PRI64 "d"
+
+#define SCNdLEAST8 "hhd"
+#define SCNdLEAST16 "hd"
+#define SCNdLEAST32 "d"
+#define SCNdLEAST64 __PRI64 "d"
+
+#define SCNdFAST8 "hhd"
+#define SCNdFAST16 "d"
+#define SCNdFAST32 "d"
+#define SCNdFAST64 __PRI64 "d"
+
+#define SCNi8 "hhi"
+#define SCNi16 "hi"
+#define SCNi32 "i"
+#define SCNi64 __PRI64 "i"
+
+#define SCNiLEAST8 "hhi"
+#define SCNiLEAST16 "hi"
+#define SCNiLEAST32 "i"
+#define SCNiLEAST64 __PRI64 "i"
+
+#define SCNiFAST8 "hhi"
+#define SCNiFAST16 "i"
+#define SCNiFAST32 "i"
+#define SCNiFAST64 __PRI64 "i"
+
+#define SCNu8 "hhu"
+#define SCNu16 "hu"
+#define SCNu32 "u"
+#define SCNu64 __PRI64 "u"
+
+#define SCNuLEAST8 "hhu"
+#define SCNuLEAST16 "hu"
+#define SCNuLEAST32 "u"
+#define SCNuLEAST64 __PRI64 "u"
+
+#define SCNuFAST8 "hhu"
+#define SCNuFAST16 "u"
+#define SCNuFAST32 "u"
+#define SCNuFAST64 __PRI64 "u"
+
+#define SCNo8 "hho"
+#define SCNo16 "ho"
+#define SCNo32 "o"
+#define SCNo64 __PRI64 "o"
+
+#define SCNoLEAST8 "hho"
+#define SCNoLEAST16 "ho"
+#define SCNoLEAST32 "o"
+#define SCNoLEAST64 __PRI64 "o"
+
+#define SCNoFAST8 "hho"
+#define SCNoFAST16 "o"
+#define SCNoFAST32 "o"
+#define SCNoFAST64 __PRI64 "o"
+
+#define SCNx8 "hhx"
+#define SCNx16 "hx"
+#define SCNx32 "x"
+#define SCNx64 __PRI64 "x"
+
+#define SCNxLEAST8 "hhx"
+#define SCNxLEAST16 "hx"
+#define SCNxLEAST32 "x"
+#define SCNxLEAST64 __PRI64 "x"
+
+#define SCNxFAST8 "hhx"
+#define SCNxFAST16 "x"
+#define SCNxFAST32 "x"
+#define SCNxFAST64 __PRI64 "x"
+
+#define SCNdMAX __PRI64 "d"
+#define SCNiMAX __PRI64 "i"
+#define SCNoMAX __PRI64 "o"
+#define SCNuMAX __PRI64 "u"
+#define SCNxMAX __PRI64 "x"
+
+#define SCNdPTR __PRIPTR "d"
+#define SCNiPTR __PRIPTR "i"
+#define SCNoPTR __PRIPTR "o"
+#define SCNuPTR __PRIPTR "u"
+#define SCNxPTR __PRIPTR "x"
+
+#ifdef __cplusplus
+}
+#endif
+#else
+#include <__header_inttypes.h>
+#endif
+
+#endif
+
diff --git a/libc-top-half/musl/include/iso646.h b/libc-top-half/musl/include/iso646.h
new file mode 100644
index 0000000..88ff53d
--- /dev/null
+++ b/libc-top-half/musl/include/iso646.h
@@ -0,0 +1,20 @@
+#ifndef _ISO646_H
+#define _ISO646_H
+
+#ifndef __cplusplus
+
+#define and &&
+#define and_eq &=
+#define bitand &
+#define bitor |
+#define compl ~
+#define not !
+#define not_eq !=
+#define or ||
+#define or_eq |=
+#define xor ^
+#define xor_eq ^=
+
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/langinfo.h b/libc-top-half/musl/include/langinfo.h
new file mode 100644
index 0000000..519c061
--- /dev/null
+++ b/libc-top-half/musl/include/langinfo.h
@@ -0,0 +1,98 @@
+#ifndef _LANGINFO_H
+#define _LANGINFO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+#include <nl_types.h>
+
+#define __NEED_locale_t
+
+#include <bits/alltypes.h>
+
+#define ABDAY_1 0x20000
+#define ABDAY_2 0x20001
+#define ABDAY_3 0x20002
+#define ABDAY_4 0x20003
+#define ABDAY_5 0x20004
+#define ABDAY_6 0x20005
+#define ABDAY_7 0x20006
+
+#define DAY_1 0x20007
+#define DAY_2 0x20008
+#define DAY_3 0x20009
+#define DAY_4 0x2000A
+#define DAY_5 0x2000B
+#define DAY_6 0x2000C
+#define DAY_7 0x2000D
+
+#define ABMON_1 0x2000E
+#define ABMON_2 0x2000F
+#define ABMON_3 0x20010
+#define ABMON_4 0x20011
+#define ABMON_5 0x20012
+#define ABMON_6 0x20013
+#define ABMON_7 0x20014
+#define ABMON_8 0x20015
+#define ABMON_9 0x20016
+#define ABMON_10 0x20017
+#define ABMON_11 0x20018
+#define ABMON_12 0x20019
+
+#define MON_1 0x2001A
+#define MON_2 0x2001B
+#define MON_3 0x2001C
+#define MON_4 0x2001D
+#define MON_5 0x2001E
+#define MON_6 0x2001F
+#define MON_7 0x20020
+#define MON_8 0x20021
+#define MON_9 0x20022
+#define MON_10 0x20023
+#define MON_11 0x20024
+#define MON_12 0x20025
+
+#define AM_STR 0x20026
+#define PM_STR 0x20027
+
+#define D_T_FMT 0x20028
+#define D_FMT 0x20029
+#define T_FMT 0x2002A
+#define T_FMT_AMPM 0x2002B
+
+#define ERA 0x2002C
+#define ERA_D_FMT 0x2002E
+#define ALT_DIGITS 0x2002F
+#define ERA_D_T_FMT 0x20030
+#define ERA_T_FMT 0x20031
+
+#define CODESET 14
+
+#define CRNCYSTR 0x4000F
+
+#define RADIXCHAR 0x10000
+#define THOUSEP 0x10001
+#define YESEXPR 0x50000
+#define NOEXPR 0x50001
+
+#define _NL_LOCALE_NAME(cat) (((cat)<<16) | 0xffff)
+
+#if defined(_GNU_SOURCE)
+#define NL_LOCALE_NAME(cat) _NL_LOCALE_NAME(cat)
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define YESSTR 0x50002
+#define NOSTR 0x50003
+#endif
+
+char *nl_langinfo(nl_item);
+char *nl_langinfo_l(nl_item, locale_t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/lastlog.h b/libc-top-half/musl/include/lastlog.h
new file mode 100644
index 0000000..5fa45ee
--- /dev/null
+++ b/libc-top-half/musl/include/lastlog.h
@@ -0,0 +1 @@
+#include <utmp.h>
diff --git a/libc-top-half/musl/include/libgen.h b/libc-top-half/musl/include/libgen.h
new file mode 100644
index 0000000..7c7fd9c
--- /dev/null
+++ b/libc-top-half/musl/include/libgen.h
@@ -0,0 +1,15 @@
+#ifndef _LIBGEN_H
+#define _LIBGEN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+char *dirname(char *);
+char *basename(char *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/libintl.h b/libc-top-half/musl/include/libintl.h
new file mode 100644
index 0000000..6a707bf
--- /dev/null
+++ b/libc-top-half/musl/include/libintl.h
@@ -0,0 +1,33 @@
+#ifndef _LIBINTL_H
+#define _LIBINTL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __USE_GNU_GETTEXT 1
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 1 : -1)
+
+#if __GNUC__ >= 3
+#define __fa(n) __attribute__ ((__format_arg__ (n)))
+#else
+#define __fa(n)
+#endif
+
+char *gettext(const char *) __fa(1);
+char *dgettext(const char *, const char *) __fa(2);
+char *dcgettext(const char *, const char *, int) __fa(2);
+char *ngettext(const char *, const char *, unsigned long) __fa(1) __fa(2);
+char *dngettext(const char *, const char *, const char *, unsigned long) __fa(2) __fa(3);
+char *dcngettext(const char *, const char *, const char *, unsigned long, int) __fa(2) __fa(3);
+char *textdomain(const char *);
+char *bindtextdomain (const char *, const char *);
+char *bind_textdomain_codeset(const char *, const char *);
+
+#undef __fa
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/limits.h b/libc-top-half/musl/include/limits.h
new file mode 100644
index 0000000..2fc0d2a
--- /dev/null
+++ b/libc-top-half/musl/include/limits.h
@@ -0,0 +1,180 @@
+#ifndef _LIMITS_H
+#define _LIMITS_H
+
+#include <features.h>
+
+#include <bits/alltypes.h> /* __LONG_MAX */
+
+/* Support signed or unsigned plain-char */
+
+#if '\xff' > 0
+#define CHAR_MIN 0
+#define CHAR_MAX 255
+#else
+#define CHAR_MIN (-128)
+#define CHAR_MAX 127
+#endif
+
+#define CHAR_BIT 8
+#define SCHAR_MIN (-128)
+#define SCHAR_MAX 127
+#define UCHAR_MAX 255
+#define SHRT_MIN (-1-0x7fff)
+#define SHRT_MAX 0x7fff
+#define USHRT_MAX 0xffff
+#define INT_MIN (-1-0x7fffffff)
+#define INT_MAX 0x7fffffff
+#define UINT_MAX 0xffffffffU
+#define LONG_MIN (-LONG_MAX-1)
+#define LONG_MAX __LONG_MAX
+#define ULONG_MAX (2UL*LONG_MAX+1)
+#define LLONG_MIN (-LLONG_MAX-1)
+#define LLONG_MAX 0x7fffffffffffffffLL
+#define ULLONG_MAX (2ULL*LLONG_MAX+1)
+
+#define MB_LEN_MAX 4
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#include <bits/limits.h>
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no pipes */
+#define PIPE_BUF 4096
+#endif
+#define FILESIZEBITS 64
+#ifndef NAME_MAX
+#define NAME_MAX 255
+#endif
+#define PATH_MAX 4096
+#define NGROUPS_MAX 32
+#define ARG_MAX 131072
+#define IOV_MAX 1024
+#define SYMLOOP_MAX 40
+#define WORD_BIT 32
+#define SSIZE_MAX LONG_MAX
+#define TZNAME_MAX 6
+#define TTY_NAME_MAX 32
+#define HOST_NAME_MAX 255
+
+#if LONG_MAX == 0x7fffffffL
+#define LONG_BIT 32
+#else
+#define LONG_BIT 64
+#endif
+
+/* Implementation choices... */
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#define PTHREAD_KEYS_MAX 128
+#define PTHREAD_STACK_MIN 2048
+#define PTHREAD_DESTRUCTOR_ITERATIONS 4
+#endif
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#define SEM_VALUE_MAX 0x7fffffff
+#define SEM_NSEMS_MAX 256
+#endif
+#define DELAYTIMER_MAX 0x7fffffff
+#ifdef __wasilibc_unmodified_upstream /* WASI has no mq */
+#define MQ_PRIO_MAX 32768
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no usernames */
+#define LOGIN_NAME_MAX 256
+#endif
+
+/* Arbitrary numbers... */
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no shell commands */
+#define BC_BASE_MAX 99
+#define BC_DIM_MAX 2048
+#define BC_SCALE_MAX 99
+#define BC_STRING_MAX 1000
+#endif
+#define CHARCLASS_NAME_MAX 14
+#define COLL_WEIGHTS_MAX 2
+#ifdef __wasilibc_unmodified_upstream /* WASI has no shell commands */
+#define EXPR_NEST_MAX 32
+#define LINE_MAX 4096
+#endif
+#define RE_DUP_MAX 255
+
+#define NL_ARGMAX 9
+#define NL_MSGMAX 32767
+#define NL_SETMAX 255
+#define NL_TEXTMAX 2048
+
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE)
+
+#ifdef PAGESIZE
+#define PAGE_SIZE PAGESIZE
+#endif
+#define NZERO 20
+#define NL_LANGMAX 32
+
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) \
+ || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 < 700)
+
+#define NL_NMAX 16
+
+#endif
+
+/* POSIX/SUS requirements follow. These numbers come directly
+ * from SUS and have nothing to do with the host system. */
+
+#define _POSIX_AIO_LISTIO_MAX 2
+#define _POSIX_AIO_MAX 1
+#define _POSIX_ARG_MAX 4096
+#define _POSIX_CHILD_MAX 25
+#define _POSIX_CLOCKRES_MIN 20000000
+#define _POSIX_DELAYTIMER_MAX 32
+#define _POSIX_HOST_NAME_MAX 255
+#define _POSIX_LINK_MAX 8
+#define _POSIX_LOGIN_NAME_MAX 9
+#define _POSIX_MAX_CANON 255
+#define _POSIX_MAX_INPUT 255
+#define _POSIX_MQ_OPEN_MAX 8
+#define _POSIX_MQ_PRIO_MAX 32
+#define _POSIX_NAME_MAX 14
+#define _POSIX_NGROUPS_MAX 8
+#define _POSIX_OPEN_MAX 20
+#define _POSIX_PATH_MAX 256
+#define _POSIX_PIPE_BUF 512
+#define _POSIX_RE_DUP_MAX 255
+#define _POSIX_RTSIG_MAX 8
+#define _POSIX_SEM_NSEMS_MAX 256
+#define _POSIX_SEM_VALUE_MAX 32767
+#define _POSIX_SIGQUEUE_MAX 32
+#define _POSIX_SSIZE_MAX 32767
+#define _POSIX_STREAM_MAX 8
+#define _POSIX_SS_REPL_MAX 4
+#define _POSIX_SYMLINK_MAX 255
+#define _POSIX_SYMLOOP_MAX 8
+#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
+#define _POSIX_THREAD_KEYS_MAX 128
+#define _POSIX_THREAD_THREADS_MAX 64
+#define _POSIX_TIMER_MAX 32
+#define _POSIX_TRACE_EVENT_NAME_MAX 30
+#define _POSIX_TRACE_NAME_MAX 8
+#define _POSIX_TRACE_SYS_MAX 8
+#define _POSIX_TRACE_USER_EVENT_MAX 32
+#define _POSIX_TTY_NAME_MAX 9
+#define _POSIX_TZNAME_MAX 6
+#define _POSIX2_BC_BASE_MAX 99
+#define _POSIX2_BC_DIM_MAX 2048
+#define _POSIX2_BC_SCALE_MAX 99
+#define _POSIX2_BC_STRING_MAX 1000
+#define _POSIX2_CHARCLASS_NAME_MAX 14
+#define _POSIX2_COLL_WEIGHTS_MAX 2
+#define _POSIX2_EXPR_NEST_MAX 32
+#define _POSIX2_LINE_MAX 2048
+#define _POSIX2_RE_DUP_MAX 255
+
+#define _XOPEN_IOV_MAX 16
+#define _XOPEN_NAME_MAX 255
+#define _XOPEN_PATH_MAX 1024
+
+#endif
diff --git a/libc-top-half/musl/include/link.h b/libc-top-half/musl/include/link.h
new file mode 100644
index 0000000..8150185
--- /dev/null
+++ b/libc-top-half/musl/include/link.h
@@ -0,0 +1,53 @@
+#ifndef _LINK_H
+#define _LINK_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <elf.h>
+#define __NEED_size_t
+#define __NEED_uint32_t
+#include <bits/alltypes.h>
+
+#if UINTPTR_MAX > 0xffffffff
+#define ElfW(type) Elf64_ ## type
+#else
+#define ElfW(type) Elf32_ ## type
+#endif
+
+#include <bits/link.h>
+
+struct dl_phdr_info {
+ ElfW(Addr) dlpi_addr;
+ const char *dlpi_name;
+ const ElfW(Phdr) *dlpi_phdr;
+ ElfW(Half) dlpi_phnum;
+ unsigned long long int dlpi_adds;
+ unsigned long long int dlpi_subs;
+ size_t dlpi_tls_modid;
+ void *dlpi_tls_data;
+};
+
+struct link_map {
+ ElfW(Addr) l_addr;
+ char *l_name;
+ ElfW(Dyn) *l_ld;
+ struct link_map *l_next, *l_prev;
+};
+
+struct r_debug {
+ int r_version;
+ struct link_map *r_map;
+ ElfW(Addr) r_brk;
+ enum { RT_CONSISTENT, RT_ADD, RT_DELETE } r_state;
+ ElfW(Addr) r_ldbase;
+};
+
+int dl_iterate_phdr(int (*)(struct dl_phdr_info *, size_t, void *), void *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/locale.h b/libc-top-half/musl/include/locale.h
new file mode 100644
index 0000000..6a62d1f
--- /dev/null
+++ b/libc-top-half/musl/include/locale.h
@@ -0,0 +1,93 @@
+#ifndef _LOCALE_H
+#define _LOCALE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
+#if __cplusplus >= 201103L
+#define NULL nullptr
+#elif defined(__cplusplus)
+#define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
+#else
+#define __need_NULL
+#include <stddef.h>
+#endif
+
+#define LC_CTYPE 0
+#define LC_NUMERIC 1
+#define LC_TIME 2
+#define LC_COLLATE 3
+#define LC_MONETARY 4
+#define LC_MESSAGES 5
+#define LC_ALL 6
+
+struct lconv {
+ char *decimal_point;
+ char *thousands_sep;
+ char *grouping;
+
+ char *int_curr_symbol;
+ char *currency_symbol;
+ char *mon_decimal_point;
+ char *mon_thousands_sep;
+ char *mon_grouping;
+ char *positive_sign;
+ char *negative_sign;
+ char int_frac_digits;
+ char frac_digits;
+ char p_cs_precedes;
+ char p_sep_by_space;
+ char n_cs_precedes;
+ char n_sep_by_space;
+ char p_sign_posn;
+ char n_sign_posn;
+ char int_p_cs_precedes;
+ char int_p_sep_by_space;
+ char int_n_cs_precedes;
+ char int_n_sep_by_space;
+ char int_p_sign_posn;
+ char int_n_sign_posn;
+};
+
+
+char *setlocale (int, const char *);
+struct lconv *localeconv(void);
+
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#define __NEED_locale_t
+
+#include <bits/alltypes.h>
+
+#define LC_GLOBAL_LOCALE ((locale_t)-1)
+
+#define LC_CTYPE_MASK (1<<LC_CTYPE)
+#define LC_NUMERIC_MASK (1<<LC_NUMERIC)
+#define LC_TIME_MASK (1<<LC_TIME)
+#define LC_COLLATE_MASK (1<<LC_COLLATE)
+#define LC_MONETARY_MASK (1<<LC_MONETARY)
+#define LC_MESSAGES_MASK (1<<LC_MESSAGES)
+#define LC_ALL_MASK 0x7fffffff
+
+locale_t duplocale(locale_t);
+void freelocale(locale_t);
+locale_t newlocale(int, const char *, locale_t);
+locale_t uselocale(locale_t);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/malloc.h b/libc-top-half/musl/include/malloc.h
new file mode 100644
index 0000000..bc17b10
--- /dev/null
+++ b/libc-top-half/musl/include/malloc.h
@@ -0,0 +1,33 @@
+#ifndef _MALLOC_H
+#define _MALLOC_H
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#else
+#include <__functions_malloc.h>
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __NEED_size_t
+
+#include <bits/alltypes.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+void *malloc (size_t);
+void *calloc (size_t, size_t);
+void *realloc (void *, size_t);
+void free (void *);
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI libc doesn't build the legacy functions */
+void *valloc (size_t);
+void *memalign(size_t, size_t);
+#endif
+
+size_t malloc_usable_size(void *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/math.h b/libc-top-half/musl/include/math.h
new file mode 100644
index 0000000..515cc66
--- /dev/null
+++ b/libc-top-half/musl/include/math.h
@@ -0,0 +1,459 @@
+#ifndef _MATH_H
+#define _MATH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_float_t
+#define __NEED_double_t
+#include <bits/alltypes.h>
+
+#if 100*__GNUC__+__GNUC_MINOR__ >= 303
+#define NAN __builtin_nanf("")
+#define INFINITY __builtin_inff()
+#else
+#define NAN (0.0f/0.0f)
+#define INFINITY 1e5000f
+#endif
+
+#define HUGE_VALF INFINITY
+#define HUGE_VAL ((double)INFINITY)
+#define HUGE_VALL ((long double)INFINITY)
+
+#define MATH_ERRNO 1
+#define MATH_ERREXCEPT 2
+#define math_errhandling 2
+
+#define FP_ILOGBNAN (-1-0x7fffffff)
+#define FP_ILOGB0 FP_ILOGBNAN
+
+#define FP_NAN 0
+#define FP_INFINITE 1
+#define FP_ZERO 2
+#define FP_SUBNORMAL 3
+#define FP_NORMAL 4
+
+#ifdef __FP_FAST_FMA
+#define FP_FAST_FMA 1
+#endif
+
+#ifdef __FP_FAST_FMAF
+#define FP_FAST_FMAF 1
+#endif
+
+#ifdef __FP_FAST_FMAL
+#define FP_FAST_FMAL 1
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of the fpclassify-like operations */
+int __fpclassify(double);
+int __fpclassifyf(float);
+int __fpclassifyl(long double);
+
+static __inline unsigned __FLOAT_BITS(float __f)
+{
+ union {float __f; unsigned __i;} __u;
+ __u.__f = __f;
+ return __u.__i;
+}
+static __inline unsigned long long __DOUBLE_BITS(double __f)
+{
+ union {double __f; unsigned long long __i;} __u;
+ __u.__f = __f;
+ return __u.__i;
+}
+
+#define fpclassify(x) ( \
+ sizeof(x) == sizeof(float) ? __fpclassifyf(x) : \
+ sizeof(x) == sizeof(double) ? __fpclassify(x) : \
+ __fpclassifyl(x) )
+
+#define isinf(x) ( \
+ sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x) & 0x7fffffff) == 0x7f800000 : \
+ sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL>>1) == 0x7ffULL<<52 : \
+ __fpclassifyl(x) == FP_INFINITE)
+
+#define isnan(x) ( \
+ sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x) & 0x7fffffff) > 0x7f800000 : \
+ sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL>>1) > 0x7ffULL<<52 : \
+ __fpclassifyl(x) == FP_NAN)
+
+#define isnormal(x) ( \
+ sizeof(x) == sizeof(float) ? ((__FLOAT_BITS(x)+0x00800000) & 0x7fffffff) >= 0x01000000 : \
+ sizeof(x) == sizeof(double) ? ((__DOUBLE_BITS(x)+(1ULL<<52)) & -1ULL>>1) >= 1ULL<<53 : \
+ __fpclassifyl(x) == FP_NORMAL)
+
+#define isfinite(x) ( \
+ sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x) & 0x7fffffff) < 0x7f800000 : \
+ sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL>>1) < 0x7ffULL<<52 : \
+ __fpclassifyl(x) > FP_INFINITE)
+
+int __signbit(double);
+int __signbitf(float);
+int __signbitl(long double);
+
+#define signbit(x) ( \
+ sizeof(x) == sizeof(float) ? (int)(__FLOAT_BITS(x)>>31) : \
+ sizeof(x) == sizeof(double) ? (int)(__DOUBLE_BITS(x)>>63) : \
+ __signbitl(x) )
+
+#define isunordered(x,y) (isnan((x)) ? ((void)(y),1) : isnan((y)))
+
+#define __ISREL_DEF(rel, op, type) \
+static __inline int __is##rel(type __x, type __y) \
+{ return !isunordered(__x,__y) && __x op __y; }
+
+__ISREL_DEF(lessf, <, float_t)
+__ISREL_DEF(less, <, double_t)
+__ISREL_DEF(lessl, <, long double)
+__ISREL_DEF(lessequalf, <=, float_t)
+__ISREL_DEF(lessequal, <=, double_t)
+__ISREL_DEF(lessequall, <=, long double)
+__ISREL_DEF(lessgreaterf, !=, float_t)
+__ISREL_DEF(lessgreater, !=, double_t)
+__ISREL_DEF(lessgreaterl, !=, long double)
+__ISREL_DEF(greaterf, >, float_t)
+__ISREL_DEF(greater, >, double_t)
+__ISREL_DEF(greaterl, >, long double)
+__ISREL_DEF(greaterequalf, >=, float_t)
+__ISREL_DEF(greaterequal, >=, double_t)
+__ISREL_DEF(greaterequall, >=, long double)
+
+#define __tg_pred_2(x, y, p) ( \
+ sizeof((x)+(y)) == sizeof(float) ? p##f(x, y) : \
+ sizeof((x)+(y)) == sizeof(double) ? p(x, y) : \
+ p##l(x, y) )
+
+#define isless(x, y) __tg_pred_2(x, y, __isless)
+#define islessequal(x, y) __tg_pred_2(x, y, __islessequal)
+#define islessgreater(x, y) __tg_pred_2(x, y, __islessgreater)
+#define isgreater(x, y) __tg_pred_2(x, y, __isgreater)
+#define isgreaterequal(x, y) __tg_pred_2(x, y, __isgreaterequal)
+#else
+#define fpclassify(x) (__builtin_fpclassify(FP_NAN, FP_INFINITE, \
+ FP_NORMAL, FP_SUBNORMAL, \
+ FP_ZERO, x))
+#define isinf(x) (__builtin_isinf(x))
+#define isnan(x) (__builtin_isnan(x))
+#define isnormal(x) (__builtin_isnormal(x))
+#define isfinite(x) (__builtin_isfinite(x))
+#define signbit(x) (__builtin_signbit(x))
+#define isunordered(x, y) (__builtin_isunordered(x, y))
+#define isless(x, y) (__builtin_isless(x, y))
+#define islessequal(x, y) (__builtin_islessequal(x, y))
+#define islessgreater(x, y) (__builtin_islessgreater(x, y))
+#define isgreater(x, y) (__builtin_isgreater(x, y))
+#define isgreaterequal(x, y) (__builtin_isgreaterequal(x, y))
+#endif
+
+double acos(double);
+float acosf(float);
+long double acosl(long double);
+
+double acosh(double);
+float acoshf(float);
+long double acoshl(long double);
+
+double asin(double);
+float asinf(float);
+long double asinl(long double);
+
+double asinh(double);
+float asinhf(float);
+long double asinhl(long double);
+
+double atan(double);
+float atanf(float);
+long double atanl(long double);
+
+double atan2(double, double);
+float atan2f(float, float);
+long double atan2l(long double, long double);
+
+double atanh(double);
+float atanhf(float);
+long double atanhl(long double);
+
+double cbrt(double);
+float cbrtf(float);
+long double cbrtl(long double);
+
+double ceil(double);
+float ceilf(float);
+long double ceill(long double);
+
+double copysign(double, double);
+float copysignf(float, float);
+long double copysignl(long double, long double);
+
+double cos(double);
+float cosf(float);
+long double cosl(long double);
+
+double cosh(double);
+float coshf(float);
+long double coshl(long double);
+
+double erf(double);
+float erff(float);
+long double erfl(long double);
+
+double erfc(double);
+float erfcf(float);
+long double erfcl(long double);
+
+double exp(double);
+float expf(float);
+long double expl(long double);
+
+double exp2(double);
+float exp2f(float);
+long double exp2l(long double);
+
+double expm1(double);
+float expm1f(float);
+long double expm1l(long double);
+
+double fabs(double);
+float fabsf(float);
+long double fabsl(long double);
+
+double fdim(double, double);
+float fdimf(float, float);
+long double fdiml(long double, long double);
+
+double floor(double);
+float floorf(float);
+long double floorl(long double);
+
+double fma(double, double, double);
+float fmaf(float, float, float);
+long double fmal(long double, long double, long double);
+
+double fmax(double, double);
+float fmaxf(float, float);
+long double fmaxl(long double, long double);
+
+double fmin(double, double);
+float fminf(float, float);
+long double fminl(long double, long double);
+
+double fmod(double, double);
+float fmodf(float, float);
+long double fmodl(long double, long double);
+
+double frexp(double, int *);
+float frexpf(float, int *);
+long double frexpl(long double, int *);
+
+double hypot(double, double);
+float hypotf(float, float);
+long double hypotl(long double, long double);
+
+int ilogb(double);
+int ilogbf(float);
+int ilogbl(long double);
+
+double ldexp(double, int);
+float ldexpf(float, int);
+long double ldexpl(long double, int);
+
+double lgamma(double);
+float lgammaf(float);
+long double lgammal(long double);
+
+long long llrint(double);
+long long llrintf(float);
+long long llrintl(long double);
+
+long long llround(double);
+long long llroundf(float);
+long long llroundl(long double);
+
+double log(double);
+float logf(float);
+long double logl(long double);
+
+double log10(double);
+float log10f(float);
+long double log10l(long double);
+
+double log1p(double);
+float log1pf(float);
+long double log1pl(long double);
+
+double log2(double);
+float log2f(float);
+long double log2l(long double);
+
+double logb(double);
+float logbf(float);
+long double logbl(long double);
+
+long lrint(double);
+long lrintf(float);
+long lrintl(long double);
+
+long lround(double);
+long lroundf(float);
+long lroundl(long double);
+
+double modf(double, double *);
+float modff(float, float *);
+long double modfl(long double, long double *);
+
+double nan(const char *);
+float nanf(const char *);
+long double nanl(const char *);
+
+double nearbyint(double);
+float nearbyintf(float);
+long double nearbyintl(long double);
+
+double nextafter(double, double);
+float nextafterf(float, float);
+long double nextafterl(long double, long double);
+
+double nexttoward(double, long double);
+float nexttowardf(float, long double);
+long double nexttowardl(long double, long double);
+
+double pow(double, double);
+float powf(float, float);
+long double powl(long double, long double);
+
+double remainder(double, double);
+float remainderf(float, float);
+long double remainderl(long double, long double);
+
+double remquo(double, double, int *);
+float remquof(float, float, int *);
+long double remquol(long double, long double, int *);
+
+double rint(double);
+float rintf(float);
+long double rintl(long double);
+
+double round(double);
+float roundf(float);
+long double roundl(long double);
+
+double scalbln(double, long);
+float scalblnf(float, long);
+long double scalblnl(long double, long);
+
+double scalbn(double, int);
+float scalbnf(float, int);
+long double scalbnl(long double, int);
+
+double sin(double);
+float sinf(float);
+long double sinl(long double);
+
+double sinh(double);
+float sinhf(float);
+long double sinhl(long double);
+
+double sqrt(double);
+float sqrtf(float);
+long double sqrtl(long double);
+
+double tan(double);
+float tanf(float);
+long double tanl(long double);
+
+double tanh(double);
+float tanhf(float);
+long double tanhl(long double);
+
+double tgamma(double);
+float tgammaf(float);
+long double tgammal(long double);
+
+double trunc(double);
+float truncf(float);
+long double truncl(long double);
+
+
+#if defined(_XOPEN_SOURCE) || defined(_BSD_SOURCE)
+#undef MAXFLOAT
+#define MAXFLOAT 3.40282346638528859812e+38F
+#endif
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define M_E 2.7182818284590452354 /* e */
+#define M_LOG2E 1.4426950408889634074 /* log_2 e */
+#define M_LOG10E 0.43429448190325182765 /* log_10 e */
+#define M_LN2 0.69314718055994530942 /* log_e 2 */
+#define M_LN10 2.30258509299404568402 /* log_e 10 */
+#define M_PI 3.14159265358979323846 /* pi */
+#define M_PI_2 1.57079632679489661923 /* pi/2 */
+#define M_PI_4 0.78539816339744830962 /* pi/4 */
+#define M_1_PI 0.31830988618379067154 /* 1/pi */
+#define M_2_PI 0.63661977236758134308 /* 2/pi */
+#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
+#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
+#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
+
+extern int signgam;
+
+double j0(double);
+double j1(double);
+double jn(int, double);
+
+double y0(double);
+double y1(double);
+double yn(int, double);
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define HUGE 3.40282346638528859812e+38F
+
+double drem(double, double);
+float dremf(float, float);
+
+int finite(double);
+int finitef(float);
+
+double scalb(double, double);
+float scalbf(float, float);
+
+double significand(double);
+float significandf(float);
+
+double lgamma_r(double, int*);
+float lgammaf_r(float, int*);
+
+float j0f(float);
+float j1f(float);
+float jnf(int, float);
+
+float y0f(float);
+float y1f(float);
+float ynf(int, float);
+#endif
+
+#ifdef _GNU_SOURCE
+long double lgammal_r(long double, int*);
+
+void sincos(double, double*, double*);
+void sincosf(float, float*, float*);
+void sincosl(long double, long double*, long double*);
+
+double exp10(double);
+float exp10f(float);
+long double exp10l(long double);
+
+double pow10(double);
+float pow10f(float);
+long double pow10l(long double);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/memory.h b/libc-top-half/musl/include/memory.h
new file mode 100644
index 0000000..3b2f590
--- /dev/null
+++ b/libc-top-half/musl/include/memory.h
@@ -0,0 +1 @@
+#include <string.h>
diff --git a/libc-top-half/musl/include/mntent.h b/libc-top-half/musl/include/mntent.h
new file mode 100644
index 0000000..3492a1d
--- /dev/null
+++ b/libc-top-half/musl/include/mntent.h
@@ -0,0 +1,43 @@
+#ifndef _MNTENT_H
+#define _MNTENT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __NEED_FILE
+#include <bits/alltypes.h>
+
+#define MOUNTED "/etc/mtab"
+
+#define MNTTYPE_IGNORE "ignore"
+#define MNTTYPE_NFS "nfs"
+#define MNTTYPE_SWAP "swap"
+#define MNTOPT_DEFAULTS "defaults"
+#define MNTOPT_RO "ro"
+#define MNTOPT_RW "rw"
+#define MNTOPT_SUID "suid"
+#define MNTOPT_NOSUID "nosuid"
+#define MNTOPT_NOAUTO "noauto"
+
+struct mntent {
+ char *mnt_fsname;
+ char *mnt_dir;
+ char *mnt_type;
+ char *mnt_opts;
+ int mnt_freq;
+ int mnt_passno;
+};
+
+FILE *setmntent(const char *, const char *);
+int endmntent(FILE *);
+struct mntent *getmntent(FILE *);
+struct mntent *getmntent_r(FILE *, struct mntent *, char *, int);
+int addmntent(FILE *, const struct mntent *);
+char *hasmntopt(const struct mntent *, const char *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/monetary.h b/libc-top-half/musl/include/monetary.h
new file mode 100644
index 0000000..a91fa56
--- /dev/null
+++ b/libc-top-half/musl/include/monetary.h
@@ -0,0 +1,23 @@
+#ifndef _MONETARY_H
+#define _MONETARY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_ssize_t
+#define __NEED_size_t
+#define __NEED_locale_t
+
+#include <bits/alltypes.h>
+
+ssize_t strfmon(char *__restrict, size_t, const char *__restrict, ...);
+ssize_t strfmon_l(char *__restrict, size_t, locale_t, const char *__restrict, ...);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/mqueue.h b/libc-top-half/musl/include/mqueue.h
new file mode 100644
index 0000000..0c807ea
--- /dev/null
+++ b/libc-top-half/musl/include/mqueue.h
@@ -0,0 +1,41 @@
+#ifndef _MQUEUE_H
+#define _MQUEUE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_size_t
+#define __NEED_ssize_t
+#define __NEED_pthread_attr_t
+#define __NEED_time_t
+#define __NEED_struct_timespec
+#include <bits/alltypes.h>
+
+typedef int mqd_t;
+struct mq_attr {
+ long mq_flags, mq_maxmsg, mq_msgsize, mq_curmsgs, __unused[4];
+};
+struct sigevent;
+
+int mq_close(mqd_t);
+int mq_getattr(mqd_t, struct mq_attr *);
+int mq_notify(mqd_t, const struct sigevent *);
+mqd_t mq_open(const char *, int, ...);
+ssize_t mq_receive(mqd_t, char *, size_t, unsigned *);
+int mq_send(mqd_t, const char *, size_t, unsigned);
+int mq_setattr(mqd_t, const struct mq_attr *__restrict, struct mq_attr *__restrict);
+ssize_t mq_timedreceive(mqd_t, char *__restrict, size_t, unsigned *__restrict, const struct timespec *__restrict);
+int mq_timedsend(mqd_t, const char *, size_t, unsigned, const struct timespec *);
+int mq_unlink(const char *);
+
+#if _REDIR_TIME64
+__REDIR(mq_timedreceive, __mq_timedreceive_time64);
+__REDIR(mq_timedsend, __mq_timedsend_time64);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/net/ethernet.h b/libc-top-half/musl/include/net/ethernet.h
new file mode 100644
index 0000000..c8d4177
--- /dev/null
+++ b/libc-top-half/musl/include/net/ethernet.h
@@ -0,0 +1,55 @@
+#ifndef _NET_ETHERNET_H
+#define _NET_ETHERNET_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <sys/types.h>
+#include <netinet/if_ether.h>
+
+struct ether_addr {
+ uint8_t ether_addr_octet[ETH_ALEN];
+};
+
+struct ether_header {
+ uint8_t ether_dhost[ETH_ALEN];
+ uint8_t ether_shost[ETH_ALEN];
+ uint16_t ether_type;
+};
+
+#define ETHERTYPE_PUP 0x0200
+#define ETHERTYPE_SPRITE 0x0500
+#define ETHERTYPE_IP 0x0800
+#define ETHERTYPE_ARP 0x0806
+#define ETHERTYPE_REVARP 0x8035
+#define ETHERTYPE_AT 0x809B
+#define ETHERTYPE_AARP 0x80F3
+#define ETHERTYPE_VLAN 0x8100
+#define ETHERTYPE_IPX 0x8137
+#define ETHERTYPE_IPV6 0x86dd
+#define ETHERTYPE_LOOPBACK 0x9000
+
+
+#define ETHER_ADDR_LEN ETH_ALEN
+#define ETHER_TYPE_LEN 2
+#define ETHER_CRC_LEN 4
+#define ETHER_HDR_LEN ETH_HLEN
+#define ETHER_MIN_LEN (ETH_ZLEN + ETHER_CRC_LEN)
+#define ETHER_MAX_LEN (ETH_FRAME_LEN + ETHER_CRC_LEN)
+
+#define ETHER_IS_VALID_LEN(foo) \
+ ((foo) >= ETHER_MIN_LEN && (foo) <= ETHER_MAX_LEN)
+
+#define ETHERTYPE_TRAIL 0x1000
+#define ETHERTYPE_NTRAILER 16
+
+#define ETHERMTU ETH_DATA_LEN
+#define ETHERMIN (ETHER_MIN_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/net/if.h b/libc-top-half/musl/include/net/if.h
new file mode 100644
index 0000000..774cbff
--- /dev/null
+++ b/libc-top-half/musl/include/net/if.h
@@ -0,0 +1,141 @@
+#ifndef _NET_IF_H
+#define _NET_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define IF_NAMESIZE 16
+
+struct if_nameindex {
+ unsigned int if_index;
+ char *if_name;
+};
+
+unsigned int if_nametoindex (const char *);
+char *if_indextoname (unsigned int, char *);
+struct if_nameindex *if_nameindex (void);
+void if_freenameindex (struct if_nameindex *);
+
+
+
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#include <sys/socket.h>
+
+#define IFF_UP 0x1
+#define IFF_BROADCAST 0x2
+#define IFF_DEBUG 0x4
+#define IFF_LOOPBACK 0x8
+#define IFF_POINTOPOINT 0x10
+#define IFF_NOTRAILERS 0x20
+#define IFF_RUNNING 0x40
+#define IFF_NOARP 0x80
+#define IFF_PROMISC 0x100
+#define IFF_ALLMULTI 0x200
+#define IFF_MASTER 0x400
+#define IFF_SLAVE 0x800
+#define IFF_MULTICAST 0x1000
+#define IFF_PORTSEL 0x2000
+#define IFF_AUTOMEDIA 0x4000
+#define IFF_DYNAMIC 0x8000
+#define IFF_LOWER_UP 0x10000
+#define IFF_DORMANT 0x20000
+#define IFF_ECHO 0x40000
+#define IFF_VOLATILE (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST| \
+ IFF_ECHO|IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT)
+
+struct ifaddr {
+ struct sockaddr ifa_addr;
+ union {
+ struct sockaddr ifu_broadaddr;
+ struct sockaddr ifu_dstaddr;
+ } ifa_ifu;
+ struct iface *ifa_ifp;
+ struct ifaddr *ifa_next;
+};
+
+#define ifa_broadaddr ifa_ifu.ifu_broadaddr
+#define ifa_dstaddr ifa_ifu.ifu_dstaddr
+
+struct ifmap {
+ unsigned long int mem_start;
+ unsigned long int mem_end;
+ unsigned short int base_addr;
+ unsigned char irq;
+ unsigned char dma;
+ unsigned char port;
+};
+
+#define IFHWADDRLEN 6
+#define IFNAMSIZ IF_NAMESIZE
+
+struct ifreq {
+ union {
+ char ifrn_name[IFNAMSIZ];
+ } ifr_ifrn;
+ union {
+ struct sockaddr ifru_addr;
+ struct sockaddr ifru_dstaddr;
+ struct sockaddr ifru_broadaddr;
+ struct sockaddr ifru_netmask;
+ struct sockaddr ifru_hwaddr;
+ short int ifru_flags;
+ int ifru_ivalue;
+ int ifru_mtu;
+ struct ifmap ifru_map;
+ char ifru_slave[IFNAMSIZ];
+ char ifru_newname[IFNAMSIZ];
+ char *ifru_data;
+ } ifr_ifru;
+};
+
+#define ifr_name ifr_ifrn.ifrn_name
+#define ifr_hwaddr ifr_ifru.ifru_hwaddr
+#define ifr_addr ifr_ifru.ifru_addr
+#define ifr_dstaddr ifr_ifru.ifru_dstaddr
+#define ifr_broadaddr ifr_ifru.ifru_broadaddr
+#define ifr_netmask ifr_ifru.ifru_netmask
+#define ifr_flags ifr_ifru.ifru_flags
+#define ifr_metric ifr_ifru.ifru_ivalue
+#define ifr_mtu ifr_ifru.ifru_mtu
+#define ifr_map ifr_ifru.ifru_map
+#define ifr_slave ifr_ifru.ifru_slave
+#define ifr_data ifr_ifru.ifru_data
+#define ifr_ifindex ifr_ifru.ifru_ivalue
+#define ifr_bandwidth ifr_ifru.ifru_ivalue
+#define ifr_qlen ifr_ifru.ifru_ivalue
+#define ifr_newname ifr_ifru.ifru_newname
+#define _IOT_ifreq _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)
+#define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)
+#define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)
+
+struct ifconf {
+ int ifc_len;
+ union {
+ char *ifcu_buf;
+ struct ifreq *ifcu_req;
+ } ifc_ifcu;
+};
+
+#define ifc_buf ifc_ifcu.ifcu_buf
+#define ifc_req ifc_ifcu.ifcu_req
+#define _IOT_ifconf _IOT(_IOTS(struct ifconf),1,0,0,0,0)
+
+#define __UAPI_DEF_IF_IFCONF 0
+#define __UAPI_DEF_IF_IFMAP 0
+#define __UAPI_DEF_IF_IFNAMSIZ 0
+#define __UAPI_DEF_IF_IFREQ 0
+#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0
+#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 0
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/net/if_arp.h b/libc-top-half/musl/include/net/if_arp.h
new file mode 100644
index 0000000..27becc8
--- /dev/null
+++ b/libc-top-half/musl/include/net/if_arp.h
@@ -0,0 +1,142 @@
+/* Nonstandard header */
+#ifndef _NET_IF_ARP_H
+#define _NET_IF_ARP_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <inttypes.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#define MAX_ADDR_LEN 7
+
+#define ARPOP_REQUEST 1
+#define ARPOP_REPLY 2
+#define ARPOP_RREQUEST 3
+#define ARPOP_RREPLY 4
+#define ARPOP_InREQUEST 8
+#define ARPOP_InREPLY 9
+#define ARPOP_NAK 10
+
+struct arphdr {
+ uint16_t ar_hrd;
+ uint16_t ar_pro;
+ uint8_t ar_hln;
+ uint8_t ar_pln;
+ uint16_t ar_op;
+};
+
+
+#define ARPHRD_NETROM 0
+#define ARPHRD_ETHER 1
+#define ARPHRD_EETHER 2
+#define ARPHRD_AX25 3
+#define ARPHRD_PRONET 4
+#define ARPHRD_CHAOS 5
+#define ARPHRD_IEEE802 6
+#define ARPHRD_ARCNET 7
+#define ARPHRD_APPLETLK 8
+#define ARPHRD_DLCI 15
+#define ARPHRD_ATM 19
+#define ARPHRD_METRICOM 23
+#define ARPHRD_IEEE1394 24
+#define ARPHRD_EUI64 27
+#define ARPHRD_INFINIBAND 32
+#define ARPHRD_SLIP 256
+#define ARPHRD_CSLIP 257
+#define ARPHRD_SLIP6 258
+#define ARPHRD_CSLIP6 259
+#define ARPHRD_RSRVD 260
+#define ARPHRD_ADAPT 264
+#define ARPHRD_ROSE 270
+#define ARPHRD_X25 271
+#define ARPHRD_HWX25 272
+#define ARPHRD_CAN 280
+#define ARPHRD_PPP 512
+#define ARPHRD_CISCO 513
+#define ARPHRD_HDLC ARPHRD_CISCO
+#define ARPHRD_LAPB 516
+#define ARPHRD_DDCMP 517
+#define ARPHRD_RAWHDLC 518
+#define ARPHRD_RAWIP 519
+
+#define ARPHRD_TUNNEL 768
+#define ARPHRD_TUNNEL6 769
+#define ARPHRD_FRAD 770
+#define ARPHRD_SKIP 771
+#define ARPHRD_LOOPBACK 772
+#define ARPHRD_LOCALTLK 773
+#define ARPHRD_FDDI 774
+#define ARPHRD_BIF 775
+#define ARPHRD_SIT 776
+#define ARPHRD_IPDDP 777
+#define ARPHRD_IPGRE 778
+#define ARPHRD_PIMREG 779
+#define ARPHRD_HIPPI 780
+#define ARPHRD_ASH 781
+#define ARPHRD_ECONET 782
+#define ARPHRD_IRDA 783
+#define ARPHRD_FCPP 784
+#define ARPHRD_FCAL 785
+#define ARPHRD_FCPL 786
+#define ARPHRD_FCFABRIC 787
+#define ARPHRD_IEEE802_TR 800
+#define ARPHRD_IEEE80211 801
+#define ARPHRD_IEEE80211_PRISM 802
+#define ARPHRD_IEEE80211_RADIOTAP 803
+#define ARPHRD_IEEE802154 804
+#define ARPHRD_IEEE802154_MONITOR 805
+#define ARPHRD_PHONET 820
+#define ARPHRD_PHONET_PIPE 821
+#define ARPHRD_CAIF 822
+#define ARPHRD_IP6GRE 823
+#define ARPHRD_NETLINK 824
+#define ARPHRD_6LOWPAN 825
+#define ARPHRD_VSOCKMON 826
+
+#define ARPHRD_VOID 0xFFFF
+#define ARPHRD_NONE 0xFFFE
+
+struct arpreq {
+ struct sockaddr arp_pa;
+ struct sockaddr arp_ha;
+ int arp_flags;
+ struct sockaddr arp_netmask;
+ char arp_dev[16];
+};
+
+struct arpreq_old {
+ struct sockaddr arp_pa;
+ struct sockaddr arp_ha;
+ int arp_flags;
+ struct sockaddr arp_netmask;
+};
+
+#define ATF_COM 0x02
+#define ATF_PERM 0x04
+#define ATF_PUBL 0x08
+#define ATF_USETRAILERS 0x10
+#define ATF_NETMASK 0x20
+#define ATF_DONTPUB 0x40
+#define ATF_MAGIC 0x80
+
+#define ARPD_UPDATE 0x01
+#define ARPD_LOOKUP 0x02
+#define ARPD_FLUSH 0x03
+
+struct arpd_request {
+ unsigned short req;
+ uint32_t ip;
+ unsigned long dev;
+ unsigned long stamp;
+ unsigned long updated;
+ unsigned char ha[MAX_ADDR_LEN];
+};
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/net/route.h b/libc-top-half/musl/include/net/route.h
new file mode 100644
index 0000000..96ff48e
--- /dev/null
+++ b/libc-top-half/musl/include/net/route.h
@@ -0,0 +1,124 @@
+#ifndef _NET_ROUTE_H
+#define _NET_ROUTE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+
+
+struct rtentry {
+ unsigned long int rt_pad1;
+ struct sockaddr rt_dst;
+ struct sockaddr rt_gateway;
+ struct sockaddr rt_genmask;
+ unsigned short int rt_flags;
+ short int rt_pad2;
+ unsigned long int rt_pad3;
+ unsigned char rt_tos;
+ unsigned char rt_class;
+ short int rt_pad4[sizeof(long)/2-1];
+ short int rt_metric;
+ char *rt_dev;
+ unsigned long int rt_mtu;
+ unsigned long int rt_window;
+ unsigned short int rt_irtt;
+};
+
+#define rt_mss rt_mtu
+
+
+struct in6_rtmsg {
+ struct in6_addr rtmsg_dst;
+ struct in6_addr rtmsg_src;
+ struct in6_addr rtmsg_gateway;
+ uint32_t rtmsg_type;
+ uint16_t rtmsg_dst_len;
+ uint16_t rtmsg_src_len;
+ uint32_t rtmsg_metric;
+ unsigned long int rtmsg_info;
+ uint32_t rtmsg_flags;
+ int rtmsg_ifindex;
+};
+
+
+#define RTF_UP 0x0001
+#define RTF_GATEWAY 0x0002
+
+#define RTF_HOST 0x0004
+#define RTF_REINSTATE 0x0008
+#define RTF_DYNAMIC 0x0010
+#define RTF_MODIFIED 0x0020
+#define RTF_MTU 0x0040
+#define RTF_MSS RTF_MTU
+#define RTF_WINDOW 0x0080
+#define RTF_IRTT 0x0100
+#define RTF_REJECT 0x0200
+#define RTF_STATIC 0x0400
+#define RTF_XRESOLVE 0x0800
+#define RTF_NOFORWARD 0x1000
+#define RTF_THROW 0x2000
+#define RTF_NOPMTUDISC 0x4000
+
+#define RTF_DEFAULT 0x00010000
+#define RTF_ALLONLINK 0x00020000
+#define RTF_ADDRCONF 0x00040000
+
+#define RTF_LINKRT 0x00100000
+#define RTF_NONEXTHOP 0x00200000
+
+#define RTF_CACHE 0x01000000
+#define RTF_FLOW 0x02000000
+#define RTF_POLICY 0x04000000
+
+#define RTCF_VALVE 0x00200000
+#define RTCF_MASQ 0x00400000
+#define RTCF_NAT 0x00800000
+#define RTCF_DOREDIRECT 0x01000000
+#define RTCF_LOG 0x02000000
+#define RTCF_DIRECTSRC 0x04000000
+
+#define RTF_LOCAL 0x80000000
+#define RTF_INTERFACE 0x40000000
+#define RTF_MULTICAST 0x20000000
+#define RTF_BROADCAST 0x10000000
+#define RTF_NAT 0x08000000
+
+#define RTF_ADDRCLASSMASK 0xF8000000
+#define RT_ADDRCLASS(flags) ((uint32_t) flags >> 23)
+
+#define RT_TOS(tos) ((tos) & IPTOS_TOS_MASK)
+
+#define RT_LOCALADDR(flags) ((flags & RTF_ADDRCLASSMASK) \
+ == (RTF_LOCAL|RTF_INTERFACE))
+
+#define RT_CLASS_UNSPEC 0
+#define RT_CLASS_DEFAULT 253
+
+#define RT_CLASS_MAIN 254
+#define RT_CLASS_LOCAL 255
+#define RT_CLASS_MAX 255
+
+
+#define RTMSG_ACK NLMSG_ACK
+#define RTMSG_OVERRUN NLMSG_OVERRUN
+
+#define RTMSG_NEWDEVICE 0x11
+#define RTMSG_DELDEVICE 0x12
+#define RTMSG_NEWROUTE 0x21
+#define RTMSG_DELROUTE 0x22
+#define RTMSG_NEWRULE 0x31
+#define RTMSG_DELRULE 0x32
+#define RTMSG_CONTROL 0x40
+
+#define RTMSG_AR_FAILED 0x51
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/netdb.h b/libc-top-half/musl/include/netdb.h
new file mode 100644
index 0000000..d096c78
--- /dev/null
+++ b/libc-top-half/musl/include/netdb.h
@@ -0,0 +1,156 @@
+#ifndef _NETDB_H
+#define _NETDB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+#include <netinet/in.h>
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define __NEED_size_t
+#include <bits/alltypes.h>
+#endif
+
+struct addrinfo {
+ int ai_flags;
+ int ai_family;
+ int ai_socktype;
+ int ai_protocol;
+ socklen_t ai_addrlen;
+ struct sockaddr *ai_addr;
+ char *ai_canonname;
+ struct addrinfo *ai_next;
+};
+
+#define AI_PASSIVE 0x01
+#define AI_CANONNAME 0x02
+#define AI_NUMERICHOST 0x04
+#define AI_V4MAPPED 0x08
+#define AI_ALL 0x10
+#define AI_ADDRCONFIG 0x20
+#define AI_NUMERICSERV 0x400
+
+
+#define NI_NUMERICHOST 0x01
+#define NI_NUMERICSERV 0x02
+#define NI_NOFQDN 0x04
+#define NI_NAMEREQD 0x08
+#define NI_DGRAM 0x10
+#define NI_NUMERICSCOPE 0x100
+
+#define EAI_BADFLAGS -1
+#define EAI_NONAME -2
+#define EAI_AGAIN -3
+#define EAI_FAIL -4
+#define EAI_FAMILY -6
+#define EAI_SOCKTYPE -7
+#define EAI_SERVICE -8
+#define EAI_MEMORY -10
+#define EAI_SYSTEM -11
+#define EAI_OVERFLOW -12
+
+int getaddrinfo (const char *__restrict, const char *__restrict, const struct addrinfo *__restrict, struct addrinfo **__restrict);
+void freeaddrinfo (struct addrinfo *);
+int getnameinfo (const struct sockaddr *__restrict, socklen_t, char *__restrict, socklen_t, char *__restrict, socklen_t, int);
+const char *gai_strerror(int);
+
+
+/* Legacy functions follow (marked OBsolete in SUS) */
+
+struct netent {
+ char *n_name;
+ char **n_aliases;
+ int n_addrtype;
+ uint32_t n_net;
+};
+
+struct hostent {
+ char *h_name;
+ char **h_aliases;
+ int h_addrtype;
+ int h_length;
+ char **h_addr_list;
+};
+#define h_addr h_addr_list[0]
+
+struct servent {
+ char *s_name;
+ char **s_aliases;
+ int s_port;
+ char *s_proto;
+};
+
+struct protoent {
+ char *p_name;
+ char **p_aliases;
+ int p_proto;
+};
+
+void sethostent (int);
+void endhostent (void);
+struct hostent *gethostent (void);
+
+void setnetent (int);
+void endnetent (void);
+struct netent *getnetent (void);
+struct netent *getnetbyaddr (uint32_t, int);
+struct netent *getnetbyname (const char *);
+
+void setservent (int);
+void endservent (void);
+struct servent *getservent (void);
+struct servent *getservbyname (const char *, const char *);
+struct servent *getservbyport (int, const char *);
+
+void setprotoent (int);
+void endprotoent (void);
+struct protoent *getprotoent (void);
+struct protoent *getprotobyname (const char *);
+struct protoent *getprotobynumber (int);
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_POSIX_SOURCE) \
+ || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE+0 < 200809L) \
+ || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 < 700)
+struct hostent *gethostbyname (const char *);
+struct hostent *gethostbyaddr (const void *, socklen_t, int);
+#ifdef __GNUC__
+__attribute__((const))
+#endif
+int *__h_errno_location(void);
+#define h_errno (*__h_errno_location())
+#define HOST_NOT_FOUND 1
+#define TRY_AGAIN 2
+#define NO_RECOVERY 3
+#define NO_DATA 4
+#define NO_ADDRESS NO_DATA
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+void herror(const char *);
+const char *hstrerror(int);
+int gethostbyname_r(const char *, struct hostent *, char *, size_t, struct hostent **, int *);
+int gethostbyname2_r(const char *, int, struct hostent *, char *, size_t, struct hostent **, int *);
+struct hostent *gethostbyname2(const char *, int);
+int gethostbyaddr_r(const void *, socklen_t, int, struct hostent *, char *, size_t, struct hostent **, int *);
+int getservbyport_r(int, const char *, struct servent *, char *, size_t, struct servent **);
+int getservbyname_r(const char *, const char *, struct servent *, char *, size_t, struct servent **);
+#define EAI_NODATA -5
+#define EAI_ADDRFAMILY -9
+#define EAI_INPROGRESS -100
+#define EAI_CANCELED -101
+#define EAI_NOTCANCELED -102
+#define EAI_ALLDONE -103
+#define EAI_INTR -104
+#define EAI_IDN_ENCODE -105
+#define NI_MAXHOST 255
+#define NI_MAXSERV 32
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/netinet/ether.h b/libc-top-half/musl/include/netinet/ether.h
new file mode 100644
index 0000000..eec7e53
--- /dev/null
+++ b/libc-top-half/musl/include/netinet/ether.h
@@ -0,0 +1,22 @@
+#ifndef _NETINET_ETHER_H
+#define _NETINET_ETHER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <netinet/if_ether.h>
+
+char *ether_ntoa (const struct ether_addr *);
+struct ether_addr *ether_aton (const char *);
+char *ether_ntoa_r (const struct ether_addr *, char *);
+struct ether_addr *ether_aton_r (const char *, struct ether_addr *);
+int ether_line(const char *, struct ether_addr *, char *);
+int ether_ntohost(char *, const struct ether_addr *);
+int ether_hostton(const char *, struct ether_addr *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/netinet/icmp6.h b/libc-top-half/musl/include/netinet/icmp6.h
new file mode 100644
index 0000000..01269e7
--- /dev/null
+++ b/libc-top-half/musl/include/netinet/icmp6.h
@@ -0,0 +1,305 @@
+#ifndef _NETINET_ICMP6_H
+#define _NETINET_ICMP6_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+
+#define ICMP6_FILTER 1
+
+#define ICMP6_FILTER_BLOCK 1
+#define ICMP6_FILTER_PASS 2
+#define ICMP6_FILTER_BLOCKOTHERS 3
+#define ICMP6_FILTER_PASSONLY 4
+
+struct icmp6_filter {
+ uint32_t icmp6_filt[8];
+};
+
+struct icmp6_hdr {
+ uint8_t icmp6_type;
+ uint8_t icmp6_code;
+ uint16_t icmp6_cksum;
+ union {
+ uint32_t icmp6_un_data32[1];
+ uint16_t icmp6_un_data16[2];
+ uint8_t icmp6_un_data8[4];
+ } icmp6_dataun;
+};
+
+#define icmp6_data32 icmp6_dataun.icmp6_un_data32
+#define icmp6_data16 icmp6_dataun.icmp6_un_data16
+#define icmp6_data8 icmp6_dataun.icmp6_un_data8
+#define icmp6_pptr icmp6_data32[0]
+#define icmp6_mtu icmp6_data32[0]
+#define icmp6_id icmp6_data16[0]
+#define icmp6_seq icmp6_data16[1]
+#define icmp6_maxdelay icmp6_data16[0]
+
+#define ICMP6_DST_UNREACH 1
+#define ICMP6_PACKET_TOO_BIG 2
+#define ICMP6_TIME_EXCEEDED 3
+#define ICMP6_PARAM_PROB 4
+
+#define ICMP6_INFOMSG_MASK 0x80
+
+#define ICMP6_ECHO_REQUEST 128
+#define ICMP6_ECHO_REPLY 129
+#define MLD_LISTENER_QUERY 130
+#define MLD_LISTENER_REPORT 131
+#define MLD_LISTENER_REDUCTION 132
+
+#define ICMP6_DST_UNREACH_NOROUTE 0
+#define ICMP6_DST_UNREACH_ADMIN 1
+#define ICMP6_DST_UNREACH_BEYONDSCOPE 2
+#define ICMP6_DST_UNREACH_ADDR 3
+#define ICMP6_DST_UNREACH_NOPORT 4
+
+#define ICMP6_TIME_EXCEED_TRANSIT 0
+#define ICMP6_TIME_EXCEED_REASSEMBLY 1
+
+#define ICMP6_PARAMPROB_HEADER 0
+#define ICMP6_PARAMPROB_NEXTHEADER 1
+#define ICMP6_PARAMPROB_OPTION 2
+
+#define ICMP6_FILTER_WILLPASS(type, filterp) \
+ ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) == 0)
+
+#define ICMP6_FILTER_WILLBLOCK(type, filterp) \
+ ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) != 0)
+
+#define ICMP6_FILTER_SETPASS(type, filterp) \
+ ((((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type) & 31))))
+
+#define ICMP6_FILTER_SETBLOCK(type, filterp) \
+ ((((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type) & 31))))
+
+#define ICMP6_FILTER_SETPASSALL(filterp) \
+ memset (filterp, 0, sizeof (struct icmp6_filter));
+
+#define ICMP6_FILTER_SETBLOCKALL(filterp) \
+ memset (filterp, 0xFF, sizeof (struct icmp6_filter));
+
+#define ND_ROUTER_SOLICIT 133
+#define ND_ROUTER_ADVERT 134
+#define ND_NEIGHBOR_SOLICIT 135
+#define ND_NEIGHBOR_ADVERT 136
+#define ND_REDIRECT 137
+
+struct nd_router_solicit {
+ struct icmp6_hdr nd_rs_hdr;
+};
+
+#define nd_rs_type nd_rs_hdr.icmp6_type
+#define nd_rs_code nd_rs_hdr.icmp6_code
+#define nd_rs_cksum nd_rs_hdr.icmp6_cksum
+#define nd_rs_reserved nd_rs_hdr.icmp6_data32[0]
+
+struct nd_router_advert {
+ struct icmp6_hdr nd_ra_hdr;
+ uint32_t nd_ra_reachable;
+ uint32_t nd_ra_retransmit;
+};
+
+#define nd_ra_type nd_ra_hdr.icmp6_type
+#define nd_ra_code nd_ra_hdr.icmp6_code
+#define nd_ra_cksum nd_ra_hdr.icmp6_cksum
+#define nd_ra_curhoplimit nd_ra_hdr.icmp6_data8[0]
+#define nd_ra_flags_reserved nd_ra_hdr.icmp6_data8[1]
+#define ND_RA_FLAG_MANAGED 0x80
+#define ND_RA_FLAG_OTHER 0x40
+#define ND_RA_FLAG_HOME_AGENT 0x20
+#define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1]
+
+struct nd_neighbor_solicit {
+ struct icmp6_hdr nd_ns_hdr;
+ struct in6_addr nd_ns_target;
+};
+
+#define nd_ns_type nd_ns_hdr.icmp6_type
+#define nd_ns_code nd_ns_hdr.icmp6_code
+#define nd_ns_cksum nd_ns_hdr.icmp6_cksum
+#define nd_ns_reserved nd_ns_hdr.icmp6_data32[0]
+
+struct nd_neighbor_advert {
+ struct icmp6_hdr nd_na_hdr;
+ struct in6_addr nd_na_target;
+};
+
+#define nd_na_type nd_na_hdr.icmp6_type
+#define nd_na_code nd_na_hdr.icmp6_code
+#define nd_na_cksum nd_na_hdr.icmp6_cksum
+#define nd_na_flags_reserved nd_na_hdr.icmp6_data32[0]
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define ND_NA_FLAG_ROUTER 0x80000000
+#define ND_NA_FLAG_SOLICITED 0x40000000
+#define ND_NA_FLAG_OVERRIDE 0x20000000
+#else
+#define ND_NA_FLAG_ROUTER 0x00000080
+#define ND_NA_FLAG_SOLICITED 0x00000040
+#define ND_NA_FLAG_OVERRIDE 0x00000020
+#endif
+
+struct nd_redirect {
+ struct icmp6_hdr nd_rd_hdr;
+ struct in6_addr nd_rd_target;
+ struct in6_addr nd_rd_dst;
+};
+
+#define nd_rd_type nd_rd_hdr.icmp6_type
+#define nd_rd_code nd_rd_hdr.icmp6_code
+#define nd_rd_cksum nd_rd_hdr.icmp6_cksum
+#define nd_rd_reserved nd_rd_hdr.icmp6_data32[0]
+
+struct nd_opt_hdr {
+ uint8_t nd_opt_type;
+ uint8_t nd_opt_len;
+};
+
+#define ND_OPT_SOURCE_LINKADDR 1
+#define ND_OPT_TARGET_LINKADDR 2
+#define ND_OPT_PREFIX_INFORMATION 3
+#define ND_OPT_REDIRECTED_HEADER 4
+#define ND_OPT_MTU 5
+#define ND_OPT_RTR_ADV_INTERVAL 7
+#define ND_OPT_HOME_AGENT_INFO 8
+
+struct nd_opt_prefix_info {
+ uint8_t nd_opt_pi_type;
+ uint8_t nd_opt_pi_len;
+ uint8_t nd_opt_pi_prefix_len;
+ uint8_t nd_opt_pi_flags_reserved;
+ uint32_t nd_opt_pi_valid_time;
+ uint32_t nd_opt_pi_preferred_time;
+ uint32_t nd_opt_pi_reserved2;
+ struct in6_addr nd_opt_pi_prefix;
+};
+
+#define ND_OPT_PI_FLAG_ONLINK 0x80
+#define ND_OPT_PI_FLAG_AUTO 0x40
+#define ND_OPT_PI_FLAG_RADDR 0x20
+
+struct nd_opt_rd_hdr {
+ uint8_t nd_opt_rh_type;
+ uint8_t nd_opt_rh_len;
+ uint16_t nd_opt_rh_reserved1;
+ uint32_t nd_opt_rh_reserved2;
+};
+
+struct nd_opt_mtu {
+ uint8_t nd_opt_mtu_type;
+ uint8_t nd_opt_mtu_len;
+ uint16_t nd_opt_mtu_reserved;
+ uint32_t nd_opt_mtu_mtu;
+};
+
+struct mld_hdr {
+ struct icmp6_hdr mld_icmp6_hdr;
+ struct in6_addr mld_addr;
+};
+
+#define mld_type mld_icmp6_hdr.icmp6_type
+#define mld_code mld_icmp6_hdr.icmp6_code
+#define mld_cksum mld_icmp6_hdr.icmp6_cksum
+#define mld_maxdelay mld_icmp6_hdr.icmp6_data16[0]
+#define mld_reserved mld_icmp6_hdr.icmp6_data16[1]
+
+#define ICMP6_ROUTER_RENUMBERING 138
+
+struct icmp6_router_renum {
+ struct icmp6_hdr rr_hdr;
+ uint8_t rr_segnum;
+ uint8_t rr_flags;
+ uint16_t rr_maxdelay;
+ uint32_t rr_reserved;
+};
+
+#define rr_type rr_hdr.icmp6_type
+#define rr_code rr_hdr.icmp6_code
+#define rr_cksum rr_hdr.icmp6_cksum
+#define rr_seqnum rr_hdr.icmp6_data32[0]
+
+#define ICMP6_RR_FLAGS_TEST 0x80
+#define ICMP6_RR_FLAGS_REQRESULT 0x40
+#define ICMP6_RR_FLAGS_FORCEAPPLY 0x20
+#define ICMP6_RR_FLAGS_SPECSITE 0x10
+#define ICMP6_RR_FLAGS_PREVDONE 0x08
+
+struct rr_pco_match {
+ uint8_t rpm_code;
+ uint8_t rpm_len;
+ uint8_t rpm_ordinal;
+ uint8_t rpm_matchlen;
+ uint8_t rpm_minlen;
+ uint8_t rpm_maxlen;
+ uint16_t rpm_reserved;
+ struct in6_addr rpm_prefix;
+};
+
+#define RPM_PCO_ADD 1
+#define RPM_PCO_CHANGE 2
+#define RPM_PCO_SETGLOBAL 3
+
+struct rr_pco_use {
+ uint8_t rpu_uselen;
+ uint8_t rpu_keeplen;
+ uint8_t rpu_ramask;
+ uint8_t rpu_raflags;
+ uint32_t rpu_vltime;
+ uint32_t rpu_pltime;
+ uint32_t rpu_flags;
+ struct in6_addr rpu_prefix;
+};
+
+#define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK 0x20
+#define ICMP6_RR_PCOUSE_RAFLAGS_AUTO 0x10
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80000000
+#define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40000000
+#else
+#define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80
+#define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40
+#endif
+
+struct rr_result {
+ uint16_t rrr_flags;
+ uint8_t rrr_ordinal;
+ uint8_t rrr_matchedlen;
+ uint32_t rrr_ifid;
+ struct in6_addr rrr_prefix;
+};
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define ICMP6_RR_RESULT_FLAGS_OOB 0x0002
+#define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0001
+#else
+#define ICMP6_RR_RESULT_FLAGS_OOB 0x0200
+#define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0100
+#endif
+
+struct nd_opt_adv_interval {
+ uint8_t nd_opt_adv_interval_type;
+ uint8_t nd_opt_adv_interval_len;
+ uint16_t nd_opt_adv_interval_reserved;
+ uint32_t nd_opt_adv_interval_ival;
+};
+
+struct nd_opt_home_agent_info {
+ uint8_t nd_opt_home_agent_info_type;
+ uint8_t nd_opt_home_agent_info_len;
+ uint16_t nd_opt_home_agent_info_reserved;
+ uint16_t nd_opt_home_agent_info_preference;
+ uint16_t nd_opt_home_agent_info_lifetime;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/netinet/if_ether.h b/libc-top-half/musl/include/netinet/if_ether.h
new file mode 100644
index 0000000..3479f51
--- /dev/null
+++ b/libc-top-half/musl/include/netinet/if_ether.h
@@ -0,0 +1,149 @@
+#ifndef _NETINET_IF_ETHER_H
+#define _NETINET_IF_ETHER_H
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#define ETH_ALEN 6
+#define ETH_TLEN 2
+#define ETH_HLEN 14
+#define ETH_ZLEN 60
+#define ETH_DATA_LEN 1500
+#define ETH_FRAME_LEN 1514
+#define ETH_FCS_LEN 4
+#define ETH_MIN_MTU 68
+#define ETH_MAX_MTU 0xFFFFU
+
+#define ETH_P_LOOP 0x0060
+#define ETH_P_PUP 0x0200
+#define ETH_P_PUPAT 0x0201
+#define ETH_P_TSN 0x22F0
+#define ETH_P_ERSPAN2 0x22EB
+#define ETH_P_IP 0x0800
+#define ETH_P_X25 0x0805
+#define ETH_P_ARP 0x0806
+#define ETH_P_BPQ 0x08FF
+#define ETH_P_IEEEPUP 0x0a00
+#define ETH_P_IEEEPUPAT 0x0a01
+#define ETH_P_BATMAN 0x4305
+#define ETH_P_DEC 0x6000
+#define ETH_P_DNA_DL 0x6001
+#define ETH_P_DNA_RC 0x6002
+#define ETH_P_DNA_RT 0x6003
+#define ETH_P_LAT 0x6004
+#define ETH_P_DIAG 0x6005
+#define ETH_P_CUST 0x6006
+#define ETH_P_SCA 0x6007
+#define ETH_P_TEB 0x6558
+#define ETH_P_RARP 0x8035
+#define ETH_P_ATALK 0x809B
+#define ETH_P_AARP 0x80F3
+#define ETH_P_8021Q 0x8100
+#define ETH_P_IPX 0x8137
+#define ETH_P_IPV6 0x86DD
+#define ETH_P_PAUSE 0x8808
+#define ETH_P_SLOW 0x8809
+#define ETH_P_WCCP 0x883E
+#define ETH_P_MPLS_UC 0x8847
+#define ETH_P_MPLS_MC 0x8848
+#define ETH_P_ATMMPOA 0x884c
+#define ETH_P_PPP_DISC 0x8863
+#define ETH_P_PPP_SES 0x8864
+#define ETH_P_LINK_CTL 0x886c
+#define ETH_P_ATMFATE 0x8884
+#define ETH_P_PAE 0x888E
+#define ETH_P_AOE 0x88A2
+#define ETH_P_8021AD 0x88A8
+#define ETH_P_802_EX1 0x88B5
+#define ETH_P_ERSPAN 0x88BE
+#define ETH_P_PREAUTH 0x88C7
+#define ETH_P_TIPC 0x88CA
+#define ETH_P_LLDP 0x88CC
+#define ETH_P_MRP 0x88E3
+#define ETH_P_MACSEC 0x88E5
+#define ETH_P_8021AH 0x88E7
+#define ETH_P_MVRP 0x88F5
+#define ETH_P_1588 0x88F7
+#define ETH_P_NCSI 0x88F8
+#define ETH_P_PRP 0x88FB
+#define ETH_P_CFM 0x8902
+#define ETH_P_FCOE 0x8906
+#define ETH_P_TDLS 0x890D
+#define ETH_P_FIP 0x8914
+#define ETH_P_IBOE 0x8915
+#define ETH_P_80221 0x8917
+#define ETH_P_HSR 0x892F
+#define ETH_P_NSH 0x894F
+#define ETH_P_LOOPBACK 0x9000
+#define ETH_P_QINQ1 0x9100
+#define ETH_P_QINQ2 0x9200
+#define ETH_P_QINQ3 0x9300
+#define ETH_P_EDSA 0xDADA
+#define ETH_P_DSA_8021Q 0xDADB
+#define ETH_P_IFE 0xED3E
+#define ETH_P_AF_IUCV 0xFBFB
+
+#define ETH_P_802_3_MIN 0x0600
+
+#define ETH_P_802_3 0x0001
+#define ETH_P_AX25 0x0002
+#define ETH_P_ALL 0x0003
+#define ETH_P_802_2 0x0004
+#define ETH_P_SNAP 0x0005
+#define ETH_P_DDCMP 0x0006
+#define ETH_P_WAN_PPP 0x0007
+#define ETH_P_PPP_MP 0x0008
+#define ETH_P_LOCALTALK 0x0009
+#define ETH_P_CAN 0x000C
+#define ETH_P_CANFD 0x000D
+#define ETH_P_PPPTALK 0x0010
+#define ETH_P_TR_802_2 0x0011
+#define ETH_P_MOBITEX 0x0015
+#define ETH_P_CONTROL 0x0016
+#define ETH_P_IRDA 0x0017
+#define ETH_P_ECONET 0x0018
+#define ETH_P_HDLC 0x0019
+#define ETH_P_ARCNET 0x001A
+#define ETH_P_DSA 0x001B
+#define ETH_P_TRAILER 0x001C
+#define ETH_P_PHONET 0x00F5
+#define ETH_P_IEEE802154 0x00F6
+#define ETH_P_CAIF 0x00F7
+#define ETH_P_XDSA 0x00F8
+#define ETH_P_MAP 0x00F9
+
+struct ethhdr {
+ uint8_t h_dest[ETH_ALEN];
+ uint8_t h_source[ETH_ALEN];
+ uint16_t h_proto;
+};
+
+#include <net/ethernet.h>
+#include <net/if_arp.h>
+
+struct ether_arp {
+ struct arphdr ea_hdr;
+ uint8_t arp_sha[ETH_ALEN];
+ uint8_t arp_spa[4];
+ uint8_t arp_tha[ETH_ALEN];
+ uint8_t arp_tpa[4];
+};
+#define arp_hrd ea_hdr.ar_hrd
+#define arp_pro ea_hdr.ar_pro
+#define arp_hln ea_hdr.ar_hln
+#define arp_pln ea_hdr.ar_pln
+#define arp_op ea_hdr.ar_op
+
+#define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr) \
+do { \
+ (enaddr)[0] = 0x01; \
+ (enaddr)[1] = 0x00; \
+ (enaddr)[2] = 0x5e; \
+ (enaddr)[3] = ((uint8_t *)ipaddr)[1] & 0x7f; \
+ (enaddr)[4] = ((uint8_t *)ipaddr)[2]; \
+ (enaddr)[5] = ((uint8_t *)ipaddr)[3]; \
+} while(0)
+
+#define __UAPI_DEF_ETHHDR 0
+
+#endif
diff --git a/libc-top-half/musl/include/netinet/igmp.h b/libc-top-half/musl/include/netinet/igmp.h
new file mode 100644
index 0000000..bbe8206
--- /dev/null
+++ b/libc-top-half/musl/include/netinet/igmp.h
@@ -0,0 +1,45 @@
+#ifndef _NETINET_IGMP_H
+#define _NETINET_IGMP_H
+
+#include <stdint.h>
+#include <netinet/in.h>
+
+struct igmp {
+ uint8_t igmp_type;
+ uint8_t igmp_code;
+ uint16_t igmp_cksum;
+ struct in_addr igmp_group;
+};
+
+#define IGMP_MINLEN 8
+
+#define IGMP_MEMBERSHIP_QUERY 0x11
+#define IGMP_V1_MEMBERSHIP_REPORT 0x12
+#define IGMP_V2_MEMBERSHIP_REPORT 0x16
+#define IGMP_V2_LEAVE_GROUP 0x17
+
+#define IGMP_DVMRP 0x13
+#define IGMP_PIM 0x14
+#define IGMP_TRACE 0x15
+
+#define IGMP_MTRACE_RESP 0x1e
+#define IGMP_MTRACE 0x1f
+
+#define IGMP_MAX_HOST_REPORT_DELAY 10
+#define IGMP_TIMER_SCALE 10
+
+#define IGMP_DELAYING_MEMBER 1
+#define IGMP_IDLE_MEMBER 2
+#define IGMP_LAZY_MEMBER 3
+#define IGMP_SLEEPING_MEMBER 4
+#define IGMP_AWAKENING_MEMBER 5
+
+#define IGMP_v1_ROUTER 1
+#define IGMP_v2_ROUTER 2
+
+#define IGMP_HOST_MEMBERSHIP_QUERY IGMP_MEMBERSHIP_QUERY
+#define IGMP_HOST_MEMBERSHIP_REPORT IGMP_V1_MEMBERSHIP_REPORT
+#define IGMP_HOST_NEW_MEMBERSHIP_REPORT IGMP_V2_MEMBERSHIP_REPORT
+#define IGMP_HOST_LEAVE_MESSAGE IGMP_V2_LEAVE_GROUP
+
+#endif
diff --git a/libc-top-half/musl/include/netinet/in.h b/libc-top-half/musl/include/netinet/in.h
new file mode 100644
index 0000000..d9422af
--- /dev/null
+++ b/libc-top-half/musl/include/netinet/in.h
@@ -0,0 +1,433 @@
+#ifndef _NETINET_IN_H
+#define _NETINET_IN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+#include <inttypes.h>
+#include <sys/socket.h>
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#else
+#include <__header_netinet_in.h>
+#endif
+
+typedef uint16_t in_port_t;
+typedef uint32_t in_addr_t;
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+struct in_addr { in_addr_t s_addr; };
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+struct sockaddr_in {
+ sa_family_t sin_family;
+ in_port_t sin_port;
+ struct in_addr sin_addr;
+ uint8_t sin_zero[8];
+};
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+struct in6_addr {
+ union {
+ uint8_t __s6_addr[16];
+ uint16_t __s6_addr16[8];
+ uint32_t __s6_addr32[4];
+ } __in6_union;
+};
+#define s6_addr __in6_union.__s6_addr
+#define s6_addr16 __in6_union.__s6_addr16
+#define s6_addr32 __in6_union.__s6_addr32
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+struct sockaddr_in6 {
+ sa_family_t sin6_family;
+ in_port_t sin6_port;
+ uint32_t sin6_flowinfo;
+ struct in6_addr sin6_addr;
+ uint32_t sin6_scope_id;
+};
+#endif
+
+struct ipv6_mreq {
+ struct in6_addr ipv6mr_multiaddr;
+ unsigned ipv6mr_interface;
+};
+
+#define INADDR_ANY ((in_addr_t) 0x00000000)
+#define INADDR_BROADCAST ((in_addr_t) 0xffffffff)
+#define INADDR_NONE ((in_addr_t) 0xffffffff)
+#define INADDR_LOOPBACK ((in_addr_t) 0x7f000001)
+#define INADDR_DUMMY ((in_addr_t) 0xc0000008)
+
+#define INADDR_UNSPEC_GROUP ((in_addr_t) 0xe0000000)
+#define INADDR_ALLHOSTS_GROUP ((in_addr_t) 0xe0000001)
+#define INADDR_ALLRTRS_GROUP ((in_addr_t) 0xe0000002)
+#define INADDR_ALLSNOOPERS_GROUP ((in_addr_t) 0xe000006a)
+#define INADDR_MAX_LOCAL_GROUP ((in_addr_t) 0xe00000ff)
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
+#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
+#endif
+
+extern const struct in6_addr in6addr_any, in6addr_loopback;
+
+#define INET_ADDRSTRLEN 16
+#define INET6_ADDRSTRLEN 46
+
+uint32_t htonl(uint32_t);
+uint16_t htons(uint16_t);
+uint32_t ntohl(uint32_t);
+uint16_t ntohs(uint16_t);
+
+#define IPPORT_RESERVED 1024
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#define IPPROTO_IP 0
+#define IPPROTO_HOPOPTS 0
+#define IPPROTO_ICMP 1
+#define IPPROTO_IGMP 2
+#define IPPROTO_IPIP 4
+#define IPPROTO_TCP 6
+#define IPPROTO_EGP 8
+#define IPPROTO_PUP 12
+#define IPPROTO_UDP 17
+#define IPPROTO_IDP 22
+#define IPPROTO_TP 29
+#define IPPROTO_DCCP 33
+#define IPPROTO_IPV6 41
+#define IPPROTO_ROUTING 43
+#define IPPROTO_FRAGMENT 44
+#define IPPROTO_RSVP 46
+#define IPPROTO_GRE 47
+#define IPPROTO_ESP 50
+#define IPPROTO_AH 51
+#define IPPROTO_ICMPV6 58
+#define IPPROTO_NONE 59
+#define IPPROTO_DSTOPTS 60
+#define IPPROTO_MTP 92
+#define IPPROTO_BEETPH 94
+#define IPPROTO_ENCAP 98
+#define IPPROTO_PIM 103
+#define IPPROTO_COMP 108
+#define IPPROTO_SCTP 132
+#define IPPROTO_MH 135
+#define IPPROTO_UDPLITE 136
+#define IPPROTO_MPLS 137
+#define IPPROTO_ETHERNET 143
+#define IPPROTO_RAW 255
+#define IPPROTO_MPTCP 262
+#define IPPROTO_MAX 263
+#endif
+
+#define IN6_IS_ADDR_UNSPECIFIED(a) \
+ (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && \
+ ((uint32_t *) (a))[2] == 0 && ((uint32_t *) (a))[3] == 0)
+
+#define IN6_IS_ADDR_LOOPBACK(a) \
+ (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && \
+ ((uint32_t *) (a))[2] == 0 && \
+ ((uint8_t *) (a))[12] == 0 && ((uint8_t *) (a))[13] == 0 && \
+ ((uint8_t *) (a))[14] == 0 && ((uint8_t *) (a))[15] == 1 )
+
+#define IN6_IS_ADDR_MULTICAST(a) (((uint8_t *) (a))[0] == 0xff)
+
+#define IN6_IS_ADDR_LINKLOCAL(a) \
+ ((((uint8_t *) (a))[0]) == 0xfe && (((uint8_t *) (a))[1] & 0xc0) == 0x80)
+
+#define IN6_IS_ADDR_SITELOCAL(a) \
+ ((((uint8_t *) (a))[0]) == 0xfe && (((uint8_t *) (a))[1] & 0xc0) == 0xc0)
+
+#define IN6_IS_ADDR_V4MAPPED(a) \
+ (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && \
+ ((uint8_t *) (a))[8] == 0 && ((uint8_t *) (a))[9] == 0 && \
+ ((uint8_t *) (a))[10] == 0xff && ((uint8_t *) (a))[11] == 0xff)
+
+#define IN6_IS_ADDR_V4COMPAT(a) \
+ (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && \
+ ((uint32_t *) (a))[2] == 0 && ((uint8_t *) (a))[15] > 1)
+
+#define IN6_IS_ADDR_MC_NODELOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x1))
+
+#define IN6_IS_ADDR_MC_LINKLOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x2))
+
+#define IN6_IS_ADDR_MC_SITELOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x5))
+
+#define IN6_IS_ADDR_MC_ORGLOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x8))
+
+#define IN6_IS_ADDR_MC_GLOBAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0xe))
+
+#define __ARE_4_EQUAL(a,b) \
+ (!( (0[a]-0[b]) | (1[a]-1[b]) | (2[a]-2[b]) | (3[a]-3[b]) ))
+#define IN6_ARE_ADDR_EQUAL(a,b) \
+ __ARE_4_EQUAL((const uint32_t *)(a), (const uint32_t *)(b))
+
+#define IN_CLASSA(a) ((((in_addr_t)(a)) & 0x80000000) == 0)
+#define IN_CLASSA_NET 0xff000000
+#define IN_CLASSA_NSHIFT 24
+#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET)
+#define IN_CLASSA_MAX 128
+#define IN_CLASSB(a) ((((in_addr_t)(a)) & 0xc0000000) == 0x80000000)
+#define IN_CLASSB_NET 0xffff0000
+#define IN_CLASSB_NSHIFT 16
+#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET)
+#define IN_CLASSB_MAX 65536
+#define IN_CLASSC(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xc0000000)
+#define IN_CLASSC_NET 0xffffff00
+#define IN_CLASSC_NSHIFT 8
+#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET)
+#define IN_CLASSD(a) ((((in_addr_t)(a)) & 0xf0000000) == 0xe0000000)
+#define IN_MULTICAST(a) IN_CLASSD(a)
+#define IN_EXPERIMENTAL(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xe0000000)
+#define IN_BADCLASS(a) ((((in_addr_t)(a)) & 0xf0000000) == 0xf0000000)
+
+#define IN_LOOPBACKNET 127
+
+
+#define IP_TOS 1
+#define IP_TTL 2
+#define IP_HDRINCL 3
+#define IP_OPTIONS 4
+#define IP_ROUTER_ALERT 5
+#define IP_RECVOPTS 6
+#define IP_RETOPTS 7
+#define IP_PKTINFO 8
+#define IP_PKTOPTIONS 9
+#define IP_PMTUDISC 10
+#define IP_MTU_DISCOVER 10
+#define IP_RECVERR 11
+#define IP_RECVTTL 12
+#define IP_RECVTOS 13
+#define IP_MTU 14
+#define IP_FREEBIND 15
+#define IP_IPSEC_POLICY 16
+#define IP_XFRM_POLICY 17
+#define IP_PASSSEC 18
+#define IP_TRANSPARENT 19
+#define IP_ORIGDSTADDR 20
+#define IP_RECVORIGDSTADDR IP_ORIGDSTADDR
+#define IP_MINTTL 21
+#define IP_NODEFRAG 22
+#define IP_CHECKSUM 23
+#define IP_BIND_ADDRESS_NO_PORT 24
+#define IP_RECVFRAGSIZE 25
+#define IP_RECVERR_RFC4884 26
+#define IP_MULTICAST_IF 32
+#define IP_MULTICAST_TTL 33
+#define IP_MULTICAST_LOOP 34
+#define IP_ADD_MEMBERSHIP 35
+#define IP_DROP_MEMBERSHIP 36
+#define IP_UNBLOCK_SOURCE 37
+#define IP_BLOCK_SOURCE 38
+#define IP_ADD_SOURCE_MEMBERSHIP 39
+#define IP_DROP_SOURCE_MEMBERSHIP 40
+#define IP_MSFILTER 41
+#define IP_MULTICAST_ALL 49
+#define IP_UNICAST_IF 50
+
+#define IP_RECVRETOPTS IP_RETOPTS
+
+#define IP_PMTUDISC_DONT 0
+#define IP_PMTUDISC_WANT 1
+#define IP_PMTUDISC_DO 2
+#define IP_PMTUDISC_PROBE 3
+#define IP_PMTUDISC_INTERFACE 4
+#define IP_PMTUDISC_OMIT 5
+
+#define IP_DEFAULT_MULTICAST_TTL 1
+#define IP_DEFAULT_MULTICAST_LOOP 1
+#define IP_MAX_MEMBERSHIPS 20
+
+struct ip_opts {
+ struct in_addr ip_dst;
+ char ip_opts[40];
+};
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#define MCAST_JOIN_GROUP 42
+#define MCAST_BLOCK_SOURCE 43
+#define MCAST_UNBLOCK_SOURCE 44
+#define MCAST_LEAVE_GROUP 45
+#define MCAST_JOIN_SOURCE_GROUP 46
+#define MCAST_LEAVE_SOURCE_GROUP 47
+#define MCAST_MSFILTER 48
+
+#define MCAST_EXCLUDE 0
+#define MCAST_INCLUDE 1
+
+struct ip_mreq {
+ struct in_addr imr_multiaddr;
+ struct in_addr imr_interface;
+};
+
+struct ip_mreqn {
+ struct in_addr imr_multiaddr;
+ struct in_addr imr_address;
+ int imr_ifindex;
+};
+
+struct ip_mreq_source {
+ struct in_addr imr_multiaddr;
+ struct in_addr imr_interface;
+ struct in_addr imr_sourceaddr;
+};
+
+struct ip_msfilter {
+ struct in_addr imsf_multiaddr;
+ struct in_addr imsf_interface;
+ uint32_t imsf_fmode;
+ uint32_t imsf_numsrc;
+ struct in_addr imsf_slist[1];
+};
+#define IP_MSFILTER_SIZE(numsrc) \
+ (sizeof(struct ip_msfilter) - sizeof(struct in_addr) \
+ + (numsrc) * sizeof(struct in_addr))
+
+struct group_req {
+ uint32_t gr_interface;
+ struct sockaddr_storage gr_group;
+};
+
+struct group_source_req {
+ uint32_t gsr_interface;
+ struct sockaddr_storage gsr_group;
+ struct sockaddr_storage gsr_source;
+};
+
+struct group_filter {
+ uint32_t gf_interface;
+ struct sockaddr_storage gf_group;
+ uint32_t gf_fmode;
+ uint32_t gf_numsrc;
+ struct sockaddr_storage gf_slist[1];
+};
+#define GROUP_FILTER_SIZE(numsrc) \
+ (sizeof(struct group_filter) - sizeof(struct sockaddr_storage) \
+ + (numsrc) * sizeof(struct sockaddr_storage))
+
+struct in_pktinfo {
+ int ipi_ifindex;
+ struct in_addr ipi_spec_dst;
+ struct in_addr ipi_addr;
+};
+
+struct in6_pktinfo {
+ struct in6_addr ipi6_addr;
+ unsigned ipi6_ifindex;
+};
+
+struct ip6_mtuinfo {
+ struct sockaddr_in6 ip6m_addr;
+ uint32_t ip6m_mtu;
+};
+#endif
+
+#define IPV6_ADDRFORM 1
+#define IPV6_2292PKTINFO 2
+#define IPV6_2292HOPOPTS 3
+#define IPV6_2292DSTOPTS 4
+#define IPV6_2292RTHDR 5
+#define IPV6_2292PKTOPTIONS 6
+#define IPV6_CHECKSUM 7
+#define IPV6_2292HOPLIMIT 8
+#define IPV6_NEXTHOP 9
+#define IPV6_AUTHHDR 10
+#define IPV6_UNICAST_HOPS 16
+#define IPV6_MULTICAST_IF 17
+#define IPV6_MULTICAST_HOPS 18
+#define IPV6_MULTICAST_LOOP 19
+#define IPV6_JOIN_GROUP 20
+#define IPV6_LEAVE_GROUP 21
+#define IPV6_ROUTER_ALERT 22
+#define IPV6_MTU_DISCOVER 23
+#define IPV6_MTU 24
+#define IPV6_RECVERR 25
+#define IPV6_V6ONLY 26
+#define IPV6_JOIN_ANYCAST 27
+#define IPV6_LEAVE_ANYCAST 28
+#define IPV6_MULTICAST_ALL 29
+#define IPV6_ROUTER_ALERT_ISOLATE 30
+#define IPV6_IPSEC_POLICY 34
+#define IPV6_XFRM_POLICY 35
+#define IPV6_HDRINCL 36
+
+#define IPV6_RECVPKTINFO 49
+#define IPV6_PKTINFO 50
+#define IPV6_RECVHOPLIMIT 51
+#define IPV6_HOPLIMIT 52
+#define IPV6_RECVHOPOPTS 53
+#define IPV6_HOPOPTS 54
+#define IPV6_RTHDRDSTOPTS 55
+#define IPV6_RECVRTHDR 56
+#define IPV6_RTHDR 57
+#define IPV6_RECVDSTOPTS 58
+#define IPV6_DSTOPTS 59
+#define IPV6_RECVPATHMTU 60
+#define IPV6_PATHMTU 61
+#define IPV6_DONTFRAG 62
+#define IPV6_RECVTCLASS 66
+#define IPV6_TCLASS 67
+#define IPV6_AUTOFLOWLABEL 70
+#define IPV6_ADDR_PREFERENCES 72
+#define IPV6_MINHOPCOUNT 73
+#define IPV6_ORIGDSTADDR 74
+#define IPV6_RECVORIGDSTADDR IPV6_ORIGDSTADDR
+#define IPV6_TRANSPARENT 75
+#define IPV6_UNICAST_IF 76
+#define IPV6_RECVFRAGSIZE 77
+#define IPV6_FREEBIND 78
+
+#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
+#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
+#define IPV6_RXHOPOPTS IPV6_HOPOPTS
+#define IPV6_RXDSTOPTS IPV6_DSTOPTS
+
+#define IPV6_PMTUDISC_DONT 0
+#define IPV6_PMTUDISC_WANT 1
+#define IPV6_PMTUDISC_DO 2
+#define IPV6_PMTUDISC_PROBE 3
+#define IPV6_PMTUDISC_INTERFACE 4
+#define IPV6_PMTUDISC_OMIT 5
+
+#define IPV6_PREFER_SRC_TMP 0x0001
+#define IPV6_PREFER_SRC_PUBLIC 0x0002
+#define IPV6_PREFER_SRC_PUBTMP_DEFAULT 0x0100
+#define IPV6_PREFER_SRC_COA 0x0004
+#define IPV6_PREFER_SRC_HOME 0x0400
+#define IPV6_PREFER_SRC_CGA 0x0008
+#define IPV6_PREFER_SRC_NONCGA 0x0800
+
+#define IPV6_RTHDR_LOOSE 0
+#define IPV6_RTHDR_STRICT 1
+
+#define IPV6_RTHDR_TYPE_0 0
+
+#define __UAPI_DEF_IN_ADDR 0
+#define __UAPI_DEF_IN_IPPROTO 0
+#define __UAPI_DEF_IN_PKTINFO 0
+#define __UAPI_DEF_IP_MREQ 0
+#define __UAPI_DEF_SOCKADDR_IN 0
+#define __UAPI_DEF_IN_CLASS 0
+#define __UAPI_DEF_IN6_ADDR 0
+#define __UAPI_DEF_IN6_ADDR_ALT 0
+#define __UAPI_DEF_SOCKADDR_IN6 0
+#define __UAPI_DEF_IPV6_MREQ 0
+#define __UAPI_DEF_IPPROTO_V6 0
+#define __UAPI_DEF_IPV6_OPTIONS 0
+#define __UAPI_DEF_IN6_PKTINFO 0
+#define __UAPI_DEF_IP6_MTUINFO 0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/netinet/in_systm.h b/libc-top-half/musl/include/netinet/in_systm.h
new file mode 100644
index 0000000..a7b4177
--- /dev/null
+++ b/libc-top-half/musl/include/netinet/in_systm.h
@@ -0,0 +1,9 @@
+#ifndef _NETINET_IN_SYSTM_H
+#define _NETINET_IN_SYSTM_H
+
+#include <stdint.h>
+
+typedef uint16_t n_short;
+typedef uint32_t n_long, n_time;
+
+#endif
diff --git a/libc-top-half/musl/include/netinet/ip.h b/libc-top-half/musl/include/netinet/ip.h
new file mode 100644
index 0000000..0ae132a
--- /dev/null
+++ b/libc-top-half/musl/include/netinet/ip.h
@@ -0,0 +1,199 @@
+#ifndef _NETINET_IP_H
+#define _NETINET_IP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <netinet/in.h>
+
+struct timestamp {
+ uint8_t len;
+ uint8_t ptr;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned int flags:4;
+ unsigned int overflow:4;
+#else
+ unsigned int overflow:4;
+ unsigned int flags:4;
+#endif
+ uint32_t data[9];
+ };
+
+struct iphdr {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned int ihl:4;
+ unsigned int version:4;
+#else
+ unsigned int version:4;
+ unsigned int ihl:4;
+#endif
+ uint8_t tos;
+ uint16_t tot_len;
+ uint16_t id;
+ uint16_t frag_off;
+ uint8_t ttl;
+ uint8_t protocol;
+ uint16_t check;
+ uint32_t saddr;
+ uint32_t daddr;
+};
+
+struct ip {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned int ip_hl:4;
+ unsigned int ip_v:4;
+#else
+ unsigned int ip_v:4;
+ unsigned int ip_hl:4;
+#endif
+ uint8_t ip_tos;
+ uint16_t ip_len;
+ uint16_t ip_id;
+ uint16_t ip_off;
+ uint8_t ip_ttl;
+ uint8_t ip_p;
+ uint16_t ip_sum;
+ struct in_addr ip_src, ip_dst;
+};
+
+#define IP_RF 0x8000
+#define IP_DF 0x4000
+#define IP_MF 0x2000
+#define IP_OFFMASK 0x1fff
+
+struct ip_timestamp {
+ uint8_t ipt_code;
+ uint8_t ipt_len;
+ uint8_t ipt_ptr;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned int ipt_flg:4;
+ unsigned int ipt_oflw:4;
+#else
+ unsigned int ipt_oflw:4;
+ unsigned int ipt_flg:4;
+#endif
+ uint32_t data[9];
+};
+
+#define IPVERSION 4
+#define IP_MAXPACKET 65535
+
+#define IPTOS_ECN_MASK 0x03
+#define IPTOS_ECN(x) ((x) & IPTOS_ECN_MASK)
+#define IPTOS_ECN_NOT_ECT 0x00
+#define IPTOS_ECN_ECT1 0x01
+#define IPTOS_ECN_ECT0 0x02
+#define IPTOS_ECN_CE 0x03
+
+#define IPTOS_DSCP_MASK 0xfc
+#define IPTOS_DSCP(x) ((x) & IPTOS_DSCP_MASK)
+#define IPTOS_DSCP_AF11 0x28
+#define IPTOS_DSCP_AF12 0x30
+#define IPTOS_DSCP_AF13 0x38
+#define IPTOS_DSCP_AF21 0x48
+#define IPTOS_DSCP_AF22 0x50
+#define IPTOS_DSCP_AF23 0x58
+#define IPTOS_DSCP_AF31 0x68
+#define IPTOS_DSCP_AF32 0x70
+#define IPTOS_DSCP_AF33 0x78
+#define IPTOS_DSCP_AF41 0x88
+#define IPTOS_DSCP_AF42 0x90
+#define IPTOS_DSCP_AF43 0x98
+#define IPTOS_DSCP_EF 0xb8
+
+#define IPTOS_CLASS_MASK 0xe0
+#define IPTOS_CLASS(x) ((x) & IPTOS_CLASS_MASK)
+#define IPTOS_CLASS_CS0 0x00
+#define IPTOS_CLASS_CS1 0x20
+#define IPTOS_CLASS_CS2 0x40
+#define IPTOS_CLASS_CS3 0x60
+#define IPTOS_CLASS_CS4 0x80
+#define IPTOS_CLASS_CS5 0xa0
+#define IPTOS_CLASS_CS6 0xc0
+#define IPTOS_CLASS_CS7 0xe0
+#define IPTOS_CLASS_DEFAULT IPTOS_CLASS_CS0
+
+#define IPTOS_TOS_MASK 0x1E
+#define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK)
+#define IPTOS_LOWDELAY 0x10
+#define IPTOS_THROUGHPUT 0x08
+#define IPTOS_RELIABILITY 0x04
+#define IPTOS_LOWCOST 0x02
+#define IPTOS_MINCOST IPTOS_LOWCOST
+
+#define IPTOS_PREC_MASK 0xe0
+#define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK)
+#define IPTOS_PREC_NETCONTROL 0xe0
+#define IPTOS_PREC_INTERNETCONTROL 0xc0
+#define IPTOS_PREC_CRITIC_ECP 0xa0
+#define IPTOS_PREC_FLASHOVERRIDE 0x80
+#define IPTOS_PREC_FLASH 0x60
+#define IPTOS_PREC_IMMEDIATE 0x40
+#define IPTOS_PREC_PRIORITY 0x20
+#define IPTOS_PREC_ROUTINE 0x00
+
+#define IPOPT_COPY 0x80
+#define IPOPT_CLASS_MASK 0x60
+#define IPOPT_NUMBER_MASK 0x1f
+
+#define IPOPT_COPIED(o) ((o) & IPOPT_COPY)
+#define IPOPT_CLASS(o) ((o) & IPOPT_CLASS_MASK)
+#define IPOPT_NUMBER(o) ((o) & IPOPT_NUMBER_MASK)
+
+#define IPOPT_CONTROL 0x00
+#define IPOPT_RESERVED1 0x20
+#define IPOPT_DEBMEAS 0x40
+#define IPOPT_MEASUREMENT IPOPT_DEBMEAS
+#define IPOPT_RESERVED2 0x60
+
+#define IPOPT_EOL 0
+#define IPOPT_END IPOPT_EOL
+#define IPOPT_NOP 1
+#define IPOPT_NOOP IPOPT_NOP
+
+#define IPOPT_RR 7
+#define IPOPT_TS 68
+#define IPOPT_TIMESTAMP IPOPT_TS
+#define IPOPT_SECURITY 130
+#define IPOPT_SEC IPOPT_SECURITY
+#define IPOPT_LSRR 131
+#define IPOPT_SATID 136
+#define IPOPT_SID IPOPT_SATID
+#define IPOPT_SSRR 137
+#define IPOPT_RA 148
+
+#define IPOPT_OPTVAL 0
+#define IPOPT_OLEN 1
+#define IPOPT_OFFSET 2
+#define IPOPT_MINOFF 4
+
+#define MAX_IPOPTLEN 40
+
+#define IPOPT_TS_TSONLY 0
+#define IPOPT_TS_TSANDADDR 1
+#define IPOPT_TS_PRESPEC 3
+
+#define IPOPT_SECUR_UNCLASS 0x0000
+#define IPOPT_SECUR_CONFID 0xf135
+#define IPOPT_SECUR_EFTO 0x789a
+#define IPOPT_SECUR_MMMM 0xbc4d
+#define IPOPT_SECUR_RESTR 0xaf13
+#define IPOPT_SECUR_SECRET 0xd788
+#define IPOPT_SECUR_TOPSECRET 0x6bc5
+
+#define MAXTTL 255
+#define IPDEFTTL 64
+#define IPFRAGTTL 60
+#define IPTTLDEC 1
+
+#define IP_MSS 576
+
+#define __UAPI_DEF_IPHDR 0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/netinet/ip6.h b/libc-top-half/musl/include/netinet/ip6.h
new file mode 100644
index 0000000..50c626a
--- /dev/null
+++ b/libc-top-half/musl/include/netinet/ip6.h
@@ -0,0 +1,141 @@
+#ifndef _NETINET_IP6_H
+#define _NETINET_IP6_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <netinet/in.h>
+
+struct ip6_hdr {
+ union {
+ struct ip6_hdrctl {
+ uint32_t ip6_un1_flow;
+ uint16_t ip6_un1_plen;
+ uint8_t ip6_un1_nxt;
+ uint8_t ip6_un1_hlim;
+ } ip6_un1;
+ uint8_t ip6_un2_vfc;
+ } ip6_ctlun;
+ struct in6_addr ip6_src;
+ struct in6_addr ip6_dst;
+};
+
+#define ip6_vfc ip6_ctlun.ip6_un2_vfc
+#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
+#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
+#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
+#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
+#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
+
+struct ip6_ext {
+ uint8_t ip6e_nxt;
+ uint8_t ip6e_len;
+};
+
+struct ip6_hbh {
+ uint8_t ip6h_nxt;
+ uint8_t ip6h_len;
+};
+
+struct ip6_dest {
+ uint8_t ip6d_nxt;
+ uint8_t ip6d_len;
+};
+
+struct ip6_rthdr {
+ uint8_t ip6r_nxt;
+ uint8_t ip6r_len;
+ uint8_t ip6r_type;
+ uint8_t ip6r_segleft;
+};
+
+struct ip6_rthdr0 {
+ uint8_t ip6r0_nxt;
+ uint8_t ip6r0_len;
+ uint8_t ip6r0_type;
+ uint8_t ip6r0_segleft;
+ uint8_t ip6r0_reserved;
+ uint8_t ip6r0_slmap[3];
+ struct in6_addr ip6r0_addr[];
+};
+
+struct ip6_frag {
+ uint8_t ip6f_nxt;
+ uint8_t ip6f_reserved;
+ uint16_t ip6f_offlg;
+ uint32_t ip6f_ident;
+};
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define IP6F_OFF_MASK 0xfff8
+#define IP6F_RESERVED_MASK 0x0006
+#define IP6F_MORE_FRAG 0x0001
+#else
+#define IP6F_OFF_MASK 0xf8ff
+#define IP6F_RESERVED_MASK 0x0600
+#define IP6F_MORE_FRAG 0x0100
+#endif
+
+struct ip6_opt {
+ uint8_t ip6o_type;
+ uint8_t ip6o_len;
+};
+
+#define IP6OPT_TYPE(o) ((o) & 0xc0)
+#define IP6OPT_TYPE_SKIP 0x00
+#define IP6OPT_TYPE_DISCARD 0x40
+#define IP6OPT_TYPE_FORCEICMP 0x80
+#define IP6OPT_TYPE_ICMP 0xc0
+#define IP6OPT_TYPE_MUTABLE 0x20
+
+#define IP6OPT_PAD1 0
+#define IP6OPT_PADN 1
+
+#define IP6OPT_JUMBO 0xc2
+#define IP6OPT_NSAP_ADDR 0xc3
+#define IP6OPT_TUNNEL_LIMIT 0x04
+#define IP6OPT_ROUTER_ALERT 0x05
+
+struct ip6_opt_jumbo {
+ uint8_t ip6oj_type;
+ uint8_t ip6oj_len;
+ uint8_t ip6oj_jumbo_len[4];
+};
+#define IP6OPT_JUMBO_LEN 6
+
+struct ip6_opt_nsap {
+ uint8_t ip6on_type;
+ uint8_t ip6on_len;
+ uint8_t ip6on_src_nsap_len;
+ uint8_t ip6on_dst_nsap_len;
+};
+
+struct ip6_opt_tunnel {
+ uint8_t ip6ot_type;
+ uint8_t ip6ot_len;
+ uint8_t ip6ot_encap_limit;
+};
+
+struct ip6_opt_router {
+ uint8_t ip6or_type;
+ uint8_t ip6or_len;
+ uint8_t ip6or_value[2];
+};
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define IP6_ALERT_MLD 0x0000
+#define IP6_ALERT_RSVP 0x0001
+#define IP6_ALERT_AN 0x0002
+#else
+#define IP6_ALERT_MLD 0x0000
+#define IP6_ALERT_RSVP 0x0100
+#define IP6_ALERT_AN 0x0200
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/netinet/ip_icmp.h b/libc-top-half/musl/include/netinet/ip_icmp.h
new file mode 100644
index 0000000..b9e0df8
--- /dev/null
+++ b/libc-top-half/musl/include/netinet/ip_icmp.h
@@ -0,0 +1,193 @@
+#ifndef _NETINET_IP_ICMP_H
+#define _NETINET_IP_ICMP_H
+
+#include <stdint.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct icmphdr {
+ uint8_t type;
+ uint8_t code;
+ uint16_t checksum;
+ union {
+ struct {
+ uint16_t id;
+ uint16_t sequence;
+ } echo;
+ uint32_t gateway;
+ struct {
+ uint16_t __unused;
+ uint16_t mtu;
+ } frag;
+ uint8_t reserved[4];
+ } un;
+};
+
+#define ICMP_ECHOREPLY 0
+#define ICMP_DEST_UNREACH 3
+#define ICMP_SOURCE_QUENCH 4
+#define ICMP_REDIRECT 5
+#define ICMP_ECHO 8
+#define ICMP_TIME_EXCEEDED 11
+#define ICMP_PARAMETERPROB 12
+#define ICMP_TIMESTAMP 13
+#define ICMP_TIMESTAMPREPLY 14
+#define ICMP_INFO_REQUEST 15
+#define ICMP_INFO_REPLY 16
+#define ICMP_ADDRESS 17
+#define ICMP_ADDRESSREPLY 18
+#define NR_ICMP_TYPES 18
+
+
+#define ICMP_NET_UNREACH 0
+#define ICMP_HOST_UNREACH 1
+#define ICMP_PROT_UNREACH 2
+#define ICMP_PORT_UNREACH 3
+#define ICMP_FRAG_NEEDED 4
+#define ICMP_SR_FAILED 5
+#define ICMP_NET_UNKNOWN 6
+#define ICMP_HOST_UNKNOWN 7
+#define ICMP_HOST_ISOLATED 8
+#define ICMP_NET_ANO 9
+#define ICMP_HOST_ANO 10
+#define ICMP_NET_UNR_TOS 11
+#define ICMP_HOST_UNR_TOS 12
+#define ICMP_PKT_FILTERED 13
+#define ICMP_PREC_VIOLATION 14
+#define ICMP_PREC_CUTOFF 15
+#define NR_ICMP_UNREACH 15
+
+#define ICMP_REDIR_NET 0
+#define ICMP_REDIR_HOST 1
+#define ICMP_REDIR_NETTOS 2
+#define ICMP_REDIR_HOSTTOS 3
+
+#define ICMP_EXC_TTL 0
+#define ICMP_EXC_FRAGTIME 1
+
+
+struct icmp_ra_addr {
+ uint32_t ira_addr;
+ uint32_t ira_preference;
+};
+
+struct icmp {
+ uint8_t icmp_type;
+ uint8_t icmp_code;
+ uint16_t icmp_cksum;
+ union {
+ uint8_t ih_pptr;
+ struct in_addr ih_gwaddr;
+ struct ih_idseq {
+ uint16_t icd_id;
+ uint16_t icd_seq;
+ } ih_idseq;
+ uint32_t ih_void;
+
+ struct ih_pmtu {
+ uint16_t ipm_void;
+ uint16_t ipm_nextmtu;
+ } ih_pmtu;
+
+ struct ih_rtradv {
+ uint8_t irt_num_addrs;
+ uint8_t irt_wpa;
+ uint16_t irt_lifetime;
+ } ih_rtradv;
+ } icmp_hun;
+ union {
+ struct {
+ uint32_t its_otime;
+ uint32_t its_rtime;
+ uint32_t its_ttime;
+ } id_ts;
+ struct {
+ struct ip idi_ip;
+ } id_ip;
+ struct icmp_ra_addr id_radv;
+ uint32_t id_mask;
+ uint8_t id_data[1];
+ } icmp_dun;
+};
+
+#define icmp_pptr icmp_hun.ih_pptr
+#define icmp_gwaddr icmp_hun.ih_gwaddr
+#define icmp_id icmp_hun.ih_idseq.icd_id
+#define icmp_seq icmp_hun.ih_idseq.icd_seq
+#define icmp_void icmp_hun.ih_void
+#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
+#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu
+#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs
+#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa
+#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime
+#define icmp_otime icmp_dun.id_ts.its_otime
+#define icmp_rtime icmp_dun.id_ts.its_rtime
+#define icmp_ttime icmp_dun.id_ts.its_ttime
+#define icmp_ip icmp_dun.id_ip.idi_ip
+#define icmp_radv icmp_dun.id_radv
+#define icmp_mask icmp_dun.id_mask
+#define icmp_data icmp_dun.id_data
+
+#define ICMP_MINLEN 8
+#define ICMP_TSLEN (8 + 3 * sizeof (n_time))
+#define ICMP_MASKLEN 12
+#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8)
+#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8)
+
+#define ICMP_UNREACH 3
+#define ICMP_SOURCEQUENCH 4
+#define ICMP_ROUTERADVERT 9
+#define ICMP_ROUTERSOLICIT 10
+#define ICMP_TIMXCEED 11
+#define ICMP_PARAMPROB 12
+#define ICMP_TSTAMP 13
+#define ICMP_TSTAMPREPLY 14
+#define ICMP_IREQ 15
+#define ICMP_IREQREPLY 16
+#define ICMP_MASKREQ 17
+#define ICMP_MASKREPLY 18
+#define ICMP_MAXTYPE 18
+
+#define ICMP_UNREACH_NET 0
+#define ICMP_UNREACH_HOST 1
+#define ICMP_UNREACH_PROTOCOL 2
+#define ICMP_UNREACH_PORT 3
+#define ICMP_UNREACH_NEEDFRAG 4
+#define ICMP_UNREACH_SRCFAIL 5
+#define ICMP_UNREACH_NET_UNKNOWN 6
+#define ICMP_UNREACH_HOST_UNKNOWN 7
+#define ICMP_UNREACH_ISOLATED 8
+#define ICMP_UNREACH_NET_PROHIB 9
+#define ICMP_UNREACH_HOST_PROHIB 10
+#define ICMP_UNREACH_TOSNET 11
+#define ICMP_UNREACH_TOSHOST 12
+#define ICMP_UNREACH_FILTER_PROHIB 13
+#define ICMP_UNREACH_HOST_PRECEDENCE 14
+#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15
+
+#define ICMP_REDIRECT_NET 0
+#define ICMP_REDIRECT_HOST 1
+#define ICMP_REDIRECT_TOSNET 2
+#define ICMP_REDIRECT_TOSHOST 3
+
+#define ICMP_TIMXCEED_INTRANS 0
+#define ICMP_TIMXCEED_REASS 1
+
+#define ICMP_PARAMPROB_OPTABSENT 1
+
+#define ICMP_INFOTYPE(type) \
+ ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \
+ (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \
+ (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
+ (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \
+ (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/netinet/tcp.h b/libc-top-half/musl/include/netinet/tcp.h
new file mode 100644
index 0000000..fad1d84
--- /dev/null
+++ b/libc-top-half/musl/include/netinet/tcp.h
@@ -0,0 +1,305 @@
+#ifndef _NETINET_TCP_H
+#define _NETINET_TCP_H
+
+#include <features.h>
+
+#define TCP_NODELAY 1
+#define TCP_MAXSEG 2
+#define TCP_CORK 3
+#define TCP_KEEPIDLE 4
+#define TCP_KEEPINTVL 5
+#define TCP_KEEPCNT 6
+#define TCP_SYNCNT 7
+#define TCP_LINGER2 8
+#define TCP_DEFER_ACCEPT 9
+#define TCP_WINDOW_CLAMP 10
+#define TCP_INFO 11
+#define TCP_QUICKACK 12
+#define TCP_CONGESTION 13
+#define TCP_MD5SIG 14
+#define TCP_THIN_LINEAR_TIMEOUTS 16
+#define TCP_THIN_DUPACK 17
+#define TCP_USER_TIMEOUT 18
+#define TCP_REPAIR 19
+#define TCP_REPAIR_QUEUE 20
+#define TCP_QUEUE_SEQ 21
+#define TCP_REPAIR_OPTIONS 22
+#define TCP_FASTOPEN 23
+#define TCP_TIMESTAMP 24
+#define TCP_NOTSENT_LOWAT 25
+#define TCP_CC_INFO 26
+#define TCP_SAVE_SYN 27
+#define TCP_SAVED_SYN 28
+#define TCP_REPAIR_WINDOW 29
+#define TCP_FASTOPEN_CONNECT 30
+#define TCP_ULP 31
+#define TCP_MD5SIG_EXT 32
+#define TCP_FASTOPEN_KEY 33
+#define TCP_FASTOPEN_NO_COOKIE 34
+#define TCP_ZEROCOPY_RECEIVE 35
+#define TCP_INQ 36
+#define TCP_TX_DELAY 37
+
+#define TCP_CM_INQ TCP_INQ
+
+#define TCP_ESTABLISHED 1
+#define TCP_SYN_SENT 2
+#define TCP_SYN_RECV 3
+#define TCP_FIN_WAIT1 4
+#define TCP_FIN_WAIT2 5
+#define TCP_TIME_WAIT 6
+#define TCP_CLOSE 7
+#define TCP_CLOSE_WAIT 8
+#define TCP_LAST_ACK 9
+#define TCP_LISTEN 10
+#define TCP_CLOSING 11
+
+enum {
+ TCP_NLA_PAD,
+ TCP_NLA_BUSY,
+ TCP_NLA_RWND_LIMITED,
+ TCP_NLA_SNDBUF_LIMITED,
+ TCP_NLA_DATA_SEGS_OUT,
+ TCP_NLA_TOTAL_RETRANS,
+ TCP_NLA_PACING_RATE,
+ TCP_NLA_DELIVERY_RATE,
+ TCP_NLA_SND_CWND,
+ TCP_NLA_REORDERING,
+ TCP_NLA_MIN_RTT,
+ TCP_NLA_RECUR_RETRANS,
+ TCP_NLA_DELIVERY_RATE_APP_LMT,
+ TCP_NLA_SNDQ_SIZE,
+ TCP_NLA_CA_STATE,
+ TCP_NLA_SND_SSTHRESH,
+ TCP_NLA_DELIVERED,
+ TCP_NLA_DELIVERED_CE,
+ TCP_NLA_BYTES_SENT,
+ TCP_NLA_BYTES_RETRANS,
+ TCP_NLA_DSACK_DUPS,
+ TCP_NLA_REORD_SEEN,
+ TCP_NLA_SRTT,
+ TCP_NLA_TIMEOUT_REHASH,
+ TCP_NLA_BYTES_NOTSENT,
+ TCP_NLA_EDT,
+ TCP_NLA_TTL,
+};
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define TCPOPT_EOL 0
+#define TCPOPT_NOP 1
+#define TCPOPT_MAXSEG 2
+#define TCPOPT_WINDOW 3
+#define TCPOPT_SACK_PERMITTED 4
+#define TCPOPT_SACK 5
+#define TCPOPT_TIMESTAMP 8
+#define TCPOLEN_SACK_PERMITTED 2
+#define TCPOLEN_WINDOW 3
+#define TCPOLEN_MAXSEG 4
+#define TCPOLEN_TIMESTAMP 10
+
+#define SOL_TCP 6
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdint.h>
+
+typedef uint32_t tcp_seq;
+
+#define TH_FIN 0x01
+#define TH_SYN 0x02
+#define TH_RST 0x04
+#define TH_PUSH 0x08
+#define TH_ACK 0x10
+#define TH_URG 0x20
+
+struct tcphdr {
+#ifdef _GNU_SOURCE
+#ifdef __GNUC__
+ __extension__
+#endif
+ union { struct {
+
+ uint16_t source;
+ uint16_t dest;
+ uint32_t seq;
+ uint32_t ack_seq;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ uint16_t res1:4;
+ uint16_t doff:4;
+ uint16_t fin:1;
+ uint16_t syn:1;
+ uint16_t rst:1;
+ uint16_t psh:1;
+ uint16_t ack:1;
+ uint16_t urg:1;
+ uint16_t res2:2;
+#else
+ uint16_t doff:4;
+ uint16_t res1:4;
+ uint16_t res2:2;
+ uint16_t urg:1;
+ uint16_t ack:1;
+ uint16_t psh:1;
+ uint16_t rst:1;
+ uint16_t syn:1;
+ uint16_t fin:1;
+#endif
+ uint16_t window;
+ uint16_t check;
+ uint16_t urg_ptr;
+
+ }; struct {
+#endif
+
+ uint16_t th_sport;
+ uint16_t th_dport;
+ uint32_t th_seq;
+ uint32_t th_ack;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ uint8_t th_x2:4;
+ uint8_t th_off:4;
+#else
+ uint8_t th_off:4;
+ uint8_t th_x2:4;
+#endif
+ uint8_t th_flags;
+ uint16_t th_win;
+ uint16_t th_sum;
+ uint16_t th_urp;
+
+#ifdef _GNU_SOURCE
+ }; };
+#endif
+};
+#endif
+
+#ifdef _GNU_SOURCE
+#define TCPI_OPT_TIMESTAMPS 1
+#define TCPI_OPT_SACK 2
+#define TCPI_OPT_WSCALE 4
+#define TCPI_OPT_ECN 8
+
+#define TCP_CA_Open 0
+#define TCP_CA_Disorder 1
+#define TCP_CA_CWR 2
+#define TCP_CA_Recovery 3
+#define TCP_CA_Loss 4
+
+enum tcp_fastopen_client_fail {
+ TFO_STATUS_UNSPEC,
+ TFO_COOKIE_UNAVAILABLE,
+ TFO_DATA_NOT_ACKED,
+ TFO_SYN_RETRANSMITTED,
+};
+
+struct tcp_info {
+ uint8_t tcpi_state;
+ uint8_t tcpi_ca_state;
+ uint8_t tcpi_retransmits;
+ uint8_t tcpi_probes;
+ uint8_t tcpi_backoff;
+ uint8_t tcpi_options;
+ uint8_t tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
+ uint8_t tcpi_delivery_rate_app_limited : 1, tcpi_fastopen_client_fail : 2;
+ uint32_t tcpi_rto;
+ uint32_t tcpi_ato;
+ uint32_t tcpi_snd_mss;
+ uint32_t tcpi_rcv_mss;
+ uint32_t tcpi_unacked;
+ uint32_t tcpi_sacked;
+ uint32_t tcpi_lost;
+ uint32_t tcpi_retrans;
+ uint32_t tcpi_fackets;
+ uint32_t tcpi_last_data_sent;
+ uint32_t tcpi_last_ack_sent;
+ uint32_t tcpi_last_data_recv;
+ uint32_t tcpi_last_ack_recv;
+ uint32_t tcpi_pmtu;
+ uint32_t tcpi_rcv_ssthresh;
+ uint32_t tcpi_rtt;
+ uint32_t tcpi_rttvar;
+ uint32_t tcpi_snd_ssthresh;
+ uint32_t tcpi_snd_cwnd;
+ uint32_t tcpi_advmss;
+ uint32_t tcpi_reordering;
+ uint32_t tcpi_rcv_rtt;
+ uint32_t tcpi_rcv_space;
+ uint32_t tcpi_total_retrans;
+ uint64_t tcpi_pacing_rate;
+ uint64_t tcpi_max_pacing_rate;
+ uint64_t tcpi_bytes_acked;
+ uint64_t tcpi_bytes_received;
+ uint32_t tcpi_segs_out;
+ uint32_t tcpi_segs_in;
+ uint32_t tcpi_notsent_bytes;
+ uint32_t tcpi_min_rtt;
+ uint32_t tcpi_data_segs_in;
+ uint32_t tcpi_data_segs_out;
+ uint64_t tcpi_delivery_rate;
+ uint64_t tcpi_busy_time;
+ uint64_t tcpi_rwnd_limited;
+ uint64_t tcpi_sndbuf_limited;
+ uint32_t tcpi_delivered;
+ uint32_t tcpi_delivered_ce;
+ uint64_t tcpi_bytes_sent;
+ uint64_t tcpi_bytes_retrans;
+ uint32_t tcpi_dsack_dups;
+ uint32_t tcpi_reord_seen;
+ uint32_t tcpi_rcv_ooopack;
+ uint32_t tcpi_snd_wnd;
+};
+
+#define TCP_MD5SIG_MAXKEYLEN 80
+
+#define TCP_MD5SIG_FLAG_PREFIX 0x1
+#define TCP_MD5SIG_FLAG_IFINDEX 0x2
+
+struct tcp_md5sig {
+ struct sockaddr_storage tcpm_addr;
+ uint8_t tcpm_flags;
+ uint8_t tcpm_prefixlen;
+ uint16_t tcpm_keylen;
+ int tcpm_ifindex;
+ uint8_t tcpm_key[TCP_MD5SIG_MAXKEYLEN];
+};
+
+struct tcp_diag_md5sig {
+ uint8_t tcpm_family;
+ uint8_t tcpm_prefixlen;
+ uint16_t tcpm_keylen;
+ uint32_t tcpm_addr[4];
+ uint8_t tcpm_key[TCP_MD5SIG_MAXKEYLEN];
+};
+
+#define TCP_REPAIR_ON 1
+#define TCP_REPAIR_OFF 0
+#define TCP_REPAIR_OFF_NO_WP -1
+
+struct tcp_repair_window {
+ uint32_t snd_wl1;
+ uint32_t snd_wnd;
+ uint32_t max_window;
+ uint32_t rcv_wnd;
+ uint32_t rcv_wup;
+};
+
+#define TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT 0x1
+
+struct tcp_zerocopy_receive {
+ uint64_t address;
+ uint32_t length;
+ uint32_t recv_skip_hint;
+ uint32_t inq;
+ int32_t err;
+ uint64_t copybuf_address;
+ int32_t copybuf_len;
+ uint32_t flags;
+ uint64_t msg_control;
+ uint64_t msg_controllen;
+ uint32_t msg_flags;
+ uint32_t reserved;
+};
+
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/netinet/udp.h b/libc-top-half/musl/include/netinet/udp.h
new file mode 100644
index 0000000..40c3f20
--- /dev/null
+++ b/libc-top-half/musl/include/netinet/udp.h
@@ -0,0 +1,46 @@
+#ifndef _NETINET_UDP_H
+#define _NETINET_UDP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+#include <stdint.h>
+
+#ifdef _GNU_SOURCE
+#define uh_sport source
+#define uh_dport dest
+#define uh_ulen len
+#define uh_sum check
+#endif
+
+struct udphdr {
+ uint16_t uh_sport;
+ uint16_t uh_dport;
+ uint16_t uh_ulen;
+ uint16_t uh_sum;
+};
+
+#define UDP_CORK 1
+#define UDP_ENCAP 100
+#define UDP_NO_CHECK6_TX 101
+#define UDP_NO_CHECK6_RX 102
+#define UDP_SEGMENT 103
+#define UDP_GRO 104
+
+#define UDP_ENCAP_ESPINUDP_NON_IKE 1
+#define UDP_ENCAP_ESPINUDP 2
+#define UDP_ENCAP_L2TPINUDP 3
+#define UDP_ENCAP_GTP0 4
+#define UDP_ENCAP_GTP1U 5
+#define UDP_ENCAP_RXRPC 6
+#define TCP_ENCAP_ESPINTCP 7
+
+#define SOL_UDP 17
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/netpacket/packet.h b/libc-top-half/musl/include/netpacket/packet.h
new file mode 100644
index 0000000..b36e092
--- /dev/null
+++ b/libc-top-half/musl/include/netpacket/packet.h
@@ -0,0 +1,62 @@
+#ifndef _NETPACKET_PACKET_H
+#define _NETPACKET_PACKET_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct sockaddr_ll {
+ unsigned short sll_family, sll_protocol;
+ int sll_ifindex;
+ unsigned short sll_hatype;
+ unsigned char sll_pkttype, sll_halen;
+ unsigned char sll_addr[8];
+};
+
+struct packet_mreq {
+ int mr_ifindex;
+ unsigned short int mr_type, mr_alen;
+ unsigned char mr_address[8];
+};
+
+#define PACKET_HOST 0
+#define PACKET_BROADCAST 1
+#define PACKET_MULTICAST 2
+#define PACKET_OTHERHOST 3
+#define PACKET_OUTGOING 4
+#define PACKET_LOOPBACK 5
+#define PACKET_FASTROUTE 6
+
+#define PACKET_ADD_MEMBERSHIP 1
+#define PACKET_DROP_MEMBERSHIP 2
+#define PACKET_RECV_OUTPUT 3
+#define PACKET_RX_RING 5
+#define PACKET_STATISTICS 6
+#define PACKET_COPY_THRESH 7
+#define PACKET_AUXDATA 8
+#define PACKET_ORIGDEV 9
+#define PACKET_VERSION 10
+#define PACKET_HDRLEN 11
+#define PACKET_RESERVE 12
+#define PACKET_TX_RING 13
+#define PACKET_LOSS 14
+#define PACKET_VNET_HDR 15
+#define PACKET_TX_TIMESTAMP 16
+#define PACKET_TIMESTAMP 17
+#define PACKET_FANOUT 18
+#define PACKET_TX_HAS_OFF 19
+#define PACKET_QDISC_BYPASS 20
+#define PACKET_ROLLOVER_STATS 21
+#define PACKET_FANOUT_DATA 22
+#define PACKET_IGNORE_OUTGOING 23
+
+#define PACKET_MR_MULTICAST 0
+#define PACKET_MR_PROMISC 1
+#define PACKET_MR_ALLMULTI 2
+#define PACKET_MR_UNICAST 3
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/nl_types.h b/libc-top-half/musl/include/nl_types.h
new file mode 100644
index 0000000..7c2d48e
--- /dev/null
+++ b/libc-top-half/musl/include/nl_types.h
@@ -0,0 +1,22 @@
+#ifndef _NL_TYPES_H
+#define _NL_TYPES_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define NL_SETD 1
+#define NL_CAT_LOCALE 1
+
+typedef int nl_item;
+typedef void *nl_catd;
+
+nl_catd catopen (const char *, int);
+char *catgets (nl_catd, int, int, const char *);
+int catclose (nl_catd);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/paths.h b/libc-top-half/musl/include/paths.h
new file mode 100644
index 0000000..67de6b3
--- /dev/null
+++ b/libc-top-half/musl/include/paths.h
@@ -0,0 +1,31 @@
+#ifndef _PATHS_H
+#define _PATHS_H
+
+#define _PATH_DEFPATH "/usr/local/bin:/bin:/usr/bin"
+#define _PATH_STDPATH "/bin:/usr/bin:/sbin:/usr/sbin"
+
+#define _PATH_BSHELL "/bin/sh"
+#define _PATH_CONSOLE "/dev/console"
+#define _PATH_DEVNULL "/dev/null"
+#define _PATH_KLOG "/proc/kmsg"
+#define _PATH_LASTLOG "/var/log/lastlog"
+#define _PATH_MAILDIR "/var/mail"
+#define _PATH_MAN "/usr/share/man"
+#define _PATH_MNTTAB "/etc/fstab"
+#define _PATH_MOUNTED "/etc/mtab"
+#define _PATH_NOLOGIN "/etc/nologin"
+#define _PATH_SENDMAIL "/usr/sbin/sendmail"
+#define _PATH_SHADOW "/etc/shadow"
+#define _PATH_SHELLS "/etc/shells"
+#define _PATH_TTY "/dev/tty"
+#define _PATH_UTMP "/dev/null/utmp"
+#define _PATH_VI "/usr/bin/vi"
+#define _PATH_WTMP "/dev/null/wtmp"
+
+#define _PATH_DEV "/dev/"
+#define _PATH_TMP "/tmp/"
+#define _PATH_VARDB "/var/lib/misc/"
+#define _PATH_VARRUN "/var/run/"
+#define _PATH_VARTMP "/var/tmp/"
+
+#endif
diff --git a/libc-top-half/musl/include/poll.h b/libc-top-half/musl/include/poll.h
new file mode 100644
index 0000000..cdbd29a
--- /dev/null
+++ b/libc-top-half/musl/include/poll.h
@@ -0,0 +1,69 @@
+#ifndef _POLL_H
+#define _POLL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#include <bits/poll.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#define POLLIN 0x001
+#define POLLPRI 0x002
+#define POLLOUT 0x004
+#define POLLERR 0x008
+#define POLLHUP 0x010
+#define POLLNVAL 0x020
+#define POLLRDNORM 0x040
+#define POLLRDBAND 0x080
+#ifndef POLLWRNORM
+#define POLLWRNORM 0x100
+#define POLLWRBAND 0x200
+#endif
+#ifndef POLLMSG
+#define POLLMSG 0x400
+#define POLLRDHUP 0x2000
+#endif
+#else
+#include <__header_poll.h>
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+typedef unsigned long nfds_t;
+#else
+#include <__typedef_nfds_t.h>
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+struct pollfd {
+ int fd;
+ short events;
+ short revents;
+};
+#else
+#include <__struct_pollfd.h>
+#endif
+
+int poll (struct pollfd *, nfds_t, int);
+
+#ifdef _GNU_SOURCE
+#define __NEED_time_t
+#define __NEED_struct_timespec
+#define __NEED_sigset_t
+#include <bits/alltypes.h>
+int ppoll(struct pollfd *, nfds_t, const struct timespec *, const sigset_t *);
+#endif
+
+#if _REDIR_TIME64
+#ifdef _GNU_SOURCE
+__REDIR(ppoll, __ppoll_time64);
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/pthread.h b/libc-top-half/musl/include/pthread.h
new file mode 100644
index 0000000..01fe5f2
--- /dev/null
+++ b/libc-top-half/musl/include/pthread.h
@@ -0,0 +1,254 @@
+#ifndef _PTHREAD_H
+#define _PTHREAD_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_time_t
+#define __NEED_clockid_t
+#define __NEED_struct_timespec
+#define __NEED_sigset_t
+#define __NEED_pthread_t
+#define __NEED_pthread_attr_t
+#define __NEED_pthread_mutexattr_t
+#define __NEED_pthread_condattr_t
+#define __NEED_pthread_rwlockattr_t
+#define __NEED_pthread_barrierattr_t
+#define __NEED_pthread_mutex_t
+#define __NEED_pthread_cond_t
+#define __NEED_pthread_rwlock_t
+#define __NEED_pthread_barrier_t
+#define __NEED_pthread_spinlock_t
+#define __NEED_pthread_key_t
+#define __NEED_pthread_once_t
+#define __NEED_size_t
+
+#include <bits/alltypes.h>
+
+#include <sched.h>
+#include <time.h>
+
+#define PTHREAD_CREATE_JOINABLE 0
+#define PTHREAD_CREATE_DETACHED 1
+
+#define PTHREAD_MUTEX_NORMAL 0
+#define PTHREAD_MUTEX_DEFAULT 0
+#define PTHREAD_MUTEX_RECURSIVE 1
+#define PTHREAD_MUTEX_ERRORCHECK 2
+
+#define PTHREAD_MUTEX_STALLED 0
+#define PTHREAD_MUTEX_ROBUST 1
+
+#define PTHREAD_PRIO_NONE 0
+#define PTHREAD_PRIO_INHERIT 1
+#define PTHREAD_PRIO_PROTECT 2
+
+#define PTHREAD_INHERIT_SCHED 0
+#define PTHREAD_EXPLICIT_SCHED 1
+
+#define PTHREAD_SCOPE_SYSTEM 0
+#define PTHREAD_SCOPE_PROCESS 1
+
+#define PTHREAD_PROCESS_PRIVATE 0
+#define PTHREAD_PROCESS_SHARED 1
+
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#define PTHREAD_MUTEX_INITIALIZER {{{0}}}
+#define PTHREAD_RWLOCK_INITIALIZER {{{0}}}
+#define PTHREAD_COND_INITIALIZER {{{0}}}
+#else
+#define PTHREAD_MUTEX_INITIALIZER 0
+#define PTHREAD_RWLOCK_INITIALIZER 0
+#define PTHREAD_COND_INITIALIZER 0
+#endif
+#define PTHREAD_ONCE_INIT 0
+
+
+#define PTHREAD_CANCEL_ENABLE 0
+#define PTHREAD_CANCEL_DISABLE 1
+#define PTHREAD_CANCEL_MASKED 2
+
+#define PTHREAD_CANCEL_DEFERRED 0
+#define PTHREAD_CANCEL_ASYNCHRONOUS 1
+
+#define PTHREAD_CANCELED ((void *)-1)
+
+
+#define PTHREAD_BARRIER_SERIAL_THREAD (-1)
+
+
+#define PTHREAD_NULL ((pthread_t)0)
+
+
+int pthread_create(pthread_t *__restrict, const pthread_attr_t *__restrict, void *(*)(void *), void *__restrict);
+int pthread_detach(pthread_t);
+_Noreturn void pthread_exit(void *);
+int pthread_join(pthread_t, void **);
+
+#ifdef __GNUC__
+__attribute__((const))
+#endif
+pthread_t pthread_self(void);
+
+int pthread_equal(pthread_t, pthread_t);
+#ifndef __cplusplus
+#define pthread_equal(x,y) ((x)==(y))
+#endif
+
+int pthread_setcancelstate(int, int *);
+int pthread_setcanceltype(int, int *);
+void pthread_testcancel(void);
+int pthread_cancel(pthread_t);
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no CPU scheduling support. */
+int pthread_getschedparam(pthread_t, int *__restrict, struct sched_param *__restrict);
+int pthread_setschedparam(pthread_t, int, const struct sched_param *);
+#endif
+int pthread_setschedprio(pthread_t, int);
+
+int pthread_once(pthread_once_t *, void (*)(void));
+
+int pthread_mutex_init(pthread_mutex_t *__restrict, const pthread_mutexattr_t *__restrict);
+int pthread_mutex_lock(pthread_mutex_t *);
+int pthread_mutex_unlock(pthread_mutex_t *);
+int pthread_mutex_trylock(pthread_mutex_t *);
+int pthread_mutex_timedlock(pthread_mutex_t *__restrict, const struct timespec *__restrict);
+int pthread_mutex_destroy(pthread_mutex_t *);
+int pthread_mutex_consistent(pthread_mutex_t *);
+
+int pthread_mutex_getprioceiling(const pthread_mutex_t *__restrict, int *__restrict);
+int pthread_mutex_setprioceiling(pthread_mutex_t *__restrict, int, int *__restrict);
+
+int pthread_cond_init(pthread_cond_t *__restrict, const pthread_condattr_t *__restrict);
+int pthread_cond_destroy(pthread_cond_t *);
+int pthread_cond_wait(pthread_cond_t *__restrict, pthread_mutex_t *__restrict);
+int pthread_cond_timedwait(pthread_cond_t *__restrict, pthread_mutex_t *__restrict, const struct timespec *__restrict);
+int pthread_cond_broadcast(pthread_cond_t *);
+int pthread_cond_signal(pthread_cond_t *);
+
+int pthread_rwlock_init(pthread_rwlock_t *__restrict, const pthread_rwlockattr_t *__restrict);
+int pthread_rwlock_destroy(pthread_rwlock_t *);
+int pthread_rwlock_rdlock(pthread_rwlock_t *);
+int pthread_rwlock_tryrdlock(pthread_rwlock_t *);
+int pthread_rwlock_timedrdlock(pthread_rwlock_t *__restrict, const struct timespec *__restrict);
+int pthread_rwlock_wrlock(pthread_rwlock_t *);
+int pthread_rwlock_trywrlock(pthread_rwlock_t *);
+int pthread_rwlock_timedwrlock(pthread_rwlock_t *__restrict, const struct timespec *__restrict);
+int pthread_rwlock_unlock(pthread_rwlock_t *);
+
+int pthread_spin_init(pthread_spinlock_t *, int);
+int pthread_spin_destroy(pthread_spinlock_t *);
+int pthread_spin_lock(pthread_spinlock_t *);
+int pthread_spin_trylock(pthread_spinlock_t *);
+int pthread_spin_unlock(pthread_spinlock_t *);
+
+int pthread_barrier_init(pthread_barrier_t *__restrict, const pthread_barrierattr_t *__restrict, unsigned);
+int pthread_barrier_destroy(pthread_barrier_t *);
+int pthread_barrier_wait(pthread_barrier_t *);
+
+int pthread_key_create(pthread_key_t *, void (*)(void *));
+int pthread_key_delete(pthread_key_t);
+void *pthread_getspecific(pthread_key_t);
+int pthread_setspecific(pthread_key_t, const void *);
+
+int pthread_attr_init(pthread_attr_t *);
+int pthread_attr_destroy(pthread_attr_t *);
+
+int pthread_attr_getguardsize(const pthread_attr_t *__restrict, size_t *__restrict);
+int pthread_attr_setguardsize(pthread_attr_t *, size_t);
+int pthread_attr_getstacksize(const pthread_attr_t *__restrict, size_t *__restrict);
+int pthread_attr_setstacksize(pthread_attr_t *, size_t);
+int pthread_attr_getdetachstate(const pthread_attr_t *, int *);
+int pthread_attr_setdetachstate(pthread_attr_t *, int);
+int pthread_attr_getstack(const pthread_attr_t *__restrict, void **__restrict, size_t *__restrict);
+int pthread_attr_setstack(pthread_attr_t *, void *, size_t);
+int pthread_attr_getscope(const pthread_attr_t *__restrict, int *__restrict);
+int pthread_attr_setscope(pthread_attr_t *, int);
+int pthread_attr_getschedpolicy(const pthread_attr_t *__restrict, int *__restrict);
+int pthread_attr_setschedpolicy(pthread_attr_t *, int);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no CPU scheduling support. */
+int pthread_attr_getschedparam(const pthread_attr_t *__restrict, struct sched_param *__restrict);
+int pthread_attr_setschedparam(pthread_attr_t *__restrict, const struct sched_param *__restrict);
+#endif
+int pthread_attr_getinheritsched(const pthread_attr_t *__restrict, int *__restrict);
+int pthread_attr_setinheritsched(pthread_attr_t *, int);
+
+int pthread_mutexattr_destroy(pthread_mutexattr_t *);
+int pthread_mutexattr_getprioceiling(const pthread_mutexattr_t *__restrict, int *__restrict);
+int pthread_mutexattr_getprotocol(const pthread_mutexattr_t *__restrict, int *__restrict);
+int pthread_mutexattr_getpshared(const pthread_mutexattr_t *__restrict, int *__restrict);
+int pthread_mutexattr_getrobust(const pthread_mutexattr_t *__restrict, int *__restrict);
+int pthread_mutexattr_gettype(const pthread_mutexattr_t *__restrict, int *__restrict);
+int pthread_mutexattr_init(pthread_mutexattr_t *);
+int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *, int);
+int pthread_mutexattr_setprotocol(pthread_mutexattr_t *, int);
+int pthread_mutexattr_setpshared(pthread_mutexattr_t *, int);
+int pthread_mutexattr_setrobust(pthread_mutexattr_t *, int);
+int pthread_mutexattr_settype(pthread_mutexattr_t *, int);
+
+int pthread_condattr_init(pthread_condattr_t *);
+int pthread_condattr_destroy(pthread_condattr_t *);
+int pthread_condattr_setclock(pthread_condattr_t *, clockid_t);
+int pthread_condattr_setpshared(pthread_condattr_t *, int);
+int pthread_condattr_getclock(const pthread_condattr_t *__restrict, clockid_t *__restrict);
+int pthread_condattr_getpshared(const pthread_condattr_t *__restrict, int *__restrict);
+
+int pthread_rwlockattr_init(pthread_rwlockattr_t *);
+int pthread_rwlockattr_destroy(pthread_rwlockattr_t *);
+int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *, int);
+int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *__restrict, int *__restrict);
+
+int pthread_barrierattr_destroy(pthread_barrierattr_t *);
+int pthread_barrierattr_getpshared(const pthread_barrierattr_t *__restrict, int *__restrict);
+int pthread_barrierattr_init(pthread_barrierattr_t *);
+int pthread_barrierattr_setpshared(pthread_barrierattr_t *, int);
+
+int pthread_atfork(void (*)(void), void (*)(void), void (*)(void));
+
+int pthread_getconcurrency(void);
+int pthread_setconcurrency(int);
+
+int pthread_getcpuclockid(pthread_t, clockid_t *);
+
+struct __ptcb {
+ void (*__f)(void *);
+ void *__x;
+ struct __ptcb *__next;
+};
+
+void _pthread_cleanup_push(struct __ptcb *, void (*)(void *), void *);
+void _pthread_cleanup_pop(struct __ptcb *, int);
+
+#define pthread_cleanup_push(f, x) do { struct __ptcb __cb; _pthread_cleanup_push(&__cb, f, x);
+#define pthread_cleanup_pop(r) _pthread_cleanup_pop(&__cb, (r)); } while(0)
+
+#ifdef _GNU_SOURCE
+struct cpu_set_t;
+int pthread_getaffinity_np(pthread_t, size_t, struct cpu_set_t *);
+int pthread_setaffinity_np(pthread_t, size_t, const struct cpu_set_t *);
+int pthread_getattr_np(pthread_t, pthread_attr_t *);
+int pthread_setname_np(pthread_t, const char *);
+int pthread_getname_np(pthread_t, char *, size_t);
+int pthread_getattr_default_np(pthread_attr_t *);
+int pthread_setattr_default_np(const pthread_attr_t *);
+int pthread_tryjoin_np(pthread_t, void **);
+int pthread_timedjoin_np(pthread_t, void **, const struct timespec *);
+#endif
+
+#if _REDIR_TIME64
+__REDIR(pthread_mutex_timedlock, __pthread_mutex_timedlock_time64);
+__REDIR(pthread_cond_timedwait, __pthread_cond_timedwait_time64);
+__REDIR(pthread_rwlock_timedrdlock, __pthread_rwlock_timedrdlock_time64);
+__REDIR(pthread_rwlock_timedwrlock, __pthread_rwlock_timedwrlock_time64);
+#ifdef _GNU_SOURCE
+__REDIR(pthread_timedjoin_np, __pthread_timedjoin_np_time64);
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/pty.h b/libc-top-half/musl/include/pty.h
new file mode 100644
index 0000000..db63853
--- /dev/null
+++ b/libc-top-half/musl/include/pty.h
@@ -0,0 +1,18 @@
+#ifndef _PTY_H
+#define _PTY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <termios.h>
+#include <sys/ioctl.h>
+
+int openpty(int *, int *, char *, const struct termios *, const struct winsize *);
+int forkpty(int *, char *, const struct termios *, const struct winsize *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/pwd.h b/libc-top-half/musl/include/pwd.h
new file mode 100644
index 0000000..4f470b5
--- /dev/null
+++ b/libc-top-half/musl/include/pwd.h
@@ -0,0 +1,50 @@
+#ifndef _PWD_H
+#define _PWD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_size_t
+#define __NEED_uid_t
+#define __NEED_gid_t
+
+#ifdef _GNU_SOURCE
+#define __NEED_FILE
+#endif
+
+#include <bits/alltypes.h>
+
+struct passwd {
+ char *pw_name;
+ char *pw_passwd;
+ uid_t pw_uid;
+ gid_t pw_gid;
+ char *pw_gecos;
+ char *pw_dir;
+ char *pw_shell;
+};
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+void setpwent (void);
+void endpwent (void);
+struct passwd *getpwent (void);
+#endif
+
+struct passwd *getpwuid (uid_t);
+struct passwd *getpwnam (const char *);
+int getpwuid_r (uid_t, struct passwd *, char *, size_t, struct passwd **);
+int getpwnam_r (const char *, struct passwd *, char *, size_t, struct passwd **);
+
+#ifdef _GNU_SOURCE
+struct passwd *fgetpwent(FILE *);
+int putpwent(const struct passwd *, FILE *);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/regex.h b/libc-top-half/musl/include/regex.h
new file mode 100644
index 0000000..dce2177
--- /dev/null
+++ b/libc-top-half/musl/include/regex.h
@@ -0,0 +1,62 @@
+#ifndef _REGEX_H
+#define _REGEX_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_regoff_t
+#define __NEED_size_t
+
+#include <bits/alltypes.h>
+
+typedef struct re_pattern_buffer {
+ size_t re_nsub;
+ void *__opaque, *__padding[4];
+ size_t __nsub2;
+ char __padding2;
+} regex_t;
+
+typedef struct {
+ regoff_t rm_so;
+ regoff_t rm_eo;
+} regmatch_t;
+
+#define REG_EXTENDED 1
+#define REG_ICASE 2
+#define REG_NEWLINE 4
+#define REG_NOSUB 8
+
+#define REG_NOTBOL 1
+#define REG_NOTEOL 2
+
+#define REG_OK 0
+#define REG_NOMATCH 1
+#define REG_BADPAT 2
+#define REG_ECOLLATE 3
+#define REG_ECTYPE 4
+#define REG_EESCAPE 5
+#define REG_ESUBREG 6
+#define REG_EBRACK 7
+#define REG_EPAREN 8
+#define REG_EBRACE 9
+#define REG_BADBR 10
+#define REG_ERANGE 11
+#define REG_ESPACE 12
+#define REG_BADRPT 13
+
+#define REG_ENOSYS -1
+
+int regcomp(regex_t *__restrict, const char *__restrict, int);
+int regexec(const regex_t *__restrict, const char *__restrict, size_t, regmatch_t *__restrict, int);
+void regfree(regex_t *);
+
+size_t regerror(int, const regex_t *__restrict, char *__restrict, size_t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/resolv.h b/libc-top-half/musl/include/resolv.h
new file mode 100644
index 0000000..8b23ad6
--- /dev/null
+++ b/libc-top-half/musl/include/resolv.h
@@ -0,0 +1,142 @@
+#ifndef _RESOLV_H
+#define _RESOLV_H
+
+#include <stdint.h>
+#include <arpa/nameser.h>
+#include <netinet/in.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAXNS 3
+#define MAXDFLSRCH 3
+#define MAXDNSRCH 6
+#define LOCALDOMAINPARTS 2
+
+#define RES_TIMEOUT 5
+#define MAXRESOLVSORT 10
+#define RES_MAXNDOTS 15
+#define RES_MAXRETRANS 30
+#define RES_MAXRETRY 5
+#define RES_DFLRETRY 2
+#define RES_MAXTIME 65535
+
+/* unused; purely for broken apps */
+typedef struct __res_state {
+ int retrans;
+ int retry;
+ unsigned long options;
+ int nscount;
+ struct sockaddr_in nsaddr_list[MAXNS];
+# define nsaddr nsaddr_list[0]
+ unsigned short id;
+ char *dnsrch[MAXDNSRCH+1];
+ char defdname[256];
+ unsigned long pfcode;
+ unsigned ndots:4;
+ unsigned nsort:4;
+ unsigned ipv6_unavail:1;
+ unsigned unused:23;
+ struct {
+ struct in_addr addr;
+ uint32_t mask;
+ } sort_list[MAXRESOLVSORT];
+ void *qhook;
+ void *rhook;
+ int res_h_errno;
+ int _vcsock;
+ unsigned _flags;
+ union {
+ char pad[52];
+ struct {
+ uint16_t nscount;
+ uint16_t nsmap[MAXNS];
+ int nssocks[MAXNS];
+ uint16_t nscount6;
+ uint16_t nsinit;
+ struct sockaddr_in6 *nsaddrs[MAXNS];
+ unsigned int _initstamp[2];
+ } _ext;
+ } _u;
+} *res_state;
+
+#define __RES 19960801
+
+#ifndef _PATH_RESCONF
+#define _PATH_RESCONF "/etc/resolv.conf"
+#endif
+
+struct res_sym {
+ int number;
+ char *name;
+ char *humanname;
+};
+
+#define RES_F_VC 0x00000001
+#define RES_F_CONN 0x00000002
+#define RES_F_EDNS0ERR 0x00000004
+
+#define RES_EXHAUSTIVE 0x00000001
+
+#define RES_INIT 0x00000001
+#define RES_DEBUG 0x00000002
+#define RES_AAONLY 0x00000004
+#define RES_USEVC 0x00000008
+#define RES_PRIMARY 0x00000010
+#define RES_IGNTC 0x00000020
+#define RES_RECURSE 0x00000040
+#define RES_DEFNAMES 0x00000080
+#define RES_STAYOPEN 0x00000100
+#define RES_DNSRCH 0x00000200
+#define RES_INSECURE1 0x00000400
+#define RES_INSECURE2 0x00000800
+#define RES_NOALIASES 0x00001000
+#define RES_USE_INET6 0x00002000
+#define RES_ROTATE 0x00004000
+#define RES_NOCHECKNAME 0x00008000
+#define RES_KEEPTSIG 0x00010000
+#define RES_BLAST 0x00020000
+#define RES_USEBSTRING 0x00040000
+#define RES_NOIP6DOTINT 0x00080000
+#define RES_USE_EDNS0 0x00100000
+#define RES_SNGLKUP 0x00200000
+#define RES_SNGLKUPREOP 0x00400000
+#define RES_USE_DNSSEC 0x00800000
+
+#define RES_DEFAULT (RES_RECURSE|RES_DEFNAMES|RES_DNSRCH|RES_NOIP6DOTINT)
+
+#define RES_PRF_STATS 0x00000001
+#define RES_PRF_UPDATE 0x00000002
+#define RES_PRF_CLASS 0x00000004
+#define RES_PRF_CMD 0x00000008
+#define RES_PRF_QUES 0x00000010
+#define RES_PRF_ANS 0x00000020
+#define RES_PRF_AUTH 0x00000040
+#define RES_PRF_ADD 0x00000080
+#define RES_PRF_HEAD1 0x00000100
+#define RES_PRF_HEAD2 0x00000200
+#define RES_PRF_TTLID 0x00000400
+#define RES_PRF_HEADX 0x00000800
+#define RES_PRF_QUERY 0x00001000
+#define RES_PRF_REPLY 0x00002000
+#define RES_PRF_INIT 0x00004000
+
+struct __res_state *__res_state(void);
+#define _res (*__res_state())
+
+int res_init(void);
+int res_query(const char *, int, int, unsigned char *, int);
+int res_querydomain(const char *, const char *, int, int, unsigned char *, int);
+int res_search(const char *, int, int, unsigned char *, int);
+int res_mkquery(int, const char *, int, int, const unsigned char *, int, const unsigned char*, unsigned char *, int);
+int res_send(const unsigned char *, int, unsigned char *, int);
+int dn_comp(const char *, unsigned char *, int, unsigned char **, unsigned char **);
+int dn_expand(const unsigned char *, const unsigned char *, const unsigned char *, char *, int);
+int dn_skipname(const unsigned char *, const unsigned char *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sched.h b/libc-top-half/musl/include/sched.h
new file mode 100644
index 0000000..a3a7f56
--- /dev/null
+++ b/libc-top-half/musl/include/sched.h
@@ -0,0 +1,152 @@
+#ifndef _SCHED_H
+#define _SCHED_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_struct_timespec
+#define __NEED_pid_t
+#define __NEED_time_t
+
+#ifdef _GNU_SOURCE
+#define __NEED_size_t
+#endif
+
+#include <bits/alltypes.h>
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no CPU scheduling support. */
+struct sched_param {
+ int sched_priority;
+ int __reserved1;
+#if _REDIR_TIME64
+ long __reserved2[4];
+#else
+ struct {
+ time_t __reserved1;
+ long __reserved2;
+ } __reserved2[2];
+#endif
+ int __reserved3;
+};
+
+int sched_get_priority_max(int);
+int sched_get_priority_min(int);
+int sched_getparam(pid_t, struct sched_param *);
+int sched_getscheduler(pid_t);
+int sched_rr_get_interval(pid_t, struct timespec *);
+int sched_setparam(pid_t, const struct sched_param *);
+int sched_setscheduler(pid_t, int, const struct sched_param *);
+#endif
+int sched_yield(void);
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no CPU scheduling support. */
+#define SCHED_OTHER 0
+#define SCHED_FIFO 1
+#define SCHED_RR 2
+#define SCHED_BATCH 3
+#define SCHED_IDLE 5
+#define SCHED_DEADLINE 6
+#define SCHED_RESET_ON_FORK 0x40000000
+
+#ifdef _GNU_SOURCE
+#define CSIGNAL 0x000000ff
+#define CLONE_NEWTIME 0x00000080
+#define CLONE_VM 0x00000100
+#define CLONE_FS 0x00000200
+#define CLONE_FILES 0x00000400
+#define CLONE_SIGHAND 0x00000800
+#define CLONE_PIDFD 0x00001000
+#define CLONE_PTRACE 0x00002000
+#define CLONE_VFORK 0x00004000
+#define CLONE_PARENT 0x00008000
+#define CLONE_THREAD 0x00010000
+#define CLONE_NEWNS 0x00020000
+#define CLONE_SYSVSEM 0x00040000
+#define CLONE_SETTLS 0x00080000
+#define CLONE_PARENT_SETTID 0x00100000
+#define CLONE_CHILD_CLEARTID 0x00200000
+#define CLONE_DETACHED 0x00400000
+#define CLONE_UNTRACED 0x00800000
+#define CLONE_CHILD_SETTID 0x01000000
+#define CLONE_NEWCGROUP 0x02000000
+#define CLONE_NEWUTS 0x04000000
+#define CLONE_NEWIPC 0x08000000
+#define CLONE_NEWUSER 0x10000000
+#define CLONE_NEWPID 0x20000000
+#define CLONE_NEWNET 0x40000000
+#define CLONE_IO 0x80000000
+int clone (int (*)(void *), void *, int, void *, ...);
+int unshare(int);
+int setns(int, int);
+
+void *memcpy(void *__restrict, const void *__restrict, size_t);
+int memcmp(const void *, const void *, size_t);
+void *memset (void *, int, size_t);
+void *calloc(size_t, size_t);
+void free(void *);
+
+typedef struct cpu_set_t { unsigned long __bits[128/sizeof(long)]; } cpu_set_t;
+int __sched_cpucount(size_t, const cpu_set_t *);
+int sched_getcpu(void);
+int sched_getaffinity(pid_t, size_t, cpu_set_t *);
+int sched_setaffinity(pid_t, size_t, const cpu_set_t *);
+
+#define __CPU_op_S(i, size, set, op) ( (i)/8U >= (size) ? 0 : \
+ (((unsigned long *)(set))[(i)/8/sizeof(long)] op (1UL<<((i)%(8*sizeof(long))))) )
+
+#define CPU_SET_S(i, size, set) __CPU_op_S(i, size, set, |=)
+#define CPU_CLR_S(i, size, set) __CPU_op_S(i, size, set, &=~)
+#define CPU_ISSET_S(i, size, set) __CPU_op_S(i, size, set, &)
+
+#define __CPU_op_func_S(func, op) \
+static __inline void __CPU_##func##_S(size_t __size, cpu_set_t *__dest, \
+ const cpu_set_t *__src1, const cpu_set_t *__src2) \
+{ \
+ size_t __i; \
+ for (__i=0; __i<__size/sizeof(long); __i++) \
+ ((unsigned long *)__dest)[__i] = ((unsigned long *)__src1)[__i] \
+ op ((unsigned long *)__src2)[__i] ; \
+}
+
+__CPU_op_func_S(AND, &)
+__CPU_op_func_S(OR, |)
+__CPU_op_func_S(XOR, ^)
+
+#define CPU_AND_S(a,b,c,d) __CPU_AND_S(a,b,c,d)
+#define CPU_OR_S(a,b,c,d) __CPU_OR_S(a,b,c,d)
+#define CPU_XOR_S(a,b,c,d) __CPU_XOR_S(a,b,c,d)
+
+#define CPU_COUNT_S(size,set) __sched_cpucount(size,set)
+#define CPU_ZERO_S(size,set) memset(set,0,size)
+#define CPU_EQUAL_S(size,set1,set2) (!memcmp(set1,set2,size))
+
+#define CPU_ALLOC_SIZE(n) (sizeof(long) * ( (n)/(8*sizeof(long)) \
+ + ((n)%(8*sizeof(long)) + 8*sizeof(long)-1)/(8*sizeof(long)) ) )
+#define CPU_ALLOC(n) ((cpu_set_t *)calloc(1,CPU_ALLOC_SIZE(n)))
+#define CPU_FREE(set) free(set)
+
+#define CPU_SETSIZE 128
+
+#define CPU_SET(i, set) CPU_SET_S(i,sizeof(cpu_set_t),set)
+#define CPU_CLR(i, set) CPU_CLR_S(i,sizeof(cpu_set_t),set)
+#define CPU_ISSET(i, set) CPU_ISSET_S(i,sizeof(cpu_set_t),set)
+#define CPU_AND(d,s1,s2) CPU_AND_S(sizeof(cpu_set_t),d,s1,s2)
+#define CPU_OR(d,s1,s2) CPU_OR_S(sizeof(cpu_set_t),d,s1,s2)
+#define CPU_XOR(d,s1,s2) CPU_XOR_S(sizeof(cpu_set_t),d,s1,s2)
+#define CPU_COUNT(set) CPU_COUNT_S(sizeof(cpu_set_t),set)
+#define CPU_ZERO(set) CPU_ZERO_S(sizeof(cpu_set_t),set)
+#define CPU_EQUAL(s1,s2) CPU_EQUAL_S(sizeof(cpu_set_t),s1,s2)
+
+#endif
+#endif
+
+#if _REDIR_TIME64
+__REDIR(sched_rr_get_interval, __sched_rr_get_interval_time64);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/scsi/scsi.h b/libc-top-half/musl/include/scsi/scsi.h
new file mode 100644
index 0000000..8837f58
--- /dev/null
+++ b/libc-top-half/musl/include/scsi/scsi.h
@@ -0,0 +1,150 @@
+#ifndef _SCSI_SCSI_H
+#define _SCSI_SCSI_H
+
+#define TEST_UNIT_READY 0x00
+#define REZERO_UNIT 0x01
+#define REQUEST_SENSE 0x03
+#define FORMAT_UNIT 0x04
+#define READ_BLOCK_LIMITS 0x05
+#define REASSIGN_BLOCKS 0x07
+#define READ_6 0x08
+#define WRITE_6 0x0a
+#define SEEK_6 0x0b
+#define READ_REVERSE 0x0f
+#define WRITE_FILEMARKS 0x10
+#define SPACE 0x11
+#define INQUIRY 0x12
+#define RECOVER_BUFFERED_DATA 0x14
+#define MODE_SELECT 0x15
+#define RESERVE 0x16
+#define RELEASE 0x17
+#define COPY 0x18
+#define ERASE 0x19
+#define MODE_SENSE 0x1a
+#define START_STOP 0x1b
+#define RECEIVE_DIAGNOSTIC 0x1c
+#define SEND_DIAGNOSTIC 0x1d
+#define ALLOW_MEDIUM_REMOVAL 0x1e
+#define SET_WINDOW 0x24
+#define READ_CAPACITY 0x25
+#define READ_10 0x28
+#define WRITE_10 0x2a
+#define SEEK_10 0x2b
+#define WRITE_VERIFY 0x2e
+#define VERIFY 0x2f
+#define SEARCH_HIGH 0x30
+#define SEARCH_EQUAL 0x31
+#define SEARCH_LOW 0x32
+#define SET_LIMITS 0x33
+#define PRE_FETCH 0x34
+#define READ_POSITION 0x34
+#define SYNCHRONIZE_CACHE 0x35
+#define LOCK_UNLOCK_CACHE 0x36
+#define READ_DEFECT_DATA 0x37
+#define MEDIUM_SCAN 0x38
+#define COMPARE 0x39
+#define COPY_VERIFY 0x3a
+#define WRITE_BUFFER 0x3b
+#define READ_BUFFER 0x3c
+#define UPDATE_BLOCK 0x3d
+#define READ_LONG 0x3e
+#define WRITE_LONG 0x3f
+#define CHANGE_DEFINITION 0x40
+#define WRITE_SAME 0x41
+#define READ_TOC 0x43
+#define LOG_SELECT 0x4c
+#define LOG_SENSE 0x4d
+#define MODE_SELECT_10 0x55
+#define RESERVE_10 0x56
+#define RELEASE_10 0x57
+#define MODE_SENSE_10 0x5a
+#define PERSISTENT_RESERVE_IN 0x5e
+#define PERSISTENT_RESERVE_OUT 0x5f
+#define MOVE_MEDIUM 0xa5
+#define READ_12 0xa8
+#define WRITE_12 0xaa
+#define WRITE_VERIFY_12 0xae
+#define SEARCH_HIGH_12 0xb0
+#define SEARCH_EQUAL_12 0xb1
+#define SEARCH_LOW_12 0xb2
+#define READ_ELEMENT_STATUS 0xb8
+#define SEND_VOLUME_TAG 0xb6
+#define WRITE_LONG_2 0xea
+#define GOOD 0x00
+#define CHECK_CONDITION 0x01
+#define CONDITION_GOOD 0x02
+#define BUSY 0x04
+#define INTERMEDIATE_GOOD 0x08
+#define INTERMEDIATE_C_GOOD 0x0a
+#define RESERVATION_CONFLICT 0x0c
+#define COMMAND_TERMINATED 0x11
+#define QUEUE_FULL 0x14
+#define STATUS_MASK 0x3e
+#define NO_SENSE 0x00
+#define RECOVERED_ERROR 0x01
+#define NOT_READY 0x02
+#define MEDIUM_ERROR 0x03
+#define HARDWARE_ERROR 0x04
+#define ILLEGAL_REQUEST 0x05
+#define UNIT_ATTENTION 0x06
+#define DATA_PROTECT 0x07
+#define BLANK_CHECK 0x08
+#define COPY_ABORTED 0x0a
+#define ABORTED_COMMAND 0x0b
+#define VOLUME_OVERFLOW 0x0d
+#define MISCOMPARE 0x0e
+#define TYPE_DISK 0x00
+#define TYPE_TAPE 0x01
+#define TYPE_PROCESSOR 0x03
+#define TYPE_WORM 0x04
+#define TYPE_ROM 0x05
+#define TYPE_SCANNER 0x06
+#define TYPE_MOD 0x07
+#define TYPE_MEDIUM_CHANGER 0x08
+#define TYPE_ENCLOSURE 0x0d
+#define TYPE_NO_LUN 0x7f
+#define COMMAND_COMPLETE 0x00
+#define EXTENDED_MESSAGE 0x01
+#define EXTENDED_MODIFY_DATA_POINTER 0x00
+#define EXTENDED_SDTR 0x01
+#define EXTENDED_EXTENDED_IDENTIFY 0x02
+#define EXTENDED_WDTR 0x03
+#define SAVE_POINTERS 0x02
+#define RESTORE_POINTERS 0x03
+#define DISCONNECT 0x04
+#define INITIATOR_ERROR 0x05
+#define ABORT 0x06
+#define MESSAGE_REJECT 0x07
+#define NOP 0x08
+#define MSG_PARITY_ERROR 0x09
+#define LINKED_CMD_COMPLETE 0x0a
+#define LINKED_FLG_CMD_COMPLETE 0x0b
+#define BUS_DEVICE_RESET 0x0c
+#define INITIATE_RECOVERY 0x0f
+#define RELEASE_RECOVERY 0x10
+#define SIMPLE_QUEUE_TAG 0x20
+#define HEAD_OF_QUEUE_TAG 0x21
+#define ORDERED_QUEUE_TAG 0x22
+#define SCSI_IOCTL_GET_IDLUN 0x5382
+#define SCSI_IOCTL_TAGGED_ENABLE 0x5383
+#define SCSI_IOCTL_TAGGED_DISABLE 0x5384
+#define SCSI_IOCTL_PROBE_HOST 0x5385
+#define SCSI_IOCTL_GET_BUS_NUMBER 0x5386
+
+struct ccs_modesel_head {
+ unsigned char _r1;
+ unsigned char medium;
+ unsigned char _r2;
+ unsigned char block_desc_length;
+ unsigned char density;
+ unsigned char number_blocks_hi;
+ unsigned char number_blocks_med;
+ unsigned char number_blocks_lo;
+ unsigned char _r3;
+ unsigned char block_length_hi;
+ unsigned char block_length_med;
+ unsigned char block_length_lo;
+};
+
+#endif
+
diff --git a/libc-top-half/musl/include/scsi/scsi_ioctl.h b/libc-top-half/musl/include/scsi/scsi_ioctl.h
new file mode 100644
index 0000000..22df7fe
--- /dev/null
+++ b/libc-top-half/musl/include/scsi/scsi_ioctl.h
@@ -0,0 +1,11 @@
+#ifndef _SCSI_IOCTL_H
+#define _SCSI_IOCTL_H
+#define SCSI_IOCTL_SEND_COMMAND 1
+#define SCSI_IOCTL_TEST_UNIT_READY 2
+#define SCSI_IOCTL_BENCHMARK_COMMAND 3
+#define SCSI_IOCTL_SYNC 4
+#define SCSI_IOCTL_START_UNIT 5
+#define SCSI_IOCTL_STOP_UNIT 6
+#define SCSI_IOCTL_DOORLOCK 0x5380
+#define SCSI_IOCTL_DOORUNLOCK 0x5381
+#endif
diff --git a/libc-top-half/musl/include/scsi/sg.h b/libc-top-half/musl/include/scsi/sg.h
new file mode 100644
index 0000000..a7ac247
--- /dev/null
+++ b/libc-top-half/musl/include/scsi/sg.h
@@ -0,0 +1,129 @@
+#ifndef _SCSI_SG_H
+#define _SCSI_SG_H
+
+#define SG_DXFER_NONE -1
+#define SG_DXFER_TO_DEV -2
+#define SG_DXFER_FROM_DEV -3
+#define SG_DXFER_TO_FROM_DEV -4
+#define SG_FLAG_DIRECT_IO 1
+#define SG_FLAG_LUN_INHIBIT 2
+#define SG_FLAG_NO_DXFER 0x10000
+#define SG_INFO_OK_MASK 0x1
+#define SG_INFO_OK 0x0
+#define SG_INFO_CHECK 0x1
+#define SG_INFO_DIRECT_IO_MASK 0x6
+#define SG_INFO_INDIRECT_IO 0x0
+#define SG_INFO_DIRECT_IO 0x2
+#define SG_INFO_MIXED_IO 0x4
+#define SG_EMULATED_HOST 0x2203
+#define SG_SET_TRANSFORM 0x2204
+#define SG_GET_TRANSFORM 0x2205
+#define SG_SET_RESERVED_SIZE 0x2275
+#define SG_GET_RESERVED_SIZE 0x2272
+#define SG_GET_SCSI_ID 0x2276
+#define SG_SET_FORCE_LOW_DMA 0x2279
+#define SG_GET_LOW_DMA 0x227a
+#define SG_SET_FORCE_PACK_ID 0x227b
+#define SG_GET_PACK_ID 0x227c
+#define SG_GET_NUM_WAITING 0x227d
+#define SG_GET_SG_TABLESIZE 0x227F
+#define SG_GET_VERSION_NUM 0x2282
+#define SG_SCSI_RESET 0x2284
+#define SG_SCSI_RESET_NOTHING 0
+#define SG_SCSI_RESET_DEVICE 1
+#define SG_SCSI_RESET_BUS 2
+#define SG_SCSI_RESET_HOST 3
+#define SG_IO 0x2285
+#define SG_GET_REQUEST_TABLE 0x2286
+#define SG_SET_KEEP_ORPHAN 0x2287
+#define SG_GET_KEEP_ORPHAN 0x2288
+#define SG_SCATTER_SZ (8 * 4096)
+#define SG_DEFAULT_RETRIES 1
+#define SG_DEF_FORCE_LOW_DMA 0
+#define SG_DEF_FORCE_PACK_ID 0
+#define SG_DEF_KEEP_ORPHAN 0
+#define SG_DEF_RESERVED_SIZE SG_SCATTER_SZ
+#define SG_MAX_QUEUE 16
+#define SG_BIG_BUFF SG_DEF_RESERVED_SIZE
+#define SG_MAX_SENSE 16
+#define SG_SET_TIMEOUT 0x2201
+#define SG_GET_TIMEOUT 0x2202
+#define SG_GET_COMMAND_Q 0x2270
+#define SG_SET_COMMAND_Q 0x2271
+#define SG_SET_DEBUG 0x227e
+#define SG_NEXT_CMD_LEN 0x2283
+#define SG_DEFAULT_TIMEOUT (60*100) /* 60*HZ */
+#define SG_DEF_COMMAND_Q 0
+#define SG_DEF_UNDERRUN_FLAG 0
+
+typedef struct sg_iovec {
+ void *iov_base;
+ unsigned long iov_len;
+} sg_iovec_t;
+
+typedef struct sg_io_hdr {
+ int interface_id;
+ int dxfer_direction;
+ unsigned char cmd_len;
+ unsigned char mx_sb_len;
+ unsigned short iovec_count;
+ unsigned dxfer_len;
+ void *dxferp;
+ unsigned char *cmdp;
+ unsigned char *sbp;
+ unsigned timeout;
+ unsigned flags;
+ int pack_id;
+ void *usr_ptr;
+ unsigned char status;
+ unsigned char masked_status;
+ unsigned char msg_status;
+ unsigned char sb_len_wr;
+ unsigned short host_status;
+ unsigned short driver_status;
+ int resid;
+ unsigned int duration;
+ unsigned int info;
+} sg_io_hdr_t;
+
+struct sg_scsi_id {
+ int host_no;
+ int channel;
+ int scsi_id;
+ int lun;
+ int scsi_type;
+ short h_cmd_per_lun;
+ short d_queue_depth;
+ int unused[2];
+};
+
+typedef struct sg_req_info {
+ char req_state;
+ char orphan;
+ char sg_io_owned;
+ char problem;
+ int pack_id;
+ void *usr_ptr;
+ unsigned duration;
+ int unused;
+} sg_req_info_t;
+
+typedef struct sg_io_hdr Sg_io_hdr;
+typedef struct sg_io_vec Sg_io_vec;
+typedef struct sg_scsi_id Sg_scsi_id;
+typedef struct sg_req_info Sg_req_info;
+
+struct sg_header {
+ int pack_len;
+ int reply_len;
+ int pack_id;
+ int result;
+ unsigned twelve_byte:1;
+ unsigned target_status:5;
+ unsigned host_status:8;
+ unsigned driver_status:8;
+ unsigned other_flags:10;
+ unsigned char sense_buffer[SG_MAX_SENSE];
+};
+
+#endif
diff --git a/libc-top-half/musl/include/search.h b/libc-top-half/musl/include/search.h
new file mode 100644
index 0000000..02e407e
--- /dev/null
+++ b/libc-top-half/musl/include/search.h
@@ -0,0 +1,63 @@
+#ifndef _SEARCH_H
+#define _SEARCH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_size_t
+#include <bits/alltypes.h>
+
+typedef enum { FIND, ENTER } ACTION;
+typedef enum { preorder, postorder, endorder, leaf } VISIT;
+
+typedef struct entry {
+ char *key;
+ void *data;
+} ENTRY;
+
+int hcreate(size_t);
+void hdestroy(void);
+ENTRY *hsearch(ENTRY, ACTION);
+
+#ifdef _GNU_SOURCE
+struct hsearch_data {
+ struct __tab *__tab;
+ unsigned int __unused1;
+ unsigned int __unused2;
+};
+
+int hcreate_r(size_t, struct hsearch_data *);
+void hdestroy_r(struct hsearch_data *);
+int hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *);
+#endif
+
+void insque(void *, void *);
+void remque(void *);
+
+void *lsearch(const void *, void *, size_t *, size_t,
+ int (*)(const void *, const void *));
+void *lfind(const void *, const void *, size_t *, size_t,
+ int (*)(const void *, const void *));
+
+void *tdelete(const void *__restrict, void **__restrict, int(*)(const void *, const void *));
+void *tfind(const void *, void *const *, int(*)(const void *, const void *));
+void *tsearch(const void *, void **, int (*)(const void *, const void *));
+void twalk(const void *, void (*)(const void *, VISIT, int));
+
+#ifdef _GNU_SOURCE
+struct qelem {
+ struct qelem *q_forw, *q_back;
+ char q_data[1];
+};
+
+void tdestroy(void *, void (*)(void *));
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/semaphore.h b/libc-top-half/musl/include/semaphore.h
new file mode 100644
index 0000000..3690f49
--- /dev/null
+++ b/libc-top-half/musl/include/semaphore.h
@@ -0,0 +1,39 @@
+#ifndef _SEMAPHORE_H
+#define _SEMAPHORE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_time_t
+#define __NEED_struct_timespec
+#include <bits/alltypes.h>
+
+#include <fcntl.h>
+
+#define SEM_FAILED ((sem_t *)0)
+
+typedef struct {
+ volatile int __val[4*sizeof(long)/sizeof(int)];
+} sem_t;
+
+int sem_close(sem_t *);
+int sem_destroy(sem_t *);
+int sem_getvalue(sem_t *__restrict, int *__restrict);
+int sem_init(sem_t *, int, unsigned);
+sem_t *sem_open(const char *, int, ...);
+int sem_post(sem_t *);
+int sem_timedwait(sem_t *__restrict, const struct timespec *__restrict);
+int sem_trywait(sem_t *);
+int sem_unlink(const char *);
+int sem_wait(sem_t *);
+
+#if _REDIR_TIME64
+__REDIR(sem_timedwait, __sem_timedwait_time64);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/setjmp.h b/libc-top-half/musl/include/setjmp.h
new file mode 100644
index 0000000..f505f8e
--- /dev/null
+++ b/libc-top-half/musl/include/setjmp.h
@@ -0,0 +1,53 @@
+#ifndef _SETJMP_H
+#define _SETJMP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no setjmp */
+#include <bits/setjmp.h>
+
+typedef struct __jmp_buf_tag {
+ __jmp_buf __jb;
+ unsigned long __fl;
+ unsigned long __ss[128/sizeof(long)];
+} jmp_buf[1];
+
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
+#define __setjmp_attr __attribute__((__returns_twice__))
+#else
+#define __setjmp_attr
+#endif
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+typedef jmp_buf sigjmp_buf;
+int sigsetjmp (sigjmp_buf, int) __setjmp_attr;
+_Noreturn void siglongjmp (sigjmp_buf, int);
+#endif
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+int _setjmp (jmp_buf) __setjmp_attr;
+_Noreturn void _longjmp (jmp_buf, int);
+#endif
+
+int setjmp (jmp_buf) __setjmp_attr;
+_Noreturn void longjmp (jmp_buf, int);
+
+#define setjmp setjmp
+#else
+#warning setjmp is not yet implemented for WASI
+#endif
+
+#undef __setjmp_attr
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/shadow.h b/libc-top-half/musl/include/shadow.h
new file mode 100644
index 0000000..2b1be41
--- /dev/null
+++ b/libc-top-half/musl/include/shadow.h
@@ -0,0 +1,44 @@
+#ifndef _SHADOW_H
+#define _SHADOW_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __NEED_FILE
+#define __NEED_size_t
+
+#include <bits/alltypes.h>
+
+#define SHADOW "/etc/shadow"
+
+struct spwd {
+ char *sp_namp;
+ char *sp_pwdp;
+ long sp_lstchg;
+ long sp_min;
+ long sp_max;
+ long sp_warn;
+ long sp_inact;
+ long sp_expire;
+ unsigned long sp_flag;
+};
+
+void setspent(void);
+void endspent(void);
+struct spwd *getspent(void);
+struct spwd *fgetspent(FILE *);
+struct spwd *sgetspent(const char *);
+int putspent(const struct spwd *, FILE *);
+
+struct spwd *getspnam(const char *);
+int getspnam_r(const char *, struct spwd *, char *, size_t, struct spwd **);
+
+int lckpwdf(void);
+int ulckpwdf(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/signal.h b/libc-top-half/musl/include/signal.h
new file mode 100644
index 0000000..75b5e55
--- /dev/null
+++ b/libc-top-half/musl/include/signal.h
@@ -0,0 +1,339 @@
+#ifndef _WASI_EMULATED_SIGNAL
+#error "wasm lacks signal support; to enable minimal signal emulation, \
+compile with -D_WASI_EMULATED_SIGNAL and link with -lwasi-emulated-signal"
+#else
+#ifndef _SIGNAL_H
+#define _SIGNAL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no ucontext support */
+#ifdef _GNU_SOURCE
+#define __ucontext ucontext
+#endif
+
+#define __NEED_size_t
+#define __NEED_pid_t
+#define __NEED_uid_t
+#define __NEED_struct_timespec
+#define __NEED_pthread_t
+#define __NEED_pthread_attr_t
+#define __NEED_time_t
+#define __NEED_clock_t
+#define __NEED_sigset_t
+
+#include <bits/alltypes.h>
+
+#define SIG_BLOCK 0
+#define SIG_UNBLOCK 1
+#define SIG_SETMASK 2
+
+#define SI_ASYNCNL (-60)
+#define SI_TKILL (-6)
+#define SI_SIGIO (-5)
+#define SI_ASYNCIO (-4)
+#define SI_MESGQ (-3)
+#define SI_TIMER (-2)
+#define SI_QUEUE (-1)
+#define SI_USER 0
+#define SI_KERNEL 128
+
+typedef struct sigaltstack stack_t;
+#endif
+
+#endif
+
+#include <bits/signal.h>
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no sigaction */
+#define SIG_HOLD ((void (*)(int)) 2)
+
+#define FPE_INTDIV 1
+#define FPE_INTOVF 2
+#define FPE_FLTDIV 3
+#define FPE_FLTOVF 4
+#define FPE_FLTUND 5
+#define FPE_FLTRES 6
+#define FPE_FLTINV 7
+#define FPE_FLTSUB 8
+
+#define ILL_ILLOPC 1
+#define ILL_ILLOPN 2
+#define ILL_ILLADR 3
+#define ILL_ILLTRP 4
+#define ILL_PRVOPC 5
+#define ILL_PRVREG 6
+#define ILL_COPROC 7
+#define ILL_BADSTK 8
+
+#define SEGV_MAPERR 1
+#define SEGV_ACCERR 2
+#define SEGV_BNDERR 3
+#define SEGV_PKUERR 4
+#define SEGV_MTEAERR 8
+#define SEGV_MTESERR 9
+
+#define BUS_ADRALN 1
+#define BUS_ADRERR 2
+#define BUS_OBJERR 3
+#define BUS_MCEERR_AR 4
+#define BUS_MCEERR_AO 5
+
+#define CLD_EXITED 1
+#define CLD_KILLED 2
+#define CLD_DUMPED 3
+#define CLD_TRAPPED 4
+#define CLD_STOPPED 5
+#define CLD_CONTINUED 6
+
+union sigval {
+ int sival_int;
+ void *sival_ptr;
+};
+
+typedef struct {
+#ifdef __SI_SWAP_ERRNO_CODE
+ int si_signo, si_code, si_errno;
+#else
+ int si_signo, si_errno, si_code;
+#endif
+ union {
+ char __pad[128 - 2*sizeof(int) - sizeof(long)];
+ struct {
+ union {
+ struct {
+ pid_t si_pid;
+ uid_t si_uid;
+ } __piduid;
+ struct {
+ int si_timerid;
+ int si_overrun;
+ } __timer;
+ } __first;
+ union {
+ union sigval si_value;
+ struct {
+ int si_status;
+ clock_t si_utime, si_stime;
+ } __sigchld;
+ } __second;
+ } __si_common;
+ struct {
+ void *si_addr;
+ short si_addr_lsb;
+ union {
+ struct {
+ void *si_lower;
+ void *si_upper;
+ } __addr_bnd;
+ unsigned si_pkey;
+ } __first;
+ } __sigfault;
+ struct {
+ long si_band;
+ int si_fd;
+ } __sigpoll;
+ struct {
+ void *si_call_addr;
+ int si_syscall;
+ unsigned si_arch;
+ } __sigsys;
+ } __si_fields;
+} siginfo_t;
+#define si_pid __si_fields.__si_common.__first.__piduid.si_pid
+#define si_uid __si_fields.__si_common.__first.__piduid.si_uid
+#define si_status __si_fields.__si_common.__second.__sigchld.si_status
+#define si_utime __si_fields.__si_common.__second.__sigchld.si_utime
+#define si_stime __si_fields.__si_common.__second.__sigchld.si_stime
+#define si_value __si_fields.__si_common.__second.si_value
+#define si_addr __si_fields.__sigfault.si_addr
+#define si_addr_lsb __si_fields.__sigfault.si_addr_lsb
+#define si_lower __si_fields.__sigfault.__first.__addr_bnd.si_lower
+#define si_upper __si_fields.__sigfault.__first.__addr_bnd.si_upper
+#define si_pkey __si_fields.__sigfault.__first.si_pkey
+#define si_band __si_fields.__sigpoll.si_band
+#define si_fd __si_fields.__sigpoll.si_fd
+#define si_timerid __si_fields.__si_common.__first.__timer.si_timerid
+#define si_overrun __si_fields.__si_common.__first.__timer.si_overrun
+#define si_ptr si_value.sival_ptr
+#define si_int si_value.sival_int
+#define si_call_addr __si_fields.__sigsys.si_call_addr
+#define si_syscall __si_fields.__sigsys.si_syscall
+#define si_arch __si_fields.__sigsys.si_arch
+
+struct sigaction {
+ union {
+ void (*sa_handler)(int);
+ void (*sa_sigaction)(int, siginfo_t *, void *);
+ } __sa_handler;
+ sigset_t sa_mask;
+ int sa_flags;
+ void (*sa_restorer)(void);
+};
+#define sa_handler __sa_handler.sa_handler
+#define sa_sigaction __sa_handler.sa_sigaction
+
+#define SA_UNSUPPORTED 0x00000400
+#define SA_EXPOSE_TAGBITS 0x00000800
+
+struct sigevent {
+ union sigval sigev_value;
+ int sigev_signo;
+ int sigev_notify;
+ union {
+ char __pad[64 - 2*sizeof(int) - sizeof(union sigval)];
+ pid_t sigev_notify_thread_id;
+ struct {
+ void (*sigev_notify_function)(union sigval);
+ pthread_attr_t *sigev_notify_attributes;
+ } __sev_thread;
+ } __sev_fields;
+};
+
+#define sigev_notify_thread_id __sev_fields.sigev_notify_thread_id
+#define sigev_notify_function __sev_fields.__sev_thread.sigev_notify_function
+#define sigev_notify_attributes __sev_fields.__sev_thread.sigev_notify_attributes
+
+#define SIGEV_SIGNAL 0
+#define SIGEV_NONE 1
+#define SIGEV_THREAD 2
+#define SIGEV_THREAD_ID 4
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no realtime signals */
+int __libc_current_sigrtmin(void);
+int __libc_current_sigrtmax(void);
+
+#define SIGRTMIN (__libc_current_sigrtmin())
+#define SIGRTMAX (__libc_current_sigrtmax())
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no signals */
+int kill(pid_t, int);
+
+int sigemptyset(sigset_t *);
+int sigfillset(sigset_t *);
+int sigaddset(sigset_t *, int);
+int sigdelset(sigset_t *, int);
+int sigismember(const sigset_t *, int);
+
+int sigprocmask(int, const sigset_t *__restrict, sigset_t *__restrict);
+int sigsuspend(const sigset_t *);
+int sigaction(int, const struct sigaction *__restrict, struct sigaction *__restrict);
+int sigpending(sigset_t *);
+int sigwait(const sigset_t *__restrict, int *__restrict);
+int sigwaitinfo(const sigset_t *__restrict, siginfo_t *__restrict);
+int sigtimedwait(const sigset_t *__restrict, siginfo_t *__restrict, const struct timespec *__restrict);
+int sigqueue(pid_t, int, union sigval);
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no threads yet */
+int pthread_sigmask(int, const sigset_t *__restrict, sigset_t *__restrict);
+int pthread_kill(pthread_t, int);
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no siginfo */
+void psiginfo(const siginfo_t *, const char *);
+#endif
+void psignal(int, const char *);
+
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no signals */
+#if defined(_XOPEN_SOURCE) || defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
+int killpg(pid_t, int);
+int sigaltstack(const stack_t *__restrict, stack_t *__restrict);
+int sighold(int);
+int sigignore(int);
+int siginterrupt(int, int);
+int sigpause(int);
+int sigrelse(int);
+void (*sigset(int, void (*)(int)))(int);
+#define TRAP_BRKPT 1
+#define TRAP_TRACE 2
+#define TRAP_BRANCH 3
+#define TRAP_HWBKPT 4
+#define TRAP_UNK 5
+#define POLL_IN 1
+#define POLL_OUT 2
+#define POLL_MSG 3
+#define POLL_ERR 4
+#define POLL_PRI 5
+#define POLL_HUP 6
+#define SS_ONSTACK 1
+#define SS_DISABLE 2
+#define SS_AUTODISARM (1U << 31)
+#define SS_FLAG_BITS SS_AUTODISARM
+#endif
+#endif
+
+#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
+#define NSIG _NSIG
+typedef void (*sig_t)(int);
+
+#define SYS_SECCOMP 1
+#define SYS_USER_DISPATCH 2
+#endif
+
+#ifdef _GNU_SOURCE
+typedef void (*sighandler_t)(int);
+void (*bsd_signal(int, void (*)(int)))(int);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no signal sets */
+int sigisemptyset(const sigset_t *);
+int sigorset (sigset_t *, const sigset_t *, const sigset_t *);
+int sigandset(sigset_t *, const sigset_t *, const sigset_t *);
+
+#define SA_NOMASK SA_NODEFER
+#define SA_ONESHOT SA_RESETHAND
+#endif
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* 1 is a valid function pointer on wasm */
+#define SIG_ERR ((void (*)(int))-1)
+#define SIG_DFL ((void (*)(int)) 0)
+#define SIG_IGN ((void (*)(int)) 1)
+#else
+void __SIG_ERR(int);
+void __SIG_IGN(int);
+#define SIG_ERR (__SIG_ERR)
+#define SIG_DFL ((void (*)(int)) 0)
+#define SIG_IGN (__SIG_IGN)
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Make sig_atomic_t 64-bit on wasm64 */
+typedef int sig_atomic_t;
+#else
+typedef long sig_atomic_t;
+#endif
+
+void (*signal(int, void (*)(int)))(int);
+int raise(int);
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no sigtimedwait */
+#if _REDIR_TIME64
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+__REDIR(sigtimedwait, __sigtimedwait_time64);
+#endif
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+#endif
diff --git a/libc-top-half/musl/include/spawn.h b/libc-top-half/musl/include/spawn.h
new file mode 100644
index 0000000..8eb73e0
--- /dev/null
+++ b/libc-top-half/musl/include/spawn.h
@@ -0,0 +1,83 @@
+#ifndef _SPAWN_H
+#define _SPAWN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_mode_t
+#define __NEED_pid_t
+#define __NEED_sigset_t
+
+#include <bits/alltypes.h>
+
+struct sched_param;
+
+#define POSIX_SPAWN_RESETIDS 1
+#define POSIX_SPAWN_SETPGROUP 2
+#define POSIX_SPAWN_SETSIGDEF 4
+#define POSIX_SPAWN_SETSIGMASK 8
+#define POSIX_SPAWN_SETSCHEDPARAM 16
+#define POSIX_SPAWN_SETSCHEDULER 32
+#define POSIX_SPAWN_USEVFORK 64
+#define POSIX_SPAWN_SETSID 128
+
+typedef struct {
+ int __flags;
+ pid_t __pgrp;
+ sigset_t __def, __mask;
+ int __prio, __pol;
+ void *__fn;
+ char __pad[64-sizeof(void *)];
+} posix_spawnattr_t;
+
+typedef struct {
+ int __pad0[2];
+ void *__actions;
+ int __pad[16];
+} posix_spawn_file_actions_t;
+
+int posix_spawn(pid_t *__restrict, const char *__restrict, const posix_spawn_file_actions_t *,
+ const posix_spawnattr_t *__restrict, char *const *__restrict, char *const *__restrict);
+int posix_spawnp(pid_t *__restrict, const char *__restrict, const posix_spawn_file_actions_t *,
+ const posix_spawnattr_t *__restrict, char *const *__restrict, char *const *__restrict);
+
+int posix_spawnattr_init(posix_spawnattr_t *);
+int posix_spawnattr_destroy(posix_spawnattr_t *);
+
+int posix_spawnattr_setflags(posix_spawnattr_t *, short);
+int posix_spawnattr_getflags(const posix_spawnattr_t *__restrict, short *__restrict);
+
+int posix_spawnattr_setpgroup(posix_spawnattr_t *, pid_t);
+int posix_spawnattr_getpgroup(const posix_spawnattr_t *__restrict, pid_t *__restrict);
+
+int posix_spawnattr_setsigmask(posix_spawnattr_t *__restrict, const sigset_t *__restrict);
+int posix_spawnattr_getsigmask(const posix_spawnattr_t *__restrict, sigset_t *__restrict);
+
+int posix_spawnattr_setsigdefault(posix_spawnattr_t *__restrict, const sigset_t *__restrict);
+int posix_spawnattr_getsigdefault(const posix_spawnattr_t *__restrict, sigset_t *__restrict);
+
+int posix_spawnattr_setschedparam(posix_spawnattr_t *__restrict, const struct sched_param *__restrict);
+int posix_spawnattr_getschedparam(const posix_spawnattr_t *__restrict, struct sched_param *__restrict);
+int posix_spawnattr_setschedpolicy(posix_spawnattr_t *, int);
+int posix_spawnattr_getschedpolicy(const posix_spawnattr_t *__restrict, int *__restrict);
+
+int posix_spawn_file_actions_init(posix_spawn_file_actions_t *);
+int posix_spawn_file_actions_destroy(posix_spawn_file_actions_t *);
+
+int posix_spawn_file_actions_addopen(posix_spawn_file_actions_t *__restrict, int, const char *__restrict, int, mode_t);
+int posix_spawn_file_actions_addclose(posix_spawn_file_actions_t *, int);
+int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *, int, int);
+
+#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
+int posix_spawn_file_actions_addchdir_np(posix_spawn_file_actions_t *__restrict, const char *__restrict);
+int posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t *, int);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/stdalign.h b/libc-top-half/musl/include/stdalign.h
new file mode 100644
index 0000000..2cc94be
--- /dev/null
+++ b/libc-top-half/musl/include/stdalign.h
@@ -0,0 +1,20 @@
+#ifndef _STDALIGN_H
+#define _STDALIGN_H
+
+#ifndef __cplusplus
+
+/* this whole header only works in C11 or with compiler extensions */
+#if __STDC_VERSION__ < 201112L && defined( __GNUC__)
+#define _Alignas(t) __attribute__((__aligned__(t)))
+#define _Alignof(t) __alignof__(t)
+#endif
+
+#define alignas _Alignas
+#define alignof _Alignof
+
+#endif
+
+#define __alignas_is_defined 1
+#define __alignof_is_defined 1
+
+#endif
diff --git a/libc-top-half/musl/include/stdarg.h b/libc-top-half/musl/include/stdarg.h
new file mode 100644
index 0000000..3256f80
--- /dev/null
+++ b/libc-top-half/musl/include/stdarg.h
@@ -0,0 +1,21 @@
+#ifndef _STDARG_H
+#define _STDARG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __NEED_va_list
+
+#include <bits/alltypes.h>
+
+#define va_start(v,l) __builtin_va_start(v,l)
+#define va_end(v) __builtin_va_end(v)
+#define va_arg(v,l) __builtin_va_arg(v,l)
+#define va_copy(d,s) __builtin_va_copy(d,s)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/stdbool.h b/libc-top-half/musl/include/stdbool.h
new file mode 100644
index 0000000..a9d7ab7
--- /dev/null
+++ b/libc-top-half/musl/include/stdbool.h
@@ -0,0 +1,14 @@
+#ifndef _STDBOOL_H
+#define _STDBOOL_H
+
+#ifndef __cplusplus
+
+#define true 1
+#define false 0
+#define bool _Bool
+
+#endif
+
+#define __bool_true_false_are_defined 1
+
+#endif
diff --git a/libc-top-half/musl/include/stdc-predef.h b/libc-top-half/musl/include/stdc-predef.h
new file mode 100644
index 0000000..af1a279
--- /dev/null
+++ b/libc-top-half/musl/include/stdc-predef.h
@@ -0,0 +1,13 @@
+#ifndef _STDC_PREDEF_H
+#define _STDC_PREDEF_H
+
+#define __STDC_ISO_10646__ 201206L
+
+#if !defined(__GCC_IEC_559) || __GCC_IEC_559 > 0
+#define __STDC_IEC_559__ 1
+#endif
+
+#define __STDC_UTF_16__ 1
+#define __STDC_UTF_32__ 1
+
+#endif
diff --git a/libc-top-half/musl/include/stddef.h b/libc-top-half/musl/include/stddef.h
new file mode 100644
index 0000000..f25b863
--- /dev/null
+++ b/libc-top-half/musl/include/stddef.h
@@ -0,0 +1,27 @@
+#ifndef _STDDEF_H
+#define _STDDEF_H
+
+#if __cplusplus >= 201103L
+#define NULL nullptr
+#elif defined(__cplusplus)
+#define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
+
+#define __NEED_ptrdiff_t
+#define __NEED_size_t
+#define __NEED_wchar_t
+#if __STDC_VERSION__ >= 201112L || __cplusplus >= 201103L
+#define __NEED_max_align_t
+#endif
+
+#include <bits/alltypes.h>
+
+#if __GNUC__ > 3
+#define offsetof(type, member) __builtin_offsetof(type, member)
+#else
+#define offsetof(type, member) ((size_t)( (char *)&(((type *)0)->member) - (char *)0 ))
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/stdint.h b/libc-top-half/musl/include/stdint.h
new file mode 100644
index 0000000..a296819
--- /dev/null
+++ b/libc-top-half/musl/include/stdint.h
@@ -0,0 +1,117 @@
+#ifndef _STDINT_H
+#define _STDINT_H
+
+#define __NEED_int8_t
+#define __NEED_int16_t
+#define __NEED_int32_t
+#define __NEED_int64_t
+
+#define __NEED_uint8_t
+#define __NEED_uint16_t
+#define __NEED_uint32_t
+#define __NEED_uint64_t
+
+#define __NEED_intptr_t
+#define __NEED_uintptr_t
+
+#define __NEED_intmax_t
+#define __NEED_uintmax_t
+
+#include <bits/alltypes.h>
+
+typedef int8_t int_fast8_t;
+typedef int64_t int_fast64_t;
+
+typedef int8_t int_least8_t;
+typedef int16_t int_least16_t;
+typedef int32_t int_least32_t;
+typedef int64_t int_least64_t;
+
+typedef uint8_t uint_fast8_t;
+typedef uint64_t uint_fast64_t;
+
+typedef uint8_t uint_least8_t;
+typedef uint16_t uint_least16_t;
+typedef uint32_t uint_least32_t;
+typedef uint64_t uint_least64_t;
+
+#define INT8_MIN (-1-0x7f)
+#define INT16_MIN (-1-0x7fff)
+#define INT32_MIN (-1-0x7fffffff)
+#define INT64_MIN (-1-0x7fffffffffffffff)
+
+#define INT8_MAX (0x7f)
+#define INT16_MAX (0x7fff)
+#define INT32_MAX (0x7fffffff)
+#define INT64_MAX (0x7fffffffffffffff)
+
+#define UINT8_MAX (0xff)
+#define UINT16_MAX (0xffff)
+#define UINT32_MAX (0xffffffffu)
+#define UINT64_MAX (0xffffffffffffffffu)
+
+#define INT_FAST8_MIN INT8_MIN
+#define INT_FAST64_MIN INT64_MIN
+
+#define INT_LEAST8_MIN INT8_MIN
+#define INT_LEAST16_MIN INT16_MIN
+#define INT_LEAST32_MIN INT32_MIN
+#define INT_LEAST64_MIN INT64_MIN
+
+#define INT_FAST8_MAX INT8_MAX
+#define INT_FAST64_MAX INT64_MAX
+
+#define INT_LEAST8_MAX INT8_MAX
+#define INT_LEAST16_MAX INT16_MAX
+#define INT_LEAST32_MAX INT32_MAX
+#define INT_LEAST64_MAX INT64_MAX
+
+#define UINT_FAST8_MAX UINT8_MAX
+#define UINT_FAST64_MAX UINT64_MAX
+
+#define UINT_LEAST8_MAX UINT8_MAX
+#define UINT_LEAST16_MAX UINT16_MAX
+#define UINT_LEAST32_MAX UINT32_MAX
+#define UINT_LEAST64_MAX UINT64_MAX
+
+#define INTMAX_MIN INT64_MIN
+#define INTMAX_MAX INT64_MAX
+#define UINTMAX_MAX UINT64_MAX
+
+#define WINT_MIN 0U
+#define WINT_MAX UINT32_MAX
+
+#if L'\0'-1 > 0
+#define WCHAR_MAX (0xffffffffu+L'\0')
+#define WCHAR_MIN (0+L'\0')
+#else
+#define WCHAR_MAX (0x7fffffff+L'\0')
+#define WCHAR_MIN (-1-0x7fffffff+L'\0')
+#endif
+
+#define SIG_ATOMIC_MIN INT32_MIN
+#define SIG_ATOMIC_MAX INT32_MAX
+
+#include <bits/stdint.h>
+
+#define INT8_C(c) c
+#define INT16_C(c) c
+#define INT32_C(c) c
+
+#define UINT8_C(c) c
+#define UINT16_C(c) c
+#define UINT32_C(c) c ## U
+
+#if UINTPTR_MAX == UINT64_MAX
+#define INT64_C(c) c ## L
+#define UINT64_C(c) c ## UL
+#define INTMAX_C(c) c ## L
+#define UINTMAX_C(c) c ## UL
+#else
+#define INT64_C(c) c ## LL
+#define UINT64_C(c) c ## ULL
+#define INTMAX_C(c) c ## LL
+#define UINTMAX_C(c) c ## ULL
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/stdio.h b/libc-top-half/musl/include/stdio.h
new file mode 100644
index 0000000..d63d739
--- /dev/null
+++ b/libc-top-half/musl/include/stdio.h
@@ -0,0 +1,254 @@
+#ifndef _STDIO_H
+#define _STDIO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_FILE
+#define __NEED___isoc_va_list
+#define __NEED_size_t
+
+#ifdef __wasilibc_unmodified_upstream /* WASI doesn't need to define FILE as a complete type */
+#if __STDC_VERSION__ < 201112L
+#define __NEED_struct__IO_FILE
+#endif
+#endif
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+#define __NEED_ssize_t
+#define __NEED_off_t
+#define __NEED_va_list
+#endif
+
+#include <bits/alltypes.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
+#if __cplusplus >= 201103L
+#define NULL nullptr
+#elif defined(__cplusplus)
+#define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
+#else
+#define __need_NULL
+#include <stddef.h>
+#endif
+
+#undef EOF
+#define EOF (-1)
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#undef SEEK_SET
+#undef SEEK_CUR
+#undef SEEK_END
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
+#else
+#include <__seek.h>
+#endif
+
+#define _IOFBF 0
+#define _IOLBF 1
+#define _IONBF 2
+
+#define BUFSIZ 1024
+#define FILENAME_MAX 4096
+#define FOPEN_MAX 1000
+#ifdef __wasilibc_unmodified_upstream /* WASI has no temp directories */
+#define TMP_MAX 10000
+#define L_tmpnam 20
+#endif
+
+typedef union _G_fpos64_t {
+ char __opaque[16];
+ long long __lldata;
+ double __align;
+} fpos_t;
+
+extern FILE *const stdin;
+extern FILE *const stdout;
+extern FILE *const stderr;
+
+#define stdin (stdin)
+#define stdout (stdout)
+#define stderr (stderr)
+
+FILE *fopen(const char *__restrict, const char *__restrict);
+FILE *freopen(const char *__restrict, const char *__restrict, FILE *__restrict);
+int fclose(FILE *);
+
+int remove(const char *);
+int rename(const char *, const char *);
+
+int feof(FILE *);
+int ferror(FILE *);
+int fflush(FILE *);
+void clearerr(FILE *);
+
+int fseek(FILE *, long, int);
+long ftell(FILE *);
+void rewind(FILE *);
+
+int fgetpos(FILE *__restrict, fpos_t *__restrict);
+int fsetpos(FILE *, const fpos_t *);
+
+size_t fread(void *__restrict, size_t, size_t, FILE *__restrict);
+size_t fwrite(const void *__restrict, size_t, size_t, FILE *__restrict);
+
+int fgetc(FILE *);
+int getc(FILE *);
+int getchar(void);
+int ungetc(int, FILE *);
+
+int fputc(int, FILE *);
+int putc(int, FILE *);
+int putchar(int);
+
+char *fgets(char *__restrict, int, FILE *__restrict);
+#if __STDC_VERSION__ < 201112L
+#ifdef __wasilibc_unmodified_upstream /* gets is obsolete */
+char *gets(char *);
+#else
+char *gets(char *) __attribute__((__deprecated__("gets is not defined on WASI")));
+#endif
+#endif
+
+int fputs(const char *__restrict, FILE *__restrict);
+int puts(const char *);
+
+int printf(const char *__restrict, ...);
+int fprintf(FILE *__restrict, const char *__restrict, ...);
+int sprintf(char *__restrict, const char *__restrict, ...);
+int snprintf(char *__restrict, size_t, const char *__restrict, ...);
+
+int vprintf(const char *__restrict, __isoc_va_list);
+int vfprintf(FILE *__restrict, const char *__restrict, __isoc_va_list);
+int vsprintf(char *__restrict, const char *__restrict, __isoc_va_list);
+int vsnprintf(char *__restrict, size_t, const char *__restrict, __isoc_va_list);
+
+int scanf(const char *__restrict, ...);
+int fscanf(FILE *__restrict, const char *__restrict, ...);
+int sscanf(const char *__restrict, const char *__restrict, ...);
+int vscanf(const char *__restrict, __isoc_va_list);
+int vfscanf(FILE *__restrict, const char *__restrict, __isoc_va_list);
+int vsscanf(const char *__restrict, const char *__restrict, __isoc_va_list);
+
+void perror(const char *);
+
+int setvbuf(FILE *__restrict, char *__restrict, int, size_t);
+void setbuf(FILE *__restrict, char *__restrict);
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no temp directories */
+char *tmpnam(char *);
+FILE *tmpfile(void);
+#else
+char *tmpnam(char *) __attribute__((__deprecated__("tmpnam is not defined on WASI")));
+FILE *tmpfile(void) __attribute__((__deprecated__("tmpfile is not defined on WASI")));
+#endif
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+FILE *fmemopen(void *__restrict, size_t, const char *__restrict);
+FILE *open_memstream(char **, size_t *);
+FILE *fdopen(int, const char *);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no popen */
+FILE *popen(const char *, const char *);
+int pclose(FILE *);
+#endif
+int fileno(FILE *);
+int fseeko(FILE *, off_t, int);
+off_t ftello(FILE *);
+int dprintf(int, const char *__restrict, ...);
+int vdprintf(int, const char *__restrict, __isoc_va_list);
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+void flockfile(FILE *);
+int ftrylockfile(FILE *);
+void funlockfile(FILE *);
+#endif
+int getc_unlocked(FILE *);
+int getchar_unlocked(void);
+int putc_unlocked(int, FILE *);
+int putchar_unlocked(int);
+ssize_t getdelim(char **__restrict, size_t *__restrict, int, FILE *__restrict);
+ssize_t getline(char **__restrict, size_t *__restrict, FILE *__restrict);
+int renameat(int, const char *, int, const char *);
+char *ctermid(char *);
+#define L_ctermid 20
+#endif
+
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no temp directories */
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+#define P_tmpdir "/tmp"
+char *tempnam(const char *, const char *);
+#endif
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define L_cuserid 20
+char *cuserid(char *);
+void setlinebuf(FILE *);
+void setbuffer(FILE *, char *, size_t);
+int fgetc_unlocked(FILE *);
+int fputc_unlocked(int, FILE *);
+int fflush_unlocked(FILE *);
+size_t fread_unlocked(void *, size_t, size_t, FILE *);
+size_t fwrite_unlocked(const void *, size_t, size_t, FILE *);
+void clearerr_unlocked(FILE *);
+int feof_unlocked(FILE *);
+int ferror_unlocked(FILE *);
+int fileno_unlocked(FILE *);
+int getw(FILE *);
+int putw(int, FILE *);
+char *fgetln(FILE *, size_t *);
+int asprintf(char **, const char *, ...);
+int vasprintf(char **, const char *, __isoc_va_list);
+#endif
+
+#ifdef _GNU_SOURCE
+char *fgets_unlocked(char *, int, FILE *);
+int fputs_unlocked(const char *, FILE *);
+
+typedef ssize_t (cookie_read_function_t)(void *, char *, size_t);
+typedef ssize_t (cookie_write_function_t)(void *, const char *, size_t);
+typedef int (cookie_seek_function_t)(void *, off_t *, int);
+typedef int (cookie_close_function_t)(void *);
+
+typedef struct _IO_cookie_io_functions_t {
+ cookie_read_function_t *read;
+ cookie_write_function_t *write;
+ cookie_seek_function_t *seek;
+ cookie_close_function_t *close;
+} cookie_io_functions_t;
+
+FILE *fopencookie(void *, const char *, cookie_io_functions_t);
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#ifdef __wasilibc_unmodified_upstream /* WASI has no temp directories */
+#define tmpfile64 tmpfile
+#endif
+#define fopen64 fopen
+#define freopen64 freopen
+#define fseeko64 fseeko
+#define ftello64 ftello
+#define fgetpos64 fgetpos
+#define fsetpos64 fsetpos
+#define fpos64_t fpos_t
+#define off64_t off_t
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/stdio_ext.h b/libc-top-half/musl/include/stdio_ext.h
new file mode 100644
index 0000000..e3ab7fd
--- /dev/null
+++ b/libc-top-half/musl/include/stdio_ext.h
@@ -0,0 +1,34 @@
+#ifndef _STDIO_EXT_H
+#define _STDIO_EXT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdio.h>
+
+#define FSETLOCKING_QUERY 0
+#define FSETLOCKING_INTERNAL 1
+#define FSETLOCKING_BYCALLER 2
+
+void _flushlbf(void);
+int __fsetlocking(FILE *, int);
+int __fwriting(FILE *);
+int __freading(FILE *);
+int __freadable(FILE *);
+int __fwritable(FILE *);
+int __flbf(FILE *);
+size_t __fbufsize(FILE *);
+size_t __fpending(FILE *);
+int __fpurge(FILE *);
+
+size_t __freadahead(FILE *);
+const char *__freadptr(FILE *, size_t *);
+void __freadptrinc(FILE *, size_t);
+void __fseterr(FILE *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/stdlib.h b/libc-top-half/musl/include/stdlib.h
new file mode 100644
index 0000000..1bcb9ab
--- /dev/null
+++ b/libc-top-half/musl/include/stdlib.h
@@ -0,0 +1,219 @@
+#ifndef _STDLIB_H
+#define _STDLIB_H
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#else
+#include <__functions_malloc.h>
+#include <__header_stdlib.h>
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
+#if __cplusplus >= 201103L
+#define NULL nullptr
+#elif defined(__cplusplus)
+#define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
+#else
+#define __need_NULL
+#include <stddef.h>
+#endif
+
+#define __NEED_size_t
+#define __NEED_wchar_t
+
+#include <bits/alltypes.h>
+
+int atoi (const char *);
+long atol (const char *);
+long long atoll (const char *);
+double atof (const char *);
+
+float strtof (const char *__restrict, char **__restrict);
+double strtod (const char *__restrict, char **__restrict);
+long double strtold (const char *__restrict, char **__restrict);
+
+long strtol (const char *__restrict, char **__restrict, int);
+unsigned long strtoul (const char *__restrict, char **__restrict, int);
+long long strtoll (const char *__restrict, char **__restrict, int);
+unsigned long long strtoull (const char *__restrict, char **__restrict, int);
+
+int rand (void);
+void srand (unsigned);
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+void *malloc (size_t);
+void *calloc (size_t, size_t);
+void *realloc (void *, size_t);
+void free (void *);
+#endif
+void *aligned_alloc(size_t, size_t);
+
+_Noreturn void abort (void);
+int atexit (void (*) (void));
+_Noreturn void exit (int);
+_Noreturn void _Exit (int);
+int at_quick_exit (void (*) (void));
+_Noreturn void quick_exit (int);
+
+char *getenv (const char *);
+
+int system (const char *);
+
+void *bsearch (const void *, const void *, size_t, size_t, int (*)(const void *, const void *));
+void qsort (void *, size_t, size_t, int (*)(const void *, const void *));
+
+int abs (int);
+long labs (long);
+long long llabs (long long);
+
+typedef struct { int quot, rem; } div_t;
+typedef struct { long quot, rem; } ldiv_t;
+typedef struct { long long quot, rem; } lldiv_t;
+
+div_t div (int, int);
+ldiv_t ldiv (long, long);
+lldiv_t lldiv (long long, long long);
+
+int mblen (const char *, size_t);
+int mbtowc (wchar_t *__restrict, const char *__restrict, size_t);
+int wctomb (char *, wchar_t);
+size_t mbstowcs (wchar_t *__restrict, const char *__restrict, size_t);
+size_t wcstombs (char *__restrict, const wchar_t *__restrict, size_t);
+
+#define EXIT_FAILURE 1
+#define EXIT_SUCCESS 0
+
+size_t __ctype_get_mb_cur_max(void);
+#define MB_CUR_MAX (__ctype_get_mb_cur_max())
+
+#define RAND_MAX (0x7fffffff)
+
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no wait */
+#define WNOHANG 1
+#define WUNTRACED 2
+
+#define WEXITSTATUS(s) (((s) & 0xff00) >> 8)
+#define WTERMSIG(s) ((s) & 0x7f)
+#define WSTOPSIG(s) WEXITSTATUS(s)
+#define WIFEXITED(s) (!WTERMSIG(s))
+#define WIFSTOPPED(s) ((short)((((s)&0xffff)*0x10001)>>8) > 0x7f00)
+#define WIFSIGNALED(s) (((s)&0xffff)-1U < 0xffu)
+#endif
+
+int posix_memalign (void **, size_t, size_t);
+int setenv (const char *, const char *, int);
+int unsetenv (const char *);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no temp directories */
+int mkstemp (char *);
+int mkostemp (char *, int);
+char *mkdtemp (char *);
+#endif
+int getsubopt (char **, char *const *, char **);
+int rand_r (unsigned *);
+
+#endif
+
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+#ifdef __wasilibc_unmodified_upstream /* WASI has no absolute paths */
+char *realpath (const char *__restrict, char *__restrict);
+#endif
+long int random (void);
+void srandom (unsigned int);
+char *initstate (unsigned int, char *, size_t);
+char *setstate (char *);
+int putenv (char *);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no pseudo-terminals */
+int posix_openpt (int);
+int grantpt (int);
+int unlockpt (int);
+char *ptsname (int);
+#endif
+char *l64a (long);
+long a64l (const char *);
+void setkey (const char *);
+double drand48 (void);
+double erand48 (unsigned short [3]);
+long int lrand48 (void);
+long int nrand48 (unsigned short [3]);
+long mrand48 (void);
+long jrand48 (unsigned short [3]);
+void srand48 (long);
+unsigned short *seed48 (unsigned short [3]);
+void lcong48 (unsigned short [7]);
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#include <alloca.h>
+#ifdef __wasilibc_unmodified_upstream /* WASI has no temp directories */
+char *mktemp (char *);
+int mkstemps (char *, int);
+int mkostemps (char *, int, int);
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI libc doesn't build the legacy functions */
+void *valloc (size_t);
+void *memalign(size_t, size_t);
+int getloadavg(double *, int);
+#endif
+int clearenv(void);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no wait */
+#define WCOREDUMP(s) ((s) & 0x80)
+#define WIFCONTINUED(s) ((s) == 0xffff)
+void *reallocarray (void *, size_t, size_t);
+void qsort_r (void *, size_t, size_t, int (*)(const void *, const void *, void *), void *);
+#endif
+#endif
+
+#ifdef _GNU_SOURCE
+#ifdef __wasilibc_unmodified_upstream /* WASI has no pseudo-terminals */
+int ptsname_r(int, char *, size_t);
+#endif
+char *ecvt(double, int, int *, int *);
+char *fcvt(double, int, int *, int *);
+char *gcvt(double, int, char *);
+char *secure_getenv(const char *);
+struct __locale_struct;
+float strtof_l(const char *__restrict, char **__restrict, struct __locale_struct *);
+double strtod_l(const char *__restrict, char **__restrict, struct __locale_struct *);
+long double strtold_l(const char *__restrict, char **__restrict, struct __locale_struct *);
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no temp directories */
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#define mkstemp64 mkstemp
+#define mkostemp64 mkostemp
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define mkstemps64 mkstemps
+#define mkostemps64 mkostemps
+#endif
+#endif
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Declare arc4random functions */
+#else
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#include <stdint.h>
+uint32_t arc4random(void);
+void arc4random_buf(void *, size_t);
+uint32_t arc4random_uniform(uint32_t);
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/stdnoreturn.h b/libc-top-half/musl/include/stdnoreturn.h
new file mode 100644
index 0000000..5c6aeeb
--- /dev/null
+++ b/libc-top-half/musl/include/stdnoreturn.h
@@ -0,0 +1,7 @@
+#ifndef _STDNORETURN_H
+#define _STDNORETURN_H
+#ifndef __cplusplus
+#include <features.h>
+#define noreturn _Noreturn
+#endif
+#endif
diff --git a/libc-top-half/musl/include/string.h b/libc-top-half/musl/include/string.h
new file mode 100644
index 0000000..dc47b7a
--- /dev/null
+++ b/libc-top-half/musl/include/string.h
@@ -0,0 +1,128 @@
+#ifndef _STRING_H
+#define _STRING_H
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#else
+#include <__header_string.h>
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
+#if __cplusplus >= 201103L
+#define NULL nullptr
+#elif defined(__cplusplus)
+#define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
+#else
+#define __need_NULL
+#include <stddef.h>
+#endif
+
+#define __NEED_size_t
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+#define __NEED_locale_t
+#endif
+
+#include <bits/alltypes.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+void *memcpy (void *__restrict, const void *__restrict, size_t);
+void *memmove (void *, const void *, size_t);
+void *memset (void *, int, size_t);
+#endif
+int memcmp (const void *, const void *, size_t);
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+void *memchr (const void *, int, size_t);
+#endif
+
+char *strcpy (char *__restrict, const char *__restrict);
+char *strncpy (char *__restrict, const char *__restrict, size_t);
+
+char *strcat (char *__restrict, const char *__restrict);
+char *strncat (char *__restrict, const char *__restrict, size_t);
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+int strcmp (const char *, const char *);
+#endif
+int strncmp (const char *, const char *, size_t);
+
+int strcoll (const char *, const char *);
+size_t strxfrm (char *__restrict, const char *__restrict, size_t);
+
+char *strchr (const char *, int);
+char *strrchr (const char *, int);
+
+size_t strcspn (const char *, const char *);
+size_t strspn (const char *, const char *);
+char *strpbrk (const char *, const char *);
+char *strstr (const char *, const char *);
+char *strtok (char *__restrict, const char *__restrict);
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+size_t strlen (const char *);
+#endif
+
+char *strerror (int);
+
+#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
+#include <strings.h>
+#endif
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+char *strtok_r (char *__restrict, const char *__restrict, char **__restrict);
+int strerror_r (int, char *, size_t);
+char *stpcpy(char *__restrict, const char *__restrict);
+char *stpncpy(char *__restrict, const char *__restrict, size_t);
+size_t strnlen (const char *, size_t);
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+char *strdup (const char *);
+#endif
+char *strndup (const char *, size_t);
+char *strsignal(int);
+char *strerror_l (int, locale_t);
+int strcoll_l (const char *, const char *, locale_t);
+size_t strxfrm_l (char *__restrict, const char *__restrict, size_t, locale_t);
+#endif
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+void *memccpy (void *__restrict, const void *__restrict, int, size_t);
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+char *strsep(char **, const char *);
+size_t strlcat (char *, const char *, size_t);
+size_t strlcpy (char *, const char *, size_t);
+void explicit_bzero (void *, size_t);
+#endif
+
+#ifdef _GNU_SOURCE
+#define strdupa(x) strcpy(alloca(strlen(x)+1),x)
+int strverscmp (const char *, const char *);
+char *strchrnul(const char *, int);
+char *strcasestr(const char *, const char *);
+void *memmem(const void *, size_t, const void *, size_t);
+void *memrchr(const void *, int, size_t);
+void *mempcpy(void *, const void *, size_t);
+#ifdef __wasilibc_unmodified_upstream /* avoid unprototyped decls; use <libgen.h> */
+#ifndef __cplusplus
+char *basename();
+#endif
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/strings.h b/libc-top-half/musl/include/strings.h
new file mode 100644
index 0000000..db0960b
--- /dev/null
+++ b/libc-top-half/musl/include/strings.h
@@ -0,0 +1,39 @@
+#ifndef _STRINGS_H
+#define _STRINGS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define __NEED_size_t
+#define __NEED_locale_t
+#include <bits/alltypes.h>
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_POSIX_SOURCE) \
+ || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE+0 < 200809L) \
+ || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 < 700)
+int bcmp (const void *, const void *, size_t);
+void bcopy (const void *, void *, size_t);
+void bzero (void *, size_t);
+char *index (const char *, int);
+char *rindex (const char *, int);
+#endif
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+int ffs (int);
+int ffsl (long);
+int ffsll (long long);
+#endif
+
+int strcasecmp (const char *, const char *);
+int strncasecmp (const char *, const char *, size_t);
+
+int strcasecmp_l (const char *, const char *, locale_t);
+int strncasecmp_l (const char *, const char *, size_t, locale_t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/stropts.h b/libc-top-half/musl/include/stropts.h
new file mode 100644
index 0000000..c99c922
--- /dev/null
+++ b/libc-top-half/musl/include/stropts.h
@@ -0,0 +1,139 @@
+#ifndef _STROPTS_H
+#define _STROPTS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __SID ('S' << 8)
+
+#define I_NREAD (__SID | 1)
+#define I_PUSH (__SID | 2)
+#define I_POP (__SID | 3)
+#define I_LOOK (__SID | 4)
+#define I_FLUSH (__SID | 5)
+#define I_SRDOPT (__SID | 6)
+#define I_GRDOPT (__SID | 7)
+#define I_STR (__SID | 8)
+#define I_SETSIG (__SID | 9)
+#define I_GETSIG (__SID |10)
+#define I_FIND (__SID |11)
+#define I_LINK (__SID |12)
+#define I_UNLINK (__SID |13)
+#define I_PEEK (__SID |15)
+#define I_FDINSERT (__SID |16)
+#define I_SENDFD (__SID |17)
+#define I_RECVFD (__SID |14)
+#define I_SWROPT (__SID |19)
+#define I_GWROPT (__SID |20)
+#define I_LIST (__SID |21)
+#define I_PLINK (__SID |22)
+#define I_PUNLINK (__SID |23)
+#define I_FLUSHBAND (__SID |28)
+#define I_CKBAND (__SID |29)
+#define I_GETBAND (__SID |30)
+#define I_ATMARK (__SID |31)
+#define I_SETCLTIME (__SID |32)
+#define I_GETCLTIME (__SID |33)
+#define I_CANPUT (__SID |34)
+
+#define FMNAMESZ 8
+
+#define FLUSHR 0x01
+#define FLUSHW 0x02
+#define FLUSHRW 0x03
+#define FLUSHBAND 0x04
+
+#define S_INPUT 0x0001
+#define S_HIPRI 0x0002
+#define S_OUTPUT 0x0004
+#define S_MSG 0x0008
+#define S_ERROR 0x0010
+#define S_HANGUP 0x0020
+#define S_RDNORM 0x0040
+#define S_WRNORM S_OUTPUT
+#define S_RDBAND 0x0080
+#define S_WRBAND 0x0100
+#define S_BANDURG 0x0200
+
+#define RS_HIPRI 0x01
+
+#define RNORM 0x0000
+#define RMSGD 0x0001
+#define RMSGN 0x0002
+#define RPROTDAT 0x0004
+#define RPROTDIS 0x0008
+#define RPROTNORM 0x0010
+#define RPROTMASK 0x001C
+
+#define SNDZERO 0x001
+#define SNDPIPE 0x002
+
+#define ANYMARK 0x01
+#define LASTMARK 0x02
+
+#define MUXID_ALL (-1)
+
+#define MSG_HIPRI 0x01
+#define MSG_ANY 0x02
+#define MSG_BAND 0x04
+
+#define MORECTL 1
+#define MOREDATA 2
+
+struct bandinfo {
+ unsigned char bi_pri;
+ int bi_flag;
+};
+
+struct strbuf {
+ int maxlen;
+ int len;
+ char *buf;
+};
+
+struct strpeek {
+ struct strbuf ctlbuf;
+ struct strbuf databuf;
+ unsigned flags;
+};
+
+struct strfdinsert {
+ struct strbuf ctlbuf;
+ struct strbuf databuf;
+ unsigned flags;
+ int fildes;
+ int offset;
+};
+
+struct strioctl {
+ int ic_cmd;
+ int ic_timout;
+ int ic_len;
+ char *ic_dp;
+};
+
+struct strrecvfd {
+ int fd;
+ int uid;
+ int gid;
+ char __fill[8];
+};
+
+struct str_mlist {
+ char l_name[FMNAMESZ + 1];
+};
+
+struct str_list {
+ int sl_nmods;
+ struct str_mlist *sl_modlist;
+};
+
+int isastream(int);
+int ioctl(int, int, ...);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/acct.h b/libc-top-half/musl/include/sys/acct.h
new file mode 100644
index 0000000..fae9d05
--- /dev/null
+++ b/libc-top-half/musl/include/sys/acct.h
@@ -0,0 +1,72 @@
+#ifndef _SYS_ACCT_H
+#define _SYS_ACCT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+#include <time.h>
+#include <stdint.h>
+
+#define ACCT_COMM 16
+
+typedef uint16_t comp_t;
+
+struct acct {
+ char ac_flag;
+ uint16_t ac_uid;
+ uint16_t ac_gid;
+ uint16_t ac_tty;
+ uint32_t ac_btime;
+ comp_t ac_utime;
+ comp_t ac_stime;
+ comp_t ac_etime;
+ comp_t ac_mem;
+ comp_t ac_io;
+ comp_t ac_rw;
+ comp_t ac_minflt;
+ comp_t ac_majflt;
+ comp_t ac_swaps;
+ uint32_t ac_exitcode;
+ char ac_comm[ACCT_COMM+1];
+ char ac_pad[10];
+};
+
+
+struct acct_v3 {
+ char ac_flag;
+ char ac_version;
+ uint16_t ac_tty;
+ uint32_t ac_exitcode;
+ uint32_t ac_uid;
+ uint32_t ac_gid;
+ uint32_t ac_pid;
+ uint32_t ac_ppid;
+ uint32_t ac_btime;
+ float ac_etime;
+ comp_t ac_utime;
+ comp_t ac_stime;
+ comp_t ac_mem;
+ comp_t ac_io;
+ comp_t ac_rw;
+ comp_t ac_minflt;
+ comp_t ac_majflt;
+ comp_t ac_swaps;
+ char ac_comm[ACCT_COMM];
+};
+
+#define AFORK 1
+#define ASU 2
+#define ACORE 8
+#define AXSIG 16
+#define ACCT_BYTEORDER (128*(__BYTE_ORDER==__BIG_ENDIAN))
+#define AHZ 100
+
+int acct(const char *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/auxv.h b/libc-top-half/musl/include/sys/auxv.h
new file mode 100644
index 0000000..ddccf57
--- /dev/null
+++ b/libc-top-half/musl/include/sys/auxv.h
@@ -0,0 +1,17 @@
+#ifndef _SYS_AUXV_H
+#define _SYS_AUXV_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <elf.h>
+#include <bits/hwcap.h>
+
+unsigned long getauxval(unsigned long);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/cachectl.h b/libc-top-half/musl/include/sys/cachectl.h
new file mode 100644
index 0000000..f3b896a
--- /dev/null
+++ b/libc-top-half/musl/include/sys/cachectl.h
@@ -0,0 +1,22 @@
+#ifndef _SYS_CACHECTL_H
+#define _SYS_CACHECTL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ICACHE (1<<0)
+#define DCACHE (1<<1)
+#define BCACHE (ICACHE|DCACHE)
+#define CACHEABLE 0
+#define UNCACHEABLE 1
+
+int cachectl(void *, int, int);
+int cacheflush(void *, int, int);
+int _flush_cache(void *, int, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/dir.h b/libc-top-half/musl/include/sys/dir.h
new file mode 100644
index 0000000..9ba1c79
--- /dev/null
+++ b/libc-top-half/musl/include/sys/dir.h
@@ -0,0 +1,2 @@
+#include <dirent.h>
+#define direct dirent
diff --git a/libc-top-half/musl/include/sys/epoll.h b/libc-top-half/musl/include/sys/epoll.h
new file mode 100644
index 0000000..ac81a84
--- /dev/null
+++ b/libc-top-half/musl/include/sys/epoll.h
@@ -0,0 +1,69 @@
+#ifndef _SYS_EPOLL_H
+#define _SYS_EPOLL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+#define __NEED_sigset_t
+
+#include <bits/alltypes.h>
+
+#define EPOLL_CLOEXEC O_CLOEXEC
+#define EPOLL_NONBLOCK O_NONBLOCK
+
+enum EPOLL_EVENTS { __EPOLL_DUMMY };
+#define EPOLLIN 0x001
+#define EPOLLPRI 0x002
+#define EPOLLOUT 0x004
+#define EPOLLRDNORM 0x040
+#define EPOLLNVAL 0x020
+#define EPOLLRDBAND 0x080
+#define EPOLLWRNORM 0x100
+#define EPOLLWRBAND 0x200
+#define EPOLLMSG 0x400
+#define EPOLLERR 0x008
+#define EPOLLHUP 0x010
+#define EPOLLRDHUP 0x2000
+#define EPOLLEXCLUSIVE (1U<<28)
+#define EPOLLWAKEUP (1U<<29)
+#define EPOLLONESHOT (1U<<30)
+#define EPOLLET (1U<<31)
+
+#define EPOLL_CTL_ADD 1
+#define EPOLL_CTL_DEL 2
+#define EPOLL_CTL_MOD 3
+
+typedef union epoll_data {
+ void *ptr;
+ int fd;
+ uint32_t u32;
+ uint64_t u64;
+} epoll_data_t;
+
+struct epoll_event {
+ uint32_t events;
+ epoll_data_t data;
+}
+#ifdef __x86_64__
+__attribute__ ((__packed__))
+#endif
+;
+
+
+int epoll_create(int);
+int epoll_create1(int);
+int epoll_ctl(int, int, int, struct epoll_event *);
+int epoll_wait(int, struct epoll_event *, int, int);
+int epoll_pwait(int, struct epoll_event *, int, int, const sigset_t *);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* sys/epoll.h */
diff --git a/libc-top-half/musl/include/sys/errno.h b/libc-top-half/musl/include/sys/errno.h
new file mode 100644
index 0000000..35a3e5a
--- /dev/null
+++ b/libc-top-half/musl/include/sys/errno.h
@@ -0,0 +1,2 @@
+#warning redirecting incorrect #include <sys/errno.h> to <errno.h>
+#include <errno.h>
diff --git a/libc-top-half/musl/include/sys/eventfd.h b/libc-top-half/musl/include/sys/eventfd.h
new file mode 100644
index 0000000..dc5c88f
--- /dev/null
+++ b/libc-top-half/musl/include/sys/eventfd.h
@@ -0,0 +1,26 @@
+#ifndef _SYS_EVENTFD_H
+#define _SYS_EVENTFD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <fcntl.h>
+
+typedef uint64_t eventfd_t;
+
+#define EFD_SEMAPHORE 1
+#define EFD_CLOEXEC O_CLOEXEC
+#define EFD_NONBLOCK O_NONBLOCK
+
+int eventfd(unsigned int, int);
+int eventfd_read(int, eventfd_t *);
+int eventfd_write(int, eventfd_t);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* sys/eventfd.h */
diff --git a/libc-top-half/musl/include/sys/fanotify.h b/libc-top-half/musl/include/sys/fanotify.h
new file mode 100644
index 0000000..10e5f15
--- /dev/null
+++ b/libc-top-half/musl/include/sys/fanotify.h
@@ -0,0 +1,111 @@
+#ifndef _FANOTIFY_H
+#define _FANOTIFY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/statfs.h>
+
+struct fanotify_event_metadata {
+ unsigned event_len;
+ unsigned char vers;
+ unsigned char reserved;
+ unsigned short metadata_len;
+ unsigned long long mask
+#ifdef __GNUC__
+ __attribute__((__aligned__(8)))
+#endif
+ ;
+ int fd;
+ int pid;
+};
+
+struct fanotify_event_info_header {
+ unsigned char info_type;
+ unsigned char pad;
+ unsigned short len;
+};
+
+struct fanotify_event_info_fid {
+ struct fanotify_event_info_header hdr;
+ fsid_t fsid;
+ unsigned char handle[];
+};
+
+struct fanotify_response {
+ int fd;
+ unsigned response;
+};
+
+#define FAN_ACCESS 0x01
+#define FAN_MODIFY 0x02
+#define FAN_ATTRIB 0x04
+#define FAN_CLOSE_WRITE 0x08
+#define FAN_CLOSE_NOWRITE 0x10
+#define FAN_OPEN 0x20
+#define FAN_MOVED_FROM 0x40
+#define FAN_MOVED_TO 0x80
+#define FAN_CREATE 0x100
+#define FAN_DELETE 0x200
+#define FAN_DELETE_SELF 0x400
+#define FAN_MOVE_SELF 0x800
+#define FAN_OPEN_EXEC 0x1000
+#define FAN_Q_OVERFLOW 0x4000
+#define FAN_OPEN_PERM 0x10000
+#define FAN_ACCESS_PERM 0x20000
+#define FAN_OPEN_EXEC_PERM 0x40000
+#define FAN_DIR_MODIFY 0x00080000
+#define FAN_EVENT_ON_CHILD 0x08000000
+#define FAN_ONDIR 0x40000000
+#define FAN_CLOSE (FAN_CLOSE_WRITE | FAN_CLOSE_NOWRITE)
+#define FAN_MOVE (FAN_MOVED_FROM | FAN_MOVED_TO)
+#define FAN_CLOEXEC 0x01
+#define FAN_NONBLOCK 0x02
+#define FAN_CLASS_NOTIF 0
+#define FAN_CLASS_CONTENT 0x04
+#define FAN_CLASS_PRE_CONTENT 0x08
+#define FAN_ALL_CLASS_BITS (FAN_CLASS_NOTIF | FAN_CLASS_CONTENT | FAN_CLASS_PRE_CONTENT)
+#define FAN_UNLIMITED_QUEUE 0x10
+#define FAN_UNLIMITED_MARKS 0x20
+#define FAN_ENABLE_AUDIT 0x40
+#define FAN_REPORT_TID 0x100
+#define FAN_REPORT_FID 0x200
+#define FAN_REPORT_DIR_FID 0x00000400
+#define FAN_REPORT_NAME 0x00000800
+#define FAN_REPORT_DFID_NAME (FAN_REPORT_DIR_FID | FAN_REPORT_NAME)
+#define FAN_ALL_INIT_FLAGS (FAN_CLOEXEC | FAN_NONBLOCK | FAN_ALL_CLASS_BITS | FAN_UNLIMITED_QUEUE | FAN_UNLIMITED_MARKS)
+#define FAN_MARK_ADD 0x01
+#define FAN_MARK_REMOVE 0x02
+#define FAN_MARK_DONT_FOLLOW 0x04
+#define FAN_MARK_ONLYDIR 0x08
+#define FAN_MARK_IGNORED_MASK 0x20
+#define FAN_MARK_IGNORED_SURV_MODIFY 0x40
+#define FAN_MARK_FLUSH 0x80
+#define FAN_MARK_INODE 0x00
+#define FAN_MARK_MOUNT 0x10
+#define FAN_MARK_FILESYSTEM 0x100
+#define FAN_MARK_TYPE_MASK (FAN_MARK_INODE | FAN_MARK_MOUNT | FAN_MARK_FILESYSTEM)
+#define FAN_ALL_MARK_FLAGS (FAN_MARK_ADD | FAN_MARK_REMOVE | FAN_MARK_DONT_FOLLOW | FAN_MARK_ONLYDIR | FAN_MARK_MOUNT | FAN_MARK_IGNORED_MASK | FAN_MARK_IGNORED_SURV_MODIFY | FAN_MARK_FLUSH)
+#define FAN_ALL_EVENTS (FAN_ACCESS | FAN_MODIFY | FAN_CLOSE | FAN_OPEN)
+#define FAN_ALL_PERM_EVENTS (FAN_OPEN_PERM | FAN_ACCESS_PERM)
+#define FAN_ALL_OUTGOING_EVENTS (FAN_ALL_EVENTS | FAN_ALL_PERM_EVENTS | FAN_Q_OVERFLOW)
+#define FANOTIFY_METADATA_VERSION 3
+#define FAN_EVENT_INFO_TYPE_FID 1
+#define FAN_EVENT_INFO_TYPE_DFID_NAME 2
+#define FAN_EVENT_INFO_TYPE_DFID 3
+#define FAN_ALLOW 0x01
+#define FAN_DENY 0x02
+#define FAN_AUDIT 0x10
+#define FAN_NOFD -1
+#define FAN_EVENT_METADATA_LEN (sizeof(struct fanotify_event_metadata))
+#define FAN_EVENT_NEXT(meta, len) ((len) -= (meta)->event_len, (struct fanotify_event_metadata*)(((char *)(meta)) + (meta)->event_len))
+#define FAN_EVENT_OK(meta, len) ((long)(len) >= (long)FAN_EVENT_METADATA_LEN && (long)(meta)->event_len >= (long)FAN_EVENT_METADATA_LEN && (long)(meta)->event_len <= (long)(len))
+
+int fanotify_init(unsigned, unsigned);
+int fanotify_mark(int, unsigned, unsigned long long, int, const char *);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/fcntl.h b/libc-top-half/musl/include/sys/fcntl.h
new file mode 100644
index 0000000..3dd928e
--- /dev/null
+++ b/libc-top-half/musl/include/sys/fcntl.h
@@ -0,0 +1,2 @@
+#warning redirecting incorrect #include <sys/fcntl.h> to <fcntl.h>
+#include <fcntl.h>
diff --git a/libc-top-half/musl/include/sys/file.h b/libc-top-half/musl/include/sys/file.h
new file mode 100644
index 0000000..4fc83b9
--- /dev/null
+++ b/libc-top-half/musl/include/sys/file.h
@@ -0,0 +1,21 @@
+#ifndef _SYS_FILE_H
+#define _SYS_FILE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define LOCK_SH 1
+#define LOCK_EX 2
+#define LOCK_NB 4
+#define LOCK_UN 8
+
+#define L_SET 0
+#define L_INCR 1
+#define L_XTND 2
+
+int flock(int, int);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/fsuid.h b/libc-top-half/musl/include/sys/fsuid.h
new file mode 100644
index 0000000..c7a9b8f
--- /dev/null
+++ b/libc-top-half/musl/include/sys/fsuid.h
@@ -0,0 +1,20 @@
+#ifndef _SYS_FSUID_H
+#define _SYS_FSUID_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __NEED_uid_t
+#define __NEED_gid_t
+
+#include <bits/alltypes.h>
+
+int setfsuid(uid_t);
+int setfsgid(gid_t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/inotify.h b/libc-top-half/musl/include/sys/inotify.h
new file mode 100644
index 0000000..69b5863
--- /dev/null
+++ b/libc-top-half/musl/include/sys/inotify.h
@@ -0,0 +1,58 @@
+#ifndef _SYS_INOTIFY_H
+#define _SYS_INOTIFY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <fcntl.h>
+
+struct inotify_event {
+ int wd;
+ uint32_t mask, cookie, len;
+ char name[];
+};
+
+#define IN_CLOEXEC O_CLOEXEC
+#define IN_NONBLOCK O_NONBLOCK
+
+#define IN_ACCESS 0x00000001
+#define IN_MODIFY 0x00000002
+#define IN_ATTRIB 0x00000004
+#define IN_CLOSE_WRITE 0x00000008
+#define IN_CLOSE_NOWRITE 0x00000010
+#define IN_CLOSE (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
+#define IN_OPEN 0x00000020
+#define IN_MOVED_FROM 0x00000040
+#define IN_MOVED_TO 0x00000080
+#define IN_MOVE (IN_MOVED_FROM | IN_MOVED_TO)
+#define IN_CREATE 0x00000100
+#define IN_DELETE 0x00000200
+#define IN_DELETE_SELF 0x00000400
+#define IN_MOVE_SELF 0x00000800
+#define IN_ALL_EVENTS 0x00000fff
+
+#define IN_UNMOUNT 0x00002000
+#define IN_Q_OVERFLOW 0x00004000
+#define IN_IGNORED 0x00008000
+
+#define IN_ONLYDIR 0x01000000
+#define IN_DONT_FOLLOW 0x02000000
+#define IN_EXCL_UNLINK 0x04000000
+#define IN_MASK_CREATE 0x10000000
+#define IN_MASK_ADD 0x20000000
+
+#define IN_ISDIR 0x40000000
+#define IN_ONESHOT 0x80000000
+
+int inotify_init(void);
+int inotify_init1(int);
+int inotify_add_watch(int, const char *, uint32_t);
+int inotify_rm_watch(int, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/io.h b/libc-top-half/musl/include/sys/io.h
new file mode 100644
index 0000000..16658ce
--- /dev/null
+++ b/libc-top-half/musl/include/sys/io.h
@@ -0,0 +1,17 @@
+#ifndef _SYS_IO_H
+#define _SYS_IO_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#include <bits/io.h>
+
+int iopl(int);
+int ioperm(unsigned long, unsigned long, int);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/ioctl.h b/libc-top-half/musl/include/sys/ioctl.h
new file mode 100644
index 0000000..cf3acb3
--- /dev/null
+++ b/libc-top-half/musl/include/sys/ioctl.h
@@ -0,0 +1,124 @@
+#ifndef _SYS_IOCTL_H
+#define _SYS_IOCTL_H
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __NEED_struct_winsize
+
+#include <bits/alltypes.h>
+#include <bits/ioctl.h>
+
+#define N_TTY 0
+#define N_SLIP 1
+#define N_MOUSE 2
+#define N_PPP 3
+#define N_STRIP 4
+#define N_AX25 5
+#define N_X25 6
+#define N_6PACK 7
+#define N_MASC 8
+#define N_R3964 9
+#define N_PROFIBUS_FDL 10
+#define N_IRDA 11
+#define N_SMSBLOCK 12
+#define N_HDLC 13
+#define N_SYNC_PPP 14
+#define N_HCI 15
+#define N_GIGASET_M101 16
+#define N_SLCAN 17
+#define N_PPS 18
+#define N_V253 19
+#define N_CAIF 20
+#define N_GSM0710 21
+#define N_TI_WL 22
+#define N_TRACESINK 23
+#define N_TRACEROUTER 24
+#define N_NCI 25
+#define N_SPEAKUP 26
+#define N_NULL 27
+
+#define TIOCPKT_DATA 0
+#define TIOCPKT_FLUSHREAD 1
+#define TIOCPKT_FLUSHWRITE 2
+#define TIOCPKT_STOP 4
+#define TIOCPKT_START 8
+#define TIOCPKT_NOSTOP 16
+#define TIOCPKT_DOSTOP 32
+#define TIOCPKT_IOCTL 64
+
+#define TIOCSER_TEMT 1
+
+#define SIOCADDRT 0x890B
+#define SIOCDELRT 0x890C
+#define SIOCRTMSG 0x890D
+
+#define SIOCGIFNAME 0x8910
+#define SIOCSIFLINK 0x8911
+#define SIOCGIFCONF 0x8912
+#define SIOCGIFFLAGS 0x8913
+#define SIOCSIFFLAGS 0x8914
+#define SIOCGIFADDR 0x8915
+#define SIOCSIFADDR 0x8916
+#define SIOCGIFDSTADDR 0x8917
+#define SIOCSIFDSTADDR 0x8918
+#define SIOCGIFBRDADDR 0x8919
+#define SIOCSIFBRDADDR 0x891a
+#define SIOCGIFNETMASK 0x891b
+#define SIOCSIFNETMASK 0x891c
+#define SIOCGIFMETRIC 0x891d
+#define SIOCSIFMETRIC 0x891e
+#define SIOCGIFMEM 0x891f
+#define SIOCSIFMEM 0x8920
+#define SIOCGIFMTU 0x8921
+#define SIOCSIFMTU 0x8922
+#define SIOCSIFNAME 0x8923
+#define SIOCSIFHWADDR 0x8924
+#define SIOCGIFENCAP 0x8925
+#define SIOCSIFENCAP 0x8926
+#define SIOCGIFHWADDR 0x8927
+#define SIOCGIFSLAVE 0x8929
+#define SIOCSIFSLAVE 0x8930
+#define SIOCADDMULTI 0x8931
+#define SIOCDELMULTI 0x8932
+#define SIOCGIFINDEX 0x8933
+#define SIOGIFINDEX SIOCGIFINDEX
+#define SIOCSIFPFLAGS 0x8934
+#define SIOCGIFPFLAGS 0x8935
+#define SIOCDIFADDR 0x8936
+#define SIOCSIFHWBROADCAST 0x8937
+#define SIOCGIFCOUNT 0x8938
+
+#define SIOCGIFBR 0x8940
+#define SIOCSIFBR 0x8941
+
+#define SIOCGIFTXQLEN 0x8942
+#define SIOCSIFTXQLEN 0x8943
+
+#define SIOCDARP 0x8953
+#define SIOCGARP 0x8954
+#define SIOCSARP 0x8955
+
+#define SIOCDRARP 0x8960
+#define SIOCGRARP 0x8961
+#define SIOCSRARP 0x8962
+
+#define SIOCGIFMAP 0x8970
+#define SIOCSIFMAP 0x8971
+
+#define SIOCADDDLCI 0x8980
+#define SIOCDELDLCI 0x8981
+
+#define SIOCDEVPRIVATE 0x89F0
+#define SIOCPROTOPRIVATE 0x89E0
+
+int ioctl (int, int, ...);
+
+#ifdef __cplusplus
+}
+#endif
+#else
+#include <__header_sys_ioctl.h>
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/ipc.h b/libc-top-half/musl/include/sys/ipc.h
new file mode 100644
index 0000000..9e366b7
--- /dev/null
+++ b/libc-top-half/musl/include/sys/ipc.h
@@ -0,0 +1,42 @@
+#ifndef _SYS_IPC_H
+#define _SYS_IPC_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_uid_t
+#define __NEED_gid_t
+#define __NEED_mode_t
+#define __NEED_key_t
+
+#include <bits/alltypes.h>
+
+#define __ipc_perm_key __key
+#define __ipc_perm_seq __seq
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define __key key
+#define __seq seq
+#endif
+
+#include <bits/ipc.h>
+#include <bits/ipcstat.h>
+
+#define IPC_CREAT 01000
+#define IPC_EXCL 02000
+#define IPC_NOWAIT 04000
+
+#define IPC_RMID 0
+#define IPC_SET 1
+#define IPC_INFO 3
+
+#define IPC_PRIVATE ((key_t) 0)
+
+key_t ftok (const char *, int);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/kd.h b/libc-top-half/musl/include/sys/kd.h
new file mode 100644
index 0000000..42122b9
--- /dev/null
+++ b/libc-top-half/musl/include/sys/kd.h
@@ -0,0 +1 @@
+#include <bits/kd.h>
diff --git a/libc-top-half/musl/include/sys/klog.h b/libc-top-half/musl/include/sys/klog.h
new file mode 100644
index 0000000..aa66684
--- /dev/null
+++ b/libc-top-half/musl/include/sys/klog.h
@@ -0,0 +1,14 @@
+#ifndef _SYS_KLOG_H
+#define _SYS_KLOG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int klogctl (int, char *, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/membarrier.h b/libc-top-half/musl/include/sys/membarrier.h
new file mode 100644
index 0000000..11193ed
--- /dev/null
+++ b/libc-top-half/musl/include/sys/membarrier.h
@@ -0,0 +1,21 @@
+#ifndef _SYS_MEMBARRIER_H
+#define _SYS_MEMBARRIER_H
+
+#define MEMBARRIER_CMD_QUERY 0
+#define MEMBARRIER_CMD_GLOBAL 1
+#define MEMBARRIER_CMD_GLOBAL_EXPEDITED 2
+#define MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED 4
+#define MEMBARRIER_CMD_PRIVATE_EXPEDITED 8
+#define MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED 16
+#define MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE 32
+#define MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE 64
+#define MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ 128
+#define MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ 256
+
+#define MEMBARRIER_CMD_SHARED MEMBARRIER_CMD_GLOBAL
+
+#define MEMBARRIER_CMD_FLAG_CPU 1
+
+int membarrier(int, int);
+
+#endif
diff --git a/libc-top-half/musl/include/sys/mman.h b/libc-top-half/musl/include/sys/mman.h
new file mode 100644
index 0000000..335ba2d
--- /dev/null
+++ b/libc-top-half/musl/include/sys/mman.h
@@ -0,0 +1,157 @@
+#ifndef _WASI_EMULATED_MMAN
+#error "WASI lacks a true mmap; to enable minimal mmap emulation, \
+compile with -D_WASI_EMULATED_MMAN and link with -lwasi-emulated-mman"
+#else
+#ifndef _SYS_MMAN_H
+#define _SYS_MMAN_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_mode_t
+#define __NEED_size_t
+#define __NEED_off_t
+
+#if defined(_GNU_SOURCE)
+#define __NEED_ssize_t
+#endif
+
+#include <bits/alltypes.h>
+
+#define MAP_FAILED ((void *) -1)
+
+#define MAP_SHARED 0x01
+#define MAP_PRIVATE 0x02
+#define MAP_SHARED_VALIDATE 0x03
+#define MAP_TYPE 0x0f
+#define MAP_FIXED 0x10
+#define MAP_ANON 0x20
+#define MAP_ANONYMOUS MAP_ANON
+#define MAP_NORESERVE 0x4000
+#define MAP_GROWSDOWN 0x0100
+#define MAP_DENYWRITE 0x0800
+#define MAP_EXECUTABLE 0x1000
+#define MAP_LOCKED 0x2000
+#define MAP_POPULATE 0x8000
+#define MAP_NONBLOCK 0x10000
+#define MAP_STACK 0x20000
+#define MAP_HUGETLB 0x40000
+#define MAP_SYNC 0x80000
+#define MAP_FIXED_NOREPLACE 0x100000
+#define MAP_FILE 0
+
+#define MAP_HUGE_SHIFT 26
+#define MAP_HUGE_MASK 0x3f
+#define MAP_HUGE_16KB (14 << 26)
+#define MAP_HUGE_64KB (16 << 26)
+#define MAP_HUGE_512KB (19 << 26)
+#define MAP_HUGE_1MB (20 << 26)
+#define MAP_HUGE_2MB (21 << 26)
+#define MAP_HUGE_8MB (23 << 26)
+#define MAP_HUGE_16MB (24 << 26)
+#define MAP_HUGE_32MB (25 << 26)
+#define MAP_HUGE_256MB (28 << 26)
+#define MAP_HUGE_512MB (29 << 26)
+#define MAP_HUGE_1GB (30 << 26)
+#define MAP_HUGE_2GB (31 << 26)
+#define MAP_HUGE_16GB (34U << 26)
+
+#define PROT_NONE 0
+#define PROT_READ 1
+#define PROT_WRITE 2
+#define PROT_EXEC 4
+#define PROT_GROWSDOWN 0x01000000
+#define PROT_GROWSUP 0x02000000
+
+#define MS_ASYNC 1
+#define MS_INVALIDATE 2
+#define MS_SYNC 4
+
+#define MCL_CURRENT 1
+#define MCL_FUTURE 2
+#define MCL_ONFAULT 4
+
+#define POSIX_MADV_NORMAL 0
+#define POSIX_MADV_RANDOM 1
+#define POSIX_MADV_SEQUENTIAL 2
+#define POSIX_MADV_WILLNEED 3
+#define POSIX_MADV_DONTNEED 4
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MADV_NORMAL 0
+#define MADV_RANDOM 1
+#define MADV_SEQUENTIAL 2
+#define MADV_WILLNEED 3
+#define MADV_DONTNEED 4
+#define MADV_FREE 8
+#define MADV_REMOVE 9
+#define MADV_DONTFORK 10
+#define MADV_DOFORK 11
+#define MADV_MERGEABLE 12
+#define MADV_UNMERGEABLE 13
+#define MADV_HUGEPAGE 14
+#define MADV_NOHUGEPAGE 15
+#define MADV_DONTDUMP 16
+#define MADV_DODUMP 17
+#define MADV_WIPEONFORK 18
+#define MADV_KEEPONFORK 19
+#define MADV_COLD 20
+#define MADV_PAGEOUT 21
+#define MADV_HWPOISON 100
+#define MADV_SOFT_OFFLINE 101
+#endif
+
+#ifdef _GNU_SOURCE
+#define MREMAP_MAYMOVE 1
+#define MREMAP_FIXED 2
+#define MREMAP_DONTUNMAP 4
+
+#define MLOCK_ONFAULT 0x01
+
+#define MFD_CLOEXEC 0x0001U
+#define MFD_ALLOW_SEALING 0x0002U
+#define MFD_HUGETLB 0x0004U
+#endif
+
+#include <bits/mman.h>
+
+void *mmap (void *, size_t, int, int, int, off_t);
+int munmap (void *, size_t);
+
+int mprotect (void *, size_t, int);
+int msync (void *, size_t, int);
+
+int posix_madvise (void *, size_t, int);
+
+int mlock (const void *, size_t);
+int munlock (const void *, size_t);
+int mlockall (int);
+int munlockall (void);
+
+#ifdef _GNU_SOURCE
+void *mremap (void *, size_t, size_t, int, ...);
+int remap_file_pages (void *, size_t, int, size_t, int);
+int memfd_create (const char *, unsigned);
+int mlock2 (const void *, size_t, unsigned);
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+int madvise (void *, size_t, int);
+int mincore (void *, size_t, unsigned char *);
+#endif
+
+int shm_open (const char *, int, mode_t);
+int shm_unlink (const char *);
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#define mmap64 mmap
+#define off64_t off_t
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/mount.h b/libc-top-half/musl/include/sys/mount.h
new file mode 100644
index 0000000..09bd6e9
--- /dev/null
+++ b/libc-top-half/musl/include/sys/mount.h
@@ -0,0 +1,75 @@
+#ifndef _SYS_MOUNT_H
+#define _SYS_MOUNT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/ioctl.h>
+
+#define BLKROSET _IO(0x12, 93)
+#define BLKROGET _IO(0x12, 94)
+#define BLKRRPART _IO(0x12, 95)
+#define BLKGETSIZE _IO(0x12, 96)
+#define BLKFLSBUF _IO(0x12, 97)
+#define BLKRASET _IO(0x12, 98)
+#define BLKRAGET _IO(0x12, 99)
+#define BLKFRASET _IO(0x12,100)
+#define BLKFRAGET _IO(0x12,101)
+#define BLKSECTSET _IO(0x12,102)
+#define BLKSECTGET _IO(0x12,103)
+#define BLKSSZGET _IO(0x12,104)
+#define BLKBSZGET _IOR(0x12,112,size_t)
+#define BLKBSZSET _IOW(0x12,113,size_t)
+#define BLKGETSIZE64 _IOR(0x12,114,size_t)
+
+#define MS_RDONLY 1
+#define MS_NOSUID 2
+#define MS_NODEV 4
+#define MS_NOEXEC 8
+#define MS_SYNCHRONOUS 16
+#define MS_REMOUNT 32
+#define MS_MANDLOCK 64
+#define MS_DIRSYNC 128
+#define MS_NOSYMFOLLOW 256
+#define MS_NOATIME 1024
+#define MS_NODIRATIME 2048
+#define MS_BIND 4096
+#define MS_MOVE 8192
+#define MS_REC 16384
+#define MS_SILENT 32768
+#define MS_POSIXACL (1<<16)
+#define MS_UNBINDABLE (1<<17)
+#define MS_PRIVATE (1<<18)
+#define MS_SLAVE (1<<19)
+#define MS_SHARED (1<<20)
+#define MS_RELATIME (1<<21)
+#define MS_KERNMOUNT (1<<22)
+#define MS_I_VERSION (1<<23)
+#define MS_STRICTATIME (1<<24)
+#define MS_LAZYTIME (1<<25)
+#define MS_NOREMOTELOCK (1<<27)
+#define MS_NOSEC (1<<28)
+#define MS_BORN (1<<29)
+#define MS_ACTIVE (1<<30)
+#define MS_NOUSER (1U<<31)
+
+#define MS_RMT_MASK (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_I_VERSION|MS_LAZYTIME)
+
+#define MS_MGC_VAL 0xc0ed0000
+#define MS_MGC_MSK 0xffff0000
+
+#define MNT_FORCE 1
+#define MNT_DETACH 2
+#define MNT_EXPIRE 4
+#define UMOUNT_NOFOLLOW 8
+
+int mount(const char *, const char *, const char *, unsigned long, const void *);
+int umount(const char *);
+int umount2(const char *, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/msg.h b/libc-top-half/musl/include/sys/msg.h
new file mode 100644
index 0000000..db5c62a
--- /dev/null
+++ b/libc-top-half/musl/include/sys/msg.h
@@ -0,0 +1,53 @@
+#ifndef _SYS_MSG_H
+#define _SYS_MSG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/ipc.h>
+
+#define __NEED_pid_t
+#define __NEED_key_t
+#define __NEED_time_t
+#define __NEED_size_t
+#define __NEED_ssize_t
+
+#include <bits/alltypes.h>
+
+typedef unsigned long msgqnum_t;
+typedef unsigned long msglen_t;
+
+#include <bits/msg.h>
+
+#define __msg_cbytes msg_cbytes
+
+#define MSG_NOERROR 010000
+#define MSG_EXCEPT 020000
+
+#define MSG_STAT (11 | (IPC_STAT & 0x100))
+#define MSG_INFO 12
+#define MSG_STAT_ANY (13 | (IPC_STAT & 0x100))
+
+struct msginfo {
+ int msgpool, msgmap, msgmax, msgmnb, msgmni, msgssz, msgtql;
+ unsigned short msgseg;
+};
+
+int msgctl (int, int, struct msqid_ds *);
+int msgget (key_t, int);
+ssize_t msgrcv (int, void *, size_t, long, int);
+int msgsnd (int, const void *, size_t, int);
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+struct msgbuf {
+ long mtype;
+ char mtext[1];
+};
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/mtio.h b/libc-top-half/musl/include/sys/mtio.h
new file mode 100644
index 0000000..f16a529
--- /dev/null
+++ b/libc-top-half/musl/include/sys/mtio.h
@@ -0,0 +1,188 @@
+#ifndef _SYS_MTIO_H
+#define _SYS_MTIO_H
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+struct mtop {
+ short mt_op;
+ int mt_count;
+};
+
+#define _IOT_mtop _IOT (_IOTS (short), 1, _IOTS (int), 1, 0, 0)
+#define _IOT_mtget _IOT (_IOTS (long), 7, 0, 0, 0, 0)
+#define _IOT_mtpos _IOT_SIMPLE (long)
+#define _IOT_mtconfiginfo _IOT (_IOTS (long), 2, _IOTS (short), 3, _IOTS (long), 1)
+
+
+#define MTRESET 0
+#define MTFSF 1
+#define MTBSF 2
+#define MTFSR 3
+#define MTBSR 4
+#define MTWEOF 5
+#define MTREW 6
+#define MTOFFL 7
+#define MTNOP 8
+#define MTRETEN 9
+#define MTBSFM 10
+#define MTFSFM 11
+#define MTEOM 12
+#define MTERASE 13
+#define MTRAS1 14
+#define MTRAS2 15
+#define MTRAS3 16
+#define MTSETBLK 20
+#define MTSETDENSITY 21
+#define MTSEEK 22
+#define MTTELL 23
+#define MTSETDRVBUFFER 24
+#define MTFSS 25
+#define MTBSS 26
+#define MTWSM 27
+#define MTLOCK 28
+#define MTUNLOCK 29
+#define MTLOAD 30
+#define MTUNLOAD 31
+#define MTCOMPRESSION 32
+#define MTSETPART 33
+#define MTMKPART 34
+
+struct mtget {
+ long mt_type;
+ long mt_resid;
+ long mt_dsreg;
+ long mt_gstat;
+ long mt_erreg;
+ int mt_fileno;
+ int mt_blkno;
+};
+
+#define MT_ISUNKNOWN 0x01
+#define MT_ISQIC02 0x02
+#define MT_ISWT5150 0x03
+#define MT_ISARCHIVE_5945L2 0x04
+#define MT_ISCMSJ500 0x05
+#define MT_ISTDC3610 0x06
+#define MT_ISARCHIVE_VP60I 0x07
+#define MT_ISARCHIVE_2150L 0x08
+#define MT_ISARCHIVE_2060L 0x09
+#define MT_ISARCHIVESC499 0x0A
+#define MT_ISQIC02_ALL_FEATURES 0x0F
+#define MT_ISWT5099EEN24 0x11
+#define MT_ISTEAC_MT2ST 0x12
+#define MT_ISEVEREX_FT40A 0x32
+#define MT_ISDDS1 0x51
+#define MT_ISDDS2 0x52
+#define MT_ISSCSI1 0x71
+#define MT_ISSCSI2 0x72
+#define MT_ISFTAPE_UNKNOWN 0x800000
+#define MT_ISFTAPE_FLAG 0x800000
+
+struct mt_tape_info {
+ long t_type;
+ char *t_name;
+};
+
+#define MT_TAPE_INFO \
+{ \
+ {MT_ISUNKNOWN, "Unknown type of tape device"}, \
+ {MT_ISQIC02, "Generic QIC-02 tape streamer"}, \
+ {MT_ISWT5150, "Wangtek 5150, QIC-150"}, \
+ {MT_ISARCHIVE_5945L2, "Archive 5945L-2"}, \
+ {MT_ISCMSJ500, "CMS Jumbo 500"}, \
+ {MT_ISTDC3610, "Tandberg TDC 3610, QIC-24"}, \
+ {MT_ISARCHIVE_VP60I, "Archive VP60i, QIC-02"}, \
+ {MT_ISARCHIVE_2150L, "Archive Viper 2150L"}, \
+ {MT_ISARCHIVE_2060L, "Archive Viper 2060L"}, \
+ {MT_ISARCHIVESC499, "Archive SC-499 QIC-36 controller"}, \
+ {MT_ISQIC02_ALL_FEATURES, "Generic QIC-02 tape, all features"}, \
+ {MT_ISWT5099EEN24, "Wangtek 5099-een24, 60MB"}, \
+ {MT_ISTEAC_MT2ST, "Teac MT-2ST 155mb data cassette drive"}, \
+ {MT_ISEVEREX_FT40A, "Everex FT40A, QIC-40"}, \
+ {MT_ISSCSI1, "Generic SCSI-1 tape"}, \
+ {MT_ISSCSI2, "Generic SCSI-2 tape"}, \
+ {0, 0} \
+}
+
+struct mtpos {
+ long mt_blkno;
+};
+
+struct mtconfiginfo {
+ long mt_type;
+ long ifc_type;
+ unsigned short irqnr;
+ unsigned short dmanr;
+ unsigned short port;
+ unsigned long debug;
+ unsigned have_dens:1;
+ unsigned have_bsf:1;
+ unsigned have_fsr:1;
+ unsigned have_bsr:1;
+ unsigned have_eod:1;
+ unsigned have_seek:1;
+ unsigned have_tell:1;
+ unsigned have_ras1:1;
+ unsigned have_ras2:1;
+ unsigned have_ras3:1;
+ unsigned have_qfa:1;
+ unsigned pad1:5;
+ char reserved[10];
+};
+
+#define MTIOCTOP _IOW('m', 1, struct mtop)
+#define MTIOCGET _IOR('m', 2, struct mtget)
+#define MTIOCPOS _IOR('m', 3, struct mtpos)
+
+#define MTIOCGETCONFIG _IOR('m', 4, struct mtconfiginfo)
+#define MTIOCSETCONFIG _IOW('m', 5, struct mtconfiginfo)
+
+#define GMT_EOF(x) ((x) & 0x80000000)
+#define GMT_BOT(x) ((x) & 0x40000000)
+#define GMT_EOT(x) ((x) & 0x20000000)
+#define GMT_SM(x) ((x) & 0x10000000)
+#define GMT_EOD(x) ((x) & 0x08000000)
+#define GMT_WR_PROT(x) ((x) & 0x04000000)
+#define GMT_ONLINE(x) ((x) & 0x01000000)
+#define GMT_D_6250(x) ((x) & 0x00800000)
+#define GMT_D_1600(x) ((x) & 0x00400000)
+#define GMT_D_800(x) ((x) & 0x00200000)
+#define GMT_DR_OPEN(x) ((x) & 0x00040000)
+#define GMT_IM_REP_EN(x) ((x) & 0x00010000)
+
+#define MT_ST_BLKSIZE_SHIFT 0
+#define MT_ST_BLKSIZE_MASK 0xffffff
+#define MT_ST_DENSITY_SHIFT 24
+#define MT_ST_DENSITY_MASK 0xff000000
+#define MT_ST_SOFTERR_SHIFT 0
+#define MT_ST_SOFTERR_MASK 0xffff
+#define MT_ST_OPTIONS 0xf0000000
+#define MT_ST_BOOLEANS 0x10000000
+#define MT_ST_SETBOOLEANS 0x30000000
+#define MT_ST_CLEARBOOLEANS 0x40000000
+#define MT_ST_WRITE_THRESHOLD 0x20000000
+#define MT_ST_DEF_BLKSIZE 0x50000000
+#define MT_ST_DEF_OPTIONS 0x60000000
+#define MT_ST_BUFFER_WRITES 0x1
+#define MT_ST_ASYNC_WRITES 0x2
+#define MT_ST_READ_AHEAD 0x4
+#define MT_ST_DEBUGGING 0x8
+#define MT_ST_TWO_FM 0x10
+#define MT_ST_FAST_MTEOM 0x20
+#define MT_ST_AUTO_LOCK 0x40
+#define MT_ST_DEF_WRITES 0x80
+#define MT_ST_CAN_BSR 0x100
+#define MT_ST_NO_BLKLIMS 0x200
+#define MT_ST_CAN_PARTITIONS 0x400
+#define MT_ST_SCSI2LOGICAL 0x800
+#define MT_ST_CLEAR_DEFAULT 0xfffff
+#define MT_ST_DEF_DENSITY (MT_ST_DEF_OPTIONS | 0x100000)
+#define MT_ST_DEF_COMPRESSION (MT_ST_DEF_OPTIONS | 0x200000)
+#define MT_ST_DEF_DRVBUFFER (MT_ST_DEF_OPTIONS | 0x300000)
+#define MT_ST_HPLOADER_OFFSET 10000
+#ifndef DEFTAPE
+# define DEFTAPE "/dev/tape"
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/param.h b/libc-top-half/musl/include/sys/param.h
new file mode 100644
index 0000000..0141172
--- /dev/null
+++ b/libc-top-half/musl/include/sys/param.h
@@ -0,0 +1,37 @@
+#ifndef _SYS_PARAM_H
+#define _SYS_PARAM_H
+
+#define MAXSYMLINKS 20
+#define MAXHOSTNAMELEN 64
+#define MAXNAMLEN 255
+#define MAXPATHLEN 4096
+#define NBBY 8
+#define NGROUPS 32
+#define CANBSIZ 255
+#define NOFILE 256
+#define NCARGS 131072
+#define DEV_BSIZE 512
+#define NOGROUP (-1)
+
+#undef MIN
+#undef MAX
+#define MIN(a,b) (((a)<(b))?(a):(b))
+#define MAX(a,b) (((a)>(b))?(a):(b))
+
+#define __bitop(x,i,o) ((x)[(i)/8] o (1<<(i)%8))
+#define setbit(x,i) __bitop(x,i,|=)
+#define clrbit(x,i) __bitop(x,i,&=~)
+#define isset(x,i) __bitop(x,i,&)
+#define isclr(x,i) !isset(x,i)
+
+#define howmany(n,d) (((n)+((d)-1))/(d))
+#define roundup(n,d) (howmany(n,d)*(d))
+#define powerof2(n) !(((n)-1) & (n))
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_WASI_EMULATED_PROCESS_CLOCKS)
+#include <sys/resource.h>
+#endif
+#include <endian.h>
+#include <limits.h>
+
+#endif
diff --git a/libc-top-half/musl/include/sys/personality.h b/libc-top-half/musl/include/sys/personality.h
new file mode 100644
index 0000000..411dc47
--- /dev/null
+++ b/libc-top-half/musl/include/sys/personality.h
@@ -0,0 +1,49 @@
+#ifndef _PERSONALITY_H
+#define _PERSONALITY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UNAME26 0x0020000
+#define ADDR_NO_RANDOMIZE 0x0040000
+#define FDPIC_FUNCPTRS 0x0080000
+#define MMAP_PAGE_ZERO 0x0100000
+#define ADDR_COMPAT_LAYOUT 0x0200000
+#define READ_IMPLIES_EXEC 0x0400000
+#define ADDR_LIMIT_32BIT 0x0800000
+#define SHORT_INODE 0x1000000
+#define WHOLE_SECONDS 0x2000000
+#define STICKY_TIMEOUTS 0x4000000
+#define ADDR_LIMIT_3GB 0x8000000
+
+#define PER_LINUX 0
+#define PER_LINUX_32BIT ADDR_LIMIT_32BIT
+#define PER_LINUX_FDPIC FDPIC_FUNCPTRS
+#define PER_SVR4 (1 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO)
+#define PER_SVR3 (2 | STICKY_TIMEOUTS | SHORT_INODE)
+#define PER_SCOSVR3 (3 | STICKY_TIMEOUTS | WHOLE_SECONDS | SHORT_INODE)
+#define PER_OSR5 (3 | STICKY_TIMEOUTS | WHOLE_SECONDS)
+#define PER_WYSEV386 (4 | STICKY_TIMEOUTS | SHORT_INODE)
+#define PER_ISCR4 (5 | STICKY_TIMEOUTS)
+#define PER_BSD 6
+#define PER_SUNOS (6 | STICKY_TIMEOUTS)
+#define PER_XENIX (7 | STICKY_TIMEOUTS | SHORT_INODE)
+#define PER_LINUX32 8
+#define PER_LINUX32_3GB (8 | ADDR_LIMIT_3GB)
+#define PER_IRIX32 (9 | STICKY_TIMEOUTS)
+#define PER_IRIXN32 (0xa | STICKY_TIMEOUTS)
+#define PER_IRIX64 (0x0b | STICKY_TIMEOUTS)
+#define PER_RISCOS 0xc
+#define PER_SOLARIS (0xd | STICKY_TIMEOUTS)
+#define PER_UW7 (0xe | STICKY_TIMEOUTS | MMAP_PAGE_ZERO)
+#define PER_OSF4 0xf
+#define PER_HPUX 0x10
+#define PER_MASK 0xff
+
+int personality(unsigned long);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/poll.h b/libc-top-half/musl/include/sys/poll.h
new file mode 100644
index 0000000..9917040
--- /dev/null
+++ b/libc-top-half/musl/include/sys/poll.h
@@ -0,0 +1,2 @@
+#warning redirecting incorrect #include <sys/poll.h> to <poll.h>
+#include <poll.h>
diff --git a/libc-top-half/musl/include/sys/prctl.h b/libc-top-half/musl/include/sys/prctl.h
new file mode 100644
index 0000000..087a75c
--- /dev/null
+++ b/libc-top-half/musl/include/sys/prctl.h
@@ -0,0 +1,186 @@
+#ifndef _SYS_PRCTL_H
+#define _SYS_PRCTL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#define PR_SET_PDEATHSIG 1
+#define PR_GET_PDEATHSIG 2
+#define PR_GET_DUMPABLE 3
+#define PR_SET_DUMPABLE 4
+#define PR_GET_UNALIGN 5
+#define PR_SET_UNALIGN 6
+#define PR_UNALIGN_NOPRINT 1
+#define PR_UNALIGN_SIGBUS 2
+#define PR_GET_KEEPCAPS 7
+#define PR_SET_KEEPCAPS 8
+#define PR_GET_FPEMU 9
+#define PR_SET_FPEMU 10
+#define PR_FPEMU_NOPRINT 1
+#define PR_FPEMU_SIGFPE 2
+#define PR_GET_FPEXC 11
+#define PR_SET_FPEXC 12
+#define PR_FP_EXC_SW_ENABLE 0x80
+#define PR_FP_EXC_DIV 0x010000
+#define PR_FP_EXC_OVF 0x020000
+#define PR_FP_EXC_UND 0x040000
+#define PR_FP_EXC_RES 0x080000
+#define PR_FP_EXC_INV 0x100000
+#define PR_FP_EXC_DISABLED 0
+#define PR_FP_EXC_NONRECOV 1
+#define PR_FP_EXC_ASYNC 2
+#define PR_FP_EXC_PRECISE 3
+#define PR_GET_TIMING 13
+#define PR_SET_TIMING 14
+#define PR_TIMING_STATISTICAL 0
+#define PR_TIMING_TIMESTAMP 1
+#define PR_SET_NAME 15
+#define PR_GET_NAME 16
+#define PR_GET_ENDIAN 19
+#define PR_SET_ENDIAN 20
+#define PR_ENDIAN_BIG 0
+#define PR_ENDIAN_LITTLE 1
+#define PR_ENDIAN_PPC_LITTLE 2
+#define PR_GET_SECCOMP 21
+#define PR_SET_SECCOMP 22
+#define PR_CAPBSET_READ 23
+#define PR_CAPBSET_DROP 24
+#define PR_GET_TSC 25
+#define PR_SET_TSC 26
+#define PR_TSC_ENABLE 1
+#define PR_TSC_SIGSEGV 2
+#define PR_GET_SECUREBITS 27
+#define PR_SET_SECUREBITS 28
+#define PR_SET_TIMERSLACK 29
+#define PR_GET_TIMERSLACK 30
+
+#define PR_TASK_PERF_EVENTS_DISABLE 31
+#define PR_TASK_PERF_EVENTS_ENABLE 32
+
+#define PR_MCE_KILL 33
+#define PR_MCE_KILL_CLEAR 0
+#define PR_MCE_KILL_SET 1
+#define PR_MCE_KILL_LATE 0
+#define PR_MCE_KILL_EARLY 1
+#define PR_MCE_KILL_DEFAULT 2
+#define PR_MCE_KILL_GET 34
+
+#define PR_SET_MM 35
+#define PR_SET_MM_START_CODE 1
+#define PR_SET_MM_END_CODE 2
+#define PR_SET_MM_START_DATA 3
+#define PR_SET_MM_END_DATA 4
+#define PR_SET_MM_START_STACK 5
+#define PR_SET_MM_START_BRK 6
+#define PR_SET_MM_BRK 7
+#define PR_SET_MM_ARG_START 8
+#define PR_SET_MM_ARG_END 9
+#define PR_SET_MM_ENV_START 10
+#define PR_SET_MM_ENV_END 11
+#define PR_SET_MM_AUXV 12
+#define PR_SET_MM_EXE_FILE 13
+#define PR_SET_MM_MAP 14
+#define PR_SET_MM_MAP_SIZE 15
+
+struct prctl_mm_map {
+ uint64_t start_code;
+ uint64_t end_code;
+ uint64_t start_data;
+ uint64_t end_data;
+ uint64_t start_brk;
+ uint64_t brk;
+ uint64_t start_stack;
+ uint64_t arg_start;
+ uint64_t arg_end;
+ uint64_t env_start;
+ uint64_t env_end;
+ uint64_t *auxv;
+ uint32_t auxv_size;
+ uint32_t exe_fd;
+};
+
+#define PR_SET_PTRACER 0x59616d61
+#define PR_SET_PTRACER_ANY (-1UL)
+
+#define PR_SET_CHILD_SUBREAPER 36
+#define PR_GET_CHILD_SUBREAPER 37
+
+#define PR_SET_NO_NEW_PRIVS 38
+#define PR_GET_NO_NEW_PRIVS 39
+
+#define PR_GET_TID_ADDRESS 40
+
+#define PR_SET_THP_DISABLE 41
+#define PR_GET_THP_DISABLE 42
+
+#define PR_MPX_ENABLE_MANAGEMENT 43
+#define PR_MPX_DISABLE_MANAGEMENT 44
+
+#define PR_SET_FP_MODE 45
+#define PR_GET_FP_MODE 46
+#define PR_FP_MODE_FR (1 << 0)
+#define PR_FP_MODE_FRE (1 << 1)
+
+#define PR_CAP_AMBIENT 47
+#define PR_CAP_AMBIENT_IS_SET 1
+#define PR_CAP_AMBIENT_RAISE 2
+#define PR_CAP_AMBIENT_LOWER 3
+#define PR_CAP_AMBIENT_CLEAR_ALL 4
+
+#define PR_SVE_SET_VL 50
+#define PR_SVE_SET_VL_ONEXEC (1 << 18)
+#define PR_SVE_GET_VL 51
+#define PR_SVE_VL_LEN_MASK 0xffff
+#define PR_SVE_VL_INHERIT (1 << 17)
+
+#define PR_GET_SPECULATION_CTRL 52
+#define PR_SET_SPECULATION_CTRL 53
+#define PR_SPEC_STORE_BYPASS 0
+#define PR_SPEC_INDIRECT_BRANCH 1
+#define PR_SPEC_NOT_AFFECTED 0
+#define PR_SPEC_PRCTL (1UL << 0)
+#define PR_SPEC_ENABLE (1UL << 1)
+#define PR_SPEC_DISABLE (1UL << 2)
+#define PR_SPEC_FORCE_DISABLE (1UL << 3)
+#define PR_SPEC_DISABLE_NOEXEC (1UL << 4)
+
+#define PR_PAC_RESET_KEYS 54
+#define PR_PAC_APIAKEY (1UL << 0)
+#define PR_PAC_APIBKEY (1UL << 1)
+#define PR_PAC_APDAKEY (1UL << 2)
+#define PR_PAC_APDBKEY (1UL << 3)
+#define PR_PAC_APGAKEY (1UL << 4)
+
+#define PR_SET_TAGGED_ADDR_CTRL 55
+#define PR_GET_TAGGED_ADDR_CTRL 56
+#define PR_TAGGED_ADDR_ENABLE (1UL << 0)
+#define PR_MTE_TCF_SHIFT 1
+#define PR_MTE_TCF_NONE (0UL << 1)
+#define PR_MTE_TCF_SYNC (1UL << 1)
+#define PR_MTE_TCF_ASYNC (2UL << 1)
+#define PR_MTE_TCF_MASK (3UL << 1)
+#define PR_MTE_TAG_SHIFT 3
+#define PR_MTE_TAG_MASK (0xffffUL << 3)
+
+#define PR_SET_IO_FLUSHER 57
+#define PR_GET_IO_FLUSHER 58
+
+#define PR_SET_SYSCALL_USER_DISPATCH 59
+#define PR_SYS_DISPATCH_OFF 0
+#define PR_SYS_DISPATCH_ON 1
+#define SYSCALL_DISPATCH_FILTER_ALLOW 0
+#define SYSCALL_DISPATCH_FILTER_BLOCK 1
+
+#define PR_PAC_SET_ENABLED_KEYS 60
+#define PR_PAC_GET_ENABLED_KEYS 61
+
+int prctl (int, ...);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/procfs.h b/libc-top-half/musl/include/sys/procfs.h
new file mode 100644
index 0000000..38e58c1
--- /dev/null
+++ b/libc-top-half/musl/include/sys/procfs.h
@@ -0,0 +1,63 @@
+#ifndef _SYS_PROCFS_H
+#define _SYS_PROCFS_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/user.h>
+
+struct elf_siginfo {
+ int si_signo;
+ int si_code;
+ int si_errno;
+};
+
+struct elf_prstatus {
+ struct elf_siginfo pr_info;
+ short int pr_cursig;
+ unsigned long int pr_sigpend;
+ unsigned long int pr_sighold;
+ pid_t pr_pid;
+ pid_t pr_ppid;
+ pid_t pr_pgrp;
+ pid_t pr_sid;
+ struct {
+ long tv_sec, tv_usec;
+ } pr_utime, pr_stime, pr_cutime, pr_cstime;
+ elf_gregset_t pr_reg;
+ int pr_fpvalid;
+};
+
+#define ELF_PRARGSZ 80
+
+struct elf_prpsinfo {
+ char pr_state;
+ char pr_sname;
+ char pr_zomb;
+ char pr_nice;
+ unsigned long int pr_flag;
+#if UINTPTR_MAX == 0xffffffff
+ unsigned short int pr_uid;
+ unsigned short int pr_gid;
+#else
+ unsigned int pr_uid;
+ unsigned int pr_gid;
+#endif
+ int pr_pid, pr_ppid, pr_pgrp, pr_sid;
+ char pr_fname[16];
+ char pr_psargs[ELF_PRARGSZ];
+};
+
+typedef void *psaddr_t;
+typedef elf_gregset_t prgregset_t;
+typedef elf_fpregset_t prfpregset_t;
+typedef pid_t lwpid_t;
+typedef struct elf_prstatus prstatus_t;
+typedef struct elf_prpsinfo prpsinfo_t;
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/ptrace.h b/libc-top-half/musl/include/sys/ptrace.h
new file mode 100644
index 0000000..c72e3c0
--- /dev/null
+++ b/libc-top-half/musl/include/sys/ptrace.h
@@ -0,0 +1,147 @@
+#ifndef _SYS_PTRACE_H
+#define _SYS_PTRACE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#define PTRACE_TRACEME 0
+#define PT_TRACE_ME PTRACE_TRACEME
+
+#define PTRACE_PEEKTEXT 1
+#define PTRACE_PEEKDATA 2
+#define PTRACE_PEEKUSER 3
+#define PTRACE_POKETEXT 4
+#define PTRACE_POKEDATA 5
+#define PTRACE_POKEUSER 6
+#define PTRACE_CONT 7
+#define PTRACE_KILL 8
+#define PTRACE_SINGLESTEP 9
+#define PTRACE_GETREGS 12
+#define PTRACE_SETREGS 13
+#define PTRACE_GETFPREGS 14
+#define PTRACE_SETFPREGS 15
+#define PTRACE_ATTACH 16
+#define PTRACE_DETACH 17
+#define PTRACE_GETFPXREGS 18
+#define PTRACE_SETFPXREGS 19
+#define PTRACE_SYSCALL 24
+#define PTRACE_SETOPTIONS 0x4200
+#define PTRACE_GETEVENTMSG 0x4201
+#define PTRACE_GETSIGINFO 0x4202
+#define PTRACE_SETSIGINFO 0x4203
+#define PTRACE_GETREGSET 0x4204
+#define PTRACE_SETREGSET 0x4205
+#define PTRACE_SEIZE 0x4206
+#define PTRACE_INTERRUPT 0x4207
+#define PTRACE_LISTEN 0x4208
+#define PTRACE_PEEKSIGINFO 0x4209
+#define PTRACE_GETSIGMASK 0x420a
+#define PTRACE_SETSIGMASK 0x420b
+#define PTRACE_SECCOMP_GET_FILTER 0x420c
+#define PTRACE_SECCOMP_GET_METADATA 0x420d
+#define PTRACE_GET_SYSCALL_INFO 0x420e
+#define PTRACE_GET_RSEQ_CONFIGURATION 0x420f
+
+#define PT_READ_I PTRACE_PEEKTEXT
+#define PT_READ_D PTRACE_PEEKDATA
+#define PT_READ_U PTRACE_PEEKUSER
+#define PT_WRITE_I PTRACE_POKETEXT
+#define PT_WRITE_D PTRACE_POKEDATA
+#define PT_WRITE_U PTRACE_POKEUSER
+#define PT_CONTINUE PTRACE_CONT
+#define PT_KILL PTRACE_KILL
+#define PT_STEP PTRACE_SINGLESTEP
+#define PT_GETREGS PTRACE_GETREGS
+#define PT_SETREGS PTRACE_SETREGS
+#define PT_GETFPREGS PTRACE_GETFPREGS
+#define PT_SETFPREGS PTRACE_SETFPREGS
+#define PT_ATTACH PTRACE_ATTACH
+#define PT_DETACH PTRACE_DETACH
+#define PT_GETFPXREGS PTRACE_GETFPXREGS
+#define PT_SETFPXREGS PTRACE_SETFPXREGS
+#define PT_SYSCALL PTRACE_SYSCALL
+#define PT_SETOPTIONS PTRACE_SETOPTIONS
+#define PT_GETEVENTMSG PTRACE_GETEVENTMSG
+#define PT_GETSIGINFO PTRACE_GETSIGINFO
+#define PT_SETSIGINFO PTRACE_SETSIGINFO
+
+#define PTRACE_O_TRACESYSGOOD 0x00000001
+#define PTRACE_O_TRACEFORK 0x00000002
+#define PTRACE_O_TRACEVFORK 0x00000004
+#define PTRACE_O_TRACECLONE 0x00000008
+#define PTRACE_O_TRACEEXEC 0x00000010
+#define PTRACE_O_TRACEVFORKDONE 0x00000020
+#define PTRACE_O_TRACEEXIT 0x00000040
+#define PTRACE_O_TRACESECCOMP 0x00000080
+#define PTRACE_O_EXITKILL 0x00100000
+#define PTRACE_O_SUSPEND_SECCOMP 0x00200000
+#define PTRACE_O_MASK 0x003000ff
+
+#define PTRACE_EVENT_FORK 1
+#define PTRACE_EVENT_VFORK 2
+#define PTRACE_EVENT_CLONE 3
+#define PTRACE_EVENT_EXEC 4
+#define PTRACE_EVENT_VFORK_DONE 5
+#define PTRACE_EVENT_EXIT 6
+#define PTRACE_EVENT_SECCOMP 7
+#define PTRACE_EVENT_STOP 128
+
+#define PTRACE_PEEKSIGINFO_SHARED 1
+
+#define PTRACE_SYSCALL_INFO_NONE 0
+#define PTRACE_SYSCALL_INFO_ENTRY 1
+#define PTRACE_SYSCALL_INFO_EXIT 2
+#define PTRACE_SYSCALL_INFO_SECCOMP 3
+
+#include <bits/ptrace.h>
+
+struct __ptrace_peeksiginfo_args {
+ uint64_t off;
+ uint32_t flags;
+ int32_t nr;
+};
+
+struct __ptrace_seccomp_metadata {
+ uint64_t filter_off;
+ uint64_t flags;
+};
+
+struct __ptrace_syscall_info {
+ uint8_t op;
+ uint8_t __pad[3];
+ uint32_t arch;
+ uint64_t instruction_pointer;
+ uint64_t stack_pointer;
+ union {
+ struct {
+ uint64_t nr;
+ uint64_t args[6];
+ } entry;
+ struct {
+ int64_t rval;
+ uint8_t is_error;
+ } exit;
+ struct {
+ uint64_t nr;
+ uint64_t args[6];
+ uint32_t ret_data;
+ } seccomp;
+ };
+};
+
+struct __ptrace_rseq_configuration {
+ uint64_t rseq_abi_pointer;
+ uint32_t rseq_abi_size;
+ uint32_t signature;
+ uint32_t flags;
+ uint32_t pad;
+};
+
+long ptrace(int, ...);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/quota.h b/libc-top-half/musl/include/sys/quota.h
new file mode 100644
index 0000000..3ed7378
--- /dev/null
+++ b/libc-top-half/musl/include/sys/quota.h
@@ -0,0 +1,102 @@
+#ifndef _SYS_QUOTA_H
+#define _SYS_QUOTA_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#define _LINUX_QUOTA_VERSION 2
+
+#define dbtob(num) ((num) << 10)
+#define btodb(num) ((num) >> 10)
+#define fs_to_dq_blocks(num, blksize) (((num) * (blksize)) / 1024)
+
+#define MAX_IQ_TIME 604800
+#define MAX_DQ_TIME 604800
+
+#define MAXQUOTAS 2
+#define USRQUOTA 0
+#define GRPQUOTA 1
+
+#define INITQFNAMES { "user", "group", "undefined" };
+
+#define QUOTAFILENAME "quota"
+#define QUOTAGROUP "staff"
+
+#define NR_DQHASH 43
+#define NR_DQUOTS 256
+
+#define SUBCMDMASK 0x00ff
+#define SUBCMDSHIFT 8
+#define QCMD(cmd, type) (((cmd) << SUBCMDSHIFT) | ((type) & SUBCMDMASK))
+
+#define Q_SYNC 0x800001
+#define Q_QUOTAON 0x800002
+#define Q_QUOTAOFF 0x800003
+#define Q_GETFMT 0x800004
+#define Q_GETINFO 0x800005
+#define Q_SETINFO 0x800006
+#define Q_GETQUOTA 0x800007
+#define Q_SETQUOTA 0x800008
+
+#define QFMT_VFS_OLD 1
+#define QFMT_VFS_V0 2
+#define QFMT_OCFS2 3
+#define QFMT_VFS_V1 4
+
+#define QIF_BLIMITS 1
+#define QIF_SPACE 2
+#define QIF_ILIMITS 4
+#define QIF_INODES 8
+#define QIF_BTIME 16
+#define QIF_ITIME 32
+#define QIF_LIMITS (QIF_BLIMITS | QIF_ILIMITS)
+#define QIF_USAGE (QIF_SPACE | QIF_INODES)
+#define QIF_TIMES (QIF_BTIME | QIF_ITIME)
+#define QIF_ALL (QIF_LIMITS | QIF_USAGE | QIF_TIMES)
+
+struct dqblk {
+ uint64_t dqb_bhardlimit;
+ uint64_t dqb_bsoftlimit;
+ uint64_t dqb_curspace;
+ uint64_t dqb_ihardlimit;
+ uint64_t dqb_isoftlimit;
+ uint64_t dqb_curinodes;
+ uint64_t dqb_btime;
+ uint64_t dqb_itime;
+ uint32_t dqb_valid;
+};
+
+#define dq_bhardlimit dq_dqb.dqb_bhardlimit
+#define dq_bsoftlimit dq_dqb.dqb_bsoftlimit
+#define dq_curspace dq_dqb.dqb_curspace
+#define dq_valid dq_dqb.dqb_valid
+#define dq_ihardlimit dq_dqb.dqb_ihardlimit
+#define dq_isoftlimit dq_dqb.dqb_isoftlimit
+#define dq_curinodes dq_dqb.dqb_curinodes
+#define dq_btime dq_dqb.dqb_btime
+#define dq_itime dq_dqb.dqb_itime
+
+#define dqoff(UID) ((long long)(UID) * sizeof (struct dqblk))
+
+#define IIF_BGRACE 1
+#define IIF_IGRACE 2
+#define IIF_FLAGS 4
+#define IIF_ALL (IIF_BGRACE | IIF_IGRACE | IIF_FLAGS)
+
+struct dqinfo {
+ uint64_t dqi_bgrace;
+ uint64_t dqi_igrace;
+ uint32_t dqi_flags;
+ uint32_t dqi_valid;
+};
+
+int quotactl(int, const char *, int, char *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/random.h b/libc-top-half/musl/include/sys/random.h
new file mode 100644
index 0000000..51cf9d7
--- /dev/null
+++ b/libc-top-half/musl/include/sys/random.h
@@ -0,0 +1,27 @@
+#ifndef _SYS_RANDOM_H
+#define _SYS_RANDOM_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no getrandom, but it does have getentropy */
+#define __NEED_size_t
+#define __NEED_ssize_t
+#include <bits/alltypes.h>
+
+#define GRND_NONBLOCK 0x0001
+#define GRND_RANDOM 0x0002
+#define GRND_INSECURE 0x0004
+
+ssize_t getrandom(void *, size_t, unsigned);
+#else
+#define __NEED_size_t
+#include <bits/alltypes.h>
+
+int getentropy(void *, size_t);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/reboot.h b/libc-top-half/musl/include/sys/reboot.h
new file mode 100644
index 0000000..9702edd
--- /dev/null
+++ b/libc-top-half/musl/include/sys/reboot.h
@@ -0,0 +1,20 @@
+#ifndef _SYS_REBOOT_H
+#define _SYS_REBOOT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define RB_AUTOBOOT 0x01234567
+#define RB_HALT_SYSTEM 0xcdef0123
+#define RB_ENABLE_CAD 0x89abcdef
+#define RB_DISABLE_CAD 0
+#define RB_POWER_OFF 0x4321fedc
+#define RB_SW_SUSPEND 0xd000fce2
+#define RB_KEXEC 0x45584543
+
+int reboot(int);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/reg.h b/libc-top-half/musl/include/sys/reg.h
new file mode 100644
index 0000000..b47452d
--- /dev/null
+++ b/libc-top-half/musl/include/sys/reg.h
@@ -0,0 +1,9 @@
+#ifndef _SYS_REG_H
+#define _SYS_REG_H
+
+#include <limits.h>
+#include <unistd.h>
+
+#include <bits/reg.h>
+
+#endif
diff --git a/libc-top-half/musl/include/sys/resource.h b/libc-top-half/musl/include/sys/resource.h
new file mode 100644
index 0000000..6c3a7ff
--- /dev/null
+++ b/libc-top-half/musl/include/sys/resource.h
@@ -0,0 +1,126 @@
+#ifndef _WASI_EMULATED_PROCESS_CLOCKS
+#error WASI lacks process-associated clocks; to enable emulation of the `getrusage` function using \
+the wall clock, which isn't sensitive to whether the program is running or suspended, \
+compile with -D_WASI_EMULATED_PROCESS_CLOCKS and link with -lwasi-emulated-process-clocks
+#else
+#ifndef _SYS_RESOURCE_H
+#define _SYS_RESOURCE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+#include <sys/time.h>
+
+#define __NEED_id_t
+
+#ifdef _GNU_SOURCE
+#define __NEED_pid_t
+#endif
+
+#include <bits/alltypes.h>
+#include <bits/resource.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+typedef unsigned long long rlim_t;
+
+struct rlimit {
+ rlim_t rlim_cur;
+ rlim_t rlim_max;
+};
+
+struct rusage {
+ struct timeval ru_utime;
+ struct timeval ru_stime;
+ /* linux extentions, but useful */
+ long ru_maxrss;
+ long ru_ixrss;
+ long ru_idrss;
+ long ru_isrss;
+ long ru_minflt;
+ long ru_majflt;
+ long ru_nswap;
+ long ru_inblock;
+ long ru_oublock;
+ long ru_msgsnd;
+ long ru_msgrcv;
+ long ru_nsignals;
+ long ru_nvcsw;
+ long ru_nivcsw;
+ /* room for more... */
+ long __reserved[16];
+};
+
+int getrlimit (int, struct rlimit *);
+int setrlimit (int, const struct rlimit *);
+int getrusage (int, struct rusage *);
+
+int getpriority (int, id_t);
+int setpriority (int, id_t, int);
+
+#ifdef _GNU_SOURCE
+int prlimit(pid_t, int, const struct rlimit *, struct rlimit *);
+#define prlimit64 prlimit
+#endif
+
+#define PRIO_MIN (-20)
+#define PRIO_MAX 20
+
+#define PRIO_PROCESS 0
+#define PRIO_PGRP 1
+#define PRIO_USER 2
+
+#define RUSAGE_SELF 0
+#define RUSAGE_CHILDREN (-1)
+#define RUSAGE_THREAD 1
+
+#define RLIM_INFINITY (~0ULL)
+#define RLIM_SAVED_CUR RLIM_INFINITY
+#define RLIM_SAVED_MAX RLIM_INFINITY
+
+#define RLIMIT_CPU 0
+#define RLIMIT_FSIZE 1
+#define RLIMIT_DATA 2
+#define RLIMIT_STACK 3
+#define RLIMIT_CORE 4
+#ifndef RLIMIT_RSS
+#define RLIMIT_RSS 5
+#define RLIMIT_NPROC 6
+#define RLIMIT_NOFILE 7
+#define RLIMIT_MEMLOCK 8
+#define RLIMIT_AS 9
+#endif
+#define RLIMIT_LOCKS 10
+#define RLIMIT_SIGPENDING 11
+#define RLIMIT_MSGQUEUE 12
+#define RLIMIT_NICE 13
+#define RLIMIT_RTPRIO 14
+#define RLIMIT_RTTIME 15
+#define RLIMIT_NLIMITS 16
+
+#define RLIM_NLIMITS RLIMIT_NLIMITS
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#define RLIM64_INFINITY RLIM_INFINITY
+#define RLIM64_SAVED_CUR RLIM_SAVED_CUR
+#define RLIM64_SAVED_MAX RLIM_SAVED_MAX
+#define getrlimit64 getrlimit
+#define setrlimit64 setrlimit
+#define rlimit64 rlimit
+#define rlim64_t rlim_t
+#endif
+#else
+#include <__header_sys_resource.h>
+#endif
+
+#if _REDIR_TIME64
+__REDIR(getrusage, __getrusage_time64);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/select.h b/libc-top-half/musl/include/sys/select.h
new file mode 100644
index 0000000..1c1adff
--- /dev/null
+++ b/libc-top-half/musl/include/sys/select.h
@@ -0,0 +1,54 @@
+#ifndef _SYS_SELECT_H
+#define _SYS_SELECT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_size_t
+#define __NEED_time_t
+#define __NEED_suseconds_t
+#define __NEED_struct_timeval
+#define __NEED_struct_timespec
+#define __NEED_sigset_t
+
+#include <bits/alltypes.h>
+
+#define FD_SETSIZE 1024
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+typedef unsigned long fd_mask;
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+typedef struct {
+ unsigned long fds_bits[FD_SETSIZE / 8 / sizeof(long)];
+} fd_set;
+
+#define FD_ZERO(s) do { int __i; unsigned long *__b=(s)->fds_bits; for(__i=sizeof (fd_set)/sizeof (long); __i; __i--) *__b++=0; } while(0)
+#define FD_SET(d, s) ((s)->fds_bits[(d)/(8*sizeof(long))] |= (1UL<<((d)%(8*sizeof(long)))))
+#define FD_CLR(d, s) ((s)->fds_bits[(d)/(8*sizeof(long))] &= ~(1UL<<((d)%(8*sizeof(long)))))
+#define FD_ISSET(d, s) !!((s)->fds_bits[(d)/(8*sizeof(long))] & (1UL<<((d)%(8*sizeof(long)))))
+#else
+#include <__fd_set.h>
+#endif
+
+int select (int, fd_set *__restrict, fd_set *__restrict, fd_set *__restrict, struct timeval *__restrict);
+int pselect (int, fd_set *__restrict, fd_set *__restrict, fd_set *__restrict, const struct timespec *__restrict, const sigset_t *__restrict);
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define NFDBITS (8*(int)sizeof(long))
+#endif
+#endif
+
+#if _REDIR_TIME64
+__REDIR(select, __select_time64);
+__REDIR(pselect, __pselect_time64);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/sem.h b/libc-top-half/musl/include/sys/sem.h
new file mode 100644
index 0000000..a747784
--- /dev/null
+++ b/libc-top-half/musl/include/sys/sem.h
@@ -0,0 +1,72 @@
+#ifndef _SYS_SEM_H
+#define _SYS_SEM_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_size_t
+#define __NEED_pid_t
+#define __NEED_time_t
+#ifdef _GNU_SOURCE
+#define __NEED_struct_timespec
+#endif
+#include <bits/alltypes.h>
+
+#include <sys/ipc.h>
+
+#define SEM_UNDO 0x1000
+#define GETPID 11
+#define GETVAL 12
+#define GETALL 13
+#define GETNCNT 14
+#define GETZCNT 15
+#define SETVAL 16
+#define SETALL 17
+
+#include <bits/sem.h>
+
+#define _SEM_SEMUN_UNDEFINED 1
+
+#define SEM_STAT (18 | (IPC_STAT & 0x100))
+#define SEM_INFO 19
+#define SEM_STAT_ANY (20 | (IPC_STAT & 0x100))
+
+struct seminfo {
+ int semmap;
+ int semmni;
+ int semmns;
+ int semmnu;
+ int semmsl;
+ int semopm;
+ int semume;
+ int semusz;
+ int semvmx;
+ int semaem;
+};
+
+struct sembuf {
+ unsigned short sem_num;
+ short sem_op;
+ short sem_flg;
+};
+
+int semctl(int, int, int, ...);
+int semget(key_t, int, int);
+int semop(int, struct sembuf *, size_t);
+
+#ifdef _GNU_SOURCE
+int semtimedop(int, struct sembuf *, size_t, const struct timespec *);
+#endif
+
+#if _REDIR_TIME64
+#ifdef _GNU_SOURCE
+__REDIR(semtimedop, __semtimedop_time64);
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/sendfile.h b/libc-top-half/musl/include/sys/sendfile.h
new file mode 100644
index 0000000..e7570d8
--- /dev/null
+++ b/libc-top-half/musl/include/sys/sendfile.h
@@ -0,0 +1,22 @@
+#ifndef _SYS_SENDFILE_H
+#define _SYS_SENDFILE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+#include <unistd.h>
+
+ssize_t sendfile(int, int, off_t *, size_t);
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#define sendfile64 sendfile
+#define off64_t off_t
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/shm.h b/libc-top-half/musl/include/sys/shm.h
new file mode 100644
index 0000000..fd708ca
--- /dev/null
+++ b/libc-top-half/musl/include/sys/shm.h
@@ -0,0 +1,70 @@
+#ifndef _SYS_SHM_H
+#define _SYS_SHM_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_time_t
+#define __NEED_size_t
+#define __NEED_pid_t
+
+#include <bits/alltypes.h>
+
+#include <sys/ipc.h>
+
+#ifdef _GNU_SOURCE
+#define __used_ids used_ids
+#define __swap_attempts swap_attempts
+#define __swap_successes swap_successes
+#endif
+
+#include <bits/shm.h>
+
+#define SHM_R 0400
+#define SHM_W 0200
+
+#define SHM_RDONLY 010000
+#define SHM_RND 020000
+#define SHM_REMAP 040000
+#define SHM_EXEC 0100000
+
+#define SHM_LOCK 11
+#define SHM_UNLOCK 12
+#define SHM_STAT (13 | (IPC_STAT & 0x100))
+#define SHM_INFO 14
+#define SHM_STAT_ANY (15 | (IPC_STAT & 0x100))
+#define SHM_DEST 01000
+#define SHM_LOCKED 02000
+#define SHM_HUGETLB 04000
+#define SHM_NORESERVE 010000
+
+#define SHM_HUGE_SHIFT 26
+#define SHM_HUGE_MASK 0x3f
+#define SHM_HUGE_64KB (16 << 26)
+#define SHM_HUGE_512KB (19 << 26)
+#define SHM_HUGE_1MB (20 << 26)
+#define SHM_HUGE_2MB (21 << 26)
+#define SHM_HUGE_8MB (23 << 26)
+#define SHM_HUGE_16MB (24 << 26)
+#define SHM_HUGE_32MB (25 << 26)
+#define SHM_HUGE_256MB (28 << 26)
+#define SHM_HUGE_512MB (29 << 26)
+#define SHM_HUGE_1GB (30 << 26)
+#define SHM_HUGE_2GB (31 << 26)
+#define SHM_HUGE_16GB (34U << 26)
+
+typedef unsigned long shmatt_t;
+
+void *shmat(int, const void *, int);
+int shmctl(int, int, struct shmid_ds *);
+int shmdt(const void *);
+int shmget(key_t, size_t, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/signal.h b/libc-top-half/musl/include/sys/signal.h
new file mode 100644
index 0000000..45bdcc6
--- /dev/null
+++ b/libc-top-half/musl/include/sys/signal.h
@@ -0,0 +1,2 @@
+#warning redirecting incorrect #include <sys/signal.h> to <signal.h>
+#include <signal.h>
diff --git a/libc-top-half/musl/include/sys/signalfd.h b/libc-top-half/musl/include/sys/signalfd.h
new file mode 100644
index 0000000..e881e2c
--- /dev/null
+++ b/libc-top-half/musl/include/sys/signalfd.h
@@ -0,0 +1,49 @@
+#ifndef _SYS_SIGNALFD_H
+#define _SYS_SIGNALFD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <fcntl.h>
+
+#define __NEED_sigset_t
+
+#include <bits/alltypes.h>
+
+#define SFD_CLOEXEC O_CLOEXEC
+#define SFD_NONBLOCK O_NONBLOCK
+
+int signalfd(int, const sigset_t *, int);
+
+struct signalfd_siginfo {
+ uint32_t ssi_signo;
+ int32_t ssi_errno;
+ int32_t ssi_code;
+ uint32_t ssi_pid;
+ uint32_t ssi_uid;
+ int32_t ssi_fd;
+ uint32_t ssi_tid;
+ uint32_t ssi_band;
+ uint32_t ssi_overrun;
+ uint32_t ssi_trapno;
+ int32_t ssi_status;
+ int32_t ssi_int;
+ uint64_t ssi_ptr;
+ uint64_t ssi_utime;
+ uint64_t ssi_stime;
+ uint64_t ssi_addr;
+ uint16_t ssi_addr_lsb;
+ uint16_t __pad2;
+ int32_t ssi_syscall;
+ uint64_t ssi_call_addr;
+ uint32_t ssi_arch;
+ uint8_t __pad[128-14*4-5*8-2*2];
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/socket.h b/libc-top-half/musl/include/sys/socket.h
new file mode 100644
index 0000000..4d574c6
--- /dev/null
+++ b/libc-top-half/musl/include/sys/socket.h
@@ -0,0 +1,448 @@
+#ifndef _SYS_SOCKET_H
+#define _SYS_SOCKET_H
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#else
+#include <__header_sys_socket.h>
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_socklen_t
+#define __NEED_sa_family_t
+#define __NEED_size_t
+#define __NEED_ssize_t
+#define __NEED_uid_t
+#define __NEED_pid_t
+#define __NEED_gid_t
+#define __NEED_struct_iovec
+
+#include <bits/alltypes.h>
+
+#include <bits/socket.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+struct msghdr {
+ void *msg_name;
+ socklen_t msg_namelen;
+ struct iovec *msg_iov;
+#if __LONG_MAX > 0x7fffffff && __BYTE_ORDER == __BIG_ENDIAN
+ int __pad1;
+#endif
+ int msg_iovlen;
+#if __LONG_MAX > 0x7fffffff && __BYTE_ORDER == __LITTLE_ENDIAN
+ int __pad1;
+#endif
+ void *msg_control;
+#if __LONG_MAX > 0x7fffffff && __BYTE_ORDER == __BIG_ENDIAN
+ int __pad2;
+#endif
+ socklen_t msg_controllen;
+#if __LONG_MAX > 0x7fffffff && __BYTE_ORDER == __LITTLE_ENDIAN
+ int __pad2;
+#endif
+ int msg_flags;
+};
+
+struct cmsghdr {
+#if __LONG_MAX > 0x7fffffff && __BYTE_ORDER == __BIG_ENDIAN
+ int __pad1;
+#endif
+ socklen_t cmsg_len;
+#if __LONG_MAX > 0x7fffffff && __BYTE_ORDER == __LITTLE_ENDIAN
+ int __pad1;
+#endif
+ int cmsg_level;
+ int cmsg_type;
+};
+#else
+#include <__struct_msghdr.h>
+#endif
+
+#ifdef _GNU_SOURCE
+struct ucred {
+ pid_t pid;
+ uid_t uid;
+ gid_t gid;
+};
+
+struct mmsghdr {
+ struct msghdr msg_hdr;
+ unsigned int msg_len;
+};
+
+struct timespec;
+
+int sendmmsg (int, struct mmsghdr *, unsigned int, unsigned int);
+int recvmmsg (int, struct mmsghdr *, unsigned int, unsigned int, struct timespec *);
+#endif
+
+struct linger {
+ int l_onoff;
+ int l_linger;
+};
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#define SHUT_RD 0
+#define SHUT_WR 1
+#define SHUT_RDWR 2
+
+#ifndef SOCK_STREAM
+#define SOCK_STREAM 1
+#define SOCK_DGRAM 2
+#endif
+
+#define SOCK_RAW 3
+#define SOCK_RDM 4
+#define SOCK_SEQPACKET 5
+#define SOCK_DCCP 6
+#define SOCK_PACKET 10
+
+#ifndef SOCK_CLOEXEC
+#define SOCK_CLOEXEC 02000000
+#define SOCK_NONBLOCK 04000
+#endif
+
+#define PF_UNSPEC 0
+#define PF_LOCAL 1
+#define PF_UNIX PF_LOCAL
+#define PF_FILE PF_LOCAL
+#define PF_INET 2
+#define PF_AX25 3
+#define PF_IPX 4
+#define PF_APPLETALK 5
+#define PF_NETROM 6
+#define PF_BRIDGE 7
+#define PF_ATMPVC 8
+#define PF_X25 9
+#define PF_INET6 10
+#define PF_ROSE 11
+#define PF_DECnet 12
+#define PF_NETBEUI 13
+#define PF_SECURITY 14
+#define PF_KEY 15
+#define PF_NETLINK 16
+#define PF_ROUTE PF_NETLINK
+#define PF_PACKET 17
+#define PF_ASH 18
+#define PF_ECONET 19
+#define PF_ATMSVC 20
+#define PF_RDS 21
+#define PF_SNA 22
+#define PF_IRDA 23
+#define PF_PPPOX 24
+#define PF_WANPIPE 25
+#define PF_LLC 26
+#define PF_IB 27
+#define PF_MPLS 28
+#define PF_CAN 29
+#define PF_TIPC 30
+#define PF_BLUETOOTH 31
+#define PF_IUCV 32
+#define PF_RXRPC 33
+#define PF_ISDN 34
+#define PF_PHONET 35
+#define PF_IEEE802154 36
+#define PF_CAIF 37
+#define PF_ALG 38
+#define PF_NFC 39
+#define PF_VSOCK 40
+#define PF_KCM 41
+#define PF_QIPCRTR 42
+#define PF_SMC 43
+#define PF_XDP 44
+#define PF_MAX 45
+
+#define AF_UNSPEC PF_UNSPEC
+#define AF_LOCAL PF_LOCAL
+#define AF_UNIX AF_LOCAL
+#define AF_FILE AF_LOCAL
+#define AF_INET PF_INET
+#define AF_AX25 PF_AX25
+#define AF_IPX PF_IPX
+#define AF_APPLETALK PF_APPLETALK
+#define AF_NETROM PF_NETROM
+#define AF_BRIDGE PF_BRIDGE
+#define AF_ATMPVC PF_ATMPVC
+#define AF_X25 PF_X25
+#define AF_INET6 PF_INET6
+#define AF_ROSE PF_ROSE
+#define AF_DECnet PF_DECnet
+#define AF_NETBEUI PF_NETBEUI
+#define AF_SECURITY PF_SECURITY
+#define AF_KEY PF_KEY
+#define AF_NETLINK PF_NETLINK
+#define AF_ROUTE PF_ROUTE
+#define AF_PACKET PF_PACKET
+#define AF_ASH PF_ASH
+#define AF_ECONET PF_ECONET
+#define AF_ATMSVC PF_ATMSVC
+#define AF_RDS PF_RDS
+#define AF_SNA PF_SNA
+#define AF_IRDA PF_IRDA
+#define AF_PPPOX PF_PPPOX
+#define AF_WANPIPE PF_WANPIPE
+#define AF_LLC PF_LLC
+#define AF_IB PF_IB
+#define AF_MPLS PF_MPLS
+#define AF_CAN PF_CAN
+#define AF_TIPC PF_TIPC
+#define AF_BLUETOOTH PF_BLUETOOTH
+#define AF_IUCV PF_IUCV
+#define AF_RXRPC PF_RXRPC
+#define AF_ISDN PF_ISDN
+#define AF_PHONET PF_PHONET
+#define AF_IEEE802154 PF_IEEE802154
+#define AF_CAIF PF_CAIF
+#define AF_ALG PF_ALG
+#define AF_NFC PF_NFC
+#define AF_VSOCK PF_VSOCK
+#define AF_KCM PF_KCM
+#define AF_QIPCRTR PF_QIPCRTR
+#define AF_SMC PF_SMC
+#define AF_XDP PF_XDP
+#define AF_MAX PF_MAX
+
+#ifndef SO_DEBUG
+#define SO_DEBUG 1
+#define SO_REUSEADDR 2
+#define SO_TYPE 3
+#define SO_ERROR 4
+#define SO_DONTROUTE 5
+#define SO_BROADCAST 6
+#define SO_SNDBUF 7
+#define SO_RCVBUF 8
+#define SO_KEEPALIVE 9
+#define SO_OOBINLINE 10
+#define SO_NO_CHECK 11
+#define SO_PRIORITY 12
+#define SO_LINGER 13
+#define SO_BSDCOMPAT 14
+#define SO_REUSEPORT 15
+#define SO_PASSCRED 16
+#define SO_PEERCRED 17
+#define SO_RCVLOWAT 18
+#define SO_SNDLOWAT 19
+#define SO_ACCEPTCONN 30
+#define SO_PEERSEC 31
+#define SO_SNDBUFFORCE 32
+#define SO_RCVBUFFORCE 33
+#define SO_PROTOCOL 38
+#define SO_DOMAIN 39
+#endif
+
+#ifndef SO_RCVTIMEO
+#if __LONG_MAX == 0x7fffffff
+#define SO_RCVTIMEO 66
+#define SO_SNDTIMEO 67
+#else
+#define SO_RCVTIMEO 20
+#define SO_SNDTIMEO 21
+#endif
+#endif
+
+#ifndef SO_TIMESTAMP
+#if __LONG_MAX == 0x7fffffff
+#define SO_TIMESTAMP 63
+#define SO_TIMESTAMPNS 64
+#define SO_TIMESTAMPING 65
+#else
+#define SO_TIMESTAMP 29
+#define SO_TIMESTAMPNS 35
+#define SO_TIMESTAMPING 37
+#endif
+#endif
+
+#define SO_SECURITY_AUTHENTICATION 22
+#define SO_SECURITY_ENCRYPTION_TRANSPORT 23
+#define SO_SECURITY_ENCRYPTION_NETWORK 24
+
+#define SO_BINDTODEVICE 25
+
+#define SO_ATTACH_FILTER 26
+#define SO_DETACH_FILTER 27
+#define SO_GET_FILTER SO_ATTACH_FILTER
+
+#define SO_PEERNAME 28
+#define SCM_TIMESTAMP SO_TIMESTAMP
+#define SO_PASSSEC 34
+#define SCM_TIMESTAMPNS SO_TIMESTAMPNS
+#define SO_MARK 36
+#define SCM_TIMESTAMPING SO_TIMESTAMPING
+#define SO_RXQ_OVFL 40
+#define SO_WIFI_STATUS 41
+#define SCM_WIFI_STATUS SO_WIFI_STATUS
+#define SO_PEEK_OFF 42
+#define SO_NOFCS 43
+#define SO_LOCK_FILTER 44
+#define SO_SELECT_ERR_QUEUE 45
+#define SO_BUSY_POLL 46
+#define SO_MAX_PACING_RATE 47
+#define SO_BPF_EXTENSIONS 48
+#define SO_INCOMING_CPU 49
+#define SO_ATTACH_BPF 50
+#define SO_DETACH_BPF SO_DETACH_FILTER
+#define SO_ATTACH_REUSEPORT_CBPF 51
+#define SO_ATTACH_REUSEPORT_EBPF 52
+#define SO_CNX_ADVICE 53
+#define SCM_TIMESTAMPING_OPT_STATS 54
+#define SO_MEMINFO 55
+#define SO_INCOMING_NAPI_ID 56
+#define SO_COOKIE 57
+#define SCM_TIMESTAMPING_PKTINFO 58
+#define SO_PEERGROUPS 59
+#define SO_ZEROCOPY 60
+#define SO_TXTIME 61
+#define SCM_TXTIME SO_TXTIME
+#define SO_BINDTOIFINDEX 62
+#define SO_DETACH_REUSEPORT_BPF 68
+#define SO_PREFER_BUSY_POLL 69
+#define SO_BUSY_POLL_BUDGET 70
+
+#ifndef SOL_SOCKET
+#define SOL_SOCKET 1
+#endif
+
+#define SOL_IP 0
+#define SOL_IPV6 41
+#define SOL_ICMPV6 58
+
+#define SOL_RAW 255
+#define SOL_DECNET 261
+#define SOL_X25 262
+#define SOL_PACKET 263
+#define SOL_ATM 264
+#define SOL_AAL 265
+#define SOL_IRDA 266
+#define SOL_NETBEUI 267
+#define SOL_LLC 268
+#define SOL_DCCP 269
+#define SOL_NETLINK 270
+#define SOL_TIPC 271
+#define SOL_RXRPC 272
+#define SOL_PPPOL2TP 273
+#define SOL_BLUETOOTH 274
+#define SOL_PNPIPE 275
+#define SOL_RDS 276
+#define SOL_IUCV 277
+#define SOL_CAIF 278
+#define SOL_ALG 279
+#define SOL_NFC 280
+#define SOL_KCM 281
+#define SOL_TLS 282
+#define SOL_XDP 283
+
+#define SOMAXCONN 128
+
+#define MSG_OOB 0x0001
+#define MSG_PEEK 0x0002
+#define MSG_DONTROUTE 0x0004
+#define MSG_CTRUNC 0x0008
+#define MSG_PROXY 0x0010
+#define MSG_TRUNC 0x0020
+#define MSG_DONTWAIT 0x0040
+#define MSG_EOR 0x0080
+#define MSG_WAITALL 0x0100
+#define MSG_FIN 0x0200
+#define MSG_SYN 0x0400
+#define MSG_CONFIRM 0x0800
+#define MSG_RST 0x1000
+#define MSG_ERRQUEUE 0x2000
+#define MSG_NOSIGNAL 0x4000
+#define MSG_MORE 0x8000
+#define MSG_WAITFORONE 0x10000
+#define MSG_BATCH 0x40000
+#define MSG_ZEROCOPY 0x4000000
+#define MSG_FASTOPEN 0x20000000
+#define MSG_CMSG_CLOEXEC 0x40000000
+
+#define __CMSG_LEN(cmsg) (((cmsg)->cmsg_len + sizeof(long) - 1) & ~(long)(sizeof(long) - 1))
+#define __CMSG_NEXT(cmsg) ((unsigned char *)(cmsg) + __CMSG_LEN(cmsg))
+#define __MHDR_END(mhdr) ((unsigned char *)(mhdr)->msg_control + (mhdr)->msg_controllen)
+
+#define CMSG_DATA(cmsg) ((unsigned char *) (((struct cmsghdr *)(cmsg)) + 1))
+#define CMSG_NXTHDR(mhdr, cmsg) ((cmsg)->cmsg_len < sizeof (struct cmsghdr) || \
+ __CMSG_LEN(cmsg) + sizeof(struct cmsghdr) >= __MHDR_END(mhdr) - (unsigned char *)(cmsg) \
+ ? 0 : (struct cmsghdr *)__CMSG_NEXT(cmsg))
+#define CMSG_FIRSTHDR(mhdr) ((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr) ? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) 0)
+
+#define CMSG_ALIGN(len) (((len) + sizeof (size_t) - 1) & (size_t) ~(sizeof (size_t) - 1))
+#define CMSG_SPACE(len) (CMSG_ALIGN (len) + CMSG_ALIGN (sizeof (struct cmsghdr)))
+#define CMSG_LEN(len) (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len))
+
+#define SCM_RIGHTS 0x01
+#define SCM_CREDENTIALS 0x02
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+struct sockaddr {
+ sa_family_t sa_family;
+ char sa_data[14];
+};
+#else
+#include <__struct_sockaddr.h>
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+struct sockaddr_storage {
+ sa_family_t ss_family;
+ char __ss_padding[128-sizeof(long)-sizeof(sa_family_t)];
+ unsigned long __ss_align;
+};
+#else
+#include <__struct_sockaddr_storage.h>
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no socket/socketpair */
+int socket (int, int, int);
+int socketpair (int, int, int, int [2]);
+#endif
+
+int shutdown (int, int);
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no bind/connect/listen/accept */
+int bind (int, const struct sockaddr *, socklen_t);
+int connect (int, const struct sockaddr *, socklen_t);
+int listen (int, int);
+#endif
+
+int accept (int, struct sockaddr *__restrict, socklen_t *__restrict);
+int accept4(int, struct sockaddr *__restrict, socklen_t *__restrict, int);
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no getsockname/getpeername */
+int getsockname (int, struct sockaddr *__restrict, socklen_t *__restrict);
+int getpeername (int, struct sockaddr *__restrict, socklen_t *__restrict);
+#endif
+
+ssize_t send (int, const void *, size_t, int);
+ssize_t recv (int, void *, size_t, int);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no sendto/recvfrom */
+ssize_t sendto (int, const void *, size_t, int, const struct sockaddr *, socklen_t);
+ssize_t recvfrom (int, void *__restrict, size_t, int, struct sockaddr *__restrict, socklen_t *__restrict);
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no sendmsg/recvmsg */
+ssize_t sendmsg (int, const struct msghdr *, int);
+ssize_t recvmsg (int, struct msghdr *, int);
+#endif
+
+int getsockopt (int, int, int, void *__restrict, socklen_t *__restrict);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no setsockopt */
+int setsockopt (int, int, int, const void *, socklen_t);
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no sockatmark */
+int sockatmark (int);
+#endif
+
+#if _REDIR_TIME64
+#ifdef _GNU_SOURCE
+__REDIR(recvmmsg, __recvmmsg_time64);
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/soundcard.h b/libc-top-half/musl/include/sys/soundcard.h
new file mode 100644
index 0000000..5ca7764
--- /dev/null
+++ b/libc-top-half/musl/include/sys/soundcard.h
@@ -0,0 +1 @@
+#include <bits/soundcard.h>
diff --git a/libc-top-half/musl/include/sys/stat.h b/libc-top-half/musl/include/sys/stat.h
new file mode 100644
index 0000000..72e1626
--- /dev/null
+++ b/libc-top-half/musl/include/sys/stat.h
@@ -0,0 +1,143 @@
+#ifndef _SYS_STAT_H
+#define _SYS_STAT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_dev_t
+#define __NEED_ino_t
+#define __NEED_mode_t
+#define __NEED_nlink_t
+#define __NEED_uid_t
+#define __NEED_gid_t
+#define __NEED_off_t
+#define __NEED_time_t
+#define __NEED_blksize_t
+#define __NEED_blkcnt_t
+#define __NEED_struct_timespec
+
+#include <bits/alltypes.h>
+
+#include <bits/stat.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#define st_atime st_atim.tv_sec
+#define st_mtime st_mtim.tv_sec
+#define st_ctime st_ctim.tv_sec
+
+#define S_IFMT 0170000
+
+#define S_IFDIR 0040000
+#define S_IFCHR 0020000
+#define S_IFBLK 0060000
+#define S_IFREG 0100000
+#define S_IFIFO 0010000
+#define S_IFLNK 0120000
+#define S_IFSOCK 0140000
+
+#define S_TYPEISMQ(buf) 0
+#define S_TYPEISSEM(buf) 0
+#define S_TYPEISSHM(buf) 0
+#define S_TYPEISTMO(buf) 0
+
+#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
+#define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
+#define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK)
+#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
+#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
+#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)
+#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
+
+#ifndef S_IRUSR
+#define S_ISUID 04000
+#define S_ISGID 02000
+#define S_ISVTX 01000
+#define S_IRUSR 0400
+#define S_IWUSR 0200
+#define S_IXUSR 0100
+#define S_IRWXU 0700
+#define S_IRGRP 0040
+#define S_IWGRP 0020
+#define S_IXGRP 0010
+#define S_IRWXG 0070
+#define S_IROTH 0004
+#define S_IWOTH 0002
+#define S_IXOTH 0001
+#define S_IRWXO 0007
+#endif
+
+#define UTIME_NOW 0x3fffffff
+#define UTIME_OMIT 0x3ffffffe
+#else
+#include <__header_sys_stat.h>
+#endif
+
+int stat(const char *__restrict, struct stat *__restrict);
+int fstat(int, struct stat *);
+int lstat(const char *__restrict, struct stat *__restrict);
+int fstatat(int, const char *__restrict, struct stat *__restrict, int);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no chmod */
+int chmod(const char *, mode_t);
+int fchmod(int, mode_t);
+int fchmodat(int, const char *, mode_t, int);
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no umask */
+mode_t umask(mode_t);
+#endif
+int mkdir(const char *, mode_t);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no fifo */
+int mkfifo(const char *, mode_t);
+#endif
+int mkdirat(int, const char *, mode_t);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no fifo */
+int mkfifoat(int, const char *, mode_t);
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no mknod */
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+int mknod(const char *, mode_t, dev_t);
+int mknodat(int, const char *, mode_t, dev_t);
+#endif
+#endif
+
+int futimens(int, const struct timespec [2]);
+int utimensat(int, const char *, const struct timespec [2], int);
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#ifdef __wasilibc_unmodified_upstream /* WASI has no chmod */
+int lchmod(const char *, mode_t);
+#endif
+#define S_IREAD S_IRUSR
+#define S_IWRITE S_IWUSR
+#define S_IEXEC S_IXUSR
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#define stat64 stat
+#define fstat64 fstat
+#define lstat64 lstat
+#define fstatat64 fstatat
+#define blkcnt64_t blkcnt_t
+#define fsblkcnt64_t fsblkcnt_t
+#define fsfilcnt64_t fsfilcnt_t
+#define ino64_t ino_t
+#define off64_t off_t
+#endif
+
+#if _REDIR_TIME64
+__REDIR(stat, __stat_time64);
+__REDIR(fstat, __fstat_time64);
+__REDIR(lstat, __lstat_time64);
+__REDIR(fstatat, __fstatat_time64);
+__REDIR(futimens, __futimens_time64);
+__REDIR(utimensat, __utimensat_time64);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
diff --git a/libc-top-half/musl/include/sys/statfs.h b/libc-top-half/musl/include/sys/statfs.h
new file mode 100644
index 0000000..6f4c623
--- /dev/null
+++ b/libc-top-half/musl/include/sys/statfs.h
@@ -0,0 +1,32 @@
+#ifndef _SYS_STATFS_H
+#define _SYS_STATFS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#include <sys/statvfs.h>
+
+typedef struct __fsid_t {
+ int __val[2];
+} fsid_t;
+
+#include <bits/statfs.h>
+
+int statfs (const char *, struct statfs *);
+int fstatfs (int, struct statfs *);
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#define statfs64 statfs
+#define fstatfs64 fstatfs
+#define fsblkcnt64_t fsblkcnt_t
+#define fsfilcnt64_t fsfilcnt_t
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/statvfs.h b/libc-top-half/musl/include/sys/statvfs.h
new file mode 100644
index 0000000..793490b
--- /dev/null
+++ b/libc-top-half/musl/include/sys/statvfs.h
@@ -0,0 +1,56 @@
+#ifndef _SYS_STATVFS_H
+#define _SYS_STATVFS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_fsblkcnt_t
+#define __NEED_fsfilcnt_t
+#include <bits/alltypes.h>
+
+struct statvfs {
+ unsigned long f_bsize, f_frsize;
+ fsblkcnt_t f_blocks, f_bfree, f_bavail;
+ fsfilcnt_t f_files, f_ffree, f_favail;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned long f_fsid;
+ unsigned :8*(2*sizeof(int)-sizeof(long));
+#else
+ unsigned :8*(2*sizeof(int)-sizeof(long));
+ unsigned long f_fsid;
+#endif
+ unsigned long f_flag, f_namemax;
+ int __reserved[6];
+};
+
+int statvfs (const char *__restrict, struct statvfs *__restrict);
+int fstatvfs (int, struct statvfs *);
+
+#define ST_RDONLY 1
+#define ST_NOSUID 2
+#define ST_NODEV 4
+#define ST_NOEXEC 8
+#define ST_SYNCHRONOUS 16
+#define ST_MANDLOCK 64
+#define ST_WRITE 128
+#define ST_APPEND 256
+#define ST_IMMUTABLE 512
+#define ST_NOATIME 1024
+#define ST_NODIRATIME 2048
+#define ST_RELATIME 4096
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#define statvfs64 statvfs
+#define fstatvfs64 fstatvfs
+#define fsblkcnt64_t fsblkcnt_t
+#define fsfilcnt64_t fsfilcnt_t
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/stropts.h b/libc-top-half/musl/include/sys/stropts.h
new file mode 100644
index 0000000..5b5bc02
--- /dev/null
+++ b/libc-top-half/musl/include/sys/stropts.h
@@ -0,0 +1 @@
+#include <stropts.h>
diff --git a/libc-top-half/musl/include/sys/swap.h b/libc-top-half/musl/include/sys/swap.h
new file mode 100644
index 0000000..11c0f92
--- /dev/null
+++ b/libc-top-half/musl/include/sys/swap.h
@@ -0,0 +1,21 @@
+#ifndef _SYS_SWAP_H
+#define _SYS_SWAP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define SWAP_FLAG_PREFER 0x8000
+#define SWAP_FLAG_PRIO_MASK 0x7fff
+#define SWAP_FLAG_PRIO_SHIFT 0
+#define SWAP_FLAG_DISCARD 0x10000
+
+int swapon (const char *, int);
+int swapoff (const char *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/syscall.h b/libc-top-half/musl/include/sys/syscall.h
new file mode 100644
index 0000000..ceed6b5
--- /dev/null
+++ b/libc-top-half/musl/include/sys/syscall.h
@@ -0,0 +1,10 @@
+#ifndef _SYS_SYSCALL_H
+#define _SYS_SYSCALL_H
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no syscall */
+#include <bits/syscall.h>
+#else
+/* The generic syscall funtion is not yet implemented. */
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/sysinfo.h b/libc-top-half/musl/include/sys/sysinfo.h
new file mode 100644
index 0000000..6a3931e
--- /dev/null
+++ b/libc-top-half/musl/include/sys/sysinfo.h
@@ -0,0 +1,36 @@
+#ifndef _SYS_SYSINFO_H
+#define _SYS_SYSINFO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SI_LOAD_SHIFT 16
+
+struct sysinfo {
+ unsigned long uptime;
+ unsigned long loads[3];
+ unsigned long totalram;
+ unsigned long freeram;
+ unsigned long sharedram;
+ unsigned long bufferram;
+ unsigned long totalswap;
+ unsigned long freeswap;
+ unsigned short procs, pad;
+ unsigned long totalhigh;
+ unsigned long freehigh;
+ unsigned mem_unit;
+ char __reserved[256];
+};
+
+int sysinfo (struct sysinfo *);
+int get_nprocs_conf (void);
+int get_nprocs (void);
+long get_phys_pages (void);
+long get_avphys_pages (void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/syslog.h b/libc-top-half/musl/include/sys/syslog.h
new file mode 100644
index 0000000..7761ece
--- /dev/null
+++ b/libc-top-half/musl/include/sys/syslog.h
@@ -0,0 +1 @@
+#include <syslog.h>
diff --git a/libc-top-half/musl/include/sys/sysmacros.h b/libc-top-half/musl/include/sys/sysmacros.h
new file mode 100644
index 0000000..07a3ef1
--- /dev/null
+++ b/libc-top-half/musl/include/sys/sysmacros.h
@@ -0,0 +1,15 @@
+#ifndef _SYS_SYSMACROS_H
+#define _SYS_SYSMACROS_H
+
+#define major(x) \
+ ((unsigned)( (((x)>>31>>1) & 0xfffff000) | (((x)>>8) & 0x00000fff) ))
+#define minor(x) \
+ ((unsigned)( (((x)>>12) & 0xffffff00) | ((x) & 0x000000ff) ))
+
+#define makedev(x,y) ( \
+ (((x)&0xfffff000ULL) << 32) | \
+ (((x)&0x00000fffULL) << 8) | \
+ (((y)&0xffffff00ULL) << 12) | \
+ (((y)&0x000000ffULL)) )
+
+#endif
diff --git a/libc-top-half/musl/include/sys/termios.h b/libc-top-half/musl/include/sys/termios.h
new file mode 100644
index 0000000..f5f751f
--- /dev/null
+++ b/libc-top-half/musl/include/sys/termios.h
@@ -0,0 +1,2 @@
+#warning redirecting incorrect #include <sys/termios.h> to <termios.h>
+#include <termios.h>
diff --git a/libc-top-half/musl/include/sys/time.h b/libc-top-half/musl/include/sys/time.h
new file mode 100644
index 0000000..0f73655
--- /dev/null
+++ b/libc-top-half/musl/include/sys/time.h
@@ -0,0 +1,84 @@
+#ifndef _SYS_TIME_H
+#define _SYS_TIME_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#include <sys/select.h>
+
+int gettimeofday (struct timeval *__restrict, void *__restrict);
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no getitimer */
+#define ITIMER_REAL 0
+#define ITIMER_VIRTUAL 1
+#define ITIMER_PROF 2
+
+struct itimerval {
+ struct timeval it_interval;
+ struct timeval it_value;
+};
+
+int getitimer (int, struct itimerval *);
+int setitimer (int, const struct itimerval *__restrict, struct itimerval *__restrict);
+#endif
+int utimes (const char *, const struct timeval [2]);
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+struct timezone {
+ int tz_minuteswest;
+ int tz_dsttime;
+};
+#ifdef __wasilibc_unmodified_upstream /* WASI libc doesn't build the legacy functions */
+int futimes(int, const struct timeval [2]);
+#endif
+int futimesat(int, const char *, const struct timeval [2]);
+#ifdef __wasilibc_unmodified_upstream /* WASI libc doesn't build the legacy functions */
+int lutimes(const char *, const struct timeval [2]);
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no way to set the time */
+int settimeofday(const struct timeval *, const struct timezone *);
+int adjtime (const struct timeval *, struct timeval *);
+#endif
+#define timerisset(t) ((t)->tv_sec || (t)->tv_usec)
+#define timerclear(t) ((t)->tv_sec = (t)->tv_usec = 0)
+#define timercmp(s,t,op) ((s)->tv_sec == (t)->tv_sec ? \
+ (s)->tv_usec op (t)->tv_usec : (s)->tv_sec op (t)->tv_sec)
+#define timeradd(s,t,a) (void) ( (a)->tv_sec = (s)->tv_sec + (t)->tv_sec, \
+ ((a)->tv_usec = (s)->tv_usec + (t)->tv_usec) >= 1000000 && \
+ ((a)->tv_usec -= 1000000, (a)->tv_sec++) )
+#define timersub(s,t,a) (void) ( (a)->tv_sec = (s)->tv_sec - (t)->tv_sec, \
+ ((a)->tv_usec = (s)->tv_usec - (t)->tv_usec) < 0 && \
+ ((a)->tv_usec += 1000000, (a)->tv_sec--) )
+#endif
+
+#if defined(_GNU_SOURCE)
+#define TIMEVAL_TO_TIMESPEC(tv, ts) ( \
+ (ts)->tv_sec = (tv)->tv_sec, \
+ (ts)->tv_nsec = (tv)->tv_usec * 1000, \
+ (void)0 )
+#define TIMESPEC_TO_TIMEVAL(tv, ts) ( \
+ (tv)->tv_sec = (ts)->tv_sec, \
+ (tv)->tv_usec = (ts)->tv_nsec / 1000, \
+ (void)0 )
+#endif
+
+#if _REDIR_TIME64
+__REDIR(gettimeofday, __gettimeofday_time64);
+__REDIR(getitimer, __getitimer_time64);
+__REDIR(setitimer, __setitimer_time64);
+__REDIR(utimes, __utimes_time64);
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+__REDIR(futimes, __futimes_time64);
+__REDIR(futimesat, __futimesat_time64);
+__REDIR(lutimes, __lutimes_time64);
+__REDIR(settimeofday, __settimeofday_time64);
+__REDIR(adjtime, __adjtime64);
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/timeb.h b/libc-top-half/musl/include/sys/timeb.h
new file mode 100644
index 0000000..628239b
--- /dev/null
+++ b/libc-top-half/musl/include/sys/timeb.h
@@ -0,0 +1,28 @@
+#ifndef _SYS_TIMEB_H
+#define _SYS_TIMEB_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_time_t
+
+#include <bits/alltypes.h>
+
+struct timeb {
+ time_t time;
+ unsigned short millitm;
+ short timezone, dstflag;
+};
+
+int ftime(struct timeb *);
+
+#if _REDIR_TIME64
+__REDIR(ftime, __ftime64);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/timerfd.h b/libc-top-half/musl/include/sys/timerfd.h
new file mode 100644
index 0000000..1b832cd
--- /dev/null
+++ b/libc-top-half/musl/include/sys/timerfd.h
@@ -0,0 +1,32 @@
+#ifndef _SYS_TIMERFD_H
+#define _SYS_TIMERFD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <time.h>
+#include <fcntl.h>
+
+#define TFD_NONBLOCK O_NONBLOCK
+#define TFD_CLOEXEC O_CLOEXEC
+
+#define TFD_TIMER_ABSTIME 1
+#define TFD_TIMER_CANCEL_ON_SET (1 << 1)
+
+struct itimerspec;
+
+int timerfd_create(int, int);
+int timerfd_settime(int, int, const struct itimerspec *, struct itimerspec *);
+int timerfd_gettime(int, struct itimerspec *);
+
+#if _REDIR_TIME64
+__REDIR(timerfd_settime, __timerfd_settime64);
+__REDIR(timerfd_gettime, __timerfd_gettime64);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/times.h b/libc-top-half/musl/include/sys/times.h
new file mode 100644
index 0000000..cdaeeee
--- /dev/null
+++ b/libc-top-half/musl/include/sys/times.h
@@ -0,0 +1,34 @@
+#ifndef _WASI_EMULATED_PROCESS_CLOCKS
+#error WASI lacks process-associated clocks; to enable emulation of the `times` function using \
+the wall clock, which isn't sensitive to whether the program is running or suspended, \
+compile with -D_WASI_EMULATED_PROCESS_CLOCKS and link with -lwasi-emulated-process-clocks
+#else
+#ifndef _SYS_TIMES_H
+#define _SYS_TIMES_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __NEED_clock_t
+#include <bits/alltypes.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+struct tms {
+ clock_t tms_utime;
+ clock_t tms_stime;
+ clock_t tms_cutime;
+ clock_t tms_cstime;
+};
+#else
+#include <__struct_tms.h>
+#endif
+
+clock_t times (struct tms *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/timex.h b/libc-top-half/musl/include/sys/timex.h
new file mode 100644
index 0000000..8b417e1
--- /dev/null
+++ b/libc-top-half/musl/include/sys/timex.h
@@ -0,0 +1,103 @@
+#ifndef _SYS_TIMEX_H
+#define _SYS_TIMEX_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __NEED_clockid_t
+
+#include <bits/alltypes.h>
+
+#include <sys/time.h>
+
+struct ntptimeval {
+ struct timeval time;
+ long maxerror, esterror;
+};
+
+struct timex {
+ unsigned modes;
+ long offset, freq, maxerror, esterror;
+ int status;
+ long constant, precision, tolerance;
+ struct timeval time;
+ long tick, ppsfreq, jitter;
+ int shift;
+ long stabil, jitcnt, calcnt, errcnt, stbcnt;
+ int tai;
+ int __padding[11];
+};
+
+#define ADJ_OFFSET 0x0001
+#define ADJ_FREQUENCY 0x0002
+#define ADJ_MAXERROR 0x0004
+#define ADJ_ESTERROR 0x0008
+#define ADJ_STATUS 0x0010
+#define ADJ_TIMECONST 0x0020
+#define ADJ_TAI 0x0080
+#define ADJ_SETOFFSET 0x0100
+#define ADJ_MICRO 0x1000
+#define ADJ_NANO 0x2000
+#define ADJ_TICK 0x4000
+#define ADJ_OFFSET_SINGLESHOT 0x8001
+#define ADJ_OFFSET_SS_READ 0xa001
+
+#define MOD_OFFSET ADJ_OFFSET
+#define MOD_FREQUENCY ADJ_FREQUENCY
+#define MOD_MAXERROR ADJ_MAXERROR
+#define MOD_ESTERROR ADJ_ESTERROR
+#define MOD_STATUS ADJ_STATUS
+#define MOD_TIMECONST ADJ_TIMECONST
+#define MOD_CLKB ADJ_TICK
+#define MOD_CLKA ADJ_OFFSET_SINGLESHOT
+#define MOD_TAI ADJ_TAI
+#define MOD_MICRO ADJ_MICRO
+#define MOD_NANO ADJ_NANO
+
+#define STA_PLL 0x0001
+#define STA_PPSFREQ 0x0002
+#define STA_PPSTIME 0x0004
+#define STA_FLL 0x0008
+
+#define STA_INS 0x0010
+#define STA_DEL 0x0020
+#define STA_UNSYNC 0x0040
+#define STA_FREQHOLD 0x0080
+
+#define STA_PPSSIGNAL 0x0100
+#define STA_PPSJITTER 0x0200
+#define STA_PPSWANDER 0x0400
+#define STA_PPSERROR 0x0800
+
+#define STA_CLOCKERR 0x1000
+#define STA_NANO 0x2000
+#define STA_MODE 0x4000
+#define STA_CLK 0x8000
+
+#define STA_RONLY (STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | \
+ STA_PPSERROR | STA_CLOCKERR | STA_NANO | STA_MODE | STA_CLK)
+
+#define TIME_OK 0
+#define TIME_INS 1
+#define TIME_DEL 2
+#define TIME_OOP 3
+#define TIME_WAIT 4
+#define TIME_ERROR 5
+#define TIME_BAD TIME_ERROR
+
+#define MAXTC 6
+
+int adjtimex(struct timex *);
+int clock_adjtime(clockid_t, struct timex *);
+
+#if _REDIR_TIME64
+__REDIR(adjtimex, __adjtimex_time64);
+__REDIR(clock_adjtime, __clock_adjtime64);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/ttydefaults.h b/libc-top-half/musl/include/sys/ttydefaults.h
new file mode 100644
index 0000000..edb55bc
--- /dev/null
+++ b/libc-top-half/musl/include/sys/ttydefaults.h
@@ -0,0 +1,34 @@
+#ifndef _SYS_TTYDEFAULTS_H
+#define _SYS_TTYDEFAULTS_H
+
+#define TTYDEF_IFLAG (BRKINT | ISTRIP | ICRNL | IMAXBEL | IXON | IXANY)
+#define TTYDEF_OFLAG (OPOST | ONLCR | XTABS)
+#define TTYDEF_LFLAG (ECHO | ICANON | ISIG | IEXTEN | ECHOE|ECHOKE|ECHOCTL)
+#define TTYDEF_CFLAG (CREAD | CS7 | PARENB | HUPCL)
+#define TTYDEF_SPEED (B9600)
+#define CTRL(x) ((x)&037)
+#define CEOF CTRL('d')
+
+#define CEOL '\0'
+#define CSTATUS '\0'
+
+#define CERASE 0177
+#define CINTR CTRL('c')
+#define CKILL CTRL('u')
+#define CMIN 1
+#define CQUIT 034
+#define CSUSP CTRL('z')
+#define CTIME 0
+#define CDSUSP CTRL('y')
+#define CSTART CTRL('q')
+#define CSTOP CTRL('s')
+#define CLNEXT CTRL('v')
+#define CDISCARD CTRL('o')
+#define CWERASE CTRL('w')
+#define CREPRINT CTRL('r')
+#define CEOT CEOF
+#define CBRK CEOL
+#define CRPRNT CREPRINT
+#define CFLUSH CDISCARD
+
+#endif
diff --git a/libc-top-half/musl/include/sys/types.h b/libc-top-half/musl/include/sys/types.h
new file mode 100644
index 0000000..0c35541
--- /dev/null
+++ b/libc-top-half/musl/include/sys/types.h
@@ -0,0 +1,85 @@
+#ifndef _SYS_TYPES_H
+#define _SYS_TYPES_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_ino_t
+#define __NEED_dev_t
+#define __NEED_uid_t
+#define __NEED_gid_t
+#define __NEED_mode_t
+#define __NEED_nlink_t
+#define __NEED_off_t
+#define __NEED_pid_t
+#define __NEED_size_t
+#define __NEED_ssize_t
+#define __NEED_time_t
+#define __NEED_timer_t
+#define __NEED_clockid_t
+
+#define __NEED_blkcnt_t
+#define __NEED_fsblkcnt_t
+#define __NEED_fsfilcnt_t
+
+#define __NEED_id_t
+#define __NEED_key_t
+#define __NEED_clock_t
+#define __NEED_suseconds_t
+#define __NEED_blksize_t
+
+#define __NEED_pthread_t
+#define __NEED_pthread_attr_t
+#define __NEED_pthread_mutexattr_t
+#define __NEED_pthread_condattr_t
+#define __NEED_pthread_rwlockattr_t
+#define __NEED_pthread_barrierattr_t
+#define __NEED_pthread_mutex_t
+#define __NEED_pthread_cond_t
+#define __NEED_pthread_rwlock_t
+#define __NEED_pthread_barrier_t
+#define __NEED_pthread_spinlock_t
+#define __NEED_pthread_key_t
+#define __NEED_pthread_once_t
+#define __NEED_useconds_t
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define __NEED_int8_t
+#define __NEED_int16_t
+#define __NEED_int32_t
+#define __NEED_int64_t
+#define __NEED_u_int64_t
+#define __NEED_register_t
+#endif
+
+#include <bits/alltypes.h>
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+typedef unsigned char u_int8_t;
+typedef unsigned short u_int16_t;
+typedef unsigned u_int32_t;
+typedef char *caddr_t;
+typedef unsigned char u_char;
+typedef unsigned short u_short, ushort;
+typedef unsigned u_int, uint;
+typedef unsigned long u_long, ulong;
+typedef long long quad_t;
+typedef unsigned long long u_quad_t;
+#include <endian.h>
+#include <sys/select.h>
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#define blkcnt64_t blkcnt_t
+#define fsblkcnt64_t fsblkcnt_t
+#define fsfilcnt64_t fsfilcnt_t
+#define ino64_t ino_t
+#define off64_t off_t
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/ucontext.h b/libc-top-half/musl/include/sys/ucontext.h
new file mode 100644
index 0000000..5fdbd63
--- /dev/null
+++ b/libc-top-half/musl/include/sys/ucontext.h
@@ -0,0 +1 @@
+#include <ucontext.h>
diff --git a/libc-top-half/musl/include/sys/uio.h b/libc-top-half/musl/include/sys/uio.h
new file mode 100644
index 0000000..00f73a2
--- /dev/null
+++ b/libc-top-half/musl/include/sys/uio.h
@@ -0,0 +1,48 @@
+#ifndef _SYS_UIO_H
+#define _SYS_UIO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_size_t
+#define __NEED_ssize_t
+#define __NEED_struct_iovec
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define __NEED_off_t
+#endif
+
+#ifdef _GNU_SOURCE
+#define __NEED_pid_t
+#endif
+
+#include <bits/alltypes.h>
+
+#define UIO_MAXIOV 1024
+
+ssize_t readv (int, const struct iovec *, int);
+ssize_t writev (int, const struct iovec *, int);
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+ssize_t preadv (int, const struct iovec *, int, off_t);
+ssize_t pwritev (int, const struct iovec *, int, off_t);
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#define preadv64 preadv
+#define pwritev64 pwritev
+#define off64_t off_t
+#endif
+#endif
+
+#ifdef _GNU_SOURCE
+ssize_t process_vm_writev(pid_t, const struct iovec *, unsigned long, const struct iovec *, unsigned long, unsigned long);
+ssize_t process_vm_readv(pid_t, const struct iovec *, unsigned long, const struct iovec *, unsigned long, unsigned long);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/un.h b/libc-top-half/musl/include/sys/un.h
new file mode 100644
index 0000000..7116956
--- /dev/null
+++ b/libc-top-half/musl/include/sys/un.h
@@ -0,0 +1,39 @@
+#ifndef _SYS_UN_H
+#define _SYS_UN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_sa_family_t
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define __NEED_size_t
+#endif
+
+#include <bits/alltypes.h>
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no UNIX-domain sockets */
+struct sockaddr_un {
+ sa_family_t sun_family;
+ char sun_path[108];
+};
+#else
+#include <__struct_sockaddr_un.h>
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#ifdef __wasilibc_unmodified_upstream /* Declare strlen with the same attributes as <string.h> uses */
+size_t strlen(const char *);
+#else
+size_t strlen(const char *) __attribute__((__nothrow__, __leaf__, __pure__, __nonnull__(1)));
+#endif
+#define SUN_LEN(s) (2+strlen((s)->sun_path))
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/user.h b/libc-top-half/musl/include/sys/user.h
new file mode 100644
index 0000000..96a0340
--- /dev/null
+++ b/libc-top-half/musl/include/sys/user.h
@@ -0,0 +1,16 @@
+#ifndef _SYS_USER_H
+#define _SYS_USER_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <limits.h>
+#include <stdint.h>
+#include <unistd.h>
+
+#include <bits/user.h>
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/utsname.h b/libc-top-half/musl/include/sys/utsname.h
new file mode 100644
index 0000000..2c80fb5
--- /dev/null
+++ b/libc-top-half/musl/include/sys/utsname.h
@@ -0,0 +1,29 @@
+#ifndef _SYS_UTSNAME_H
+#define _SYS_UTSNAME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+struct utsname {
+ char sysname[65];
+ char nodename[65];
+ char release[65];
+ char version[65];
+ char machine[65];
+#ifdef _GNU_SOURCE
+ char domainname[65];
+#else
+ char __domainname[65];
+#endif
+};
+
+int uname (struct utsname *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/sys/vfs.h b/libc-top-half/musl/include/sys/vfs.h
new file mode 100644
index 0000000..a899db2
--- /dev/null
+++ b/libc-top-half/musl/include/sys/vfs.h
@@ -0,0 +1 @@
+#include <sys/statfs.h>
diff --git a/libc-top-half/musl/include/sys/vt.h b/libc-top-half/musl/include/sys/vt.h
new file mode 100644
index 0000000..5000de4
--- /dev/null
+++ b/libc-top-half/musl/include/sys/vt.h
@@ -0,0 +1 @@
+#include <bits/vt.h>
diff --git a/libc-top-half/musl/include/sys/wait.h b/libc-top-half/musl/include/sys/wait.h
new file mode 100644
index 0000000..d4b1f2e
--- /dev/null
+++ b/libc-top-half/musl/include/sys/wait.h
@@ -0,0 +1,67 @@
+#ifndef _SYS_WAIT_H
+#define _SYS_WAIT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_pid_t
+#define __NEED_id_t
+#include <bits/alltypes.h>
+
+typedef enum {
+ P_ALL = 0,
+ P_PID = 1,
+ P_PGID = 2,
+ P_PIDFD = 3
+} idtype_t;
+
+pid_t wait (int *);
+pid_t waitpid (pid_t, int *, int );
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+#include <signal.h>
+int waitid (idtype_t, id_t, siginfo_t *, int);
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#include <sys/resource.h>
+pid_t wait3 (int *, int, struct rusage *);
+pid_t wait4 (pid_t, int *, int, struct rusage *);
+#endif
+
+#define WNOHANG 1
+#define WUNTRACED 2
+
+#define WSTOPPED 2
+#define WEXITED 4
+#define WCONTINUED 8
+#define WNOWAIT 0x1000000
+
+#define __WNOTHREAD 0x20000000
+#define __WALL 0x40000000
+#define __WCLONE 0x80000000
+
+#define WEXITSTATUS(s) (((s) & 0xff00) >> 8)
+#define WTERMSIG(s) ((s) & 0x7f)
+#define WSTOPSIG(s) WEXITSTATUS(s)
+#define WCOREDUMP(s) ((s) & 0x80)
+#define WIFEXITED(s) (!WTERMSIG(s))
+#define WIFSTOPPED(s) ((short)((((s)&0xffff)*0x10001)>>8) > 0x7f00)
+#define WIFSIGNALED(s) (((s)&0xffff)-1U < 0xffu)
+#define WIFCONTINUED(s) ((s) == 0xffff)
+
+#if _REDIR_TIME64
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+__REDIR(wait3, __wait3_time64);
+__REDIR(wait4, __wait4_time64);
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/sys/xattr.h b/libc-top-half/musl/include/sys/xattr.h
new file mode 100644
index 0000000..eeeaafc
--- /dev/null
+++ b/libc-top-half/musl/include/sys/xattr.h
@@ -0,0 +1,32 @@
+#ifndef _SYS_XATTR_H
+#define _SYS_XATTR_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __NEED_ssize_t
+#define __NEED_size_t
+#include <bits/alltypes.h>
+
+#define XATTR_CREATE 1
+#define XATTR_REPLACE 2
+
+ssize_t getxattr(const char *, const char *, void *, size_t);
+ssize_t lgetxattr(const char *, const char *, void *, size_t);
+ssize_t fgetxattr(int, const char *, void *, size_t);
+ssize_t listxattr(const char *, char *, size_t);
+ssize_t llistxattr(const char *, char *, size_t);
+ssize_t flistxattr(int, char *, size_t);
+int setxattr(const char *, const char *, const void *, size_t, int);
+int lsetxattr(const char *, const char *, const void *, size_t, int);
+int fsetxattr(int, const char *, const void *, size_t, int);
+int removexattr(const char *, const char *);
+int lremovexattr(const char *, const char *);
+int fremovexattr(int, const char *);
+
+#define __UAPI_DEF_XATTR 0
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/syscall.h b/libc-top-half/musl/include/syscall.h
new file mode 100644
index 0000000..4c30578
--- /dev/null
+++ b/libc-top-half/musl/include/syscall.h
@@ -0,0 +1 @@
+#include <sys/syscall.h>
diff --git a/libc-top-half/musl/include/sysexits.h b/libc-top-half/musl/include/sysexits.h
new file mode 100644
index 0000000..16eeb41
--- /dev/null
+++ b/libc-top-half/musl/include/sysexits.h
@@ -0,0 +1,21 @@
+#ifndef _SYSEXITS_H
+#define _SYSEXITS_H
+#define EX_OK 0
+#define EX__BASE 64
+#define EX_USAGE 64
+#define EX_DATAERR 65
+#define EX_NOINPUT 66
+#define EX_NOUSER 67
+#define EX_NOHOST 68
+#define EX_UNAVAILABLE 69
+#define EX_SOFTWARE 70
+#define EX_OSERR 71
+#define EX_OSFILE 72
+#define EX_CANTCREAT 73
+#define EX_IOERR 74
+#define EX_TEMPFAIL 75
+#define EX_PROTOCOL 76
+#define EX_NOPERM 77
+#define EX_CONFIG 78
+#define EX__MAX 78
+#endif
diff --git a/libc-top-half/musl/include/syslog.h b/libc-top-half/musl/include/syslog.h
new file mode 100644
index 0000000..5b4d296
--- /dev/null
+++ b/libc-top-half/musl/include/syslog.h
@@ -0,0 +1,100 @@
+#ifndef _SYSLOG_H
+#define _SYSLOG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define LOG_EMERG 0
+#define LOG_ALERT 1
+#define LOG_CRIT 2
+#define LOG_ERR 3
+#define LOG_WARNING 4
+#define LOG_NOTICE 5
+#define LOG_INFO 6
+#define LOG_DEBUG 7
+
+#define LOG_PRIMASK 7
+#define LOG_PRI(p) ((p)&LOG_PRIMASK)
+#define LOG_MAKEPRI(f, p) (((f)<<3)|(p))
+
+#define LOG_MASK(p) (1<<(p))
+#define LOG_UPTO(p) ((1<<((p)+1))-1)
+
+#define LOG_KERN (0<<3)
+#define LOG_USER (1<<3)
+#define LOG_MAIL (2<<3)
+#define LOG_DAEMON (3<<3)
+#define LOG_AUTH (4<<3)
+#define LOG_SYSLOG (5<<3)
+#define LOG_LPR (6<<3)
+#define LOG_NEWS (7<<3)
+#define LOG_UUCP (8<<3)
+#define LOG_CRON (9<<3)
+#define LOG_AUTHPRIV (10<<3)
+#define LOG_FTP (11<<3)
+
+#define LOG_LOCAL0 (16<<3)
+#define LOG_LOCAL1 (17<<3)
+#define LOG_LOCAL2 (18<<3)
+#define LOG_LOCAL3 (19<<3)
+#define LOG_LOCAL4 (20<<3)
+#define LOG_LOCAL5 (21<<3)
+#define LOG_LOCAL6 (22<<3)
+#define LOG_LOCAL7 (23<<3)
+
+#define LOG_NFACILITIES 24
+#define LOG_FACMASK 0x3f8
+#define LOG_FAC(p) (((p)&LOG_FACMASK)>>3)
+
+#define LOG_PID 0x01
+#define LOG_CONS 0x02
+#define LOG_ODELAY 0x04
+#define LOG_NDELAY 0x08
+#define LOG_NOWAIT 0x10
+#define LOG_PERROR 0x20
+
+void closelog (void);
+void openlog (const char *, int, int);
+int setlogmask (int);
+void syslog (int, const char *, ...);
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define _PATH_LOG "/dev/log"
+#define __NEED_va_list
+#include <bits/alltypes.h>
+void vsyslog (int, const char *, va_list);
+#if defined(SYSLOG_NAMES)
+#define INTERNAL_NOPRI 0x10
+#define INTERNAL_MARK (LOG_NFACILITIES<<3)
+typedef struct {
+ char *c_name;
+ int c_val;
+} CODE;
+#define prioritynames ((CODE *)(const CODE []){ \
+ { "alert", LOG_ALERT }, { "crit", LOG_CRIT }, { "debug", LOG_DEBUG }, \
+ { "emerg", LOG_EMERG }, { "err", LOG_ERR }, { "error", LOG_ERR }, \
+ { "info", LOG_INFO }, { "none", INTERNAL_NOPRI }, \
+ { "notice", LOG_NOTICE }, { "panic", LOG_EMERG }, \
+ { "warn", LOG_WARNING }, { "warning", LOG_WARNING }, { 0, -1 } })
+#define facilitynames ((CODE *)(const CODE []){ \
+ { "auth", LOG_AUTH }, { "authpriv", LOG_AUTHPRIV }, \
+ { "cron", LOG_CRON }, { "daemon", LOG_DAEMON }, { "ftp", LOG_FTP }, \
+ { "kern", LOG_KERN }, { "lpr", LOG_LPR }, { "mail", LOG_MAIL }, \
+ { "mark", INTERNAL_MARK }, { "news", LOG_NEWS }, \
+ { "security", LOG_AUTH }, { "syslog", LOG_SYSLOG }, \
+ { "user", LOG_USER }, { "uucp", LOG_UUCP }, \
+ { "local0", LOG_LOCAL0 }, { "local1", LOG_LOCAL1 }, \
+ { "local2", LOG_LOCAL2 }, { "local3", LOG_LOCAL3 }, \
+ { "local4", LOG_LOCAL4 }, { "local5", LOG_LOCAL5 }, \
+ { "local6", LOG_LOCAL6 }, { "local7", LOG_LOCAL7 }, { 0, -1 } })
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/tar.h b/libc-top-half/musl/include/tar.h
new file mode 100644
index 0000000..be58984
--- /dev/null
+++ b/libc-top-half/musl/include/tar.h
@@ -0,0 +1,33 @@
+#ifndef _TAR_H
+#define _TAR_H
+
+#define TSUID 04000
+#define TSGID 02000
+#define TSVTX 01000
+#define TUREAD 00400
+#define TUWRITE 00200
+#define TUEXEC 00100
+#define TGREAD 00040
+#define TGWRITE 00020
+#define TGEXEC 00010
+#define TOREAD 00004
+#define TOWRITE 00002
+#define TOEXEC 00001
+
+#define REGTYPE '0'
+#define AREGTYPE '\0'
+#define LNKTYPE '1'
+#define SYMTYPE '2'
+#define CHRTYPE '3'
+#define BLKTYPE '4'
+#define DIRTYPE '5'
+#define FIFOTYPE '6'
+#define CONTTYPE '7'
+
+#define TMAGIC "ustar"
+#define TMAGLEN 6
+
+#define TVERSION "00"
+#define TVERSLEN 2
+
+#endif
diff --git a/libc-top-half/musl/include/termios.h b/libc-top-half/musl/include/termios.h
new file mode 100644
index 0000000..cbb5330
--- /dev/null
+++ b/libc-top-half/musl/include/termios.h
@@ -0,0 +1,50 @@
+#ifndef _TERMIOS_H
+#define _TERMIOS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_pid_t
+#define __NEED_struct_winsize
+
+#include <bits/alltypes.h>
+
+typedef unsigned char cc_t;
+typedef unsigned int speed_t;
+typedef unsigned int tcflag_t;
+
+#define NCCS 32
+
+#include <bits/termios.h>
+
+speed_t cfgetospeed (const struct termios *);
+speed_t cfgetispeed (const struct termios *);
+int cfsetospeed (struct termios *, speed_t);
+int cfsetispeed (struct termios *, speed_t);
+
+int tcgetattr (int, struct termios *);
+int tcsetattr (int, int, const struct termios *);
+
+int tcgetwinsize (int, struct winsize *);
+int tcsetwinsize (int, const struct winsize *);
+
+int tcsendbreak (int, int);
+int tcdrain (int);
+int tcflush (int, int);
+int tcflow (int, int);
+
+pid_t tcgetsid (int);
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+void cfmakeraw(struct termios *);
+int cfsetspeed(struct termios *, speed_t);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/tgmath.h b/libc-top-half/musl/include/tgmath.h
new file mode 100644
index 0000000..e41ccac
--- /dev/null
+++ b/libc-top-half/musl/include/tgmath.h
@@ -0,0 +1,270 @@
+#ifndef _TGMATH_H
+#define _TGMATH_H
+
+/*
+the return types are only correct with gcc (__GNUC__)
+otherwise they are long double or long double complex
+
+the long double version of a function is never chosen when
+sizeof(double) == sizeof(long double)
+(but the return type is set correctly with gcc)
+*/
+
+#include <math.h>
+#include <complex.h>
+
+#define __IS_FP(x) (sizeof((x)+1ULL) == sizeof((x)+1.0f))
+#define __IS_CX(x) (__IS_FP(x) && sizeof(x) == sizeof((x)+I))
+#define __IS_REAL(x) (__IS_FP(x) && 2*sizeof(x) == sizeof((x)+I))
+
+#define __FLT(x) (__IS_REAL(x) && sizeof(x) == sizeof(float))
+#define __LDBL(x) (__IS_REAL(x) && sizeof(x) == sizeof(long double) && sizeof(long double) != sizeof(double))
+
+#define __FLTCX(x) (__IS_CX(x) && sizeof(x) == sizeof(float complex))
+#define __DBLCX(x) (__IS_CX(x) && sizeof(x) == sizeof(double complex))
+#define __LDBLCX(x) (__IS_CX(x) && sizeof(x) == sizeof(long double complex) && sizeof(long double) != sizeof(double))
+
+/* return type */
+
+#ifdef __GNUC__
+/*
+the result must be casted to the right type
+(otherwise the result type is determined by the conversion
+rules applied to all the function return types so it is long
+double or long double complex except for integral functions)
+
+this cannot be done in c99, so the typeof gcc extension is
+used and that the type of ?: depends on wether an operand is
+a null pointer constant or not
+(in c11 _Generic can be used)
+
+the c arguments below must be integer constant expressions
+so they can be in null pointer constants
+(__IS_FP above was carefully chosen this way)
+*/
+/* if c then t else void */
+#define __type1(c,t) __typeof__(*(0?(t*)0:(void*)!(c)))
+/* if c then t1 else t2 */
+#define __type2(c,t1,t2) __typeof__(*(0?(__type1(c,t1)*)0:(__type1(!(c),t2)*)0))
+/* cast to double when x is integral, otherwise use typeof(x) */
+#define __RETCAST(x) ( \
+ __type2(__IS_FP(x), __typeof__(x), double))
+/* 2 args case, should work for complex types (cpow) */
+#define __RETCAST_2(x, y) ( \
+ __type2(__IS_FP(x) && __IS_FP(y), \
+ __typeof__((x)+(y)), \
+ __typeof__((x)+(y)+1.0)))
+/* 3 args case (fma only) */
+#define __RETCAST_3(x, y, z) ( \
+ __type2(__IS_FP(x) && __IS_FP(y) && __IS_FP(z), \
+ __typeof__((x)+(y)+(z)), \
+ __typeof__((x)+(y)+(z)+1.0)))
+/* drop complex from the type of x */
+/* TODO: wrong when sizeof(long double)==sizeof(double) */
+#define __RETCAST_REAL(x) ( \
+ __type2(__IS_FP(x) && sizeof((x)+I) == sizeof(float complex), float, \
+ __type2(sizeof((x)+1.0+I) == sizeof(double complex), double, \
+ long double)))
+/* add complex to the type of x */
+#define __RETCAST_CX(x) (__typeof__(__RETCAST(x)0+I))
+#else
+#define __RETCAST(x)
+#define __RETCAST_2(x, y)
+#define __RETCAST_3(x, y, z)
+#define __RETCAST_REAL(x)
+#define __RETCAST_CX(x)
+#endif
+
+/* function selection */
+
+#define __tg_real_nocast(fun, x) ( \
+ __FLT(x) ? fun ## f (x) : \
+ __LDBL(x) ? fun ## l (x) : \
+ fun(x) )
+
+#define __tg_real(fun, x) (__RETCAST(x)__tg_real_nocast(fun, x))
+
+#define __tg_real_2_1(fun, x, y) (__RETCAST(x)( \
+ __FLT(x) ? fun ## f (x, y) : \
+ __LDBL(x) ? fun ## l (x, y) : \
+ fun(x, y) ))
+
+#define __tg_real_2(fun, x, y) (__RETCAST_2(x, y)( \
+ __FLT(x) && __FLT(y) ? fun ## f (x, y) : \
+ __LDBL((x)+(y)) ? fun ## l (x, y) : \
+ fun(x, y) ))
+
+#define __tg_complex(fun, x) (__RETCAST_CX(x)( \
+ __FLTCX((x)+I) && __IS_FP(x) ? fun ## f (x) : \
+ __LDBLCX((x)+I) ? fun ## l (x) : \
+ fun(x) ))
+
+#define __tg_complex_retreal(fun, x) (__RETCAST_REAL(x)( \
+ __FLTCX((x)+I) && __IS_FP(x) ? fun ## f (x) : \
+ __LDBLCX((x)+I) ? fun ## l (x) : \
+ fun(x) ))
+
+#define __tg_real_complex(fun, x) (__RETCAST(x)( \
+ __FLTCX(x) ? c ## fun ## f (x) : \
+ __DBLCX(x) ? c ## fun (x) : \
+ __LDBLCX(x) ? c ## fun ## l (x) : \
+ __FLT(x) ? fun ## f (x) : \
+ __LDBL(x) ? fun ## l (x) : \
+ fun(x) ))
+
+/* special cases */
+
+#define __tg_real_remquo(x, y, z) (__RETCAST_2(x, y)( \
+ __FLT(x) && __FLT(y) ? remquof(x, y, z) : \
+ __LDBL((x)+(y)) ? remquol(x, y, z) : \
+ remquo(x, y, z) ))
+
+#define __tg_real_fma(x, y, z) (__RETCAST_3(x, y, z)( \
+ __FLT(x) && __FLT(y) && __FLT(z) ? fmaf(x, y, z) : \
+ __LDBL((x)+(y)+(z)) ? fmal(x, y, z) : \
+ fma(x, y, z) ))
+
+#define __tg_real_complex_pow(x, y) (__RETCAST_2(x, y)( \
+ __FLTCX((x)+(y)) && __IS_FP(x) && __IS_FP(y) ? cpowf(x, y) : \
+ __FLTCX((x)+(y)) ? cpow(x, y) : \
+ __DBLCX((x)+(y)) ? cpow(x, y) : \
+ __LDBLCX((x)+(y)) ? cpowl(x, y) : \
+ __FLT(x) && __FLT(y) ? powf(x, y) : \
+ __LDBL((x)+(y)) ? powl(x, y) : \
+ pow(x, y) ))
+
+#define __tg_real_complex_fabs(x) (__RETCAST_REAL(x)( \
+ __FLTCX(x) ? cabsf(x) : \
+ __DBLCX(x) ? cabs(x) : \
+ __LDBLCX(x) ? cabsl(x) : \
+ __FLT(x) ? fabsf(x) : \
+ __LDBL(x) ? fabsl(x) : \
+ fabs(x) ))
+
+/* suppress any macros in math.h or complex.h */
+
+#undef acos
+#undef acosh
+#undef asin
+#undef asinh
+#undef atan
+#undef atan2
+#undef atanh
+#undef carg
+#undef cbrt
+#undef ceil
+#undef cimag
+#undef conj
+#undef copysign
+#undef cos
+#undef cosh
+#undef cproj
+#undef creal
+#undef erf
+#undef erfc
+#undef exp
+#undef exp2
+#undef expm1
+#undef fabs
+#undef fdim
+#undef floor
+#undef fma
+#undef fmax
+#undef fmin
+#undef fmod
+#undef frexp
+#undef hypot
+#undef ilogb
+#undef ldexp
+#undef lgamma
+#undef llrint
+#undef llround
+#undef log
+#undef log10
+#undef log1p
+#undef log2
+#undef logb
+#undef lrint
+#undef lround
+#undef nearbyint
+#undef nextafter
+#undef nexttoward
+#undef pow
+#undef remainder
+#undef remquo
+#undef rint
+#undef round
+#undef scalbln
+#undef scalbn
+#undef sin
+#undef sinh
+#undef sqrt
+#undef tan
+#undef tanh
+#undef tgamma
+#undef trunc
+
+/* tg functions */
+
+#define acos(x) __tg_real_complex(acos, (x))
+#define acosh(x) __tg_real_complex(acosh, (x))
+#define asin(x) __tg_real_complex(asin, (x))
+#define asinh(x) __tg_real_complex(asinh, (x))
+#define atan(x) __tg_real_complex(atan, (x))
+#define atan2(x,y) __tg_real_2(atan2, (x), (y))
+#define atanh(x) __tg_real_complex(atanh, (x))
+#define carg(x) __tg_complex_retreal(carg, (x))
+#define cbrt(x) __tg_real(cbrt, (x))
+#define ceil(x) __tg_real(ceil, (x))
+#define cimag(x) __tg_complex_retreal(cimag, (x))
+#define conj(x) __tg_complex(conj, (x))
+#define copysign(x,y) __tg_real_2(copysign, (x), (y))
+#define cos(x) __tg_real_complex(cos, (x))
+#define cosh(x) __tg_real_complex(cosh, (x))
+#define cproj(x) __tg_complex(cproj, (x))
+#define creal(x) __tg_complex_retreal(creal, (x))
+#define erf(x) __tg_real(erf, (x))
+#define erfc(x) __tg_real(erfc, (x))
+#define exp(x) __tg_real_complex(exp, (x))
+#define exp2(x) __tg_real(exp2, (x))
+#define expm1(x) __tg_real(expm1, (x))
+#define fabs(x) __tg_real_complex_fabs(x)
+#define fdim(x,y) __tg_real_2(fdim, (x), (y))
+#define floor(x) __tg_real(floor, (x))
+#define fma(x,y,z) __tg_real_fma((x), (y), (z))
+#define fmax(x,y) __tg_real_2(fmax, (x), (y))
+#define fmin(x,y) __tg_real_2(fmin, (x), (y))
+#define fmod(x,y) __tg_real_2(fmod, (x), (y))
+#define frexp(x,y) __tg_real_2_1(frexp, (x), (y))
+#define hypot(x,y) __tg_real_2(hypot, (x), (y))
+#define ilogb(x) __tg_real_nocast(ilogb, (x))
+#define ldexp(x,y) __tg_real_2_1(ldexp, (x), (y))
+#define lgamma(x) __tg_real(lgamma, (x))
+#define llrint(x) __tg_real_nocast(llrint, (x))
+#define llround(x) __tg_real_nocast(llround, (x))
+#define log(x) __tg_real_complex(log, (x))
+#define log10(x) __tg_real(log10, (x))
+#define log1p(x) __tg_real(log1p, (x))
+#define log2(x) __tg_real(log2, (x))
+#define logb(x) __tg_real(logb, (x))
+#define lrint(x) __tg_real_nocast(lrint, (x))
+#define lround(x) __tg_real_nocast(lround, (x))
+#define nearbyint(x) __tg_real(nearbyint, (x))
+#define nextafter(x,y) __tg_real_2(nextafter, (x), (y))
+#define nexttoward(x,y) __tg_real_2(nexttoward, (x), (y))
+#define pow(x,y) __tg_real_complex_pow((x), (y))
+#define remainder(x,y) __tg_real_2(remainder, (x), (y))
+#define remquo(x,y,z) __tg_real_remquo((x), (y), (z))
+#define rint(x) __tg_real(rint, (x))
+#define round(x) __tg_real(round, (x))
+#define scalbln(x,y) __tg_real_2_1(scalbln, (x), (y))
+#define scalbn(x,y) __tg_real_2_1(scalbn, (x), (y))
+#define sin(x) __tg_real_complex(sin, (x))
+#define sinh(x) __tg_real_complex(sinh, (x))
+#define sqrt(x) __tg_real_complex(sqrt, (x))
+#define tan(x) __tg_real_complex(tan, (x))
+#define tanh(x) __tg_real_complex(tanh, (x))
+#define tgamma(x) __tg_real(tgamma, (x))
+#define trunc(x) __tg_real(trunc, (x))
+
+#endif
diff --git a/libc-top-half/musl/include/threads.h b/libc-top-half/musl/include/threads.h
new file mode 100644
index 0000000..52ec310
--- /dev/null
+++ b/libc-top-half/musl/include/threads.h
@@ -0,0 +1,93 @@
+#ifndef _THREADS_H
+#define _THREADS_H
+
+#include <features.h>
+#include <time.h>
+
+#ifdef __cplusplus
+extern "C" {
+typedef unsigned long thrd_t;
+#else
+typedef struct __pthread *thrd_t;
+#define thread_local _Thread_local
+#endif
+
+typedef int once_flag;
+typedef unsigned tss_t;
+typedef int (*thrd_start_t)(void *);
+typedef void (*tss_dtor_t)(void *);
+
+#define __NEED_cnd_t
+#define __NEED_mtx_t
+
+#include <bits/alltypes.h>
+
+#define TSS_DTOR_ITERATIONS 4
+
+enum {
+ thrd_success = 0,
+ thrd_busy = 1,
+ thrd_error = 2,
+ thrd_nomem = 3,
+ thrd_timedout = 4,
+};
+
+enum {
+ mtx_plain = 0,
+ mtx_recursive = 1,
+ mtx_timed = 2,
+};
+
+#define ONCE_FLAG_INIT 0
+
+int thrd_create(thrd_t *, thrd_start_t, void *);
+_Noreturn void thrd_exit(int);
+
+int thrd_detach(thrd_t);
+int thrd_join(thrd_t, int *);
+
+int thrd_sleep(const struct timespec *, struct timespec *);
+void thrd_yield(void);
+
+thrd_t thrd_current(void);
+int thrd_equal(thrd_t, thrd_t);
+#ifndef __cplusplus
+#define thrd_equal(A, B) ((A) == (B))
+#endif
+
+void call_once(once_flag *, void (*)(void));
+
+int mtx_init(mtx_t *, int);
+void mtx_destroy(mtx_t *);
+
+int mtx_lock(mtx_t *);
+int mtx_timedlock(mtx_t *__restrict, const struct timespec *__restrict);
+int mtx_trylock(mtx_t *);
+int mtx_unlock(mtx_t *);
+
+int cnd_init(cnd_t *);
+void cnd_destroy(cnd_t *);
+
+int cnd_broadcast(cnd_t *);
+int cnd_signal(cnd_t *);
+
+int cnd_timedwait(cnd_t *__restrict, mtx_t *__restrict, const struct timespec *__restrict);
+int cnd_wait(cnd_t *, mtx_t *);
+
+int tss_create(tss_t *, tss_dtor_t);
+void tss_delete(tss_t);
+
+int tss_set(tss_t, void *);
+void *tss_get(tss_t);
+
+#if _REDIR_TIME64
+__REDIR(thrd_sleep, __thrd_sleep_time64);
+__REDIR(mtx_timedlock, __mtx_timedlock_time64);
+__REDIR(cnd_timedwait, __cnd_timedwait_time64);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/time.h b/libc-top-half/musl/include/time.h
new file mode 100644
index 0000000..f534148
--- /dev/null
+++ b/libc-top-half/musl/include/time.h
@@ -0,0 +1,204 @@
+#ifndef _TIME_H
+#define _TIME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
+#if __cplusplus >= 201103L
+#define NULL nullptr
+#elif defined(__cplusplus)
+#define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
+#else
+#define __need_NULL
+#include <stddef.h>
+#endif
+
+
+#define __NEED_size_t
+#define __NEED_time_t
+#define __NEED_clock_t
+#define __NEED_struct_timespec
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+#define __NEED_clockid_t
+#define __NEED_timer_t
+#define __NEED_pid_t
+#define __NEED_locale_t
+#endif
+
+#include <bits/alltypes.h>
+
+#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
+#define __tm_gmtoff tm_gmtoff
+#define __tm_zone tm_zone
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+struct tm {
+ int tm_sec;
+ int tm_min;
+ int tm_hour;
+ int tm_mday;
+ int tm_mon;
+ int tm_year;
+ int tm_wday;
+ int tm_yday;
+ int tm_isdst;
+ long __tm_gmtoff;
+ const char *__tm_zone;
+};
+#else
+#include <__header_time.h>
+#endif
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_WASI_EMULATED_PROCESS_CLOCKS)
+clock_t clock (void);
+#else
+__attribute__((__deprecated__(
+"WASI lacks process-associated clocks; to enable emulation of the `clock` function using "
+"the wall clock, which isn't sensitive to whether the program is running or suspended, "
+"compile with -D_WASI_EMULATED_PROCESS_CLOCKS and link with -lwasi-emulated-process-clocks"
+)))
+clock_t clock (void);
+#endif
+time_t time (time_t *);
+double difftime (time_t, time_t);
+time_t mktime (struct tm *);
+size_t strftime (char *__restrict, size_t, const char *__restrict, const struct tm *__restrict);
+struct tm *gmtime (const time_t *);
+struct tm *localtime (const time_t *);
+char *asctime (const struct tm *);
+char *ctime (const time_t *);
+int timespec_get(struct timespec *, int);
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#define CLOCKS_PER_SEC 1000000L
+
+#define TIME_UTC 1
+#endif
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+
+size_t strftime_l (char * __restrict, size_t, const char * __restrict, const struct tm * __restrict, locale_t);
+
+struct tm *gmtime_r (const time_t *__restrict, struct tm *__restrict);
+struct tm *localtime_r (const time_t *__restrict, struct tm *__restrict);
+char *asctime_r (const struct tm *__restrict, char *__restrict);
+char *ctime_r (const time_t *, char *);
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no timezone tables */
+void tzset (void);
+#endif
+
+struct itimerspec {
+ struct timespec it_interval;
+ struct timespec it_value;
+};
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#define CLOCK_REALTIME 0
+#define CLOCK_MONOTONIC 1
+#define CLOCK_PROCESS_CPUTIME_ID 2
+#define CLOCK_THREAD_CPUTIME_ID 3
+#define CLOCK_MONOTONIC_RAW 4
+#define CLOCK_REALTIME_COARSE 5
+#define CLOCK_MONOTONIC_COARSE 6
+#define CLOCK_BOOTTIME 7
+#define CLOCK_REALTIME_ALARM 8
+#define CLOCK_BOOTTIME_ALARM 9
+#define CLOCK_SGI_CYCLE 10
+#define CLOCK_TAI 11
+
+#define TIMER_ABSTIME 1
+#endif
+
+int nanosleep (const struct timespec *, struct timespec *);
+int clock_getres (clockid_t, struct timespec *);
+int clock_gettime (clockid_t, struct timespec *);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no clock_settime */
+int clock_settime (clockid_t, const struct timespec *);
+#endif
+int clock_nanosleep (clockid_t, int, const struct timespec *, struct timespec *);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no clock_getcpuclockid */
+int clock_getcpuclockid (pid_t, clockid_t *);
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no timers */
+struct sigevent;
+int timer_create (clockid_t, struct sigevent *__restrict, timer_t *__restrict);
+int timer_delete (timer_t);
+int timer_settime (timer_t, int, const struct itimerspec *__restrict, struct itimerspec *__restrict);
+int timer_gettime (timer_t, struct itimerspec *);
+int timer_getoverrun (timer_t);
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no timezone tables */
+extern char *tzname[2];
+#endif
+
+#endif
+
+
+#if defined(_XOPEN_SOURCE) || defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
+char *strptime (const char *__restrict, const char *__restrict, struct tm *__restrict);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no timezone tables */
+extern int daylight;
+extern long timezone;
+#endif
+extern int getdate_err;
+struct tm *getdate (const char *);
+#endif
+
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#ifdef __wasilibc_unmodified_upstream /* WASI has no stime */
+int stime(const time_t *);
+#endif
+time_t timegm(struct tm *);
+#endif
+
+#if _REDIR_TIME64
+__REDIR(time, __time64);
+__REDIR(difftime, __difftime64);
+__REDIR(mktime, __mktime64);
+__REDIR(gmtime, __gmtime64);
+__REDIR(localtime, __localtime64);
+__REDIR(ctime, __ctime64);
+__REDIR(timespec_get, __timespec_get_time64);
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+__REDIR(gmtime_r, __gmtime64_r);
+__REDIR(localtime_r, __localtime64_r);
+__REDIR(ctime_r, __ctime64_r);
+__REDIR(nanosleep, __nanosleep_time64);
+__REDIR(clock_getres, __clock_getres_time64);
+__REDIR(clock_gettime, __clock_gettime64);
+__REDIR(clock_settime, __clock_settime64);
+__REDIR(clock_nanosleep, __clock_nanosleep_time64);
+__REDIR(timer_settime, __timer_settime64);
+__REDIR(timer_gettime, __timer_gettime64);
+#endif
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+__REDIR(stime, __stime64);
+__REDIR(timegm, __timegm_time64);
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/libc-top-half/musl/include/uchar.h b/libc-top-half/musl/include/uchar.h
new file mode 100644
index 0000000..7e5c4d4
--- /dev/null
+++ b/libc-top-half/musl/include/uchar.h
@@ -0,0 +1,29 @@
+#ifndef _UCHAR_H
+#define _UCHAR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if __cplusplus < 201103L
+typedef unsigned short char16_t;
+typedef unsigned char32_t;
+#endif
+
+#define __NEED_mbstate_t
+#define __NEED_size_t
+
+#include <features.h>
+#include <bits/alltypes.h>
+
+size_t c16rtomb(char *__restrict, char16_t, mbstate_t *__restrict);
+size_t mbrtoc16(char16_t *__restrict, const char *__restrict, size_t, mbstate_t *__restrict);
+
+size_t c32rtomb(char *__restrict, char32_t, mbstate_t *__restrict);
+size_t mbrtoc32(char32_t *__restrict, const char *__restrict, size_t, mbstate_t *__restrict);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/ucontext.h b/libc-top-half/musl/include/ucontext.h
new file mode 100644
index 0000000..0f75712
--- /dev/null
+++ b/libc-top-half/musl/include/ucontext.h
@@ -0,0 +1,25 @@
+#ifndef _UCONTEXT_H
+#define _UCONTEXT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#include <signal.h>
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define NGREG (sizeof(gregset_t)/sizeof(greg_t))
+#endif
+
+struct __ucontext;
+
+int getcontext(struct __ucontext *);
+void makecontext(struct __ucontext *, void (*)(), int, ...);
+int setcontext(const struct __ucontext *);
+int swapcontext(struct __ucontext *, const struct __ucontext *);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/libc-top-half/musl/include/ulimit.h b/libc-top-half/musl/include/ulimit.h
new file mode 100644
index 0000000..efdcd31
--- /dev/null
+++ b/libc-top-half/musl/include/ulimit.h
@@ -0,0 +1,17 @@
+#ifndef _ULIMIT_H
+#define _ULIMIT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UL_GETFSIZE 1
+#define UL_SETFSIZE 2
+
+long ulimit (int, ...);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/unistd.h b/libc-top-half/musl/include/unistd.h
new file mode 100644
index 0000000..b5cb5c6
--- /dev/null
+++ b/libc-top-half/musl/include/unistd.h
@@ -0,0 +1,577 @@
+#ifndef _UNISTD_H
+#define _UNISTD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define STDIN_FILENO 0
+#define STDOUT_FILENO 1
+#define STDERR_FILENO 2
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
+#define SEEK_DATA 3
+#define SEEK_HOLE 4
+#else
+#include <__header_unistd.h>
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
+#if __cplusplus >= 201103L
+#define NULL nullptr
+#elif defined(__cplusplus)
+#define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
+#else
+#define __need_NULL
+#include <stddef.h>
+#endif
+
+#define __NEED_size_t
+#define __NEED_ssize_t
+#define __NEED_uid_t
+#define __NEED_gid_t
+#define __NEED_off_t
+#define __NEED_pid_t
+#define __NEED_intptr_t
+#define __NEED_useconds_t
+
+#include <bits/alltypes.h>
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no pipe */
+int pipe(int [2]);
+int pipe2(int [2], int);
+#endif
+int close(int);
+int posix_close(int, int);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no dup */
+int dup(int);
+int dup2(int, int);
+int dup3(int, int, int);
+#endif
+off_t lseek(int, off_t, int);
+#ifdef __wasilibc_unmodified_upstream /* Optimize the readonly case of lseek */
+#else
+off_t __wasilibc_tell(int);
+
+#ifndef __cplusplus
+/*
+ * Optimize lseek in the case where it's just returning the current offset.
+ * This avoids importing `__wasi_fd_seek` altogether in many common cases.
+ *
+ * But don't do this for C++ because a simple macro wouldn't handle namespaces
+ * correctly:
+ * - User code could qualify the `lseek` call with `::`.
+ * - There may be another `lseek` in scope from a `using` declaration.
+ */
+#define lseek(fd, offset, whence) \
+ ({ \
+ off_t __f = (fd); \
+ off_t __o = (offset); \
+ off_t __w = (whence); \
+ __builtin_constant_p((offset)) && \
+ __builtin_constant_p((whence)) && \
+ __o == 0 && \
+ __w == SEEK_CUR \
+ ? __wasilibc_tell(__f) \
+ : lseek(__f, __o, __w); \
+ })
+#endif
+#endif
+int fsync(int);
+int fdatasync(int);
+
+ssize_t read(int, void *, size_t);
+ssize_t write(int, const void *, size_t);
+ssize_t pread(int, void *, size_t, off_t);
+ssize_t pwrite(int, const void *, size_t, off_t);
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no chown */
+int chown(const char *, uid_t, gid_t);
+int fchown(int, uid_t, gid_t);
+int lchown(const char *, uid_t, gid_t);
+int fchownat(int, const char *, uid_t, gid_t, int);
+#endif
+
+int link(const char *, const char *);
+int linkat(int, const char *, int, const char *, int);
+int symlink(const char *, const char *);
+int symlinkat(const char *, int, const char *);
+ssize_t readlink(const char *__restrict, char *__restrict, size_t);
+ssize_t readlinkat(int, const char *__restrict, char *__restrict, size_t);
+int unlink(const char *);
+int unlinkat(int, const char *, int);
+int rmdir(const char *);
+int truncate(const char *, off_t);
+int ftruncate(int, off_t);
+
+#ifdef __wasilibc_unmodified_upstream /* Use alternate WASI libc headers */
+#define F_OK 0
+#define R_OK 4
+#define W_OK 2
+#define X_OK 1
+#endif
+
+int access(const char *, int);
+int faccessat(int, const char *, int, int);
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no fchdir */
+int fchdir(int);
+#endif
+int chdir(const char *);
+char *getcwd(char *, size_t);
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no signals */
+unsigned alarm(unsigned);
+#endif
+unsigned sleep(unsigned);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no pause */
+int pause(void);
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no fork/exec */
+pid_t fork(void);
+pid_t _Fork(void);
+int execve(const char *, char *const [], char *const []);
+int execv(const char *, char *const []);
+int execle(const char *, const char *, ...);
+int execl(const char *, const char *, ...);
+int execvp(const char *, char *const []);
+int execlp(const char *, const char *, ...);
+int fexecve(int, char *const [], char *const []);
+#endif
+_Noreturn void _exit(int);
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_WASI_EMULATED_GETPID)
+pid_t getpid(void);
+#else
+__attribute__((__deprecated__(
+"WASI lacks process identifiers; to enable emulation of the `getpid` function using "
+"a placeholder value, which doesn't reflect the host PID of the program, "
+"compile with -D_WASI_EMULATED_GETPID and link with -lwasi-emulated-getpid"
+)))
+pid_t getpid(void);
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no getpid etc. */
+pid_t getppid(void);
+pid_t getpgrp(void);
+pid_t getpgid(pid_t);
+int setpgid(pid_t, pid_t);
+pid_t setsid(void);
+pid_t getsid(pid_t);
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no ttyname */
+char *ttyname(int);
+int ttyname_r(int, char *, size_t);
+#endif
+int isatty(int);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no process groups */
+pid_t tcgetpgrp(int);
+int tcsetpgrp(int, pid_t);
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* WASI has no getuid etc. */
+uid_t getuid(void);
+uid_t geteuid(void);
+gid_t getgid(void);
+gid_t getegid(void);
+int getgroups(int, gid_t []);
+int setuid(uid_t);
+int seteuid(uid_t);
+int setgid(gid_t);
+int setegid(gid_t);
+#endif
+
+char *getlogin(void);
+int getlogin_r(char *, size_t);
+int gethostname(char *, size_t);
+char *ctermid(char *);
+
+int getopt(int, char * const [], const char *);
+extern char *optarg;
+extern int optind, opterr, optopt;
+
+long pathconf(const char *, int);
+long fpathconf(int, int);
+long sysconf(int);
+size_t confstr(int, char *, size_t);
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define F_ULOCK 0
+#define F_LOCK 1
+#define F_TLOCK 2
+#define F_TEST 3
+#ifdef __wasilibc_unmodified_upstream /* WASI has no setreuid */
+int setreuid(uid_t, uid_t);
+int setregid(gid_t, gid_t);
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no POSIX file locking */
+int lockf(int, int, off_t);
+#endif
+long gethostid(void);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no nice, sync, or setpgrp */
+int nice(int);
+void sync(void);
+pid_t setpgrp(void);
+#endif
+char *crypt(const char *, const char *);
+void encrypt(char *, int);
+void swab(const void *__restrict, void *__restrict, ssize_t);
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) \
+ || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 < 700)
+int usleep(unsigned);
+unsigned ualarm(unsigned, unsigned);
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define L_SET 0
+#define L_INCR 1
+#define L_XTND 2
+#ifdef __wasilibc_unmodified_upstream /* WASI has no brk */
+int brk(void *);
+#endif
+void *sbrk(intptr_t);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no processes */
+pid_t vfork(void);
+int vhangup(void);
+int chroot(const char *);
+#endif
+int getpagesize(void);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no processes */
+int getdtablesize(void);
+int sethostname(const char *, size_t);
+int getdomainname(char *, size_t);
+int setdomainname(const char *, size_t);
+int setgroups(size_t, const gid_t *);
+char *getpass(const char *);
+int daemon(int, int);
+void setusershell(void);
+void endusershell(void);
+char *getusershell(void);
+int acct(const char *);
+long syscall(long, ...);
+int execvpe(const char *, char *const [], char *const []);
+int issetugid(void);
+#endif
+int getentropy(void *, size_t);
+extern int optreset;
+#endif
+
+#ifdef _GNU_SOURCE
+extern char **environ;
+#ifdef __wasilibc_unmodified_upstream /* WASI has no get/setresuid */
+int setresuid(uid_t, uid_t, uid_t);
+int setresgid(gid_t, gid_t, gid_t);
+int getresuid(uid_t *, uid_t *, uid_t *);
+int getresgid(gid_t *, gid_t *, gid_t *);
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no cwd */
+char *get_current_dir_name(void);
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no syncfs */
+int syncfs(int);
+#endif
+#ifdef __wasilibc_unmodified_upstream /* WASI has no eaccess */
+int euidaccess(const char *, int);
+int eaccess(const char *, int);
+ssize_t copy_file_range(int, off_t *, int, off_t *, size_t, unsigned);
+pid_t gettid(void);
+#endif
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
+#define lseek64 lseek
+#define pread64 pread
+#define pwrite64 pwrite
+#ifdef __wasilibc_unmodified_upstream /* WASI has no truncate */
+#define truncate64 truncate
+#endif
+#define ftruncate64 ftruncate
+#ifdef __wasilibc_unmodified_upstream /* WASI has no POSIX file locking */
+#define lockf64 lockf
+#endif
+#define off64_t off_t
+#endif
+
+#define POSIX_CLOSE_RESTART 0
+
+#define _XOPEN_VERSION 700
+#define _XOPEN_UNIX 1
+#define _XOPEN_ENH_I18N 1
+
+#define _POSIX_VERSION 200809L
+#define _POSIX2_VERSION _POSIX_VERSION
+
+#define _POSIX_ADVISORY_INFO _POSIX_VERSION
+#define _POSIX_CHOWN_RESTRICTED 1
+#define _POSIX_IPV6 _POSIX_VERSION
+#ifdef __wasilibc_unmodified_upstream /* WASI has no processes, mmap, or mq */
+#define _POSIX_JOB_CONTROL 1
+#define _POSIX_MAPPED_FILES _POSIX_VERSION
+#define _POSIX_MEMLOCK _POSIX_VERSION
+#define _POSIX_MEMLOCK_RANGE _POSIX_VERSION
+#define _POSIX_MEMORY_PROTECTION _POSIX_VERSION
+#define _POSIX_MESSAGE_PASSING _POSIX_VERSION
+#endif
+#define _POSIX_FSYNC _POSIX_VERSION
+#define _POSIX_NO_TRUNC 1
+#ifdef __wasilibc_unmodified_upstream /* WASI has no raw sockets */
+#define _POSIX_RAW_SOCKETS _POSIX_VERSION
+#endif
+#define _POSIX_REALTIME_SIGNALS _POSIX_VERSION
+#define _POSIX_REGEXP 1
+#ifdef __wasilibc_unmodified_upstream /* WASI has no processes */
+#define _POSIX_SAVED_IDS 1
+#define _POSIX_SHELL 1
+#define _POSIX_SPAWN _POSIX_VERSION
+#endif
+#define _POSIX_VDISABLE 0
+
+#define _POSIX_THREADS _POSIX_VERSION
+#define _POSIX_THREAD_PROCESS_SHARED _POSIX_VERSION
+#define _POSIX_THREAD_SAFE_FUNCTIONS _POSIX_VERSION
+#define _POSIX_THREAD_ATTR_STACKADDR _POSIX_VERSION
+#define _POSIX_THREAD_ATTR_STACKSIZE _POSIX_VERSION
+#define _POSIX_THREAD_PRIORITY_SCHEDULING _POSIX_VERSION
+#define _POSIX_THREAD_CPUTIME _POSIX_VERSION
+#define _POSIX_TIMERS _POSIX_VERSION
+#define _POSIX_TIMEOUTS _POSIX_VERSION
+#define _POSIX_MONOTONIC_CLOCK _POSIX_VERSION
+#define _POSIX_CPUTIME _POSIX_VERSION
+#define _POSIX_CLOCK_SELECTION _POSIX_VERSION
+#define _POSIX_BARRIERS _POSIX_VERSION
+#define _POSIX_SPIN_LOCKS _POSIX_VERSION
+#define _POSIX_READER_WRITER_LOCKS _POSIX_VERSION
+#ifdef __wasilibc_unmodified_upstream /* WASI has no POSIX async I/O, semaphores, or shared memory */
+#define _POSIX_ASYNCHRONOUS_IO _POSIX_VERSION
+#define _POSIX_SEMAPHORES _POSIX_VERSION
+#define _POSIX_SHARED_MEMORY_OBJECTS _POSIX_VERSION
+#endif
+
+#define _POSIX2_C_BIND _POSIX_VERSION
+
+#include <bits/posix.h>
+
+
+
+#define _PC_LINK_MAX 0
+#define _PC_MAX_CANON 1
+#define _PC_MAX_INPUT 2
+#define _PC_NAME_MAX 3
+#define _PC_PATH_MAX 4
+#define _PC_PIPE_BUF 5
+#define _PC_CHOWN_RESTRICTED 6
+#define _PC_NO_TRUNC 7
+#define _PC_VDISABLE 8
+#define _PC_SYNC_IO 9
+#define _PC_ASYNC_IO 10
+#define _PC_PRIO_IO 11
+#define _PC_SOCK_MAXBUF 12
+#define _PC_FILESIZEBITS 13
+#define _PC_REC_INCR_XFER_SIZE 14
+#define _PC_REC_MAX_XFER_SIZE 15
+#define _PC_REC_MIN_XFER_SIZE 16
+#define _PC_REC_XFER_ALIGN 17
+#define _PC_ALLOC_SIZE_MIN 18
+#define _PC_SYMLINK_MAX 19
+#define _PC_2_SYMLINKS 20
+
+#define _SC_ARG_MAX 0
+#define _SC_CHILD_MAX 1
+#define _SC_CLK_TCK 2
+#define _SC_NGROUPS_MAX 3
+#define _SC_OPEN_MAX 4
+#define _SC_STREAM_MAX 5
+#define _SC_TZNAME_MAX 6
+#define _SC_JOB_CONTROL 7
+#define _SC_SAVED_IDS 8
+#define _SC_REALTIME_SIGNALS 9
+#define _SC_PRIORITY_SCHEDULING 10
+#define _SC_TIMERS 11
+#define _SC_ASYNCHRONOUS_IO 12
+#define _SC_PRIORITIZED_IO 13
+#define _SC_SYNCHRONIZED_IO 14
+#define _SC_FSYNC 15
+#define _SC_MAPPED_FILES 16
+#define _SC_MEMLOCK 17
+#define _SC_MEMLOCK_RANGE 18
+#define _SC_MEMORY_PROTECTION 19
+#define _SC_MESSAGE_PASSING 20
+#define _SC_SEMAPHORES 21
+#define _SC_SHARED_MEMORY_OBJECTS 22
+#define _SC_AIO_LISTIO_MAX 23
+#define _SC_AIO_MAX 24
+#define _SC_AIO_PRIO_DELTA_MAX 25
+#define _SC_DELAYTIMER_MAX 26
+#define _SC_MQ_OPEN_MAX 27
+#define _SC_MQ_PRIO_MAX 28
+#define _SC_VERSION 29
+#define _SC_PAGE_SIZE 30
+#define _SC_PAGESIZE 30 /* !! */
+#define _SC_RTSIG_MAX 31
+#define _SC_SEM_NSEMS_MAX 32
+#define _SC_SEM_VALUE_MAX 33
+#define _SC_SIGQUEUE_MAX 34
+#define _SC_TIMER_MAX 35
+#define _SC_BC_BASE_MAX 36
+#define _SC_BC_DIM_MAX 37
+#define _SC_BC_SCALE_MAX 38
+#define _SC_BC_STRING_MAX 39
+#define _SC_COLL_WEIGHTS_MAX 40
+#define _SC_EXPR_NEST_MAX 42
+#define _SC_LINE_MAX 43
+#define _SC_RE_DUP_MAX 44
+#define _SC_2_VERSION 46
+#define _SC_2_C_BIND 47
+#define _SC_2_C_DEV 48
+#define _SC_2_FORT_DEV 49
+#define _SC_2_FORT_RUN 50
+#define _SC_2_SW_DEV 51
+#define _SC_2_LOCALEDEF 52
+#define _SC_UIO_MAXIOV 60 /* !! */
+#define _SC_IOV_MAX 60
+#define _SC_THREADS 67
+#define _SC_THREAD_SAFE_FUNCTIONS 68
+#define _SC_GETGR_R_SIZE_MAX 69
+#define _SC_GETPW_R_SIZE_MAX 70
+#define _SC_LOGIN_NAME_MAX 71
+#define _SC_TTY_NAME_MAX 72
+#define _SC_THREAD_DESTRUCTOR_ITERATIONS 73
+#define _SC_THREAD_KEYS_MAX 74
+#define _SC_THREAD_STACK_MIN 75
+#define _SC_THREAD_THREADS_MAX 76
+#define _SC_THREAD_ATTR_STACKADDR 77
+#define _SC_THREAD_ATTR_STACKSIZE 78
+#define _SC_THREAD_PRIORITY_SCHEDULING 79
+#define _SC_THREAD_PRIO_INHERIT 80
+#define _SC_THREAD_PRIO_PROTECT 81
+#define _SC_THREAD_PROCESS_SHARED 82
+#define _SC_NPROCESSORS_CONF 83
+#define _SC_NPROCESSORS_ONLN 84
+#define _SC_PHYS_PAGES 85
+#define _SC_AVPHYS_PAGES 86
+#define _SC_ATEXIT_MAX 87
+#define _SC_PASS_MAX 88
+#define _SC_XOPEN_VERSION 89
+#define _SC_XOPEN_XCU_VERSION 90
+#define _SC_XOPEN_UNIX 91
+#define _SC_XOPEN_CRYPT 92
+#define _SC_XOPEN_ENH_I18N 93
+#define _SC_XOPEN_SHM 94
+#define _SC_2_CHAR_TERM 95
+#define _SC_2_UPE 97
+#define _SC_XOPEN_XPG2 98
+#define _SC_XOPEN_XPG3 99
+#define _SC_XOPEN_XPG4 100
+#define _SC_NZERO 109
+#define _SC_XBS5_ILP32_OFF32 125
+#define _SC_XBS5_ILP32_OFFBIG 126
+#define _SC_XBS5_LP64_OFF64 127
+#define _SC_XBS5_LPBIG_OFFBIG 128
+#define _SC_XOPEN_LEGACY 129
+#define _SC_XOPEN_REALTIME 130
+#define _SC_XOPEN_REALTIME_THREADS 131
+#define _SC_ADVISORY_INFO 132
+#define _SC_BARRIERS 133
+#define _SC_CLOCK_SELECTION 137
+#define _SC_CPUTIME 138
+#define _SC_THREAD_CPUTIME 139
+#define _SC_MONOTONIC_CLOCK 149
+#define _SC_READER_WRITER_LOCKS 153
+#define _SC_SPIN_LOCKS 154
+#define _SC_REGEXP 155
+#define _SC_SHELL 157
+#define _SC_SPAWN 159
+#define _SC_SPORADIC_SERVER 160
+#define _SC_THREAD_SPORADIC_SERVER 161
+#define _SC_TIMEOUTS 164
+#define _SC_TYPED_MEMORY_OBJECTS 165
+#define _SC_2_PBS 168
+#define _SC_2_PBS_ACCOUNTING 169
+#define _SC_2_PBS_LOCATE 170
+#define _SC_2_PBS_MESSAGE 171
+#define _SC_2_PBS_TRACK 172
+#define _SC_SYMLOOP_MAX 173
+#define _SC_STREAMS 174
+#define _SC_2_PBS_CHECKPOINT 175
+#define _SC_V6_ILP32_OFF32 176
+#define _SC_V6_ILP32_OFFBIG 177
+#define _SC_V6_LP64_OFF64 178
+#define _SC_V6_LPBIG_OFFBIG 179
+#define _SC_HOST_NAME_MAX 180
+#define _SC_TRACE 181
+#define _SC_TRACE_EVENT_FILTER 182
+#define _SC_TRACE_INHERIT 183
+#define _SC_TRACE_LOG 184
+
+#define _SC_IPV6 235
+#define _SC_RAW_SOCKETS 236
+#define _SC_V7_ILP32_OFF32 237
+#define _SC_V7_ILP32_OFFBIG 238
+#define _SC_V7_LP64_OFF64 239
+#define _SC_V7_LPBIG_OFFBIG 240
+#define _SC_SS_REPL_MAX 241
+#define _SC_TRACE_EVENT_NAME_MAX 242
+#define _SC_TRACE_NAME_MAX 243
+#define _SC_TRACE_SYS_MAX 244
+#define _SC_TRACE_USER_EVENT_MAX 245
+#define _SC_XOPEN_STREAMS 246
+#define _SC_THREAD_ROBUST_PRIO_INHERIT 247
+#define _SC_THREAD_ROBUST_PRIO_PROTECT 248
+
+#define _CS_PATH 0
+#define _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS 1
+#define _CS_GNU_LIBC_VERSION 2
+#define _CS_GNU_LIBPTHREAD_VERSION 3
+#define _CS_POSIX_V5_WIDTH_RESTRICTED_ENVS 4
+#define _CS_POSIX_V7_WIDTH_RESTRICTED_ENVS 5
+
+#define _CS_POSIX_V6_ILP32_OFF32_CFLAGS 1116
+#define _CS_POSIX_V6_ILP32_OFF32_LDFLAGS 1117
+#define _CS_POSIX_V6_ILP32_OFF32_LIBS 1118
+#define _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS 1119
+#define _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS 1120
+#define _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS 1121
+#define _CS_POSIX_V6_ILP32_OFFBIG_LIBS 1122
+#define _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS 1123
+#define _CS_POSIX_V6_LP64_OFF64_CFLAGS 1124
+#define _CS_POSIX_V6_LP64_OFF64_LDFLAGS 1125
+#define _CS_POSIX_V6_LP64_OFF64_LIBS 1126
+#define _CS_POSIX_V6_LP64_OFF64_LINTFLAGS 1127
+#define _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS 1128
+#define _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS 1129
+#define _CS_POSIX_V6_LPBIG_OFFBIG_LIBS 1130
+#define _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS 1131
+#define _CS_POSIX_V7_ILP32_OFF32_CFLAGS 1132
+#define _CS_POSIX_V7_ILP32_OFF32_LDFLAGS 1133
+#define _CS_POSIX_V7_ILP32_OFF32_LIBS 1134
+#define _CS_POSIX_V7_ILP32_OFF32_LINTFLAGS 1135
+#define _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS 1136
+#define _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS 1137
+#define _CS_POSIX_V7_ILP32_OFFBIG_LIBS 1138
+#define _CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS 1139
+#define _CS_POSIX_V7_LP64_OFF64_CFLAGS 1140
+#define _CS_POSIX_V7_LP64_OFF64_LDFLAGS 1141
+#define _CS_POSIX_V7_LP64_OFF64_LIBS 1142
+#define _CS_POSIX_V7_LP64_OFF64_LINTFLAGS 1143
+#define _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS 1144
+#define _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS 1145
+#define _CS_POSIX_V7_LPBIG_OFFBIG_LIBS 1146
+#define _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS 1147
+#define _CS_V6_ENV 1148
+#define _CS_V7_ENV 1149
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/utime.h b/libc-top-half/musl/include/utime.h
new file mode 100644
index 0000000..5755bd5
--- /dev/null
+++ b/libc-top-half/musl/include/utime.h
@@ -0,0 +1,29 @@
+#ifndef _UTIME_H
+#define _UTIME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_time_t
+
+#include <bits/alltypes.h>
+
+struct utimbuf {
+ time_t actime;
+ time_t modtime;
+};
+
+int utime (const char *, const struct utimbuf *);
+
+#if _REDIR_TIME64
+__REDIR(utime, __utime64);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/utmp.h b/libc-top-half/musl/include/utmp.h
new file mode 100644
index 0000000..48a400d
--- /dev/null
+++ b/libc-top-half/musl/include/utmp.h
@@ -0,0 +1,52 @@
+#ifndef _UTMP_H
+#define _UTMP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <utmpx.h>
+
+#define ACCOUNTING 9
+#define UT_NAMESIZE 32
+#define UT_HOSTSIZE 256
+#define UT_LINESIZE 32
+
+struct lastlog {
+ time_t ll_time;
+ char ll_line[UT_LINESIZE];
+ char ll_host[UT_HOSTSIZE];
+};
+
+#define ut_time ut_tv.tv_sec
+#define ut_name ut_user
+#define ut_addr ut_addr_v6[0]
+#define utmp utmpx
+#define e_exit __e_exit
+#define e_termination __e_termination
+
+void endutent(void);
+struct utmp *getutent(void);
+struct utmp *getutid(const struct utmp *);
+struct utmp *getutline(const struct utmp *);
+struct utmp *pututline(const struct utmp *);
+void setutent(void);
+
+void updwtmp(const char *, const struct utmp *);
+int utmpname(const char *);
+
+int login_tty(int);
+
+#define _PATH_UTMP "/dev/null/utmp"
+#define _PATH_WTMP "/dev/null/wtmp"
+
+#define UTMP_FILE _PATH_UTMP
+#define WTMP_FILE _PATH_WTMP
+#define UTMP_FILENAME _PATH_UTMP
+#define WTMP_FILENAME _PATH_WTMP
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/utmpx.h b/libc-top-half/musl/include/utmpx.h
new file mode 100644
index 0000000..b293f42
--- /dev/null
+++ b/libc-top-half/musl/include/utmpx.h
@@ -0,0 +1,67 @@
+#ifndef _UTMPX_H
+#define _UTMPX_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_pid_t
+#define __NEED_time_t
+#define __NEED_suseconds_t
+#define __NEED_struct_timeval
+
+#include <bits/alltypes.h>
+
+struct utmpx {
+ short ut_type;
+ short __ut_pad1;
+ pid_t ut_pid;
+ char ut_line[32];
+ char ut_id[4];
+ char ut_user[32];
+ char ut_host[256];
+ struct {
+ short __e_termination;
+ short __e_exit;
+ } ut_exit;
+#if __BYTE_ORDER == 1234
+ int ut_session, __ut_pad2;
+#else
+ int __ut_pad2, ut_session;
+#endif
+ struct timeval ut_tv;
+ unsigned ut_addr_v6[4];
+ char __unused[20];
+};
+
+void endutxent(void);
+struct utmpx *getutxent(void);
+struct utmpx *getutxid(const struct utmpx *);
+struct utmpx *getutxline(const struct utmpx *);
+struct utmpx *pututxline(const struct utmpx *);
+void setutxent(void);
+
+#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
+#define e_exit __e_exit
+#define e_termination __e_termination
+void updwtmpx(const char *, const struct utmpx *);
+int utmpxname(const char *);
+#endif
+
+#define EMPTY 0
+#define RUN_LVL 1
+#define BOOT_TIME 2
+#define NEW_TIME 3
+#define OLD_TIME 4
+#define INIT_PROCESS 5
+#define LOGIN_PROCESS 6
+#define USER_PROCESS 7
+#define DEAD_PROCESS 8
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/values.h b/libc-top-half/musl/include/values.h
new file mode 100644
index 0000000..fe4949f
--- /dev/null
+++ b/libc-top-half/musl/include/values.h
@@ -0,0 +1,39 @@
+#ifndef _VALUES_H
+#define _VALUES_H
+
+#include <limits.h>
+
+#define CHARBITS (sizeof(char) * 8)
+#define SHORTBITS (sizeof(short) * 8)
+#define INTBITS (sizeof(int) * 8)
+#define LONGBITS (sizeof(long) * 8)
+#define PTRBITS (sizeof(char *) * 8)
+#define DOUBLEBITS (sizeof(double) * 8)
+#define FLOATBITS (sizeof(float) * 8)
+
+#define MINSHORT SHRT_MIN
+#define MININT INT_MIN
+#define MINLONG LONG_MIN
+
+#define MAXSHORT SHRT_MAX
+#define MAXINT INT_MAX
+#define MAXLONG LONG_MAX
+
+#define HIBITS MINSHORT
+#define HIBITL MINLONG
+
+#include <float.h>
+
+#define MAXDOUBLE DBL_MAX
+#undef MAXFLOAT
+#define MAXFLOAT FLT_MAX
+#define MINDOUBLE DBL_MIN
+#define MINFLOAT FLT_MIN
+#define DMINEXP DBL_MIN_EXP
+#define FMINEXP FLT_MIN_EXP
+#define DMAXEXP DBL_MAX_EXP
+#define FMAXEXP FLT_MAX_EXP
+
+#define BITSPERBYTE CHAR_BIT
+
+#endif
diff --git a/libc-top-half/musl/include/wait.h b/libc-top-half/musl/include/wait.h
new file mode 100644
index 0000000..98396e2
--- /dev/null
+++ b/libc-top-half/musl/include/wait.h
@@ -0,0 +1,2 @@
+#warning redirecting incorrect #include <wait.h> to <sys/wait.h>
+#include <sys/wait.h>
diff --git a/libc-top-half/musl/include/wchar.h b/libc-top-half/musl/include/wchar.h
new file mode 100644
index 0000000..06b088a
--- /dev/null
+++ b/libc-top-half/musl/include/wchar.h
@@ -0,0 +1,214 @@
+#ifndef _WCHAR_H
+#define _WCHAR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_FILE
+#define __NEED___isoc_va_list
+#define __NEED_size_t
+#define __NEED_wchar_t
+#define __NEED_wint_t
+#define __NEED_mbstate_t
+
+#ifdef __wasilibc_unmodified_upstream /* WASI doesn't need to define FILE as a complete type */
+#if __STDC_VERSION__ < 201112L
+#define __NEED_struct__IO_FILE
+#endif
+#endif
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define __NEED_locale_t
+#define __NEED_va_list
+#endif
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define __NEED_wctype_t
+#endif
+
+#include <bits/alltypes.h>
+
+#if L'\0'-1 > 0
+#define WCHAR_MAX (0xffffffffu+L'\0')
+#define WCHAR_MIN (0+L'\0')
+#else
+#define WCHAR_MAX (0x7fffffff+L'\0')
+#define WCHAR_MIN (-1-0x7fffffff+L'\0')
+#endif
+
+#ifdef __wasilibc_unmodified_upstream /* Use the compiler's definition of NULL */
+#if __cplusplus >= 201103L
+#define NULL nullptr
+#elif defined(__cplusplus)
+#define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
+#else
+#define __need_NULL
+#include <stddef.h>
+#endif
+
+#undef WEOF
+#define WEOF 0xffffffffU
+
+wchar_t *wcscpy (wchar_t *__restrict, const wchar_t *__restrict);
+wchar_t *wcsncpy (wchar_t *__restrict, const wchar_t *__restrict, size_t);
+
+wchar_t *wcscat (wchar_t *__restrict, const wchar_t *__restrict);
+wchar_t *wcsncat (wchar_t *__restrict, const wchar_t *__restrict, size_t);
+
+int wcscmp (const wchar_t *, const wchar_t *);
+int wcsncmp (const wchar_t *, const wchar_t *, size_t);
+
+int wcscoll(const wchar_t *, const wchar_t *);
+size_t wcsxfrm (wchar_t *__restrict, const wchar_t *__restrict, size_t);
+
+wchar_t *wcschr (const wchar_t *, wchar_t);
+wchar_t *wcsrchr (const wchar_t *, wchar_t);
+
+size_t wcscspn (const wchar_t *, const wchar_t *);
+size_t wcsspn (const wchar_t *, const wchar_t *);
+wchar_t *wcspbrk (const wchar_t *, const wchar_t *);
+
+wchar_t *wcstok (wchar_t *__restrict, const wchar_t *__restrict, wchar_t **__restrict);
+
+size_t wcslen (const wchar_t *);
+
+wchar_t *wcsstr (const wchar_t *__restrict, const wchar_t *__restrict);
+wchar_t *wcswcs (const wchar_t *, const wchar_t *);
+
+wchar_t *wmemchr (const wchar_t *, wchar_t, size_t);
+int wmemcmp (const wchar_t *, const wchar_t *, size_t);
+wchar_t *wmemcpy (wchar_t *__restrict, const wchar_t *__restrict, size_t);
+wchar_t *wmemmove (wchar_t *, const wchar_t *, size_t);
+wchar_t *wmemset (wchar_t *, wchar_t, size_t);
+
+wint_t btowc (int);
+int wctob (wint_t);
+
+int mbsinit (const mbstate_t *);
+size_t mbrtowc (wchar_t *__restrict, const char *__restrict, size_t, mbstate_t *__restrict);
+size_t wcrtomb (char *__restrict, wchar_t, mbstate_t *__restrict);
+
+size_t mbrlen (const char *__restrict, size_t, mbstate_t *__restrict);
+
+size_t mbsrtowcs (wchar_t *__restrict, const char **__restrict, size_t, mbstate_t *__restrict);
+size_t wcsrtombs (char *__restrict, const wchar_t **__restrict, size_t, mbstate_t *__restrict);
+
+float wcstof (const wchar_t *__restrict, wchar_t **__restrict);
+double wcstod (const wchar_t *__restrict, wchar_t **__restrict);
+long double wcstold (const wchar_t *__restrict, wchar_t **__restrict);
+
+long wcstol (const wchar_t *__restrict, wchar_t **__restrict, int);
+unsigned long wcstoul (const wchar_t *__restrict, wchar_t **__restrict, int);
+
+long long wcstoll (const wchar_t *__restrict, wchar_t **__restrict, int);
+unsigned long long wcstoull (const wchar_t *__restrict, wchar_t **__restrict, int);
+
+
+
+int fwide (FILE *, int);
+
+
+int wprintf (const wchar_t *__restrict, ...);
+int fwprintf (FILE *__restrict, const wchar_t *__restrict, ...);
+int swprintf (wchar_t *__restrict, size_t, const wchar_t *__restrict, ...);
+
+int vwprintf (const wchar_t *__restrict, __isoc_va_list);
+int vfwprintf (FILE *__restrict, const wchar_t *__restrict, __isoc_va_list);
+int vswprintf (wchar_t *__restrict, size_t, const wchar_t *__restrict, __isoc_va_list);
+
+int wscanf (const wchar_t *__restrict, ...);
+int fwscanf (FILE *__restrict, const wchar_t *__restrict, ...);
+int swscanf (const wchar_t *__restrict, const wchar_t *__restrict, ...);
+
+int vwscanf (const wchar_t *__restrict, __isoc_va_list);
+int vfwscanf (FILE *__restrict, const wchar_t *__restrict, __isoc_va_list);
+int vswscanf (const wchar_t *__restrict, const wchar_t *__restrict, __isoc_va_list);
+
+wint_t fgetwc (FILE *);
+wint_t getwc (FILE *);
+wint_t getwchar (void);
+
+wint_t fputwc (wchar_t, FILE *);
+wint_t putwc (wchar_t, FILE *);
+wint_t putwchar (wchar_t);
+
+wchar_t *fgetws (wchar_t *__restrict, int, FILE *__restrict);
+int fputws (const wchar_t *__restrict, FILE *__restrict);
+
+wint_t ungetwc (wint_t, FILE *);
+
+struct tm;
+size_t wcsftime (wchar_t *__restrict, size_t, const wchar_t *__restrict, const struct tm *__restrict);
+
+#undef iswdigit
+
+#if defined(_GNU_SOURCE)
+wint_t fgetwc_unlocked (FILE *);
+wint_t getwc_unlocked (FILE *);
+wint_t getwchar_unlocked (void);
+wint_t fputwc_unlocked (wchar_t, FILE *);
+wint_t putwc_unlocked (wchar_t, FILE *);
+wint_t putwchar_unlocked (wchar_t);
+wchar_t *fgetws_unlocked (wchar_t *__restrict, int, FILE *__restrict);
+int fputws_unlocked (const wchar_t *__restrict, FILE *__restrict);
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+size_t wcsftime_l (wchar_t *__restrict, size_t, const wchar_t *__restrict, const struct tm *__restrict, locale_t);
+#endif
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+FILE *open_wmemstream(wchar_t **, size_t *);
+size_t mbsnrtowcs(wchar_t *__restrict, const char **__restrict, size_t, size_t, mbstate_t *__restrict);
+size_t wcsnrtombs(char *__restrict, const wchar_t **__restrict, size_t, size_t, mbstate_t *__restrict);
+wchar_t *wcsdup(const wchar_t *);
+size_t wcsnlen (const wchar_t *, size_t);
+wchar_t *wcpcpy (wchar_t *__restrict, const wchar_t *__restrict);
+wchar_t *wcpncpy (wchar_t *__restrict, const wchar_t *__restrict, size_t);
+int wcscasecmp(const wchar_t *, const wchar_t *);
+int wcscasecmp_l(const wchar_t *, const wchar_t *, locale_t);
+int wcsncasecmp(const wchar_t *, const wchar_t *, size_t);
+int wcsncasecmp_l(const wchar_t *, const wchar_t *, size_t, locale_t);
+int wcscoll_l(const wchar_t *, const wchar_t *, locale_t);
+size_t wcsxfrm_l(wchar_t *__restrict, const wchar_t *__restrict, size_t, locale_t);
+#endif
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+int wcwidth (wchar_t);
+int wcswidth (const wchar_t *, size_t);
+int iswalnum(wint_t);
+int iswalpha(wint_t);
+int iswblank(wint_t);
+int iswcntrl(wint_t);
+int iswdigit(wint_t);
+int iswgraph(wint_t);
+int iswlower(wint_t);
+int iswprint(wint_t);
+int iswpunct(wint_t);
+int iswspace(wint_t);
+int iswupper(wint_t);
+int iswxdigit(wint_t);
+int iswctype(wint_t, wctype_t);
+wint_t towlower(wint_t);
+wint_t towupper(wint_t);
+wctype_t wctype(const char *);
+
+#ifndef __cplusplus
+#undef iswdigit
+#define iswdigit(a) (0 ? iswdigit(a) : ((unsigned)(a)-'0') < 10)
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/wctype.h b/libc-top-half/musl/include/wctype.h
new file mode 100644
index 0000000..bc2420d
--- /dev/null
+++ b/libc-top-half/musl/include/wctype.h
@@ -0,0 +1,79 @@
+#ifndef _WCTYPE_H
+#define _WCTYPE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_wint_t
+#define __NEED_wctype_t
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define __NEED_locale_t
+#endif
+
+#include <bits/alltypes.h>
+
+typedef const int * wctrans_t;
+
+#undef WEOF
+#define WEOF 0xffffffffU
+
+#undef iswdigit
+
+int iswalnum(wint_t);
+int iswalpha(wint_t);
+int iswblank(wint_t);
+int iswcntrl(wint_t);
+int iswdigit(wint_t);
+int iswgraph(wint_t);
+int iswlower(wint_t);
+int iswprint(wint_t);
+int iswpunct(wint_t);
+int iswspace(wint_t);
+int iswupper(wint_t);
+int iswxdigit(wint_t);
+int iswctype(wint_t, wctype_t);
+wint_t towctrans(wint_t, wctrans_t);
+wint_t towlower(wint_t);
+wint_t towupper(wint_t);
+wctrans_t wctrans(const char *);
+wctype_t wctype(const char *);
+
+#ifndef __cplusplus
+#undef iswdigit
+#define iswdigit(a) (0 ? iswdigit(a) : ((unsigned)(a)-'0') < 10)
+#endif
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+int iswalnum_l(wint_t, locale_t);
+int iswalpha_l(wint_t, locale_t);
+int iswblank_l(wint_t, locale_t);
+int iswcntrl_l(wint_t, locale_t);
+int iswdigit_l(wint_t, locale_t);
+int iswgraph_l(wint_t, locale_t);
+int iswlower_l(wint_t, locale_t);
+int iswprint_l(wint_t, locale_t);
+int iswpunct_l(wint_t, locale_t);
+int iswspace_l(wint_t, locale_t);
+int iswupper_l(wint_t, locale_t);
+int iswxdigit_l(wint_t, locale_t);
+int iswctype_l(wint_t, wctype_t, locale_t);
+wint_t towlower_l(wint_t, locale_t);
+wint_t towupper_l(wint_t, locale_t);
+wint_t towctrans_l(wint_t, wctrans_t, locale_t);
+wctrans_t wctrans_l(const char *, locale_t);
+wctype_t wctype_l(const char *, locale_t);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/include/wordexp.h b/libc-top-half/musl/include/wordexp.h
new file mode 100644
index 0000000..5460002
--- /dev/null
+++ b/libc-top-half/musl/include/wordexp.h
@@ -0,0 +1,41 @@
+#ifndef _WORDEXP_H
+#define _WORDEXP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#define __NEED_size_t
+
+#include <bits/alltypes.h>
+
+#define WRDE_DOOFFS 1
+#define WRDE_APPEND 2
+#define WRDE_NOCMD 4
+#define WRDE_REUSE 8
+#define WRDE_SHOWERR 16
+#define WRDE_UNDEF 32
+
+typedef struct {
+ size_t we_wordc;
+ char **we_wordv;
+ size_t we_offs;
+} wordexp_t;
+
+#define WRDE_NOSYS -1
+#define WRDE_NOSPACE 1
+#define WRDE_BADCHAR 2
+#define WRDE_BADVAL 3
+#define WRDE_CMDSUB 4
+#define WRDE_SYNTAX 5
+
+int wordexp (const char *__restrict, wordexp_t *__restrict, int);
+void wordfree (wordexp_t *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/ldso/dlstart.c b/libc-top-half/musl/ldso/dlstart.c
new file mode 100644
index 0000000..20d50f2
--- /dev/null
+++ b/libc-top-half/musl/ldso/dlstart.c
@@ -0,0 +1,148 @@
+#include <stddef.h>
+#include "dynlink.h"
+#include "libc.h"
+
+#ifndef START
+#define START "_dlstart"
+#endif
+
+#define SHARED
+
+#include "crt_arch.h"
+
+#ifndef GETFUNCSYM
+#define GETFUNCSYM(fp, sym, got) do { \
+ hidden void sym(); \
+ static void (*static_func_ptr)() = sym; \
+ __asm__ __volatile__ ( "" : "+m"(static_func_ptr) : : "memory"); \
+ *(fp) = static_func_ptr; } while(0)
+#endif
+
+hidden void _dlstart_c(size_t *sp, size_t *dynv)
+{
+ size_t i, aux[AUX_CNT], dyn[DYN_CNT];
+ size_t *rel, rel_size, base;
+
+ int argc = *sp;
+ char **argv = (void *)(sp+1);
+
+ for (i=argc+1; argv[i]; i++);
+ size_t *auxv = (void *)(argv+i+1);
+
+ for (i=0; i<AUX_CNT; i++) aux[i] = 0;
+ for (i=0; auxv[i]; i+=2) if (auxv[i]<AUX_CNT)
+ aux[auxv[i]] = auxv[i+1];
+
+#if DL_FDPIC
+ struct fdpic_loadseg *segs, fakeseg;
+ size_t j;
+ if (dynv) {
+ /* crt_arch.h entry point asm is responsible for reserving
+ * space and moving the extra fdpic arguments to the stack
+ * vector where they are easily accessible from C. */
+ segs = ((struct fdpic_loadmap *)(sp[-1] ? sp[-1] : sp[-2]))->segs;
+ } else {
+ /* If dynv is null, the entry point was started from loader
+ * that is not fdpic-aware. We can assume normal fixed-
+ * displacement ELF loading was performed, but when ldso was
+ * run as a command, finding the Ehdr is a heursitic: we
+ * have to assume Phdrs start in the first 4k of the file. */
+ base = aux[AT_BASE];
+ if (!base) base = aux[AT_PHDR] & -4096;
+ segs = &fakeseg;
+ segs[0].addr = base;
+ segs[0].p_vaddr = 0;
+ segs[0].p_memsz = -1;
+ Ehdr *eh = (void *)base;
+ Phdr *ph = (void *)(base + eh->e_phoff);
+ size_t phnum = eh->e_phnum;
+ size_t phent = eh->e_phentsize;
+ while (phnum-- && ph->p_type != PT_DYNAMIC)
+ ph = (void *)((size_t)ph + phent);
+ dynv = (void *)(base + ph->p_vaddr);
+ }
+#endif
+
+ for (i=0; i<DYN_CNT; i++) dyn[i] = 0;
+ for (i=0; dynv[i]; i+=2) if (dynv[i]<DYN_CNT)
+ dyn[dynv[i]] = dynv[i+1];
+
+#if DL_FDPIC
+ for (i=0; i<DYN_CNT; i++) {
+ if (i==DT_RELASZ || i==DT_RELSZ) continue;
+ if (!dyn[i]) continue;
+ for (j=0; dyn[i]-segs[j].p_vaddr >= segs[j].p_memsz; j++);
+ dyn[i] += segs[j].addr - segs[j].p_vaddr;
+ }
+ base = 0;
+
+ const Sym *syms = (void *)dyn[DT_SYMTAB];
+
+ rel = (void *)dyn[DT_RELA];
+ rel_size = dyn[DT_RELASZ];
+ for (; rel_size; rel+=3, rel_size-=3*sizeof(size_t)) {
+ if (!IS_RELATIVE(rel[1], syms)) continue;
+ for (j=0; rel[0]-segs[j].p_vaddr >= segs[j].p_memsz; j++);
+ size_t *rel_addr = (void *)
+ (rel[0] + segs[j].addr - segs[j].p_vaddr);
+ if (R_TYPE(rel[1]) == REL_FUNCDESC_VAL) {
+ *rel_addr += segs[rel_addr[1]].addr
+ - segs[rel_addr[1]].p_vaddr
+ + syms[R_SYM(rel[1])].st_value;
+ rel_addr[1] = dyn[DT_PLTGOT];
+ } else {
+ size_t val = syms[R_SYM(rel[1])].st_value;
+ for (j=0; val-segs[j].p_vaddr >= segs[j].p_memsz; j++);
+ *rel_addr = rel[2] + segs[j].addr - segs[j].p_vaddr + val;
+ }
+ }
+#else
+ /* If the dynamic linker is invoked as a command, its load
+ * address is not available in the aux vector. Instead, compute
+ * the load address as the difference between &_DYNAMIC and the
+ * virtual address in the PT_DYNAMIC program header. */
+ base = aux[AT_BASE];
+ if (!base) {
+ size_t phnum = aux[AT_PHNUM];
+ size_t phentsize = aux[AT_PHENT];
+ Phdr *ph = (void *)aux[AT_PHDR];
+ for (i=phnum; i--; ph = (void *)((char *)ph + phentsize)) {
+ if (ph->p_type == PT_DYNAMIC) {
+ base = (size_t)dynv - ph->p_vaddr;
+ break;
+ }
+ }
+ }
+
+ /* MIPS uses an ugly packed form for GOT relocations. Since we
+ * can't make function calls yet and the code is tiny anyway,
+ * it's simply inlined here. */
+ if (NEED_MIPS_GOT_RELOCS) {
+ size_t local_cnt = 0;
+ size_t *got = (void *)(base + dyn[DT_PLTGOT]);
+ for (i=0; dynv[i]; i+=2) if (dynv[i]==DT_MIPS_LOCAL_GOTNO)
+ local_cnt = dynv[i+1];
+ for (i=0; i<local_cnt; i++) got[i] += base;
+ }
+
+ rel = (void *)(base+dyn[DT_REL]);
+ rel_size = dyn[DT_RELSZ];
+ for (; rel_size; rel+=2, rel_size-=2*sizeof(size_t)) {
+ if (!IS_RELATIVE(rel[1], 0)) continue;
+ size_t *rel_addr = (void *)(base + rel[0]);
+ *rel_addr += base;
+ }
+
+ rel = (void *)(base+dyn[DT_RELA]);
+ rel_size = dyn[DT_RELASZ];
+ for (; rel_size; rel+=3, rel_size-=3*sizeof(size_t)) {
+ if (!IS_RELATIVE(rel[1], 0)) continue;
+ size_t *rel_addr = (void *)(base + rel[0]);
+ *rel_addr = base + rel[2];
+ }
+#endif
+
+ stage2_func dls2;
+ GETFUNCSYM(&dls2, __dls2, base+dyn[DT_PLTGOT]);
+ dls2((void *)base, sp);
+}
diff --git a/libc-top-half/musl/ldso/dynlink.c b/libc-top-half/musl/ldso/dynlink.c
new file mode 100644
index 0000000..5b9c8be
--- /dev/null
+++ b/libc-top-half/musl/ldso/dynlink.c
@@ -0,0 +1,2361 @@
+#define _GNU_SOURCE
+#define SYSCALL_NO_TLS 1
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <elf.h>
+#include <sys/mman.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <link.h>
+#include <setjmp.h>
+#include <pthread.h>
+#include <ctype.h>
+#include <dlfcn.h>
+#include <semaphore.h>
+#include <sys/membarrier.h>
+#include "pthread_impl.h"
+#include "fork_impl.h"
+#include "libc.h"
+#include "dynlink.h"
+
+#define malloc __libc_malloc
+#define calloc __libc_calloc
+#define realloc __libc_realloc
+#define free __libc_free
+
+static void error(const char *, ...);
+
+#define MAXP2(a,b) (-(-(a)&-(b)))
+#define ALIGN(x,y) ((x)+(y)-1 & -(y))
+
+#define container_of(p,t,m) ((t*)((char *)(p)-offsetof(t,m)))
+#define countof(a) ((sizeof (a))/(sizeof (a)[0]))
+
+struct debug {
+ int ver;
+ void *head;
+ void (*bp)(void);
+ int state;
+ void *base;
+};
+
+struct td_index {
+ size_t args[2];
+ struct td_index *next;
+};
+
+struct dso {
+#if DL_FDPIC
+ struct fdpic_loadmap *loadmap;
+#else
+ unsigned char *base;
+#endif
+ char *name;
+ size_t *dynv;
+ struct dso *next, *prev;
+
+ Phdr *phdr;
+ int phnum;
+ size_t phentsize;
+ Sym *syms;
+ Elf_Symndx *hashtab;
+ uint32_t *ghashtab;
+ int16_t *versym;
+ char *strings;
+ struct dso *syms_next, *lazy_next;
+ size_t *lazy, lazy_cnt;
+ unsigned char *map;
+ size_t map_len;
+ dev_t dev;
+ ino_t ino;
+ char relocated;
+ char constructed;
+ char kernel_mapped;
+ char mark;
+ char bfs_built;
+ char runtime_loaded;
+ struct dso **deps, *needed_by;
+ size_t ndeps_direct;
+ size_t next_dep;
+ pthread_t ctor_visitor;
+ char *rpath_orig, *rpath;
+ struct tls_module tls;
+ size_t tls_id;
+ size_t relro_start, relro_end;
+ uintptr_t *new_dtv;
+ unsigned char *new_tls;
+ struct td_index *td_index;
+ struct dso *fini_next;
+ char *shortname;
+#if DL_FDPIC
+ unsigned char *base;
+#else
+ struct fdpic_loadmap *loadmap;
+#endif
+ struct funcdesc {
+ void *addr;
+ size_t *got;
+ } *funcdescs;
+ size_t *got;
+ char buf[];
+};
+
+struct symdef {
+ Sym *sym;
+ struct dso *dso;
+};
+
+typedef void (*stage3_func)(size_t *, size_t *);
+
+static struct builtin_tls {
+ char c;
+ struct pthread pt;
+ void *space[16];
+} builtin_tls[1];
+#define MIN_TLS_ALIGN offsetof(struct builtin_tls, pt)
+
+#define ADDEND_LIMIT 4096
+static size_t *saved_addends, *apply_addends_to;
+
+static struct dso ldso;
+static struct dso *head, *tail, *fini_head, *syms_tail, *lazy_head;
+static char *env_path, *sys_path;
+static unsigned long long gencnt;
+static int runtime;
+static int ldd_mode;
+static int ldso_fail;
+static int noload;
+static int shutting_down;
+static jmp_buf *rtld_fail;
+static pthread_rwlock_t lock;
+static struct debug debug;
+static struct tls_module *tls_tail;
+static size_t tls_cnt, tls_offset, tls_align = MIN_TLS_ALIGN;
+static size_t static_tls_cnt;
+static pthread_mutex_t init_fini_lock;
+static pthread_cond_t ctor_cond;
+static struct dso *builtin_deps[2];
+static struct dso *const no_deps[1];
+static struct dso *builtin_ctor_queue[4];
+static struct dso **main_ctor_queue;
+static struct fdpic_loadmap *app_loadmap;
+static struct fdpic_dummy_loadmap app_dummy_loadmap;
+
+struct debug *_dl_debug_addr = &debug;
+
+extern hidden int __malloc_replaced;
+
+hidden void (*const __init_array_start)(void)=0, (*const __fini_array_start)(void)=0;
+
+extern hidden void (*const __init_array_end)(void), (*const __fini_array_end)(void);
+
+weak_alias(__init_array_start, __init_array_end);
+weak_alias(__fini_array_start, __fini_array_end);
+
+static int dl_strcmp(const char *l, const char *r)
+{
+ for (; *l==*r && *l; l++, r++);
+ return *(unsigned char *)l - *(unsigned char *)r;
+}
+#define strcmp(l,r) dl_strcmp(l,r)
+
+/* Compute load address for a virtual address in a given dso. */
+#if DL_FDPIC
+static void *laddr(const struct dso *p, size_t v)
+{
+ size_t j=0;
+ if (!p->loadmap) return p->base + v;
+ for (j=0; v-p->loadmap->segs[j].p_vaddr >= p->loadmap->segs[j].p_memsz; j++);
+ return (void *)(v - p->loadmap->segs[j].p_vaddr + p->loadmap->segs[j].addr);
+}
+static void *laddr_pg(const struct dso *p, size_t v)
+{
+ size_t j=0;
+ size_t pgsz = PAGE_SIZE;
+ if (!p->loadmap) return p->base + v;
+ for (j=0; ; j++) {
+ size_t a = p->loadmap->segs[j].p_vaddr;
+ size_t b = a + p->loadmap->segs[j].p_memsz;
+ a &= -pgsz;
+ b += pgsz-1;
+ b &= -pgsz;
+ if (v-a<b-a) break;
+ }
+ return (void *)(v - p->loadmap->segs[j].p_vaddr + p->loadmap->segs[j].addr);
+}
+static void (*fdbarrier(void *p))()
+{
+ void (*fd)();
+ __asm__("" : "=r"(fd) : "0"(p));
+ return fd;
+}
+#define fpaddr(p, v) fdbarrier((&(struct funcdesc){ \
+ laddr(p, v), (p)->got }))
+#else
+#define laddr(p, v) (void *)((p)->base + (v))
+#define laddr_pg(p, v) laddr(p, v)
+#define fpaddr(p, v) ((void (*)())laddr(p, v))
+#endif
+
+static void decode_vec(size_t *v, size_t *a, size_t cnt)
+{
+ size_t i;
+ for (i=0; i<cnt; i++) a[i] = 0;
+ for (; v[0]; v+=2) if (v[0]-1<cnt-1) {
+ a[0] |= 1UL<<v[0];
+ a[v[0]] = v[1];
+ }
+}
+
+static int search_vec(size_t *v, size_t *r, size_t key)
+{
+ for (; v[0]!=key; v+=2)
+ if (!v[0]) return 0;
+ *r = v[1];
+ return 1;
+}
+
+static uint32_t sysv_hash(const char *s0)
+{
+ const unsigned char *s = (void *)s0;
+ uint_fast32_t h = 0;
+ while (*s) {
+ h = 16*h + *s++;
+ h ^= h>>24 & 0xf0;
+ }
+ return h & 0xfffffff;
+}
+
+static uint32_t gnu_hash(const char *s0)
+{
+ const unsigned char *s = (void *)s0;
+ uint_fast32_t h = 5381;
+ for (; *s; s++)
+ h += h*32 + *s;
+ return h;
+}
+
+static Sym *sysv_lookup(const char *s, uint32_t h, struct dso *dso)
+{
+ size_t i;
+ Sym *syms = dso->syms;
+ Elf_Symndx *hashtab = dso->hashtab;
+ char *strings = dso->strings;
+ for (i=hashtab[2+h%hashtab[0]]; i; i=hashtab[2+hashtab[0]+i]) {
+ if ((!dso->versym || dso->versym[i] >= 0)
+ && (!strcmp(s, strings+syms[i].st_name)))
+ return syms+i;
+ }
+ return 0;
+}
+
+static Sym *gnu_lookup(uint32_t h1, uint32_t *hashtab, struct dso *dso, const char *s)
+{
+ uint32_t nbuckets = hashtab[0];
+ uint32_t *buckets = hashtab + 4 + hashtab[2]*(sizeof(size_t)/4);
+ uint32_t i = buckets[h1 % nbuckets];
+
+ if (!i) return 0;
+
+ uint32_t *hashval = buckets + nbuckets + (i - hashtab[1]);
+
+ for (h1 |= 1; ; i++) {
+ uint32_t h2 = *hashval++;
+ if ((h1 == (h2|1)) && (!dso->versym || dso->versym[i] >= 0)
+ && !strcmp(s, dso->strings + dso->syms[i].st_name))
+ return dso->syms+i;
+ if (h2 & 1) break;
+ }
+
+ return 0;
+}
+
+static Sym *gnu_lookup_filtered(uint32_t h1, uint32_t *hashtab, struct dso *dso, const char *s, uint32_t fofs, size_t fmask)
+{
+ const size_t *bloomwords = (const void *)(hashtab+4);
+ size_t f = bloomwords[fofs & (hashtab[2]-1)];
+ if (!(f & fmask)) return 0;
+
+ f >>= (h1 >> hashtab[3]) % (8 * sizeof f);
+ if (!(f & 1)) return 0;
+
+ return gnu_lookup(h1, hashtab, dso, s);
+}
+
+#define OK_TYPES (1<<STT_NOTYPE | 1<<STT_OBJECT | 1<<STT_FUNC | 1<<STT_COMMON | 1<<STT_TLS)
+#define OK_BINDS (1<<STB_GLOBAL | 1<<STB_WEAK | 1<<STB_GNU_UNIQUE)
+
+#ifndef ARCH_SYM_REJECT_UND
+#define ARCH_SYM_REJECT_UND(s) 0
+#endif
+
+#if defined(__GNUC__)
+__attribute__((always_inline))
+#endif
+static inline struct symdef find_sym2(struct dso *dso, const char *s, int need_def, int use_deps)
+{
+ uint32_t h = 0, gh = gnu_hash(s), gho = gh / (8*sizeof(size_t)), *ght;
+ size_t ghm = 1ul << gh % (8*sizeof(size_t));
+ struct symdef def = {0};
+ struct dso **deps = use_deps ? dso->deps : 0;
+ for (; dso; dso=use_deps ? *deps++ : dso->syms_next) {
+ Sym *sym;
+ if ((ght = dso->ghashtab)) {
+ sym = gnu_lookup_filtered(gh, ght, dso, s, gho, ghm);
+ } else {
+ if (!h) h = sysv_hash(s);
+ sym = sysv_lookup(s, h, dso);
+ }
+ if (!sym) continue;
+ if (!sym->st_shndx)
+ if (need_def || (sym->st_info&0xf) == STT_TLS
+ || ARCH_SYM_REJECT_UND(sym))
+ continue;
+ if (!sym->st_value)
+ if ((sym->st_info&0xf) != STT_TLS)
+ continue;
+ if (!(1<<(sym->st_info&0xf) & OK_TYPES)) continue;
+ if (!(1<<(sym->st_info>>4) & OK_BINDS)) continue;
+ def.sym = sym;
+ def.dso = dso;
+ break;
+ }
+ return def;
+}
+
+static struct symdef find_sym(struct dso *dso, const char *s, int need_def)
+{
+ return find_sym2(dso, s, need_def, 0);
+}
+
+static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stride)
+{
+ unsigned char *base = dso->base;
+ Sym *syms = dso->syms;
+ char *strings = dso->strings;
+ Sym *sym;
+ const char *name;
+ void *ctx;
+ int type;
+ int sym_index;
+ struct symdef def;
+ size_t *reloc_addr;
+ size_t sym_val;
+ size_t tls_val;
+ size_t addend;
+ int skip_relative = 0, reuse_addends = 0, save_slot = 0;
+
+ if (dso == &ldso) {
+ /* Only ldso's REL table needs addend saving/reuse. */
+ if (rel == apply_addends_to)
+ reuse_addends = 1;
+ skip_relative = 1;
+ }
+
+ for (; rel_size; rel+=stride, rel_size-=stride*sizeof(size_t)) {
+ if (skip_relative && IS_RELATIVE(rel[1], dso->syms)) continue;
+ type = R_TYPE(rel[1]);
+ if (type == REL_NONE) continue;
+ reloc_addr = laddr(dso, rel[0]);
+
+ if (stride > 2) {
+ addend = rel[2];
+ } else if (type==REL_GOT || type==REL_PLT|| type==REL_COPY) {
+ addend = 0;
+ } else if (reuse_addends) {
+ /* Save original addend in stage 2 where the dso
+ * chain consists of just ldso; otherwise read back
+ * saved addend since the inline one was clobbered. */
+ if (head==&ldso)
+ saved_addends[save_slot] = *reloc_addr;
+ addend = saved_addends[save_slot++];
+ } else {
+ addend = *reloc_addr;
+ }
+
+ sym_index = R_SYM(rel[1]);
+ if (sym_index) {
+ sym = syms + sym_index;
+ name = strings + sym->st_name;
+ ctx = type==REL_COPY ? head->syms_next : head;
+ def = (sym->st_info>>4) == STB_LOCAL
+ ? (struct symdef){ .dso = dso, .sym = sym }
+ : find_sym(ctx, name, type==REL_PLT);
+ if (!def.sym && (sym->st_shndx != SHN_UNDEF
+ || sym->st_info>>4 != STB_WEAK)) {
+ if (dso->lazy && (type==REL_PLT || type==REL_GOT)) {
+ dso->lazy[3*dso->lazy_cnt+0] = rel[0];
+ dso->lazy[3*dso->lazy_cnt+1] = rel[1];
+ dso->lazy[3*dso->lazy_cnt+2] = addend;
+ dso->lazy_cnt++;
+ continue;
+ }
+ error("Error relocating %s: %s: symbol not found",
+ dso->name, name);
+ if (runtime) longjmp(*rtld_fail, 1);
+ continue;
+ }
+ } else {
+ sym = 0;
+ def.sym = 0;
+ def.dso = dso;
+ }
+
+ sym_val = def.sym ? (size_t)laddr(def.dso, def.sym->st_value) : 0;
+ tls_val = def.sym ? def.sym->st_value : 0;
+
+ if ((type == REL_TPOFF || type == REL_TPOFF_NEG)
+ && def.dso->tls_id > static_tls_cnt) {
+ error("Error relocating %s: %s: initial-exec TLS "
+ "resolves to dynamic definition in %s",
+ dso->name, name, def.dso->name);
+ longjmp(*rtld_fail, 1);
+ }
+
+ switch(type) {
+ case REL_OFFSET:
+ addend -= (size_t)reloc_addr;
+ case REL_SYMBOLIC:
+ case REL_GOT:
+ case REL_PLT:
+ *reloc_addr = sym_val + addend;
+ break;
+ case REL_USYMBOLIC:
+ memcpy(reloc_addr, &(size_t){sym_val + addend}, sizeof(size_t));
+ break;
+ case REL_RELATIVE:
+ *reloc_addr = (size_t)base + addend;
+ break;
+ case REL_SYM_OR_REL:
+ if (sym) *reloc_addr = sym_val + addend;
+ else *reloc_addr = (size_t)base + addend;
+ break;
+ case REL_COPY:
+ memcpy(reloc_addr, (void *)sym_val, sym->st_size);
+ break;
+ case REL_OFFSET32:
+ *(uint32_t *)reloc_addr = sym_val + addend
+ - (size_t)reloc_addr;
+ break;
+ case REL_FUNCDESC:
+ *reloc_addr = def.sym ? (size_t)(def.dso->funcdescs
+ + (def.sym - def.dso->syms)) : 0;
+ break;
+ case REL_FUNCDESC_VAL:
+ if ((sym->st_info&0xf) == STT_SECTION) *reloc_addr += sym_val;
+ else *reloc_addr = sym_val;
+ reloc_addr[1] = def.sym ? (size_t)def.dso->got : 0;
+ break;
+ case REL_DTPMOD:
+ *reloc_addr = def.dso->tls_id;
+ break;
+ case REL_DTPOFF:
+ *reloc_addr = tls_val + addend - DTP_OFFSET;
+ break;
+#ifdef TLS_ABOVE_TP
+ case REL_TPOFF:
+ *reloc_addr = tls_val + def.dso->tls.offset + TPOFF_K + addend;
+ break;
+#else
+ case REL_TPOFF:
+ *reloc_addr = tls_val - def.dso->tls.offset + addend;
+ break;
+ case REL_TPOFF_NEG:
+ *reloc_addr = def.dso->tls.offset - tls_val + addend;
+ break;
+#endif
+ case REL_TLSDESC:
+ if (stride<3) addend = reloc_addr[1];
+ if (def.dso->tls_id > static_tls_cnt) {
+ struct td_index *new = malloc(sizeof *new);
+ if (!new) {
+ error(
+ "Error relocating %s: cannot allocate TLSDESC for %s",
+ dso->name, sym ? name : "(local)" );
+ longjmp(*rtld_fail, 1);
+ }
+ new->next = dso->td_index;
+ dso->td_index = new;
+ new->args[0] = def.dso->tls_id;
+ new->args[1] = tls_val + addend - DTP_OFFSET;
+ reloc_addr[0] = (size_t)__tlsdesc_dynamic;
+ reloc_addr[1] = (size_t)new;
+ } else {
+ reloc_addr[0] = (size_t)__tlsdesc_static;
+#ifdef TLS_ABOVE_TP
+ reloc_addr[1] = tls_val + def.dso->tls.offset
+ + TPOFF_K + addend;
+#else
+ reloc_addr[1] = tls_val - def.dso->tls.offset
+ + addend;
+#endif
+ }
+#ifdef TLSDESC_BACKWARDS
+ /* Some archs (32-bit ARM at least) invert the order of
+ * the descriptor members. Fix them up here. */
+ size_t tmp = reloc_addr[0];
+ reloc_addr[0] = reloc_addr[1];
+ reloc_addr[1] = tmp;
+#endif
+ break;
+ default:
+ error("Error relocating %s: unsupported relocation type %d",
+ dso->name, type);
+ if (runtime) longjmp(*rtld_fail, 1);
+ continue;
+ }
+ }
+}
+
+static void redo_lazy_relocs()
+{
+ struct dso *p = lazy_head, *next;
+ lazy_head = 0;
+ for (; p; p=next) {
+ next = p->lazy_next;
+ size_t size = p->lazy_cnt*3*sizeof(size_t);
+ p->lazy_cnt = 0;
+ do_relocs(p, p->lazy, size, 3);
+ if (p->lazy_cnt) {
+ p->lazy_next = lazy_head;
+ lazy_head = p;
+ } else {
+ free(p->lazy);
+ p->lazy = 0;
+ p->lazy_next = 0;
+ }
+ }
+}
+
+/* A huge hack: to make up for the wastefulness of shared libraries
+ * needing at least a page of dirty memory even if they have no global
+ * data, we reclaim the gaps at the beginning and end of writable maps
+ * and "donate" them to the heap. */
+
+static void reclaim(struct dso *dso, size_t start, size_t end)
+{
+ if (start >= dso->relro_start && start < dso->relro_end) start = dso->relro_end;
+ if (end >= dso->relro_start && end < dso->relro_end) end = dso->relro_start;
+ if (start >= end) return;
+ char *base = laddr_pg(dso, start);
+ __malloc_donate(base, base+(end-start));
+}
+
+static void reclaim_gaps(struct dso *dso)
+{
+ Phdr *ph = dso->phdr;
+ size_t phcnt = dso->phnum;
+
+ for (; phcnt--; ph=(void *)((char *)ph+dso->phentsize)) {
+ if (ph->p_type!=PT_LOAD) continue;
+ if ((ph->p_flags&(PF_R|PF_W))!=(PF_R|PF_W)) continue;
+ reclaim(dso, ph->p_vaddr & -PAGE_SIZE, ph->p_vaddr);
+ reclaim(dso, ph->p_vaddr+ph->p_memsz,
+ ph->p_vaddr+ph->p_memsz+PAGE_SIZE-1 & -PAGE_SIZE);
+ }
+}
+
+static ssize_t read_loop(int fd, void *p, size_t n)
+{
+ for (size_t i=0; i<n; ) {
+ ssize_t l = read(fd, (char *)p+i, n-i);
+ if (l<0) {
+ if (errno==EINTR) continue;
+ else return -1;
+ }
+ if (l==0) return i;
+ i += l;
+ }
+ return n;
+}
+
+static void *mmap_fixed(void *p, size_t n, int prot, int flags, int fd, off_t off)
+{
+ static int no_map_fixed;
+ char *q;
+ if (!n) return p;
+ if (!no_map_fixed) {
+ q = mmap(p, n, prot, flags|MAP_FIXED, fd, off);
+ if (!DL_NOMMU_SUPPORT || q != MAP_FAILED || errno != EINVAL)
+ return q;
+ no_map_fixed = 1;
+ }
+ /* Fallbacks for MAP_FIXED failure on NOMMU kernels. */
+ if (flags & MAP_ANONYMOUS) {
+ memset(p, 0, n);
+ return p;
+ }
+ ssize_t r;
+ if (lseek(fd, off, SEEK_SET) < 0) return MAP_FAILED;
+ for (q=p; n; q+=r, off+=r, n-=r) {
+ r = read(fd, q, n);
+ if (r < 0 && errno != EINTR) return MAP_FAILED;
+ if (!r) {
+ memset(q, 0, n);
+ break;
+ }
+ }
+ return p;
+}
+
+static void unmap_library(struct dso *dso)
+{
+ if (dso->loadmap) {
+ size_t i;
+ for (i=0; i<dso->loadmap->nsegs; i++) {
+ if (!dso->loadmap->segs[i].p_memsz)
+ continue;
+ munmap((void *)dso->loadmap->segs[i].addr,
+ dso->loadmap->segs[i].p_memsz);
+ }
+ free(dso->loadmap);
+ } else if (dso->map && dso->map_len) {
+ munmap(dso->map, dso->map_len);
+ }
+}
+
+static void *map_library(int fd, struct dso *dso)
+{
+ Ehdr buf[(896+sizeof(Ehdr))/sizeof(Ehdr)];
+ void *allocated_buf=0;
+ size_t phsize;
+ size_t addr_min=SIZE_MAX, addr_max=0, map_len;
+ size_t this_min, this_max;
+ size_t nsegs = 0;
+ off_t off_start;
+ Ehdr *eh;
+ Phdr *ph, *ph0;
+ unsigned prot;
+ unsigned char *map=MAP_FAILED, *base;
+ size_t dyn=0;
+ size_t tls_image=0;
+ size_t i;
+
+ ssize_t l = read(fd, buf, sizeof buf);
+ eh = buf;
+ if (l<0) return 0;
+ if (l<sizeof *eh || (eh->e_type != ET_DYN && eh->e_type != ET_EXEC))
+ goto noexec;
+ phsize = eh->e_phentsize * eh->e_phnum;
+ if (phsize > sizeof buf - sizeof *eh) {
+ allocated_buf = malloc(phsize);
+ if (!allocated_buf) return 0;
+ l = pread(fd, allocated_buf, phsize, eh->e_phoff);
+ if (l < 0) goto error;
+ if (l != phsize) goto noexec;
+ ph = ph0 = allocated_buf;
+ } else if (eh->e_phoff + phsize > l) {
+ l = pread(fd, buf+1, phsize, eh->e_phoff);
+ if (l < 0) goto error;
+ if (l != phsize) goto noexec;
+ ph = ph0 = (void *)(buf + 1);
+ } else {
+ ph = ph0 = (void *)((char *)buf + eh->e_phoff);
+ }
+ for (i=eh->e_phnum; i; i--, ph=(void *)((char *)ph+eh->e_phentsize)) {
+ if (ph->p_type == PT_DYNAMIC) {
+ dyn = ph->p_vaddr;
+ } else if (ph->p_type == PT_TLS) {
+ tls_image = ph->p_vaddr;
+ dso->tls.align = ph->p_align;
+ dso->tls.len = ph->p_filesz;
+ dso->tls.size = ph->p_memsz;
+ } else if (ph->p_type == PT_GNU_RELRO) {
+ dso->relro_start = ph->p_vaddr & -PAGE_SIZE;
+ dso->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE;
+ } else if (ph->p_type == PT_GNU_STACK) {
+ if (!runtime && ph->p_memsz > __default_stacksize) {
+ __default_stacksize =
+ ph->p_memsz < DEFAULT_STACK_MAX ?
+ ph->p_memsz : DEFAULT_STACK_MAX;
+ }
+ }
+ if (ph->p_type != PT_LOAD) continue;
+ nsegs++;
+ if (ph->p_vaddr < addr_min) {
+ addr_min = ph->p_vaddr;
+ off_start = ph->p_offset;
+ prot = (((ph->p_flags&PF_R) ? PROT_READ : 0) |
+ ((ph->p_flags&PF_W) ? PROT_WRITE: 0) |
+ ((ph->p_flags&PF_X) ? PROT_EXEC : 0));
+ }
+ if (ph->p_vaddr+ph->p_memsz > addr_max) {
+ addr_max = ph->p_vaddr+ph->p_memsz;
+ }
+ }
+ if (!dyn) goto noexec;
+ if (DL_FDPIC && !(eh->e_flags & FDPIC_CONSTDISP_FLAG)) {
+ dso->loadmap = calloc(1, sizeof *dso->loadmap
+ + nsegs * sizeof *dso->loadmap->segs);
+ if (!dso->loadmap) goto error;
+ dso->loadmap->nsegs = nsegs;
+ for (ph=ph0, i=0; i<nsegs; ph=(void *)((char *)ph+eh->e_phentsize)) {
+ if (ph->p_type != PT_LOAD) continue;
+ prot = (((ph->p_flags&PF_R) ? PROT_READ : 0) |
+ ((ph->p_flags&PF_W) ? PROT_WRITE: 0) |
+ ((ph->p_flags&PF_X) ? PROT_EXEC : 0));
+ map = mmap(0, ph->p_memsz + (ph->p_vaddr & PAGE_SIZE-1),
+ prot, MAP_PRIVATE,
+ fd, ph->p_offset & -PAGE_SIZE);
+ if (map == MAP_FAILED) {
+ unmap_library(dso);
+ goto error;
+ }
+ dso->loadmap->segs[i].addr = (size_t)map +
+ (ph->p_vaddr & PAGE_SIZE-1);
+ dso->loadmap->segs[i].p_vaddr = ph->p_vaddr;
+ dso->loadmap->segs[i].p_memsz = ph->p_memsz;
+ i++;
+ if (prot & PROT_WRITE) {
+ size_t brk = (ph->p_vaddr & PAGE_SIZE-1)
+ + ph->p_filesz;
+ size_t pgbrk = brk + PAGE_SIZE-1 & -PAGE_SIZE;
+ size_t pgend = brk + ph->p_memsz - ph->p_filesz
+ + PAGE_SIZE-1 & -PAGE_SIZE;
+ if (pgend > pgbrk && mmap_fixed(map+pgbrk,
+ pgend-pgbrk, prot,
+ MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS,
+ -1, off_start) == MAP_FAILED)
+ goto error;
+ memset(map + brk, 0, pgbrk-brk);
+ }
+ }
+ map = (void *)dso->loadmap->segs[0].addr;
+ map_len = 0;
+ goto done_mapping;
+ }
+ addr_max += PAGE_SIZE-1;
+ addr_max &= -PAGE_SIZE;
+ addr_min &= -PAGE_SIZE;
+ off_start &= -PAGE_SIZE;
+ map_len = addr_max - addr_min + off_start;
+ /* The first time, we map too much, possibly even more than
+ * the length of the file. This is okay because we will not
+ * use the invalid part; we just need to reserve the right
+ * amount of virtual address space to map over later. */
+ map = DL_NOMMU_SUPPORT
+ ? mmap((void *)addr_min, map_len, PROT_READ|PROT_WRITE|PROT_EXEC,
+ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
+ : mmap((void *)addr_min, map_len, prot,
+ MAP_PRIVATE, fd, off_start);
+ if (map==MAP_FAILED) goto error;
+ dso->map = map;
+ dso->map_len = map_len;
+ /* If the loaded file is not relocatable and the requested address is
+ * not available, then the load operation must fail. */
+ if (eh->e_type != ET_DYN && addr_min && map!=(void *)addr_min) {
+ errno = EBUSY;
+ goto error;
+ }
+ base = map - addr_min;
+ dso->phdr = 0;
+ dso->phnum = 0;
+ for (ph=ph0, i=eh->e_phnum; i; i--, ph=(void *)((char *)ph+eh->e_phentsize)) {
+ if (ph->p_type != PT_LOAD) continue;
+ /* Check if the programs headers are in this load segment, and
+ * if so, record the address for use by dl_iterate_phdr. */
+ if (!dso->phdr && eh->e_phoff >= ph->p_offset
+ && eh->e_phoff+phsize <= ph->p_offset+ph->p_filesz) {
+ dso->phdr = (void *)(base + ph->p_vaddr
+ + (eh->e_phoff-ph->p_offset));
+ dso->phnum = eh->e_phnum;
+ dso->phentsize = eh->e_phentsize;
+ }
+ this_min = ph->p_vaddr & -PAGE_SIZE;
+ this_max = ph->p_vaddr+ph->p_memsz+PAGE_SIZE-1 & -PAGE_SIZE;
+ off_start = ph->p_offset & -PAGE_SIZE;
+ prot = (((ph->p_flags&PF_R) ? PROT_READ : 0) |
+ ((ph->p_flags&PF_W) ? PROT_WRITE: 0) |
+ ((ph->p_flags&PF_X) ? PROT_EXEC : 0));
+ /* Reuse the existing mapping for the lowest-address LOAD */
+ if ((ph->p_vaddr & -PAGE_SIZE) != addr_min || DL_NOMMU_SUPPORT)
+ if (mmap_fixed(base+this_min, this_max-this_min, prot, MAP_PRIVATE|MAP_FIXED, fd, off_start) == MAP_FAILED)
+ goto error;
+ if (ph->p_memsz > ph->p_filesz && (ph->p_flags&PF_W)) {
+ size_t brk = (size_t)base+ph->p_vaddr+ph->p_filesz;
+ size_t pgbrk = brk+PAGE_SIZE-1 & -PAGE_SIZE;
+ memset((void *)brk, 0, pgbrk-brk & PAGE_SIZE-1);
+ if (pgbrk-(size_t)base < this_max && mmap_fixed((void *)pgbrk, (size_t)base+this_max-pgbrk, prot, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) == MAP_FAILED)
+ goto error;
+ }
+ }
+ for (i=0; ((size_t *)(base+dyn))[i]; i+=2)
+ if (((size_t *)(base+dyn))[i]==DT_TEXTREL) {
+ if (mprotect(map, map_len, PROT_READ|PROT_WRITE|PROT_EXEC)
+ && errno != ENOSYS)
+ goto error;
+ break;
+ }
+done_mapping:
+ dso->base = base;
+ dso->dynv = laddr(dso, dyn);
+ if (dso->tls.size) dso->tls.image = laddr(dso, tls_image);
+ free(allocated_buf);
+ return map;
+noexec:
+ errno = ENOEXEC;
+error:
+ if (map!=MAP_FAILED) unmap_library(dso);
+ free(allocated_buf);
+ return 0;
+}
+
+static int path_open(const char *name, const char *s, char *buf, size_t buf_size)
+{
+ size_t l;
+ int fd;
+ for (;;) {
+ s += strspn(s, ":\n");
+ l = strcspn(s, ":\n");
+ if (l-1 >= INT_MAX) return -1;
+ if (snprintf(buf, buf_size, "%.*s/%s", (int)l, s, name) < buf_size) {
+ if ((fd = open(buf, O_RDONLY|O_CLOEXEC))>=0) return fd;
+ switch (errno) {
+ case ENOENT:
+ case ENOTDIR:
+ case EACCES:
+ case ENAMETOOLONG:
+ break;
+ default:
+ /* Any negative value but -1 will inhibit
+ * futher path search. */
+ return -2;
+ }
+ }
+ s += l;
+ }
+}
+
+static int fixup_rpath(struct dso *p, char *buf, size_t buf_size)
+{
+ size_t n, l;
+ const char *s, *t, *origin;
+ char *d;
+ if (p->rpath || !p->rpath_orig) return 0;
+ if (!strchr(p->rpath_orig, '$')) {
+ p->rpath = p->rpath_orig;
+ return 0;
+ }
+ n = 0;
+ s = p->rpath_orig;
+ while ((t=strchr(s, '$'))) {
+ if (strncmp(t, "$ORIGIN", 7) && strncmp(t, "${ORIGIN}", 9))
+ return 0;
+ s = t+1;
+ n++;
+ }
+ if (n > SSIZE_MAX/PATH_MAX) return 0;
+
+ if (p->kernel_mapped) {
+ /* $ORIGIN searches cannot be performed for the main program
+ * when it is suid/sgid/AT_SECURE. This is because the
+ * pathname is under the control of the caller of execve.
+ * For libraries, however, $ORIGIN can be processed safely
+ * since the library's pathname came from a trusted source
+ * (either system paths or a call to dlopen). */
+ if (libc.secure)
+ return 0;
+ l = readlink("/proc/self/exe", buf, buf_size);
+ if (l == -1) switch (errno) {
+ case ENOENT:
+ case ENOTDIR:
+ case EACCES:
+ break;
+ default:
+ return -1;
+ }
+ if (l >= buf_size)
+ return 0;
+ buf[l] = 0;
+ origin = buf;
+ } else {
+ origin = p->name;
+ }
+ t = strrchr(origin, '/');
+ if (t) {
+ l = t-origin;
+ } else {
+ /* Normally p->name will always be an absolute or relative
+ * pathname containing at least one '/' character, but in the
+ * case where ldso was invoked as a command to execute a
+ * program in the working directory, app.name may not. Fix. */
+ origin = ".";
+ l = 1;
+ }
+ /* Disallow non-absolute origins for suid/sgid/AT_SECURE. */
+ if (libc.secure && *origin != '/')
+ return 0;
+ p->rpath = malloc(strlen(p->rpath_orig) + n*l + 1);
+ if (!p->rpath) return -1;
+
+ d = p->rpath;
+ s = p->rpath_orig;
+ while ((t=strchr(s, '$'))) {
+ memcpy(d, s, t-s);
+ d += t-s;
+ memcpy(d, origin, l);
+ d += l;
+ /* It was determined previously that the '$' is followed
+ * either by "ORIGIN" or "{ORIGIN}". */
+ s = t + 7 + 2*(t[1]=='{');
+ }
+ strcpy(d, s);
+ return 0;
+}
+
+static void decode_dyn(struct dso *p)
+{
+ size_t dyn[DYN_CNT];
+ decode_vec(p->dynv, dyn, DYN_CNT);
+ p->syms = laddr(p, dyn[DT_SYMTAB]);
+ p->strings = laddr(p, dyn[DT_STRTAB]);
+ if (dyn[0]&(1<<DT_HASH))
+ p->hashtab = laddr(p, dyn[DT_HASH]);
+ if (dyn[0]&(1<<DT_RPATH))
+ p->rpath_orig = p->strings + dyn[DT_RPATH];
+ if (dyn[0]&(1<<DT_RUNPATH))
+ p->rpath_orig = p->strings + dyn[DT_RUNPATH];
+ if (dyn[0]&(1<<DT_PLTGOT))
+ p->got = laddr(p, dyn[DT_PLTGOT]);
+ if (search_vec(p->dynv, dyn, DT_GNU_HASH))
+ p->ghashtab = laddr(p, *dyn);
+ if (search_vec(p->dynv, dyn, DT_VERSYM))
+ p->versym = laddr(p, *dyn);
+}
+
+static size_t count_syms(struct dso *p)
+{
+ if (p->hashtab) return p->hashtab[1];
+
+ size_t nsym, i;
+ uint32_t *buckets = p->ghashtab + 4 + (p->ghashtab[2]*sizeof(size_t)/4);
+ uint32_t *hashval;
+ for (i = nsym = 0; i < p->ghashtab[0]; i++) {
+ if (buckets[i] > nsym)
+ nsym = buckets[i];
+ }
+ if (nsym) {
+ hashval = buckets + p->ghashtab[0] + (nsym - p->ghashtab[1]);
+ do nsym++;
+ while (!(*hashval++ & 1));
+ }
+ return nsym;
+}
+
+static void *dl_mmap(size_t n)
+{
+ void *p;
+ int prot = PROT_READ|PROT_WRITE, flags = MAP_ANONYMOUS|MAP_PRIVATE;
+#ifdef SYS_mmap2
+ p = (void *)__syscall(SYS_mmap2, 0, n, prot, flags, -1, 0);
+#else
+ p = (void *)__syscall(SYS_mmap, 0, n, prot, flags, -1, 0);
+#endif
+ return (unsigned long)p > -4096UL ? 0 : p;
+}
+
+static void makefuncdescs(struct dso *p)
+{
+ static int self_done;
+ size_t nsym = count_syms(p);
+ size_t i, size = nsym * sizeof(*p->funcdescs);
+
+ if (!self_done) {
+ p->funcdescs = dl_mmap(size);
+ self_done = 1;
+ } else {
+ p->funcdescs = malloc(size);
+ }
+ if (!p->funcdescs) {
+ if (!runtime) a_crash();
+ error("Error allocating function descriptors for %s", p->name);
+ longjmp(*rtld_fail, 1);
+ }
+ for (i=0; i<nsym; i++) {
+ if ((p->syms[i].st_info&0xf)==STT_FUNC && p->syms[i].st_shndx) {
+ p->funcdescs[i].addr = laddr(p, p->syms[i].st_value);
+ p->funcdescs[i].got = p->got;
+ } else {
+ p->funcdescs[i].addr = 0;
+ p->funcdescs[i].got = 0;
+ }
+ }
+}
+
+static struct dso *load_library(const char *name, struct dso *needed_by)
+{
+ char buf[2*NAME_MAX+2];
+ const char *pathname;
+ unsigned char *map;
+ struct dso *p, temp_dso = {0};
+ int fd;
+ struct stat st;
+ size_t alloc_size;
+ int n_th = 0;
+ int is_self = 0;
+
+ if (!*name) {
+ errno = EINVAL;
+ return 0;
+ }
+
+ /* Catch and block attempts to reload the implementation itself */
+ if (name[0]=='l' && name[1]=='i' && name[2]=='b') {
+ static const char reserved[] =
+ "c.pthread.rt.m.dl.util.xnet.";
+ const char *rp, *next;
+ for (rp=reserved; *rp; rp=next) {
+ next = strchr(rp, '.') + 1;
+ if (strncmp(name+3, rp, next-rp) == 0)
+ break;
+ }
+ if (*rp) {
+ if (ldd_mode) {
+ /* Track which names have been resolved
+ * and only report each one once. */
+ static unsigned reported;
+ unsigned mask = 1U<<(rp-reserved);
+ if (!(reported & mask)) {
+ reported |= mask;
+ dprintf(1, "\t%s => %s (%p)\n",
+ name, ldso.name,
+ ldso.base);
+ }
+ }
+ is_self = 1;
+ }
+ }
+ if (!strcmp(name, ldso.name)) is_self = 1;
+ if (is_self) {
+ if (!ldso.prev) {
+ tail->next = &ldso;
+ ldso.prev = tail;
+ tail = &ldso;
+ }
+ return &ldso;
+ }
+ if (strchr(name, '/')) {
+ pathname = name;
+ fd = open(name, O_RDONLY|O_CLOEXEC);
+ } else {
+ /* Search for the name to see if it's already loaded */
+ for (p=head->next; p; p=p->next) {
+ if (p->shortname && !strcmp(p->shortname, name)) {
+ return p;
+ }
+ }
+ if (strlen(name) > NAME_MAX) return 0;
+ fd = -1;
+ if (env_path) fd = path_open(name, env_path, buf, sizeof buf);
+ for (p=needed_by; fd == -1 && p; p=p->needed_by) {
+ if (fixup_rpath(p, buf, sizeof buf) < 0)
+ fd = -2; /* Inhibit further search. */
+ if (p->rpath)
+ fd = path_open(name, p->rpath, buf, sizeof buf);
+ }
+ if (fd == -1) {
+ if (!sys_path) {
+ char *prefix = 0;
+ size_t prefix_len;
+ if (ldso.name[0]=='/') {
+ char *s, *t, *z;
+ for (s=t=z=ldso.name; *s; s++)
+ if (*s=='/') z=t, t=s;
+ prefix_len = z-ldso.name;
+ if (prefix_len < PATH_MAX)
+ prefix = ldso.name;
+ }
+ if (!prefix) {
+ prefix = "";
+ prefix_len = 0;
+ }
+ char etc_ldso_path[prefix_len + 1
+ + sizeof "/etc/ld-musl-" LDSO_ARCH ".path"];
+ snprintf(etc_ldso_path, sizeof etc_ldso_path,
+ "%.*s/etc/ld-musl-" LDSO_ARCH ".path",
+ (int)prefix_len, prefix);
+ fd = open(etc_ldso_path, O_RDONLY|O_CLOEXEC);
+ if (fd>=0) {
+ size_t n = 0;
+ if (!fstat(fd, &st)) n = st.st_size;
+ if ((sys_path = malloc(n+1)))
+ sys_path[n] = 0;
+ if (!sys_path || read_loop(fd, sys_path, n)<0) {
+ free(sys_path);
+ sys_path = "";
+ }
+ close(fd);
+ } else if (errno != ENOENT) {
+ sys_path = "";
+ }
+ }
+ if (!sys_path) sys_path = "/lib:/usr/local/lib:/usr/lib";
+ fd = path_open(name, sys_path, buf, sizeof buf);
+ }
+ pathname = buf;
+ }
+ if (fd < 0) return 0;
+ if (fstat(fd, &st) < 0) {
+ close(fd);
+ return 0;
+ }
+ for (p=head->next; p; p=p->next) {
+ if (p->dev == st.st_dev && p->ino == st.st_ino) {
+ /* If this library was previously loaded with a
+ * pathname but a search found the same inode,
+ * setup its shortname so it can be found by name. */
+ if (!p->shortname && pathname != name)
+ p->shortname = strrchr(p->name, '/')+1;
+ close(fd);
+ return p;
+ }
+ }
+ map = noload ? 0 : map_library(fd, &temp_dso);
+ close(fd);
+ if (!map) return 0;
+
+ /* Avoid the danger of getting two versions of libc mapped into the
+ * same process when an absolute pathname was used. The symbols
+ * checked are chosen to catch both musl and glibc, and to avoid
+ * false positives from interposition-hack libraries. */
+ decode_dyn(&temp_dso);
+ if (find_sym(&temp_dso, "__libc_start_main", 1).sym &&
+ find_sym(&temp_dso, "stdin", 1).sym) {
+ unmap_library(&temp_dso);
+ return load_library("libc.so", needed_by);
+ }
+ /* Past this point, if we haven't reached runtime yet, ldso has
+ * committed either to use the mapped library or to abort execution.
+ * Unmapping is not possible, so we can safely reclaim gaps. */
+ if (!runtime) reclaim_gaps(&temp_dso);
+
+ /* Allocate storage for the new DSO. When there is TLS, this
+ * storage must include a reservation for all pre-existing
+ * threads to obtain copies of both the new TLS, and an
+ * extended DTV capable of storing an additional slot for
+ * the newly-loaded DSO. */
+ alloc_size = sizeof *p + strlen(pathname) + 1;
+ if (runtime && temp_dso.tls.image) {
+ size_t per_th = temp_dso.tls.size + temp_dso.tls.align
+ + sizeof(void *) * (tls_cnt+3);
+ n_th = libc.threads_minus_1 + 1;
+ if (n_th > SSIZE_MAX / per_th) alloc_size = SIZE_MAX;
+ else alloc_size += n_th * per_th;
+ }
+ p = calloc(1, alloc_size);
+ if (!p) {
+ unmap_library(&temp_dso);
+ return 0;
+ }
+ memcpy(p, &temp_dso, sizeof temp_dso);
+ p->dev = st.st_dev;
+ p->ino = st.st_ino;
+ p->needed_by = needed_by;
+ p->name = p->buf;
+ p->runtime_loaded = runtime;
+ strcpy(p->name, pathname);
+ /* Add a shortname only if name arg was not an explicit pathname. */
+ if (pathname != name) p->shortname = strrchr(p->name, '/')+1;
+ if (p->tls.image) {
+ p->tls_id = ++tls_cnt;
+ tls_align = MAXP2(tls_align, p->tls.align);
+#ifdef TLS_ABOVE_TP
+ p->tls.offset = tls_offset + ( (p->tls.align-1) &
+ (-tls_offset + (uintptr_t)p->tls.image) );
+ tls_offset = p->tls.offset + p->tls.size;
+#else
+ tls_offset += p->tls.size + p->tls.align - 1;
+ tls_offset -= (tls_offset + (uintptr_t)p->tls.image)
+ & (p->tls.align-1);
+ p->tls.offset = tls_offset;
+#endif
+ p->new_dtv = (void *)(-sizeof(size_t) &
+ (uintptr_t)(p->name+strlen(p->name)+sizeof(size_t)));
+ p->new_tls = (void *)(p->new_dtv + n_th*(tls_cnt+1));
+ if (tls_tail) tls_tail->next = &p->tls;
+ else libc.tls_head = &p->tls;
+ tls_tail = &p->tls;
+ }
+
+ tail->next = p;
+ p->prev = tail;
+ tail = p;
+
+ if (DL_FDPIC) makefuncdescs(p);
+
+ if (ldd_mode) dprintf(1, "\t%s => %s (%p)\n", name, pathname, p->base);
+
+ return p;
+}
+
+static void load_direct_deps(struct dso *p)
+{
+ size_t i, cnt=0;
+
+ if (p->deps) return;
+ /* For head, all preloads are direct pseudo-dependencies.
+ * Count and include them now to avoid realloc later. */
+ if (p==head) for (struct dso *q=p->next; q; q=q->next)
+ cnt++;
+ for (i=0; p->dynv[i]; i+=2)
+ if (p->dynv[i] == DT_NEEDED) cnt++;
+ /* Use builtin buffer for apps with no external deps, to
+ * preserve property of no runtime failure paths. */
+ p->deps = (p==head && cnt<2) ? builtin_deps :
+ calloc(cnt+1, sizeof *p->deps);
+ if (!p->deps) {
+ error("Error loading dependencies for %s", p->name);
+ if (runtime) longjmp(*rtld_fail, 1);
+ }
+ cnt=0;
+ if (p==head) for (struct dso *q=p->next; q; q=q->next)
+ p->deps[cnt++] = q;
+ for (i=0; p->dynv[i]; i+=2) {
+ if (p->dynv[i] != DT_NEEDED) continue;
+ struct dso *dep = load_library(p->strings + p->dynv[i+1], p);
+ if (!dep) {
+ error("Error loading shared library %s: %m (needed by %s)",
+ p->strings + p->dynv[i+1], p->name);
+ if (runtime) longjmp(*rtld_fail, 1);
+ continue;
+ }
+ p->deps[cnt++] = dep;
+ }
+ p->deps[cnt] = 0;
+ p->ndeps_direct = cnt;
+}
+
+static void load_deps(struct dso *p)
+{
+ if (p->deps) return;
+ for (; p; p=p->next)
+ load_direct_deps(p);
+}
+
+static void extend_bfs_deps(struct dso *p)
+{
+ size_t i, j, cnt, ndeps_all;
+ struct dso **tmp;
+
+ /* Can't use realloc if the original p->deps was allocated at
+ * program entry and malloc has been replaced, or if it's
+ * the builtin non-allocated trivial main program deps array. */
+ int no_realloc = (__malloc_replaced && !p->runtime_loaded)
+ || p->deps == builtin_deps;
+
+ if (p->bfs_built) return;
+ ndeps_all = p->ndeps_direct;
+
+ /* Mark existing (direct) deps so they won't be duplicated. */
+ for (i=0; p->deps[i]; i++)
+ p->deps[i]->mark = 1;
+
+ /* For each dependency already in the list, copy its list of direct
+ * dependencies to the list, excluding any items already in the
+ * list. Note that the list this loop iterates over will grow during
+ * the loop, but since duplicates are excluded, growth is bounded. */
+ for (i=0; p->deps[i]; i++) {
+ struct dso *dep = p->deps[i];
+ for (j=cnt=0; j<dep->ndeps_direct; j++)
+ if (!dep->deps[j]->mark) cnt++;
+ tmp = no_realloc ?
+ malloc(sizeof(*tmp) * (ndeps_all+cnt+1)) :
+ realloc(p->deps, sizeof(*tmp) * (ndeps_all+cnt+1));
+ if (!tmp) {
+ error("Error recording dependencies for %s", p->name);
+ if (runtime) longjmp(*rtld_fail, 1);
+ continue;
+ }
+ if (no_realloc) {
+ memcpy(tmp, p->deps, sizeof(*tmp) * (ndeps_all+1));
+ no_realloc = 0;
+ }
+ p->deps = tmp;
+ for (j=0; j<dep->ndeps_direct; j++) {
+ if (dep->deps[j]->mark) continue;
+ dep->deps[j]->mark = 1;
+ p->deps[ndeps_all++] = dep->deps[j];
+ }
+ p->deps[ndeps_all] = 0;
+ }
+ p->bfs_built = 1;
+ for (p=head; p; p=p->next)
+ p->mark = 0;
+}
+
+static void load_preload(char *s)
+{
+ int tmp;
+ char *z;
+ for (z=s; *z; s=z) {
+ for ( ; *s && (isspace(*s) || *s==':'); s++);
+ for (z=s; *z && !isspace(*z) && *z!=':'; z++);
+ tmp = *z;
+ *z = 0;
+ load_library(s, 0);
+ *z = tmp;
+ }
+}
+
+static void add_syms(struct dso *p)
+{
+ if (!p->syms_next && syms_tail != p) {
+ syms_tail->syms_next = p;
+ syms_tail = p;
+ }
+}
+
+static void revert_syms(struct dso *old_tail)
+{
+ struct dso *p, *next;
+ /* Chop off the tail of the list of dsos that participate in
+ * the global symbol table, reverting them to RTLD_LOCAL. */
+ for (p=old_tail; p; p=next) {
+ next = p->syms_next;
+ p->syms_next = 0;
+ }
+ syms_tail = old_tail;
+}
+
+static void do_mips_relocs(struct dso *p, size_t *got)
+{
+ size_t i, j, rel[2];
+ unsigned char *base = p->base;
+ i=0; search_vec(p->dynv, &i, DT_MIPS_LOCAL_GOTNO);
+ if (p==&ldso) {
+ got += i;
+ } else {
+ while (i--) *got++ += (size_t)base;
+ }
+ j=0; search_vec(p->dynv, &j, DT_MIPS_GOTSYM);
+ i=0; search_vec(p->dynv, &i, DT_MIPS_SYMTABNO);
+ Sym *sym = p->syms + j;
+ rel[0] = (unsigned char *)got - base;
+ for (i-=j; i; i--, sym++, rel[0]+=sizeof(size_t)) {
+ rel[1] = R_INFO(sym-p->syms, R_MIPS_JUMP_SLOT);
+ do_relocs(p, rel, sizeof rel, 2);
+ }
+}
+
+static void reloc_all(struct dso *p)
+{
+ size_t dyn[DYN_CNT];
+ for (; p; p=p->next) {
+ if (p->relocated) continue;
+ decode_vec(p->dynv, dyn, DYN_CNT);
+ if (NEED_MIPS_GOT_RELOCS)
+ do_mips_relocs(p, laddr(p, dyn[DT_PLTGOT]));
+ do_relocs(p, laddr(p, dyn[DT_JMPREL]), dyn[DT_PLTRELSZ],
+ 2+(dyn[DT_PLTREL]==DT_RELA));
+ do_relocs(p, laddr(p, dyn[DT_REL]), dyn[DT_RELSZ], 2);
+ do_relocs(p, laddr(p, dyn[DT_RELA]), dyn[DT_RELASZ], 3);
+
+ if (head != &ldso && p->relro_start != p->relro_end &&
+ mprotect(laddr(p, p->relro_start), p->relro_end-p->relro_start, PROT_READ)
+ && errno != ENOSYS) {
+ error("Error relocating %s: RELRO protection failed: %m",
+ p->name);
+ if (runtime) longjmp(*rtld_fail, 1);
+ }
+
+ p->relocated = 1;
+ }
+}
+
+static void kernel_mapped_dso(struct dso *p)
+{
+ size_t min_addr = -1, max_addr = 0, cnt;
+ Phdr *ph = p->phdr;
+ for (cnt = p->phnum; cnt--; ph = (void *)((char *)ph + p->phentsize)) {
+ if (ph->p_type == PT_DYNAMIC) {
+ p->dynv = laddr(p, ph->p_vaddr);
+ } else if (ph->p_type == PT_GNU_RELRO) {
+ p->relro_start = ph->p_vaddr & -PAGE_SIZE;
+ p->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE;
+ } else if (ph->p_type == PT_GNU_STACK) {
+ if (!runtime && ph->p_memsz > __default_stacksize) {
+ __default_stacksize =
+ ph->p_memsz < DEFAULT_STACK_MAX ?
+ ph->p_memsz : DEFAULT_STACK_MAX;
+ }
+ }
+ if (ph->p_type != PT_LOAD) continue;
+ if (ph->p_vaddr < min_addr)
+ min_addr = ph->p_vaddr;
+ if (ph->p_vaddr+ph->p_memsz > max_addr)
+ max_addr = ph->p_vaddr+ph->p_memsz;
+ }
+ min_addr &= -PAGE_SIZE;
+ max_addr = (max_addr + PAGE_SIZE-1) & -PAGE_SIZE;
+ p->map = p->base + min_addr;
+ p->map_len = max_addr - min_addr;
+ p->kernel_mapped = 1;
+}
+
+void __libc_exit_fini()
+{
+ struct dso *p;
+ size_t dyn[DYN_CNT];
+ pthread_t self = __pthread_self();
+
+ /* Take both locks before setting shutting_down, so that
+ * either lock is sufficient to read its value. The lock
+ * order matches that in dlopen to avoid deadlock. */
+ pthread_rwlock_wrlock(&lock);
+ pthread_mutex_lock(&init_fini_lock);
+ shutting_down = 1;
+ pthread_rwlock_unlock(&lock);
+ for (p=fini_head; p; p=p->fini_next) {
+ while (p->ctor_visitor && p->ctor_visitor!=self)
+ pthread_cond_wait(&ctor_cond, &init_fini_lock);
+ if (!p->constructed) continue;
+ decode_vec(p->dynv, dyn, DYN_CNT);
+ if (dyn[0] & (1<<DT_FINI_ARRAY)) {
+ size_t n = dyn[DT_FINI_ARRAYSZ]/sizeof(size_t);
+ size_t *fn = (size_t *)laddr(p, dyn[DT_FINI_ARRAY])+n;
+ while (n--) ((void (*)(void))*--fn)();
+ }
+#ifndef NO_LEGACY_INITFINI
+ if ((dyn[0] & (1<<DT_FINI)) && dyn[DT_FINI])
+ fpaddr(p, dyn[DT_FINI])();
+#endif
+ }
+}
+
+void __ldso_atfork(int who)
+{
+ if (who<0) {
+ pthread_rwlock_wrlock(&lock);
+ pthread_mutex_lock(&init_fini_lock);
+ } else {
+ pthread_mutex_unlock(&init_fini_lock);
+ pthread_rwlock_unlock(&lock);
+ }
+}
+
+static struct dso **queue_ctors(struct dso *dso)
+{
+ size_t cnt, qpos, spos, i;
+ struct dso *p, **queue, **stack;
+
+ if (ldd_mode) return 0;
+
+ /* Bound on queue size is the total number of indirect deps.
+ * If a bfs deps list was built, we can use it. Otherwise,
+ * bound by the total number of DSOs, which is always safe and
+ * is reasonable we use it (for main app at startup). */
+ if (dso->bfs_built) {
+ for (cnt=0; dso->deps[cnt]; cnt++)
+ dso->deps[cnt]->mark = 0;
+ cnt++; /* self, not included in deps */
+ } else {
+ for (cnt=0, p=head; p; cnt++, p=p->next)
+ p->mark = 0;
+ }
+ cnt++; /* termination slot */
+ if (dso==head && cnt <= countof(builtin_ctor_queue))
+ queue = builtin_ctor_queue;
+ else
+ queue = calloc(cnt, sizeof *queue);
+
+ if (!queue) {
+ error("Error allocating constructor queue: %m\n");
+ if (runtime) longjmp(*rtld_fail, 1);
+ return 0;
+ }
+
+ /* Opposite ends of the allocated buffer serve as an output queue
+ * and a working stack. Setup initial stack with just the argument
+ * dso and initial queue empty... */
+ stack = queue;
+ qpos = 0;
+ spos = cnt;
+ stack[--spos] = dso;
+ dso->next_dep = 0;
+ dso->mark = 1;
+
+ /* Then perform pseudo-DFS sort, but ignoring circular deps. */
+ while (spos<cnt) {
+ p = stack[spos++];
+ while (p->next_dep < p->ndeps_direct) {
+ if (p->deps[p->next_dep]->mark) {
+ p->next_dep++;
+ } else {
+ stack[--spos] = p;
+ p = p->deps[p->next_dep];
+ p->next_dep = 0;
+ p->mark = 1;
+ }
+ }
+ queue[qpos++] = p;
+ }
+ queue[qpos] = 0;
+ for (i=0; i<qpos; i++) queue[i]->mark = 0;
+ for (i=0; i<qpos; i++)
+ if (queue[i]->ctor_visitor && queue[i]->ctor_visitor->tid < 0) {
+ error("State of %s is inconsistent due to multithreaded fork\n",
+ queue[i]->name);
+ free(queue);
+ if (runtime) longjmp(*rtld_fail, 1);
+ }
+
+ return queue;
+}
+
+static void do_init_fini(struct dso **queue)
+{
+ struct dso *p;
+ size_t dyn[DYN_CNT], i;
+ pthread_t self = __pthread_self();
+
+ pthread_mutex_lock(&init_fini_lock);
+ for (i=0; (p=queue[i]); i++) {
+ while ((p->ctor_visitor && p->ctor_visitor!=self) || shutting_down)
+ pthread_cond_wait(&ctor_cond, &init_fini_lock);
+ if (p->ctor_visitor || p->constructed)
+ continue;
+ p->ctor_visitor = self;
+
+ decode_vec(p->dynv, dyn, DYN_CNT);
+ if (dyn[0] & ((1<<DT_FINI) | (1<<DT_FINI_ARRAY))) {
+ p->fini_next = fini_head;
+ fini_head = p;
+ }
+
+ pthread_mutex_unlock(&init_fini_lock);
+
+#ifndef NO_LEGACY_INITFINI
+ if ((dyn[0] & (1<<DT_INIT)) && dyn[DT_INIT])
+ fpaddr(p, dyn[DT_INIT])();
+#endif
+ if (dyn[0] & (1<<DT_INIT_ARRAY)) {
+ size_t n = dyn[DT_INIT_ARRAYSZ]/sizeof(size_t);
+ size_t *fn = laddr(p, dyn[DT_INIT_ARRAY]);
+ while (n--) ((void (*)(void))*fn++)();
+ }
+
+ pthread_mutex_lock(&init_fini_lock);
+ p->ctor_visitor = 0;
+ p->constructed = 1;
+ pthread_cond_broadcast(&ctor_cond);
+ }
+ pthread_mutex_unlock(&init_fini_lock);
+}
+
+void __libc_start_init(void)
+{
+ do_init_fini(main_ctor_queue);
+ if (!__malloc_replaced && main_ctor_queue != builtin_ctor_queue)
+ free(main_ctor_queue);
+ main_ctor_queue = 0;
+}
+
+static void dl_debug_state(void)
+{
+}
+
+weak_alias(dl_debug_state, _dl_debug_state);
+
+void __init_tls(size_t *auxv)
+{
+}
+
+static void update_tls_size()
+{
+ libc.tls_cnt = tls_cnt;
+ libc.tls_align = tls_align;
+ libc.tls_size = ALIGN(
+ (1+tls_cnt) * sizeof(void *) +
+ tls_offset +
+ sizeof(struct pthread) +
+ tls_align * 2,
+ tls_align);
+}
+
+static void install_new_tls(void)
+{
+ sigset_t set;
+ pthread_t self = __pthread_self(), td;
+ struct dso *dtv_provider = container_of(tls_tail, struct dso, tls);
+ uintptr_t (*newdtv)[tls_cnt+1] = (void *)dtv_provider->new_dtv;
+ struct dso *p;
+ size_t i, j;
+ size_t old_cnt = self->dtv[0];
+
+ __block_app_sigs(&set);
+ __tl_lock();
+ /* Copy existing dtv contents from all existing threads. */
+ for (i=0, td=self; !i || td!=self; i++, td=td->next) {
+ memcpy(newdtv+i, td->dtv,
+ (old_cnt+1)*sizeof(uintptr_t));
+ newdtv[i][0] = tls_cnt;
+ }
+ /* Install new dtls into the enlarged, uninstalled dtv copies. */
+ for (p=head; ; p=p->next) {
+ if (p->tls_id <= old_cnt) continue;
+ unsigned char *mem = p->new_tls;
+ for (j=0; j<i; j++) {
+ unsigned char *new = mem;
+ new += ((uintptr_t)p->tls.image - (uintptr_t)mem)
+ & (p->tls.align-1);
+ memcpy(new, p->tls.image, p->tls.len);
+ newdtv[j][p->tls_id] =
+ (uintptr_t)new + DTP_OFFSET;
+ mem += p->tls.size + p->tls.align;
+ }
+ if (p->tls_id == tls_cnt) break;
+ }
+
+ /* Broadcast barrier to ensure contents of new dtv is visible
+ * if the new dtv pointer is. The __membarrier function has a
+ * fallback emulation using signals for kernels that lack the
+ * feature at the syscall level. */
+
+ __membarrier(MEMBARRIER_CMD_PRIVATE_EXPEDITED, 0);
+
+ /* Install new dtv for each thread. */
+ for (j=0, td=self; !j || td!=self; j++, td=td->next) {
+ td->dtv = newdtv[j];
+ }
+
+ __tl_unlock();
+ __restore_sigs(&set);
+}
+
+/* Stage 1 of the dynamic linker is defined in dlstart.c. It calls the
+ * following stage 2 and stage 3 functions via primitive symbolic lookup
+ * since it does not have access to their addresses to begin with. */
+
+/* Stage 2 of the dynamic linker is called after relative relocations
+ * have been processed. It can make function calls to static functions
+ * and access string literals and static data, but cannot use extern
+ * symbols. Its job is to perform symbolic relocations on the dynamic
+ * linker itself, but some of the relocations performed may need to be
+ * replaced later due to copy relocations in the main program. */
+
+hidden void __dls2(unsigned char *base, size_t *sp)
+{
+ size_t *auxv;
+ for (auxv=sp+1+*sp+1; *auxv; auxv++);
+ auxv++;
+ if (DL_FDPIC) {
+ void *p1 = (void *)sp[-2];
+ void *p2 = (void *)sp[-1];
+ if (!p1) {
+ size_t aux[AUX_CNT];
+ decode_vec(auxv, aux, AUX_CNT);
+ if (aux[AT_BASE]) ldso.base = (void *)aux[AT_BASE];
+ else ldso.base = (void *)(aux[AT_PHDR] & -4096);
+ }
+ app_loadmap = p2 ? p1 : 0;
+ ldso.loadmap = p2 ? p2 : p1;
+ ldso.base = laddr(&ldso, 0);
+ } else {
+ ldso.base = base;
+ }
+ Ehdr *ehdr = (void *)ldso.base;
+ ldso.name = ldso.shortname = "libc.so";
+ ldso.phnum = ehdr->e_phnum;
+ ldso.phdr = laddr(&ldso, ehdr->e_phoff);
+ ldso.phentsize = ehdr->e_phentsize;
+ kernel_mapped_dso(&ldso);
+ decode_dyn(&ldso);
+
+ if (DL_FDPIC) makefuncdescs(&ldso);
+
+ /* Prepare storage for to save clobbered REL addends so they
+ * can be reused in stage 3. There should be very few. If
+ * something goes wrong and there are a huge number, abort
+ * instead of risking stack overflow. */
+ size_t dyn[DYN_CNT];
+ decode_vec(ldso.dynv, dyn, DYN_CNT);
+ size_t *rel = laddr(&ldso, dyn[DT_REL]);
+ size_t rel_size = dyn[DT_RELSZ];
+ size_t symbolic_rel_cnt = 0;
+ apply_addends_to = rel;
+ for (; rel_size; rel+=2, rel_size-=2*sizeof(size_t))
+ if (!IS_RELATIVE(rel[1], ldso.syms)) symbolic_rel_cnt++;
+ if (symbolic_rel_cnt >= ADDEND_LIMIT) a_crash();
+ size_t addends[symbolic_rel_cnt+1];
+ saved_addends = addends;
+
+ head = &ldso;
+ reloc_all(&ldso);
+
+ ldso.relocated = 0;
+
+ /* Call dynamic linker stage-2b, __dls2b, looking it up
+ * symbolically as a barrier against moving the address
+ * load across the above relocation processing. */
+ struct symdef dls2b_def = find_sym(&ldso, "__dls2b", 0);
+ if (DL_FDPIC) ((stage3_func)&ldso.funcdescs[dls2b_def.sym-ldso.syms])(sp, auxv);
+ else ((stage3_func)laddr(&ldso, dls2b_def.sym->st_value))(sp, auxv);
+}
+
+/* Stage 2b sets up a valid thread pointer, which requires relocations
+ * completed in stage 2, and on which stage 3 is permitted to depend.
+ * This is done as a separate stage, with symbolic lookup as a barrier,
+ * so that loads of the thread pointer and &errno can be pure/const and
+ * thereby hoistable. */
+
+void __dls2b(size_t *sp, size_t *auxv)
+{
+ /* Setup early thread pointer in builtin_tls for ldso/libc itself to
+ * use during dynamic linking. If possible it will also serve as the
+ * thread pointer at runtime. */
+ search_vec(auxv, &__hwcap, AT_HWCAP);
+ libc.auxv = auxv;
+ libc.tls_size = sizeof builtin_tls;
+ libc.tls_align = tls_align;
+ if (__init_tp(__copy_tls((void *)builtin_tls)) < 0) {
+ a_crash();
+ }
+
+ struct symdef dls3_def = find_sym(&ldso, "__dls3", 0);
+ if (DL_FDPIC) ((stage3_func)&ldso.funcdescs[dls3_def.sym-ldso.syms])(sp, auxv);
+ else ((stage3_func)laddr(&ldso, dls3_def.sym->st_value))(sp, auxv);
+}
+
+/* Stage 3 of the dynamic linker is called with the dynamic linker/libc
+ * fully functional. Its job is to load (if not already loaded) and
+ * process dependencies and relocations for the main application and
+ * transfer control to its entry point. */
+
+void __dls3(size_t *sp, size_t *auxv)
+{
+ static struct dso app, vdso;
+ size_t aux[AUX_CNT];
+ size_t i;
+ char *env_preload=0;
+ char *replace_argv0=0;
+ size_t vdso_base;
+ int argc = *sp;
+ char **argv = (void *)(sp+1);
+ char **argv_orig = argv;
+ char **envp = argv+argc+1;
+
+ /* Find aux vector just past environ[] and use it to initialize
+ * global data that may be needed before we can make syscalls. */
+ __environ = envp;
+ decode_vec(auxv, aux, AUX_CNT);
+ search_vec(auxv, &__sysinfo, AT_SYSINFO);
+ __pthread_self()->sysinfo = __sysinfo;
+ libc.page_size = aux[AT_PAGESZ];
+ libc.secure = ((aux[0]&0x7800)!=0x7800 || aux[AT_UID]!=aux[AT_EUID]
+ || aux[AT_GID]!=aux[AT_EGID] || aux[AT_SECURE]);
+
+ /* Only trust user/env if kernel says we're not suid/sgid */
+ if (!libc.secure) {
+ env_path = getenv("LD_LIBRARY_PATH");
+ env_preload = getenv("LD_PRELOAD");
+ }
+
+ /* If the main program was already loaded by the kernel,
+ * AT_PHDR will point to some location other than the dynamic
+ * linker's program headers. */
+ if (aux[AT_PHDR] != (size_t)ldso.phdr) {
+ size_t interp_off = 0;
+ size_t tls_image = 0;
+ /* Find load address of the main program, via AT_PHDR vs PT_PHDR. */
+ Phdr *phdr = app.phdr = (void *)aux[AT_PHDR];
+ app.phnum = aux[AT_PHNUM];
+ app.phentsize = aux[AT_PHENT];
+ for (i=aux[AT_PHNUM]; i; i--, phdr=(void *)((char *)phdr + aux[AT_PHENT])) {
+ if (phdr->p_type == PT_PHDR)
+ app.base = (void *)(aux[AT_PHDR] - phdr->p_vaddr);
+ else if (phdr->p_type == PT_INTERP)
+ interp_off = (size_t)phdr->p_vaddr;
+ else if (phdr->p_type == PT_TLS) {
+ tls_image = phdr->p_vaddr;
+ app.tls.len = phdr->p_filesz;
+ app.tls.size = phdr->p_memsz;
+ app.tls.align = phdr->p_align;
+ }
+ }
+ if (DL_FDPIC) app.loadmap = app_loadmap;
+ if (app.tls.size) app.tls.image = laddr(&app, tls_image);
+ if (interp_off) ldso.name = laddr(&app, interp_off);
+ if ((aux[0] & (1UL<<AT_EXECFN))
+ && strncmp((char *)aux[AT_EXECFN], "/proc/", 6))
+ app.name = (char *)aux[AT_EXECFN];
+ else
+ app.name = argv[0];
+ kernel_mapped_dso(&app);
+ } else {
+ int fd;
+ char *ldname = argv[0];
+ size_t l = strlen(ldname);
+ if (l >= 3 && !strcmp(ldname+l-3, "ldd")) ldd_mode = 1;
+ argv++;
+ while (argv[0] && argv[0][0]=='-' && argv[0][1]=='-') {
+ char *opt = argv[0]+2;
+ *argv++ = (void *)-1;
+ if (!*opt) {
+ break;
+ } else if (!memcmp(opt, "list", 5)) {
+ ldd_mode = 1;
+ } else if (!memcmp(opt, "library-path", 12)) {
+ if (opt[12]=='=') env_path = opt+13;
+ else if (opt[12]) *argv = 0;
+ else if (*argv) env_path = *argv++;
+ } else if (!memcmp(opt, "preload", 7)) {
+ if (opt[7]=='=') env_preload = opt+8;
+ else if (opt[7]) *argv = 0;
+ else if (*argv) env_preload = *argv++;
+ } else if (!memcmp(opt, "argv0", 5)) {
+ if (opt[5]=='=') replace_argv0 = opt+6;
+ else if (opt[5]) *argv = 0;
+ else if (*argv) replace_argv0 = *argv++;
+ } else {
+ argv[0] = 0;
+ }
+ }
+ argv[-1] = (void *)(argc - (argv-argv_orig));
+ if (!argv[0]) {
+ dprintf(2, "musl libc (" LDSO_ARCH ")\n"
+ "Version %s\n"
+ "Dynamic Program Loader\n"
+ "Usage: %s [options] [--] pathname%s\n",
+ __libc_version, ldname,
+ ldd_mode ? "" : " [args]");
+ _exit(1);
+ }
+ fd = open(argv[0], O_RDONLY);
+ if (fd < 0) {
+ dprintf(2, "%s: cannot load %s: %s\n", ldname, argv[0], strerror(errno));
+ _exit(1);
+ }
+ Ehdr *ehdr = map_library(fd, &app);
+ if (!ehdr) {
+ dprintf(2, "%s: %s: Not a valid dynamic program\n", ldname, argv[0]);
+ _exit(1);
+ }
+ close(fd);
+ ldso.name = ldname;
+ app.name = argv[0];
+ aux[AT_ENTRY] = (size_t)laddr(&app, ehdr->e_entry);
+ /* Find the name that would have been used for the dynamic
+ * linker had ldd not taken its place. */
+ if (ldd_mode) {
+ for (i=0; i<app.phnum; i++) {
+ if (app.phdr[i].p_type == PT_INTERP)
+ ldso.name = laddr(&app, app.phdr[i].p_vaddr);
+ }
+ dprintf(1, "\t%s (%p)\n", ldso.name, ldso.base);
+ }
+ }
+ if (app.tls.size) {
+ libc.tls_head = tls_tail = &app.tls;
+ app.tls_id = tls_cnt = 1;
+#ifdef TLS_ABOVE_TP
+ app.tls.offset = GAP_ABOVE_TP;
+ app.tls.offset += (-GAP_ABOVE_TP + (uintptr_t)app.tls.image)
+ & (app.tls.align-1);
+ tls_offset = app.tls.offset + app.tls.size;
+#else
+ tls_offset = app.tls.offset = app.tls.size
+ + ( -((uintptr_t)app.tls.image + app.tls.size)
+ & (app.tls.align-1) );
+#endif
+ tls_align = MAXP2(tls_align, app.tls.align);
+ }
+ decode_dyn(&app);
+ if (DL_FDPIC) {
+ makefuncdescs(&app);
+ if (!app.loadmap) {
+ app.loadmap = (void *)&app_dummy_loadmap;
+ app.loadmap->nsegs = 1;
+ app.loadmap->segs[0].addr = (size_t)app.map;
+ app.loadmap->segs[0].p_vaddr = (size_t)app.map
+ - (size_t)app.base;
+ app.loadmap->segs[0].p_memsz = app.map_len;
+ }
+ argv[-3] = (void *)app.loadmap;
+ }
+
+ /* Initial dso chain consists only of the app. */
+ head = tail = syms_tail = &app;
+
+ /* Donate unused parts of app and library mapping to malloc */
+ reclaim_gaps(&app);
+ reclaim_gaps(&ldso);
+
+ /* Load preload/needed libraries, add symbols to global namespace. */
+ ldso.deps = (struct dso **)no_deps;
+ if (env_preload) load_preload(env_preload);
+ load_deps(&app);
+ for (struct dso *p=head; p; p=p->next)
+ add_syms(p);
+
+ /* Attach to vdso, if provided by the kernel, last so that it does
+ * not become part of the global namespace. */
+ if (search_vec(auxv, &vdso_base, AT_SYSINFO_EHDR) && vdso_base) {
+ Ehdr *ehdr = (void *)vdso_base;
+ Phdr *phdr = vdso.phdr = (void *)(vdso_base + ehdr->e_phoff);
+ vdso.phnum = ehdr->e_phnum;
+ vdso.phentsize = ehdr->e_phentsize;
+ for (i=ehdr->e_phnum; i; i--, phdr=(void *)((char *)phdr + ehdr->e_phentsize)) {
+ if (phdr->p_type == PT_DYNAMIC)
+ vdso.dynv = (void *)(vdso_base + phdr->p_offset);
+ if (phdr->p_type == PT_LOAD)
+ vdso.base = (void *)(vdso_base - phdr->p_vaddr + phdr->p_offset);
+ }
+ vdso.name = "";
+ vdso.shortname = "linux-gate.so.1";
+ vdso.relocated = 1;
+ vdso.deps = (struct dso **)no_deps;
+ decode_dyn(&vdso);
+ vdso.prev = tail;
+ tail->next = &vdso;
+ tail = &vdso;
+ }
+
+ for (i=0; app.dynv[i]; i+=2) {
+ if (!DT_DEBUG_INDIRECT && app.dynv[i]==DT_DEBUG)
+ app.dynv[i+1] = (size_t)&debug;
+ if (DT_DEBUG_INDIRECT && app.dynv[i]==DT_DEBUG_INDIRECT) {
+ size_t *ptr = (size_t *) app.dynv[i+1];
+ *ptr = (size_t)&debug;
+ }
+ }
+
+ /* This must be done before final relocations, since it calls
+ * malloc, which may be provided by the application. Calling any
+ * application code prior to the jump to its entry point is not
+ * valid in our model and does not work with FDPIC, where there
+ * are additional relocation-like fixups that only the entry point
+ * code can see to perform. */
+ main_ctor_queue = queue_ctors(&app);
+
+ /* Initial TLS must also be allocated before final relocations
+ * might result in calloc being a call to application code. */
+ update_tls_size();
+ void *initial_tls = builtin_tls;
+ if (libc.tls_size > sizeof builtin_tls || tls_align > MIN_TLS_ALIGN) {
+ initial_tls = calloc(libc.tls_size, 1);
+ if (!initial_tls) {
+ dprintf(2, "%s: Error getting %zu bytes thread-local storage: %m\n",
+ argv[0], libc.tls_size);
+ _exit(127);
+ }
+ }
+ static_tls_cnt = tls_cnt;
+
+ /* The main program must be relocated LAST since it may contain
+ * copy relocations which depend on libraries' relocations. */
+ reloc_all(app.next);
+ reloc_all(&app);
+
+ /* Actual copying to new TLS needs to happen after relocations,
+ * since the TLS images might have contained relocated addresses. */
+ if (initial_tls != builtin_tls) {
+ if (__init_tp(__copy_tls(initial_tls)) < 0) {
+ a_crash();
+ }
+ } else {
+ size_t tmp_tls_size = libc.tls_size;
+ pthread_t self = __pthread_self();
+ /* Temporarily set the tls size to the full size of
+ * builtin_tls so that __copy_tls will use the same layout
+ * as it did for before. Then check, just to be safe. */
+ libc.tls_size = sizeof builtin_tls;
+ if (__copy_tls((void*)builtin_tls) != self) a_crash();
+ libc.tls_size = tmp_tls_size;
+ }
+
+ if (ldso_fail) _exit(127);
+ if (ldd_mode) _exit(0);
+
+ /* Determine if malloc was interposed by a replacement implementation
+ * so that calloc and the memalign family can harden against the
+ * possibility of incomplete replacement. */
+ if (find_sym(head, "malloc", 1).dso != &ldso)
+ __malloc_replaced = 1;
+ if (find_sym(head, "aligned_alloc", 1).dso != &ldso)
+ __aligned_alloc_replaced = 1;
+
+ /* Switch to runtime mode: any further failures in the dynamic
+ * linker are a reportable failure rather than a fatal startup
+ * error. */
+ runtime = 1;
+
+ debug.ver = 1;
+ debug.bp = dl_debug_state;
+ debug.head = head;
+ debug.base = ldso.base;
+ debug.state = RT_CONSISTENT;
+ _dl_debug_state();
+
+ if (replace_argv0) argv[0] = replace_argv0;
+
+ errno = 0;
+
+ CRTJMP((void *)aux[AT_ENTRY], argv-1);
+ for(;;);
+}
+
+static void prepare_lazy(struct dso *p)
+{
+ size_t dyn[DYN_CNT], n, flags1=0;
+ decode_vec(p->dynv, dyn, DYN_CNT);
+ search_vec(p->dynv, &flags1, DT_FLAGS_1);
+ if (dyn[DT_BIND_NOW] || (dyn[DT_FLAGS] & DF_BIND_NOW) || (flags1 & DF_1_NOW))
+ return;
+ n = dyn[DT_RELSZ]/2 + dyn[DT_RELASZ]/3 + dyn[DT_PLTRELSZ]/2 + 1;
+ if (NEED_MIPS_GOT_RELOCS) {
+ size_t j=0; search_vec(p->dynv, &j, DT_MIPS_GOTSYM);
+ size_t i=0; search_vec(p->dynv, &i, DT_MIPS_SYMTABNO);
+ n += i-j;
+ }
+ p->lazy = calloc(n, 3*sizeof(size_t));
+ if (!p->lazy) {
+ error("Error preparing lazy relocation for %s: %m", p->name);
+ longjmp(*rtld_fail, 1);
+ }
+ p->lazy_next = lazy_head;
+ lazy_head = p;
+}
+
+void *dlopen(const char *file, int mode)
+{
+ struct dso *volatile p, *orig_tail, *orig_syms_tail, *orig_lazy_head, *next;
+ struct tls_module *orig_tls_tail;
+ size_t orig_tls_cnt, orig_tls_offset, orig_tls_align;
+ size_t i;
+ int cs;
+ jmp_buf jb;
+ struct dso **volatile ctor_queue = 0;
+
+ if (!file) return head;
+
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ pthread_rwlock_wrlock(&lock);
+ __inhibit_ptc();
+
+ debug.state = RT_ADD;
+ _dl_debug_state();
+
+ p = 0;
+ if (shutting_down) {
+ error("Cannot dlopen while program is exiting.");
+ goto end;
+ }
+ orig_tls_tail = tls_tail;
+ orig_tls_cnt = tls_cnt;
+ orig_tls_offset = tls_offset;
+ orig_tls_align = tls_align;
+ orig_lazy_head = lazy_head;
+ orig_syms_tail = syms_tail;
+ orig_tail = tail;
+ noload = mode & RTLD_NOLOAD;
+
+ rtld_fail = &jb;
+ if (setjmp(*rtld_fail)) {
+ /* Clean up anything new that was (partially) loaded */
+ revert_syms(orig_syms_tail);
+ for (p=orig_tail->next; p; p=next) {
+ next = p->next;
+ while (p->td_index) {
+ void *tmp = p->td_index->next;
+ free(p->td_index);
+ p->td_index = tmp;
+ }
+ free(p->funcdescs);
+ if (p->rpath != p->rpath_orig)
+ free(p->rpath);
+ free(p->deps);
+ unmap_library(p);
+ free(p);
+ }
+ free(ctor_queue);
+ ctor_queue = 0;
+ if (!orig_tls_tail) libc.tls_head = 0;
+ tls_tail = orig_tls_tail;
+ if (tls_tail) tls_tail->next = 0;
+ tls_cnt = orig_tls_cnt;
+ tls_offset = orig_tls_offset;
+ tls_align = orig_tls_align;
+ lazy_head = orig_lazy_head;
+ tail = orig_tail;
+ tail->next = 0;
+ p = 0;
+ goto end;
+ } else p = load_library(file, head);
+
+ if (!p) {
+ error(noload ?
+ "Library %s is not already loaded" :
+ "Error loading shared library %s: %m",
+ file);
+ goto end;
+ }
+
+ /* First load handling */
+ load_deps(p);
+ extend_bfs_deps(p);
+ pthread_mutex_lock(&init_fini_lock);
+ int constructed = p->constructed;
+ pthread_mutex_unlock(&init_fini_lock);
+ if (!constructed) ctor_queue = queue_ctors(p);
+ if (!p->relocated && (mode & RTLD_LAZY)) {
+ prepare_lazy(p);
+ for (i=0; p->deps[i]; i++)
+ if (!p->deps[i]->relocated)
+ prepare_lazy(p->deps[i]);
+ }
+ if (!p->relocated || (mode & RTLD_GLOBAL)) {
+ /* Make new symbols global, at least temporarily, so we can do
+ * relocations. If not RTLD_GLOBAL, this is reverted below. */
+ add_syms(p);
+ for (i=0; p->deps[i]; i++)
+ add_syms(p->deps[i]);
+ }
+ if (!p->relocated) {
+ reloc_all(p);
+ }
+
+ /* If RTLD_GLOBAL was not specified, undo any new additions
+ * to the global symbol table. This is a nop if the library was
+ * previously loaded and already global. */
+ if (!(mode & RTLD_GLOBAL))
+ revert_syms(orig_syms_tail);
+
+ /* Processing of deferred lazy relocations must not happen until
+ * the new libraries are committed; otherwise we could end up with
+ * relocations resolved to symbol definitions that get removed. */
+ redo_lazy_relocs();
+
+ update_tls_size();
+ if (tls_cnt != orig_tls_cnt)
+ install_new_tls();
+ orig_tail = tail;
+end:
+ debug.state = RT_CONSISTENT;
+ _dl_debug_state();
+ __release_ptc();
+ if (p) gencnt++;
+ pthread_rwlock_unlock(&lock);
+ if (ctor_queue) {
+ do_init_fini(ctor_queue);
+ free(ctor_queue);
+ }
+ pthread_setcancelstate(cs, 0);
+ return p;
+}
+
+hidden int __dl_invalid_handle(void *h)
+{
+ struct dso *p;
+ for (p=head; p; p=p->next) if (h==p) return 0;
+ error("Invalid library handle %p", (void *)h);
+ return 1;
+}
+
+static void *addr2dso(size_t a)
+{
+ struct dso *p;
+ size_t i;
+ if (DL_FDPIC) for (p=head; p; p=p->next) {
+ i = count_syms(p);
+ if (a-(size_t)p->funcdescs < i*sizeof(*p->funcdescs))
+ return p;
+ }
+ for (p=head; p; p=p->next) {
+ if (DL_FDPIC && p->loadmap) {
+ for (i=0; i<p->loadmap->nsegs; i++) {
+ if (a-p->loadmap->segs[i].p_vaddr
+ < p->loadmap->segs[i].p_memsz)
+ return p;
+ }
+ } else {
+ Phdr *ph = p->phdr;
+ size_t phcnt = p->phnum;
+ size_t entsz = p->phentsize;
+ size_t base = (size_t)p->base;
+ for (; phcnt--; ph=(void *)((char *)ph+entsz)) {
+ if (ph->p_type != PT_LOAD) continue;
+ if (a-base-ph->p_vaddr < ph->p_memsz)
+ return p;
+ }
+ if (a-(size_t)p->map < p->map_len)
+ return 0;
+ }
+ }
+ return 0;
+}
+
+static void *do_dlsym(struct dso *p, const char *s, void *ra)
+{
+ int use_deps = 0;
+ if (p == head || p == RTLD_DEFAULT) {
+ p = head;
+ } else if (p == RTLD_NEXT) {
+ p = addr2dso((size_t)ra);
+ if (!p) p=head;
+ p = p->next;
+ } else if (__dl_invalid_handle(p)) {
+ return 0;
+ } else
+ use_deps = 1;
+ struct symdef def = find_sym2(p, s, 0, use_deps);
+ if (!def.sym) {
+ error("Symbol not found: %s", s);
+ return 0;
+ }
+ if ((def.sym->st_info&0xf) == STT_TLS)
+ return __tls_get_addr((tls_mod_off_t []){def.dso->tls_id, def.sym->st_value-DTP_OFFSET});
+ if (DL_FDPIC && (def.sym->st_info&0xf) == STT_FUNC)
+ return def.dso->funcdescs + (def.sym - def.dso->syms);
+ return laddr(def.dso, def.sym->st_value);
+}
+
+int dladdr(const void *addr_arg, Dl_info *info)
+{
+ size_t addr = (size_t)addr_arg;
+ struct dso *p;
+ Sym *sym, *bestsym;
+ uint32_t nsym;
+ char *strings;
+ size_t best = 0;
+ size_t besterr = -1;
+
+ pthread_rwlock_rdlock(&lock);
+ p = addr2dso(addr);
+ pthread_rwlock_unlock(&lock);
+
+ if (!p) return 0;
+
+ sym = p->syms;
+ strings = p->strings;
+ nsym = count_syms(p);
+
+ if (DL_FDPIC) {
+ size_t idx = (addr-(size_t)p->funcdescs)
+ / sizeof(*p->funcdescs);
+ if (idx < nsym && (sym[idx].st_info&0xf) == STT_FUNC) {
+ best = (size_t)(p->funcdescs + idx);
+ bestsym = sym + idx;
+ besterr = 0;
+ }
+ }
+
+ if (!best) for (; nsym; nsym--, sym++) {
+ if (sym->st_value
+ && (1<<(sym->st_info&0xf) & OK_TYPES)
+ && (1<<(sym->st_info>>4) & OK_BINDS)) {
+ size_t symaddr = (size_t)laddr(p, sym->st_value);
+ if (symaddr > addr || symaddr <= best)
+ continue;
+ best = symaddr;
+ bestsym = sym;
+ besterr = addr - symaddr;
+ if (addr == symaddr)
+ break;
+ }
+ }
+
+ if (best && besterr > bestsym->st_size-1) {
+ best = 0;
+ bestsym = 0;
+ }
+
+ info->dli_fname = p->name;
+ info->dli_fbase = p->map;
+
+ if (!best) {
+ info->dli_sname = 0;
+ info->dli_saddr = 0;
+ return 1;
+ }
+
+ if (DL_FDPIC && (bestsym->st_info&0xf) == STT_FUNC)
+ best = (size_t)(p->funcdescs + (bestsym - p->syms));
+ info->dli_sname = strings + bestsym->st_name;
+ info->dli_saddr = (void *)best;
+
+ return 1;
+}
+
+hidden void *__dlsym(void *restrict p, const char *restrict s, void *restrict ra)
+{
+ void *res;
+ pthread_rwlock_rdlock(&lock);
+ res = do_dlsym(p, s, ra);
+ pthread_rwlock_unlock(&lock);
+ return res;
+}
+
+hidden void *__dlsym_redir_time64(void *restrict p, const char *restrict s, void *restrict ra)
+{
+#if _REDIR_TIME64
+ const char *suffix, *suffix2 = "";
+ char redir[36];
+
+ /* Map the symbol name to a time64 version of itself according to the
+ * pattern used for naming the redirected time64 symbols. */
+ size_t l = strnlen(s, sizeof redir);
+ if (l<4 || l==sizeof redir) goto no_redir;
+ if (s[l-2]=='_' && s[l-1]=='r') {
+ l -= 2;
+ suffix2 = s+l;
+ }
+ if (l<4) goto no_redir;
+ if (!strcmp(s+l-4, "time")) suffix = "64";
+ else suffix = "_time64";
+
+ /* Use the presence of the remapped symbol name in libc to determine
+ * whether it's one that requires time64 redirection; replace if so. */
+ snprintf(redir, sizeof redir, "__%.*s%s%s", (int)l, s, suffix, suffix2);
+ if (find_sym(&ldso, redir, 1).sym) s = redir;
+no_redir:
+#endif
+ return __dlsym(p, s, ra);
+}
+
+int dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void *data), void *data)
+{
+ struct dso *current;
+ struct dl_phdr_info info;
+ int ret = 0;
+ for(current = head; current;) {
+ info.dlpi_addr = (uintptr_t)current->base;
+ info.dlpi_name = current->name;
+ info.dlpi_phdr = current->phdr;
+ info.dlpi_phnum = current->phnum;
+ info.dlpi_adds = gencnt;
+ info.dlpi_subs = 0;
+ info.dlpi_tls_modid = current->tls_id;
+ info.dlpi_tls_data = !current->tls_id ? 0 :
+ __tls_get_addr((tls_mod_off_t[]){current->tls_id,0});
+
+ ret = (callback)(&info, sizeof (info), data);
+
+ if (ret != 0) break;
+
+ pthread_rwlock_rdlock(&lock);
+ current = current->next;
+ pthread_rwlock_unlock(&lock);
+ }
+ return ret;
+}
+
+static void error(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ if (!runtime) {
+ vdprintf(2, fmt, ap);
+ dprintf(2, "\n");
+ ldso_fail = 1;
+ va_end(ap);
+ return;
+ }
+ __dl_vseterr(fmt, ap);
+ va_end(ap);
+}
diff --git a/libc-top-half/musl/src/aio/aio.c b/libc-top-half/musl/src/aio/aio.c
new file mode 100644
index 0000000..a1a3e79
--- /dev/null
+++ b/libc-top-half/musl/src/aio/aio.c
@@ -0,0 +1,418 @@
+#include <aio.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <limits.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/auxv.h>
+#include "syscall.h"
+#include "atomic.h"
+#include "pthread_impl.h"
+#include "aio_impl.h"
+
+#define malloc __libc_malloc
+#define calloc __libc_calloc
+#define realloc __libc_realloc
+#define free __libc_free
+
+/* The following is a threads-based implementation of AIO with minimal
+ * dependence on implementation details. Most synchronization is
+ * performed with pthread primitives, but atomics and futex operations
+ * are used for notification in a couple places where the pthread
+ * primitives would be inefficient or impractical.
+ *
+ * For each fd with outstanding aio operations, an aio_queue structure
+ * is maintained. These are reference-counted and destroyed by the last
+ * aio worker thread to exit. Accessing any member of the aio_queue
+ * structure requires a lock on the aio_queue. Adding and removing aio
+ * queues themselves requires a write lock on the global map object,
+ * a 4-level table mapping file descriptor numbers to aio queues. A
+ * read lock on the map is used to obtain locks on existing queues by
+ * excluding destruction of the queue by a different thread while it is
+ * being locked.
+ *
+ * Each aio queue has a list of active threads/operations. Presently there
+ * is a one to one relationship between threads and operations. The only
+ * members of the aio_thread structure which are accessed by other threads
+ * are the linked list pointers, op (which is immutable), running (which
+ * is updated atomically), and err (which is synchronized via running),
+ * so no locking is necessary. Most of the other other members are used
+ * for sharing data between the main flow of execution and cancellation
+ * cleanup handler.
+ *
+ * Taking any aio locks requires having all signals blocked. This is
+ * necessary because aio_cancel is needed by close, and close is required
+ * to be async-signal safe. All aio worker threads run with all signals
+ * blocked permanently.
+ */
+
+struct aio_thread {
+ pthread_t td;
+ struct aiocb *cb;
+ struct aio_thread *next, *prev;
+ struct aio_queue *q;
+ volatile int running;
+ int err, op;
+ ssize_t ret;
+};
+
+struct aio_queue {
+ int fd, seekable, append, ref, init;
+ pthread_mutex_t lock;
+ pthread_cond_t cond;
+ struct aio_thread *head;
+};
+
+struct aio_args {
+ struct aiocb *cb;
+ struct aio_queue *q;
+ int op;
+ sem_t sem;
+};
+
+static pthread_rwlock_t maplock = PTHREAD_RWLOCK_INITIALIZER;
+static struct aio_queue *****map;
+static volatile int aio_fd_cnt;
+volatile int __aio_fut;
+
+static size_t io_thread_stack_size;
+
+#define MAX(a,b) ((a)>(b) ? (a) : (b))
+
+static struct aio_queue *__aio_get_queue(int fd, int need)
+{
+ if (fd < 0) {
+ errno = EBADF;
+ return 0;
+ }
+ int a=fd>>24;
+ unsigned char b=fd>>16, c=fd>>8, d=fd;
+ struct aio_queue *q = 0;
+ pthread_rwlock_rdlock(&maplock);
+ if ((!map || !map[a] || !map[a][b] || !map[a][b][c] || !(q=map[a][b][c][d])) && need) {
+ pthread_rwlock_unlock(&maplock);
+ if (fcntl(fd, F_GETFD) < 0) return 0;
+ pthread_rwlock_wrlock(&maplock);
+ if (!io_thread_stack_size) {
+ unsigned long val = __getauxval(AT_MINSIGSTKSZ);
+ io_thread_stack_size = MAX(MINSIGSTKSZ+2048, val+512);
+ }
+ if (!map) map = calloc(sizeof *map, (-1U/2+1)>>24);
+ if (!map) goto out;
+ if (!map[a]) map[a] = calloc(sizeof **map, 256);
+ if (!map[a]) goto out;
+ if (!map[a][b]) map[a][b] = calloc(sizeof ***map, 256);
+ if (!map[a][b]) goto out;
+ if (!map[a][b][c]) map[a][b][c] = calloc(sizeof ****map, 256);
+ if (!map[a][b][c]) goto out;
+ if (!(q = map[a][b][c][d])) {
+ map[a][b][c][d] = q = calloc(sizeof *****map, 1);
+ if (q) {
+ q->fd = fd;
+ pthread_mutex_init(&q->lock, 0);
+ pthread_cond_init(&q->cond, 0);
+ a_inc(&aio_fd_cnt);
+ }
+ }
+ }
+ if (q) pthread_mutex_lock(&q->lock);
+out:
+ pthread_rwlock_unlock(&maplock);
+ return q;
+}
+
+static void __aio_unref_queue(struct aio_queue *q)
+{
+ if (q->ref > 1) {
+ q->ref--;
+ pthread_mutex_unlock(&q->lock);
+ return;
+ }
+
+ /* This is potentially the last reference, but a new reference
+ * may arrive since we cannot free the queue object without first
+ * taking the maplock, which requires releasing the queue lock. */
+ pthread_mutex_unlock(&q->lock);
+ pthread_rwlock_wrlock(&maplock);
+ pthread_mutex_lock(&q->lock);
+ if (q->ref == 1) {
+ int fd=q->fd;
+ int a=fd>>24;
+ unsigned char b=fd>>16, c=fd>>8, d=fd;
+ map[a][b][c][d] = 0;
+ a_dec(&aio_fd_cnt);
+ pthread_rwlock_unlock(&maplock);
+ pthread_mutex_unlock(&q->lock);
+ free(q);
+ } else {
+ q->ref--;
+ pthread_rwlock_unlock(&maplock);
+ pthread_mutex_unlock(&q->lock);
+ }
+}
+
+static void cleanup(void *ctx)
+{
+ struct aio_thread *at = ctx;
+ struct aio_queue *q = at->q;
+ struct aiocb *cb = at->cb;
+ struct sigevent sev = cb->aio_sigevent;
+
+ /* There are four potential types of waiters we could need to wake:
+ * 1. Callers of aio_cancel/close.
+ * 2. Callers of aio_suspend with a single aiocb.
+ * 3. Callers of aio_suspend with a list.
+ * 4. AIO worker threads waiting for sequenced operations.
+ * Types 1-3 are notified via atomics/futexes, mainly for AS-safety
+ * considerations. Type 4 is notified later via a cond var. */
+
+ cb->__ret = at->ret;
+ if (a_swap(&at->running, 0) < 0)
+ __wake(&at->running, -1, 1);
+ if (a_swap(&cb->__err, at->err) != EINPROGRESS)
+ __wake(&cb->__err, -1, 1);
+ if (a_swap(&__aio_fut, 0))
+ __wake(&__aio_fut, -1, 1);
+
+ pthread_mutex_lock(&q->lock);
+
+ if (at->next) at->next->prev = at->prev;
+ if (at->prev) at->prev->next = at->next;
+ else q->head = at->next;
+
+ /* Signal aio worker threads waiting for sequenced operations. */
+ pthread_cond_broadcast(&q->cond);
+
+ __aio_unref_queue(q);
+
+ if (sev.sigev_notify == SIGEV_SIGNAL) {
+ siginfo_t si = {
+ .si_signo = sev.sigev_signo,
+ .si_value = sev.sigev_value,
+ .si_code = SI_ASYNCIO,
+ .si_pid = getpid(),
+ .si_uid = getuid()
+ };
+ __syscall(SYS_rt_sigqueueinfo, si.si_pid, si.si_signo, &si);
+ }
+ if (sev.sigev_notify == SIGEV_THREAD) {
+ a_store(&__pthread_self()->cancel, 0);
+ sev.sigev_notify_function(sev.sigev_value);
+ }
+}
+
+static void *io_thread_func(void *ctx)
+{
+ struct aio_thread at, *p;
+
+ struct aio_args *args = ctx;
+ struct aiocb *cb = args->cb;
+ int fd = cb->aio_fildes;
+ int op = args->op;
+ void *buf = (void *)cb->aio_buf;
+ size_t len = cb->aio_nbytes;
+ off_t off = cb->aio_offset;
+
+ struct aio_queue *q = args->q;
+ ssize_t ret;
+
+ pthread_mutex_lock(&q->lock);
+ sem_post(&args->sem);
+
+ at.op = op;
+ at.running = 1;
+ at.ret = -1;
+ at.err = ECANCELED;
+ at.q = q;
+ at.td = __pthread_self();
+ at.cb = cb;
+ at.prev = 0;
+ if ((at.next = q->head)) at.next->prev = &at;
+ q->head = &at;
+
+ if (!q->init) {
+ int seekable = lseek(fd, 0, SEEK_CUR) >= 0;
+ q->seekable = seekable;
+ q->append = !seekable || (fcntl(fd, F_GETFL) & O_APPEND);
+ q->init = 1;
+ }
+
+ pthread_cleanup_push(cleanup, &at);
+
+ /* Wait for sequenced operations. */
+ if (op!=LIO_READ && (op!=LIO_WRITE || q->append)) {
+ for (;;) {
+ for (p=at.next; p && p->op!=LIO_WRITE; p=p->next);
+ if (!p) break;
+ pthread_cond_wait(&q->cond, &q->lock);
+ }
+ }
+
+ pthread_mutex_unlock(&q->lock);
+
+ switch (op) {
+ case LIO_WRITE:
+ ret = q->append ? write(fd, buf, len) : pwrite(fd, buf, len, off);
+ break;
+ case LIO_READ:
+ ret = !q->seekable ? read(fd, buf, len) : pread(fd, buf, len, off);
+ break;
+ case O_SYNC:
+ ret = fsync(fd);
+ break;
+ case O_DSYNC:
+ ret = fdatasync(fd);
+ break;
+ }
+ at.ret = ret;
+ at.err = ret<0 ? errno : 0;
+
+ pthread_cleanup_pop(1);
+
+ return 0;
+}
+
+static int submit(struct aiocb *cb, int op)
+{
+ int ret = 0;
+ pthread_attr_t a;
+ sigset_t allmask, origmask;
+ pthread_t td;
+ struct aio_queue *q = __aio_get_queue(cb->aio_fildes, 1);
+ struct aio_args args = { .cb = cb, .op = op, .q = q };
+ sem_init(&args.sem, 0, 0);
+
+ if (!q) {
+ if (errno != EBADF) errno = EAGAIN;
+ cb->__ret = -1;
+ cb->__err = errno;
+ return -1;
+ }
+ q->ref++;
+ pthread_mutex_unlock(&q->lock);
+
+ if (cb->aio_sigevent.sigev_notify == SIGEV_THREAD) {
+ if (cb->aio_sigevent.sigev_notify_attributes)
+ a = *cb->aio_sigevent.sigev_notify_attributes;
+ else
+ pthread_attr_init(&a);
+ } else {
+ pthread_attr_init(&a);
+ pthread_attr_setstacksize(&a, io_thread_stack_size);
+ pthread_attr_setguardsize(&a, 0);
+ }
+ pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED);
+ sigfillset(&allmask);
+ pthread_sigmask(SIG_BLOCK, &allmask, &origmask);
+ cb->__err = EINPROGRESS;
+ if (pthread_create(&td, &a, io_thread_func, &args)) {
+ pthread_mutex_lock(&q->lock);
+ __aio_unref_queue(q);
+ cb->__err = errno = EAGAIN;
+ cb->__ret = ret = -1;
+ }
+ pthread_sigmask(SIG_SETMASK, &origmask, 0);
+
+ if (!ret) {
+ while (sem_wait(&args.sem));
+ }
+
+ return ret;
+}
+
+int aio_read(struct aiocb *cb)
+{
+ return submit(cb, LIO_READ);
+}
+
+int aio_write(struct aiocb *cb)
+{
+ return submit(cb, LIO_WRITE);
+}
+
+int aio_fsync(int op, struct aiocb *cb)
+{
+ if (op != O_SYNC && op != O_DSYNC) {
+ errno = EINVAL;
+ return -1;
+ }
+ return submit(cb, op);
+}
+
+ssize_t aio_return(struct aiocb *cb)
+{
+ return cb->__ret;
+}
+
+int aio_error(const struct aiocb *cb)
+{
+ a_barrier();
+ return cb->__err & 0x7fffffff;
+}
+
+int aio_cancel(int fd, struct aiocb *cb)
+{
+ sigset_t allmask, origmask;
+ int ret = AIO_ALLDONE;
+ struct aio_thread *p;
+ struct aio_queue *q;
+
+ /* Unspecified behavior case. Report an error. */
+ if (cb && fd != cb->aio_fildes) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ sigfillset(&allmask);
+ pthread_sigmask(SIG_BLOCK, &allmask, &origmask);
+
+ errno = ENOENT;
+ if (!(q = __aio_get_queue(fd, 0))) {
+ if (errno == EBADF) ret = -1;
+ goto done;
+ }
+
+ for (p = q->head; p; p = p->next) {
+ if (cb && cb != p->cb) continue;
+ /* Transition target from running to running-with-waiters */
+ if (a_cas(&p->running, 1, -1)) {
+ pthread_cancel(p->td);
+ __wait(&p->running, 0, -1, 1);
+ if (p->err == ECANCELED) ret = AIO_CANCELED;
+ }
+ }
+
+ pthread_mutex_unlock(&q->lock);
+done:
+ pthread_sigmask(SIG_SETMASK, &origmask, 0);
+ return ret;
+}
+
+int __aio_close(int fd)
+{
+ a_barrier();
+ if (aio_fd_cnt) aio_cancel(fd, 0);
+ return fd;
+}
+
+void __aio_atfork(int who)
+{
+ if (who<0) {
+ pthread_rwlock_rdlock(&maplock);
+ return;
+ }
+ if (who>0 && map) for (int a=0; a<(-1U/2+1)>>24; a++)
+ if (map[a]) for (int b=0; b<256; b++)
+ if (map[a][b]) for (int c=0; c<256; c++)
+ if (map[a][b][c]) for (int d=0; d<256; d++)
+ map[a][b][c][d] = 0;
+ pthread_rwlock_unlock(&maplock);
+}
+
+weak_alias(aio_cancel, aio_cancel64);
+weak_alias(aio_error, aio_error64);
+weak_alias(aio_fsync, aio_fsync64);
+weak_alias(aio_read, aio_read64);
+weak_alias(aio_write, aio_write64);
+weak_alias(aio_return, aio_return64);
diff --git a/libc-top-half/musl/src/aio/aio_suspend.c b/libc-top-half/musl/src/aio/aio_suspend.c
new file mode 100644
index 0000000..1c1060e
--- /dev/null
+++ b/libc-top-half/musl/src/aio/aio_suspend.c
@@ -0,0 +1,79 @@
+#include <aio.h>
+#include <errno.h>
+#include <time.h>
+#include "atomic.h"
+#include "pthread_impl.h"
+#include "aio_impl.h"
+
+int aio_suspend(const struct aiocb *const cbs[], int cnt, const struct timespec *ts)
+{
+ int i, tid = 0, ret, expect = 0;
+ struct timespec at;
+ volatile int dummy_fut, *pfut;
+ int nzcnt = 0;
+ const struct aiocb *cb = 0;
+
+ pthread_testcancel();
+
+ if (cnt<0) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ for (i=0; i<cnt; i++) if (cbs[i]) {
+ if (aio_error(cbs[i]) != EINPROGRESS) return 0;
+ nzcnt++;
+ cb = cbs[i];
+ }
+
+ if (ts) {
+ clock_gettime(CLOCK_MONOTONIC, &at);
+ at.tv_sec += ts->tv_sec;
+ if ((at.tv_nsec += ts->tv_nsec) >= 1000000000) {
+ at.tv_nsec -= 1000000000;
+ at.tv_sec++;
+ }
+ }
+
+ for (;;) {
+ for (i=0; i<cnt; i++)
+ if (cbs[i] && aio_error(cbs[i]) != EINPROGRESS)
+ return 0;
+
+ switch (nzcnt) {
+ case 0:
+ pfut = &dummy_fut;
+ break;
+ case 1:
+ pfut = (void *)&cb->__err;
+ expect = EINPROGRESS | 0x80000000;
+ a_cas(pfut, EINPROGRESS, expect);
+ break;
+ default:
+ pfut = &__aio_fut;
+ if (!tid) tid = __pthread_self()->tid;
+ expect = a_cas(pfut, 0, tid);
+ if (!expect) expect = tid;
+ /* Need to recheck the predicate before waiting. */
+ for (i=0; i<cnt; i++)
+ if (cbs[i] && aio_error(cbs[i]) != EINPROGRESS)
+ return 0;
+ break;
+ }
+
+ ret = __timedwait_cp(pfut, expect, CLOCK_MONOTONIC, ts?&at:0, 1);
+
+ switch (ret) {
+ case ETIMEDOUT:
+ ret = EAGAIN;
+ case ECANCELED:
+ case EINTR:
+ errno = ret;
+ return -1;
+ }
+ }
+}
+
+#if !_REDIR_TIME64
+weak_alias(aio_suspend, aio_suspend64);
+#endif
diff --git a/libc-top-half/musl/src/aio/lio_listio.c b/libc-top-half/musl/src/aio/lio_listio.c
new file mode 100644
index 0000000..0799c15
--- /dev/null
+++ b/libc-top-half/musl/src/aio/lio_listio.c
@@ -0,0 +1,143 @@
+#include <aio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include "pthread_impl.h"
+
+struct lio_state {
+ struct sigevent *sev;
+ int cnt;
+ struct aiocb *cbs[];
+};
+
+static int lio_wait(struct lio_state *st)
+{
+ int i, err, got_err = 0;
+ int cnt = st->cnt;
+ struct aiocb **cbs = st->cbs;
+
+ for (;;) {
+ for (i=0; i<cnt; i++) {
+ if (!cbs[i]) continue;
+ err = aio_error(cbs[i]);
+ if (err==EINPROGRESS)
+ break;
+ if (err) got_err=1;
+ cbs[i] = 0;
+ }
+ if (i==cnt) {
+ if (got_err) {
+ errno = EIO;
+ return -1;
+ }
+ return 0;
+ }
+ if (aio_suspend((void *)cbs, cnt, 0))
+ return -1;
+ }
+}
+
+static void notify_signal(struct sigevent *sev)
+{
+ siginfo_t si = {
+ .si_signo = sev->sigev_signo,
+ .si_value = sev->sigev_value,
+ .si_code = SI_ASYNCIO,
+ .si_pid = getpid(),
+ .si_uid = getuid()
+ };
+ __syscall(SYS_rt_sigqueueinfo, si.si_pid, si.si_signo, &si);
+}
+
+static void *wait_thread(void *p)
+{
+ struct lio_state *st = p;
+ struct sigevent *sev = st->sev;
+ lio_wait(st);
+ free(st);
+ switch (sev->sigev_notify) {
+ case SIGEV_SIGNAL:
+ notify_signal(sev);
+ break;
+ case SIGEV_THREAD:
+ sev->sigev_notify_function(sev->sigev_value);
+ break;
+ }
+ return 0;
+}
+
+int lio_listio(int mode, struct aiocb *restrict const *restrict cbs, int cnt, struct sigevent *restrict sev)
+{
+ int i, ret;
+ struct lio_state *st=0;
+
+ if (cnt < 0) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (mode == LIO_WAIT || (sev && sev->sigev_notify != SIGEV_NONE)) {
+ if (!(st = malloc(sizeof *st + cnt*sizeof *cbs))) {
+ errno = EAGAIN;
+ return -1;
+ }
+ st->cnt = cnt;
+ st->sev = sev;
+ memcpy(st->cbs, (void*) cbs, cnt*sizeof *cbs);
+ }
+
+ for (i=0; i<cnt; i++) {
+ if (!cbs[i]) continue;
+ switch (cbs[i]->aio_lio_opcode) {
+ case LIO_READ:
+ ret = aio_read(cbs[i]);
+ break;
+ case LIO_WRITE:
+ ret = aio_write(cbs[i]);
+ break;
+ default:
+ continue;
+ }
+ if (ret) {
+ free(st);
+ errno = EAGAIN;
+ return -1;
+ }
+ }
+
+ if (mode == LIO_WAIT) {
+ ret = lio_wait(st);
+ free(st);
+ return ret;
+ }
+
+ if (st) {
+ pthread_attr_t a;
+ sigset_t set, set_old;
+ pthread_t td;
+
+ if (sev->sigev_notify == SIGEV_THREAD) {
+ if (sev->sigev_notify_attributes)
+ a = *sev->sigev_notify_attributes;
+ else
+ pthread_attr_init(&a);
+ } else {
+ pthread_attr_init(&a);
+ pthread_attr_setstacksize(&a, PAGE_SIZE);
+ pthread_attr_setguardsize(&a, 0);
+ }
+ pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED);
+ sigfillset(&set);
+ pthread_sigmask(SIG_BLOCK, &set, &set_old);
+ if (pthread_create(&td, &a, wait_thread, st)) {
+ free(st);
+ errno = EAGAIN;
+ return -1;
+ }
+ pthread_sigmask(SIG_SETMASK, &set_old, 0);
+ }
+
+ return 0;
+}
+
+weak_alias(lio_listio, lio_listio64);
diff --git a/libc-top-half/musl/src/complex/__cexp.c b/libc-top-half/musl/src/complex/__cexp.c
new file mode 100644
index 0000000..003d20a
--- /dev/null
+++ b/libc-top-half/musl/src/complex/__cexp.c
@@ -0,0 +1,87 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/k_exp.c */
+/*-
+ * Copyright (c) 2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "complex_impl.h"
+
+static const uint32_t k = 1799; /* constant for reduction */
+static const double kln2 = 1246.97177782734161156; /* k * ln2 */
+
+/*
+ * Compute exp(x), scaled to avoid spurious overflow. An exponent is
+ * returned separately in 'expt'.
+ *
+ * Input: ln(DBL_MAX) <= x < ln(2 * DBL_MAX / DBL_MIN_DENORM) ~= 1454.91
+ * Output: 2**1023 <= y < 2**1024
+ */
+static double __frexp_exp(double x, int *expt)
+{
+ double exp_x;
+ uint32_t hx;
+
+ /*
+ * We use exp(x) = exp(x - kln2) * 2**k, carefully chosen to
+ * minimize |exp(kln2) - 2**k|. We also scale the exponent of
+ * exp_x to MAX_EXP so that the result can be multiplied by
+ * a tiny number without losing accuracy due to denormalization.
+ */
+ exp_x = exp(x - kln2);
+ GET_HIGH_WORD(hx, exp_x);
+ *expt = (hx >> 20) - (0x3ff + 1023) + k;
+ SET_HIGH_WORD(exp_x, (hx & 0xfffff) | ((0x3ff + 1023) << 20));
+ return exp_x;
+}
+
+/*
+ * __ldexp_cexp(x, expt) compute exp(x) * 2**expt.
+ * It is intended for large arguments (real part >= ln(DBL_MAX))
+ * where care is needed to avoid overflow.
+ *
+ * The present implementation is narrowly tailored for our hyperbolic and
+ * exponential functions. We assume expt is small (0 or -1), and the caller
+ * has filtered out very large x, for which overflow would be inevitable.
+ */
+double complex __ldexp_cexp(double complex z, int expt)
+{
+ double x, y, exp_x, scale1, scale2;
+ int ex_expt, half_expt;
+
+ x = creal(z);
+ y = cimag(z);
+ exp_x = __frexp_exp(x, &ex_expt);
+ expt += ex_expt;
+
+ /*
+ * Arrange so that scale1 * scale2 == 2**expt. We use this to
+ * compensate for scalbn being horrendously slow.
+ */
+ half_expt = expt / 2;
+ INSERT_WORDS(scale1, (0x3ff + half_expt) << 20, 0);
+ half_expt = expt - half_expt;
+ INSERT_WORDS(scale2, (0x3ff + half_expt) << 20, 0);
+
+ return CMPLX(cos(y) * exp_x * scale1 * scale2, sin(y) * exp_x * scale1 * scale2);
+}
diff --git a/libc-top-half/musl/src/complex/__cexpf.c b/libc-top-half/musl/src/complex/__cexpf.c
new file mode 100644
index 0000000..ee5ff2b
--- /dev/null
+++ b/libc-top-half/musl/src/complex/__cexpf.c
@@ -0,0 +1,68 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/k_expf.c */
+/*-
+ * Copyright (c) 2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "complex_impl.h"
+
+static const uint32_t k = 235; /* constant for reduction */
+static const float kln2 = 162.88958740F; /* k * ln2 */
+
+/*
+ * See __cexp.c for details.
+ *
+ * Input: ln(FLT_MAX) <= x < ln(2 * FLT_MAX / FLT_MIN_DENORM) ~= 192.7
+ * Output: 2**127 <= y < 2**128
+ */
+static float __frexp_expf(float x, int *expt)
+{
+ float exp_x;
+ uint32_t hx;
+
+ exp_x = expf(x - kln2);
+ GET_FLOAT_WORD(hx, exp_x);
+ *expt = (hx >> 23) - (0x7f + 127) + k;
+ SET_FLOAT_WORD(exp_x, (hx & 0x7fffff) | ((0x7f + 127) << 23));
+ return exp_x;
+}
+
+float complex __ldexp_cexpf(float complex z, int expt)
+{
+ float x, y, exp_x, scale1, scale2;
+ int ex_expt, half_expt;
+
+ x = crealf(z);
+ y = cimagf(z);
+ exp_x = __frexp_expf(x, &ex_expt);
+ expt += ex_expt;
+
+ half_expt = expt / 2;
+ SET_FLOAT_WORD(scale1, (0x7f + half_expt) << 23);
+ half_expt = expt - half_expt;
+ SET_FLOAT_WORD(scale2, (0x7f + half_expt) << 23);
+
+ return CMPLXF(cosf(y) * exp_x * scale1 * scale2,
+ sinf(y) * exp_x * scale1 * scale2);
+}
diff --git a/libc-top-half/musl/src/complex/cabs.c b/libc-top-half/musl/src/complex/cabs.c
new file mode 100644
index 0000000..c5ad58a
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cabs.c
@@ -0,0 +1,6 @@
+#include "complex_impl.h"
+
+double cabs(double complex z)
+{
+ return hypot(creal(z), cimag(z));
+}
diff --git a/libc-top-half/musl/src/complex/cabsf.c b/libc-top-half/musl/src/complex/cabsf.c
new file mode 100644
index 0000000..619f28d
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cabsf.c
@@ -0,0 +1,6 @@
+#include "complex_impl.h"
+
+float cabsf(float complex z)
+{
+ return hypotf(crealf(z), cimagf(z));
+}
diff --git a/libc-top-half/musl/src/complex/cabsl.c b/libc-top-half/musl/src/complex/cabsl.c
new file mode 100644
index 0000000..d37e3f2
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cabsl.c
@@ -0,0 +1,13 @@
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double cabsl(long double complex z)
+{
+ return cabs(z);
+}
+#else
+long double cabsl(long double complex z)
+{
+ return hypotl(creall(z), cimagl(z));
+}
+#endif
diff --git a/libc-top-half/musl/src/complex/cacos.c b/libc-top-half/musl/src/complex/cacos.c
new file mode 100644
index 0000000..c39d257
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cacos.c
@@ -0,0 +1,11 @@
+#include "complex_impl.h"
+
+// FIXME: Hull et al. "Implementing the complex arcsine and arccosine functions using exception handling" 1997
+
+/* acos(z) = pi/2 - asin(z) */
+
+double complex cacos(double complex z)
+{
+ z = casin(z);
+ return CMPLX(M_PI_2 - creal(z), -cimag(z));
+}
diff --git a/libc-top-half/musl/src/complex/cacosf.c b/libc-top-half/musl/src/complex/cacosf.c
new file mode 100644
index 0000000..ed8acf0
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cacosf.c
@@ -0,0 +1,11 @@
+#include "complex_impl.h"
+
+// FIXME
+
+static const float float_pi_2 = M_PI_2;
+
+float complex cacosf(float complex z)
+{
+ z = casinf(z);
+ return CMPLXF(float_pi_2 - crealf(z), -cimagf(z));
+}
diff --git a/libc-top-half/musl/src/complex/cacosh.c b/libc-top-half/musl/src/complex/cacosh.c
new file mode 100644
index 0000000..76127f7
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cacosh.c
@@ -0,0 +1,12 @@
+#include "complex_impl.h"
+
+/* acosh(z) = i acos(z) */
+
+double complex cacosh(double complex z)
+{
+ int zineg = signbit(cimag(z));
+
+ z = cacos(z);
+ if (zineg) return CMPLX(cimag(z), -creal(z));
+ else return CMPLX(-cimag(z), creal(z));
+}
diff --git a/libc-top-half/musl/src/complex/cacoshf.c b/libc-top-half/musl/src/complex/cacoshf.c
new file mode 100644
index 0000000..8bd8058
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cacoshf.c
@@ -0,0 +1,10 @@
+#include "complex_impl.h"
+
+float complex cacoshf(float complex z)
+{
+ int zineg = signbit(cimagf(z));
+
+ z = cacosf(z);
+ if (zineg) return CMPLXF(cimagf(z), -crealf(z));
+ else return CMPLXF(-cimagf(z), crealf(z));
+}
diff --git a/libc-top-half/musl/src/complex/cacoshl.c b/libc-top-half/musl/src/complex/cacoshl.c
new file mode 100644
index 0000000..3a284be
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cacoshl.c
@@ -0,0 +1,17 @@
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double complex cacoshl(long double complex z)
+{
+ return cacosh(z);
+}
+#else
+long double complex cacoshl(long double complex z)
+{
+ int zineg = signbit(cimagl(z));
+
+ z = cacosl(z);
+ if (zineg) return CMPLXL(cimagl(z), -creall(z));
+ else return CMPLXL(-cimagl(z), creall(z));
+}
+#endif
diff --git a/libc-top-half/musl/src/complex/cacosl.c b/libc-top-half/musl/src/complex/cacosl.c
new file mode 100644
index 0000000..cc20dcd
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cacosl.c
@@ -0,0 +1,16 @@
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double complex cacosl(long double complex z)
+{
+ return cacos(z);
+}
+#else
+// FIXME
+#define PI_2 1.57079632679489661923132169163975144L
+long double complex cacosl(long double complex z)
+{
+ z = casinl(z);
+ return CMPLXL(PI_2 - creall(z), -cimagl(z));
+}
+#endif
diff --git a/libc-top-half/musl/src/complex/carg.c b/libc-top-half/musl/src/complex/carg.c
new file mode 100644
index 0000000..dfe9b97
--- /dev/null
+++ b/libc-top-half/musl/src/complex/carg.c
@@ -0,0 +1,6 @@
+#include "complex_impl.h"
+
+double carg(double complex z)
+{
+ return atan2(cimag(z), creal(z));
+}
diff --git a/libc-top-half/musl/src/complex/cargf.c b/libc-top-half/musl/src/complex/cargf.c
new file mode 100644
index 0000000..9a6c19b
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cargf.c
@@ -0,0 +1,6 @@
+#include "complex_impl.h"
+
+float cargf(float complex z)
+{
+ return atan2f(cimagf(z), crealf(z));
+}
diff --git a/libc-top-half/musl/src/complex/cargl.c b/libc-top-half/musl/src/complex/cargl.c
new file mode 100644
index 0000000..88f95f9
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cargl.c
@@ -0,0 +1,13 @@
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double cargl(long double complex z)
+{
+ return carg(z);
+}
+#else
+long double cargl(long double complex z)
+{
+ return atan2l(cimagl(z), creall(z));
+}
+#endif
diff --git a/libc-top-half/musl/src/complex/casin.c b/libc-top-half/musl/src/complex/casin.c
new file mode 100644
index 0000000..3244beb
--- /dev/null
+++ b/libc-top-half/musl/src/complex/casin.c
@@ -0,0 +1,17 @@
+#include "complex_impl.h"
+
+// FIXME
+
+/* asin(z) = -i log(i z + sqrt(1 - z*z)) */
+
+double complex casin(double complex z)
+{
+ double complex w;
+ double x, y;
+
+ x = creal(z);
+ y = cimag(z);
+ w = CMPLX(1.0 - (x - y)*(x + y), -2.0*x*y);
+ double complex r = clog(CMPLX(-y, x) + csqrt(w));
+ return CMPLX(cimag(r), -creal(r));
+}
diff --git a/libc-top-half/musl/src/complex/casinf.c b/libc-top-half/musl/src/complex/casinf.c
new file mode 100644
index 0000000..2cda2f0
--- /dev/null
+++ b/libc-top-half/musl/src/complex/casinf.c
@@ -0,0 +1,15 @@
+#include "complex_impl.h"
+
+// FIXME
+
+float complex casinf(float complex z)
+{
+ float complex w;
+ float x, y;
+
+ x = crealf(z);
+ y = cimagf(z);
+ w = CMPLXF(1.0 - (x - y)*(x + y), -2.0*x*y);
+ float complex r = clogf(CMPLXF(-y, x) + csqrtf(w));
+ return CMPLXF(cimagf(r), -crealf(r));
+}
diff --git a/libc-top-half/musl/src/complex/casinh.c b/libc-top-half/musl/src/complex/casinh.c
new file mode 100644
index 0000000..50bf27c
--- /dev/null
+++ b/libc-top-half/musl/src/complex/casinh.c
@@ -0,0 +1,9 @@
+#include "complex_impl.h"
+
+/* asinh(z) = -i asin(i z) */
+
+double complex casinh(double complex z)
+{
+ z = casin(CMPLX(-cimag(z), creal(z)));
+ return CMPLX(cimag(z), -creal(z));
+}
diff --git a/libc-top-half/musl/src/complex/casinhf.c b/libc-top-half/musl/src/complex/casinhf.c
new file mode 100644
index 0000000..93d82e5
--- /dev/null
+++ b/libc-top-half/musl/src/complex/casinhf.c
@@ -0,0 +1,7 @@
+#include "complex_impl.h"
+
+float complex casinhf(float complex z)
+{
+ z = casinf(CMPLXF(-cimagf(z), crealf(z)));
+ return CMPLXF(cimagf(z), -crealf(z));
+}
diff --git a/libc-top-half/musl/src/complex/casinhl.c b/libc-top-half/musl/src/complex/casinhl.c
new file mode 100644
index 0000000..68ba3dd
--- /dev/null
+++ b/libc-top-half/musl/src/complex/casinhl.c
@@ -0,0 +1,14 @@
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double complex casinhl(long double complex z)
+{
+ return casinh(z);
+}
+#else
+long double complex casinhl(long double complex z)
+{
+ z = casinl(CMPLXL(-cimagl(z), creall(z)));
+ return CMPLXL(cimagl(z), -creall(z));
+}
+#endif
diff --git a/libc-top-half/musl/src/complex/casinl.c b/libc-top-half/musl/src/complex/casinl.c
new file mode 100644
index 0000000..072adc4
--- /dev/null
+++ b/libc-top-half/musl/src/complex/casinl.c
@@ -0,0 +1,21 @@
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double complex casinl(long double complex z)
+{
+ return casin(z);
+}
+#else
+// FIXME
+long double complex casinl(long double complex z)
+{
+ long double complex w;
+ long double x, y;
+
+ x = creall(z);
+ y = cimagl(z);
+ w = CMPLXL(1.0 - (x - y)*(x + y), -2.0*x*y);
+ long double complex r = clogl(CMPLXL(-y, x) + csqrtl(w));
+ return CMPLXL(cimagl(r), -creall(r));
+}
+#endif
diff --git a/libc-top-half/musl/src/complex/catan.c b/libc-top-half/musl/src/complex/catan.c
new file mode 100644
index 0000000..ccc2fb5
--- /dev/null
+++ b/libc-top-half/musl/src/complex/catan.c
@@ -0,0 +1,107 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/s_catan.c */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Complex circular arc tangent
+ *
+ *
+ * SYNOPSIS:
+ *
+ * double complex catan();
+ * double complex z, w;
+ *
+ * w = catan (z);
+ *
+ *
+ * DESCRIPTION:
+ *
+ * If
+ * z = x + iy,
+ *
+ * then
+ * 1 ( 2x )
+ * Re w = - arctan(-----------) + k PI
+ * 2 ( 2 2)
+ * (1 - x - y )
+ *
+ * ( 2 2)
+ * 1 (x + (y+1) )
+ * Im w = - log(------------)
+ * 4 ( 2 2)
+ * (x + (y-1) )
+ *
+ * Where k is an arbitrary integer.
+ *
+ * catan(z) = -i catanh(iz).
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * DEC -10,+10 5900 1.3e-16 7.8e-18
+ * IEEE -10,+10 30000 2.3e-15 8.5e-17
+ * The check catan( ctan(z) ) = z, with |x| and |y| < PI/2,
+ * had peak relative error 1.5e-16, rms relative error
+ * 2.9e-17. See also clog().
+ */
+
+#include "complex_impl.h"
+
+#define MAXNUM 1.0e308
+
+static const double DP1 = 3.14159265160560607910E0;
+static const double DP2 = 1.98418714791870343106E-9;
+static const double DP3 = 1.14423774522196636802E-17;
+
+static double _redupi(double x)
+{
+ double t;
+ long i;
+
+ t = x/M_PI;
+ if (t >= 0.0)
+ t += 0.5;
+ else
+ t -= 0.5;
+
+ i = t; /* the multiple */
+ t = i;
+ t = ((x - t * DP1) - t * DP2) - t * DP3;
+ return t;
+}
+
+double complex catan(double complex z)
+{
+ double complex w;
+ double a, t, x, x2, y;
+
+ x = creal(z);
+ y = cimag(z);
+
+ x2 = x * x;
+ a = 1.0 - x2 - (y * y);
+
+ t = 0.5 * atan2(2.0 * x, a);
+ w = _redupi(t);
+
+ t = y - 1.0;
+ a = x2 + (t * t);
+
+ t = y + 1.0;
+ a = (x2 + t * t)/a;
+ w = CMPLX(w, 0.25 * log(a));
+ return w;
+}
diff --git a/libc-top-half/musl/src/complex/catanf.c b/libc-top-half/musl/src/complex/catanf.c
new file mode 100644
index 0000000..1d569f2
--- /dev/null
+++ b/libc-top-half/musl/src/complex/catanf.c
@@ -0,0 +1,105 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/s_catanf.c */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Complex circular arc tangent
+ *
+ *
+ * SYNOPSIS:
+ *
+ * float complex catanf();
+ * float complex z, w;
+ *
+ * w = catanf( z );
+ *
+ *
+ * DESCRIPTION:
+ *
+ * If
+ * z = x + iy,
+ *
+ * then
+ * 1 ( 2x )
+ * Re w = - arctan(-----------) + k PI
+ * 2 ( 2 2)
+ * (1 - x - y )
+ *
+ * ( 2 2)
+ * 1 (x + (y+1) )
+ * Im w = - log(------------)
+ * 4 ( 2 2)
+ * (x + (y-1) )
+ *
+ * Where k is an arbitrary integer.
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE -10,+10 30000 2.3e-6 5.2e-8
+ */
+
+#include "complex_impl.h"
+
+#define MAXNUMF 1.0e38F
+
+static const double DP1 = 3.140625;
+static const double DP2 = 9.67502593994140625E-4;
+static const double DP3 = 1.509957990978376432E-7;
+
+static const float float_pi = M_PI;
+
+static float _redupif(float xx)
+{
+ float x, t;
+ long i;
+
+ x = xx;
+ t = x/float_pi;
+ if (t >= 0.0f)
+ t += 0.5f;
+ else
+ t -= 0.5f;
+
+ i = t; /* the multiple */
+ t = i;
+ t = ((x - t * DP1) - t * DP2) - t * DP3;
+ return t;
+}
+
+float complex catanf(float complex z)
+{
+ float complex w;
+ float a, t, x, x2, y;
+
+ x = crealf(z);
+ y = cimagf(z);
+
+ x2 = x * x;
+ a = 1.0f - x2 - (y * y);
+
+ t = 0.5f * atan2f(2.0f * x, a);
+ w = _redupif(t);
+
+ t = y - 1.0f;
+ a = x2 + (t * t);
+
+ t = y + 1.0f;
+ a = (x2 + (t * t))/a;
+ w = CMPLXF(w, 0.25f * logf(a));
+ return w;
+}
diff --git a/libc-top-half/musl/src/complex/catanh.c b/libc-top-half/musl/src/complex/catanh.c
new file mode 100644
index 0000000..c324c7f
--- /dev/null
+++ b/libc-top-half/musl/src/complex/catanh.c
@@ -0,0 +1,9 @@
+#include "complex_impl.h"
+
+/* atanh = -i atan(i z) */
+
+double complex catanh(double complex z)
+{
+ z = catan(CMPLX(-cimag(z), creal(z)));
+ return CMPLX(cimag(z), -creal(z));
+}
diff --git a/libc-top-half/musl/src/complex/catanhf.c b/libc-top-half/musl/src/complex/catanhf.c
new file mode 100644
index 0000000..b0505f6
--- /dev/null
+++ b/libc-top-half/musl/src/complex/catanhf.c
@@ -0,0 +1,7 @@
+#include "complex_impl.h"
+
+float complex catanhf(float complex z)
+{
+ z = catanf(CMPLXF(-cimagf(z), crealf(z)));
+ return CMPLXF(cimagf(z), -crealf(z));
+}
diff --git a/libc-top-half/musl/src/complex/catanhl.c b/libc-top-half/musl/src/complex/catanhl.c
new file mode 100644
index 0000000..6025c41
--- /dev/null
+++ b/libc-top-half/musl/src/complex/catanhl.c
@@ -0,0 +1,14 @@
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double complex catanhl(long double complex z)
+{
+ return catanh(z);
+}
+#else
+long double complex catanhl(long double complex z)
+{
+ z = catanl(CMPLXL(-cimagl(z), creall(z)));
+ return CMPLXL(cimagl(z), -creall(z));
+}
+#endif
diff --git a/libc-top-half/musl/src/complex/catanl.c b/libc-top-half/musl/src/complex/catanl.c
new file mode 100644
index 0000000..e62526c
--- /dev/null
+++ b/libc-top-half/musl/src/complex/catanl.c
@@ -0,0 +1,114 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/s_catanl.c */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Complex circular arc tangent
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double complex catanl();
+ * long double complex z, w;
+ *
+ * w = catanl( z );
+ *
+ *
+ * DESCRIPTION:
+ *
+ * If
+ * z = x + iy,
+ *
+ * then
+ * 1 ( 2x )
+ * Re w = - arctan(-----------) + k PI
+ * 2 ( 2 2)
+ * (1 - x - y )
+ *
+ * ( 2 2)
+ * 1 (x + (y+1) )
+ * Im w = - log(------------)
+ * 4 ( 2 2)
+ * (x + (y-1) )
+ *
+ * Where k is an arbitrary integer.
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * DEC -10,+10 5900 1.3e-16 7.8e-18
+ * IEEE -10,+10 30000 2.3e-15 8.5e-17
+ * The check catan( ctan(z) ) = z, with |x| and |y| < PI/2,
+ * had peak relative error 1.5e-16, rms relative error
+ * 2.9e-17. See also clog().
+ */
+
+#include <complex.h>
+#include <float.h>
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double complex catanl(long double complex z)
+{
+ return catan(z);
+}
+#else
+static const long double PIL = 3.141592653589793238462643383279502884197169L;
+static const long double DP1 = 3.14159265358979323829596852490908531763125L;
+static const long double DP2 = 1.6667485837041756656403424829301998703007e-19L;
+static const long double DP3 = 1.8830410776607851167459095484560349402753e-39L;
+
+static long double redupil(long double x)
+{
+ long double t;
+ long i;
+
+ t = x / PIL;
+ if (t >= 0.0L)
+ t += 0.5L;
+ else
+ t -= 0.5L;
+
+ i = t; /* the multiple */
+ t = i;
+ t = ((x - t * DP1) - t * DP2) - t * DP3;
+ return t;
+}
+
+long double complex catanl(long double complex z)
+{
+ long double complex w;
+ long double a, t, x, x2, y;
+
+ x = creall(z);
+ y = cimagl(z);
+
+ x2 = x * x;
+ a = 1.0L - x2 - (y * y);
+
+ t = atan2l(2.0L * x, a) * 0.5L;
+ w = redupil(t);
+
+ t = y - 1.0L;
+ a = x2 + (t * t);
+
+ t = y + 1.0L;
+ a = (x2 + (t * t)) / a;
+ w = CMPLXF(w, 0.25L * logl(a));
+ return w;
+}
+#endif
diff --git a/libc-top-half/musl/src/complex/ccos.c b/libc-top-half/musl/src/complex/ccos.c
new file mode 100644
index 0000000..f32e1fa
--- /dev/null
+++ b/libc-top-half/musl/src/complex/ccos.c
@@ -0,0 +1,8 @@
+#include "complex_impl.h"
+
+/* cos(z) = cosh(i z) */
+
+double complex ccos(double complex z)
+{
+ return ccosh(CMPLX(-cimag(z), creal(z)));
+}
diff --git a/libc-top-half/musl/src/complex/ccosf.c b/libc-top-half/musl/src/complex/ccosf.c
new file mode 100644
index 0000000..490be9b
--- /dev/null
+++ b/libc-top-half/musl/src/complex/ccosf.c
@@ -0,0 +1,6 @@
+#include "complex_impl.h"
+
+float complex ccosf(float complex z)
+{
+ return ccoshf(CMPLXF(-cimagf(z), crealf(z)));
+}
diff --git a/libc-top-half/musl/src/complex/ccosh.c b/libc-top-half/musl/src/complex/ccosh.c
new file mode 100644
index 0000000..c995da7
--- /dev/null
+++ b/libc-top-half/musl/src/complex/ccosh.c
@@ -0,0 +1,140 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_ccosh.c */
+/*-
+ * Copyright (c) 2005 Bruce D. Evans and Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * Hyperbolic cosine of a complex argument z = x + i y.
+ *
+ * cosh(z) = cosh(x+iy)
+ * = cosh(x) cos(y) + i sinh(x) sin(y).
+ *
+ * Exceptional values are noted in the comments within the source code.
+ * These values and the return value were taken from n1124.pdf.
+ */
+
+#include "complex_impl.h"
+
+static const double huge = 0x1p1023;
+
+double complex ccosh(double complex z)
+{
+ double x, y, h;
+ int32_t hx, hy, ix, iy, lx, ly;
+
+ x = creal(z);
+ y = cimag(z);
+
+ EXTRACT_WORDS(hx, lx, x);
+ EXTRACT_WORDS(hy, ly, y);
+
+ ix = 0x7fffffff & hx;
+ iy = 0x7fffffff & hy;
+
+ /* Handle the nearly-non-exceptional cases where x and y are finite. */
+ if (ix < 0x7ff00000 && iy < 0x7ff00000) {
+ if ((iy | ly) == 0)
+ return CMPLX(cosh(x), x * y);
+ if (ix < 0x40360000) /* small x: normal case */
+ return CMPLX(cosh(x) * cos(y), sinh(x) * sin(y));
+
+ /* |x| >= 22, so cosh(x) ~= exp(|x|) */
+ if (ix < 0x40862e42) {
+ /* x < 710: exp(|x|) won't overflow */
+ h = exp(fabs(x)) * 0.5;
+ return CMPLX(h * cos(y), copysign(h, x) * sin(y));
+ } else if (ix < 0x4096bbaa) {
+ /* x < 1455: scale to avoid overflow */
+ z = __ldexp_cexp(CMPLX(fabs(x), y), -1);
+ return CMPLX(creal(z), cimag(z) * copysign(1, x));
+ } else {
+ /* x >= 1455: the result always overflows */
+ h = huge * x;
+ return CMPLX(h * h * cos(y), h * sin(y));
+ }
+ }
+
+ /*
+ * cosh(+-0 +- I Inf) = dNaN + I sign(d(+-0, dNaN))0.
+ * The sign of 0 in the result is unspecified. Choice = normally
+ * the same as dNaN. Raise the invalid floating-point exception.
+ *
+ * cosh(+-0 +- I NaN) = d(NaN) + I sign(d(+-0, NaN))0.
+ * The sign of 0 in the result is unspecified. Choice = normally
+ * the same as d(NaN).
+ */
+ if ((ix | lx) == 0 && iy >= 0x7ff00000)
+ return CMPLX(y - y, copysign(0, x * (y - y)));
+
+ /*
+ * cosh(+-Inf +- I 0) = +Inf + I (+-)(+-)0.
+ *
+ * cosh(NaN +- I 0) = d(NaN) + I sign(d(NaN, +-0))0.
+ * The sign of 0 in the result is unspecified.
+ */
+ if ((iy | ly) == 0 && ix >= 0x7ff00000) {
+ if (((hx & 0xfffff) | lx) == 0)
+ return CMPLX(x * x, copysign(0, x) * y);
+ return CMPLX(x * x, copysign(0, (x + x) * y));
+ }
+
+ /*
+ * cosh(x +- I Inf) = dNaN + I dNaN.
+ * Raise the invalid floating-point exception for finite nonzero x.
+ *
+ * cosh(x + I NaN) = d(NaN) + I d(NaN).
+ * Optionally raises the invalid floating-point exception for finite
+ * nonzero x. Choice = don't raise (except for signaling NaNs).
+ */
+ if (ix < 0x7ff00000 && iy >= 0x7ff00000)
+ return CMPLX(y - y, x * (y - y));
+
+ /*
+ * cosh(+-Inf + I NaN) = +Inf + I d(NaN).
+ *
+ * cosh(+-Inf +- I Inf) = +Inf + I dNaN.
+ * The sign of Inf in the result is unspecified. Choice = always +.
+ * Raise the invalid floating-point exception.
+ *
+ * cosh(+-Inf + I y) = +Inf cos(y) +- I Inf sin(y)
+ */
+ if (ix >= 0x7ff00000 && ((hx & 0xfffff) | lx) == 0) {
+ if (iy >= 0x7ff00000)
+ return CMPLX(x * x, x * (y - y));
+ return CMPLX((x * x) * cos(y), x * sin(y));
+ }
+
+ /*
+ * cosh(NaN + I NaN) = d(NaN) + I d(NaN).
+ *
+ * cosh(NaN +- I Inf) = d(NaN) + I d(NaN).
+ * Optionally raises the invalid floating-point exception.
+ * Choice = raise.
+ *
+ * cosh(NaN + I y) = d(NaN) + I d(NaN).
+ * Optionally raises the invalid floating-point exception for finite
+ * nonzero y. Choice = don't raise (except for signaling NaNs).
+ */
+ return CMPLX((x * x) * (y - y), (x + x) * (y - y));
+}
diff --git a/libc-top-half/musl/src/complex/ccoshf.c b/libc-top-half/musl/src/complex/ccoshf.c
new file mode 100644
index 0000000..189ce94
--- /dev/null
+++ b/libc-top-half/musl/src/complex/ccoshf.c
@@ -0,0 +1,90 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_ccoshf.c */
+/*-
+ * Copyright (c) 2005 Bruce D. Evans and Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * Hyperbolic cosine of a complex argument. See s_ccosh.c for details.
+ */
+
+#include "complex_impl.h"
+
+static const float huge = 0x1p127;
+
+float complex ccoshf(float complex z)
+{
+ float x, y, h;
+ int32_t hx, hy, ix, iy;
+
+ x = crealf(z);
+ y = cimagf(z);
+
+ GET_FLOAT_WORD(hx, x);
+ GET_FLOAT_WORD(hy, y);
+
+ ix = 0x7fffffff & hx;
+ iy = 0x7fffffff & hy;
+
+ if (ix < 0x7f800000 && iy < 0x7f800000) {
+ if (iy == 0)
+ return CMPLXF(coshf(x), x * y);
+ if (ix < 0x41100000) /* small x: normal case */
+ return CMPLXF(coshf(x) * cosf(y), sinhf(x) * sinf(y));
+
+ /* |x| >= 9, so cosh(x) ~= exp(|x|) */
+ if (ix < 0x42b17218) {
+ /* x < 88.7: expf(|x|) won't overflow */
+ h = expf(fabsf(x)) * 0.5f;
+ return CMPLXF(h * cosf(y), copysignf(h, x) * sinf(y));
+ } else if (ix < 0x4340b1e7) {
+ /* x < 192.7: scale to avoid overflow */
+ z = __ldexp_cexpf(CMPLXF(fabsf(x), y), -1);
+ return CMPLXF(crealf(z), cimagf(z) * copysignf(1, x));
+ } else {
+ /* x >= 192.7: the result always overflows */
+ h = huge * x;
+ return CMPLXF(h * h * cosf(y), h * sinf(y));
+ }
+ }
+
+ if (ix == 0 && iy >= 0x7f800000)
+ return CMPLXF(y - y, copysignf(0, x * (y - y)));
+
+ if (iy == 0 && ix >= 0x7f800000) {
+ if ((hx & 0x7fffff) == 0)
+ return CMPLXF(x * x, copysignf(0, x) * y);
+ return CMPLXF(x * x, copysignf(0, (x + x) * y));
+ }
+
+ if (ix < 0x7f800000 && iy >= 0x7f800000)
+ return CMPLXF(y - y, x * (y - y));
+
+ if (ix >= 0x7f800000 && (hx & 0x7fffff) == 0) {
+ if (iy >= 0x7f800000)
+ return CMPLXF(x * x, x * (y - y));
+ return CMPLXF((x * x) * cosf(y), x * sinf(y));
+ }
+
+ return CMPLXF((x * x) * (y - y), (x + x) * (y - y));
+}
diff --git a/libc-top-half/musl/src/complex/ccoshl.c b/libc-top-half/musl/src/complex/ccoshl.c
new file mode 100644
index 0000000..ffb4d8a
--- /dev/null
+++ b/libc-top-half/musl/src/complex/ccoshl.c
@@ -0,0 +1,7 @@
+#include "complex_impl.h"
+
+//FIXME
+long double complex ccoshl(long double complex z)
+{
+ return ccosh(z);
+}
diff --git a/libc-top-half/musl/src/complex/ccosl.c b/libc-top-half/musl/src/complex/ccosl.c
new file mode 100644
index 0000000..2530006
--- /dev/null
+++ b/libc-top-half/musl/src/complex/ccosl.c
@@ -0,0 +1,13 @@
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double complex ccosl(long double complex z)
+{
+ return ccos(z);
+}
+#else
+long double complex ccosl(long double complex z)
+{
+ return ccoshl(CMPLXL(-cimagl(z), creall(z)));
+}
+#endif
diff --git a/libc-top-half/musl/src/complex/cexp.c b/libc-top-half/musl/src/complex/cexp.c
new file mode 100644
index 0000000..7fb489b
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cexp.c
@@ -0,0 +1,83 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_cexp.c */
+/*-
+ * Copyright (c) 2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "complex_impl.h"
+
+static const uint32_t
+exp_ovfl = 0x40862e42, /* high bits of MAX_EXP * ln2 ~= 710 */
+cexp_ovfl = 0x4096b8e4; /* (MAX_EXP - MIN_DENORM_EXP) * ln2 */
+
+double complex cexp(double complex z)
+{
+ double x, y, exp_x;
+ uint32_t hx, hy, lx, ly;
+
+ x = creal(z);
+ y = cimag(z);
+
+ EXTRACT_WORDS(hy, ly, y);
+ hy &= 0x7fffffff;
+
+ /* cexp(x + I 0) = exp(x) + I 0 */
+ if ((hy | ly) == 0)
+ return CMPLX(exp(x), y);
+ EXTRACT_WORDS(hx, lx, x);
+ /* cexp(0 + I y) = cos(y) + I sin(y) */
+ if (((hx & 0x7fffffff) | lx) == 0)
+ return CMPLX(cos(y), sin(y));
+
+ if (hy >= 0x7ff00000) {
+ if (lx != 0 || (hx & 0x7fffffff) != 0x7ff00000) {
+ /* cexp(finite|NaN +- I Inf|NaN) = NaN + I NaN */
+ return CMPLX(y - y, y - y);
+ } else if (hx & 0x80000000) {
+ /* cexp(-Inf +- I Inf|NaN) = 0 + I 0 */
+ return CMPLX(0.0, 0.0);
+ } else {
+ /* cexp(+Inf +- I Inf|NaN) = Inf + I NaN */
+ return CMPLX(x, y - y);
+ }
+ }
+
+ if (hx >= exp_ovfl && hx <= cexp_ovfl) {
+ /*
+ * x is between 709.7 and 1454.3, so we must scale to avoid
+ * overflow in exp(x).
+ */
+ return __ldexp_cexp(z, 0);
+ } else {
+ /*
+ * Cases covered here:
+ * - x < exp_ovfl and exp(x) won't overflow (common case)
+ * - x > cexp_ovfl, so exp(x) * s overflows for all s > 0
+ * - x = +-Inf (generated by exp())
+ * - x = NaN (spurious inexact exception from y)
+ */
+ exp_x = exp(x);
+ return CMPLX(exp_x * cos(y), exp_x * sin(y));
+ }
+}
diff --git a/libc-top-half/musl/src/complex/cexpf.c b/libc-top-half/musl/src/complex/cexpf.c
new file mode 100644
index 0000000..00d258f
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cexpf.c
@@ -0,0 +1,83 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_cexpf.c */
+/*-
+ * Copyright (c) 2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "complex_impl.h"
+
+static const uint32_t
+exp_ovfl = 0x42b17218, /* MAX_EXP * ln2 ~= 88.722839355 */
+cexp_ovfl = 0x43400074; /* (MAX_EXP - MIN_DENORM_EXP) * ln2 */
+
+float complex cexpf(float complex z)
+{
+ float x, y, exp_x;
+ uint32_t hx, hy;
+
+ x = crealf(z);
+ y = cimagf(z);
+
+ GET_FLOAT_WORD(hy, y);
+ hy &= 0x7fffffff;
+
+ /* cexp(x + I 0) = exp(x) + I 0 */
+ if (hy == 0)
+ return CMPLXF(expf(x), y);
+ GET_FLOAT_WORD(hx, x);
+ /* cexp(0 + I y) = cos(y) + I sin(y) */
+ if ((hx & 0x7fffffff) == 0)
+ return CMPLXF(cosf(y), sinf(y));
+
+ if (hy >= 0x7f800000) {
+ if ((hx & 0x7fffffff) != 0x7f800000) {
+ /* cexp(finite|NaN +- I Inf|NaN) = NaN + I NaN */
+ return CMPLXF(y - y, y - y);
+ } else if (hx & 0x80000000) {
+ /* cexp(-Inf +- I Inf|NaN) = 0 + I 0 */
+ return CMPLXF(0.0, 0.0);
+ } else {
+ /* cexp(+Inf +- I Inf|NaN) = Inf + I NaN */
+ return CMPLXF(x, y - y);
+ }
+ }
+
+ if (hx >= exp_ovfl && hx <= cexp_ovfl) {
+ /*
+ * x is between 88.7 and 192, so we must scale to avoid
+ * overflow in expf(x).
+ */
+ return __ldexp_cexpf(z, 0);
+ } else {
+ /*
+ * Cases covered here:
+ * - x < exp_ovfl and exp(x) won't overflow (common case)
+ * - x > cexp_ovfl, so exp(x) * s overflows for all s > 0
+ * - x = +-Inf (generated by exp())
+ * - x = NaN (spurious inexact exception from y)
+ */
+ exp_x = expf(x);
+ return CMPLXF(exp_x * cosf(y), exp_x * sinf(y));
+ }
+}
diff --git a/libc-top-half/musl/src/complex/cexpl.c b/libc-top-half/musl/src/complex/cexpl.c
new file mode 100644
index 0000000..d4df950
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cexpl.c
@@ -0,0 +1,7 @@
+#include "complex_impl.h"
+
+//FIXME
+long double complex cexpl(long double complex z)
+{
+ return cexp(z);
+}
diff --git a/libc-top-half/musl/src/complex/cimag.c b/libc-top-half/musl/src/complex/cimag.c
new file mode 100644
index 0000000..d6b0e68
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cimag.c
@@ -0,0 +1,6 @@
+#include "complex_impl.h"
+
+double (cimag)(double complex z)
+{
+ return cimag(z);
+}
diff --git a/libc-top-half/musl/src/complex/cimagf.c b/libc-top-half/musl/src/complex/cimagf.c
new file mode 100644
index 0000000..b7166dc
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cimagf.c
@@ -0,0 +1,6 @@
+#include "complex_impl.h"
+
+float (cimagf)(float complex z)
+{
+ return cimagf(z);
+}
diff --git a/libc-top-half/musl/src/complex/cimagl.c b/libc-top-half/musl/src/complex/cimagl.c
new file mode 100644
index 0000000..4db77f2
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cimagl.c
@@ -0,0 +1,6 @@
+#include "complex_impl.h"
+
+long double (cimagl)(long double complex z)
+{
+ return cimagl(z);
+}
diff --git a/libc-top-half/musl/src/complex/clog.c b/libc-top-half/musl/src/complex/clog.c
new file mode 100644
index 0000000..b587c29
--- /dev/null
+++ b/libc-top-half/musl/src/complex/clog.c
@@ -0,0 +1,14 @@
+#include "complex_impl.h"
+
+// FIXME
+
+/* log(z) = log(|z|) + i arg(z) */
+
+double complex clog(double complex z)
+{
+ double r, phi;
+
+ r = cabs(z);
+ phi = carg(z);
+ return CMPLX(log(r), phi);
+}
diff --git a/libc-top-half/musl/src/complex/clogf.c b/libc-top-half/musl/src/complex/clogf.c
new file mode 100644
index 0000000..0389d47
--- /dev/null
+++ b/libc-top-half/musl/src/complex/clogf.c
@@ -0,0 +1,12 @@
+#include "complex_impl.h"
+
+// FIXME
+
+float complex clogf(float complex z)
+{
+ float r, phi;
+
+ r = cabsf(z);
+ phi = cargf(z);
+ return CMPLXF(logf(r), phi);
+}
diff --git a/libc-top-half/musl/src/complex/clogl.c b/libc-top-half/musl/src/complex/clogl.c
new file mode 100644
index 0000000..88e83e8
--- /dev/null
+++ b/libc-top-half/musl/src/complex/clogl.c
@@ -0,0 +1,18 @@
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double complex clogl(long double complex z)
+{
+ return clog(z);
+}
+#else
+// FIXME
+long double complex clogl(long double complex z)
+{
+ long double r, phi;
+
+ r = cabsl(z);
+ phi = cargl(z);
+ return CMPLXL(logl(r), phi);
+}
+#endif
diff --git a/libc-top-half/musl/src/complex/conj.c b/libc-top-half/musl/src/complex/conj.c
new file mode 100644
index 0000000..a3b19a4
--- /dev/null
+++ b/libc-top-half/musl/src/complex/conj.c
@@ -0,0 +1,6 @@
+#include "complex_impl.h"
+
+double complex conj(double complex z)
+{
+ return CMPLX(creal(z), -cimag(z));
+}
diff --git a/libc-top-half/musl/src/complex/conjf.c b/libc-top-half/musl/src/complex/conjf.c
new file mode 100644
index 0000000..b2195c8
--- /dev/null
+++ b/libc-top-half/musl/src/complex/conjf.c
@@ -0,0 +1,6 @@
+#include "complex_impl.h"
+
+float complex conjf(float complex z)
+{
+ return CMPLXF(crealf(z), -cimagf(z));
+}
diff --git a/libc-top-half/musl/src/complex/conjl.c b/libc-top-half/musl/src/complex/conjl.c
new file mode 100644
index 0000000..87a4ebe
--- /dev/null
+++ b/libc-top-half/musl/src/complex/conjl.c
@@ -0,0 +1,6 @@
+#include "complex_impl.h"
+
+long double complex conjl(long double complex z)
+{
+ return CMPLXL(creall(z), -cimagl(z));
+}
diff --git a/libc-top-half/musl/src/complex/cpow.c b/libc-top-half/musl/src/complex/cpow.c
new file mode 100644
index 0000000..1137d39
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cpow.c
@@ -0,0 +1,8 @@
+#include "complex_impl.h"
+
+/* pow(z, c) = exp(c log(z)), See C99 G.6.4.1 */
+
+double complex cpow(double complex z, double complex c)
+{
+ return cexp(c * clog(z));
+}
diff --git a/libc-top-half/musl/src/complex/cpowf.c b/libc-top-half/musl/src/complex/cpowf.c
new file mode 100644
index 0000000..f3fd4b7
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cpowf.c
@@ -0,0 +1,6 @@
+#include "complex_impl.h"
+
+float complex cpowf(float complex z, float complex c)
+{
+ return cexpf(c * clogf(z));
+}
diff --git a/libc-top-half/musl/src/complex/cpowl.c b/libc-top-half/musl/src/complex/cpowl.c
new file mode 100644
index 0000000..be36f04
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cpowl.c
@@ -0,0 +1,13 @@
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double complex cpowl(long double complex z, long double complex c)
+{
+ return cpow(z, c);
+}
+#else
+long double complex cpowl(long double complex z, long double complex c)
+{
+ return cexpl(c * clogl(z));
+}
+#endif
diff --git a/libc-top-half/musl/src/complex/cproj.c b/libc-top-half/musl/src/complex/cproj.c
new file mode 100644
index 0000000..d2b8f5a
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cproj.c
@@ -0,0 +1,8 @@
+#include "complex_impl.h"
+
+double complex cproj(double complex z)
+{
+ if (isinf(creal(z)) || isinf(cimag(z)))
+ return CMPLX(INFINITY, copysign(0.0, cimag(z)));
+ return z;
+}
diff --git a/libc-top-half/musl/src/complex/cprojf.c b/libc-top-half/musl/src/complex/cprojf.c
new file mode 100644
index 0000000..15a874b
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cprojf.c
@@ -0,0 +1,8 @@
+#include "complex_impl.h"
+
+float complex cprojf(float complex z)
+{
+ if (isinf(crealf(z)) || isinf(cimagf(z)))
+ return CMPLXF(INFINITY, copysignf(0.0, cimagf(z)));
+ return z;
+}
diff --git a/libc-top-half/musl/src/complex/cprojl.c b/libc-top-half/musl/src/complex/cprojl.c
new file mode 100644
index 0000000..531ffa1
--- /dev/null
+++ b/libc-top-half/musl/src/complex/cprojl.c
@@ -0,0 +1,15 @@
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double complex cprojl(long double complex z)
+{
+ return cproj(z);
+}
+#else
+long double complex cprojl(long double complex z)
+{
+ if (isinf(creall(z)) || isinf(cimagl(z)))
+ return CMPLXL(INFINITY, copysignl(0.0, cimagl(z)));
+ return z;
+}
+#endif
diff --git a/libc-top-half/musl/src/complex/creal.c b/libc-top-half/musl/src/complex/creal.c
new file mode 100644
index 0000000..f670304
--- /dev/null
+++ b/libc-top-half/musl/src/complex/creal.c
@@ -0,0 +1,6 @@
+#include <complex.h>
+
+double (creal)(double complex z)
+{
+ return creal(z);
+}
diff --git a/libc-top-half/musl/src/complex/crealf.c b/libc-top-half/musl/src/complex/crealf.c
new file mode 100644
index 0000000..5dc3ff1
--- /dev/null
+++ b/libc-top-half/musl/src/complex/crealf.c
@@ -0,0 +1,6 @@
+#include <complex.h>
+
+float (crealf)(float complex z)
+{
+ return crealf(z);
+}
diff --git a/libc-top-half/musl/src/complex/creall.c b/libc-top-half/musl/src/complex/creall.c
new file mode 100644
index 0000000..fd9dc34
--- /dev/null
+++ b/libc-top-half/musl/src/complex/creall.c
@@ -0,0 +1,6 @@
+#include <complex.h>
+
+long double (creall)(long double complex z)
+{
+ return creall(z);
+}
diff --git a/libc-top-half/musl/src/complex/csin.c b/libc-top-half/musl/src/complex/csin.c
new file mode 100644
index 0000000..535c4bf
--- /dev/null
+++ b/libc-top-half/musl/src/complex/csin.c
@@ -0,0 +1,9 @@
+#include "complex_impl.h"
+
+/* sin(z) = -i sinh(i z) */
+
+double complex csin(double complex z)
+{
+ z = csinh(CMPLX(-cimag(z), creal(z)));
+ return CMPLX(cimag(z), -creal(z));
+}
diff --git a/libc-top-half/musl/src/complex/csinf.c b/libc-top-half/musl/src/complex/csinf.c
new file mode 100644
index 0000000..69f5164
--- /dev/null
+++ b/libc-top-half/musl/src/complex/csinf.c
@@ -0,0 +1,7 @@
+#include "complex_impl.h"
+
+float complex csinf(float complex z)
+{
+ z = csinhf(CMPLXF(-cimagf(z), crealf(z)));
+ return CMPLXF(cimagf(z), -crealf(z));
+}
diff --git a/libc-top-half/musl/src/complex/csinh.c b/libc-top-half/musl/src/complex/csinh.c
new file mode 100644
index 0000000..eda0ab5
--- /dev/null
+++ b/libc-top-half/musl/src/complex/csinh.c
@@ -0,0 +1,141 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_csinh.c */
+/*-
+ * Copyright (c) 2005 Bruce D. Evans and Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * Hyperbolic sine of a complex argument z = x + i y.
+ *
+ * sinh(z) = sinh(x+iy)
+ * = sinh(x) cos(y) + i cosh(x) sin(y).
+ *
+ * Exceptional values are noted in the comments within the source code.
+ * These values and the return value were taken from n1124.pdf.
+ */
+
+#include "complex_impl.h"
+
+static const double huge = 0x1p1023;
+
+double complex csinh(double complex z)
+{
+ double x, y, h;
+ int32_t hx, hy, ix, iy, lx, ly;
+
+ x = creal(z);
+ y = cimag(z);
+
+ EXTRACT_WORDS(hx, lx, x);
+ EXTRACT_WORDS(hy, ly, y);
+
+ ix = 0x7fffffff & hx;
+ iy = 0x7fffffff & hy;
+
+ /* Handle the nearly-non-exceptional cases where x and y are finite. */
+ if (ix < 0x7ff00000 && iy < 0x7ff00000) {
+ if ((iy | ly) == 0)
+ return CMPLX(sinh(x), y);
+ if (ix < 0x40360000) /* small x: normal case */
+ return CMPLX(sinh(x) * cos(y), cosh(x) * sin(y));
+
+ /* |x| >= 22, so cosh(x) ~= exp(|x|) */
+ if (ix < 0x40862e42) {
+ /* x < 710: exp(|x|) won't overflow */
+ h = exp(fabs(x)) * 0.5;
+ return CMPLX(copysign(h, x) * cos(y), h * sin(y));
+ } else if (ix < 0x4096bbaa) {
+ /* x < 1455: scale to avoid overflow */
+ z = __ldexp_cexp(CMPLX(fabs(x), y), -1);
+ return CMPLX(creal(z) * copysign(1, x), cimag(z));
+ } else {
+ /* x >= 1455: the result always overflows */
+ h = huge * x;
+ return CMPLX(h * cos(y), h * h * sin(y));
+ }
+ }
+
+ /*
+ * sinh(+-0 +- I Inf) = sign(d(+-0, dNaN))0 + I dNaN.
+ * The sign of 0 in the result is unspecified. Choice = normally
+ * the same as dNaN. Raise the invalid floating-point exception.
+ *
+ * sinh(+-0 +- I NaN) = sign(d(+-0, NaN))0 + I d(NaN).
+ * The sign of 0 in the result is unspecified. Choice = normally
+ * the same as d(NaN).
+ */
+ if ((ix | lx) == 0 && iy >= 0x7ff00000)
+ return CMPLX(copysign(0, x * (y - y)), y - y);
+
+ /*
+ * sinh(+-Inf +- I 0) = +-Inf + I +-0.
+ *
+ * sinh(NaN +- I 0) = d(NaN) + I +-0.
+ */
+ if ((iy | ly) == 0 && ix >= 0x7ff00000) {
+ if (((hx & 0xfffff) | lx) == 0)
+ return CMPLX(x, y);
+ return CMPLX(x, copysign(0, y));
+ }
+
+ /*
+ * sinh(x +- I Inf) = dNaN + I dNaN.
+ * Raise the invalid floating-point exception for finite nonzero x.
+ *
+ * sinh(x + I NaN) = d(NaN) + I d(NaN).
+ * Optionally raises the invalid floating-point exception for finite
+ * nonzero x. Choice = don't raise (except for signaling NaNs).
+ */
+ if (ix < 0x7ff00000 && iy >= 0x7ff00000)
+ return CMPLX(y - y, x * (y - y));
+
+ /*
+ * sinh(+-Inf + I NaN) = +-Inf + I d(NaN).
+ * The sign of Inf in the result is unspecified. Choice = normally
+ * the same as d(NaN).
+ *
+ * sinh(+-Inf +- I Inf) = +Inf + I dNaN.
+ * The sign of Inf in the result is unspecified. Choice = always +.
+ * Raise the invalid floating-point exception.
+ *
+ * sinh(+-Inf + I y) = +-Inf cos(y) + I Inf sin(y)
+ */
+ if (ix >= 0x7ff00000 && ((hx & 0xfffff) | lx) == 0) {
+ if (iy >= 0x7ff00000)
+ return CMPLX(x * x, x * (y - y));
+ return CMPLX(x * cos(y), INFINITY * sin(y));
+ }
+
+ /*
+ * sinh(NaN + I NaN) = d(NaN) + I d(NaN).
+ *
+ * sinh(NaN +- I Inf) = d(NaN) + I d(NaN).
+ * Optionally raises the invalid floating-point exception.
+ * Choice = raise.
+ *
+ * sinh(NaN + I y) = d(NaN) + I d(NaN).
+ * Optionally raises the invalid floating-point exception for finite
+ * nonzero y. Choice = don't raise (except for signaling NaNs).
+ */
+ return CMPLX((x * x) * (y - y), (x + x) * (y - y));
+}
diff --git a/libc-top-half/musl/src/complex/csinhf.c b/libc-top-half/musl/src/complex/csinhf.c
new file mode 100644
index 0000000..eb1d98c
--- /dev/null
+++ b/libc-top-half/musl/src/complex/csinhf.c
@@ -0,0 +1,90 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_csinhf.c */
+/*-
+ * Copyright (c) 2005 Bruce D. Evans and Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * Hyperbolic sine of a complex argument z. See s_csinh.c for details.
+ */
+
+#include "complex_impl.h"
+
+static const float huge = 0x1p127;
+
+float complex csinhf(float complex z)
+{
+ float x, y, h;
+ int32_t hx, hy, ix, iy;
+
+ x = crealf(z);
+ y = cimagf(z);
+
+ GET_FLOAT_WORD(hx, x);
+ GET_FLOAT_WORD(hy, y);
+
+ ix = 0x7fffffff & hx;
+ iy = 0x7fffffff & hy;
+
+ if (ix < 0x7f800000 && iy < 0x7f800000) {
+ if (iy == 0)
+ return CMPLXF(sinhf(x), y);
+ if (ix < 0x41100000) /* small x: normal case */
+ return CMPLXF(sinhf(x) * cosf(y), coshf(x) * sinf(y));
+
+ /* |x| >= 9, so cosh(x) ~= exp(|x|) */
+ if (ix < 0x42b17218) {
+ /* x < 88.7: expf(|x|) won't overflow */
+ h = expf(fabsf(x)) * 0.5f;
+ return CMPLXF(copysignf(h, x) * cosf(y), h * sinf(y));
+ } else if (ix < 0x4340b1e7) {
+ /* x < 192.7: scale to avoid overflow */
+ z = __ldexp_cexpf(CMPLXF(fabsf(x), y), -1);
+ return CMPLXF(crealf(z) * copysignf(1, x), cimagf(z));
+ } else {
+ /* x >= 192.7: the result always overflows */
+ h = huge * x;
+ return CMPLXF(h * cosf(y), h * h * sinf(y));
+ }
+ }
+
+ if (ix == 0 && iy >= 0x7f800000)
+ return CMPLXF(copysignf(0, x * (y - y)), y - y);
+
+ if (iy == 0 && ix >= 0x7f800000) {
+ if ((hx & 0x7fffff) == 0)
+ return CMPLXF(x, y);
+ return CMPLXF(x, copysignf(0, y));
+ }
+
+ if (ix < 0x7f800000 && iy >= 0x7f800000)
+ return CMPLXF(y - y, x * (y - y));
+
+ if (ix >= 0x7f800000 && (hx & 0x7fffff) == 0) {
+ if (iy >= 0x7f800000)
+ return CMPLXF(x * x, x * (y - y));
+ return CMPLXF(x * cosf(y), INFINITY * sinf(y));
+ }
+
+ return CMPLXF((x * x) * (y - y), (x + x) * (y - y));
+}
diff --git a/libc-top-half/musl/src/complex/csinhl.c b/libc-top-half/musl/src/complex/csinhl.c
new file mode 100644
index 0000000..09fd18f
--- /dev/null
+++ b/libc-top-half/musl/src/complex/csinhl.c
@@ -0,0 +1,7 @@
+#include "complex_impl.h"
+
+//FIXME
+long double complex csinhl(long double complex z)
+{
+ return csinh(z);
+}
diff --git a/libc-top-half/musl/src/complex/csinl.c b/libc-top-half/musl/src/complex/csinl.c
new file mode 100644
index 0000000..90a4eb3
--- /dev/null
+++ b/libc-top-half/musl/src/complex/csinl.c
@@ -0,0 +1,14 @@
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double complex csinl(long double complex z)
+{
+ return csin(z);
+}
+#else
+long double complex csinl(long double complex z)
+{
+ z = csinhl(CMPLXL(-cimagl(z), creall(z)));
+ return CMPLXL(cimagl(z), -creall(z));
+}
+#endif
diff --git a/libc-top-half/musl/src/complex/csqrt.c b/libc-top-half/musl/src/complex/csqrt.c
new file mode 100644
index 0000000..c36de00
--- /dev/null
+++ b/libc-top-half/musl/src/complex/csqrt.c
@@ -0,0 +1,100 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_csqrt.c */
+/*-
+ * Copyright (c) 2007 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "complex_impl.h"
+
+/*
+ * gcc doesn't implement complex multiplication or division correctly,
+ * so we need to handle infinities specially. We turn on this pragma to
+ * notify conforming c99 compilers that the fast-but-incorrect code that
+ * gcc generates is acceptable, since the special cases have already been
+ * handled.
+ */
+#pragma STDC CX_LIMITED_RANGE ON
+
+/* We risk spurious overflow for components >= DBL_MAX / (1 + sqrt(2)). */
+#define THRESH 0x1.a827999fcef32p+1022
+
+double complex csqrt(double complex z)
+{
+ double complex result;
+ double a, b;
+ double t;
+ int scale;
+
+ a = creal(z);
+ b = cimag(z);
+
+ /* Handle special cases. */
+ if (z == 0)
+ return CMPLX(0, b);
+ if (isinf(b))
+ return CMPLX(INFINITY, b);
+ if (isnan(a)) {
+ t = (b - b) / (b - b); /* raise invalid if b is not a NaN */
+ return CMPLX(a, t); /* return NaN + NaN i */
+ }
+ if (isinf(a)) {
+ /*
+ * csqrt(inf + NaN i) = inf + NaN i
+ * csqrt(inf + y i) = inf + 0 i
+ * csqrt(-inf + NaN i) = NaN +- inf i
+ * csqrt(-inf + y i) = 0 + inf i
+ */
+ if (signbit(a))
+ return CMPLX(fabs(b - b), copysign(a, b));
+ else
+ return CMPLX(a, copysign(b - b, b));
+ }
+ /*
+ * The remaining special case (b is NaN) is handled just fine by
+ * the normal code path below.
+ */
+
+ /* Scale to avoid overflow. */
+ if (fabs(a) >= THRESH || fabs(b) >= THRESH) {
+ a *= 0.25;
+ b *= 0.25;
+ scale = 1;
+ } else {
+ scale = 0;
+ }
+
+ /* Algorithm 312, CACM vol 10, Oct 1967. */
+ if (a >= 0) {
+ t = sqrt((a + hypot(a, b)) * 0.5);
+ result = CMPLX(t, b / (2 * t));
+ } else {
+ t = sqrt((-a + hypot(a, b)) * 0.5);
+ result = CMPLX(fabs(b) / (2 * t), copysign(t, b));
+ }
+
+ /* Rescale. */
+ if (scale)
+ result *= 2;
+ return result;
+}
diff --git a/libc-top-half/musl/src/complex/csqrtf.c b/libc-top-half/musl/src/complex/csqrtf.c
new file mode 100644
index 0000000..a616397
--- /dev/null
+++ b/libc-top-half/musl/src/complex/csqrtf.c
@@ -0,0 +1,82 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_csqrtf.c */
+/*-
+ * Copyright (c) 2007 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "complex_impl.h"
+
+/*
+ * gcc doesn't implement complex multiplication or division correctly,
+ * so we need to handle infinities specially. We turn on this pragma to
+ * notify conforming c99 compilers that the fast-but-incorrect code that
+ * gcc generates is acceptable, since the special cases have already been
+ * handled.
+ */
+#pragma STDC CX_LIMITED_RANGE ON
+
+float complex csqrtf(float complex z)
+{
+ float a = crealf(z), b = cimagf(z);
+ double t;
+
+ /* Handle special cases. */
+ if (z == 0)
+ return CMPLXF(0, b);
+ if (isinf(b))
+ return CMPLXF(INFINITY, b);
+ if (isnan(a)) {
+ t = (b - b) / (b - b); /* raise invalid if b is not a NaN */
+ return CMPLXF(a, t); /* return NaN + NaN i */
+ }
+ if (isinf(a)) {
+ /*
+ * csqrtf(inf + NaN i) = inf + NaN i
+ * csqrtf(inf + y i) = inf + 0 i
+ * csqrtf(-inf + NaN i) = NaN +- inf i
+ * csqrtf(-inf + y i) = 0 + inf i
+ */
+ if (signbit(a))
+ return CMPLXF(fabsf(b - b), copysignf(a, b));
+ else
+ return CMPLXF(a, copysignf(b - b, b));
+ }
+ /*
+ * The remaining special case (b is NaN) is handled just fine by
+ * the normal code path below.
+ */
+
+ /*
+ * We compute t in double precision to avoid overflow and to
+ * provide correct rounding in nearly all cases.
+ * This is Algorithm 312, CACM vol 10, Oct 1967.
+ */
+ if (a >= 0) {
+ t = sqrt((a + hypot(a, b)) * 0.5);
+ return CMPLXF(t, b / (2.0 * t));
+ } else {
+ t = sqrt((-a + hypot(a, b)) * 0.5);
+ return CMPLXF(fabsf(b) / (2.0 * t), copysignf(t, b));
+ }
+}
diff --git a/libc-top-half/musl/src/complex/csqrtl.c b/libc-top-half/musl/src/complex/csqrtl.c
new file mode 100644
index 0000000..2253937
--- /dev/null
+++ b/libc-top-half/musl/src/complex/csqrtl.c
@@ -0,0 +1,7 @@
+#include "complex_impl.h"
+
+//FIXME
+long double complex csqrtl(long double complex z)
+{
+ return csqrt(z);
+}
diff --git a/libc-top-half/musl/src/complex/ctan.c b/libc-top-half/musl/src/complex/ctan.c
new file mode 100644
index 0000000..918717b
--- /dev/null
+++ b/libc-top-half/musl/src/complex/ctan.c
@@ -0,0 +1,9 @@
+#include "complex_impl.h"
+
+/* tan(z) = -i tanh(i z) */
+
+double complex ctan(double complex z)
+{
+ z = ctanh(CMPLX(-cimag(z), creal(z)));
+ return CMPLX(cimag(z), -creal(z));
+}
diff --git a/libc-top-half/musl/src/complex/ctanf.c b/libc-top-half/musl/src/complex/ctanf.c
new file mode 100644
index 0000000..04c3ff1
--- /dev/null
+++ b/libc-top-half/musl/src/complex/ctanf.c
@@ -0,0 +1,7 @@
+#include "complex_impl.h"
+
+float complex ctanf(float complex z)
+{
+ z = ctanhf(CMPLXF(-cimagf(z), crealf(z)));
+ return CMPLXF(cimagf(z), -crealf(z));
+}
diff --git a/libc-top-half/musl/src/complex/ctanh.c b/libc-top-half/musl/src/complex/ctanh.c
new file mode 100644
index 0000000..54004cd
--- /dev/null
+++ b/libc-top-half/musl/src/complex/ctanh.c
@@ -0,0 +1,129 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_ctanh.c */
+/*-
+ * Copyright (c) 2011 David Schultz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * Hyperbolic tangent of a complex argument z = x + i y.
+ *
+ * The algorithm is from:
+ *
+ * W. Kahan. Branch Cuts for Complex Elementary Functions or Much
+ * Ado About Nothing's Sign Bit. In The State of the Art in
+ * Numerical Analysis, pp. 165 ff. Iserles and Powell, eds., 1987.
+ *
+ * Method:
+ *
+ * Let t = tan(x)
+ * beta = 1/cos^2(y)
+ * s = sinh(x)
+ * rho = cosh(x)
+ *
+ * We have:
+ *
+ * tanh(z) = sinh(z) / cosh(z)
+ *
+ * sinh(x) cos(y) + i cosh(x) sin(y)
+ * = ---------------------------------
+ * cosh(x) cos(y) + i sinh(x) sin(y)
+ *
+ * cosh(x) sinh(x) / cos^2(y) + i tan(y)
+ * = -------------------------------------
+ * 1 + sinh^2(x) / cos^2(y)
+ *
+ * beta rho s + i t
+ * = ----------------
+ * 1 + beta s^2
+ *
+ * Modifications:
+ *
+ * I omitted the original algorithm's handling of overflow in tan(x) after
+ * verifying with nearpi.c that this can't happen in IEEE single or double
+ * precision. I also handle large x differently.
+ */
+
+#include "complex_impl.h"
+
+double complex ctanh(double complex z)
+{
+ double x, y;
+ double t, beta, s, rho, denom;
+ uint32_t hx, ix, lx;
+
+ x = creal(z);
+ y = cimag(z);
+
+ EXTRACT_WORDS(hx, lx, x);
+ ix = hx & 0x7fffffff;
+
+ /*
+ * ctanh(NaN + i 0) = NaN + i 0
+ *
+ * ctanh(NaN + i y) = NaN + i NaN for y != 0
+ *
+ * The imaginary part has the sign of x*sin(2*y), but there's no
+ * special effort to get this right.
+ *
+ * ctanh(+-Inf +- i Inf) = +-1 +- 0
+ *
+ * ctanh(+-Inf + i y) = +-1 + 0 sin(2y) for y finite
+ *
+ * The imaginary part of the sign is unspecified. This special
+ * case is only needed to avoid a spurious invalid exception when
+ * y is infinite.
+ */
+ if (ix >= 0x7ff00000) {
+ if ((ix & 0xfffff) | lx) /* x is NaN */
+ return CMPLX(x, (y == 0 ? y : x * y));
+ SET_HIGH_WORD(x, hx - 0x40000000); /* x = copysign(1, x) */
+ return CMPLX(x, copysign(0, isinf(y) ? y : sin(y) * cos(y)));
+ }
+
+ /*
+ * ctanh(+-0 + i NAN) = +-0 + i NaN
+ * ctanh(+-0 +- i Inf) = +-0 + i NaN
+ * ctanh(x + i NAN) = NaN + i NaN
+ * ctanh(x +- i Inf) = NaN + i NaN
+ */
+ if (!isfinite(y))
+ return CMPLX(x ? y - y : x, y - y);
+
+ /*
+ * ctanh(+-huge + i +-y) ~= +-1 +- i 2sin(2y)/exp(2x), using the
+ * approximation sinh^2(huge) ~= exp(2*huge) / 4.
+ * We use a modified formula to avoid spurious overflow.
+ */
+ if (ix >= 0x40360000) { /* x >= 22 */
+ double exp_mx = exp(-fabs(x));
+ return CMPLX(copysign(1, x), 4 * sin(y) * cos(y) * exp_mx * exp_mx);
+ }
+
+ /* Kahan's algorithm */
+ t = tan(y);
+ beta = 1.0 + t * t; /* = 1 / cos^2(y) */
+ s = sinh(x);
+ rho = sqrt(1 + s * s); /* = cosh(x) */
+ denom = 1 + beta * s * s;
+ return CMPLX((beta * rho * s) / denom, t / denom);
+}
diff --git a/libc-top-half/musl/src/complex/ctanhf.c b/libc-top-half/musl/src/complex/ctanhf.c
new file mode 100644
index 0000000..7f422ba
--- /dev/null
+++ b/libc-top-half/musl/src/complex/ctanhf.c
@@ -0,0 +1,66 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_ctanhf.c */
+/*-
+ * Copyright (c) 2011 David Schultz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * Hyperbolic tangent of a complex argument z. See s_ctanh.c for details.
+ */
+
+#include "complex_impl.h"
+
+float complex ctanhf(float complex z)
+{
+ float x, y;
+ float t, beta, s, rho, denom;
+ uint32_t hx, ix;
+
+ x = crealf(z);
+ y = cimagf(z);
+
+ GET_FLOAT_WORD(hx, x);
+ ix = hx & 0x7fffffff;
+
+ if (ix >= 0x7f800000) {
+ if (ix & 0x7fffff)
+ return CMPLXF(x, (y == 0 ? y : x * y));
+ SET_FLOAT_WORD(x, hx - 0x40000000);
+ return CMPLXF(x, copysignf(0, isinf(y) ? y : sinf(y) * cosf(y)));
+ }
+
+ if (!isfinite(y))
+ return CMPLXF(ix ? y - y : x, y - y);
+
+ if (ix >= 0x41300000) { /* x >= 11 */
+ float exp_mx = expf(-fabsf(x));
+ return CMPLXF(copysignf(1, x), 4 * sinf(y) * cosf(y) * exp_mx * exp_mx);
+ }
+
+ t = tanf(y);
+ beta = 1.0 + t * t;
+ s = sinhf(x);
+ rho = sqrtf(1 + s * s);
+ denom = 1 + beta * s * s;
+ return CMPLXF((beta * rho * s) / denom, t / denom);
+}
diff --git a/libc-top-half/musl/src/complex/ctanhl.c b/libc-top-half/musl/src/complex/ctanhl.c
new file mode 100644
index 0000000..45d5862
--- /dev/null
+++ b/libc-top-half/musl/src/complex/ctanhl.c
@@ -0,0 +1,7 @@
+#include "complex_impl.h"
+
+//FIXME
+long double complex ctanhl(long double complex z)
+{
+ return ctanh(z);
+}
diff --git a/libc-top-half/musl/src/complex/ctanl.c b/libc-top-half/musl/src/complex/ctanl.c
new file mode 100644
index 0000000..4b87420
--- /dev/null
+++ b/libc-top-half/musl/src/complex/ctanl.c
@@ -0,0 +1,14 @@
+#include "complex_impl.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double complex ctanl(long double complex z)
+{
+ return ctan(z);
+}
+#else
+long double complex ctanl(long double complex z)
+{
+ z = ctanhl(CMPLXL(-cimagl(z), creall(z)));
+ return CMPLXL(cimagl(z), -creall(z));
+}
+#endif
diff --git a/libc-top-half/musl/src/conf/confstr.c b/libc-top-half/musl/src/conf/confstr.c
new file mode 100644
index 0000000..02cb1aa
--- /dev/null
+++ b/libc-top-half/musl/src/conf/confstr.c
@@ -0,0 +1,17 @@
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+
+size_t confstr(int name, char *buf, size_t len)
+{
+ const char *s = "";
+ if (!name) {
+ s = "/bin:/usr/bin";
+ } else if ((name&~4U)!=1 && name-_CS_POSIX_V6_ILP32_OFF32_CFLAGS>33U) {
+ errno = EINVAL;
+ return 0;
+ }
+ // snprintf is overkill but avoid wasting code size to implement
+ // this completely useless function and its truncation semantics
+ return snprintf(buf, len, "%s", s) + 1;
+}
diff --git a/libc-top-half/musl/src/conf/fpathconf.c b/libc-top-half/musl/src/conf/fpathconf.c
new file mode 100644
index 0000000..058b62a
--- /dev/null
+++ b/libc-top-half/musl/src/conf/fpathconf.c
@@ -0,0 +1,39 @@
+#include <unistd.h>
+#include <limits.h>
+#include <errno.h>
+
+long fpathconf(int fd, int name)
+{
+ static const short values[] = {
+ [_PC_LINK_MAX] = _POSIX_LINK_MAX,
+ [_PC_MAX_CANON] = _POSIX_MAX_CANON,
+ [_PC_MAX_INPUT] = _POSIX_MAX_INPUT,
+ [_PC_NAME_MAX] = NAME_MAX,
+ [_PC_PATH_MAX] = PATH_MAX,
+#ifdef __wasilibc_unmodified_upstream // WASI has no pipes
+ [_PC_PIPE_BUF] = PIPE_BUF,
+#else
+ [_PC_PIPE_BUF] = -1,
+#endif
+ [_PC_CHOWN_RESTRICTED] = 1,
+ [_PC_NO_TRUNC] = 1,
+ [_PC_VDISABLE] = 0,
+ [_PC_SYNC_IO] = 1,
+ [_PC_ASYNC_IO] = -1,
+ [_PC_PRIO_IO] = -1,
+ [_PC_SOCK_MAXBUF] = -1,
+ [_PC_FILESIZEBITS] = FILESIZEBITS,
+ [_PC_REC_INCR_XFER_SIZE] = 4096,
+ [_PC_REC_MAX_XFER_SIZE] = 4096,
+ [_PC_REC_MIN_XFER_SIZE] = 4096,
+ [_PC_REC_XFER_ALIGN] = 4096,
+ [_PC_ALLOC_SIZE_MIN] = 4096,
+ [_PC_SYMLINK_MAX] = -1,
+ [_PC_2_SYMLINKS] = 1
+ };
+ if (name >= sizeof(values)/sizeof(values[0])) {
+ errno = EINVAL;
+ return -1;
+ }
+ return values[name];
+}
diff --git a/libc-top-half/musl/src/conf/legacy.c b/libc-top-half/musl/src/conf/legacy.c
new file mode 100644
index 0000000..f1d9e32
--- /dev/null
+++ b/libc-top-half/musl/src/conf/legacy.c
@@ -0,0 +1,22 @@
+#include <sys/sysinfo.h>
+#include <unistd.h>
+
+int get_nprocs_conf()
+{
+ return sysconf(_SC_NPROCESSORS_CONF);
+}
+
+int get_nprocs()
+{
+ return sysconf(_SC_NPROCESSORS_ONLN);
+}
+
+long get_phys_pages()
+{
+ return sysconf(_SC_PHYS_PAGES);
+}
+
+long get_avphys_pages()
+{
+ return sysconf(_SC_AVPHYS_PAGES);
+}
diff --git a/libc-top-half/musl/src/conf/pathconf.c b/libc-top-half/musl/src/conf/pathconf.c
new file mode 100644
index 0000000..01e19c5
--- /dev/null
+++ b/libc-top-half/musl/src/conf/pathconf.c
@@ -0,0 +1,6 @@
+#include <unistd.h>
+
+long pathconf(const char *path, int name)
+{
+ return fpathconf(-1, name);
+}
diff --git a/libc-top-half/musl/src/conf/sysconf.c b/libc-top-half/musl/src/conf/sysconf.c
new file mode 100644
index 0000000..c72174f
--- /dev/null
+++ b/libc-top-half/musl/src/conf/sysconf.c
@@ -0,0 +1,282 @@
+#include <unistd.h>
+#include <limits.h>
+#include <errno.h>
+#ifdef __wasilibc_unmodified_upstream // WASI has no process-level accounting
+#include <sys/resource.h>
+#endif
+#ifdef __wasilibc_unmodified_upstream // WASI has no realtime signals
+#include <signal.h>
+#endif
+#include <sys/sysinfo.h>
+#ifdef __wasilibc_unmodified_upstream
+#include "syscall.h"
+#endif
+#include "libc.h"
+
+#define JT(x) (-256|(x))
+#define VER JT(1)
+#define JT_ARG_MAX JT(2)
+#ifdef __wasilibc_unmodified_upstream // WASI has no mq
+#define JT_MQ_PRIO_MAX JT(3)
+#endif
+#define JT_PAGE_SIZE JT(4)
+#ifdef __wasilibc_unmodified_upstream // WASI has no semaphores
+#define JT_SEM_VALUE_MAX JT(5)
+#endif
+#define JT_NPROCESSORS_CONF JT(6)
+#define JT_NPROCESSORS_ONLN JT(7)
+#define JT_PHYS_PAGES JT(8)
+#define JT_AVPHYS_PAGES JT(9)
+#define JT_ZERO JT(10)
+#define JT_DELAYTIMER_MAX JT(11)
+
+#define RLIM(x) (-32768|(RLIMIT_ ## x))
+
+long sysconf(int name)
+{
+ static const short values[] = {
+ [_SC_ARG_MAX] = JT_ARG_MAX,
+#ifdef __wasilibc_unmodified_upstream // WASI has no processes
+ [_SC_CHILD_MAX] = RLIM(NPROC),
+#else
+ // Not supported on wasi.
+ [_SC_CHILD_MAX] = -1,
+#endif
+ [_SC_CLK_TCK] = 100,
+ [_SC_NGROUPS_MAX] = 32,
+#ifdef __wasilibc_unmodified_upstream // WASI has no rlimit
+ [_SC_OPEN_MAX] = RLIM(NOFILE),
+#else
+ // Rlimit is not supported on wasi.
+ [_SC_OPEN_MAX] = -1,
+#endif
+
+ [_SC_STREAM_MAX] = -1,
+ [_SC_TZNAME_MAX] = TZNAME_MAX,
+ [_SC_JOB_CONTROL] = 1,
+ [_SC_SAVED_IDS] = 1,
+ [_SC_REALTIME_SIGNALS] = VER,
+ [_SC_PRIORITY_SCHEDULING] = -1,
+ [_SC_TIMERS] = VER,
+ [_SC_ASYNCHRONOUS_IO] = VER,
+ [_SC_PRIORITIZED_IO] = -1,
+ [_SC_SYNCHRONIZED_IO] = -1,
+ [_SC_FSYNC] = VER,
+ [_SC_MAPPED_FILES] = VER,
+ [_SC_MEMLOCK] = VER,
+ [_SC_MEMLOCK_RANGE] = VER,
+ [_SC_MEMORY_PROTECTION] = VER,
+ [_SC_MESSAGE_PASSING] = VER,
+ [_SC_SEMAPHORES] = VER,
+ [_SC_SHARED_MEMORY_OBJECTS] = VER,
+ [_SC_AIO_LISTIO_MAX] = -1,
+ [_SC_AIO_MAX] = -1,
+ [_SC_AIO_PRIO_DELTA_MAX] = JT_ZERO, /* ?? */
+ [_SC_DELAYTIMER_MAX] = JT_DELAYTIMER_MAX,
+#ifdef __wasilibc_unmodified_upstream // WASI has no mq
+ [_SC_MQ_OPEN_MAX] = -1,
+ [_SC_MQ_PRIO_MAX] = JT_MQ_PRIO_MAX,
+#endif
+ [_SC_VERSION] = VER,
+ [_SC_PAGE_SIZE] = JT_PAGE_SIZE,
+#ifdef __wasilibc_unmodified_upstream // WASI has no realtime signals
+ [_SC_RTSIG_MAX] = _NSIG - 1 - 31 - 3,
+#else
+ // Not supported on wasi.
+ [_SC_RTSIG_MAX] = -1,
+#endif
+#ifdef __wasilibc_unmodified_upstream // WASI has no semaphores
+ [_SC_SEM_NSEMS_MAX] = SEM_NSEMS_MAX,
+ [_SC_SEM_VALUE_MAX] = JT_SEM_VALUE_MAX,
+#else
+ [_SC_SEM_NSEMS_MAX] = -1,
+ [_SC_SEM_VALUE_MAX] = -1,
+#endif
+ [_SC_SIGQUEUE_MAX] = -1,
+ [_SC_TIMER_MAX] = -1,
+#ifdef __wasilibc_unmodified_upstream // WASI has no shell commands
+ [_SC_BC_BASE_MAX] = _POSIX2_BC_BASE_MAX,
+ [_SC_BC_DIM_MAX] = _POSIX2_BC_DIM_MAX,
+ [_SC_BC_SCALE_MAX] = _POSIX2_BC_SCALE_MAX,
+ [_SC_BC_STRING_MAX] = _POSIX2_BC_STRING_MAX,
+#else
+ [_SC_BC_BASE_MAX] = -1,
+ [_SC_BC_DIM_MAX] = -1,
+ [_SC_BC_SCALE_MAX] = -1,
+ [_SC_BC_STRING_MAX] = -1,
+#endif
+ [_SC_COLL_WEIGHTS_MAX] = COLL_WEIGHTS_MAX,
+ [_SC_EXPR_NEST_MAX] = -1,
+ [_SC_LINE_MAX] = -1,
+ [_SC_RE_DUP_MAX] = RE_DUP_MAX,
+ [_SC_2_VERSION] = VER,
+ [_SC_2_C_BIND] = VER,
+ [_SC_2_C_DEV] = -1,
+ [_SC_2_FORT_DEV] = -1,
+ [_SC_2_FORT_RUN] = -1,
+ [_SC_2_SW_DEV] = -1,
+ [_SC_2_LOCALEDEF] = -1,
+ [_SC_IOV_MAX] = IOV_MAX,
+ [_SC_THREADS] = VER,
+ [_SC_THREAD_SAFE_FUNCTIONS] = VER,
+ [_SC_GETGR_R_SIZE_MAX] = -1,
+ [_SC_GETPW_R_SIZE_MAX] = -1,
+ [_SC_LOGIN_NAME_MAX] = 256,
+ [_SC_TTY_NAME_MAX] = TTY_NAME_MAX,
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ [_SC_THREAD_DESTRUCTOR_ITERATIONS] = PTHREAD_DESTRUCTOR_ITERATIONS,
+ [_SC_THREAD_KEYS_MAX] = PTHREAD_KEYS_MAX,
+ [_SC_THREAD_STACK_MIN] = PTHREAD_STACK_MIN,
+#else
+ [_SC_THREAD_DESTRUCTOR_ITERATIONS] = -1,
+ [_SC_THREAD_KEYS_MAX] = -1,
+ [_SC_THREAD_STACK_MIN] = -1,
+#endif
+ [_SC_THREAD_THREADS_MAX] = -1,
+ [_SC_THREAD_ATTR_STACKADDR] = VER,
+ [_SC_THREAD_ATTR_STACKSIZE] = VER,
+ [_SC_THREAD_PRIORITY_SCHEDULING] = VER,
+ [_SC_THREAD_PRIO_INHERIT] = -1,
+ [_SC_THREAD_PRIO_PROTECT] = -1,
+ [_SC_THREAD_PROCESS_SHARED] = VER,
+ [_SC_NPROCESSORS_CONF] = JT_NPROCESSORS_CONF,
+ [_SC_NPROCESSORS_ONLN] = JT_NPROCESSORS_ONLN,
+ [_SC_PHYS_PAGES] = JT_PHYS_PAGES,
+ [_SC_AVPHYS_PAGES] = JT_AVPHYS_PAGES,
+ [_SC_ATEXIT_MAX] = -1,
+ [_SC_PASS_MAX] = -1,
+ [_SC_XOPEN_VERSION] = _XOPEN_VERSION,
+ [_SC_XOPEN_XCU_VERSION] = _XOPEN_VERSION,
+ [_SC_XOPEN_UNIX] = 1,
+ [_SC_XOPEN_CRYPT] = -1,
+ [_SC_XOPEN_ENH_I18N] = 1,
+ [_SC_XOPEN_SHM] = 1,
+ [_SC_2_CHAR_TERM] = -1,
+ [_SC_2_UPE] = -1,
+ [_SC_XOPEN_XPG2] = -1,
+ [_SC_XOPEN_XPG3] = -1,
+ [_SC_XOPEN_XPG4] = -1,
+ [_SC_NZERO] = NZERO,
+ [_SC_XBS5_ILP32_OFF32] = -1,
+ [_SC_XBS5_ILP32_OFFBIG] = sizeof(long)==4 ? 1 : -1,
+ [_SC_XBS5_LP64_OFF64] = sizeof(long)==8 ? 1 : -1,
+ [_SC_XBS5_LPBIG_OFFBIG] = -1,
+ [_SC_XOPEN_LEGACY] = -1,
+ [_SC_XOPEN_REALTIME] = -1,
+ [_SC_XOPEN_REALTIME_THREADS] = -1,
+ [_SC_ADVISORY_INFO] = VER,
+ [_SC_BARRIERS] = VER,
+ [_SC_CLOCK_SELECTION] = VER,
+ [_SC_CPUTIME] = VER,
+ [_SC_THREAD_CPUTIME] = VER,
+ [_SC_MONOTONIC_CLOCK] = VER,
+ [_SC_READER_WRITER_LOCKS] = VER,
+ [_SC_SPIN_LOCKS] = VER,
+ [_SC_REGEXP] = 1,
+ [_SC_SHELL] = 1,
+ [_SC_SPAWN] = VER,
+ [_SC_SPORADIC_SERVER] = -1,
+ [_SC_THREAD_SPORADIC_SERVER] = -1,
+ [_SC_TIMEOUTS] = VER,
+ [_SC_TYPED_MEMORY_OBJECTS] = -1,
+ [_SC_2_PBS] = -1,
+ [_SC_2_PBS_ACCOUNTING] = -1,
+ [_SC_2_PBS_LOCATE] = -1,
+ [_SC_2_PBS_MESSAGE] = -1,
+ [_SC_2_PBS_TRACK] = -1,
+ [_SC_SYMLOOP_MAX] = SYMLOOP_MAX,
+ [_SC_STREAMS] = JT_ZERO,
+ [_SC_2_PBS_CHECKPOINT] = -1,
+ [_SC_V6_ILP32_OFF32] = -1,
+ [_SC_V6_ILP32_OFFBIG] = sizeof(long)==4 ? 1 : -1,
+ [_SC_V6_LP64_OFF64] = sizeof(long)==8 ? 1 : -1,
+ [_SC_V6_LPBIG_OFFBIG] = -1,
+ [_SC_HOST_NAME_MAX] = HOST_NAME_MAX,
+ [_SC_TRACE] = -1,
+ [_SC_TRACE_EVENT_FILTER] = -1,
+ [_SC_TRACE_INHERIT] = -1,
+ [_SC_TRACE_LOG] = -1,
+
+ [_SC_IPV6] = VER,
+ [_SC_RAW_SOCKETS] = VER,
+ [_SC_V7_ILP32_OFF32] = -1,
+ [_SC_V7_ILP32_OFFBIG] = sizeof(long)==4 ? 1 : -1,
+ [_SC_V7_LP64_OFF64] = sizeof(long)==8 ? 1 : -1,
+ [_SC_V7_LPBIG_OFFBIG] = -1,
+ [_SC_SS_REPL_MAX] = -1,
+ [_SC_TRACE_EVENT_NAME_MAX] = -1,
+ [_SC_TRACE_NAME_MAX] = -1,
+ [_SC_TRACE_SYS_MAX] = -1,
+ [_SC_TRACE_USER_EVENT_MAX] = -1,
+ [_SC_XOPEN_STREAMS] = JT_ZERO,
+ [_SC_THREAD_ROBUST_PRIO_INHERIT] = -1,
+ [_SC_THREAD_ROBUST_PRIO_PROTECT] = -1,
+ };
+
+ if (name >= sizeof(values)/sizeof(values[0]) || !values[name]) {
+ errno = EINVAL;
+ return -1;
+ } else if (values[name] >= -1) {
+ return values[name];
+ } else if (values[name] < -256) {
+#ifdef __wasilibc_unmodified_upstream // WASI has no getrlimit
+ struct rlimit lim;
+ getrlimit(values[name]&16383, &lim);
+ if (lim.rlim_cur == RLIM_INFINITY)
+ return -1;
+ return lim.rlim_cur > LONG_MAX ? LONG_MAX : lim.rlim_cur;
+#else
+ // Not supported on wasi.
+ errno = EINVAL;
+ return -1;
+#endif
+ }
+
+ switch ((unsigned char)values[name]) {
+ case VER & 255:
+ return _POSIX_VERSION;
+ case JT_ARG_MAX & 255:
+ return ARG_MAX;
+#ifdef __wasilibc_unmodified_upstream // WASI has no mq
+ case JT_MQ_PRIO_MAX & 255:
+ return MQ_PRIO_MAX;
+#endif
+ case JT_PAGE_SIZE & 255:
+ return PAGE_SIZE;
+#ifdef __wasilibc_unmodified_upstream // WASI has no semaphores
+ case JT_SEM_VALUE_MAX & 255:
+ return SEM_VALUE_MAX;
+#endif
+ case JT_DELAYTIMER_MAX & 255:
+ return DELAYTIMER_MAX;
+ case JT_NPROCESSORS_CONF & 255:
+ case JT_NPROCESSORS_ONLN & 255: ;
+#ifdef __wasilibc_unmodified_upstream
+ unsigned char set[128] = {1};
+ int i, cnt;
+ __syscall(SYS_sched_getaffinity, 0, sizeof set, set);
+ for (i=cnt=0; i<sizeof set; i++)
+ for (; set[i]; set[i]&=set[i]-1, cnt++);
+ return cnt;
+#else
+ // WASI has no way to query the processor count
+ return 1;
+#endif
+#ifdef __wasilibc_unmodified_upstream // WASI has no sysinfo
+ case JT_PHYS_PAGES & 255:
+ case JT_AVPHYS_PAGES & 255: ;
+ unsigned long long mem;
+ struct sysinfo si;
+ __lsysinfo(&si);
+ if (!si.mem_unit) si.mem_unit = 1;
+ if (name==_SC_PHYS_PAGES) mem = si.totalram;
+ else mem = si.freeram + si.bufferram;
+ mem *= si.mem_unit;
+ mem /= PAGE_SIZE;
+ return (mem > LONG_MAX) ? LONG_MAX : mem;
+#endif
+ case JT_ZERO & 255:
+ return 0;
+ }
+ return values[name];
+}
diff --git a/libc-top-half/musl/src/crypt/crypt.c b/libc-top-half/musl/src/crypt/crypt.c
new file mode 100644
index 0000000..e6237e3
--- /dev/null
+++ b/libc-top-half/musl/src/crypt/crypt.c
@@ -0,0 +1,14 @@
+#include <unistd.h>
+#include <crypt.h>
+
+char *crypt(const char *key, const char *salt)
+{
+ /* This buffer is sufficiently large for all
+ * currently-supported hash types. It needs to be updated if
+ * longer hashes are added. The cast to struct crypt_data * is
+ * purely to meet the public API requirements of the crypt_r
+ * function; the implementation of crypt_r uses the object
+ * purely as a char buffer. */
+ static char buf[128];
+ return __crypt_r(key, salt, (struct crypt_data *)buf);
+}
diff --git a/libc-top-half/musl/src/crypt/crypt_blowfish.c b/libc-top-half/musl/src/crypt/crypt_blowfish.c
new file mode 100644
index 0000000..d722607
--- /dev/null
+++ b/libc-top-half/musl/src/crypt/crypt_blowfish.c
@@ -0,0 +1,806 @@
+/* Modified by Rich Felker in for inclusion in musl libc, based on
+ * Solar Designer's second size-optimized version sent to the musl
+ * mailing list. */
+
+/*
+ * The crypt_blowfish homepage is:
+ *
+ * http://www.openwall.com/crypt/
+ *
+ * This code comes from John the Ripper password cracker, with reentrant
+ * and crypt(3) interfaces added, but optimizations specific to password
+ * cracking removed.
+ *
+ * Written by Solar Designer <solar at openwall.com> in 1998-2012.
+ * No copyright is claimed, and the software is hereby placed in the public
+ * domain. In case this attempt to disclaim copyright and place the software
+ * in the public domain is deemed null and void, then the software is
+ * Copyright (c) 1998-2014 Solar Designer and it is hereby released to the
+ * general public under the following terms:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted.
+ *
+ * There's ABSOLUTELY NO WARRANTY, express or implied.
+ *
+ * It is my intent that you should be able to use this on your system,
+ * as part of a software package, or anywhere else to improve security,
+ * ensure compatibility, or for any other purpose. I would appreciate
+ * it if you give credit where it is due and keep your modifications in
+ * the public domain as well, but I don't require that in order to let
+ * you place this code and any modifications you make under a license
+ * of your choice.
+ *
+ * This implementation is fully compatible with OpenBSD's bcrypt.c for prefix
+ * "$2b$", originally by Niels Provos <provos at citi.umich.edu>, and it uses
+ * some of his ideas. The password hashing algorithm was designed by David
+ * Mazieres <dm at lcs.mit.edu>. For information on the level of
+ * compatibility for bcrypt hash prefixes other than "$2b$", please refer to
+ * the comments in BF_set_key() below and to the included crypt(3) man page.
+ *
+ * There's a paper on the algorithm that explains its design decisions:
+ *
+ * http://www.usenix.org/events/usenix99/provos.html
+ *
+ * Some of the tricks in BF_ROUND might be inspired by Eric Young's
+ * Blowfish library (I can't be sure if I would think of something if I
+ * hadn't seen his code).
+ */
+
+#include <string.h>
+#include <stdint.h>
+
+typedef uint32_t BF_word;
+typedef int32_t BF_word_signed;
+
+/* Number of Blowfish rounds, this is also hardcoded into a few places */
+#define BF_N 16
+
+typedef BF_word BF_key[BF_N + 2];
+
+typedef union {
+ struct {
+ BF_key P;
+ BF_word S[4][0x100];
+ } s;
+ BF_word PS[BF_N + 2 + 4 * 0x100];
+} BF_ctx;
+
+/*
+ * Magic IV for 64 Blowfish encryptions that we do at the end.
+ * The string is "OrpheanBeholderScryDoubt" on big-endian.
+ */
+static const BF_word BF_magic_w[6] = {
+ 0x4F727068, 0x65616E42, 0x65686F6C,
+ 0x64657253, 0x63727944, 0x6F756274
+};
+
+/*
+ * P-box and S-box tables initialized with digits of Pi.
+ */
+static const BF_ctx BF_init_state = {{
+ {
+ 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
+ 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
+ 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
+ 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
+ 0x9216d5d9, 0x8979fb1b
+ }, {
+ {
+ 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
+ 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
+ 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
+ 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
+ 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
+ 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
+ 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
+ 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
+ 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
+ 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
+ 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
+ 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
+ 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
+ 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
+ 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
+ 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
+ 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
+ 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
+ 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
+ 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
+ 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
+ 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
+ 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
+ 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
+ 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
+ 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
+ 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
+ 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
+ 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
+ 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
+ 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
+ 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
+ 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
+ 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
+ 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
+ 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
+ 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
+ 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
+ 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
+ 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
+ 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
+ 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
+ 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
+ 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
+ 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
+ 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
+ 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
+ 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
+ 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
+ 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
+ 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
+ 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
+ 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
+ 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
+ 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
+ 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
+ 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
+ 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
+ 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
+ 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
+ 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
+ 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
+ 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
+ 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a
+ }, {
+ 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
+ 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
+ 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
+ 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
+ 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
+ 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
+ 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
+ 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
+ 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
+ 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
+ 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
+ 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
+ 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
+ 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
+ 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
+ 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
+ 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
+ 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
+ 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
+ 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
+ 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
+ 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
+ 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
+ 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
+ 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
+ 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
+ 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
+ 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
+ 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
+ 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
+ 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
+ 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
+ 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
+ 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
+ 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
+ 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
+ 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
+ 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
+ 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
+ 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
+ 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
+ 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
+ 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
+ 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
+ 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
+ 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
+ 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
+ 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
+ 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
+ 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
+ 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
+ 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
+ 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
+ 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
+ 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
+ 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
+ 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
+ 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
+ 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
+ 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
+ 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
+ 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
+ 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
+ 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7
+ }, {
+ 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
+ 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
+ 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
+ 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
+ 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
+ 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
+ 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
+ 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
+ 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
+ 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
+ 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
+ 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
+ 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
+ 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
+ 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
+ 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
+ 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
+ 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
+ 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
+ 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
+ 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
+ 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
+ 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
+ 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
+ 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
+ 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
+ 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
+ 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
+ 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
+ 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
+ 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
+ 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
+ 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
+ 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
+ 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
+ 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
+ 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
+ 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
+ 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
+ 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
+ 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
+ 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
+ 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
+ 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
+ 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
+ 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
+ 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
+ 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
+ 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
+ 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
+ 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
+ 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
+ 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
+ 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
+ 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
+ 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
+ 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
+ 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
+ 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
+ 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
+ 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
+ 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
+ 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
+ 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0
+ }, {
+ 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
+ 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
+ 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
+ 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
+ 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
+ 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
+ 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
+ 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
+ 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
+ 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
+ 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
+ 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
+ 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
+ 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
+ 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
+ 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
+ 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
+ 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
+ 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
+ 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
+ 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
+ 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
+ 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
+ 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
+ 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
+ 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
+ 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
+ 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
+ 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
+ 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
+ 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
+ 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
+ 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
+ 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
+ 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
+ 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
+ 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
+ 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
+ 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
+ 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
+ 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
+ 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
+ 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
+ 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
+ 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
+ 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
+ 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
+ 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
+ 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
+ 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
+ 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
+ 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
+ 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
+ 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
+ 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
+ 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
+ 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
+ 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
+ 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
+ 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
+ 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
+ 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
+ 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
+ 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
+ }
+ }
+}};
+
+static const unsigned char BF_itoa64[64 + 1] =
+ "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+
+static const unsigned char BF_atoi64[0x60] = {
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 1,
+ 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 64, 64, 64, 64,
+ 64, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 64, 64, 64, 64, 64,
+ 64, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
+ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 64, 64, 64, 64, 64
+};
+
+#define BF_safe_atoi64(dst, src) \
+{ \
+ tmp = (unsigned char)(src); \
+ if ((unsigned int)(tmp -= 0x20) >= 0x60) return -1; \
+ tmp = BF_atoi64[tmp]; \
+ if (tmp > 63) return -1; \
+ (dst) = tmp; \
+}
+
+static int BF_decode(BF_word *dst, const char *src, int size)
+{
+ unsigned char *dptr = (unsigned char *)dst;
+ unsigned char *end = dptr + size;
+ const unsigned char *sptr = (const unsigned char *)src;
+ unsigned int tmp, c1, c2, c3, c4;
+
+ do {
+ BF_safe_atoi64(c1, *sptr++);
+ BF_safe_atoi64(c2, *sptr++);
+ *dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4);
+ if (dptr >= end) break;
+
+ BF_safe_atoi64(c3, *sptr++);
+ *dptr++ = ((c2 & 0x0F) << 4) | ((c3 & 0x3C) >> 2);
+ if (dptr >= end) break;
+
+ BF_safe_atoi64(c4, *sptr++);
+ *dptr++ = ((c3 & 0x03) << 6) | c4;
+ } while (dptr < end);
+
+ return 0;
+}
+
+static void BF_encode(char *dst, const BF_word *src, int size)
+{
+ const unsigned char *sptr = (const unsigned char *)src;
+ const unsigned char *end = sptr + size;
+ unsigned char *dptr = (unsigned char *)dst;
+ unsigned int c1, c2;
+
+ do {
+ c1 = *sptr++;
+ *dptr++ = BF_itoa64[c1 >> 2];
+ c1 = (c1 & 0x03) << 4;
+ if (sptr >= end) {
+ *dptr++ = BF_itoa64[c1];
+ break;
+ }
+
+ c2 = *sptr++;
+ c1 |= c2 >> 4;
+ *dptr++ = BF_itoa64[c1];
+ c1 = (c2 & 0x0f) << 2;
+ if (sptr >= end) {
+ *dptr++ = BF_itoa64[c1];
+ break;
+ }
+
+ c2 = *sptr++;
+ c1 |= c2 >> 6;
+ *dptr++ = BF_itoa64[c1];
+ *dptr++ = BF_itoa64[c2 & 0x3f];
+ } while (sptr < end);
+}
+
+static void BF_swap(BF_word *x, int count)
+{
+ if ((union { int i; char c; }){1}.c)
+ do {
+ BF_word tmp = *x;
+ tmp = (tmp << 16) | (tmp >> 16);
+ *x++ = ((tmp & 0x00FF00FF) << 8) | ((tmp >> 8) & 0x00FF00FF);
+ } while (--count);
+}
+
+#define BF_ROUND(L, R, N) \
+ tmp1 = L & 0xFF; \
+ tmp2 = L >> 8; \
+ tmp2 &= 0xFF; \
+ tmp3 = L >> 16; \
+ tmp3 &= 0xFF; \
+ tmp4 = L >> 24; \
+ tmp1 = ctx->s.S[3][tmp1]; \
+ tmp2 = ctx->s.S[2][tmp2]; \
+ tmp3 = ctx->s.S[1][tmp3]; \
+ tmp3 += ctx->s.S[0][tmp4]; \
+ tmp3 ^= tmp2; \
+ R ^= ctx->s.P[N + 1]; \
+ tmp3 += tmp1; \
+ R ^= tmp3;
+
+static BF_word BF_encrypt(BF_ctx *ctx,
+ BF_word L, BF_word R,
+ BF_word *start, BF_word *end)
+{
+ BF_word tmp1, tmp2, tmp3, tmp4;
+ BF_word *ptr = start;
+
+ do {
+ L ^= ctx->s.P[0];
+#if 0
+ BF_ROUND(L, R, 0);
+ BF_ROUND(R, L, 1);
+ BF_ROUND(L, R, 2);
+ BF_ROUND(R, L, 3);
+ BF_ROUND(L, R, 4);
+ BF_ROUND(R, L, 5);
+ BF_ROUND(L, R, 6);
+ BF_ROUND(R, L, 7);
+ BF_ROUND(L, R, 8);
+ BF_ROUND(R, L, 9);
+ BF_ROUND(L, R, 10);
+ BF_ROUND(R, L, 11);
+ BF_ROUND(L, R, 12);
+ BF_ROUND(R, L, 13);
+ BF_ROUND(L, R, 14);
+ BF_ROUND(R, L, 15);
+#else
+ for (int i=0; i<16; i+=2) {
+ BF_ROUND(L, R, i);
+ BF_ROUND(R, L, i+1);
+ }
+#endif
+ tmp4 = R;
+ R = L;
+ L = tmp4 ^ ctx->s.P[BF_N + 1];
+ *ptr++ = L;
+ *ptr++ = R;
+ } while (ptr < end);
+
+ return L;
+}
+
+static void BF_set_key(const char *key, BF_key expanded, BF_key initial,
+ unsigned char flags)
+{
+ const char *ptr = key;
+ unsigned int bug, i, j;
+ BF_word safety, sign, diff, tmp[2];
+
+/*
+ * There was a sign extension bug in older revisions of this function. While
+ * we would have liked to simply fix the bug and move on, we have to provide
+ * a backwards compatibility feature (essentially the bug) for some systems and
+ * a safety measure for some others. The latter is needed because for certain
+ * multiple inputs to the buggy algorithm there exist easily found inputs to
+ * the correct algorithm that produce the same hash. Thus, we optionally
+ * deviate from the correct algorithm just enough to avoid such collisions.
+ * While the bug itself affected the majority of passwords containing
+ * characters with the 8th bit set (although only a percentage of those in a
+ * collision-producing way), the anti-collision safety measure affects
+ * only a subset of passwords containing the '\xff' character (not even all of
+ * those passwords, just some of them). This character is not found in valid
+ * UTF-8 sequences and is rarely used in popular 8-bit character encodings.
+ * Thus, the safety measure is unlikely to cause much annoyance, and is a
+ * reasonable tradeoff to use when authenticating against existing hashes that
+ * are not reliably known to have been computed with the correct algorithm.
+ *
+ * We use an approach that tries to minimize side-channel leaks of password
+ * information - that is, we mostly use fixed-cost bitwise operations instead
+ * of branches or table lookups. (One conditional branch based on password
+ * length remains. It is not part of the bug aftermath, though, and is
+ * difficult and possibly unreasonable to avoid given the use of C strings by
+ * the caller, which results in similar timing leaks anyway.)
+ *
+ * For actual implementation, we set an array index in the variable "bug"
+ * (0 means no bug, 1 means sign extension bug emulation) and a flag in the
+ * variable "safety" (bit 16 is set when the safety measure is requested).
+ * Valid combinations of settings are:
+ *
+ * Prefix "$2a$": bug = 0, safety = 0x10000
+ * Prefix "$2b$": bug = 0, safety = 0
+ * Prefix "$2x$": bug = 1, safety = 0
+ * Prefix "$2y$": bug = 0, safety = 0
+ */
+ bug = flags & 1;
+ safety = ((BF_word)flags & 2) << 15;
+
+ sign = diff = 0;
+
+ for (i = 0; i < BF_N + 2; i++) {
+ tmp[0] = tmp[1] = 0;
+ for (j = 0; j < 4; j++) {
+ tmp[0] <<= 8;
+ tmp[0] |= (unsigned char)*ptr; /* correct */
+ tmp[1] <<= 8;
+ tmp[1] |= (signed char)*ptr; /* bug */
+/*
+ * Sign extension in the first char has no effect - nothing to overwrite yet,
+ * and those extra 24 bits will be fully shifted out of the 32-bit word. For
+ * chars 2, 3, 4 in each four-char block, we set bit 7 of "sign" if sign
+ * extension in tmp[1] occurs. Once this flag is set, it remains set.
+ */
+ if (j)
+ sign |= tmp[1] & 0x80;
+ if (!*ptr)
+ ptr = key;
+ else
+ ptr++;
+ }
+ diff |= tmp[0] ^ tmp[1]; /* Non-zero on any differences */
+
+ expanded[i] = tmp[bug];
+ initial[i] = BF_init_state.s.P[i] ^ tmp[bug];
+ }
+
+/*
+ * At this point, "diff" is zero iff the correct and buggy algorithms produced
+ * exactly the same result. If so and if "sign" is non-zero, which indicates
+ * that there was a non-benign sign extension, this means that we have a
+ * collision between the correctly computed hash for this password and a set of
+ * passwords that could be supplied to the buggy algorithm. Our safety measure
+ * is meant to protect from such many-buggy to one-correct collisions, by
+ * deviating from the correct algorithm in such cases. Let's check for this.
+ */
+ diff |= diff >> 16; /* still zero iff exact match */
+ diff &= 0xffff; /* ditto */
+ diff += 0xffff; /* bit 16 set iff "diff" was non-zero (on non-match) */
+ sign <<= 9; /* move the non-benign sign extension flag to bit 16 */
+ sign &= ~diff & safety; /* action needed? */
+
+/*
+ * If we have determined that we need to deviate from the correct algorithm,
+ * flip bit 16 in initial expanded key. (The choice of 16 is arbitrary, but
+ * let's stick to it now. It came out of the approach we used above, and it's
+ * not any worse than any other choice we could make.)
+ *
+ * It is crucial that we don't do the same to the expanded key used in the main
+ * Eksblowfish loop. By doing it to only one of these two, we deviate from a
+ * state that could be directly specified by a password to the buggy algorithm
+ * (and to the fully correct one as well, but that's a side-effect).
+ */
+ initial[0] ^= sign;
+}
+
+static const unsigned char flags_by_subtype[26] = {
+ 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0
+};
+
+static char *BF_crypt(const char *key, const char *setting,
+ char *output, BF_word min)
+{
+ struct {
+ BF_ctx ctx;
+ BF_key expanded_key;
+ union {
+ BF_word salt[4];
+ BF_word output[6];
+ } binary;
+ } data;
+ BF_word count;
+ int i;
+
+ if (setting[0] != '$' ||
+ setting[1] != '2' ||
+ setting[2] - 'a' > 25U ||
+ !flags_by_subtype[setting[2] - 'a'] ||
+ setting[3] != '$' ||
+ setting[4] - '0' > 1U ||
+ setting[5] - '0' > 9U ||
+ setting[6] != '$') {
+ return NULL;
+ }
+
+ count = (BF_word)1 << ((setting[4] - '0') * 10 + (setting[5] - '0'));
+ if (count < min || BF_decode(data.binary.salt, &setting[7], 16)) {
+ return NULL;
+ }
+ BF_swap(data.binary.salt, 4);
+
+ BF_set_key(key, data.expanded_key, data.ctx.s.P,
+ flags_by_subtype[setting[2] - 'a']);
+
+ memcpy(data.ctx.s.S, BF_init_state.s.S, sizeof(data.ctx.s.S));
+
+ {
+ BF_word L = 0, R = 0;
+ BF_word *ptr = &data.ctx.PS[0];
+ do {
+ L = BF_encrypt(&data.ctx,
+ L ^ data.binary.salt[0], R ^ data.binary.salt[1],
+ ptr, ptr);
+ R = *(ptr + 1);
+ ptr += 2;
+
+ if (ptr >= &data.ctx.PS[BF_N + 2 + 4 * 0x100])
+ break;
+
+ L = BF_encrypt(&data.ctx,
+ L ^ data.binary.salt[2], R ^ data.binary.salt[3],
+ ptr, ptr);
+ R = *(ptr + 1);
+ ptr += 2;
+ } while (1);
+ }
+
+ do {
+ int done;
+
+ for (i = 0; i < BF_N + 2; i += 2) {
+ data.ctx.s.P[i] ^= data.expanded_key[i];
+ data.ctx.s.P[i + 1] ^= data.expanded_key[i + 1];
+ }
+
+ done = 0;
+ do {
+ BF_encrypt(&data.ctx, 0, 0,
+ &data.ctx.PS[0],
+ &data.ctx.PS[BF_N + 2 + 4 * 0x100]);
+
+ if (done)
+ break;
+ done = 1;
+
+ {
+ BF_word tmp1, tmp2, tmp3, tmp4;
+
+ tmp1 = data.binary.salt[0];
+ tmp2 = data.binary.salt[1];
+ tmp3 = data.binary.salt[2];
+ tmp4 = data.binary.salt[3];
+ for (i = 0; i < BF_N; i += 4) {
+ data.ctx.s.P[i] ^= tmp1;
+ data.ctx.s.P[i + 1] ^= tmp2;
+ data.ctx.s.P[i + 2] ^= tmp3;
+ data.ctx.s.P[i + 3] ^= tmp4;
+ }
+ data.ctx.s.P[16] ^= tmp1;
+ data.ctx.s.P[17] ^= tmp2;
+ }
+ } while (1);
+ } while (--count);
+
+ for (i = 0; i < 6; i += 2) {
+ BF_word L, LR[2];
+
+ L = BF_magic_w[i];
+ LR[1] = BF_magic_w[i + 1];
+
+ count = 64;
+ do {
+ L = BF_encrypt(&data.ctx, L, LR[1],
+ &LR[0], &LR[0]);
+ } while (--count);
+
+ data.binary.output[i] = L;
+ data.binary.output[i + 1] = LR[1];
+ }
+
+ memcpy(output, setting, 7 + 22 - 1);
+ output[7 + 22 - 1] = BF_itoa64[
+ BF_atoi64[setting[7 + 22 - 1] - 0x20] & 0x30];
+
+/* This has to be bug-compatible with the original implementation, so
+ * only encode 23 of the 24 bytes. :-) */
+ BF_swap(data.binary.output, 6);
+ BF_encode(&output[7 + 22], data.binary.output, 23);
+ output[7 + 22 + 31] = '\0';
+
+ return output;
+}
+
+/*
+ * Please preserve the runtime self-test. It serves two purposes at once:
+ *
+ * 1. We really can't afford the risk of producing incompatible hashes e.g.
+ * when there's something like gcc bug 26587 again, whereas an application or
+ * library integrating this code might not also integrate our external tests or
+ * it might not run them after every build. Even if it does, the miscompile
+ * might only occur on the production build, but not on a testing build (such
+ * as because of different optimization settings). It is painful to recover
+ * from incorrectly-computed hashes - merely fixing whatever broke is not
+ * enough. Thus, a proactive measure like this self-test is needed.
+ *
+ * 2. We don't want to leave sensitive data from our actual password hash
+ * computation on the stack or in registers. Previous revisions of the code
+ * would do explicit cleanups, but simply running the self-test after hash
+ * computation is more reliable.
+ *
+ * The performance cost of this quick self-test is around 0.6% at the "$2a$08"
+ * setting.
+ */
+char *__crypt_blowfish(const char *key, const char *setting, char *output)
+{
+ const char *test_key = "8b \xd0\xc1\xd2\xcf\xcc\xd8";
+ const char *test_setting = "$2a$00$abcdefghijklmnopqrstuu";
+ static const char test_hashes[2][34] = {
+ "i1D709vfamulimlGcq0qq3UvuUasvEa\0\x55", /* 'a', 'b', 'y' */
+ "VUrPmXD6q/nVSSp7pNDhCR9071IfIRe\0\x55", /* 'x' */
+ };
+ const char *test_hash = test_hashes[0];
+ char *retval;
+ const char *p;
+ int ok;
+ struct {
+ char s[7 + 22 + 1];
+ char o[7 + 22 + 31 + 1 + 1 + 1];
+ } buf;
+
+/* Hash the supplied password */
+ retval = BF_crypt(key, setting, output, 16);
+
+/*
+ * Do a quick self-test. It is important that we make both calls to BF_crypt()
+ * from the same scope such that they likely use the same stack locations,
+ * which makes the second call overwrite the first call's sensitive data on the
+ * stack and makes it more likely that any alignment related issues would be
+ * detected by the self-test.
+ */
+ memcpy(buf.s, test_setting, sizeof(buf.s));
+ if (retval) {
+ unsigned int flags = flags_by_subtype[setting[2] - 'a'];
+ test_hash = test_hashes[flags & 1];
+ buf.s[2] = setting[2];
+ }
+ memset(buf.o, 0x55, sizeof(buf.o));
+ buf.o[sizeof(buf.o) - 1] = 0;
+ p = BF_crypt(test_key, buf.s, buf.o, 1);
+
+ ok = (p == buf.o &&
+ !memcmp(p, buf.s, 7 + 22) &&
+ !memcmp(p + (7 + 22),
+ test_hash,
+ 31 + 1 + 1 + 1));
+
+ {
+ const char *k = "\xff\xa3" "34" "\xff\xff\xff\xa3" "345";
+ BF_key ae, ai, ye, yi;
+ BF_set_key(k, ae, ai, 2); /* $2a$ */
+ BF_set_key(k, ye, yi, 4); /* $2y$ */
+ ai[0] ^= 0x10000; /* undo the safety (for comparison) */
+ ok = ok && ai[0] == 0xdb9c59bc && ye[17] == 0x33343500 &&
+ !memcmp(ae, ye, sizeof(ae)) &&
+ !memcmp(ai, yi, sizeof(ai));
+ }
+
+ if (ok && retval)
+ return retval;
+
+ return "*";
+}
diff --git a/libc-top-half/musl/src/crypt/crypt_des.c b/libc-top-half/musl/src/crypt/crypt_des.c
new file mode 100644
index 0000000..338a8f3
--- /dev/null
+++ b/libc-top-half/musl/src/crypt/crypt_des.c
@@ -0,0 +1,1016 @@
+/*
+ * This version has been further modified by Rich Felker, primary author
+ * and maintainer of musl libc, to remove table generation code and
+ * replaced all runtime-generated constant tables with static-initialized
+ * tables in the binary, in the interest of minimizing non-shareable
+ * memory usage and stack size requirements.
+ */
+/*
+ * This version is derived from the original implementation of FreeSec
+ * (release 1.1) by David Burren. I've made it reentrant, reduced its memory
+ * usage from about 70 KB to about 7 KB (with only minimal performance impact
+ * and keeping code size about the same), made the handling of invalid salts
+ * mostly UFC-crypt compatible, added a quick runtime self-test (which also
+ * serves to zeroize the stack from sensitive data), and added optional tests.
+ * - Solar Designer <solar at openwall.com>
+ */
+
+/*
+ * FreeSec: libcrypt for NetBSD
+ *
+ * Copyright (c) 1994 David Burren
+ * Copyright (c) 2000,2002,2010,2012 Solar Designer
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the author nor the names of other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Owl: Owl/packages/glibc/crypt_freesec.c,v 1.6 2010/02/20 14:45:06 solar Exp $
+ * $Id: crypt.c,v 1.15 1994/09/13 04:58:49 davidb Exp $
+ *
+ * This is an original implementation of the DES and the crypt(3) interfaces
+ * by David Burren. It has been heavily re-worked by Solar Designer.
+ */
+
+#include <stdint.h>
+#include <string.h>
+
+#include "crypt_des.h"
+
+#define _PASSWORD_EFMT1 '_'
+
+static const unsigned char key_shifts[16] = {
+ 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
+};
+
+static const uint32_t psbox[8][64] = {
+ {
+ 0x00808200,0x00000000,0x00008000,0x00808202,
+ 0x00808002,0x00008202,0x00000002,0x00008000,
+ 0x00000200,0x00808200,0x00808202,0x00000200,
+ 0x00800202,0x00808002,0x00800000,0x00000002,
+ 0x00000202,0x00800200,0x00800200,0x00008200,
+ 0x00008200,0x00808000,0x00808000,0x00800202,
+ 0x00008002,0x00800002,0x00800002,0x00008002,
+ 0x00000000,0x00000202,0x00008202,0x00800000,
+ 0x00008000,0x00808202,0x00000002,0x00808000,
+ 0x00808200,0x00800000,0x00800000,0x00000200,
+ 0x00808002,0x00008000,0x00008200,0x00800002,
+ 0x00000200,0x00000002,0x00800202,0x00008202,
+ 0x00808202,0x00008002,0x00808000,0x00800202,
+ 0x00800002,0x00000202,0x00008202,0x00808200,
+ 0x00000202,0x00800200,0x00800200,0x00000000,
+ 0x00008002,0x00008200,0x00000000,0x00808002,
+ },{
+ 0x40084010,0x40004000,0x00004000,0x00084010,
+ 0x00080000,0x00000010,0x40080010,0x40004010,
+ 0x40000010,0x40084010,0x40084000,0x40000000,
+ 0x40004000,0x00080000,0x00000010,0x40080010,
+ 0x00084000,0x00080010,0x40004010,0x00000000,
+ 0x40000000,0x00004000,0x00084010,0x40080000,
+ 0x00080010,0x40000010,0x00000000,0x00084000,
+ 0x00004010,0x40084000,0x40080000,0x00004010,
+ 0x00000000,0x00084010,0x40080010,0x00080000,
+ 0x40004010,0x40080000,0x40084000,0x00004000,
+ 0x40080000,0x40004000,0x00000010,0x40084010,
+ 0x00084010,0x00000010,0x00004000,0x40000000,
+ 0x00004010,0x40084000,0x00080000,0x40000010,
+ 0x00080010,0x40004010,0x40000010,0x00080010,
+ 0x00084000,0x00000000,0x40004000,0x00004010,
+ 0x40000000,0x40080010,0x40084010,0x00084000,
+ },{
+ 0x00000104,0x04010100,0x00000000,0x04010004,
+ 0x04000100,0x00000000,0x00010104,0x04000100,
+ 0x00010004,0x04000004,0x04000004,0x00010000,
+ 0x04010104,0x00010004,0x04010000,0x00000104,
+ 0x04000000,0x00000004,0x04010100,0x00000100,
+ 0x00010100,0x04010000,0x04010004,0x00010104,
+ 0x04000104,0x00010100,0x00010000,0x04000104,
+ 0x00000004,0x04010104,0x00000100,0x04000000,
+ 0x04010100,0x04000000,0x00010004,0x00000104,
+ 0x00010000,0x04010100,0x04000100,0x00000000,
+ 0x00000100,0x00010004,0x04010104,0x04000100,
+ 0x04000004,0x00000100,0x00000000,0x04010004,
+ 0x04000104,0x00010000,0x04000000,0x04010104,
+ 0x00000004,0x00010104,0x00010100,0x04000004,
+ 0x04010000,0x04000104,0x00000104,0x04010000,
+ 0x00010104,0x00000004,0x04010004,0x00010100,
+ },{
+ 0x80401000,0x80001040,0x80001040,0x00000040,
+ 0x00401040,0x80400040,0x80400000,0x80001000,
+ 0x00000000,0x00401000,0x00401000,0x80401040,
+ 0x80000040,0x00000000,0x00400040,0x80400000,
+ 0x80000000,0x00001000,0x00400000,0x80401000,
+ 0x00000040,0x00400000,0x80001000,0x00001040,
+ 0x80400040,0x80000000,0x00001040,0x00400040,
+ 0x00001000,0x00401040,0x80401040,0x80000040,
+ 0x00400040,0x80400000,0x00401000,0x80401040,
+ 0x80000040,0x00000000,0x00000000,0x00401000,
+ 0x00001040,0x00400040,0x80400040,0x80000000,
+ 0x80401000,0x80001040,0x80001040,0x00000040,
+ 0x80401040,0x80000040,0x80000000,0x00001000,
+ 0x80400000,0x80001000,0x00401040,0x80400040,
+ 0x80001000,0x00001040,0x00400000,0x80401000,
+ 0x00000040,0x00400000,0x00001000,0x00401040,
+ },{
+ 0x00000080,0x01040080,0x01040000,0x21000080,
+ 0x00040000,0x00000080,0x20000000,0x01040000,
+ 0x20040080,0x00040000,0x01000080,0x20040080,
+ 0x21000080,0x21040000,0x00040080,0x20000000,
+ 0x01000000,0x20040000,0x20040000,0x00000000,
+ 0x20000080,0x21040080,0x21040080,0x01000080,
+ 0x21040000,0x20000080,0x00000000,0x21000000,
+ 0x01040080,0x01000000,0x21000000,0x00040080,
+ 0x00040000,0x21000080,0x00000080,0x01000000,
+ 0x20000000,0x01040000,0x21000080,0x20040080,
+ 0x01000080,0x20000000,0x21040000,0x01040080,
+ 0x20040080,0x00000080,0x01000000,0x21040000,
+ 0x21040080,0x00040080,0x21000000,0x21040080,
+ 0x01040000,0x00000000,0x20040000,0x21000000,
+ 0x00040080,0x01000080,0x20000080,0x00040000,
+ 0x00000000,0x20040000,0x01040080,0x20000080,
+ },{
+ 0x10000008,0x10200000,0x00002000,0x10202008,
+ 0x10200000,0x00000008,0x10202008,0x00200000,
+ 0x10002000,0x00202008,0x00200000,0x10000008,
+ 0x00200008,0x10002000,0x10000000,0x00002008,
+ 0x00000000,0x00200008,0x10002008,0x00002000,
+ 0x00202000,0x10002008,0x00000008,0x10200008,
+ 0x10200008,0x00000000,0x00202008,0x10202000,
+ 0x00002008,0x00202000,0x10202000,0x10000000,
+ 0x10002000,0x00000008,0x10200008,0x00202000,
+ 0x10202008,0x00200000,0x00002008,0x10000008,
+ 0x00200000,0x10002000,0x10000000,0x00002008,
+ 0x10000008,0x10202008,0x00202000,0x10200000,
+ 0x00202008,0x10202000,0x00000000,0x10200008,
+ 0x00000008,0x00002000,0x10200000,0x00202008,
+ 0x00002000,0x00200008,0x10002008,0x00000000,
+ 0x10202000,0x10000000,0x00200008,0x10002008,
+ },{
+ 0x00100000,0x02100001,0x02000401,0x00000000,
+ 0x00000400,0x02000401,0x00100401,0x02100400,
+ 0x02100401,0x00100000,0x00000000,0x02000001,
+ 0x00000001,0x02000000,0x02100001,0x00000401,
+ 0x02000400,0x00100401,0x00100001,0x02000400,
+ 0x02000001,0x02100000,0x02100400,0x00100001,
+ 0x02100000,0x00000400,0x00000401,0x02100401,
+ 0x00100400,0x00000001,0x02000000,0x00100400,
+ 0x02000000,0x00100400,0x00100000,0x02000401,
+ 0x02000401,0x02100001,0x02100001,0x00000001,
+ 0x00100001,0x02000000,0x02000400,0x00100000,
+ 0x02100400,0x00000401,0x00100401,0x02100400,
+ 0x00000401,0x02000001,0x02100401,0x02100000,
+ 0x00100400,0x00000000,0x00000001,0x02100401,
+ 0x00000000,0x00100401,0x02100000,0x00000400,
+ 0x02000001,0x02000400,0x00000400,0x00100001,
+ },{
+ 0x08000820,0x00000800,0x00020000,0x08020820,
+ 0x08000000,0x08000820,0x00000020,0x08000000,
+ 0x00020020,0x08020000,0x08020820,0x00020800,
+ 0x08020800,0x00020820,0x00000800,0x00000020,
+ 0x08020000,0x08000020,0x08000800,0x00000820,
+ 0x00020800,0x00020020,0x08020020,0x08020800,
+ 0x00000820,0x00000000,0x00000000,0x08020020,
+ 0x08000020,0x08000800,0x00020820,0x00020000,
+ 0x00020820,0x00020000,0x08020800,0x00000800,
+ 0x00000020,0x08020020,0x00000800,0x00020820,
+ 0x08000800,0x00000020,0x08000020,0x08020000,
+ 0x08020020,0x08000000,0x00020000,0x08000820,
+ 0x00000000,0x08020820,0x00020020,0x08000020,
+ 0x08020000,0x08000800,0x08000820,0x00000000,
+ 0x08020820,0x00020800,0x00020800,0x00000820,
+ 0x00000820,0x00020020,0x08000000,0x08020800,
+ },
+};
+static const uint32_t ip_maskl[16][16] = {
+ {
+ 0x00000000,0x00010000,0x00000000,0x00010000,
+ 0x01000000,0x01010000,0x01000000,0x01010000,
+ 0x00000000,0x00010000,0x00000000,0x00010000,
+ 0x01000000,0x01010000,0x01000000,0x01010000,
+ },{
+ 0x00000000,0x00000001,0x00000000,0x00000001,
+ 0x00000100,0x00000101,0x00000100,0x00000101,
+ 0x00000000,0x00000001,0x00000000,0x00000001,
+ 0x00000100,0x00000101,0x00000100,0x00000101,
+ },{
+ 0x00000000,0x00020000,0x00000000,0x00020000,
+ 0x02000000,0x02020000,0x02000000,0x02020000,
+ 0x00000000,0x00020000,0x00000000,0x00020000,
+ 0x02000000,0x02020000,0x02000000,0x02020000,
+ },{
+ 0x00000000,0x00000002,0x00000000,0x00000002,
+ 0x00000200,0x00000202,0x00000200,0x00000202,
+ 0x00000000,0x00000002,0x00000000,0x00000002,
+ 0x00000200,0x00000202,0x00000200,0x00000202,
+ },{
+ 0x00000000,0x00040000,0x00000000,0x00040000,
+ 0x04000000,0x04040000,0x04000000,0x04040000,
+ 0x00000000,0x00040000,0x00000000,0x00040000,
+ 0x04000000,0x04040000,0x04000000,0x04040000,
+ },{
+ 0x00000000,0x00000004,0x00000000,0x00000004,
+ 0x00000400,0x00000404,0x00000400,0x00000404,
+ 0x00000000,0x00000004,0x00000000,0x00000004,
+ 0x00000400,0x00000404,0x00000400,0x00000404,
+ },{
+ 0x00000000,0x00080000,0x00000000,0x00080000,
+ 0x08000000,0x08080000,0x08000000,0x08080000,
+ 0x00000000,0x00080000,0x00000000,0x00080000,
+ 0x08000000,0x08080000,0x08000000,0x08080000,
+ },{
+ 0x00000000,0x00000008,0x00000000,0x00000008,
+ 0x00000800,0x00000808,0x00000800,0x00000808,
+ 0x00000000,0x00000008,0x00000000,0x00000008,
+ 0x00000800,0x00000808,0x00000800,0x00000808,
+ },{
+ 0x00000000,0x00100000,0x00000000,0x00100000,
+ 0x10000000,0x10100000,0x10000000,0x10100000,
+ 0x00000000,0x00100000,0x00000000,0x00100000,
+ 0x10000000,0x10100000,0x10000000,0x10100000,
+ },{
+ 0x00000000,0x00000010,0x00000000,0x00000010,
+ 0x00001000,0x00001010,0x00001000,0x00001010,
+ 0x00000000,0x00000010,0x00000000,0x00000010,
+ 0x00001000,0x00001010,0x00001000,0x00001010,
+ },{
+ 0x00000000,0x00200000,0x00000000,0x00200000,
+ 0x20000000,0x20200000,0x20000000,0x20200000,
+ 0x00000000,0x00200000,0x00000000,0x00200000,
+ 0x20000000,0x20200000,0x20000000,0x20200000,
+ },{
+ 0x00000000,0x00000020,0x00000000,0x00000020,
+ 0x00002000,0x00002020,0x00002000,0x00002020,
+ 0x00000000,0x00000020,0x00000000,0x00000020,
+ 0x00002000,0x00002020,0x00002000,0x00002020,
+ },{
+ 0x00000000,0x00400000,0x00000000,0x00400000,
+ 0x40000000,0x40400000,0x40000000,0x40400000,
+ 0x00000000,0x00400000,0x00000000,0x00400000,
+ 0x40000000,0x40400000,0x40000000,0x40400000,
+ },{
+ 0x00000000,0x00000040,0x00000000,0x00000040,
+ 0x00004000,0x00004040,0x00004000,0x00004040,
+ 0x00000000,0x00000040,0x00000000,0x00000040,
+ 0x00004000,0x00004040,0x00004000,0x00004040,
+ },{
+ 0x00000000,0x00800000,0x00000000,0x00800000,
+ 0x80000000,0x80800000,0x80000000,0x80800000,
+ 0x00000000,0x00800000,0x00000000,0x00800000,
+ 0x80000000,0x80800000,0x80000000,0x80800000,
+ },{
+ 0x00000000,0x00000080,0x00000000,0x00000080,
+ 0x00008000,0x00008080,0x00008000,0x00008080,
+ 0x00000000,0x00000080,0x00000000,0x00000080,
+ 0x00008000,0x00008080,0x00008000,0x00008080,
+ },
+};
+static const uint32_t ip_maskr[16][16] = {
+ {
+ 0x00000000,0x00000000,0x00010000,0x00010000,
+ 0x00000000,0x00000000,0x00010000,0x00010000,
+ 0x01000000,0x01000000,0x01010000,0x01010000,
+ 0x01000000,0x01000000,0x01010000,0x01010000,
+ },{
+ 0x00000000,0x00000000,0x00000001,0x00000001,
+ 0x00000000,0x00000000,0x00000001,0x00000001,
+ 0x00000100,0x00000100,0x00000101,0x00000101,
+ 0x00000100,0x00000100,0x00000101,0x00000101,
+ },{
+ 0x00000000,0x00000000,0x00020000,0x00020000,
+ 0x00000000,0x00000000,0x00020000,0x00020000,
+ 0x02000000,0x02000000,0x02020000,0x02020000,
+ 0x02000000,0x02000000,0x02020000,0x02020000,
+ },{
+ 0x00000000,0x00000000,0x00000002,0x00000002,
+ 0x00000000,0x00000000,0x00000002,0x00000002,
+ 0x00000200,0x00000200,0x00000202,0x00000202,
+ 0x00000200,0x00000200,0x00000202,0x00000202,
+ },{
+ 0x00000000,0x00000000,0x00040000,0x00040000,
+ 0x00000000,0x00000000,0x00040000,0x00040000,
+ 0x04000000,0x04000000,0x04040000,0x04040000,
+ 0x04000000,0x04000000,0x04040000,0x04040000,
+ },{
+ 0x00000000,0x00000000,0x00000004,0x00000004,
+ 0x00000000,0x00000000,0x00000004,0x00000004,
+ 0x00000400,0x00000400,0x00000404,0x00000404,
+ 0x00000400,0x00000400,0x00000404,0x00000404,
+ },{
+ 0x00000000,0x00000000,0x00080000,0x00080000,
+ 0x00000000,0x00000000,0x00080000,0x00080000,
+ 0x08000000,0x08000000,0x08080000,0x08080000,
+ 0x08000000,0x08000000,0x08080000,0x08080000,
+ },{
+ 0x00000000,0x00000000,0x00000008,0x00000008,
+ 0x00000000,0x00000000,0x00000008,0x00000008,
+ 0x00000800,0x00000800,0x00000808,0x00000808,
+ 0x00000800,0x00000800,0x00000808,0x00000808,
+ },{
+ 0x00000000,0x00000000,0x00100000,0x00100000,
+ 0x00000000,0x00000000,0x00100000,0x00100000,
+ 0x10000000,0x10000000,0x10100000,0x10100000,
+ 0x10000000,0x10000000,0x10100000,0x10100000,
+ },{
+ 0x00000000,0x00000000,0x00000010,0x00000010,
+ 0x00000000,0x00000000,0x00000010,0x00000010,
+ 0x00001000,0x00001000,0x00001010,0x00001010,
+ 0x00001000,0x00001000,0x00001010,0x00001010,
+ },{
+ 0x00000000,0x00000000,0x00200000,0x00200000,
+ 0x00000000,0x00000000,0x00200000,0x00200000,
+ 0x20000000,0x20000000,0x20200000,0x20200000,
+ 0x20000000,0x20000000,0x20200000,0x20200000,
+ },{
+ 0x00000000,0x00000000,0x00000020,0x00000020,
+ 0x00000000,0x00000000,0x00000020,0x00000020,
+ 0x00002000,0x00002000,0x00002020,0x00002020,
+ 0x00002000,0x00002000,0x00002020,0x00002020,
+ },{
+ 0x00000000,0x00000000,0x00400000,0x00400000,
+ 0x00000000,0x00000000,0x00400000,0x00400000,
+ 0x40000000,0x40000000,0x40400000,0x40400000,
+ 0x40000000,0x40000000,0x40400000,0x40400000,
+ },{
+ 0x00000000,0x00000000,0x00000040,0x00000040,
+ 0x00000000,0x00000000,0x00000040,0x00000040,
+ 0x00004000,0x00004000,0x00004040,0x00004040,
+ 0x00004000,0x00004000,0x00004040,0x00004040,
+ },{
+ 0x00000000,0x00000000,0x00800000,0x00800000,
+ 0x00000000,0x00000000,0x00800000,0x00800000,
+ 0x80000000,0x80000000,0x80800000,0x80800000,
+ 0x80000000,0x80000000,0x80800000,0x80800000,
+ },{
+ 0x00000000,0x00000000,0x00000080,0x00000080,
+ 0x00000000,0x00000000,0x00000080,0x00000080,
+ 0x00008000,0x00008000,0x00008080,0x00008080,
+ 0x00008000,0x00008000,0x00008080,0x00008080,
+ },
+};
+static const uint32_t fp_maskl[8][16] = {
+ {
+ 0x00000000,0x40000000,0x00400000,0x40400000,
+ 0x00004000,0x40004000,0x00404000,0x40404000,
+ 0x00000040,0x40000040,0x00400040,0x40400040,
+ 0x00004040,0x40004040,0x00404040,0x40404040,
+ },{
+ 0x00000000,0x10000000,0x00100000,0x10100000,
+ 0x00001000,0x10001000,0x00101000,0x10101000,
+ 0x00000010,0x10000010,0x00100010,0x10100010,
+ 0x00001010,0x10001010,0x00101010,0x10101010,
+ },{
+ 0x00000000,0x04000000,0x00040000,0x04040000,
+ 0x00000400,0x04000400,0x00040400,0x04040400,
+ 0x00000004,0x04000004,0x00040004,0x04040004,
+ 0x00000404,0x04000404,0x00040404,0x04040404,
+ },{
+ 0x00000000,0x01000000,0x00010000,0x01010000,
+ 0x00000100,0x01000100,0x00010100,0x01010100,
+ 0x00000001,0x01000001,0x00010001,0x01010001,
+ 0x00000101,0x01000101,0x00010101,0x01010101,
+ },{
+ 0x00000000,0x80000000,0x00800000,0x80800000,
+ 0x00008000,0x80008000,0x00808000,0x80808000,
+ 0x00000080,0x80000080,0x00800080,0x80800080,
+ 0x00008080,0x80008080,0x00808080,0x80808080,
+ },{
+ 0x00000000,0x20000000,0x00200000,0x20200000,
+ 0x00002000,0x20002000,0x00202000,0x20202000,
+ 0x00000020,0x20000020,0x00200020,0x20200020,
+ 0x00002020,0x20002020,0x00202020,0x20202020,
+ },{
+ 0x00000000,0x08000000,0x00080000,0x08080000,
+ 0x00000800,0x08000800,0x00080800,0x08080800,
+ 0x00000008,0x08000008,0x00080008,0x08080008,
+ 0x00000808,0x08000808,0x00080808,0x08080808,
+ },{
+ 0x00000000,0x02000000,0x00020000,0x02020000,
+ 0x00000200,0x02000200,0x00020200,0x02020200,
+ 0x00000002,0x02000002,0x00020002,0x02020002,
+ 0x00000202,0x02000202,0x00020202,0x02020202,
+ },
+};
+static const uint32_t fp_maskr[8][16] = {
+ {
+ 0x00000000,0x40000000,0x00400000,0x40400000,
+ 0x00004000,0x40004000,0x00404000,0x40404000,
+ 0x00000040,0x40000040,0x00400040,0x40400040,
+ 0x00004040,0x40004040,0x00404040,0x40404040,
+ },{
+ 0x00000000,0x10000000,0x00100000,0x10100000,
+ 0x00001000,0x10001000,0x00101000,0x10101000,
+ 0x00000010,0x10000010,0x00100010,0x10100010,
+ 0x00001010,0x10001010,0x00101010,0x10101010,
+ },{
+ 0x00000000,0x04000000,0x00040000,0x04040000,
+ 0x00000400,0x04000400,0x00040400,0x04040400,
+ 0x00000004,0x04000004,0x00040004,0x04040004,
+ 0x00000404,0x04000404,0x00040404,0x04040404,
+ },{
+ 0x00000000,0x01000000,0x00010000,0x01010000,
+ 0x00000100,0x01000100,0x00010100,0x01010100,
+ 0x00000001,0x01000001,0x00010001,0x01010001,
+ 0x00000101,0x01000101,0x00010101,0x01010101,
+ },{
+ 0x00000000,0x80000000,0x00800000,0x80800000,
+ 0x00008000,0x80008000,0x00808000,0x80808000,
+ 0x00000080,0x80000080,0x00800080,0x80800080,
+ 0x00008080,0x80008080,0x00808080,0x80808080,
+ },{
+ 0x00000000,0x20000000,0x00200000,0x20200000,
+ 0x00002000,0x20002000,0x00202000,0x20202000,
+ 0x00000020,0x20000020,0x00200020,0x20200020,
+ 0x00002020,0x20002020,0x00202020,0x20202020,
+ },{
+ 0x00000000,0x08000000,0x00080000,0x08080000,
+ 0x00000800,0x08000800,0x00080800,0x08080800,
+ 0x00000008,0x08000008,0x00080008,0x08080008,
+ 0x00000808,0x08000808,0x00080808,0x08080808,
+ },{
+ 0x00000000,0x02000000,0x00020000,0x02020000,
+ 0x00000200,0x02000200,0x00020200,0x02020200,
+ 0x00000002,0x02000002,0x00020002,0x02020002,
+ 0x00000202,0x02000202,0x00020202,0x02020202,
+ },
+};
+static const uint32_t key_perm_maskl[8][16] = {
+ {
+ 0x00000000,0x00000000,0x00000010,0x00000010,
+ 0x00001000,0x00001000,0x00001010,0x00001010,
+ 0x00100000,0x00100000,0x00100010,0x00100010,
+ 0x00101000,0x00101000,0x00101010,0x00101010,
+ },{
+ 0x00000000,0x00000000,0x00000020,0x00000020,
+ 0x00002000,0x00002000,0x00002020,0x00002020,
+ 0x00200000,0x00200000,0x00200020,0x00200020,
+ 0x00202000,0x00202000,0x00202020,0x00202020,
+ },{
+ 0x00000000,0x00000000,0x00000040,0x00000040,
+ 0x00004000,0x00004000,0x00004040,0x00004040,
+ 0x00400000,0x00400000,0x00400040,0x00400040,
+ 0x00404000,0x00404000,0x00404040,0x00404040,
+ },{
+ 0x00000000,0x00000000,0x00000080,0x00000080,
+ 0x00008000,0x00008000,0x00008080,0x00008080,
+ 0x00800000,0x00800000,0x00800080,0x00800080,
+ 0x00808000,0x00808000,0x00808080,0x00808080,
+ },{
+ 0x00000000,0x00000001,0x00000100,0x00000101,
+ 0x00010000,0x00010001,0x00010100,0x00010101,
+ 0x01000000,0x01000001,0x01000100,0x01000101,
+ 0x01010000,0x01010001,0x01010100,0x01010101,
+ },{
+ 0x00000000,0x00000002,0x00000200,0x00000202,
+ 0x00020000,0x00020002,0x00020200,0x00020202,
+ 0x02000000,0x02000002,0x02000200,0x02000202,
+ 0x02020000,0x02020002,0x02020200,0x02020202,
+ },{
+ 0x00000000,0x00000004,0x00000400,0x00000404,
+ 0x00040000,0x00040004,0x00040400,0x00040404,
+ 0x04000000,0x04000004,0x04000400,0x04000404,
+ 0x04040000,0x04040004,0x04040400,0x04040404,
+ },{
+ 0x00000000,0x00000008,0x00000800,0x00000808,
+ 0x00080000,0x00080008,0x00080800,0x00080808,
+ 0x08000000,0x08000008,0x08000800,0x08000808,
+ 0x08080000,0x08080008,0x08080800,0x08080808,
+ },
+};
+static const uint32_t key_perm_maskr[12][16] = {
+ {
+ 0x00000000,0x00000001,0x00000000,0x00000001,
+ 0x00000000,0x00000001,0x00000000,0x00000001,
+ 0x00000000,0x00000001,0x00000000,0x00000001,
+ 0x00000000,0x00000001,0x00000000,0x00000001,
+ },{
+ 0x00000000,0x00000000,0x00100000,0x00100000,
+ 0x00001000,0x00001000,0x00101000,0x00101000,
+ 0x00000010,0x00000010,0x00100010,0x00100010,
+ 0x00001010,0x00001010,0x00101010,0x00101010,
+ },{
+ 0x00000000,0x00000002,0x00000000,0x00000002,
+ 0x00000000,0x00000002,0x00000000,0x00000002,
+ 0x00000000,0x00000002,0x00000000,0x00000002,
+ 0x00000000,0x00000002,0x00000000,0x00000002,
+ },{
+ 0x00000000,0x00000000,0x00200000,0x00200000,
+ 0x00002000,0x00002000,0x00202000,0x00202000,
+ 0x00000020,0x00000020,0x00200020,0x00200020,
+ 0x00002020,0x00002020,0x00202020,0x00202020,
+ },{
+ 0x00000000,0x00000004,0x00000000,0x00000004,
+ 0x00000000,0x00000004,0x00000000,0x00000004,
+ 0x00000000,0x00000004,0x00000000,0x00000004,
+ 0x00000000,0x00000004,0x00000000,0x00000004,
+ },{
+ 0x00000000,0x00000000,0x00400000,0x00400000,
+ 0x00004000,0x00004000,0x00404000,0x00404000,
+ 0x00000040,0x00000040,0x00400040,0x00400040,
+ 0x00004040,0x00004040,0x00404040,0x00404040,
+ },{
+ 0x00000000,0x00000008,0x00000000,0x00000008,
+ 0x00000000,0x00000008,0x00000000,0x00000008,
+ 0x00000000,0x00000008,0x00000000,0x00000008,
+ 0x00000000,0x00000008,0x00000000,0x00000008,
+ },{
+ 0x00000000,0x00000000,0x00800000,0x00800000,
+ 0x00008000,0x00008000,0x00808000,0x00808000,
+ 0x00000080,0x00000080,0x00800080,0x00800080,
+ 0x00008080,0x00008080,0x00808080,0x00808080,
+ },{
+ 0x00000000,0x00000000,0x01000000,0x01000000,
+ 0x00010000,0x00010000,0x01010000,0x01010000,
+ 0x00000100,0x00000100,0x01000100,0x01000100,
+ 0x00010100,0x00010100,0x01010100,0x01010100,
+ },{
+ 0x00000000,0x00000000,0x02000000,0x02000000,
+ 0x00020000,0x00020000,0x02020000,0x02020000,
+ 0x00000200,0x00000200,0x02000200,0x02000200,
+ 0x00020200,0x00020200,0x02020200,0x02020200,
+ },{
+ 0x00000000,0x00000000,0x04000000,0x04000000,
+ 0x00040000,0x00040000,0x04040000,0x04040000,
+ 0x00000400,0x00000400,0x04000400,0x04000400,
+ 0x00040400,0x00040400,0x04040400,0x04040400,
+ },{
+ 0x00000000,0x00000000,0x08000000,0x08000000,
+ 0x00080000,0x00080000,0x08080000,0x08080000,
+ 0x00000800,0x00000800,0x08000800,0x08000800,
+ 0x00080800,0x00080800,0x08080800,0x08080800,
+ },
+};
+static const uint32_t comp_maskl0[4][8] = {
+ {
+ 0x00000000,0x00020000,0x00000001,0x00020001,
+ 0x00080000,0x000a0000,0x00080001,0x000a0001,
+ },{
+ 0x00000000,0x00001000,0x00000000,0x00001000,
+ 0x00000040,0x00001040,0x00000040,0x00001040,
+ },{
+ 0x00000000,0x00400000,0x00000020,0x00400020,
+ 0x00008000,0x00408000,0x00008020,0x00408020,
+ },{
+ 0x00000000,0x00100000,0x00000800,0x00100800,
+ 0x00000000,0x00100000,0x00000800,0x00100800,
+ },
+};
+static const uint32_t comp_maskr0[4][8] = {
+ {
+ 0x00000000,0x00200000,0x00020000,0x00220000,
+ 0x00000002,0x00200002,0x00020002,0x00220002,
+ },{
+ 0x00000000,0x00000000,0x00100000,0x00100000,
+ 0x00000004,0x00000004,0x00100004,0x00100004,
+ },{
+ 0x00000000,0x00004000,0x00000800,0x00004800,
+ 0x00000000,0x00004000,0x00000800,0x00004800,
+ },{
+ 0x00000000,0x00400000,0x00008000,0x00408000,
+ 0x00000008,0x00400008,0x00008008,0x00408008,
+ },
+};
+static const uint32_t comp_maskl1[4][16] = {
+ {
+ 0x00000000,0x00000010,0x00004000,0x00004010,
+ 0x00040000,0x00040010,0x00044000,0x00044010,
+ 0x00000100,0x00000110,0x00004100,0x00004110,
+ 0x00040100,0x00040110,0x00044100,0x00044110,
+ },{
+ 0x00000000,0x00800000,0x00000002,0x00800002,
+ 0x00000200,0x00800200,0x00000202,0x00800202,
+ 0x00200000,0x00a00000,0x00200002,0x00a00002,
+ 0x00200200,0x00a00200,0x00200202,0x00a00202,
+ },{
+ 0x00000000,0x00002000,0x00000004,0x00002004,
+ 0x00000400,0x00002400,0x00000404,0x00002404,
+ 0x00000000,0x00002000,0x00000004,0x00002004,
+ 0x00000400,0x00002400,0x00000404,0x00002404,
+ },{
+ 0x00000000,0x00010000,0x00000008,0x00010008,
+ 0x00000080,0x00010080,0x00000088,0x00010088,
+ 0x00000000,0x00010000,0x00000008,0x00010008,
+ 0x00000080,0x00010080,0x00000088,0x00010088,
+ },
+};
+static const uint32_t comp_maskr1[4][16] = {
+ {
+ 0x00000000,0x00000000,0x00000080,0x00000080,
+ 0x00002000,0x00002000,0x00002080,0x00002080,
+ 0x00000001,0x00000001,0x00000081,0x00000081,
+ 0x00002001,0x00002001,0x00002081,0x00002081,
+ },{
+ 0x00000000,0x00000010,0x00800000,0x00800010,
+ 0x00010000,0x00010010,0x00810000,0x00810010,
+ 0x00000200,0x00000210,0x00800200,0x00800210,
+ 0x00010200,0x00010210,0x00810200,0x00810210,
+ },{
+ 0x00000000,0x00000400,0x00001000,0x00001400,
+ 0x00080000,0x00080400,0x00081000,0x00081400,
+ 0x00000020,0x00000420,0x00001020,0x00001420,
+ 0x00080020,0x00080420,0x00081020,0x00081420,
+ },{
+ 0x00000000,0x00000100,0x00040000,0x00040100,
+ 0x00000000,0x00000100,0x00040000,0x00040100,
+ 0x00000040,0x00000140,0x00040040,0x00040140,
+ 0x00000040,0x00000140,0x00040040,0x00040140,
+ },
+};
+
+static const unsigned char ascii64[] =
+ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+/* 0000000000111111111122222222223333333333444444444455555555556666 */
+/* 0123456789012345678901234567890123456789012345678901234567890123 */
+
+/*
+ * We match the behavior of UFC-crypt on systems where "char" is signed by
+ * default (the majority), regardless of char's signedness on our system.
+ */
+static uint32_t ascii_to_bin(int ch)
+{
+ int sch = (ch < 0x80) ? ch : -(0x100 - ch);
+ int retval;
+
+ retval = sch - '.';
+ if (sch >= 'A') {
+ retval = sch - ('A' - 12);
+ if (sch >= 'a')
+ retval = sch - ('a' - 38);
+ }
+ retval &= 0x3f;
+
+ return retval;
+}
+
+/*
+ * When we choose to "support" invalid salts, nevertheless disallow those
+ * containing characters that would violate the passwd file format.
+ */
+static inline int ascii_is_unsafe(unsigned char ch)
+{
+ return !ch || ch == '\n' || ch == ':';
+}
+
+static uint32_t setup_salt(uint32_t salt)
+{
+ uint32_t obit, saltbit, saltbits;
+ unsigned int i;
+
+ saltbits = 0;
+ saltbit = 1;
+ obit = 0x800000;
+ for (i = 0; i < 24; i++) {
+ if (salt & saltbit)
+ saltbits |= obit;
+ saltbit <<= 1;
+ obit >>= 1;
+ }
+
+ return saltbits;
+}
+
+void __des_setkey(const unsigned char *key, struct expanded_key *ekey)
+{
+ uint32_t k0, k1, rawkey0, rawkey1;
+ unsigned int shifts, round, i, ibit;
+
+ rawkey0 =
+ (uint32_t)key[3] |
+ ((uint32_t)key[2] << 8) |
+ ((uint32_t)key[1] << 16) |
+ ((uint32_t)key[0] << 24);
+ rawkey1 =
+ (uint32_t)key[7] |
+ ((uint32_t)key[6] << 8) |
+ ((uint32_t)key[5] << 16) |
+ ((uint32_t)key[4] << 24);
+
+ /*
+ * Do key permutation and split into two 28-bit subkeys.
+ */
+ k0 = k1 = 0;
+ for (i = 0, ibit = 28; i < 4; i++, ibit -= 4) {
+ unsigned int j = i << 1;
+ k0 |= key_perm_maskl[i][(rawkey0 >> ibit) & 0xf] |
+ key_perm_maskl[i + 4][(rawkey1 >> ibit) & 0xf];
+ k1 |= key_perm_maskr[j][(rawkey0 >> ibit) & 0xf];
+ ibit -= 4;
+ k1 |= key_perm_maskr[j + 1][(rawkey0 >> ibit) & 0xf] |
+ key_perm_maskr[i + 8][(rawkey1 >> ibit) & 0xf];
+ }
+
+ /*
+ * Rotate subkeys and do compression permutation.
+ */
+ shifts = 0;
+ for (round = 0; round < 16; round++) {
+ uint32_t t0, t1;
+ uint32_t kl, kr;
+
+ shifts += key_shifts[round];
+
+ t0 = (k0 << shifts) | (k0 >> (28 - shifts));
+ t1 = (k1 << shifts) | (k1 >> (28 - shifts));
+
+ kl = kr = 0;
+ ibit = 25;
+ for (i = 0; i < 4; i++) {
+ kl |= comp_maskl0[i][(t0 >> ibit) & 7];
+ kr |= comp_maskr0[i][(t1 >> ibit) & 7];
+ ibit -= 4;
+ kl |= comp_maskl1[i][(t0 >> ibit) & 0xf];
+ kr |= comp_maskr1[i][(t1 >> ibit) & 0xf];
+ ibit -= 3;
+ }
+ ekey->l[round] = kl;
+ ekey->r[round] = kr;
+ }
+}
+
+/*
+ * l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format.
+ */
+void __do_des(uint32_t l_in, uint32_t r_in,
+ uint32_t *l_out, uint32_t *r_out,
+ uint32_t count, uint32_t saltbits, const struct expanded_key *ekey)
+{
+ uint32_t l, r;
+
+ /*
+ * Do initial permutation (IP).
+ */
+ l = r = 0;
+ if (l_in | r_in) {
+ unsigned int i, ibit;
+ for (i = 0, ibit = 28; i < 8; i++, ibit -= 4) {
+ l |= ip_maskl[i][(l_in >> ibit) & 0xf] |
+ ip_maskl[i + 8][(r_in >> ibit) & 0xf];
+ r |= ip_maskr[i][(l_in >> ibit) & 0xf] |
+ ip_maskr[i + 8][(r_in >> ibit) & 0xf];
+ }
+ }
+
+ while (count--) {
+ /*
+ * Do each round.
+ */
+ unsigned int round = 16;
+ const uint32_t *kl = ekey->l;
+ const uint32_t *kr = ekey->r;
+ uint32_t f;
+ while (round--) {
+ uint32_t r48l, r48r;
+ /*
+ * Expand R to 48 bits (simulate the E-box).
+ */
+ r48l = ((r & 0x00000001) << 23)
+ | ((r & 0xf8000000) >> 9)
+ | ((r & 0x1f800000) >> 11)
+ | ((r & 0x01f80000) >> 13)
+ | ((r & 0x001f8000) >> 15);
+
+ r48r = ((r & 0x0001f800) << 7)
+ | ((r & 0x00001f80) << 5)
+ | ((r & 0x000001f8) << 3)
+ | ((r & 0x0000001f) << 1)
+ | ((r & 0x80000000) >> 31);
+ /*
+ * Do salting for crypt() and friends, and
+ * XOR with the permuted key.
+ */
+ f = (r48l ^ r48r) & saltbits;
+ r48l ^= f ^ *kl++;
+ r48r ^= f ^ *kr++;
+ /*
+ * Do S-box lookups (which shrink it back to 32 bits)
+ * and do the P-box permutation at the same time.
+ */
+ f = psbox[0][r48l >> 18]
+ | psbox[1][(r48l >> 12) & 0x3f]
+ | psbox[2][(r48l >> 6) & 0x3f]
+ | psbox[3][r48l & 0x3f]
+ | psbox[4][r48r >> 18]
+ | psbox[5][(r48r >> 12) & 0x3f]
+ | psbox[6][(r48r >> 6) & 0x3f]
+ | psbox[7][r48r & 0x3f];
+ /*
+ * Now that we've permuted things, complete f().
+ */
+ f ^= l;
+ l = r;
+ r = f;
+ }
+ r = l;
+ l = f;
+ }
+
+ /*
+ * Do final permutation (inverse of IP).
+ */
+ {
+ unsigned int i, ibit;
+ uint32_t lo, ro;
+ lo = ro = 0;
+ for (i = 0, ibit = 28; i < 4; i++, ibit -= 4) {
+ ro |= fp_maskr[i][(l >> ibit) & 0xf] |
+ fp_maskr[i + 4][(r >> ibit) & 0xf];
+ ibit -= 4;
+ lo |= fp_maskl[i][(l >> ibit) & 0xf] |
+ fp_maskl[i + 4][(r >> ibit) & 0xf];
+ }
+ *l_out = lo;
+ *r_out = ro;
+ }
+}
+
+static void des_cipher(const unsigned char *in, unsigned char *out,
+ uint32_t count, uint32_t saltbits, const struct expanded_key *ekey)
+{
+ uint32_t l_out, r_out, rawl, rawr;
+
+ rawl =
+ (uint32_t)in[3] |
+ ((uint32_t)in[2] << 8) |
+ ((uint32_t)in[1] << 16) |
+ ((uint32_t)in[0] << 24);
+ rawr =
+ (uint32_t)in[7] |
+ ((uint32_t)in[6] << 8) |
+ ((uint32_t)in[5] << 16) |
+ ((uint32_t)in[4] << 24);
+
+ __do_des(rawl, rawr, &l_out, &r_out, count, saltbits, ekey);
+
+ out[0] = l_out >> 24;
+ out[1] = l_out >> 16;
+ out[2] = l_out >> 8;
+ out[3] = l_out;
+ out[4] = r_out >> 24;
+ out[5] = r_out >> 16;
+ out[6] = r_out >> 8;
+ out[7] = r_out;
+}
+
+static char *_crypt_extended_r_uut(const char *_key, const char *_setting, char *output)
+{
+ const unsigned char *key = (const unsigned char *)_key;
+ const unsigned char *setting = (const unsigned char *)_setting;
+ struct expanded_key ekey;
+ unsigned char keybuf[8];
+ unsigned char *p, *q;
+ uint32_t count, salt, l, r0, r1;
+ unsigned int i;
+
+ /*
+ * Copy the key, shifting each character left by one bit and padding
+ * with zeroes.
+ */
+ q = keybuf;
+ while (q <= &keybuf[sizeof(keybuf) - 1]) {
+ *q++ = *key << 1;
+ if (*key)
+ key++;
+ }
+ __des_setkey(keybuf, &ekey);
+
+ if (*setting == _PASSWORD_EFMT1) {
+ /*
+ * "new"-style:
+ * setting - underscore, 4 chars of count, 4 chars of salt
+ * key - unlimited characters
+ */
+ for (i = 1, count = 0; i < 5; i++) {
+ uint32_t value = ascii_to_bin(setting[i]);
+ if (ascii64[value] != setting[i])
+ return NULL;
+ count |= value << (i - 1) * 6;
+ }
+ if (!count)
+ return NULL;
+
+ for (i = 5, salt = 0; i < 9; i++) {
+ uint32_t value = ascii_to_bin(setting[i]);
+ if (ascii64[value] != setting[i])
+ return NULL;
+ salt |= value << (i - 5) * 6;
+ }
+
+ while (*key) {
+ /*
+ * Encrypt the key with itself.
+ */
+ des_cipher(keybuf, keybuf, 1, 0, &ekey);
+ /*
+ * And XOR with the next 8 characters of the key.
+ */
+ q = keybuf;
+ while (q <= &keybuf[sizeof(keybuf) - 1] && *key)
+ *q++ ^= *key++ << 1;
+ __des_setkey(keybuf, &ekey);
+ }
+
+ memcpy(output, setting, 9);
+ output[9] = '\0';
+ p = (unsigned char *)output + 9;
+ } else {
+ /*
+ * "old"-style:
+ * setting - 2 chars of salt
+ * key - up to 8 characters
+ */
+ count = 25;
+
+ if (ascii_is_unsafe(setting[0]) || ascii_is_unsafe(setting[1]))
+ return NULL;
+
+ salt = (ascii_to_bin(setting[1]) << 6)
+ | ascii_to_bin(setting[0]);
+
+ output[0] = setting[0];
+ output[1] = setting[1];
+ p = (unsigned char *)output + 2;
+ }
+
+ /*
+ * Do it.
+ */
+ __do_des(0, 0, &r0, &r1, count, setup_salt(salt), &ekey);
+
+ /*
+ * Now encode the result...
+ */
+ l = (r0 >> 8);
+ *p++ = ascii64[(l >> 18) & 0x3f];
+ *p++ = ascii64[(l >> 12) & 0x3f];
+ *p++ = ascii64[(l >> 6) & 0x3f];
+ *p++ = ascii64[l & 0x3f];
+
+ l = (r0 << 16) | ((r1 >> 16) & 0xffff);
+ *p++ = ascii64[(l >> 18) & 0x3f];
+ *p++ = ascii64[(l >> 12) & 0x3f];
+ *p++ = ascii64[(l >> 6) & 0x3f];
+ *p++ = ascii64[l & 0x3f];
+
+ l = r1 << 2;
+ *p++ = ascii64[(l >> 12) & 0x3f];
+ *p++ = ascii64[(l >> 6) & 0x3f];
+ *p++ = ascii64[l & 0x3f];
+ *p = 0;
+
+ return output;
+}
+
+char *__crypt_des(const char *key, const char *setting, char *output)
+{
+ const char *test_key = "\x80\xff\x80\x01 "
+ "\x7f\x81\x80\x80\x0d\x0a\xff\x7f \x81 test";
+ const char *test_setting = "_0.../9Zz";
+ const char *test_hash = "_0.../9ZzX7iSJNd21sU";
+ char test_buf[21];
+ char *retval;
+ const char *p;
+
+ if (*setting != _PASSWORD_EFMT1) {
+ test_setting = "\x80x";
+ test_hash = "\x80x22/wK52ZKGA";
+ }
+
+ /*
+ * Hash the supplied password.
+ */
+ retval = _crypt_extended_r_uut(key, setting, output);
+
+ /*
+ * Perform a quick self-test. It is important that we make both calls
+ * to _crypt_extended_r_uut() from the same scope such that they likely
+ * use the same stack locations, which makes the second call overwrite
+ * the first call's sensitive data on the stack and makes it more
+ * likely that any alignment related issues would be detected.
+ */
+ p = _crypt_extended_r_uut(test_key, test_setting, test_buf);
+ if (p && !strcmp(p, test_hash) && retval)
+ return retval;
+
+ return (setting[0]=='*') ? "x" : "*";
+}
diff --git a/libc-top-half/musl/src/crypt/crypt_des.h b/libc-top-half/musl/src/crypt/crypt_des.h
new file mode 100644
index 0000000..96748b5
--- /dev/null
+++ b/libc-top-half/musl/src/crypt/crypt_des.h
@@ -0,0 +1,14 @@
+#ifndef CRYPT_DES_H
+#define CRYPT_DES_H
+
+#include <stdint.h>
+
+struct expanded_key {
+ uint32_t l[16], r[16];
+};
+
+hidden void __des_setkey(const unsigned char *, struct expanded_key *);
+hidden void __do_des(uint32_t, uint32_t, uint32_t *, uint32_t *,
+ uint32_t, uint32_t, const struct expanded_key *);
+
+#endif
diff --git a/libc-top-half/musl/src/crypt/crypt_md5.c b/libc-top-half/musl/src/crypt/crypt_md5.c
new file mode 100644
index 0000000..6e75b36
--- /dev/null
+++ b/libc-top-half/musl/src/crypt/crypt_md5.c
@@ -0,0 +1,285 @@
+/*
+ * md5 crypt implementation
+ *
+ * original md5 crypt design is from Poul-Henning Kamp
+ * this implementation was created based on the code in freebsd
+ * at least 32bit int is assumed, key is limited and $1$ prefix is mandatory,
+ * on error "*" is returned
+ */
+#include <string.h>
+#include <stdint.h>
+
+/* public domain md5 implementation based on rfc1321 and libtomcrypt */
+
+struct md5 {
+ uint64_t len; /* processed message length */
+ uint32_t h[4]; /* hash state */
+ uint8_t buf[64]; /* message block buffer */
+};
+
+static uint32_t rol(uint32_t n, int k) { return (n << k) | (n >> (32-k)); }
+#define F(x,y,z) (z ^ (x & (y ^ z)))
+#define G(x,y,z) (y ^ (z & (y ^ x)))
+#define H(x,y,z) (x ^ y ^ z)
+#define I(x,y,z) (y ^ (x | ~z))
+#define FF(a,b,c,d,w,s,t) a += F(b,c,d) + w + t; a = rol(a,s) + b
+#define GG(a,b,c,d,w,s,t) a += G(b,c,d) + w + t; a = rol(a,s) + b
+#define HH(a,b,c,d,w,s,t) a += H(b,c,d) + w + t; a = rol(a,s) + b
+#define II(a,b,c,d,w,s,t) a += I(b,c,d) + w + t; a = rol(a,s) + b
+
+static const uint32_t tab[64] = {
+0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
+0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
+0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
+0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
+0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
+0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
+0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
+0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
+};
+
+static void processblock(struct md5 *s, const uint8_t *buf)
+{
+ uint32_t i, W[16], a, b, c, d;
+
+ for (i = 0; i < 16; i++) {
+ W[i] = buf[4*i];
+ W[i] |= (uint32_t)buf[4*i+1]<<8;
+ W[i] |= (uint32_t)buf[4*i+2]<<16;
+ W[i] |= (uint32_t)buf[4*i+3]<<24;
+ }
+
+ a = s->h[0];
+ b = s->h[1];
+ c = s->h[2];
+ d = s->h[3];
+
+ i = 0;
+ while (i < 16) {
+ FF(a,b,c,d, W[i], 7, tab[i]); i++;
+ FF(d,a,b,c, W[i], 12, tab[i]); i++;
+ FF(c,d,a,b, W[i], 17, tab[i]); i++;
+ FF(b,c,d,a, W[i], 22, tab[i]); i++;
+ }
+ while (i < 32) {
+ GG(a,b,c,d, W[(5*i+1)%16], 5, tab[i]); i++;
+ GG(d,a,b,c, W[(5*i+1)%16], 9, tab[i]); i++;
+ GG(c,d,a,b, W[(5*i+1)%16], 14, tab[i]); i++;
+ GG(b,c,d,a, W[(5*i+1)%16], 20, tab[i]); i++;
+ }
+ while (i < 48) {
+ HH(a,b,c,d, W[(3*i+5)%16], 4, tab[i]); i++;
+ HH(d,a,b,c, W[(3*i+5)%16], 11, tab[i]); i++;
+ HH(c,d,a,b, W[(3*i+5)%16], 16, tab[i]); i++;
+ HH(b,c,d,a, W[(3*i+5)%16], 23, tab[i]); i++;
+ }
+ while (i < 64) {
+ II(a,b,c,d, W[7*i%16], 6, tab[i]); i++;
+ II(d,a,b,c, W[7*i%16], 10, tab[i]); i++;
+ II(c,d,a,b, W[7*i%16], 15, tab[i]); i++;
+ II(b,c,d,a, W[7*i%16], 21, tab[i]); i++;
+ }
+
+ s->h[0] += a;
+ s->h[1] += b;
+ s->h[2] += c;
+ s->h[3] += d;
+}
+
+static void pad(struct md5 *s)
+{
+ unsigned r = s->len % 64;
+
+ s->buf[r++] = 0x80;
+ if (r > 56) {
+ memset(s->buf + r, 0, 64 - r);
+ r = 0;
+ processblock(s, s->buf);
+ }
+ memset(s->buf + r, 0, 56 - r);
+ s->len *= 8;
+ s->buf[56] = s->len;
+ s->buf[57] = s->len >> 8;
+ s->buf[58] = s->len >> 16;
+ s->buf[59] = s->len >> 24;
+ s->buf[60] = s->len >> 32;
+ s->buf[61] = s->len >> 40;
+ s->buf[62] = s->len >> 48;
+ s->buf[63] = s->len >> 56;
+ processblock(s, s->buf);
+}
+
+static void md5_init(struct md5 *s)
+{
+ s->len = 0;
+ s->h[0] = 0x67452301;
+ s->h[1] = 0xefcdab89;
+ s->h[2] = 0x98badcfe;
+ s->h[3] = 0x10325476;
+}
+
+static void md5_sum(struct md5 *s, uint8_t *md)
+{
+ int i;
+
+ pad(s);
+ for (i = 0; i < 4; i++) {
+ md[4*i] = s->h[i];
+ md[4*i+1] = s->h[i] >> 8;
+ md[4*i+2] = s->h[i] >> 16;
+ md[4*i+3] = s->h[i] >> 24;
+ }
+}
+
+static void md5_update(struct md5 *s, const void *m, unsigned long len)
+{
+ const uint8_t *p = m;
+ unsigned r = s->len % 64;
+
+ s->len += len;
+ if (r) {
+ if (len < 64 - r) {
+ memcpy(s->buf + r, p, len);
+ return;
+ }
+ memcpy(s->buf + r, p, 64 - r);
+ len -= 64 - r;
+ p += 64 - r;
+ processblock(s, s->buf);
+ }
+ for (; len >= 64; len -= 64, p += 64)
+ processblock(s, p);
+ memcpy(s->buf, p, len);
+}
+
+/*-
+ * Copyright (c) 2003 Poul-Henning Kamp
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* key limit is not part of the original design, added for DoS protection */
+#define KEY_MAX 30000
+#define SALT_MAX 8
+
+static const unsigned char b64[] =
+"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+static char *to64(char *s, unsigned int u, int n)
+{
+ while (--n >= 0) {
+ *s++ = b64[u % 64];
+ u /= 64;
+ }
+ return s;
+}
+
+static char *md5crypt(const char *key, const char *setting, char *output)
+{
+ struct md5 ctx;
+ unsigned char md[16];
+ unsigned int i, klen, slen;
+ const char *salt;
+ char *p;
+
+ /* reject large keys */
+ klen = strnlen(key, KEY_MAX+1);
+ if (klen > KEY_MAX)
+ return 0;
+
+ /* setting: $1$salt$ (closing $ is optional) */
+ if (strncmp(setting, "$1$", 3) != 0)
+ return 0;
+ salt = setting + 3;
+ for (i = 0; i < SALT_MAX && salt[i] && salt[i] != '$'; i++);
+ slen = i;
+
+ /* md5(key salt key) */
+ md5_init(&ctx);
+ md5_update(&ctx, key, klen);
+ md5_update(&ctx, salt, slen);
+ md5_update(&ctx, key, klen);
+ md5_sum(&ctx, md);
+
+ /* md5(key $1$ salt repeated-md weird-key[0]-0) */
+ md5_init(&ctx);
+ md5_update(&ctx, key, klen);
+ md5_update(&ctx, setting, 3 + slen);
+ for (i = klen; i > sizeof md; i -= sizeof md)
+ md5_update(&ctx, md, sizeof md);
+ md5_update(&ctx, md, i);
+ md[0] = 0;
+ for (i = klen; i; i >>= 1)
+ if (i & 1)
+ md5_update(&ctx, md, 1);
+ else
+ md5_update(&ctx, key, 1);
+ md5_sum(&ctx, md);
+
+ /* md = f(md, key, salt) iteration */
+ for (i = 0; i < 1000; i++) {
+ md5_init(&ctx);
+ if (i % 2)
+ md5_update(&ctx, key, klen);
+ else
+ md5_update(&ctx, md, sizeof md);
+ if (i % 3)
+ md5_update(&ctx, salt, slen);
+ if (i % 7)
+ md5_update(&ctx, key, klen);
+ if (i % 2)
+ md5_update(&ctx, md, sizeof md);
+ else
+ md5_update(&ctx, key, klen);
+ md5_sum(&ctx, md);
+ }
+
+ /* output is $1$salt$hash */
+ memcpy(output, setting, 3 + slen);
+ p = output + 3 + slen;
+ *p++ = '$';
+ static const unsigned char perm[][3] = {
+ 0,6,12,1,7,13,2,8,14,3,9,15,4,10,5 };
+ for (i=0; i<5; i++) p = to64(p,
+ (md[perm[i][0]]<<16)|(md[perm[i][1]]<<8)|md[perm[i][2]], 4);
+ p = to64(p, md[11], 2);
+ *p = 0;
+
+ return output;
+}
+
+char *__crypt_md5(const char *key, const char *setting, char *output)
+{
+ static const char testkey[] = "Xy01@#\x01\x02\x80\x7f\xff\r\n\x81\t !";
+ static const char testsetting[] = "$1$abcd0123$";
+ static const char testhash[] = "$1$abcd0123$9Qcg8DyviekV3tDGMZynJ1";
+ char testbuf[64];
+ char *p, *q;
+
+ p = md5crypt(key, setting, output);
+ /* self test and stack cleanup */
+ q = md5crypt(testkey, testsetting, testbuf);
+ if (!p || q != testbuf || memcmp(testbuf, testhash, sizeof testhash))
+ return "*";
+ return p;
+}
diff --git a/libc-top-half/musl/src/crypt/crypt_r.c b/libc-top-half/musl/src/crypt/crypt_r.c
new file mode 100644
index 0000000..db6015e
--- /dev/null
+++ b/libc-top-half/musl/src/crypt/crypt_r.c
@@ -0,0 +1,23 @@
+#include <crypt.h>
+
+char *__crypt_r(const char *key, const char *salt, struct crypt_data *data)
+{
+ /* Per the crypt_r API, the caller has provided a pointer to
+ * struct crypt_data; however, this implementation does not
+ * use the structure to store any internal state, and treats
+ * it purely as a char buffer for storing the result. */
+ char *output = (char *)data;
+ if (salt[0] == '$' && salt[1] && salt[2]) {
+ if (salt[1] == '1' && salt[2] == '$')
+ return __crypt_md5(key, salt, output);
+ if (salt[1] == '2' && salt[3] == '$')
+ return __crypt_blowfish(key, salt, output);
+ if (salt[1] == '5' && salt[2] == '$')
+ return __crypt_sha256(key, salt, output);
+ if (salt[1] == '6' && salt[2] == '$')
+ return __crypt_sha512(key, salt, output);
+ }
+ return __crypt_des(key, salt, output);
+}
+
+weak_alias(__crypt_r, crypt_r);
diff --git a/libc-top-half/musl/src/crypt/crypt_sha256.c b/libc-top-half/musl/src/crypt/crypt_sha256.c
new file mode 100644
index 0000000..e885dc6
--- /dev/null
+++ b/libc-top-half/musl/src/crypt/crypt_sha256.c
@@ -0,0 +1,322 @@
+/*
+ * public domain sha256 crypt implementation
+ *
+ * original sha crypt design: http://people.redhat.com/drepper/SHA-crypt.txt
+ * in this implementation at least 32bit int is assumed,
+ * key length is limited, the $5$ prefix is mandatory, '\n' and ':' is rejected
+ * in the salt and rounds= setting must contain a valid iteration count,
+ * on error "*" is returned.
+ */
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+
+/* public domain sha256 implementation based on fips180-3 */
+
+struct sha256 {
+ uint64_t len; /* processed message length */
+ uint32_t h[8]; /* hash state */
+ uint8_t buf[64]; /* message block buffer */
+};
+
+static uint32_t ror(uint32_t n, int k) { return (n >> k) | (n << (32-k)); }
+#define Ch(x,y,z) (z ^ (x & (y ^ z)))
+#define Maj(x,y,z) ((x & y) | (z & (x | y)))
+#define S0(x) (ror(x,2) ^ ror(x,13) ^ ror(x,22))
+#define S1(x) (ror(x,6) ^ ror(x,11) ^ ror(x,25))
+#define R0(x) (ror(x,7) ^ ror(x,18) ^ (x>>3))
+#define R1(x) (ror(x,17) ^ ror(x,19) ^ (x>>10))
+
+static const uint32_t K[64] = {
+0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+};
+
+static void processblock(struct sha256 *s, const uint8_t *buf)
+{
+ uint32_t W[64], t1, t2, a, b, c, d, e, f, g, h;
+ int i;
+
+ for (i = 0; i < 16; i++) {
+ W[i] = (uint32_t)buf[4*i]<<24;
+ W[i] |= (uint32_t)buf[4*i+1]<<16;
+ W[i] |= (uint32_t)buf[4*i+2]<<8;
+ W[i] |= buf[4*i+3];
+ }
+ for (; i < 64; i++)
+ W[i] = R1(W[i-2]) + W[i-7] + R0(W[i-15]) + W[i-16];
+ a = s->h[0];
+ b = s->h[1];
+ c = s->h[2];
+ d = s->h[3];
+ e = s->h[4];
+ f = s->h[5];
+ g = s->h[6];
+ h = s->h[7];
+ for (i = 0; i < 64; i++) {
+ t1 = h + S1(e) + Ch(e,f,g) + K[i] + W[i];
+ t2 = S0(a) + Maj(a,b,c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + t1;
+ d = c;
+ c = b;
+ b = a;
+ a = t1 + t2;
+ }
+ s->h[0] += a;
+ s->h[1] += b;
+ s->h[2] += c;
+ s->h[3] += d;
+ s->h[4] += e;
+ s->h[5] += f;
+ s->h[6] += g;
+ s->h[7] += h;
+}
+
+static void pad(struct sha256 *s)
+{
+ unsigned r = s->len % 64;
+
+ s->buf[r++] = 0x80;
+ if (r > 56) {
+ memset(s->buf + r, 0, 64 - r);
+ r = 0;
+ processblock(s, s->buf);
+ }
+ memset(s->buf + r, 0, 56 - r);
+ s->len *= 8;
+ s->buf[56] = s->len >> 56;
+ s->buf[57] = s->len >> 48;
+ s->buf[58] = s->len >> 40;
+ s->buf[59] = s->len >> 32;
+ s->buf[60] = s->len >> 24;
+ s->buf[61] = s->len >> 16;
+ s->buf[62] = s->len >> 8;
+ s->buf[63] = s->len;
+ processblock(s, s->buf);
+}
+
+static void sha256_init(struct sha256 *s)
+{
+ s->len = 0;
+ s->h[0] = 0x6a09e667;
+ s->h[1] = 0xbb67ae85;
+ s->h[2] = 0x3c6ef372;
+ s->h[3] = 0xa54ff53a;
+ s->h[4] = 0x510e527f;
+ s->h[5] = 0x9b05688c;
+ s->h[6] = 0x1f83d9ab;
+ s->h[7] = 0x5be0cd19;
+}
+
+static void sha256_sum(struct sha256 *s, uint8_t *md)
+{
+ int i;
+
+ pad(s);
+ for (i = 0; i < 8; i++) {
+ md[4*i] = s->h[i] >> 24;
+ md[4*i+1] = s->h[i] >> 16;
+ md[4*i+2] = s->h[i] >> 8;
+ md[4*i+3] = s->h[i];
+ }
+}
+
+static void sha256_update(struct sha256 *s, const void *m, unsigned long len)
+{
+ const uint8_t *p = m;
+ unsigned r = s->len % 64;
+
+ s->len += len;
+ if (r) {
+ if (len < 64 - r) {
+ memcpy(s->buf + r, p, len);
+ return;
+ }
+ memcpy(s->buf + r, p, 64 - r);
+ len -= 64 - r;
+ p += 64 - r;
+ processblock(s, s->buf);
+ }
+ for (; len >= 64; len -= 64, p += 64)
+ processblock(s, p);
+ memcpy(s->buf, p, len);
+}
+
+static const unsigned char b64[] =
+"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+static char *to64(char *s, unsigned int u, int n)
+{
+ while (--n >= 0) {
+ *s++ = b64[u % 64];
+ u /= 64;
+ }
+ return s;
+}
+
+/* key limit is not part of the original design, added for DoS protection.
+ * rounds limit has been lowered (versus the reference/spec), also for DoS
+ * protection. runtime is O(klen^2 + klen*rounds) */
+#define KEY_MAX 256
+#define SALT_MAX 16
+#define ROUNDS_DEFAULT 5000
+#define ROUNDS_MIN 1000
+#define ROUNDS_MAX 9999999
+
+/* hash n bytes of the repeated md message digest */
+static void hashmd(struct sha256 *s, unsigned int n, const void *md)
+{
+ unsigned int i;
+
+ for (i = n; i > 32; i -= 32)
+ sha256_update(s, md, 32);
+ sha256_update(s, md, i);
+}
+
+static char *sha256crypt(const char *key, const char *setting, char *output)
+{
+ struct sha256 ctx;
+ unsigned char md[32], kmd[32], smd[32];
+ unsigned int i, r, klen, slen;
+ char rounds[20] = "";
+ const char *salt;
+ char *p;
+
+ /* reject large keys */
+ klen = strnlen(key, KEY_MAX+1);
+ if (klen > KEY_MAX)
+ return 0;
+
+ /* setting: $5$rounds=n$salt$ (rounds=n$ and closing $ are optional) */
+ if (strncmp(setting, "$5$", 3) != 0)
+ return 0;
+ salt = setting + 3;
+
+ r = ROUNDS_DEFAULT;
+ if (strncmp(salt, "rounds=", sizeof "rounds=" - 1) == 0) {
+ unsigned long u;
+ char *end;
+
+ /*
+ * this is a deviation from the reference:
+ * bad rounds setting is rejected if it is
+ * - empty
+ * - unterminated (missing '$')
+ * - begins with anything but a decimal digit
+ * the reference implementation treats these bad
+ * rounds as part of the salt or parse them with
+ * strtoul semantics which may cause problems
+ * including non-portable hashes that depend on
+ * the host's value of ULONG_MAX.
+ */
+ salt += sizeof "rounds=" - 1;
+ if (!isdigit(*salt))
+ return 0;
+ u = strtoul(salt, &end, 10);
+ if (*end != '$')
+ return 0;
+ salt = end+1;
+ if (u < ROUNDS_MIN)
+ r = ROUNDS_MIN;
+ else if (u > ROUNDS_MAX)
+ return 0;
+ else
+ r = u;
+ /* needed when rounds is zero prefixed or out of bounds */
+ sprintf(rounds, "rounds=%u$", r);
+ }
+
+ for (i = 0; i < SALT_MAX && salt[i] && salt[i] != '$'; i++)
+ /* reject characters that interfere with /etc/shadow parsing */
+ if (salt[i] == '\n' || salt[i] == ':')
+ return 0;
+ slen = i;
+
+ /* B = sha(key salt key) */
+ sha256_init(&ctx);
+ sha256_update(&ctx, key, klen);
+ sha256_update(&ctx, salt, slen);
+ sha256_update(&ctx, key, klen);
+ sha256_sum(&ctx, md);
+
+ /* A = sha(key salt repeat-B alternate-B-key) */
+ sha256_init(&ctx);
+ sha256_update(&ctx, key, klen);
+ sha256_update(&ctx, salt, slen);
+ hashmd(&ctx, klen, md);
+ for (i = klen; i > 0; i >>= 1)
+ if (i & 1)
+ sha256_update(&ctx, md, sizeof md);
+ else
+ sha256_update(&ctx, key, klen);
+ sha256_sum(&ctx, md);
+
+ /* DP = sha(repeat-key), this step takes O(klen^2) time */
+ sha256_init(&ctx);
+ for (i = 0; i < klen; i++)
+ sha256_update(&ctx, key, klen);
+ sha256_sum(&ctx, kmd);
+
+ /* DS = sha(repeat-salt) */
+ sha256_init(&ctx);
+ for (i = 0; i < 16 + md[0]; i++)
+ sha256_update(&ctx, salt, slen);
+ sha256_sum(&ctx, smd);
+
+ /* iterate A = f(A,DP,DS), this step takes O(rounds*klen) time */
+ for (i = 0; i < r; i++) {
+ sha256_init(&ctx);
+ if (i % 2)
+ hashmd(&ctx, klen, kmd);
+ else
+ sha256_update(&ctx, md, sizeof md);
+ if (i % 3)
+ sha256_update(&ctx, smd, slen);
+ if (i % 7)
+ hashmd(&ctx, klen, kmd);
+ if (i % 2)
+ sha256_update(&ctx, md, sizeof md);
+ else
+ hashmd(&ctx, klen, kmd);
+ sha256_sum(&ctx, md);
+ }
+
+ /* output is $5$rounds=n$salt$hash */
+ p = output;
+ p += sprintf(p, "$5$%s%.*s$", rounds, slen, salt);
+ static const unsigned char perm[][3] = {
+ 0,10,20,21,1,11,12,22,2,3,13,23,24,4,14,
+ 15,25,5,6,16,26,27,7,17,18,28,8,9,19,29 };
+ for (i=0; i<10; i++) p = to64(p,
+ (md[perm[i][0]]<<16)|(md[perm[i][1]]<<8)|md[perm[i][2]], 4);
+ p = to64(p, (md[31]<<8)|md[30], 3);
+ *p = 0;
+ return output;
+}
+
+char *__crypt_sha256(const char *key, const char *setting, char *output)
+{
+ static const char testkey[] = "Xy01@#\x01\x02\x80\x7f\xff\r\n\x81\t !";
+ static const char testsetting[] = "$5$rounds=1234$abc0123456789$";
+ static const char testhash[] = "$5$rounds=1234$abc0123456789$3VfDjPt05VHFn47C/ojFZ6KRPYrOjj1lLbH.dkF3bZ6";
+ char testbuf[128];
+ char *p, *q;
+
+ p = sha256crypt(key, setting, output);
+ /* self test and stack cleanup */
+ q = sha256crypt(testkey, testsetting, testbuf);
+ if (!p || q != testbuf || memcmp(testbuf, testhash, sizeof testhash))
+ return "*";
+ return p;
+}
diff --git a/libc-top-half/musl/src/crypt/crypt_sha512.c b/libc-top-half/musl/src/crypt/crypt_sha512.c
new file mode 100644
index 0000000..39970ca
--- /dev/null
+++ b/libc-top-half/musl/src/crypt/crypt_sha512.c
@@ -0,0 +1,371 @@
+/*
+ * public domain sha512 crypt implementation
+ *
+ * original sha crypt design: http://people.redhat.com/drepper/SHA-crypt.txt
+ * in this implementation at least 32bit int is assumed,
+ * key length is limited, the $6$ prefix is mandatory, '\n' and ':' is rejected
+ * in the salt and rounds= setting must contain a valid iteration count,
+ * on error "*" is returned.
+ */
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+
+/* public domain sha512 implementation based on fips180-3 */
+/* >=2^64 bits messages are not supported (about 2000 peta bytes) */
+
+struct sha512 {
+ uint64_t len; /* processed message length */
+ uint64_t h[8]; /* hash state */
+ uint8_t buf[128]; /* message block buffer */
+};
+
+static uint64_t ror(uint64_t n, int k) { return (n >> k) | (n << (64-k)); }
+#define Ch(x,y,z) (z ^ (x & (y ^ z)))
+#define Maj(x,y,z) ((x & y) | (z & (x | y)))
+#define S0(x) (ror(x,28) ^ ror(x,34) ^ ror(x,39))
+#define S1(x) (ror(x,14) ^ ror(x,18) ^ ror(x,41))
+#define R0(x) (ror(x,1) ^ ror(x,8) ^ (x>>7))
+#define R1(x) (ror(x,19) ^ ror(x,61) ^ (x>>6))
+
+static const uint64_t K[80] = {
+0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
+0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
+0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
+0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
+0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
+0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
+0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
+0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
+0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
+0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
+0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
+0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
+0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
+0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
+0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
+0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
+0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
+0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
+0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
+0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
+};
+
+static void processblock(struct sha512 *s, const uint8_t *buf)
+{
+ uint64_t W[80], t1, t2, a, b, c, d, e, f, g, h;
+ int i;
+
+ for (i = 0; i < 16; i++) {
+ W[i] = (uint64_t)buf[8*i]<<56;
+ W[i] |= (uint64_t)buf[8*i+1]<<48;
+ W[i] |= (uint64_t)buf[8*i+2]<<40;
+ W[i] |= (uint64_t)buf[8*i+3]<<32;
+ W[i] |= (uint64_t)buf[8*i+4]<<24;
+ W[i] |= (uint64_t)buf[8*i+5]<<16;
+ W[i] |= (uint64_t)buf[8*i+6]<<8;
+ W[i] |= buf[8*i+7];
+ }
+ for (; i < 80; i++)
+ W[i] = R1(W[i-2]) + W[i-7] + R0(W[i-15]) + W[i-16];
+ a = s->h[0];
+ b = s->h[1];
+ c = s->h[2];
+ d = s->h[3];
+ e = s->h[4];
+ f = s->h[5];
+ g = s->h[6];
+ h = s->h[7];
+ for (i = 0; i < 80; i++) {
+ t1 = h + S1(e) + Ch(e,f,g) + K[i] + W[i];
+ t2 = S0(a) + Maj(a,b,c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + t1;
+ d = c;
+ c = b;
+ b = a;
+ a = t1 + t2;
+ }
+ s->h[0] += a;
+ s->h[1] += b;
+ s->h[2] += c;
+ s->h[3] += d;
+ s->h[4] += e;
+ s->h[5] += f;
+ s->h[6] += g;
+ s->h[7] += h;
+}
+
+static void pad(struct sha512 *s)
+{
+ unsigned r = s->len % 128;
+
+ s->buf[r++] = 0x80;
+ if (r > 112) {
+ memset(s->buf + r, 0, 128 - r);
+ r = 0;
+ processblock(s, s->buf);
+ }
+ memset(s->buf + r, 0, 120 - r);
+ s->len *= 8;
+ s->buf[120] = s->len >> 56;
+ s->buf[121] = s->len >> 48;
+ s->buf[122] = s->len >> 40;
+ s->buf[123] = s->len >> 32;
+ s->buf[124] = s->len >> 24;
+ s->buf[125] = s->len >> 16;
+ s->buf[126] = s->len >> 8;
+ s->buf[127] = s->len;
+ processblock(s, s->buf);
+}
+
+static void sha512_init(struct sha512 *s)
+{
+ s->len = 0;
+ s->h[0] = 0x6a09e667f3bcc908ULL;
+ s->h[1] = 0xbb67ae8584caa73bULL;
+ s->h[2] = 0x3c6ef372fe94f82bULL;
+ s->h[3] = 0xa54ff53a5f1d36f1ULL;
+ s->h[4] = 0x510e527fade682d1ULL;
+ s->h[5] = 0x9b05688c2b3e6c1fULL;
+ s->h[6] = 0x1f83d9abfb41bd6bULL;
+ s->h[7] = 0x5be0cd19137e2179ULL;
+}
+
+static void sha512_sum(struct sha512 *s, uint8_t *md)
+{
+ int i;
+
+ pad(s);
+ for (i = 0; i < 8; i++) {
+ md[8*i] = s->h[i] >> 56;
+ md[8*i+1] = s->h[i] >> 48;
+ md[8*i+2] = s->h[i] >> 40;
+ md[8*i+3] = s->h[i] >> 32;
+ md[8*i+4] = s->h[i] >> 24;
+ md[8*i+5] = s->h[i] >> 16;
+ md[8*i+6] = s->h[i] >> 8;
+ md[8*i+7] = s->h[i];
+ }
+}
+
+static void sha512_update(struct sha512 *s, const void *m, unsigned long len)
+{
+ const uint8_t *p = m;
+ unsigned r = s->len % 128;
+
+ s->len += len;
+ if (r) {
+ if (len < 128 - r) {
+ memcpy(s->buf + r, p, len);
+ return;
+ }
+ memcpy(s->buf + r, p, 128 - r);
+ len -= 128 - r;
+ p += 128 - r;
+ processblock(s, s->buf);
+ }
+ for (; len >= 128; len -= 128, p += 128)
+ processblock(s, p);
+ memcpy(s->buf, p, len);
+}
+
+static const unsigned char b64[] =
+"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+static char *to64(char *s, unsigned int u, int n)
+{
+ while (--n >= 0) {
+ *s++ = b64[u % 64];
+ u /= 64;
+ }
+ return s;
+}
+
+/* key limit is not part of the original design, added for DoS protection.
+ * rounds limit has been lowered (versus the reference/spec), also for DoS
+ * protection. runtime is O(klen^2 + klen*rounds) */
+#define KEY_MAX 256
+#define SALT_MAX 16
+#define ROUNDS_DEFAULT 5000
+#define ROUNDS_MIN 1000
+#define ROUNDS_MAX 9999999
+
+/* hash n bytes of the repeated md message digest */
+static void hashmd(struct sha512 *s, unsigned int n, const void *md)
+{
+ unsigned int i;
+
+ for (i = n; i > 64; i -= 64)
+ sha512_update(s, md, 64);
+ sha512_update(s, md, i);
+}
+
+static char *sha512crypt(const char *key, const char *setting, char *output)
+{
+ struct sha512 ctx;
+ unsigned char md[64], kmd[64], smd[64];
+ unsigned int i, r, klen, slen;
+ char rounds[20] = "";
+ const char *salt;
+ char *p;
+
+ /* reject large keys */
+ for (i = 0; i <= KEY_MAX && key[i]; i++);
+ if (i > KEY_MAX)
+ return 0;
+ klen = i;
+
+ /* setting: $6$rounds=n$salt$ (rounds=n$ and closing $ are optional) */
+ if (strncmp(setting, "$6$", 3) != 0)
+ return 0;
+ salt = setting + 3;
+
+ r = ROUNDS_DEFAULT;
+ if (strncmp(salt, "rounds=", sizeof "rounds=" - 1) == 0) {
+ unsigned long u;
+ char *end;
+
+ /*
+ * this is a deviation from the reference:
+ * bad rounds setting is rejected if it is
+ * - empty
+ * - unterminated (missing '$')
+ * - begins with anything but a decimal digit
+ * the reference implementation treats these bad
+ * rounds as part of the salt or parse them with
+ * strtoul semantics which may cause problems
+ * including non-portable hashes that depend on
+ * the host's value of ULONG_MAX.
+ */
+ salt += sizeof "rounds=" - 1;
+ if (!isdigit(*salt))
+ return 0;
+ u = strtoul(salt, &end, 10);
+ if (*end != '$')
+ return 0;
+ salt = end+1;
+ if (u < ROUNDS_MIN)
+ r = ROUNDS_MIN;
+ else if (u > ROUNDS_MAX)
+ return 0;
+ else
+ r = u;
+ /* needed when rounds is zero prefixed or out of bounds */
+ sprintf(rounds, "rounds=%u$", r);
+ }
+
+ for (i = 0; i < SALT_MAX && salt[i] && salt[i] != '$'; i++)
+ /* reject characters that interfere with /etc/shadow parsing */
+ if (salt[i] == '\n' || salt[i] == ':')
+ return 0;
+ slen = i;
+
+ /* B = sha(key salt key) */
+ sha512_init(&ctx);
+ sha512_update(&ctx, key, klen);
+ sha512_update(&ctx, salt, slen);
+ sha512_update(&ctx, key, klen);
+ sha512_sum(&ctx, md);
+
+ /* A = sha(key salt repeat-B alternate-B-key) */
+ sha512_init(&ctx);
+ sha512_update(&ctx, key, klen);
+ sha512_update(&ctx, salt, slen);
+ hashmd(&ctx, klen, md);
+ for (i = klen; i > 0; i >>= 1)
+ if (i & 1)
+ sha512_update(&ctx, md, sizeof md);
+ else
+ sha512_update(&ctx, key, klen);
+ sha512_sum(&ctx, md);
+
+ /* DP = sha(repeat-key), this step takes O(klen^2) time */
+ sha512_init(&ctx);
+ for (i = 0; i < klen; i++)
+ sha512_update(&ctx, key, klen);
+ sha512_sum(&ctx, kmd);
+
+ /* DS = sha(repeat-salt) */
+ sha512_init(&ctx);
+ for (i = 0; i < 16 + md[0]; i++)
+ sha512_update(&ctx, salt, slen);
+ sha512_sum(&ctx, smd);
+
+ /* iterate A = f(A,DP,DS), this step takes O(rounds*klen) time */
+ for (i = 0; i < r; i++) {
+ sha512_init(&ctx);
+ if (i % 2)
+ hashmd(&ctx, klen, kmd);
+ else
+ sha512_update(&ctx, md, sizeof md);
+ if (i % 3)
+ sha512_update(&ctx, smd, slen);
+ if (i % 7)
+ hashmd(&ctx, klen, kmd);
+ if (i % 2)
+ sha512_update(&ctx, md, sizeof md);
+ else
+ hashmd(&ctx, klen, kmd);
+ sha512_sum(&ctx, md);
+ }
+
+ /* output is $6$rounds=n$salt$hash */
+ p = output;
+ p += sprintf(p, "$6$%s%.*s$", rounds, slen, salt);
+#if 1
+ static const unsigned char perm[][3] = {
+ 0,21,42,22,43,1,44,2,23,3,24,45,25,46,4,
+ 47,5,26,6,27,48,28,49,7,50,8,29,9,30,51,
+ 31,52,10,53,11,32,12,33,54,34,55,13,56,14,35,
+ 15,36,57,37,58,16,59,17,38,18,39,60,40,61,19,
+ 62,20,41 };
+ for (i=0; i<21; i++) p = to64(p,
+ (md[perm[i][0]]<<16)|(md[perm[i][1]]<<8)|md[perm[i][2]], 4);
+#else
+ p = to64(p, (md[0]<<16)|(md[21]<<8)|md[42], 4);
+ p = to64(p, (md[22]<<16)|(md[43]<<8)|md[1], 4);
+ p = to64(p, (md[44]<<16)|(md[2]<<8)|md[23], 4);
+ p = to64(p, (md[3]<<16)|(md[24]<<8)|md[45], 4);
+ p = to64(p, (md[25]<<16)|(md[46]<<8)|md[4], 4);
+ p = to64(p, (md[47]<<16)|(md[5]<<8)|md[26], 4);
+ p = to64(p, (md[6]<<16)|(md[27]<<8)|md[48], 4);
+ p = to64(p, (md[28]<<16)|(md[49]<<8)|md[7], 4);
+ p = to64(p, (md[50]<<16)|(md[8]<<8)|md[29], 4);
+ p = to64(p, (md[9]<<16)|(md[30]<<8)|md[51], 4);
+ p = to64(p, (md[31]<<16)|(md[52]<<8)|md[10], 4);
+ p = to64(p, (md[53]<<16)|(md[11]<<8)|md[32], 4);
+ p = to64(p, (md[12]<<16)|(md[33]<<8)|md[54], 4);
+ p = to64(p, (md[34]<<16)|(md[55]<<8)|md[13], 4);
+ p = to64(p, (md[56]<<16)|(md[14]<<8)|md[35], 4);
+ p = to64(p, (md[15]<<16)|(md[36]<<8)|md[57], 4);
+ p = to64(p, (md[37]<<16)|(md[58]<<8)|md[16], 4);
+ p = to64(p, (md[59]<<16)|(md[17]<<8)|md[38], 4);
+ p = to64(p, (md[18]<<16)|(md[39]<<8)|md[60], 4);
+ p = to64(p, (md[40]<<16)|(md[61]<<8)|md[19], 4);
+ p = to64(p, (md[62]<<16)|(md[20]<<8)|md[41], 4);
+#endif
+ p = to64(p, md[63], 2);
+ *p = 0;
+ return output;
+}
+
+char *__crypt_sha512(const char *key, const char *setting, char *output)
+{
+ static const char testkey[] = "Xy01@#\x01\x02\x80\x7f\xff\r\n\x81\t !";
+ static const char testsetting[] = "$6$rounds=1234$abc0123456789$";
+ static const char testhash[] = "$6$rounds=1234$abc0123456789$BCpt8zLrc/RcyuXmCDOE1ALqMXB2MH6n1g891HhFj8.w7LxGv.FTkqq6Vxc/km3Y0jE0j24jY5PIv/oOu6reg1";
+ char testbuf[128];
+ char *p, *q;
+
+ p = sha512crypt(key, setting, output);
+ /* self test and stack cleanup */
+ q = sha512crypt(testkey, testsetting, testbuf);
+ if (!p || q != testbuf || memcmp(testbuf, testhash, sizeof testhash))
+ return "*";
+ return p;
+}
diff --git a/libc-top-half/musl/src/crypt/encrypt.c b/libc-top-half/musl/src/crypt/encrypt.c
new file mode 100644
index 0000000..216abc9
--- /dev/null
+++ b/libc-top-half/musl/src/crypt/encrypt.c
@@ -0,0 +1,52 @@
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "crypt_des.h"
+
+static struct expanded_key __encrypt_key;
+
+void setkey(const char *key)
+{
+ unsigned char bkey[8];
+ int i, j;
+
+ for (i = 0; i < 8; i++) {
+ bkey[i] = 0;
+ for (j = 7; j >= 0; j--, key++)
+ bkey[i] |= (uint32_t)(*key & 1) << j;
+ }
+
+ __des_setkey(bkey, &__encrypt_key);
+}
+
+void encrypt(char *block, int edflag)
+{
+ struct expanded_key decrypt_key, *key;
+ uint32_t b[2];
+ int i, j;
+ char *p;
+
+ p = block;
+ for (i = 0; i < 2; i++) {
+ b[i] = 0;
+ for (j = 31; j >= 0; j--, p++)
+ b[i] |= (uint32_t)(*p & 1) << j;
+ }
+
+ key = &__encrypt_key;
+ if (edflag) {
+ key = &decrypt_key;
+ for (i = 0; i < 16; i++) {
+ decrypt_key.l[i] = __encrypt_key.l[15-i];
+ decrypt_key.r[i] = __encrypt_key.r[15-i];
+ }
+ }
+
+ __do_des(b[0], b[1], b, b + 1, 1, 0, key);
+
+ p = block;
+ for (i = 0; i < 2; i++)
+ for (j = 31; j >= 0; j--)
+ *p++ = b[i]>>j & 1;
+}
diff --git a/libc-top-half/musl/src/ctype/__ctype_b_loc.c b/libc-top-half/musl/src/ctype/__ctype_b_loc.c
new file mode 100644
index 0000000..f43795e
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/__ctype_b_loc.c
@@ -0,0 +1,41 @@
+#include <endian.h>
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define X(x) x
+#else
+#define X(x) (((x)/256 | (x)*256) % 65536)
+#endif
+
+static const unsigned short table[] = {
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+X(0x200),X(0x200),X(0x200),X(0x200),X(0x200),X(0x200),X(0x200),X(0x200),
+X(0x200),X(0x320),X(0x220),X(0x220),X(0x220),X(0x220),X(0x200),X(0x200),
+X(0x200),X(0x200),X(0x200),X(0x200),X(0x200),X(0x200),X(0x200),X(0x200),
+X(0x200),X(0x200),X(0x200),X(0x200),X(0x200),X(0x200),X(0x200),X(0x200),
+X(0x160),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),
+X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),
+X(0x8d8),X(0x8d8),X(0x8d8),X(0x8d8),X(0x8d8),X(0x8d8),X(0x8d8),X(0x8d8),
+X(0x8d8),X(0x8d8),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),
+X(0x4c0),X(0x8d5),X(0x8d5),X(0x8d5),X(0x8d5),X(0x8d5),X(0x8d5),X(0x8c5),
+X(0x8c5),X(0x8c5),X(0x8c5),X(0x8c5),X(0x8c5),X(0x8c5),X(0x8c5),X(0x8c5),
+X(0x8c5),X(0x8c5),X(0x8c5),X(0x8c5),X(0x8c5),X(0x8c5),X(0x8c5),X(0x8c5),
+X(0x8c5),X(0x8c5),X(0x8c5),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),
+X(0x4c0),X(0x8d6),X(0x8d6),X(0x8d6),X(0x8d6),X(0x8d6),X(0x8d6),X(0x8c6),
+X(0x8c6),X(0x8c6),X(0x8c6),X(0x8c6),X(0x8c6),X(0x8c6),X(0x8c6),X(0x8c6),
+X(0x8c6),X(0x8c6),X(0x8c6),X(0x8c6),X(0x8c6),X(0x8c6),X(0x8c6),X(0x8c6),
+X(0x8c6),X(0x8c6),X(0x8c6),X(0x4c0),X(0x4c0),X(0x4c0),X(0x4c0),X(0x200),
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+};
+
+static const unsigned short *const ptable = table+128;
+
+const unsigned short **__ctype_b_loc(void)
+{
+ return (void *)&ptable;
+}
diff --git a/libc-top-half/musl/src/ctype/__ctype_get_mb_cur_max.c b/libc-top-half/musl/src/ctype/__ctype_get_mb_cur_max.c
new file mode 100644
index 0000000..8e946fc
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/__ctype_get_mb_cur_max.c
@@ -0,0 +1,7 @@
+#include <stdlib.h>
+#include "locale_impl.h"
+
+size_t __ctype_get_mb_cur_max()
+{
+ return MB_CUR_MAX;
+}
diff --git a/libc-top-half/musl/src/ctype/__ctype_tolower_loc.c b/libc-top-half/musl/src/ctype/__ctype_tolower_loc.c
new file mode 100644
index 0000000..efb9910
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/__ctype_tolower_loc.c
@@ -0,0 +1,30 @@
+#include <stdint.h>
+
+static const int32_t table[] = {
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+64,
+'a','b','c','d','e','f','g','h','i','j','k','l','m',
+'n','o','p','q','r','s','t','u','v','w','x','y','z',
+91,92,93,94,95,96,
+'a','b','c','d','e','f','g','h','i','j','k','l','m',
+'n','o','p','q','r','s','t','u','v','w','x','y','z',
+123,124,125,126,127,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+};
+
+static const int32_t *const ptable = table+128;
+
+const int32_t **__ctype_tolower_loc(void)
+{
+ return (void *)&ptable;
+}
diff --git a/libc-top-half/musl/src/ctype/__ctype_toupper_loc.c b/libc-top-half/musl/src/ctype/__ctype_toupper_loc.c
new file mode 100644
index 0000000..ffaef0e
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/__ctype_toupper_loc.c
@@ -0,0 +1,30 @@
+#include <stdint.h>
+
+static const int32_t table[] = {
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+64,
+'A','B','C','D','E','F','G','H','I','J','K','L','M',
+'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
+91,92,93,94,95,96,
+'A','B','C','D','E','F','G','H','I','J','K','L','M',
+'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
+123,124,125,126,127,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+};
+
+static const int32_t *const ptable = table+128;
+
+const int32_t **__ctype_toupper_loc(void)
+{
+ return (void *)&ptable;
+}
diff --git a/libc-top-half/musl/src/ctype/alpha.h b/libc-top-half/musl/src/ctype/alpha.h
new file mode 100644
index 0000000..4167f38
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/alpha.h
@@ -0,0 +1,172 @@
+18,17,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,17,34,35,36,17,37,38,39,40,
+41,42,43,44,17,45,46,47,16,16,48,16,16,16,16,16,16,16,49,50,51,16,52,53,16,16,
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,54,
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+17,17,17,55,17,17,17,17,56,17,57,58,59,60,61,62,17,17,17,17,17,17,17,17,17,17,
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+17,17,17,17,17,17,17,63,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,64,65,17,66,67,
+68,69,70,71,72,73,74,17,75,76,77,78,79,80,81,16,82,83,84,85,86,87,88,89,90,91,
+92,93,16,94,95,96,16,17,17,17,97,98,99,16,16,16,16,16,16,16,16,16,16,17,17,17,
+17,100,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,101,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,17,17,102,103,16,16,104,105,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+17,17,17,17,17,17,17,17,17,106,17,17,107,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,
+108,109,16,16,16,16,16,16,16,16,16,110,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,111,112,113,114,16,16,16,16,16,16,16,16,115,116,
+117,16,16,16,16,16,118,119,16,16,16,16,120,16,16,121,16,16,16,16,16,16,16,16,
+16,16,16,16,16,
+16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,254,255,255,7,254,
+255,255,7,0,0,0,0,0,4,32,4,255,255,127,255,255,255,127,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,195,255,3,0,31,80,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,223,188,64,215,255,255,
+251,255,255,255,255,255,255,255,255,255,191,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,3,252,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,127,2,255,255,255,
+255,255,1,0,0,0,0,255,191,182,0,255,255,255,135,7,0,0,0,255,7,255,255,255,255,
+255,255,255,254,255,195,255,255,255,255,255,255,255,255,255,255,255,255,239,
+31,254,225,255,
+159,0,0,255,255,255,255,255,255,0,224,255,255,255,255,255,255,255,255,255,255,
+255,255,3,0,255,255,255,255,255,7,48,4,255,255,255,252,255,31,0,0,255,255,255,
+1,255,7,0,0,0,0,0,0,255,255,223,63,0,0,240,255,248,3,255,255,255,255,255,255,
+255,255,255,239,255,223,225,255,207,255,254,255,239,159,249,255,255,253,197,
+227,159,89,128,176,207,255,3,16,238,135,249,255,255,253,109,195,135,25,2,94,
+192,255,63,0,238,191,251,255,255,253,237,227,191,27,1,0,207,255,0,30,238,159,
+249,255,255,253,237,227,159,25,192,176,207,255,2,0,236,199,61,214,24,199,255,
+195,199,29,129,0,192,255,0,0,239,223,253,255,255,253,255,227,223,29,96,7,207,
+255,0,0,239,223,253,255,255,253,239,227,223,29,96,64,207,255,6,0,239,223,253,
+255,255,255,255,231,223,93,240,128,207,255,0,252,236,255,127,252,255,255,251,
+47,127,128,95,255,192,255,12,0,254,255,255,255,255,127,255,7,63,32,255,3,0,0,
+0,0,214,247,255,255,175,255,255,59,95,32,255,243,0,0,0,
+0,1,0,0,0,255,3,0,0,255,254,255,255,255,31,254,255,3,255,255,254,255,255,255,
+31,0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,249,255,3,255,255,255,255,255,
+255,255,255,255,63,255,255,255,255,191,32,255,255,255,255,255,247,255,255,255,
+255,255,255,255,255,255,61,127,61,255,255,255,255,255,61,255,255,255,255,61,
+127,61,255,127,255,255,255,255,255,255,255,61,255,255,255,255,255,255,255,255,
+7,0,0,0,0,255,255,0,0,255,255,255,255,255,255,255,255,255,255,63,63,254,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,159,255,255,254,255,255,7,255,255,255,255,255,255,255,255,
+255,199,255,1,255,223,15,0,255,255,15,0,255,255,15,0,255,223,13,0,255,255,255,
+255,255,255,207,255,255,1,128,16,255,3,0,0,0,0,255,3,255,255,255,255,255,255,
+255,255,255,255,255,1,255,255,255,255,255,7,255,255,255,255,255,255,255,255,
+63,
+0,255,255,255,127,255,15,255,1,192,255,255,255,255,63,31,0,255,255,255,255,
+255,15,255,255,255,3,255,3,0,0,0,0,255,255,255,15,255,255,255,255,255,255,255,
+127,254,255,31,0,255,3,255,3,128,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,
+255,239,255,239,15,255,3,0,0,0,0,255,255,255,255,255,243,255,255,255,255,255,
+255,191,255,3,0,255,255,255,255,255,255,127,0,255,227,255,255,255,255,255,63,
+255,1,255,255,255,255,255,231,0,0,0,0,0,222,111,4,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,
+128,255,31,0,255,255,63,63,255,255,255,255,63,63,255,170,255,255,255,63,255,
+255,255,255,255,255,223,95,220,31,207,15,255,31,220,31,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,2,128,0,0,255,31,0,0,0,0,0,0,0,0,0,0,0,0,132,252,47,62,80,189,255,243,
+224,67,0,0,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,255,255,255,255,255,255,3,0,
+0,255,255,255,255,255,127,255,255,255,255,255,127,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,31,120,12,0,255,255,255,255,191,32,255,
+255,255,255,255,255,255,128,0,0,255,255,127,0,127,127,127,127,127,127,127,127,
+255,255,255,255,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,224,0,0,0,254,3,62,31,254,255,255,255,255,255,255,255,255,255,127,224,254,
+255,255,255,255,255,255,255,255,255,255,247,224,255,255,255,255,255,254,255,
+255,255,255,255,255,255,255,255,255,127,0,0,255,255,255,7,0,0,0,0,0,0,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,63,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,
+0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,
+0,0,0,0,0,0,255,255,255,255,255,63,255,31,255,255,255,15,0,0,255,255,255,255,
+255,127,240,143,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,
+0,128,255,252,255,255,255,255,255,255,255,255,255,255,255,255,249,255,255,255,
+255,255,255,124,0,0,0,0,0,128,255,191,255,255,255,255,0,0,0,255,255,255,255,
+255,255,15,0,255,255,255,255,255,255,255,255,47,0,255,3,0,0,252,232,255,255,
+255,255,255,7,255,255,255,255,7,0,255,255,255,31,255,255,255,255,255,255,247,
+255,0,128,255,3,255,255,255,127,255,255,255,255,255,255,127,0,255,63,255,3,
+255,255,127,252,255,255,255,255,255,255,255,127,5,0,0,56,255,255,60,0,126,126,
+126,0,127,127,255,255,255,255,255,247,255,0,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,7,255,3,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,15,0,255,255,127,248,255,255,255,255,
+255,
+15,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255,255,255,
+255,255,255,255,255,255,255,255,3,0,0,0,0,127,0,248,224,255,253,127,95,219,
+255,255,255,255,255,255,255,255,255,255,255,255,255,3,0,0,0,248,255,255,255,
+255,255,255,255,255,255,255,255,255,63,0,0,255,255,255,255,255,255,255,255,
+252,255,255,255,255,255,255,0,0,0,0,0,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,255,3,
+254,255,255,7,254,255,255,7,192,255,255,255,255,255,255,255,255,255,255,127,
+252,252,252,28,0,0,0,0,255,239,255,255,127,255,255,183,255,63,255,63,0,0,0,0,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,7,0,0,0,0,0,0,0,0,
+255,255,255,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,255,255,255,31,255,255,255,255,255,255,1,0,0,0,0,
+0,255,255,255,255,0,224,255,255,255,7,255,255,255,255,255,7,255,255,255,63,
+255,255,255,255,15,255,62,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,63,255,3,255,255,255,255,15,255,255,255,
+255,15,255,255,255,255,255,0,255,255,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,0,255,255,63,0,255,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,63,253,255,255,255,255,191,145,255,255,63,0,255,255,
+127,0,255,255,255,127,0,0,0,0,0,0,0,0,255,255,55,0,255,255,63,0,255,255,255,3,
+0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,192,0,0,0,0,0,0,0,0,111,240,239,
+254,255,255,63,0,0,0,0,0,255,255,255,31,255,255,255,31,0,0,0,0,255,254,255,
+255,31,0,0,0,255,255,255,255,255,255,63,0,255,255,63,0,255,255,7,0,255,255,3,
+0,0,0,0,0,0,0,0,0,0,0,0,
+0,255,255,255,255,255,255,255,255,255,1,0,0,0,0,0,0,255,255,255,255,255,255,7,
+0,255,255,255,255,255,255,7,0,255,255,255,255,255,0,255,3,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,31,128,0,255,255,63,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,255,255,127,0,255,255,255,255,255,255,255,255,63,0,0,0,
+192,255,0,0,252,255,255,255,255,255,255,1,0,0,255,255,255,1,255,3,255,255,255,
+255,255,255,199,255,112,0,255,255,255,255,71,0,255,255,255,255,255,255,255,
+255,30,0,255,23,0,0,0,0,255,255,251,255,255,255,159,64,0,0,0,0,0,0,0,0,127,
+189,255,191,255,1,255,255,255,255,255,255,255,1,255,3,239,159,249,255,255,253,
+237,227,159,25,129,224,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,
+255,255,255,255,255,187,7,255,131,0,0,0,0,255,255,255,255,255,255,255,255,179,
+0,255,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,63,127,0,0,0,63,0,0,
+0,0,255,255,255,255,255,255,255,127,17,0,255,3,0,0,0,0,255,255,255,255,255,
+255,63,1,255,3,0,0,0,0,0,0,255,255,255,231,255,7,255,3,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,
+0,255,255,255,255,255,255,255,255,255,3,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,255,252,255,255,255,255,255,252,26,0,0,0,255,255,255,255,255,255,231,
+127,0,0,255,255,255,255,255,255,255,255,255,32,0,0,0,0,255,255,255,255,255,
+255,255,1,255,253,255,255,255,255,127,127,1,0,255,3,0,0,252,255,255,255,252,
+255,255,254,127,0,0,0,0,0,0,0,0,0,127,251,255,255,255,255,127,180,203,0,255,3,
+191,253,255,255,255,127,123,1,255,3,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,127,0,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,3,0,0,
+0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,127,0,
+0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
+255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
+255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
+255,255,255,255,255,255,1,255,255,255,127,255,3,0,0,0,0,0,0,0,0,0,0,0,0,255,
+255,255,63,0,0,255,255,255,255,255,255,0,0,15,0,255,3,248,255,255,224,255,255,
+0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,255,255,255,255,255,255,255,255,255,135,255,255,255,255,255,255,255,128,
+255,255,0,0,0,0,0,0,0,0,11,0,0,0,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,7,0,255,255,255,127,0,0,0,0,0,
+0,7,0,240,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,255,255,255,255,
+255,255,255,255,255,255,255,255,255,7,255,31,255,1,255,67,0,0,0,0,0,0,0,0,0,0,
+0,0,255,255,255,255,255,255,255,255,255,255,223,255,255,255,255,255,255,255,
+255,223,100,222,255,235,239,255,255,255,255,255,255,
+255,191,231,223,223,255,255,255,123,95,252,253,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255,
+253,255,255,247,255,255,255,247,255,255,223,255,255,255,223,255,255,127,255,
+255,255,127,255,255,255,253,255,255,255,253,255,255,247,207,255,255,255,255,
+255,255,127,255,255,249,219,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,255,255,255,255,255,31,128,63,255,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,
+15,255,3,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,31,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,
+143,8,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,239,255,255,255,150,254,247,10,132,234,150,170,150,247,247,94,255,251,255,
+15,238,251,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,3,255,255,255,3,255,
+255,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
diff --git a/libc-top-half/musl/src/ctype/casemap.h b/libc-top-half/musl/src/ctype/casemap.h
new file mode 100644
index 0000000..6ee1209
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/casemap.h
@@ -0,0 +1,297 @@
+static const unsigned char tab[] = {
+ 7, 8, 9, 10, 11, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 13, 6, 6, 14, 6, 6, 6, 6, 6, 6, 6, 6, 15, 16, 17, 18,
+ 6, 19, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 20, 21, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 22, 23, 6, 6, 6, 24, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 25,
+ 6, 6, 6, 6, 26, 6, 6, 6, 6, 6, 6, 6, 27, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 28, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 29, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 30, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36,
+ 43, 43, 43, 43, 43, 43, 43, 43, 1, 0, 84, 86, 86, 86, 86, 86,
+ 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 43, 43, 43, 43, 43, 43,
+ 43, 7, 43, 43, 91, 86, 86, 86, 86, 86, 86, 86, 74, 86, 86, 5,
+ 49, 80, 49, 80, 49, 80, 49, 80, 49, 80, 49, 80, 49, 80, 49, 80,
+ 36, 80, 121, 49, 80, 49, 80, 49, 56, 80, 49, 80, 49, 80, 49, 80,
+ 49, 80, 49, 80, 49, 80, 49, 80, 78, 49, 2, 78, 13, 13, 78, 3,
+ 78, 0, 36, 110, 0, 78, 49, 38, 110, 81, 78, 36, 80, 78, 57, 20,
+ 129, 27, 29, 29, 83, 49, 80, 49, 80, 13, 49, 80, 49, 80, 49, 80,
+ 27, 83, 36, 80, 49, 2, 92, 123, 92, 123, 92, 123, 92, 123, 92, 123,
+ 20, 121, 92, 123, 92, 123, 92, 45, 43, 73, 3, 72, 3, 120, 92, 123,
+ 20, 0, 150, 10, 1, 43, 40, 6, 6, 0, 42, 6, 42, 42, 43, 7,
+ 187, 181, 43, 30, 0, 43, 7, 43, 43, 43, 1, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 1, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 205, 70, 205, 43, 0, 37, 43, 7, 1, 6, 1, 85, 86, 86, 86,
+ 86, 86, 85, 86, 86, 2, 36, 129, 129, 129, 129, 129, 21, 129, 129, 129,
+ 0, 0, 43, 0, 178, 209, 178, 209, 178, 209, 178, 209, 0, 0, 205, 204,
+ 1, 0, 215, 215, 215, 215, 215, 131, 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 28, 0, 0, 0,
+ 0, 0, 49, 80, 49, 80, 49, 80, 49, 80, 49, 80, 49, 2, 0, 0,
+ 49, 80, 49, 80, 49, 80, 49, 80, 49, 80, 49, 80, 49, 80, 49, 80,
+ 49, 80, 78, 49, 80, 49, 80, 78, 49, 80, 49, 80, 49, 80, 49, 80,
+ 49, 80, 49, 80, 49, 80, 49, 2, 135, 166, 135, 166, 135, 166, 135, 166,
+ 135, 166, 135, 166, 135, 166, 135, 166, 42, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 0, 0, 0, 84, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 84, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 12, 0, 12, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 7, 42, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 86, 86, 108, 129, 21, 0, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 7, 108, 3, 65, 43, 43, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 44, 86, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 12, 108, 0, 0, 0, 0, 0, 6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37,
+ 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37,
+ 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37,
+ 6, 37, 6, 37, 6, 37, 6, 37, 86, 122, 158, 38, 6, 37, 6, 37,
+ 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37,
+ 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 1, 43, 43, 79, 86,
+ 86, 44, 43, 127, 86, 86, 57, 43, 43, 85, 86, 86, 43, 43, 79, 86,
+ 86, 44, 43, 127, 86, 86, 129, 55, 117, 91, 123, 92, 43, 43, 79, 86,
+ 86, 2, 172, 4, 0, 0, 57, 43, 43, 85, 86, 86, 43, 43, 79, 86,
+ 86, 44, 43, 43, 86, 86, 50, 19, 129, 87, 0, 111, 129, 126, 201, 215,
+ 126, 45, 129, 129, 14, 126, 57, 127, 111, 87, 0, 129, 129, 126, 21, 0,
+ 126, 3, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 7, 43,
+ 36, 43, 151, 43, 43, 43, 43, 43, 43, 43, 43, 43, 42, 43, 43, 43,
+ 43, 43, 86, 86, 86, 86, 86, 128, 129, 129, 129, 129, 57, 187, 42, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 1, 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 201, 172, 172, 172, 172, 172, 172, 172, 172,
+ 172, 172, 172, 172, 172, 172, 172, 208, 13, 0, 78, 49, 2, 180, 193, 193,
+ 215, 215, 36, 80, 49, 80, 49, 80, 49, 80, 49, 80, 49, 80, 49, 80,
+ 49, 80, 49, 80, 49, 80, 49, 80, 49, 80, 49, 80, 49, 80, 49, 80,
+ 49, 80, 49, 80, 215, 215, 83, 193, 71, 212, 215, 215, 215, 5, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 7, 1, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 49, 80, 49, 80, 49, 80,
+ 49, 80, 49, 80, 49, 80, 49, 80, 13, 0, 0, 0, 0, 0, 36, 80,
+ 49, 80, 49, 80, 49, 80, 49, 80, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 121, 92, 123, 92, 123, 79, 123, 92, 123, 92, 123,
+ 92, 123, 92, 123, 92, 123, 92, 123, 92, 123, 92, 123, 92, 123, 92, 45,
+ 43, 43, 121, 20, 92, 123, 92, 45, 121, 42, 92, 39, 92, 123, 92, 123,
+ 92, 123, 164, 0, 10, 180, 92, 123, 92, 123, 79, 3, 42, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 43, 43, 43, 43, 43, 43, 43, 43, 7, 0, 72, 86, 86, 86, 86,
+ 86, 86, 86, 86, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 85, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 36, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 7, 0, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 7, 0, 0,
+ 0, 0, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 14, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 85,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 14, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+static const int rules[] = {
+ 0x0, 0x2001, -0x2000, 0x1dbf00, 0x2e700, 0x7900,
+ 0x2402, 0x101, -0x100, 0x0, 0x201, -0x200,
+ -0xc6ff, -0xe800, -0x78ff, -0x12c00, 0xc300, 0xd201,
+ 0xce01, 0xcd01, 0x4f01, 0xca01, 0xcb01, 0xcf01,
+ 0x6100, 0xd301, 0xd101, 0xa300, 0xd501, 0x8200,
+ 0xd601, 0xda01, 0xd901, 0xdb01, 0x3800, 0x3,
+ -0x4f00, -0x60ff, -0x37ff, 0x242802, 0x0, 0x101,
+ -0x100, -0xcd00, -0xda00, -0x81ff, 0x2a2b01, -0xa2ff,
+ 0x2a2801, 0x2a3f00, -0xc2ff, 0x4501, 0x4701, 0x2a1f00,
+ 0x2a1c00, 0x2a1e00, -0xd200, -0xce00, -0xca00, -0xcb00,
+ 0xa54f00, 0xa54b00, -0xcf00, 0xa52800, 0xa54400, -0xd100,
+ -0xd300, 0x29f700, 0xa54100, 0x29fd00, -0xd500, -0xd600,
+ 0x29e700, 0xa54300, 0xa52a00, -0x4500, -0xd900, -0x4700,
+ -0xdb00, 0xa51500, 0xa51200, 0x4c2402, 0x0, 0x2001,
+ -0x2000, 0x101, -0x100, 0x5400, 0x7401, 0x2601,
+ 0x2501, 0x4001, 0x3f01, -0x2600, -0x2500, -0x1f00,
+ -0x4000, -0x3f00, 0x801, -0x3e00, -0x3900, -0x2f00,
+ -0x3600, -0x800, -0x5600, -0x5000, 0x700, -0x7400,
+ -0x3bff, -0x6000, -0x6ff, 0x701a02, 0x101, -0x100,
+ 0x2001, -0x2000, 0x5001, 0xf01, -0xf00, 0x0,
+ 0x3001, -0x3000, 0x101, -0x100, 0x0, 0xbc000,
+ 0x1c6001, 0x0, 0x97d001, 0x801, -0x800, 0x8a0502,
+ 0x0, -0xbbfff, -0x186200, 0x89c200, -0x182500, -0x186e00,
+ -0x186d00, -0x186400, -0x186300, -0x185c00, 0x0, 0x8a3800,
+ 0x8a0400, 0xee600, 0x101, -0x100, 0x0, -0x3b00,
+ -0x1dbeff, 0x8f1d02, 0x800, -0x7ff, 0x0, 0x5600,
+ -0x55ff, 0x4a00, 0x6400, 0x8000, 0x7000, 0x7e00,
+ 0x900, -0x49ff, -0x8ff, -0x1c2500, -0x63ff, -0x6fff,
+ -0x7fff, -0x7dff, 0xac0502, 0x0, 0x1001, -0x1000,
+ 0x1c01, 0x101, -0x1d5cff, -0x20beff, -0x2045ff, -0x1c00,
+ 0xb10b02, 0x101, -0x100, 0x3001, -0x3000, 0x0,
+ -0x29f6ff, -0xee5ff, -0x29e6ff, -0x2a2b00, -0x2a2800, -0x2a1bff,
+ -0x29fcff, -0x2a1eff, -0x2a1dff, -0x2a3eff, 0x0, -0x1c6000,
+ 0x0, 0x101, -0x100, 0xbc0c02, 0x0, 0x101,
+ -0x100, -0xa543ff, 0x3a001, -0x8a03ff, -0xa527ff, 0x3000,
+ -0xa54eff, -0xa54aff, -0xa540ff, -0xa511ff, -0xa529ff, -0xa514ff,
+ -0x2fff, -0xa542ff, -0x8a37ff, 0x0, -0x97d000, -0x3a000,
+ 0x0, 0x2001, -0x2000, 0x0, 0x2801, -0x2800,
+ 0x0, 0x4001, -0x4000, 0x0, 0x2001, -0x2000,
+ 0x0, 0x2001, -0x2000, 0x0, 0x2201, -0x2200,
+};
+static const unsigned char rulebases[] = {
+ 0, 6, 39, 81, 111, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 124, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 131, 142, 146, 151,
+ 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 196, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 198, 201, 0, 0, 0, 219, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222,
+ 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 231, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+static const unsigned char exceptions[][2] = {
+ { 48, 12 }, { 49, 13 }, { 120, 14 }, { 127, 15 },
+ { 128, 16 }, { 129, 17 }, { 134, 18 }, { 137, 19 },
+ { 138, 19 }, { 142, 20 }, { 143, 21 }, { 144, 22 },
+ { 147, 19 }, { 148, 23 }, { 149, 24 }, { 150, 25 },
+ { 151, 26 }, { 154, 27 }, { 156, 25 }, { 157, 28 },
+ { 158, 29 }, { 159, 30 }, { 166, 31 }, { 169, 31 },
+ { 174, 31 }, { 177, 32 }, { 178, 32 }, { 183, 33 },
+ { 191, 34 }, { 197, 35 }, { 200, 35 }, { 203, 35 },
+ { 221, 36 }, { 242, 35 }, { 246, 37 }, { 247, 38 },
+ { 32, 45 }, { 58, 46 }, { 61, 47 }, { 62, 48 },
+ { 63, 49 }, { 64, 49 }, { 67, 50 }, { 68, 51 },
+ { 69, 52 }, { 80, 53 }, { 81, 54 }, { 82, 55 },
+ { 83, 56 }, { 84, 57 }, { 89, 58 }, { 91, 59 },
+ { 92, 60 }, { 97, 61 }, { 99, 62 }, { 101, 63 },
+ { 102, 64 }, { 104, 65 }, { 105, 66 }, { 106, 64 },
+ { 107, 67 }, { 108, 68 }, { 111, 66 }, { 113, 69 },
+ { 114, 70 }, { 117, 71 }, { 125, 72 }, { 130, 73 },
+ { 135, 74 }, { 137, 75 }, { 138, 76 }, { 139, 76 },
+ { 140, 77 }, { 146, 78 }, { 157, 79 }, { 158, 80 },
+ { 69, 87 }, { 123, 29 }, { 124, 29 }, { 125, 29 },
+ { 127, 88 }, { 134, 89 }, { 136, 90 }, { 137, 90 },
+ { 138, 90 }, { 140, 91 }, { 142, 92 }, { 143, 92 },
+ { 172, 93 }, { 173, 94 }, { 174, 94 }, { 175, 94 },
+ { 194, 95 }, { 204, 96 }, { 205, 97 }, { 206, 97 },
+ { 207, 98 }, { 208, 99 }, { 209, 100 }, { 213, 101 },
+ { 214, 102 }, { 215, 103 }, { 240, 104 }, { 241, 105 },
+ { 242, 106 }, { 243, 107 }, { 244, 108 }, { 245, 109 },
+ { 249, 110 }, { 253, 45 }, { 254, 45 }, { 255, 45 },
+ { 80, 105 }, { 81, 105 }, { 82, 105 }, { 83, 105 },
+ { 84, 105 }, { 85, 105 }, { 86, 105 }, { 87, 105 },
+ { 88, 105 }, { 89, 105 }, { 90, 105 }, { 91, 105 },
+ { 92, 105 }, { 93, 105 }, { 94, 105 }, { 95, 105 },
+ { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 },
+ { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 },
+ { 192, 117 }, { 207, 118 }, { 128, 137 }, { 129, 138 },
+ { 130, 139 }, { 133, 140 }, { 134, 141 }, { 112, 157 },
+ { 113, 157 }, { 118, 158 }, { 119, 158 }, { 120, 159 },
+ { 121, 159 }, { 122, 160 }, { 123, 160 }, { 124, 161 },
+ { 125, 161 }, { 179, 162 }, { 186, 163 }, { 187, 163 },
+ { 188, 164 }, { 190, 165 }, { 195, 162 }, { 204, 164 },
+ { 218, 166 }, { 219, 166 }, { 229, 106 }, { 234, 167 },
+ { 235, 167 }, { 236, 110 }, { 243, 162 }, { 248, 168 },
+ { 249, 168 }, { 250, 169 }, { 251, 169 }, { 252, 164 },
+ { 38, 176 }, { 42, 177 }, { 43, 178 }, { 78, 179 },
+ { 132, 8 }, { 98, 186 }, { 99, 187 }, { 100, 188 },
+ { 101, 189 }, { 102, 190 }, { 109, 191 }, { 110, 192 },
+ { 111, 193 }, { 112, 194 }, { 126, 195 }, { 127, 195 },
+ { 125, 207 }, { 141, 208 }, { 148, 209 }, { 171, 210 },
+ { 172, 211 }, { 173, 212 }, { 176, 213 }, { 177, 214 },
+ { 178, 215 }, { 196, 216 }, { 197, 217 }, { 198, 218 },
+};
diff --git a/libc-top-half/musl/src/ctype/isalnum.c b/libc-top-half/musl/src/ctype/isalnum.c
new file mode 100644
index 0000000..8018a2b
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/isalnum.c
@@ -0,0 +1,13 @@
+#include <ctype.h>
+
+int isalnum(int c)
+{
+ return isalpha(c) || isdigit(c);
+}
+
+int __isalnum_l(int c, locale_t l)
+{
+ return isalnum(c);
+}
+
+weak_alias(__isalnum_l, isalnum_l);
diff --git a/libc-top-half/musl/src/ctype/isalpha.c b/libc-top-half/musl/src/ctype/isalpha.c
new file mode 100644
index 0000000..a87a937
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/isalpha.c
@@ -0,0 +1,14 @@
+#include <ctype.h>
+#undef isalpha
+
+int isalpha(int c)
+{
+ return ((unsigned)c|32)-'a' < 26;
+}
+
+int __isalpha_l(int c, locale_t l)
+{
+ return isalpha(c);
+}
+
+weak_alias(__isalpha_l, isalpha_l);
diff --git a/libc-top-half/musl/src/ctype/isascii.c b/libc-top-half/musl/src/ctype/isascii.c
new file mode 100644
index 0000000..54ad3bf
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/isascii.c
@@ -0,0 +1,7 @@
+#include <ctype.h>
+#undef isascii
+
+int isascii(int c)
+{
+ return !(c&~0x7f);
+}
diff --git a/libc-top-half/musl/src/ctype/isblank.c b/libc-top-half/musl/src/ctype/isblank.c
new file mode 100644
index 0000000..716da23
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/isblank.c
@@ -0,0 +1,13 @@
+#include <ctype.h>
+
+int isblank(int c)
+{
+ return (c == ' ' || c == '\t');
+}
+
+int __isblank_l(int c, locale_t l)
+{
+ return isblank(c);
+}
+
+weak_alias(__isblank_l, isblank_l);
diff --git a/libc-top-half/musl/src/ctype/iscntrl.c b/libc-top-half/musl/src/ctype/iscntrl.c
new file mode 100644
index 0000000..f27837e
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iscntrl.c
@@ -0,0 +1,13 @@
+#include <ctype.h>
+
+int iscntrl(int c)
+{
+ return (unsigned)c < 0x20 || c == 0x7f;
+}
+
+int __iscntrl_l(int c, locale_t l)
+{
+ return iscntrl(c);
+}
+
+weak_alias(__iscntrl_l, iscntrl_l);
diff --git a/libc-top-half/musl/src/ctype/isdigit.c b/libc-top-half/musl/src/ctype/isdigit.c
new file mode 100644
index 0000000..16beddb
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/isdigit.c
@@ -0,0 +1,14 @@
+#include <ctype.h>
+#undef isdigit
+
+int isdigit(int c)
+{
+ return (unsigned)c-'0' < 10;
+}
+
+int __isdigit_l(int c, locale_t l)
+{
+ return isdigit(c);
+}
+
+weak_alias(__isdigit_l, isdigit_l);
diff --git a/libc-top-half/musl/src/ctype/isgraph.c b/libc-top-half/musl/src/ctype/isgraph.c
new file mode 100644
index 0000000..292d198
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/isgraph.c
@@ -0,0 +1,14 @@
+#include <ctype.h>
+#undef isgraph
+
+int isgraph(int c)
+{
+ return (unsigned)c-0x21 < 0x5e;
+}
+
+int __isgraph_l(int c, locale_t l)
+{
+ return isgraph(c);
+}
+
+weak_alias(__isgraph_l, isgraph_l);
diff --git a/libc-top-half/musl/src/ctype/islower.c b/libc-top-half/musl/src/ctype/islower.c
new file mode 100644
index 0000000..c3fa74c
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/islower.c
@@ -0,0 +1,14 @@
+#include <ctype.h>
+#undef islower
+
+int islower(int c)
+{
+ return (unsigned)c-'a' < 26;
+}
+
+int __islower_l(int c, locale_t l)
+{
+ return islower(c);
+}
+
+weak_alias(__islower_l, islower_l);
diff --git a/libc-top-half/musl/src/ctype/isprint.c b/libc-top-half/musl/src/ctype/isprint.c
new file mode 100644
index 0000000..b950816
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/isprint.c
@@ -0,0 +1,14 @@
+#include <ctype.h>
+#undef isprint
+
+int isprint(int c)
+{
+ return (unsigned)c-0x20 < 0x5f;
+}
+
+int __isprint_l(int c, locale_t l)
+{
+ return isprint(c);
+}
+
+weak_alias(__isprint_l, isprint_l);
diff --git a/libc-top-half/musl/src/ctype/ispunct.c b/libc-top-half/musl/src/ctype/ispunct.c
new file mode 100644
index 0000000..a491d5d
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/ispunct.c
@@ -0,0 +1,13 @@
+#include <ctype.h>
+
+int ispunct(int c)
+{
+ return isgraph(c) && !isalnum(c);
+}
+
+int __ispunct_l(int c, locale_t l)
+{
+ return ispunct(c);
+}
+
+weak_alias(__ispunct_l, ispunct_l);
diff --git a/libc-top-half/musl/src/ctype/isspace.c b/libc-top-half/musl/src/ctype/isspace.c
new file mode 100644
index 0000000..428813e
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/isspace.c
@@ -0,0 +1,14 @@
+#include <ctype.h>
+#undef isspace
+
+int isspace(int c)
+{
+ return c == ' ' || (unsigned)c-'\t' < 5;
+}
+
+int __isspace_l(int c, locale_t l)
+{
+ return isspace(c);
+}
+
+weak_alias(__isspace_l, isspace_l);
diff --git a/libc-top-half/musl/src/ctype/isupper.c b/libc-top-half/musl/src/ctype/isupper.c
new file mode 100644
index 0000000..bfd15ac
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/isupper.c
@@ -0,0 +1,14 @@
+#include <ctype.h>
+#undef isupper
+
+int isupper(int c)
+{
+ return (unsigned)c-'A' < 26;
+}
+
+int __isupper_l(int c, locale_t l)
+{
+ return isupper(c);
+}
+
+weak_alias(__isupper_l, isupper_l);
diff --git a/libc-top-half/musl/src/ctype/iswalnum.c b/libc-top-half/musl/src/ctype/iswalnum.c
new file mode 100644
index 0000000..046c399
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iswalnum.c
@@ -0,0 +1,13 @@
+#include <wctype.h>
+
+int iswalnum(wint_t wc)
+{
+ return iswdigit(wc) || iswalpha(wc);
+}
+
+int __iswalnum_l(wint_t c, locale_t l)
+{
+ return iswalnum(c);
+}
+
+weak_alias(__iswalnum_l, iswalnum_l);
diff --git a/libc-top-half/musl/src/ctype/iswalpha.c b/libc-top-half/musl/src/ctype/iswalpha.c
new file mode 100644
index 0000000..1c5485d
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iswalpha.c
@@ -0,0 +1,21 @@
+#include <wctype.h>
+
+static const unsigned char table[] = {
+#include "alpha.h"
+};
+
+int iswalpha(wint_t wc)
+{
+ if (wc<0x20000U)
+ return (table[table[wc>>8]*32+((wc&255)>>3)]>>(wc&7))&1;
+ if (wc<0x2fffeU)
+ return 1;
+ return 0;
+}
+
+int __iswalpha_l(wint_t c, locale_t l)
+{
+ return iswalpha(c);
+}
+
+weak_alias(__iswalpha_l, iswalpha_l);
diff --git a/libc-top-half/musl/src/ctype/iswblank.c b/libc-top-half/musl/src/ctype/iswblank.c
new file mode 100644
index 0000000..68c8800
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iswblank.c
@@ -0,0 +1,14 @@
+#include <wctype.h>
+#include <ctype.h>
+
+int iswblank(wint_t wc)
+{
+ return isblank(wc);
+}
+
+int __iswblank_l(wint_t c, locale_t l)
+{
+ return iswblank(c);
+}
+
+weak_alias(__iswblank_l, iswblank_l);
diff --git a/libc-top-half/musl/src/ctype/iswcntrl.c b/libc-top-half/musl/src/ctype/iswcntrl.c
new file mode 100644
index 0000000..feccfcd
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iswcntrl.c
@@ -0,0 +1,16 @@
+#include <wctype.h>
+
+int iswcntrl(wint_t wc)
+{
+ return (unsigned)wc < 32
+ || (unsigned)(wc-0x7f) < 33
+ || (unsigned)(wc-0x2028) < 2
+ || (unsigned)(wc-0xfff9) < 3;
+}
+
+int __iswcntrl_l(wint_t c, locale_t l)
+{
+ return iswcntrl(c);
+}
+
+weak_alias(__iswcntrl_l, iswcntrl_l);
diff --git a/libc-top-half/musl/src/ctype/iswctype.c b/libc-top-half/musl/src/ctype/iswctype.c
new file mode 100644
index 0000000..71b09b8
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iswctype.c
@@ -0,0 +1,75 @@
+#include <wctype.h>
+#include <string.h>
+
+#define WCTYPE_ALNUM 1
+#define WCTYPE_ALPHA 2
+#define WCTYPE_BLANK 3
+#define WCTYPE_CNTRL 4
+#define WCTYPE_DIGIT 5
+#define WCTYPE_GRAPH 6
+#define WCTYPE_LOWER 7
+#define WCTYPE_PRINT 8
+#define WCTYPE_PUNCT 9
+#define WCTYPE_SPACE 10
+#define WCTYPE_UPPER 11
+#define WCTYPE_XDIGIT 12
+
+int iswctype(wint_t wc, wctype_t type)
+{
+ switch (type) {
+ case WCTYPE_ALNUM:
+ return iswalnum(wc);
+ case WCTYPE_ALPHA:
+ return iswalpha(wc);
+ case WCTYPE_BLANK:
+ return iswblank(wc);
+ case WCTYPE_CNTRL:
+ return iswcntrl(wc);
+ case WCTYPE_DIGIT:
+ return iswdigit(wc);
+ case WCTYPE_GRAPH:
+ return iswgraph(wc);
+ case WCTYPE_LOWER:
+ return iswlower(wc);
+ case WCTYPE_PRINT:
+ return iswprint(wc);
+ case WCTYPE_PUNCT:
+ return iswpunct(wc);
+ case WCTYPE_SPACE:
+ return iswspace(wc);
+ case WCTYPE_UPPER:
+ return iswupper(wc);
+ case WCTYPE_XDIGIT:
+ return iswxdigit(wc);
+ }
+ return 0;
+}
+
+wctype_t wctype(const char *s)
+{
+ int i;
+ const char *p;
+ /* order must match! */
+ static const char names[] =
+ "alnum\0" "alpha\0" "blank\0"
+ "cntrl\0" "digit\0" "graph\0"
+ "lower\0" "print\0" "punct\0"
+ "space\0" "upper\0" "xdigit";
+ for (i=1, p=names; *p; i++, p+=6)
+ if (*s == *p && !strcmp(s, p))
+ return i;
+ return 0;
+}
+
+int __iswctype_l(wint_t c, wctype_t t, locale_t l)
+{
+ return iswctype(c, t);
+}
+
+wctype_t __wctype_l(const char *s, locale_t l)
+{
+ return wctype(s);
+}
+
+weak_alias(__iswctype_l, iswctype_l);
+weak_alias(__wctype_l, wctype_l);
diff --git a/libc-top-half/musl/src/ctype/iswdigit.c b/libc-top-half/musl/src/ctype/iswdigit.c
new file mode 100644
index 0000000..db817ed
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iswdigit.c
@@ -0,0 +1,15 @@
+#include <wctype.h>
+
+#undef iswdigit
+
+int iswdigit(wint_t wc)
+{
+ return (unsigned)wc-'0' < 10;
+}
+
+int __iswdigit_l(wint_t c, locale_t l)
+{
+ return iswdigit(c);
+}
+
+weak_alias(__iswdigit_l, iswdigit_l);
diff --git a/libc-top-half/musl/src/ctype/iswgraph.c b/libc-top-half/musl/src/ctype/iswgraph.c
new file mode 100644
index 0000000..ecdf466
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iswgraph.c
@@ -0,0 +1,14 @@
+#include <wctype.h>
+
+int iswgraph(wint_t wc)
+{
+ /* ISO C defines this function as: */
+ return !iswspace(wc) && iswprint(wc);
+}
+
+int __iswgraph_l(wint_t c, locale_t l)
+{
+ return iswgraph(c);
+}
+
+weak_alias(__iswgraph_l, iswgraph_l);
diff --git a/libc-top-half/musl/src/ctype/iswlower.c b/libc-top-half/musl/src/ctype/iswlower.c
new file mode 100644
index 0000000..f02a436
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iswlower.c
@@ -0,0 +1,13 @@
+#include <wctype.h>
+
+int iswlower(wint_t wc)
+{
+ return towupper(wc) != wc;
+}
+
+int __iswlower_l(wint_t c, locale_t l)
+{
+ return iswlower(c);
+}
+
+weak_alias(__iswlower_l, iswlower_l);
diff --git a/libc-top-half/musl/src/ctype/iswprint.c b/libc-top-half/musl/src/ctype/iswprint.c
new file mode 100644
index 0000000..86f9d64
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iswprint.c
@@ -0,0 +1,26 @@
+#include <wctype.h>
+
+/* Consider all legal codepoints as printable except for:
+ * - C0 and C1 control characters
+ * - U+2028 and U+2029 (line/para break)
+ * - U+FFF9 through U+FFFB (interlinear annotation controls)
+ * The following code is optimized heavily to make hot paths for the
+ * expected printable characters. */
+
+int iswprint(wint_t wc)
+{
+ if (wc < 0xffU)
+ return (wc+1 & 0x7f) >= 0x21;
+ if (wc < 0x2028U || wc-0x202aU < 0xd800-0x202a || wc-0xe000U < 0xfff9-0xe000)
+ return 1;
+ if (wc-0xfffcU > 0x10ffff-0xfffc || (wc&0xfffe)==0xfffe)
+ return 0;
+ return 1;
+}
+
+int __iswprint_l(wint_t c, locale_t l)
+{
+ return iswprint(c);
+}
+
+weak_alias(__iswprint_l, iswprint_l);
diff --git a/libc-top-half/musl/src/ctype/iswpunct.c b/libc-top-half/musl/src/ctype/iswpunct.c
new file mode 100644
index 0000000..f0b9ea0
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iswpunct.c
@@ -0,0 +1,19 @@
+#include <wctype.h>
+
+static const unsigned char table[] = {
+#include "punct.h"
+};
+
+int iswpunct(wint_t wc)
+{
+ if (wc<0x20000U)
+ return (table[table[wc>>8]*32+((wc&255)>>3)]>>(wc&7))&1;
+ return 0;
+}
+
+int __iswpunct_l(wint_t c, locale_t l)
+{
+ return iswpunct(c);
+}
+
+weak_alias(__iswpunct_l, iswpunct_l);
diff --git a/libc-top-half/musl/src/ctype/iswspace.c b/libc-top-half/musl/src/ctype/iswspace.c
new file mode 100644
index 0000000..263afa1
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iswspace.c
@@ -0,0 +1,24 @@
+#include <wchar.h>
+#include <wctype.h>
+
+/* Our definition of whitespace is the Unicode White_Space property,
+ * minus non-breaking spaces (U+00A0, U+2007, and U+202F) and script-
+ * specific characters with non-blank glyphs (U+1680 and U+180E). */
+
+int iswspace(wint_t wc)
+{
+ static const wchar_t spaces[] = {
+ ' ', '\t', '\n', '\r', 11, 12, 0x0085,
+ 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005,
+ 0x2006, 0x2008, 0x2009, 0x200a,
+ 0x2028, 0x2029, 0x205f, 0x3000, 0
+ };
+ return wc && wcschr(spaces, wc);
+}
+
+int __iswspace_l(wint_t c, locale_t l)
+{
+ return iswspace(c);
+}
+
+weak_alias(__iswspace_l, iswspace_l);
diff --git a/libc-top-half/musl/src/ctype/iswupper.c b/libc-top-half/musl/src/ctype/iswupper.c
new file mode 100644
index 0000000..7e48666
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iswupper.c
@@ -0,0 +1,13 @@
+#include <wctype.h>
+
+int iswupper(wint_t wc)
+{
+ return towlower(wc) != wc;
+}
+
+int __iswupper_l(wint_t c, locale_t l)
+{
+ return iswupper(c);
+}
+
+weak_alias(__iswupper_l, iswupper_l);
diff --git a/libc-top-half/musl/src/ctype/iswxdigit.c b/libc-top-half/musl/src/ctype/iswxdigit.c
new file mode 100644
index 0000000..62bc9e7
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/iswxdigit.c
@@ -0,0 +1,13 @@
+#include <wctype.h>
+
+int iswxdigit(wint_t wc)
+{
+ return (unsigned)(wc-'0') < 10 || (unsigned)((wc|32)-'a') < 6;
+}
+
+int __iswxdigit_l(wint_t c, locale_t l)
+{
+ return iswxdigit(c);
+}
+
+weak_alias(__iswxdigit_l, iswxdigit_l);
diff --git a/libc-top-half/musl/src/ctype/isxdigit.c b/libc-top-half/musl/src/ctype/isxdigit.c
new file mode 100644
index 0000000..aab1a74
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/isxdigit.c
@@ -0,0 +1,13 @@
+#include <ctype.h>
+
+int isxdigit(int c)
+{
+ return isdigit(c) || ((unsigned)c|32)-'a' < 6;
+}
+
+int __isxdigit_l(int c, locale_t l)
+{
+ return isxdigit(c);
+}
+
+weak_alias(__isxdigit_l, isxdigit_l);
diff --git a/libc-top-half/musl/src/ctype/nonspacing.h b/libc-top-half/musl/src/ctype/nonspacing.h
new file mode 100644
index 0000000..7746f3b
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/nonspacing.h
@@ -0,0 +1,91 @@
+16,16,16,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,16,33,16,16,16,34,35,36,
+37,38,39,40,16,16,41,16,16,16,16,16,16,16,16,16,16,16,42,43,16,16,44,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,45,16,46,47,48,49,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,50,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,51,16,16,52,
+53,16,54,55,56,16,16,16,16,16,16,57,16,16,58,16,59,60,61,62,63,64,65,66,67,68,
+69,70,16,71,72,73,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,74,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,75,76,16,16,16,77,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,78,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,79,80,16,16,16,16,16,16,16,81,16,16,16,16,16,82,83,84,16,16,16,16,16,85,
+86,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,248,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,254,255,255,255,255,191,182,0,0,0,0,0,0,0,63,0,255,23,0,0,0,0,0,248,255,
+255,0,0,1,0,0,0,0,0,0,0,0,0,0,0,192,191,159,61,0,0,0,128,2,0,0,0,255,255,255,
+7,0,0,0,0,0,0,0,0,0,0,192,255,1,0,0,0,0,0,0,248,15,32,0,0,192,251,239,62,0,0,
+0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,255,255,255,255,
+255,7,0,0,0,0,0,0,20,254,33,254,0,12,0,0,0,2,0,0,0,0,0,0,16,30,32,0,0,12,0,0,
+64,6,0,0,0,0,0,0,16,134,57,2,0,0,0,35,0,6,0,0,0,0,0,0,16,190,33,0,0,12,0,0,
+252,2,0,0,0,0,0,0,144,30,32,64,0,12,0,0,0,4,0,0,0,0,0,0,0,1,32,0,0,0,0,0,0,17,
+0,0,0,0,0,0,192,193,61,96,0,12,0,0,0,2,0,0,0,0,0,0,144,64,48,0,0,12,0,0,0,3,0,
+0,0,0,0,0,24,30,32,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,4,92,0,0,0,0,0,0,0,0,0,0,0,
+242,7,128,127,0,0,0,0,0,0,0,0,0,0,0,0,242,31,0,63,0,0,0,0,0,0,0,0,0,3,0,0,160,
+2,0,0,0,0,0,0,254,127,223,224,255,254,255,255,255,31,64,0,0,0,0,0,0,0,0,0,0,0,
+0,224,253,102,0,0,0,195,1,0,30,0,100,32,0,32,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,28,0,0,0,28,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,176,63,64,254,
+15,32,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,135,1,4,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+128,9,0,0,0,0,0,0,64,127,229,31,248,159,0,0,0,0,0,0,255,127,0,0,0,0,0,0,0,0,
+15,0,0,0,0,0,208,23,4,0,0,0,0,248,15,0,3,0,0,0,60,59,0,0,0,0,0,0,64,163,3,0,0,
+0,0,0,0,240,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,255,253,33,16,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,
+251,0,248,0,0,0,124,0,0,0,0,0,0,223,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,
+255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,
+0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,128,247,63,0,0,0,192,0,0,0,0,0,0,0,0,0,0,3,0,68,8,0,0,96,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,255,255,3,128,0,0,0,0,192,63,0,0,128,255,3,0,
+0,0,0,0,7,0,0,0,0,0,200,51,0,0,0,0,32,0,0,
+0,0,0,0,0,0,126,102,0,8,16,0,0,0,0,0,16,0,0,0,0,0,0,157,193,2,0,0,0,0,48,64,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,33,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,0,0,0,
+64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,
+255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,240,0,
+0,0,0,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,0,0,0,0,240,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,255,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,255,127,0,0,0,0,0,0,128,
+3,0,0,0,0,0,120,38,0,32,0,0,0,0,0,0,7,0,0,0,128,239,31,0,0,0,0,0,0,0,8,0,3,0,
+0,0,0,0,192,127,0,30,0,0,0,0,0,0,0,0,0,0,0,128,211,64,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,128,248,7,0,0,3,0,0,0,0,0,0,24,1,0,0,0,192,31,31,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,255,92,0,0,64,0,0,0,0,0,0,0,0,0,0,248,133,13,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,176,1,0,0,48,0,0,0,0,0,0,0,0,0,0,
+248,167,1,0,0,0,0,0,0,0,0,0,0,0,0,40,191,0,0,0,0,0,0,0,0,0,0,0,0,224,188,15,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,6,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,240,12,1,0,0,0,254,7,0,0,0,0,248,121,128,0,126,14,0,0,0,0,0,252,
+127,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,191,0,0,0,0,0,0,0,0,0,0,252,255,
+255,252,109,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,126,180,191,0,0,0,0,0,0,0,0,0,163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,255,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,7,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,15,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,248,255,231,15,0,0,0,60,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
+255,255,255,255,127,248,255,255,255,255,255,31,32,0,16,0,0,248,254,255,0,0,0,
+0,0,0,0,0,0,0,127,255,255,249,219,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,240,7,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
diff --git a/libc-top-half/musl/src/ctype/punct.h b/libc-top-half/musl/src/ctype/punct.h
new file mode 100644
index 0000000..6792947
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/punct.h
@@ -0,0 +1,141 @@
+18,16,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,16,16,34,35,16,36,37,38,39,
+40,41,42,43,16,44,45,46,17,17,47,17,17,17,17,17,17,48,49,50,51,52,53,54,55,17,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,56,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,57,16,58,59,60,61,62,63,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,64,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,65,16,16,66,16,67,68,
+69,16,70,71,72,16,73,16,16,74,75,76,77,78,16,79,80,81,82,83,84,85,86,87,88,89,
+90,91,16,92,93,94,95,16,16,16,16,96,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,97,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,98,99,16,16,100,101,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,102,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,103,104,105,106,16,16,107,108,17,17,109,16,16,16,16,16,16,110,111,16,
+16,16,16,16,112,113,16,16,114,115,116,16,117,118,119,17,17,17,120,121,122,123,
+124,16,16,16,16,
+16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,254,255,0,252,1,0,0,248,1,
+0,0,120,0,0,0,0,255,251,223,251,0,0,128,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,60,0,252,255,224,175,255,255,255,255,255,255,255,255,
+255,255,223,255,255,255,255,255,32,64,176,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,252,0,0,0,0,0,230,254,255,255,255,0,64,73,0,0,0,0,0,24,0,255,255,0,216,
+0,0,0,0,0,0,0,1,0,60,0,0,0,0,0,0,0,0,0,0,0,0,16,224,1,30,0,
+96,255,191,0,0,0,0,0,0,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,207,
+227,0,0,0,3,0,32,255,127,0,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,7,252,0,0,0,
+0,0,0,0,0,0,16,0,32,30,0,48,0,1,0,0,0,0,0,0,0,0,16,0,32,0,0,0,0,252,111,0,0,0,
+0,0,0,0,16,0,32,0,0,0,0,64,0,0,0,0,0,0,0,0,16,0,32,0,0,0,0,3,224,0,0,0,0,0,0,
+0,16,0,32,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,255,7,16,0,0,0,0,0,0,0,0,
+32,0,0,0,0,128,255,16,0,0,0,0,0,0,16,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,160,
+0,127,0,0,255,3,0,0,0,0,0,0,0,0,0,4,0,0,0,0,16,0,0,0,0,0,0,128,0,128,192,223,
+0,12,0,0,0,0,0,0,0,0,0,0,0,4,0,31,0,0,0,0,0,
+0,254,255,255,255,0,252,255,255,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,192,255,223,
+255,7,0,0,0,0,0,0,0,0,0,0,128,6,0,252,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,
+0,0,8,0,0,0,0,0,0,0,0,0,0,0,224,255,255,255,31,0,0,255,3,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,96,0,0,1,0,0,24,0,0,0,0,0,0,0,0,0,56,0,0,0,0,16,0,0,0,112,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,254,127,47,0,0,255,3,255,127,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,49,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,196,255,255,255,
+255,0,0,0,192,0,0,0,0,0,0,0,0,1,0,224,159,0,0,0,0,127,63,255,127,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,16,0,16,0,0,252,255,255,255,31,0,0,0,0,0,12,0,0,0,0,0,0,64,0,
+12,240,0,0,0,0,0,0,128,248,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,255,0,255,255,
+255,33,144,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,
+127,0,224,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,3,224,0,224,0,
+224,0,96,128,248,255,255,255,252,255,255,255,255,255,127,223,255,241,127,255,
+127,0,0,255,255,255,255,0,0,255,255,255,255,1,0,123,3,208,193,175,66,0,12,31,
+188,255,255,0,0,0,0,0,14,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,127,0,0,0,255,7,0,0,255,255,255,255,255,255,255,255,255,
+255,63,0,0,0,0,0,0,252,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,207,255,255,255,
+63,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,135,3,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,127,255,255,255,255,0,
+0,0,0,0,0,255,255,255,251,255,255,255,255,255,255,255,255,255,255,15,0,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,63,0,0,0,255,15,30,255,255,255,1,252,193,224,0,0,0,0,
+0,0,0,0,0,0,0,30,1,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+255,255,0,0,0,0,255,255,255,255,15,0,0,0,255,255,255,127,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,
+255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,
+255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,0,0,0,
+0,0,0,192,0,224,0,0,0,0,0,0,0,0,0,0,0,128,15,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+255,0,255,255,127,0,3,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+64,0,0,0,0,15,255,3,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,16,192,0,0,255,255,3,23,
+0,0,0,0,0,248,0,0,0,0,8,128,0,0,0,0,0,0,0,0,0,0,8,0,255,63,0,192,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,240,0,0,128,3,0,0,0,0,0,0,0,128,2,0,0,192,0,0,67,0,0,0,0,0,
+0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,
+0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,2,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,252,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,255,255,255,3,255,255,255,255,255,255,247,
+255,127,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,254,255,0,252,1,0,0,248,1,0,
+0,248,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,0,48,135,255,255,255,255,255,
+143,255,0,0,0,0,0,0,224,255,255,127,255,15,1,0,0,0,0,0,255,255,255,255,255,63,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,
+15,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+128,255,0,0,128,255,0,0,0,0,128,255,0,0,0,0,0,0,0,0,0,248,0,0,192,143,0,0,0,
+128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,255,255,252,255,255,255,255,255,0,0,0,0,
+0,0,0,135,255,1,255,1,0,0,0,224,0,0,0,224,0,0,0,0,0,1,0,0,96,248,127,0,0,0,0,
+0,0,0,0,254,0,0,0,255,0,0,0,255,0,0,0,30,0,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,0,0,0,0,0,
+0,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,224,127,0,0,0,192,255,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,192,63,252,255,63,0,0,128,3,0,0,0,0,0,0,254,3,32,0,0,0,0,0,0,0,
+0,0,0,0,0,24,0,15,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,225,63,0,232,254,255,31,0,0,
+0,0,0,0,0,96,63,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,
+24,0,32,0,0,192,31,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,
+248,0,104,0,0,0,0,0,0,0,0,0,0,0,0,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,128,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,128,14,0,0,0,255,
+31,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,8,0,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,7,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,24,128,255,0,0,0,0,0,
+0,0,0,0,0,223,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,62,0,0,252,255,31,3,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,0,0,0,0,0,0,0,0,0,128,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,
+255,3,
+128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,0,0,0,0,0,0,0,255,255,48,0,0,248,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
+255,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,15,0,0,0,0,0,0,
+0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,63,
+0,255,255,255,255,127,254,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,1,0,0,255,255,255,255,255,255,255,255,
+63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,15,0,255,255,255,255,255,255,
+255,255,255,255,127,0,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,8,0,0,0,8,0,0,32,0,0,0,32,0,0,128,
+0,0,0,128,0,0,0,2,0,0,0,2,0,0,8,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,15,0,248,254,255,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,127,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,
+128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,127,0,0,0,0,0,0,0,
+0,0,0,0,0,0,112,7,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,254,255,255,255,255,255,255,255,31,0,0,0,0,0,0,0,0,0,254,255,
+255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,255,255,255,255,255,
+15,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,127,254,255,254,
+255,254,255,255,255,63,0,255,31,255,255,255,255,0,0,0,252,0,0,0,28,0,0,0,252,
+255,255,255,31,0,0,0,0,0,0,192,255,255,255,7,0,255,255,255,255,255,15,255,1,3,
+0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,63,0,255,31,255,7,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,15,0,255,255,255,255,255,255,255,255,255,255,255,1,
+255,15,0,0,255,15,255,255,255,255,255,255,255,0,255,3,255,255,255,255,255,0,
+255,255,255,63,0,0,0,0,0,0,0,0,0,0,255,239,255,255,255,255,255,255,255,255,
+255,255,255,255,123,252,255,255,255,255,231,199,255,255,255,231,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,63,15,7,7,0,63,0,
+0,0,0,0,0,0,0,0,0,0,0,0,
diff --git a/libc-top-half/musl/src/ctype/toascii.c b/libc-top-half/musl/src/ctype/toascii.c
new file mode 100644
index 0000000..f0e48e8
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/toascii.c
@@ -0,0 +1,7 @@
+#include <ctype.h>
+
+/* nonsense function that should NEVER be used! */
+int toascii(int c)
+{
+ return c & 0x7f;
+}
diff --git a/libc-top-half/musl/src/ctype/tolower.c b/libc-top-half/musl/src/ctype/tolower.c
new file mode 100644
index 0000000..f10132e
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/tolower.c
@@ -0,0 +1,14 @@
+#include <ctype.h>
+
+int tolower(int c)
+{
+ if (isupper(c)) return c | 32;
+ return c;
+}
+
+int __tolower_l(int c, locale_t l)
+{
+ return tolower(c);
+}
+
+weak_alias(__tolower_l, tolower_l);
diff --git a/libc-top-half/musl/src/ctype/toupper.c b/libc-top-half/musl/src/ctype/toupper.c
new file mode 100644
index 0000000..4e74a55
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/toupper.c
@@ -0,0 +1,14 @@
+#include <ctype.h>
+
+int toupper(int c)
+{
+ if (islower(c)) return c & 0x5f;
+ return c;
+}
+
+int __toupper_l(int c, locale_t l)
+{
+ return toupper(c);
+}
+
+weak_alias(__toupper_l, toupper_l);
diff --git a/libc-top-half/musl/src/ctype/towctrans.c b/libc-top-half/musl/src/ctype/towctrans.c
new file mode 100644
index 0000000..76d1376
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/towctrans.c
@@ -0,0 +1,84 @@
+#include <wctype.h>
+
+static const unsigned char tab[];
+
+static const unsigned char rulebases[512];
+static const int rules[];
+
+static const unsigned char exceptions[][2];
+
+#include "casemap.h"
+
+static int casemap(unsigned c, int dir)
+{
+ unsigned b, x, y, v, rt, xb, xn;
+ int r, rd, c0 = c;
+
+ if (c >= 0x20000) return c;
+
+ b = c>>8;
+ c &= 255;
+ x = c/3;
+ y = c%3;
+
+ /* lookup entry in two-level base-6 table */
+ v = tab[tab[b]*86+x];
+ static const int mt[] = { 2048, 342, 57 };
+ v = (v*mt[y]>>11)%6;
+
+ /* use the bit vector out of the tables as an index into
+ * a block-specific set of rules and decode the rule into
+ * a type and a case-mapping delta. */
+ r = rules[rulebases[b]+v];
+ rt = r & 255;
+ rd = r >> 8;
+
+ /* rules 0/1 are simple lower/upper case with a delta.
+ * apply according to desired mapping direction. */
+ if (rt < 2) return c0 + (rd & -(rt^dir));
+
+ /* binary search. endpoints of the binary search for
+ * this block are stored in the rule delta field. */
+ xn = rd & 0xff;
+ xb = (unsigned)rd >> 8;
+ while (xn) {
+ unsigned try = exceptions[xb+xn/2][0];
+ if (try == c) {
+ r = rules[exceptions[xb+xn/2][1]];
+ rt = r & 255;
+ rd = r >> 8;
+ if (rt < 2) return c0 + (rd & -(rt^dir));
+ /* Hard-coded for the four exceptional titlecase */
+ return c0 + (dir ? -1 : 1);
+ } else if (try > c) {
+ xn /= 2;
+ } else {
+ xb += xn/2;
+ xn -= xn/2;
+ }
+ }
+ return c0;
+}
+
+wint_t towlower(wint_t wc)
+{
+ return casemap(wc, 0);
+}
+
+wint_t towupper(wint_t wc)
+{
+ return casemap(wc, 1);
+}
+
+wint_t __towupper_l(wint_t c, locale_t l)
+{
+ return towupper(c);
+}
+
+wint_t __towlower_l(wint_t c, locale_t l)
+{
+ return towlower(c);
+}
+
+weak_alias(__towupper_l, towupper_l);
+weak_alias(__towlower_l, towlower_l);
diff --git a/libc-top-half/musl/src/ctype/wcswidth.c b/libc-top-half/musl/src/ctype/wcswidth.c
new file mode 100644
index 0000000..5c8a5a4
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/wcswidth.c
@@ -0,0 +1,8 @@
+#include <wchar.h>
+
+int wcswidth(const wchar_t *wcs, size_t n)
+{
+ int l=0, k=0;
+ for (; n-- && *wcs && (k = wcwidth(*wcs)) >= 0; l+=k, wcs++);
+ return (k < 0) ? k : l;
+}
diff --git a/libc-top-half/musl/src/ctype/wctrans.c b/libc-top-half/musl/src/ctype/wctrans.c
new file mode 100644
index 0000000..d3eda52
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/wctrans.c
@@ -0,0 +1,29 @@
+#include <wctype.h>
+#include <string.h>
+
+wctrans_t wctrans(const char *class)
+{
+ if (!strcmp(class, "toupper")) return (wctrans_t)1;
+ if (!strcmp(class, "tolower")) return (wctrans_t)2;
+ return 0;
+}
+
+wint_t towctrans(wint_t wc, wctrans_t trans)
+{
+ if (trans == (wctrans_t)1) return towupper(wc);
+ if (trans == (wctrans_t)2) return towlower(wc);
+ return wc;
+}
+
+wctrans_t __wctrans_l(const char *s, locale_t l)
+{
+ return wctrans(s);
+}
+
+wint_t __towctrans_l(wint_t c, wctrans_t t, locale_t l)
+{
+ return towctrans(c, t);
+}
+
+weak_alias(__wctrans_l, wctrans_l);
+weak_alias(__towctrans_l, towctrans_l);
diff --git a/libc-top-half/musl/src/ctype/wcwidth.c b/libc-top-half/musl/src/ctype/wcwidth.c
new file mode 100644
index 0000000..36256a5
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/wcwidth.c
@@ -0,0 +1,29 @@
+#include <wchar.h>
+
+static const unsigned char table[] = {
+#include "nonspacing.h"
+};
+
+static const unsigned char wtable[] = {
+#include "wide.h"
+};
+
+int wcwidth(wchar_t wc)
+{
+ if (wc < 0xffU)
+ return (wc+1 & 0x7f) >= 0x21 ? 1 : wc ? -1 : 0;
+ if ((wc & 0xfffeffffU) < 0xfffe) {
+ if ((table[table[wc>>8]*32+((wc&255)>>3)]>>(wc&7))&1)
+ return 0;
+ if ((wtable[wtable[wc>>8]*32+((wc&255)>>3)]>>(wc&7))&1)
+ return 2;
+ return 1;
+ }
+ if ((wc & 0xfffe) == 0xfffe)
+ return -1;
+ if (wc-0x20000U < 0x20000)
+ return 2;
+ if (wc == 0xe0001 || wc-0xe0020U < 0x5f || wc-0xe0100U < 0xef)
+ return 0;
+ return 1;
+}
diff --git a/libc-top-half/musl/src/ctype/wide.h b/libc-top-half/musl/src/ctype/wide.h
new file mode 100644
index 0000000..e403c9a
--- /dev/null
+++ b/libc-top-half/musl/src/ctype/wide.h
@@ -0,0 +1,65 @@
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,18,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,19,16,20,21,22,16,16,16,23,16,16,24,25,26,27,28,17,
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,29,
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+17,17,17,17,17,17,17,17,30,16,16,16,16,31,16,16,17,17,17,17,17,17,17,17,17,17,
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+17,17,17,17,17,17,17,32,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,16,16,16,33,
+34,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,35,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+17,17,17,17,17,17,36,17,17,37,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,38,39,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,40,41,42,43,44,45,46,47,16,48,49,16,16,16,16,
+16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,6,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,48,0,0,0,0,0,0,255,15,0,0,0,0,128,0,0,8,
+0,2,12,0,96,48,64,16,0,0,4,44,36,32,12,0,0,0,1,0,0,0,80,184,0,0,0,0,0,0,0,224,
+0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,251,255,255,255,255,255,255,255,
+255,255,255,15,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,255,15,255,255,255,255,
+255,255,255,127,254,255,255,255,255,255,255,255,255,255,127,254,255,255,255,
+255,255,255,255,255,255,255,255,255,224,255,255,255,255,255,254,255,255,255,
+255,255,255,255,255,255,255,127,255,255,255,255,255,7,255,255,255,255,15,0,
+255,255,255,255,255,127,255,255,255,255,255,0,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,
+0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,31,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
+255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,255,3,0,0,255,255,255,255,247,255,127,15,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,255,255,255,255,255,255,
+255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,7,0,255,255,255,127,0,0,0,0,0,
+0,7,0,240,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,64,254,7,0,0,0,0,0,0,0,0,0,0,0,0,7,0,255,255,255,
+255,255,15,255,1,3,0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,
+1,224,191,255,255,255,255,255,255,255,255,223,255,255,15,0,255,255,255,255,
+255,135,15,0,255,255,17,255,255,255,255,255,255,255,255,127,253,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+159,255,255,255,255,255,255,255,63,0,120,255,255,255,0,0,4,0,0,96,0,16,0,0,0,
+0,0,0,0,0,0,0,248,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,255,255,
+255,255,255,255,255,255,63,16,39,0,0,24,240,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,255,15,0,
+0,0,224,255,255,255,255,255,255,255,255,255,255,255,255,123,252,255,255,255,
+255,231,199,255,255,255,231,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,15,7,7,0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,
diff --git a/libc-top-half/musl/src/dirent/__dirent.h b/libc-top-half/musl/src/dirent/__dirent.h
new file mode 100644
index 0000000..828a5f1
--- /dev/null
+++ b/libc-top-half/musl/src/dirent/__dirent.h
@@ -0,0 +1,11 @@
+struct __dirstream
+{
+ off_t tell;
+ int fd;
+ int buf_pos;
+ int buf_end;
+ volatile int lock[1];
+ /* Any changes to this struct must preserve the property:
+ * offsetof(struct __dirent, buf) % sizeof(off_t) == 0 */
+ char buf[2048];
+};
diff --git a/libc-top-half/musl/src/dirent/alphasort.c b/libc-top-half/musl/src/dirent/alphasort.c
new file mode 100644
index 0000000..bee672e
--- /dev/null
+++ b/libc-top-half/musl/src/dirent/alphasort.c
@@ -0,0 +1,9 @@
+#include <string.h>
+#include <dirent.h>
+
+int alphasort(const struct dirent **a, const struct dirent **b)
+{
+ return strcoll((*a)->d_name, (*b)->d_name);
+}
+
+weak_alias(alphasort, alphasort64);
diff --git a/libc-top-half/musl/src/dirent/closedir.c b/libc-top-half/musl/src/dirent/closedir.c
new file mode 100644
index 0000000..e794ae9
--- /dev/null
+++ b/libc-top-half/musl/src/dirent/closedir.c
@@ -0,0 +1,11 @@
+#include <dirent.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "__dirent.h"
+
+int closedir(DIR *dir)
+{
+ int ret = close(dir->fd);
+ free(dir);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/dirent/dirfd.c b/libc-top-half/musl/src/dirent/dirfd.c
new file mode 100644
index 0000000..6c86007
--- /dev/null
+++ b/libc-top-half/musl/src/dirent/dirfd.c
@@ -0,0 +1,7 @@
+#include <dirent.h>
+#include "__dirent.h"
+
+int dirfd(DIR *d)
+{
+ return d->fd;
+}
diff --git a/libc-top-half/musl/src/dirent/fdopendir.c b/libc-top-half/musl/src/dirent/fdopendir.c
new file mode 100644
index 0000000..d78fb87
--- /dev/null
+++ b/libc-top-half/musl/src/dirent/fdopendir.c
@@ -0,0 +1,31 @@
+#include <dirent.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <stdlib.h>
+#include "__dirent.h"
+
+DIR *fdopendir(int fd)
+{
+ DIR *dir;
+ struct stat st;
+
+ if (fstat(fd, &st) < 0) {
+ return 0;
+ }
+ if (fcntl(fd, F_GETFL) & O_PATH) {
+ errno = EBADF;
+ return 0;
+ }
+ if (!S_ISDIR(st.st_mode)) {
+ errno = ENOTDIR;
+ return 0;
+ }
+ if (!(dir = calloc(1, sizeof *dir))) {
+ return 0;
+ }
+
+ fcntl(fd, F_SETFD, FD_CLOEXEC);
+ dir->fd = fd;
+ return dir;
+}
diff --git a/libc-top-half/musl/src/dirent/opendir.c b/libc-top-half/musl/src/dirent/opendir.c
new file mode 100644
index 0000000..5cb84e3
--- /dev/null
+++ b/libc-top-half/musl/src/dirent/opendir.c
@@ -0,0 +1,21 @@
+#define _GNU_SOURCE
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include "__dirent.h"
+#include "syscall.h"
+
+DIR *opendir(const char *name)
+{
+ int fd;
+ DIR *dir;
+
+ if ((fd = open(name, O_RDONLY|O_DIRECTORY|O_CLOEXEC)) < 0)
+ return 0;
+ if (!(dir = calloc(1, sizeof *dir))) {
+ __syscall(SYS_close, fd);
+ return 0;
+ }
+ dir->fd = fd;
+ return dir;
+}
diff --git a/libc-top-half/musl/src/dirent/readdir.c b/libc-top-half/musl/src/dirent/readdir.c
new file mode 100644
index 0000000..569fc70
--- /dev/null
+++ b/libc-top-half/musl/src/dirent/readdir.c
@@ -0,0 +1,29 @@
+#include <dirent.h>
+#include <errno.h>
+#include <stddef.h>
+#include "__dirent.h"
+#include "syscall.h"
+
+typedef char dirstream_buf_alignment_check[1-2*(int)(
+ offsetof(struct __dirstream, buf) % sizeof(off_t))];
+
+struct dirent *readdir(DIR *dir)
+{
+ struct dirent *de;
+
+ if (dir->buf_pos >= dir->buf_end) {
+ int len = __syscall(SYS_getdents, dir->fd, dir->buf, sizeof dir->buf);
+ if (len <= 0) {
+ if (len < 0 && len != -ENOENT) errno = -len;
+ return 0;
+ }
+ dir->buf_end = len;
+ dir->buf_pos = 0;
+ }
+ de = (void *)(dir->buf + dir->buf_pos);
+ dir->buf_pos += de->d_reclen;
+ dir->tell = de->d_off;
+ return de;
+}
+
+weak_alias(readdir, readdir64);
diff --git a/libc-top-half/musl/src/dirent/readdir_r.c b/libc-top-half/musl/src/dirent/readdir_r.c
new file mode 100644
index 0000000..e2a818f
--- /dev/null
+++ b/libc-top-half/musl/src/dirent/readdir_r.c
@@ -0,0 +1,29 @@
+#include <dirent.h>
+#include <errno.h>
+#include <string.h>
+#include "__dirent.h"
+#include "lock.h"
+
+int readdir_r(DIR *restrict dir, struct dirent *restrict buf, struct dirent **restrict result)
+{
+ struct dirent *de;
+ int errno_save = errno;
+ int ret;
+
+ LOCK(dir->lock);
+ errno = 0;
+ de = readdir(dir);
+ if ((ret = errno)) {
+ UNLOCK(dir->lock);
+ return ret;
+ }
+ errno = errno_save;
+ if (de) memcpy(buf, de, de->d_reclen);
+ else buf = NULL;
+
+ UNLOCK(dir->lock);
+ *result = buf;
+ return 0;
+}
+
+weak_alias(readdir_r, readdir64_r);
diff --git a/libc-top-half/musl/src/dirent/rewinddir.c b/libc-top-half/musl/src/dirent/rewinddir.c
new file mode 100644
index 0000000..7ddda43
--- /dev/null
+++ b/libc-top-half/musl/src/dirent/rewinddir.c
@@ -0,0 +1,13 @@
+#include <dirent.h>
+#include <unistd.h>
+#include "__dirent.h"
+#include "lock.h"
+
+void rewinddir(DIR *dir)
+{
+ LOCK(dir->lock);
+ lseek(dir->fd, 0, SEEK_SET);
+ dir->buf_pos = dir->buf_end = 0;
+ dir->tell = 0;
+ UNLOCK(dir->lock);
+}
diff --git a/libc-top-half/musl/src/dirent/scandir.c b/libc-top-half/musl/src/dirent/scandir.c
new file mode 100644
index 0000000..7ee195d
--- /dev/null
+++ b/libc-top-half/musl/src/dirent/scandir.c
@@ -0,0 +1,47 @@
+#include <dirent.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <errno.h>
+#include <stddef.h>
+
+int scandir(const char *path, struct dirent ***res,
+ int (*sel)(const struct dirent *),
+ int (*cmp)(const struct dirent **, const struct dirent **))
+{
+ DIR *d = opendir(path);
+ struct dirent *de, **names=0, **tmp;
+ size_t cnt=0, len=0;
+ int old_errno = errno;
+
+ if (!d) return -1;
+
+ while ((errno=0), (de = readdir(d))) {
+ if (sel && !sel(de)) continue;
+ if (cnt >= len) {
+ len = 2*len+1;
+ if (len > SIZE_MAX/sizeof *names) break;
+ tmp = realloc(names, len * sizeof *names);
+ if (!tmp) break;
+ names = tmp;
+ }
+ names[cnt] = malloc(de->d_reclen);
+ if (!names[cnt]) break;
+ memcpy(names[cnt++], de, de->d_reclen);
+ }
+
+ closedir(d);
+
+ if (errno) {
+ if (names) while (cnt-->0) free(names[cnt]);
+ free(names);
+ return -1;
+ }
+ errno = old_errno;
+
+ if (cmp) qsort(names, cnt, sizeof *names, (int (*)(const void *, const void *))cmp);
+ *res = names;
+ return cnt;
+}
+
+weak_alias(scandir, scandir64);
diff --git a/libc-top-half/musl/src/dirent/seekdir.c b/libc-top-half/musl/src/dirent/seekdir.c
new file mode 100644
index 0000000..bf6cc6e
--- /dev/null
+++ b/libc-top-half/musl/src/dirent/seekdir.c
@@ -0,0 +1,12 @@
+#include <dirent.h>
+#include <unistd.h>
+#include "__dirent.h"
+#include "lock.h"
+
+void seekdir(DIR *dir, long off)
+{
+ LOCK(dir->lock);
+ dir->tell = lseek(dir->fd, off, SEEK_SET);
+ dir->buf_pos = dir->buf_end = 0;
+ UNLOCK(dir->lock);
+}
diff --git a/libc-top-half/musl/src/dirent/telldir.c b/libc-top-half/musl/src/dirent/telldir.c
new file mode 100644
index 0000000..cf25acf
--- /dev/null
+++ b/libc-top-half/musl/src/dirent/telldir.c
@@ -0,0 +1,7 @@
+#include <dirent.h>
+#include "__dirent.h"
+
+long telldir(DIR *dir)
+{
+ return dir->tell;
+}
diff --git a/libc-top-half/musl/src/dirent/versionsort.c b/libc-top-half/musl/src/dirent/versionsort.c
new file mode 100644
index 0000000..d4c4892
--- /dev/null
+++ b/libc-top-half/musl/src/dirent/versionsort.c
@@ -0,0 +1,11 @@
+#define _GNU_SOURCE
+#include <string.h>
+#include <dirent.h>
+
+int versionsort(const struct dirent **a, const struct dirent **b)
+{
+ return strverscmp((*a)->d_name, (*b)->d_name);
+}
+
+#undef versionsort64
+weak_alias(versionsort, versionsort64);
diff --git a/libc-top-half/musl/src/env/__environ.c b/libc-top-half/musl/src/env/__environ.c
new file mode 100644
index 0000000..fe8abcf
--- /dev/null
+++ b/libc-top-half/musl/src/env/__environ.c
@@ -0,0 +1,6 @@
+#include <unistd.h>
+
+char **__environ = 0;
+weak_alias(__environ, ___environ);
+weak_alias(__environ, _environ);
+weak_alias(__environ, environ);
diff --git a/libc-top-half/musl/src/env/__init_tls.c b/libc-top-half/musl/src/env/__init_tls.c
new file mode 100644
index 0000000..ee785bc
--- /dev/null
+++ b/libc-top-half/musl/src/env/__init_tls.c
@@ -0,0 +1,186 @@
+#ifdef __wasilibc_unmodified_upstream
+#define SYSCALL_NO_TLS 1
+#include <elf.h>
+#endif
+#include <limits.h>
+#ifdef __wasilibc_unmodified_upstream
+#include <sys/mman.h>
+#endif
+#include <string.h>
+#include <stddef.h>
+#include "pthread_impl.h"
+#include "libc.h"
+#include "atomic.h"
+#include "syscall.h"
+
+volatile int __thread_list_lock;
+
+#ifndef __wasilibc_unmodified_upstream
+void __wasi_init_tp() {
+ __init_tp((void *)__get_tp());
+}
+#endif
+
+int __init_tp(void *p)
+{
+ pthread_t td = p;
+ td->self = td;
+#ifdef __wasilibc_unmodified_upstream
+ int r = __set_thread_area(TP_ADJ(p));
+ if (r < 0) return -1;
+ if (!r) libc.can_do_threads = 1;
+ td->detach_state = DT_JOINABLE;
+ td->tid = __syscall(SYS_set_tid_address, &__thread_list_lock);
+#endif
+ td->locale = &libc.global_locale;
+ td->robust_list.head = &td->robust_list.head;
+ td->sysinfo = __sysinfo;
+ td->next = td->prev = td;
+ return 0;
+}
+
+#ifdef __wasilibc_unmodified_upstream
+
+static struct builtin_tls {
+ char c;
+ struct pthread pt;
+ void *space[16];
+} builtin_tls[1];
+#define MIN_TLS_ALIGN offsetof(struct builtin_tls, pt)
+
+static struct tls_module main_tls;
+#endif
+
+#ifndef __wasilibc_unmodified_upstream
+extern void __wasm_init_tls(void*);
+#endif
+
+void *__copy_tls(unsigned char *mem)
+{
+#ifdef __wasilibc_unmodified_upstream
+ pthread_t td;
+ struct tls_module *p;
+ size_t i;
+ uintptr_t *dtv;
+
+#ifdef TLS_ABOVE_TP
+ dtv = (uintptr_t*)(mem + libc.tls_size) - (libc.tls_cnt + 1);
+
+ mem += -((uintptr_t)mem + sizeof(struct pthread)) & (libc.tls_align-1);
+ td = (pthread_t)mem;
+ mem += sizeof(struct pthread);
+
+ for (i=1, p=libc.tls_head; p; i++, p=p->next) {
+ dtv[i] = (uintptr_t)(mem + p->offset) + DTP_OFFSET;
+ memcpy(mem + p->offset, p->image, p->len);
+ }
+#else
+ dtv = (uintptr_t *)mem;
+
+ mem += libc.tls_size - sizeof(struct pthread);
+ mem -= (uintptr_t)mem & (libc.tls_align-1);
+ td = (pthread_t)mem;
+
+ for (i=1, p=libc.tls_head; p; i++, p=p->next) {
+ dtv[i] = (uintptr_t)(mem - p->offset) + DTP_OFFSET;
+ memcpy(mem - p->offset, p->image, p->len);
+ }
+#endif
+ dtv[0] = libc.tls_cnt;
+ td->dtv = dtv;
+ return td;
+#else
+ size_t tls_align = __builtin_wasm_tls_align();
+ volatile void* tls_base = __builtin_wasm_tls_base();
+ mem += tls_align;
+ mem -= (uintptr_t)mem & (tls_align-1);
+ __wasm_init_tls(mem);
+ __asm__("local.get %0\n"
+ "global.set __tls_base\n"
+ :: "r"(tls_base));
+ return mem;
+#endif
+}
+
+#ifdef __wasilibc_unmodified_upstream
+#if ULONG_MAX == 0xffffffff
+typedef Elf32_Phdr Phdr;
+#else
+typedef Elf64_Phdr Phdr;
+#endif
+
+extern weak hidden const size_t _DYNAMIC[];
+
+static void static_init_tls(size_t *aux)
+{
+ unsigned char *p;
+ size_t n;
+ Phdr *phdr, *tls_phdr=0;
+ size_t base = 0;
+ void *mem;
+
+ for (p=(void *)aux[AT_PHDR],n=aux[AT_PHNUM]; n; n--,p+=aux[AT_PHENT]) {
+ phdr = (void *)p;
+ if (phdr->p_type == PT_PHDR)
+ base = aux[AT_PHDR] - phdr->p_vaddr;
+ if (phdr->p_type == PT_DYNAMIC && _DYNAMIC)
+ base = (size_t)_DYNAMIC - phdr->p_vaddr;
+ if (phdr->p_type == PT_TLS)
+ tls_phdr = phdr;
+ if (phdr->p_type == PT_GNU_STACK &&
+ phdr->p_memsz > __default_stacksize)
+ __default_stacksize =
+ phdr->p_memsz < DEFAULT_STACK_MAX ?
+ phdr->p_memsz : DEFAULT_STACK_MAX;
+ }
+
+ if (tls_phdr) {
+ main_tls.image = (void *)(base + tls_phdr->p_vaddr);
+ main_tls.len = tls_phdr->p_filesz;
+ main_tls.size = tls_phdr->p_memsz;
+ main_tls.align = tls_phdr->p_align;
+ libc.tls_cnt = 1;
+ libc.tls_head = &main_tls;
+ }
+
+ main_tls.size += (-main_tls.size - (uintptr_t)main_tls.image)
+ & (main_tls.align-1);
+#ifdef TLS_ABOVE_TP
+ main_tls.offset = GAP_ABOVE_TP;
+ main_tls.offset += (-GAP_ABOVE_TP + (uintptr_t)main_tls.image)
+ & (main_tls.align-1);
+#else
+ main_tls.offset = main_tls.size;
+#endif
+ if (main_tls.align < MIN_TLS_ALIGN) main_tls.align = MIN_TLS_ALIGN;
+
+ libc.tls_align = main_tls.align;
+ libc.tls_size = 2*sizeof(void *) + sizeof(struct pthread)
+#ifdef TLS_ABOVE_TP
+ + main_tls.offset
+#endif
+ + main_tls.size + main_tls.align
+ + MIN_TLS_ALIGN-1 & -MIN_TLS_ALIGN;
+
+ if (libc.tls_size > sizeof builtin_tls) {
+#ifndef SYS_mmap2
+#define SYS_mmap2 SYS_mmap
+#endif
+ mem = (void *)__syscall(
+ SYS_mmap2,
+ 0, libc.tls_size, PROT_READ|PROT_WRITE,
+ MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
+ /* -4095...-1 cast to void * will crash on dereference anyway,
+ * so don't bloat the init code checking for error codes and
+ * explicitly calling a_crash(). */
+ } else {
+ mem = builtin_tls;
+ }
+
+ /* Failure to initialize thread pointer is always fatal. */
+ if (__init_tp(__copy_tls(mem)) < 0)
+ a_crash();
+}
+
+weak_alias(static_init_tls, __init_tls);
+#endif
diff --git a/libc-top-half/musl/src/env/__libc_start_main.c b/libc-top-half/musl/src/env/__libc_start_main.c
new file mode 100644
index 0000000..c5b277b
--- /dev/null
+++ b/libc-top-half/musl/src/env/__libc_start_main.c
@@ -0,0 +1,97 @@
+#include <elf.h>
+#include <poll.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <unistd.h>
+#include "syscall.h"
+#include "atomic.h"
+#include "libc.h"
+
+static void dummy(void) {}
+weak_alias(dummy, _init);
+
+extern weak hidden void (*const __init_array_start)(void), (*const __init_array_end)(void);
+
+static void dummy1(void *p) {}
+weak_alias(dummy1, __init_ssp);
+
+#define AUX_CNT 38
+
+#ifdef __GNUC__
+__attribute__((__noinline__))
+#endif
+void __init_libc(char **envp, char *pn)
+{
+ size_t i, *auxv, aux[AUX_CNT] = { 0 };
+ __environ = envp;
+ for (i=0; envp[i]; i++);
+ libc.auxv = auxv = (void *)(envp+i+1);
+ for (i=0; auxv[i]; i+=2) if (auxv[i]<AUX_CNT) aux[auxv[i]] = auxv[i+1];
+ __hwcap = aux[AT_HWCAP];
+ if (aux[AT_SYSINFO]) __sysinfo = aux[AT_SYSINFO];
+ libc.page_size = aux[AT_PAGESZ];
+
+ if (!pn) pn = (void*)aux[AT_EXECFN];
+ if (!pn) pn = "";
+ __progname = __progname_full = pn;
+ for (i=0; pn[i]; i++) if (pn[i]=='/') __progname = pn+i+1;
+
+ __init_tls(aux);
+ __init_ssp((void *)aux[AT_RANDOM]);
+
+ if (aux[AT_UID]==aux[AT_EUID] && aux[AT_GID]==aux[AT_EGID]
+ && !aux[AT_SECURE]) return;
+
+ struct pollfd pfd[3] = { {.fd=0}, {.fd=1}, {.fd=2} };
+ int r =
+#ifdef SYS_poll
+ __syscall(SYS_poll, pfd, 3, 0);
+#else
+ __syscall(SYS_ppoll, pfd, 3, &(struct timespec){0}, 0, _NSIG/8);
+#endif
+ if (r<0) a_crash();
+ for (i=0; i<3; i++) if (pfd[i].revents&POLLNVAL)
+ if (__sys_open("/dev/null", O_RDWR)<0)
+ a_crash();
+ libc.secure = 1;
+}
+
+static void libc_start_init(void)
+{
+ _init();
+ uintptr_t a = (uintptr_t)&__init_array_start;
+ for (; a<(uintptr_t)&__init_array_end; a+=sizeof(void(*)()))
+ (*(void (**)(void))a)();
+}
+
+weak_alias(libc_start_init, __libc_start_init);
+
+typedef int lsm2_fn(int (*)(int,char **,char **), int, char **);
+static lsm2_fn libc_start_main_stage2;
+
+int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv,
+ void (*init_dummy)(), void(*fini_dummy)(), void(*ldso_dummy)())
+{
+ char **envp = argv+argc+1;
+
+ /* External linkage, and explicit noinline attribute if available,
+ * are used to prevent the stack frame used during init from
+ * persisting for the entire process lifetime. */
+ __init_libc(envp, argv[0]);
+
+ /* Barrier against hoisting application code or anything using ssp
+ * or thread pointer prior to its initialization above. */
+ lsm2_fn *stage2 = libc_start_main_stage2;
+ __asm__ ( "" : "+r"(stage2) : : "memory" );
+ return stage2(main, argc, argv);
+}
+
+static int libc_start_main_stage2(int (*main)(int,char **,char **), int argc, char **argv)
+{
+ char **envp = argv+argc+1;
+ __libc_start_init();
+
+ /* Pass control to the application */
+ exit(main(argc, argv, envp));
+ return 0;
+}
diff --git a/libc-top-half/musl/src/env/__reset_tls.c b/libc-top-half/musl/src/env/__reset_tls.c
new file mode 100644
index 0000000..15685bc
--- /dev/null
+++ b/libc-top-half/musl/src/env/__reset_tls.c
@@ -0,0 +1,15 @@
+#include <string.h>
+#include "pthread_impl.h"
+#include "libc.h"
+
+void __reset_tls()
+{
+ pthread_t self = __pthread_self();
+ struct tls_module *p;
+ size_t i, n = self->dtv[0];
+ if (n) for (p=libc.tls_head, i=1; i<=n; i++, p=p->next) {
+ char *mem = (char *)(self->dtv[i] - DTP_OFFSET);
+ memcpy(mem, p->image, p->len);
+ memset(mem+p->len, 0, p->size - p->len);
+ }
+}
diff --git a/libc-top-half/musl/src/env/__stack_chk_fail.c b/libc-top-half/musl/src/env/__stack_chk_fail.c
new file mode 100644
index 0000000..cb7a3f3
--- /dev/null
+++ b/libc-top-half/musl/src/env/__stack_chk_fail.c
@@ -0,0 +1,49 @@
+#include <string.h>
+#include <stdint.h>
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#include "pthread_impl.h"
+#else
+// In non-_REENTRANT, include it for `a_crash`
+# include "atomic.h"
+#endif
+
+uintptr_t __stack_chk_guard;
+
+void __init_ssp(void *entropy)
+{
+ if (entropy) memcpy(&__stack_chk_guard, entropy, sizeof(uintptr_t));
+ else __stack_chk_guard = (uintptr_t)&__stack_chk_guard * 1103515245;
+
+#if UINTPTR_MAX >= 0xffffffffffffffff
+ /* Sacrifice 8 bits of entropy on 64bit to prevent leaking/
+ * overwriting the canary via string-manipulation functions.
+ * The NULL byte is on the second byte so that off-by-ones can
+ * still be detected. Endianness is taken care of
+ * automatically. */
+ ((char *)&__stack_chk_guard)[1] = 0;
+#endif
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ __pthread_self()->canary = __stack_chk_guard;
+#endif
+}
+
+void __stack_chk_fail(void)
+{
+ a_crash();
+}
+
+hidden void __stack_chk_fail_local(void);
+
+weak_alias(__stack_chk_fail, __stack_chk_fail_local);
+
+#ifndef __wasilibc_unmodified_upstream
+# include <wasi/api.h>
+
+__attribute__((constructor(60)))
+static void __wasilibc_init_ssp(void) {
+ uintptr_t entropy;
+ int r = __wasi_random_get((uint8_t *)&entropy, sizeof(uintptr_t));
+ __init_ssp(r ? NULL : &entropy);
+}
+#endif
diff --git a/libc-top-half/musl/src/env/clearenv.c b/libc-top-half/musl/src/env/clearenv.c
new file mode 100644
index 0000000..0abbec3
--- /dev/null
+++ b/libc-top-half/musl/src/env/clearenv.c
@@ -0,0 +1,21 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <unistd.h>
+
+static void dummy(char *old, char *new) {}
+weak_alias(dummy, __env_rm_add);
+
+int clearenv()
+{
+#ifdef __wasilibc_unmodified_upstream // Lazy environment variable init.
+#else
+// This specialized header is included within the function body to arranges for
+// the environment variables to be lazily initialized. It redefined `__environ`,
+// so don't remove or reorder it with respect to other code.
+#include "wasi/libc-environ-compat.h"
+#endif
+ char **e = __environ;
+ __environ = 0;
+ if (e) while (*e) __env_rm_add(*e++, 0);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/env/getenv.c b/libc-top-half/musl/src/env/getenv.c
new file mode 100644
index 0000000..346c333
--- /dev/null
+++ b/libc-top-half/musl/src/env/getenv.c
@@ -0,0 +1,20 @@
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+char *getenv(const char *name)
+{
+#ifdef __wasilibc_unmodified_upstream // Lazy environment variable init.
+#else
+// This specialized header is included within the function body to arranges for
+// the environment variables to be lazily initialized. It redefined `__environ`,
+// so don't remove or reorder it with respect to other code.
+#include "wasi/libc-environ-compat.h"
+#endif
+ size_t l = __strchrnul(name, '=') - name;
+ if (l && !name[l] && __environ)
+ for (char **e = __environ; *e; e++)
+ if (!strncmp(name, *e, l) && l[*e] == '=')
+ return *e + l+1;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/env/putenv.c b/libc-top-half/musl/src/env/putenv.c
new file mode 100644
index 0000000..0d59895
--- /dev/null
+++ b/libc-top-half/musl/src/env/putenv.c
@@ -0,0 +1,53 @@
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+static void dummy(char *old, char *new) {}
+weak_alias(dummy, __env_rm_add);
+
+int __putenv(char *s, size_t l, char *r)
+{
+#ifdef __wasilibc_unmodified_upstream // Lazy environment variable init.
+#else
+// This specialized header is included within the function body to arranges for
+// the environment variables to be lazily initialized. It redefined `__environ`,
+// so don't remove or reorder it with respect to other code.
+#include "wasi/libc-environ-compat.h"
+#endif
+ size_t i=0;
+ if (__environ) {
+ for (char **e = __environ; *e; e++, i++)
+ if (!strncmp(s, *e, l+1)) {
+ char *tmp = *e;
+ *e = s;
+ __env_rm_add(tmp, r);
+ return 0;
+ }
+ }
+ static char **oldenv;
+ char **newenv;
+ if (__environ == oldenv) {
+ newenv = realloc(oldenv, sizeof *newenv * (i+2));
+ if (!newenv) goto oom;
+ } else {
+ newenv = malloc(sizeof *newenv * (i+2));
+ if (!newenv) goto oom;
+ if (i) memcpy(newenv, __environ, sizeof *newenv * i);
+ free(oldenv);
+ }
+ newenv[i] = s;
+ newenv[i+1] = 0;
+ __environ = oldenv = newenv;
+ if (r) __env_rm_add(0, r);
+ return 0;
+oom:
+ free(r);
+ return -1;
+}
+
+int putenv(char *s)
+{
+ size_t l = __strchrnul(s, '=') - s;
+ if (!l || !s[l]) return unsetenv(s);
+ return __putenv(s, l, 0);
+}
diff --git a/libc-top-half/musl/src/env/secure_getenv.c b/libc-top-half/musl/src/env/secure_getenv.c
new file mode 100644
index 0000000..72322f8
--- /dev/null
+++ b/libc-top-half/musl/src/env/secure_getenv.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include "libc.h"
+
+char *secure_getenv(const char *name)
+{
+ return libc.secure ? NULL : getenv(name);
+}
diff --git a/libc-top-half/musl/src/env/setenv.c b/libc-top-half/musl/src/env/setenv.c
new file mode 100644
index 0000000..c5226b6
--- /dev/null
+++ b/libc-top-half/musl/src/env/setenv.c
@@ -0,0 +1,42 @@
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+void __env_rm_add(char *old, char *new)
+{
+ static char **env_alloced;
+ static size_t env_alloced_n;
+ for (size_t i=0; i < env_alloced_n; i++)
+ if (env_alloced[i] == old) {
+ env_alloced[i] = new;
+ free(old);
+ return;
+ } else if (!env_alloced[i] && new) {
+ env_alloced[i] = new;
+ new = 0;
+ }
+ if (!new) return;
+ char **t = realloc(env_alloced, sizeof *t * (env_alloced_n+1));
+ if (!t) return;
+ (env_alloced = t)[env_alloced_n++] = new;
+}
+
+int setenv(const char *var, const char *value, int overwrite)
+{
+ char *s;
+ size_t l1, l2;
+
+ if (!var || !(l1 = __strchrnul(var, '=') - var) || var[l1]) {
+ errno = EINVAL;
+ return -1;
+ }
+ if (!overwrite && getenv(var)) return 0;
+
+ l2 = strlen(value);
+ s = malloc(l1+l2+2);
+ if (!s) return -1;
+ memcpy(s, var, l1);
+ s[l1] = '=';
+ memcpy(s+l1+1, value, l2+1);
+ return __putenv(s, l1, s);
+}
diff --git a/libc-top-half/musl/src/env/unsetenv.c b/libc-top-half/musl/src/env/unsetenv.c
new file mode 100644
index 0000000..40f0eea
--- /dev/null
+++ b/libc-top-half/musl/src/env/unsetenv.c
@@ -0,0 +1,35 @@
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+
+static void dummy(char *old, char *new) {}
+weak_alias(dummy, __env_rm_add);
+
+int unsetenv(const char *name)
+{
+ size_t l = __strchrnul(name, '=') - name;
+ if (!l || name[l]) {
+ errno = EINVAL;
+ return -1;
+ }
+#ifdef __wasilibc_unmodified_upstream // Lazy environment variable init.
+#else
+// This specialized header is included within the function body to arranges for
+// the environment variables to be lazily initialized. It redefined `__environ`,
+// so don't remove or reorder it with respect to other code.
+#include "wasi/libc-environ-compat.h"
+#endif
+ if (__environ) {
+ char **e = __environ, **eo = e;
+ for (; *e; e++)
+ if (!strncmp(name, *e, l) && l[*e] == '=')
+ __env_rm_add(*e, 0);
+ else if (eo != e)
+ *eo++ = *e;
+ else
+ eo++;
+ if (eo != e) *eo = 0;
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/errno/__errno_location.c b/libc-top-half/musl/src/errno/__errno_location.c
new file mode 100644
index 0000000..7f9d602
--- /dev/null
+++ b/libc-top-half/musl/src/errno/__errno_location.c
@@ -0,0 +1,9 @@
+#include <errno.h>
+#include "pthread_impl.h"
+
+int *__errno_location(void)
+{
+ return &__pthread_self()->errno_val;
+}
+
+weak_alias(__errno_location, ___errno_location);
diff --git a/libc-top-half/musl/src/errno/__strerror.h b/libc-top-half/musl/src/errno/__strerror.h
new file mode 100644
index 0000000..bd6dccb
--- /dev/null
+++ b/libc-top-half/musl/src/errno/__strerror.h
@@ -0,0 +1,137 @@
+/* The first entry is a catch-all for codes not enumerated here.
+ * This file is included multiple times to declare and define a structure
+ * with these messages, and then to define a lookup table translating
+ * error codes to offsets of corresponding fields in the structure. */
+
+#ifdef __wasilibc_unmodified_upstream // Print "Success" for ESUCCESS.
+E(0, "No error information")
+#else
+E(0, "Success")
+#endif
+
+E(EILSEQ, "Illegal byte sequence")
+E(EDOM, "Domain error")
+E(ERANGE, "Result not representable")
+
+E(ENOTTY, "Not a tty")
+E(EACCES, "Permission denied")
+E(EPERM, "Operation not permitted")
+E(ENOENT, "No such file or directory")
+E(ESRCH, "No such process")
+E(EEXIST, "File exists")
+
+E(EOVERFLOW, "Value too large for data type")
+E(ENOSPC, "No space left on device")
+E(ENOMEM, "Out of memory")
+
+E(EBUSY, "Resource busy")
+E(EINTR, "Interrupted system call")
+E(EAGAIN, "Resource temporarily unavailable")
+E(ESPIPE, "Invalid seek")
+
+E(EXDEV, "Cross-device link")
+E(EROFS, "Read-only file system")
+E(ENOTEMPTY, "Directory not empty")
+
+E(ECONNRESET, "Connection reset by peer")
+E(ETIMEDOUT, "Operation timed out")
+E(ECONNREFUSED, "Connection refused")
+#ifdef __wasilibc_unmodified_upstream // errno value not in WASI
+E(EHOSTDOWN, "Host is down")
+#endif
+E(EHOSTUNREACH, "Host is unreachable")
+E(EADDRINUSE, "Address in use")
+
+E(EPIPE, "Broken pipe")
+E(EIO, "I/O error")
+E(ENXIO, "No such device or address")
+#ifdef __wasilibc_unmodified_upstream // errno value not in WASI
+E(ENOTBLK, "Block device required")
+#endif
+E(ENODEV, "No such device")
+E(ENOTDIR, "Not a directory")
+E(EISDIR, "Is a directory")
+E(ETXTBSY, "Text file busy")
+E(ENOEXEC, "Exec format error")
+
+E(EINVAL, "Invalid argument")
+
+E(E2BIG, "Argument list too long")
+E(ELOOP, "Symbolic link loop")
+E(ENAMETOOLONG, "Filename too long")
+E(ENFILE, "Too many open files in system")
+E(EMFILE, "No file descriptors available")
+E(EBADF, "Bad file descriptor")
+E(ECHILD, "No child process")
+E(EFAULT, "Bad address")
+E(EFBIG, "File too large")
+E(EMLINK, "Too many links")
+E(ENOLCK, "No locks available")
+
+E(EDEADLK, "Resource deadlock would occur")
+E(ENOTRECOVERABLE, "State not recoverable")
+E(EOWNERDEAD, "Previous owner died")
+E(ECANCELED, "Operation canceled")
+E(ENOSYS, "Function not implemented")
+E(ENOMSG, "No message of desired type")
+E(EIDRM, "Identifier removed")
+#ifdef __wasilibc_unmodified_upstream // errno value not in WASI
+E(ENOSTR, "Device not a stream")
+E(ENODATA, "No data available")
+E(ETIME, "Device timeout")
+E(ENOSR, "Out of streams resources")
+#endif
+E(ENOLINK, "Link has been severed")
+E(EPROTO, "Protocol error")
+E(EBADMSG, "Bad message")
+#ifdef __wasilibc_unmodified_upstream // errno value not in WASI
+E(EBADFD, "File descriptor in bad state")
+#endif
+E(ENOTSOCK, "Not a socket")
+E(EDESTADDRREQ, "Destination address required")
+E(EMSGSIZE, "Message too large")
+E(EPROTOTYPE, "Protocol wrong type for socket")
+E(ENOPROTOOPT, "Protocol not available")
+E(EPROTONOSUPPORT,"Protocol not supported")
+#ifdef __wasilibc_unmodified_upstream // errno value not in WASI
+E(ESOCKTNOSUPPORT,"Socket type not supported")
+#endif
+E(ENOTSUP, "Not supported")
+#ifdef __wasilibc_unmodified_upstream // errno value not in WASI
+E(EPFNOSUPPORT, "Protocol family not supported")
+#endif
+E(EAFNOSUPPORT, "Address family not supported by protocol")
+E(EADDRNOTAVAIL,"Address not available")
+E(ENETDOWN, "Network is down")
+E(ENETUNREACH, "Network unreachable")
+E(ENETRESET, "Connection reset by network")
+E(ECONNABORTED, "Connection aborted")
+E(ENOBUFS, "No buffer space available")
+E(EISCONN, "Socket is connected")
+E(ENOTCONN, "Socket not connected")
+#ifdef __wasilibc_unmodified_upstream // errno value not in WASI
+E(ESHUTDOWN, "Cannot send after socket shutdown")
+#endif
+E(EALREADY, "Operation already in progress")
+E(EINPROGRESS, "Operation in progress")
+E(ESTALE, "Stale file handle")
+#ifdef __wasilibc_unmodified_upstream // errno value not in WASI
+E(EREMOTEIO, "Remote I/O error")
+#endif
+E(EDQUOT, "Quota exceeded")
+#ifdef __wasilibc_unmodified_upstream // errno value not in WASI
+E(ENOMEDIUM, "No medium found")
+E(EMEDIUMTYPE, "Wrong medium type")
+#endif
+E(EMULTIHOP, "Multihop attempted")
+#ifdef __wasilibc_unmodified_upstream // errno value not in WASI
+E(ENOKEY, "Required key not available")
+E(EKEYEXPIRED, "Key has expired")
+E(EKEYREVOKED, "Key has been revoked")
+E(EKEYREJECTED, "Key was rejected by service")
+#endif
+#ifdef __wasilibc_unmodified_upstream // errno value in WASI and not musl
+#else
+// WASI adds this errno code.
+E(ENOTCAPABLE, "Capabilities insufficient")
+#endif
diff --git a/libc-top-half/musl/src/errno/strerror.c b/libc-top-half/musl/src/errno/strerror.c
new file mode 100644
index 0000000..7f92643
--- /dev/null
+++ b/libc-top-half/musl/src/errno/strerror.c
@@ -0,0 +1,47 @@
+#include <errno.h>
+#include <stddef.h>
+#include <string.h>
+#include "locale_impl.h"
+
+/* mips has one error code outside of the 8-bit range due to a
+ * historical typo, so we just remap it. */
+#if EDQUOT==1133
+#define EDQUOT_ORIG 1133
+#undef EDQUOT
+#define EDQUOT 109
+#endif
+
+static const struct errmsgstr_t {
+#define E(n, s) char str##n[sizeof(s)];
+#include "__strerror.h"
+#undef E
+} errmsgstr = {
+#define E(n, s) s,
+#include "__strerror.h"
+#undef E
+};
+
+static const unsigned short errmsgidx[] = {
+#define E(n, s) [n] = offsetof(struct errmsgstr_t, str##n),
+#include "__strerror.h"
+#undef E
+};
+
+char *__strerror_l(int e, locale_t loc)
+{
+ const char *s;
+#ifdef EDQUOT_ORIG
+ if (e==EDQUOT) e=0;
+ else if (e==EDQUOT_ORIG) e=EDQUOT;
+#endif
+ if (e >= sizeof errmsgidx / sizeof *errmsgidx) e = 0;
+ s = (char *)&errmsgstr + errmsgidx[e];
+ return (char *)LCTRANS(s, LC_MESSAGES, loc);
+}
+
+char *strerror(int e)
+{
+ return __strerror_l(e, CURRENT_LOCALE);
+}
+
+weak_alias(__strerror_l, strerror_l);
diff --git a/libc-top-half/musl/src/exit/_Exit.c b/libc-top-half/musl/src/exit/_Exit.c
new file mode 100644
index 0000000..7a6115c
--- /dev/null
+++ b/libc-top-half/musl/src/exit/_Exit.c
@@ -0,0 +1,8 @@
+#include <stdlib.h>
+#include "syscall.h"
+
+_Noreturn void _Exit(int ec)
+{
+ __syscall(SYS_exit_group, ec);
+ for (;;) __syscall(SYS_exit, ec);
+}
diff --git a/libc-top-half/musl/src/exit/abort.c b/libc-top-half/musl/src/exit/abort.c
new file mode 100644
index 0000000..f21f458
--- /dev/null
+++ b/libc-top-half/musl/src/exit/abort.c
@@ -0,0 +1,30 @@
+#include <stdlib.h>
+#include <signal.h>
+#include "syscall.h"
+#include "pthread_impl.h"
+#include "atomic.h"
+#include "lock.h"
+#include "ksigaction.h"
+
+_Noreturn void abort(void)
+{
+ raise(SIGABRT);
+
+ /* If there was a SIGABRT handler installed and it returned, or if
+ * SIGABRT was blocked or ignored, take an AS-safe lock to prevent
+ * sigaction from installing a new SIGABRT handler, uninstall any
+ * handler that may be present, and re-raise the signal to generate
+ * the default action of abnormal termination. */
+ __block_all_sigs(0);
+ LOCK(__abort_lock);
+ __syscall(SYS_rt_sigaction, SIGABRT,
+ &(struct k_sigaction){.handler = SIG_DFL}, 0, _NSIG/8);
+ __syscall(SYS_tkill, __pthread_self()->tid, SIGABRT);
+ __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK,
+ &(long[_NSIG/(8*sizeof(long))]){1UL<<(SIGABRT-1)}, 0, _NSIG/8);
+
+ /* Beyond this point should be unreachable. */
+ a_crash();
+ raise(SIGKILL);
+ _Exit(127);
+}
diff --git a/libc-top-half/musl/src/exit/abort_lock.c b/libc-top-half/musl/src/exit/abort_lock.c
new file mode 100644
index 0000000..3af72c7
--- /dev/null
+++ b/libc-top-half/musl/src/exit/abort_lock.c
@@ -0,0 +1,3 @@
+#include "pthread_impl.h"
+
+volatile int __abort_lock[1];
diff --git a/libc-top-half/musl/src/exit/arm/__aeabi_atexit.c b/libc-top-half/musl/src/exit/arm/__aeabi_atexit.c
new file mode 100644
index 0000000..ce16101
--- /dev/null
+++ b/libc-top-half/musl/src/exit/arm/__aeabi_atexit.c
@@ -0,0 +1,6 @@
+int __cxa_atexit(void (*func)(void *), void *arg, void *dso);
+
+int __aeabi_atexit (void *obj, void (*func) (void *), void *d)
+{
+ return __cxa_atexit (func, obj, d);
+}
diff --git a/libc-top-half/musl/src/exit/assert.c b/libc-top-half/musl/src/exit/assert.c
new file mode 100644
index 0000000..94edd82
--- /dev/null
+++ b/libc-top-half/musl/src/exit/assert.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+_Noreturn void __assert_fail(const char *expr, const char *file, int line, const char *func)
+{
+ fprintf(stderr, "Assertion failed: %s (%s: %s: %d)\n", expr, file, func, line);
+ abort();
+}
diff --git a/libc-top-half/musl/src/exit/at_quick_exit.c b/libc-top-half/musl/src/exit/at_quick_exit.c
new file mode 100644
index 0000000..429d0b0
--- /dev/null
+++ b/libc-top-half/musl/src/exit/at_quick_exit.c
@@ -0,0 +1,35 @@
+#include <stdlib.h>
+#include "libc.h"
+#include "lock.h"
+#include "fork_impl.h"
+
+#define COUNT 32
+
+static void (*funcs[COUNT])(void);
+static int count;
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+static volatile int lock[1];
+volatile int *const __at_quick_exit_lockptr = lock;
+#endif
+
+void __funcs_on_quick_exit()
+{
+ void (*func)(void);
+ LOCK(lock);
+ while (count > 0) {
+ func = funcs[--count];
+ UNLOCK(lock);
+ func();
+ LOCK(lock);
+ }
+}
+
+int at_quick_exit(void (*func)(void))
+{
+ int r = 0;
+ LOCK(lock);
+ if (count == 32) r = -1;
+ else funcs[count++] = func;
+ UNLOCK(lock);
+ return r;
+}
diff --git a/libc-top-half/musl/src/exit/atexit.c b/libc-top-half/musl/src/exit/atexit.c
new file mode 100644
index 0000000..155292d
--- /dev/null
+++ b/libc-top-half/musl/src/exit/atexit.c
@@ -0,0 +1,82 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include "libc.h"
+#include "lock.h"
+#include "fork_impl.h"
+
+#define malloc __libc_malloc
+#define calloc __libc_calloc
+#define realloc undef
+#define free undef
+
+/* Ensure that at least 32 atexit handlers can be registered without malloc */
+#define COUNT 32
+
+static struct fl
+{
+ struct fl *next;
+ void (*f[COUNT])(void *);
+ void *a[COUNT];
+} builtin, *head;
+
+static int slot;
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+static volatile int lock[1];
+volatile int *const __atexit_lockptr = lock;
+#endif
+
+void __funcs_on_exit()
+{
+ void (*func)(void *), *arg;
+ LOCK(lock);
+ for (; head; head=head->next, slot=COUNT) while(slot-->0) {
+ func = head->f[slot];
+ arg = head->a[slot];
+ UNLOCK(lock);
+ func(arg);
+ LOCK(lock);
+ }
+}
+
+void __cxa_finalize(void *dso)
+{
+}
+
+int __cxa_atexit(void (*func)(void *), void *arg, void *dso)
+{
+ LOCK(lock);
+
+ /* Defer initialization of head so it can be in BSS */
+ if (!head) head = &builtin;
+
+ /* If the current function list is full, add a new one */
+ if (slot==COUNT) {
+ struct fl *new_fl = calloc(sizeof(struct fl), 1);
+ if (!new_fl) {
+ UNLOCK(lock);
+ return -1;
+ }
+ new_fl->next = head;
+ head = new_fl;
+ slot = 0;
+ }
+
+ /* Append function to the list. */
+ head->f[slot] = func;
+ head->a[slot] = arg;
+ slot++;
+
+ UNLOCK(lock);
+ return 0;
+}
+
+static void call(void *p)
+{
+ ((void (*)(void))(uintptr_t)p)();
+}
+
+int atexit(void (*func)(void))
+{
+ return __cxa_atexit(call, (void *)(uintptr_t)func, 0);
+}
diff --git a/libc-top-half/musl/src/exit/exit.c b/libc-top-half/musl/src/exit/exit.c
new file mode 100644
index 0000000..1536d7d
--- /dev/null
+++ b/libc-top-half/musl/src/exit/exit.c
@@ -0,0 +1,52 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include "libc.h"
+
+static void dummy()
+{
+}
+
+/* atexit.c and __stdio_exit.c override these. the latter is linked
+ * as a consequence of linking either __toread.c or __towrite.c. */
+weak_alias(dummy, __funcs_on_exit);
+weak_alias(dummy, __stdio_exit);
+#ifdef __wasilibc_unmodified_upstream // fini
+weak_alias(dummy, _fini);
+
+extern weak hidden void (*const __fini_array_start)(void), (*const __fini_array_end)(void);
+
+static void libc_exit_fini(void)
+{
+ uintptr_t a = (uintptr_t)&__fini_array_end;
+ for (; a>(uintptr_t)&__fini_array_start; a-=sizeof(void(*)()))
+ (*(void (**)())(a-sizeof(void(*)())))();
+ _fini();
+}
+
+weak_alias(libc_exit_fini, __libc_exit_fini);
+#endif
+
+#ifdef __wasilibc_unmodified_upstream // WASI libc uses a custom exit
+_Noreturn void exit(int code)
+{
+ __funcs_on_exit();
+ __libc_exit_fini();
+ __stdio_exit();
+ _Exit(code);
+}
+#else
+// Split out the cleanup functions so that we can call them without calling
+// _Exit if we don't need to. This allows _start to just return if main
+// returns 0.
+void __wasm_call_dtors(void)
+{
+ __funcs_on_exit();
+ __stdio_exit();
+}
+
+_Noreturn void exit(int code)
+{
+ __wasm_call_dtors();
+ _Exit(code);
+}
+#endif
diff --git a/libc-top-half/musl/src/exit/quick_exit.c b/libc-top-half/musl/src/exit/quick_exit.c
new file mode 100644
index 0000000..ada9134
--- /dev/null
+++ b/libc-top-half/musl/src/exit/quick_exit.c
@@ -0,0 +1,11 @@
+#include <stdlib.h>
+#include "libc.h"
+
+static void dummy() { }
+weak_alias(dummy, __funcs_on_quick_exit);
+
+_Noreturn void quick_exit(int code)
+{
+ __funcs_on_quick_exit();
+ _Exit(code);
+}
diff --git a/libc-top-half/musl/src/fcntl/creat.c b/libc-top-half/musl/src/fcntl/creat.c
new file mode 100644
index 0000000..8f8aab6
--- /dev/null
+++ b/libc-top-half/musl/src/fcntl/creat.c
@@ -0,0 +1,8 @@
+#include <fcntl.h>
+
+int creat(const char *filename, mode_t mode)
+{
+ return open(filename, O_CREAT|O_WRONLY|O_TRUNC, mode);
+}
+
+weak_alias(creat, creat64);
diff --git a/libc-top-half/musl/src/fcntl/fcntl.c b/libc-top-half/musl/src/fcntl/fcntl.c
new file mode 100644
index 0000000..d3bff5c
--- /dev/null
+++ b/libc-top-half/musl/src/fcntl/fcntl.c
@@ -0,0 +1,48 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include <stdarg.h>
+#include <errno.h>
+#include "syscall.h"
+
+int fcntl(int fd, int cmd, ...)
+{
+ unsigned long arg;
+ va_list ap;
+ va_start(ap, cmd);
+ arg = va_arg(ap, unsigned long);
+ va_end(ap);
+ if (cmd == F_SETFL) arg |= O_LARGEFILE;
+ if (cmd == F_SETLKW) return syscall_cp(SYS_fcntl, fd, cmd, (void *)arg);
+ if (cmd == F_GETOWN) {
+ struct f_owner_ex ex;
+ int ret = __syscall(SYS_fcntl, fd, F_GETOWN_EX, &ex);
+ if (ret == -EINVAL) return __syscall(SYS_fcntl, fd, cmd, (void *)arg);
+ if (ret) return __syscall_ret(ret);
+ return ex.type == F_OWNER_PGRP ? -ex.pid : ex.pid;
+ }
+ if (cmd == F_DUPFD_CLOEXEC) {
+ int ret = __syscall(SYS_fcntl, fd, F_DUPFD_CLOEXEC, arg);
+ if (ret != -EINVAL) {
+ if (ret >= 0)
+ __syscall(SYS_fcntl, ret, F_SETFD, FD_CLOEXEC);
+ return __syscall_ret(ret);
+ }
+ ret = __syscall(SYS_fcntl, fd, F_DUPFD_CLOEXEC, 0);
+ if (ret != -EINVAL) {
+ if (ret >= 0) __syscall(SYS_close, ret);
+ return __syscall_ret(-EINVAL);
+ }
+ ret = __syscall(SYS_fcntl, fd, F_DUPFD, arg);
+ if (ret >= 0) __syscall(SYS_fcntl, ret, F_SETFD, FD_CLOEXEC);
+ return __syscall_ret(ret);
+ }
+ switch (cmd) {
+ case F_SETLK:
+ case F_GETLK:
+ case F_GETOWN_EX:
+ case F_SETOWN_EX:
+ return syscall(SYS_fcntl, fd, cmd, (void *)arg);
+ default:
+ return syscall(SYS_fcntl, fd, cmd, arg);
+ }
+}
diff --git a/libc-top-half/musl/src/fcntl/open.c b/libc-top-half/musl/src/fcntl/open.c
new file mode 100644
index 0000000..1d817a2
--- /dev/null
+++ b/libc-top-half/musl/src/fcntl/open.c
@@ -0,0 +1,23 @@
+#include <fcntl.h>
+#include <stdarg.h>
+#include "syscall.h"
+
+int open(const char *filename, int flags, ...)
+{
+ mode_t mode = 0;
+
+ if ((flags & O_CREAT) || (flags & O_TMPFILE) == O_TMPFILE) {
+ va_list ap;
+ va_start(ap, flags);
+ mode = va_arg(ap, mode_t);
+ va_end(ap);
+ }
+
+ int fd = __sys_open_cp(filename, flags, mode);
+ if (fd>=0 && (flags & O_CLOEXEC))
+ __syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC);
+
+ return __syscall_ret(fd);
+}
+
+weak_alias(open, open64);
diff --git a/libc-top-half/musl/src/fcntl/openat.c b/libc-top-half/musl/src/fcntl/openat.c
new file mode 100644
index 0000000..ad165ec
--- /dev/null
+++ b/libc-top-half/musl/src/fcntl/openat.c
@@ -0,0 +1,19 @@
+#include <fcntl.h>
+#include <stdarg.h>
+#include "syscall.h"
+
+int openat(int fd, const char *filename, int flags, ...)
+{
+ mode_t mode = 0;
+
+ if ((flags & O_CREAT) || (flags & O_TMPFILE) == O_TMPFILE) {
+ va_list ap;
+ va_start(ap, flags);
+ mode = va_arg(ap, mode_t);
+ va_end(ap);
+ }
+
+ return syscall_cp(SYS_openat, fd, filename, flags|O_LARGEFILE, mode);
+}
+
+weak_alias(openat, openat64);
diff --git a/libc-top-half/musl/src/fcntl/posix_fadvise.c b/libc-top-half/musl/src/fcntl/posix_fadvise.c
new file mode 100644
index 0000000..75b8e1a
--- /dev/null
+++ b/libc-top-half/musl/src/fcntl/posix_fadvise.c
@@ -0,0 +1,18 @@
+#include <fcntl.h>
+#include "syscall.h"
+
+int posix_fadvise(int fd, off_t base, off_t len, int advice)
+{
+#if defined(SYSCALL_FADVISE_6_ARG)
+ /* Some archs, at least arm and powerpc, have the syscall
+ * arguments reordered to avoid needing 7 argument registers
+ * due to 64-bit argument alignment. */
+ return -__syscall(SYS_fadvise, fd, advice,
+ __SYSCALL_LL_E(base), __SYSCALL_LL_E(len));
+#else
+ return -__syscall(SYS_fadvise, fd, __SYSCALL_LL_O(base),
+ __SYSCALL_LL_E(len), advice);
+#endif
+}
+
+weak_alias(posix_fadvise, posix_fadvise64);
diff --git a/libc-top-half/musl/src/fcntl/posix_fallocate.c b/libc-top-half/musl/src/fcntl/posix_fallocate.c
new file mode 100644
index 0000000..c57a24a
--- /dev/null
+++ b/libc-top-half/musl/src/fcntl/posix_fallocate.c
@@ -0,0 +1,10 @@
+#include <fcntl.h>
+#include "syscall.h"
+
+int posix_fallocate(int fd, off_t base, off_t len)
+{
+ return -__syscall(SYS_fallocate, fd, 0, __SYSCALL_LL_E(base),
+ __SYSCALL_LL_E(len));
+}
+
+weak_alias(posix_fallocate, posix_fallocate64);
diff --git a/libc-top-half/musl/src/fenv/__flt_rounds.c b/libc-top-half/musl/src/fenv/__flt_rounds.c
new file mode 100644
index 0000000..ec0b368
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/__flt_rounds.c
@@ -0,0 +1,19 @@
+#include <float.h>
+#include <fenv.h>
+
+int __flt_rounds()
+{
+ switch (fegetround()) {
+#ifdef FE_TOWARDZERO
+ case FE_TOWARDZERO: return 0;
+#endif
+ case FE_TONEAREST: return 1;
+#ifdef FE_UPWARD
+ case FE_UPWARD: return 2;
+#endif
+#ifdef FE_DOWNWARD
+ case FE_DOWNWARD: return 3;
+#endif
+ }
+ return -1;
+}
diff --git a/libc-top-half/musl/src/fenv/aarch64/fenv.s b/libc-top-half/musl/src/fenv/aarch64/fenv.s
new file mode 100644
index 0000000..8f3ec96
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/aarch64/fenv.s
@@ -0,0 +1,68 @@
+.global fegetround
+.type fegetround,%function
+fegetround:
+ mrs x0, fpcr
+ and w0, w0, #0xc00000
+ ret
+
+.global __fesetround
+.hidden __fesetround
+.type __fesetround,%function
+__fesetround:
+ mrs x1, fpcr
+ bic w1, w1, #0xc00000
+ orr w1, w1, w0
+ msr fpcr, x1
+ mov w0, #0
+ ret
+
+.global fetestexcept
+.type fetestexcept,%function
+fetestexcept:
+ and w0, w0, #0x1f
+ mrs x1, fpsr
+ and w0, w0, w1
+ ret
+
+.global feclearexcept
+.type feclearexcept,%function
+feclearexcept:
+ and w0, w0, #0x1f
+ mrs x1, fpsr
+ bic w1, w1, w0
+ msr fpsr, x1
+ mov w0, #0
+ ret
+
+.global feraiseexcept
+.type feraiseexcept,%function
+feraiseexcept:
+ and w0, w0, #0x1f
+ mrs x1, fpsr
+ orr w1, w1, w0
+ msr fpsr, x1
+ mov w0, #0
+ ret
+
+.global fegetenv
+.type fegetenv,%function
+fegetenv:
+ mrs x1, fpcr
+ mrs x2, fpsr
+ stp w1, w2, [x0]
+ mov w0, #0
+ ret
+
+// TODO preserve some bits
+.global fesetenv
+.type fesetenv,%function
+fesetenv:
+ mov x1, #0
+ mov x2, #0
+ cmn x0, #1
+ b.eq 1f
+ ldp w1, w2, [x0]
+1: msr fpcr, x1
+ msr fpsr, x2
+ mov w0, #0
+ ret
diff --git a/libc-top-half/musl/src/fenv/arm/fenv-hf.S b/libc-top-half/musl/src/fenv/arm/fenv-hf.S
new file mode 100644
index 0000000..2a1de0d
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/arm/fenv-hf.S
@@ -0,0 +1,70 @@
+#if __ARM_PCS_VFP
+
+.syntax unified
+.fpu vfp
+
+.global fegetround
+.type fegetround,%function
+fegetround:
+ fmrx r0, fpscr
+ and r0, r0, #0xc00000
+ bx lr
+
+.global __fesetround
+.hidden __fesetround
+.type __fesetround,%function
+__fesetround:
+ fmrx r3, fpscr
+ bic r3, r3, #0xc00000
+ orr r3, r3, r0
+ fmxr fpscr, r3
+ mov r0, #0
+ bx lr
+
+.global fetestexcept
+.type fetestexcept,%function
+fetestexcept:
+ and r0, r0, #0x1f
+ fmrx r3, fpscr
+ and r0, r0, r3
+ bx lr
+
+.global feclearexcept
+.type feclearexcept,%function
+feclearexcept:
+ and r0, r0, #0x1f
+ fmrx r3, fpscr
+ bic r3, r3, r0
+ fmxr fpscr, r3
+ mov r0, #0
+ bx lr
+
+.global feraiseexcept
+.type feraiseexcept,%function
+feraiseexcept:
+ and r0, r0, #0x1f
+ fmrx r3, fpscr
+ orr r3, r3, r0
+ fmxr fpscr, r3
+ mov r0, #0
+ bx lr
+
+.global fegetenv
+.type fegetenv,%function
+fegetenv:
+ fmrx r3, fpscr
+ str r3, [r0]
+ mov r0, #0
+ bx lr
+
+.global fesetenv
+.type fesetenv,%function
+fesetenv:
+ cmn r0, #1
+ moveq r3, #0
+ ldrne r3, [r0]
+ fmxr fpscr, r3
+ mov r0, #0
+ bx lr
+
+#endif
diff --git a/libc-top-half/musl/src/fenv/arm/fenv.c b/libc-top-half/musl/src/fenv/arm/fenv.c
new file mode 100644
index 0000000..ad295f5
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/arm/fenv.c
@@ -0,0 +1,3 @@
+#if !__ARM_PCS_VFP
+#include "../fenv.c"
+#endif
diff --git a/libc-top-half/musl/src/fenv/fegetexceptflag.c b/libc-top-half/musl/src/fenv/fegetexceptflag.c
new file mode 100644
index 0000000..bab0b44
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/fegetexceptflag.c
@@ -0,0 +1,7 @@
+#include <fenv.h>
+
+int fegetexceptflag(fexcept_t *fp, int mask)
+{
+ *fp = fetestexcept(mask);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/fenv/feholdexcept.c b/libc-top-half/musl/src/fenv/feholdexcept.c
new file mode 100644
index 0000000..73ff1fa
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/feholdexcept.c
@@ -0,0 +1,8 @@
+#include <fenv.h>
+
+int feholdexcept(fenv_t *envp)
+{
+ fegetenv(envp);
+ feclearexcept(FE_ALL_EXCEPT);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/fenv/fenv.c b/libc-top-half/musl/src/fenv/fenv.c
new file mode 100644
index 0000000..5588dad
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/fenv.c
@@ -0,0 +1,38 @@
+#include <fenv.h>
+
+/* Dummy functions for archs lacking fenv implementation */
+
+int feclearexcept(int mask)
+{
+ return 0;
+}
+
+int feraiseexcept(int mask)
+{
+ return 0;
+}
+
+int fetestexcept(int mask)
+{
+ return 0;
+}
+
+int fegetround(void)
+{
+ return FE_TONEAREST;
+}
+
+int __fesetround(int r)
+{
+ return 0;
+}
+
+int fegetenv(fenv_t *envp)
+{
+ return 0;
+}
+
+int fesetenv(const fenv_t *envp)
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/fenv/fesetexceptflag.c b/libc-top-half/musl/src/fenv/fesetexceptflag.c
new file mode 100644
index 0000000..af5f102
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/fesetexceptflag.c
@@ -0,0 +1,8 @@
+#include <fenv.h>
+
+int fesetexceptflag(const fexcept_t *fp, int mask)
+{
+ feclearexcept(~*fp & mask);
+ feraiseexcept(*fp & mask);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/fenv/fesetround.c b/libc-top-half/musl/src/fenv/fesetround.c
new file mode 100644
index 0000000..4e2f164
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/fesetround.c
@@ -0,0 +1,23 @@
+#include <fenv.h>
+#include <features.h>
+
+/* __fesetround wrapper for arch independent argument check */
+
+hidden int __fesetround(int);
+
+int fesetround(int r)
+{
+ if (r != FE_TONEAREST
+#ifdef FE_DOWNWARD
+ && r != FE_DOWNWARD
+#endif
+#ifdef FE_UPWARD
+ && r != FE_UPWARD
+#endif
+#ifdef FE_TOWARDZERO
+ && r != FE_TOWARDZERO
+#endif
+ )
+ return -1;
+ return __fesetround(r);
+}
diff --git a/libc-top-half/musl/src/fenv/feupdateenv.c b/libc-top-half/musl/src/fenv/feupdateenv.c
new file mode 100644
index 0000000..50cef8e
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/feupdateenv.c
@@ -0,0 +1,9 @@
+#include <fenv.h>
+
+int feupdateenv(const fenv_t *envp)
+{
+ int ex = fetestexcept(FE_ALL_EXCEPT);
+ fesetenv(envp);
+ feraiseexcept(ex);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/fenv/i386/fenv.s b/libc-top-half/musl/src/fenv/i386/fenv.s
new file mode 100644
index 0000000..e7f7932
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/i386/fenv.s
@@ -0,0 +1,164 @@
+.hidden __hwcap
+
+.global feclearexcept
+.type feclearexcept,@function
+feclearexcept:
+ mov 4(%esp),%ecx
+ and $0x3f,%ecx
+ fnstsw %ax
+ # consider sse fenv as well if the cpu has XMM capability
+ call 1f
+1: addl $__hwcap-1b,(%esp)
+ pop %edx
+ testl $0x02000000,(%edx)
+ jz 2f
+ # maintain exceptions in the sse mxcsr, clear x87 exceptions
+ test %eax,%ecx
+ jz 1f
+ fnclex
+1: push %edx
+ stmxcsr (%esp)
+ pop %edx
+ and $0x3f,%eax
+ or %eax,%edx
+ test %edx,%ecx
+ jz 1f
+ not %ecx
+ and %ecx,%edx
+ push %edx
+ ldmxcsr (%esp)
+ pop %edx
+1: xor %eax,%eax
+ ret
+ # only do the expensive x87 fenv load/store when needed
+2: test %eax,%ecx
+ jz 1b
+ not %ecx
+ and %ecx,%eax
+ test $0x3f,%eax
+ jz 1f
+ fnclex
+ jmp 1b
+1: sub $32,%esp
+ fnstenv (%esp)
+ mov %al,4(%esp)
+ fldenv (%esp)
+ add $32,%esp
+ xor %eax,%eax
+ ret
+
+.global feraiseexcept
+.type feraiseexcept,@function
+feraiseexcept:
+ mov 4(%esp),%eax
+ and $0x3f,%eax
+ sub $32,%esp
+ fnstenv (%esp)
+ or %al,4(%esp)
+ fldenv (%esp)
+ add $32,%esp
+ xor %eax,%eax
+ ret
+
+.global __fesetround
+.hidden __fesetround
+.type __fesetround,@function
+__fesetround:
+ mov 4(%esp),%ecx
+ push %eax
+ xor %eax,%eax
+ fnstcw (%esp)
+ andb $0xf3,1(%esp)
+ or %ch,1(%esp)
+ fldcw (%esp)
+ # consider sse fenv as well if the cpu has XMM capability
+ call 1f
+1: addl $__hwcap-1b,(%esp)
+ pop %edx
+ testl $0x02000000,(%edx)
+ jz 1f
+ stmxcsr (%esp)
+ shl $3,%ch
+ andb $0x9f,1(%esp)
+ or %ch,1(%esp)
+ ldmxcsr (%esp)
+1: pop %ecx
+ ret
+
+.global fegetround
+.type fegetround,@function
+fegetround:
+ push %eax
+ fnstcw (%esp)
+ pop %eax
+ and $0xc00,%eax
+ ret
+
+.global fegetenv
+.type fegetenv,@function
+fegetenv:
+ mov 4(%esp),%ecx
+ xor %eax,%eax
+ fnstenv (%ecx)
+ # consider sse fenv as well if the cpu has XMM capability
+ call 1f
+1: addl $__hwcap-1b,(%esp)
+ pop %edx
+ testl $0x02000000,(%edx)
+ jz 1f
+ push %eax
+ stmxcsr (%esp)
+ pop %edx
+ and $0x3f,%edx
+ or %edx,4(%ecx)
+1: ret
+
+.global fesetenv
+.type fesetenv,@function
+fesetenv:
+ mov 4(%esp),%ecx
+ xor %eax,%eax
+ inc %ecx
+ jz 1f
+ fldenv -1(%ecx)
+ movl -1(%ecx),%ecx
+ jmp 2f
+1: push %eax
+ push %eax
+ push %eax
+ push %eax
+ pushl $0xffff
+ push %eax
+ pushl $0x37f
+ fldenv (%esp)
+ add $28,%esp
+ # consider sse fenv as well if the cpu has XMM capability
+2: call 1f
+1: addl $__hwcap-1b,(%esp)
+ pop %edx
+ testl $0x02000000,(%edx)
+ jz 1f
+ # mxcsr := same rounding mode, cleared exceptions, default mask
+ and $0xc00,%ecx
+ shl $3,%ecx
+ or $0x1f80,%ecx
+ mov %ecx,4(%esp)
+ ldmxcsr 4(%esp)
+1: ret
+
+.global fetestexcept
+.type fetestexcept,@function
+fetestexcept:
+ mov 4(%esp),%ecx
+ and $0x3f,%ecx
+ fnstsw %ax
+ # consider sse fenv as well if the cpu has XMM capability
+ call 1f
+1: addl $__hwcap-1b,(%esp)
+ pop %edx
+ testl $0x02000000,(%edx)
+ jz 1f
+ stmxcsr 4(%esp)
+ or 4(%esp),%eax
+1: and %ecx,%eax
+ ret
diff --git a/libc-top-half/musl/src/fenv/m68k/fenv.c b/libc-top-half/musl/src/fenv/m68k/fenv.c
new file mode 100644
index 0000000..d0658e6
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/m68k/fenv.c
@@ -0,0 +1,85 @@
+#include <fenv.h>
+#include <features.h>
+
+#if __HAVE_68881__ || __mcffpu__
+
+static unsigned getsr()
+{
+ unsigned v;
+ __asm__ __volatile__ ("fmove.l %%fpsr,%0" : "=dm"(v));
+ return v;
+}
+
+static void setsr(unsigned v)
+{
+ __asm__ __volatile__ ("fmove.l %0,%%fpsr" : : "dm"(v));
+}
+
+static unsigned getcr()
+{
+ unsigned v;
+ __asm__ __volatile__ ("fmove.l %%fpcr,%0" : "=dm"(v));
+ return v;
+}
+
+static void setcr(unsigned v)
+{
+ __asm__ __volatile__ ("fmove.l %0,%%fpcr" : : "dm"(v));
+}
+
+int feclearexcept(int mask)
+{
+ if (mask & ~FE_ALL_EXCEPT) return -1;
+ setsr(getsr() & ~mask);
+ return 0;
+}
+
+int feraiseexcept(int mask)
+{
+ if (mask & ~FE_ALL_EXCEPT) return -1;
+ setsr(getsr() | mask);
+ return 0;
+}
+
+int fetestexcept(int mask)
+{
+ return getsr() & mask;
+}
+
+int fegetround(void)
+{
+ return getcr() & FE_UPWARD;
+}
+
+hidden int __fesetround(int r)
+{
+ setcr((getcr() & ~FE_UPWARD) | r);
+ return 0;
+}
+
+int fegetenv(fenv_t *envp)
+{
+ envp->__control_register = getcr();
+ envp->__status_register = getsr();
+ __asm__ __volatile__ ("fmove.l %%fpiar,%0"
+ : "=dm"(envp->__instruction_address));
+ return 0;
+}
+
+int fesetenv(const fenv_t *envp)
+{
+ static const fenv_t default_env = { 0 };
+ if (envp == FE_DFL_ENV)
+ envp = &default_env;
+ setcr(envp->__control_register);
+ setsr(envp->__status_register);
+ __asm__ __volatile__ ("fmove.l %0,%%fpiar"
+ : : "dm"(envp->__instruction_address));
+ return 0;
+}
+
+#else
+
+#include "../fenv.c"
+
+#endif
diff --git a/libc-top-half/musl/src/fenv/mips/fenv-sf.c b/libc-top-half/musl/src/fenv/mips/fenv-sf.c
new file mode 100644
index 0000000..4aa3dbf
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/mips/fenv-sf.c
@@ -0,0 +1,3 @@
+#ifdef __mips_soft_float
+#include "../fenv.c"
+#endif
diff --git a/libc-top-half/musl/src/fenv/mips/fenv.S b/libc-top-half/musl/src/fenv/mips/fenv.S
new file mode 100644
index 0000000..ffa9297
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/mips/fenv.S
@@ -0,0 +1,72 @@
+#ifndef __mips_soft_float
+
+.set noreorder
+
+.global feclearexcept
+.type feclearexcept,@function
+feclearexcept:
+ and $4, $4, 0x7c
+ cfc1 $5, $31
+ or $5, $5, $4
+ xor $5, $5, $4
+ ctc1 $5, $31
+ jr $ra
+ li $2, 0
+
+.global feraiseexcept
+.type feraiseexcept,@function
+feraiseexcept:
+ and $4, $4, 0x7c
+ cfc1 $5, $31
+ or $5, $5, $4
+ ctc1 $5, $31
+ jr $ra
+ li $2, 0
+
+.global fetestexcept
+.type fetestexcept,@function
+fetestexcept:
+ and $4, $4, 0x7c
+ cfc1 $2, $31
+ jr $ra
+ and $2, $2, $4
+
+.global fegetround
+.type fegetround,@function
+fegetround:
+ cfc1 $2, $31
+ jr $ra
+ andi $2, $2, 3
+
+.global __fesetround
+.hidden __fesetround
+.type __fesetround,@function
+__fesetround:
+ cfc1 $5, $31
+ li $6, -4
+ and $5, $5, $6
+ or $5, $5, $4
+ ctc1 $5, $31
+ jr $ra
+ li $2, 0
+
+.global fegetenv
+.type fegetenv,@function
+fegetenv:
+ cfc1 $5, $31
+ sw $5, 0($4)
+ jr $ra
+ li $2, 0
+
+.global fesetenv
+.type fesetenv,@function
+fesetenv:
+ addiu $5, $4, 1
+ beq $5, $0, 1f
+ nop
+ lw $5, 0($4)
+1: ctc1 $5, $31
+ jr $ra
+ li $2, 0
+
+#endif
diff --git a/libc-top-half/musl/src/fenv/mips64/fenv-sf.c b/libc-top-half/musl/src/fenv/mips64/fenv-sf.c
new file mode 100644
index 0000000..4aa3dbf
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/mips64/fenv-sf.c
@@ -0,0 +1,3 @@
+#ifdef __mips_soft_float
+#include "../fenv.c"
+#endif
diff --git a/libc-top-half/musl/src/fenv/mips64/fenv.S b/libc-top-half/musl/src/fenv/mips64/fenv.S
new file mode 100644
index 0000000..d5e0a62
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/mips64/fenv.S
@@ -0,0 +1,72 @@
+#ifndef __mips_soft_float
+
+.set noreorder
+
+.global feclearexcept
+.type feclearexcept,@function
+feclearexcept:
+ and $4, $4, 0x7c
+ cfc1 $5, $31
+ or $5, $5, $4
+ xor $5, $5, $4
+ ctc1 $5, $31
+ jr $ra
+ li $2, 0
+
+.global feraiseexcept
+.type feraiseexcept,@function
+feraiseexcept:
+ and $4, $4, 0x7c
+ cfc1 $5, $31
+ or $5, $5, $4
+ ctc1 $5, $31
+ jr $ra
+ li $2, 0
+
+.global fetestexcept
+.type fetestexcept,@function
+fetestexcept:
+ and $4, $4, 0x7c
+ cfc1 $2, $31
+ jr $ra
+ and $2, $2, $4
+
+.global fegetround
+.type fegetround,@function
+fegetround:
+ cfc1 $2, $31
+ jr $ra
+ andi $2, $2, 3
+
+.global __fesetround
+.hidden __fesetround
+.type __fesetround,@function
+__fesetround:
+ cfc1 $5, $31
+ li $6, -4
+ and $5, $5, $6
+ or $5, $5, $4
+ ctc1 $5, $31
+ jr $ra
+ li $2, 0
+
+.global fegetenv
+.type fegetenv,@function
+fegetenv:
+ cfc1 $5, $31
+ sw $5, 0($4)
+ jr $ra
+ li $2, 0
+
+.global fesetenv
+.type fesetenv,@function
+fesetenv:
+ daddiu $5, $4, 1
+ beq $5, $0, 1f
+ nop
+ lw $5, 0($4)
+1: ctc1 $5, $31
+ jr $ra
+ li $2, 0
+
+#endif
diff --git a/libc-top-half/musl/src/fenv/mipsn32/fenv-sf.c b/libc-top-half/musl/src/fenv/mipsn32/fenv-sf.c
new file mode 100644
index 0000000..4aa3dbf
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/mipsn32/fenv-sf.c
@@ -0,0 +1,3 @@
+#ifdef __mips_soft_float
+#include "../fenv.c"
+#endif
diff --git a/libc-top-half/musl/src/fenv/mipsn32/fenv.S b/libc-top-half/musl/src/fenv/mipsn32/fenv.S
new file mode 100644
index 0000000..563d322
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/mipsn32/fenv.S
@@ -0,0 +1,71 @@
+#ifndef __mips_soft_float
+
+.set noreorder
+.global feclearexcept
+.type feclearexcept,@function
+feclearexcept:
+ and $4, $4, 0x7c
+ cfc1 $5, $31
+ or $5, $5, $4
+ xor $5, $5, $4
+ ctc1 $5, $31
+ jr $ra
+ li $2, 0
+
+.global feraiseexcept
+.type feraiseexcept,@function
+feraiseexcept:
+ and $4, $4, 0x7c
+ cfc1 $5, $31
+ or $5, $5, $4
+ ctc1 $5, $31
+ jr $ra
+ li $2, 0
+
+.global fetestexcept
+.type fetestexcept,@function
+fetestexcept:
+ and $4, $4, 0x7c
+ cfc1 $2, $31
+ jr $ra
+ and $2, $2, $4
+
+.global fegetround
+.type fegetround,@function
+fegetround:
+ cfc1 $2, $31
+ jr $ra
+ andi $2, $2, 3
+
+.global __fesetround
+.hidden __fesetround
+.type __fesetround,@function
+__fesetround:
+ cfc1 $5, $31
+ li $6, -4
+ and $5, $5, $6
+ or $5, $5, $4
+ ctc1 $5, $31
+ jr $ra
+ li $2, 0
+
+.global fegetenv
+.type fegetenv,@function
+fegetenv:
+ cfc1 $5, $31
+ sw $5, 0($4)
+ jr $ra
+ li $2, 0
+
+.global fesetenv
+.type fesetenv,@function
+fesetenv:
+ addiu $5, $4, 1
+ beq $5, $0, 1f
+ nop
+ lw $5, 0($4)
+1: ctc1 $5, $31
+ jr $ra
+ li $2, 0
+
+#endif
diff --git a/libc-top-half/musl/src/fenv/powerpc/fenv-sf.c b/libc-top-half/musl/src/fenv/powerpc/fenv-sf.c
new file mode 100644
index 0000000..d4248f2
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/powerpc/fenv-sf.c
@@ -0,0 +1,3 @@
+#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
+#include "../fenv.c"
+#endif
diff --git a/libc-top-half/musl/src/fenv/powerpc/fenv.S b/libc-top-half/musl/src/fenv/powerpc/fenv.S
new file mode 100644
index 0000000..55055d0
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/powerpc/fenv.S
@@ -0,0 +1,130 @@
+#if !defined(_SOFT_FLOAT) && !defined(__NO_FPRS__)
+.global feclearexcept
+.type feclearexcept,@function
+feclearexcept:
+ andis. 3,3,0x3e00
+ /* if (r3 & FE_INVALID) r3 |= all_invalid_flags */
+ andis. 0,3,0x2000
+ stwu 1,-16(1)
+ beq- 0,1f
+ oris 3,3,0x01f8
+ ori 3,3,0x0700
+1:
+ /*
+ * note: fpscr contains various fpu status and control
+ * flags and we dont check if r3 may alter other flags
+ * than the exception related ones
+ * ufpscr &= ~r3
+ */
+ mffs 0
+ stfd 0,8(1)
+ lwz 9,12(1)
+ andc 9,9,3
+ stw 9,12(1)
+ lfd 0,8(1)
+ mtfsf 255,0
+
+ /* return 0 */
+ li 3,0
+ addi 1,1,16
+ blr
+
+.global feraiseexcept
+.type feraiseexcept,@function
+feraiseexcept:
+ andis. 3,3,0x3e00
+ /* if (r3 & FE_INVALID) r3 |= software_invalid_flag */
+ andis. 0,3,0x2000
+ stwu 1,-16(1)
+ beq- 0,1f
+ ori 3,3,0x0400
+1:
+ /* fpscr |= r3 */
+ mffs 0
+ stfd 0,8(1)
+ lwz 9,12(1)
+ or 9,9,3
+ stw 9,12(1)
+ lfd 0,8(1)
+ mtfsf 255,0
+
+ /* return 0 */
+ li 3,0
+ addi 1,1,16
+ blr
+
+.global fetestexcept
+.type fetestexcept,@function
+fetestexcept:
+ andis. 3,3,0x3e00
+ /* return r3 & fpscr */
+ stwu 1,-16(1)
+ mffs 0
+ stfd 0,8(1)
+ lwz 9,12(1)
+ addi 1,1,16
+ and 3,3,9
+ blr
+
+.global fegetround
+.type fegetround,@function
+fegetround:
+ /* return fpscr & 3 */
+ stwu 1,-16(1)
+ mffs 0
+ stfd 0,8(1)
+ lwz 3,12(1)
+ addi 1,1,16
+ clrlwi 3,3,30
+ blr
+
+.global __fesetround
+.hidden __fesetround
+.type __fesetround,@function
+__fesetround:
+ /*
+ * note: invalid input is not checked, r3 < 4 must hold
+ * fpscr = (fpscr & -4U) | r3
+ */
+ stwu 1,-16(1)
+ mffs 0
+ stfd 0,8(1)
+ lwz 9,12(1)
+ clrrwi 9,9,2
+ or 9,9,3
+ stw 9,12(1)
+ lfd 0,8(1)
+ mtfsf 255,0
+
+ /* return 0 */
+ li 3,0
+ addi 1,1,16
+ blr
+
+.global fegetenv
+.type fegetenv,@function
+fegetenv:
+ /* *r3 = fpscr */
+ mffs 0
+ stfd 0,0(3)
+ /* return 0 */
+ li 3,0
+ blr
+
+.global fesetenv
+.type fesetenv,@function
+fesetenv:
+ cmpwi 3, -1
+ bne 1f
+ mflr 4
+ bl 2f
+ .zero 8
+2: mflr 3
+ mtlr 4
+1: /* fpscr = *r3 */
+ lfd 0,0(3)
+ mtfsf 255,0
+ /* return 0 */
+ li 3,0
+ blr
+#endif
diff --git a/libc-top-half/musl/src/fenv/powerpc64/fenv.c b/libc-top-half/musl/src/fenv/powerpc64/fenv.c
new file mode 100644
index 0000000..90dabdc
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/powerpc64/fenv.c
@@ -0,0 +1,69 @@
+#define _GNU_SOURCE
+#include <fenv.h>
+#include <features.h>
+
+static inline double get_fpscr_f(void)
+{
+ double d;
+ __asm__ __volatile__("mffs %0" : "=d"(d));
+ return d;
+}
+
+static inline long get_fpscr(void)
+{
+ return (union {double f; long i;}) {get_fpscr_f()}.i;
+}
+
+static inline void set_fpscr_f(double fpscr)
+{
+ __asm__ __volatile__("mtfsf 255, %0" : : "d"(fpscr));
+}
+
+static void set_fpscr(long fpscr)
+{
+ set_fpscr_f((union {long i; double f;}) {fpscr}.f);
+}
+
+int feclearexcept(int mask)
+{
+ mask &= FE_ALL_EXCEPT;
+ if (mask & FE_INVALID) mask |= FE_ALL_INVALID;
+ set_fpscr(get_fpscr() & ~mask);
+ return 0;
+}
+
+int feraiseexcept(int mask)
+{
+ mask &= FE_ALL_EXCEPT;
+ if (mask & FE_INVALID) mask |= FE_INVALID_SOFTWARE;
+ set_fpscr(get_fpscr() | mask);
+ return 0;
+}
+
+int fetestexcept(int mask)
+{
+ return get_fpscr() & mask & FE_ALL_EXCEPT;
+}
+
+int fegetround(void)
+{
+ return get_fpscr() & 3;
+}
+
+hidden int __fesetround(int r)
+{
+ set_fpscr(get_fpscr() & ~3L | r);
+ return 0;
+}
+
+int fegetenv(fenv_t *envp)
+{
+ *envp = get_fpscr_f();
+ return 0;
+}
+
+int fesetenv(const fenv_t *envp)
+{
+ set_fpscr_f(envp != FE_DFL_ENV ? *envp : 0);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/fenv/riscv64/fenv-sf.c b/libc-top-half/musl/src/fenv/riscv64/fenv-sf.c
new file mode 100644
index 0000000..ecd3cb5
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/riscv64/fenv-sf.c
@@ -0,0 +1,3 @@
+#ifndef __riscv_flen
+#include "../fenv.c"
+#endif
diff --git a/libc-top-half/musl/src/fenv/riscv64/fenv.S b/libc-top-half/musl/src/fenv/riscv64/fenv.S
new file mode 100644
index 0000000..0ea78bf
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/riscv64/fenv.S
@@ -0,0 +1,56 @@
+#ifdef __riscv_flen
+
+.global feclearexcept
+.type feclearexcept, %function
+feclearexcept:
+ csrc fflags, a0
+ li a0, 0
+ ret
+
+.global feraiseexcept
+.type feraiseexcept, %function
+feraiseexcept:
+ csrs fflags, a0
+ li a0, 0
+ ret
+
+.global fetestexcept
+.type fetestexcept, %function
+fetestexcept:
+ frflags t0
+ and a0, t0, a0
+ ret
+
+.global fegetround
+.type fegetround, %function
+fegetround:
+ frrm a0
+ ret
+
+.global __fesetround
+.type __fesetround, %function
+__fesetround:
+ fsrm t0, a0
+ li a0, 0
+ ret
+
+.global fegetenv
+.type fegetenv, %function
+fegetenv:
+ frcsr t0
+ sw t0, 0(a0)
+ li a0, 0
+ ret
+
+.global fesetenv
+.type fesetenv, %function
+fesetenv:
+ li t2, -1
+ li t1, 0
+ beq a0, t2, 1f
+ lw t1, 0(a0)
+1: fscsr t1
+ li a0, 0
+ ret
+
+#endif
diff --git a/libc-top-half/musl/src/fenv/s390x/fenv.c b/libc-top-half/musl/src/fenv/s390x/fenv.c
new file mode 100644
index 0000000..fd4e60c
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/s390x/fenv.c
@@ -0,0 +1,56 @@
+#include <fenv.h>
+#include <features.h>
+
+static inline unsigned get_fpc(void)
+{
+ unsigned fpc;
+ __asm__ __volatile__("efpc %0" : "=r"(fpc));
+ return fpc;
+}
+
+static inline void set_fpc(unsigned fpc)
+{
+ __asm__ __volatile__("sfpc %0" :: "r"(fpc));
+}
+
+int feclearexcept(int mask)
+{
+ mask &= FE_ALL_EXCEPT;
+ set_fpc(get_fpc() & ~mask);
+ return 0;
+}
+
+int feraiseexcept(int mask)
+{
+ mask &= FE_ALL_EXCEPT;
+ set_fpc(get_fpc() | mask);
+ return 0;
+}
+
+int fetestexcept(int mask)
+{
+ return get_fpc() & mask & FE_ALL_EXCEPT;
+}
+
+int fegetround(void)
+{
+ return get_fpc() & 3;
+}
+
+hidden int __fesetround(int r)
+{
+ set_fpc(get_fpc() & ~3L | r);
+ return 0;
+}
+
+int fegetenv(fenv_t *envp)
+{
+ *envp = get_fpc();
+ return 0;
+}
+
+int fesetenv(const fenv_t *envp)
+{
+ set_fpc(envp != FE_DFL_ENV ? *envp : 0);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/fenv/sh/fenv-nofpu.c b/libc-top-half/musl/src/fenv/sh/fenv-nofpu.c
new file mode 100644
index 0000000..b2495a6
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/sh/fenv-nofpu.c
@@ -0,0 +1,3 @@
+#if !__SH_FPU_ANY__ && !__SH4__
+#include "../fenv.c"
+#endif
diff --git a/libc-top-half/musl/src/fenv/sh/fenv.S b/libc-top-half/musl/src/fenv/sh/fenv.S
new file mode 100644
index 0000000..b3b7d66
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/sh/fenv.S
@@ -0,0 +1,81 @@
+#if __SH_FPU_ANY__ || __SH4__
+
+.global fegetround
+.type fegetround, @function
+fegetround:
+ sts fpscr, r0
+ rts
+ and #3, r0
+
+.global __fesetround
+.hidden __fesetround
+.type __fesetround, @function
+__fesetround:
+ sts fpscr, r0
+ mov #-4, r1
+ and r1, r0
+ or r4, r0
+ lds r0, fpscr
+ rts
+ mov #0, r0
+
+.global fetestexcept
+.type fetestexcept, @function
+fetestexcept:
+ sts fpscr, r0
+ and r4, r0
+ rts
+ and #0x7c, r0
+
+.global feclearexcept
+.type feclearexcept, @function
+feclearexcept:
+ mov r4, r0
+ and #0x7c, r0
+ not r0, r4
+ sts fpscr, r0
+ and r4, r0
+ lds r0, fpscr
+ rts
+ mov #0, r0
+
+.global feraiseexcept
+.type feraiseexcept, @function
+feraiseexcept:
+ mov r4, r0
+ and #0x7c, r0
+ sts fpscr, r4
+ or r4, r0
+ lds r0, fpscr
+ rts
+ mov #0, r0
+
+.global fegetenv
+.type fegetenv, @function
+fegetenv:
+ sts fpscr, r0
+ mov.l r0, @r4
+ rts
+ mov #0, r0
+
+.global fesetenv
+.type fesetenv, @function
+fesetenv:
+ mov r4, r0
+ cmp/eq #-1, r0
+ bf 1f
+
+ ! the default environment is complicated by the fact that we need to
+ ! preserve the current precision bit, which we do not know a priori
+ sts fpscr, r0
+ mov #8, r1
+ swap.w r1, r1
+ bra 2f
+ and r1, r0
+
+1: mov.l @r4, r0 ! non-default environment
+2: lds r0, fpscr
+ rts
+ mov #0, r0
+
+#endif
diff --git a/libc-top-half/musl/src/fenv/x32/fenv.s b/libc-top-half/musl/src/fenv/x32/fenv.s
new file mode 100644
index 0000000..835f23b
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/x32/fenv.s
@@ -0,0 +1,98 @@
+.global feclearexcept
+.type feclearexcept,@function
+feclearexcept:
+ # maintain exceptions in the sse mxcsr, clear x87 exceptions
+ mov %edi,%ecx
+ and $0x3f,%ecx
+ fnstsw %ax
+ test %eax,%ecx
+ jz 1f
+ fnclex
+1: stmxcsr -8(%esp)
+ and $0x3f,%eax
+ or %eax,-8(%esp)
+ test %ecx,-8(%esp)
+ jz 1f
+ not %ecx
+ and %ecx,-8(%esp)
+ ldmxcsr -8(%esp)
+1: xor %eax,%eax
+ ret
+
+.global feraiseexcept
+.type feraiseexcept,@function
+feraiseexcept:
+ and $0x3f,%edi
+ stmxcsr -8(%esp)
+ or %edi,-8(%esp)
+ ldmxcsr -8(%esp)
+ xor %eax,%eax
+ ret
+
+.global __fesetround
+.hidden __fesetround
+.type __fesetround,@function
+__fesetround:
+ push %rax
+ xor %eax,%eax
+ mov %edi,%ecx
+ fnstcw (%esp)
+ andb $0xf3,1(%esp)
+ or %ch,1(%esp)
+ fldcw (%esp)
+ stmxcsr (%esp)
+ shl $3,%ch
+ andb $0x9f,1(%esp)
+ or %ch,1(%esp)
+ ldmxcsr (%esp)
+ pop %rcx
+ ret
+
+.global fegetround
+.type fegetround,@function
+fegetround:
+ push %rax
+ stmxcsr (%esp)
+ pop %rax
+ shr $3,%eax
+ and $0xc00,%eax
+ ret
+
+.global fegetenv
+.type fegetenv,@function
+fegetenv:
+ xor %eax,%eax
+ fnstenv (%edi)
+ stmxcsr 28(%edi)
+ ret
+
+.global fesetenv
+.type fesetenv,@function
+fesetenv:
+ xor %eax,%eax
+ inc %edi
+ jz 1f
+ fldenv -1(%edi)
+ ldmxcsr 27(%edi)
+ ret
+1: push %rax
+ push %rax
+ pushq $0xffff
+ pushq $0x37f
+ fldenv (%esp)
+ pushq $0x1f80
+ ldmxcsr (%esp)
+ add $40,%esp
+ ret
+
+.global fetestexcept
+.type fetestexcept,@function
+fetestexcept:
+ and $0x3f,%edi
+ push %rax
+ stmxcsr (%esp)
+ pop %rsi
+ fnstsw %ax
+ or %esi,%eax
+ and %edi,%eax
+ ret
diff --git a/libc-top-half/musl/src/fenv/x86_64/fenv.s b/libc-top-half/musl/src/fenv/x86_64/fenv.s
new file mode 100644
index 0000000..98d876d
--- /dev/null
+++ b/libc-top-half/musl/src/fenv/x86_64/fenv.s
@@ -0,0 +1,98 @@
+.global feclearexcept
+.type feclearexcept,@function
+feclearexcept:
+ # maintain exceptions in the sse mxcsr, clear x87 exceptions
+ mov %edi,%ecx
+ and $0x3f,%ecx
+ fnstsw %ax
+ test %eax,%ecx
+ jz 1f
+ fnclex
+1: stmxcsr -8(%rsp)
+ and $0x3f,%eax
+ or %eax,-8(%rsp)
+ test %ecx,-8(%rsp)
+ jz 1f
+ not %ecx
+ and %ecx,-8(%rsp)
+ ldmxcsr -8(%rsp)
+1: xor %eax,%eax
+ ret
+
+.global feraiseexcept
+.type feraiseexcept,@function
+feraiseexcept:
+ and $0x3f,%edi
+ stmxcsr -8(%rsp)
+ or %edi,-8(%rsp)
+ ldmxcsr -8(%rsp)
+ xor %eax,%eax
+ ret
+
+.global __fesetround
+.hidden __fesetround
+.type __fesetround,@function
+__fesetround:
+ push %rax
+ xor %eax,%eax
+ mov %edi,%ecx
+ fnstcw (%rsp)
+ andb $0xf3,1(%rsp)
+ or %ch,1(%rsp)
+ fldcw (%rsp)
+ stmxcsr (%rsp)
+ shl $3,%ch
+ andb $0x9f,1(%rsp)
+ or %ch,1(%rsp)
+ ldmxcsr (%rsp)
+ pop %rcx
+ ret
+
+.global fegetround
+.type fegetround,@function
+fegetround:
+ push %rax
+ stmxcsr (%rsp)
+ pop %rax
+ shr $3,%eax
+ and $0xc00,%eax
+ ret
+
+.global fegetenv
+.type fegetenv,@function
+fegetenv:
+ xor %eax,%eax
+ fnstenv (%rdi)
+ stmxcsr 28(%rdi)
+ ret
+
+.global fesetenv
+.type fesetenv,@function
+fesetenv:
+ xor %eax,%eax
+ inc %rdi
+ jz 1f
+ fldenv -1(%rdi)
+ ldmxcsr 27(%rdi)
+ ret
+1: push %rax
+ push %rax
+ pushq $0xffff
+ pushq $0x37f
+ fldenv (%rsp)
+ pushq $0x1f80
+ ldmxcsr (%rsp)
+ add $40,%rsp
+ ret
+
+.global fetestexcept
+.type fetestexcept,@function
+fetestexcept:
+ and $0x3f,%edi
+ push %rax
+ stmxcsr (%rsp)
+ pop %rsi
+ fnstsw %ax
+ or %esi,%eax
+ and %edi,%eax
+ ret
diff --git a/libc-top-half/musl/src/include/arpa/inet.h b/libc-top-half/musl/src/include/arpa/inet.h
new file mode 100644
index 0000000..1e6debf
--- /dev/null
+++ b/libc-top-half/musl/src/include/arpa/inet.h
@@ -0,0 +1,8 @@
+#ifndef ARPA_INET_H
+#define ARPA_INET_H
+
+#include "../../../include/arpa/inet.h"
+
+hidden int __inet_aton(const char *, struct in_addr *);
+
+#endif
diff --git a/libc-top-half/musl/src/include/crypt.h b/libc-top-half/musl/src/include/crypt.h
new file mode 100644
index 0000000..f6c6309
--- /dev/null
+++ b/libc-top-half/musl/src/include/crypt.h
@@ -0,0 +1,16 @@
+#ifndef CRYPT_H
+#define CRYPT_H
+
+#include "../../include/crypt.h"
+
+#include <features.h>
+
+hidden char *__crypt_r(const char *, const char *, struct crypt_data *);
+
+hidden char *__crypt_des(const char *, const char *, char *);
+hidden char *__crypt_md5(const char *, const char *, char *);
+hidden char *__crypt_blowfish(const char *, const char *, char *);
+hidden char *__crypt_sha256(const char *, const char *, char *);
+hidden char *__crypt_sha512(const char *, const char *, char *);
+
+#endif
diff --git a/libc-top-half/musl/src/include/errno.h b/libc-top-half/musl/src/include/errno.h
new file mode 100644
index 0000000..70941d8
--- /dev/null
+++ b/libc-top-half/musl/src/include/errno.h
@@ -0,0 +1,18 @@
+#ifndef ERRNO_H
+#define ERRNO_H
+
+#include "../../include/errno.h"
+
+#ifdef __wasilibc_unmodified_upstream // Use alternate WASI libc headers
+#ifdef __GNUC__
+__attribute__((const))
+#endif
+hidden int *___errno_location(void);
+
+#undef errno
+#define errno (*___errno_location())
+#else
+// Use the WASI libc errno.
+#endif
+
+#endif
diff --git a/libc-top-half/musl/src/include/features.h b/libc-top-half/musl/src/include/features.h
new file mode 100644
index 0000000..f17bd15
--- /dev/null
+++ b/libc-top-half/musl/src/include/features.h
@@ -0,0 +1,11 @@
+#ifndef FEATURES_H
+#define FEATURES_H
+
+#include "../../include/features.h"
+
+#define weak __attribute__((__weak__))
+#define hidden __attribute__((__visibility__("hidden")))
+#define weak_alias(old, new) \
+ extern __typeof(old) new __attribute__((__weak__, __alias__(#old)))
+
+#endif
diff --git a/libc-top-half/musl/src/include/langinfo.h b/libc-top-half/musl/src/include/langinfo.h
new file mode 100644
index 0000000..ab32b88
--- /dev/null
+++ b/libc-top-half/musl/src/include/langinfo.h
@@ -0,0 +1,8 @@
+#ifndef LANGINFO_H
+#define LANGINFO_H
+
+#include "../../include/langinfo.h"
+
+char *__nl_langinfo_l(nl_item, locale_t);
+
+#endif
diff --git a/libc-top-half/musl/src/include/pthread.h b/libc-top-half/musl/src/include/pthread.h
new file mode 100644
index 0000000..7167d3e
--- /dev/null
+++ b/libc-top-half/musl/src/include/pthread.h
@@ -0,0 +1,29 @@
+#ifndef PTHREAD_H
+#define PTHREAD_H
+
+#include "../../include/pthread.h"
+
+hidden int __pthread_once(pthread_once_t *, void (*)(void));
+hidden void __pthread_testcancel(void);
+hidden int __pthread_setcancelstate(int, int *);
+hidden int __pthread_create(pthread_t *restrict, const pthread_attr_t *restrict, void *(*)(void *), void *restrict);
+hidden _Noreturn void __pthread_exit(void *);
+hidden int __pthread_join(pthread_t, void **);
+hidden int __pthread_mutex_lock(pthread_mutex_t *);
+hidden int __pthread_mutex_trylock(pthread_mutex_t *);
+hidden int __pthread_mutex_trylock_owner(pthread_mutex_t *);
+hidden int __pthread_mutex_timedlock(pthread_mutex_t *restrict, const struct timespec *restrict);
+hidden int __pthread_mutex_unlock(pthread_mutex_t *);
+hidden int __private_cond_signal(pthread_cond_t *, int);
+hidden int __pthread_cond_timedwait(pthread_cond_t *restrict, pthread_mutex_t *restrict, const struct timespec *restrict);
+hidden int __pthread_key_create(pthread_key_t *, void (*)(void *));
+hidden int __pthread_key_delete(pthread_key_t);
+hidden int __pthread_rwlock_rdlock(pthread_rwlock_t *);
+hidden int __pthread_rwlock_tryrdlock(pthread_rwlock_t *);
+hidden int __pthread_rwlock_timedrdlock(pthread_rwlock_t *__restrict, const struct timespec *__restrict);
+hidden int __pthread_rwlock_wrlock(pthread_rwlock_t *);
+hidden int __pthread_rwlock_trywrlock(pthread_rwlock_t *);
+hidden int __pthread_rwlock_timedwrlock(pthread_rwlock_t *__restrict, const struct timespec *__restrict);
+hidden int __pthread_rwlock_unlock(pthread_rwlock_t *);
+
+#endif
diff --git a/libc-top-half/musl/src/include/resolv.h b/libc-top-half/musl/src/include/resolv.h
new file mode 100644
index 0000000..945e89e
--- /dev/null
+++ b/libc-top-half/musl/src/include/resolv.h
@@ -0,0 +1,12 @@
+#ifndef RESOLV_H
+#define RESOLV_H
+
+#include "../../include/resolv.h"
+
+hidden int __dn_expand(const unsigned char *, const unsigned char *, const unsigned char *, char *, int);
+
+hidden int __res_mkquery(int, const char *, int, int, const unsigned char *, int, const unsigned char*, unsigned char *, int);
+hidden int __res_send(const unsigned char *, int, unsigned char *, int);
+hidden int __res_msend(int, const unsigned char *const *, const int *, unsigned char *const *, int *, int);
+
+#endif
diff --git a/libc-top-half/musl/src/include/signal.h b/libc-top-half/musl/src/include/signal.h
new file mode 100644
index 0000000..46de698
--- /dev/null
+++ b/libc-top-half/musl/src/include/signal.h
@@ -0,0 +1,16 @@
+#ifndef SIGNAL_H
+#define SIGNAL_H
+
+#include "../../include/signal.h"
+
+#ifdef __wasilibc_unmodified_upstream // WASI has no sigaction
+hidden int __sigaction(int, const struct sigaction *, struct sigaction *);
+
+hidden void __block_all_sigs(void *);
+hidden void __block_app_sigs(void *);
+hidden void __restore_sigs(void *);
+
+hidden void __get_handler_set(sigset_t *);
+#endif
+
+#endif
diff --git a/libc-top-half/musl/src/include/stdio.h b/libc-top-half/musl/src/include/stdio.h
new file mode 100644
index 0000000..176a73c
--- /dev/null
+++ b/libc-top-half/musl/src/include/stdio.h
@@ -0,0 +1,22 @@
+#ifndef STDIO_H
+#define STDIO_H
+
+#ifdef __wasilibc_unmodified_upstream /* WASI doesn't need to define FILE as a complete type */
+#define __DEFINED_struct__IO_FILE
+#endif
+
+#include "../../include/stdio.h"
+
+#undef stdin
+#undef stdout
+#undef stderr
+
+extern hidden FILE __stdin_FILE;
+extern hidden FILE __stdout_FILE;
+extern hidden FILE __stderr_FILE;
+
+#define stdin (&__stdin_FILE)
+#define stdout (&__stdout_FILE)
+#define stderr (&__stderr_FILE)
+
+#endif
diff --git a/libc-top-half/musl/src/include/stdlib.h b/libc-top-half/musl/src/include/stdlib.h
new file mode 100644
index 0000000..812b04d
--- /dev/null
+++ b/libc-top-half/musl/src/include/stdlib.h
@@ -0,0 +1,19 @@
+#ifndef STDLIB_H
+#define STDLIB_H
+
+#include "../../include/stdlib.h"
+
+hidden int __putenv(char *, size_t, char *);
+hidden void __env_rm_add(char *, char *);
+hidden int __mkostemps(char *, int, int);
+hidden int __ptsname_r(int, char *, size_t);
+hidden char *__randname(char *);
+hidden void __qsort_r (void *, size_t, size_t, int (*)(const void *, const void *, void *), void *);
+
+hidden void *__libc_malloc(size_t);
+hidden void *__libc_malloc_impl(size_t);
+hidden void *__libc_calloc(size_t, size_t);
+hidden void *__libc_realloc(void *, size_t);
+hidden void __libc_free(void *);
+
+#endif
diff --git a/libc-top-half/musl/src/include/string.h b/libc-top-half/musl/src/include/string.h
new file mode 100644
index 0000000..2133b5c
--- /dev/null
+++ b/libc-top-half/musl/src/include/string.h
@@ -0,0 +1,11 @@
+#ifndef STRING_H
+#define STRING_H
+
+#include "../../include/string.h"
+
+hidden void *__memrchr(const void *, int, size_t);
+hidden char *__stpcpy(char *, const char *);
+hidden char *__stpncpy(char *, const char *, size_t);
+hidden char *__strchrnul(const char *, int);
+
+#endif
diff --git a/libc-top-half/musl/src/include/sys/auxv.h b/libc-top-half/musl/src/include/sys/auxv.h
new file mode 100644
index 0000000..9358a4a
--- /dev/null
+++ b/libc-top-half/musl/src/include/sys/auxv.h
@@ -0,0 +1,10 @@
+#ifndef SYS_AUXV_H
+#define SYS_AUXV_H
+
+#include "../../../include/sys/auxv.h"
+
+#include <features.h>
+
+hidden unsigned long __getauxval(unsigned long);
+
+#endif
diff --git a/libc-top-half/musl/src/include/sys/membarrier.h b/libc-top-half/musl/src/include/sys/membarrier.h
new file mode 100644
index 0000000..3654491
--- /dev/null
+++ b/libc-top-half/musl/src/include/sys/membarrier.h
@@ -0,0 +1,9 @@
+#ifndef SYS_MEMBARRIER_H
+#define SYS_MEMBARRIER_H
+
+#include "../../../include/sys/membarrier.h"
+#include <features.h>
+
+hidden int __membarrier(int, int);
+
+#endif
diff --git a/libc-top-half/musl/src/include/sys/mman.h b/libc-top-half/musl/src/include/sys/mman.h
new file mode 100644
index 0000000..57c5bd3
--- /dev/null
+++ b/libc-top-half/musl/src/include/sys/mman.h
@@ -0,0 +1,20 @@
+#ifndef SYS_MMAN_H
+#define SYS_MMAN_H
+
+#include "../../../include/sys/mman.h"
+
+hidden void __vm_wait(void);
+hidden void __vm_lock(void);
+hidden void __vm_unlock(void);
+
+hidden void *__mmap(void *, size_t, int, int, int, off_t);
+hidden int __munmap(void *, size_t);
+hidden void *__mremap(void *, size_t, size_t, int, ...);
+hidden int __madvise(void *, size_t, int);
+hidden int __mprotect(void *, size_t, int);
+
+hidden const unsigned char *__map_file(const char *, size_t *);
+
+hidden char *__shm_mapname(const char *, char *);
+
+#endif
diff --git a/libc-top-half/musl/src/include/sys/sysinfo.h b/libc-top-half/musl/src/include/sys/sysinfo.h
new file mode 100644
index 0000000..10be8a4
--- /dev/null
+++ b/libc-top-half/musl/src/include/sys/sysinfo.h
@@ -0,0 +1,9 @@
+#ifndef SYS_SYSINFO_H
+#define SYS_SYSINFO_H
+
+#include "../../../include/sys/sysinfo.h"
+#include <features.h>
+
+hidden int __lsysinfo(struct sysinfo *);
+
+#endif
diff --git a/libc-top-half/musl/src/include/sys/time.h b/libc-top-half/musl/src/include/sys/time.h
new file mode 100644
index 0000000..fb9622e
--- /dev/null
+++ b/libc-top-half/musl/src/include/sys/time.h
@@ -0,0 +1,8 @@
+#ifndef SYS_TIME_H
+#define SYS_TIME_H
+
+#include "../../../include/sys/time.h"
+
+hidden int __futimesat(int, const char *, const struct timeval [2]);
+
+#endif
diff --git a/libc-top-half/musl/src/include/time.h b/libc-top-half/musl/src/include/time.h
new file mode 100644
index 0000000..cbabde4
--- /dev/null
+++ b/libc-top-half/musl/src/include/time.h
@@ -0,0 +1,15 @@
+#ifndef TIME_H
+#define TIME_H
+
+#include "../../include/time.h"
+
+hidden int __clock_gettime(clockid_t, struct timespec *);
+hidden int __clock_nanosleep(clockid_t, int, const struct timespec *, struct timespec *);
+
+hidden char *__asctime_r(const struct tm *, char *);
+hidden struct tm *__gmtime_r(const time_t *restrict, struct tm *restrict);
+hidden struct tm *__localtime_r(const time_t *restrict, struct tm *restrict);
+
+hidden size_t __strftime_l(char *restrict, size_t, const char *restrict, const struct tm *restrict, locale_t);
+
+#endif
diff --git a/libc-top-half/musl/src/include/unistd.h b/libc-top-half/musl/src/include/unistd.h
new file mode 100644
index 0000000..d02206e
--- /dev/null
+++ b/libc-top-half/musl/src/include/unistd.h
@@ -0,0 +1,20 @@
+#ifndef UNISTD_H
+#define UNISTD_H
+
+#include "../../include/unistd.h"
+
+#ifdef __wasilibc_unmodified_upstream // Lazy environment variable init.
+extern char **__environ;
+#else
+// To support lazy initialization of environment variables, `__environ` is
+// omitted, and a lazy `__wasilibc_environ` is used instead. Use
+// "wasi/libc-environ-compat.h" in functions that use `__environ`.
+#include "wasi/libc-environ.h"
+#endif
+
+hidden int __dup3(int, int, int);
+hidden int __mkostemps(char *, int, int);
+hidden int __execvpe(const char *, char *const *, char *const *);
+hidden off_t __lseek(int, off_t, int);
+
+#endif
diff --git a/libc-top-half/musl/src/include/wchar.h b/libc-top-half/musl/src/include/wchar.h
new file mode 100644
index 0000000..1814bad
--- /dev/null
+++ b/libc-top-half/musl/src/include/wchar.h
@@ -0,0 +1,11 @@
+#ifndef WCHAR_H
+#define WCHAR_H
+
+#ifdef __wasilibc_unmodified_upstream /* WASI doesn't need to define FILE as a complete type */
+#define __DEFINED_struct__IO_FILE
+#endif
+
+#include "../../include/wchar.h"
+
+#endif
+
diff --git a/libc-top-half/musl/src/internal/aio_impl.h b/libc-top-half/musl/src/internal/aio_impl.h
new file mode 100644
index 0000000..a865766
--- /dev/null
+++ b/libc-top-half/musl/src/internal/aio_impl.h
@@ -0,0 +1,9 @@
+#ifndef AIO_IMPL_H
+#define AIO_IMPL_H
+
+extern hidden volatile int __aio_fut;
+
+extern hidden int __aio_close(int);
+extern hidden void __aio_atfork(int);
+
+#endif
diff --git a/libc-top-half/musl/src/internal/atomic.h b/libc-top-half/musl/src/internal/atomic.h
new file mode 100644
index 0000000..96c1552
--- /dev/null
+++ b/libc-top-half/musl/src/internal/atomic.h
@@ -0,0 +1,333 @@
+#ifndef _ATOMIC_H
+#define _ATOMIC_H
+
+#include <stdint.h>
+
+#include "atomic_arch.h"
+
+#ifdef a_ll
+
+#ifndef a_pre_llsc
+#define a_pre_llsc()
+#endif
+
+#ifndef a_post_llsc
+#define a_post_llsc()
+#endif
+
+#ifndef a_cas
+#define a_cas a_cas
+static inline int a_cas(volatile int *p, int t, int s)
+{
+ int old;
+ a_pre_llsc();
+ do old = a_ll(p);
+ while (old==t && !a_sc(p, s));
+ a_post_llsc();
+ return old;
+}
+#endif
+
+#ifndef a_swap
+#define a_swap a_swap
+static inline int a_swap(volatile int *p, int v)
+{
+ int old;
+ a_pre_llsc();
+ do old = a_ll(p);
+ while (!a_sc(p, v));
+ a_post_llsc();
+ return old;
+}
+#endif
+
+#ifndef a_fetch_add
+#define a_fetch_add a_fetch_add
+static inline int a_fetch_add(volatile int *p, int v)
+{
+ int old;
+ a_pre_llsc();
+ do old = a_ll(p);
+ while (!a_sc(p, (unsigned)old + v));
+ a_post_llsc();
+ return old;
+}
+#endif
+
+#ifndef a_fetch_and
+#define a_fetch_and a_fetch_and
+static inline int a_fetch_and(volatile int *p, int v)
+{
+ int old;
+ a_pre_llsc();
+ do old = a_ll(p);
+ while (!a_sc(p, old & v));
+ a_post_llsc();
+ return old;
+}
+#endif
+
+#ifndef a_fetch_or
+#define a_fetch_or a_fetch_or
+static inline int a_fetch_or(volatile int *p, int v)
+{
+ int old;
+ a_pre_llsc();
+ do old = a_ll(p);
+ while (!a_sc(p, old | v));
+ a_post_llsc();
+ return old;
+}
+#endif
+
+#endif
+
+#ifdef a_ll_p
+
+#ifndef a_cas_p
+#define a_cas_p a_cas_p
+static inline void *a_cas_p(volatile void *p, void *t, void *s)
+{
+ void *old;
+ a_pre_llsc();
+ do old = a_ll_p(p);
+ while (old==t && !a_sc_p(p, s));
+ a_post_llsc();
+ return old;
+}
+#endif
+
+#endif
+
+#ifndef a_cas
+#error missing definition of a_cas
+#endif
+
+#ifndef a_swap
+#define a_swap a_swap
+static inline int a_swap(volatile int *p, int v)
+{
+ int old;
+ do old = *p;
+ while (a_cas(p, old, v) != old);
+ return old;
+}
+#endif
+
+#ifndef a_fetch_add
+#define a_fetch_add a_fetch_add
+static inline int a_fetch_add(volatile int *p, int v)
+{
+ int old;
+ do old = *p;
+ while (a_cas(p, old, (unsigned)old+v) != old);
+ return old;
+}
+#endif
+
+#ifndef a_fetch_and
+#define a_fetch_and a_fetch_and
+static inline int a_fetch_and(volatile int *p, int v)
+{
+ int old;
+ do old = *p;
+ while (a_cas(p, old, old&v) != old);
+ return old;
+}
+#endif
+#ifndef a_fetch_or
+#define a_fetch_or a_fetch_or
+static inline int a_fetch_or(volatile int *p, int v)
+{
+ int old;
+ do old = *p;
+ while (a_cas(p, old, old|v) != old);
+ return old;
+}
+#endif
+
+#ifndef a_and
+#define a_and a_and
+static inline void a_and(volatile int *p, int v)
+{
+ a_fetch_and(p, v);
+}
+#endif
+
+#ifndef a_or
+#define a_or a_or
+static inline void a_or(volatile int *p, int v)
+{
+ a_fetch_or(p, v);
+}
+#endif
+
+#ifndef a_inc
+#define a_inc a_inc
+static inline void a_inc(volatile int *p)
+{
+ a_fetch_add(p, 1);
+}
+#endif
+
+#ifndef a_dec
+#define a_dec a_dec
+static inline void a_dec(volatile int *p)
+{
+ a_fetch_add(p, -1);
+}
+#endif
+
+#ifndef a_store
+#define a_store a_store
+static inline void a_store(volatile int *p, int v)
+{
+#ifdef a_barrier
+ a_barrier();
+ *p = v;
+ a_barrier();
+#else
+ a_swap(p, v);
+#endif
+}
+#endif
+
+#ifndef a_barrier
+#define a_barrier a_barrier
+static void a_barrier()
+{
+ volatile int tmp = 0;
+ a_cas(&tmp, 0, 0);
+}
+#endif
+
+#ifndef a_spin
+#define a_spin a_barrier
+#endif
+
+#ifndef a_and_64
+#define a_and_64 a_and_64
+static inline void a_and_64(volatile uint64_t *p, uint64_t v)
+{
+ union { uint64_t v; uint32_t r[2]; } u = { v };
+ if (u.r[0]+1) a_and((int *)p, u.r[0]);
+ if (u.r[1]+1) a_and((int *)p+1, u.r[1]);
+}
+#endif
+
+#ifndef a_or_64
+#define a_or_64 a_or_64
+static inline void a_or_64(volatile uint64_t *p, uint64_t v)
+{
+ union { uint64_t v; uint32_t r[2]; } u = { v };
+ if (u.r[0]) a_or((int *)p, u.r[0]);
+ if (u.r[1]) a_or((int *)p+1, u.r[1]);
+}
+#endif
+
+#ifndef a_cas_p
+typedef char a_cas_p_undefined_but_pointer_not_32bit[-sizeof(char) == 0xffffffff ? 1 : -1];
+#define a_cas_p a_cas_p
+static inline void *a_cas_p(volatile void *p, void *t, void *s)
+{
+ return (void *)a_cas((volatile int *)p, (int)t, (int)s);
+}
+#endif
+
+#ifndef a_or_l
+#define a_or_l a_or_l
+static inline void a_or_l(volatile void *p, long v)
+{
+ if (sizeof(long) == sizeof(int)) a_or(p, v);
+ else a_or_64(p, v);
+}
+#endif
+
+#ifndef a_crash
+#define a_crash a_crash
+static inline void a_crash()
+{
+ *(volatile char *)0=0;
+}
+#endif
+
+#ifndef a_ctz_32
+#define a_ctz_32 a_ctz_32
+static inline int a_ctz_32(uint32_t x)
+{
+#ifdef a_clz_32
+ return 31-a_clz_32(x&-x);
+#else
+ static const char debruijn32[32] = {
+ 0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13,
+ 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14
+ };
+ return debruijn32[(x&-x)*0x076be629 >> 27];
+#endif
+}
+#endif
+
+#ifndef a_ctz_64
+#define a_ctz_64 a_ctz_64
+static inline int a_ctz_64(uint64_t x)
+{
+ static const char debruijn64[64] = {
+ 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28,
+ 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11,
+ 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10,
+ 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12
+ };
+ if (sizeof(long) < 8) {
+ uint32_t y = x;
+ if (!y) {
+ y = x>>32;
+ return 32 + a_ctz_32(y);
+ }
+ return a_ctz_32(y);
+ }
+ return debruijn64[(x&-x)*0x022fdd63cc95386dull >> 58];
+}
+#endif
+
+static inline int a_ctz_l(unsigned long x)
+{
+ return (sizeof(long) < 8) ? a_ctz_32(x) : a_ctz_64(x);
+}
+
+#ifndef a_clz_64
+#define a_clz_64 a_clz_64
+static inline int a_clz_64(uint64_t x)
+{
+#ifdef a_clz_32
+ if (x>>32)
+ return a_clz_32(x>>32);
+ return a_clz_32(x) + 32;
+#else
+ uint32_t y;
+ int r;
+ if (x>>32) y=x>>32, r=0; else y=x, r=32;
+ if (y>>16) y>>=16; else r |= 16;
+ if (y>>8) y>>=8; else r |= 8;
+ if (y>>4) y>>=4; else r |= 4;
+ if (y>>2) y>>=2; else r |= 2;
+ return r | !(y>>1);
+#endif
+}
+#endif
+
+#ifndef a_clz_32
+#define a_clz_32 a_clz_32
+static inline int a_clz_32(uint32_t x)
+{
+ x >>= 1;
+ x |= x >> 1;
+ x |= x >> 2;
+ x |= x >> 4;
+ x |= x >> 8;
+ x |= x >> 16;
+ x++;
+ return 31-a_ctz_32(x);
+}
+#endif
+
+#endif
diff --git a/libc-top-half/musl/src/internal/complex_impl.h b/libc-top-half/musl/src/internal/complex_impl.h
new file mode 100644
index 0000000..51fb298
--- /dev/null
+++ b/libc-top-half/musl/src/internal/complex_impl.h
@@ -0,0 +1,22 @@
+#ifndef _COMPLEX_IMPL_H
+#define _COMPLEX_IMPL_H
+
+#include <complex.h>
+#include "libm.h"
+
+#undef __CMPLX
+#undef CMPLX
+#undef CMPLXF
+#undef CMPLXL
+
+#define __CMPLX(x, y, t) \
+ ((union { _Complex t __z; t __xy[2]; }){.__xy = {(x),(y)}}.__z)
+
+#define CMPLX(x, y) __CMPLX(x, y, double)
+#define CMPLXF(x, y) __CMPLX(x, y, float)
+#define CMPLXL(x, y) __CMPLX(x, y, long double)
+
+hidden double complex __ldexp_cexp(double complex,int);
+hidden float complex __ldexp_cexpf(float complex,int);
+
+#endif
diff --git a/libc-top-half/musl/src/internal/defsysinfo.c b/libc-top-half/musl/src/internal/defsysinfo.c
new file mode 100644
index 0000000..6d4117d
--- /dev/null
+++ b/libc-top-half/musl/src/internal/defsysinfo.c
@@ -0,0 +1,3 @@
+#include "libc.h"
+
+size_t __sysinfo;
diff --git a/libc-top-half/musl/src/internal/dynlink.h b/libc-top-half/musl/src/internal/dynlink.h
new file mode 100644
index 0000000..51c0639
--- /dev/null
+++ b/libc-top-half/musl/src/internal/dynlink.h
@@ -0,0 +1,113 @@
+#ifndef _INTERNAL_RELOC_H
+#define _INTERNAL_RELOC_H
+
+#include <features.h>
+#include <elf.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdarg.h>
+
+#if UINTPTR_MAX == 0xffffffff
+typedef Elf32_Ehdr Ehdr;
+typedef Elf32_Phdr Phdr;
+typedef Elf32_Sym Sym;
+#define R_TYPE(x) ((x)&255)
+#define R_SYM(x) ((x)>>8)
+#define R_INFO ELF32_R_INFO
+#else
+typedef Elf64_Ehdr Ehdr;
+typedef Elf64_Phdr Phdr;
+typedef Elf64_Sym Sym;
+#define R_TYPE(x) ((x)&0x7fffffff)
+#define R_SYM(x) ((x)>>32)
+#define R_INFO ELF64_R_INFO
+#endif
+
+/* These enum constants provide unmatchable default values for
+ * any relocation type the arch does not use. */
+enum {
+ REL_NONE = 0,
+ REL_SYMBOLIC = -100,
+ REL_USYMBOLIC,
+ REL_GOT,
+ REL_PLT,
+ REL_RELATIVE,
+ REL_OFFSET,
+ REL_OFFSET32,
+ REL_COPY,
+ REL_SYM_OR_REL,
+ REL_DTPMOD,
+ REL_DTPOFF,
+ REL_TPOFF,
+ REL_TPOFF_NEG,
+ REL_TLSDESC,
+ REL_FUNCDESC,
+ REL_FUNCDESC_VAL,
+};
+
+struct fdpic_loadseg {
+ uintptr_t addr, p_vaddr, p_memsz;
+};
+
+struct fdpic_loadmap {
+ unsigned short version, nsegs;
+ struct fdpic_loadseg segs[];
+};
+
+struct fdpic_dummy_loadmap {
+ unsigned short version, nsegs;
+ struct fdpic_loadseg segs[1];
+};
+
+#include "reloc.h"
+
+#ifndef FDPIC_CONSTDISP_FLAG
+#define FDPIC_CONSTDISP_FLAG 0
+#endif
+
+#ifndef DL_FDPIC
+#define DL_FDPIC 0
+#endif
+
+#ifndef DL_NOMMU_SUPPORT
+#define DL_NOMMU_SUPPORT 0
+#endif
+
+#if !DL_FDPIC
+#define IS_RELATIVE(x,s) ( \
+ (R_TYPE(x) == REL_RELATIVE) || \
+ (R_TYPE(x) == REL_SYM_OR_REL && !R_SYM(x)) )
+#else
+#define IS_RELATIVE(x,s) ( ( \
+ (R_TYPE(x) == REL_FUNCDESC_VAL) || \
+ (R_TYPE(x) == REL_SYMBOLIC) ) \
+ && (((s)[R_SYM(x)].st_info & 0xf) == STT_SECTION) )
+#endif
+
+#ifndef NEED_MIPS_GOT_RELOCS
+#define NEED_MIPS_GOT_RELOCS 0
+#endif
+
+#ifndef DT_DEBUG_INDIRECT
+#define DT_DEBUG_INDIRECT 0
+#endif
+
+#define AUX_CNT 32
+#define DYN_CNT 32
+
+typedef void (*stage2_func)(unsigned char *, size_t *);
+
+hidden void *__dlsym(void *restrict, const char *restrict, void *restrict);
+
+hidden void __dl_seterr(const char *, ...);
+hidden int __dl_invalid_handle(void *);
+hidden void __dl_vseterr(const char *, va_list);
+
+hidden ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic();
+
+hidden extern int __malloc_replaced;
+hidden extern int __aligned_alloc_replaced;
+hidden void __malloc_donate(char *, char *);
+hidden int __malloc_allzerop(void *);
+
+#endif
diff --git a/libc-top-half/musl/src/internal/fdpic_crt.h b/libc-top-half/musl/src/internal/fdpic_crt.h
new file mode 100644
index 0000000..7e9632b
--- /dev/null
+++ b/libc-top-half/musl/src/internal/fdpic_crt.h
@@ -0,0 +1,28 @@
+#include <stdint.h>
+#include <features.h>
+
+hidden void *__fdpic_fixup(void *map, uintptr_t *a, uintptr_t *z)
+{
+ /* If map is a null pointer, the program was loaded by a
+ * non-FDPIC-aware ELF loader, and fixups are not needed,
+ * but the value for the GOT pointer is. */
+ if (!map) return (void *)z[-1];
+
+ struct {
+ unsigned short version, nsegs;
+ struct fdpic_loadseg {
+ uintptr_t addr, p_vaddr, p_memsz;
+ } segs[];
+ } *lm = map;
+ int nsegs = lm->nsegs, rseg = 0, vseg = 0;
+ for (;;) {
+ while (*a-lm->segs[rseg].p_vaddr >= lm->segs[rseg].p_memsz)
+ if (++rseg == nsegs) rseg = 0;
+ uintptr_t *r = (uintptr_t *)
+ (*a + lm->segs[rseg].addr - lm->segs[rseg].p_vaddr);
+ if (++a == z) return r;
+ while (*r-lm->segs[vseg].p_vaddr >= lm->segs[vseg].p_memsz)
+ if (++vseg == nsegs) vseg = 0;
+ *r += lm->segs[vseg].addr - lm->segs[vseg].p_vaddr;
+ }
+}
diff --git a/libc-top-half/musl/src/internal/floatscan.c b/libc-top-half/musl/src/internal/floatscan.c
new file mode 100644
index 0000000..ec50fe0
--- /dev/null
+++ b/libc-top-half/musl/src/internal/floatscan.c
@@ -0,0 +1,556 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+#include <limits.h>
+#include <errno.h>
+#include <ctype.h>
+#ifdef __wasilibc_unmodified_upstream // Changes to optimize printf/scanf when long double isn't needed
+#else
+#include "printscan.h"
+#endif
+
+#include "shgetc.h"
+#include "floatscan.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+
+#define LD_B1B_DIG 2
+#define LD_B1B_MAX 9007199, 254740991
+#define KMAX 128
+
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+
+#define LD_B1B_DIG 3
+#define LD_B1B_MAX 18, 446744073, 709551615
+#define KMAX 2048
+
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+
+#define LD_B1B_DIG 4
+#define LD_B1B_MAX 10384593, 717069655, 257060992, 658440191
+#define KMAX 2048
+
+#else
+#error Unsupported long double representation
+#endif
+
+#define MASK (KMAX-1)
+
+static long long scanexp(FILE *f, int pok)
+{
+ int c;
+ int x;
+ long long y;
+ int neg = 0;
+
+ c = shgetc(f);
+ if (c=='+' || c=='-') {
+ neg = (c=='-');
+ c = shgetc(f);
+ if (c-'0'>=10U && pok) shunget(f);
+ }
+ if (c-'0'>=10U) {
+ shunget(f);
+ return LLONG_MIN;
+ }
+ for (x=0; c-'0'<10U && x<INT_MAX/10; c = shgetc(f))
+ x = 10*x + c-'0';
+ for (y=x; c-'0'<10U && y<LLONG_MAX/100; c = shgetc(f))
+ y = 10*y + c-'0';
+ for (; c-'0'<10U; c = shgetc(f));
+ shunget(f);
+ return neg ? -y : y;
+}
+
+
+#if defined(__wasilibc_printscan_no_long_double)
+static long_double decfloat(FILE *f, int c, int bits, int emin, int sign, int pok)
+#else
+static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int pok)
+#endif
+{
+ uint32_t x[KMAX];
+ static const uint32_t th[] = { LD_B1B_MAX };
+ int i, j, k, a, z;
+ long long lrp=0, dc=0;
+ long long e10=0;
+ int lnz = 0;
+ int gotdig = 0, gotrad = 0;
+ int rp;
+ int e2;
+ int emax = -emin-bits+3;
+ int denormal = 0;
+#if defined(__wasilibc_printscan_no_long_double)
+ long_double y;
+ long_double frac=0;
+ long_double bias=0;
+#else
+ long double y;
+ long double frac=0;
+ long double bias=0;
+#endif
+ static const int p10s[] = { 10, 100, 1000, 10000,
+ 100000, 1000000, 10000000, 100000000 };
+
+ j=0;
+ k=0;
+
+ /* Don't let leading zeros consume buffer space */
+ for (; c=='0'; c = shgetc(f)) gotdig=1;
+ if (c=='.') {
+ gotrad = 1;
+ for (c = shgetc(f); c=='0'; c = shgetc(f)) gotdig=1, lrp--;
+ }
+
+ x[0] = 0;
+ for (; c-'0'<10U || c=='.'; c = shgetc(f)) {
+ if (c == '.') {
+ if (gotrad) break;
+ gotrad = 1;
+ lrp = dc;
+ } else if (k < KMAX-3) {
+ dc++;
+ if (c!='0') lnz = dc;
+ if (j) x[k] = x[k]*10 + c-'0';
+ else x[k] = c-'0';
+ if (++j==9) {
+ k++;
+ j=0;
+ }
+ gotdig=1;
+ } else {
+ dc++;
+ if (c!='0') {
+ lnz = (KMAX-4)*9;
+ x[KMAX-4] |= 1;
+ }
+ }
+ }
+ if (!gotrad) lrp=dc;
+
+ if (gotdig && (c|32)=='e') {
+ e10 = scanexp(f, pok);
+ if (e10 == LLONG_MIN) {
+ if (pok) {
+ shunget(f);
+ } else {
+ shlim(f, 0);
+ return 0;
+ }
+ e10 = 0;
+ }
+ lrp += e10;
+ } else if (c>=0) {
+ shunget(f);
+ }
+ if (!gotdig) {
+ errno = EINVAL;
+ shlim(f, 0);
+ return 0;
+ }
+
+ /* Handle zero specially to avoid nasty special cases later */
+ if (!x[0]) return sign * 0.0;
+
+ /* Optimize small integers (w/no exponent) and over/under-flow */
+ if (lrp==dc && dc<10 && (bits>30 || x[0]>>bits==0))
+#if defined(__wasilibc_printscan_no_long_double)
+ return sign * (long_double)x[0];
+#else
+ return sign * (long double)x[0];
+#endif
+ if (lrp > -emin/2) {
+ errno = ERANGE;
+ return sign * LDBL_MAX * LDBL_MAX;
+ }
+ if (lrp < emin-2*LDBL_MANT_DIG) {
+ errno = ERANGE;
+ return sign * LDBL_MIN * LDBL_MIN;
+ }
+
+ /* Align incomplete final B1B digit */
+ if (j) {
+ for (; j<9; j++) x[k]*=10;
+ k++;
+ j=0;
+ }
+
+ a = 0;
+ z = k;
+ e2 = 0;
+ rp = lrp;
+
+ /* Optimize small to mid-size integers (even in exp. notation) */
+ if (lnz<9 && lnz<=rp && rp < 18) {
+#if defined(__wasilibc_printscan_no_long_double)
+ if (rp == 9) return sign * (long_double)x[0];
+ if (rp < 9) return sign * (long_double)x[0] / p10s[8-rp];
+#else
+ if (rp == 9) return sign * (long double)x[0];
+ if (rp < 9) return sign * (long double)x[0] / p10s[8-rp];
+#endif
+ int bitlim = bits-3*(int)(rp-9);
+ if (bitlim>30 || x[0]>>bitlim==0)
+#if defined(__wasilibc_printscan_no_long_double)
+ return sign * (long_double)x[0] * p10s[rp-10];
+#else
+ return sign * (long double)x[0] * p10s[rp-10];
+#endif
+ }
+
+ /* Drop trailing zeros */
+ for (; !x[z-1]; z--);
+
+ /* Align radix point to B1B digit boundary */
+ if (rp % 9) {
+ int rpm9 = rp>=0 ? rp%9 : rp%9+9;
+ int p10 = p10s[8-rpm9];
+ uint32_t carry = 0;
+ for (k=a; k!=z; k++) {
+ uint32_t tmp = x[k] % p10;
+ x[k] = x[k]/p10 + carry;
+ carry = 1000000000/p10 * tmp;
+ if (k==a && !x[k]) {
+ a = (a+1 & MASK);
+ rp -= 9;
+ }
+ }
+ if (carry) x[z++] = carry;
+ rp += 9-rpm9;
+ }
+
+ /* Upscale until desired number of bits are left of radix point */
+ while (rp < 9*LD_B1B_DIG || (rp == 9*LD_B1B_DIG && x[a]<th[0])) {
+ uint32_t carry = 0;
+ e2 -= 29;
+ for (k=(z-1 & MASK); ; k=(k-1 & MASK)) {
+ uint64_t tmp = ((uint64_t)x[k] << 29) + carry;
+ if (tmp > 1000000000) {
+ carry = tmp / 1000000000;
+ x[k] = tmp % 1000000000;
+ } else {
+ carry = 0;
+ x[k] = tmp;
+ }
+ if (k==(z-1 & MASK) && k!=a && !x[k]) z = k;
+ if (k==a) break;
+ }
+ if (carry) {
+ rp += 9;
+ a = (a-1 & MASK);
+ if (a == z) {
+ z = (z-1 & MASK);
+ x[z-1 & MASK] |= x[z];
+ }
+ x[a] = carry;
+ }
+ }
+
+ /* Downscale until exactly number of bits are left of radix point */
+ for (;;) {
+ uint32_t carry = 0;
+ int sh = 1;
+ for (i=0; i<LD_B1B_DIG; i++) {
+ k = (a+i & MASK);
+ if (k == z || x[k] < th[i]) {
+ i=LD_B1B_DIG;
+ break;
+ }
+ if (x[a+i & MASK] > th[i]) break;
+ }
+ if (i==LD_B1B_DIG && rp==9*LD_B1B_DIG) break;
+ /* FIXME: find a way to compute optimal sh */
+ if (rp > 9+9*LD_B1B_DIG) sh = 9;
+ e2 += sh;
+ for (k=a; k!=z; k=(k+1 & MASK)) {
+ uint32_t tmp = x[k] & (1<<sh)-1;
+ x[k] = (x[k]>>sh) + carry;
+ carry = (1000000000>>sh) * tmp;
+ if (k==a && !x[k]) {
+ a = (a+1 & MASK);
+ i--;
+ rp -= 9;
+ }
+ }
+ if (carry) {
+ if ((z+1 & MASK) != a) {
+ x[z] = carry;
+ z = (z+1 & MASK);
+ } else x[z-1 & MASK] |= 1;
+ }
+ }
+
+ /* Assemble desired bits into floating point variable */
+ for (y=i=0; i<LD_B1B_DIG; i++) {
+ if ((a+i & MASK)==z) x[(z=(z+1 & MASK))-1] = 0;
+#if defined(__wasilibc_printscan_no_long_double)
+ y = 1000000000.0 * y + x[a+i & MASK];
+#else
+ y = 1000000000.0L * y + x[a+i & MASK];
+#endif
+ }
+
+ y *= sign;
+
+ /* Limit precision for denormal results */
+ if (bits > LDBL_MANT_DIG+e2-emin) {
+ bits = LDBL_MANT_DIG+e2-emin;
+ if (bits<0) bits=0;
+ denormal = 1;
+ }
+
+ /* Calculate bias term to force rounding, move out lower bits */
+ if (bits < LDBL_MANT_DIG) {
+ bias = copysignl(scalbn(1, 2*LDBL_MANT_DIG-bits-1), y);
+ frac = fmodl(y, scalbn(1, LDBL_MANT_DIG-bits));
+ y -= frac;
+ y += bias;
+ }
+
+ /* Process tail of decimal input so it can affect rounding */
+ if ((a+i & MASK) != z) {
+ uint32_t t = x[a+i & MASK];
+ if (t < 500000000 && (t || (a+i+1 & MASK) != z))
+ frac += 0.25*sign;
+ else if (t > 500000000)
+ frac += 0.75*sign;
+ else if (t == 500000000) {
+ if ((a+i+1 & MASK) == z)
+ frac += 0.5*sign;
+ else
+ frac += 0.75*sign;
+ }
+ if (LDBL_MANT_DIG-bits >= 2 && !fmodl(frac, 1))
+ frac++;
+ }
+
+ y += frac;
+ y -= bias;
+
+ if ((e2+LDBL_MANT_DIG & INT_MAX) > emax-5) {
+ if (fabsl(y) >= 2/LDBL_EPSILON) {
+ if (denormal && bits==LDBL_MANT_DIG+e2-emin)
+ denormal = 0;
+ y *= 0.5;
+ e2++;
+ }
+ if (e2+LDBL_MANT_DIG>emax || (denormal && frac))
+ errno = ERANGE;
+ }
+
+ return scalbnl(y, e2);
+}
+
+#if defined(__wasilibc_printscan_no_long_double)
+static long_double hexfloat(FILE *f, int bits, int emin, int sign, int pok)
+#else
+static long double hexfloat(FILE *f, int bits, int emin, int sign, int pok)
+#endif
+{
+ uint32_t x = 0;
+#if defined(__wasilibc_printscan_no_long_double)
+ long_double y = 0;
+ long_double scale = 1;
+ long_double bias = 0;
+#else
+ long double y = 0;
+ long double scale = 1;
+ long double bias = 0;
+#endif
+ int gottail = 0, gotrad = 0, gotdig = 0;
+ long long rp = 0;
+ long long dc = 0;
+ long long e2 = 0;
+ int d;
+ int c;
+
+ c = shgetc(f);
+
+ /* Skip leading zeros */
+ for (; c=='0'; c = shgetc(f)) gotdig = 1;
+
+ if (c=='.') {
+ gotrad = 1;
+ c = shgetc(f);
+ /* Count zeros after the radix point before significand */
+ for (rp=0; c=='0'; c = shgetc(f), rp--) gotdig = 1;
+ }
+
+ for (; c-'0'<10U || (c|32)-'a'<6U || c=='.'; c = shgetc(f)) {
+ if (c=='.') {
+ if (gotrad) break;
+ rp = dc;
+ gotrad = 1;
+ } else {
+ gotdig = 1;
+ if (c > '9') d = (c|32)+10-'a';
+ else d = c-'0';
+ if (dc<8) {
+ x = x*16 + d;
+ } else if (dc < LDBL_MANT_DIG/4+1) {
+ y += d*(scale/=16);
+ } else if (d && !gottail) {
+ y += 0.5*scale;
+ gottail = 1;
+ }
+ dc++;
+ }
+ }
+ if (!gotdig) {
+ shunget(f);
+ if (pok) {
+ shunget(f);
+ if (gotrad) shunget(f);
+ } else {
+ shlim(f, 0);
+ }
+ return sign * 0.0;
+ }
+ if (!gotrad) rp = dc;
+ while (dc<8) x *= 16, dc++;
+ if ((c|32)=='p') {
+ e2 = scanexp(f, pok);
+ if (e2 == LLONG_MIN) {
+ if (pok) {
+ shunget(f);
+ } else {
+ shlim(f, 0);
+ return 0;
+ }
+ e2 = 0;
+ }
+ } else {
+ shunget(f);
+ }
+ e2 += 4*rp - 32;
+
+ if (!x) return sign * 0.0;
+ if (e2 > -emin) {
+ errno = ERANGE;
+ return sign * LDBL_MAX * LDBL_MAX;
+ }
+ if (e2 < emin-2*LDBL_MANT_DIG) {
+ errno = ERANGE;
+ return sign * LDBL_MIN * LDBL_MIN;
+ }
+
+ while (x < 0x80000000) {
+ if (y>=0.5) {
+ x += x + 1;
+ y += y - 1;
+ } else {
+ x += x;
+ y += y;
+ }
+ e2--;
+ }
+
+ if (bits > 32+e2-emin) {
+ bits = 32+e2-emin;
+ if (bits<0) bits=0;
+ }
+
+ if (bits < LDBL_MANT_DIG)
+ bias = copysignl(scalbn(1, 32+LDBL_MANT_DIG-bits-1), sign);
+
+ if (bits<32 && y && !(x&1)) x++, y=0;
+
+#if defined(__wasilibc_printscan_no_long_double)
+ y = bias + sign*(long_double)x + sign*y;
+#else
+ y = bias + sign*(long double)x + sign*y;
+#endif
+ y -= bias;
+
+ if (!y) errno = ERANGE;
+
+ return scalbnl(y, e2);
+}
+
+#if defined(__wasilibc_printscan_no_long_double)
+long_double __floatscan(FILE *f, int prec, int pok)
+#else
+long double __floatscan(FILE *f, int prec, int pok)
+#endif
+{
+ int sign = 1;
+ size_t i;
+ int bits;
+ int emin;
+ int c;
+
+ switch (prec) {
+ case 0:
+ bits = FLT_MANT_DIG;
+ emin = FLT_MIN_EXP-bits;
+ break;
+ case 1:
+ bits = DBL_MANT_DIG;
+ emin = DBL_MIN_EXP-bits;
+ break;
+ case 2:
+ bits = LDBL_MANT_DIG;
+ emin = LDBL_MIN_EXP-bits;
+ break;
+ default:
+ return 0;
+ }
+
+ while (isspace((c=shgetc(f))));
+
+ if (c=='+' || c=='-') {
+ sign -= 2*(c=='-');
+ c = shgetc(f);
+ }
+
+ for (i=0; i<8 && (c|32)=="infinity"[i]; i++)
+ if (i<7) c = shgetc(f);
+ if (i==3 || i==8 || (i>3 && pok)) {
+ if (i!=8) {
+ shunget(f);
+ if (pok) for (; i>3; i--) shunget(f);
+ }
+ return sign * INFINITY;
+ }
+ if (!i) for (i=0; i<3 && (c|32)=="nan"[i]; i++)
+ if (i<2) c = shgetc(f);
+ if (i==3) {
+ if (shgetc(f) != '(') {
+ shunget(f);
+ return NAN;
+ }
+ for (i=1; ; i++) {
+ c = shgetc(f);
+ if (c-'0'<10U || c-'A'<26U || c-'a'<26U || c=='_')
+ continue;
+ if (c==')') return NAN;
+ shunget(f);
+ if (!pok) {
+ errno = EINVAL;
+ shlim(f, 0);
+ return 0;
+ }
+ while (i--) shunget(f);
+ return NAN;
+ }
+ return NAN;
+ }
+
+ if (i) {
+ shunget(f);
+ errno = EINVAL;
+ shlim(f, 0);
+ return 0;
+ }
+
+ if (c=='0') {
+ c = shgetc(f);
+ if ((c|32) == 'x')
+ return hexfloat(f, bits, emin, sign, pok);
+ shunget(f);
+ c = '0';
+ }
+
+ return decfloat(f, c, bits, emin, sign, pok);
+}
diff --git a/libc-top-half/musl/src/internal/floatscan.h b/libc-top-half/musl/src/internal/floatscan.h
new file mode 100644
index 0000000..8febd46
--- /dev/null
+++ b/libc-top-half/musl/src/internal/floatscan.h
@@ -0,0 +1,12 @@
+#ifndef FLOATSCAN_H
+#define FLOATSCAN_H
+
+#include <stdio.h>
+
+#if defined(__wasilibc_printscan_no_long_double)
+hidden long_double __floatscan(FILE *, int, int);
+#else
+hidden long double __floatscan(FILE *, int, int);
+#endif
+
+#endif
diff --git a/libc-top-half/musl/src/internal/fork_impl.h b/libc-top-half/musl/src/internal/fork_impl.h
new file mode 100644
index 0000000..f6b3aa0
--- /dev/null
+++ b/libc-top-half/musl/src/internal/fork_impl.h
@@ -0,0 +1,21 @@
+#include <features.h>
+
+#ifdef __wasilibc_unmodified_upstream
+extern hidden volatile int *const __at_quick_exit_lockptr;
+extern hidden volatile int *const __atexit_lockptr;
+extern hidden volatile int *const __dlerror_lockptr;
+extern hidden volatile int *const __gettext_lockptr;
+extern hidden volatile int *const __locale_lockptr;
+extern hidden volatile int *const __random_lockptr;
+extern hidden volatile int *const __sem_open_lockptr;
+extern hidden volatile int *const __stdio_ofl_lockptr;
+extern hidden volatile int *const __syslog_lockptr;
+extern hidden volatile int *const __timezone_lockptr;
+
+extern hidden volatile int *const __bump_lockptr;
+
+extern hidden volatile int *const __vmlock_lockptr;
+
+hidden void __malloc_atfork(int);
+hidden void __ldso_atfork(int);
+#endif
diff --git a/libc-top-half/musl/src/internal/futex.h b/libc-top-half/musl/src/internal/futex.h
new file mode 100644
index 0000000..dafbc24
--- /dev/null
+++ b/libc-top-half/musl/src/internal/futex.h
@@ -0,0 +1,19 @@
+#ifndef _INTERNAL_FUTEX_H
+#define _INTERNAL_FUTEX_H
+
+#define FUTEX_WAIT 0
+#define FUTEX_WAKE 1
+#define FUTEX_FD 2
+#define FUTEX_REQUEUE 3
+#define FUTEX_CMP_REQUEUE 4
+#define FUTEX_WAKE_OP 5
+#define FUTEX_LOCK_PI 6
+#define FUTEX_UNLOCK_PI 7
+#define FUTEX_TRYLOCK_PI 8
+#define FUTEX_WAIT_BITSET 9
+
+#define FUTEX_PRIVATE 128
+
+#define FUTEX_CLOCK_REALTIME 256
+
+#endif
diff --git a/libc-top-half/musl/src/internal/i386/defsysinfo.s b/libc-top-half/musl/src/internal/i386/defsysinfo.s
new file mode 100644
index 0000000..f1b5b0f
--- /dev/null
+++ b/libc-top-half/musl/src/internal/i386/defsysinfo.s
@@ -0,0 +1,9 @@
+1: int $128
+ ret
+
+.data
+.align 4
+.hidden __sysinfo
+.global __sysinfo
+__sysinfo:
+ .long 1b
diff --git a/libc-top-half/musl/src/internal/intscan.c b/libc-top-half/musl/src/internal/intscan.c
new file mode 100644
index 0000000..a4a5ae8
--- /dev/null
+++ b/libc-top-half/musl/src/internal/intscan.c
@@ -0,0 +1,100 @@
+#include <limits.h>
+#include <errno.h>
+#include <ctype.h>
+#include "shgetc.h"
+
+/* Lookup table for digit values. -1==255>=36 -> invalid */
+static const unsigned char table[] = { -1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
+-1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
+25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1,
+-1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
+25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+};
+
+unsigned long long __intscan(FILE *f, unsigned base, int pok, unsigned long long lim)
+{
+ const unsigned char *val = table+1;
+ int c, neg=0;
+ unsigned x;
+ unsigned long long y;
+ if (base > 36 || base == 1) {
+ errno = EINVAL;
+ return 0;
+ }
+ while (isspace((c=shgetc(f))));
+ if (c=='+' || c=='-') {
+ neg = -(c=='-');
+ c = shgetc(f);
+ }
+ if ((base == 0 || base == 16) && c=='0') {
+ c = shgetc(f);
+ if ((c|32)=='x') {
+ c = shgetc(f);
+ if (val[c]>=16) {
+ shunget(f);
+ if (pok) shunget(f);
+ else shlim(f, 0);
+ return 0;
+ }
+ base = 16;
+ } else if (base == 0) {
+ base = 8;
+ }
+ } else {
+ if (base == 0) base = 10;
+ if (val[c] >= base) {
+ shunget(f);
+ shlim(f, 0);
+ errno = EINVAL;
+ return 0;
+ }
+ }
+ if (base == 10) {
+ for (x=0; c-'0'<10U && x<=UINT_MAX/10-1; c=shgetc(f))
+ x = x*10 + (c-'0');
+ for (y=x; c-'0'<10U && y<=ULLONG_MAX/10 && 10*y<=ULLONG_MAX-(c-'0'); c=shgetc(f))
+ y = y*10 + (c-'0');
+ if (c-'0'>=10U) goto done;
+ } else if (!(base & base-1)) {
+ int bs = "\0\1\2\4\7\3\6\5"[(0x17*base)>>5&7];
+ for (x=0; val[c]<base && x<=UINT_MAX/32; c=shgetc(f))
+ x = x<<bs | val[c];
+ for (y=x; val[c]<base && y<=ULLONG_MAX>>bs; c=shgetc(f))
+ y = y<<bs | val[c];
+ } else {
+ for (x=0; val[c]<base && x<=UINT_MAX/36-1; c=shgetc(f))
+ x = x*base + val[c];
+ for (y=x; val[c]<base && y<=ULLONG_MAX/base && base*y<=ULLONG_MAX-val[c]; c=shgetc(f))
+ y = y*base + val[c];
+ }
+ if (val[c]<base) {
+ for (; val[c]<base; c=shgetc(f));
+ errno = ERANGE;
+ y = lim;
+ if (lim&1) neg = 0;
+ }
+done:
+ shunget(f);
+ if (y>=lim) {
+ if (!(lim&1) && !neg) {
+ errno = ERANGE;
+ return lim-1;
+ } else if (y>lim) {
+ errno = ERANGE;
+ return lim;
+ }
+ }
+ return (y^neg)-neg;
+}
diff --git a/libc-top-half/musl/src/internal/intscan.h b/libc-top-half/musl/src/internal/intscan.h
new file mode 100644
index 0000000..ccf9f11
--- /dev/null
+++ b/libc-top-half/musl/src/internal/intscan.h
@@ -0,0 +1,8 @@
+#ifndef INTSCAN_H
+#define INTSCAN_H
+
+#include <stdio.h>
+
+hidden unsigned long long __intscan(FILE *, unsigned, int, unsigned long long);
+
+#endif
diff --git a/libc-top-half/musl/src/internal/ksigaction.h b/libc-top-half/musl/src/internal/ksigaction.h
new file mode 100644
index 0000000..8ebd593
--- /dev/null
+++ b/libc-top-half/musl/src/internal/ksigaction.h
@@ -0,0 +1,13 @@
+#include <features.h>
+
+/* This is the structure used for the rt_sigaction syscall on most archs,
+ * but it can be overridden by a file with the same name in the top-level
+ * arch dir for a given arch, if necessary. */
+struct k_sigaction {
+ void (*handler)(int);
+ unsigned long flags;
+ void (*restorer)(void);
+ unsigned mask[2];
+};
+
+hidden void __restore(), __restore_rt();
diff --git a/libc-top-half/musl/src/internal/libc.c b/libc-top-half/musl/src/internal/libc.c
new file mode 100644
index 0000000..cb05181
--- /dev/null
+++ b/libc-top-half/musl/src/internal/libc.c
@@ -0,0 +1,9 @@
+#include "libc.h"
+
+struct __libc __libc;
+
+size_t __hwcap;
+char *__progname=0, *__progname_full=0;
+
+weak_alias(__progname, program_invocation_short_name);
+weak_alias(__progname_full, program_invocation_name);
diff --git a/libc-top-half/musl/src/internal/libc.h b/libc-top-half/musl/src/internal/libc.h
new file mode 100644
index 0000000..355c3a4
--- /dev/null
+++ b/libc-top-half/musl/src/internal/libc.h
@@ -0,0 +1,76 @@
+#ifndef LIBC_H
+#define LIBC_H
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <limits.h>
+
+struct __locale_map;
+
+struct __locale_struct {
+ const struct __locale_map *cat[6];
+};
+
+struct tls_module {
+ struct tls_module *next;
+ void *image;
+ size_t len, size, align, offset;
+};
+
+struct __libc {
+#ifdef __wasilibc_unmodified_upstream
+ char can_do_threads;
+#endif
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ char threaded;
+#endif
+#ifdef __wasilibc_unmodified_upstream // WASI doesn't currently use any code that needs "secure" mode
+ char secure;
+#endif
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ volatile signed char need_locks;
+ int threads_minus_1;
+#endif
+#ifdef __wasilibc_unmodified_upstream // WASI has no auxv
+ size_t *auxv;
+#endif
+#ifdef __wasilibc_unmodified_upstream // WASI use different TLS implement
+ struct tls_module *tls_head;
+ size_t tls_size, tls_align, tls_cnt;
+#endif
+#ifdef __wasilibc_unmodified_upstream // WASI doesn't get the page size from auxv
+ size_t page_size;
+#endif
+ struct __locale_struct global_locale;
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#else
+ struct __locale_struct *current_locale;
+#endif
+};
+
+#ifndef PAGE_SIZE
+#define PAGE_SIZE libc.page_size
+#endif
+
+extern hidden struct __libc __libc;
+#define libc __libc
+
+hidden void __init_libc(char **, char *);
+hidden void __init_tls(size_t *);
+hidden void __init_ssp(void *);
+hidden void __libc_start_init(void);
+hidden void __funcs_on_exit(void);
+hidden void __funcs_on_quick_exit(void);
+hidden void __libc_exit_fini(void);
+hidden void __fork_handler(int);
+
+extern hidden size_t __hwcap;
+extern hidden size_t __sysinfo;
+extern char *__progname, *__progname_full;
+
+extern hidden const char __libc_version[];
+
+hidden void __synccall(void (*)(void *), void *);
+hidden int __setxid(int, int, int, int);
+
+#endif
diff --git a/libc-top-half/musl/src/internal/libm.h b/libc-top-half/musl/src/internal/libm.h
new file mode 100644
index 0000000..2b06ac4
--- /dev/null
+++ b/libc-top-half/musl/src/internal/libm.h
@@ -0,0 +1,292 @@
+#ifndef _LIBM_H
+#define _LIBM_H
+
+#include <stdint.h>
+#include <float.h>
+#include <math.h>
+#include <endian.h>
+#include "fp_arch.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN
+union ldshape {
+ long double f;
+ struct {
+ uint64_t m;
+ uint16_t se;
+ } i;
+};
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __BIG_ENDIAN
+/* This is the m68k variant of 80-bit long double, and this definition only works
+ * on archs where the alignment requirement of uint64_t is <= 4. */
+union ldshape {
+ long double f;
+ struct {
+ uint16_t se;
+ uint16_t pad;
+ uint64_t m;
+ } i;
+};
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN
+union ldshape {
+ long double f;
+ struct {
+ uint64_t lo;
+ uint32_t mid;
+ uint16_t top;
+ uint16_t se;
+ } i;
+ struct {
+ uint64_t lo;
+ uint64_t hi;
+ } i2;
+};
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __BIG_ENDIAN
+union ldshape {
+ long double f;
+ struct {
+ uint16_t se;
+ uint16_t top;
+ uint32_t mid;
+ uint64_t lo;
+ } i;
+ struct {
+ uint64_t hi;
+ uint64_t lo;
+ } i2;
+};
+#else
+#error Unsupported long double representation
+#endif
+
+/* Support non-nearest rounding mode. */
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+#define WANT_ROUNDING 1
+#else
+#define WANT_ROUNDING 0
+#endif
+/* Support signaling NaNs. */
+#define WANT_SNAN 0
+
+#if WANT_SNAN
+#error SNaN is unsupported
+#else
+#define issignalingf_inline(x) 0
+#define issignaling_inline(x) 0
+#endif
+
+#ifndef TOINT_INTRINSICS
+#define TOINT_INTRINSICS 0
+#endif
+
+#if TOINT_INTRINSICS
+/* Round x to nearest int in all rounding modes, ties have to be rounded
+ consistently with converttoint so the results match. If the result
+ would be outside of [-2^31, 2^31-1] then the semantics is unspecified. */
+static double_t roundtoint(double_t);
+
+/* Convert x to nearest int in all rounding modes, ties have to be rounded
+ consistently with roundtoint. If the result is not representible in an
+ int32_t then the semantics is unspecified. */
+static int32_t converttoint(double_t);
+#endif
+
+/* Helps static branch prediction so hot path can be better optimized. */
+#ifdef __GNUC__
+#define predict_true(x) __builtin_expect(!!(x), 1)
+#define predict_false(x) __builtin_expect(x, 0)
+#else
+#define predict_true(x) (x)
+#define predict_false(x) (x)
+#endif
+
+/* Evaluate an expression as the specified type. With standard excess
+ precision handling a type cast or assignment is enough (with
+ -ffloat-store an assignment is required, in old compilers argument
+ passing and return statement may not drop excess precision). */
+
+static inline float eval_as_float(float x)
+{
+ float y = x;
+ return y;
+}
+
+static inline double eval_as_double(double x)
+{
+ double y = x;
+ return y;
+}
+
+/* fp_barrier returns its input, but limits code transformations
+ as if it had a side-effect (e.g. observable io) and returned
+ an arbitrary value. */
+
+#ifndef fp_barrierf
+#define fp_barrierf fp_barrierf
+static inline float fp_barrierf(float x)
+{
+ volatile float y = x;
+ return y;
+}
+#endif
+
+#ifndef fp_barrier
+#define fp_barrier fp_barrier
+static inline double fp_barrier(double x)
+{
+ volatile double y = x;
+ return y;
+}
+#endif
+
+#ifndef fp_barrierl
+#define fp_barrierl fp_barrierl
+static inline long double fp_barrierl(long double x)
+{
+ volatile long double y = x;
+ return y;
+}
+#endif
+
+/* fp_force_eval ensures that the input value is computed when that's
+ otherwise unused. To prevent the constant folding of the input
+ expression, an additional fp_barrier may be needed or a compilation
+ mode that does so (e.g. -frounding-math in gcc). Then it can be
+ used to evaluate an expression for its fenv side-effects only. */
+
+#ifndef fp_force_evalf
+#define fp_force_evalf fp_force_evalf
+static inline void fp_force_evalf(float x)
+{
+ volatile float y;
+ y = x;
+}
+#endif
+
+#ifndef fp_force_eval
+#define fp_force_eval fp_force_eval
+static inline void fp_force_eval(double x)
+{
+ volatile double y;
+ y = x;
+}
+#endif
+
+#ifndef fp_force_evall
+#define fp_force_evall fp_force_evall
+static inline void fp_force_evall(long double x)
+{
+ volatile long double y;
+ y = x;
+}
+#endif
+
+#ifdef __wasilibc_unmodified_upstream // WASI has no floating-point status flags
+#define FORCE_EVAL(x) do { \
+ if (sizeof(x) == sizeof(float)) { \
+ fp_force_evalf(x); \
+ } else if (sizeof(x) == sizeof(double)) { \
+ fp_force_eval(x); \
+ } else { \
+ fp_force_evall(x); \
+ } \
+} while(0)
+#else
+/* WebAssembly doesn't have floating-point status flags, so there's no reason
+ * to force evaluations. */
+#define FORCE_EVAL(x) ((void)(x))
+#endif
+
+#define asuint(f) ((union{float _f; uint32_t _i;}){f})._i
+#define asfloat(i) ((union{uint32_t _i; float _f;}){i})._f
+#define asuint64(f) ((union{double _f; uint64_t _i;}){f})._i
+#define asdouble(i) ((union{uint64_t _i; double _f;}){i})._f
+
+#define EXTRACT_WORDS(hi,lo,d) \
+do { \
+ uint64_t __u = asuint64(d); \
+ (hi) = __u >> 32; \
+ (lo) = (uint32_t)__u; \
+} while (0)
+
+#define GET_HIGH_WORD(hi,d) \
+do { \
+ (hi) = asuint64(d) >> 32; \
+} while (0)
+
+#define GET_LOW_WORD(lo,d) \
+do { \
+ (lo) = (uint32_t)asuint64(d); \
+} while (0)
+
+#define INSERT_WORDS(d,hi,lo) \
+do { \
+ (d) = asdouble(((uint64_t)(hi)<<32) | (uint32_t)(lo)); \
+} while (0)
+
+#define SET_HIGH_WORD(d,hi) \
+ INSERT_WORDS(d, hi, (uint32_t)asuint64(d))
+
+#define SET_LOW_WORD(d,lo) \
+ INSERT_WORDS(d, asuint64(d)>>32, lo)
+
+#define GET_FLOAT_WORD(w,d) \
+do { \
+ (w) = asuint(d); \
+} while (0)
+
+#define SET_FLOAT_WORD(d,w) \
+do { \
+ (d) = asfloat(w); \
+} while (0)
+
+hidden int __rem_pio2_large(double*,double*,int,int,int);
+
+hidden int __rem_pio2(double,double*);
+hidden double __sin(double,double,int);
+hidden double __cos(double,double);
+hidden double __tan(double,double,int);
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+hidden double __expo2(double,double);
+#else
+hidden double __expo2(double);
+#endif
+
+hidden int __rem_pio2f(float,double*);
+hidden float __sindf(double);
+hidden float __cosdf(double);
+hidden float __tandf(double,int);
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+hidden float __expo2f(float,float);
+#else
+hidden float __expo2f(float);
+#endif
+
+hidden int __rem_pio2l(long double, long double *);
+hidden long double __sinl(long double, long double, int);
+hidden long double __cosl(long double, long double);
+hidden long double __tanl(long double, long double, int);
+
+hidden long double __polevll(long double, const long double *, int);
+hidden long double __p1evll(long double, const long double *, int);
+
+extern int __signgam;
+hidden double __lgamma_r(double, int *);
+hidden float __lgammaf_r(float, int *);
+
+/* error handling functions */
+hidden float __math_xflowf(uint32_t, float);
+hidden float __math_uflowf(uint32_t);
+hidden float __math_oflowf(uint32_t);
+hidden float __math_divzerof(uint32_t);
+hidden float __math_invalidf(float);
+hidden double __math_xflow(uint32_t, double);
+hidden double __math_uflow(uint32_t);
+hidden double __math_oflow(uint32_t);
+hidden double __math_divzero(uint32_t);
+hidden double __math_invalid(double);
+#if LDBL_MANT_DIG != DBL_MANT_DIG
+hidden long double __math_invalidl(long double);
+#endif
+
+#endif
diff --git a/libc-top-half/musl/src/internal/locale_impl.h b/libc-top-half/musl/src/internal/locale_impl.h
new file mode 100644
index 0000000..7f79b7f
--- /dev/null
+++ b/libc-top-half/musl/src/internal/locale_impl.h
@@ -0,0 +1,65 @@
+#ifndef _LOCALE_IMPL_H
+#define _LOCALE_IMPL_H
+
+#include <locale.h>
+#include <stdlib.h>
+#include "libc.h"
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#include "pthread_impl.h"
+#endif
+
+#define LOCALE_NAME_MAX 23
+
+struct __locale_map {
+ const void *map;
+ size_t map_size;
+ char name[LOCALE_NAME_MAX+1];
+ const struct __locale_map *next;
+};
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+extern hidden volatile int __locale_lock[1];
+#endif
+
+extern hidden const struct __locale_map __c_dot_utf8;
+extern hidden const struct __locale_struct __c_locale;
+extern hidden const struct __locale_struct __c_dot_utf8_locale;
+
+hidden const struct __locale_map *__get_locale(int, const char *);
+hidden const char *__mo_lookup(const void *, size_t, const char *);
+hidden const char *__lctrans(const char *, const struct __locale_map *);
+hidden const char *__lctrans_cur(const char *);
+hidden const char *__lctrans_impl(const char *, const struct __locale_map *);
+hidden int __loc_is_allocated(locale_t);
+hidden char *__gettextdomain(void);
+
+#define LOC_MAP_FAILED ((const struct __locale_map *)-1)
+
+#define LCTRANS(msg, lc, loc) __lctrans(msg, (loc)->cat[(lc)])
+#define LCTRANS_CUR(msg) __lctrans_cur(msg)
+
+#define C_LOCALE ((locale_t)&__c_locale)
+#define UTF8_LOCALE ((locale_t)&__c_dot_utf8_locale)
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#define CURRENT_LOCALE (__pthread_self()->locale)
+
+#define CURRENT_UTF8 (!!__pthread_self()->locale->cat[LC_CTYPE])
+#else
+// If we haven't set up the current_local field yet, do so. Then return an
+// lvalue for the current_locale field.
+#define CURRENT_LOCALE \
+ (*({ \
+ if (!libc.current_locale) { \
+ libc.current_locale = &libc.global_locale; \
+ } \
+ &libc.current_locale; \
+ }))
+
+#define CURRENT_UTF8 (!!libc.global_locale.cat[LC_CTYPE])
+#endif
+
+#undef MB_CUR_MAX
+#define MB_CUR_MAX (CURRENT_UTF8 ? 4 : 1)
+
+#endif
diff --git a/libc-top-half/musl/src/internal/lock.h b/libc-top-half/musl/src/internal/lock.h
new file mode 100644
index 0000000..29787fb
--- /dev/null
+++ b/libc-top-half/musl/src/internal/lock.h
@@ -0,0 +1,15 @@
+#ifndef LOCK_H
+#define LOCK_H
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+hidden void __lock(volatile int *);
+hidden void __unlock(volatile int *);
+#define LOCK(x) __lock(x)
+#define UNLOCK(x) __unlock(x)
+#else
+// No locking needed.
+#define LOCK(x) ((void)0)
+#define UNLOCK(x) ((void)0)
+#endif
+
+#endif
diff --git a/libc-top-half/musl/src/internal/procfdname.c b/libc-top-half/musl/src/internal/procfdname.c
new file mode 100644
index 0000000..fd7306a
--- /dev/null
+++ b/libc-top-half/musl/src/internal/procfdname.c
@@ -0,0 +1,15 @@
+#include "syscall.h"
+
+void __procfdname(char *buf, unsigned fd)
+{
+ unsigned i, j;
+ for (i=0; (buf[i] = "/proc/self/fd/"[i]); i++);
+ if (!fd) {
+ buf[i] = '0';
+ buf[i+1] = 0;
+ return;
+ }
+ for (j=fd; j; j/=10, i++);
+ buf[i] = 0;
+ for (; fd; fd/=10) buf[--i] = '0' + fd%10;
+}
diff --git a/libc-top-half/musl/src/internal/pthread_impl.h b/libc-top-half/musl/src/internal/pthread_impl.h
new file mode 100644
index 0000000..a6d188b
--- /dev/null
+++ b/libc-top-half/musl/src/internal/pthread_impl.h
@@ -0,0 +1,226 @@
+#ifndef _PTHREAD_IMPL_H
+#define _PTHREAD_IMPL_H
+
+#include <pthread.h>
+#ifdef __wasilibc_unmodified_upstream
+#include <signal.h>
+#endif
+#include <errno.h>
+#include <limits.h>
+#ifdef __wasilibc_unmodified_upstream
+#include <sys/mman.h>
+#endif
+#include "libc.h"
+#ifdef __wasilibc_unmodified_upstream
+#include "syscall.h"
+#endif
+#include "atomic.h"
+#include "futex.h"
+
+#include "pthread_arch.h"
+
+#define pthread __pthread
+
+struct pthread {
+ /* Part 1 -- these fields may be external or
+ * internal (accessed via asm) ABI. Do not change. */
+ struct pthread *self;
+#ifdef __wasilibc_unmodified_upstream
+#ifndef TLS_ABOVE_TP
+ uintptr_t *dtv;
+#endif
+#endif
+ struct pthread *prev, *next; /* non-ABI */
+ uintptr_t sysinfo;
+#ifndef TLS_ABOVE_TP
+#ifdef CANARY_PAD
+ uintptr_t canary_pad;
+#endif
+ uintptr_t canary;
+#endif
+
+ /* Part 2 -- implementation details, non-ABI. */
+ int tid;
+ int errno_val;
+ volatile int detach_state;
+ volatile int cancel;
+ volatile unsigned char canceldisable, cancelasync;
+ unsigned char tsd_used:1;
+ unsigned char dlerror_flag:1;
+ unsigned char *map_base;
+ size_t map_size;
+ void *stack;
+ size_t stack_size;
+ size_t guard_size;
+ void *result;
+ struct __ptcb *cancelbuf;
+ void **tsd;
+ struct {
+ volatile void *volatile head;
+ long off;
+ volatile void *volatile pending;
+ } robust_list;
+ int h_errno_val;
+ volatile int timer_id;
+ locale_t locale;
+ volatile int killlock[1];
+ char *dlerror_buf;
+ void *stdio_locks;
+
+ /* Part 3 -- the positions of these fields relative to
+ * the end of the structure is external and internal ABI. */
+#ifdef TLS_ABOVE_TP
+ uintptr_t canary;
+ uintptr_t *dtv;
+#endif
+};
+
+enum {
+ DT_EXITED = 0,
+ DT_EXITING,
+ DT_JOINABLE,
+ DT_DETACHED,
+};
+
+#define __SU (sizeof(size_t)/sizeof(int))
+
+#define _a_stacksize __u.__s[0]
+#define _a_guardsize __u.__s[1]
+#define _a_stackaddr __u.__s[2]
+#define _a_detach __u.__i[3*__SU+0]
+#define _a_sched __u.__i[3*__SU+1]
+#define _a_policy __u.__i[3*__SU+2]
+#define _a_prio __u.__i[3*__SU+3]
+#define _m_type __u.__i[0]
+#define _m_lock __u.__vi[1]
+#define _m_waiters __u.__vi[2]
+#define _m_prev __u.__p[3]
+#define _m_next __u.__p[4]
+#define _m_count __u.__i[5]
+#define _c_shared __u.__p[0]
+#define _c_seq __u.__vi[2]
+#define _c_waiters __u.__vi[3]
+#define _c_clock __u.__i[4]
+#define _c_lock __u.__vi[8]
+#define _c_head __u.__p[1]
+#define _c_tail __u.__p[5]
+#define _rw_lock __u.__vi[0]
+#define _rw_waiters __u.__vi[1]
+#define _rw_shared __u.__i[2]
+#define _b_lock __u.__vi[0]
+#define _b_waiters __u.__vi[1]
+#define _b_limit __u.__i[2]
+#define _b_count __u.__vi[3]
+#define _b_waiters2 __u.__vi[4]
+#define _b_inst __u.__p[3]
+
+#ifndef TP_OFFSET
+#define TP_OFFSET 0
+#endif
+
+#ifndef DTP_OFFSET
+#define DTP_OFFSET 0
+#endif
+
+#ifdef TLS_ABOVE_TP
+#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + TP_OFFSET)
+#define __pthread_self() ((pthread_t)(__get_tp() - sizeof(struct __pthread) - TP_OFFSET))
+#else
+#define TP_ADJ(p) (p)
+#define __pthread_self() ((pthread_t)__get_tp())
+#endif
+
+#ifndef tls_mod_off_t
+#define tls_mod_off_t size_t
+#endif
+
+#define SIGTIMER 32
+#define SIGCANCEL 33
+#define SIGSYNCCALL 34
+
+#define SIGALL_SET ((sigset_t *)(const unsigned long long [2]){ -1,-1 })
+#define SIGPT_SET \
+ ((sigset_t *)(const unsigned long [_NSIG/8/sizeof(long)]){ \
+ [sizeof(long)==4] = 3UL<<(32*(sizeof(long)>4)) })
+#define SIGTIMER_SET \
+ ((sigset_t *)(const unsigned long [_NSIG/8/sizeof(long)]){ \
+ 0x80000000 })
+
+void *__tls_get_addr(tls_mod_off_t *);
+hidden int __init_tp(void *);
+hidden void *__copy_tls(unsigned char *);
+hidden void __reset_tls();
+
+hidden void __membarrier_init(void);
+hidden void __dl_thread_cleanup(void);
+hidden void __testcancel();
+hidden void __do_cleanup_push(struct __ptcb *);
+hidden void __do_cleanup_pop(struct __ptcb *);
+hidden void __pthread_tsd_run_dtors();
+
+hidden void __pthread_key_delete_synccall(void (*)(void *), void *);
+hidden int __pthread_key_delete_impl(pthread_key_t);
+
+extern hidden volatile size_t __pthread_tsd_size;
+extern hidden void *__pthread_tsd_main[];
+extern hidden volatile int __eintr_valid_flag;
+
+hidden int __clone(int (*)(void *), void *, int, void *, ...);
+hidden int __set_thread_area(void *);
+#ifdef __wasilibc_unmodified_upstream /* WASI has no sigaction */
+hidden int __libc_sigaction(int, const struct sigaction *, struct sigaction *);
+#endif
+hidden void __unmapself(void *, size_t);
+
+#ifndef __wasilibc_unmodified_upstream
+hidden int __wasilibc_futex_wait(volatile void *, int, int, int64_t);
+#endif
+hidden int __timedwait(volatile int *, int, clockid_t, const struct timespec *, int);
+hidden int __timedwait_cp(volatile int *, int, clockid_t, const struct timespec *, int);
+hidden void __wait(volatile int *, volatile int *, int, int);
+static inline void __wake(volatile void *addr, int cnt, int priv)
+{
+ if (priv) priv = FUTEX_PRIVATE;
+ if (cnt<0) cnt = INT_MAX;
+#ifdef __wasilibc_unmodified_upstream
+ __syscall(SYS_futex, addr, FUTEX_WAKE|priv, cnt) != -ENOSYS ||
+ __syscall(SYS_futex, addr, FUTEX_WAKE, cnt);
+#else
+ __builtin_wasm_memory_atomic_notify((int*)addr, cnt);
+#endif
+}
+static inline void __futexwait(volatile void *addr, int val, int priv)
+{
+#ifdef __wasilibc_unmodified_upstream
+ if (priv) priv = FUTEX_PRIVATE;
+ __syscall(SYS_futex, addr, FUTEX_WAIT|priv, val, 0) != -ENOSYS ||
+ __syscall(SYS_futex, addr, FUTEX_WAIT, val, 0);
+#else
+ __wait(addr, NULL, val, priv);
+#endif
+}
+
+hidden void __acquire_ptc(void);
+hidden void __release_ptc(void);
+hidden void __inhibit_ptc(void);
+
+hidden void __tl_lock(void);
+hidden void __tl_unlock(void);
+hidden void __tl_sync(pthread_t);
+
+extern hidden volatile int __thread_list_lock;
+
+extern hidden volatile int __abort_lock[1];
+
+extern hidden unsigned __default_stacksize;
+extern hidden unsigned __default_guardsize;
+
+#define DEFAULT_STACK_SIZE 131072
+#define DEFAULT_GUARD_SIZE 8192
+
+#define DEFAULT_STACK_MAX (8<<20)
+#define DEFAULT_GUARD_MAX (1<<20)
+
+#define __ATTRP_C11_THREAD ((void*)(uintptr_t)-1)
+
+#endif
diff --git a/libc-top-half/musl/src/internal/sh/__shcall.c b/libc-top-half/musl/src/internal/sh/__shcall.c
new file mode 100644
index 0000000..4e073e8
--- /dev/null
+++ b/libc-top-half/musl/src/internal/sh/__shcall.c
@@ -0,0 +1,6 @@
+#include <features.h>
+
+hidden int __shcall(void *arg, int (*func)(void *))
+{
+ return func(arg);
+}
diff --git a/libc-top-half/musl/src/internal/shgetc.c b/libc-top-half/musl/src/internal/shgetc.c
new file mode 100644
index 0000000..7455d2f
--- /dev/null
+++ b/libc-top-half/musl/src/internal/shgetc.c
@@ -0,0 +1,37 @@
+#include "shgetc.h"
+
+/* The shcnt field stores the number of bytes read so far, offset by
+ * the value of buf-rpos at the last function call (__shlim or __shgetc),
+ * so that between calls the inline shcnt macro can add rpos-buf to get
+ * the actual count. */
+
+void __shlim(FILE *f, off_t lim)
+{
+ f->shlim = lim;
+ f->shcnt = f->buf - f->rpos;
+ /* If lim is nonzero, rend must be a valid pointer. */
+ if (lim && f->rend - f->rpos > lim)
+ f->shend = f->rpos + lim;
+ else
+ f->shend = f->rend;
+}
+
+int __shgetc(FILE *f)
+{
+ int c;
+ off_t cnt = shcnt(f);
+ if (f->shlim && cnt >= f->shlim || (c=__uflow(f)) < 0) {
+ f->shcnt = f->buf - f->rpos + cnt;
+ f->shend = f->rpos;
+ f->shlim = -1;
+ return EOF;
+ }
+ cnt++;
+ if (f->shlim && f->rend - f->rpos > f->shlim - cnt)
+ f->shend = f->rpos + (f->shlim - cnt);
+ else
+ f->shend = f->rend;
+ f->shcnt = f->buf - f->rpos + cnt;
+ if (f->rpos <= f->buf) f->rpos[-1] = c;
+ return c;
+}
diff --git a/libc-top-half/musl/src/internal/shgetc.h b/libc-top-half/musl/src/internal/shgetc.h
new file mode 100644
index 0000000..9435381
--- /dev/null
+++ b/libc-top-half/musl/src/internal/shgetc.h
@@ -0,0 +1,32 @@
+#include "stdio_impl.h"
+
+/* Scan helper "stdio" functions for use by scanf-family and strto*-family
+ * functions. These accept either a valid stdio FILE, or a minimal pseudo
+ * FILE whose buffer pointers point into a null-terminated string. In the
+ * latter case, the sh_fromstring macro should be used to setup the FILE;
+ * the rest of the structure can be left uninitialized.
+ *
+ * To begin using these functions, shlim must first be called on the FILE
+ * to set a field width limit, or 0 for no limit. For string pseudo-FILEs,
+ * a nonzero limit is not valid and produces undefined behavior. After that,
+ * shgetc, shunget, and shcnt are valid as long as no other stdio functions
+ * are called on the stream.
+ *
+ * When used with a real FILE object, shunget has only one byte of pushback
+ * available. Further shunget (up to a limit of the stdio UNGET buffer size)
+ * will adjust the position but will not restore the data to be read again.
+ * This functionality is needed for the wcsto*-family functions, where it's
+ * okay because the FILE will be discarded immediately anyway. When used
+ * with string pseudo-FILEs, shunget has unlimited pushback, back to the
+ * beginning of the string. */
+
+hidden void __shlim(FILE *, off_t);
+hidden int __shgetc(FILE *);
+
+#define shcnt(f) ((f)->shcnt + ((f)->rpos - (f)->buf))
+#define shlim(f, lim) __shlim((f), (lim))
+#define shgetc(f) (((f)->rpos != (f)->shend) ? *(f)->rpos++ : __shgetc(f))
+#define shunget(f) ((f)->shlim>=0 ? (void)(f)->rpos-- : (void)0)
+
+#define sh_fromstring(f, s) \
+ ((f)->buf = (f)->rpos = (void *)(s), (f)->rend = (void*)-1)
diff --git a/libc-top-half/musl/src/internal/stdio_impl.h b/libc-top-half/musl/src/internal/stdio_impl.h
new file mode 100644
index 0000000..7f19dd9
--- /dev/null
+++ b/libc-top-half/musl/src/internal/stdio_impl.h
@@ -0,0 +1,137 @@
+#ifndef _STDIO_IMPL_H
+#define _STDIO_IMPL_H
+
+#include <stdio.h>
+#if defined(__wasilibc_unmodified_upstream)
+#include "syscall.h"
+#endif
+
+#define UNGET 8
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#define FFINALLOCK(f) ((f)->lock>=0 ? __lockfile((f)) : 0)
+#define FLOCK(f) int __need_unlock = ((f)->lock>=0 ? __lockfile((f)) : 0)
+#define FUNLOCK(f) do { if (__need_unlock) __unlockfile((f)); } while (0)
+#else
+// No locking needed.
+#define FFINALLOCK(f) ((void)(f))
+#define FLOCK(f) ((void)(f))
+#define FUNLOCK(f) ((void)(f))
+#endif
+
+#define F_PERM 1
+#define F_NORD 4
+#define F_NOWR 8
+#define F_EOF 16
+#define F_ERR 32
+#define F_SVB 64
+#define F_APP 128
+
+struct _IO_FILE {
+ unsigned flags;
+ unsigned char *rpos, *rend;
+ int (*close)(FILE *);
+ unsigned char *wend, *wpos;
+#ifdef __wasilibc_unmodified_upstream // WASI doesn't need backwards-compatibility fields.
+ unsigned char *mustbezero_1;
+#endif
+ unsigned char *wbase;
+ size_t (*read)(FILE *, unsigned char *, size_t);
+ size_t (*write)(FILE *, const unsigned char *, size_t);
+ off_t (*seek)(FILE *, off_t, int);
+ unsigned char *buf;
+ size_t buf_size;
+ FILE *prev, *next;
+ int fd;
+#ifdef __wasilibc_unmodified_upstream // WASI has no popen
+ int pipe_pid;
+#endif
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ long lockcount;
+#endif
+ int mode;
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ volatile int lock;
+#endif
+ int lbf;
+ void *cookie;
+ off_t off;
+ char *getln_buf;
+#ifdef __wasilibc_unmodified_upstream // WASI doesn't need backwards-compatibility fields.
+ void *mustbezero_2;
+#endif
+ unsigned char *shend;
+ off_t shlim, shcnt;
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ FILE *prev_locked, *next_locked;
+#endif
+ struct __locale_struct *locale;
+};
+
+extern hidden FILE *volatile __stdin_used;
+extern hidden FILE *volatile __stdout_used;
+extern hidden FILE *volatile __stderr_used;
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+hidden int __lockfile(FILE *);
+hidden void __unlockfile(FILE *);
+#endif
+
+hidden size_t __stdio_read(FILE *, unsigned char *, size_t);
+hidden size_t __stdio_write(FILE *, const unsigned char *, size_t);
+hidden size_t __stdout_write(FILE *, const unsigned char *, size_t);
+hidden off_t __stdio_seek(FILE *, off_t, int);
+hidden int __stdio_close(FILE *);
+
+hidden int __toread(FILE *);
+hidden int __towrite(FILE *);
+
+hidden void __stdio_exit(void);
+hidden void __stdio_exit_needed(void);
+
+#ifdef __wasilibc_unmodified_upstream // wasm has no "protected" visibility
+#if defined(__PIC__) && (100*__GNUC__+__GNUC_MINOR__ >= 303)
+__attribute__((visibility("protected")))
+#endif
+#endif
+int __overflow(FILE *, int), __uflow(FILE *);
+
+hidden int __fseeko(FILE *, off_t, int);
+hidden int __fseeko_unlocked(FILE *, off_t, int);
+hidden off_t __ftello(FILE *);
+hidden off_t __ftello_unlocked(FILE *);
+hidden size_t __fwritex(const unsigned char *, size_t, FILE *);
+hidden int __putc_unlocked(int, FILE *);
+
+hidden FILE *__fdopen(int, const char *);
+hidden int __fmodeflags(const char *);
+
+hidden FILE *__ofl_add(FILE *f);
+hidden FILE **__ofl_lock(void);
+hidden void __ofl_unlock(void);
+
+struct __pthread;
+hidden void __register_locked_file(FILE *, struct __pthread *);
+hidden void __unlist_locked_file(FILE *);
+hidden void __do_orphaned_stdio_locks(void);
+
+#define MAYBE_WAITERS 0x40000000
+
+hidden void __getopt_msg(const char *, const char *, const char *, size_t);
+
+#define feof(f) ((f)->flags & F_EOF)
+#define ferror(f) ((f)->flags & F_ERR)
+
+#define getc_unlocked(f) \
+ ( ((f)->rpos != (f)->rend) ? *(f)->rpos++ : __uflow((f)) )
+
+#define putc_unlocked(c, f) \
+ ( (((unsigned char)(c)!=(f)->lbf && (f)->wpos!=(f)->wend)) \
+ ? *(f)->wpos++ = (unsigned char)(c) \
+ : __overflow((f),(unsigned char)(c)) )
+
+/* Caller-allocated FILE * operations */
+hidden FILE *__fopen_rb_ca(const char *, FILE *, unsigned char *, size_t);
+hidden int __fclose_ca(FILE *);
+
+#endif
diff --git a/libc-top-half/musl/src/internal/syscall.h b/libc-top-half/musl/src/internal/syscall.h
new file mode 100644
index 0000000..32e0e8a
--- /dev/null
+++ b/libc-top-half/musl/src/internal/syscall.h
@@ -0,0 +1,400 @@
+#ifdef __wasilibc_unmodified_upstream
+#ifndef _INTERNAL_SYSCALL_H
+#define _INTERNAL_SYSCALL_H
+
+#include <features.h>
+#include <errno.h>
+#include <sys/syscall.h>
+#include "syscall_arch.h"
+
+#ifndef SYSCALL_RLIM_INFINITY
+#define SYSCALL_RLIM_INFINITY (~0ULL)
+#endif
+
+#ifndef SYSCALL_MMAP2_UNIT
+#define SYSCALL_MMAP2_UNIT 4096ULL
+#endif
+
+#ifndef __SYSCALL_LL_PRW
+#define __SYSCALL_LL_PRW(x) __SYSCALL_LL_O(x)
+#endif
+
+#ifndef __scc
+#define __scc(X) ((long) (X))
+typedef long syscall_arg_t;
+#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);
+
+#define __syscall1(n,a) __syscall1(n,__scc(a))
+#define __syscall2(n,a,b) __syscall2(n,__scc(a),__scc(b))
+#define __syscall3(n,a,b,c) __syscall3(n,__scc(a),__scc(b),__scc(c))
+#define __syscall4(n,a,b,c,d) __syscall4(n,__scc(a),__scc(b),__scc(c),__scc(d))
+#define __syscall5(n,a,b,c,d,e) __syscall5(n,__scc(a),__scc(b),__scc(c),__scc(d),__scc(e))
+#define __syscall6(n,a,b,c,d,e,f) __syscall6(n,__scc(a),__scc(b),__scc(c),__scc(d),__scc(e),__scc(f))
+#define __syscall7(n,a,b,c,d,e,f,g) __syscall7(n,__scc(a),__scc(b),__scc(c),__scc(d),__scc(e),__scc(f),__scc(g))
+
+#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n
+#define __SYSCALL_NARGS(...) __SYSCALL_NARGS_X(__VA_ARGS__,7,6,5,4,3,2,1,0,)
+#define __SYSCALL_CONCAT_X(a,b) a##b
+#define __SYSCALL_CONCAT(a,b) __SYSCALL_CONCAT_X(a,b)
+#define __SYSCALL_DISP(b,...) __SYSCALL_CONCAT(b,__SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__)
+
+#define __syscall(...) __SYSCALL_DISP(__syscall,__VA_ARGS__)
+#define syscall(...) __syscall_ret(__syscall(__VA_ARGS__))
+
+#define socketcall(nm,a,b,c,d,e,f) __syscall_ret(__socketcall(nm,a,b,c,d,e,f))
+#define socketcall_cp(nm,a,b,c,d,e,f) __syscall_ret(__socketcall_cp(nm,a,b,c,d,e,f))
+
+#define __syscall_cp0(n) (__syscall_cp)(n,0,0,0,0,0,0)
+#define __syscall_cp1(n,a) (__syscall_cp)(n,__scc(a),0,0,0,0,0)
+#define __syscall_cp2(n,a,b) (__syscall_cp)(n,__scc(a),__scc(b),0,0,0,0)
+#define __syscall_cp3(n,a,b,c) (__syscall_cp)(n,__scc(a),__scc(b),__scc(c),0,0,0)
+#define __syscall_cp4(n,a,b,c,d) (__syscall_cp)(n,__scc(a),__scc(b),__scc(c),__scc(d),0,0)
+#define __syscall_cp5(n,a,b,c,d,e) (__syscall_cp)(n,__scc(a),__scc(b),__scc(c),__scc(d),__scc(e),0)
+#define __syscall_cp6(n,a,b,c,d,e,f) (__syscall_cp)(n,__scc(a),__scc(b),__scc(c),__scc(d),__scc(e),__scc(f))
+
+#define __syscall_cp(...) __SYSCALL_DISP(__syscall_cp,__VA_ARGS__)
+#define syscall_cp(...) __syscall_ret(__syscall_cp(__VA_ARGS__))
+
+static inline long __alt_socketcall(int sys, int sock, int cp, long a, long b, long c, long d, long e, long f)
+{
+ long r;
+ if (cp) r = __syscall_cp(sys, a, b, c, d, e, f);
+ else r = __syscall(sys, a, b, c, d, e, f);
+ if (r != -ENOSYS) return r;
+#ifdef SYS_socketcall
+ if (cp) r = __syscall_cp(SYS_socketcall, sock, ((long[6]){a, b, c, d, e, f}));
+ else r = __syscall(SYS_socketcall, sock, ((long[6]){a, b, c, d, e, f}));
+#endif
+ return r;
+}
+#define __socketcall(nm, a, b, c, d, e, f) __alt_socketcall(SYS_##nm, __SC_##nm, 0, \
+ (long)(a), (long)(b), (long)(c), (long)(d), (long)(e), (long)(f))
+#define __socketcall_cp(nm, a, b, c, d, e, f) __alt_socketcall(SYS_##nm, __SC_##nm, 1, \
+ (long)(a), (long)(b), (long)(c), (long)(d), (long)(e), (long)(f))
+
+/* fixup legacy 16-bit junk */
+
+#ifdef SYS_getuid32
+#undef SYS_lchown
+#undef SYS_getuid
+#undef SYS_getgid
+#undef SYS_geteuid
+#undef SYS_getegid
+#undef SYS_setreuid
+#undef SYS_setregid
+#undef SYS_getgroups
+#undef SYS_setgroups
+#undef SYS_fchown
+#undef SYS_setresuid
+#undef SYS_getresuid
+#undef SYS_setresgid
+#undef SYS_getresgid
+#undef SYS_chown
+#undef SYS_setuid
+#undef SYS_setgid
+#undef SYS_setfsuid
+#undef SYS_setfsgid
+#define SYS_lchown SYS_lchown32
+#define SYS_getuid SYS_getuid32
+#define SYS_getgid SYS_getgid32
+#define SYS_geteuid SYS_geteuid32
+#define SYS_getegid SYS_getegid32
+#define SYS_setreuid SYS_setreuid32
+#define SYS_setregid SYS_setregid32
+#define SYS_getgroups SYS_getgroups32
+#define SYS_setgroups SYS_setgroups32
+#define SYS_fchown SYS_fchown32
+#define SYS_setresuid SYS_setresuid32
+#define SYS_getresuid SYS_getresuid32
+#define SYS_setresgid SYS_setresgid32
+#define SYS_getresgid SYS_getresgid32
+#define SYS_chown SYS_chown32
+#define SYS_setuid SYS_setuid32
+#define SYS_setgid SYS_setgid32
+#define SYS_setfsuid SYS_setfsuid32
+#define SYS_setfsgid SYS_setfsgid32
+#endif
+
+
+/* fixup legacy 32-bit-vs-lfs64 junk */
+
+#ifdef SYS_fcntl64
+#undef SYS_fcntl
+#define SYS_fcntl SYS_fcntl64
+#endif
+
+#ifdef SYS_getdents64
+#undef SYS_getdents
+#define SYS_getdents SYS_getdents64
+#endif
+
+#ifdef SYS_ftruncate64
+#undef SYS_ftruncate
+#undef SYS_truncate
+#define SYS_ftruncate SYS_ftruncate64
+#define SYS_truncate SYS_truncate64
+#endif
+
+#ifdef SYS_stat64
+#undef SYS_stat
+#define SYS_stat SYS_stat64
+#endif
+
+#ifdef SYS_fstat64
+#undef SYS_fstat
+#define SYS_fstat SYS_fstat64
+#endif
+
+#ifdef SYS_lstat64
+#undef SYS_lstat
+#define SYS_lstat SYS_lstat64
+#endif
+
+#ifdef SYS_statfs64
+#undef SYS_statfs
+#define SYS_statfs SYS_statfs64
+#endif
+
+#ifdef SYS_fstatfs64
+#undef SYS_fstatfs
+#define SYS_fstatfs SYS_fstatfs64
+#endif
+
+#if defined(SYS_newfstatat)
+#undef SYS_fstatat
+#define SYS_fstatat SYS_newfstatat
+#elif defined(SYS_fstatat64)
+#undef SYS_fstatat
+#define SYS_fstatat SYS_fstatat64
+#endif
+
+#ifdef SYS_ugetrlimit
+#undef SYS_getrlimit
+#define SYS_getrlimit SYS_ugetrlimit
+#endif
+
+#ifdef SYS__newselect
+#undef SYS_select
+#define SYS_select SYS__newselect
+#endif
+
+#ifdef SYS_pread64
+#undef SYS_pread
+#undef SYS_pwrite
+#define SYS_pread SYS_pread64
+#define SYS_pwrite SYS_pwrite64
+#endif
+
+#ifdef SYS_fadvise64_64
+#undef SYS_fadvise
+#define SYS_fadvise SYS_fadvise64_64
+#elif defined(SYS_fadvise64)
+#undef SYS_fadvise
+#define SYS_fadvise SYS_fadvise64
+#endif
+
+#ifdef SYS_sendfile64
+#undef SYS_sendfile
+#define SYS_sendfile SYS_sendfile64
+#endif
+
+#ifndef SYS_timer_settime
+#define SYS_timer_settime SYS_timer_settime32
+#endif
+
+#ifndef SYS_timer_gettime
+#define SYS_timer_gettime SYS_timer_gettime32
+#endif
+
+#ifndef SYS_timerfd_settime
+#define SYS_timerfd_settime SYS_timerfd_settime32
+#endif
+
+#ifndef SYS_timerfd_gettime
+#define SYS_timerfd_gettime SYS_timerfd_gettime32
+#endif
+
+#ifndef SYS_clock_settime
+#define SYS_clock_settime SYS_clock_settime32
+#endif
+
+#ifndef SYS_clock_gettime
+#define SYS_clock_gettime SYS_clock_gettime32
+#endif
+
+#ifndef SYS_clock_getres
+#define SYS_clock_getres SYS_clock_getres_time32
+#endif
+
+#ifndef SYS_clock_nanosleep
+#define SYS_clock_nanosleep SYS_clock_nanosleep_time32
+#endif
+
+#ifndef SYS_gettimeofday
+#define SYS_gettimeofday SYS_gettimeofday_time32
+#endif
+
+#ifndef SYS_settimeofday
+#define SYS_settimeofday SYS_settimeofday_time32
+#endif
+
+/* Ensure that the plain syscall names are defined even for "time64-only"
+ * archs. These facilitate callers passing null time arguments, and make
+ * tests for establishing which to use/fallback-to more consistent when
+ * they do need to be called with time arguments. */
+
+#ifndef SYS_clock_gettime
+#define SYS_clock_gettime SYS_clock_gettime64
+#endif
+
+#ifndef SYS_clock_settime
+#define SYS_clock_settime SYS_clock_settime64
+#endif
+
+#ifndef SYS_clock_adjtime
+#define SYS_clock_adjtime SYS_clock_adjtime64
+#endif
+
+#ifndef SYS_clock_getres
+#define SYS_clock_getres SYS_clock_getres_time64
+#endif
+
+#ifndef SYS_clock_nanosleep
+#define SYS_clock_nanosleep SYS_clock_nanosleep_time64
+#endif
+
+#ifndef SYS_timer_gettime
+#define SYS_timer_gettime SYS_timer_gettime64
+#endif
+
+#ifndef SYS_timer_settime
+#define SYS_timer_settime SYS_timer_settime64
+#endif
+
+#ifndef SYS_timerfd_gettime
+#define SYS_timerfd_gettime SYS_timerfd_gettime64
+#endif
+
+#ifndef SYS_timerfd_settime
+#define SYS_timerfd_settime SYS_timerfd_settime64
+#endif
+
+#ifndef SYS_utimensat
+#define SYS_utimensat SYS_utimensat_time64
+#endif
+
+#ifndef SYS_pselect6
+#define SYS_pselect6 SYS_pselect6_time64
+#endif
+
+#ifndef SYS_ppoll
+#define SYS_ppoll SYS_ppoll_time64
+#endif
+
+#ifndef SYS_recvmmsg
+#define SYS_recvmmsg SYS_recvmmsg_time64
+#endif
+
+#ifndef SYS_mq_timedsend
+#define SYS_mq_timedsend SYS_mq_timedsend_time64
+#endif
+
+#ifndef SYS_mq_timedreceive
+#define SYS_mq_timedreceive SYS_mq_timedreceive_time64
+#endif
+
+/* SYS_semtimedop omitted because SYS_ipc may provide it */
+
+#ifndef SYS_rt_sigtimedwait
+#define SYS_rt_sigtimedwait SYS_rt_sigtimedwait_time64
+#endif
+
+#ifndef SYS_futex
+#define SYS_futex SYS_futex_time64
+#endif
+
+#ifndef SYS_sched_rr_get_interval
+#define SYS_sched_rr_get_interval SYS_sched_rr_get_interval_time64
+#endif
+
+
+
+
+/* socketcall calls */
+
+#define __SC_socket 1
+#define __SC_bind 2
+#define __SC_connect 3
+#define __SC_listen 4
+#define __SC_accept 5
+#define __SC_getsockname 6
+#define __SC_getpeername 7
+#define __SC_socketpair 8
+#define __SC_send 9
+#define __SC_recv 10
+#define __SC_sendto 11
+#define __SC_recvfrom 12
+#define __SC_shutdown 13
+#define __SC_setsockopt 14
+#define __SC_getsockopt 15
+#define __SC_sendmsg 16
+#define __SC_recvmsg 17
+#define __SC_accept4 18
+#define __SC_recvmmsg 19
+#define __SC_sendmmsg 20
+
+/* This is valid only because all socket syscalls are made via
+ * socketcall, which always fills unused argument slots with zeros. */
+#ifndef SYS_accept
+#define SYS_accept SYS_accept4
+#endif
+
+#ifndef SO_RCVTIMEO_OLD
+#define SO_RCVTIMEO_OLD 20
+#endif
+#ifndef SO_SNDTIMEO_OLD
+#define SO_SNDTIMEO_OLD 21
+#endif
+
+#define SO_TIMESTAMP_OLD 29
+#define SO_TIMESTAMPNS_OLD 35
+#define SO_TIMESTAMPING_OLD 37
+#define SCM_TIMESTAMP_OLD SO_TIMESTAMP_OLD
+#define SCM_TIMESTAMPNS_OLD SO_TIMESTAMPNS_OLD
+#define SCM_TIMESTAMPING_OLD SO_TIMESTAMPING_OLD
+
+#ifndef SIOCGSTAMP_OLD
+#define SIOCGSTAMP_OLD 0x8906
+#endif
+#ifndef SIOCGSTAMPNS_OLD
+#define SIOCGSTAMPNS_OLD 0x8907
+#endif
+
+#ifdef SYS_open
+#define __sys_open2(x,pn,fl) __syscall2(SYS_open, pn, (fl)|O_LARGEFILE)
+#define __sys_open3(x,pn,fl,mo) __syscall3(SYS_open, pn, (fl)|O_LARGEFILE, mo)
+#define __sys_open_cp2(x,pn,fl) __syscall_cp2(SYS_open, pn, (fl)|O_LARGEFILE)
+#define __sys_open_cp3(x,pn,fl,mo) __syscall_cp3(SYS_open, pn, (fl)|O_LARGEFILE, mo)
+#else
+#define __sys_open2(x,pn,fl) __syscall3(SYS_openat, AT_FDCWD, pn, (fl)|O_LARGEFILE)
+#define __sys_open3(x,pn,fl,mo) __syscall4(SYS_openat, AT_FDCWD, pn, (fl)|O_LARGEFILE, mo)
+#define __sys_open_cp2(x,pn,fl) __syscall_cp3(SYS_openat, AT_FDCWD, pn, (fl)|O_LARGEFILE)
+#define __sys_open_cp3(x,pn,fl,mo) __syscall_cp4(SYS_openat, AT_FDCWD, pn, (fl)|O_LARGEFILE, mo)
+#endif
+
+#define __sys_open(...) __SYSCALL_DISP(__sys_open,,__VA_ARGS__)
+#define sys_open(...) __syscall_ret(__sys_open(__VA_ARGS__))
+
+#define __sys_open_cp(...) __SYSCALL_DISP(__sys_open_cp,,__VA_ARGS__)
+#define sys_open_cp(...) __syscall_ret(__sys_open_cp(__VA_ARGS__))
+
+hidden void __procfdname(char __buf[static 15+3*sizeof(int)], unsigned);
+
+hidden void *__vdsosym(const char *, const char *);
+
+#endif
+#endif
diff --git a/libc-top-half/musl/src/internal/syscall_ret.c b/libc-top-half/musl/src/internal/syscall_ret.c
new file mode 100644
index 0000000..a3f4713
--- /dev/null
+++ b/libc-top-half/musl/src/internal/syscall_ret.c
@@ -0,0 +1,11 @@
+#include <errno.h>
+#include "syscall.h"
+
+long __syscall_ret(unsigned long r)
+{
+ if (r > -4096UL) {
+ errno = -r;
+ return -1;
+ }
+ return r;
+}
diff --git a/libc-top-half/musl/src/internal/vdso.c b/libc-top-half/musl/src/internal/vdso.c
new file mode 100644
index 0000000..d46d322
--- /dev/null
+++ b/libc-top-half/musl/src/internal/vdso.c
@@ -0,0 +1,93 @@
+#include <elf.h>
+#include <link.h>
+#include <limits.h>
+#include <stdint.h>
+#include <string.h>
+#include "libc.h"
+#include "syscall.h"
+
+#ifdef VDSO_USEFUL
+
+#if ULONG_MAX == 0xffffffff
+typedef Elf32_Ehdr Ehdr;
+typedef Elf32_Phdr Phdr;
+typedef Elf32_Sym Sym;
+typedef Elf32_Verdef Verdef;
+typedef Elf32_Verdaux Verdaux;
+#else
+typedef Elf64_Ehdr Ehdr;
+typedef Elf64_Phdr Phdr;
+typedef Elf64_Sym Sym;
+typedef Elf64_Verdef Verdef;
+typedef Elf64_Verdaux Verdaux;
+#endif
+
+static int checkver(Verdef *def, int vsym, const char *vername, char *strings)
+{
+ vsym &= 0x7fff;
+ for (;;) {
+ if (!(def->vd_flags & VER_FLG_BASE)
+ && (def->vd_ndx & 0x7fff) == vsym)
+ break;
+ if (def->vd_next == 0)
+ return 0;
+ def = (Verdef *)((char *)def + def->vd_next);
+ }
+ Verdaux *aux = (Verdaux *)((char *)def + def->vd_aux);
+ return !strcmp(vername, strings + aux->vda_name);
+}
+
+#define OK_TYPES (1<<STT_NOTYPE | 1<<STT_OBJECT | 1<<STT_FUNC | 1<<STT_COMMON)
+#define OK_BINDS (1<<STB_GLOBAL | 1<<STB_WEAK | 1<<STB_GNU_UNIQUE)
+
+void *__vdsosym(const char *vername, const char *name)
+{
+ size_t i;
+ for (i=0; libc.auxv[i] != AT_SYSINFO_EHDR; i+=2)
+ if (!libc.auxv[i]) return 0;
+ if (!libc.auxv[i+1]) return 0;
+ Ehdr *eh = (void *)libc.auxv[i+1];
+ Phdr *ph = (void *)((char *)eh + eh->e_phoff);
+ size_t *dynv=0, base=-1;
+ for (i=0; i<eh->e_phnum; i++, ph=(void *)((char *)ph+eh->e_phentsize)) {
+ if (ph->p_type == PT_LOAD)
+ base = (size_t)eh + ph->p_offset - ph->p_vaddr;
+ else if (ph->p_type == PT_DYNAMIC)
+ dynv = (void *)((char *)eh + ph->p_offset);
+ }
+ if (!dynv || base==(size_t)-1) return 0;
+
+ char *strings = 0;
+ Sym *syms = 0;
+ Elf_Symndx *hashtab = 0;
+ uint16_t *versym = 0;
+ Verdef *verdef = 0;
+
+ for (i=0; dynv[i]; i+=2) {
+ void *p = (void *)(base + dynv[i+1]);
+ switch(dynv[i]) {
+ case DT_STRTAB: strings = p; break;
+ case DT_SYMTAB: syms = p; break;
+ case DT_HASH: hashtab = p; break;
+ case DT_VERSYM: versym = p; break;
+ case DT_VERDEF: verdef = p; break;
+ }
+ }
+
+ if (!strings || !syms || !hashtab) return 0;
+ if (!verdef) versym = 0;
+
+ for (i=0; i<hashtab[1]; i++) {
+ if (!(1<<(syms[i].st_info&0xf) & OK_TYPES)) continue;
+ if (!(1<<(syms[i].st_info>>4) & OK_BINDS)) continue;
+ if (!syms[i].st_shndx) continue;
+ if (strcmp(name, strings+syms[i].st_name)) continue;
+ if (versym && !checkver(verdef, versym[i], vername, strings))
+ continue;
+ return (void *)(base + syms[i].st_value);
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/libc-top-half/musl/src/internal/version.c b/libc-top-half/musl/src/internal/version.c
new file mode 100644
index 0000000..08bbf5b
--- /dev/null
+++ b/libc-top-half/musl/src/internal/version.c
@@ -0,0 +1,4 @@
+#include "version.h"
+#include "libc.h"
+
+const char __libc_version[] = VERSION;
diff --git a/libc-top-half/musl/src/ipc/ftok.c b/libc-top-half/musl/src/ipc/ftok.c
new file mode 100644
index 0000000..c36b4b6
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/ftok.c
@@ -0,0 +1,10 @@
+#include <sys/ipc.h>
+#include <sys/stat.h>
+
+key_t ftok(const char *path, int id)
+{
+ struct stat st;
+ if (stat(path, &st) < 0) return -1;
+
+ return ((st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16) | ((id & 0xffu) << 24));
+}
diff --git a/libc-top-half/musl/src/ipc/ipc.h b/libc-top-half/musl/src/ipc/ipc.h
new file mode 100644
index 0000000..746a905
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/ipc.h
@@ -0,0 +1,24 @@
+#include "syscall.h"
+
+#define IPCOP_semop 1
+#define IPCOP_semget 2
+#define IPCOP_semctl 3
+#define IPCOP_semtimedop 4
+#define IPCOP_msgsnd 11
+#define IPCOP_msgrcv 12
+#define IPCOP_msgget 13
+#define IPCOP_msgctl 14
+#define IPCOP_shmat 21
+#define IPCOP_shmdt 22
+#define IPCOP_shmget 23
+#define IPCOP_shmctl 24
+
+#ifndef IPC_64
+#define IPC_64 0x100
+#endif
+
+#define IPC_TIME64 (IPC_STAT & 0x100)
+
+#define IPC_CMD(cmd) (((cmd) & ~IPC_TIME64) | IPC_64)
+
+#define IPC_HILO(b,t) ((b)->t = (b)->__##t##_lo | 0LL+(b)->__##t##_hi<<32)
diff --git a/libc-top-half/musl/src/ipc/msgctl.c b/libc-top-half/musl/src/ipc/msgctl.c
new file mode 100644
index 0000000..9c11440
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/msgctl.c
@@ -0,0 +1,51 @@
+#include <sys/msg.h>
+#include <endian.h>
+#include "syscall.h"
+#include "ipc.h"
+
+#if __BYTE_ORDER != __BIG_ENDIAN
+#undef SYSCALL_IPC_BROKEN_MODE
+#endif
+
+int msgctl(int q, int cmd, struct msqid_ds *buf)
+{
+#if IPC_TIME64
+ struct msqid_ds out, *orig;
+ if (cmd&IPC_TIME64) {
+ out = (struct msqid_ds){0};
+ orig = buf;
+ buf = &out;
+ }
+#endif
+#ifdef SYSCALL_IPC_BROKEN_MODE
+ struct msqid_ds tmp;
+ if (cmd == IPC_SET) {
+ tmp = *buf;
+ tmp.msg_perm.mode *= 0x10000U;
+ buf = &tmp;
+ }
+#endif
+#ifndef SYS_ipc
+ int r = __syscall(SYS_msgctl, q, IPC_CMD(cmd), buf);
+#else
+ int r = __syscall(SYS_ipc, IPCOP_msgctl, q, IPC_CMD(cmd), 0, buf, 0);
+#endif
+#ifdef SYSCALL_IPC_BROKEN_MODE
+ if (r >= 0) switch (cmd | IPC_TIME64) {
+ case IPC_STAT:
+ case MSG_STAT:
+ case MSG_STAT_ANY:
+ buf->msg_perm.mode >>= 16;
+ }
+#endif
+#if IPC_TIME64
+ if (r >= 0 && (cmd&IPC_TIME64)) {
+ buf = orig;
+ *buf = out;
+ IPC_HILO(buf, msg_stime);
+ IPC_HILO(buf, msg_rtime);
+ IPC_HILO(buf, msg_ctime);
+ }
+#endif
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/ipc/msgget.c b/libc-top-half/musl/src/ipc/msgget.c
new file mode 100644
index 0000000..30a4b42
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/msgget.c
@@ -0,0 +1,12 @@
+#include <sys/msg.h>
+#include "syscall.h"
+#include "ipc.h"
+
+int msgget(key_t k, int flag)
+{
+#ifndef SYS_ipc
+ return syscall(SYS_msgget, k, flag);
+#else
+ return syscall(SYS_ipc, IPCOP_msgget, k, flag);
+#endif
+}
diff --git a/libc-top-half/musl/src/ipc/msgrcv.c b/libc-top-half/musl/src/ipc/msgrcv.c
new file mode 100644
index 0000000..9d1034b
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/msgrcv.c
@@ -0,0 +1,12 @@
+#include <sys/msg.h>
+#include "syscall.h"
+#include "ipc.h"
+
+ssize_t msgrcv(int q, void *m, size_t len, long type, int flag)
+{
+#ifndef SYS_ipc
+ return syscall_cp(SYS_msgrcv, q, m, len, type, flag);
+#else
+ return syscall_cp(SYS_ipc, IPCOP_msgrcv, q, len, flag, ((long[]){ (long)m, type }));
+#endif
+}
diff --git a/libc-top-half/musl/src/ipc/msgsnd.c b/libc-top-half/musl/src/ipc/msgsnd.c
new file mode 100644
index 0000000..99bb17e
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/msgsnd.c
@@ -0,0 +1,12 @@
+#include <sys/msg.h>
+#include "syscall.h"
+#include "ipc.h"
+
+int msgsnd(int q, const void *m, size_t len, int flag)
+{
+#ifndef SYS_ipc
+ return syscall_cp(SYS_msgsnd, q, m, len, flag);
+#else
+ return syscall_cp(SYS_ipc, IPCOP_msgsnd, q, len, flag, m);
+#endif
+}
diff --git a/libc-top-half/musl/src/ipc/semctl.c b/libc-top-half/musl/src/ipc/semctl.c
new file mode 100644
index 0000000..bbb97d7
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/semctl.c
@@ -0,0 +1,69 @@
+#include <sys/sem.h>
+#include <stdarg.h>
+#include <endian.h>
+#include "syscall.h"
+#include "ipc.h"
+
+#if __BYTE_ORDER != __BIG_ENDIAN
+#undef SYSCALL_IPC_BROKEN_MODE
+#endif
+
+union semun {
+ int val;
+ struct semid_ds *buf;
+ unsigned short *array;
+};
+
+int semctl(int id, int num, int cmd, ...)
+{
+ union semun arg = {0};
+ va_list ap;
+ switch (cmd & ~IPC_TIME64) {
+ case SETVAL: case GETALL: case SETALL: case IPC_SET:
+ case IPC_INFO: case SEM_INFO:
+ case IPC_STAT & ~IPC_TIME64:
+ case SEM_STAT & ~IPC_TIME64:
+ case SEM_STAT_ANY & ~IPC_TIME64:
+ va_start(ap, cmd);
+ arg = va_arg(ap, union semun);
+ va_end(ap);
+ }
+#if IPC_TIME64
+ struct semid_ds out, *orig;
+ if (cmd&IPC_TIME64) {
+ out = (struct semid_ds){0};
+ orig = arg.buf;
+ arg.buf = &out;
+ }
+#endif
+#ifdef SYSCALL_IPC_BROKEN_MODE
+ struct semid_ds tmp;
+ if (cmd == IPC_SET) {
+ tmp = *arg.buf;
+ tmp.sem_perm.mode *= 0x10000U;
+ arg.buf = &tmp;
+ }
+#endif
+#ifndef SYS_ipc
+ int r = __syscall(SYS_semctl, id, num, IPC_CMD(cmd), arg.buf);
+#else
+ int r = __syscall(SYS_ipc, IPCOP_semctl, id, num, IPC_CMD(cmd), &arg.buf);
+#endif
+#ifdef SYSCALL_IPC_BROKEN_MODE
+ if (r >= 0) switch (cmd | IPC_TIME64) {
+ case IPC_STAT:
+ case SEM_STAT:
+ case SEM_STAT_ANY:
+ arg.buf->sem_perm.mode >>= 16;
+ }
+#endif
+#if IPC_TIME64
+ if (r >= 0 && (cmd&IPC_TIME64)) {
+ arg.buf = orig;
+ *arg.buf = out;
+ IPC_HILO(arg.buf, sem_otime);
+ IPC_HILO(arg.buf, sem_ctime);
+ }
+#endif
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/ipc/semget.c b/libc-top-half/musl/src/ipc/semget.c
new file mode 100644
index 0000000..2cdf626
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/semget.c
@@ -0,0 +1,19 @@
+#include <sys/sem.h>
+#include <limits.h>
+#include <errno.h>
+#include "syscall.h"
+#include "ipc.h"
+
+int semget(key_t key, int n, int fl)
+{
+ /* The kernel uses the wrong type for the sem_nsems member
+ * of struct semid_ds, and thus might not check that the
+ * n fits in the correct (per POSIX) userspace type, so
+ * we have to check here. */
+ if (n > USHRT_MAX) return __syscall_ret(-EINVAL);
+#ifndef SYS_ipc
+ return syscall(SYS_semget, key, n, fl);
+#else
+ return syscall(SYS_ipc, IPCOP_semget, key, n, fl);
+#endif
+}
diff --git a/libc-top-half/musl/src/ipc/semop.c b/libc-top-half/musl/src/ipc/semop.c
new file mode 100644
index 0000000..5f0c7de
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/semop.c
@@ -0,0 +1,12 @@
+#include <sys/sem.h>
+#include "syscall.h"
+#include "ipc.h"
+
+int semop(int id, struct sembuf *buf, size_t n)
+{
+#ifndef SYS_ipc
+ return syscall(SYS_semop, id, buf, n);
+#else
+ return syscall(SYS_ipc, IPCOP_semop, id, n, 0, buf);
+#endif
+}
diff --git a/libc-top-half/musl/src/ipc/semtimedop.c b/libc-top-half/musl/src/ipc/semtimedop.c
new file mode 100644
index 0000000..1632e7b
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/semtimedop.c
@@ -0,0 +1,35 @@
+#define _GNU_SOURCE
+#include <sys/sem.h>
+#include <errno.h>
+#include "syscall.h"
+#include "ipc.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
+
+#if !defined(SYS_semtimedop) && !defined(SYS_ipc)
+#define NO_TIME32 1
+#else
+#define NO_TIME32 0
+#endif
+
+int semtimedop(int id, struct sembuf *buf, size_t n, const struct timespec *ts)
+{
+#ifdef SYS_semtimedop_time64
+ time_t s = ts ? ts->tv_sec : 0;
+ long ns = ts ? ts->tv_nsec : 0;
+ int r = -ENOSYS;
+ if (NO_TIME32 || !IS32BIT(s))
+ r = __syscall(SYS_semtimedop_time64, id, buf, n,
+ ts ? ((long long[]){s, ns}) : 0);
+ if (NO_TIME32 || r!=-ENOSYS) return __syscall_ret(r);
+ ts = ts ? (void *)(long[]){CLAMP(s), ns} : 0;
+#endif
+#if defined(SYS_ipc)
+ return syscall(SYS_ipc, IPCOP_semtimedop, id, n, 0, buf, ts);
+#elif defined(SYS_semtimedop)
+ return syscall(SYS_semtimedop, id, buf, n, ts);
+#else
+ return __syscall_ret(-ENOSYS);
+#endif
+}
diff --git a/libc-top-half/musl/src/ipc/shmat.c b/libc-top-half/musl/src/ipc/shmat.c
new file mode 100644
index 0000000..8c7407d
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/shmat.c
@@ -0,0 +1,17 @@
+#include <sys/shm.h>
+#include "syscall.h"
+#include "ipc.h"
+
+#ifndef SYS_ipc
+void *shmat(int id, const void *addr, int flag)
+{
+ return (void *)syscall(SYS_shmat, id, addr, flag);
+}
+#else
+void *shmat(int id, const void *addr, int flag)
+{
+ unsigned long ret;
+ ret = syscall(SYS_ipc, IPCOP_shmat, id, flag, &addr, addr);
+ return (ret > -(unsigned long)SHMLBA) ? (void *)ret : (void *)addr;
+}
+#endif
diff --git a/libc-top-half/musl/src/ipc/shmctl.c b/libc-top-half/musl/src/ipc/shmctl.c
new file mode 100644
index 0000000..1c9f78c
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/shmctl.c
@@ -0,0 +1,51 @@
+#include <sys/shm.h>
+#include <endian.h>
+#include "syscall.h"
+#include "ipc.h"
+
+#if __BYTE_ORDER != __BIG_ENDIAN
+#undef SYSCALL_IPC_BROKEN_MODE
+#endif
+
+int shmctl(int id, int cmd, struct shmid_ds *buf)
+{
+#if IPC_TIME64
+ struct shmid_ds out, *orig;
+ if (cmd&IPC_TIME64) {
+ out = (struct shmid_ds){0};
+ orig = buf;
+ buf = &out;
+ }
+#endif
+#ifdef SYSCALL_IPC_BROKEN_MODE
+ struct shmid_ds tmp;
+ if (cmd == IPC_SET) {
+ tmp = *buf;
+ tmp.shm_perm.mode *= 0x10000U;
+ buf = &tmp;
+ }
+#endif
+#ifndef SYS_ipc
+ int r = __syscall(SYS_shmctl, id, IPC_CMD(cmd), buf);
+#else
+ int r = __syscall(SYS_ipc, IPCOP_shmctl, id, IPC_CMD(cmd), 0, buf, 0);
+#endif
+#ifdef SYSCALL_IPC_BROKEN_MODE
+ if (r >= 0) switch (cmd | IPC_TIME64) {
+ case IPC_STAT:
+ case SHM_STAT:
+ case SHM_STAT_ANY:
+ buf->shm_perm.mode >>= 16;
+ }
+#endif
+#if IPC_TIME64
+ if (r >= 0 && (cmd&IPC_TIME64)) {
+ buf = orig;
+ *buf = out;
+ IPC_HILO(buf, shm_atime);
+ IPC_HILO(buf, shm_dtime);
+ IPC_HILO(buf, shm_ctime);
+ }
+#endif
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/ipc/shmdt.c b/libc-top-half/musl/src/ipc/shmdt.c
new file mode 100644
index 0000000..5723813
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/shmdt.c
@@ -0,0 +1,12 @@
+#include <sys/shm.h>
+#include "syscall.h"
+#include "ipc.h"
+
+int shmdt(const void *addr)
+{
+#ifndef SYS_ipc
+ return syscall(SYS_shmdt, addr);
+#else
+ return syscall(SYS_ipc, IPCOP_shmdt, 0, 0, 0, addr);
+#endif
+}
diff --git a/libc-top-half/musl/src/ipc/shmget.c b/libc-top-half/musl/src/ipc/shmget.c
new file mode 100644
index 0000000..7521b5f
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/shmget.c
@@ -0,0 +1,14 @@
+#include <sys/shm.h>
+#include <stdint.h>
+#include "syscall.h"
+#include "ipc.h"
+
+int shmget(key_t key, size_t size, int flag)
+{
+ if (size > PTRDIFF_MAX) size = SIZE_MAX;
+#ifndef SYS_ipc
+ return syscall(SYS_shmget, key, size, flag);
+#else
+ return syscall(SYS_ipc, IPCOP_shmget, key, size, flag);
+#endif
+}
diff --git a/libc-top-half/musl/src/ldso/__dlsym.c b/libc-top-half/musl/src/ldso/__dlsym.c
new file mode 100644
index 0000000..0384f97
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/__dlsym.c
@@ -0,0 +1,14 @@
+#include <dlfcn.h>
+#include "dynlink.h"
+
+static void *stub_dlsym(void *restrict p, const char *restrict s, void *restrict ra)
+{
+ __dl_seterr("Symbol not found: %s", s);
+ return 0;
+}
+
+weak_alias(stub_dlsym, __dlsym);
+
+#if _REDIR_TIME64
+weak_alias(stub_dlsym, __dlsym_redir_time64);
+#endif
diff --git a/libc-top-half/musl/src/ldso/aarch64/dlsym.s b/libc-top-half/musl/src/ldso/aarch64/dlsym.s
new file mode 100644
index 0000000..abaae4d
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/aarch64/dlsym.s
@@ -0,0 +1,6 @@
+.global dlsym
+.hidden __dlsym
+.type dlsym,%function
+dlsym:
+ mov x2,x30
+ b __dlsym
diff --git a/libc-top-half/musl/src/ldso/aarch64/tlsdesc.s b/libc-top-half/musl/src/ldso/aarch64/tlsdesc.s
new file mode 100644
index 0000000..c6c685b
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/aarch64/tlsdesc.s
@@ -0,0 +1,31 @@
+// size_t __tlsdesc_static(size_t *a)
+// {
+// return a[1];
+// }
+.global __tlsdesc_static
+.hidden __tlsdesc_static
+.type __tlsdesc_static,@function
+__tlsdesc_static:
+ ldr x0,[x0,#8]
+ ret
+
+// size_t __tlsdesc_dynamic(size_t *a)
+// {
+// struct {size_t modidx,off;} *p = (void*)a[1];
+// size_t *dtv = *(size_t**)(tp - 8);
+// return dtv[p->modidx] + p->off - tp;
+// }
+.global __tlsdesc_dynamic
+.hidden __tlsdesc_dynamic
+.type __tlsdesc_dynamic,@function
+__tlsdesc_dynamic:
+ stp x1,x2,[sp,#-16]!
+ mrs x1,tpidr_el0 // tp
+ ldr x0,[x0,#8] // p
+ ldp x0,x2,[x0] // p->modidx, p->off
+ sub x2,x2,x1 // p->off - tp
+ ldr x1,[x1,#-8] // dtv
+ ldr x1,[x1,x0,lsl #3] // dtv[p->modidx]
+ add x0,x1,x2 // dtv[p->modidx] + p->off - tp
+ ldp x1,x2,[sp],#16
+ ret
diff --git a/libc-top-half/musl/src/ldso/arm/dlsym.s b/libc-top-half/musl/src/ldso/arm/dlsym.s
new file mode 100644
index 0000000..2652c34
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/arm/dlsym.s
@@ -0,0 +1,8 @@
+.syntax unified
+.text
+.global dlsym
+.hidden __dlsym
+.type dlsym,%function
+dlsym:
+ mov r2,lr
+ b __dlsym
diff --git a/libc-top-half/musl/src/ldso/arm/dlsym_time64.S b/libc-top-half/musl/src/ldso/arm/dlsym_time64.S
new file mode 100644
index 0000000..bb2e704
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/arm/dlsym_time64.S
@@ -0,0 +1,3 @@
+#define __dlsym __dlsym_redir_time64
+#define dlsym __dlsym_time64
+#include "dlsym.s"
diff --git a/libc-top-half/musl/src/ldso/arm/find_exidx.c b/libc-top-half/musl/src/ldso/arm/find_exidx.c
new file mode 100644
index 0000000..77c4472
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/arm/find_exidx.c
@@ -0,0 +1,42 @@
+#define _GNU_SOURCE
+#include <link.h>
+#include <stdint.h>
+
+struct find_exidx_data {
+ uintptr_t pc, exidx_start;
+ int exidx_len;
+};
+
+static int find_exidx(struct dl_phdr_info *info, size_t size, void *ptr)
+{
+ struct find_exidx_data *data = ptr;
+ const ElfW(Phdr) *phdr = info->dlpi_phdr;
+ uintptr_t addr, exidx_start = 0;
+ int i, match = 0, exidx_len = 0;
+
+ for (i = info->dlpi_phnum; i > 0; i--, phdr++) {
+ addr = info->dlpi_addr + phdr->p_vaddr;
+ switch (phdr->p_type) {
+ case PT_LOAD:
+ match |= data->pc >= addr && data->pc < addr + phdr->p_memsz;
+ break;
+ case PT_ARM_EXIDX:
+ exidx_start = addr;
+ exidx_len = phdr->p_memsz;
+ break;
+ }
+ }
+ data->exidx_start = exidx_start;
+ data->exidx_len = exidx_len;
+ return match;
+}
+
+uintptr_t __gnu_Unwind_Find_exidx(uintptr_t pc, int *pcount)
+{
+ struct find_exidx_data data;
+ data.pc = pc;
+ if (dl_iterate_phdr(find_exidx, &data) <= 0)
+ return 0;
+ *pcount = data.exidx_len / 8;
+ return data.exidx_start;
+}
diff --git a/libc-top-half/musl/src/ldso/arm/tlsdesc.S b/libc-top-half/musl/src/ldso/arm/tlsdesc.S
new file mode 100644
index 0000000..3ae133c
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/arm/tlsdesc.S
@@ -0,0 +1,55 @@
+.syntax unified
+
+.text
+.global __tlsdesc_static
+.hidden __tlsdesc_static
+.type __tlsdesc_static,%function
+__tlsdesc_static:
+ ldr r0,[r0]
+ bx lr
+
+.global __tlsdesc_dynamic
+.hidden __tlsdesc_dynamic
+.type __tlsdesc_dynamic,%function
+__tlsdesc_dynamic:
+ push {r2,r3,ip,lr}
+ ldr r1,[r0]
+ ldr r2,[r1,#4] // r2 = offset
+ ldr r1,[r1] // r1 = modid
+
+#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
+ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
+ mrc p15,0,r0,c13,c0,3
+#else
+ ldr r0,1f
+ add r0,r0,pc
+ ldr r0,[r0]
+2:
+#if __ARM_ARCH >= 5
+ blx r0 // r0 = tp
+#else
+#if __thumb__
+ add lr,pc,#1
+#else
+ mov lr,pc
+#endif
+ bx r0
+#endif
+#endif
+ ldr r3,[r0,#-4] // r3 = dtv
+ ldr ip,[r3,r1,LSL #2]
+ sub r0,ip,r0
+ add r0,r0,r2 // r0 = r3[r1]-r0+r2
+#if __ARM_ARCH >= 5
+ pop {r2,r3,ip,pc}
+#else
+ pop {r2,r3,ip,lr}
+ bx lr
+#endif
+
+#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
+ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
+#else
+ .align 2
+1: .word __a_gettp_ptr - 2b
+#endif
diff --git a/libc-top-half/musl/src/ldso/dl_iterate_phdr.c b/libc-top-half/musl/src/ldso/dl_iterate_phdr.c
new file mode 100644
index 0000000..9546dd3
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/dl_iterate_phdr.c
@@ -0,0 +1,47 @@
+#include <elf.h>
+#include <link.h>
+#include "pthread_impl.h"
+#include "libc.h"
+
+#define AUX_CNT 38
+
+extern weak hidden const size_t _DYNAMIC[];
+
+static int static_dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void *data), void *data)
+{
+ unsigned char *p;
+ ElfW(Phdr) *phdr, *tls_phdr=0;
+ size_t base = 0;
+ size_t n;
+ struct dl_phdr_info info;
+ size_t i, aux[AUX_CNT] = {0};
+
+ for (i=0; libc.auxv[i]; i+=2)
+ if (libc.auxv[i]<AUX_CNT) aux[libc.auxv[i]] = libc.auxv[i+1];
+
+ for (p=(void *)aux[AT_PHDR],n=aux[AT_PHNUM]; n; n--,p+=aux[AT_PHENT]) {
+ phdr = (void *)p;
+ if (phdr->p_type == PT_PHDR)
+ base = aux[AT_PHDR] - phdr->p_vaddr;
+ if (phdr->p_type == PT_DYNAMIC && _DYNAMIC)
+ base = (size_t)_DYNAMIC - phdr->p_vaddr;
+ if (phdr->p_type == PT_TLS)
+ tls_phdr = phdr;
+ }
+ info.dlpi_addr = base;
+ info.dlpi_name = "/proc/self/exe";
+ info.dlpi_phdr = (void *)aux[AT_PHDR];
+ info.dlpi_phnum = aux[AT_PHNUM];
+ info.dlpi_adds = 0;
+ info.dlpi_subs = 0;
+ if (tls_phdr) {
+ info.dlpi_tls_modid = 1;
+ info.dlpi_tls_data = __tls_get_addr((tls_mod_off_t[]){1,0});
+ } else {
+ info.dlpi_tls_modid = 0;
+ info.dlpi_tls_data = 0;
+ }
+ return (callback)(&info, sizeof (info), data);
+}
+
+weak_alias(static_dl_iterate_phdr, dl_iterate_phdr);
diff --git a/libc-top-half/musl/src/ldso/dladdr.c b/libc-top-half/musl/src/ldso/dladdr.c
new file mode 100644
index 0000000..e5c8020
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/dladdr.c
@@ -0,0 +1,9 @@
+#define _GNU_SOURCE
+#include <dlfcn.h>
+
+static int stub_dladdr(const void *addr, Dl_info *info)
+{
+ return 0;
+}
+
+weak_alias(stub_dladdr, dladdr);
diff --git a/libc-top-half/musl/src/ldso/dlclose.c b/libc-top-half/musl/src/ldso/dlclose.c
new file mode 100644
index 0000000..e437422
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/dlclose.c
@@ -0,0 +1,7 @@
+#include <dlfcn.h>
+#include "dynlink.h"
+
+int dlclose(void *p)
+{
+ return __dl_invalid_handle(p);
+}
diff --git a/libc-top-half/musl/src/ldso/dlerror.c b/libc-top-half/musl/src/ldso/dlerror.c
new file mode 100644
index 0000000..afe5925
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/dlerror.c
@@ -0,0 +1,87 @@
+#include <dlfcn.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include "pthread_impl.h"
+#include "dynlink.h"
+#include "lock.h"
+#include "fork_impl.h"
+
+#define malloc __libc_malloc
+#define calloc __libc_calloc
+#define realloc __libc_realloc
+#define free __libc_free
+
+char *dlerror()
+{
+ pthread_t self = __pthread_self();
+ if (!self->dlerror_flag) return 0;
+ self->dlerror_flag = 0;
+ char *s = self->dlerror_buf;
+ if (s == (void *)-1)
+ return "Dynamic linker failed to allocate memory for error message";
+ else
+ return s;
+}
+
+static volatile int freebuf_queue_lock[1];
+static void **freebuf_queue;
+volatile int *const __dlerror_lockptr = freebuf_queue_lock;
+
+void __dl_thread_cleanup(void)
+{
+ pthread_t self = __pthread_self();
+ if (self->dlerror_buf && self->dlerror_buf != (void *)-1) {
+ LOCK(freebuf_queue_lock);
+ void **p = (void **)self->dlerror_buf;
+ *p = freebuf_queue;
+ freebuf_queue = p;
+ UNLOCK(freebuf_queue_lock);
+ }
+}
+
+hidden void __dl_vseterr(const char *fmt, va_list ap)
+{
+ LOCK(freebuf_queue_lock);
+ void **q = freebuf_queue;
+ freebuf_queue = 0;
+ UNLOCK(freebuf_queue_lock);
+
+ while (q) {
+ void **p = *q;
+ free(q);
+ q = p;
+ }
+
+ va_list ap2;
+ va_copy(ap2, ap);
+ pthread_t self = __pthread_self();
+ if (self->dlerror_buf != (void *)-1)
+ free(self->dlerror_buf);
+ size_t len = vsnprintf(0, 0, fmt, ap2);
+ if (len < sizeof(void *)) len = sizeof(void *);
+ va_end(ap2);
+ char *buf = malloc(len+1);
+ if (buf) {
+ vsnprintf(buf, len+1, fmt, ap);
+ } else {
+ buf = (void *)-1;
+ }
+ self->dlerror_buf = buf;
+ self->dlerror_flag = 1;
+}
+
+hidden void __dl_seterr(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ __dl_vseterr(fmt, ap);
+ va_end(ap);
+}
+
+static int stub_invalid_handle(void *h)
+{
+ __dl_seterr("Invalid library handle %p", (void *)h);
+ return 1;
+}
+
+weak_alias(stub_invalid_handle, __dl_invalid_handle);
diff --git a/libc-top-half/musl/src/ldso/dlinfo.c b/libc-top-half/musl/src/ldso/dlinfo.c
new file mode 100644
index 0000000..b55f5fe
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/dlinfo.c
@@ -0,0 +1,14 @@
+#define _GNU_SOURCE
+#include <dlfcn.h>
+#include "dynlink.h"
+
+int dlinfo(void *dso, int req, void *res)
+{
+ if (__dl_invalid_handle(dso)) return -1;
+ if (req != RTLD_DI_LINKMAP) {
+ __dl_seterr("Unsupported request %d", req);
+ return -1;
+ }
+ *(struct link_map **)res = dso;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/ldso/dlopen.c b/libc-top-half/musl/src/ldso/dlopen.c
new file mode 100644
index 0000000..69372a2
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/dlopen.c
@@ -0,0 +1,10 @@
+#include <dlfcn.h>
+#include "dynlink.h"
+
+static void *stub_dlopen(const char *file, int mode)
+{
+ __dl_seterr("Dynamic loading not supported");
+ return 0;
+}
+
+weak_alias(stub_dlopen, dlopen);
diff --git a/libc-top-half/musl/src/ldso/dlsym.c b/libc-top-half/musl/src/ldso/dlsym.c
new file mode 100644
index 0000000..65eb276
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/dlsym.c
@@ -0,0 +1,7 @@
+#include <dlfcn.h>
+#include "dynlink.h"
+
+void *dlsym(void *restrict p, const char *restrict s)
+{
+ return __dlsym(p, s, 0);
+}
diff --git a/libc-top-half/musl/src/ldso/i386/dlsym.s b/libc-top-half/musl/src/ldso/i386/dlsym.s
new file mode 100644
index 0000000..097e30c
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/i386/dlsym.s
@@ -0,0 +1,11 @@
+.text
+.global dlsym
+.hidden __dlsym
+.type dlsym,@function
+dlsym:
+ push (%esp)
+ push 12(%esp)
+ push 12(%esp)
+ call __dlsym
+ add $12,%esp
+ ret
diff --git a/libc-top-half/musl/src/ldso/i386/dlsym_time64.S b/libc-top-half/musl/src/ldso/i386/dlsym_time64.S
new file mode 100644
index 0000000..bb2e704
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/i386/dlsym_time64.S
@@ -0,0 +1,3 @@
+#define __dlsym __dlsym_redir_time64
+#define dlsym __dlsym_time64
+#include "dlsym.s"
diff --git a/libc-top-half/musl/src/ldso/i386/tlsdesc.s b/libc-top-half/musl/src/ldso/i386/tlsdesc.s
new file mode 100644
index 0000000..32c8176
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/i386/tlsdesc.s
@@ -0,0 +1,23 @@
+.text
+.global __tlsdesc_static
+.hidden __tlsdesc_static
+.type __tlsdesc_static,@function
+__tlsdesc_static:
+ mov 4(%eax),%eax
+ ret
+
+.global __tlsdesc_dynamic
+.hidden __tlsdesc_dynamic
+.type __tlsdesc_dynamic,@function
+__tlsdesc_dynamic:
+ mov 4(%eax),%eax
+ push %edx
+ mov %gs:4,%edx
+ push %ecx
+ mov (%eax),%ecx
+ mov 4(%eax),%eax
+ add (%edx,%ecx,4),%eax
+ pop %ecx
+ sub %gs:0,%eax
+ pop %edx
+ ret
diff --git a/libc-top-half/musl/src/ldso/m68k/dlsym.s b/libc-top-half/musl/src/ldso/m68k/dlsym.s
new file mode 100644
index 0000000..5209ae1
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/m68k/dlsym.s
@@ -0,0 +1,12 @@
+.text
+.global dlsym
+.hidden __dlsym
+.type dlsym,@function
+dlsym:
+ move.l (%sp),-(%sp)
+ move.l 12(%sp),-(%sp)
+ move.l 12(%sp),-(%sp)
+ lea __dlsym-.-8,%a1
+ jsr (%pc,%a1)
+ add.l #12,%sp
+ rts
diff --git a/libc-top-half/musl/src/ldso/m68k/dlsym_time64.S b/libc-top-half/musl/src/ldso/m68k/dlsym_time64.S
new file mode 100644
index 0000000..bb2e704
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/m68k/dlsym_time64.S
@@ -0,0 +1,3 @@
+#define __dlsym __dlsym_redir_time64
+#define dlsym __dlsym_time64
+#include "dlsym.s"
diff --git a/libc-top-half/musl/src/ldso/microblaze/dlsym.s b/libc-top-half/musl/src/ldso/microblaze/dlsym.s
new file mode 100644
index 0000000..ea9d8be
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/microblaze/dlsym.s
@@ -0,0 +1,6 @@
+.global dlsym
+.hidden __dlsym
+.type dlsym,@function
+dlsym:
+ brid __dlsym
+ add r7, r15, r0
diff --git a/libc-top-half/musl/src/ldso/microblaze/dlsym_time64.S b/libc-top-half/musl/src/ldso/microblaze/dlsym_time64.S
new file mode 100644
index 0000000..bb2e704
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/microblaze/dlsym_time64.S
@@ -0,0 +1,3 @@
+#define __dlsym __dlsym_redir_time64
+#define dlsym __dlsym_time64
+#include "dlsym.s"
diff --git a/libc-top-half/musl/src/ldso/mips/dlsym.s b/libc-top-half/musl/src/ldso/mips/dlsym.s
new file mode 100644
index 0000000..1573e51
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/mips/dlsym.s
@@ -0,0 +1,17 @@
+.set noreorder
+.global dlsym
+.hidden __dlsym
+.type dlsym,@function
+dlsym:
+ lui $gp, %hi(_gp_disp)
+ addiu $gp, %lo(_gp_disp)
+ addu $gp, $gp, $25
+ move $6, $ra
+ lw $25, %call16(__dlsym)($gp)
+ addiu $sp, $sp, -16
+ sw $ra, 12($sp)
+ jalr $25
+ nop
+ lw $ra, 12($sp)
+ jr $ra
+ addiu $sp, $sp, 16
diff --git a/libc-top-half/musl/src/ldso/mips/dlsym_time64.S b/libc-top-half/musl/src/ldso/mips/dlsym_time64.S
new file mode 100644
index 0000000..bb2e704
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/mips/dlsym_time64.S
@@ -0,0 +1,3 @@
+#define __dlsym __dlsym_redir_time64
+#define dlsym __dlsym_time64
+#include "dlsym.s"
diff --git a/libc-top-half/musl/src/ldso/mips64/dlsym.s b/libc-top-half/musl/src/ldso/mips64/dlsym.s
new file mode 100644
index 0000000..32e0ddd
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/mips64/dlsym.s
@@ -0,0 +1,17 @@
+.set noreorder
+.global dlsym
+.hidden __dlsym
+.type dlsym,@function
+dlsym:
+ lui $3, %hi(%neg(%gp_rel(dlsym)))
+ daddiu $3, $3, %lo(%neg(%gp_rel(dlsym)))
+ daddu $3, $3, $25
+ move $6, $ra
+ ld $25, %got_disp(__dlsym)($3)
+ daddiu $sp, $sp, -32
+ sd $ra, 24($sp)
+ jalr $25
+ nop
+ ld $ra, 24($sp)
+ jr $ra
+ daddiu $sp, $sp, 32
diff --git a/libc-top-half/musl/src/ldso/mipsn32/dlsym.s b/libc-top-half/musl/src/ldso/mipsn32/dlsym.s
new file mode 100644
index 0000000..1c82da3
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/mipsn32/dlsym.s
@@ -0,0 +1,17 @@
+.set noreorder
+.global dlsym
+.hidden __dlsym
+.type dlsym,@function
+dlsym:
+ lui $3, %hi(%neg(%gp_rel(dlsym)))
+ addiu $3, $3, %lo(%neg(%gp_rel(dlsym)))
+ addu $3, $3, $25
+ move $6, $ra
+ lw $25, %got_disp(__dlsym)($3)
+ addiu $sp, $sp, -32
+ sd $ra, 16($sp)
+ jalr $25
+ nop
+ ld $ra, 16($sp)
+ jr $ra
+ addiu $sp, $sp, 32
diff --git a/libc-top-half/musl/src/ldso/mipsn32/dlsym_time64.S b/libc-top-half/musl/src/ldso/mipsn32/dlsym_time64.S
new file mode 100644
index 0000000..bb2e704
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/mipsn32/dlsym_time64.S
@@ -0,0 +1,3 @@
+#define __dlsym __dlsym_redir_time64
+#define dlsym __dlsym_time64
+#include "dlsym.s"
diff --git a/libc-top-half/musl/src/ldso/or1k/dlsym.s b/libc-top-half/musl/src/ldso/or1k/dlsym.s
new file mode 100644
index 0000000..122475c
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/or1k/dlsym.s
@@ -0,0 +1,6 @@
+.global dlsym
+.hidden __dlsym
+.type dlsym,@function
+dlsym:
+ l.j __dlsym
+ l.ori r5, r9, 0
diff --git a/libc-top-half/musl/src/ldso/or1k/dlsym_time64.S b/libc-top-half/musl/src/ldso/or1k/dlsym_time64.S
new file mode 100644
index 0000000..bb2e704
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/or1k/dlsym_time64.S
@@ -0,0 +1,3 @@
+#define __dlsym __dlsym_redir_time64
+#define dlsym __dlsym_time64
+#include "dlsym.s"
diff --git a/libc-top-half/musl/src/ldso/powerpc/dlsym.s b/libc-top-half/musl/src/ldso/powerpc/dlsym.s
new file mode 100644
index 0000000..cfe308e
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/powerpc/dlsym.s
@@ -0,0 +1,8 @@
+ .text
+ .global dlsym
+ .hidden __dlsym
+ .type dlsym,@function
+dlsym:
+ mflr 5 # The return address is arg3.
+ b __dlsym
+ .size dlsym, .-dlsym
diff --git a/libc-top-half/musl/src/ldso/powerpc/dlsym_time64.S b/libc-top-half/musl/src/ldso/powerpc/dlsym_time64.S
new file mode 100644
index 0000000..bb2e704
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/powerpc/dlsym_time64.S
@@ -0,0 +1,3 @@
+#define __dlsym __dlsym_redir_time64
+#define dlsym __dlsym_time64
+#include "dlsym.s"
diff --git a/libc-top-half/musl/src/ldso/powerpc64/dlsym.s b/libc-top-half/musl/src/ldso/powerpc64/dlsym.s
new file mode 100644
index 0000000..a14715f
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/powerpc64/dlsym.s
@@ -0,0 +1,11 @@
+ .text
+ .global dlsym
+ .hidden __dlsym
+ .type dlsym,@function
+dlsym:
+ addis 2, 12, .TOC.-dlsym@ha
+ addi 2, 2, .TOC.-dlsym@l
+ .localentry dlsym,.-dlsym
+ mflr 5 # The return address is arg3.
+ b __dlsym
+ .size dlsym, .-dlsym
diff --git a/libc-top-half/musl/src/ldso/riscv64/dlsym.s b/libc-top-half/musl/src/ldso/riscv64/dlsym.s
new file mode 100644
index 0000000..2bafd72
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/riscv64/dlsym.s
@@ -0,0 +1,6 @@
+.global dlsym
+.hidden __dlsym
+.type dlsym, %function
+dlsym:
+ mv a2, ra
+ tail __dlsym
diff --git a/libc-top-half/musl/src/ldso/s390x/dlsym.s b/libc-top-half/musl/src/ldso/s390x/dlsym.s
new file mode 100644
index 0000000..2e9fa8f
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/s390x/dlsym.s
@@ -0,0 +1,6 @@
+ .global dlsym
+ .hidden __dlsym
+ .type dlsym,@function
+dlsym:
+ lgr %r4, %r14
+ jg __dlsym
diff --git a/libc-top-half/musl/src/ldso/sh/dlsym.s b/libc-top-half/musl/src/ldso/sh/dlsym.s
new file mode 100644
index 0000000..11a6fff
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/sh/dlsym.s
@@ -0,0 +1,11 @@
+.text
+.global dlsym
+.hidden __dlsym
+.type dlsym, @function
+dlsym:
+ mov.l L1, r0
+1: braf r0
+ mov.l @r15, r6
+
+.align 2
+L1: .long __dlsym@PLT-(1b+4-.)
diff --git a/libc-top-half/musl/src/ldso/sh/dlsym_time64.S b/libc-top-half/musl/src/ldso/sh/dlsym_time64.S
new file mode 100644
index 0000000..bb2e704
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/sh/dlsym_time64.S
@@ -0,0 +1,3 @@
+#define __dlsym __dlsym_redir_time64
+#define dlsym __dlsym_time64
+#include "dlsym.s"
diff --git a/libc-top-half/musl/src/ldso/tlsdesc.c b/libc-top-half/musl/src/ldso/tlsdesc.c
new file mode 100644
index 0000000..49a1f18
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/tlsdesc.c
@@ -0,0 +1,9 @@
+#include <stddef.h>
+#include <dynlink.h>
+
+ptrdiff_t __tlsdesc_static()
+{
+ return 0;
+}
+
+weak_alias(__tlsdesc_static, __tlsdesc_dynamic);
diff --git a/libc-top-half/musl/src/ldso/x32/dlsym.s b/libc-top-half/musl/src/ldso/x32/dlsym.s
new file mode 100644
index 0000000..d840b95
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/x32/dlsym.s
@@ -0,0 +1,7 @@
+.text
+.global dlsym
+.hidden __dlsym
+.type dlsym,@function
+dlsym:
+ mov (%rsp),%rdx
+ jmp __dlsym
diff --git a/libc-top-half/musl/src/ldso/x86_64/dlsym.s b/libc-top-half/musl/src/ldso/x86_64/dlsym.s
new file mode 100644
index 0000000..d840b95
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/x86_64/dlsym.s
@@ -0,0 +1,7 @@
+.text
+.global dlsym
+.hidden __dlsym
+.type dlsym,@function
+dlsym:
+ mov (%rsp),%rdx
+ jmp __dlsym
diff --git a/libc-top-half/musl/src/ldso/x86_64/tlsdesc.s b/libc-top-half/musl/src/ldso/x86_64/tlsdesc.s
new file mode 100644
index 0000000..e08f1d7
--- /dev/null
+++ b/libc-top-half/musl/src/ldso/x86_64/tlsdesc.s
@@ -0,0 +1,23 @@
+.text
+.global __tlsdesc_static
+.hidden __tlsdesc_static
+.type __tlsdesc_static,@function
+__tlsdesc_static:
+ mov 8(%rax),%rax
+ ret
+
+.global __tlsdesc_dynamic
+.hidden __tlsdesc_dynamic
+.type __tlsdesc_dynamic,@function
+__tlsdesc_dynamic:
+ mov 8(%rax),%rax
+ push %rdx
+ mov %fs:8,%rdx
+ push %rcx
+ mov (%rax),%rcx
+ mov 8(%rax),%rax
+ add (%rdx,%rcx,8),%rax
+ pop %rcx
+ sub %fs:0,%rax
+ pop %rdx
+ ret
diff --git a/libc-top-half/musl/src/legacy/cuserid.c b/libc-top-half/musl/src/legacy/cuserid.c
new file mode 100644
index 0000000..dcaf73d
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/cuserid.c
@@ -0,0 +1,22 @@
+#define _GNU_SOURCE
+#include <pwd.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+
+char *cuserid(char *buf)
+{
+ static char usridbuf[L_cuserid];
+ struct passwd pw, *ppw;
+ long pwb[256];
+ if (buf) *buf = 0;
+ getpwuid_r(geteuid(), &pw, (void *)pwb, sizeof pwb, &ppw);
+ if (!ppw)
+ return buf;
+ size_t len = strnlen(pw.pw_name, L_cuserid);
+ if (len == L_cuserid)
+ return buf;
+ if (!buf) buf = usridbuf;
+ memcpy(buf, pw.pw_name, len+1);
+ return buf;
+}
diff --git a/libc-top-half/musl/src/legacy/daemon.c b/libc-top-half/musl/src/legacy/daemon.c
new file mode 100644
index 0000000..1568b1d
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/daemon.c
@@ -0,0 +1,33 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include <unistd.h>
+
+int daemon(int nochdir, int noclose)
+{
+ if (!nochdir && chdir("/"))
+ return -1;
+ if (!noclose) {
+ int fd, failed = 0;
+ if ((fd = open("/dev/null", O_RDWR)) < 0) return -1;
+ if (dup2(fd, 0) < 0 || dup2(fd, 1) < 0 || dup2(fd, 2) < 0)
+ failed++;
+ if (fd > 2) close(fd);
+ if (failed) return -1;
+ }
+
+ switch(fork()) {
+ case 0: break;
+ case -1: return -1;
+ default: _exit(0);
+ }
+
+ if (setsid() < 0) return -1;
+
+ switch(fork()) {
+ case 0: break;
+ case -1: return -1;
+ default: _exit(0);
+ }
+
+ return 0;
+}
diff --git a/libc-top-half/musl/src/legacy/err.c b/libc-top-half/musl/src/legacy/err.c
new file mode 100644
index 0000000..0d6ab52
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/err.c
@@ -0,0 +1,67 @@
+#include <err.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+extern char *__progname;
+
+void vwarn(const char *fmt, va_list ap)
+{
+ fprintf (stderr, "%s: ", __progname);
+ if (fmt) {
+ vfprintf(stderr, fmt, ap);
+ fputs (": ", stderr);
+ }
+ perror(0);
+}
+
+void vwarnx(const char *fmt, va_list ap)
+{
+ fprintf (stderr, "%s: ", __progname);
+ if (fmt) vfprintf(stderr, fmt, ap);
+ putc('\n', stderr);
+}
+
+_Noreturn void verr(int status, const char *fmt, va_list ap)
+{
+ vwarn(fmt, ap);
+ exit(status);
+}
+
+_Noreturn void verrx(int status, const char *fmt, va_list ap)
+{
+ vwarnx(fmt, ap);
+ exit(status);
+}
+
+void warn(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ vwarn(fmt, ap);
+ va_end(ap);
+}
+
+void warnx(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ vwarnx(fmt, ap);
+ va_end(ap);
+}
+
+_Noreturn void err(int status, const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ verr(status, fmt, ap);
+ va_end(ap);
+}
+
+_Noreturn void errx(int status, const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ verrx(status, fmt, ap);
+ va_end(ap);
+}
diff --git a/libc-top-half/musl/src/legacy/euidaccess.c b/libc-top-half/musl/src/legacy/euidaccess.c
new file mode 100644
index 0000000..6e1f398
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/euidaccess.c
@@ -0,0 +1,10 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <fcntl.h>
+
+int euidaccess(const char *filename, int amode)
+{
+ return faccessat(AT_FDCWD, filename, amode, AT_EACCESS);
+}
+
+weak_alias(euidaccess, eaccess);
diff --git a/libc-top-half/musl/src/legacy/ftw.c b/libc-top-half/musl/src/legacy/ftw.c
new file mode 100644
index 0000000..506bd29
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/ftw.c
@@ -0,0 +1,11 @@
+#include <ftw.h>
+
+int ftw(const char *path, int (*fn)(const char *, const struct stat *, int), int fd_limit)
+{
+ /* The following cast assumes that calling a function with one
+ * argument more than it needs behaves as expected. This is
+ * actually undefined, but works on all real-world machines. */
+ return nftw(path, (int (*)())fn, fd_limit, FTW_PHYS);
+}
+
+weak_alias(ftw, ftw64);
diff --git a/libc-top-half/musl/src/legacy/futimes.c b/libc-top-half/musl/src/legacy/futimes.c
new file mode 100644
index 0000000..1c19eb1
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/futimes.c
@@ -0,0 +1,14 @@
+#define _GNU_SOURCE
+#include <sys/stat.h>
+#include <sys/time.h>
+
+int futimes(int fd, const struct timeval tv[2])
+{
+ struct timespec times[2];
+ if (!tv) return futimens(fd, 0);
+ times[0].tv_sec = tv[0].tv_sec;
+ times[0].tv_nsec = tv[0].tv_usec * 1000;
+ times[1].tv_sec = tv[1].tv_sec;
+ times[1].tv_nsec = tv[1].tv_usec * 1000;
+ return futimens(fd, times);
+}
diff --git a/libc-top-half/musl/src/legacy/getdtablesize.c b/libc-top-half/musl/src/legacy/getdtablesize.c
new file mode 100644
index 0000000..b30c193
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/getdtablesize.c
@@ -0,0 +1,11 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <limits.h>
+#include <sys/resource.h>
+
+int getdtablesize(void)
+{
+ struct rlimit rl;
+ getrlimit(RLIMIT_NOFILE, &rl);
+ return rl.rlim_cur < INT_MAX ? rl.rlim_cur : INT_MAX;
+}
diff --git a/libc-top-half/musl/src/legacy/getloadavg.c b/libc-top-half/musl/src/legacy/getloadavg.c
new file mode 100644
index 0000000..ff06de0
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/getloadavg.c
@@ -0,0 +1,14 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <sys/sysinfo.h>
+
+int getloadavg(double *a, int n)
+{
+ struct sysinfo si;
+ if (n <= 0) return n ? -1 : 0;
+ sysinfo(&si);
+ if (n > 3) n = 3;
+ for (int i=0; i<n; i++)
+ a[i] = 1.0/(1<<SI_LOAD_SHIFT) * si.loads[i];
+ return n;
+}
diff --git a/libc-top-half/musl/src/legacy/getpagesize.c b/libc-top-half/musl/src/legacy/getpagesize.c
new file mode 100644
index 0000000..0fc29ff
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/getpagesize.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include "libc.h"
+
+int getpagesize(void)
+{
+ return PAGE_SIZE;
+}
diff --git a/libc-top-half/musl/src/legacy/getpass.c b/libc-top-half/musl/src/legacy/getpass.c
new file mode 100644
index 0000000..d51286c
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/getpass.c
@@ -0,0 +1,40 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <termios.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+
+char *getpass(const char *prompt)
+{
+ int fd;
+ struct termios s, t;
+ ssize_t l;
+ static char password[128];
+
+ if ((fd = open("/dev/tty", O_RDWR|O_NOCTTY|O_CLOEXEC)) < 0) return 0;
+
+ tcgetattr(fd, &t);
+ s = t;
+ t.c_lflag &= ~(ECHO|ISIG);
+ t.c_lflag |= ICANON;
+ t.c_iflag &= ~(INLCR|IGNCR);
+ t.c_iflag |= ICRNL;
+ tcsetattr(fd, TCSAFLUSH, &t);
+ tcdrain(fd);
+
+ dprintf(fd, "%s", prompt);
+
+ l = read(fd, password, sizeof password);
+ if (l >= 0) {
+ if (l > 0 && password[l-1] == '\n' || l==sizeof password) l--;
+ password[l] = 0;
+ }
+
+ tcsetattr(fd, TCSAFLUSH, &s);
+
+ dprintf(fd, "\n");
+ close(fd);
+
+ return l<0 ? 0 : password;
+}
diff --git a/libc-top-half/musl/src/legacy/getusershell.c b/libc-top-half/musl/src/legacy/getusershell.c
new file mode 100644
index 0000000..5fecdec
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/getusershell.c
@@ -0,0 +1,32 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <unistd.h>
+
+static const char defshells[] = "/bin/sh\n/bin/csh\n";
+
+static char *line;
+static size_t linesize;
+static FILE *f;
+
+void endusershell(void)
+{
+ if (f) fclose(f);
+ f = 0;
+}
+
+void setusershell(void)
+{
+ if (!f) f = fopen("/etc/shells", "rbe");
+ if (!f) f = fmemopen((void *)defshells, sizeof defshells - 1, "rb");
+}
+
+char *getusershell(void)
+{
+ ssize_t l;
+ if (!f) setusershell();
+ if (!f) return 0;
+ l = getline(&line, &linesize, f);
+ if (l <= 0) return 0;
+ if (line[l-1]=='\n') line[l-1]=0;
+ return line;
+}
diff --git a/libc-top-half/musl/src/legacy/isastream.c b/libc-top-half/musl/src/legacy/isastream.c
new file mode 100644
index 0000000..4dafdb0
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/isastream.c
@@ -0,0 +1,7 @@
+#include <stropts.h>
+#include <fcntl.h>
+
+int isastream(int fd)
+{
+ return fcntl(fd, F_GETFD) < 0 ? -1 : 0;
+}
diff --git a/libc-top-half/musl/src/legacy/lutimes.c b/libc-top-half/musl/src/legacy/lutimes.c
new file mode 100644
index 0000000..dd46592
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/lutimes.c
@@ -0,0 +1,16 @@
+#define _GNU_SOURCE
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <fcntl.h>
+
+int lutimes(const char *filename, const struct timeval tv[2])
+{
+ struct timespec times[2];
+ if (tv) {
+ times[0].tv_sec = tv[0].tv_sec;
+ times[0].tv_nsec = tv[0].tv_usec * 1000;
+ times[1].tv_sec = tv[1].tv_sec;
+ times[1].tv_nsec = tv[1].tv_usec * 1000;
+ }
+ return utimensat(AT_FDCWD, filename, tv ? times : 0, AT_SYMLINK_NOFOLLOW);
+}
diff --git a/libc-top-half/musl/src/legacy/ulimit.c b/libc-top-half/musl/src/legacy/ulimit.c
new file mode 100644
index 0000000..1f59e8e
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/ulimit.c
@@ -0,0 +1,19 @@
+#include <sys/resource.h>
+#include <ulimit.h>
+#include <stdarg.h>
+
+long ulimit(int cmd, ...)
+{
+ struct rlimit rl;
+ getrlimit(RLIMIT_FSIZE, &rl);
+ if (cmd == UL_SETFSIZE) {
+ long val;
+ va_list ap;
+ va_start(ap, cmd);
+ val = va_arg(ap, long);
+ va_end(ap);
+ rl.rlim_cur = 512ULL * val;
+ if (setrlimit(RLIMIT_FSIZE, &rl)) return -1;
+ }
+ return rl.rlim_cur / 512;
+}
diff --git a/libc-top-half/musl/src/legacy/utmpx.c b/libc-top-half/musl/src/legacy/utmpx.c
new file mode 100644
index 0000000..7aa65da
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/utmpx.c
@@ -0,0 +1,52 @@
+#define _GNU_SOURCE
+#include <utmpx.h>
+#include <stddef.h>
+#include <errno.h>
+
+void endutxent(void)
+{
+}
+
+void setutxent(void)
+{
+}
+
+struct utmpx *getutxent(void)
+{
+ return NULL;
+}
+
+struct utmpx *getutxid(const struct utmpx *ut)
+{
+ return NULL;
+}
+
+struct utmpx *getutxline(const struct utmpx *ut)
+{
+ return NULL;
+}
+
+struct utmpx *pututxline(const struct utmpx *ut)
+{
+ return NULL;
+}
+
+void updwtmpx(const char *f, const struct utmpx *u)
+{
+}
+
+static int __utmpxname(const char *f)
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+weak_alias(endutxent, endutent);
+weak_alias(setutxent, setutent);
+weak_alias(getutxent, getutent);
+weak_alias(getutxid, getutid);
+weak_alias(getutxline, getutline);
+weak_alias(pututxline, pututline);
+weak_alias(updwtmpx, updwtmp);
+weak_alias(__utmpxname, utmpname);
+weak_alias(__utmpxname, utmpxname);
diff --git a/libc-top-half/musl/src/legacy/valloc.c b/libc-top-half/musl/src/legacy/valloc.c
new file mode 100644
index 0000000..5af2256
--- /dev/null
+++ b/libc-top-half/musl/src/legacy/valloc.c
@@ -0,0 +1,8 @@
+#define _BSD_SOURCE
+#include <stdlib.h>
+#include "libc.h"
+
+void *valloc(size_t size)
+{
+ return memalign(PAGE_SIZE, size);
+}
diff --git a/libc-top-half/musl/src/linux/adjtime.c b/libc-top-half/musl/src/linux/adjtime.c
new file mode 100644
index 0000000..5a707f2
--- /dev/null
+++ b/libc-top-half/musl/src/linux/adjtime.c
@@ -0,0 +1,27 @@
+#define _GNU_SOURCE
+#include <sys/time.h>
+#include <sys/timex.h>
+#include <errno.h>
+#include "syscall.h"
+
+int adjtime(const struct timeval *in, struct timeval *out)
+{
+ struct timex tx = { 0 };
+ if (in) {
+ if (in->tv_sec > 1000 || in->tv_usec > 1000000000) {
+ errno = EINVAL;
+ return -1;
+ }
+ tx.offset = in->tv_sec*1000000 + in->tv_usec;
+ tx.modes = ADJ_OFFSET_SINGLESHOT;
+ }
+ if (adjtimex(&tx) < 0) return -1;
+ if (out) {
+ out->tv_sec = tx.offset / 1000000;
+ if ((out->tv_usec = tx.offset % 1000000) < 0) {
+ out->tv_sec--;
+ out->tv_usec += 1000000;
+ }
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/linux/adjtimex.c b/libc-top-half/musl/src/linux/adjtimex.c
new file mode 100644
index 0000000..e9d727c
--- /dev/null
+++ b/libc-top-half/musl/src/linux/adjtimex.c
@@ -0,0 +1,7 @@
+#include <sys/timex.h>
+#include <time.h>
+
+int adjtimex(struct timex *tx)
+{
+ return clock_adjtime(CLOCK_REALTIME, tx);
+}
diff --git a/libc-top-half/musl/src/linux/arch_prctl.c b/libc-top-half/musl/src/linux/arch_prctl.c
new file mode 100644
index 0000000..9460365
--- /dev/null
+++ b/libc-top-half/musl/src/linux/arch_prctl.c
@@ -0,0 +1,7 @@
+#include "syscall.h"
+#ifdef SYS_arch_prctl
+int arch_prctl(int code, unsigned long addr)
+{
+ return syscall(SYS_arch_prctl, code, addr);
+}
+#endif
diff --git a/libc-top-half/musl/src/linux/brk.c b/libc-top-half/musl/src/linux/brk.c
new file mode 100644
index 0000000..a6173e0
--- /dev/null
+++ b/libc-top-half/musl/src/linux/brk.c
@@ -0,0 +1,9 @@
+#define _BSD_SOURCE
+#include <unistd.h>
+#include <errno.h>
+#include "syscall.h"
+
+int brk(void *end)
+{
+ return __syscall_ret(-ENOMEM);
+}
diff --git a/libc-top-half/musl/src/linux/cache.c b/libc-top-half/musl/src/linux/cache.c
new file mode 100644
index 0000000..0eb051c
--- /dev/null
+++ b/libc-top-half/musl/src/linux/cache.c
@@ -0,0 +1,50 @@
+#include <errno.h>
+#include "syscall.h"
+#include "atomic.h"
+
+#ifdef SYS_cacheflush
+int _flush_cache(void *addr, int len, int op)
+{
+ return syscall(SYS_cacheflush, addr, len, op);
+}
+weak_alias(_flush_cache, cacheflush);
+#endif
+
+#ifdef SYS_cachectl
+int __cachectl(void *addr, int len, int op)
+{
+ return syscall(SYS_cachectl, addr, len, op);
+}
+weak_alias(__cachectl, cachectl);
+#endif
+
+#ifdef SYS_riscv_flush_icache
+
+#define VDSO_FLUSH_ICACHE_SYM "__vdso_flush_icache"
+#define VDSO_FLUSH_ICACHE_VER "LINUX_4.5"
+
+static void *volatile vdso_func;
+
+static int flush_icache_init(void *start, void *end, unsigned long int flags)
+{
+ void *p = __vdsosym(VDSO_FLUSH_ICACHE_VER, VDSO_FLUSH_ICACHE_SYM);
+ int (*f)(void *, void *, unsigned long int) =
+ (int (*)(void *, void *, unsigned long int))p;
+ a_cas_p(&vdso_func, (void *)flush_icache_init, p);
+ return f ? f(start, end, flags) : -ENOSYS;
+}
+
+static void *volatile vdso_func = (void *)flush_icache_init;
+
+int __riscv_flush_icache(void *start, void *end, unsigned long int flags)
+{
+ int (*f)(void *, void *, unsigned long int) =
+ (int (*)(void *, void *, unsigned long int))vdso_func;
+ if (f) {
+ int r = f(start, end, flags);
+ if (!r) return r;
+ if (r != -ENOSYS) return __syscall_ret(r);
+ }
+}
+weak_alias(__riscv_flush_icache, riscv_flush_icache);
+#endif
diff --git a/libc-top-half/musl/src/linux/cap.c b/libc-top-half/musl/src/linux/cap.c
new file mode 100644
index 0000000..8d035e0
--- /dev/null
+++ b/libc-top-half/musl/src/linux/cap.c
@@ -0,0 +1,11 @@
+#include "syscall.h"
+
+int capset(void *a, void *b)
+{
+ return syscall(SYS_capset, a, b);
+}
+
+int capget(void *a, void *b)
+{
+ return syscall(SYS_capget, a, b);
+}
diff --git a/libc-top-half/musl/src/linux/chroot.c b/libc-top-half/musl/src/linux/chroot.c
new file mode 100644
index 0000000..0e69f14
--- /dev/null
+++ b/libc-top-half/musl/src/linux/chroot.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include "syscall.h"
+
+int chroot(const char *path)
+{
+ return syscall(SYS_chroot, path);
+}
diff --git a/libc-top-half/musl/src/linux/clock_adjtime.c b/libc-top-half/musl/src/linux/clock_adjtime.c
new file mode 100644
index 0000000..d4d03d2
--- /dev/null
+++ b/libc-top-half/musl/src/linux/clock_adjtime.c
@@ -0,0 +1,151 @@
+#include <sys/timex.h>
+#include <time.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+
+struct ktimex64 {
+ unsigned modes;
+ int :32;
+ long long offset, freq, maxerror, esterror;
+ int status;
+ int :32;
+ long long constant, precision, tolerance;
+ long long time_sec, time_usec;
+ long long tick, ppsfreq, jitter;
+ int shift;
+ int :32;
+ long long stabil, jitcnt, calcnt, errcnt, stbcnt;
+ int tai;
+ int __padding[11];
+};
+
+struct ktimex {
+ unsigned modes;
+ long offset, freq, maxerror, esterror;
+ int status;
+ long constant, precision, tolerance;
+ long time_sec, time_usec;
+ long tick, ppsfreq, jitter;
+ int shift;
+ long stabil, jitcnt, calcnt, errcnt, stbcnt;
+ int tai;
+ int __padding[11];
+};
+
+int clock_adjtime (clockid_t clock_id, struct timex *utx)
+{
+ int r = -ENOSYS;
+#ifdef SYS_clock_adjtime64
+ struct ktimex64 ktx = {
+ .modes = utx->modes,
+ .offset = utx->offset,
+ .freq = utx->freq,
+ .maxerror = utx->maxerror,
+ .esterror = utx->esterror,
+ .status = utx->status,
+ .constant = utx->constant,
+ .precision = utx->precision,
+ .tolerance = utx->tolerance,
+ .time_sec = utx->time.tv_sec,
+ .time_usec = utx->time.tv_usec,
+ .tick = utx->tick,
+ .ppsfreq = utx->ppsfreq,
+ .jitter = utx->jitter,
+ .shift = utx->shift,
+ .stabil = utx->stabil,
+ .jitcnt = utx->jitcnt,
+ .calcnt = utx->calcnt,
+ .errcnt = utx->errcnt,
+ .stbcnt = utx->stbcnt,
+ .tai = utx->tai,
+ };
+ r = __syscall(SYS_clock_adjtime64, clock_id, &ktx);
+ if (r>=0) {
+ utx->modes = ktx.modes;
+ utx->offset = ktx.offset;
+ utx->freq = ktx.freq;
+ utx->maxerror = ktx.maxerror;
+ utx->esterror = ktx.esterror;
+ utx->status = ktx.status;
+ utx->constant = ktx.constant;
+ utx->precision = ktx.precision;
+ utx->tolerance = ktx.tolerance;
+ utx->time.tv_sec = ktx.time_sec;
+ utx->time.tv_usec = ktx.time_usec;
+ utx->tick = ktx.tick;
+ utx->ppsfreq = ktx.ppsfreq;
+ utx->jitter = ktx.jitter;
+ utx->shift = ktx.shift;
+ utx->stabil = ktx.stabil;
+ utx->jitcnt = ktx.jitcnt;
+ utx->calcnt = ktx.calcnt;
+ utx->errcnt = ktx.errcnt;
+ utx->stbcnt = ktx.stbcnt;
+ utx->tai = ktx.tai;
+ }
+ if (SYS_clock_adjtime == SYS_clock_adjtime64 || r!=-ENOSYS)
+ return __syscall_ret(r);
+ if ((utx->modes & ADJ_SETOFFSET) && !IS32BIT(utx->time.tv_sec))
+ return __syscall_ret(-ENOTSUP);
+#endif
+ if (sizeof(time_t) > sizeof(long)) {
+ struct ktimex ktx = {
+ .modes = utx->modes,
+ .offset = utx->offset,
+ .freq = utx->freq,
+ .maxerror = utx->maxerror,
+ .esterror = utx->esterror,
+ .status = utx->status,
+ .constant = utx->constant,
+ .precision = utx->precision,
+ .tolerance = utx->tolerance,
+ .time_sec = utx->time.tv_sec,
+ .time_usec = utx->time.tv_usec,
+ .tick = utx->tick,
+ .ppsfreq = utx->ppsfreq,
+ .jitter = utx->jitter,
+ .shift = utx->shift,
+ .stabil = utx->stabil,
+ .jitcnt = utx->jitcnt,
+ .calcnt = utx->calcnt,
+ .errcnt = utx->errcnt,
+ .stbcnt = utx->stbcnt,
+ .tai = utx->tai,
+ };
+#ifdef SYS_adjtimex
+ if (clock_id==CLOCK_REALTIME) r = __syscall(SYS_adjtimex, &ktx);
+ else
+#endif
+ r = __syscall(SYS_clock_adjtime, clock_id, &ktx);
+ if (r>=0) {
+ utx->modes = ktx.modes;
+ utx->offset = ktx.offset;
+ utx->freq = ktx.freq;
+ utx->maxerror = ktx.maxerror;
+ utx->esterror = ktx.esterror;
+ utx->status = ktx.status;
+ utx->constant = ktx.constant;
+ utx->precision = ktx.precision;
+ utx->tolerance = ktx.tolerance;
+ utx->time.tv_sec = ktx.time_sec;
+ utx->time.tv_usec = ktx.time_usec;
+ utx->tick = ktx.tick;
+ utx->ppsfreq = ktx.ppsfreq;
+ utx->jitter = ktx.jitter;
+ utx->shift = ktx.shift;
+ utx->stabil = ktx.stabil;
+ utx->jitcnt = ktx.jitcnt;
+ utx->calcnt = ktx.calcnt;
+ utx->errcnt = ktx.errcnt;
+ utx->stbcnt = ktx.stbcnt;
+ utx->tai = ktx.tai;
+ }
+ return __syscall_ret(r);
+ }
+#ifdef SYS_adjtimex
+ if (clock_id==CLOCK_REALTIME) return syscall(SYS_adjtimex, utx);
+#endif
+ return syscall(SYS_clock_adjtime, clock_id, utx);
+}
diff --git a/libc-top-half/musl/src/linux/clone.c b/libc-top-half/musl/src/linux/clone.c
new file mode 100644
index 0000000..8c1af7d
--- /dev/null
+++ b/libc-top-half/musl/src/linux/clone.c
@@ -0,0 +1,21 @@
+#define _GNU_SOURCE
+#include <stdarg.h>
+#include <unistd.h>
+#include <sched.h>
+#include "pthread_impl.h"
+#include "syscall.h"
+
+int clone(int (*func)(void *), void *stack, int flags, void *arg, ...)
+{
+ va_list ap;
+ pid_t *ptid, *ctid;
+ void *tls;
+
+ va_start(ap, arg);
+ ptid = va_arg(ap, pid_t *);
+ tls = va_arg(ap, void *);
+ ctid = va_arg(ap, pid_t *);
+ va_end(ap);
+
+ return __syscall_ret(__clone(func, stack, flags, arg, ptid, tls, ctid));
+}
diff --git a/libc-top-half/musl/src/linux/copy_file_range.c b/libc-top-half/musl/src/linux/copy_file_range.c
new file mode 100644
index 0000000..dd4b133
--- /dev/null
+++ b/libc-top-half/musl/src/linux/copy_file_range.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include "syscall.h"
+
+ssize_t copy_file_range(int fd_in, off_t *off_in, int fd_out, off_t *off_out, size_t len, unsigned flags)
+{
+ return syscall(SYS_copy_file_range, fd_in, off_in, fd_out, off_out, len, flags);
+}
diff --git a/libc-top-half/musl/src/linux/epoll.c b/libc-top-half/musl/src/linux/epoll.c
new file mode 100644
index 0000000..93baa81
--- /dev/null
+++ b/libc-top-half/musl/src/linux/epoll.c
@@ -0,0 +1,37 @@
+#include <sys/epoll.h>
+#include <signal.h>
+#include <errno.h>
+#include "syscall.h"
+
+int epoll_create(int size)
+{
+ return epoll_create1(0);
+}
+
+int epoll_create1(int flags)
+{
+ int r = __syscall(SYS_epoll_create1, flags);
+#ifdef SYS_epoll_create
+ if (r==-ENOSYS && !flags) r = __syscall(SYS_epoll_create, 1);
+#endif
+ return __syscall_ret(r);
+}
+
+int epoll_ctl(int fd, int op, int fd2, struct epoll_event *ev)
+{
+ return syscall(SYS_epoll_ctl, fd, op, fd2, ev);
+}
+
+int epoll_pwait(int fd, struct epoll_event *ev, int cnt, int to, const sigset_t *sigs)
+{
+ int r = __syscall_cp(SYS_epoll_pwait, fd, ev, cnt, to, sigs, _NSIG/8);
+#ifdef SYS_epoll_wait
+ if (r==-ENOSYS && !sigs) r = __syscall_cp(SYS_epoll_wait, fd, ev, cnt, to);
+#endif
+ return __syscall_ret(r);
+}
+
+int epoll_wait(int fd, struct epoll_event *ev, int cnt, int to)
+{
+ return epoll_pwait(fd, ev, cnt, to, 0);
+}
diff --git a/libc-top-half/musl/src/linux/eventfd.c b/libc-top-half/musl/src/linux/eventfd.c
new file mode 100644
index 0000000..68e489c
--- /dev/null
+++ b/libc-top-half/musl/src/linux/eventfd.c
@@ -0,0 +1,23 @@
+#include <sys/eventfd.h>
+#include <unistd.h>
+#include <errno.h>
+#include "syscall.h"
+
+int eventfd(unsigned int count, int flags)
+{
+ int r = __syscall(SYS_eventfd2, count, flags);
+#ifdef SYS_eventfd
+ if (r==-ENOSYS && !flags) r = __syscall(SYS_eventfd, count);
+#endif
+ return __syscall_ret(r);
+}
+
+int eventfd_read(int fd, eventfd_t *value)
+{
+ return (sizeof(*value) == read(fd, value, sizeof(*value))) ? 0 : -1;
+}
+
+int eventfd_write(int fd, eventfd_t value)
+{
+ return (sizeof(value) == write(fd, &value, sizeof(value))) ? 0 : -1;
+}
diff --git a/libc-top-half/musl/src/linux/fallocate.c b/libc-top-half/musl/src/linux/fallocate.c
new file mode 100644
index 0000000..7d68bc8
--- /dev/null
+++ b/libc-top-half/musl/src/linux/fallocate.c
@@ -0,0 +1,12 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include "syscall.h"
+
+int fallocate(int fd, int mode, off_t base, off_t len)
+{
+ return syscall(SYS_fallocate, fd, mode, __SYSCALL_LL_E(base),
+ __SYSCALL_LL_E(len));
+}
+
+#undef fallocate64
+weak_alias(fallocate, fallocate64);
diff --git a/libc-top-half/musl/src/linux/fanotify.c b/libc-top-half/musl/src/linux/fanotify.c
new file mode 100644
index 0000000..c6211af
--- /dev/null
+++ b/libc-top-half/musl/src/linux/fanotify.c
@@ -0,0 +1,14 @@
+#include "syscall.h"
+#include <sys/fanotify.h>
+
+int fanotify_init(unsigned flags, unsigned event_f_flags)
+{
+ return syscall(SYS_fanotify_init, flags, event_f_flags);
+}
+
+int fanotify_mark(int fanotify_fd, unsigned flags, unsigned long long mask,
+ int dfd, const char *pathname)
+{
+ return syscall(SYS_fanotify_mark, fanotify_fd, flags, __SYSCALL_LL_E(mask), dfd, pathname);
+}
+
diff --git a/libc-top-half/musl/src/linux/flock.c b/libc-top-half/musl/src/linux/flock.c
new file mode 100644
index 0000000..87aa5cf
--- /dev/null
+++ b/libc-top-half/musl/src/linux/flock.c
@@ -0,0 +1,7 @@
+#include <sys/file.h>
+#include "syscall.h"
+
+int flock(int fd, int op)
+{
+ return syscall(SYS_flock, fd, op);
+}
diff --git a/libc-top-half/musl/src/linux/getdents.c b/libc-top-half/musl/src/linux/getdents.c
new file mode 100644
index 0000000..796c1e5
--- /dev/null
+++ b/libc-top-half/musl/src/linux/getdents.c
@@ -0,0 +1,12 @@
+#define _BSD_SOURCE
+#include <dirent.h>
+#include <limits.h>
+#include "syscall.h"
+
+int getdents(int fd, struct dirent *buf, size_t len)
+{
+ if (len>INT_MAX) len = INT_MAX;
+ return syscall(SYS_getdents, fd, buf, len);
+}
+
+weak_alias(getdents, getdents64);
diff --git a/libc-top-half/musl/src/linux/getrandom.c b/libc-top-half/musl/src/linux/getrandom.c
new file mode 100644
index 0000000..6cc6f6b
--- /dev/null
+++ b/libc-top-half/musl/src/linux/getrandom.c
@@ -0,0 +1,7 @@
+#include <sys/random.h>
+#include "syscall.h"
+
+ssize_t getrandom(void *buf, size_t buflen, unsigned flags)
+{
+ return syscall_cp(SYS_getrandom, buf, buflen, flags);
+}
diff --git a/libc-top-half/musl/src/linux/gettid.c b/libc-top-half/musl/src/linux/gettid.c
new file mode 100644
index 0000000..7076713
--- /dev/null
+++ b/libc-top-half/musl/src/linux/gettid.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include "pthread_impl.h"
+
+pid_t gettid(void)
+{
+ return __pthread_self()->tid;
+}
diff --git a/libc-top-half/musl/src/linux/inotify.c b/libc-top-half/musl/src/linux/inotify.c
new file mode 100644
index 0000000..df5e48b
--- /dev/null
+++ b/libc-top-half/musl/src/linux/inotify.c
@@ -0,0 +1,26 @@
+#include <sys/inotify.h>
+#include <errno.h>
+#include "syscall.h"
+
+int inotify_init()
+{
+ return inotify_init1(0);
+}
+int inotify_init1(int flags)
+{
+ int r = __syscall(SYS_inotify_init1, flags);
+#ifdef SYS_inotify_init
+ if (r==-ENOSYS && !flags) r = __syscall(SYS_inotify_init);
+#endif
+ return __syscall_ret(r);
+}
+
+int inotify_add_watch(int fd, const char *pathname, uint32_t mask)
+{
+ return syscall(SYS_inotify_add_watch, fd, pathname, mask);
+}
+
+int inotify_rm_watch(int fd, int wd)
+{
+ return syscall(SYS_inotify_rm_watch, fd, wd);
+}
diff --git a/libc-top-half/musl/src/linux/ioperm.c b/libc-top-half/musl/src/linux/ioperm.c
new file mode 100644
index 0000000..08c6d8b
--- /dev/null
+++ b/libc-top-half/musl/src/linux/ioperm.c
@@ -0,0 +1,10 @@
+#include "syscall.h"
+
+#ifdef SYS_ioperm
+#include <sys/io.h>
+
+int ioperm(unsigned long from, unsigned long num, int turn_on)
+{
+ return syscall(SYS_ioperm, from, num, turn_on);
+}
+#endif
diff --git a/libc-top-half/musl/src/linux/iopl.c b/libc-top-half/musl/src/linux/iopl.c
new file mode 100644
index 0000000..835d3d4
--- /dev/null
+++ b/libc-top-half/musl/src/linux/iopl.c
@@ -0,0 +1,10 @@
+#include "syscall.h"
+
+#ifdef SYS_iopl
+#include <sys/io.h>
+
+int iopl(int level)
+{
+ return syscall(SYS_iopl, level);
+}
+#endif
diff --git a/libc-top-half/musl/src/linux/klogctl.c b/libc-top-half/musl/src/linux/klogctl.c
new file mode 100644
index 0000000..8102ee6
--- /dev/null
+++ b/libc-top-half/musl/src/linux/klogctl.c
@@ -0,0 +1,7 @@
+#include <sys/klog.h>
+#include "syscall.h"
+
+int klogctl (int type, char *buf, int len)
+{
+ return syscall(SYS_syslog, type, buf, len);
+}
diff --git a/libc-top-half/musl/src/linux/membarrier.c b/libc-top-half/musl/src/linux/membarrier.c
new file mode 100644
index 0000000..343f736
--- /dev/null
+++ b/libc-top-half/musl/src/linux/membarrier.c
@@ -0,0 +1,72 @@
+#include <sys/membarrier.h>
+#include <semaphore.h>
+#include <signal.h>
+#include <string.h>
+#include "pthread_impl.h"
+#include "syscall.h"
+
+static void dummy_0(void)
+{
+}
+
+weak_alias(dummy_0, __tl_lock);
+weak_alias(dummy_0, __tl_unlock);
+
+static sem_t barrier_sem;
+
+static void bcast_barrier(int s)
+{
+ sem_post(&barrier_sem);
+}
+
+int __membarrier(int cmd, int flags)
+{
+ int r = __syscall(SYS_membarrier, cmd, flags);
+ /* Emulate the private expedited command, which is needed by the
+ * dynamic linker for installation of dynamic TLS, for older
+ * kernels that lack the syscall. Unlike the syscall, this only
+ * synchronizes with threads of the process, not other processes
+ * sharing the VM, but such sharing is not a supported usage
+ * anyway. */
+ if (r && cmd == MEMBARRIER_CMD_PRIVATE_EXPEDITED && !flags) {
+ pthread_t self=__pthread_self(), td;
+ sigset_t set;
+ __block_app_sigs(&set);
+ __tl_lock();
+ sem_init(&barrier_sem, 0, 0);
+ struct sigaction sa = {
+ .sa_flags = SA_RESTART,
+ .sa_handler = bcast_barrier
+ };
+ memset(&sa.sa_mask, -1, sizeof sa.sa_mask);
+ if (!__libc_sigaction(SIGSYNCCALL, &sa, 0)) {
+ for (td=self->next; td!=self; td=td->next)
+ __syscall(SYS_tkill, td->tid, SIGSYNCCALL);
+ for (td=self->next; td!=self; td=td->next)
+ sem_wait(&barrier_sem);
+ r = 0;
+ sa.sa_handler = SIG_IGN;
+ __libc_sigaction(SIGSYNCCALL, &sa, 0);
+ }
+ sem_destroy(&barrier_sem);
+ __tl_unlock();
+ __restore_sigs(&set);
+ }
+ return __syscall_ret(r);
+}
+
+void __membarrier_init(void)
+{
+ /* If membarrier is linked, attempt to pre-register to be able to use
+ * the private expedited command before the process becomes multi-
+ * threaded, since registering later has bad, potentially unbounded
+ * latency. This syscall should be essentially free, and it's arguably
+ * a mistake in the API design that registration was even required.
+ * For other commands, registration may impose some cost, so it's left
+ * to the application to do so if desired. Unfortunately this means
+ * library code initialized after the process becomes multi-threaded
+ * cannot use these features without accepting registration latency. */
+ __syscall(SYS_membarrier, MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0);
+}
+
+weak_alias(__membarrier, membarrier);
diff --git a/libc-top-half/musl/src/linux/memfd_create.c b/libc-top-half/musl/src/linux/memfd_create.c
new file mode 100644
index 0000000..1649fe5
--- /dev/null
+++ b/libc-top-half/musl/src/linux/memfd_create.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE 1
+#include <sys/mman.h>
+#include "syscall.h"
+
+int memfd_create(const char *name, unsigned flags)
+{
+ return syscall(SYS_memfd_create, name, flags);
+}
diff --git a/libc-top-half/musl/src/linux/mlock2.c b/libc-top-half/musl/src/linux/mlock2.c
new file mode 100644
index 0000000..1013274
--- /dev/null
+++ b/libc-top-half/musl/src/linux/mlock2.c
@@ -0,0 +1,10 @@
+#define _GNU_SOURCE 1
+#include <sys/mman.h>
+#include "syscall.h"
+
+int mlock2(const void *addr, size_t len, unsigned flags)
+{
+ if (flags == 0)
+ return mlock(addr, len);
+ return syscall(SYS_mlock2, addr, len, flags);
+}
diff --git a/libc-top-half/musl/src/linux/module.c b/libc-top-half/musl/src/linux/module.c
new file mode 100644
index 0000000..33f69a0
--- /dev/null
+++ b/libc-top-half/musl/src/linux/module.c
@@ -0,0 +1,11 @@
+#include "syscall.h"
+
+int init_module(void *a, unsigned long b, const char *c)
+{
+ return syscall(SYS_init_module, a, b, c);
+}
+
+int delete_module(const char *a, unsigned b)
+{
+ return syscall(SYS_delete_module, a, b);
+}
diff --git a/libc-top-half/musl/src/linux/mount.c b/libc-top-half/musl/src/linux/mount.c
new file mode 100644
index 0000000..34e11af
--- /dev/null
+++ b/libc-top-half/musl/src/linux/mount.c
@@ -0,0 +1,17 @@
+#include <sys/mount.h>
+#include "syscall.h"
+
+int mount(const char *special, const char *dir, const char *fstype, unsigned long flags, const void *data)
+{
+ return syscall(SYS_mount, special, dir, fstype, flags, data);
+}
+
+int umount(const char *special)
+{
+ return syscall(SYS_umount2, special, 0);
+}
+
+int umount2(const char *special, int flags)
+{
+ return syscall(SYS_umount2, special, flags);
+}
diff --git a/libc-top-half/musl/src/linux/name_to_handle_at.c b/libc-top-half/musl/src/linux/name_to_handle_at.c
new file mode 100644
index 0000000..cd4075b
--- /dev/null
+++ b/libc-top-half/musl/src/linux/name_to_handle_at.c
@@ -0,0 +1,10 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include "syscall.h"
+
+int name_to_handle_at(int dirfd, const char *pathname,
+ struct file_handle *handle, int *mount_id, int flags)
+{
+ return syscall(SYS_name_to_handle_at, dirfd,
+ pathname, handle, mount_id, flags);
+}
diff --git a/libc-top-half/musl/src/linux/open_by_handle_at.c b/libc-top-half/musl/src/linux/open_by_handle_at.c
new file mode 100644
index 0000000..1c9b6a2
--- /dev/null
+++ b/libc-top-half/musl/src/linux/open_by_handle_at.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include "syscall.h"
+
+int open_by_handle_at(int mount_fd, struct file_handle *handle, int flags)
+{
+ return syscall(SYS_open_by_handle_at, mount_fd, handle, flags);
+}
diff --git a/libc-top-half/musl/src/linux/personality.c b/libc-top-half/musl/src/linux/personality.c
new file mode 100644
index 0000000..e00cf79
--- /dev/null
+++ b/libc-top-half/musl/src/linux/personality.c
@@ -0,0 +1,8 @@
+#include <sys/personality.h>
+#include "syscall.h"
+#ifdef SYS_personality
+int personality(unsigned long persona)
+{
+ return syscall(SYS_personality, persona);
+}
+#endif
diff --git a/libc-top-half/musl/src/linux/pivot_root.c b/libc-top-half/musl/src/linux/pivot_root.c
new file mode 100644
index 0000000..17e70c9
--- /dev/null
+++ b/libc-top-half/musl/src/linux/pivot_root.c
@@ -0,0 +1,6 @@
+#include "syscall.h"
+
+int pivot_root(const char *new, const char *old)
+{
+ return syscall(SYS_pivot_root, new, old);
+}
diff --git a/libc-top-half/musl/src/linux/ppoll.c b/libc-top-half/musl/src/linux/ppoll.c
new file mode 100644
index 0000000..e614600
--- /dev/null
+++ b/libc-top-half/musl/src/linux/ppoll.c
@@ -0,0 +1,26 @@
+#define _GNU_SOURCE
+#include <poll.h>
+#include <signal.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
+
+int ppoll(struct pollfd *fds, nfds_t n, const struct timespec *to, const sigset_t *mask)
+{
+ time_t s = to ? to->tv_sec : 0;
+ long ns = to ? to->tv_nsec : 0;
+#ifdef SYS_ppoll_time64
+ int r = -ENOSYS;
+ if (SYS_ppoll == SYS_ppoll_time64 || !IS32BIT(s))
+ r = __syscall_cp(SYS_ppoll_time64, fds, n,
+ to ? ((long long[]){s, ns}) : 0,
+ mask, _NSIG/8);
+ if (SYS_ppoll == SYS_ppoll_time64 || r != -ENOSYS)
+ return __syscall_ret(r);
+ s = CLAMP(s);
+#endif
+ return syscall_cp(SYS_ppoll, fds, n,
+ to ? ((long[]){s, ns}) : 0, mask, _NSIG/8);
+}
diff --git a/libc-top-half/musl/src/linux/prctl.c b/libc-top-half/musl/src/linux/prctl.c
new file mode 100644
index 0000000..19f4267
--- /dev/null
+++ b/libc-top-half/musl/src/linux/prctl.c
@@ -0,0 +1,14 @@
+#include <sys/prctl.h>
+#include <stdarg.h>
+#include "syscall.h"
+
+int prctl(int op, ...)
+{
+ unsigned long x[4];
+ int i;
+ va_list ap;
+ va_start(ap, op);
+ for (i=0; i<4; i++) x[i] = va_arg(ap, unsigned long);
+ va_end(ap);
+ return syscall(SYS_prctl, op, x[0], x[1], x[2], x[3]);
+}
diff --git a/libc-top-half/musl/src/linux/prlimit.c b/libc-top-half/musl/src/linux/prlimit.c
new file mode 100644
index 0000000..3df9ffb
--- /dev/null
+++ b/libc-top-half/musl/src/linux/prlimit.c
@@ -0,0 +1,26 @@
+#define _GNU_SOURCE
+#include <sys/resource.h>
+#include "syscall.h"
+
+#define FIX(x) do{ if ((x)>=SYSCALL_RLIM_INFINITY) (x)=RLIM_INFINITY; }while(0)
+
+int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit)
+{
+ struct rlimit tmp;
+ int r;
+ if (new_limit && SYSCALL_RLIM_INFINITY != RLIM_INFINITY) {
+ tmp = *new_limit;
+ FIX(tmp.rlim_cur);
+ FIX(tmp.rlim_max);
+ new_limit = &tmp;
+ }
+ r = syscall(SYS_prlimit64, pid, resource, new_limit, old_limit);
+ if (!r && old_limit && SYSCALL_RLIM_INFINITY != RLIM_INFINITY) {
+ FIX(old_limit->rlim_cur);
+ FIX(old_limit->rlim_max);
+ }
+ return r;
+}
+
+#undef prlimit64
+weak_alias(prlimit, prlimit64);
diff --git a/libc-top-half/musl/src/linux/process_vm.c b/libc-top-half/musl/src/linux/process_vm.c
new file mode 100644
index 0000000..7703bdf
--- /dev/null
+++ b/libc-top-half/musl/src/linux/process_vm.c
@@ -0,0 +1,13 @@
+#define _GNU_SOURCE
+#include <sys/uio.h>
+#include "syscall.h"
+
+ssize_t process_vm_writev(pid_t pid, const struct iovec *lvec, unsigned long liovcnt, const struct iovec *rvec, unsigned long riovcnt, unsigned long flags)
+{
+ return syscall(SYS_process_vm_writev, pid, lvec, liovcnt, rvec, riovcnt, flags);
+}
+
+ssize_t process_vm_readv(pid_t pid, const struct iovec *lvec, unsigned long liovcnt, const struct iovec *rvec, unsigned long riovcnt, unsigned long flags)
+{
+ return syscall(SYS_process_vm_readv, pid, lvec, liovcnt, rvec, riovcnt, flags);
+}
diff --git a/libc-top-half/musl/src/linux/ptrace.c b/libc-top-half/musl/src/linux/ptrace.c
new file mode 100644
index 0000000..a3f393d
--- /dev/null
+++ b/libc-top-half/musl/src/linux/ptrace.c
@@ -0,0 +1,29 @@
+#include <sys/ptrace.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include "syscall.h"
+
+long ptrace(int req, ...)
+{
+ va_list ap;
+ pid_t pid;
+ void *addr, *data, *addr2 = 0;
+ long ret, result;
+
+ va_start(ap, req);
+ pid = va_arg(ap, pid_t);
+ addr = va_arg(ap, void *);
+ data = va_arg(ap, void *);
+ /* PTRACE_{READ,WRITE}{DATA,TEXT} (16...19) are specific to SPARC. */
+#ifdef PTRACE_READDATA
+ if ((unsigned)req - PTRACE_READDATA < 4)
+ addr2 = va_arg(ap, void *);
+#endif
+ va_end(ap);
+
+ if (req-1U < 3) data = &result;
+ ret = syscall(SYS_ptrace, req, pid, addr, data, addr2);
+
+ if (ret < 0 || req-1U >= 3) return ret;
+ return result;
+}
diff --git a/libc-top-half/musl/src/linux/quotactl.c b/libc-top-half/musl/src/linux/quotactl.c
new file mode 100644
index 0000000..344eb0d
--- /dev/null
+++ b/libc-top-half/musl/src/linux/quotactl.c
@@ -0,0 +1,7 @@
+#include <sys/quota.h>
+#include "syscall.h"
+
+int quotactl(int cmd, const char *special, int id, char *addr)
+{
+ return syscall(SYS_quotactl, cmd, special, id, addr);
+}
diff --git a/libc-top-half/musl/src/linux/readahead.c b/libc-top-half/musl/src/linux/readahead.c
new file mode 100644
index 0000000..5c70bfd
--- /dev/null
+++ b/libc-top-half/musl/src/linux/readahead.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include "syscall.h"
+
+ssize_t readahead(int fd, off_t pos, size_t len)
+{
+ return syscall(SYS_readahead, fd, __SYSCALL_LL_O(pos), len);
+}
diff --git a/libc-top-half/musl/src/linux/reboot.c b/libc-top-half/musl/src/linux/reboot.c
new file mode 100644
index 0000000..7f12af7
--- /dev/null
+++ b/libc-top-half/musl/src/linux/reboot.c
@@ -0,0 +1,7 @@
+#include <sys/reboot.h>
+#include "syscall.h"
+
+int reboot(int type)
+{
+ return syscall(SYS_reboot, 0xfee1dead, 672274793, type);
+}
diff --git a/libc-top-half/musl/src/linux/remap_file_pages.c b/libc-top-half/musl/src/linux/remap_file_pages.c
new file mode 100644
index 0000000..a9699ce
--- /dev/null
+++ b/libc-top-half/musl/src/linux/remap_file_pages.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <sys/mman.h>
+#include "syscall.h"
+
+int remap_file_pages(void *addr, size_t size, int prot, size_t pgoff, int flags)
+{
+ return syscall(SYS_remap_file_pages, addr, size, prot, pgoff, flags);
+}
diff --git a/libc-top-half/musl/src/linux/sbrk.c b/libc-top-half/musl/src/linux/sbrk.c
new file mode 100644
index 0000000..bb86630
--- /dev/null
+++ b/libc-top-half/musl/src/linux/sbrk.c
@@ -0,0 +1,11 @@
+#define _BSD_SOURCE
+#include <unistd.h>
+#include <stdint.h>
+#include <errno.h>
+#include "syscall.h"
+
+void *sbrk(intptr_t inc)
+{
+ if (inc) return (void *)__syscall_ret(-ENOMEM);
+ return (void *)__syscall(SYS_brk, 0);
+}
diff --git a/libc-top-half/musl/src/linux/sendfile.c b/libc-top-half/musl/src/linux/sendfile.c
new file mode 100644
index 0000000..9afe6dd
--- /dev/null
+++ b/libc-top-half/musl/src/linux/sendfile.c
@@ -0,0 +1,9 @@
+#include <sys/sendfile.h>
+#include "syscall.h"
+
+ssize_t sendfile(int out_fd, int in_fd, off_t *ofs, size_t count)
+{
+ return syscall(SYS_sendfile, out_fd, in_fd, ofs, count);
+}
+
+weak_alias(sendfile, sendfile64);
diff --git a/libc-top-half/musl/src/linux/setfsgid.c b/libc-top-half/musl/src/linux/setfsgid.c
new file mode 100644
index 0000000..e29d9c0
--- /dev/null
+++ b/libc-top-half/musl/src/linux/setfsgid.c
@@ -0,0 +1,7 @@
+#include <sys/fsuid.h>
+#include "syscall.h"
+
+int setfsgid(gid_t gid)
+{
+ return syscall(SYS_setfsgid, gid);
+}
diff --git a/libc-top-half/musl/src/linux/setfsuid.c b/libc-top-half/musl/src/linux/setfsuid.c
new file mode 100644
index 0000000..1bae441
--- /dev/null
+++ b/libc-top-half/musl/src/linux/setfsuid.c
@@ -0,0 +1,7 @@
+#include <sys/fsuid.h>
+#include "syscall.h"
+
+int setfsuid(uid_t uid)
+{
+ return syscall(SYS_setfsuid, uid);
+}
diff --git a/libc-top-half/musl/src/linux/setgroups.c b/libc-top-half/musl/src/linux/setgroups.c
new file mode 100644
index 0000000..47142f1
--- /dev/null
+++ b/libc-top-half/musl/src/linux/setgroups.c
@@ -0,0 +1,36 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <signal.h>
+#include "syscall.h"
+#include "libc.h"
+
+struct ctx {
+ size_t count;
+ const gid_t *list;
+ int ret;
+};
+
+static void do_setgroups(void *p)
+{
+ struct ctx *c = p;
+ if (c->ret<0) return;
+ int ret = __syscall(SYS_setgroups, c->count, c->list);
+ if (ret && !c->ret) {
+ /* If one thread fails to set groups after another has already
+ * succeeded, forcibly killing the process is the only safe
+ * thing to do. State is inconsistent and dangerous. Use
+ * SIGKILL because it is uncatchable. */
+ __block_all_sigs(0);
+ __syscall(SYS_kill, __syscall(SYS_getpid), SIGKILL);
+ }
+ c->ret = ret;
+}
+
+int setgroups(size_t count, const gid_t list[])
+{
+ /* ret is initially nonzero so that failure of the first thread does not
+ * trigger the safety kill above. */
+ struct ctx c = { .count = count, .list = list, .ret = 1 };
+ __synccall(do_setgroups, &c);
+ return __syscall_ret(c.ret);
+}
diff --git a/libc-top-half/musl/src/linux/sethostname.c b/libc-top-half/musl/src/linux/sethostname.c
new file mode 100644
index 0000000..9313b32
--- /dev/null
+++ b/libc-top-half/musl/src/linux/sethostname.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include "syscall.h"
+
+int sethostname(const char *name, size_t len)
+{
+ return syscall(SYS_sethostname, name, len);
+}
diff --git a/libc-top-half/musl/src/linux/setns.c b/libc-top-half/musl/src/linux/setns.c
new file mode 100644
index 0000000..0afec81
--- /dev/null
+++ b/libc-top-half/musl/src/linux/setns.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <sched.h>
+#include "syscall.h"
+
+int setns(int fd, int nstype)
+{
+ return syscall(SYS_setns, fd, nstype);
+}
diff --git a/libc-top-half/musl/src/linux/settimeofday.c b/libc-top-half/musl/src/linux/settimeofday.c
new file mode 100644
index 0000000..860fb5d
--- /dev/null
+++ b/libc-top-half/musl/src/linux/settimeofday.c
@@ -0,0 +1,13 @@
+#define _BSD_SOURCE
+#include <sys/time.h>
+#include <time.h>
+#include <errno.h>
+#include "syscall.h"
+
+int settimeofday(const struct timeval *tv, const struct timezone *tz)
+{
+ if (!tv) return 0;
+ if (tv->tv_usec >= 1000000ULL) return __syscall_ret(-EINVAL);
+ return clock_settime(CLOCK_REALTIME, &((struct timespec){
+ .tv_sec = tv->tv_sec, .tv_nsec = tv->tv_usec * 1000}));
+}
diff --git a/libc-top-half/musl/src/linux/signalfd.c b/libc-top-half/musl/src/linux/signalfd.c
new file mode 100644
index 0000000..4bf4332
--- /dev/null
+++ b/libc-top-half/musl/src/linux/signalfd.c
@@ -0,0 +1,21 @@
+#include <sys/signalfd.h>
+#include <signal.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int signalfd(int fd, const sigset_t *sigs, int flags)
+{
+ int ret = __syscall(SYS_signalfd4, fd, sigs, _NSIG/8, flags);
+#ifdef SYS_signalfd
+ if (ret != -ENOSYS) return __syscall_ret(ret);
+ ret = __syscall(SYS_signalfd, fd, sigs, _NSIG/8);
+ if (ret >= 0) {
+ if (flags & SFD_CLOEXEC)
+ __syscall(SYS_fcntl, ret, F_SETFD, FD_CLOEXEC);
+ if (flags & SFD_NONBLOCK)
+ __syscall(SYS_fcntl, ret, F_SETFL, O_NONBLOCK);
+ }
+#endif
+ return __syscall_ret(ret);
+}
diff --git a/libc-top-half/musl/src/linux/splice.c b/libc-top-half/musl/src/linux/splice.c
new file mode 100644
index 0000000..78b6220
--- /dev/null
+++ b/libc-top-half/musl/src/linux/splice.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include "syscall.h"
+
+ssize_t splice(int fd_in, off_t *off_in, int fd_out, off_t *off_out, size_t len, unsigned flags)
+{
+ return syscall(SYS_splice, fd_in, off_in, fd_out, off_out, len, flags);
+}
diff --git a/libc-top-half/musl/src/linux/stime.c b/libc-top-half/musl/src/linux/stime.c
new file mode 100644
index 0000000..7d0443b
--- /dev/null
+++ b/libc-top-half/musl/src/linux/stime.c
@@ -0,0 +1,9 @@
+#define _GNU_SOURCE
+#include <time.h>
+#include <sys/time.h>
+
+int stime(const time_t *t)
+{
+ struct timeval tv = { .tv_sec = *t, .tv_usec = 0 };
+ return settimeofday(&tv, (void *)0);
+}
diff --git a/libc-top-half/musl/src/linux/swap.c b/libc-top-half/musl/src/linux/swap.c
new file mode 100644
index 0000000..8137d51
--- /dev/null
+++ b/libc-top-half/musl/src/linux/swap.c
@@ -0,0 +1,12 @@
+#include <sys/swap.h>
+#include "syscall.h"
+
+int swapon(const char *path, int flags)
+{
+ return syscall(SYS_swapon, path, flags);
+}
+
+int swapoff(const char *path)
+{
+ return syscall(SYS_swapoff, path);
+}
diff --git a/libc-top-half/musl/src/linux/sync_file_range.c b/libc-top-half/musl/src/linux/sync_file_range.c
new file mode 100644
index 0000000..6859abc
--- /dev/null
+++ b/libc-top-half/musl/src/linux/sync_file_range.c
@@ -0,0 +1,17 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include <errno.h>
+#include "syscall.h"
+
+int sync_file_range(int fd, off_t pos, off_t len, unsigned flags)
+{
+#if defined(SYS_sync_file_range2)
+ return syscall(SYS_sync_file_range2, fd, flags,
+ __SYSCALL_LL_E(pos), __SYSCALL_LL_E(len));
+#elif defined(SYS_sync_file_range)
+ return syscall(SYS_sync_file_range, fd,
+ __SYSCALL_LL_O(pos), __SYSCALL_LL_E(len), flags);
+#else
+ return __syscall_ret(-ENOSYS);
+#endif
+}
diff --git a/libc-top-half/musl/src/linux/syncfs.c b/libc-top-half/musl/src/linux/syncfs.c
new file mode 100644
index 0000000..bc7d301
--- /dev/null
+++ b/libc-top-half/musl/src/linux/syncfs.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include "syscall.h"
+
+int syncfs(int fd)
+{
+ return syscall(SYS_syncfs, fd);
+}
diff --git a/libc-top-half/musl/src/linux/sysinfo.c b/libc-top-half/musl/src/linux/sysinfo.c
new file mode 100644
index 0000000..db86476
--- /dev/null
+++ b/libc-top-half/musl/src/linux/sysinfo.c
@@ -0,0 +1,9 @@
+#include <sys/sysinfo.h>
+#include "syscall.h"
+
+int __lsysinfo(struct sysinfo *info)
+{
+ return syscall(SYS_sysinfo, info);
+}
+
+weak_alias(__lsysinfo, sysinfo);
diff --git a/libc-top-half/musl/src/linux/tee.c b/libc-top-half/musl/src/linux/tee.c
new file mode 100644
index 0000000..a24748c
--- /dev/null
+++ b/libc-top-half/musl/src/linux/tee.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include "syscall.h"
+
+ssize_t tee(int src, int dest, size_t len, unsigned flags)
+{
+ return syscall(SYS_tee, src, dest, len, flags);
+}
diff --git a/libc-top-half/musl/src/linux/timerfd.c b/libc-top-half/musl/src/linux/timerfd.c
new file mode 100644
index 0000000..5bdfaf1
--- /dev/null
+++ b/libc-top-half/musl/src/linux/timerfd.c
@@ -0,0 +1,59 @@
+#include <sys/timerfd.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+
+int timerfd_create(int clockid, int flags)
+{
+ return syscall(SYS_timerfd_create, clockid, flags);
+}
+
+int timerfd_settime(int fd, int flags, const struct itimerspec *new, struct itimerspec *old)
+{
+#ifdef SYS_timerfd_settime64
+ time_t is = new->it_interval.tv_sec, vs = new->it_value.tv_sec;
+ long ins = new->it_interval.tv_nsec, vns = new->it_value.tv_nsec;
+ int r = -ENOSYS;
+ if (SYS_timerfd_settime == SYS_timerfd_settime64
+ || !IS32BIT(is) || !IS32BIT(vs) || (sizeof(time_t)>4 && old))
+ r = __syscall(SYS_timerfd_settime64, fd, flags,
+ ((long long[]){is, ins, vs, vns}), old);
+ if (SYS_timerfd_settime == SYS_timerfd_settime64 || r!=-ENOSYS)
+ return __syscall_ret(r);
+ if (!IS32BIT(is) || !IS32BIT(vs))
+ return __syscall_ret(-ENOTSUP);
+ long old32[4];
+ r = __syscall(SYS_timerfd_settime, fd, flags,
+ ((long[]){is, ins, vs, vns}), old32);
+ if (!r && old) {
+ old->it_interval.tv_sec = old32[0];
+ old->it_interval.tv_nsec = old32[1];
+ old->it_value.tv_sec = old32[2];
+ old->it_value.tv_nsec = old32[3];
+ }
+ return __syscall_ret(r);
+#endif
+ return syscall(SYS_timerfd_settime, fd, flags, new, old);
+}
+
+int timerfd_gettime(int fd, struct itimerspec *cur)
+{
+#ifdef SYS_timerfd_gettime64
+ int r = -ENOSYS;
+ if (sizeof(time_t) > 4)
+ r = __syscall(SYS_timerfd_gettime64, fd, cur);
+ if (SYS_timerfd_gettime == SYS_timerfd_gettime64 || r!=-ENOSYS)
+ return __syscall_ret(r);
+ long cur32[4];
+ r = __syscall(SYS_timerfd_gettime, fd, cur32);
+ if (!r) {
+ cur->it_interval.tv_sec = cur32[0];
+ cur->it_interval.tv_nsec = cur32[1];
+ cur->it_value.tv_sec = cur32[2];
+ cur->it_value.tv_nsec = cur32[3];
+ }
+ return __syscall_ret(r);
+#endif
+ return syscall(SYS_timerfd_gettime, fd, cur);
+}
diff --git a/libc-top-half/musl/src/linux/unshare.c b/libc-top-half/musl/src/linux/unshare.c
new file mode 100644
index 0000000..3861db3
--- /dev/null
+++ b/libc-top-half/musl/src/linux/unshare.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <sched.h>
+#include "syscall.h"
+
+int unshare(int flags)
+{
+ return syscall(SYS_unshare, flags);
+}
diff --git a/libc-top-half/musl/src/linux/utimes.c b/libc-top-half/musl/src/linux/utimes.c
new file mode 100644
index 0000000..6ca025d
--- /dev/null
+++ b/libc-top-half/musl/src/linux/utimes.c
@@ -0,0 +1,8 @@
+#include <sys/time.h>
+#include "fcntl.h"
+#include "syscall.h"
+
+int utimes(const char *path, const struct timeval times[2])
+{
+ return __futimesat(AT_FDCWD, path, times);
+}
diff --git a/libc-top-half/musl/src/linux/vhangup.c b/libc-top-half/musl/src/linux/vhangup.c
new file mode 100644
index 0000000..0203071
--- /dev/null
+++ b/libc-top-half/musl/src/linux/vhangup.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include "syscall.h"
+
+int vhangup(void)
+{
+ return syscall(SYS_vhangup);
+}
diff --git a/libc-top-half/musl/src/linux/vmsplice.c b/libc-top-half/musl/src/linux/vmsplice.c
new file mode 100644
index 0000000..ebf13ee
--- /dev/null
+++ b/libc-top-half/musl/src/linux/vmsplice.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include "syscall.h"
+
+ssize_t vmsplice(int fd, const struct iovec *iov, size_t cnt, unsigned flags)
+{
+ return syscall(SYS_vmsplice, fd, iov, cnt, flags);
+}
diff --git a/libc-top-half/musl/src/linux/wait3.c b/libc-top-half/musl/src/linux/wait3.c
new file mode 100644
index 0000000..61c7359
--- /dev/null
+++ b/libc-top-half/musl/src/linux/wait3.c
@@ -0,0 +1,9 @@
+#define _GNU_SOURCE
+#include <sys/wait.h>
+#include <sys/resource.h>
+#include "syscall.h"
+
+pid_t wait3(int *status, int options, struct rusage *usage)
+{
+ return wait4(-1, status, options, usage);
+}
diff --git a/libc-top-half/musl/src/linux/wait4.c b/libc-top-half/musl/src/linux/wait4.c
new file mode 100644
index 0000000..83650e3
--- /dev/null
+++ b/libc-top-half/musl/src/linux/wait4.c
@@ -0,0 +1,39 @@
+#define _GNU_SOURCE
+#include <sys/wait.h>
+#include <sys/resource.h>
+#include <string.h>
+#include <errno.h>
+#include "syscall.h"
+
+pid_t wait4(pid_t pid, int *status, int options, struct rusage *ru)
+{
+ int r;
+#ifdef SYS_wait4_time64
+ if (ru) {
+ long long kru64[18];
+ r = __syscall(SYS_wait4_time64, pid, status, options, kru64);
+ if (!r) {
+ ru->ru_utime = (struct timeval)
+ { .tv_sec = kru64[0], .tv_usec = kru64[1] };
+ ru->ru_stime = (struct timeval)
+ { .tv_sec = kru64[2], .tv_usec = kru64[3] };
+ char *slots = (char *)&ru->ru_maxrss;
+ for (int i=0; i<14; i++)
+ *(long *)(slots + i*sizeof(long)) = kru64[4+i];
+ }
+ if (SYS_wait4_time64 == SYS_wait4 || r != -ENOSYS)
+ return __syscall_ret(r);
+ }
+#endif
+ char *dest = ru ? (char *)&ru->ru_maxrss - 4*sizeof(long) : 0;
+ r = __syscall(SYS_wait4, pid, status, options, dest);
+ if (r>0 && ru && sizeof(time_t) > sizeof(long)) {
+ long kru[4];
+ memcpy(kru, dest, 4*sizeof(long));
+ ru->ru_utime = (struct timeval)
+ { .tv_sec = kru[0], .tv_usec = kru[1] };
+ ru->ru_stime = (struct timeval)
+ { .tv_sec = kru[2], .tv_usec = kru[3] };
+ }
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/linux/x32/sysinfo.c b/libc-top-half/musl/src/linux/x32/sysinfo.c
new file mode 100644
index 0000000..59b3bb7
--- /dev/null
+++ b/libc-top-half/musl/src/linux/x32/sysinfo.c
@@ -0,0 +1,49 @@
+#include <sys/sysinfo.h>
+#include "syscall.h"
+
+#define klong long long
+#define kulong unsigned long long
+
+struct kernel_sysinfo {
+ klong uptime;
+ kulong loads[3];
+ kulong totalram;
+ kulong freeram;
+ kulong sharedram;
+ kulong bufferram;
+ kulong totalswap;
+ kulong freeswap;
+ short procs;
+ short pad;
+ kulong totalhigh;
+ kulong freehigh;
+ unsigned mem_unit;
+};
+
+int __lsysinfo(struct sysinfo *info)
+{
+ struct kernel_sysinfo tmp;
+ int ret = syscall(SYS_sysinfo, &tmp);
+ if(ret == -1) return ret;
+ info->uptime = tmp.uptime;
+ info->loads[0] = tmp.loads[0];
+ info->loads[1] = tmp.loads[1];
+ info->loads[2] = tmp.loads[2];
+ kulong shifts;
+ kulong max = tmp.totalram | tmp.totalswap;
+ __asm__("bsr %1,%0" : "=r"(shifts) : "r"(max));
+ shifts = shifts >= 32 ? shifts - 31 : 0;
+ info->totalram = tmp.totalram >> shifts;
+ info->freeram = tmp.freeram >> shifts;
+ info->sharedram = tmp.sharedram >> shifts;
+ info->bufferram = tmp.bufferram >> shifts;
+ info->totalswap = tmp.totalswap >> shifts;
+ info->freeswap = tmp.freeswap >> shifts;
+ info->procs = tmp.procs ;
+ info->totalhigh = tmp.totalhigh >> shifts;
+ info->freehigh = tmp.freehigh >> shifts;
+ info->mem_unit = (tmp.mem_unit ? tmp.mem_unit : 1) << shifts;
+ return ret;
+}
+
+weak_alias(__lsysinfo, sysinfo);
diff --git a/libc-top-half/musl/src/linux/xattr.c b/libc-top-half/musl/src/linux/xattr.c
new file mode 100644
index 0000000..fea0d20
--- /dev/null
+++ b/libc-top-half/musl/src/linux/xattr.c
@@ -0,0 +1,62 @@
+#include <sys/xattr.h>
+#include "syscall.h"
+
+ssize_t getxattr(const char *path, const char *name, void *value, size_t size)
+{
+ return syscall(SYS_getxattr, path, name, value, size);
+}
+
+ssize_t lgetxattr(const char *path, const char *name, void *value, size_t size)
+{
+ return syscall(SYS_lgetxattr, path, name, value, size);
+}
+
+ssize_t fgetxattr(int filedes, const char *name, void *value, size_t size)
+{
+ return syscall(SYS_fgetxattr, filedes, name, value, size);
+}
+
+ssize_t listxattr(const char *path, char *list, size_t size)
+{
+ return syscall(SYS_listxattr, path, list, size);
+}
+
+ssize_t llistxattr(const char *path, char *list, size_t size)
+{
+ return syscall(SYS_llistxattr, path, list, size);
+}
+
+ssize_t flistxattr(int filedes, char *list, size_t size)
+{
+ return syscall(SYS_flistxattr, filedes, list, size);
+}
+
+int setxattr(const char *path, const char *name, const void *value, size_t size, int flags)
+{
+ return syscall(SYS_setxattr, path, name, value, size, flags);
+}
+
+int lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags)
+{
+ return syscall(SYS_lsetxattr, path, name, value, size, flags);
+}
+
+int fsetxattr(int filedes, const char *name, const void *value, size_t size, int flags)
+{
+ return syscall(SYS_fsetxattr, filedes, name, value, size, flags);
+}
+
+int removexattr(const char *path, const char *name)
+{
+ return syscall(SYS_removexattr, path, name);
+}
+
+int lremovexattr(const char *path, const char *name)
+{
+ return syscall(SYS_lremovexattr, path, name);
+}
+
+int fremovexattr(int fd, const char *name)
+{
+ return syscall(SYS_fremovexattr, fd, name);
+}
diff --git a/libc-top-half/musl/src/locale/__lctrans.c b/libc-top-half/musl/src/locale/__lctrans.c
new file mode 100644
index 0000000..9fbe762
--- /dev/null
+++ b/libc-top-half/musl/src/locale/__lctrans.c
@@ -0,0 +1,19 @@
+#include <locale.h>
+#include "locale_impl.h"
+
+static const char *dummy(const char *msg, const struct __locale_map *lm)
+{
+ return msg;
+}
+
+weak_alias(dummy, __lctrans_impl);
+
+const char *__lctrans(const char *msg, const struct __locale_map *lm)
+{
+ return __lctrans_impl(msg, lm);
+}
+
+const char *__lctrans_cur(const char *msg)
+{
+ return __lctrans_impl(msg, CURRENT_LOCALE->cat[LC_MESSAGES]);
+}
diff --git a/libc-top-half/musl/src/locale/__mo_lookup.c b/libc-top-half/musl/src/locale/__mo_lookup.c
new file mode 100644
index 0000000..d18ab77
--- /dev/null
+++ b/libc-top-half/musl/src/locale/__mo_lookup.c
@@ -0,0 +1,42 @@
+#include <stdint.h>
+#include <string.h>
+
+static inline uint32_t swapc(uint32_t x, int c)
+{
+ return c ? x>>24 | x>>8&0xff00 | x<<8&0xff0000 | x<<24 : x;
+}
+
+const char *__mo_lookup(const void *p, size_t size, const char *s)
+{
+ const uint32_t *mo = p;
+ int sw = *mo - 0x950412de;
+ uint32_t b = 0, n = swapc(mo[2], sw);
+ uint32_t o = swapc(mo[3], sw);
+ uint32_t t = swapc(mo[4], sw);
+ if (n>=size/4 || o>=size-4*n || t>=size-4*n || ((o|t)%4))
+ return 0;
+ o/=4;
+ t/=4;
+ for (;;) {
+ uint32_t ol = swapc(mo[o+2*(b+n/2)], sw);
+ uint32_t os = swapc(mo[o+2*(b+n/2)+1], sw);
+ if (os >= size || ol >= size-os || ((char *)p)[os+ol])
+ return 0;
+ int sign = strcmp(s, (char *)p + os);
+ if (!sign) {
+ uint32_t tl = swapc(mo[t+2*(b+n/2)], sw);
+ uint32_t ts = swapc(mo[t+2*(b+n/2)+1], sw);
+ if (ts >= size || tl >= size-ts || ((char *)p)[ts+tl])
+ return 0;
+ return (char *)p + ts;
+ }
+ else if (n == 1) return 0;
+ else if (sign < 0)
+ n /= 2;
+ else {
+ b += n/2;
+ n -= n/2;
+ }
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/locale/big5.h b/libc-top-half/musl/src/locale/big5.h
new file mode 100644
index 0000000..332ea3b
--- /dev/null
+++ b/libc-top-half/musl/src/locale/big5.h
@@ -0,0 +1,1085 @@
+12288,65292,12289,12290,65294,8231,65307,65306,65311,65281,65072,8230,8229,
+65104,65105,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,
+9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,
+65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,
+65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,65115,65116,
+65117,65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,
+167,12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,
+12963,8453,175,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,
+65120,65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,
+8734,8786,8801,65122,65123,65124,65125,65126,65374,8745,8746,8869,8736,8735,
+8895,13266,13265,8747,8750,8757,8756,9792,9794,8853,8857,8593,8595,8592,8594,
+8598,8599,8601,8600,8741,8739,65295,65340,8725,65128,65284,65509,12306,65504,
+65505,65285,65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,
+13217,13198,13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,
+31950,9601,9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,
+9609,9532,9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,
+9582,9584,9583,9552,9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,
+65297,65298,65299,65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,
+8548,8549,8550,8551,8552,8553,12321,
+12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,21317,65313,65314,
+65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,
+65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,
+65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,
+65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,913,914,915,
+916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,
+936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,
+963,964,965,966,967,968,969,12549,12550,12551,12552,12553,12554,12555,12556,
+12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,
+12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,
+12583,12584,12585,729,713,714,711,715,9216,9217,9218,9219,9220,9221,9222,9223,
+9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,
+9239,9240,9241,9242,9243,9244,9245,9246,9247,9249,8364,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19968,20057,19969,19971,20035,20061,20102,
+20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,21313,21340,21448,
+19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,20062,20110,20129,
+20800,20995,21242,21315,21449,21475,22303,
+22763,22805,22823,22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,
+24037,24049,24050,24051,24062,24178,24318,24331,24339,25165,19985,19984,19981,
+20013,20016,20025,20043,23609,20104,20113,20117,20114,20116,20130,20161,20160,
+20163,20166,20167,20173,20170,20171,20164,20803,20801,20839,20845,20846,20844,
+20887,20982,20998,20999,21000,21243,21246,21247,21270,21305,21320,21319,21317,
+21342,21380,21451,21450,21453,22764,22825,22827,22826,22829,23380,23569,23588,
+23610,23663,24052,24187,24319,24340,24341,24515,25096,25142,25163,25166,25903,
+25991,26007,26020,26041,26085,26352,26376,26408,27424,27490,27513,27595,27604,
+27611,27663,27700,28779,29226,29238,29243,29255,29273,29275,29356,29579,19993,
+19990,19989,19988,19992,20027,20045,20047,20046,20197,20184,20180,20181,20182,
+20183,20195,20196,20185,20190,20805,20804,20873,20874,20908,20985,20986,20984,
+21002,21152,21151,21253,21254,21271,21277,20191,21322,21321,21345,21344,21359,
+21358,21435,21487,21476,21491,21484,21486,21481,21480,21500,21496,21493,21483,
+21478,21482,21490,21489,21488,21477,21485,21499,22235,22234,22806,22830,22833,
+22900,22902,23381,23427,23612,24040,24039,24038,24066,24067,24179,24188,24321,
+24344,24343,24517,25098,25171,25172,25170,25169,26021,26086,26414,26412,26410,
+26411,26413,27491,27597,27665,27664,27704,27713,27712,27710,29359,29572,29577,
+29916,29926,29976,29983,29992,29993,30000,30001,30002,30003,30091,30333,30382,
+30399,30446,30683,30690,30707,31034,31166,31348,31435,19998,19999,20050,20051,
+20073,20121,20132,20134,20133,20223,20233,20249,20234,
+20245,20237,20240,20241,20239,20210,20214,20219,20208,20211,20221,20225,20235,
+20809,20807,20806,20808,20840,20849,20877,20912,21015,21009,21010,21006,21014,
+21155,21256,21281,21280,21360,21361,21513,21519,21516,21514,21520,21505,21515,
+21508,21521,21517,21512,21507,21518,21510,21522,22240,22238,22237,22323,22320,
+22312,22317,22316,22319,22313,22809,22810,22839,22840,22916,22904,22915,22909,
+22905,22914,22913,23383,23384,23431,23432,23429,23433,23546,23574,23673,24030,
+24070,24182,24180,24335,24347,24537,24534,25102,25100,25101,25104,25187,25179,
+25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,26420,26417,26421,
+27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,27733,27745,27739,
+27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,32650,32701,32769,
+32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,33267,33276,33292,
+33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,38433,20018,20136,
+20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,20305,20285,20282,
+20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,20278,20313,20317,
+20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,21033,21034,21032,
+21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,21566,21542,21582,
+21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,21563,21560,21550,
+21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,22256,22244,22251,
+22346,22353,22336,22349,22343,22350,22334,22352,22351,22331,22767,22846,22941,
+22930,22952,22942,22947,22937,22934,22925,22948,22931,
+22922,22949,23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,
+23614,23696,23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,
+24420,24418,24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,
+25105,25220,25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,
+25234,25199,25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,
+26463,26446,26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,
+27493,27599,27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,
+27760,27788,27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,
+27796,27800,27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,
+29996,29995,30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,
+32918,32915,32925,32920,32923,32922,32946,33391,33426,33419,33421,35211,35282,
+35328,35895,35910,35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,
+36806,36805,36804,24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,
+38446,38449,38442,38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,
+20381,20365,20339,20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,
+20347,20374,20350,20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,
+20925,20989,21051,21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,
+21332,21331,21329,21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,
+21624,21653,21632,21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,
+21658,21602,21608,21643,21629,21646,22266,22403,22391,
+22378,22377,22369,22374,22372,22396,22812,22857,22855,22856,22852,22868,22974,
+22971,22996,22969,22958,22993,22982,22992,22989,22987,22995,22986,22959,22963,
+22994,22981,23391,23396,23395,23447,23450,23448,23452,23449,23451,23578,23624,
+23621,23622,23735,23713,23736,23721,23723,23729,23731,24088,24090,24086,24085,
+24091,24081,24184,24218,24215,24220,24213,24214,24310,24358,24359,24361,24448,
+24449,24447,24444,24541,24544,24573,24565,24575,24591,24596,24623,24629,24598,
+24618,24597,24609,24615,24617,24619,24603,25110,25109,25151,25150,25152,25215,
+25289,25292,25284,25279,25282,25273,25298,25307,25259,25299,25300,25291,25288,
+25256,25277,25276,25296,25305,25287,25293,25269,25306,25265,25304,25302,25303,
+25286,25260,25294,25918,26023,26044,26106,26132,26131,26124,26118,26114,26126,
+26112,26127,26133,26122,26119,26381,26379,26477,26507,26517,26481,26524,26483,
+26487,26503,26525,26519,26479,26480,26495,26505,26494,26512,26485,26522,26515,
+26492,26474,26482,27427,27494,27495,27519,27667,27675,27875,27880,27891,27825,
+27852,27877,27827,27837,27838,27836,27874,27819,27861,27859,27832,27844,27833,
+27841,27822,27863,27845,27889,27839,27835,27873,27867,27850,27820,27887,27868,
+27862,27872,28821,28814,28818,28810,28825,29228,29229,29240,29256,29287,29289,
+29376,29390,29401,29399,29392,29609,29608,29599,29611,29605,30013,30109,30105,
+30106,30340,30402,30450,30452,30693,30717,31038,31040,31041,31177,31176,31354,
+31353,31482,31998,32596,32652,32651,32773,32954,32933,32930,32945,32929,32939,
+32937,32948,32938,32943,33253,33278,33293,33459,33437,
+33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,
+33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,
+37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,
+38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,
+20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,
+20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,
+21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,
+21670,21683,21703,21698,21693,21674,21697,21700,21704,21679,21675,21681,21691,
+21673,21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,
+22865,22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,
+23014,23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,
+23627,23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,
+24421,24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,
+24616,24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,
+25366,25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,
+25332,25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,
+26143,26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,
+26613,26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,
+26585,26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,
+27954,27946,27969,27941,27916,27953,27934,27927,27963,
+27965,27966,27958,27931,27893,27961,27943,27960,27945,27950,27957,27918,27947,
+28843,28858,28851,28844,28847,28845,28856,28846,28836,29232,29298,29295,29300,
+29417,29408,29409,29623,29642,29627,29618,29645,29632,29619,29978,29997,30031,
+30028,30030,30027,30123,30116,30117,30114,30115,30328,30342,30343,30344,30408,
+30406,30403,30405,30465,30457,30456,30473,30475,30462,30460,30471,30684,30722,
+30740,30732,30733,31046,31049,31048,31047,31161,31162,31185,31186,31179,31359,
+31361,31487,31485,31869,32002,32005,32000,32009,32007,32004,32006,32568,32654,
+32703,32772,32784,32781,32785,32822,32982,32997,32986,32963,32964,32972,32993,
+32987,32974,32990,32996,32989,33268,33314,33511,33539,33541,33507,33499,33510,
+33540,33509,33538,33545,33490,33495,33521,33537,33500,33492,33489,33502,33491,
+33503,33519,33542,34384,34425,34427,34426,34893,34923,35201,35284,35336,35330,
+35331,35998,36000,36212,36211,36276,36557,36556,36848,36838,36834,36842,36837,
+36845,36843,36836,36840,37066,37070,37057,37059,37195,37194,37325,38274,38480,
+38475,38476,38477,38754,38761,38859,38893,38899,38913,39080,39131,39135,39318,
+39321,20056,20147,20492,20493,20515,20463,20518,20517,20472,20521,20502,20486,
+20540,20511,20506,20498,20497,20474,20480,20500,20520,20465,20513,20491,20505,
+20504,20467,20462,20525,20522,20478,20523,20489,20860,20900,20901,20898,20941,
+20940,20934,20939,21078,21084,21076,21083,21085,21290,21375,21407,21405,21471,
+21736,21776,21761,21815,21756,21733,21746,21766,21754,21780,21737,21741,21729,
+21769,21742,21738,21734,21799,21767,21757,21775,22275,
+22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,23064,23068,
+23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,23640,23472,
+23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,23789,23805,
+23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,24237,24231,
+24369,24466,24465,24464,24665,24675,24677,24656,24661,24685,24681,24687,24708,
+24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,25406,
+25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,25421,
+25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,26181,
+26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,26708,
+26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,26693,
+26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,28010,
+28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,28020,
+28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,28879,
+29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,29674,
+29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,30140,
+30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,30697,
+30768,30759,30776,30749,30772,30775,30757,30765,30752,30751,30770,31061,31056,
+31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,
+31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,
+32020,32016,32021,32026,32028,32013,32025,32027,32570,
+32607,32660,32709,32705,32774,32792,32789,32793,32791,32829,32831,33009,33026,
+33008,33029,33005,33012,33030,33016,33011,33032,33021,33034,33020,33007,33261,
+33260,33280,33296,33322,33323,33320,33324,33467,33579,33618,33620,33610,33592,
+33616,33609,33589,33588,33615,33586,33593,33590,33559,33600,33585,33576,33603,
+34388,34442,34474,34451,34468,34473,34444,34467,34460,34928,34935,34945,34946,
+34941,34937,35352,35344,35342,35340,35349,35338,35351,35347,35350,35343,35345,
+35912,35962,35961,36001,36002,36215,36524,36562,36564,36559,36785,36865,36870,
+36855,36864,36858,36852,36867,36861,36869,36856,37013,37089,37085,37090,37202,
+37197,37196,37336,37341,37335,37340,37337,38275,38498,38499,38497,38491,38493,
+38500,38488,38494,38587,39138,39340,39592,39640,39717,39730,39740,20094,20602,
+20605,20572,20551,20547,20556,20570,20553,20581,20598,20558,20565,20597,20596,
+20599,20559,20495,20591,20589,20828,20885,20976,21098,21103,21202,21209,21208,
+21205,21264,21263,21273,21311,21312,21310,21443,26364,21830,21866,21862,21828,
+21854,21857,21827,21834,21809,21846,21839,21845,21807,21860,21816,21806,21852,
+21804,21859,21811,21825,21847,22280,22283,22281,22495,22533,22538,22534,22496,
+22500,22522,22530,22581,22519,22521,22816,22882,23094,23105,23113,23142,23146,
+23104,23100,23138,23130,23110,23114,23408,23495,23493,23492,23490,23487,23494,
+23561,23560,23559,23648,23644,23645,23815,23814,23822,23835,23830,23842,23825,
+23849,23828,23833,23844,23847,23831,24034,24120,24118,24115,24119,24247,24248,
+24246,24245,24254,24373,24375,24407,24428,24425,24427,
+24471,24473,24478,24472,24481,24480,24476,24703,24739,24713,24736,24744,24779,
+24756,24806,24765,24773,24763,24757,24796,24764,24792,24789,24774,24799,24760,
+24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,25509,25463,25447,
+25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,25480,25497,25505,
+25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,25937,25945,25943,
+21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,26060,26062,26205,
+26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,26786,26771,26805,
+26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,26757,26772,26781,
+26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,28092,28147,28121,
+28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,28113,28078,28126,
+28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,28120,28138,28145,
+28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,28938,28925,28911,
+29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,29706,29699,29702,
+29694,29709,29920,29942,29943,29980,29986,30053,30054,30050,30064,30095,30164,
+30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,30518,30520,
+30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,31528,31515,
+31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,32046,32057,
+32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,32666,32716,
+32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,33060,33282,
+33333,33335,33334,33337,33678,33694,33688,33656,33698,
+33686,33725,33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,
+34389,24426,34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,
+34974,34952,34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,
+35377,35373,35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,
+36199,36198,36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,
+36880,36885,36894,36896,36879,36898,36886,36891,36884,37096,37101,37117,37207,
+37326,37365,37350,37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,
+38516,38518,38519,38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,
+40565,40575,40613,40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,
+26368,20977,21106,21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,
+21927,21884,21898,21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,
+21934,21919,21822,21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,
+22575,22570,22580,22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,
+23194,23167,23186,23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,
+23601,23884,23888,23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,
+24258,24260,24380,24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,
+24867,24826,24853,24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,
+25119,25161,25507,25484,25551,25536,25577,25545,25542,25549,25554,25571,25552,
+25569,25558,25581,25582,25462,25588,25578,25563,25682,25562,25593,25950,25958,
+25954,25955,26001,26000,26031,26222,26224,26228,26230,
+26223,26257,26234,26238,26231,26366,26367,26399,26397,26874,26837,26848,26840,
+26839,26885,26847,26869,26862,26855,26873,26834,26866,26851,26827,26829,26893,
+26898,26894,26825,26842,26990,26875,27454,27450,27453,27544,27542,27580,27631,
+27694,27695,27692,28207,28216,28244,28193,28210,28263,28234,28192,28197,28195,
+28187,28251,28248,28196,28246,28270,28205,28198,28271,28212,28237,28218,28204,
+28227,28189,28222,28363,28297,28185,28238,28259,28228,28274,28265,28255,28953,
+28954,28966,28976,28961,28982,29038,28956,29260,29316,29312,29494,29477,29492,
+29481,29754,29738,29747,29730,29733,29749,29750,29748,29743,29723,29734,29736,
+29989,29990,30059,30058,30178,30171,30179,30169,30168,30174,30176,30331,30332,
+30358,30355,30388,30428,30543,30701,30813,30828,30831,31245,31240,31243,31237,
+31232,31384,31383,31382,31461,31459,31561,31574,31558,31568,31570,31572,31565,
+31563,31567,31569,31903,31909,32094,32080,32104,32085,32043,32110,32114,32097,
+32102,32098,32112,32115,21892,32724,32725,32779,32850,32901,33109,33108,33099,
+33105,33102,33081,33094,33086,33100,33107,33140,33298,33308,33769,33795,33784,
+33805,33760,33733,33803,33729,33775,33777,33780,33879,33802,33776,33804,33740,
+33789,33778,33738,33848,33806,33796,33756,33799,33748,33759,34395,34527,34521,
+34541,34516,34523,34532,34512,34526,34903,35009,35010,34993,35203,35222,35387,
+35424,35413,35422,35388,35393,35412,35419,35408,35398,35380,35386,35382,35414,
+35937,35970,36015,36028,36019,36029,36033,36027,36032,36020,36023,36022,36031,
+36024,36234,36229,36225,36302,36317,36299,36314,36305,
+36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,
+37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,
+37392,37383,37393,38292,38287,38283,38289,38291,38290,38286,38538,38542,38539,
+38525,38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,
+38860,38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,
+40653,40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,
+20679,21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,
+21990,21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,
+21961,22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,
+22626,22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,
+23913,23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,
+24863,24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,
+24845,24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,
+25628,25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,
+26248,26262,26244,26264,26253,26371,27028,26989,26970,26999,26976,26964,26997,
+26928,27010,26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,
+27506,27584,27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,
+28357,28325,28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,
+28340,29006,29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,
+28998,29032,29014,29242,29266,29495,29509,29503,29502,
+29807,29786,29781,29791,29790,29761,29759,29785,29787,29788,30070,30072,30208,
+30192,30209,30194,30193,30202,30207,30196,30195,30430,30431,30555,30571,30566,
+30558,30563,30585,30570,30572,30556,30565,30568,30562,30702,30862,30896,30871,
+30872,30860,30857,30844,30865,30867,30847,31098,31103,31105,33836,31165,31260,
+31258,31264,31252,31263,31262,31391,31392,31607,31680,31584,31598,31591,31921,
+31923,31925,32147,32121,32145,32129,32143,32091,32622,32617,32618,32626,32681,
+32680,32676,32854,32856,32902,32900,33137,33136,33144,33125,33134,33139,33131,
+33145,33146,33126,33285,33351,33922,33911,33853,33841,33909,33894,33899,33865,
+33900,33883,33852,33845,33889,33891,33897,33901,33862,34398,34396,34399,34553,
+34579,34568,34567,34560,34558,34555,34562,34563,34566,34570,34905,35039,35028,
+35033,35036,35032,35037,35041,35018,35029,35026,35228,35299,35435,35442,35443,
+35430,35433,35440,35463,35452,35427,35488,35441,35461,35437,35426,35438,35436,
+35449,35451,35390,35432,35938,35978,35977,36042,36039,36040,36036,36018,36035,
+36034,36037,36321,36319,36328,36335,36339,36346,36330,36324,36326,36530,36611,
+36617,36606,36618,36767,36786,36939,36938,36947,36930,36948,36924,36949,36944,
+36935,36943,36942,36941,36945,36926,36929,37138,37143,37228,37226,37225,37321,
+37431,37463,37432,37437,37440,37438,37467,37451,37476,37457,37428,37449,37453,
+37445,37433,37439,37466,38296,38552,38548,38549,38605,38603,38601,38602,38647,
+38651,38649,38646,38742,38772,38774,38928,38929,38931,38922,38930,38924,39164,
+39156,39165,39166,39347,39345,39348,39649,40169,40578,
+40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,20721,
+20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,22013,
+22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,22294,
+22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,22890,
+22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,23525,
+23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,24151,
+24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,24931,
+24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,25681,
+25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,27048,
+27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,27053,
+27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,28457,
+28478,28448,28460,28431,28418,28450,28415,28399,28422,28465,28472,28466,28451,
+28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,
+29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,
+29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,
+30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,
+31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,
+31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,
+32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,
+32862,32858,32903,33104,33152,33167,33160,33162,33151,
+33154,33255,33274,33287,33300,33310,33355,33993,33983,33990,33988,33945,33950,
+33970,33948,33995,33976,33984,34003,33936,33980,34001,33994,34623,34588,34619,
+34594,34597,34612,34584,34645,34615,34601,35059,35074,35060,35065,35064,35069,
+35048,35098,35055,35494,35468,35486,35491,35469,35489,35475,35492,35498,35493,
+35496,35480,35473,35482,35495,35946,35981,35980,36051,36049,36050,36203,36249,
+36245,36348,36628,36626,36629,36627,36771,36960,36952,36956,36963,36953,36958,
+36962,36957,36955,37145,37144,37150,37237,37240,37239,37236,37496,37504,37509,
+37528,37526,37499,37523,37532,37544,37500,37521,38305,38312,38313,38307,38309,
+38308,38553,38556,38555,38604,38610,38656,38780,38789,38902,38935,38936,39087,
+39089,39171,39173,39180,39177,39361,39599,39600,39654,39745,39746,40180,40182,
+40179,40636,40763,40778,20740,20736,20731,20725,20729,20738,20744,20745,20741,
+20956,21127,21128,21129,21133,21130,21232,21426,22062,22075,22073,22066,22079,
+22068,22057,22099,22094,22103,22132,22070,22063,22064,22656,22687,22686,22707,
+22684,22702,22697,22694,22893,23305,23291,23307,23285,23308,23304,23534,23532,
+23529,23531,23652,23653,23965,23956,24162,24159,24161,24290,24282,24287,24285,
+24291,24288,24392,24433,24503,24501,24950,24935,24942,24925,24917,24962,24956,
+24944,24939,24958,24999,24976,25003,24974,25004,24986,24996,24980,25006,25134,
+25705,25711,25721,25758,25778,25736,25744,25776,25765,25747,25749,25769,25746,
+25774,25773,25771,25754,25772,25753,25762,25779,25973,25975,25976,26286,26283,
+26292,26289,27171,27167,27112,27137,27166,27161,27133,
+27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,27556,27589,27590,
+28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,28526,28558,28538,
+28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,29105,29096,29270,
+29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,30249,30239,30244,
+30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,30603,30923,30917,
+30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,31287,31291,31407,
+31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,31946,32224,32244,
+32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,32158,32217,32242,
+32249,32629,32631,32687,32745,32806,33179,33180,33181,33184,33178,33176,34071,
+34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,34085,34047,
+34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,34643,34907,
+34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,35477,35531,
+35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,35916,35918,
+35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,36065,36205,
+36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,36538,36637,
+36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,36973,36983,
+37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,37610,37548,
+37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,38662,38663,
+38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,39186,39192,
+39389,39376,39391,39387,39377,39381,39378,39385,39607,
+39662,39663,39719,39749,39748,39799,39791,40198,40201,40195,40617,40638,40654,
+22696,40786,20754,20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,
+22105,22123,22137,22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,
+22134,22721,22718,22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,
+24977,25001,24970,25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,
+25788,25818,25796,25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,
+26297,26308,26311,26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,
+27233,27211,27207,27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,
+28580,28609,28583,28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,
+29138,29128,29141,29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,
+29855,29854,29922,29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,
+30629,30952,30938,30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,
+31761,31689,31716,31707,31713,31721,31718,31957,31958,32266,32273,32264,32283,
+32291,32286,32285,32265,32272,32633,32690,32752,32753,32750,32808,33203,33193,
+33192,33275,33288,33368,33369,34122,34137,34120,34152,34153,34115,34121,34157,
+34154,34142,34691,34719,34718,34722,34701,34913,35114,35122,35109,35115,35105,
+35242,35238,35558,35578,35563,35569,35584,35548,35559,35566,35582,35585,35586,
+35575,35565,35571,35574,35580,35947,35949,35987,36084,36420,36401,36404,36418,
+36409,36405,36667,36655,36664,36659,36776,36774,36981,36980,36984,36978,36988,
+36986,37172,37266,37664,37686,37624,37683,37679,37666,
+37628,37675,37636,37658,37648,37670,37665,37653,37678,37657,38331,38567,38568,
+38570,38613,38670,38673,38678,38669,38675,38671,38747,38748,38758,38808,38960,
+38968,38971,38967,38957,38969,38948,39184,39208,39198,39195,39201,39194,39405,
+39394,39409,39608,39612,39675,39661,39720,39825,40213,40227,40230,40232,40210,
+40219,40664,40660,40845,40860,20778,20767,20769,20786,21237,22158,22144,22160,
+22149,22151,22159,22741,22739,22737,22734,23344,23338,23332,23418,23607,23656,
+23996,23994,23997,23992,24171,24396,24509,25033,25026,25031,25062,25035,25138,
+25140,25806,25802,25816,25824,25840,25830,25836,25841,25826,25837,25986,25987,
+26329,26326,27264,27284,27268,27298,27292,27355,27299,27262,27287,27280,27296,
+27484,27566,27610,27656,28632,28657,28639,28640,28635,28644,28651,28655,28544,
+28652,28641,28649,28629,28654,28656,29159,29151,29166,29158,29157,29165,29164,
+29172,29152,29237,29254,29552,29554,29865,29872,29862,29864,30278,30274,30284,
+30442,30643,30634,30640,30636,30631,30637,30703,30967,30970,30964,30959,30977,
+31143,31146,31319,31423,31751,31757,31742,31735,31756,31712,31968,31964,31966,
+31970,31967,31961,31965,32302,32318,32326,32311,32306,32323,32299,32317,32305,
+32325,32321,32308,32313,32328,32309,32319,32303,32580,32755,32764,32881,32882,
+32880,32879,32883,33222,33219,33210,33218,33216,33215,33213,33225,33214,33256,
+33289,33393,34218,34180,34174,34204,34193,34196,34223,34203,34183,34216,34186,
+34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,34763,35131,35126,
+35140,35128,35133,35244,35598,35607,35609,35611,35594,
+35616,35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,
+36425,36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,
+36994,36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,
+37656,37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,
+38584,38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,
+39850,39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,
+22165,22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,
+25851,25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,
+27487,27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,
+29176,29559,29557,29863,29887,29973,30294,30296,30290,30653,30655,30651,30652,
+30990,31150,31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,
+31975,32340,32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,
+33229,33231,33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,
+34796,34802,34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,
+36451,36454,36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,
+37328,37780,37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,
+38358,38352,38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,
+38989,38991,38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,
+39683,39686,39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,
+40672,40725,40748,20787,22181,22750,22751,22754,23541,
+40848,24300,25074,25079,25078,25077,25856,25871,26336,26333,27365,27357,27354,
+27347,28699,28703,28712,28698,28701,28693,28696,29190,29197,29272,29346,29560,
+29562,29885,29898,29923,30087,30086,30303,30305,30663,31001,31153,31339,31337,
+31806,31807,31800,31805,31799,31808,32363,32365,32377,32361,32362,32645,32371,
+32694,32697,32696,33240,34281,34269,34282,34261,34276,34277,34295,34811,34821,
+34829,34809,34814,35168,35167,35158,35166,35649,35676,35672,35657,35674,35662,
+35663,35654,35673,36104,36106,36476,36466,36487,36470,36460,36474,36468,36692,
+36686,36781,37002,37003,37297,37294,37857,37841,37855,37827,37832,37852,37853,
+37846,37858,37837,37848,37860,37847,37864,38364,38580,38627,38698,38695,38753,
+38876,38907,39006,39000,39003,39100,39237,39241,39446,39449,39693,39912,39911,
+39894,39899,40329,40289,40306,40298,40300,40594,40599,40595,40628,21240,22184,
+22199,22198,22196,22204,22756,23360,23363,23421,23542,24009,25080,25082,25880,
+25876,25881,26342,26407,27372,28734,28720,28722,29200,29563,29903,30306,30309,
+31014,31018,31020,31019,31431,31478,31820,31811,31821,31983,31984,36782,32381,
+32380,32386,32588,32768,33242,33382,34299,34297,34321,34298,34310,34315,34311,
+34314,34836,34837,35172,35258,35320,35696,35692,35686,35695,35679,35691,36111,
+36109,36489,36481,36485,36482,37300,37323,37912,37891,37885,38369,38704,39108,
+39250,39249,39336,39467,39472,39479,39477,39955,39949,40569,40629,40680,40751,
+40799,40803,40801,20791,20792,22209,22208,22210,22804,23660,24013,25084,25086,
+25885,25884,26005,26345,27387,27396,27386,27570,28748,
+29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,34330,
+34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,36493,
+36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,38712,
+38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,39761,
+39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,20796,
+20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,28753,
+28760,29568,29924,30090,30318,30316,31155,31840,31839,32894,32893,33247,35186,
+35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,
+38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,
+40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,
+27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,
+35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,
+39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,
+30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,
+37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,
+40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,
+38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,
+39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,
+40474,29224,39530,39729,40475,40478,31858,9312,9313,9314,9315,9316,9317,9318,
+9319,9320,9321,9332,9333,9334,9335,9336,
+9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,
+20022,20031,20101,20128,20866,20886,20907,21241,21304,21353,21430,22794,23424,
+24027,24186,24191,24308,24400,24417,25908,26080,30098,30326,36789,38582,168,
+710,12541,12542,12445,12446,0,0,12293,12294,12295,12540,65339,65341,10045,
+12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,
+12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,
+12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,
+12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,
+12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,
+12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,
+12431,12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,
+12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,
+12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,
+12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,
+12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,
+12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,
+12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,
+1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,
+1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,
+1069,1070,
+1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,
+1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,
+1100,1101,1102,1103,8679,8632,8633,12751,204,20058,138,20994,17553,40880,
+20872,40881,30215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,65506,65508,65287,65282,12849,8470,8481,12443,12444,11904,
+11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,11946,
+11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,11998,
+12003,0,0,0,643,592,603,596,629,339,248,331,650,618,20034,20060,20981,21274,
+21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,20014,
+20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,24063,
+26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,20186,
+21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,23667,
+24068,24192,24194,24521,25097,25168,27669,27702,27715,27711,27707,29358,29360,
+29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,
+20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,
+21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,
+22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,
+23678,24031,24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,
+25185,25190,25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,
+26426,26431,26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,
+28785,29278,29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,
+33407,34381,35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,
+20283,20322,20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,
+20287,20321,20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,
+21391,21552,21559,21546,21588,21573,21529,21532,21541,21528,21565,21583,21569,
+21544,21540,21575,22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,
+22848,22950,22936,22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,
+23592,23594,23693,23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,
+24074,24078,24203,24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,
+24528,24557,24552,24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,
+24564,25146,25219,25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,
+25224,25207,25213,25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,
+26457,26453,26444,26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,
+27755,27780,27787,27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,
+27763,27749,27771,27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,
+29381,29589,29591,29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,
+32917,32921,32912,32914,32924,33424,33423,33413,33422,
+33425,33427,33418,33411,33412,35960,36809,36799,37023,37025,37029,37022,37031,
+37024,38448,38440,38447,38445,20019,20376,20348,20357,20349,20352,20359,20342,
+20340,20361,20356,20343,20300,20375,20330,20378,20345,20353,20344,20368,20380,
+20372,20382,20370,20354,20373,20331,20334,20894,20924,20926,21045,21042,21043,
+21062,21041,21180,21258,21259,21308,21394,21396,21639,21631,21633,21649,21634,
+21640,21611,21626,21630,21605,21612,21620,21606,21645,21615,21601,21600,21656,
+21603,21607,21604,22263,22265,22383,22386,22381,22379,22385,22384,22390,22400,
+22389,22395,22387,22388,22370,22376,22397,22796,22853,22965,22970,22991,22990,
+22962,22988,22977,22966,22972,22979,22998,22961,22973,22976,22984,22964,22983,
+23394,23397,23443,23445,23620,23623,23726,23716,23712,23733,23727,23720,23724,
+23711,23715,23725,23714,23722,23719,23709,23717,23734,23728,23718,24087,24084,
+24089,24360,24354,24355,24356,24404,24450,24446,24445,24542,24549,24621,24614,
+24601,24626,24587,24628,24586,24599,24627,24602,24606,24620,24610,24589,24592,
+24622,24595,24593,24588,24585,24604,25108,25149,25261,25268,25297,25278,25258,
+25270,25290,25262,25267,25263,25275,25257,25264,25272,25917,26024,26043,26121,
+26108,26116,26130,26120,26107,26115,26123,26125,26117,26109,26129,26128,26358,
+26378,26501,26476,26510,26514,26486,26491,26520,26502,26500,26484,26509,26508,
+26490,26527,26513,26521,26499,26493,26497,26488,26489,26516,27429,27520,27518,
+27614,27677,27795,27884,27883,27886,27865,27830,27860,27821,27879,27831,27856,
+27842,27834,27843,27846,27885,27890,27858,27869,27828,
+27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,
+28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,
+29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,
+29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,
+30449,30448,30453,30712,30716,30713,30715,30714,30711,31042,31039,31173,31352,
+31355,31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,
+33472,33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,
+33441,33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,
+36811,36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,
+38460,38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,
+20411,20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,
+21309,21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,
+21687,21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,
+21680,22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,
+22437,22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,
+23037,23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,
+23021,23464,23628,23760,23768,23756,23767,23755,23771,23774,23770,23753,23751,
+23754,23766,23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,
+24099,24096,24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,
+24631,24633,24660,24690,24670,24645,24659,24647,24649,
+24667,24652,24640,24642,24671,24612,24644,24664,24678,24686,25154,25155,25295,
+25357,25355,25333,25358,25347,25323,25337,25359,25356,25336,25334,25344,25363,
+25364,25338,25365,25339,25328,25921,25923,26026,26047,26166,26145,26162,26165,
+26140,26150,26146,26163,26155,26170,26141,26164,26169,26158,26383,26384,26561,
+26610,26568,26554,26588,26555,26616,26584,26560,26551,26565,26603,26596,26591,
+26549,26573,26547,26615,26614,26606,26595,26562,26553,26574,26599,26608,26546,
+26620,26566,26605,26572,26542,26598,26587,26618,26569,26570,26563,26602,26571,
+27432,27522,27524,27574,27606,27608,27616,27680,27681,27944,27956,27949,27935,
+27964,27967,27922,27914,27866,27955,27908,27929,27962,27930,27921,27904,27933,
+27970,27905,27928,27959,27907,27919,27968,27911,27936,27948,27912,27938,27913,
+27920,28855,28831,28862,28849,28848,28833,28852,28853,28841,29249,29257,29258,
+29292,29296,29299,29294,29386,29412,29416,29419,29407,29418,29414,29411,29573,
+29644,29634,29640,29637,29625,29622,29621,29620,29675,29631,29639,29630,29635,
+29638,29624,29643,29932,29934,29998,30023,30024,30119,30122,30329,30404,30472,
+30467,30468,30469,30474,30455,30459,30458,30695,30696,30726,30737,30738,30725,
+30736,30735,30734,30729,30723,30739,31050,31052,31051,31045,31044,31189,31181,
+31183,31190,31182,31360,31358,31441,31488,31489,31866,31864,31865,31871,31872,
+31873,32003,32008,32001,32600,32657,32653,32702,32775,32782,32783,32788,32823,
+32984,32967,32992,32977,32968,32962,32976,32965,32995,32985,32988,32970,32981,
+32969,32975,32983,32998,32973,33279,33313,33428,33497,
+33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,33505,33522,
+33525,33548,33531,33526,33520,33514,33508,33504,33530,33523,33517,34423,34420,
+34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,36833,
+36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,37331,
+38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,20507,
+20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,20527,
+20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,21074,
+21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,21747,
+21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,21752,
+21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,22461,
+22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,23085,
+23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,23638,
+23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,24234,
+24236,24371,24368,24423,24669,24666,24679,24641,24738,24712,24704,24722,24705,
+24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,
+25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,
+25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,
+25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,
+26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,
+26702,26692,26676,26653,26642,26644,26662,26664,26670,
+26701,26682,26661,26656,27436,27439,27437,27441,27444,27501,32898,27528,27622,
+27620,27624,27619,27618,27623,27685,28026,28003,28004,28022,27917,28001,28050,
+27992,28002,28013,28015,28049,28045,28143,28031,28038,27998,28007,28000,28055,
+28016,28028,27999,28034,28056,27951,28008,28043,28030,28032,28036,27926,28035,
+28027,28029,28021,28048,28892,28883,28881,28893,28875,32569,28898,28887,28882,
+28894,28896,28884,28877,28869,28870,28871,28890,28878,28897,29250,29304,29303,
+29302,29440,29434,29428,29438,29430,29427,29435,29441,29651,29657,29669,29654,
+29628,29671,29667,29673,29660,29650,29659,29652,29661,29658,29655,29656,29672,
+29918,29919,29940,29941,29985,30043,30047,30128,30145,30139,30148,30144,30143,
+30134,30138,30346,30409,30493,30491,30480,30483,30482,30499,30481,30485,30489,
+30490,30498,30503,30755,30764,30754,30773,30767,30760,30766,30763,30753,30761,
+30771,30762,30769,31060,31067,31055,31068,31059,31058,31057,31211,31212,31200,
+31214,31213,31210,31196,31198,31197,31366,31369,31365,31371,31372,31370,31367,
+31448,31504,31492,31507,31493,31503,31496,31498,31502,31497,31506,31876,31889,
+31882,31884,31880,31885,31877,32030,32029,32017,32014,32024,32022,32019,32031,
+32018,32015,32012,32604,32609,32606,32608,32605,32603,32662,32658,32707,32706,
+32704,32790,32830,32825,33018,33010,33017,33013,33025,33019,33024,33281,33327,
+33317,33587,33581,33604,33561,33617,33573,33622,33599,33601,33574,33564,33570,
+33602,33614,33563,33578,33544,33596,33613,33558,33572,33568,33591,33583,33577,
+33607,33605,33612,33619,33566,33580,33611,33575,33608,
+34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,34438,34443,34458,
+34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,34452,34883,34884,
+34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,34932,34940,35346,
+35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,36561,36563,36862,
+36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,37082,37091,37087,
+37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,37346,37338,38492,
+38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,20576,20563,20555,
+20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,20575,20585,20587,
+20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,21101,21100,21102,
+21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,21802,21841,21858,
+21814,21813,21808,21842,21829,21772,21810,21861,21838,21817,21832,21805,21819,
+21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,22509,22525,
+22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,22497,22542,
+22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,23136,23128,
+23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,23140,23127,
+23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,23152,23145,
+23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,23819,23837,
+23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,23839,23854,
+24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,24479,24714,
+24720,24710,24766,24752,24762,24787,24788,24783,24804,
+24793,24797,24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,
+25482,25474,25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,
+25454,25519,25461,25500,25453,25518,25468,25508,25403,25503,25464,25477,25473,
+25489,25485,25456,25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,
+26759,26768,26780,26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,
+26740,26802,26767,26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,
+26774,26763,26784,26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,
+27447,27448,27537,27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,
+28076,28137,28130,28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,
+28124,28125,28123,28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,
+28112,28146,28115,28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,
+28940,28912,28932,28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,
+28930,28942,29310,29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,
+29439,29455,29470,29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,
+29692,29695,29708,29707,29684,29704,30052,30051,30158,30162,30159,30155,30156,
+30161,30160,30351,30345,30419,30521,30511,30509,30513,30514,30516,30515,30525,
+30501,30523,30517,30792,30802,30793,30797,30794,30796,30758,30789,30800,31076,
+31079,31081,31082,31075,31083,31073,31163,31226,31224,31222,31223,31375,31380,
+31376,31541,31559,31540,31525,31536,31522,31524,31539,31512,31530,31517,31537,
+31531,31533,31535,31538,31544,31514,31523,31892,31896,
+31894,31907,32053,32061,32056,32054,32058,32069,32044,32041,32065,32071,32062,
+32063,32074,32059,32040,32611,32661,32668,32669,32667,32714,32715,32717,32720,
+32721,32711,32719,32713,32799,32798,32795,32839,32835,32840,33048,33061,33049,
+33051,33069,33055,33068,33054,33057,33045,33063,33053,33058,33297,33336,33331,
+33338,33332,33330,33396,33680,33699,33704,33677,33658,33651,33700,33652,33679,
+33665,33685,33689,33653,33684,33705,33661,33667,33676,33693,33691,33706,33675,
+33662,33701,33711,33672,33687,33712,33663,33702,33671,33710,33654,33690,34393,
+34390,34495,34487,34498,34497,34501,34490,34480,34504,34489,34483,34488,34508,
+34484,34491,34492,34499,34493,34494,34898,34953,34965,34984,34978,34986,34970,
+34961,34977,34975,34968,34983,34969,34971,34967,34980,34988,34956,34963,34958,
+35202,35286,35289,35285,35376,35367,35372,35358,35897,35899,35932,35933,35965,
+36005,36221,36219,36217,36284,36290,36281,36287,36289,36568,36574,36573,36572,
+36567,36576,36577,36900,36875,36881,36892,36876,36897,37103,37098,37104,37108,
+37106,37107,37076,37099,37100,37097,37206,37208,37210,37203,37205,37356,37364,
+37361,37363,37368,37348,37369,37354,37355,37367,37352,37358,38266,38278,38280,
+38524,38509,38507,38513,38511,38591,38762,38916,39141,39319,20635,20629,20628,
+20638,20619,20643,20611,20620,20622,20637,20584,20636,20626,20610,20615,20831,
+20948,21266,21265,21412,21415,21905,21928,21925,21933,21879,22085,21922,21907,
+21896,21903,21941,21889,21923,21906,21924,21885,21900,21926,21887,21909,21921,
+21902,22284,22569,22583,22553,22558,22567,22563,22568,
+22517,22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,
+22587,22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,
+23189,23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,
+23183,23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,
+23875,23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,
+23857,23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,
+24408,24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,
+24854,24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,
+24836,24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,
+25546,25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,
+25555,25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,
+25948,25960,25957,25996,26013,26014,26030,26064,26066,26236,26220,26235,26240,
+26225,26233,26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,
+26895,26838,26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,
+26992,26804,26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,
+26903,26830,26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,
+26823,27449,27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,
+27696,28156,28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,
+28225,28253,28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,
+28252,28257,28209,28200,28256,28273,28267,28217,28194,
+28208,28243,28261,28199,28280,28260,28279,28245,28281,28242,28262,28213,28214,
+28250,28960,28958,28975,28923,28974,28977,28963,28965,28962,28978,28959,28968,
+28986,28955,29259,29274,29320,29321,29318,29317,29323,29458,29451,29488,29474,
+29489,29491,29479,29490,29485,29478,29475,29493,29452,29742,29740,29744,29739,
+29718,29722,29729,29741,29745,29732,29731,29725,29737,29728,29746,29947,29999,
+30063,30060,30183,30170,30177,30182,30173,30175,30180,30167,30357,30354,30426,
+30534,30535,30532,30541,30533,30538,30542,30539,30540,30686,30700,30816,30820,
+30821,30812,30829,30833,30826,30830,30832,30825,30824,30814,30818,31092,31091,
+31090,31088,31234,31242,31235,31244,31236,31385,31462,31460,31562,31547,31556,
+31560,31564,31566,31552,31576,31557,31906,31902,31912,31905,32088,32111,32099,
+32083,32086,32103,32106,32079,32109,32092,32107,32082,32084,32105,32081,32095,
+32078,32574,32575,32613,32614,32674,32672,32673,32727,32849,32847,32848,33022,
+32980,33091,33098,33106,33103,33095,33085,33101,33082,33254,33262,33271,33272,
+33273,33284,33340,33341,33343,33397,33595,33743,33785,33827,33728,33768,33810,
+33767,33764,33788,33782,33808,33734,33736,33771,33763,33727,33793,33757,33765,
+33752,33791,33761,33739,33742,33750,33781,33737,33801,33807,33758,33809,33798,
+33730,33779,33749,33786,33735,33745,33770,33811,33731,33772,33774,33732,33787,
+33751,33762,33819,33755,33790,34520,34530,34534,34515,34531,34522,34538,34525,
+34539,34524,34540,34537,34519,34536,34513,34888,34902,34901,35002,35031,35001,
+35000,35008,35006,34998,35004,34999,35005,34994,35073,
+35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,35415,
+35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,36026,
+36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,36316,
+36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,36581,
+36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,37126,
+37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,37217,
+37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,37376,
+37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,37398,
+38267,38285,38284,38288,38535,38526,38536,38537,38531,38528,38594,38600,38595,
+38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,
+20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,
+20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,
+21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,
+21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,
+22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,
+23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,
+23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,
+23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,
+24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,
+24886,24882,24878,24902,24879,24911,24873,24896,25120,
+37224,25123,25125,25124,25541,25585,25579,25616,25618,25609,25632,25636,25651,
+25667,25631,25621,25624,25657,25655,25634,25635,25612,25638,25648,25640,25665,
+25653,25647,25610,25626,25664,25637,25639,25611,25575,25627,25646,25633,25614,
+25967,26002,26067,26246,26252,26261,26256,26251,26250,26265,26260,26232,26400,
+26982,26975,26936,26958,26978,26993,26943,26949,26986,26937,26946,26967,26969,
+27002,26952,26953,26933,26988,26931,26941,26981,26864,27000,26932,26985,26944,
+26991,26948,26998,26968,26945,26996,26956,26939,26955,26935,26972,26959,26961,
+26930,26962,26927,27003,26940,27462,27461,27459,27458,27464,27457,27547,64013,
+27643,27644,27641,27639,27640,28315,28374,28360,28303,28352,28319,28307,28308,
+28320,28337,28345,28358,28370,28349,28353,28318,28361,28343,28336,28365,28326,
+28367,28338,28350,28355,28380,28376,28313,28306,28302,28301,28324,28321,28351,
+28339,28368,28362,28311,28334,28323,28999,29012,29010,29027,29024,28993,29021,
+29026,29042,29048,29034,29025,28994,29016,28995,29003,29040,29023,29008,29011,
+28996,29005,29018,29263,29325,29324,29329,29328,29326,29500,29506,29499,29498,
+29504,29514,29513,29764,29770,29771,29778,29777,29783,29760,29775,29776,29774,
+29762,29766,29773,29780,29921,29951,29950,29949,29981,30073,30071,27011,30191,
+30223,30211,30199,30206,30204,30201,30200,30224,30203,30198,30189,30197,30205,
+30361,30389,30429,30549,30559,30560,30546,30550,30554,30569,30567,30548,30553,
+30573,30688,30855,30874,30868,30863,30852,30869,30853,30854,30881,30851,30841,
+30873,30848,30870,30843,31100,31106,31101,31097,31249,
+31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,31394,31390,31467,
+31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,31585,31608,31606,
+31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,32122,32142,32123,
+32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,32616,32620,32678,
+32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,33115,33122,33138,
+26401,33118,33142,33127,33135,33092,33121,33309,33353,33348,33344,33346,33349,
+34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,33895,33840,
+33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,33844,33914,
+33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,33904,33849,
+33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,33918,33860,
+33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,34549,34637,
+34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,35038,35035,
+35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,35292,35302,
+35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,35444,35450,
+35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,36201,36241,
+36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,36337,36334,
+36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,36608,36613,
+36615,36616,36610,36619,36946,36927,36932,36937,36925,37136,37133,37135,37137,
+37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,37477,
+37470,37507,37422,37450,37446,37485,37484,37455,37472,
+37479,37487,37430,37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,
+37462,37426,38303,38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,
+38648,38645,38771,38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,
+39346,39344,39349,39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,
+20695,20712,20723,20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,
+20952,21120,21121,21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,
+22044,22017,22035,22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,
+22662,22657,22655,22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,
+22676,22671,22782,22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,
+23266,23264,23259,23276,23262,23261,23257,23272,23263,23415,23520,23523,23651,
+23938,23936,23933,23942,23930,23937,23927,23946,23945,23944,23934,23932,23949,
+23929,23935,24152,24153,24147,24280,24273,24279,24270,24284,24277,24281,24274,
+24276,24388,24387,24431,24502,24876,24872,24897,24926,24945,24947,24914,24915,
+24946,24940,24960,24948,24916,24954,24923,24933,24891,24938,24929,24918,25129,
+25127,25131,25643,25677,25691,25693,25716,25718,25714,25715,25725,25717,25702,
+25766,25678,25730,25694,25692,25675,25683,25696,25680,25727,25663,25708,25707,
+25689,25701,25719,25971,26016,26273,26272,26271,26373,26372,26402,27057,27062,
+27081,27040,27086,27030,27056,27052,27068,27025,27033,27022,27047,27021,27049,
+27070,27055,27071,27076,27069,27044,27092,27065,27082,27034,27087,27059,27027,
+27050,27041,27038,27097,27031,27024,27074,27061,27045,
+27078,27466,27469,27467,27550,27551,27552,27587,27588,27646,28366,28405,28401,
+28419,28453,28408,28471,28411,28462,28425,28494,28441,28442,28455,28440,28475,
+28434,28397,28426,28470,28531,28409,28398,28461,28480,28464,28476,28469,28395,
+28423,28430,28483,28421,28413,28406,28473,28444,28412,28474,28447,28429,28446,
+28424,28449,29063,29072,29065,29056,29061,29058,29071,29051,29062,29057,29079,
+29252,29267,29335,29333,29331,29507,29517,29521,29516,29794,29811,29809,29813,
+29810,29799,29806,29952,29954,29955,30077,30096,30230,30216,30220,30229,30225,
+30218,30228,30392,30593,30588,30597,30594,30574,30592,30575,30590,30595,30898,
+30890,30900,30893,30888,30846,30891,30878,30885,30880,30892,30882,30884,31128,
+31114,31115,31126,31125,31124,31123,31127,31112,31122,31120,31275,31306,31280,
+31279,31272,31270,31400,31403,31404,31470,31624,31644,31626,31633,31632,31638,
+31629,31628,31643,31630,31621,31640,21124,31641,31652,31618,31931,31935,31932,
+31930,32167,32183,32194,32163,32170,32193,32192,32197,32157,32206,32196,32198,
+32203,32204,32175,32185,32150,32188,32159,32166,32174,32169,32161,32201,32627,
+32738,32739,32741,32734,32804,32861,32860,33161,33158,33155,33159,33165,33164,
+33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,33966,33963,33977,
+33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,33954,33940,33991,
+33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,34007,34004,34002,
+34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,34590,34593,34585,
+34587,34627,34604,34625,34622,34630,34592,34610,34602,
+34605,34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,
+34577,35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,
+35051,35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,
+35478,35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,
+36362,36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,
+37148,37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,
+37541,37540,37494,37531,37498,37536,37524,37546,37517,37542,37530,37547,37497,
+37527,37503,37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,
+37516,37529,37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,
+38781,38778,38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,
+39085,39086,39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,
+39367,39601,39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,
+20735,20739,20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,
+21132,21233,21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,
+22080,22067,22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,
+22691,22703,22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,
+23298,23289,23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,
+23957,23968,23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,
+24289,24393,24498,24971,24963,24953,25009,25008,24994,24969,24987,24979,25007,
+25005,24991,24978,25002,24993,24973,24934,25011,25133,
+25710,25712,25750,25760,25733,25751,25756,25743,25739,25738,25740,25763,25759,
+25704,25777,25752,25974,25978,25977,25979,26034,26035,26293,26288,26281,26290,
+26295,26282,26287,27136,27142,27159,27109,27128,27157,27121,27108,27168,27135,
+27116,27106,27163,27165,27134,27175,27122,27118,27156,27127,27111,27200,27144,
+27110,27131,27149,27132,27115,27145,27140,27160,27173,27151,27126,27174,27143,
+27124,27158,27473,27557,27555,27554,27558,27649,27648,27647,27650,28481,28454,
+28542,28551,28614,28562,28557,28553,28556,28514,28495,28549,28506,28566,28534,
+28524,28546,28501,28530,28498,28496,28503,28564,28563,28509,28416,28513,28523,
+28541,28519,28560,28499,28555,28521,28543,28565,28515,28535,28522,28539,29106,
+29103,29083,29104,29088,29082,29097,29109,29085,29093,29086,29092,29089,29098,
+29084,29095,29107,29336,29338,29528,29522,29534,29535,29536,29533,29531,29537,
+29530,29529,29538,29831,29833,29834,29830,29825,29821,29829,29832,29820,29817,
+29960,29959,30078,30245,30238,30233,30237,30236,30243,30234,30248,30235,30364,
+30365,30366,30363,30605,30607,30601,30600,30925,30907,30927,30924,30929,30926,
+30932,30920,30915,30916,30921,31130,31137,31136,31132,31138,31131,27510,31289,
+31410,31412,31411,31671,31691,31678,31660,31694,31663,31673,31690,31669,31941,
+31944,31948,31947,32247,32219,32234,32231,32215,32225,32259,32250,32230,32246,
+32241,32240,32238,32223,32630,32684,32688,32685,32749,32747,32746,32748,32742,
+32744,32868,32871,33187,33183,33182,33173,33186,33177,33175,33302,33359,33363,
+33362,33360,33358,33361,34084,34107,34063,34048,34089,
+34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,34036,
+34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,34088,
+34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,34041,
+34072,34080,34096,34059,34073,34095,34402,34646,34659,34660,34679,34785,34675,
+34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,
+34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,
+34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,
+35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,
+35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,
+36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,
+36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,
+36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,
+36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,
+37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,
+37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,
+37581,37589,37577,37600,37598,37607,37585,37587,37557,37601,37574,37556,38268,
+38316,38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,
+38792,38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,
+39162,39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,
+39382,39384,39371,39383,39372,39603,39660,39659,39667,
+39666,39665,39750,39747,39783,39796,39793,39782,39798,39797,39792,39784,39780,
+39788,40188,40186,40189,40191,40183,40199,40192,40185,40187,40200,40197,40196,
+40579,40659,40719,40720,20764,20755,20759,20762,20753,20958,21300,21473,22128,
+22112,22126,22131,22118,22115,22125,22130,22110,22135,22300,22299,22728,22717,
+22729,22719,22714,22722,22716,22726,23319,23321,23323,23329,23316,23315,23312,
+23318,23336,23322,23328,23326,23535,23980,23985,23977,23975,23989,23984,23982,
+23978,23976,23986,23981,23983,23988,24167,24168,24166,24175,24297,24295,24294,
+24296,24293,24395,24508,24989,25000,24982,25029,25012,25030,25025,25036,25018,
+25023,25016,24972,25815,25814,25808,25807,25801,25789,25737,25795,25819,25843,
+25817,25907,25983,25980,26018,26312,26302,26304,26314,26315,26319,26301,26299,
+26298,26316,26403,27188,27238,27209,27239,27186,27240,27198,27229,27245,27254,
+27227,27217,27176,27226,27195,27199,27201,27242,27236,27216,27215,27220,27247,
+27241,27232,27196,27230,27222,27221,27213,27214,27206,27477,27476,27478,27559,
+27562,27563,27592,27591,27652,27651,27654,28589,28619,28579,28615,28604,28622,
+28616,28510,28612,28605,28574,28618,28584,28676,28581,28590,28602,28588,28586,
+28623,28607,28600,28578,28617,28587,28621,28591,28594,28592,29125,29122,29119,
+29112,29142,29120,29121,29131,29140,29130,29127,29135,29117,29144,29116,29126,
+29146,29147,29341,29342,29545,29542,29543,29548,29541,29547,29546,29823,29850,
+29856,29844,29842,29845,29857,29963,30080,30255,30253,30257,30269,30259,30268,
+30261,30258,30256,30395,30438,30618,30621,30625,30620,
+30619,30626,30627,30613,30617,30615,30941,30953,30949,30954,30942,30947,30939,
+30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,31413,31409,
+31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,31722,31714,
+31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,32279,32268,
+32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,32269,32276,
+32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,33201,33190,
+33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,33365,33366,
+33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,34113,34146,
+34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,34151,34144,
+34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,34711,34707,
+34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,34717,34692,
+34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,35106,35113,
+35107,35119,35116,35103,35313,35552,35554,35570,35572,35573,35549,35604,35556,
+35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,36085,
+36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,36421,
+36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,36663,
+36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,37261,
+37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,37650,
+37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,37684,
+37634,37668,37631,37673,37689,37685,37674,37652,37644,
+37643,37630,37641,37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,
+38325,38333,38569,38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,
+38959,38962,39204,39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,
+39402,39401,39399,39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,
+39813,39815,39804,39806,39803,39810,39827,39826,39824,39802,39829,39805,39816,
+40229,40215,40224,40222,40212,40233,40221,40216,40226,40208,40217,40223,40584,
+40582,40583,40622,40621,40661,40662,40698,40722,40765,20774,20773,20770,20772,
+20768,20777,21236,22163,22156,22157,22150,22148,22147,22142,22146,22143,22145,
+22742,22740,22735,22738,23341,23333,23346,23331,23340,23335,23334,23343,23342,
+23419,23537,23538,23991,24172,24170,24510,24507,25027,25013,25020,25063,25056,
+25061,25060,25064,25054,25839,25833,25827,25835,25828,25832,25985,25984,26038,
+26074,26322,27277,27286,27265,27301,27273,27295,27291,27297,27294,27271,27283,
+27278,27285,27267,27304,27300,27281,27263,27302,27290,27269,27276,27282,27483,
+27565,27657,28620,28585,28660,28628,28643,28636,28653,28647,28646,28638,28658,
+28637,28642,28648,29153,29169,29160,29170,29156,29168,29154,29555,29550,29551,
+29847,29874,29867,29840,29866,29869,29873,29861,29871,29968,29969,29970,29967,
+30084,30275,30280,30281,30279,30372,30441,30645,30635,30642,30647,30646,30644,
+30641,30632,30704,30963,30973,30978,30971,30972,30962,30981,30969,30974,30980,
+31147,31144,31324,31323,31318,31320,31316,31322,31422,31424,31425,31749,31759,
+31730,31744,31743,31739,31758,31732,31755,31731,31746,
+31753,31747,31745,31736,31741,31750,31728,31729,31760,31754,31976,32301,32316,
+32322,32307,38984,32312,32298,32329,32320,32327,32297,32332,32304,32315,32310,
+32324,32314,32581,32639,32638,32637,32756,32754,32812,33211,33220,33228,33226,
+33221,33223,33212,33257,33371,33370,33372,34179,34176,34191,34215,34197,34208,
+34187,34211,34171,34212,34202,34206,34167,34172,34185,34209,34170,34168,34135,
+34190,34198,34182,34189,34201,34205,34177,34210,34178,34184,34181,34169,34166,
+34200,34192,34207,34408,34750,34730,34733,34757,34736,34732,34745,34741,34748,
+34734,34761,34755,34754,34764,34743,34735,34756,34762,34740,34742,34751,34744,
+34749,34782,34738,35125,35123,35132,35134,35137,35154,35127,35138,35245,35247,
+35246,35314,35315,35614,35608,35606,35601,35589,35595,35618,35599,35602,35605,
+35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,35953,35951,35989,
+35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,36672,36997,36990,
+37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,37763,37807,37732,
+37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,37741,37775,37708,
+37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,37726,37731,37735,
+37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,38576,38572,38688,
+38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,38868,38897,38977,
+38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,39218,39215,39213,
+39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,39416,39414,39419,
+39421,39422,39420,39427,39614,39678,39677,39681,39676,
+39752,39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,
+40243,40257,40295,40246,40238,40239,40241,40248,40240,40261,40258,40259,40254,
+40247,40256,40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,
+40740,40739,40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,
+22169,22896,23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,
+25066,25072,25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,
+26075,26330,26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,
+27316,27309,27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,
+28672,28667,28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,
+29888,29877,29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,
+30291,30295,30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,
+30992,30994,30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,
+31782,31784,31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,
+32352,32343,32339,32693,32691,32759,32760,32885,33233,33234,33232,33375,33374,
+34228,34246,34240,34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,
+34248,34245,34225,34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,
+34779,34795,34794,34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,
+34724,34775,34777,34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,
+35153,35145,35626,35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,
+35621,35639,35622,35638,35630,35620,35643,35645,35642,
+35906,35957,35993,35992,35991,36094,36100,36098,36096,36444,36450,36448,36439,
+36438,36446,36453,36455,36443,36442,36449,36445,36457,36436,36678,36679,36680,
+36683,37160,37178,37179,37182,37288,37285,37287,37295,37290,37813,37772,37778,
+37815,37787,37789,37769,37799,37774,37802,37790,37798,37781,37768,37785,37791,
+37773,37809,37777,37810,37796,37800,37812,37795,37797,38354,38355,38353,38579,
+38615,38618,24002,38623,38616,38621,38691,38690,38693,38828,38830,38824,38827,
+38820,38826,38818,38821,38871,38873,38870,38872,38906,38992,38993,38994,39096,
+39233,39228,39226,39439,39435,39433,39437,39428,39441,39434,39429,39431,39430,
+39616,39644,39688,39684,39685,39721,39733,39754,39756,39755,39879,39878,39875,
+39871,39873,39861,39864,39891,39862,39876,39865,39869,40284,40275,40271,40266,
+40283,40267,40281,40278,40268,40279,40274,40276,40287,40280,40282,40590,40588,
+40671,40705,40704,40726,40741,40747,40746,40745,40744,40780,40789,20788,20789,
+21142,21239,21428,22187,22189,22182,22183,22186,22188,22746,22749,22747,22802,
+23357,23358,23359,24003,24176,24511,25083,25863,25872,25869,25865,25868,25870,
+25988,26078,26077,26334,27367,27360,27340,27345,27353,27339,27359,27356,27344,
+27371,27343,27341,27358,27488,27568,27660,28697,28711,28704,28694,28715,28705,
+28706,28707,28713,28695,28708,28700,28714,29196,29194,29191,29186,29189,29349,
+29350,29348,29347,29345,29899,29893,29879,29891,29974,30304,30665,30666,30660,
+30705,31005,31003,31009,31004,30999,31006,31152,31335,31336,31795,31804,31801,
+31788,31803,31980,31978,32374,32373,32376,32368,32375,
+32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,
+33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,
+34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,
+34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,
+34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,
+35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,
+35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,
+36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,
+37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,
+37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,
+38362,38363,38625,38697,38699,38700,38696,38694,38835,38839,38838,38877,38878,
+38879,39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,
+39335,39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,
+39444,39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,
+39906,39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,
+40330,40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,
+40304,40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,
+40640,40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,
+22755,23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,
+26079,26344,26339,26340,27379,27376,27370,27368,27385,
+27377,27374,27375,28732,28725,28719,28727,28724,28721,28738,28728,28735,28730,
+28729,28736,28731,28723,28737,29203,29204,29352,29565,29564,29882,30379,30378,
+30398,30445,30668,30670,30671,30669,30706,31013,31011,31015,31016,31012,31017,
+31154,31342,31340,31341,31479,31817,31816,31818,31815,31813,31982,32379,32382,
+32385,32384,32698,32767,32889,33243,33241,33291,33384,33385,34338,34303,34305,
+34302,34331,34304,34294,34308,34313,34309,34316,34301,34841,34832,34833,34839,
+34835,34838,35171,35174,35257,35319,35680,35690,35677,35688,35683,35685,35687,
+35693,36270,36486,36488,36484,36697,36694,36695,36693,36696,36698,37005,37187,
+37185,37303,37301,37298,37299,37899,37907,37883,37920,37903,37908,37886,37909,
+37904,37928,37913,37901,37877,37888,37879,37895,37902,37910,37906,37882,37897,
+37880,37898,37887,37884,37900,37878,37905,37894,38366,38368,38367,38702,38703,
+38841,38843,38909,38910,39008,39010,39011,39007,39105,39106,39248,39246,39257,
+39244,39243,39251,39474,39476,39473,39468,39466,39478,39465,39470,39480,39469,
+39623,39626,39622,39696,39698,39697,39947,39944,39927,39941,39954,39928,40000,
+39943,39950,39942,39959,39956,39945,40351,40345,40356,40349,40338,40344,40336,
+40347,40352,40340,40348,40362,40343,40353,40346,40354,40360,40350,40355,40383,
+40361,40342,40358,40359,40601,40603,40602,40677,40676,40679,40678,40752,40750,
+40795,40800,40798,40797,40793,40849,20794,20793,21144,21143,22211,22205,22206,
+23368,23367,24011,24015,24305,25085,25883,27394,27388,27395,27384,27392,28739,
+28740,28746,28744,28745,28741,28742,29213,29210,29209,
+29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,32391,32392,
+32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,34339,34332,
+34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,34848,34852,
+34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,35706,35707,
+36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,37305,37951,
+37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,37937,38373,
+38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,39254,39481,
+39485,39494,39492,39490,39489,39482,39487,39629,39701,39703,39704,39702,39738,
+39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,40380,
+40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,40364,
+40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,40731,
+40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,23371,
+23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,28757,
+28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,30381,
+31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,32591,
+32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,34858,
+34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,36501,
+36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,37963,
+37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,39259,
+39502,39507,39508,39500,39503,39496,39498,39497,39506,
+39504,39632,39705,39723,39739,39766,39765,40006,40008,39999,40004,39993,39987,
+40001,39996,39991,39988,39986,39997,39990,40411,40402,40414,40410,40395,40400,
+40412,40401,40415,40425,40409,40408,40406,40437,40405,40413,40630,40688,40757,
+40755,40754,40770,40811,40853,40866,20797,21145,22760,22759,22898,23373,24024,
+34863,24399,25089,25091,25092,25897,25893,26006,26347,27409,27410,27407,27594,
+28763,28762,29218,29570,29569,29571,30320,30676,31847,31846,32405,33388,34362,
+34368,34361,34364,34353,34363,34366,34864,34866,34862,34867,35190,35188,35187,
+35326,35724,35726,35723,35720,35909,36121,36504,36708,36707,37308,37986,37973,
+37981,37975,37982,38852,38853,38912,39510,39513,39710,39711,39712,40018,40024,
+40016,40010,40013,40011,40021,40025,40012,40014,40443,40439,40431,40419,40427,
+40440,40420,40438,40417,40430,40422,40434,40432,40418,40428,40436,40435,40424,
+40429,40642,40656,40690,40691,40710,40732,40760,40759,40758,40771,40783,40817,
+40816,40814,40815,22227,22221,23374,23661,25901,26349,26350,27411,28767,28769,
+28765,28768,29219,29915,29925,30677,31032,31159,31158,31850,32407,32649,33389,
+34371,34872,34871,34869,34891,35732,35733,36510,36511,36512,36509,37310,37309,
+37314,37995,37992,37993,38629,38726,38723,38727,38855,38885,39518,39637,39769,
+40035,40039,40038,40034,40030,40032,40450,40446,40455,40451,40454,40453,40448,
+40449,40457,40447,40445,40452,40608,40734,40774,40820,40821,40822,22228,25902,
+26040,27416,27417,27415,27418,28770,29222,29354,30680,30681,31033,31849,31851,
+31990,32410,32408,32411,32409,33248,33249,34374,34375,
+34376,35193,35194,35196,35195,35327,35736,35737,36517,36516,36515,37998,37997,
+37999,38001,38003,38729,39026,39263,40040,40046,40045,40459,40461,40464,40463,
+40466,40465,40609,40693,40713,40775,40824,40827,40826,40825,22302,28774,31855,
+34876,36274,36518,37315,38004,38008,38006,38005,39520,40052,40051,40049,40053,
+40468,40467,40694,40714,40868,28776,28773,31991,34410,34878,34877,34879,35742,
+35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,39526,39527,39716,
+40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,38017,39529,39528,
+39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,40058,40477,28777,
+28778,40612,40830,40777,40856,30849,37561,35023,22715,24658,31911,23290,9556,
+9574,9559,9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,
+9575,9563,9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,
+9584,9583,9619,
diff --git a/libc-top-half/musl/src/locale/bind_textdomain_codeset.c b/libc-top-half/musl/src/locale/bind_textdomain_codeset.c
new file mode 100644
index 0000000..5ebfd5e
--- /dev/null
+++ b/libc-top-half/musl/src/locale/bind_textdomain_codeset.c
@@ -0,0 +1,11 @@
+#include <libintl.h>
+#include <string.h>
+#include <strings.h>
+#include <errno.h>
+
+char *bind_textdomain_codeset(const char *domainname, const char *codeset)
+{
+ if (codeset && strcasecmp(codeset, "UTF-8"))
+ errno = EINVAL;
+ return NULL;
+}
diff --git a/libc-top-half/musl/src/locale/c_locale.c b/libc-top-half/musl/src/locale/c_locale.c
new file mode 100644
index 0000000..77ccf58
--- /dev/null
+++ b/libc-top-half/musl/src/locale/c_locale.c
@@ -0,0 +1,15 @@
+#include "locale_impl.h"
+#include <stdint.h>
+
+static const uint32_t empty_mo[] = { 0x950412de, 0, -1, -1, -1 };
+
+const struct __locale_map __c_dot_utf8 = {
+ .map = empty_mo,
+ .map_size = sizeof empty_mo,
+ .name = "C.UTF-8"
+};
+
+const struct __locale_struct __c_locale = { 0 };
+const struct __locale_struct __c_dot_utf8_locale = {
+ .cat[LC_CTYPE] = &__c_dot_utf8
+};
diff --git a/libc-top-half/musl/src/locale/catclose.c b/libc-top-half/musl/src/locale/catclose.c
new file mode 100644
index 0000000..a110246
--- /dev/null
+++ b/libc-top-half/musl/src/locale/catclose.c
@@ -0,0 +1,18 @@
+#define _BSD_SOURCE
+#include <nl_types.h>
+#include <stdint.h>
+#include <endian.h>
+#ifdef __wasilibc_unmodified_upstream // wasi-libc doesn't support catgets yet
+#include <sys/mman.h>
+#endif
+
+#define V(p) be32toh(*(uint32_t *)(p))
+
+int catclose (nl_catd catd)
+{
+#ifdef __wasilibc_unmodified_upstream // wasi-libc doesn't support catgets yet
+ char *map = (char *)catd;
+ munmap(map, V(map+8)+20);
+#endif
+ return 0;
+}
diff --git a/libc-top-half/musl/src/locale/catgets.c b/libc-top-half/musl/src/locale/catgets.c
new file mode 100644
index 0000000..ad0457f
--- /dev/null
+++ b/libc-top-half/musl/src/locale/catgets.c
@@ -0,0 +1,44 @@
+#define _BSD_SOURCE
+#include <nl_types.h>
+#include <endian.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <errno.h>
+
+#define V(p) be32toh(*(uint32_t *)(p))
+
+#ifdef __wasilibc_unmodified_upstream // wasi-libc doesn't support catgets yet
+static int cmp(const void *a, const void *b)
+{
+ uint32_t x = V(a), y = V(b);
+ return x<y ? -1 : x>y ? 1 : 0;
+}
+#endif
+
+char *catgets (nl_catd catd, int set_id, int msg_id, const char *s)
+{
+#ifdef __wasilibc_unmodified_upstream // wasi-libc doesn't support catgets yet
+ const char *map = (const char *)catd;
+ uint32_t nsets = V(map+4);
+ const char *sets = map+20;
+ const char *msgs = map+20+V(map+12);
+ const char *strings = map+20+V(map+16);
+ uint32_t set_id_be = htobe32(set_id);
+ uint32_t msg_id_be = htobe32(msg_id);
+ const char *set = bsearch(&set_id_be, sets, nsets, 12, cmp);
+ if (!set) {
+ errno = ENOMSG;
+ return (char *)s;
+ }
+ uint32_t nmsgs = V(set+4);
+ msgs += 12*V(set+8);
+ const char *msg = bsearch(&msg_id_be, msgs, nmsgs, 12, cmp);
+ if (!msg) {
+ errno = ENOMSG;
+ return (char *)s;
+ }
+ return (char *)(strings + V(msg+8));
+#else
+ return (char *)s;
+#endif
+}
diff --git a/libc-top-half/musl/src/locale/catopen.c b/libc-top-half/musl/src/locale/catopen.c
new file mode 100644
index 0000000..c6116b1
--- /dev/null
+++ b/libc-top-half/musl/src/locale/catopen.c
@@ -0,0 +1,87 @@
+#define _BSD_SOURCE
+#include <nl_types.h>
+#include <string.h>
+#include <stdint.h>
+#include <endian.h>
+#include <errno.h>
+#include <langinfo.h>
+#include <locale.h>
+#ifdef __wasilibc_unmodified_upstream // wasi-libc doesn't support catgets yet
+#include <sys/mman.h>
+#endif
+#include "libc.h"
+
+#define V(p) be32toh(*(uint32_t *)(p))
+
+#ifdef __wasilibc_unmodified_upstream // wasi-libc doesn't support catgets yet
+static nl_catd do_catopen(const char *name)
+{
+ size_t size;
+ const unsigned char *map = __map_file(name, &size);
+ /* Size recorded in the file must match file size; otherwise
+ * the information needed to unmap the file will be lost. */
+ if (!map || V(map) != 0xff88ff89 || 20+V(map+8) != size) {
+ if(map) munmap((void *)map, size);
+ errno = ENOENT;
+ return (nl_catd)-1;
+ }
+ return (nl_catd)map;
+}
+#endif
+
+nl_catd catopen(const char *name, int oflag)
+{
+#ifdef __wasilibc_unmodified_upstream // wasi-libc doesn't support catgets yet
+ nl_catd catd;
+
+ if (strchr(name, '/')) return do_catopen(name);
+
+ char buf[PATH_MAX];
+ size_t i;
+ const char *path, *lang, *p, *z;
+ if (libc.secure || !(path = getenv("NLSPATH"))) {
+ errno = ENOENT;
+ return (nl_catd)-1;
+ }
+ lang = oflag ? nl_langinfo(_NL_LOCALE_NAME(LC_MESSAGES)) : getenv("LANG");
+ if (!lang) lang = "";
+ for (p=path; *p; p=z) {
+ i = 0;
+ z = __strchrnul(p, ':');
+ for (; p<z; p++) {
+ const char *v;
+ size_t l;
+ if (*p!='%') v=p, l=1;
+ else switch (*++p) {
+ case 'N': v=name; l=strlen(v); break;
+ case 'L': v=lang; l=strlen(v); break;
+ case 'l': v=lang; l=strcspn(v,"_.@"); break;
+ case 't':
+ v=__strchrnul(lang,'_');
+ if (*v) v++;
+ l=strcspn(v,".@");
+ break;
+ case 'c': v="UTF-8"; l=5; break;
+ case '%': v="%"; l=1; break;
+ default: v=0;
+ }
+ if (!v || l >= sizeof buf - i) {
+ break;
+ }
+ memcpy(buf+i, v, l);
+ i += l;
+ }
+ if (!*z && (p<z || !i)) break;
+ if (p<z) continue;
+ if (*z) z++;
+ buf[i] = 0;
+ /* Leading : or :: in NLSPATH is same as %N */
+ catd = do_catopen(i ? buf : name);
+ if (catd != (nl_catd)-1) return catd;
+ }
+ errno = ENOENT;
+#else
+ errno = EOPNOTSUPP;
+#endif
+ return (nl_catd)-1;
+}
diff --git a/libc-top-half/musl/src/locale/codepages.h b/libc-top-half/musl/src/locale/codepages.h
new file mode 100644
index 0000000..4e236ef
--- /dev/null
+++ b/libc-top-half/musl/src/locale/codepages.h
@@ -0,0 +1,320 @@
+"iso88591\0"
+"latin1\0"
+"\0\100"
+
+"iso88592\0"
+"\0\50"
+"\240\20\364\127\116\244\334\364\324\51\250\124\65\125\126\156\265\42\27\134"
+"\260\24\24\230\116\264\340\4\225\137\270\130\105\225\126\157\15\66\127\134"
+"\111\5\43\214\100\304\314\144\320\61\14\45\143\321\62\30\65\343\214\103"
+"\20\355\364\323\64\324\24\145\315\65\115\215\245\115\131\334\164\163\325\67"
+"\112\205\43\316\100\344\320\164\320\71\15\245\163\321\72\31\265\343\316\103"
+"\21\361\4\324\74\364\30\145\317\75\116\221\245\217\131\374\364\203\25\140"
+
+"iso88593\0"
+"\0\50"
+"\240\220\364\327\50\244\0\40\322\51\250\260\64\25\107\56\265\2\0\134"
+"\260\224\44\313\54\264\324\62\322\55\270\264\104\125\107\57\365\2\100\134"
+"\300\4\43\14\0\304\50\204\320\61\310\44\243\314\62\314\64\343\314\63"
+"\0\104\43\315\64\324\170\144\315\65\32\145\243\315\66\334\204\25\325\67"
+"\340\204\43\16\0\344\54\224\320\71\350\244\243\316\72\354\264\343\316\73"
+"\0\304\43\317\74\364\174\144\317\75\33\345\243\317\76\374\210\45\25\140"
+
+"iso88594\0"
+"\0\50"
+"\240\20\44\323\122\244\230\124\323\51\250\124\45\21\110\133\265\42\327\53"
+"\260\24\24\30\123\264\234\144\223\137\270\130\65\121\110\134\5\65\227\120"
+"\0\5\43\314\60\304\24\143\214\112\14\45\143\321\62\24\65\343\14\112"
+"\20\365\64\24\114\324\124\143\315\65\330\234\245\315\66\334\164\365\325\67"
+"\1\205\43\316\70\344\224\143\316\112\15\245\163\321\72\25\265\343\116\112"
+"\21\371\104\124\114\364\324\143\317\75\370\240\245\317\76\374\170\5\26\140"
+
+"iso88595\0"
+"\0\50"
+"\240\104\47\335\164\324\125\147\335\165\330\145\247\335\166"
+"\334\265\322\235\167\337\201\27\236\170\343\221\127\236\171"
+"\347\241\227\236\172\353\261\327\236\173\357\301\27\237\174"
+"\363\321\127\237\175\367\341\227\237\176\373\361\327\237\177\377\1\30\240\200"
+"\3\22\130\240\201\7\42\230\240\202\13\62\330\240\203\17\102\30\241\204"
+"\23\122\130\241\205\27\142\230\241\206\33\162\330\241\207\46\177\10\142\210"
+"\42\216\110\142\211\46\236\210\142\212\52\236\262\42\213"
+
+"iso88596\0"
+"\0\50"
+"\240\0\0\0\0\244\0\0\0\0\0\0\0\0\0\142\266\2\0\0\0\0\0\0\0\0\0\0\0\0"
+"\0\0\0\300\230\0\0\0\0\231\0\224\151\346\231\150\246\251\346\232"
+"\154\266\351\346\233\160\306\51\347\234\164\326\151\347\235"
+"\170\346\251\347\236\174\366\351\47\0\0\0\0\0\0\177\2\32\250\240"
+"\203\22\132\250\241\207\42\232\250\242\213\62\332\250\243\217\102\32\51\0"
+"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+
+"iso88597\0"
+"\0\50"
+"\240\114\114\361\50\44\227\154\312\51\250\244\222\330\52\254\264\2\100\304"
+"\260\304\42\313\54\212\55\306\330\55\215\71\366\330\56\220\365\22\231\144"
+"\223\121\126\231\145\227\141\226\231\146\233\161\326\231\147"
+"\237\201\26\232\150\243\221\6\100\151\246\235\206\132\152\252\255\306\132\153"
+"\256\275\6\133\154\262\315\106\133\155\266\335\206\133\156\272\355\306\133\157"
+"\276\375\6\134\160\302\15\107\134\161\306\35\207\134\162\312\55\307\134\163"
+"\316\75\7\35\0"
+
+"iso88598\0"
+"\0\50"
+"\240\0\40\312\50\244\224\142\312\51\250\244\162\315\52\254\264\342\312\53"
+"\260\304\42\313\54\264\324\142\313\55\270\344\162\317\56\274\364\342\13\0"
+"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+"\0\0\0\200\304\102\16\111\144\221\106\36\211\144\222\112\56\311\144\223"
+"\116\76\11\145\224\122\116\111\145\225\126\136\211\145\226\132\156\311\45\0"
+"\0\64\354\60\0"
+
+"iso88599\0"
+"\0\64"
+"\34\105\43\315\64\324\124\143\315\65\330\144\243\315\66\334\260\64\325\67"
+"\340\204\43\316\70\344\224\143\316\71\350\244\243\316\72\354\264\343\316\73"
+"\35\305\43\317\74\364\324\143\317\75\370\344\243\317\76\374\264\104\325\77"
+
+"iso885910\0"
+"\0\50"
+"\240\20\44\21\110\50\231\4\323\51\65\101\124\325\126\162\265\362\125\120"
+"\260\24\64\121\110\51\235\24\323\55\66\105\144\25\127\163\105\14\226\120"
+"\0\5\43\314\60\304\24\143\214\112\14\45\143\321\62\24\65\343\314\63"
+"\320\364\64\324\64\324\124\143\115\127\330\234\245\315\66\334\164\343\315\67"
+"\1\205\43\316\70\344\224\143\316\112\15\245\163\321\72\25\265\343\316\73"
+"\360\370\104\324\74\364\324\143\217\127\370\240\245\317\76\374\364\343\217\114"
+
+"iso885911\0"
+"tis620\0"
+"\0\50"
+"\240\170\372\51\250\241\212\72\52\251\245\232\172\52\252\251\252\272\52\253"
+"\255\272\372\52\254\261\312\72\53\255\265\332\172\53\256\271\352\272\53\257"
+"\275\372\372\53\260\301\12\73\54\261\305\32\173\54\262\311\52\273\54\263"
+"\315\72\373\54\264\321\112\73\55\265\325\132\173\55\0\0\0\0\0\266"
+"\331\152\273\55\267\335\172\373\55\270\341\212\73\56\271\345\232\173\56\272"
+"\351\252\273\56\273\355\272\373\56\274\361\312\73\57\275\0\0\0\0\0"
+
+"iso885913\0"
+"\0\50"
+"\240\134\54\312\50\244\140\154\312\51\330\244\262\324\52\254\264\342\212\61"
+"\260\304\42\313\54\26\327\142\313\55\370\344\302\324\56\274\364\342\213\71"
+"\4\251\4\220\101\304\24\143\221\104\14\45\343\26\105\40\301\204\122\115"
+"\125\355\324\323\64\103\125\143\315\65\147\345\364\324\127\334\300\45\327\67"
+"\5\255\24\320\101\344\224\163\321\104\15\245\363\126\105\41\305\224\222\115"
+"\126\361\344\323\74\104\325\143\317\75\150\351\4\25\130\374\304\65\27\305"
+
+"iso885914\0"
+"\0\50"
+"\240\324\153\357\50\12\55\164\357\51\3\247\122\60\276\11\267\342\112\133"
+"\371\352\353\321\107\373\362\153\113\277\4\373\153\360\277\12\37\214\60\300"
+"\300\4\43\314\60\304\24\143\314\61\310\44\243\314\62\314\64\343\314\63"
+"\151\105\43\315\64\324\124\143\115\300\330\144\243\315\66\334\164\263\326\67"
+"\340\204\43\316\70\344\224\143\316\71\350\244\243\316\72\354\264\343\316\73"
+"\152\305\43\317\74\364\324\143\217\300\370\344\243\317\76\374\364\303\326\77"
+
+"iso885915\0"
+"latin9\0"
+"\0\51"
+"\44\227\122\325\51\126\245\242\312\52\254\264\342\312\53\260\304\42\313\54"
+"\162\325\142\313\55\163\345\242\313\56\107\41\325\326\57\300\4\43\314\60"
+"\304\24\143\314\61\310\44\243\314\62\314\64\343\314\63\320\104\43\315\64"
+"\324\124\143\315\65\330\144\243\315\66\334\164\343\315\67\340\204\43\316\70"
+"\344\224\143\316\71\350\244\243\316\72\354\264\343\316\73\360\304\43\317\74"
+"\364\324\143\317\75\370\344\243\317\76\374\364\343\317\77"
+
+"iso885916\0"
+"\0\50"
+"\240\20\124\120\116\44\143\134\325\51\126\245\222\327\52\156\265\362\26\134"
+"\260\304\302\220\116\162\135\154\313\55\163\65\244\327\56\107\41\325\126\134"
+"\300\4\43\214\100\304\30\144\314\61\310\44\243\314\62\314\64\343\314\63"
+"\20\355\44\315\64\324\24\145\315\123\145\145\243\315\66\334\130\264\327\67"
+"\340\204\43\316\100\344\34\144\316\71\350\244\243\316\72\354\264\343\316\73"
+"\21\361\44\317\74\364\30\145\17\124\146\345\243\317\76\374\134\304\327\77"
+
+"cp1250\0"
+"windows1250\0"
+"\0\40"
+"\44\3\120\61\0\30\163\234\261\306\0\164\134\225\307\117\145\45\227\133"
+"\0\114\114\261\305\27\157\374\60\304\0\234\154\325\307\120\151\65\327\133"
+"\240\370\365\127\116\244\20\144\312\51\250\244\62\325\52\254\264\342\12\134"
+"\260\304\22\230\116\264\324\142\313\55\270\24\104\325\56\67\15\206\123\134"
+"\111\5\43\214\100\304\314\144\320\61\14\45\143\321\62\30\65\343\214\103"
+"\20\355\364\323\64\324\24\145\315\65\115\215\245\115\131\334\164\163\325\67"
+"\112\205\43\316\100\344\320\164\320\71\15\245\163\321\72\31\265\343\316\103"
+"\21\361\4\324\74\364\30\145\317\75\116\221\245\217\131\374\364\203\25\140"
+
+"cp1251\0"
+"windows1251\0"
+"\0\40"
+"\322\115\127\161\210\30\163\234\261\306\44\167\234\235\307\332\161\267\235\167"
+"\40\116\114\261\305\27\157\374\60\304\0\234\174\342\307\50\252\230\42\213"
+"\240\164\267\42\166\244\264\150\312\51\321\245\102\335\52\254\264\342\312\165"
+"\260\304\142\35\211\56\326\142\313\55\37\232\54\342\56\46\126\67\142\211"
+"\337\201\27\236\170\343\221\127\236\171\347\241\227\236\172"
+"\353\261\327\236\173\357\301\27\237\174\363\321\127\237\175"
+"\367\341\227\237\176\373\361\327\237\177\377\1\30\240\200\3\22\130\240\201"
+"\7\42\230\240\202\13\62\330\240\203\17\102\30\241\204\23\122\130\241\205"
+"\27\142\230\241\206\33\162\330\241\207"
+
+"cp1252\0"
+"windows1252\0"
+"\0\40"
+"\44\3\120\61\135\30\163\234\261\306\175\165\134\225\307\107\1\40\27\0"
+"\0\114\114\261\305\27\157\374\60\304\202\235\154\325\307\110\1\60\127\133"
+"\240\204\42\312\50\244\224\142\312\51\250\244\242\312\52\254\264\342\312\53"
+"\260\304\42\313\54\264\324\142\313\55\270\344\242\313\56\274\364\342\313\57"
+"\300\4\43\314\60\304\24\143\314\61\310\44\243\314\62\314\64\343\314\63"
+"\320\104\43\315\64\324\124\143\315\65\330\144\243\315\66\334\164\343\315\67"
+"\340\204\43\316\70\344\224\143\316\71\350\244\243\316\72\354\264\343\316\73"
+"\360\304\43\317\74\364\324\143\317\75\370\344\243\317\76\374\364\343\317\77"
+
+"cp1253\0"
+"windows1253\0"
+"\0\40"
+"\44\3\120\61\135\30\163\234\261\306\0\164\14\200\307\0\0\0\0\0"
+"\0\114\114\261\305\27\157\374\60\304\0\234\14\300\307\0\0\0\0\0"
+"\240\54\306\330\50\244\224\142\312\51\250\244\2\300\52\254\264\342\112\304"
+"\260\304\42\313\54\212\325\142\313\55\215\71\366\330\56\220\365\22\231\144"
+"\223\121\126\231\145\227\141\226\231\146\233\161\326\231\147"
+"\237\201\26\232\150\243\221\6\100\151\246\235\206\132\152\252\255\306\132\153"
+"\256\275\6\133\154\262\315\106\133\155\266\335\206\133\156\272\355\306\133\157"
+"\276\375\6\134\160\302\15\107\134\161\306\35\207\134\162\312\55\307\134\163"
+"\316\75\7\35\0"
+
+"cp1254\0"
+"windows1254\0"
+"\0\40"
+"\44\3\120\61\135\30\163\234\261\306\175\165\134\225\307\107\1\0\0\0"
+"\0\114\114\261\305\27\157\374\60\304\202\235\154\325\307\110\1\0\100\133"
+"\240\204\42\312\50\244\224\142\312\51\250\244\242\312\52\254\264\342\312\53"
+"\260\304\42\313\54\264\324\142\313\55\270\344\242\313\56\274\364\342\313\57"
+"\300\4\43\314\60\304\24\143\314\61\310\44\243\314\62\314\64\343\314\63"
+"\34\105\43\315\64\324\124\143\315\65\330\144\243\315\66\334\260\64\325\67"
+"\340\204\43\316\70\344\224\143\316\71\350\244\243\316\72\354\264\343\316\73"
+"\35\305\43\317\74\364\324\143\317\75\370\344\243\317\76\374\264\104\325\77"
+
+"cp1255\0"
+"windows1255\0"
+"\0\40"
+"\44\3\120\61\135\30\163\234\261\306\175\165\14\200\307\0\0\0\0\0"
+"\0\114\114\261\305\27\157\374\60\304\202\235\14\300\307\0\0\0\0\0"
+"\240\204\42\312\50\42\227\142\312\51\250\244\162\315\52\254\264\342\312\53"
+"\260\304\42\313\54\264\324\142\313\55\270\344\162\317\56\274\364\342\313\57"
+"\57\302\30\243\214\63\322\130\243\215\67\342\10\100\216\72\356\310\143\217"
+"\76\376\10\144\220\135\172\371\45\230\141\2\0\0\0\0\0\0\0\0\102\16\111\144\221"
+"\106\36\211\144\222\112\56\311\144\223\116\76\11\145\224\122\116\111\145\225"
+"\126\136\211\145\226\132\156\311\45\0\0\64\354\60\0"
+
+"cp1256\0"
+"windows1256\0"
+"\0\40"
+"\44\117\132\61\135\30\163\234\261\306\175\165\54\251\307\107\121\172\151\245"
+"\231\116\114\261\305\27\157\374\60\304\230\236\154\351\307\110\55\314\260\246"
+"\240\210\51\312\50\244\224\142\312\51\250\244\262\351\52\254\264\342\312\53"
+"\260\304\42\313\54\264\324\142\313\55\270\344\62\346\56\274\364\342\13\231"
+"\234\226\151\346\231\150\246\251\346\232\154\266\351\346\233"
+"\160\306\51\347\234\164\326\151\347\235\170\346\251\347\65\173\362\331\247\237"
+"\177\2\32\250\240\340\14\52\16\241\205\32\172\350\71\350\244\243\316\72"
+"\210\46\352\316\73\212\56\312\150\243\364\70\372\350\75\220\346\23\351\76"
+"\374\64\354\160\247"
+
+"cp1257\0"
+"windows1257\0"
+"\0\40"
+"\44\3\120\61\0\30\163\234\261\306\0\164\14\200\307\0\240\342\27\56"
+"\0\114\114\261\305\27\157\374\60\304\0\234\14\300\307\0\274\22\30\0"
+"\240\0\40\312\50\244\0\140\312\51\330\244\262\324\52\254\264\342\212\61"
+"\260\304\42\313\54\264\324\142\313\55\370\344\302\324\56\274\364\342\213\71"
+"\4\251\4\220\101\304\24\143\221\104\14\45\343\26\105\40\301\204\122\115"
+"\125\355\324\323\64\103\125\143\315\65\147\345\364\324\127\334\300\45\327\67"
+"\5\255\24\320\101\344\224\163\321\104\15\245\363\126\105\41\305\224\222\115"
+"\126\361\344\323\74\104\325\143\317\75\150\351\4\25\130\374\304\65\27\140"
+
+"cp1258\0"
+"windows1258\0"
+"\0\40"
+"\44\3\120\61\135\30\163\234\261\306\175\165\14\200\307\107\1\0\0\0"
+"\0\114\114\261\305\27\157\374\60\304\202\235\14\300\307\110\1\0\100\133"
+"\240\204\42\312\50\244\224\142\312\51\250\244\242\312\52\254\264\342\312\53"
+"\260\304\42\313\54\264\324\142\313\55\270\344\242\313\56\274\364\342\313\57"
+"\300\4\43\214\100\304\24\143\314\61\310\44\243\314\62\204\65\343\314\63"
+"\20\105\163\330\64\324\324\145\315\65\330\144\243\315\66\334\334\145\330\67"
+"\340\204\43\316\100\344\224\143\316\71\350\244\243\316\72\205\265\343\316\73"
+"\21\305\203\330\74\364\330\145\317\75\370\344\243\317\76\374\340\65\362\77"
+
+"koi8r\0"
+"\0\40"
+"\63\323\134\263\315\67\343\234\263\316\73\363\334\363\326\134\167\355\365\327"
+"\140\207\55\166\314\143\243\234\62\313\56\277\14\212\314\260\310\162\313\75"
+"\76\377\14\364\207\101\13\75\64\321\105\33\175\64\322\111\53\275\64\323"
+"\115\73\375\164\164\120\107\55\365\324\124\127\155\365\325\130\147\255\165\52"
+"\35\376\7\140\205\3\22\70\241\200\24\36\210\140\202\12\56\310\140\203"
+"\16\172\370\40\204\21\112\130\140\200\33\152\150\340\205\34\142\150\141\206"
+"\375\175\7\136\175\343\221\67\237\170\364\235\207\136\172\352\255\307\136\173"
+"\356\371\367\36\174\361\311\127\136\170\373\351\147\336\175"
+"\374\341\147\137\176"
+
+"koi8u\0"
+"\0\40"
+"\63\323\134\263\315\67\343\234\263\316\73\363\334\363\326\134\167\355\365\327"
+"\140\207\55\166\314\143\243\234\62\313\56\277\14\212\314\260\310\162\313\75"
+"\76\377\14\364\207\42\12\115\142\211\105\33\175\64\322\111\273\270\64\323"
+"\115\73\375\164\164\324\105\155\335\165\124\127\155\365\325\130\267\250\165\52"
+"\35\376\7\140\205\3\22\70\241\200\24\36\210\140\202\12\56\310\140\203"
+"\16\172\370\40\204\21\112\130\140\200\33\152\150\340\205\34\142\150\141\206"
+"\375\175\7\136\175\343\221\67\237\170\364\235\207\136\172\352\255\307\136\173"
+"\356\371\367\36\174\361\311\127\136\170\373\351\147\336\175"
+"\374\341\147\137\176"
+
+"cp437\0"
+"\0\40"
+"\307\360\223\216\70\344\200\123\316\71\352\254\203\316\73\356\260\103\114\61"
+"\311\230\143\14\75\366\310\263\117\76\377\130\303\215\50\243\224\22\62\135"
+"\341\264\63\217\76\361\104\243\212\56\277\300\314\112\57\274\204\262\312\56"
+"\140\207\55\66\315\72\77\15\65\321\103\107\375\163\321\113\53\235\264\315"
+"\67\363\274\163\316\63\367\314\164\323\110\13\175\65\325\116\373\254\165\325"
+"\126\113\75\365\321\106\3\35\164\326\130\343\134\163\327\134\173\375\365\326"
+"\263\175\143\231\160\245\25\127\213\161\250\155\266\232\155\52\43\167\333\312"
+"\55\307\362\262\313\61\313\174\17\313\260\240\174\113\312\40\313\62\66\50"
+
+"cp850\0"
+"\0\40"
+"\307\360\223\216\70\344\200\123\316\71\352\254\203\316\73\356\260\103\114\61"
+"\311\230\143\14\75\366\310\263\117\76\377\130\303\15\76\243\140\163\15\135"
+"\341\264\63\217\76\361\104\243\212\56\277\270\302\112\57\274\204\262\312\56"
+"\140\207\55\66\315\72\7\43\14\60\251\104\375\163\321\113\213\122\212\315"
+"\67\363\274\163\316\63\367\74\316\60\110\13\175\65\325\116\373\254\65\51"
+"\360\100\243\314\62\310\264\324\214\63\317\340\134\163\327\134\233\302\314\326"
+"\323\174\103\215\64\365\124\123\213\77\336\150\263\115\66\375\164\363\12\55"
+"\255\304\42\261\57\266\234\162\17\56\260\240\162\113\56\263\310\62\66\50"
+
+"cp866\0"
+"\0\40"
+"\337\201\27\236\170\343\221\127\236\171\347\241\227\236\172"
+"\353\261\327\236\173\357\301\27\237\174\363\321\127\237\175"
+"\367\341\227\237\176\373\361\327\237\177\377\1\30\240\200\3\22\130\240\201"
+"\7\42\230\240\202\13\62\330\240\203\140\207\55\66\315\72\77\15\65\321"
+"\103\107\375\163\321\113\53\235\264\315\67\363\274\163\316\63\367\314\164\323"
+"\110\13\175\65\325\116\373\254\165\325\126\113\75\365\321\106\3\35\164\326"
+"\130\343\134\163\327\134\173\375\365\326\17\102\30\241\204\23\122\130\241\205"
+"\27\142\230\241\206\33\162\330\241\207\321\175\110\235\210\327\225\330\335\212"
+"\260\240\174\113\312\46\223\62\66\50"
+
+"ibm1047\0"
+"cp1047\0"
+"\0\1"
+"\234\44\140\310\37\227\64\342\310\2\14\64\340\300\3\20\104\40\301\4"
+"\235\24\202\300\41\30\144\40\311\43\34\164\340\301\7\200\4\42\310\40"
+"\204\50\160\301\6\210\44\242\310\42\214\24\140\300\1\220\104\142\301\44"
+"\224\124\142\11\1\230\144\242\311\46\24\124\340\211\6\40\200\42\16\71"
+"\340\204\63\116\71\347\304\43\212\13\74\240\260\2\37\46\244\243\316\72"
+"\350\264\343\316\73\354\174\23\2\11\52\244\260\203\27\55\274\40\14\61"
+"\300\4\63\114\61\307\104\143\12\13\45\174\341\303\17\370\44\243\314\62"
+"\310\64\343\314\63\314\200\241\303\10\100\234\320\203\10\330\204\41\306\30"
+"\144\224\141\306\31\150\244\261\312\56\360\364\343\117\54\260\250\261\6\33"
+"\155\270\361\6\34\161\310\241\212\56\346\340\142\14\51\265\370\61\7\35"
+"\165\330\161\7\36\171\350\21\312\57\320\154\341\215\53\254\214\122\312\55"
+"\251\234\142\13\57\275\370\322\15\52\257\164\101\313\65\173\4\41\304\20"
+"\104\24\141\304\21\110\44\321\12\75\366\310\63\117\75\175\50\261\4\23"
+"\115\70\361\4\24\121\110\221\313\76\374\344\243\317\77\134\334\63\5\25"
+"\125\130\161\5\26\131\150\41\13\65\326\110\63\115\65\60\304\40\303\14"
+"\64\324\140\303\15\70\344\60\313\66\334\144\243\315\47"
+
diff --git a/libc-top-half/musl/src/locale/dcngettext.c b/libc-top-half/musl/src/locale/dcngettext.c
new file mode 100644
index 0000000..0b53286
--- /dev/null
+++ b/libc-top-half/musl/src/locale/dcngettext.c
@@ -0,0 +1,283 @@
+#include <libintl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <ctype.h>
+#include "locale_impl.h"
+#include "atomic.h"
+#include "pleval.h"
+#include "lock.h"
+#include "fork_impl.h"
+
+#define malloc __libc_malloc
+#define calloc __libc_calloc
+#define realloc undef
+#define free undef
+
+struct binding {
+ struct binding *next;
+ int dirlen;
+ volatile int active;
+ char *domainname;
+ char *dirname;
+ char buf[];
+};
+
+static void *volatile bindings;
+
+static char *gettextdir(const char *domainname, size_t *dirlen)
+{
+ struct binding *p;
+ for (p=bindings; p; p=p->next) {
+ if (!strcmp(p->domainname, domainname) && p->active) {
+ *dirlen = p->dirlen;
+ return (char *)p->dirname;
+ }
+ }
+ return 0;
+}
+
+static volatile int lock[1];
+volatile int *const __gettext_lockptr = lock;
+
+char *bindtextdomain(const char *domainname, const char *dirname)
+{
+ struct binding *p, *q;
+
+ if (!domainname) return 0;
+ if (!dirname) return gettextdir(domainname, &(size_t){0});
+
+ size_t domlen = strnlen(domainname, NAME_MAX+1);
+ size_t dirlen = strnlen(dirname, PATH_MAX);
+ if (domlen > NAME_MAX || dirlen >= PATH_MAX) {
+ errno = EINVAL;
+ return 0;
+ }
+
+ LOCK(lock);
+
+ for (p=bindings; p; p=p->next) {
+ if (!strcmp(p->domainname, domainname) &&
+ !strcmp(p->dirname, dirname)) {
+ break;
+ }
+ }
+
+ if (!p) {
+ p = calloc(sizeof *p + domlen + dirlen + 2, 1);
+ if (!p) {
+ UNLOCK(lock);
+ return 0;
+ }
+ p->next = bindings;
+ p->dirlen = dirlen;
+ p->domainname = p->buf;
+ p->dirname = p->buf + domlen + 1;
+ memcpy(p->domainname, domainname, domlen+1);
+ memcpy(p->dirname, dirname, dirlen+1);
+ a_cas_p(&bindings, bindings, p);
+ }
+
+ a_store(&p->active, 1);
+
+ for (q=bindings; q; q=q->next) {
+ if (!strcmp(q->domainname, domainname) && q != p)
+ a_store(&q->active, 0);
+ }
+
+ UNLOCK(lock);
+
+ return (char *)p->dirname;
+}
+
+static const char catnames[][12] = {
+ "LC_CTYPE",
+ "LC_NUMERIC",
+ "LC_TIME",
+ "LC_COLLATE",
+ "LC_MONETARY",
+ "LC_MESSAGES",
+};
+
+static const char catlens[] = { 8, 10, 7, 10, 11, 11 };
+
+struct msgcat {
+ struct msgcat *next;
+ const void *map;
+ size_t map_size;
+ const char *plural_rule;
+ int nplurals;
+ struct binding *binding;
+ const struct __locale_map *lm;
+ int cat;
+};
+
+static char *dummy_gettextdomain()
+{
+ return "messages";
+}
+
+weak_alias(dummy_gettextdomain, __gettextdomain);
+
+char *dcngettext(const char *domainname, const char *msgid1, const char *msgid2, unsigned long int n, int category)
+{
+ static struct msgcat *volatile cats;
+ struct msgcat *p;
+ struct __locale_struct *loc = CURRENT_LOCALE;
+ const struct __locale_map *lm;
+ size_t domlen;
+ struct binding *q;
+ int old_errno = errno;
+
+ /* match gnu gettext behaviour */
+ if (!msgid1) goto notrans;
+
+ if ((unsigned)category >= LC_ALL) goto notrans;
+
+ if (!domainname) domainname = __gettextdomain();
+
+ domlen = strnlen(domainname, NAME_MAX+1);
+ if (domlen > NAME_MAX) goto notrans;
+
+ for (q=bindings; q; q=q->next)
+ if (!strcmp(q->domainname, domainname) && q->active)
+ break;
+ if (!q) goto notrans;
+
+ lm = loc->cat[category];
+ if (!lm) {
+notrans:
+ errno = old_errno;
+ return (char *) ((n == 1) ? msgid1 : msgid2);
+ }
+
+ for (p=cats; p; p=p->next)
+ if (p->binding == q && p->lm == lm && p->cat == category)
+ break;
+
+ if (!p) {
+ const char *dirname, *locname, *catname, *modname, *locp;
+ size_t dirlen, loclen, catlen, modlen, alt_modlen;
+ void *old_cats;
+ size_t map_size;
+
+ dirname = q->dirname;
+ locname = lm->name;
+ catname = catnames[category];
+
+ dirlen = q->dirlen;
+ loclen = strlen(locname);
+ catlen = catlens[category];
+
+ /* Logically split @mod suffix from locale name. */
+ modname = memchr(locname, '@', loclen);
+ if (!modname) modname = locname + loclen;
+ alt_modlen = modlen = loclen - (modname-locname);
+ loclen = modname-locname;
+
+ /* Drop .charset identifier; it is not used. */
+ const char *csp = memchr(locname, '.', loclen);
+ if (csp) loclen = csp-locname;
+
+ char name[dirlen+1 + loclen+modlen+1 + catlen+1 + domlen+3 + 1];
+ const void *map;
+
+ for (;;) {
+ snprintf(name, sizeof name, "%s/%.*s%.*s/%s/%s.mo\0",
+ dirname, (int)loclen, locname,
+ (int)alt_modlen, modname, catname, domainname);
+ if (map = __map_file(name, &map_size)) break;
+
+ /* Try dropping @mod, _YY, then both. */
+ if (alt_modlen) {
+ alt_modlen = 0;
+ } else if ((locp = memchr(locname, '_', loclen))) {
+ loclen = locp-locname;
+ alt_modlen = modlen;
+ } else {
+ break;
+ }
+ }
+ if (!map) goto notrans;
+
+ p = calloc(sizeof *p, 1);
+ if (!p) {
+ __munmap((void *)map, map_size);
+ goto notrans;
+ }
+ p->cat = category;
+ p->binding = q;
+ p->lm = lm;
+ p->map = map;
+ p->map_size = map_size;
+
+ const char *rule = "n!=1;";
+ unsigned long np = 2;
+ const char *r = __mo_lookup(p->map, p->map_size, "");
+ char *z;
+ while (r && strncmp(r, "Plural-Forms:", 13)) {
+ z = strchr(r, '\n');
+ r = z ? z+1 : 0;
+ }
+ if (r) {
+ r += 13;
+ while (isspace(*r)) r++;
+ if (!strncmp(r, "nplurals=", 9)) {
+ np = strtoul(r+9, &z, 10);
+ r = z;
+ }
+ while (*r && *r != ';') r++;
+ if (*r) {
+ r++;
+ while (isspace(*r)) r++;
+ if (!strncmp(r, "plural=", 7))
+ rule = r+7;
+ }
+ }
+ p->nplurals = np;
+ p->plural_rule = rule;
+
+ do {
+ old_cats = cats;
+ p->next = old_cats;
+ } while (a_cas_p(&cats, old_cats, p) != old_cats);
+ }
+
+ const char *trans = __mo_lookup(p->map, p->map_size, msgid1);
+ if (!trans) goto notrans;
+
+ /* Non-plural-processing gettext forms pass a null pointer as
+ * msgid2 to request that dcngettext suppress plural processing. */
+
+ if (msgid2 && p->nplurals) {
+ unsigned long plural = __pleval(p->plural_rule, n);
+ if (plural > p->nplurals) goto notrans;
+ while (plural--) {
+ size_t rem = p->map_size - (trans - (char *)p->map);
+ size_t l = strnlen(trans, rem);
+ if (l+1 >= rem)
+ goto notrans;
+ trans += l+1;
+ }
+ }
+ errno = old_errno;
+ return (char *)trans;
+}
+
+char *dcgettext(const char *domainname, const char *msgid, int category)
+{
+ return dcngettext(domainname, msgid, 0, 1, category);
+}
+
+char *dngettext(const char *domainname, const char *msgid1, const char *msgid2, unsigned long int n)
+{
+ return dcngettext(domainname, msgid1, msgid2, n, LC_MESSAGES);
+}
+
+char *dgettext(const char *domainname, const char *msgid)
+{
+ return dcngettext(domainname, msgid, 0, 1, LC_MESSAGES);
+}
diff --git a/libc-top-half/musl/src/locale/duplocale.c b/libc-top-half/musl/src/locale/duplocale.c
new file mode 100644
index 0000000..5ce33ae
--- /dev/null
+++ b/libc-top-half/musl/src/locale/duplocale.c
@@ -0,0 +1,20 @@
+#include <stdlib.h>
+#include <string.h>
+#include "locale_impl.h"
+#include "libc.h"
+
+#define malloc __libc_malloc
+#define calloc undef
+#define realloc undef
+#define free undef
+
+locale_t __duplocale(locale_t old)
+{
+ locale_t new = malloc(sizeof *new);
+ if (!new) return 0;
+ if (old == LC_GLOBAL_LOCALE) old = &libc.global_locale;
+ *new = *old;
+ return new;
+}
+
+weak_alias(__duplocale, duplocale);
diff --git a/libc-top-half/musl/src/locale/freelocale.c b/libc-top-half/musl/src/locale/freelocale.c
new file mode 100644
index 0000000..385d120
--- /dev/null
+++ b/libc-top-half/musl/src/locale/freelocale.c
@@ -0,0 +1,14 @@
+#include <stdlib.h>
+#include "locale_impl.h"
+
+#define malloc undef
+#define calloc undef
+#define realloc undef
+#define free __libc_free
+
+void freelocale(locale_t l)
+{
+ if (__loc_is_allocated(l)) free(l);
+}
+
+weak_alias(freelocale, __freelocale);
diff --git a/libc-top-half/musl/src/locale/gb18030.h b/libc-top-half/musl/src/locale/gb18030.h
new file mode 100644
index 0000000..8f300e9
--- /dev/null
+++ b/libc-top-half/musl/src/locale/gb18030.h
@@ -0,0 +1,1866 @@
+19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,
+20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,
+20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,
+20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,
+20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,20112,20118,
+20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,20151,
+20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,20188,
+20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,20218,
+20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,20242,
+20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,20270,
+20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,20293,
+20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,20328,
+20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,20352,
+20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,20374,
+20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,20401,
+20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,20416,
+20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,20437,
+20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,20468,
+20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,20484,
+20485,20486,20487,20488,20489,20490,20491,20494,
+20496,20497,20499,20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,
+20519,20523,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,
+20539,20541,20543,20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,
+20560,20561,20562,20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,
+20576,20577,20578,20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,
+20591,20592,20593,20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,
+20610,20611,20612,20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,
+20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,
+20639,20640,20641,20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,
+20659,20660,20661,20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,
+20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,
+20688,20689,20690,20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,
+20703,20704,20705,20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,
+20721,20722,20724,20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,
+20737,20738,20739,20740,20741,20744,20745,20746,20748,20749,20750,20751,20752,
+20753,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,
+20767,20768,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,
+20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,
+20794,20795,20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,
+20819,20823,20824,20825,20827,20829,20830,20831,20832,
+20833,20835,20836,20838,20839,20841,20842,20847,20850,20858,20862,20863,20867,
+20868,20870,20871,20874,20875,20878,20879,20880,20881,20883,20884,20888,20890,
+20893,20894,20895,20897,20899,20902,20903,20904,20905,20906,20909,20910,20916,
+20920,20921,20922,20926,20927,20929,20930,20931,20933,20936,20938,20941,20942,
+20944,20946,20947,20948,20949,20950,20951,20952,20953,20954,20956,20958,20959,
+20962,20963,20965,20966,20967,20968,20969,20970,20972,20974,20977,20978,20980,
+20983,20990,20996,20997,21001,21003,21004,21007,21008,21011,21012,21013,21020,
+21022,21023,21025,21026,21027,21029,21030,21031,21034,21036,21039,21041,21042,
+21044,21045,21052,21054,21060,21061,21062,21063,21064,21065,21067,21070,21071,
+21074,21075,21077,21079,21080,21081,21082,21083,21085,21087,21088,21090,21091,
+21092,21094,21096,21099,21100,21101,21102,21104,21105,21107,21108,21109,21110,
+21111,21112,21113,21114,21115,21116,21118,21120,21123,21124,21125,21126,21127,
+21129,21130,21131,21132,21133,21134,21135,21137,21138,21140,21141,21142,21143,
+21144,21145,21146,21148,21156,21157,21158,21159,21166,21167,21168,21172,21173,
+21174,21175,21176,21177,21178,21179,21180,21181,21184,21185,21186,21188,21189,
+21190,21192,21194,21196,21197,21198,21199,21201,21203,21204,21205,21207,21209,
+21210,21211,21212,21213,21214,21216,21217,21218,21219,21221,21222,21223,21224,
+21225,21226,21227,21228,21229,21230,21231,21233,21234,21235,21236,21237,21238,
+21239,21240,21243,21244,21245,21249,21250,21251,21252,21255,21257,21258,21259,
+21260,21262,21265,21266,21267,21268,21272,21275,21276,
+21278,21279,21282,21284,21285,21287,21288,21289,21291,21292,21293,21295,21296,
+21297,21298,21299,21300,21301,21302,21303,21304,21308,21309,21312,21314,21316,
+21318,21323,21324,21325,21328,21332,21336,21337,21339,21341,21349,21352,21354,
+21356,21357,21362,21366,21369,21371,21372,21373,21374,21376,21377,21379,21383,
+21384,21386,21390,21391,21392,21393,21394,21395,21396,21398,21399,21401,21403,
+21404,21406,21408,21409,21412,21415,21418,21419,21420,21421,21423,21424,21425,
+21426,21427,21428,21429,21431,21432,21433,21434,21436,21437,21438,21440,21443,
+21444,21445,21446,21447,21454,21455,21456,21458,21459,21461,21466,21468,21469,
+21470,21473,21474,21479,21492,21498,21502,21503,21504,21506,21509,21511,21515,
+21524,21528,21529,21530,21532,21538,21540,21541,21546,21552,21555,21558,21559,
+21562,21565,21567,21569,21570,21572,21573,21575,21577,21580,21581,21582,21583,
+21585,21594,21597,21598,21599,21600,21601,21603,21605,21607,21609,21610,21611,
+21612,21613,21614,21615,21616,21620,21625,21626,21630,21631,21633,21635,21637,
+21639,21640,21641,21642,21645,21649,21651,21655,21656,21660,21662,21663,21664,
+21665,21666,21669,21678,21680,21682,21685,21686,21687,21689,21690,21692,21694,
+21699,21701,21706,21707,21718,21720,21723,21728,21729,21730,21731,21732,21739,
+21740,21743,21744,21745,21748,21749,21750,21751,21752,21753,21755,21758,21760,
+21762,21763,21764,21765,21768,21770,21771,21772,21773,21774,21778,21779,21781,
+21782,21783,21784,21785,21786,21788,21789,21790,21791,21793,21797,21798,21800,
+21801,21803,21805,21810,21812,21813,21814,21816,21817,
+21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,21838,21839,
+21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,21855,21856,
+21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,21881,21882,
+21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,21910,21911,
+21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,21929,21930,
+21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,21948,21951,
+21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,21968,21973,
+21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,21998,22000,
+22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,22020,22021,
+22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,22038,22039,
+22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,22058,22059,
+22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,22080,22081,
+22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,22096,22097,
+22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,22115,22117,
+22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,22135,22136,22137,
+22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,22152,22153,22154,
+22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,22168,22169,22170,
+22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,22182,22183,22184,
+22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,22196,22197,22198,
+22200,22201,22202,22203,22205,22206,22207,22208,22209,
+22210,22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,
+22224,22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,
+22248,22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,
+22272,22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,
+22291,22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,
+22306,22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,
+22332,22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,
+22356,22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,
+22386,22388,22389,22392,22393,22394,22397,22398,22399,22400,22401,22407,22408,
+22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,
+22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,
+22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,
+22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,
+22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,
+22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,
+22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,
+22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,
+22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,
+22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,
+22597,22598,22599,22600,22601,22602,22603,22606,22607,
+22608,22610,22611,22613,22614,22615,22617,22618,22619,22620,22621,22623,22624,
+22625,22626,22627,22628,22630,22631,22632,22633,22634,22637,22638,22639,22640,
+22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,
+22655,22658,22660,22662,22663,22664,22666,22667,22668,22669,22670,22671,22672,
+22673,22676,22677,22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,
+22692,22693,22694,22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,
+22707,22708,22709,22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,
+22722,22723,22724,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,
+22736,22738,22739,22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,
+22751,22752,22753,22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,
+22769,22770,22772,22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,
+22785,22787,22789,22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,
+22803,22807,22808,22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,
+22832,22834,22835,22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,
+22858,22860,22861,22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,
+22883,22884,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,
+22897,22898,22901,22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,
+22924,22926,22927,22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,
+22944,22945,22946,22950,22951,22956,22957,22960,22961,22963,22964,22965,22966,
+22967,22968,22970,22972,22973,22975,22976,22977,22978,
+22979,22980,22981,22983,22984,22985,22988,22989,22990,22991,22997,22998,23001,
+23003,23006,23007,23008,23009,23010,23012,23014,23015,23017,23018,23019,23021,
+23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23034,23036,
+23037,23038,23040,23042,23050,23051,23053,23054,23055,23056,23058,23060,23061,
+23062,23063,23065,23066,23067,23069,23070,23073,23074,23076,23078,23079,23080,
+23082,23083,23084,23085,23086,23087,23088,23091,23093,23095,23096,23097,23098,
+23099,23101,23102,23103,23105,23106,23107,23108,23109,23111,23112,23115,23116,
+23117,23118,23119,23120,23121,23122,23123,23124,23126,23127,23128,23129,23131,
+23132,23133,23134,23135,23136,23137,23139,23140,23141,23142,23144,23145,23147,
+23148,23149,23150,23151,23152,23153,23154,23155,23160,23161,23163,23164,23165,
+23166,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,
+23180,23181,23182,23183,23184,23185,23187,23188,23189,23190,23191,23192,23193,
+23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,
+23209,23211,23212,23213,23214,23215,23216,23217,23220,23222,23223,23225,23226,
+23227,23228,23229,23231,23232,23235,23236,23237,23238,23239,23240,23242,23243,
+23245,23246,23247,23248,23249,23251,23253,23255,23257,23258,23259,23261,23262,
+23263,23266,23268,23269,23271,23272,23274,23276,23277,23278,23279,23280,23282,
+23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,
+23296,23297,23298,23299,23300,23301,23302,23303,23304,23306,23307,23308,23309,
+23310,23311,23312,23313,23314,23315,23316,23317,23320,
+23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,
+23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23347,
+23349,23350,23352,23353,23354,23355,23356,23357,23358,23359,23361,23362,23363,
+23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23378,
+23382,23390,23392,23393,23399,23400,23403,23405,23406,23407,23410,23412,23414,
+23415,23416,23417,23419,23420,23422,23423,23426,23430,23434,23437,23438,23440,
+23441,23442,23444,23446,23455,23463,23464,23465,23468,23469,23470,23471,23473,
+23474,23479,23482,23483,23484,23488,23489,23491,23496,23497,23498,23499,23501,
+23502,23503,23505,23508,23509,23510,23511,23512,23513,23514,23515,23516,23520,
+23522,23523,23526,23527,23529,23530,23531,23532,23533,23535,23537,23538,23539,
+23540,23541,23542,23543,23549,23550,23552,23554,23555,23557,23559,23560,23563,
+23564,23565,23566,23568,23570,23571,23575,23577,23579,23582,23583,23584,23585,
+23587,23590,23592,23593,23594,23595,23597,23598,23599,23600,23602,23603,23605,
+23606,23607,23619,23620,23622,23623,23628,23629,23634,23635,23636,23638,23639,
+23640,23642,23643,23644,23645,23647,23650,23652,23655,23656,23657,23658,23659,
+23660,23661,23664,23666,23667,23668,23669,23670,23671,23672,23675,23676,23677,
+23678,23680,23683,23684,23685,23686,23687,23689,23690,23691,23694,23695,23698,
+23699,23701,23709,23710,23711,23712,23713,23716,23717,23718,23719,23720,23722,
+23726,23727,23728,23730,23732,23734,23737,23738,23739,23740,23742,23744,23746,
+23747,23749,23750,23751,23752,23753,23754,23756,23757,
+23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,23772,
+23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,23793,
+23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,23807,
+23808,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,23824,23825,
+23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,23841,23842,
+23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,23861,23862,
+23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,23876,23877,
+23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,
+23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,23909,23910,
+23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,23927,23928,
+23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,23941,23942,
+23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,
+23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,23969,23970,
+23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,
+23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,23996,23997,
+23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,24010,24011,
+24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,
+24026,24028,24031,24032,24035,24036,24042,24044,24045,24048,24053,24054,24056,
+24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,24075,24077,24078,
+24082,24083,24087,24094,24095,24096,24097,24098,24099,
+24100,24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,
+24118,24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,
+24139,24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,
+24156,24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,
+24172,24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,
+24197,24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,
+24228,24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,
+24251,24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,
+24267,24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,
+24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,
+24300,24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,
+24317,24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,
+24346,24348,24349,24350,24353,24354,24355,24356,24360,24363,24364,24366,24368,
+24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,
+24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,
+24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,
+24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,
+24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,
+24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,
+24498,24499,24500,24502,24504,24505,24506,24507,24510,
+24511,24512,24513,24514,24519,24520,24522,24523,24526,24531,24532,24533,24538,
+24539,24540,24542,24543,24546,24547,24549,24550,24552,24553,24556,24559,24560,
+24562,24563,24564,24566,24567,24569,24570,24572,24583,24584,24585,24587,24588,
+24592,24593,24595,24599,24600,24602,24606,24607,24610,24611,24612,24620,24621,
+24622,24624,24625,24626,24627,24628,24630,24631,24632,24633,24634,24637,24638,
+24640,24644,24645,24646,24647,24648,24649,24650,24652,24654,24655,24657,24659,
+24660,24662,24663,24664,24667,24668,24670,24671,24672,24673,24677,24678,24686,
+24689,24690,24692,24693,24695,24702,24704,24705,24706,24709,24710,24711,24712,
+24714,24715,24718,24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,
+24737,24738,24740,24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,
+24761,24762,24765,24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,
+24780,24781,24782,24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,
+24801,24802,24803,24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,
+24829,24830,24831,24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,
+24850,24851,24852,24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,
+24869,24872,24873,24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,
+24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,
+24899,24900,24901,24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,
+24918,24919,24920,24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,
+24933,24934,24937,24938,24939,24940,24941,24942,24943,
+24945,24946,24947,24948,24950,24952,24953,24954,24955,24956,24957,24958,24959,
+24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24972,24973,
+24975,24976,24977,24978,24979,24981,24982,24983,24984,24985,24986,24987,24988,
+24990,24991,24992,24993,24994,24995,24996,24997,24998,25002,25003,25005,25006,
+25007,25008,25009,25010,25011,25012,25013,25014,25016,25017,25018,25019,25020,
+25021,25023,25024,25025,25027,25028,25029,25030,25031,25033,25036,25037,25038,
+25039,25040,25043,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,
+25055,25056,25057,25058,25059,25060,25061,25063,25064,25065,25066,25067,25068,
+25069,25070,25071,25072,25073,25074,25075,25076,25078,25079,25080,25081,25082,
+25083,25084,25085,25086,25088,25089,25090,25091,25092,25093,25095,25097,25107,
+25108,25113,25116,25117,25118,25120,25123,25126,25127,25128,25129,25131,25133,
+25135,25136,25137,25138,25141,25142,25144,25145,25146,25147,25148,25154,25156,
+25157,25158,25162,25167,25168,25173,25174,25175,25177,25178,25180,25181,25182,
+25183,25184,25185,25186,25188,25189,25192,25201,25202,25204,25205,25207,25208,
+25210,25211,25213,25217,25218,25219,25221,25222,25223,25224,25227,25228,25229,
+25230,25231,25232,25236,25241,25244,25245,25246,25251,25254,25255,25257,25258,
+25261,25262,25263,25264,25266,25267,25268,25270,25271,25272,25274,25278,25280,
+25281,25283,25291,25295,25297,25301,25309,25310,25312,25313,25316,25322,25323,
+25328,25330,25333,25336,25337,25338,25339,25344,25347,25348,25349,25350,25354,
+25355,25356,25357,25359,25360,25362,25363,25364,25365,
+25367,25368,25369,25372,25382,25383,25385,25388,25389,25390,25392,25393,25395,
+25396,25397,25398,25399,25400,25403,25404,25406,25407,25408,25409,25412,25415,
+25416,25418,25425,25426,25427,25428,25430,25431,25432,25433,25434,25435,25436,
+25437,25440,25444,25445,25446,25448,25450,25451,25452,25455,25456,25458,25459,
+25460,25461,25464,25465,25468,25469,25470,25471,25473,25475,25476,25477,25478,
+25483,25485,25489,25491,25492,25493,25495,25497,25498,25499,25500,25501,25502,
+25503,25505,25508,25510,25515,25519,25521,25522,25525,25526,25529,25531,25533,
+25535,25536,25537,25538,25539,25541,25543,25544,25546,25547,25548,25553,25555,
+25556,25557,25559,25560,25561,25562,25563,25564,25565,25567,25570,25572,25573,
+25574,25575,25576,25579,25580,25582,25583,25584,25585,25587,25589,25591,25593,
+25594,25595,25596,25598,25603,25604,25606,25607,25608,25609,25610,25613,25614,
+25617,25618,25621,25622,25623,25624,25625,25626,25629,25631,25634,25635,25636,
+25637,25639,25640,25641,25643,25646,25647,25648,25649,25650,25651,25653,25654,
+25655,25656,25657,25659,25660,25662,25664,25666,25667,25673,25675,25676,25677,
+25678,25679,25680,25681,25683,25685,25686,25687,25689,25690,25691,25692,25693,
+25695,25696,25697,25698,25699,25700,25701,25702,25704,25706,25707,25708,25710,
+25711,25712,25713,25714,25715,25716,25717,25718,25719,25723,25724,25725,25726,
+25727,25728,25729,25731,25734,25736,25737,25738,25739,25740,25741,25742,25743,
+25744,25747,25748,25751,25752,25754,25755,25756,25757,25759,25760,25761,25762,
+25763,25765,25766,25767,25768,25770,25771,25775,25777,
+25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,25798,
+25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,25817,
+25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,25834,
+25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,
+25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,25861,
+25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,25876,
+25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,
+25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,25906,25907,
+25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,25930,25931,
+25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,25952,25953,
+25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,25973,25974,
+25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,
+25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,26006,26008,
+26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,26033,26034,
+26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,26050,26055,
+26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,26074,26075,
+26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,26100,26101,
+26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,26120,26121,
+26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,26142,26145,
+26146,26147,26148,26150,26153,26154,26155,26156,26158,
+26160,26162,26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,
+26181,26182,26183,26184,26185,26186,26189,26190,26192,26193,26200,26201,26203,
+26204,26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,
+26225,26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,
+26245,26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,
+26261,26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,
+26277,26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,
+26294,26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,
+26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,
+26322,26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,
+26339,26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,
+26358,26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,
+26382,26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,
+26402,26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,
+26425,26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,
+26452,26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,
+26475,26476,26478,26481,26484,26486,26488,26489,26490,26491,26493,26496,26498,
+26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,
+26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,
+26548,26553,26554,26555,26556,26557,26558,26559,26560,
+26562,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26581,26582,
+26583,26587,26591,26593,26595,26596,26598,26599,26600,26602,26603,26605,26606,
+26610,26613,26614,26615,26616,26617,26618,26619,26620,26622,26625,26626,26627,
+26628,26630,26637,26640,26642,26644,26645,26648,26649,26650,26651,26652,26654,
+26655,26656,26658,26659,26660,26661,26662,26663,26664,26667,26668,26669,26670,
+26671,26672,26673,26676,26677,26678,26682,26683,26687,26695,26699,26701,26703,
+26706,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26730,26732,
+26733,26734,26735,26736,26737,26738,26739,26741,26744,26745,26746,26747,26748,
+26749,26750,26751,26752,26754,26756,26759,26760,26761,26762,26763,26764,26765,
+26766,26768,26769,26770,26772,26773,26774,26776,26777,26778,26779,26780,26781,
+26782,26783,26784,26785,26787,26788,26789,26793,26794,26795,26796,26798,26801,
+26802,26804,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26817,
+26819,26820,26821,26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,
+26836,26838,26839,26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,
+26854,26855,26856,26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,
+26871,26872,26875,26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,
+26889,26890,26892,26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,
+26907,26908,26909,26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,
+26923,26924,26926,26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,
+26940,26942,26944,26945,26947,26948,26949,26950,26951,
+26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26965,
+26966,26968,26969,26971,26972,26975,26977,26978,26980,26981,26983,26984,26985,
+26986,26988,26989,26991,26992,26994,26995,26996,26997,26998,27002,27003,27005,
+27006,27007,27009,27011,27013,27018,27019,27020,27022,27023,27024,27025,27026,
+27027,27030,27031,27033,27034,27037,27038,27039,27040,27041,27042,27043,27044,
+27045,27046,27049,27050,27052,27054,27055,27056,27058,27059,27061,27062,27064,
+27065,27066,27068,27069,27070,27071,27072,27074,27075,27076,27077,27078,27079,
+27080,27081,27083,27085,27087,27089,27090,27091,27093,27094,27095,27096,27097,
+27098,27100,27101,27102,27105,27106,27107,27108,27109,27110,27111,27112,27113,
+27114,27115,27116,27118,27119,27120,27121,27123,27124,27125,27126,27127,27128,
+27129,27130,27131,27132,27134,27136,27137,27138,27139,27140,27141,27142,27143,
+27144,27145,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,
+27158,27161,27162,27163,27164,27165,27166,27168,27170,27171,27172,27173,27174,
+27175,27177,27179,27180,27181,27182,27184,27186,27187,27188,27190,27191,27192,
+27193,27194,27195,27196,27199,27200,27201,27202,27203,27205,27206,27208,27209,
+27210,27211,27212,27213,27214,27215,27217,27218,27219,27220,27221,27222,27223,
+27226,27228,27229,27230,27231,27232,27234,27235,27236,27238,27239,27240,27241,
+27242,27243,27244,27245,27246,27247,27248,27250,27251,27252,27253,27254,27255,
+27256,27258,27259,27261,27262,27263,27265,27266,27267,27269,27270,27271,27272,
+27273,27274,27275,27276,27277,27279,27282,27283,27284,
+27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,27297,27298,27299,
+27300,27301,27302,27303,27304,27306,27309,27310,27311,27312,27313,27314,27315,
+27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,
+27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,
+27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,
+27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,
+27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,
+27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,
+27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,
+27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,
+27420,27421,27422,27423,27429,27430,27432,27433,27434,27435,27436,27437,27438,
+27439,27440,27441,27443,27444,27445,27446,27448,27451,27452,27453,27455,27456,
+27457,27458,27460,27461,27464,27466,27467,27469,27470,27471,27472,27473,27474,
+27475,27476,27477,27478,27479,27480,27482,27483,27484,27485,27486,27487,27488,
+27489,27496,27497,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,
+27509,27510,27511,27512,27514,27517,27518,27519,27520,27525,27528,27532,27534,
+27535,27536,27537,27540,27541,27543,27544,27545,27548,27549,27550,27551,27552,
+27554,27555,27556,27557,27558,27559,27560,27561,27563,27564,27565,27566,27567,
+27568,27569,27570,27574,27576,27577,27578,27579,27580,27581,27582,27584,27587,
+27588,27590,27591,27592,27593,27594,27596,27598,27600,
+27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,27622,
+27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,27640,
+27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,27658,
+27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,27692,
+27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,27716,
+27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,27737,
+27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,27763,
+27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,27789,
+27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,27810,
+27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,27843,
+27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,27865,27866,27868,
+27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,27903,27904,
+27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,27923,27924,
+27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,27942,27944,
+27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,27968,27970,
+27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,28001,28002,
+28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,28021,28022,
+28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,28039,28042,
+28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,28066,28069,
+28076,28077,28080,28081,28083,28084,28086,28087,28089,
+28090,28091,28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,
+28111,28112,28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,
+28133,28135,28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,
+28154,28157,28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,
+28171,28175,28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,
+28199,28200,28202,28204,28206,28208,28209,28211,28213,28214,28215,28217,28219,
+28220,28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,
+28235,28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,
+28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,
+28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,
+28284,28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,
+28305,28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,
+28321,28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,
+28344,28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,
+28364,28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,
+28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,
+28408,28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,
+28424,28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,
+28442,28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,
+28460,28462,28464,28466,28468,28469,28471,28472,28473,
+28474,28475,28476,28477,28479,28480,28481,28482,28483,28484,28485,28488,28489,
+28490,28492,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28505,
+28506,28507,28509,28511,28512,28513,28515,28516,28517,28519,28520,28521,28522,
+28523,28524,28527,28528,28529,28531,28533,28534,28535,28537,28539,28541,28542,
+28543,28544,28545,28546,28547,28549,28550,28551,28554,28555,28559,28560,28561,
+28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28573,28574,28575,
+28576,28578,28579,28580,28581,28582,28584,28585,28586,28587,28588,28589,28590,
+28591,28592,28593,28594,28596,28597,28599,28600,28602,28603,28604,28605,28606,
+28607,28609,28611,28612,28613,28614,28615,28616,28618,28619,28620,28621,28622,
+28623,28624,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,
+28639,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,
+28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,
+28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,
+28682,28683,28684,28685,28686,28687,28688,28690,28691,28692,28693,28694,28695,
+28696,28697,28700,28701,28702,28703,28704,28705,28706,28708,28709,28710,28711,
+28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,
+28726,28727,28728,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,
+28740,28741,28742,28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,
+28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,
+28769,28770,28771,28772,28773,28774,28775,28776,28777,
+28778,28782,28785,28786,28787,28788,28791,28793,28794,28795,28797,28801,28802,
+28803,28804,28806,28807,28808,28811,28812,28813,28815,28816,28817,28819,28823,
+28824,28826,28827,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,
+28840,28841,28842,28848,28850,28852,28853,28854,28858,28862,28863,28868,28869,
+28870,28871,28873,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,
+28885,28886,28887,28890,28892,28893,28894,28896,28897,28898,28899,28901,28906,
+28910,28912,28913,28914,28915,28916,28917,28918,28920,28922,28923,28924,28926,
+28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28939,28940,28941,
+28942,28943,28945,28946,28948,28951,28955,28956,28957,28958,28959,28960,28961,
+28962,28963,28964,28965,28967,28968,28969,28970,28971,28972,28973,28974,28978,
+28979,28980,28981,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,
+28993,28994,28995,28996,28998,28999,29000,29001,29003,29005,29007,29008,29009,
+29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29021,29023,29024,
+29025,29026,29027,29029,29033,29034,29035,29036,29037,29039,29040,29041,29044,
+29045,29046,29047,29049,29051,29052,29054,29055,29056,29057,29058,29059,29061,
+29062,29063,29064,29065,29067,29068,29069,29070,29072,29073,29074,29075,29077,
+29078,29079,29082,29083,29084,29085,29086,29089,29090,29091,29092,29093,29094,
+29095,29097,29098,29099,29101,29102,29103,29104,29105,29106,29108,29110,29111,
+29112,29114,29115,29116,29117,29118,29119,29120,29121,29122,29124,29125,29126,
+29127,29128,29129,29130,29131,29132,29133,29135,29136,
+29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,
+29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,29165,29167,29168,
+29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,29180,29181,29182,
+29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,29194,29195,29196,
+29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,
+29210,29211,29212,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,
+29225,29227,29229,29230,29231,29234,29235,29236,29242,29244,29246,29248,29249,
+29250,29251,29252,29253,29254,29257,29258,29259,29262,29263,29264,29265,29267,
+29268,29269,29271,29272,29274,29276,29278,29280,29283,29284,29285,29288,29290,
+29291,29292,29293,29296,29297,29299,29300,29302,29303,29304,29307,29308,29309,
+29314,29315,29317,29318,29319,29320,29321,29324,29326,29328,29329,29331,29332,
+29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29344,29345,29346,
+29347,29348,29349,29350,29351,29352,29353,29354,29355,29358,29361,29362,29363,
+29365,29370,29371,29372,29373,29374,29375,29376,29381,29382,29383,29385,29386,
+29387,29388,29391,29393,29395,29396,29397,29398,29400,29402,29403,58566,58567,
+58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,58579,58580,
+58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,58592,58593,
+58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,58605,58606,
+58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,58618,58619,
+58620,58621,58622,58623,58624,58625,58626,58627,58628,
+58629,58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,
+58642,58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,
+58655,58656,58657,58658,58659,58660,58661,12288,12289,12290,183,713,711,168,
+12291,12293,8212,65374,8214,8230,8216,8217,8220,8221,12308,12309,12296,12297,
+12298,12299,12300,12301,12302,12303,12310,12311,12304,12305,177,215,247,8758,
+8743,8744,8721,8719,8746,8745,8712,8759,8730,8869,8741,8736,8978,8857,8747,
+8750,8801,8780,8776,8765,8733,8800,8814,8815,8804,8805,8734,8757,8756,9794,
+9792,176,8242,8243,8451,65284,164,65504,65505,8240,167,8470,9734,9733,9675,
+9679,9678,9671,9670,9633,9632,9651,9650,8251,8594,8592,8593,8595,12307,58662,
+58663,58664,58665,58666,58667,58668,58669,58670,58671,58672,58673,58674,58675,
+58676,58677,58678,58679,58680,58681,58682,58683,58684,58685,58686,58687,58688,
+58689,58690,58691,58692,58693,58694,58695,58696,58697,58698,58699,58700,58701,
+58702,58703,58704,58705,58706,58707,58708,58709,58710,58711,58712,58713,58714,
+58715,58716,58717,58718,58719,58720,58721,58722,58723,58724,58725,58726,58727,
+58728,58729,58730,58731,58732,58733,58734,58735,58736,58737,58738,58739,58740,
+58741,58742,58743,58744,58745,58746,58747,58748,58749,58750,58751,58752,58753,
+58754,58755,58756,58757,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,
+59238,59239,59240,59241,59242,59243,9352,9353,9354,9355,9356,9357,9358,9359,
+9360,9361,9362,9363,9364,9365,9366,9367,9368,
+9369,9370,9371,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,
+9344,9345,9346,9347,9348,9349,9350,9351,9312,9313,9314,9315,9316,9317,9318,
+9319,9320,9321,8364,59245,12832,12833,12834,12835,12836,12837,12838,12839,
+12840,12841,59246,59247,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,
+8554,8555,59248,59249,58758,58759,58760,58761,58762,58763,58764,58765,58766,
+58767,58768,58769,58770,58771,58772,58773,58774,58775,58776,58777,58778,58779,
+58780,58781,58782,58783,58784,58785,58786,58787,58788,58789,58790,58791,58792,
+58793,58794,58795,58796,58797,58798,58799,58800,58801,58802,58803,58804,58805,
+58806,58807,58808,58809,58810,58811,58812,58813,58814,58815,58816,58817,58818,
+58819,58820,58821,58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,
+58832,58833,58834,58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,
+58845,58846,58847,58848,58849,58850,58851,58852,58853,65281,65282,65283,65509,
+65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,
+65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,
+65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,
+65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,
+65337,65338,65339,65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,
+65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,
+65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,58854,
+58855,58856,58857,58858,
+58859,58860,58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,
+58872,58873,58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,
+58885,58886,58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,
+58898,58899,58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,
+58911,58912,58913,58914,58915,58916,58917,58918,58919,58920,58921,58922,58923,
+58924,58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,
+58937,58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,
+12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,
+12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,
+12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,
+12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,
+12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,
+12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,
+12431,12432,12433,12434,12435,59250,59251,59252,59253,59254,59255,59256,59257,
+59258,59259,59260,58950,58951,58952,58953,58954,58955,58956,58957,58958,58959,
+58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,58972,
+58973,58974,58975,58976,58977,58978,58979,58980,58981,58982,58983,58984,58985,
+58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,58997,58998,
+58999,59000,59001,59002,59003,59004,59005,59006,59007,59008,59009,59010,59011,
+59012,59013,59014,59015,59016,59017,59018,59019,59020,
+59021,59022,59023,59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,
+59034,59035,59036,59037,59038,59039,59040,59041,59042,59043,59044,59045,12449,
+12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,
+12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,
+12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,
+12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,
+12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,
+12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,
+12528,12529,12530,12531,12532,12533,12534,59261,59262,59263,59264,59265,59266,
+59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,59056,
+59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,59069,
+59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,59082,
+59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,59095,
+59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,59108,
+59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,59120,59121,
+59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,59133,59134,
+59135,59136,59137,59138,59139,59140,59141,913,914,915,916,917,918,919,920,921,
+922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,59269,59270,59271,
+59272,59273,59274,59275,59276,945,946,947,948,949,950,951,952,953,
+954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,59277,59278,59279,
+59280,59281,59282,59283,65077,65078,65081,65082,65087,65088,65085,65086,65089,
+65090,65091,65092,59284,59285,65083,65084,65079,65080,65073,59286,65075,65076,
+59287,59288,59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,
+59146,59147,59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,
+59159,59160,59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,
+59172,59173,59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,
+59185,59186,59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,
+59198,59199,59200,59201,59202,59203,59204,59205,59206,59207,59208,59209,59210,
+59211,59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,
+59224,59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,
+59237,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,
+1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,
+1068,1069,1070,1071,59296,59297,59298,59299,59300,59301,59302,59303,59304,
+59305,59306,59307,59308,59309,59310,1072,1073,1074,1075,1076,1077,1105,1078,
+1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,
+1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,59311,59312,59313,59314,
+59315,59316,59317,59318,59319,59320,59321,59322,59323,714,715,729,8211,8213,
+8229,8245,8453,8457,8598,8599,8600,8601,
+8725,8735,8739,8786,8806,8807,8895,9552,9553,9554,9555,9556,9557,9558,9559,
+9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,
+9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9601,9602,
+9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9619,9620,
+9621,9660,9661,9698,9699,9700,9701,9737,8853,12306,12317,12318,59324,59325,
+59326,59327,59328,59329,59330,59331,59332,59333,59334,257,225,462,224,275,233,
+283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,
+234,593,59335,324,328,505,609,59337,59338,59339,59340,12549,12550,12551,12552,
+12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,
+12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,
+12579,12580,12581,12582,12583,12584,12585,59341,59342,59343,59344,59345,59346,
+59347,59348,59349,59350,59351,59352,59353,59354,59355,59356,59357,59358,59359,
+59360,59361,12321,12322,12323,12324,12325,12326,12327,12328,12329,12963,13198,
+13199,13212,13213,13214,13217,13252,13262,13265,13266,13269,65072,65506,65508,
+59362,8481,12849,59363,8208,59364,59365,59366,12540,12443,12444,12541,12542,
+12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,
+65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,65120,65121,
+65122,65123,65124,65125,65126,65128,65129,65130,65131,12350,12272,12273,12274,
+12275,12276,12277,
+12278,12279,12280,12281,12282,12283,12295,59380,59381,59382,59383,59384,59385,
+59386,59387,59388,59389,59390,59391,59392,9472,9473,9474,9475,9476,9477,9478,
+9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,
+9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,
+9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,
+9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,
+9539,9540,9541,9542,9543,9544,9545,9546,9547,59393,59394,59395,59396,59397,
+59398,59399,59400,59401,59402,59403,59404,59405,59406,59407,29404,29405,29407,
+29410,29411,29412,29413,29414,29415,29418,29419,29429,29430,29433,29437,29438,
+29439,29440,29442,29444,29445,29446,29447,29448,29449,29451,29452,29453,29455,
+29456,29457,29458,29460,29464,29465,29466,29471,29472,29475,29476,29478,29479,
+29480,29485,29487,29488,29490,29491,29493,29494,29498,29499,29500,29501,29504,
+29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29518,
+29519,29521,29523,29524,29525,29526,29528,29529,29530,29531,29532,29533,29534,
+29535,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29550,
+29552,29553,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,57354,
+57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,57367,
+57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,57380,
+57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,
+57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,
+57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,
+57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,
+57432,57433,57434,57435,57436,57437,29554,29555,29556,29557,29558,29559,29560,
+29561,29562,29563,29564,29565,29567,29568,29569,29570,29571,29573,29574,29576,
+29578,29580,29581,29583,29584,29586,29587,29588,29589,29591,29592,29593,29594,
+29596,29597,29598,29600,29601,29603,29604,29605,29606,29607,29608,29610,29612,
+29613,29617,29620,29621,29622,29624,29625,29628,29629,29630,29631,29633,29635,
+29636,29637,29638,29639,29643,29644,29646,29650,29651,29652,29653,29654,29655,
+29656,29658,29659,29660,29661,29663,29665,29666,29667,29668,29670,29672,29674,
+29675,29676,29678,29679,29680,29681,29683,29684,29685,29686,29687,57438,57439,
+57440,57441,57442,57443,57444,57445,57446,57447,57448,57449,57450,57451,57452,
+57453,57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,
+57466,57467,57468,57469,57470,57471,57472,57473,57474,57475,57476,57477,57478,
+57479,57480,57481,57482,57483,57484,57485,57486,57487,57488,57489,57490,57491,
+57492,57493,57494,57495,57496,57497,57498,57499,57500,57501,57502,57503,57504,
+57505,57506,57507,57508,57509,57510,57511,57512,57513,57514,57515,57516,57517,
+57518,57519,57520,57521,57522,57523,57524,57525,57526,57527,57528,57529,57530,
+57531,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29700,
+29703,29704,29707,29708,29709,29710,29713,29714,29715,
+29716,29717,29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,
+29732,29735,29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,
+29757,29758,29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,
+29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,
+29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,
+29806,29807,29809,29810,29811,29812,29813,29816,29817,29818,57532,57533,57534,
+57535,57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,
+57548,57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,
+57561,57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,
+57574,57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,
+57587,57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,
+57600,57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,
+57613,57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,
+29819,29820,29821,29823,29826,29828,29829,29830,29832,29833,29834,29836,29837,
+29839,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29853,
+29855,29856,29857,29858,29859,29860,29861,29862,29866,29867,29868,29869,29870,
+29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29883,29884,
+29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,
+29898,29899,29900,29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,
+29912,29913,29914,29915,29917,29919,29921,29925,29927,
+29928,29929,29930,29931,29932,29933,29936,29937,29938,57626,57627,57628,57629,
+57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,57640,57641,57642,
+57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,57653,57654,57655,
+57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,57666,57667,57668,
+57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,57679,57680,57681,
+57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,57692,57693,57694,
+57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,57705,57706,57707,
+57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,57718,57719,29939,
+29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,29954,29955,29957,
+29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,29972,29973,29974,
+29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,29991,29994,29998,
+30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,30022,30023,30025,
+30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,30045,30046,30047,
+30048,30049,30050,30051,30052,30055,30056,30057,30059,30060,30061,30062,30063,
+30064,30065,30067,30069,30070,30071,30074,30075,30076,30077,30078,30080,30081,
+30082,30084,30085,30087,57720,57721,57722,57723,57724,57725,57726,57727,57728,
+57729,57730,57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,
+57742,57743,57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,
+57755,57756,57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,
+57768,57769,57770,57771,57772,57773,57774,57775,57776,
+57777,57778,57779,57780,57781,57782,57783,57784,57785,57786,57787,57788,57789,
+57790,57791,57792,57793,57794,57795,57796,57797,57798,57799,57800,57801,57802,
+57803,57804,57805,57806,57807,57808,57809,57810,57811,57812,57813,30088,30089,
+30090,30092,30093,30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,
+30119,30120,30121,30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,
+30155,30156,30158,30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,
+30176,30177,30181,30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,
+30200,30202,30203,30205,30206,30210,30212,30214,30215,30216,30217,30219,30221,
+30222,30223,30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,
+30247,30248,30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,
+30273,30274,30276,57814,57815,57816,57817,57818,57819,57820,57821,57822,57823,
+57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,57835,57836,
+57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,57848,57849,
+57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,57861,57862,
+57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,57874,57875,
+57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,57887,57888,
+57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,57900,57901,
+57902,57903,57904,57905,57906,57907,30277,30278,30279,30280,30281,30282,30283,
+30286,30287,30288,30289,30290,30291,30293,30295,30296,30297,30298,30299,30301,
+30303,30304,30305,30306,30308,30309,30310,30311,30312,
+30313,30314,30316,30317,30318,30320,30321,30322,30323,30324,30325,30326,30327,
+30329,30330,30332,30335,30336,30337,30339,30341,30345,30346,30348,30349,30351,
+30352,30354,30356,30357,30359,30360,30362,30363,30364,30365,30366,30367,30368,
+30369,30370,30371,30373,30374,30375,30376,30377,30378,30379,30380,30381,30383,
+30384,30387,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30400,
+30401,30403,21834,38463,22467,25384,21710,21769,21696,30353,30284,34108,30702,
+33406,30861,29233,38552,38797,27688,23433,20474,25353,26263,23736,33018,26696,
+32942,26114,30414,20985,25942,29100,32753,34948,20658,22885,25034,28595,33453,
+25420,25170,21485,21543,31494,20843,30116,24052,25300,36299,38774,25226,32793,
+22365,38712,32610,29240,30333,26575,30334,25670,20336,36133,25308,31255,26001,
+29677,25644,25203,33324,39041,26495,29256,25198,25292,20276,29923,21322,21150,
+32458,37030,24110,26758,27036,33152,32465,26834,30917,34444,38225,20621,35876,
+33502,32990,21253,35090,21093,30404,30407,30409,30411,30412,30419,30421,30425,
+30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,30440,30441,
+30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,30461,30463,
+30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,30482,30483,
+30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,30500,30501,
+30503,30506,30507,30508,30510,30512,30513,30514,30515,30516,30521,30523,30525,
+30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,30540,30541,30542,
+30543,30546,30547,30548,30549,30550,30551,30552,30553,
+30556,34180,38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,
+26479,30865,24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,
+28953,34987,22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,
+40763,27604,37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,
+30201,38381,25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,
+36140,25153,20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,
+40150,24971,21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,
+19993,31177,39292,28851,30557,30558,30559,30560,30564,30567,30569,30570,30573,
+30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30586,30587,
+30588,30593,30594,30595,30598,30599,30600,30601,30602,30603,30607,30608,30611,
+30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30625,30627,
+30628,30630,30632,30635,30637,30638,30639,30641,30642,30644,30646,30647,30648,
+30649,30650,30652,30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,
+30665,30666,30667,30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,
+30680,30681,30682,30685,30686,30687,30688,30689,30692,30149,24182,29627,33760,
+25773,25320,38069,27874,21338,21187,25615,38082,31636,20271,24091,33334,33046,
+33162,28196,27850,39539,25429,21340,21754,34917,22496,19981,24067,27493,31807,
+37096,24598,25830,29468,35009,26448,25165,36130,30572,36393,37319,24425,33756,
+34081,39184,21442,34453,27531,24813,24808,28799,33485,33329,20179,27815,34255,
+25805,31961,27133,26361,33609,21397,31574,20391,20876,
+27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,23700,24046,
+35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,20135,38416,
+39076,26124,29462,30694,30696,30698,30703,30704,30705,30706,30708,30709,30711,
+30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,30730,30731,30734,
+30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,30756,30760,30762,
+30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,30785,30786,30787,
+30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,30804,30808,30809,
+30810,30811,30812,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,
+30824,30825,30831,30832,30833,30834,30835,30836,30837,30838,30840,30841,30842,
+30843,30845,30846,30847,30848,30849,30850,30851,22330,23581,24120,38271,20607,
+32928,21378,25950,30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,
+21557,28818,36710,25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,
+24561,27785,38472,36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,
+24809,28548,35802,25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,
+24347,39536,32827,40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,
+23815,23456,25277,37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,
+33261,21021,20986,27249,21416,36487,38148,38607,28353,38500,26970,30852,30853,
+30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,30878,
+30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,30901,
+30902,30903,30904,30906,30907,30908,30909,30911,30912,
+30914,30915,30916,30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,
+30934,30935,30936,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,
+30948,30949,30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,
+30965,30966,30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,
+30982,30983,30984,30985,30986,30987,30988,30784,20648,30679,25616,35302,22788,
+25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,38383,
+21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,34850,
+25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,36176,
+27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,36479,
+31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,23544,
+30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,21574,
+27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,30989,30990,30991,
+30992,30993,30994,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,
+31007,31008,31009,31010,31011,31013,31014,31015,31016,31017,31018,31019,31020,
+31021,31022,31023,31024,31025,31026,31027,31029,31030,31031,31032,31033,31037,
+31039,31042,31043,31044,31045,31047,31050,31051,31052,31053,31054,31055,31056,
+31057,31058,31060,31061,31064,31065,31073,31075,31076,31078,31081,31082,31083,
+31084,31086,31088,31089,31090,31091,31092,31093,31094,31097,31099,31100,31101,
+31102,31103,31106,31107,31110,31111,31112,31113,31115,31116,31117,31118,31120,
+31121,31122,24608,32829,25285,20025,21333,37112,25528,
+32966,26086,27694,20294,24814,28129,35806,24377,34507,24403,25377,20826,33633,
+26723,20992,25443,36424,20498,23707,31095,23548,21040,31291,24764,36947,30423,
+24503,24471,30340,36460,28783,30331,31561,30634,20979,37011,22564,20302,28404,
+36842,25932,31515,29380,28068,32735,23265,25269,24213,22320,33922,31532,24093,
+24351,36882,32532,39072,25474,28359,30872,28857,20856,38747,22443,30005,20291,
+30008,24215,24806,22880,28096,27583,30857,21500,38613,20939,20993,25481,21514,
+38035,35843,36300,29241,30879,34678,36845,35853,21472,31123,31124,31125,31126,
+31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,
+31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,
+31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,31176,31178,
+31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,31196,31197,
+31198,31200,31201,31202,31205,31208,31210,31212,31214,31217,31218,31219,31220,
+31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,31237,31239,31240,
+31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,31256,31257,31259,
+31260,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,
+33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,
+36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,
+32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,
+23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,
+22842,22427,36530,26421,36346,33333,21057,24816,22549,
+34558,23784,40517,20420,39069,35769,23077,24694,21380,25212,36943,37122,39295,
+24681,32780,20799,32819,23572,39285,27953,20108,31261,31263,31265,31266,31268,
+31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,
+31282,31284,31285,31286,31288,31290,31294,31296,31297,31298,31299,31300,31301,
+31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31314,31315,31316,
+31317,31318,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,
+31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,
+31345,31346,31347,31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,
+31371,31372,31374,31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,
+36144,21457,32602,31567,20240,20047,38400,27861,29648,34281,24070,30058,32763,
+27146,30718,38034,32321,20961,28902,21453,36820,33539,36137,29359,39277,27867,
+22346,33459,26041,32938,25151,38450,22952,20223,35775,32442,25918,33778,38750,
+21857,39134,32933,21290,35837,21536,32954,24223,27832,36153,33452,37210,21545,
+27675,20998,32439,22367,28954,27774,31881,22859,20221,24575,24868,31914,20016,
+23553,26539,34562,23792,38155,39118,30127,28925,36898,20911,32541,35773,22857,
+20964,20315,21542,22827,25975,32932,23413,25206,25282,36752,24133,27679,31526,
+20239,20440,26381,31395,31396,31399,31401,31402,31403,31406,31407,31408,31409,
+31410,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31424,
+31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31436,31437,31438,
+31439,31440,31441,31442,31443,31444,31445,31447,31448,
+31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,31466,31467,31468,
+31470,31472,31473,31474,31475,31476,31477,31478,31479,31480,31483,31484,31486,
+31488,31489,31490,31493,31495,31497,31500,31501,31502,31504,31506,31507,31510,
+31511,31512,31514,31516,31517,31519,31521,31522,31523,31527,31529,31533,28014,
+28074,31119,34993,24343,29995,25242,36741,20463,37340,26023,33071,33105,24220,
+33104,36212,21103,35206,36171,22797,20613,20184,38428,29238,33145,36127,23500,
+35747,38468,22919,32538,21648,22134,22030,35813,25913,27010,38041,30422,28297,
+24178,29976,26438,26577,31487,32925,36214,24863,31174,25954,36195,20872,21018,
+38050,32568,32923,32434,23703,28207,26464,31705,30347,39640,33167,32660,31957,
+25630,38224,31295,21578,21733,27468,25601,25096,40509,33011,30105,21106,38761,
+33883,26684,34532,38401,38548,38124,20010,21508,32473,26681,36319,32789,26356,
+24218,32697,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,31551,
+31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,31575,
+31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,31594,
+31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,31615,
+31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,31631,
+31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,31651,31652,
+31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,31675,31676,
+31677,31678,31679,31680,31682,31683,31684,22466,32831,26775,24037,25915,21151,
+24685,40858,20379,36524,20844,23467,24339,24041,27742,
+25329,36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,
+33735,21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,
+25925,39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,
+26874,20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,
+36891,29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,
+26588,36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,
+21704,31685,31688,31689,31690,31691,31693,31694,31695,31696,31698,31700,31701,
+31702,31703,31704,31707,31708,31710,31711,31712,31714,31715,31716,31719,31720,
+31721,31723,31724,31725,31727,31728,31730,31731,31732,31733,31734,31736,31737,
+31738,31739,31741,31743,31744,31745,31746,31747,31748,31749,31750,31752,31753,
+31754,31757,31758,31760,31761,31762,31763,31764,31765,31767,31768,31769,31770,
+31771,31772,31773,31774,31776,31777,31778,31779,31780,31781,31784,31785,31787,
+31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31801,
+31802,31803,31804,31805,31806,31810,39608,23401,28023,27686,20133,23475,39559,
+37219,25000,37039,38889,21547,28085,23506,20989,21898,32597,32752,25788,25421,
+26097,25022,24717,28938,27735,27721,22831,26477,33322,22741,22158,35946,27627,
+37085,22909,32791,21495,28009,21621,21917,33655,33743,26680,31166,21644,20309,
+21512,30418,35977,38402,27827,28088,36203,35088,40548,36154,22079,40657,30165,
+24456,29408,24680,21756,20136,27178,34913,24658,36720,21700,28888,34425,40511,
+27946,23439,24344,32418,21897,20399,29492,21564,21402,
+20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,29392,31946,28246,
+31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,31823,31824,
+31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,
+31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,
+31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,31864,31865,
+31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31882,
+31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,31898,31899,31904,
+31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,31920,31924,31925,
+31926,31927,31928,31930,31931,24359,34382,21804,25252,20114,27818,25143,33457,
+21719,21326,29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,
+27426,29615,26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,
+24187,33618,24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,
+24653,35854,28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,
+24800,26214,36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,
+39746,27985,28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,
+20987,22334,22522,26426,30072,31293,31215,31637,31935,31936,31938,31939,31940,
+31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,
+31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,
+31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,
+31997,31998,31999,32000,32001,32002,32003,32004,32005,
+32006,32007,32008,32009,32011,32012,32013,32014,32015,32016,32017,32018,32019,
+32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,
+32035,32036,32037,32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,
+32051,32052,32053,32054,32908,39269,36857,28608,35749,40481,23020,32489,32521,
+21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,23241,32423,
+25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,24760,27982,
+23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,26551,22841,
+20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,26550,39550,
+23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,22904,32516,
+33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,33616,27099,
+37492,36341,36145,35265,38190,31661,20214,32055,32056,32057,32058,32059,32060,
+32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,
+32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,
+32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,
+32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32111,32112,32113,
+32114,32115,32116,32117,32118,32120,32121,32122,32123,32124,32125,32126,32127,
+32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,
+32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,20581,
+33328,21073,39279,28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,
+33931,26728,22870,35762,21280,37233,38477,34121,26898,
+30977,28966,33014,20132,37066,27975,39556,23047,22204,25605,38128,30699,20389,
+33050,29409,35282,39290,32564,32478,21119,25945,37237,36735,36739,21483,31382,
+25581,25509,30342,31224,34903,38454,25130,21163,33410,26708,26480,25463,30571,
+31469,27905,32467,35299,22992,25106,34249,33445,30028,20511,20171,30117,35819,
+23626,24062,31563,26020,37329,20170,27941,35167,32039,38182,20165,35880,36827,
+38771,26187,31105,36817,28908,28024,32153,32154,32155,32156,32157,32158,32159,
+32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,32173,
+32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,
+32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,
+32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,
+32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,
+32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,
+32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,23613,21170,
+33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,35686,
+26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,28847,
+31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,26087,
+33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,23616,
+21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,20465,
+21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,25899,
+25225,25496,20500,29237,35273,20915,35776,32477,22343,
+33740,38055,20891,21531,23803,32251,32252,32253,32254,32255,32256,32257,32258,
+32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,
+32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,
+32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,
+32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,
+32311,32312,32313,32314,32316,32317,32318,32319,32320,32322,32323,32324,32325,
+32326,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,
+32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,20426,31459,27994,
+37089,39567,21888,21654,21345,21679,24320,25577,26999,20975,24936,21002,22570,
+21208,22350,30733,30475,24247,24951,31968,25179,25239,20130,28821,32771,25335,
+28900,38752,22391,33499,26607,26869,30933,39063,31185,22771,21683,21487,28212,
+20811,21051,23458,35838,32943,21827,22438,24691,22353,21549,31354,24656,23380,
+25511,25248,21475,25187,23495,26543,21741,31391,33510,37239,24211,35044,22840,
+22446,25358,36328,33007,22359,31607,20393,24555,23485,27454,21281,31568,29378,
+26694,30719,30518,26103,20917,20111,30420,23743,31397,33909,22862,39745,20608,
+32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,
+32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,
+32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32387,32388,32389,
+32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,
+32403,32404,32405,32406,32407,32408,32409,32410,32412,
+32413,32414,32430,32436,32443,32444,32470,32484,32492,32505,32522,32528,32542,
+32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,32582,32583,32584,
+32585,32586,32587,32588,32589,32590,32591,32594,32595,39304,24871,28291,22372,
+26118,25414,22256,25324,25193,24275,38420,22403,25289,21895,34593,33098,36771,
+21862,33713,26469,36182,34013,23146,26639,25318,31726,38417,20848,28572,35888,
+25597,35272,25042,32518,28866,28389,29701,27028,29436,24266,37070,26391,28010,
+25438,21171,29282,32769,20332,23013,37226,28889,28061,21202,20048,38647,38253,
+34174,30922,32047,20769,22418,25794,32907,31867,27882,26865,26974,20919,21400,
+26792,29313,40654,31729,29432,31163,28435,29702,26446,37324,40100,31036,33673,
+33620,21519,26647,20029,21385,21169,30782,21382,21033,20616,20363,20432,32598,
+32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,
+32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,
+32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,
+32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,
+32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,32691,32692,32693,
+32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,32713,
+32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,32732,
+32733,32734,32738,32739,30178,31435,31890,27813,38582,21147,29827,21737,20457,
+32852,33714,36830,38256,24265,24604,28063,24088,25947,33080,38142,24651,28860,
+32451,31918,20937,26753,31921,33391,20004,36742,37327,
+26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,
+38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,
+37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,
+32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,
+30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,32740,32743,
+32744,32746,32747,32748,32749,32751,32754,32756,32757,32758,32759,32760,32761,
+32762,32765,32766,32767,32770,32775,32776,32777,32778,32782,32783,32785,32787,
+32794,32795,32797,32798,32799,32801,32803,32804,32811,32812,32813,32814,32815,
+32816,32818,32820,32825,32826,32828,32830,32832,32833,32836,32837,32839,32840,
+32841,32846,32847,32848,32849,32851,32853,32854,32855,32857,32859,32860,32861,
+32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32875,32876,
+32877,32878,32879,32880,32882,32883,32884,32885,32886,32887,32888,32889,32890,
+32891,32892,32893,38534,22404,25314,38471,27004,23044,25602,31699,28431,38475,
+33446,21346,39045,24208,28809,25523,21348,34383,40065,40595,30860,38706,36335,
+36162,40575,28510,31108,24405,38470,25134,39540,21525,38109,20387,26053,23653,
+23649,32533,34385,27695,24459,29575,28388,32511,23782,25371,23402,28390,21365,
+20081,25504,30053,25249,36718,20262,20177,27814,32438,35770,33821,34746,32599,
+36923,38179,31657,39585,35064,33853,27931,39558,32476,22920,40635,29595,30721,
+34434,39532,39554,22043,21527,22475,20080,40614,21334,36808,33033,30610,39314,
+34542,28385,34067,26364,24930,28459,32894,32897,32898,
+32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,32921,
+32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,32955,
+32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,32981,
+32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,33023,
+33024,33025,33027,33028,33029,33031,33032,33035,33036,33045,33047,33049,33051,
+33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,
+33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,33083,33084,
+33085,33087,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,
+30683,38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,
+38665,29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,
+38391,20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,
+31964,36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,
+32501,20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,
+24217,22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,
+38125,21517,21629,35884,25720,33088,33089,33090,33091,33092,33093,33095,33097,
+33101,33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,
+33122,33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,
+33143,33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,
+33168,33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,
+33186,33188,33189,33191,33193,33195,33196,33197,33198,
+33199,33200,33201,33202,33204,33205,33206,33207,33208,33209,33212,33213,33214,
+33215,33220,33221,33223,33224,33225,33227,33229,33230,33231,33232,33233,33234,
+33235,25721,34321,27169,33180,30952,25705,39764,25273,26411,33707,22696,40664,
+27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,22982,27597,22675,
+26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,21738,21584,38048,
+37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,38590,22218,25376,
+33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,38675,20522,27877,
+23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,30910,25781,25467,
+24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,38221,28037,24744,
+26592,29406,20957,23425,33236,33237,33238,33239,33240,33241,33242,33243,33244,
+33245,33246,33247,33248,33249,33250,33252,33253,33254,33256,33257,33259,33262,
+33263,33264,33265,33266,33269,33270,33271,33272,33273,33274,33277,33279,33283,
+33287,33288,33289,33290,33291,33294,33295,33297,33299,33301,33302,33303,33304,
+33305,33306,33309,33312,33316,33317,33318,33319,33321,33326,33330,33338,33340,
+33341,33343,33344,33345,33346,33347,33349,33350,33352,33354,33356,33357,33358,
+33360,33361,33362,33363,33364,33365,33366,33367,33369,33371,33372,33373,33374,
+33376,33377,33378,33379,33380,33381,33382,33383,33385,25319,27870,29275,25197,
+38062,32445,33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,
+25386,25062,31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,
+36276,29228,24085,24597,29750,25293,25490,29260,24472,
+28227,27966,25856,28504,30424,30928,30460,30036,21028,21467,20051,24222,26049,
+32810,32982,25243,21638,21032,28846,34957,36305,27873,21624,32986,22521,35060,
+36180,38506,37197,20329,27803,21943,30406,30768,25256,28921,28558,24429,34028,
+26842,30844,31735,33192,26379,40527,25447,30896,22383,30738,38713,25209,25259,
+21128,29749,27607,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,
+33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,
+33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,
+33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,
+33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,
+33528,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,33555,
+33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,
+33577,33578,33582,33584,33586,33591,33595,33597,21860,33086,30130,30382,21305,
+30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,31080,25735,
+30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,20973,29942,
+35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,25169,38138,
+20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,26333,28689,
+26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,26827,22855,
+27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,20062,20225,
+21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,33598,33599,
+33601,33602,33604,33605,33608,33610,33611,33612,33613,
+33614,33619,33621,33622,33623,33624,33625,33629,33634,33648,33649,33650,33651,
+33652,33653,33654,33657,33658,33662,33663,33664,33665,33666,33667,33668,33671,
+33672,33674,33675,33676,33677,33679,33680,33681,33684,33685,33686,33687,33689,
+33690,33693,33695,33697,33698,33699,33700,33701,33702,33703,33708,33709,33710,
+33711,33717,33723,33726,33727,33730,33731,33732,33734,33736,33737,33739,33741,
+33742,33744,33745,33746,33747,33749,33751,33753,33754,33755,33758,33762,33763,
+33764,33766,33767,33768,33771,33772,33773,24688,27965,29301,25190,38030,38085,
+21315,36801,31614,20191,35878,20094,40660,38065,38067,21069,28508,36963,27973,
+35892,22545,23884,27424,27465,26538,21595,33108,32652,22681,34103,24378,25250,
+27207,38201,25970,24708,26725,30631,20052,20392,24039,38808,25772,32728,23789,
+20431,31373,20999,33540,19988,24623,31363,38054,20405,20146,31206,29748,21220,
+33465,25810,31165,23517,27777,38738,36731,27682,20542,21375,28165,25806,26228,
+27696,24773,39031,35831,24198,29756,31351,31179,19992,37041,29699,27714,22234,
+37195,27845,36235,21306,34502,26354,36527,23624,39537,28192,33774,33775,33779,
+33780,33781,33782,33783,33786,33787,33788,33790,33791,33792,33794,33797,33799,
+33800,33801,33802,33808,33810,33811,33812,33813,33814,33815,33817,33818,33819,
+33822,33823,33824,33825,33826,33827,33833,33834,33835,33836,33837,33838,33839,
+33840,33842,33843,33844,33845,33846,33847,33849,33850,33851,33854,33855,33856,
+33857,33858,33859,33860,33861,33863,33864,33865,33866,33867,33868,33869,33870,
+33871,33872,33874,33875,33876,33877,33878,33880,33885,
+33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,33903,33904,
+33906,33908,33911,33913,33915,33916,21462,23094,40843,36259,21435,22280,39079,
+26435,37275,27849,20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,
+40522,27063,30830,38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,
+22199,35753,39286,25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,
+35748,20995,22922,32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,
+28342,23481,32466,20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,
+20083,27741,20837,35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,
+25746,27922,33832,33134,40131,22622,36187,19977,21441,33917,33918,33919,33920,
+33921,33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,
+33941,33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,
+33958,33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,
+33974,33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,
+33996,33998,33999,34002,34004,34005,34007,34008,34009,34010,34011,34012,34014,
+34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,
+34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,
+34050,20254,25955,26705,21971,20007,25620,39578,25195,23234,29791,33394,28073,
+26862,20711,33678,30722,26432,21049,27801,32433,20667,21861,29022,31579,26194,
+29642,33515,26441,23665,21024,29053,34923,38378,38485,25797,36193,33203,21892,
+27733,25159,32558,22674,20260,21830,36175,26188,19978,
+23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,32461,
+22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,30775,
+30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,32958,
+24910,28183,22768,29983,29989,29298,21319,32499,34051,34052,34053,34054,34055,
+34056,34057,34058,34059,34061,34062,34063,34064,34066,34068,34069,34070,34072,
+34073,34075,34076,34077,34078,34080,34082,34083,34084,34085,34086,34087,34088,
+34089,34090,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34110,
+34111,34112,34113,34114,34116,34117,34118,34119,34123,34124,34125,34126,34127,
+34128,34129,34130,34131,34132,34133,34135,34136,34138,34139,34140,34141,34143,
+34144,34145,34146,34147,34149,34150,34151,34153,34154,34155,34156,34157,34158,
+34159,34160,34161,34163,34165,34166,34167,34168,34172,34173,34175,34176,34177,
+30465,30427,21097,32988,22307,24072,22833,29422,26045,28287,35799,23608,34417,
+21313,30707,25342,26102,20160,39135,34432,23454,35782,21490,30690,20351,23630,
+39542,22987,24335,31034,22763,19990,26623,20107,25325,35475,36893,21183,26159,
+21980,22124,36866,20181,20365,37322,39280,27663,24066,24643,23460,35270,35797,
+25910,25163,39318,23432,23551,25480,21806,21463,30246,20861,34092,26530,26803,
+27530,25234,36755,21460,33298,28113,30095,20070,36174,23408,29087,34223,26257,
+26329,32626,34560,40653,40736,23646,26415,36848,26641,26463,25101,31446,22661,
+24246,25968,28465,34178,34179,34182,34184,34185,34186,34187,34188,34189,34190,
+34192,34193,34194,34195,34196,34197,34198,34199,34200,
+34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,
+34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,
+34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,
+34252,34253,34254,34257,34258,34260,34262,34263,34264,34265,34266,34267,34269,
+34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,34284,
+34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,24661,
+21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,
+30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,
+24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,
+26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,
+37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,
+31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,
+25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,
+22905,22612,34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,
+34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,
+34325,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,
+34339,34340,34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,
+34354,34355,34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,
+34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,
+34387,34389,34390,34391,34392,34393,34395,34396,34397,
+34399,34400,34401,34403,34404,34405,34406,34407,34408,34409,34410,29549,25374,
+36427,36367,32974,33492,25260,21488,27888,37214,22826,24577,27760,22349,25674,
+36138,30251,28393,22363,27264,30192,28525,35885,35848,22374,27631,34962,30899,
+25506,21497,28845,27748,22616,25642,22530,26848,33179,21776,31958,20504,36538,
+28108,36255,28907,25487,28059,28372,32486,33796,26691,36867,28120,38518,35752,
+22871,29305,34276,33150,30140,35466,26799,21076,36386,38161,25552,39064,36420,
+21884,20307,26367,22159,24789,28053,21059,23625,22825,28155,22635,30000,29980,
+24684,33300,33094,25361,26465,36834,30522,36339,36148,38081,24086,21381,21548,
+28867,34413,34415,34416,34418,34419,34420,34421,34422,34423,34424,34435,34436,
+34437,34438,34439,34440,34441,34446,34447,34448,34449,34450,34452,34454,34455,
+34456,34457,34458,34459,34462,34463,34464,34465,34466,34469,34470,34475,34477,
+34478,34482,34483,34487,34488,34489,34491,34492,34493,34494,34495,34497,34498,
+34499,34501,34504,34508,34509,34514,34515,34517,34518,34519,34522,34524,34525,
+34528,34529,34530,34531,34533,34534,34535,34536,34538,34539,34540,34543,34549,
+34550,34551,34554,34555,34556,34557,34559,34561,34564,34565,34566,34571,34572,
+34574,34575,34576,34577,34580,34582,27712,24311,20572,20141,24237,25402,33351,
+36890,26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,
+20599,25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,
+21520,20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,
+25302,25176,33073,40501,38464,39534,39548,26925,22949,
+25299,21822,25366,21703,34521,27964,23043,29926,34972,27498,22806,35916,24367,
+28286,29609,39037,20024,28919,23436,30871,25405,26202,30358,24779,23451,23113,
+19975,33109,27754,29579,20129,26505,32593,24448,26106,26395,24536,22916,23041,
+34585,34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,
+34607,34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,
+34626,34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,
+34645,34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,
+34664,34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,34679,34680,
+34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,
+34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,
+34720,34721,34722,34723,34724,24013,24494,21361,38886,36829,26693,22260,21807,
+24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,32428,26410,34074,
+21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,21355,30239,28201,
+34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,29934,25373,34583,
+28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,20044,27745,35820,
+23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,21320,33310,20237,
+20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,26132,29081,26512,
+35199,30802,30717,26224,22075,21560,38177,29306,34725,34726,34727,34729,34730,
+34734,34736,34737,34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,
+34753,34754,34755,34756,34757,34759,34760,34761,34764,
+34765,34766,34767,34768,34772,34773,34774,34775,34776,34777,34778,34780,34781,
+34782,34783,34785,34786,34787,34788,34790,34791,34792,34793,34795,34796,34797,
+34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34810,34811,34812,
+34813,34815,34816,34817,34818,34820,34821,34822,34823,34824,34825,34827,34828,
+34829,34830,34831,34832,34833,34834,34836,34839,34840,34841,34842,34844,34845,
+34846,34847,34848,34851,31232,24687,24076,24713,33181,22805,24796,29060,28911,
+28330,27728,29312,27268,34989,24109,20064,23219,21916,38115,27927,31995,38553,
+25103,32454,30606,34430,21283,38686,36758,26247,23777,20384,29421,19979,21414,
+22799,21523,25472,38184,20808,20185,40092,32420,21688,36132,34900,33335,38386,
+28046,24358,23244,26174,38505,29616,29486,21439,33146,39301,32673,23466,38519,
+38480,32447,30456,21410,38262,39321,31665,35140,28248,20065,32724,31077,35814,
+24819,21709,20139,39033,24055,27233,20687,21521,35937,33831,30813,38660,21066,
+21742,22179,38144,28040,23477,28102,26195,34852,34853,34854,34855,34856,34857,
+34858,34859,34860,34861,34862,34863,34864,34865,34867,34868,34869,34870,34871,
+34872,34874,34875,34877,34878,34879,34881,34882,34883,34886,34887,34888,34889,
+34890,34891,34894,34895,34896,34897,34898,34899,34901,34902,34904,34906,34907,
+34908,34909,34910,34911,34912,34918,34919,34922,34925,34927,34929,34931,34932,
+34933,34934,34936,34937,34938,34939,34940,34944,34947,34950,34951,34953,34954,
+34956,34958,34959,34960,34961,34963,34964,34965,34967,34968,34969,34970,34971,
+34973,34974,34975,34976,34977,34979,34981,34982,34983,
+34984,34985,34986,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,
+34638,38795,21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,
+25032,27844,27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,
+20449,34885,26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,
+24184,26447,24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,
+32670,26429,21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,
+24464,35768,33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,
+36713,21927,23459,24748,26059,29572,34988,34990,34991,34992,34994,34995,34996,
+34997,34998,35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,
+35016,35018,35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,
+35036,35037,35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,
+35055,35058,35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,
+35077,35078,35079,35080,35081,35083,35084,35085,35086,35087,35089,35092,35093,
+35094,35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,
+35112,35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,36873,30307,
+30505,32474,38772,34203,23398,31348,38634,34880,21195,29071,24490,26092,35810,
+23547,39535,24033,27529,27739,35757,35759,36874,36805,21387,25276,40486,40493,
+21568,20011,33469,29273,34460,23830,34905,28079,38597,21713,20122,35766,28937,
+21693,38409,28895,28153,30416,20005,30740,34578,23721,24310,35328,39068,38414,
+28814,27839,22852,25513,30524,34893,28436,33395,22576,
+29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,22830,40495,
+31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,20859,26679,
+28478,36992,33136,22934,29814,35128,35129,35130,35131,35132,35133,35134,35135,
+35136,35138,35139,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,
+35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,
+35164,35165,35168,35169,35170,35171,35172,35173,35175,35176,35177,35178,35179,
+35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,
+35193,35194,35196,35197,35198,35200,35202,35204,35205,35207,35208,35209,35210,
+35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,
+35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,25671,23591,36965,
+31377,35875,23002,21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,
+20918,20063,39029,25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,
+25558,38129,20381,20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,
+23452,23016,24413,26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,
+37009,23673,20159,24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,
+20041,30410,28322,35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,
+22240,27575,38899,38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,
+35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,
+35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,
+35260,35261,35262,35263,35264,35267,35277,35283,35284,
+35285,35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,
+35305,35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,
+35321,35322,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,
+35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,
+35349,35350,35351,35352,35353,35354,35355,35356,35357,21360,33521,27185,23156,
+40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,39062,
+30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,27891,
+28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,38080,
+29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,36802,
+28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,28189,
+28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,22495,
+33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,35358,
+35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,
+35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,
+35385,35386,35387,35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,
+35399,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,
+35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,
+35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,
+35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,
+35453,35454,35455,35456,28020,23507,35029,39044,35947,
+39533,40499,28170,20900,20803,22435,34945,21407,25588,36757,22253,21592,22278,
+29503,28304,32536,36828,33489,24895,24616,38498,26352,32422,36234,36291,38053,
+23731,31908,26376,24742,38405,32792,20113,37095,21248,38504,20801,36816,34164,
+37213,26197,38901,23381,21277,30776,26434,26685,21705,28798,23472,36733,20877,
+22312,21681,25874,26242,36190,36163,33039,33900,36973,31967,20991,34299,26531,
+26089,28577,34468,36481,22122,36896,30338,28790,29157,36131,25321,21017,27901,
+36156,24590,22686,24974,26366,36192,25166,21939,28195,26413,36711,35457,35458,
+35459,35460,35461,35462,35463,35464,35467,35468,35469,35470,35471,35472,35473,
+35474,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,
+35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,
+35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,
+35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,
+35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,
+35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,
+35553,35554,35555,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,
+25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,
+23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,
+24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,
+25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,
+32773,38167,34071,36825,27993,29645,26015,30495,29956,
+30759,33275,36126,38024,20390,26517,30137,35786,38663,25391,38215,38453,33976,
+25379,30529,24449,29424,20105,24596,25972,25327,27491,25919,35556,35557,35558,
+35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,
+35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,
+35585,35586,35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,
+35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,
+35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35623,35624,35625,
+35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,
+35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,
+35652,35653,24103,30151,37073,35777,33437,26525,25903,21553,34584,30693,32930,
+33026,27713,20043,32455,32844,30452,26893,27542,25191,20540,20356,22336,25351,
+27490,36286,21482,26088,32440,24535,25370,25527,33267,33268,32622,24092,23769,
+21046,26234,31209,31258,36136,28825,30164,28382,27835,31378,20013,30405,24544,
+38047,34935,32456,31181,32959,37325,20210,20247,33311,21608,24030,27954,35788,
+31909,36724,32920,24090,21650,30385,23449,26172,39588,29664,26666,34523,26417,
+29482,35832,35803,36880,31481,28891,29038,25284,30633,22065,20027,33879,26609,
+21161,34496,36142,38136,31569,35654,35655,35656,35657,35658,35659,35660,35661,
+35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,
+35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35687,35688,
+35689,35690,35691,35693,35694,35695,35696,35697,35698,
+35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,
+35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,
+35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,
+35738,35739,35740,35741,35742,35743,35756,35761,35771,35783,35792,35818,35849,
+35870,20303,27880,31069,39547,25235,29226,25341,19987,30742,36716,25776,36186,
+31686,26729,24196,35013,22918,25758,22766,29366,26894,38181,36861,36184,22368,
+32512,35846,20934,25417,25305,21331,26700,29730,33537,37196,21828,30528,28796,
+27978,20857,21672,36164,23039,28363,28100,23388,32043,20180,31869,28371,23376,
+33258,28173,23383,39683,26837,36394,23447,32508,24635,32437,37049,36208,22863,
+25549,31199,36275,21330,26063,31062,35781,38459,32452,38075,32386,22068,37257,
+26368,32618,23562,36981,26152,24038,20304,26590,20570,20316,22352,24231,59408,
+59409,59410,59411,59412,35896,35897,35898,35899,35900,35901,35902,35903,35904,
+35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,35920,35921,35922,
+35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,35935,35936,35939,
+35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,35952,35953,35954,
+35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,35969,35971,35972,
+35974,35975,35976,35979,35981,35982,35983,35984,35985,35986,35987,35989,35990,
+35991,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,
+36005,36006,36007,36008,36009,36010,36011,36012,36013,20109,19980,20800,19984,
+24319,21317,19989,20120,19998,39730,23404,22121,20008,
+31162,20031,21269,20039,22829,29243,21358,27664,22239,32996,39319,27603,30590,
+40727,20022,20127,40720,20060,20073,20115,33416,23387,21868,22031,20164,21389,
+21405,21411,21413,21422,38757,36189,21274,21493,21286,21294,21310,36188,21350,
+21347,20994,21000,21006,21037,21043,21055,21056,21068,21086,21089,21084,33967,
+21117,21122,21121,21136,21139,20866,32596,20155,20163,20169,20162,20200,20193,
+20203,20190,20251,20211,20258,20324,20213,20261,20263,20233,20267,20318,20327,
+25912,20314,20317,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,
+36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,
+36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,
+36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,
+36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,
+36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,
+36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,
+36102,36103,36104,36105,36106,36107,36108,36109,20319,20311,20274,20285,20342,
+20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,20454,20456,
+20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,20524,20495,
+20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,20558,20588,
+20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,20743,20747,
+20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,39320,20865,
+22804,21241,21261,35335,21264,20971,22809,20821,20128,
+20822,20147,34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,
+20925,20924,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,
+36121,36122,36123,36124,36128,36177,36178,36183,36191,36197,36200,36201,36202,
+36204,36206,36207,36209,36210,36216,36217,36218,36219,36220,36221,36222,36223,
+36224,36226,36227,36230,36231,36232,36233,36236,36237,36238,36239,36240,36242,
+36243,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36256,36257,
+36258,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,
+36272,36274,36278,36279,36281,36283,36285,36288,36289,36290,36293,36295,36296,
+36297,36298,36301,36304,36306,36307,36308,20935,20886,20898,20901,35744,35750,
+35751,35754,35764,35765,35767,35778,35779,35787,35791,35790,35794,35795,35796,
+35798,35800,35801,35804,35807,35808,35812,35816,35817,35822,35824,35827,35830,
+35833,35836,35839,35840,35842,35844,35847,35852,35855,35857,35858,35860,35861,
+35862,35865,35867,35864,35869,35871,35872,35873,35877,35879,35882,35883,35886,
+35887,35890,35891,35893,35894,21353,21370,38429,38434,38433,38449,38442,38461,
+38460,38466,38473,38484,38495,38503,38508,38514,38516,38536,38541,38551,38576,
+37015,37019,37021,37017,37036,37025,37044,37043,37046,37050,36309,36312,36313,
+36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,36337,36338,
+36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,36359,36360,
+36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,36377,36378,
+36379,36380,36384,36385,36388,36389,36390,36391,36392,
+36395,36397,36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,36415,
+36419,36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,
+36440,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,
+36455,36456,36458,36459,36462,36465,37048,37040,37071,37061,37054,37072,37060,
+37063,37075,37094,37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,
+37155,37169,37167,37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,
+21200,21206,21232,21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,
+24047,22348,22441,22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,
+22318,22319,22364,22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,
+22390,22387,22445,22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,
+22490,22489,22482,22456,22516,22511,22520,22500,22493,36467,36469,36471,36472,
+36473,36474,36475,36477,36478,36480,36482,36483,36484,36486,36488,36489,36490,
+36491,36492,36493,36494,36497,36498,36499,36501,36502,36503,36504,36505,36506,
+36507,36509,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,
+36522,36525,36526,36528,36529,36531,36532,36533,36534,36535,36536,36537,36539,
+36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,
+36553,36554,36555,36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,
+36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,
+36580,22539,22541,22525,22509,22528,22558,22553,22596,22560,22629,22636,22657,
+22665,22682,22656,39336,40729,25087,33401,33405,33407,
+33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,33480,
+33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,33439,
+33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,33496,
+33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,33627,
+33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,33631,
+33600,33559,33632,33581,33594,33587,33638,33637,36581,36582,36583,36584,36585,
+36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,
+36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,
+36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,
+36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,
+36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,
+36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,
+36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,
+33640,33563,33641,33644,33642,33645,33646,33712,33656,33715,33716,33696,33706,
+33683,33692,33669,33660,33718,33705,33661,33720,33659,33688,33694,33704,33722,
+33724,33729,33793,33765,33752,22535,33816,33803,33757,33789,33750,33820,33848,
+33809,33798,33748,33759,33807,33795,33784,33785,33770,33733,33728,33830,33776,
+33761,33884,33873,33882,33881,33907,33927,33928,33914,33929,33912,33852,33862,
+33897,33910,33932,33934,33841,33901,33985,33997,34000,34022,33981,34003,33994,
+33983,33978,34016,33953,33977,33972,33943,34021,34019,
+34060,29965,34104,34032,34105,34079,34106,36677,36678,36679,36680,36681,36682,
+36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,
+36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,
+36709,36714,36736,36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,
+36778,36780,36781,36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,
+36796,36799,36800,36803,36806,36809,36810,36811,36812,36813,36815,36818,36822,
+36823,36826,36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,
+36858,36859,36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,34134,
+34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,
+34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,
+34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,
+22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,
+25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,
+25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,
+25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,
+25709,25750,36889,36892,36899,36900,36901,36903,36904,36905,36906,36907,36908,
+36912,36913,36914,36915,36916,36919,36921,36922,36925,36927,36928,36931,36933,
+36934,36936,36937,36938,36939,36940,36942,36948,36949,36950,36953,36954,36956,
+36957,36958,36959,36960,36961,36964,36966,36967,36969,36970,36971,36972,36975,
+36976,36977,36978,36979,36982,36983,36984,36985,36986,
+36987,36988,36990,36993,36996,36997,36998,36999,37001,37002,37004,37005,37006,
+37007,37008,37010,37012,37014,37016,37018,37020,37022,37023,37024,37028,37029,
+37031,37032,37033,37035,37037,37042,37047,37052,37053,37055,37056,25722,25783,
+25784,25753,25786,25792,25808,25815,25828,25826,25865,25893,25902,24331,24530,
+29977,24337,21343,21489,21501,21481,21480,21499,21522,21526,21510,21579,21586,
+21587,21588,21590,21571,21537,21591,21593,21539,21554,21634,21652,21623,21617,
+21604,21658,21659,21636,21622,21606,21661,21712,21677,21698,21684,21714,21671,
+21670,21715,21716,21618,21667,21717,21691,21695,21708,21721,21722,21724,21673,
+21674,21668,21725,21711,21726,21787,21735,21792,21757,21780,21747,21794,21795,
+21775,21777,21799,21802,21863,21903,21941,21833,21869,21825,21845,21823,21840,
+21820,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,37077,37078,
+37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,37100,37102,
+37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,37119,37120,
+37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,
+37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,37148,37149,
+37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,
+37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,37179,37180,37181,
+37182,37183,37184,37185,37186,37188,21815,21846,21877,21878,21879,21811,21808,
+21852,21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,
+21983,21949,21950,21908,21913,21994,22007,21961,22047,
+21969,21995,21996,21972,21990,21981,21956,21999,21989,22002,22003,21964,21965,
+21992,22005,21988,36756,22046,22024,22028,22017,22052,22051,22014,22016,22055,
+22061,22104,22073,22103,22060,22093,22114,22105,22108,22092,22100,22150,22116,
+22129,22123,22139,22140,22149,22163,22191,22228,22231,22237,22241,22261,22251,
+22265,22271,22276,22282,22281,22300,24079,24089,24084,24081,24113,24123,24124,
+37189,37191,37192,37201,37203,37204,37205,37206,37208,37209,37211,37212,37215,
+37216,37222,37223,37224,37227,37229,37235,37242,37243,37244,37248,37249,37250,
+37251,37252,37254,37256,37258,37262,37263,37267,37268,37269,37270,37271,37272,
+37273,37276,37277,37278,37279,37280,37281,37284,37285,37286,37287,37288,37289,
+37291,37292,37296,37297,37298,37299,37302,37303,37304,37305,37307,37308,37309,
+37310,37311,37312,37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,
+37331,37332,37333,37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,
+37345,37346,37347,37348,37349,24119,24132,24148,24155,24158,24161,23692,23674,
+23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,23714,23741,23724,
+23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,23810,23811,23847,
+23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,23916,23899,23919,
+23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,23991,24005,24435,
+24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,24501,24508,34914,
+24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,29394,29416,29423,
+29417,29426,29428,29431,29441,29427,29443,29434,37350,
+37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,
+37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,
+37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,
+37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,
+37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,
+37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,
+37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,
+37442,37443,37444,37445,29435,29463,29459,29473,29450,29470,29469,29461,29474,
+29497,29477,29484,29496,29489,29520,29517,29527,29536,29548,29551,29566,33307,
+22821,39143,22820,22786,39267,39271,39272,39273,39274,39275,39276,39284,39287,
+39293,39296,39300,39303,39306,39309,39312,39313,39315,39316,39317,24192,24209,
+24203,24214,24229,24224,24249,24245,24254,24243,36179,24274,24273,24283,24296,
+24298,33210,24516,24521,24534,24527,24579,24558,24580,24545,24548,24574,24581,
+24582,24554,24557,24568,24601,24629,24614,24603,24591,24589,24617,24619,24586,
+24639,24609,24696,24697,24699,24698,24642,37446,37447,37448,37449,37450,37451,
+37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,
+37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,
+37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,
+37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,
+37505,37506,37507,37508,37509,37510,37511,37512,37513,
+37514,37515,37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,
+37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,
+37541,37542,37543,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,
+24812,24763,24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,
+24832,24846,24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,
+38377,38379,38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,
+38411,38412,38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,
+27701,27732,27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,
+27782,27817,27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,
+27883,27886,27825,27859,27887,27902,37544,37545,37546,37547,37548,37549,37551,
+37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,
+37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37577,37578,
+37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,
+37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,
+37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,
+37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,
+37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,27961,27943,
+27916,27971,27976,27911,27908,27929,27918,27947,27981,27950,27957,27930,27983,
+27986,27988,27955,28049,28015,28062,28064,27998,28051,28052,27996,28000,28028,
+28003,28186,28103,28101,28126,28174,28095,28128,28177,
+28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,28338,28255,
+28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,28386,28325,
+28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,28486,28487,
+28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,28557,28556,
+28536,28530,28540,28538,28625,37642,37643,37644,37645,37646,37647,37648,37649,
+37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,
+37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,
+37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,
+37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,37701,37702,
+37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,
+37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,
+37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,28617,28583,28601,
+28598,28610,28641,28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,
+28766,23424,23428,23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,
+23536,36423,35591,36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,
+36869,36868,36875,36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,
+36945,36946,36944,36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,
+37003,24400,24407,24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,
+24362,24361,24365,33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,
+37740,37741,37742,37743,37744,37745,37746,37747,37748,
+37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,
+37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,
+37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,
+37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,
+37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,
+37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,
+37828,37829,37830,37831,37832,37833,37835,37836,37837,22935,22986,22955,22942,
+22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,23033,
+23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,23138,
+23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,23264,
+23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,23573,
+23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,39549,
+39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,39581,
+39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,37838,
+37839,37840,37841,37842,37843,37844,37845,37847,37848,37849,37850,37851,37852,
+37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,
+37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,
+37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,
+37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,
+37905,37906,37907,37908,37909,37910,37911,37912,37913,
+37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,
+37927,37928,37929,37930,37931,37932,37933,37934,32429,32432,32446,32448,32449,
+32450,32457,32459,32460,32464,32468,32471,32475,32480,32481,32488,32491,32494,
+32495,32497,32498,32525,32502,32506,32507,32510,32513,32514,32515,32519,32520,
+32523,32524,32527,32529,32530,32535,32537,32540,32539,32543,32545,32546,32547,
+32548,32549,32550,32551,32554,32555,32556,32557,32559,32560,32561,32562,32563,
+32565,24186,30079,24027,30014,37013,29582,29585,29614,29602,29599,29647,29634,
+29649,29623,29619,29632,29641,29640,29669,29657,39036,29706,29673,29671,29662,
+29626,29682,29711,29738,29787,29734,29733,29736,29744,29742,29740,37935,37936,
+37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,
+37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,
+37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,
+37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,
+37990,37991,37992,37993,37994,37996,37997,37998,37999,38000,38001,38002,38003,
+38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,
+38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,38106,38118,
+38139,38172,38176,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,
+29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,
+38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,
+26535,26485,26536,26526,26541,26507,26487,26492,26608,
+26633,26584,26634,26601,26544,26636,26585,26549,26586,26547,26589,26624,26563,
+26552,26594,26638,26561,26621,26674,26675,26720,26721,26702,26722,26692,26724,
+26755,26653,26709,26726,26689,26727,26688,26686,26698,26697,26665,26805,26767,
+26740,26743,26771,26731,26818,26990,26876,26911,26912,26873,38183,38195,38205,
+38211,38216,38219,38229,38234,38240,38254,38260,38261,38263,38264,38265,38266,
+38267,38268,38269,38270,38272,38273,38274,38275,38276,38277,38278,38279,38280,
+38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,
+38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,
+38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,
+38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,
+38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,
+38346,38347,26916,26864,26891,26881,26967,26851,26896,26993,26937,26976,26946,
+26973,27012,26987,27008,27032,27000,26932,27084,27015,27016,27086,27017,26982,
+26979,27001,27035,27047,27067,27051,27053,27092,27057,27073,27082,27103,27029,
+27104,27021,27135,27183,27117,27159,27160,27237,27122,27204,27198,27296,27216,
+27227,27189,27278,27257,27197,27176,27224,27260,27281,27280,27305,27287,27307,
+29495,29522,27521,27522,27527,27524,27538,27539,27533,27546,27547,27553,27562,
+36715,36717,36721,36722,36723,36725,36726,36728,36727,36729,36730,36732,36734,
+36737,36738,36740,36743,36747,38348,38349,38350,38351,38352,38353,38354,38355,
+38356,38357,38358,38359,38360,38361,38362,38363,38364,
+38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38380,38399,
+38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,38440,38441,
+38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,38467,38474,
+38478,38479,38481,38482,38483,38486,38487,38488,38489,38490,38492,38493,38494,
+38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,38515,38520,38521,
+38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38535,38537,
+38538,36749,36750,36751,36760,36762,36558,25099,25111,25115,25119,25122,25121,
+25125,25124,25132,33255,29935,29940,29951,29967,29969,29971,25908,26094,26095,
+26096,26122,26137,26482,26115,26133,26112,28805,26359,26141,26164,26161,26166,
+26165,32774,26207,26196,26177,26191,26198,26209,26199,26231,26244,26252,26279,
+26269,26302,26331,26332,26342,26345,36146,36147,36150,36155,36157,36160,36165,
+36166,36168,36169,36167,36173,36181,36185,35271,35274,35275,35276,35278,35279,
+35280,35281,29294,29343,29277,29286,29295,29310,29311,29316,29323,29325,29327,
+29330,25352,25394,25520,38540,38542,38545,38546,38547,38549,38550,38554,38555,
+38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,
+38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,
+38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,
+38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,
+38631,38635,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,38651,
+38652,38653,38655,38658,38659,38661,38666,38667,38668,
+38672,38673,38674,38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,
+25663,25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,
+27672,27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,
+29270,29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,
+32948,32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,
+32989,33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,
+33054,33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,
+33148,33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,
+26406,33226,33211,38689,38690,38691,38692,38693,38694,38695,38696,38697,38699,
+38700,38702,38703,38705,38707,38708,38709,38710,38711,38714,38715,38716,38717,
+38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,
+38732,38733,38734,38735,38736,38737,38740,38741,38743,38744,38746,38748,38749,
+38751,38755,38756,38758,38759,38760,38762,38763,38764,38765,38766,38767,38768,
+38769,38770,38773,38775,38776,38777,38778,38779,38781,38782,38783,38784,38785,
+38786,38787,38788,38790,38791,38792,38793,38794,38796,38798,38799,38800,38803,
+38805,38806,38807,38809,38810,38811,38812,38813,33217,33190,27428,27447,27449,
+27459,27462,27481,39121,39122,39123,39125,39129,39130,27571,24384,27586,35315,
+26000,40785,26003,26044,26054,26052,26051,26060,26062,26066,26070,28800,28828,
+28822,28829,28859,28864,28855,28843,28849,28904,28874,28944,28947,28950,28975,
+28977,29043,29020,29032,28997,29042,29002,29048,29050,
+29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,29224,28780,28952,
+29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,31049,31067,31068,
+31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,31130,31143,31155,
+24529,24528,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,38826,
+38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,38844,
+38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,
+38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,
+38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,
+38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,38905,38906,
+38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,
+38920,38921,38922,38923,38924,38925,38926,24636,24669,24666,24679,24641,24665,
+24675,24747,24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,
+27894,28156,30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,
+30777,30778,30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,
+30758,30800,30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,
+30905,30885,30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,
+40859,40697,40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,
+30509,30502,30517,30520,30544,30545,30535,30531,30554,30568,38927,38928,38929,
+38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,
+38943,38944,38945,38946,38947,38948,38949,38950,38951,
+38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,
+38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,
+38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,
+38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,
+39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,
+39017,39018,39019,39020,39021,39022,30562,30565,30591,30605,30589,30592,30604,
+30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,30043,30066,
+30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,32638,30413,
+30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,38036,38039,
+38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,38064,38066,
+38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,38089,38090,
+38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,38104,38107,
+38110,38111,38112,38114,38116,38117,38119,38120,38122,39023,39024,39025,39026,
+39027,39028,39051,39054,39058,39061,39065,39075,39080,39081,39082,39083,39084,
+39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,
+39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,
+39111,39112,39113,39114,39115,39116,39117,39119,39120,39124,39126,39127,39131,
+39132,39133,39136,39137,39138,39139,39140,39141,39142,39145,39146,39147,39148,
+39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,
+39162,39163,39164,39165,39166,39167,39168,39169,39170,
+39171,39172,39173,39174,39175,38121,38123,38126,38127,38131,38132,38133,38135,
+38137,38140,38141,38143,38147,38146,38150,38151,38153,38154,38157,38158,38159,
+38162,38163,38164,38165,38166,38168,38171,38173,38174,38175,38178,38186,38187,
+38185,38188,38193,38194,38196,38198,38199,38200,38204,38206,38207,38210,38197,
+38212,38213,38214,38217,38220,38222,38223,38226,38227,38228,38230,38231,38232,
+38233,38235,38238,38239,38237,38241,38242,38244,38245,38246,38247,38248,38249,
+38250,38251,38252,38255,38257,38258,38259,38202,30695,30700,38601,31189,31213,
+31203,31211,31238,23879,31235,31234,31262,31252,39176,39177,39178,39179,39180,
+39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,
+39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,
+39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,
+39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,
+39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,
+39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,
+39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,39305,
+31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,29920,
+29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,40503,
+40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,40526,
+40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,40554,
+40555,40556,40561,40557,40563,30098,30100,30102,30112,
+30109,30124,30115,30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,
+30179,30184,30182,30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,
+30220,30231,30218,30245,30232,30229,30233,39308,39310,39322,39323,39324,39325,
+39326,39327,39328,39329,39330,39331,39332,39334,39335,39337,39338,39339,39340,
+39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,
+39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,
+39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,
+39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,
+39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,
+39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,30235,
+30268,30242,30240,30272,30253,30256,30271,30261,30275,30270,30259,30285,30302,
+30292,30300,30294,30315,30319,32714,31462,31352,31353,31360,31366,31368,31381,
+31398,31392,31404,31400,31405,31411,34916,34921,34930,34941,34943,34946,34978,
+35014,34999,35004,35017,35042,35022,35043,35045,35057,35098,35068,35048,35070,
+35056,35105,35097,35091,35099,35082,35124,35115,35126,35137,35174,35195,30091,
+32997,30386,30388,30684,32786,32788,32790,32796,32800,32802,32805,32806,32807,
+32809,32808,32817,32779,32821,32835,32838,32845,32850,32873,32881,35203,39032,
+39040,39043,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,
+39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,
+39442,39443,39444,39445,39446,39447,39448,39449,39450,
+39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,
+39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,
+39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,
+39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,
+39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39049,39052,
+39053,39055,39060,39066,39067,39070,39071,39073,39074,39077,39078,34381,34388,
+34412,34414,34431,34426,34428,34427,34472,34445,34443,34476,34461,34471,34467,
+34474,34451,34473,34486,34500,34485,34510,34480,34490,34481,34479,34505,34511,
+34484,34537,34545,34546,34541,34547,34512,34579,34526,34548,34527,34520,34513,
+34563,34567,34552,34568,34570,34573,34569,34595,34619,34590,34597,34606,34586,
+34622,34632,34612,34609,34601,34615,34623,34690,34594,34685,34686,34683,34656,
+34672,34636,34670,34699,34643,34659,34684,34660,34649,34661,34707,34735,34728,
+34770,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,
+39526,39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,
+39577,39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,
+39609,39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,
+39630,39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,39645,
+39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,
+39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,
+39680,39681,39682,39684,39685,39686,34758,34696,34693,
+34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,
+34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,
+32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,
+31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,
+31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,
+31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,
+31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,
+39687,39689,39690,39691,39692,39693,39694,39696,39697,39698,39700,39701,39702,
+39703,39704,39705,39706,39707,39708,39709,39710,39712,39713,39714,39716,39717,
+39718,39719,39720,39721,39722,39723,39724,39725,39726,39728,39729,39731,39732,
+39733,39734,39735,39736,39737,39738,39741,39742,39743,39744,39750,39754,39755,
+39756,39758,39760,39762,39763,39765,39766,39767,39768,39769,39770,39771,39772,
+39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,
+39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,
+39799,39800,39801,39802,39803,31775,31786,31782,31800,31809,31808,33278,33281,
+33282,33284,33260,34884,33313,33314,33315,33325,33327,33320,33323,33336,33339,
+33331,33332,33342,33348,33353,33355,33359,33370,33375,33384,34942,34949,34952,
+35032,35039,35166,32669,32671,32679,32687,32688,32690,31868,25929,31889,31901,
+31900,31902,31906,31922,31932,31933,31937,31943,31948,31949,31944,31941,31959,
+31976,33390,26280,32703,32718,32725,32741,32737,32742,
+32745,32750,32755,31992,32119,32166,32174,32327,32411,40632,40628,36211,36228,
+36244,36241,36273,36199,36205,35911,35913,37194,37200,37198,37199,37220,39804,
+39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,
+39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,
+39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,
+39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,
+39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,
+39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,
+39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,
+39896,39897,39898,39899,37218,37217,37232,37225,37231,37245,37246,37234,37236,
+37241,37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,
+37300,37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,
+36292,36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,
+36345,36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,
+36416,36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,
+36476,36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,
+35992,35988,26011,35286,35294,35290,35292,39900,39901,39902,39903,39904,39905,
+39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,
+39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,
+39932,39933,39934,39935,39936,39937,39938,39939,39940,
+39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,
+39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,
+39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,
+39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,
+39993,39994,39995,35301,35307,35311,35390,35622,38739,38633,38643,38639,38662,
+38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,40837,40838,40839,
+40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,38606,38610,30655,
+38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,40063,40066,40069,
+40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,40085,40090,40091,
+40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,40105,40107,40109,
+40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,40123,40124,40125,
+40132,40133,40134,40135,40138,40139,39996,39997,39998,39999,40000,40001,40002,
+40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,
+40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,
+40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,
+40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,
+40055,40056,40057,40058,40059,40061,40062,40064,40067,40068,40073,40074,40076,
+40079,40083,40086,40087,40088,40089,40093,40106,40108,40111,40121,40126,40127,
+40128,40129,40130,40136,40137,40145,40146,40154,40155,40160,40161,40140,40141,
+40142,40143,40144,40147,40148,40149,40151,40152,40153,
+40156,40157,40159,40162,38780,38789,38801,38802,38804,38831,38827,38819,38834,
+38836,39601,39600,39607,40536,39606,39610,39612,39617,39616,39621,39618,39627,
+39628,39633,39749,39747,39751,39753,39752,39757,39761,39144,39181,39214,39253,
+39252,39647,39649,39654,39663,39659,39675,39661,39673,39688,39695,39699,39711,
+39715,40637,40638,32315,40578,40583,40584,40587,40594,37846,40605,40607,40667,
+40668,40669,40672,40671,40674,40681,40679,40677,40682,40687,40738,40748,40751,
+40761,40759,40765,40766,40772,40163,40164,40165,40166,40167,40168,40169,40170,
+40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,
+40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,
+40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,
+40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,
+40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,
+40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,
+40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,57908,57909,57910,
+57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,57921,57922,57923,
+57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,57935,57936,
+57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,57948,57949,
+57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,57961,57962,
+57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,57974,57975,
+57976,57977,57978,57979,57980,57981,57982,57983,57984,
+57985,57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,
+57998,57999,58000,58001,40259,40260,40261,40262,40263,40264,40265,40266,40267,
+40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,
+40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,
+40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,
+40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,
+40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,
+40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,
+40346,40347,40348,40349,40350,40351,40352,40353,40354,58002,58003,58004,58005,
+58006,58007,58008,58009,58010,58011,58012,58013,58014,58015,58016,58017,58018,
+58019,58020,58021,58022,58023,58024,58025,58026,58027,58028,58029,58030,58031,
+58032,58033,58034,58035,58036,58037,58038,58039,58040,58041,58042,58043,58044,
+58045,58046,58047,58048,58049,58050,58051,58052,58053,58054,58055,58056,58057,
+58058,58059,58060,58061,58062,58063,58064,58065,58066,58067,58068,58069,58070,
+58071,58072,58073,58074,58075,58076,58077,58078,58079,58080,58081,58082,58083,
+58084,58085,58086,58087,58088,58089,58090,58091,58092,58093,58094,58095,40355,
+40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,
+40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,
+40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,
+40395,40396,40397,40398,40399,40400,40401,40402,40403,
+40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,
+40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,
+40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,
+40443,40444,40445,40446,40447,40448,40449,40450,58096,58097,58098,58099,58100,
+58101,58102,58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,
+58114,58115,58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,
+58127,58128,58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,
+58140,58141,58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,
+58153,58154,58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,
+58166,58167,58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,
+58179,58180,58181,58182,58183,58184,58185,58186,58187,58188,58189,40451,40452,
+40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,
+40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,
+40484,40487,40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,
+40534,40537,40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,
+40566,40567,40568,40569,40570,40571,40572,40573,40576,40577,40579,40580,40581,
+40582,40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,
+40600,40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,
+40616,40617,40618,58190,58191,58192,58193,58194,58195,58196,58197,58198,58199,
+58200,58201,58202,58203,58204,58205,58206,58207,58208,
+58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,
+58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,
+58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,58246,58247,
+58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,
+58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58273,
+58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,40619,40620,40621,
+40622,40623,40624,40625,40626,40627,40629,40630,40631,40633,40634,40636,40639,
+40640,40641,40642,40643,40645,40646,40647,40648,40650,40651,40652,40656,40658,
+40659,40661,40662,40663,40665,40666,40670,40673,40675,40676,40678,40680,40683,
+40684,40685,40686,40688,40689,40690,40691,40692,40693,40694,40695,40696,40698,
+40701,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,
+40716,40719,40721,40722,40724,40725,40726,40728,40730,40731,40732,40733,40734,
+40735,40737,40739,40740,40741,40742,40743,40744,40745,40746,40747,40749,40750,
+40752,40753,58284,58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,
+58295,58296,58297,58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,
+58308,58309,58310,58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,
+58321,58322,58323,58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,
+58334,58335,58336,58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,
+58347,58348,58349,58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,
+58360,58361,58362,58363,58364,58365,58366,58367,58368,
+58369,58370,58371,58372,58373,58374,58375,58376,58377,40754,40755,40756,40757,
+40758,40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,
+40777,40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,
+40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,
+40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,
+40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,
+40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,
+40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,
+63985,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,58389,
+58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,58402,
+58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,58415,
+58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,58428,
+58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,58441,
+58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,58454,
+58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,58467,
+58468,58469,58470,58471,64012,64013,64014,64015,64017,64019,64020,64024,64031,
+64032,64033,64035,64036,64039,64040,64041,11905,59414,59415,59416,11908,13427,
+13383,11912,11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,
+14815,14963,14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,
+16735,11950,17207,11955,11958,11959,59451,17329,17324,
+11963,17373,17622,18017,17996,59459,18211,18217,18300,18317,11978,18759,18810,
+18813,18818,18819,18821,18822,18847,18843,18871,18870,59476,59477,19619,19615,
+19616,19617,19575,19618,19731,19732,19733,19734,19735,19736,19737,19886,59492,
+58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,
+58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58495,58496,58497,
+58498,58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,
+58511,58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,
+58524,58525,58526,58527,58528,58529,58530,58531,58532,58533,58534,58535,58536,
+58537,58538,58539,58540,58541,58542,58543,58544,58545,58546,58547,58548,58549,
+58550,58551,58552,58553,58554,58555,58556,58557,58558,58559,58560,58561,58562,
+58563,58564,58565,
diff --git a/libc-top-half/musl/src/locale/hkscs.h b/libc-top-half/musl/src/locale/hkscs.h
new file mode 100644
index 0000000..d356517
--- /dev/null
+++ b/libc-top-half/musl/src/locale/hkscs.h
@@ -0,0 +1,390 @@
+17392,19506,17923,17830,17784,29287,19831,17843,31921,19682,31941,15253,18230,
+18244,19527,19520,17087,13847,29522,28299,28882,19543,41809,18255,17882,19589,
+31852,19719,19108,18081,27427,29221,23124,6755,15878,16225,26189,22267,0,
+32149,22813,35769,15860,38708,31727,23515,7518,23204,13861,40624,23249,23479,
+23804,26478,34195,39237,29793,29853,14453,7507,13982,24609,16108,22750,15093,
+31484,40855,16737,35085,12778,2698,12894,17162,33924,40854,37935,18736,34323,
+22678,38730,37400,31184,31282,26208,27177,34973,29772,31685,26498,31276,21071,
+36934,13542,29636,23993,29894,40903,22451,18735,21580,16689,13966,22552,31346,
+31589,35727,18094,28296,16769,23961,31662,9404,40904,9409,9417,9420,40905,
+34052,13755,16564,40906,17633,44543,25281,28782,40907,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12736,12737,12738,12739,12740,268,12741,
+209,205,12742,12743,203,8168,12744,202,12745,12746,12747,12748,270,12749,
+12750,256,193,461,192,274,201,282,200,332,211,465,210,56320,7870,56324,7872,
+202,257,225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,
+250,468,249,470,472,474,476,252,56328,7871,56332,7873,234,609,9178,9179,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41897,4421,0,25866,0,0,20029,28381,
+40270,37343,0,0,30517,25745,20250,20264,20392,20822,20852,20892,20964,21153,
+21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,
+23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,
+32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,
+36711,36718,29713,31996,32205,26950,31433,21031,0,0,0,0,37260,30904,37214,
+32956,0,36107,33014,2535,0,0,32927,40647,19661,40393,40460,19518,40438,28686,
+40458,41267,13761,0,28314,33342,29977,0,18705,39532,39567,40857,31111,33900,
+7626,1488,10982,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,
+20483,20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,
+21287,13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,
+21684,21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,
+32132,21797,0,3138,3349,20779,21904,11462,14828,833,36422,19896,38117,16467,
+32958,30586,11320,14900,18389,33117,27122,19946,25821,3452,4020,3285,4340,
+25741,36478,3734,3083,3940,11433,33366,17619,0,3398,39501,33001,18420,
+20135,11458,39602,14951,38388,16365,13574,21191,38868,30920,11588,40302,38933,
+0,17369,24741,25780,21731,11596,11210,4215,14843,4207,26330,26390,31136,25834,
+20562,3139,36456,8609,35660,1841,0,18443,425,16378,22643,11661,0,17864,1276,
+24727,3916,3478,21881,16571,17338,0,19124,10854,4253,33194,39157,3484,25465,
+14846,10101,36288,22177,25724,15939,0,42497,3593,10959,11465,0,4296,14786,
+14738,14854,33435,13688,24137,8391,22098,3889,11442,38688,13500,27709,20027,0,
+0,30068,11915,8712,42587,36045,3706,3124,26652,32659,4303,10243,10553,13819,
+20963,3724,3981,3754,16275,3888,3399,4431,3660,0,3755,2985,3400,4288,4413,
+16377,9878,25650,4013,13300,30265,11214,3454,3455,11345,11349,14872,3736,4295,
+3886,42546,27472,36050,36249,36042,38314,21708,33476,21945,0,40643,39974,
+39606,30558,11758,28992,33133,33004,23580,25970,33076,14231,21343,32957,37302,
+3834,3599,3703,3835,13789,19947,13833,3286,22191,10165,4297,3600,3704,4216,
+4424,33287,5205,3705,20048,11684,23124,4125,4126,4341,4342,22428,3601,30356,
+33485,4021,3707,20862,14083,4022,4480,21208,41661,18906,6202,16759,33404,
+22681,21096,13850,22333,31666,23400,18432,19244,40743,18919,39967,39821,23412,
+12605,22011,13810,22153,20008,22786,7105,63608,38737,134,20059,20155,13630,
+23587,24401,24516,14586,25164,25909,27514,27701,27706,28780,29227,20012,29357,
+18665,32594,31035,31993,32595,25194,13505,0,25419,32770,32896,26130,26961,
+21341,34916,35265,30898,35744,36125,38021,38264,38271,38376,
+36367,38886,39029,39118,39134,39267,38928,40060,40479,40644,27503,63751,20023,
+135,38429,25143,38050,0,20539,28158,40051,40870,15817,34959,16718,28791,23797,
+19232,20941,13657,23856,24866,35378,36775,37366,29073,26393,29626,12929,41223,
+15499,6528,19216,30948,29698,20910,34575,16393,27235,41658,16931,34319,2671,
+31274,39239,35562,38741,28749,21284,8318,37876,30425,35299,40871,30685,20131,
+20464,20668,20015,20247,40872,21556,32139,22674,22736,7606,24210,24217,24514,
+10002,25995,13305,26905,27203,15459,27903,0,29184,17669,29580,16091,18963,
+23317,29881,35715,23716,22165,31379,31724,31939,32364,33528,34199,40873,34960,
+40874,36537,40875,36815,34143,39392,37409,40876,36281,5183,16497,17058,23066,
+0,0,0,39016,26475,17014,22333,0,34262,18811,33471,28941,19585,28020,23931,
+27413,28606,40877,40878,23446,40879,26343,32347,28247,31178,15752,17603,12886,
+10134,17306,17718,0,23765,15130,35577,23672,15634,13649,23928,40882,29015,
+17752,16620,7715,19575,14712,13386,420,27713,35532,20404,569,22975,33132,
+38998,39162,24379,2975,0,8641,35181,16642,18107,36985,16135,40883,41397,16632,
+14294,18167,27718,16764,34482,29695,17773,14548,21658,17761,17691,19849,19579,
+19830,17898,16328,19215,13921,17630,17597,16877,23870,23880,23894,15868,14351,
+23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,
+24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,
+14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,
+26111,26195,15090,26258,15138,
+26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,26889,26947,29276,
+26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,15340,27289,15346,
+27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,27906,27910,27942,
+28033,15599,28068,28081,28181,28184,28201,28294,35264,28347,28386,28378,40831,
+28392,28393,28452,28468,15686,16193,28545,28606,15722,15733,29111,23705,15754,
+28716,15761,28752,28756,28783,28799,28809,805,17345,13809,3800,16087,22462,
+28371,28990,22496,13902,27042,35817,23412,31305,22753,38105,31333,31357,22956,
+31419,31408,31426,31427,29137,25741,16842,31450,31453,31466,16879,21682,23553,
+31499,31573,31529,21262,23806,31650,31599,33692,23476,27775,31696,33825,31634,
+0,23840,15789,23653,33938,31738,0,31797,23745,31812,31875,18562,31910,26237,
+17784,31945,31943,31974,31860,31987,31989,0,32359,17693,28228,32093,28374,
+29837,32137,32171,28981,32179,0,16471,24617,32228,15635,32245,6137,32229,
+33645,0,24865,24922,32366,32402,17195,37996,32295,32576,32577,32583,31030,
+25296,39393,32663,25425,32675,5729,104,17756,14182,17667,33594,32762,25737,0,
+32776,32797,0,32815,41095,27843,32827,32828,32865,10004,18825,26150,15843,
+26344,26405,32935,35400,33031,33050,22704,9974,27775,25752,20408,25831,5258,
+33304,6238,27219,19045,19093,17530,33321,2829,27218,15742,20473,5373,34018,
+33634,27402,18855,13616,6003,15864,33450,26907,63892,16859,34123,33488,33562,
+3606,6068,14017,12669,13658,33403,33506,33560,16011,28067,27397,27543,13774,
+15807,33565,21996,33669,17675,28069,33708,
+0,33747,13438,28372,27223,34138,13462,28226,12015,33880,23524,33905,15827,
+17636,27303,33866,15541,31064,0,27542,28279,28227,34014,0,33681,17568,33939,
+34020,23697,16960,23744,17731,34100,23282,28313,17703,34163,17686,26559,34326,
+34341,34363,34241,28808,34306,5506,28877,63922,17770,34344,13896,6306,21495,
+29594,34430,34673,41208,34798,11303,34737,34778,34831,22113,34412,26710,17935,
+34885,34886,30176,15801,30180,34910,34972,18011,34996,34997,25537,35013,30583,
+30479,35207,35210,0,0,35239,35260,35365,35303,31012,31421,35484,30611,37374,
+35472,31321,31465,31546,16271,18195,31544,29052,35596,35615,21552,21861,35647,
+35660,35661,35497,19066,35728,35739,35503,5855,17941,34895,35995,32084,32143,
+63956,14117,32083,36054,32152,32189,36114,36099,6416,36059,28764,36113,19657,
+16080,0,36265,32770,4116,18826,15228,33212,28940,31463,36525,36534,36547,
+37588,36633,36653,33637,33810,36773,37635,41631,2640,36787,18730,35294,34109,
+15803,24312,12898,36857,40980,34492,34049,8997,14720,28375,36919,34108,31422,
+36961,34156,34315,37032,34579,37060,34534,37038,0,37223,15088,37289,37316,
+31916,35123,7817,37390,27807,37441,37474,21945,0,35526,15515,35596,21979,3377,
+37676,37739,35553,35819,28815,23235,35554,35557,18789,37444,35820,35897,35839,
+37747,37979,36540,38277,38310,37926,38304,28662,17081,9850,34520,4732,15918,
+18911,27676,38523,38550,16748,38563,28373,25050,38582,30965,35552,38589,21452,
+18849,27832,628,25616,37039,37093,19153,6421,13066,38705,34370,38710,18959,
+17725,17797,19177,28789,23361,38683,
+0,37333,38743,23370,37355,38751,37925,20688,12471,12476,38793,38815,38833,
+38846,38848,38866,38880,21612,38894,29724,37939,0,38901,37917,31098,19153,
+38964,38963,38987,39014,15118,29045,15697,1584,16732,22278,39114,39095,39112,
+39111,19199,27943,5843,21936,39137,39142,39148,37752,39225,18985,19314,38999,
+39173,39413,39436,39483,39440,39512,22309,14020,37041,39893,39648,39650,39685,
+39668,19470,39700,39725,34304,20532,39732,27048,14531,12413,39760,39744,40254,
+23109,6243,39822,16971,39938,39935,39948,40552,40404,40887,41362,41387,41185,
+41251,41439,40318,40323,41268,40462,26760,40388,8539,41363,41504,6459,41523,
+40249,41145,41652,40592,40597,40606,40610,19764,40618,40623,17252,40641,15200,
+14821,15645,20274,14270,35883,40706,40712,19350,37924,28066,40727,0,40761,
+22175,22154,40773,39352,37003,38898,33919,40802,40809,31452,40846,29206,19390,
+18805,18875,29047,18936,17224,19025,29598,35802,6394,31135,35198,36406,37737,
+37875,35396,37612,37761,37835,35180,17593,29207,16107,30578,31299,28880,17523,
+17400,29054,6127,28835,6334,13721,16071,6277,21551,6136,14114,5883,6201,14049,
+6004,6353,24395,14115,5824,22363,18981,5118,4776,5062,5302,34051,13990,0,
+33877,18836,29029,15921,21852,16123,28754,17652,14062,39325,28454,26617,14131,
+15381,15847,22636,6434,26640,16471,14143,16609,16523,16655,27681,21707,22174,
+26289,22162,4063,2984,3597,37830,35603,37788,20216,20779,14361,17462,20156,
+1125,895,20299,20362,22097,23144,427,971,14745,778,1044,13365,20265,704,36531,
+629,35546,524,20120,20685,
+20749,20386,20227,18958,16010,20290,20526,20588,20609,20428,20453,20568,20732,
+0,0,0,0,28278,13717,15929,16063,28018,6276,16009,20904,20931,1504,17629,1187,
+1170,1169,36218,35484,1806,21081,21156,2163,21217,0,18042,29068,17292,3104,
+18860,4324,27089,3613,0,16094,29849,29716,29782,29592,19342,19132,16525,21456,
+13700,29199,16585,21940,837,21709,3014,22301,37469,38644,37734,22493,22413,
+22399,13886,22731,23193,35398,5882,5999,5904,23084,22968,37519,23166,23247,
+23058,22854,6643,6241,17045,14069,27909,29763,23073,24195,23169,35799,1043,
+37856,29836,4867,28933,18802,37896,35323,37821,14240,23582,23710,24158,24136,
+6550,6524,15086,24269,23375,6403,6404,14081,6304,14045,5886,14035,33066,35399,
+7610,13426,35240,24332,24334,6439,6059,23147,5947,23364,34324,30205,34912,
+24702,10336,9771,24539,16056,9647,9662,37000,28531,25024,62,70,9755,24985,
+24984,24693,11419,11527,18132,37197,25713,18021,11114,14889,11042,13392,39146,
+11896,25399,42075,25782,25393,25553,18915,11623,25252,11425,25659,25963,26994,
+15348,12430,12973,18825,12971,21773,13024,6361,37951,26318,12937,12723,15072,
+16784,21892,35618,21903,5884,21851,21541,30958,12547,6186,12852,13412,12815,
+12674,17097,26254,27940,26219,19347,26160,30832,7659,26211,13010,13025,26142,
+22642,14545,14394,14268,15257,14242,13310,29904,15254,26511,17962,26806,26654,
+15300,27326,14435,14293,17543,27187,27218,27337,27397,6418,25873,26776,27212,
+15319,27258,27479,16320,15514,37792,37618,35818,35531,37513,32798,35292,37991,
+28069,28427,
+18924,0,16255,15759,28164,16444,23101,28170,22599,27940,30786,28987,17178,
+17014,28913,29264,29319,29332,18319,18213,20857,19108,1515,29818,16120,13919,
+19018,18711,24545,16134,16049,19167,35875,16181,24743,16115,29900,29756,37767,
+29751,17567,28138,17745,30083,16227,19673,19718,16216,30037,30323,42438,15129,
+29800,35532,18859,18830,15099,15821,19022,16127,18885,18675,37370,22322,37698,
+35555,6244,20703,21025,20967,30584,12850,30478,30479,30587,18071,14209,14942,
+18672,29752,29851,16063,19130,19143,16584,19094,25006,37639,21889,30750,30861,
+30856,30930,29648,31065,30529,22243,16654,0,33942,31141,27181,16122,31290,
+31220,16750,5862,16690,37429,31217,3404,18828,665,15802,5998,13719,21867,
+13680,13994,468,3085,31458,23129,9973,23215,23196,23053,603,30960,23082,23494,
+31486,16889,31837,31853,16913,23475,24252,24230,31949,18937,6064,31886,31868,
+31918,27314,32220,32263,32211,32590,25185,24924,31560,32151,24194,17002,27509,
+2326,26582,78,13775,22468,25618,25592,18786,32733,31527,2092,23273,23875,
+31500,24078,39398,34373,39523,27164,13375,14818,18935,26029,39455,26016,33920,
+28967,27857,17642,33079,17410,32966,33033,33090,26548,39107,27202,33378,33381,
+27217,33875,28071,34320,29211,23174,16767,6208,23339,6305,23268,6360,34464,
+63932,15759,34861,29730,23042,34926,20293,34951,35007,35046,35173,35149,22147,
+35156,30597,30596,35829,35801,35740,35321,16045,33955,18165,18127,14322,35389,
+35356,37960,24397,37419,17028,26068,28969,28868,6213,40301,35999,36073,32220,
+22938,30659,23024,17262,14036,36394,36519,19465,
+36656,36682,17140,27736,28603,8993,18587,28537,28299,6106,39913,14005,18735,
+37051,0,21873,18694,37307,37892,35403,16482,35580,37927,35869,35899,34021,
+35371,38297,38311,38295,38294,36148,29765,16066,18687,19010,17386,16103,12837,
+38543,36583,36454,36453,16076,18925,19064,16366,29714,29803,16124,38721,37040,
+26695,18973,37011,22495,0,37736,35209,35878,35631,25534,37562,23313,35689,
+18748,29689,16923,38811,38769,39224,3878,24001,35781,19122,38943,38106,37622,
+38359,37349,17600,35664,19047,35684,39132,35397,16128,37418,18725,33812,39227,
+39245,31494,15869,39323,19311,39338,39516,35685,22728,27279,39457,23294,39471,
+39153,19344,39240,39356,19389,19351,37757,22642,4866,22562,18872,5352,30788,
+10015,15800,26821,15741,37976,14631,24912,10113,10603,24839,40015,40019,40059,
+39989,39952,39807,39887,40493,39839,41461,41214,40225,19630,16644,40472,19632,
+40204,41396,41197,41203,39215,40357,33981,28178,28639,27522,34300,17715,28068,
+28292,28144,33824,34286,28160,14295,24676,31202,13724,13888,18733,18910,15714,
+37851,37566,37704,703,30905,37495,37965,20452,13376,36964,21853,30781,30804,
+30902,30795,5975,12745,18753,13978,20338,28634,28633,0,28702,21524,16821,
+22459,22771,22410,40214,22487,28980,13487,16812,29163,27712,20375,0,6069,
+35401,24844,23246,23051,17084,17544,14124,19323,35324,37819,37816,6358,3869,
+33906,27840,5139,17146,11302,17345,22932,15799,26433,32168,24923,24740,18873,
+18827,35322,37605,29666,16105,29876,35683,6303,16097,19123,27352,29683,29691,
+16086,19006,19092,6105,19046,935,5156,18917,29768,
+18710,28837,18806,37508,29670,37727,1278,37681,35534,35350,37766,35815,21973,
+18741,35458,29035,18755,3327,22180,1562,3051,3256,21762,31172,6138,32254,5826,
+19024,6226,17710,37889,14090,35520,18861,22960,6335,6275,29828,23201,14050,
+15707,14000,37471,23161,35457,6242,37748,15565,2740,19094,14730,20724,15721,
+15692,5020,29045,17147,33304,28175,37092,17643,27991,32335,28775,27823,15574,
+16365,15917,28162,28428,15727,1013,30033,14012,13512,18048,16090,18545,22980,
+37486,18750,36673,35868,27584,22546,22472,14038,5202,28926,17250,19057,12259,
+4784,9149,26809,26983,5016,13541,31732,14047,35459,14294,13306,19615,27162,
+13997,27831,33854,17631,17614,27942,27985,27778,28638,28439,28937,33597,5946,
+33773,27776,28755,6107,22921,23170,6067,23137,23153,6405,16892,14125,23023,
+5948,14023,29070,37776,26266,17061,23150,23083,17043,27179,16121,30518,17499,
+17098,28957,16985,35297,20400,27944,23746,17614,32333,17341,27148,16982,4868,
+28838,28979,17385,15781,27871,63525,19023,32357,23019,23855,15859,24412,19037,
+6111,32164,33830,21637,15098,13056,532,22398,2261,1561,16357,8094,41654,28675,
+37211,23920,29583,31955,35417,37920,20424,32743,29389,29456,31476,29496,29497,
+22262,29505,29512,16041,31512,36972,29173,18674,29665,33270,16074,30476,16081,
+27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,
+30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,20316,
+29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,
+23646,30654,30667,22770,30744,28857,30748,
+16552,30777,30791,30801,30822,33864,21813,31027,26627,31026,16643,16649,31121,
+31129,36795,31238,36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,
+20001,31586,31596,31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,
+31981,36755,28864,3279,32207,32212,32208,32253,32686,32692,29343,17303,32800,
+32805,31545,32814,32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,
+33038,33042,30048,33044,17409,15161,33110,33113,33114,17427,22586,33148,33156,
+17445,33171,17453,33189,22511,33217,33252,33364,17551,33446,33398,33482,33496,
+33535,17584,33623,38505,27018,33797,28917,33892,24803,33928,17668,33982,34017,
+34040,34064,34104,34130,17723,34159,34160,34272,17783,34418,34450,34482,34543,
+38469,34699,17926,17943,34990,35071,35108,35143,35217,31079,35369,35384,35476,
+35508,35921,36052,36082,36124,18328,22623,36291,18413,20206,36410,21976,22356,
+36465,22005,36528,18487,36558,36578,36580,36589,36594,36791,36801,36810,36812,
+36915,39364,18605,39136,37395,18718,37416,37464,37483,37553,37550,37567,37603,
+37611,37619,37620,37629,37699,37764,37805,18757,18769,40639,37911,21249,37917,
+37933,37950,18794,37972,38009,38189,38306,18855,38388,38451,18917,26528,18980,
+38720,18997,38834,38850,22100,19172,24808,39097,19225,39153,22596,39182,39193,
+20916,39196,39223,39234,39261,39266,19312,39365,19357,39484,39695,31363,39785,
+39809,39901,39921,39924,19565,39968,14191,7106,40265,39994,40702,22096,40339,
+40381,40384,40444,38134,36790,40571,40620,40625,40637,40646,38108,40674,40689,
+40696,31432,40772,148,695,928,26906,38083,22956,
+1239,22592,38081,14265,1493,1557,1654,5818,22359,29043,2754,2765,3007,21610,
+63547,3019,21662,3067,3131,3155,3173,3196,24807,3213,22138,3253,3293,3309,
+3439,3506,3528,26965,39983,34725,3588,3598,3799,3984,3885,3699,23584,4028,
+24075,4188,4175,4214,26398,4219,4232,4246,13895,4287,4307,4399,4411,21348,
+33965,4835,4981,4918,35713,5495,5657,6083,6087,20088,28859,6189,6506,6701,
+6725,7210,7280,7340,7880,25283,7893,7957,29080,26709,8261,27113,14024,8828,
+9175,9210,10026,10353,10575,33533,10599,10643,10965,35237,10984,36768,11022,
+38840,11071,38983,39613,11340,0,11400,11447,23528,11528,11538,11703,11669,
+11842,12148,12236,12339,12390,13087,13278,24497,26184,26303,31353,13671,13811,
+0,18874,0,13850,14102,0,838,22709,26382,26904,15015,30295,24546,15889,16057,
+30206,8346,18640,19128,16665,35482,17134,17165,16443,17204,17302,19013,1482,
+20946,1553,22943,7848,15294,15615,17412,17622,22408,18036,14747,18223,34280,
+39369,14178,8643,35678,35662,0,18450,18683,18965,29193,19136,3192,22885,20133,
+20358,1913,36570,20524,21135,22335,29041,21145,21529,16202,19111,21948,21574,
+21614,27474,0,13427,21823,30258,21854,18200,21858,21862,22471,18751,22621,
+20582,13563,13260,0,22787,18300,35144,23214,23433,23558,7568,22433,29009,0,
+24834,31762,36950,25010,20378,35682,25602,25674,23899,27639,0,25732,6428,
+35562,18934,25736,16367,25874,19392,26047,26293,10011,37989,22497,24981,23079,
+63693,0,22201,17697,26364,20074,18740,38486,28047,27837,13848,35191,
+26521,26734,25617,26718,0,26823,31554,37056,2577,26918,0,26937,31301,0,27130,
+39462,27181,13919,25705,33,31107,27188,27483,23852,13593,0,27549,18128,27812,
+30011,34917,28078,22710,14108,9613,28747,29133,15444,29312,29317,37505,8570,
+29323,37680,29414,18896,27705,38047,29776,3832,34855,35061,10534,33907,6065,
+28344,18986,6176,14756,14009,0,0,17727,26294,40109,39076,35139,30668,30808,
+22230,16607,5642,14753,14127,33000,5061,29101,33638,31197,37288,0,19639,28847,
+35243,31229,31242,31499,32102,16762,31555,31102,32777,28597,41695,27139,33560,
+21410,28167,37823,26678,38749,33135,32803,27061,5101,12847,32840,23941,35888,
+32899,22293,38947,35145,23979,18824,26046,27093,21458,19109,16257,15377,26422,
+32912,33012,33070,8097,33103,33161,33199,33306,33542,33583,33674,13770,33896,
+34474,18682,25574,35158,30728,37461,35256,17394,35303,17375,35304,35654,35796,
+23032,35849,0,36805,37100,0,37136,37180,15863,37214,19146,36816,29327,22155,
+38119,38377,38320,38328,38706,39121,39241,39274,39363,39464,39694,40282,40347,
+32415,40696,40739,19620,38215,41619,29090,41727,19857,36882,42443,19868,3228,
+36798,21953,36794,9392,36793,19091,17673,32383,28502,27313,20202,13540,35628,
+30877,14138,36480,6133,32804,35692,35737,31294,26287,15851,30293,15543,22069,
+22870,20122,24193,25176,22207,3693,36366,23405,16008,19614,25566,0,6134,6267,
+25904,22061,23626,21530,21265,15814,40344,19581,22050,22046,32585,24280,22901,
+15680,34672,19996,4074,3401,14010,33047,40286,36120,30267,40005,30286,30649,
+37701,21554,
+33096,33527,22053,33074,33816,32957,21994,31074,22083,21526,3741,13774,22021,
+22001,26353,33506,13869,30004,22000,21946,21655,21874,3137,3222,24272,20808,
+3702,11362,3746,40619,32090,21982,4213,25245,38765,21652,36045,29174,37238,
+25596,25529,25598,21865,11075,40050,11955,20890,13535,3495,20903,21581,21790,
+21779,30310,36397,26762,30129,32950,34820,34694,35015,33206,33820,4289,17644,
+29444,18182,23440,33547,26771,22139,9972,32047,16803,32115,28368,29366,37232,
+4569,37384,15612,42665,3756,3833,29286,7330,18254,20418,32761,4075,16634,
+40029,25887,11680,18675,18400,40316,4076,3594,0,30115,4077,0,24648,4487,29091,
+32398,40272,19994,19972,13687,23309,27826,21351,13996,14812,21373,13989,17944,
+22682,19310,33325,21579,22442,23189,2425,0,14930,9317,29556,40620,19721,39917,
+15614,40752,19547,20393,38302,40926,33884,15798,29362,26547,14112,25390,32037,
+16119,15916,14890,36872,21196,15988,13946,17897,1166,30272,23280,3766,30842,
+32558,22695,16575,22140,39819,23924,30292,42036,40581,19681,0,14331,24857,
+12506,17394,0,22109,4777,22439,18787,40454,21044,28846,13741,0,40316,31830,
+39737,22494,5996,23635,25811,38096,25397,29028,34477,3368,27938,19170,3441,0,
+20990,7951,23950,38659,7633,40577,36940,31519,39682,23761,31651,25192,25397,
+39679,31695,39722,31870,0,31810,31878,39957,31740,39689,0,39963,18750,40794,
+21875,23491,20477,40600,20466,21088,15878,21201,22375,20566,22967,24082,38856,
+40363,36700,21609,38836,39232,38842,21292,24880,26924,21466,39946,40194,19515,
+38465,27008,20646,
+30022,5997,39386,21107,0,37209,38529,37212,0,37201,36503,25471,27939,27338,
+22033,37262,30074,25221,1020,29519,31856,23585,15613,0,18713,30422,39837,
+20010,3284,33726,34882,0,23626,27072,0,22394,21023,24053,20174,27697,498,
+20281,21660,21722,21146,36226,13822,0,13811,0,27474,37244,40869,39831,38958,
+39092,39610,40616,40580,29050,31508,0,27642,34840,32632,0,22048,42570,36471,
+40787,0,36308,36431,40476,36353,25218,33661,36392,36469,31443,19063,31294,
+30936,27882,35431,30215,35418,40742,27854,34774,30147,41650,30803,63552,36108,
+29410,29553,35629,29442,29937,36075,19131,34351,24506,34976,17591,0,6203,
+28165,0,35454,9499,0,24829,30311,39639,40260,37742,39823,34805,0,0,36087,
+29484,38689,39856,13782,29362,19463,31825,39242,24921,24921,19460,40598,24957,
+0,22367,24943,25254,25145,0,14940,25058,21418,13301,25444,26626,13778,23895,
+35778,36826,36409,0,20697,7494,30982,21298,38456,3899,16485,0,30718,0,31938,
+24346,31962,31277,32870,32867,32077,29957,29938,35220,33306,26380,32866,29830,
+32859,29936,33027,30500,35209,26572,30035,28369,34729,34766,33224,34700,35401,
+36013,35651,30507,29944,34010,13877,27058,36262,0,35241,0,28089,34753,16401,
+29927,15835,29046,24740,24988,15569,0,24695,0,32625,35629,0,24809,19326,21024,
+15384,15559,24279,30294,21809,6468,4862,39171,28124,28845,23745,25005,35343,
+13943,238,26694,20238,17762,23327,25420,40784,40614,25195,1351,37595,1503,
+16325,34124,17077,29679,20917,13897,18754,35300,37700,6619,
+33518,15560,30780,26436,25311,18739,35242,672,27571,4869,20395,9453,20488,
+27945,31364,13824,19121,9491,0,894,24484,896,839,28379,1055,0,20737,13434,
+20750,39020,14147,33814,18852,1159,20832,13236,20842,3071,8444,741,9520,1422,
+12851,6531,23426,34685,1459,15513,20914,20920,40244,20937,20943,20945,15580,
+20947,19110,20915,20962,21314,20973,33741,26942,14125,24443,21003,21030,21052,
+21173,21079,21140,21177,21189,31765,34114,21216,34317,27411,0,35550,21833,
+28377,16256,2388,16364,21299,0,3042,27851,5926,26651,29653,24650,16042,14540,
+5864,29149,17570,21357,21364,34475,21374,0,5526,5651,30694,21395,35483,21408,
+21419,21422,29607,22386,16217,29596,21441,21445,27721,20041,22526,21465,15019,
+2959,21472,16363,11683,21494,3191,21523,28793,21803,26199,27995,21613,27475,
+3444,21853,21647,21668,18342,5901,3805,15796,3405,35260,9880,21831,19693,
+21551,29719,21894,21929,0,6359,16442,17746,17461,26291,4276,22071,26317,12938,
+26276,26285,22093,22095,30961,22257,38791,21502,22272,22255,22253,35686,13859,
+4687,22342,16805,27758,28811,22338,14001,27774,22502,5142,22531,5204,17251,
+22566,19445,22620,22698,13665,22752,22748,4668,22779,23551,22339,41296,17016,
+37843,13729,22815,26790,14019,28249,5694,23076,21843,5778,34053,22985,3406,
+27777,27946,6108,23001,6139,6066,28070,28017,6184,5845,23033,28229,23211,
+23139,14054,18857,0,14088,23190,29797,23251,28577,9556,15749,6417,14130,5816,
+24195,21200,23414,25992,23420,31246,16388,18525,516,23509,24928,6708,22988,
+1445,23539,
+23453,19728,23557,6980,23571,29646,23572,7333,27432,23625,18653,23685,23785,
+23791,23947,7673,7735,23824,23832,23878,7844,23738,24023,33532,14381,18689,
+8265,8563,33415,14390,15298,24110,27274,0,24186,17596,3283,21414,20151,0,
+21416,6001,24073,24308,33922,24313,24315,14496,24316,26686,37915,24333,449,
+63636,15070,18606,4922,24378,26760,9168,0,9329,24419,38845,28270,24434,37696,
+35382,24487,23990,15711,21072,8042,28920,9832,37334,670,35369,24625,26245,
+6263,14691,15815,13881,22416,10164,31089,15936,24734,0,24755,18818,18831,
+31315,29860,20705,23200,24932,33828,24898,63654,28370,24961,20980,1622,24967,
+23466,16311,10335,25043,35741,39261,25040,14642,10624,10433,24611,24924,25886,
+25483,280,25285,6000,25301,11789,25452,18911,14871,25656,25592,5006,6140,0,
+28554,11830,38932,16524,22301,25825,25829,38011,14950,25658,14935,25933,28438,
+18984,18979,25989,25965,25951,12414,26037,18752,19255,26065,16600,6185,26080,
+26083,24543,13312,26136,12791,12792,26180,12708,12709,26187,3701,26215,20966,
+26227,0,7741,12849,34292,12744,21267,30661,10487,39332,26370,17308,18977,
+15147,27130,14274,0,26471,26466,16845,37101,26583,17641,26658,28240,37436,
+26625,13286,28064,26717,13423,27105,27147,35551,26995,26819,13773,26881,26880,
+15666,14849,13884,15232,26540,26977,35402,17148,26934,27032,15265,969,33635,
+20624,27129,13913,8490,27205,14083,27293,15347,26545,27336,37276,15373,27421,
+2339,24798,27445,27508,10189,28341,15067,949,6488,14144,21537,15194,27617,
+16124,27612,27703,9355,18673,27473,
+27738,33318,27769,15804,17605,15805,16804,18700,18688,15561,14053,15595,3378,
+39811,12793,9361,32655,26679,27941,28065,28139,28054,27996,28284,28420,18815,
+16517,28274,34099,28532,20935,0,0,33838,35617,0,15919,29779,16258,31180,28239,
+23185,12363,28664,14093,28573,15920,28410,5271,16445,17749,37872,28484,28508,
+15694,28532,37232,15675,28575,16708,28627,16529,16725,16441,16368,16308,16703,
+20959,16726,16727,16704,25053,28747,28798,28839,28801,28876,28885,28886,28895,
+16644,15848,29108,29078,17015,28971,28997,23176,29002,0,23708,17253,29007,
+37730,17089,28972,17498,18983,18978,29114,35816,28861,29198,37954,29205,22801,
+37955,29220,37697,22021,29230,29248,18804,26813,29269,29271,15957,12356,26637,
+28477,29314,0,29483,18467,34859,18669,34820,29480,29486,29647,29610,3130,
+27182,29641,29769,16866,5863,18980,26147,14021,18871,18829,18939,29687,29717,
+26883,18982,29753,1475,16087,0,10413,29792,36530,29767,29668,29814,33721,
+29804,14128,29812,37873,27180,29826,18771,19084,16735,19065,35727,23366,35843,
+6302,29896,6536,29966,0,29982,36569,6731,23511,36524,37765,30029,30026,30055,
+30062,20354,16132,19731,30094,29789,30110,30132,30210,30252,30289,30287,30319,
+30326,25589,30352,33263,14328,26897,26894,30369,30373,30391,30412,28575,33890,
+20637,20861,7708,30494,30502,30528,25775,21024,30552,12972,30639,35172,35176,
+5825,30708,0,4982,18962,26826,30895,30919,30931,38565,31022,21984,30935,31028,
+30897,30220,36792,34948,35627,24707,9756,31110,35072,26882,31104,22615,31133,
+31545,31036,31145,28202,28966,
+16040,31174,37133,31188,1312,17503,21007,47234,248,16384,43296,1102,0,0,2868,
+1,0,0,0,0,0,0,0,3072,64,0,0,0,1024,88,60,0,0,23680,56493,48115,17353,60910,
+4004,49446,30363,61426,64478,63482,12815,44868,61438,65277,24593,176,8448,
+33049,4128,43144,8544,9321,17408,50313,0,16387,53,33859,20785,26771,514,0,0,0,
+0,0,16384,256,44160,33380,35904,37025,20484,54368,53760,6186,26781,38709,
+55375,8440,33476,10268,30082,660,16440,41376,4293,19825,3524,47512,23390,
+17153,39327,30723,57888,2079,393,16585,775,39437,21136,20433,892,8450,49184,
+4974,46467,62939,30693,20368,39447,5942,12,47726,12041,21600,7680,26744,28706,
+40534,62245,46990,2839,59119,6007,7003,4289,36248,6162,53174,12545,6770,11355,
+49334,57888,23747,7042,56032,34254,16598,21673,53259,18447,16452,2320,16596,
+15278,7780,11076,2071,33414,6198,35232,40167,2139,900,55810,60560,34779,49029,
+44450,36509,39069,9504,70,40774,58239,51669,62596,19926,58118,6326,2322,0,
+1024,0,32,0,512,0,0,0,0,8192,0,0,0,0,0,0,8,36352,28280,16223,56702,63293,
+39932,44796,65490,27535,59377,47807,28334,61207,42972,46654,30645,37577,42455,
+19126,39790,33209,26445,21758,39921,65122,21103,14039,49150,17705,63873,26045,
+17062,57,16896,36704,37888,16448,45010,53719,219,39072,31666,20998,38944,
+51222,2365,0,1,0,2561,2226,128,0,34820,5152,19472,0,4,17569,16,321,
+2048,61504,20447,22582,62961,32949,26613,16512,20480,16718,33992,23040,55392,
+11009,20481,5793,16580,28402,44049,14624,49348,1800,2316,38552,39876,7184,
+27800,10886,422,4422,58733,50379,37568,8464,4630,29341,27124,5902,41514,62593,
+123,41992,36875,11280,14796,330,5872,2571,3136,59933,17420,17678,2,
diff --git a/libc-top-half/musl/src/locale/iconv.c b/libc-top-half/musl/src/locale/iconv.c
new file mode 100644
index 0000000..3047c27
--- /dev/null
+++ b/libc-top-half/musl/src/locale/iconv.c
@@ -0,0 +1,685 @@
+#include <iconv.h>
+#include <errno.h>
+#include <wchar.h>
+#include <string.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <stdint.h>
+#include "locale_impl.h"
+
+#define UTF_32BE 0300
+#define UTF_16LE 0301
+#define UTF_16BE 0302
+#define UTF_32LE 0303
+#define UCS2BE 0304
+#define UCS2LE 0305
+#define WCHAR_T 0306
+#define US_ASCII 0307
+#define UTF_8 0310
+#define UTF_16 0312
+#define UTF_32 0313
+#define UCS2 0314
+#define EUC_JP 0320
+#define SHIFT_JIS 0321
+#define ISO2022_JP 0322
+#define GB18030 0330
+#define GBK 0331
+#define GB2312 0332
+#define BIG5 0340
+#define EUC_KR 0350
+
+/* Definitions of charmaps. Each charmap consists of:
+ * 1. Empty-string-terminated list of null-terminated aliases.
+ * 2. Special type code or number of elided quads of entries.
+ * 3. Character table (size determined by field 2), consisting
+ * of 5 bytes for every 4 characters, interpreted as 10-bit
+ * indices into the legacy_chars table. */
+
+static const unsigned char charmaps[] =
+"utf8\0char\0\0\310"
+"wchart\0\0\306"
+"ucs2be\0\0\304"
+"ucs2le\0\0\305"
+"utf16be\0\0\302"
+"utf16le\0\0\301"
+"ucs4be\0utf32be\0\0\300"
+"ucs4le\0utf32le\0\0\303"
+"ascii\0usascii\0iso646\0iso646us\0\0\307"
+"utf16\0\0\312"
+"ucs4\0utf32\0\0\313"
+"ucs2\0\0\314"
+"eucjp\0\0\320"
+"shiftjis\0sjis\0\0\321"
+"iso2022jp\0\0\322"
+"gb18030\0\0\330"
+"gbk\0\0\331"
+"gb2312\0\0\332"
+"big5\0bigfive\0cp950\0big5hkscs\0\0\340"
+"euckr\0ksc5601\0ksx1001\0cp949\0\0\350"
+#include "codepages.h"
+;
+
+/* Table of characters that appear in legacy 8-bit codepages,
+ * limited to 1024 slots (10 bit indices). The first 256 entries
+ * are elided since those characters are obviously all included. */
+static const unsigned short legacy_chars[] = {
+#include "legacychars.h"
+};
+
+static const unsigned short jis0208[84][94] = {
+#include "jis0208.h"
+};
+
+static const unsigned short gb18030[126][190] = {
+#include "gb18030.h"
+};
+
+static const unsigned short big5[89][157] = {
+#include "big5.h"
+};
+
+static const unsigned short hkscs[] = {
+#include "hkscs.h"
+};
+
+static const unsigned short ksc[93][94] = {
+#include "ksc.h"
+};
+
+static const unsigned short rev_jis[] = {
+#include "revjis.h"
+};
+
+static int fuzzycmp(const unsigned char *a, const unsigned char *b)
+{
+ for (; *a && *b; a++, b++) {
+ while (*a && (*a|32U)-'a'>26 && *a-'0'>10U) a++;
+ if ((*a|32U) != *b) return 1;
+ }
+ return *a != *b;
+}
+
+static size_t find_charmap(const void *name)
+{
+ const unsigned char *s;
+ if (!*(char *)name) name=charmaps; /* "utf8" */
+ for (s=charmaps; *s; ) {
+ if (!fuzzycmp(name, s)) {
+ for (; *s; s+=strlen((void *)s)+1);
+ return s+1-charmaps;
+ }
+ s += strlen((void *)s)+1;
+ if (!*s) {
+ if (s[1] > 0200) s+=2;
+ else s+=2+(64U-s[1])*5;
+ }
+ }
+ return -1;
+}
+
+struct stateful_cd {
+ iconv_t base_cd;
+ unsigned state;
+};
+
+static iconv_t combine_to_from(size_t t, size_t f)
+{
+ return (void *)(f<<16 | t<<1 | 1);
+}
+
+static size_t extract_from(iconv_t cd)
+{
+ return (size_t)cd >> 16;
+}
+
+static size_t extract_to(iconv_t cd)
+{
+ return (size_t)cd >> 1 & 0x7fff;
+}
+
+iconv_t iconv_open(const char *to, const char *from)
+{
+ size_t f, t;
+ struct stateful_cd *scd;
+
+ if ((t = find_charmap(to))==-1
+ || (f = find_charmap(from))==-1
+ || (charmaps[t] >= 0330)) {
+ errno = EINVAL;
+ return (iconv_t)-1;
+ }
+ iconv_t cd = combine_to_from(t, f);
+
+ switch (charmaps[f]) {
+ case UTF_16:
+ case UTF_32:
+ case UCS2:
+ case ISO2022_JP:
+ scd = malloc(sizeof *scd);
+ if (!scd) return (iconv_t)-1;
+ scd->base_cd = cd;
+ scd->state = 0;
+ cd = (iconv_t)scd;
+ }
+
+ return cd;
+}
+
+static unsigned get_16(const unsigned char *s, int e)
+{
+ e &= 1;
+ return s[e]<<8 | s[1-e];
+}
+
+static void put_16(unsigned char *s, unsigned c, int e)
+{
+ e &= 1;
+ s[e] = c>>8;
+ s[1-e] = c;
+}
+
+static unsigned get_32(const unsigned char *s, int e)
+{
+ e &= 3;
+ return s[e]+0U<<24 | s[e^1]<<16 | s[e^2]<<8 | s[e^3];
+}
+
+static void put_32(unsigned char *s, unsigned c, int e)
+{
+ e &= 3;
+ s[e^0] = c>>24;
+ s[e^1] = c>>16;
+ s[e^2] = c>>8;
+ s[e^3] = c;
+}
+
+/* Adapt as needed */
+#define mbrtowc_utf8 mbrtowc
+#define wctomb_utf8 wctomb
+
+static unsigned legacy_map(const unsigned char *map, unsigned c)
+{
+ if (c < 4*map[-1]) return c;
+ unsigned x = c - 4*map[-1];
+ x = map[x*5/4]>>2*x%8 | map[x*5/4+1]<<8-2*x%8 & 1023;
+ return x < 256 ? x : legacy_chars[x-256];
+}
+
+static unsigned uni_to_jis(unsigned c)
+{
+ unsigned nel = sizeof rev_jis / sizeof *rev_jis;
+ unsigned d, j, i, b = 0;
+ for (;;) {
+ i = nel/2;
+ j = rev_jis[b+i];
+ d = jis0208[j/256][j%256];
+ if (d==c) return j + 0x2121;
+ else if (nel == 1) return 0;
+ else if (c < d)
+ nel /= 2;
+ else {
+ b += i;
+ nel -= nel/2;
+ }
+ }
+}
+
+size_t iconv(iconv_t cd, char **restrict in, size_t *restrict inb, char **restrict out, size_t *restrict outb)
+{
+ size_t x=0;
+ struct stateful_cd *scd=0;
+ if (!((size_t)cd & 1)) {
+ scd = (void *)cd;
+ cd = scd->base_cd;
+ }
+ unsigned to = extract_to(cd);
+ unsigned from = extract_from(cd);
+ const unsigned char *map = charmaps+from+1;
+ const unsigned char *tomap = charmaps+to+1;
+ mbstate_t st = {0};
+ wchar_t wc;
+ unsigned c, d;
+ size_t k, l;
+ int err;
+ unsigned char type = map[-1];
+ unsigned char totype = tomap[-1];
+ locale_t *ploc = &CURRENT_LOCALE, loc = *ploc;
+
+ if (!in || !*in || !*inb) return 0;
+
+ *ploc = UTF8_LOCALE;
+
+ for (; *inb; *in+=l, *inb-=l) {
+ c = *(unsigned char *)*in;
+ l = 1;
+
+ switch (type) {
+ case UTF_8:
+ if (c < 128) break;
+ l = mbrtowc_utf8(&wc, *in, *inb, &st);
+ if (l == (size_t)-1) goto ilseq;
+ if (l == (size_t)-2) goto starved;
+ c = wc;
+ break;
+ case US_ASCII:
+ if (c >= 128) goto ilseq;
+ break;
+ case WCHAR_T:
+ l = sizeof(wchar_t);
+ if (*inb < l) goto starved;
+ c = *(wchar_t *)*in;
+ if (0) {
+ case UTF_32BE:
+ case UTF_32LE:
+ l = 4;
+ if (*inb < 4) goto starved;
+ c = get_32((void *)*in, type);
+ }
+ if (c-0xd800u < 0x800u || c >= 0x110000u) goto ilseq;
+ break;
+ case UCS2BE:
+ case UCS2LE:
+ case UTF_16BE:
+ case UTF_16LE:
+ l = 2;
+ if (*inb < 2) goto starved;
+ c = get_16((void *)*in, type);
+ if ((unsigned)(c-0xdc00) < 0x400) goto ilseq;
+ if ((unsigned)(c-0xd800) < 0x400) {
+ if (type-UCS2BE < 2U) goto ilseq;
+ l = 4;
+ if (*inb < 4) goto starved;
+ d = get_16((void *)(*in + 2), type);
+ if ((unsigned)(d-0xdc00) >= 0x400) goto ilseq;
+ c = ((c-0xd7c0)<<10) + (d-0xdc00);
+ }
+ break;
+ case UCS2:
+ case UTF_16:
+ l = 0;
+ if (!scd->state) {
+ if (*inb < 2) goto starved;
+ c = get_16((void *)*in, 0);
+ scd->state = type==UCS2
+ ? c==0xfffe ? UCS2LE : UCS2BE
+ : c==0xfffe ? UTF_16LE : UTF_16BE;
+ if (c == 0xfffe || c == 0xfeff)
+ l = 2;
+ }
+ type = scd->state;
+ continue;
+ case UTF_32:
+ l = 0;
+ if (!scd->state) {
+ if (*inb < 4) goto starved;
+ c = get_32((void *)*in, 0);
+ scd->state = c==0xfffe0000 ? UTF_32LE : UTF_32BE;
+ if (c == 0xfffe0000 || c == 0xfeff)
+ l = 4;
+ }
+ type = scd->state;
+ continue;
+ case SHIFT_JIS:
+ if (c < 128) break;
+ if (c-0xa1 <= 0xdf-0xa1) {
+ c += 0xff61-0xa1;
+ break;
+ }
+ l = 2;
+ if (*inb < 2) goto starved;
+ d = *((unsigned char *)*in + 1);
+ if (c-129 <= 159-129) c -= 129;
+ else if (c-224 <= 239-224) c -= 193;
+ else goto ilseq;
+ c *= 2;
+ if (d-64 <= 158-64) {
+ if (d==127) goto ilseq;
+ if (d>127) d--;
+ d -= 64;
+ } else if (d-159 <= 252-159) {
+ c++;
+ d -= 159;
+ }
+ c = jis0208[c][d];
+ if (!c) goto ilseq;
+ break;
+ case EUC_JP:
+ if (c < 128) break;
+ l = 2;
+ if (*inb < 2) goto starved;
+ d = *((unsigned char *)*in + 1);
+ if (c==0x8e) {
+ c = d;
+ if (c-0xa1 > 0xdf-0xa1) goto ilseq;
+ c += 0xff61 - 0xa1;
+ break;
+ }
+ c -= 0xa1;
+ d -= 0xa1;
+ if (c >= 84 || d >= 94) goto ilseq;
+ c = jis0208[c][d];
+ if (!c) goto ilseq;
+ break;
+ case ISO2022_JP:
+ if (c >= 128) goto ilseq;
+ if (c == '\033') {
+ l = 3;
+ if (*inb < 3) goto starved;
+ c = *((unsigned char *)*in + 1);
+ d = *((unsigned char *)*in + 2);
+ if (c != '(' && c != '$') goto ilseq;
+ switch (128*(c=='$') + d) {
+ case 'B': scd->state=0; continue;
+ case 'J': scd->state=1; continue;
+ case 'I': scd->state=4; continue;
+ case 128+'@': scd->state=2; continue;
+ case 128+'B': scd->state=3; continue;
+ }
+ goto ilseq;
+ }
+ switch (scd->state) {
+ case 1:
+ if (c=='\\') c = 0xa5;
+ if (c=='~') c = 0x203e;
+ break;
+ case 2:
+ case 3:
+ l = 2;
+ if (*inb < 2) goto starved;
+ d = *((unsigned char *)*in + 1);
+ c -= 0x21;
+ d -= 0x21;
+ if (c >= 84 || d >= 94) goto ilseq;
+ c = jis0208[c][d];
+ if (!c) goto ilseq;
+ break;
+ case 4:
+ if (c-0x60 < 0x1f) goto ilseq;
+ if (c-0x21 < 0x5e) c += 0xff61-0x21;
+ break;
+ }
+ break;
+ case GB2312:
+ if (c < 128) break;
+ if (c < 0xa1) goto ilseq;
+ case GBK:
+ case GB18030:
+ if (c < 128) break;
+ c -= 0x81;
+ if (c >= 126) goto ilseq;
+ l = 2;
+ if (*inb < 2) goto starved;
+ d = *((unsigned char *)*in + 1);
+ if (d < 0xa1 && type == GB2312) goto ilseq;
+ if (d-0x40>=191 || d==127) {
+ if (d-'0'>9 || type != GB18030)
+ goto ilseq;
+ l = 4;
+ if (*inb < 4) goto starved;
+ c = (10*c + d-'0') * 1260;
+ d = *((unsigned char *)*in + 2);
+ if (d-0x81>126) goto ilseq;
+ c += 10*(d-0x81);
+ d = *((unsigned char *)*in + 3);
+ if (d-'0'>9) goto ilseq;
+ c += d-'0';
+ c += 128;
+ for (d=0; d<=c; ) {
+ k = 0;
+ for (int i=0; i<126; i++)
+ for (int j=0; j<190; j++)
+ if (gb18030[i][j]-d <= c-d)
+ k++;
+ d = c+1;
+ c += k;
+ }
+ break;
+ }
+ d -= 0x40;
+ if (d>63) d--;
+ c = gb18030[c][d];
+ break;
+ case BIG5:
+ if (c < 128) break;
+ l = 2;
+ if (*inb < 2) goto starved;
+ d = *((unsigned char *)*in + 1);
+ if (d-0x40>=0xff-0x40 || d-0x7f<0xa1-0x7f) goto ilseq;
+ d -= 0x40;
+ if (d > 0x3e) d -= 0x22;
+ if (c-0xa1>=0xfa-0xa1) {
+ if (c-0x87>=0xff-0x87) goto ilseq;
+ if (c < 0xa1) c -= 0x87;
+ else c -= 0x87 + (0xfa-0xa1);
+ c = (hkscs[4867+(c*157+d)/16]>>(c*157+d)%16)%2<<17
+ | hkscs[c*157+d];
+ /* A few HKSCS characters map to pairs of UCS
+ * characters. These are mapped to surrogate
+ * range in the hkscs table then hard-coded
+ * here. Ugly, yes. */
+ if (c/256 == 0xdc) {
+ union {
+ char c[8];
+ wchar_t wc[2];
+ } tmp;
+ char *ptmp = tmp.c;
+ size_t tmpx = iconv(combine_to_from(to, find_charmap("utf8")),
+ &(char *){"\303\212\314\204"
+ "\303\212\314\214"
+ "\303\252\314\204"
+ "\303\252\314\214"
+ +c%256}, &(size_t){4},
+ &ptmp, &(size_t){sizeof tmp});
+ size_t tmplen = ptmp - tmp.c;
+ if (tmplen > *outb) goto toobig;
+ if (tmpx) x++;
+ memcpy(*out, &tmp, tmplen);
+ *out += tmplen;
+ *outb -= tmplen;
+ continue;
+ }
+ if (!c) goto ilseq;
+ break;
+ }
+ c -= 0xa1;
+ c = big5[c][d]|(c==0x27&&(d==0x3a||d==0x3c||d==0x42))<<17;
+ if (!c) goto ilseq;
+ break;
+ case EUC_KR:
+ if (c < 128) break;
+ l = 2;
+ if (*inb < 2) goto starved;
+ d = *((unsigned char *)*in + 1);
+ c -= 0xa1;
+ d -= 0xa1;
+ if (c >= 93 || d >= 94) {
+ c += (0xa1-0x81);
+ d += 0xa1;
+ if (c >= 93 || c>=0xc6-0x81 && d>0x52)
+ goto ilseq;
+ if (d-'A'<26) d = d-'A';
+ else if (d-'a'<26) d = d-'a'+26;
+ else if (d-0x81<0xff-0x81) d = d-0x81+52;
+ else goto ilseq;
+ if (c < 0x20) c = 178*c + d;
+ else c = 178*0x20 + 84*(c-0x20) + d;
+ c += 0xac00;
+ for (d=0xac00; d<=c; ) {
+ k = 0;
+ for (int i=0; i<93; i++)
+ for (int j=0; j<94; j++)
+ if (ksc[i][j]-d <= c-d)
+ k++;
+ d = c+1;
+ c += k;
+ }
+ break;
+ }
+ c = ksc[c][d];
+ if (!c) goto ilseq;
+ break;
+ default:
+ if (!c) break;
+ c = legacy_map(map, c);
+ if (!c) goto ilseq;
+ }
+
+ switch (totype) {
+ case WCHAR_T:
+ if (*outb < sizeof(wchar_t)) goto toobig;
+ *(wchar_t *)*out = c;
+ *out += sizeof(wchar_t);
+ *outb -= sizeof(wchar_t);
+ break;
+ case UTF_8:
+ if (*outb < 4) {
+ char tmp[4];
+ k = wctomb_utf8(tmp, c);
+ if (*outb < k) goto toobig;
+ memcpy(*out, tmp, k);
+ } else k = wctomb_utf8(*out, c);
+ *out += k;
+ *outb -= k;
+ break;
+ case US_ASCII:
+ if (c > 0x7f) subst: x++, c='*';
+ default:
+ if (*outb < 1) goto toobig;
+ if (c<256 && c==legacy_map(tomap, c)) {
+ revout:
+ if (*outb < 1) goto toobig;
+ *(*out)++ = c;
+ *outb -= 1;
+ break;
+ }
+ d = c;
+ for (c=4*totype; c<256; c++) {
+ if (d == legacy_map(tomap, c)) {
+ goto revout;
+ }
+ }
+ goto subst;
+ case SHIFT_JIS:
+ if (c < 128) goto revout;
+ if (c == 0xa5) {
+ x++;
+ c = '\\';
+ goto revout;
+ }
+ if (c == 0x203e) {
+ x++;
+ c = '~';
+ goto revout;
+ }
+ if (c-0xff61 <= 0xdf-0xa1) {
+ c += 0xa1 - 0xff61;
+ goto revout;
+ }
+ c = uni_to_jis(c);
+ if (!c) goto subst;
+ if (*outb < 2) goto toobig;
+ d = c%256;
+ c = c/256;
+ *(*out)++ = (c+1)/2 + (c<95 ? 112 : 176);
+ *(*out)++ = c%2 ? d + 31 + d/96 : d + 126;
+ *outb -= 2;
+ break;
+ case EUC_JP:
+ if (c < 128) goto revout;
+ if (c-0xff61 <= 0xdf-0xa1) {
+ c += 0x0e00 + 0x21 - 0xff61;
+ } else {
+ c = uni_to_jis(c);
+ }
+ if (!c) goto subst;
+ if (*outb < 2) goto toobig;
+ *(*out)++ = c/256 + 0x80;
+ *(*out)++ = c%256 + 0x80;
+ *outb -= 2;
+ break;
+ case ISO2022_JP:
+ if (c < 128) goto revout;
+ if (c-0xff61 <= 0xdf-0xa1 || c==0xa5 || c==0x203e) {
+ if (*outb < 7) goto toobig;
+ *(*out)++ = '\033';
+ *(*out)++ = '(';
+ if (c==0xa5) {
+ *(*out)++ = 'J';
+ *(*out)++ = '\\';
+ } else if (c==0x203e) {
+ *(*out)++ = 'J';
+ *(*out)++ = '~';
+ } else {
+ *(*out)++ = 'I';
+ *(*out)++ = c-0xff61+0x21;
+ }
+ *(*out)++ = '\033';
+ *(*out)++ = '(';
+ *(*out)++ = 'B';
+ *outb -= 7;
+ break;
+ }
+ c = uni_to_jis(c);
+ if (!c) goto subst;
+ if (*outb < 8) goto toobig;
+ *(*out)++ = '\033';
+ *(*out)++ = '$';
+ *(*out)++ = 'B';
+ *(*out)++ = c/256;
+ *(*out)++ = c%256;
+ *(*out)++ = '\033';
+ *(*out)++ = '(';
+ *(*out)++ = 'B';
+ *outb -= 8;
+ break;
+ case UCS2:
+ totype = UCS2BE;
+ case UCS2BE:
+ case UCS2LE:
+ case UTF_16:
+ case UTF_16BE:
+ case UTF_16LE:
+ if (c < 0x10000 || totype-UCS2BE < 2U) {
+ if (c >= 0x10000) c = 0xFFFD;
+ if (*outb < 2) goto toobig;
+ put_16((void *)*out, c, totype);
+ *out += 2;
+ *outb -= 2;
+ break;
+ }
+ if (*outb < 4) goto toobig;
+ c -= 0x10000;
+ put_16((void *)*out, (c>>10)|0xd800, totype);
+ put_16((void *)(*out + 2), (c&0x3ff)|0xdc00, totype);
+ *out += 4;
+ *outb -= 4;
+ break;
+ case UTF_32:
+ totype = UTF_32BE;
+ case UTF_32BE:
+ case UTF_32LE:
+ if (*outb < 4) goto toobig;
+ put_32((void *)*out, c, totype);
+ *out += 4;
+ *outb -= 4;
+ break;
+ }
+ }
+ *ploc = loc;
+ return x;
+ilseq:
+ err = EILSEQ;
+ x = -1;
+ goto end;
+toobig:
+ err = E2BIG;
+ x = -1;
+ goto end;
+starved:
+ err = EINVAL;
+ x = -1;
+end:
+ errno = err;
+ *ploc = loc;
+ return x;
+}
diff --git a/libc-top-half/musl/src/locale/iconv_close.c b/libc-top-half/musl/src/locale/iconv_close.c
new file mode 100644
index 0000000..28b2956
--- /dev/null
+++ b/libc-top-half/musl/src/locale/iconv_close.c
@@ -0,0 +1,8 @@
+#include <iconv.h>
+#include <stdlib.h>
+
+int iconv_close(iconv_t cd)
+{
+ if (!((size_t)cd & 1)) free((void *)cd);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/locale/jis0208.h b/libc-top-half/musl/src/locale/jis0208.h
new file mode 100644
index 0000000..de9c5f2
--- /dev/null
+++ b/libc-top-half/musl/src/locale/jis0208.h
@@ -0,0 +1,563 @@
+12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,
+65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,
+12295,12540,8213,8208,65295,92,12316,8214,65372,8230,8229,8216,8217,8220,8221,
+65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,
+12301,12302,12303,12304,12305,65291,8722,177,215,247,65309,8800,65308,65310,
+8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,162,163,65285,
+65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,
+9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,0,0,0,0,0,0,0,0,0,0,0,
+8712,8715,8838,8839,8834,8835,8746,8745,0,0,0,0,0,0,0,0,8743,8744,172,8658,
+8660,8704,8707,0,0,0,0,0,0,0,0,0,0,0,8736,8869,8978,8706,8711,8801,8786,8810,
+8811,8730,8765,8733,8757,8747,8748,0,0,0,0,0,0,0,8491,8240,9839,9837,9834,
+8224,8225,182,0,0,0,0,9711,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65296,65297,65298,
+65299,65300,65301,65302,65303,65304,65305,0,0,0,0,0,0,0,65313,65314,65315,
+65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,
+65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,0,0,0,0,0,0,65345,
+65346,65347,
+65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,
+65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,0,0,0,0,12353,
+12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,
+12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,
+12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,
+12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,
+12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,
+12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,
+12432,12433,12434,12435,0,0,0,0,0,0,0,0,0,0,0,12449,12450,12451,12452,12453,
+12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,
+12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,
+12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,
+12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,
+12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,
+12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,
+12532,12533,12534,0,0,0,0,0,0,0,0,913,914,915,916,917,918,919,920,921,922,923,
+924,925,926,927,928,929,931,932,933,934,935,936,937,0,0,0,0,0,0,0,0,945,946,
+947,948,949,950,951,952,953,
+954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1040,1041,1042,1043,
+1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,
+1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,
+1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,
+1097,1098,1099,1100,1101,1102,1103,0,0,0,0,0,0,0,0,0,0,0,0,0,9472,9474,9484,
+9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,
+9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,20124,21782,23043,38463,21696,24859,25384,23030,
+36898,33909,33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,
+26017,25201,23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,
+24245,25353,26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,
+22839,22996,23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,
+32173,32239,32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,
+37057,30959,19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,
+21729,22240,23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,
+21491,23431,28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,
+22040,21764,27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,
+38642,33615,39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,
+29787,30408,31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,
+35585,36234,38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,
+25588,27839,28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,
+37467,40219,22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,
+27178,27431,27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,
+23627,25014,33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,
+21270,20206,20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,
+31185,26247,26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,
+33499,33540,33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,
+20420,23784,25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,
+20250,35299,22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,
+25913,39745,26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,
+35997,20977,21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,
+35442,37799,39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,
+24275,25313,25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,
+37101,38307,38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,
+26806,39949,28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,
+19988,39993,21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,
+40232,26658,33541,33841,31909,21000,33477,29926,20094,
+20355,20896,23506,21002,21208,21223,24059,21914,22570,23014,23436,23448,23515,
+24178,24185,24739,24863,24931,25022,25563,25954,26577,26707,26874,27454,27475,
+27735,28450,28567,28485,29872,29976,30435,30475,31487,31649,31777,32233,32566,
+32752,32925,33382,33694,35251,35532,36011,36996,37969,38291,38289,38306,38501,
+38867,39208,33304,20024,21547,23736,24012,29609,30284,30524,23721,32747,36107,
+38593,38929,38996,39000,20225,20238,21361,21916,22120,22522,22855,23305,23492,
+23696,24076,24190,24524,25582,26426,26071,26082,26399,26827,26820,27231,24112,
+27589,27671,27773,30079,31048,23395,31232,32000,24509,35215,35352,36020,36215,
+36556,36637,39138,39438,39740,20096,20605,20736,22931,23452,25135,25216,25836,
+27450,29344,30097,31047,32681,34811,35516,35696,25516,33738,38816,21513,21507,
+21931,26708,27224,35440,30759,26485,40653,21364,23458,33050,34384,36870,19992,
+20037,20167,20241,21450,21560,23470,24339,24613,25937,26429,27714,27762,27875,
+28792,29699,31350,31406,31496,32026,31998,32102,26087,29275,21435,23621,24040,
+25298,25312,25369,28192,34394,35377,36317,37624,28417,31142,39770,20136,20139,
+20140,20379,20384,20689,20807,31478,20849,20982,21332,21281,21375,21483,21932,
+22659,23777,24375,24394,24623,24656,24685,25375,25945,27211,27841,29378,29421,
+30703,33016,33029,33288,34126,37111,37857,38911,39255,39514,20208,20957,23597,
+26241,26989,23616,26354,26997,29577,26704,31873,20677,21220,22343,24062,37670,
+26020,27427,27453,29748,31105,31165,31563,32202,33465,33740,34943,35167,35641,
+36817,37329,21535,37504,20061,20534,21477,21306,29399,
+29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,21936,31354,20598,
+23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,27795,38772,36705,
+31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,34219,35347,32676,
+36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,22317,29674,22411,
+22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,26223,26690,28179,
+30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,35336,35427,35686,
+36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,38553,26689,20625,
+27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,20518,20581,20860,
+21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,25458,26908,27177,
+29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,36066,36562,36963,
+37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,28187,28304,29572,
+29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,22266,22993,23396,
+24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,32929,32993,33776,
+34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,21320,21577,21566,
+23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,35703,37264,20062,
+39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,21246,21402,21475,
+21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,24039,24055,24184,
+24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,26114,26179,26356,
+26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,30343,30828,31295,
+31968,32005,32024,32094,32177,32789,32771,32943,32945,
+33108,33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,
+37628,38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,
+28640,35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,
+28425,33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,
+22718,23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,
+20123,20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,
+35039,22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,
+25165,25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,
+33756,35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,
+27018,32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,
+26613,31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,
+25774,25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,
+19977,20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,
+34453,35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,
+21496,21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,
+24605,25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,
+31169,31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,
+36039,36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,
+26178,27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,
+36766,27728,40575,24335,35672,40235,31482,36600,23437,
+38635,19971,21489,22519,22833,23241,23460,24713,28287,28422,30142,36074,23455,
+34048,31712,20594,26612,33437,23649,34122,32286,33294,20889,23556,25448,36198,
+26012,29038,31038,32023,32773,35613,36554,36974,34503,37034,20511,21242,23610,
+26451,28796,29237,37196,37320,37675,33509,23490,24369,24825,20027,21462,23432,
+25163,26417,27530,29417,29664,31278,33131,36259,37202,39318,20754,21463,21610,
+23551,25480,27193,32172,38656,22234,21454,21608,23447,23601,24030,20462,24833,
+25342,27954,31168,31179,32066,32333,32722,33261,33311,33936,34886,35186,35728,
+36468,36655,36913,37195,37228,38598,37276,20160,20303,20805,21313,24467,25102,
+26580,27713,28171,29539,32294,37325,37507,21460,22809,23487,28113,31069,32302,
+31899,22654,29087,20986,34899,36848,20426,23803,26149,30636,31459,33308,39423,
+20934,24490,26092,26991,27529,28147,28310,28516,30462,32020,24033,36981,37255,
+38918,20966,21021,25152,26257,26329,28186,24246,32210,32626,26360,34223,34295,
+35576,21161,21465,22899,24207,24464,24661,37604,38500,20663,20767,21213,21280,
+21319,21484,21736,21830,21809,22039,22888,22974,23100,23477,23558,23567,23569,
+23578,24196,24202,24288,24432,25215,25220,25307,25484,25463,26119,26124,26157,
+26230,26494,26786,27167,27189,27836,28040,28169,28248,28988,28966,29031,30151,
+30465,30813,30977,31077,31216,31456,31505,31911,32057,32918,33750,33931,34121,
+34909,35059,35359,35388,35412,35443,35937,36062,37284,37478,37758,37912,38556,
+38808,19978,19976,19998,20055,20887,21104,22478,22580,22732,23330,24120,24773,
+25854,26465,26454,27972,29366,30067,31331,33976,35698,
+37304,37664,22065,22516,39166,25325,26893,27542,29165,32340,32887,33394,35302,
+39135,34645,36785,23611,20280,20449,20405,21767,23072,23517,23529,24515,24910,
+25391,26032,26187,26862,27035,28024,28145,30003,30137,30495,31070,31206,32051,
+33251,33455,34218,35242,35386,36523,36763,36914,37341,38663,20154,20161,20995,
+22645,22764,23563,29978,23613,33102,35338,36805,38499,38765,31525,35535,38920,
+37218,22259,21416,36887,21561,22402,24101,25512,27700,28810,30561,31883,32736,
+34928,36930,37204,37648,37656,38543,29790,39620,23815,23913,25968,26530,36264,
+38619,25454,26441,26905,33733,38935,38592,35070,28548,25722,23544,19990,28716,
+30045,26159,20932,21046,21218,22995,24449,24615,25104,25919,25972,26143,26228,
+26866,26646,27491,28165,29298,29983,30427,31934,32854,22768,35069,35199,35488,
+35475,35531,36893,37266,38738,38745,25993,31246,33030,38587,24109,24796,25114,
+26021,26132,26512,30707,31309,31821,32318,33034,36012,36196,36321,36447,30889,
+20999,25305,25509,25666,25240,35373,31363,31680,35500,38634,32118,33292,34633,
+20185,20808,21315,21344,23459,23554,23574,24029,25126,25159,25776,26643,26676,
+27849,27973,27927,26579,28508,29006,29053,26059,31359,31661,32218,32330,32680,
+33146,33307,33337,34214,35438,36046,36341,36984,36983,37549,37521,38275,39854,
+21069,21892,28472,28982,20840,31109,32341,33203,31950,22092,22609,23720,25514,
+26366,26365,26970,29401,30095,30094,30990,31062,31199,31895,32032,32068,34311,
+35380,38459,36961,40736,20711,21109,21452,21474,20489,21930,22766,22863,29245,
+23435,23652,21277,24803,24819,25436,25475,25407,25531,
+25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,
+32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,
+38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,
+24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,
+20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,
+21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,
+23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,
+33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,
+38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,
+35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,
+33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,
+22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,
+32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,
+20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,
+39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,
+20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,
+27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,
+24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,
+32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,
+25431,30452,26389,27784,29645,36035,37806,38515,27941,
+22684,26894,27084,36861,37786,30171,36890,22618,26626,25524,27131,20291,28460,
+26584,36795,34086,32180,37716,26943,28528,22378,22775,23340,32044,29226,21514,
+37347,40372,20141,20302,20572,20597,21059,35998,21576,22564,23450,24093,24213,
+24237,24311,24351,24716,25269,25402,25552,26799,27712,30855,31118,31243,32224,
+33351,35330,35558,36420,36883,37048,37165,37336,40718,27877,25688,25826,25973,
+28404,30340,31515,36969,37841,28346,21746,24505,25764,36685,36845,37444,20856,
+22635,22825,23637,24215,28155,32399,29980,36028,36578,39003,28857,20253,27583,
+28593,30000,38651,20814,21520,22581,22615,22956,23648,24466,26007,26460,28193,
+30331,33759,36077,36884,37117,37709,30757,30778,21162,24230,22303,22900,24594,
+20498,20826,20908,20941,20992,21776,22612,22616,22871,23445,23798,23947,24764,
+25237,25645,26481,26691,26812,26847,30423,28120,28271,28059,28783,29128,24403,
+30168,31095,31561,31572,31570,31958,32113,21040,33891,34153,34276,35342,35588,
+35910,36367,36867,36879,37913,38518,38957,39472,38360,20685,21205,21516,22530,
+23566,24999,25758,27934,30643,31461,33012,33796,36947,37509,23776,40199,21311,
+24471,24499,28060,29305,30563,31167,31716,27602,29420,35501,26627,27233,20984,
+31361,26932,23626,40182,33515,23493,37193,28702,22136,23663,24775,25958,27788,
+35930,36929,38931,21585,26311,37389,22856,37027,20869,20045,20970,34201,35598,
+28760,25466,37707,26978,39348,32260,30071,21335,26976,36575,38627,27741,20108,
+23612,24336,36841,21250,36049,32905,34425,24319,26085,20083,20837,22914,23615,
+38894,20219,22922,24525,35469,28641,31152,31074,23527,
+33905,29483,29105,24180,24565,25467,25754,29123,31896,20035,24316,20043,22492,
+22178,24745,28611,32013,33021,33075,33215,36786,35223,34468,24052,25226,25773,
+35207,26487,27874,27966,29750,30772,23110,32629,33453,39340,20467,24259,25309,
+25490,25943,26479,30403,29260,32972,32954,36649,37197,20493,22521,23186,26757,
+26995,29028,29437,36023,22770,36064,38506,36889,34687,31204,30695,33833,20271,
+21093,21338,25293,26575,27850,30333,31636,31893,33334,34180,36843,26333,28448,
+29190,32283,33707,39361,40614,20989,31665,30834,31672,32903,31560,27368,24161,
+32908,30033,30048,20843,37474,28300,30330,37271,39658,20240,32624,25244,31567,
+38309,40169,22138,22617,34532,38588,20276,21028,21322,21453,21467,24070,25644,
+26001,26495,27710,27726,29256,29359,29677,30036,32321,33324,34281,36009,31684,
+37318,29033,38930,39151,25405,26217,30058,30436,30928,34115,34542,21290,21329,
+21542,22915,24199,24444,24754,25161,25209,25259,26000,27604,27852,30130,30382,
+30865,31192,32203,32631,32933,34987,35513,36027,36991,38750,39131,27147,31800,
+20633,23614,24494,26503,27608,29749,30473,32654,40763,26570,31255,21305,30091,
+39661,24422,33181,33777,32920,24380,24517,30050,31558,36924,26727,23019,23195,
+32016,30334,35628,20469,24426,27161,27703,28418,29922,31080,34920,35413,35961,
+24287,25551,30149,31186,33495,37672,37618,33948,34541,39981,21697,24428,25996,
+27996,28693,36007,36051,38971,25935,29942,19981,20184,22496,22827,23142,23500,
+20904,24067,24220,24598,25206,25975,26023,26222,28014,29238,31526,33104,33178,
+33433,35676,36000,36070,36212,38428,38468,20398,25771,
+27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,24489,
+24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,39826,
+20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,25991,
+32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,38491,
+31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,29255,
+31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,37610,
+22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,27597,
+31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,24214,
+25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,33804,
+34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,20621,
+21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,32033,
+32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,22696,
+25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,26412,
+32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,21737,
+27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,26411,
+27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,39749,
+24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,30496,
+21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,21629,
+26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,38754,
+40634,25720,27169,33538,22916,23391,27611,29467,30450,
+32178,32791,33945,20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,
+36016,21839,24758,32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,
+30690,21380,24441,32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,
+27833,30290,35565,36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,
+25558,26377,26586,28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,
+37109,38596,34701,22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,
+23481,24248,25562,25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,
+32650,32768,33865,33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,
+27779,28020,32716,32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,
+32097,33853,37226,20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,
+23653,26446,26792,29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,
+31435,33870,25504,30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,
+40845,20406,24942,26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,
+28092,29471,30274,30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,
+32209,20523,21400,26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,
+22593,28057,32047,39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,
+33491,37428,38583,38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,
+24265,24651,24976,28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,
+27347,28809,36034,36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,
+28431,29282,29436,31725,32769,32894,34635,37070,20845,
+40595,31108,32907,37682,35542,20525,21644,35441,27498,36036,33031,24785,26528,
+40434,20121,20120,39952,35435,34241,34152,26880,28286,30871,33109,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+24332,19984,19989,20010,20017,20022,20028,20031,20034,20054,20056,20098,20101,
+35947,20106,33298,24333,20110,20126,20127,20128,20130,20144,20147,20150,20174,
+20173,20164,20166,20162,20183,20190,20205,20191,20215,20233,20314,20272,20315,
+20317,20311,20295,20342,20360,20367,20376,20347,20329,20336,20369,20335,20358,
+20374,20760,20436,20447,20430,20440,20443,20433,20442,20432,20452,20453,20506,
+20520,20500,20522,20517,20485,20252,20470,20513,20521,20524,20478,20463,20497,
+20486,20547,20551,26371,20565,20560,20552,20570,20566,20588,20600,20608,20634,
+20613,20660,20658,20681,20682,20659,20674,20694,20702,20709,20717,20707,20718,
+20729,20725,20745,20737,20738,20758,20757,20756,20762,20769,20794,20791,20796,
+20795,20799,20800,20818,20812,20820,20834,31480,20841,20842,20846,20864,20866,
+22232,20876,20873,20879,20881,20883,20885,20886,20900,20902,20898,20905,20906,
+20907,20915,20913,20914,20912,20917,20925,20933,20937,20955,20960,34389,20969,
+20973,20976,20981,20990,20996,21003,21012,21006,21031,21034,21038,21043,21049,
+21071,21060,21067,21068,21086,21076,21098,21108,21097,21107,21119,21117,21133,
+21140,21138,21105,21128,21137,36776,36775,
+21164,21165,21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,
+21237,21240,21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,
+21297,21299,21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,
+22808,21371,21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,
+38617,21471,26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,
+21564,21550,21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,
+21650,21627,21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,
+21704,21672,21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,
+21742,21741,21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,
+21816,21811,21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,
+21884,21891,21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,
+22007,22038,22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,
+22123,22116,22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,
+22198,22196,22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,
+22265,22272,22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,
+22310,22327,22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,
+22419,22432,22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,
+22499,22539,22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,
+22661,22713,22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,
+22745,22744,22757,22748,22756,22751,22767,22778,22777,
+22779,22780,22781,22786,22794,22800,22811,26790,22821,22828,22829,22834,22840,
+22846,31442,22869,22864,22862,22874,22872,22882,22880,22887,22892,22889,22904,
+22913,22941,20318,20395,22947,22962,22982,23016,23004,22925,23001,23002,23077,
+23071,23057,23068,23049,23066,23104,23148,23113,23093,23094,23138,23146,23194,
+23228,23230,23243,23234,23229,23267,23255,23270,23273,23254,23290,23291,23308,
+23307,23318,23346,23248,23338,23350,23358,23363,23365,23360,23377,23381,23386,
+23387,23397,23401,23408,23411,23413,23416,25992,23418,23424,23427,23462,23480,
+23491,23495,23497,23508,23504,23524,23526,23522,23518,23525,23531,23536,23542,
+23539,23557,23559,23560,23565,23571,23584,23586,23592,23608,23609,23617,23622,
+23630,23635,23632,23631,23409,23660,23662,20066,23670,23673,23692,23697,23700,
+22939,23723,23739,23734,23740,23735,23749,23742,23751,23769,23785,23805,23802,
+23789,23948,23786,23819,23829,23831,23900,23839,23835,23825,23828,23842,23834,
+23833,23832,23884,23890,23886,23883,23916,23923,23926,23943,23940,23938,23970,
+23965,23980,23982,23997,23952,23991,23996,24009,24013,24019,24018,24022,24027,
+24043,24050,24053,24075,24090,24089,24081,24091,24118,24119,24132,24131,24128,
+24142,24151,24148,24159,24162,24164,24135,24181,24182,24186,40636,24191,24224,
+24257,24258,24264,24272,24271,24278,24291,24285,24282,24283,24290,24289,24296,
+24297,24300,24305,24307,24304,24308,24312,24318,24323,24329,24413,24412,24331,
+24337,24342,24361,24365,24376,24385,24392,24396,24398,24367,24401,24406,24407,
+24409,24417,24429,24435,24439,24451,24450,24447,24458,
+24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,24534,24571,24548,
+24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,24590,24625,24603,
+24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,24650,24646,24653,
+24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,24707,24730,24708,
+24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,24756,24560,24765,
+24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,24826,24835,24865,
+24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,24892,24876,24884,
+24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,24943,24933,24945,
+24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,24970,24977,25003,
+25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,32633,25037,25062,
+25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,25097,25101,25100,
+25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,25166,25182,25187,
+25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,25300,25219,25236,
+25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,25290,25282,25287,
+25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,25424,25406,25421,
+25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,25503,25525,25451,
+25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,25622,25652,25606,
+25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,25678,25898,25749,
+25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,25816,25794,25841,
+25831,33289,25824,25825,25260,25827,25839,25900,25846,
+25844,25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,
+25911,25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,
+25986,25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,
+26075,26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,
+26140,26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,
+26243,26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,
+26296,26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,
+26406,26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,
+26467,26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,
+26607,26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,
+26566,26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,
+26723,26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,
+26805,26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,
+26892,26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,
+26863,26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,
+27006,26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,
+27054,27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,
+27182,27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,
+27122,27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,
+27204,27148,27250,27190,27256,27207,27234,27225,27238,
+27208,27192,27170,27280,27277,27296,27268,27298,27299,27287,34327,27323,27331,
+27330,27320,27315,27308,27358,27345,27359,27306,27354,27370,27387,27397,34326,
+27386,27410,27414,39729,27423,27448,27447,30428,27449,39150,27463,27459,27465,
+27472,27481,27476,27483,27487,27489,27512,27513,27519,27520,27524,27523,27533,
+27544,27541,27550,27556,27562,27563,27567,27570,27569,27571,27575,27580,27590,
+27595,27603,27615,27628,27627,27635,27631,40638,27656,27667,27668,27675,27684,
+27683,27742,27733,27746,27754,27778,27789,27802,27777,27803,27774,27752,27763,
+27794,27792,27844,27889,27859,27837,27863,27845,27869,27822,27825,27838,27834,
+27867,27887,27865,27882,27935,34893,27958,27947,27965,27960,27929,27957,27955,
+27922,27916,28003,28051,28004,27994,28025,27993,28046,28053,28644,28037,28153,
+28181,28170,28085,28103,28134,28088,28102,28140,28126,28108,28136,28114,28101,
+28154,28121,28132,28117,28138,28142,28205,28270,28206,28185,28274,28255,28222,
+28195,28267,28203,28278,28237,28191,28227,28218,28238,28196,28415,28189,28216,
+28290,28330,28312,28361,28343,28371,28349,28335,28356,28338,28372,28373,28303,
+28325,28354,28319,28481,28433,28748,28396,28408,28414,28479,28402,28465,28399,
+28466,28364,28478,28435,28407,28550,28538,28536,28545,28544,28527,28507,28659,
+28525,28546,28540,28504,28558,28561,28610,28518,28595,28579,28577,28580,28601,
+28614,28586,28639,28629,28652,28628,28632,28657,28654,28635,28681,28683,28666,
+28689,28673,28687,28670,28699,28698,28532,28701,28696,28703,28720,28734,28722,
+28753,28771,28825,28818,28847,28913,28844,28856,28851,
+28846,28895,28875,28893,28889,28937,28925,28956,28953,29029,29013,29064,29030,
+29026,29004,29014,29036,29071,29179,29060,29077,29096,29100,29143,29113,29118,
+29138,29129,29140,29134,29152,29164,29159,29173,29180,29177,29183,29197,29200,
+29211,29224,29229,29228,29232,29234,29243,29244,29247,29248,29254,29259,29272,
+29300,29310,29314,29313,29319,29330,29334,29346,29351,29369,29362,29379,29382,
+29380,29390,29394,29410,29408,29409,29433,29431,20495,29463,29450,29468,29462,
+29469,29492,29487,29481,29477,29502,29518,29519,40664,29527,29546,29544,29552,
+29560,29557,29563,29562,29640,29619,29646,29627,29632,29669,29678,29662,29858,
+29701,29807,29733,29688,29746,29754,29781,29759,29791,29785,29761,29788,29801,
+29808,29795,29802,29814,29822,29835,29854,29863,29898,29903,29908,29681,29920,
+29923,29927,29929,29934,29938,29936,29937,29944,29943,29956,29955,29957,29964,
+29966,29965,29973,29971,29982,29990,29996,30012,30020,30029,30026,30025,30043,
+30022,30042,30057,30052,30055,30059,30061,30072,30070,30086,30087,30068,30090,
+30089,30082,30100,30106,30109,30117,30115,30146,30131,30147,30133,30141,30136,
+30140,30129,30157,30154,30162,30169,30179,30174,30206,30207,30204,30209,30192,
+30202,30194,30195,30219,30221,30217,30239,30247,30240,30241,30242,30244,30260,
+30256,30267,30279,30280,30278,30300,30296,30305,30306,30312,30313,30314,30311,
+30316,30320,30322,30326,30328,30332,30336,30339,30344,30347,30350,30358,30355,
+30361,30362,30384,30388,30392,30393,30394,30402,30413,30422,30418,30430,30433,
+30437,30439,30442,34351,30459,30472,30471,30468,30505,
+30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,
+30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,
+30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,
+30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,
+30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,
+30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,
+31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,
+31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,
+31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,
+31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,
+31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,
+31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,
+31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,
+31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,
+31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,
+31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,
+31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,
+31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,
+31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,
+31994,32006,32002,32028,32021,32010,32069,32075,32046,
+32050,32063,32053,32070,32115,32086,32078,32114,32104,32110,32079,32099,32147,
+32137,32091,32143,32125,32155,32186,32174,32163,32181,32199,32189,32171,32317,
+32162,32175,32220,32184,32159,32176,32216,32221,32228,32222,32251,32242,32225,
+32261,32266,32291,32289,32274,32305,32287,32265,32267,32290,32326,32358,32315,
+32309,32313,32323,32311,32306,32314,32359,32349,32342,32350,32345,32346,32377,
+32362,32361,32380,32379,32387,32213,32381,36782,32383,32392,32393,32396,32402,
+32400,32403,32404,32406,32398,32411,32412,32568,32570,32581,32588,32589,32590,
+32592,32593,32597,32596,32600,32607,32608,32616,32617,32615,32632,32642,32646,
+32643,32648,32647,32652,32660,32670,32669,32666,32675,32687,32690,32697,32686,
+32694,32696,35697,32709,32710,32714,32725,32724,32737,32742,32745,32755,32761,
+39132,32774,32772,32779,32786,32792,32793,32796,32801,32808,32831,32827,32842,
+32838,32850,32856,32858,32863,32866,32872,32883,32882,32880,32886,32889,32893,
+32895,32900,32902,32901,32923,32915,32922,32941,20880,32940,32987,32997,32985,
+32989,32964,32986,32982,33033,33007,33009,33051,33065,33059,33071,33099,38539,
+33094,33086,33107,33105,33020,33137,33134,33125,33126,33140,33155,33160,33162,
+33152,33154,33184,33173,33188,33187,33119,33171,33193,33200,33205,33214,33208,
+33213,33216,33218,33210,33225,33229,33233,33241,33240,33224,33242,33247,33248,
+33255,33274,33275,33278,33281,33282,33285,33287,33290,33293,33296,33302,33321,
+33323,33336,33331,33344,33369,33368,33373,33370,33375,33380,33378,33384,33386,
+33387,33326,33393,33399,33400,33406,33421,33426,33451,
+33439,33467,33452,33505,33507,33503,33490,33524,33523,33530,33683,33539,33531,
+33529,33502,33542,33500,33545,33497,33589,33588,33558,33586,33585,33600,33593,
+33616,33605,33583,33579,33559,33560,33669,33690,33706,33695,33698,33686,33571,
+33678,33671,33674,33660,33717,33651,33653,33696,33673,33704,33780,33811,33771,
+33742,33789,33795,33752,33803,33729,33783,33799,33760,33778,33805,33826,33824,
+33725,33848,34054,33787,33901,33834,33852,34138,33924,33911,33899,33965,33902,
+33922,33897,33862,33836,33903,33913,33845,33994,33890,33977,33983,33951,34009,
+33997,33979,34010,34000,33985,33990,34006,33953,34081,34047,34036,34071,34072,
+34092,34079,34069,34068,34044,34112,34147,34136,34120,34113,34306,34123,34133,
+34176,34212,34184,34193,34186,34216,34157,34196,34203,34282,34183,34204,34167,
+34174,34192,34249,34234,34255,34233,34256,34261,34269,34277,34268,34297,34314,
+34323,34315,34302,34298,34310,34338,34330,34352,34367,34381,20053,34388,34399,
+34407,34417,34451,34467,34473,34474,34443,34444,34486,34479,34500,34502,34480,
+34505,34851,34475,34516,34526,34537,34540,34527,34523,34543,34578,34566,34568,
+34560,34563,34555,34577,34569,34573,34553,34570,34612,34623,34615,34619,34597,
+34601,34586,34656,34655,34680,34636,34638,34676,34647,34664,34670,34649,34643,
+34659,34666,34821,34722,34719,34690,34735,34763,34749,34752,34768,38614,34731,
+34756,34739,34759,34758,34747,34799,34802,34784,34831,34829,34814,34806,34807,
+34830,34770,34833,34838,34837,34850,34849,34865,34870,34873,34855,34875,34884,
+34882,34898,34905,34910,34914,34923,34945,34942,34974,
+34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,34992,
+35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,35048,
+35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,35131,
+35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,35191,
+35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,35258,
+35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,35340,
+35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,35426,
+35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,35522,
+35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,35596,
+35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,35624,
+35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,35700,
+35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,35912,
+35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,35981,
+35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,36040,
+36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,36109,
+36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,36290,
+36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,36348,
+36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,36423,
+36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,36476,
+36481,36487,36485,36484,36491,36490,36499,36497,36500,
+36505,36522,36513,36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,
+36604,36603,36587,36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,
+36620,36646,36659,36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,
+36700,36706,36707,36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,
+36842,36847,36999,36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,
+36875,36903,36918,36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,
+36950,36952,36958,36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,
+37001,37007,37032,37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,
+37170,37168,37194,37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,
+37282,37291,37295,37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,
+37343,37345,37339,37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,
+37463,37445,37449,37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,
+37466,37583,37561,37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,
+37690,37685,37691,37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,
+37846,37847,37864,37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,
+37891,37895,37904,37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,
+37986,37982,37994,37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,
+38274,38279,38282,38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,
+38329,38334,38346,28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,
+38370,38433,38440,38446,38447,38466,38476,38479,38475,
+38519,38492,38494,38493,38495,38502,38514,38508,38541,38552,38549,38551,38570,
+38567,38577,38578,38576,38580,38582,38584,38585,38606,38603,38601,38605,35149,
+38620,38669,38613,38649,38660,38662,38664,38675,38670,38673,38671,38678,38681,
+38692,38698,38704,38713,38717,38718,38724,38726,38728,38722,38729,38748,38752,
+38756,38758,38760,21202,38763,38769,38777,38789,38780,38785,38778,38790,38795,
+38799,38800,38812,38824,38822,38819,38835,38836,38851,38854,38856,38859,38876,
+38893,40783,38898,31455,38902,38901,38927,38924,38968,38948,38945,38967,38973,
+38982,38991,38987,39019,39023,39024,39025,39028,39027,39082,39087,39089,39094,
+39108,39107,39110,39145,39147,39171,39177,39186,39188,39192,39201,39197,39198,
+39204,39200,39212,39214,39229,39230,39234,39241,39237,39248,39243,39249,39250,
+39244,39253,39319,39320,39333,39341,39342,39356,39391,39387,39389,39384,39377,
+39405,39406,39409,39410,39419,39416,39425,39439,39429,39394,39449,39467,39479,
+39493,39490,39488,39491,39486,39509,39501,39515,39511,39519,39522,39525,39524,
+39529,39531,39530,39597,39600,39612,39616,39631,39633,39635,39636,39646,39647,
+39650,39651,39654,39663,39659,39662,39668,39665,39671,39675,39686,39704,39706,
+39711,39714,39715,39717,39719,39720,39721,39722,39726,39727,39730,39748,39747,
+39759,39757,39758,39761,39768,39796,39827,39811,39825,39830,39831,39839,39840,
+39848,39860,39872,39882,39865,39878,39887,39889,39890,39907,39906,39908,39892,
+39905,39994,39922,39921,39920,39957,39956,39945,39955,39948,39942,39944,39954,
+39946,39940,39982,39963,39973,39972,39969,39984,40007,
+39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,40201,40200,
+40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,40257,40255,
+40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,40327,40363,
+40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,40390,40399,
+40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,40565,40569,
+40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,40632,40618,
+40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,40677,40680,
+40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,40725,40737,
+40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,40812,40810,
+40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,29081,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,
diff --git a/libc-top-half/musl/src/locale/ksc.h b/libc-top-half/musl/src/locale/ksc.h
new file mode 100644
index 0000000..cf2ec68
--- /dev/null
+++ b/libc-top-half/musl/src/locale/ksc.h
@@ -0,0 +1,650 @@
+12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,
+8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,
+12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,
+65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,
+9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,
+8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,
+8835,8746,8745,8743,8744,65506,8658,8660,8704,8707,180,65374,711,728,733,730,
+729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,
+9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,
+9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,
+9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65281,65282,65283,65284,65285,65286,
+65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,
+65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,
+65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,
+65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,
+65339,65510,65341,65342,65343,65344,65345,65346,65347,
+65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,
+65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,
+65507,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,
+12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,
+12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,
+12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,
+12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,
+12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,
+12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,
+12683,12684,12685,12686,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,0,0,
+0,0,0,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,0,0,0,0,0,0,0,913,914,
+915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,
+935,936,937,0,0,0,0,0,0,0,0,945,946,947,948,949,950,951,952,953,954,955,956,
+957,958,959,960,961,963,964,965,966,967,968,969,0,0,0,0,0,0,9472,9474,9484,
+9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,
+9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,
+9489,9498,9497,9494,9493,9486,9485,9502,
+9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525,9526,9529,9530,
+9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13205,13206,13207,8467,13208,13252,13219,
+13220,13221,13222,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,
+13258,13197,13198,13199,13263,13192,13193,13256,13223,13224,13232,13233,13234,
+13235,13236,13237,13238,13239,13240,13241,13184,13185,13186,13187,13188,13242,
+13243,13244,13245,13246,13247,13200,13201,13202,13203,13204,8486,13248,13249,
+13194,13195,13196,13270,13253,13229,13230,13231,13275,13225,13226,13227,13228,
+13277,13264,13267,13251,13257,13276,13254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,
+208,170,294,0,306,0,319,321,216,338,186,222,358,330,0,12896,12897,12898,12899,
+12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,
+12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,9424,9425,
+9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,
+9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314,9315,9316,9317,
+9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188,190,8539,8540,
+8541,8542,230,273,240,295,305,307,312,320,322,248,339,223,254,359,331,
+329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,
+12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,
+12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,
+9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9332,
+9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,185,178,
+179,8308,8319,8321,8322,8323,8324,12353,12354,12355,12356,12357,12358,12359,
+12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,
+12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,
+12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,
+12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,
+12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,
+12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,0,0,0,0,0,0,
+0,0,0,0,0,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,
+12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,
+12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,
+12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,
+12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,
+12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,
+12525,12526,12527,12528,12529,12530,12531,
+12532,12533,12534,0,0,0,0,0,0,0,0,1040,1041,1042,1043,1044,1045,1025,1046,
+1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,
+1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,
+1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,
+1101,1102,1103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,44032,44033,44036,44039,44040,44041,44042,44048,
+44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061,44064,
+44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109,44116,
+44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164,44165,
+44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193,44200,
+44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228,44232,
+44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272,44273,
+44275,44277,44278,44284,44285,44288,44292,44294,44300,44301,44303,44305,44312,
+44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359,44361,
+44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406,44411,
+44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452,44471,
+44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537,44540,
+44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599,44600,
+44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628,44630,
+44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,44665,44667,
+44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749,44751,
+44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807,44808,
+44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866,44867,
+44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944,44945,
+44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006,45012,
+45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072,45076,
+45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141,45143,
+45145,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209,45210,
+45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231,45233,
+45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265,45268,
+45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337,45339,
+45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369,45376,
+45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433,45436,
+45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480,45516,
+45520,45524,45532,45533,45535,45544,45545,45548,45552,
+45561,45563,45565,45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,
+45620,45628,45656,45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,
+45712,45713,45716,45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,
+45744,45748,45768,45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,
+45797,45798,45800,45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,
+45817,45818,45819,45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,
+45852,45908,45909,45910,45912,45915,45916,45918,45919,45924,45925,45927,45929,
+45931,45934,45936,45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,
+45972,45984,45985,45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,
+46037,46039,46041,46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,
+46120,46121,46123,46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,
+46208,46216,46237,46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,
+46293,46300,46301,46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,
+46357,46360,46363,46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,
+46392,46400,46401,46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,
+46431,46432,46433,46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,
+46517,46523,46524,46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,
+46608,46609,46612,46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,
+46756,46763,46764,46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,
+46892,46895,46896,46904,46905,46907,46916,46920,46924,
+46932,46933,46944,46948,46952,46960,46961,46963,46965,46972,46973,46976,46980,
+46988,46989,46991,46992,46993,46994,46998,46999,47000,47001,47004,47008,47016,
+47017,47019,47020,47021,47028,47029,47032,47047,47049,47084,47085,47088,47092,
+47100,47101,47103,47104,47105,47111,47112,47113,47116,47120,47128,47129,47131,
+47133,47140,47141,47144,47148,47156,47157,47159,47160,47161,47168,47172,47185,
+47187,47196,47197,47200,47204,47212,47213,47215,47217,47224,47228,47245,47272,
+47280,47284,47288,47296,47297,47299,47301,47308,47312,47316,47325,47327,47329,
+47336,47337,47340,47344,47352,47353,47355,47357,47364,47384,47392,47420,47421,
+47424,47428,47436,47439,47441,47448,47449,47452,47456,47464,47465,47467,47469,
+47476,47477,47480,47484,47492,47493,47495,47497,47498,47501,47502,47532,47533,
+47536,47540,47548,47549,47551,47553,47560,47561,47564,47566,47567,47568,47569,
+47570,47576,47577,47579,47581,47582,47585,47587,47588,47589,47592,47596,47604,
+47605,47607,47608,47609,47610,47616,47617,47624,47637,47672,47673,47676,47680,
+47682,47688,47689,47691,47693,47694,47699,47700,47701,47704,47708,47716,47717,
+47719,47720,47721,47728,47729,47732,47736,47747,47748,47749,47751,47756,47784,
+47785,47787,47788,47792,47794,47800,47801,47803,47805,47812,47816,47832,47833,
+47868,47872,47876,47885,47887,47889,47896,47900,47904,47913,47915,47924,47925,
+47926,47928,47931,47932,47933,47934,47940,47941,47943,47945,47949,47951,47952,
+47956,47960,47969,47971,47980,48008,48012,48016,48036,48040,48044,48052,48055,
+48064,48068,48072,48080,48083,48120,48121,48124,48127,
+48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149,48150,48151,
+48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173,48176,48177,
+48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208,48221,48260,
+48261,48264,48267,48268,48270,48276,48277,48279,48281,48282,48288,48289,48292,
+48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324,48333,48335,
+48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388,48389,48391,
+48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472,48473,48484,
+48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531,48533,48537,
+48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624,48628,48632,
+48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708,48709,48712,
+48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740,48744,48746,
+48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780,48781,48783,
+48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864,48867,48868,
+48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960,48961,48964,
+48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108,49116,49119,
+49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300,49304,49312,
+49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334,49340,49341,
+49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371,49372,49373,
+49380,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416,49424,49429,
+49436,49437,49438,49439,49440,49443,49444,49446,49447,
+49452,49453,49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,
+49484,49485,49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,
+49528,49541,49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,
+49576,49577,49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,
+49640,49648,49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,
+49689,49692,49695,49696,49704,49705,49707,49709,49711,49713,49714,49716,49736,
+49744,49745,49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,
+49793,49800,49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,
+49845,49847,49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,
+49910,49912,49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,
+49944,49948,49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,
+50041,50044,50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,
+50152,50153,50157,50164,50165,50168,50184,50192,50212,50220,50224,50228,50236,
+50237,50248,50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,
+50364,50409,50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,
+50460,50472,50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,
+50506,50508,50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,
+50529,50532,50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,
+50572,50573,50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,
+50617,50619,50620,50621,50622,50628,50629,50630,50631,
+50632,50633,50634,50636,50638,50640,50641,50644,50648,50656,50657,50659,50661,
+50668,50669,50670,50672,50676,50678,50679,50684,50685,50686,50687,50688,50689,
+50693,50694,50695,50696,50700,50704,50712,50713,50715,50716,50724,50725,50728,
+50732,50733,50734,50736,50739,50740,50741,50743,50745,50747,50752,50753,50756,
+50760,50768,50769,50771,50772,50773,50780,50781,50784,50796,50799,50801,50808,
+50809,50812,50816,50824,50825,50827,50829,50836,50837,50840,50844,50852,50853,
+50855,50857,50864,50865,50868,50872,50873,50874,50880,50881,50883,50885,50892,
+50893,50896,50900,50908,50909,50912,50913,50920,50921,50924,50928,50936,50937,
+50941,50948,50949,50952,50956,50964,50965,50967,50969,50976,50977,50980,50984,
+50992,50993,50995,50997,50999,51004,51005,51008,51012,51018,51020,51021,51023,
+51025,51026,51027,51028,51029,51030,51031,51032,51036,51040,51048,51051,51060,
+51061,51064,51068,51069,51070,51075,51076,51077,51079,51080,51081,51082,51086,
+51088,51089,51092,51094,51095,51096,51098,51104,51105,51107,51108,51109,51110,
+51116,51117,51120,51124,51132,51133,51135,51136,51137,51144,51145,51148,51150,
+51152,51160,51165,51172,51176,51180,51200,51201,51204,51208,51210,51216,51217,
+51219,51221,51222,51228,51229,51232,51236,51244,51245,51247,51249,51256,51260,
+51264,51272,51273,51276,51277,51284,51312,51313,51316,51320,51322,51328,51329,
+51331,51333,51334,51335,51339,51340,51341,51348,51357,51359,51361,51368,51388,
+51389,51396,51400,51404,51412,51413,51415,51417,51424,51425,51428,51445,51452,
+51453,51456,51460,51461,51462,51468,51469,51471,51473,
+51480,51500,51508,51536,51537,51540,51544,51552,51553,51555,51564,51568,51572,
+51580,51592,51593,51596,51600,51608,51609,51611,51613,51648,51649,51652,51655,
+51656,51658,51664,51665,51667,51669,51670,51673,51674,51676,51677,51680,51682,
+51684,51687,51692,51693,51695,51696,51697,51704,51705,51708,51712,51720,51721,
+51723,51724,51725,51732,51736,51753,51788,51789,51792,51796,51804,51805,51807,
+51808,51809,51816,51837,51844,51864,51900,51901,51904,51908,51916,51917,51919,
+51921,51923,51928,51929,51936,51948,51956,51976,51984,51988,51992,52000,52001,
+52033,52040,52041,52044,52048,52056,52057,52061,52068,52088,52089,52124,52152,
+52180,52196,52199,52201,52236,52237,52240,52244,52252,52253,52257,52258,52263,
+52264,52265,52268,52270,52272,52280,52281,52283,52284,52285,52286,52292,52293,
+52296,52300,52308,52309,52311,52312,52313,52320,52324,52326,52328,52336,52341,
+52376,52377,52380,52384,52392,52393,52395,52396,52397,52404,52405,52408,52412,
+52420,52421,52423,52425,52432,52436,52452,52460,52464,52481,52488,52489,52492,
+52496,52504,52505,52507,52509,52516,52520,52524,52537,52572,52576,52580,52588,
+52589,52591,52593,52600,52616,52628,52629,52632,52636,52644,52645,52647,52649,
+52656,52676,52684,52688,52712,52716,52720,52728,52729,52731,52733,52740,52744,
+52748,52756,52761,52768,52769,52772,52776,52784,52785,52787,52789,52824,52825,
+52828,52831,52832,52833,52840,52841,52843,52845,52852,52853,52856,52860,52868,
+52869,52871,52873,52880,52881,52884,52888,52896,52897,52899,52900,52901,52908,
+52909,52929,52964,52965,52968,52971,52972,52980,52981,
+52983,52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,
+53028,53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,
+53095,53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,
+53216,53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,
+53293,53300,53301,53304,53308,53316,53317,53319,53321,53328,53332,53336,53344,
+53356,53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,
+53431,53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,
+53469,53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,
+53560,53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,
+53599,53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,
+53683,53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,
+53808,53812,53820,53821,53823,53825,53832,53852,53860,53888,53889,53892,53896,
+53904,53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,
+53954,53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,
+54016,54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,
+54048,54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,
+54085,54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,
+54176,54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,
+54232,54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,54280,54301,
+54336,54340,54364,54368,54372,54381,54383,54392,54393,
+54396,54399,54400,54402,54408,54409,54411,54413,54420,54441,54476,54480,54484,
+54492,54495,54504,54508,54512,54520,54523,54525,54532,54536,54540,54548,54549,
+54551,54588,54589,54592,54596,54604,54605,54607,54609,54616,54617,54620,54624,
+54629,54632,54633,54635,54637,54644,54645,54648,54652,54660,54661,54663,54664,
+54665,54672,54693,54728,54729,54732,54736,54738,54744,54745,54747,54749,54756,
+54757,54760,54764,54772,54773,54775,54777,54784,54785,54788,54792,54800,54801,
+54803,54804,54805,54812,54816,54820,54829,54840,54841,54844,54848,54853,54856,
+54857,54859,54861,54865,54868,54869,54872,54876,54887,54889,54896,54897,54900,
+54915,54917,54924,54925,54928,54932,54941,54943,54945,54952,54956,54960,54969,
+54971,54980,54981,54984,54988,54993,54996,54999,55001,55008,55012,55016,55024,
+55029,55036,55037,55040,55044,55057,55064,55065,55068,55072,55080,55081,55083,
+55085,55092,55093,55096,55100,55108,55111,55113,55120,55121,55124,55126,55127,
+55128,55129,55136,55137,55139,55141,55145,55148,55152,55156,55164,55165,55169,
+55176,55177,55180,55184,55192,55193,55195,55197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20285,20339,20551,20729,21152,21487,21621,21733,
+22025,23233,23478,26247,26550,26551,26607,27468,29634,30146,31292,33499,33540,
+34903,34952,35382,36040,36303,36603,36838,39381,21051,21364,21508,24682,24932,
+27580,29647,33050,35258,35282,38307,20355,21002,22718,22904,23014,24178,24185,
+25031,25536,26438,26604,26751,28567,30286,30475,30965,31240,31487,31777,32925,
+33390,33393,35563,38291,20075,21917,26359,28212,30883,31469,33883,35088,34638,
+38824,21208,22350,22570,23884,24863,25022,25121,25954,26577,27204,28187,29976,
+30131,30435,30640,32058,37039,37969,37970,40853,21283,23724,30002,32987,37440,
+38296,21083,22536,23004,23713,23831,24247,24378,24394,24951,27743,30074,30086,
+31968,32115,32177,32652,33108,33313,34193,35137,35611,37628,38477,40007,20171,
+20215,20491,20977,22607,24887,24894,24936,25913,27114,28433,30117,30342,30422,
+31623,33445,33995,63744,37799,38283,21888,23458,22353,63745,31923,32697,37301,
+20520,21435,23621,24040,25298,25454,25818,25831,28192,28844,31067,36317,36382,
+63746,36989,37445,37624,20094,20214,20581,24062,24314,24838,26967,33137,34388,
+36423,37749,39467,20062,20625,26480,26688,20745,21133,21138,27298,30652,37392,
+40660,21163,24623,36850,20552,25001,25581,25802,26684,27268,28608,33160,35233,
+38548,22533,29309,29356,29956,32121,32365,32937,35211,35700,36963,40273,25225,
+27770,28500,32080,32570,35363,20860,24906,31645,35609,37463,37772,20140,20435,
+20510,20670,20742,21185,21197,21375,22384,22659,24218,24465,24950,25004,
+25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,29861,29898,30169,
+30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,35686,36629,36885,
+37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,23622,24760,25106,
+26690,26800,26856,28330,30028,30328,30926,31293,31995,32363,32380,35336,35489,
+35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,23611,24235,25335,
+25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,31295,32660,32771,
+32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,36764,37678,38599,
+39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,22256,22372,23825,
+26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,20379,20844,20849,
+21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,34467,36002,38799,
+20018,23521,25096,26524,29916,31185,33747,35463,35506,36328,36942,37707,38982,
+24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,27454,28748,29743,
+29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,25324,36866,20362,
+20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,33009,37979,21350,
+25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,39745,23439,32024,
+32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,25934,26657,27211,
+29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,37066,39171,39509,
+39851,19992,20037,20061,20167,20465,20855,21246,21312,21475,21477,21646,22036,
+22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,27083,27472,27590,
+27628,27714,28317,28792,29399,29590,29699,30655,30697,
+31350,32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,
+37476,37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,
+21531,31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,
+31406,33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,
+21413,29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,
+27512,36020,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,
+31998,33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,
+27224,20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,
+26681,27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,
+25810,26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,
+21450,24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,
+20864,21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,
+24190,24524,25216,26071,26083,26398,26399,26462,26827,26820,27231,27450,27683,
+27773,27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,
+31047,31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,
+36215,37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,
+26708,37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,
+63760,63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,
+63771,63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,
+26511,26976,28275,63778,30007,63779,63780,63781,32013,
+63782,63783,34930,22218,23064,63784,63785,63786,63787,63788,20035,63789,20839,
+22856,26608,32784,63790,22899,24180,25754,31178,24565,24684,25288,25467,23527,
+23511,21162,63791,22900,24361,24594,63792,63793,63794,29785,63795,63796,63797,
+63798,63799,63800,39377,63801,63802,63803,63804,63805,63806,63807,63808,63809,
+63810,63811,28611,63812,63813,33215,36786,24817,63814,63815,33126,63816,63817,
+23615,63818,63819,63820,63821,63822,63823,63824,63825,23273,35365,26491,32016,
+63826,63827,63828,63829,63830,63831,33021,63832,63833,23612,27877,21311,28346,
+22810,33590,20025,20150,20294,21934,22296,22727,24406,26039,26086,27264,27573,
+28237,30701,31471,31774,32222,34507,34962,37170,37723,25787,28606,29562,30136,
+36948,21846,22349,25018,25812,26311,28129,28251,28525,28601,30192,32835,33213,
+34113,35203,35527,35674,37663,27795,30035,31572,36367,36957,21776,22530,22616,
+24162,25095,25758,26848,30070,31958,34739,40680,20195,22408,22382,22823,23565,
+23729,24118,24453,25140,25825,29619,33274,34955,36024,38538,40667,23429,24503,
+24755,20498,20992,21040,22294,22581,22615,23566,23648,23798,23947,24230,24466,
+24764,25361,25481,25623,26691,26873,27330,28120,28193,28372,28644,29182,30428,
+30585,31153,31291,33796,35241,36077,36339,36424,36867,36884,36947,37117,37709,
+38518,38876,27602,28678,29272,29346,29544,30563,31167,31716,32411,35712,22697,
+24775,25958,26109,26302,27788,28958,29129,35930,38931,20077,31361,20189,20908,
+20941,21205,21516,24999,26481,26704,26847,27934,28540,30140,30643,31461,33012,
+33891,37509,20828,26007,26460,26515,30168,31431,33651,
+63834,35910,36887,38957,23663,33216,33434,36929,36975,37389,24471,23965,27225,
+29128,30331,31561,34276,35588,37159,39472,21895,25078,63835,30313,32645,34367,
+34746,35064,37007,63836,27931,28889,29662,32097,33853,63837,37226,39409,63838,
+20098,21365,27396,27410,28734,29211,34349,40478,21068,36771,23888,25829,25900,
+27414,28651,31811,32412,34253,35172,35261,25289,33240,34847,24266,26391,28010,
+29436,29701,29807,34690,37086,20358,23821,24480,33802,20919,25504,30053,20142,
+20486,20841,20937,26753,27153,31918,31921,31975,33391,35538,36635,37327,20406,
+20791,21237,21570,24300,24942,25150,26053,27354,28670,31018,34268,34851,38317,
+39522,39530,40599,40654,21147,26310,27511,28701,31019,36706,38722,24976,25088,
+25891,28451,29001,29833,32244,32879,34030,36646,36899,37706,20925,21015,21155,
+27916,28872,35010,24265,25986,27566,28610,31806,29557,20196,20278,22265,63839,
+23738,23994,24604,29618,31533,32666,32718,32838,36894,37428,38646,38728,38936,
+40801,20363,28583,31150,37300,38583,21214,63840,25736,25796,27347,28510,28696,
+29200,30439,32769,34310,34396,36335,36613,38706,39791,40442,40565,30860,31103,
+32160,33737,37636,40575,40595,35542,22751,24324,26407,28711,29903,31840,32894,
+20769,28712,29282,30922,36034,36058,36084,38647,20102,20698,23534,24278,26009,
+29134,30274,30637,32842,34044,36988,39719,40845,22744,23105,23650,27155,28122,
+28431,30267,32047,32311,34078,35128,37860,38475,21129,26066,26611,27060,27969,
+28316,28687,29705,29792,30041,30244,30827,35628,39006,20845,25134,38520,20374,
+20523,23833,28138,32184,36650,24459,24900,26647,63841,
+38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,
+21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,
+31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,
+29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,31435,
+31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,
+33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,
+28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,
+33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,
+36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,
+36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,
+33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,
+40629,28357,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,
+33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,
+25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,
+33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,
+22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,
+33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,
+28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,
+20497,21006,21563,21839,25991,27766,32010,32011,32862,34442,38272,38639,21247,
+27797,29289,21619,23194,23614,23883,24396,24494,26410,
+26806,26979,28220,28228,30473,31859,32654,34183,35598,36855,38753,40692,23735,
+24758,24845,25003,25935,26107,26108,27665,27887,29599,29641,32225,38292,23494,
+34588,35600,21085,21338,25293,25615,25778,26420,27192,27850,29632,29854,31636,
+31893,32283,33162,33334,34180,36843,38649,39361,20276,21322,21453,21467,25292,
+25644,25856,26001,27075,27886,28504,29677,30036,30242,30436,30460,30928,30971,
+31020,32070,33324,34784,36820,38930,39151,21187,25300,25765,28196,28497,30332,
+36299,37297,37474,39662,39747,20515,20621,22346,22952,23592,24135,24439,25151,
+25918,26041,26049,26121,26507,27036,28354,30917,32033,32938,33152,33323,33459,
+33953,34444,35370,35607,37030,38450,40848,20493,20467,63843,22521,24472,25308,
+25490,26479,28227,28953,30403,32972,32986,35060,35061,35097,36064,36649,37197,
+38506,20271,20336,24091,26575,26658,30333,30334,39748,24161,27146,29033,29140,
+30058,63844,32321,34115,34281,39132,20240,31567,32624,38309,20961,24070,26805,
+27710,27726,27867,29359,31684,33539,27861,29754,20731,21128,22721,25816,27287,
+29863,30294,30887,34327,38370,38713,63845,21342,24321,35722,36776,36783,37002,
+21029,30629,40009,40712,19993,20482,20853,23643,24183,26142,26170,26564,26821,
+28851,29953,30149,31177,31453,36647,39200,39432,20445,22561,22577,23542,26222,
+27493,27921,28282,28541,29668,29995,33769,35036,35091,35676,36628,20239,20693,
+21264,21340,23443,24489,26381,31119,33145,33583,34068,35079,35206,36665,36667,
+39333,39954,26412,20086,20472,22857,23553,23791,23792,25447,26834,28925,29090,
+29739,32299,34028,34562,36898,37586,40179,19981,20184,
+20463,20613,21078,21103,21542,21648,22496,22827,23142,23386,23413,23500,24220,
+63846,25206,25975,26023,28014,28325,29238,31526,31807,32566,33104,33105,33178,
+33344,33433,33705,35331,36000,36070,36091,36212,36282,37096,37340,38428,38468,
+39385,40167,21271,20998,21545,22132,22707,22868,22894,24575,24996,25198,26128,
+27774,28954,30406,31881,31966,32027,33452,36033,38640,63847,20315,24343,24447,
+25282,23849,26379,26842,30844,32323,40300,19989,20633,21269,21290,21329,22915,
+23138,24199,24754,24970,25161,25209,26000,26503,27047,27604,27606,27607,27608,
+27832,63848,29749,30202,30738,30865,31189,31192,31875,32203,32737,32933,33086,
+33218,33778,34586,35048,35513,35692,36027,37145,38750,39131,40763,22188,23338,
+24428,25996,27315,27567,27996,28657,28693,29277,29613,36007,36051,38971,24977,
+27703,32856,39425,20045,20107,20123,20181,20282,20284,20351,20447,20735,21490,
+21496,21766,21987,22235,22763,22882,23057,23531,23546,23556,24051,24107,24473,
+24605,25448,26012,26031,26614,26619,26797,27515,27801,27863,28195,28681,29509,
+30722,31038,31040,31072,31169,31721,32023,32114,32902,33293,33678,34001,34503,
+35039,35408,35422,35613,36060,36198,36781,37034,39164,39391,40605,21066,63849,
+26388,63850,20632,21034,23665,25955,27733,29642,29987,30109,31639,33948,37240,
+38704,20087,25746,27578,29022,34217,19977,63851,26441,26862,28183,33439,34072,
+34923,25591,28545,37394,39087,19978,20663,20687,20767,21830,21930,22039,23360,
+23577,23776,24120,24202,24224,24258,24819,26705,27233,28248,29245,29248,29376,
+30456,31077,31665,32724,35059,35316,35443,35937,36062,
+38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,63853,
+31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,26329,
+26360,26646,26866,29312,29790,31598,32110,32214,32626,32997,33298,34223,35199,
+35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,27728,
+28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,23459,
+25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,32341,
+32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,39854,
+21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,40807,
+21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,22478,
+22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,32854,
+32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,36016,
+21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,27836,
+28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,32032,
+32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,23660,
+26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,39137,
+29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,30862,
+37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,23744,
+24101,24833,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,28465,
+29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,32172,
+32353,32670,33065,33585,33936,34010,34282,34966,35504,
+35728,36664,36930,36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,
+39318,39635,39706,21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,
+32901,33789,24033,24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,
+29667,30462,30636,31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,
+37662,38918,39348,25100,34899,36848,37477,23815,23847,23913,29791,33181,34664,
+28629,25342,32722,35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,
+34821,38494,20365,21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,
+26045,26159,26178,26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,
+35433,35553,35925,35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,
+31698,34645,35672,36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,
+26032,26216,29180,30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,
+36523,36763,63857,36805,22833,23460,23526,24713,23529,23563,24515,27777,63858,
+28145,28683,29978,33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,
+21854,23077,23784,25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,
+40201,40285,22538,23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,
+38990,39952,40823,23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,
+26017,35585,36555,38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,
+25276,29390,40232,20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,
+23830,24859,26326,28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,
+33099,38989,27387,32588,40367,40474,20063,20539,20918,
+22812,24825,25590,26928,29242,32822,63860,37326,24369,63861,63862,32004,33509,
+33903,33979,34277,36493,63863,20335,63864,63865,22756,23363,24665,25562,25880,
+25965,26264,63866,26954,27171,27915,28673,29036,30162,30221,31155,31344,63867,
+32650,63868,35140,63869,35731,37312,38525,63870,39178,22276,24481,26044,28417,
+30208,31142,35486,39341,39770,40812,20740,25014,25233,27277,33222,20547,22576,
+24422,28937,35328,35578,23420,34326,20474,20796,22196,22852,25513,28153,23978,
+26989,20870,20104,20313,63871,63872,63873,22914,63874,63875,27487,27741,63876,
+29877,30998,63877,33287,33349,33593,36671,36701,63878,39192,63879,63880,63881,
+20134,63882,22495,24441,26131,63883,63884,30123,32377,35695,63885,36870,39515,
+22181,22567,23032,23071,23476,63886,24310,63887,63888,25424,25403,63889,26941,
+27783,27839,28046,28051,28149,28436,63890,28895,28982,29017,63891,29123,29141,
+63892,30799,30831,63893,31605,32227,63894,32303,63895,34893,36575,63896,63897,
+63898,37467,63899,40182,63900,63901,63902,24709,28037,63903,29105,63904,63905,
+38321,21421,63906,63907,63908,26579,63909,28814,28976,29744,33398,33490,63910,
+38331,39653,40573,26308,63911,29121,33865,63912,63913,22603,63914,63915,23992,
+24433,63916,26144,26254,27001,27054,27704,27891,28214,28481,28634,28699,28719,
+29008,29151,29552,63917,29787,63918,29908,30408,31310,32403,63919,63920,33521,
+35424,36814,63921,37704,63922,38681,63923,63924,20034,20522,63925,21000,21473,
+26355,27757,28618,29450,30591,31330,33454,34269,34306,63926,35028,35427,35709,
+35947,63927,37555,63928,38675,38928,20116,20237,20425,
+20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,63929,25034,
+25942,26111,26212,26791,27738,28595,28879,29100,29522,31613,34568,35492,39986,
+40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,34314,20800,
+22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,31401,31402,
+33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,29715,29740,
+30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,26106,26505,
+27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,63930,63931,
+20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,25622,25747,
+25854,63934,26332,63935,27208,63936,29183,29796,63937,31368,31407,32327,32350,
+32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,27442,28020,
+32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,24898,27029,
+28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,37780,37854,
+63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,24858,24962,
+26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,34261,34398,
+36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,26671,29020,
+31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,34131,36939,
+38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,22291,22290,
+22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,29232,29503,
+29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,37470,20301,
+20553,20702,21361,22285,22996,23041,23561,24944,26256,
+28205,29234,29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,
+38859,39759,20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,
+24254,24736,24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,
+26978,27833,27943,63946,28216,63947,28641,29494,29495,63948,29788,30001,63949,
+30290,63950,63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,
+36926,36986,37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,
+63956,20801,22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,
+63960,63961,63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,
+27575,35518,37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,
+37009,20957,25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,
+27589,30097,30691,32681,33380,34191,34811,34915,35516,35696,37291,20108,20197,
+20234,63965,63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,
+63971,29246,29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,
+33617,63975,63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,
+30410,32714,32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,
+23493,24341,24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,
+38775,63986,63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,
+22764,22922,23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,63991,
+63992,63993,20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,
+23388,24675,24904,28363,28825,29038,29574,29943,30133,
+30913,32043,32773,33258,33576,34071,34249,35566,36039,38604,20316,21242,22204,
+26027,26152,28796,28856,29237,32189,33421,37196,38592,40306,23409,26855,27544,
+28538,30430,23697,26283,28507,31668,31786,34870,38620,19976,20183,21280,22580,
+22715,22767,22892,23559,24115,24196,24373,25484,26290,26454,27167,27299,27404,
+28479,29254,63994,29520,29835,31456,31911,33144,33247,33255,33674,33900,34083,
+34196,34255,35037,36115,37292,38263,38556,20877,21705,22312,23472,25165,26448,
+26685,26771,28221,28371,28797,32289,35009,36001,36617,40779,40782,29229,31631,
+35533,37658,20295,20302,20786,21632,22992,24213,25269,26485,26990,27159,27822,
+28186,29401,29482,30141,31672,32053,33511,33785,33879,34295,35419,36015,36487,
+36889,37048,38606,40799,21219,21514,23265,23490,25688,25973,28404,29380,63995,
+30340,31309,31515,31821,32318,32735,33659,35627,36042,36196,36321,36447,36842,
+36857,36969,37841,20291,20346,20659,20840,20856,21069,21098,22625,22652,22880,
+23560,23637,24283,24731,25136,26643,27583,27656,28593,29006,29728,30000,30008,
+30033,30322,31564,31627,31661,31686,32399,35438,36670,36681,37439,37523,37666,
+37931,38651,39002,39019,39198,20999,25130,25240,27993,30308,31434,31680,32118,
+21344,23742,24215,28472,28857,31896,38673,39822,40670,25509,25722,34678,19969,
+20117,20141,20572,20597,21576,22979,23450,24128,24237,24311,24449,24773,25402,
+25919,25972,26060,26230,26232,26622,26984,27273,27491,27712,28096,28136,28191,
+28254,28702,28833,29582,29693,30010,30555,30855,31118,31243,31357,31934,32142,
+33351,35330,35562,35998,37165,37194,37336,37478,37580,
+37664,38662,38742,38748,38914,40718,21046,21137,21884,22564,24093,24351,24716,
+25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,37261,38500,38555,
+38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,25514,25805,26089,
+26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,29157,29226,29866,
+30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,32903,34299,34468,
+35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,26063,31751,36275,
+37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,24939,26837,28121,
+29742,31278,32066,32156,32305,33131,36394,36405,37758,37912,20304,22352,24038,
+24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,21608,22014,22863,
+23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,28557,28855,29664,
+30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,36490,36659,36913,
+37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,23535,23803,26201,
+27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,38603,39423,33537,
+20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,24974,26366,25327,
+28893,29969,30151,32338,33976,35657,36104,20043,21482,21675,22320,22336,24535,
+25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,27802,28460,30693,
+30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,35468,63996,36100,
+36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,25391,25634,26185,
+26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,30137,30433,30494,
+30603,31206,32265,32285,33275,34095,34967,35386,36049,
+36587,36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,
+29894,30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,
+28503,32221,36655,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,
+23919,24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,
+31364,37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,
+32408,35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,
+22649,24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,
+24288,24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,
+33081,33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,
+34081,37319,37365,20874,26613,31574,36012,20932,22971,24765,34389,20508,63999,
+21076,23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,
+20191,21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,
+36368,36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,
+36639,36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,
+22558,22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,
+32893,33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,
+36958,39636,21021,21119,21736,24980,25220,25307,26786,26898,26970,27189,28818,
+28966,30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,
+37218,37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,
+21474,22618,23541,24740,24961,25696,32317,32880,34085,
+37507,25774,20652,23828,26368,22684,25277,25512,26894,27000,27166,28267,30394,
+31179,33467,33833,35535,36264,36861,37138,37195,37276,37648,37656,37786,38619,
+39478,39949,19985,30044,31069,31482,31569,31689,32302,33988,36441,36468,36600,
+36880,26149,26943,29763,20986,26414,40668,20805,24544,27798,34802,34909,34935,
+24756,33205,33795,36101,21462,21561,22068,23094,23601,28810,32736,32858,33030,
+33261,36259,37257,39519,40434,20596,20164,21408,24827,28204,23652,20360,20516,
+21988,23769,24159,24677,26772,27835,28100,29118,30164,30196,30305,31258,31305,
+32199,32251,32622,33268,34473,36636,38601,39347,40786,21063,21189,39149,35242,
+19971,26578,28422,20405,23522,26517,27784,28024,29723,30759,37341,37756,34756,
+31204,31281,24555,20182,21668,21822,22702,22949,24816,25171,25302,26422,26965,
+33333,38464,39345,39389,20524,21331,21828,22396,64001,25176,64002,25826,26219,
+26589,28609,28655,29730,29752,35351,37944,21585,22022,22374,24392,24986,27470,
+28760,28845,32187,35477,22890,33067,25506,30472,32829,36010,22612,25645,27067,
+23445,24081,28271,64003,34153,20812,21488,22826,24608,24907,27526,27760,27888,
+31518,32974,33492,36294,37040,39089,64004,25799,28580,25745,25860,20814,21520,
+22303,35342,24927,26742,64005,30171,31570,32113,36890,22534,27084,33151,35114,
+36864,38969,20600,22871,22956,25237,36879,39722,24925,29305,38358,22369,23110,
+24052,25226,25773,25850,26487,27874,27966,29228,29750,30772,32631,33453,36315,
+38935,21028,22338,26495,29256,29923,36009,36774,37393,38442,20843,21485,25420,
+20329,21764,24726,25943,27803,28031,29260,29437,31255,
+35207,35997,24429,28558,28921,33192,24846,20415,20559,25153,29255,31687,32232,
+32745,36941,38829,39449,36022,22378,24179,26544,33805,35413,21536,23318,24163,
+24290,24330,25987,32954,34109,38281,38491,20296,21253,21261,21263,21638,21754,
+22275,24067,24598,25243,25265,25429,64006,27873,28006,30129,30770,32990,33071,
+33502,33889,33970,34957,35090,36875,37610,39165,39825,24133,26292,26333,28689,
+29190,64007,20469,21117,24426,24915,26451,27161,28418,29922,31080,34920,35961,
+39111,39108,39491,21697,31263,26963,35575,35914,39080,39342,24444,25259,30130,
+30382,34987,36991,38466,21305,24380,24517,27852,29644,30050,30091,31558,33534,
+39325,20047,36924,19979,20309,21414,22799,24264,26160,27827,29781,33655,34662,
+36032,36944,38686,39957,22737,23416,34384,35604,40372,23506,24680,24717,26097,
+27735,28450,28579,28698,32597,32752,38289,38290,38480,38867,21106,36676,20989,
+21547,21688,21859,21898,27323,28085,32216,33382,37532,38519,40569,21512,21704,
+30418,34532,38308,38356,38492,20130,20233,23022,23270,24055,24658,25239,26477,
+26689,27782,28207,32568,32923,33322,64008,64009,38917,20133,20565,21683,22419,
+22874,23401,23475,25032,26999,28023,28707,34809,35299,35442,35559,36994,39405,
+39608,21182,26680,20502,24184,26447,33607,34892,20139,21521,22190,29670,37141,
+38911,39177,39255,39321,22099,22687,34395,35377,25010,27382,29563,36562,27463,
+38570,39511,22869,29184,36203,38761,20436,23796,24358,25080,26203,27883,28843,
+29572,29625,29694,30505,30541,32067,32098,32291,33335,34898,64010,36066,37449,
+39023,23377,31348,34880,38913,23244,20448,21332,22846,
+23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,
+24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,
+37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,
+20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,
+28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,
+31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,
+39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,
+21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,
+27194,28779,30069,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,
+25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,
+26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,
+20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,
+28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,
+24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,
+33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,
+25928,25989,26313,26783,28045,28102,29243,32948,37237,39501,20399,20505,21402,
+21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,
+22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,
+21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,
+30054,34407,24676,35662,40440,20807,20982,21256,27958,
+33016,40657,26133,27427,28824,30165,21507,23673,32007,35350,27424,27453,27462,
+21560,24688,27965,32725,33288,20694,20958,21916,22123,22221,23020,23305,24076,
+24985,24984,25137,26206,26342,29081,29113,29114,29351,31143,31232,32690,35440,
diff --git a/libc-top-half/musl/src/locale/langinfo.c b/libc-top-half/musl/src/locale/langinfo.c
new file mode 100644
index 0000000..1477309
--- /dev/null
+++ b/libc-top-half/musl/src/locale/langinfo.c
@@ -0,0 +1,73 @@
+#include <locale.h>
+#include <langinfo.h>
+#include "locale_impl.h"
+
+static const char c_time[] =
+ "Sun\0" "Mon\0" "Tue\0" "Wed\0" "Thu\0" "Fri\0" "Sat\0"
+ "Sunday\0" "Monday\0" "Tuesday\0" "Wednesday\0"
+ "Thursday\0" "Friday\0" "Saturday\0"
+ "Jan\0" "Feb\0" "Mar\0" "Apr\0" "May\0" "Jun\0"
+ "Jul\0" "Aug\0" "Sep\0" "Oct\0" "Nov\0" "Dec\0"
+ "January\0" "February\0" "March\0" "April\0"
+ "May\0" "June\0" "July\0" "August\0"
+ "September\0" "October\0" "November\0" "December\0"
+ "AM\0" "PM\0"
+ "%a %b %e %T %Y\0"
+ "%m/%d/%y\0"
+ "%H:%M:%S\0"
+ "%I:%M:%S %p\0"
+ "\0"
+ "\0"
+ "%m/%d/%y\0"
+ "0123456789\0"
+ "%a %b %e %T %Y\0"
+ "%H:%M:%S";
+
+static const char c_messages[] = "^[yY]\0" "^[nN]\0" "yes\0" "no";
+static const char c_numeric[] = ".\0" "";
+
+char *__nl_langinfo_l(nl_item item, locale_t loc)
+{
+ int cat = item >> 16;
+ int idx = item & 65535;
+ const char *str;
+
+ if (item == CODESET) return loc->cat[LC_CTYPE] ? "UTF-8" : "ASCII";
+
+ /* _NL_LOCALE_NAME extension */
+ if (idx == 65535 && cat < LC_ALL)
+ return loc->cat[cat] ? (char *)loc->cat[cat]->name : "C";
+
+ switch (cat) {
+ case LC_NUMERIC:
+ if (idx > 1) return "";
+ str = c_numeric;
+ break;
+ case LC_TIME:
+ if (idx > 0x31) return "";
+ str = c_time;
+ break;
+ case LC_MONETARY:
+ if (idx > 0) return "";
+ str = "";
+ break;
+ case LC_MESSAGES:
+ if (idx > 3) return "";
+ str = c_messages;
+ break;
+ default:
+ return "";
+ }
+
+ for (; idx; idx--, str++) for (; *str; str++);
+ if (cat != LC_NUMERIC && *str) str = LCTRANS(str, cat, loc);
+ return (char *)str;
+}
+
+char *__nl_langinfo(nl_item item)
+{
+ return __nl_langinfo_l(item, CURRENT_LOCALE);
+}
+
+weak_alias(__nl_langinfo, nl_langinfo);
+weak_alias(__nl_langinfo_l, nl_langinfo_l);
diff --git a/libc-top-half/musl/src/locale/legacychars.h b/libc-top-half/musl/src/locale/legacychars.h
new file mode 100644
index 0000000..9639b4a
--- /dev/null
+++ b/libc-top-half/musl/src/locale/legacychars.h
@@ -0,0 +1,40 @@
+256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,
+275,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,
+296,297,298,299,302,303,304,305,308,309,310,311,312,313,314,315,316,317,318,
+321,322,323,324,325,326,327,328,330,331,332,333,336,337,338,339,340,341,342,
+343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,
+362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,
+381,382,402,416,417,431,432,536,537,538,539,710,711,728,729,731,732,733,768,
+769,771,777,803,890,900,901,902,904,905,906,908,910,911,912,913,914,915,916,
+917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,
+937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,
+956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,
+1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,1039,1040,
+1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,
+1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,
+1071,
+1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,
+1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,
+1102,1103,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1118,
+1119,1168,1169,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1467,1468,
+1469,1470,1471,1472,1473,1474,1475,1488,1489,1490,1491,1492,1493,1494,1495,
+1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,
+1511,1512,1513,1514,1520,1521,1522,1523,1524,1548,1563,1567,1569,1570,1571,
+1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,
+1587,1588,1589,1590,1591,1592,1593,1594,1600,1601,1602,1603,1604,1605,1606,
+1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1657,1662,1670,
+1672,1681,1688,1705,1711,1722,1726,1729,1746,3585,3586,3587,3588,3589,3590,
+3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,
+3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,
+3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,
+3636,3637,3638,3639,3640,3641,3642,3647,3648,3649,3650,3651,3652,3653,3654,
+3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,
+3670,3671,3672,3673,3674,3675,7682,7683,7690,7691,7710,7711,7744,7745,7766,
+7767,
+7776,7777,7786,7787,7808,7809,7810,7811,7812,7813,7922,7923,8204,8205,8206,
+8207,8211,8212,8213,8215,8216,8217,8218,8220,8221,8222,8224,8225,8226,8230,
+8240,8249,8250,8319,8359,8362,8363,8364,8367,8470,8482,8729,8730,8734,8745,
+8776,8801,8804,8805,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,
+9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,
+9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,
+9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,
diff --git a/libc-top-half/musl/src/locale/locale_map.c b/libc-top-half/musl/src/locale/locale_map.c
new file mode 100644
index 0000000..ebfb158
--- /dev/null
+++ b/libc-top-half/musl/src/locale/locale_map.c
@@ -0,0 +1,119 @@
+#include <locale.h>
+#include <string.h>
+#ifdef __wasilibc_unmodified_upstream // WASI has no mmap
+#include <sys/mman.h>
+#endif
+#include <stdlib.h>
+#include "locale_impl.h"
+#include "libc.h"
+#include "lock.h"
+#include "fork_impl.h"
+
+#define malloc __libc_malloc
+#define calloc undef
+#define realloc undef
+#define free undef
+
+const char *__lctrans_impl(const char *msg, const struct __locale_map *lm)
+{
+ const char *trans = 0;
+ if (lm) trans = __mo_lookup(lm->map, lm->map_size, msg);
+ return trans ? trans : msg;
+}
+
+static const char envvars[][12] = {
+ "LC_CTYPE",
+ "LC_NUMERIC",
+ "LC_TIME",
+ "LC_COLLATE",
+ "LC_MONETARY",
+ "LC_MESSAGES",
+};
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+volatile int __locale_lock[1];
+volatile int *const __locale_lockptr = __locale_lock;
+#endif
+
+const struct __locale_map *__get_locale(int cat, const char *val)
+{
+ static void *volatile loc_head;
+ const struct __locale_map *p;
+ struct __locale_map *new = 0;
+ const char *path = 0, *z;
+ char buf[256];
+ size_t l, n;
+
+ if (!*val) {
+ (val = getenv("LC_ALL")) && *val ||
+ (val = getenv(envvars[cat])) && *val ||
+ (val = getenv("LANG")) && *val ||
+ (val = "C.UTF-8");
+ }
+
+ /* Limit name length and forbid leading dot or any slashes. */
+ for (n=0; n<LOCALE_NAME_MAX && val[n] && val[n]!='/'; n++);
+ if (val[0]=='.' || val[n]) val = "C.UTF-8";
+ int builtin = (val[0]=='C' && !val[1])
+ || !strcmp(val, "C.UTF-8")
+ || !strcmp(val, "POSIX");
+
+ if (builtin) {
+ if (cat == LC_CTYPE && val[1]=='.')
+ return (void *)&__c_dot_utf8;
+ return 0;
+ }
+
+ for (p=loc_head; p; p=p->next)
+ if (!strcmp(val, p->name)) return p;
+
+#ifdef __wasilibc_unmodified_upstream // WASI has no mmap, though this code could be made to use something else
+ if (!libc.secure) path = getenv("MUSL_LOCPATH");
+ /* FIXME: add a default path? */
+
+ if (path) for (; *path; path=z+!!*z) {
+ z = __strchrnul(path, ':');
+ l = z - path;
+ if (l >= sizeof buf - n - 2) continue;
+ memcpy(buf, path, l);
+ buf[l] = '/';
+ memcpy(buf+l+1, val, n);
+ buf[l+1+n] = 0;
+ size_t map_size;
+ const void *map = __map_file(buf, &map_size);
+ if (map) {
+ new = malloc(sizeof *new);
+ if (!new) {
+ __munmap((void *)map, map_size);
+ break;
+ }
+ new->map = map;
+ new->map_size = map_size;
+ memcpy(new->name, val, n);
+ new->name[n] = 0;
+ new->next = loc_head;
+ loc_head = new;
+ break;
+ }
+ }
+#endif
+
+ /* If no locale definition was found, make a locale map
+ * object anyway to store the name, which is kept for the
+ * sake of being able to do message translations at the
+ * application level. */
+ if (!new && (new = malloc(sizeof *new))) {
+ new->map = __c_dot_utf8.map;
+ new->map_size = __c_dot_utf8.map_size;
+ memcpy(new->name, val, n);
+ new->name[n] = 0;
+ new->next = loc_head;
+ loc_head = new;
+ }
+
+ /* For LC_CTYPE, never return a null pointer unless the
+ * requested name was "C" or "POSIX". */
+ if (!new && cat == LC_CTYPE) new = (void *)&__c_dot_utf8;
+
+ return new;
+}
diff --git a/libc-top-half/musl/src/locale/localeconv.c b/libc-top-half/musl/src/locale/localeconv.c
new file mode 100644
index 0000000..4cbb9dc
--- /dev/null
+++ b/libc-top-half/musl/src/locale/localeconv.c
@@ -0,0 +1,34 @@
+#include <locale.h>
+#include <limits.h>
+
+static const struct lconv posix_lconv = {
+ .decimal_point = ".",
+ .thousands_sep = "",
+ .grouping = "",
+ .int_curr_symbol = "",
+ .currency_symbol = "",
+ .mon_decimal_point = "",
+ .mon_thousands_sep = "",
+ .mon_grouping = "",
+ .positive_sign = "",
+ .negative_sign = "",
+ .int_frac_digits = CHAR_MAX,
+ .frac_digits = CHAR_MAX,
+ .p_cs_precedes = CHAR_MAX,
+ .p_sep_by_space = CHAR_MAX,
+ .n_cs_precedes = CHAR_MAX,
+ .n_sep_by_space = CHAR_MAX,
+ .p_sign_posn = CHAR_MAX,
+ .n_sign_posn = CHAR_MAX,
+ .int_p_cs_precedes = CHAR_MAX,
+ .int_p_sep_by_space = CHAR_MAX,
+ .int_n_cs_precedes = CHAR_MAX,
+ .int_n_sep_by_space = CHAR_MAX,
+ .int_p_sign_posn = CHAR_MAX,
+ .int_n_sign_posn = CHAR_MAX,
+};
+
+struct lconv *localeconv(void)
+{
+ return (void *)&posix_lconv;
+}
diff --git a/libc-top-half/musl/src/locale/newlocale.c b/libc-top-half/musl/src/locale/newlocale.c
new file mode 100644
index 0000000..11c7785
--- /dev/null
+++ b/libc-top-half/musl/src/locale/newlocale.c
@@ -0,0 +1,72 @@
+#include <stdlib.h>
+#include <string.h>
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#include <pthread.h>
+#endif
+#include "locale_impl.h"
+#include "lock.h"
+
+#define malloc __libc_malloc
+#define calloc undef
+#define realloc undef
+#define free undef
+
+static int default_locale_init_done;
+static struct __locale_struct default_locale, default_ctype_locale;
+
+int __loc_is_allocated(locale_t loc)
+{
+ return loc && loc != C_LOCALE && loc != UTF8_LOCALE
+ && loc != &default_locale && loc != &default_ctype_locale;
+}
+
+static locale_t do_newlocale(int mask, const char *name, locale_t loc)
+{
+ struct __locale_struct tmp;
+
+ for (int i=0; i<LC_ALL; i++) {
+ tmp.cat[i] = (!(mask & (1<<i)) && loc) ? loc->cat[i] :
+ __get_locale(i, (mask & (1<<i)) ? name : "");
+ if (tmp.cat[i] == LOC_MAP_FAILED)
+ return 0;
+ }
+
+ /* For locales with allocated storage, modify in-place. */
+ if (__loc_is_allocated(loc)) {
+ *loc = tmp;
+ return loc;
+ }
+
+ /* Otherwise, first see if we can use one of the builtin locales.
+ * This makes the common usage case for newlocale, getting a C locale
+ * with predictable behavior, very fast, and more importantly, fail-safe. */
+ if (!memcmp(&tmp, C_LOCALE, sizeof tmp)) return C_LOCALE;
+ if (!memcmp(&tmp, UTF8_LOCALE, sizeof tmp)) return UTF8_LOCALE;
+
+ /* And provide builtins for the initial default locale, and a
+ * variant of the C locale honoring the default locale's encoding. */
+ if (!default_locale_init_done) {
+ for (int i=0; i<LC_ALL; i++)
+ default_locale.cat[i] = __get_locale(i, "");
+ default_ctype_locale.cat[LC_CTYPE] = default_locale.cat[LC_CTYPE];
+ default_locale_init_done = 1;
+ }
+ if (!memcmp(&tmp, &default_locale, sizeof tmp)) return &default_locale;
+ if (!memcmp(&tmp, &default_ctype_locale, sizeof tmp))
+ return &default_ctype_locale;
+
+ /* If no builtin locale matched, attempt to allocate and copy. */
+ if ((loc = malloc(sizeof *loc))) *loc = tmp;
+
+ return loc;
+}
+
+locale_t __newlocale(int mask, const char *name, locale_t loc)
+{
+ LOCK(__locale_lock);
+ loc = do_newlocale(mask, name, loc);
+ UNLOCK(__locale_lock);
+ return loc;
+}
+
+weak_alias(__newlocale, newlocale);
diff --git a/libc-top-half/musl/src/locale/pleval.c b/libc-top-half/musl/src/locale/pleval.c
new file mode 100644
index 0000000..04da1c4
--- /dev/null
+++ b/libc-top-half/musl/src/locale/pleval.c
@@ -0,0 +1,158 @@
+#include <stdlib.h>
+#include <ctype.h>
+#include "pleval.h"
+
+/*
+grammar:
+
+Start = Expr ';'
+Expr = Or | Or '?' Expr ':' Expr
+Or = And | Or '||' And
+And = Eq | And '&&' Eq
+Eq = Rel | Eq '==' Rel | Eq '!=' Rel
+Rel = Add | Rel '<=' Add | Rel '>=' Add | Rel '<' Add | Rel '>' Add
+Add = Mul | Add '+' Mul | Add '-' Mul
+Mul = Prim | Mul '*' Prim | Mul '/' Prim | Mul '%' Prim
+Prim = '(' Expr ')' | '!' Prim | decimal | 'n'
+
+internals:
+
+recursive descent expression evaluator with stack depth limit.
+for binary operators an operator-precedence parser is used.
+eval* functions store the result of the parsed subexpression
+and return a pointer to the next non-space character.
+*/
+
+struct st {
+ unsigned long r;
+ unsigned long n;
+ int op;
+};
+
+static const char *skipspace(const char *s)
+{
+ while (isspace(*s)) s++;
+ return s;
+}
+
+static const char *evalexpr(struct st *st, const char *s, int d);
+
+static const char *evalprim(struct st *st, const char *s, int d)
+{
+ char *e;
+ if (--d < 0) return "";
+ s = skipspace(s);
+ if (isdigit(*s)) {
+ st->r = strtoul(s, &e, 10);
+ if (e == s || st->r == -1) return "";
+ return skipspace(e);
+ }
+ if (*s == 'n') {
+ st->r = st->n;
+ return skipspace(s+1);
+ }
+ if (*s == '(') {
+ s = evalexpr(st, s+1, d);
+ if (*s != ')') return "";
+ return skipspace(s+1);
+ }
+ if (*s == '!') {
+ s = evalprim(st, s+1, d);
+ st->r = !st->r;
+ return s;
+ }
+ return "";
+}
+
+static int binop(struct st *st, int op, unsigned long left)
+{
+ unsigned long a = left, b = st->r;
+ switch (op) {
+ case 0: st->r = a||b; return 0;
+ case 1: st->r = a&&b; return 0;
+ case 2: st->r = a==b; return 0;
+ case 3: st->r = a!=b; return 0;
+ case 4: st->r = a>=b; return 0;
+ case 5: st->r = a<=b; return 0;
+ case 6: st->r = a>b; return 0;
+ case 7: st->r = a<b; return 0;
+ case 8: st->r = a+b; return 0;
+ case 9: st->r = a-b; return 0;
+ case 10: st->r = a*b; return 0;
+ case 11: if (b) {st->r = a%b; return 0;} return 1;
+ case 12: if (b) {st->r = a/b; return 0;} return 1;
+ }
+ return 1;
+}
+
+static const char *parseop(struct st *st, const char *s)
+{
+ static const char opch[11] = "|&=!><+-*%/";
+ static const char opch2[6] = "|&====";
+ int i;
+ for (i=0; i<11; i++)
+ if (*s == opch[i]) {
+ /* note: >,< are accepted with or without = */
+ if (i<6 && s[1] == opch2[i]) {
+ st->op = i;
+ return s+2;
+ }
+ if (i>=4) {
+ st->op = i+2;
+ return s+1;
+ }
+ break;
+ }
+ st->op = 13;
+ return s;
+}
+
+static const char *evalbinop(struct st *st, const char *s, int minprec, int d)
+{
+ static const char prec[14] = {1,2,3,3,4,4,4,4,5,5,6,6,6,0};
+ unsigned long left;
+ int op;
+ d--;
+ s = evalprim(st, s, d);
+ s = parseop(st, s);
+ for (;;) {
+ /*
+ st->r (left hand side value) and st->op are now set,
+ get the right hand side or back out if op has low prec,
+ if op was missing then prec[op]==0
+ */
+ op = st->op;
+ if (prec[op] <= minprec)
+ return s;
+ left = st->r;
+ s = evalbinop(st, s, prec[op], d);
+ if (binop(st, op, left))
+ return "";
+ }
+}
+
+static const char *evalexpr(struct st *st, const char *s, int d)
+{
+ unsigned long a, b;
+ if (--d < 0)
+ return "";
+ s = evalbinop(st, s, 0, d);
+ if (*s != '?')
+ return s;
+ a = st->r;
+ s = evalexpr(st, s+1, d);
+ if (*s != ':')
+ return "";
+ b = st->r;
+ s = evalexpr(st, s+1, d);
+ st->r = a ? b : st->r;
+ return s;
+}
+
+unsigned long __pleval(const char *s, unsigned long n)
+{
+ struct st st;
+ st.n = n;
+ s = evalexpr(&st, s, 100);
+ return *s == ';' ? st.r : -1;
+}
diff --git a/libc-top-half/musl/src/locale/pleval.h b/libc-top-half/musl/src/locale/pleval.h
new file mode 100644
index 0000000..cc515f4
--- /dev/null
+++ b/libc-top-half/musl/src/locale/pleval.h
@@ -0,0 +1,8 @@
+#ifndef PLEVAL_H
+#define PLEVAL_H
+
+#include <features.h>
+
+hidden unsigned long __pleval(const char *, unsigned long);
+
+#endif
diff --git a/libc-top-half/musl/src/locale/revjis.h b/libc-top-half/musl/src/locale/revjis.h
new file mode 100644
index 0000000..3ab369f
--- /dev/null
+++ b/libc-top-half/musl/src/locale/revjis.h
@@ -0,0 +1,515 @@
+31,80,81,87,14,299,74,61,12,344,62,63,1280,1281,1282,1283,1284,1285,1286,1287,
+1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,
+1303,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,
+1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1542,1536,1537,1538,1539,
+1540,1541,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,
+1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1584,1585,
+1586,1587,1588,1589,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,
+1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,
+1590,29,28,33,37,38,39,40,342,343,36,35,338,75,76,263,77,337,266,267,265,268,
+300,301,302,318,303,319,281,282,60,324,326,70,315,297,298,288,287,328,329,71,
+327,325,321,65,320,68,69,322,323,285,286,283,284,316,317,1792,1803,1793,1804,
+1794,1805,1795,1806,1797,1808,1796,1807,1798,1819,1814,1809,1800,1821,1816,
+1811,1799,1815,1820,1810,1801,1817,1822,1812,1802,1818,1823,1813,258,257,260,
+259,262,261,256,93,90,92,91,349,89,88,73,72,341,340,339,0,1,2,22,24,25,26,49,
+50,51,52,53,54,55,56,57,58,264,269,43,44,32,
+768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,
+787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,
+806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,
+825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,
+844,845,846,847,848,849,850,10,11,20,21,1024,1025,1026,1027,1028,1029,1030,
+1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,
+1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,
+1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,
+1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,
+1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,
+1106,1107,1108,1109,5,27,18,19,3915,8793,6934,10843,7493,6671,7492,4379,10291,
+11294,12033,4110,4685,12034,7939,12577,5173,10521,7494,11549,10529,12035,8773,
+12036,5465,12037,4924,8719,6982,12038,12039,12040,9748,5174,9750,9538,5922,
+10770,18472,12041,7495,12042,4372,5444,5967,11080,13573,11343,9564,4868,5140,
+12043,12044,11546,11292,8263,12046,6741,9554,12049,4125,5950,5949,3909,11818,
+11817,6418,3840,12050,12051,12052,10771,12053,5969,3910,10833,5211,5212,5213,
+9025,11547,12054,12055,12056,7724,7193,7725,12061,12059,12060,5175,6402,4431,
+12058,12057,10504,6693,6692,8477,12062,10292,8006,23,12063,12065,8516,11584,
+3881,12064,4381,5411,8774,5710,12066,9731,4938,12067,3882,5951,4939,10329,
+10001,5176,4432,12102,9248,9803,12069,10011,11585,7692,6694,6742,4383,9008,
+8705,12073,3883,9026,7194,6419,11267,8493,4382,12072,11293,12068,12070,6477,
+12071,13315,12079,12082,12080,4385,10522,12074,12078,5970,6695,4869,12083,
+12075,11586,6743,12076,12081,12084,12077,5376,3884,5377,4384,13316,10840,
+10317,5971,7694,11542,10551,5655,8452,4419,7218,12088,12093,12091,12086,8462,
+12089,12092,12090,10556,12087,7693,10834,12094,12095,7171,12108,9775,10261,
+12103,10575,4373,12107,12101,12110,8241,5923,9787,16166,12109,9276,12098,5973,
+5972,12096,6969,12104,10574,8748,12100,5712,12097,12105,12099,11568,12106,
+11808,5445,5711,12111,12112,12116,3885,10543,12115,12114,12118,12117,9027,
+5713,12119,6948,8453,9028,5461,12120,5141,12121,12123,10772,5701,6672,10070,
+12122,6436,11298,12125,12290,12124,6435,7260,5656,12291,5422,12288,12289,9486,
+8283,5378,10796,12292,11548,12293,12296,12294,8237,12295,12297,12299,12298,
+10535,5142,12301,12302,4366,12300,6995,12305,12304,12303,12085,12306,7261,
+12307,11268,11064,12309,12308,12311,12310,12312,12313,3923,5908,5658,7195,
+8794,5379,8007,5974,6221,12315,11047,9253,6744,12314,12316,9277,4692,12317,
+9565,8211,12319,12320,9995,5975,11802,12321,5381,10523,8469,5456,
+9236,5714,12322,12323,9537,4158,12326,6492,12325,6437,12327,17741,12328,10784,
+12329,12330,12331,7496,6955,4870,12334,12332,11036,12333,10297,12335,12336,
+12337,9278,12341,12339,12340,12338,6466,12342,11081,11587,12343,7943,12344,
+7225,12345,8795,11550,9279,12580,12346,21252,5412,12347,10813,7239,8539,12349,
+9539,12350,12351,4621,12352,5382,9515,4185,7215,9984,12353,9280,7726,12354,
+10507,7993,4865,4872,12355,12357,5657,12356,11602,7240,10012,10539,12358,
+11351,12359,12360,9309,12361,7944,6493,5715,12362,6696,6222,9029,12364,8454,
+6478,12365,12366,8207,12363,12368,10773,6211,12367,5716,6461,9804,12371,12369,
+10330,7497,12378,4675,12372,12370,8238,12374,12373,4643,5695,12379,11532,
+12375,12380,12377,12376,11566,5976,4386,11603,7252,9271,6212,12545,12546,
+11588,11786,12548,5977,12547,4622,12549,10805,8987,11269,10552,12550,20276,
+9487,12551,4873,11026,7424,12552,10566,12556,7945,12553,5423,12554,4874,5645,
+12557,12558,12559,12560,6970,5978,11069,11079,9558,10576,12561,12562,12564,
+12566,12565,12567,4380,10795,6491,12568,8248,7425,5384,12569,10042,12570,
+12571,12572,12573,10243,5447,3908,9502,12574,7196,8008,12576,12575,7426,5952,
+12578,10013,12579,10043,8467,8525,5383,9549,8720,9805,10797,12581,8009,5652,
+12582,12583,4107,3924,4940,8455,5168,11344,12586,4374,12585,5385,12587,11088,
+12588,11569,5979,5909,12589,12591,12590,7742,4120,4157,12592,12593,5910,12594,
+5197,6673,12595,10835,6420,5177,11270,8239,10014,7004,7206,6983,
+6996,7253,10015,12598,4130,8240,5980,5924,5446,12602,8704,8541,5386,7427,
+12603,12601,4387,8517,6935,6698,4101,4687,6213,6697,12604,12605,5160,4645,
+6214,5159,9022,4100,9488,11037,6144,11352,9254,5981,5646,12614,5442,10793,
+10044,12613,4925,12608,12609,12611,12612,5178,7744,10508,12610,12606,5954,
+12607,11779,10577,9031,5953,6223,12615,9532,12619,7005,6997,12622,12620,11010,
+12617,12626,12621,12624,5925,11038,12625,12627,12629,6479,11809,12618,12616,
+12628,12623,12631,12802,12633,12637,12800,12634,12829,6472,4624,12632,12804,
+3925,12803,3844,10281,12801,12635,12630,12636,6439,12805,3926,12814,12806,
+12807,7428,10824,12812,12811,9230,12813,12810,4115,6421,7695,12808,9281,12809,
+3841,12819,11266,7430,12825,12824,12815,8482,12816,8526,12821,7429,12818,
+11075,5659,12822,12823,12820,12826,12817,12832,12837,12833,12828,12838,8208,
+12840,6145,12830,8796,12834,12827,4876,4941,4676,12835,12831,5717,12841,12839,
+8242,5161,5387,12836,5459,4131,12845,12843,13062,12848,12842,12846,12844,6699,
+12847,12850,12855,12853,12852,8721,4388,12849,12851,7431,4114,12854,4413,
+12865,7515,12861,12859,12860,12862,4124,8216,12856,12857,4697,12864,4942,
+12867,12863,12866,10509,9524,10007,12869,12868,4644,12870,12873,12872,12871,
+9752,12874,12875,12877,12876,12879,12882,12880,12878,12881,12883,12884,12885,
+12886,12887,12324,7003,6700,4434,3927,8739,12888,6403,3886,7741,12889,5926,
+6224,12891,12890,10559,12892,13056,12893,13057,13058,5718,4159,13059,13061,
+13060,
+13063,9273,13064,3860,6462,5660,8750,13065,13066,13068,13069,6467,5424,10774,
+13067,13070,6432,6146,13074,6404,8722,13071,9017,13075,7745,13073,13076,5662,
+13077,13078,6147,4639,13080,13081,13082,13079,13072,13083,13084,10819,7498,
+13086,13087,13085,13089,9751,3911,10293,13090,7516,6936,9788,4943,6474,10808,
+9489,5719,8494,13088,13091,8483,13092,13093,13095,9032,4877,21248,4160,10578,
+7499,9255,6469,13101,10524,11580,4435,13097,8217,13100,9282,9256,9283,10008,
+9004,6440,13096,4181,9237,13098,13094,7727,13102,7213,5388,13103,10567,8284,
+8997,13105,10798,13106,13111,10510,13110,13104,13107,13109,6405,10536,13112,
+8740,4436,7500,13114,13113,6215,13115,13117,13116,13119,13108,13121,13120,
+13118,6701,7728,8243,13122,7963,3916,9795,9018,13124,13123,13125,13126,13127,
+13128,10544,13129,4389,13130,11291,4623,12584,7207,8478,13131,11082,11027,
+13133,8518,9238,8479,10294,13134,13135,4186,6937,13136,3887,13137,13138,4161,
+4944,9535,10579,13142,8244,13141,5663,10810,13140,9284,13144,13143,13146,
+13145,4187,13147,7432,13149,8708,13148,10514,7254,9274,13312,6148,13313,9728,
+10045,11056,9732,13322,5143,11300,11022,13579,13314,13317,8484,10775,9257,
+13318,10820,6441,7433,13319,6703,6702,3864,5927,7946,3888,13323,13324,13321,
+4119,4878,13320,11044,10256,3847,3928,6704,3889,3842,13329,13327,11035,13330,
+13328,13326,7696,13325,10553,5955,13334,13335,7434,13331,11787,9771,13333,
+6406,13336,10295,13337,13332,11034,9789,13338,10257,13339,13343,
+13340,4390,13342,6938,13341,5720,13355,13348,13345,8771,13344,13346,13347,
+13349,13350,4945,13352,13351,13353,7501,13356,9019,4132,13354,13357,13358,
+13361,13359,13360,6705,13362,6149,13363,6745,8471,13364,13365,6713,6150,11057,
+5127,5928,13366,4663,13367,8472,13368,13570,13369,13370,13371,13373,13374,
+13375,8527,4102,6984,3873,8246,4879,6932,6151,9285,7168,4880,8775,9033,3863,
+5144,10580,6945,5169,8010,6939,11271,13376,5179,6442,4625,4162,7435,4391,
+13377,11301,7208,6979,13378,4946,9521,11016,13379,13380,10296,13382,4871,5462,
+13381,4881,7697,13386,6656,4392,13385,13383,13387,13384,9738,15148,7698,13388,
+11551,13389,13391,8797,13390,7938,6746,8495,6998,10324,8011,6956,13392,7436,
+13393,13394,3890,8473,7729,13395,9490,7437,7438,13396,8012,7439,13397,13398,
+11071,13399,5413,7169,13400,13401,6971,7691,9555,7731,10071,9729,5416,13402,
+5198,13403,5469,9518,4367,6706,13404,13569,13568,5468,13405,9239,8463,9258,
+6951,8247,11353,13571,13572,9525,6674,13574,13575,13576,4947,13577,13578,4363,
+8218,4931,13580,11015,8497,4664,13582,13584,4926,13581,13583,13586,13585,
+13587,13588,9500,5389,4420,13589,13594,13592,10582,10581,9286,13591,7219,
+13590,7761,13595,6473,13601,13602,13596,4626,13597,13606,13605,13604,13600,
+13599,13603,10583,13610,13607,13609,11345,13608,13598,7762,13611,6422,13612,
+13613,13616,13615,13614,9287,13593,13622,13618,13617,13619,13620,13623,11589,
+13624,13621,13625,4927,13626,13628,13627,13629,13630,8013,7170,
+7235,8258,6152,6423,6153,5199,13631,6424,5929,13632,11013,9762,13633,6154,
+4875,8710,5425,6707,10298,10016,13634,4948,13637,8960,13636,13635,13638,9034,
+7746,6708,7977,8498,5121,8961,13639,13640,7502,10776,13643,13642,13641,10332,
+13650,10809,13644,13646,10826,13645,13647,9991,13648,10525,13649,4882,10526,
+9742,13651,13652,6155,4883,13653,5911,11299,11272,4949,13655,8962,6156,7440,
+10046,7441,7255,9035,10584,9240,6157,10299,13656,9272,6433,5930,9036,3874,
+7245,6158,11302,13657,13658,9776,13659,11606,11788,13661,13660,4646,13824,
+13827,13828,13826,10271,7442,13830,13829,13825,13831,13832,13833,13836,13834,
+13835,13837,4163,9037,13838,5721,4437,9749,13839,9562,10554,13840,11789,13841,
+10527,13844,12032,12048,6927,9556,13845,5180,8963,3929,13846,10501,6159,8751,
+9038,11086,5912,5931,13847,13848,13854,6980,8964,5390,13849,10250,8741,13850,
+13851,5391,13852,13853,13855,9301,13856,13857,13858,13843,13842,13859,5664,
+10246,6443,10262,8965,10282,13860,7443,4133,13861,13862,11089,10047,13865,
+4188,7947,13864,13863,5665,8499,13869,13867,13866,11526,5956,7256,13868,9259,
+7197,9503,13872,13871,13870,13873,5957,13874,10331,7226,13875,10072,9504,8966,
+9231,13876,5130,7699,10251,4950,9733,13877,6709,10777,10778,4189,13882,8776,
+13879,4438,14092,13881,9743,13880,13878,6233,13884,13890,13896,13888,9275,
+13893,10300,13887,13892,11590,6710,8500,13885,5181,13895,7948,4164,13889,4439,
+13894,5392,13891,13897,13899,13909,13907,13904,13903,11607,
+13905,5393,6160,7257,13912,13898,13902,13886,4441,13906,13908,8752,6407,4375,
+13900,13911,13910,5394,8456,4677,5666,13901,13913,13916,14080,6940,14086,9039,
+13914,14084,4440,14082,14083,13917,14081,5958,11273,4884,4152,14085,9753,3852,
+10048,13883,14091,14095,11076,14088,9288,14093,7503,14094,9526,11814,14090,
+14096,6234,7978,3891,14089,14087,8249,13915,6675,8485,14108,8250,14103,14100,
+14101,6981,14104,14107,14102,7172,14105,14099,11099,11098,14109,14110,3892,
+14098,5457,3845,4885,14106,14114,14113,14118,14119,14117,14120,14112,14116,
+14121,14122,14111,6747,14115,8501,6161,14097,7700,14135,10568,14125,14126,
+14127,14134,14133,10844,4886,14131,5668,4627,14128,11543,14130,3893,14132,
+14123,14129,14136,5667,14124,11324,11274,14139,14143,8285,11608,14144,14141,
+14138,14137,14142,10511,9491,5669,14145,14140,14146,5722,4368,14154,4887,
+14152,14153,6408,14151,14149,14148,14155,14147,14157,4442,14159,14158,8967,
+14162,14160,14150,5723,14161,14165,14164,14166,14163,14167,14168,14169,10569,
+14171,14170,7198,7949,4421,4443,14172,3870,7979,14173,19234,14336,5696,14337,
+8014,14338,14339,5145,14340,14341,14342,8502,5932,11072,10779,7241,14343,8015,
+19740,10049,6985,6444,14344,8486,10502,8528,14347,14345,14348,14346,14349,
+10512,3862,10301,10050,14350,14353,7444,5146,14351,14358,7445,14352,9763,
+11325,14354,14355,14359,9289,14356,6162,7997,14373,10003,8529,10051,14604,
+10585,9040,10836,14362,4352,8777,14371,8723,14365,14372,14367,14374,14370,
+14369,9806,14363,
+4444,14361,5200,8530,14357,14360,6163,7994,7446,14368,9777,5201,4647,4678,
+7680,14376,14381,14377,5724,14382,6657,6216,7173,14364,6748,14379,6711,14380,
+3875,14375,8968,5202,5395,14378,3846,6434,7701,9041,10035,14384,8253,8457,
+6666,14385,14387,14383,10560,8988,8251,10586,6957,14399,14398,7767,5725,14392,
+7448,9543,9744,14390,8252,6999,14395,7447,14389,14394,9778,14388,5632,4668,
+14396,11530,6445,8724,14393,7995,6164,7747,4165,8219,14391,5156,5670,9006,
+14397,8254,14400,14402,8470,14408,14403,14405,10272,9042,14406,11275,11303,
+4888,3853,14404,14401,4951,4166,14407,11304,14411,8474,14418,14412,14409,
+14416,14386,14413,14417,10017,9290,14410,14414,5671,6480,7996,14422,9221,
+14419,10815,14420,14421,11053,7937,5697,14428,6676,14425,14424,9745,9492,9232,
+14426,14427,10318,9764,6658,8016,10799,4648,14596,14429,11305,14598,14594,
+14595,8255,14593,14366,14597,14592,14602,14603,9222,14605,6659,14600,5147,
+14606,14599,14610,14609,14608,14611,14613,7504,14612,14616,14614,14615,14415,
+14618,14617,14423,14619,14607,6712,14620,14621,14623,14622,14624,4445,6165,
+10587,7950,5933,14626,14629,10289,5182,14628,14627,9779,14630,5396,14632,
+14631,4889,6677,9527,5672,7763,14633,7951,9223,10302,14634,14635,14636,10519,
+13372,7973,10283,6455,10052,10018,9260,11552,14638,6959,14639,3861,5427,7980,
+10303,14640,6689,8742,6714,7702,14641,10588,4182,6715,14644,14642,14645,11544,
+14643,8026,14646,8465,14647,4953,14649,14648,14650,14651,4954,9563,
+8725,5195,6716,8256,7227,3855,14652,4353,14656,6166,14655,6410,7449,14654,
+7450,11039,6409,3894,7981,14661,7952,4134,7220,10821,6481,7451,7942,14660,
+14658,14659,8778,14853,14665,6749,6167,14663,14664,7703,14662,6670,14667,
+14666,14671,14672,14668,4609,14669,14670,10036,10304,5673,14673,7953,7452,
+8753,5414,14674,14678,4394,14675,14677,14676,7242,8743,3876,14679,14680,8969,
+11600,6690,10570,10780,14849,14682,14685,14684,14681,14848,9533,14683,14850,
+7243,14851,11306,9815,14852,14854,14855,14856,5417,4135,6168,14857,14858,7248,
+8257,12599,8221,8220,8503,6438,12113,5709,11276,10589,10333,14859,6482,8990,
+14860,11790,10781,8970,14861,4955,14862,14863,11065,11011,10837,10811,6660,
+14865,6986,10800,14867,14870,14869,4952,5183,14866,14868,14871,7768,11354,
+3880,6463,8475,6972,7506,14874,9261,14872,8458,14873,7505,11068,14875,14876,
+11335,14881,6169,9780,14878,9291,14653,14657,5166,9766,14880,7453,10019,14886,
+10073,14877,14883,14882,7982,10828,11570,10822,4395,6717,11815,14885,7764,
+14884,14879,5934,14891,14889,4396,14887,14893,14899,8487,10528,14901,10241,
+14900,9807,10782,4890,8022,7199,9010,11277,14896,14895,14897,14894,14902,
+14892,14890,14898,14888,8779,11095,6949,6483,6425,10830,4640,9005,9513,4136,
+8017,7955,5641,14904,6170,4699,14906,4691,14912,14909,8018,4650,6411,4649,
+6446,14907,5700,5674,9292,14905,3877,14908,14910,5420,5643,4891,5162,14913,
+6488,10832,6678,14914,10255,14926,4370,14915,14932,14916,11553,14923,
+9790,14931,14918,3859,14920,6171,14922,14921,14917,14928,7454,13132,5959,
+11355,14919,9043,4610,6412,14911,14927,4672,14925,14929,9293,4957,15121,11048,
+14934,4956,14941,10783,15104,15106,15110,14936,8713,9294,15114,14939,15111,
+15105,7704,15115,7954,15113,4892,11823,14933,15109,3895,14935,11033,14940,
+7681,8998,14930,15108,7769,15118,4688,5888,15120,14937,15119,15112,14938,
+15116,15117,15134,9517,15107,15130,15132,9015,11307,10325,15127,8489,15133,
+8222,15124,15137,15136,9550,15135,9545,15139,15126,5415,15129,7228,9791,15131,
+5418,15123,15125,15122,11791,4665,15128,15138,4628,6470,4156,15155,11792,
+15158,7705,15157,15156,15153,15141,15170,15140,15159,15151,15146,15143,15144,
+15152,21249,15149,6172,8999,8259,15147,15142,15145,11308,10825,15150,15160,
+15168,15161,15174,15172,15167,15166,9007,8260,15164,15162,15169,15175,10068,
+15181,15176,15179,15173,8787,10263,15163,15171,7455,11054,15191,15178,5889,
+4354,4670,15154,7456,15183,15190,7000,4689,8717,15180,15185,15189,5397,5163,
+15187,5120,9514,15186,15188,15182,15184,4671,8744,15195,15193,5960,15192,
+15360,14903,15194,15196,15197,15371,15367,14924,15366,15365,15362,15177,15364,
+15363,15369,11781,15372,5466,15368,15370,9990,15373,15377,15374,11346,15375,
+15165,15378,15379,4116,15381,5702,6912,5428,4355,11326,15383,15382,15385,5148,
+5429,4893,15388,15387,15389,4397,8726,15390,4894,15392,15391,15393,15394,
+15395,6718,7956,6400,10319,10561,11811,6740,6447,11601,15396,15397,6719,15398,
+15399,15401,15400,10807,
+7229,6987,6691,15402,15404,7682,15403,15405,15406,15407,15408,15409,15411,
+15410,15412,4356,8745,15413,6661,4651,15414,9249,13099,5122,15415,15416,10571,
+10823,9510,15417,10053,10074,11058,15418,15420,15419,15422,15421,15424,6720,
+11024,15425,15426,5123,15427,15429,15428,7748,10264,4137,10020,9044,7200,5184,
+10021,6925,15431,4895,4183,9553,15430,6173,8754,15432,15440,15433,8480,5185,
+15441,5703,5124,15439,15437,15434,11327,8991,9528,15435,15443,15442,5634,4364,
+6426,15436,15438,10806,8531,10838,15451,15452,4398,10503,11100,15616,6914,
+7457,15447,15453,4167,5398,15444,15449,8019,9808,10054,15446,10752,15448,
+15619,15617,15450,10753,9767,5186,9220,8780,15620,15618,8504,15445,4138,11309,
+15631,15630,8021,15627,11339,9493,15621,8996,4139,6174,15624,7174,15629,15628,
+15623,15626,4679,15625,9768,11533,7507,8020,15637,15635,10284,15632,15634,
+4121,6175,11793,4636,10305,11328,4611,7706,15636,15641,7458,11279,15638,15633,
+15639,11581,9298,9505,4629,4148,15645,15648,11554,11331,15655,15649,15646,
+11571,15652,7209,15654,15659,9296,15657,15651,8727,15658,15647,15653,15660,
+3931,15650,15661,7707,7230,10500,6413,15642,15656,9241,7957,4680,6448,7459,
+15644,7201,5675,15643,15665,7244,5913,15680,15674,5203,9262,15669,15678,3854,
+4113,4376,15671,8459,15662,15664,6176,15681,15676,15668,15675,11018,15673,
+15677,5935,7460,8728,15667,11278,15670,15663,9297,15666,15672,11824,6941,
+10845,15682,9997,15694,5914,7231,15684,11534,6177,15697,3917,15695,15683,
+15689,15691,11310,15686,9229,15688,15696,15690,11046,15685,6913,15709,4681,
+15687,15692,15693,8523,8505,15701,15707,15705,9224,15874,15702,15703,15679,
+5208,10265,6942,6230,11794,15699,15873,4168,8261,9816,4896,11609,11008,9009,
+15706,15708,8209,15872,15704,15698,4898,5704,15886,15881,8023,4674,7232,15890,
+15883,8971,15880,9016,15915,15877,15876,15885,15879,15878,15884,7936,15875,
+15887,15888,4897,15893,15892,15894,15897,9250,15891,15895,5698,8536,15889,
+9754,15896,15901,15899,15902,15905,15898,6217,9735,15640,11347,15900,15904,
+8532,15903,15882,20040,15908,15912,15910,15906,15907,15911,15909,10285,15917,
+15914,15913,15916,9523,15918,8788,8524,7940,15919,15921,15920,15700,15922,
+9542,15923,4399,9299,4612,5187,6973,6449,11782,7749,4169,15925,15924,15928,
+8729,15931,15926,15930,15929,9247,3896,11604,15933,4103,15935,15934,15932,
+15927,10754,15937,15936,4170,15939,10513,15938,11028,7462,8210,7461,11610,
+15945,8024,15941,15946,4171,15944,9792,15940,15943,7463,10032,15947,6960,8025,
+15950,15942,5638,15948,11311,15951,21253,7214,15952,15953,9741,15955,15956,
+9746,9300,15958,15960,11572,15957,15959,4172,15954,12858,15961,8262,6679,
+15963,15962,7683,12600,15964,16128,15949,15965,16129,9817,16130,16131,16132,
+16133,9021,16135,16134,16136,16137,6974,10306,11083,16138,16139,8245,6915,
+16140,16141,16142,10545,10022,16143,9782,8972,16144,4422,5196,11045,11029,
+4371,11795,10801,10505,7958,16145,9506,5890,16146,6451,16148,16147,16149,
+16150,16151,5149,16152,16153,
+5891,10023,16155,7508,16154,5399,16156,16158,16157,16159,5936,16160,5448,8223,
+6236,16162,16163,16161,6988,9511,5400,16165,8715,16164,11796,9793,16168,16170,
+16167,11059,16169,16171,11555,16175,16174,8789,9740,5892,16173,16172,11280,
+11281,16176,4173,6229,6721,16177,16178,16180,7202,16182,16181,16183,4652,
+16185,16184,16187,16186,5915,11527,5419,4357,5449,4928,11591,16189,16191,
+16192,4400,16188,6680,8992,16190,16195,6989,16193,5661,10024,16194,16221,
+16200,5916,5188,16197,11356,11535,8533,16199,16201,11573,5430,10075,9769,
+16202,16204,16207,16203,16206,5961,4140,16208,7759,16205,11579,16211,21251,
+16209,16212,16198,16210,6427,16213,16214,11357,16215,16216,16196,16217,4899,
+6916,16218,16219,16220,4122,16384,10266,16385,4867,16386,16387,16388,16390,
+16391,16389,10290,16393,16392,16395,16394,16396,16397,16399,16398,6232,16401,
+16400,4900,7730,9243,16402,7959,6681,4184,16403,11312,10562,16404,9251,11282,
+6178,7708,8746,12563,8973,4423,16405,16406,16411,16409,16408,14625,4613,16407,
+3897,9993,10025,11536,16412,16410,8763,7941,9994,10252,16414,11531,5676,16415,
+16413,10037,16416,16417,3898,7509,16422,16419,9548,16418,5125,16425,16420,
+16421,16424,16423,10244,8225,8224,5150,16426,16427,16428,16430,16429,4149,
+16438,10055,16432,16434,16436,7709,16437,16435,6943,16431,16433,10273,7464,
+16440,16439,16441,6917,6414,9302,16442,9002,16444,11520,16443,8264,16449,
+16451,16452,8755,16450,16447,16445,16446,16448,16455,16453,16454,16456,16458,
+16459,16460,16461,16457,
+16463,16462,16464,11556,16467,16465,16466,4929,11101,10537,16469,16468,16470,
+16471,16475,16472,16473,16474,16476,16477,16640,16641,16642,9998,9263,16643,
+9809,10259,16644,16645,9225,4614,6179,16646,16647,16648,6664,16650,16649,
+16651,16652,10056,16653,16654,21064,16655,16656,16657,6669,16658,9781,10814,
+4141,4150,16659,16661,16660,9295,7960,15384,16662,11040,16663,4901,10038,
+16664,16665,16666,11067,11060,8989,8265,16668,7233,7465,16671,16670,16669,
+10076,4902,5896,16677,16674,7710,11025,16673,16675,16676,16672,16678,16679,
+8974,4930,8772,16680,16681,16684,7750,9507,16685,10802,16682,16683,16688,
+16687,16686,16690,16689,16691,16693,16692,10540,7221,11557,16694,9494,16695,
+16696,16700,16698,16699,16697,16701,16702,16703,16704,11030,16705,11087,16706,
+8749,9801,5450,8730,16707,5401,7983,16708,6428,16709,16710,5893,6452,16712,
+9269,6453,5165,10755,9770,9270,6203,16714,7466,11537,6180,5894,9986,16716,
+16718,5962,16717,9045,16720,4630,16715,10057,4111,6475,11825,16719,16721,
+10538,7992,16723,16724,16722,4653,16730,16729,6918,16731,16726,16732,16727,
+10039,16725,16728,16897,16896,10816,16733,3914,16899,16898,7467,16900,8226,
+16902,16901,16903,16711,16713,16905,16904,6919,11592,6961,16906,5654,5151,
+5126,6722,11283,16912,16911,8227,16908,16910,7210,7711,16909,16907,9737,7468,
+10267,6454,9303,16913,16914,16936,5431,11804,8212,16915,4401,9046,10496,16916,
+5209,16917,16919,16920,9736,16921,16922,16923,5432,4402,9508,7175,6723,16924,
+7176,4393,10274,16925,
+10058,8228,16928,16929,9800,7712,16926,8768,16927,7469,3899,5128,16930,9047,
+16931,7974,11020,10242,16932,16933,8756,11558,16935,16934,6990,16937,3919,
+16940,16938,4403,5677,16939,6181,6225,10565,16941,10803,16943,7984,4142,4377,
+3851,16942,16944,16945,7510,16946,4654,16948,5705,5189,16949,5460,16950,8027,
+9516,7999,6484,16951,8769,8266,16953,16955,16952,16954,5633,16956,5637,5190,
+11313,16958,16959,4109,16962,4693,16961,16960,16964,16957,16965,11528,16966,
+16967,13139,16969,16968,16970,16971,11540,16972,20302,7470,16973,16974,7222,
+9495,16975,8711,16976,8731,16977,5380,12318,8764,6930,4903,16978,17153,16981,
+5191,16980,17155,16979,7471,16983,16984,9226,16985,4669,7737,10307,16987,8519,
+16982,16986,16988,6490,17157,10253,9989,9304,5433,17156,17154,10004,16989,
+8765,9306,9305,6485,17175,17159,17161,17164,17165,17162,17163,17160,17158,
+17152,10542,4404,17172,17169,17174,17173,9810,11014,6682,17167,17176,17171,
+17170,17166,17168,4904,8732,8028,9985,17181,9987,8000,17178,10030,17182,10546,
+8762,17177,17179,17180,17183,6947,9509,17188,17187,17184,11797,17193,17197,
+17194,17190,17191,17196,17185,12596,17192,17186,17195,17201,4905,17198,17199,
+17200,17203,17202,10069,17204,11611,10572,17209,17206,17205,7985,17208,17210,
+17207,17214,17211,17212,17189,17213,17215,17216,10533,17217,11073,5421,5640,
+17218,10515,7751,11023,17219,11538,9811,8229,9747,7212,3871,17224,17222,17220,
+4864,7472,17225,17223,17221,17229,17228,17227,17226,17230,17231,7961,17232,
+17234,
+17233,5937,8215,17236,9307,17235,17237,10516,8267,6182,17238,11559,17240,
+17241,17242,17243,6724,17244,5678,5193,5129,17408,11090,6183,17245,17411,
+11077,9755,10258,7234,17410,6962,6184,6725,5192,10517,17409,8230,10785,6486,
+6726,9020,17414,11582,6456,17415,7713,17417,7473,6415,17416,7177,5917,8231,
+17412,17418,17413,5679,17421,17425,5706,17420,17429,6185,11340,3867,17426,
+5194,17423,17424,9308,17422,17419,4615,8003,5895,17431,17428,17430,17427,5680,
+8466,17432,8269,17445,17441,17435,17439,7001,3900,17434,17442,17446,6186,
+11061,9013,17436,17444,17433,8733,17438,3868,11049,17437,5434,10059,8268,
+11567,7246,17485,17447,8029,17443,17448,17450,9048,17453,17449,10547,4906,
+11050,3901,17452,11612,17451,4174,9547,17454,17461,17455,17462,17458,9818,
+6953,17460,17457,17463,17456,7203,10756,7211,17459,17471,17467,17470,17468,
+17472,17466,17440,7986,10026,17469,17464,8192,5681,7178,7684,8213,17475,17477,
+17478,17474,17476,17465,17473,17481,17480,10841,5642,17479,17483,17482,17486,
+17488,6683,17484,17489,17490,17491,17497,9242,17493,17492,17494,17495,17496,
+17498,17499,4907,17500,17501,17664,17665,17666,17667,17668,17669,17671,17670,
+17672,17673,17674,17677,17675,17676,6464,5682,8757,10002,7247,9772,10060,
+17678,14156,17679,17681,11332,17680,17683,17682,11314,17684,10077,17685,17688,
+17687,17686,17689,5649,8193,5152,17693,17690,17691,17694,17695,17692,4104,
+4358,17697,17698,17699,11329,7179,17701,17700,7752,17702,17703,17704,4932,
+4908,17705,17706,10812,11330,
+11315,11798,6188,17709,6963,17708,17710,6920,8496,17711,6187,11062,17712,
+17713,17714,17715,17716,6921,11084,17718,8734,17717,17720,17719,17721,7962,
+17722,17723,10520,17724,8270,17725,17726,11613,17729,17728,17727,8975,17730,
+7685,17731,17732,11799,17733,17734,17736,17735,9988,9560,11805,9992,17738,
+7474,10249,17739,17737,4909,5939,6727,10061,5897,10786,17742,17740,6189,6190,
+3912,6471,9784,3902,17747,8735,9783,8506,17749,17745,17748,17743,17746,10757,
+5940,3932,17744,17751,17752,9496,5402,17925,9756,6728,5403,7975,11813,11021,
+17750,7987,5170,17753,17755,17754,17756,8709,9757,8976,17922,17921,17757,7732,
+10308,17924,17923,6191,11826,17940,17928,17929,6991,17927,6231,17926,17930,
+8977,10497,8194,8507,17934,17935,17931,17932,17933,6192,17941,17937,10309,
+10827,10247,17936,17939,17938,10787,17942,17943,8214,17944,17946,17950,17947,
+17945,9758,17948,17949,4369,17956,17951,17952,17953,8448,17955,17954,17957,
+17958,17959,7714,4424,17960,11574,6922,7180,6729,8758,17961,17962,4112,17963,
+17964,17965,17966,17967,5404,14601,17968,8004,17969,6954,17970,12047,17971,
+10557,4923,8195,7223,10320,7181,17972,6193,17973,10027,17987,17975,8488,9812,
+5918,17974,8196,17976,9049,17978,17977,17980,17979,17981,17983,17982,4910,
+17984,17985,17986,6416,11560,17988,7686,4175,17989,17990,17991,3921,17992,
+17993,10310,6950,17995,4616,3857,17994,17997,9773,7715,4405,10758,5692,5435,
+17996,4425,4866,4176,18001,11593,8508,10275,18013,4406,18011,18009,18000,
+17998,17999,
+6978,5451,8790,9520,4144,18003,18002,18008,18004,18007,11055,18006,4407,4700,
+18010,18012,5683,18178,18187,18188,3850,18195,3920,18186,18185,18180,18179,
+18177,18176,8770,8538,18182,18181,18184,8271,5684,4128,18183,6194,8272,18201,
+18202,4408,4365,18199,18189,18197,18204,18198,18196,18005,18194,18190,4911,
+18192,18203,18193,18205,18191,9819,11336,18200,18222,18214,7770,5157,5436,
+18209,4410,7475,18212,6457,9264,18217,10573,18208,4409,5941,10248,18218,18206,
+18215,18225,18210,18211,9497,18216,18213,10759,18219,3903,18207,18221,18220,
+9802,18227,18238,4701,18241,18223,18228,11341,18237,11316,11529,8791,4682,
+10321,18243,9472,3856,18236,18232,8273,18226,18234,18239,9739,3849,18231,
+18240,10327,18235,18230,7476,7182,6923,11063,10278,18246,18255,18233,4694,
+7511,18244,18249,8274,18245,18252,8766,18253,11317,18242,4631,18248,18251,
+11019,18254,18247,18250,10760,11776,18258,18265,18257,6946,18224,10541,11009,
+18264,18263,18259,18260,4117,18262,18256,9012,18261,3933,8449,10530,18266,
+18432,10040,18269,7477,6952,18434,5405,18435,10328,18268,18229,18267,11822,
+9473,10322,18442,18448,18449,18436,9813,18446,18438,18440,18450,18439,18443,
+4177,9540,18444,18447,18437,8197,18441,6662,7716,5647,11091,11096,7249,18454,
+18452,11821,18451,11348,18453,18455,18456,18459,18457,9474,18458,10028,18445,
+7250,18460,18465,8275,18464,18433,18466,8232,18461,18463,18462,15376,15361,
+18468,18467,11349,16667,18469,18470,18471,5942,5171,18473,12348,5204,11545,
+5458,18474,18475,8781,18476,
+9561,3865,4418,18481,18482,18477,6684,18478,9761,18479,18480,18490,18484,
+18487,18483,18485,18486,6967,18488,8736,5685,4641,18491,4638,18496,18492,
+18495,10009,18493,18494,10279,10041,18497,8540,18507,18503,4426,18501,10761,
+18502,18499,18500,18505,18508,18506,18504,18498,8759,18515,11017,18513,18514,
+18509,18511,18512,18510,8005,11800,18519,18520,18688,7689,18522,18525,18517,
+18516,18689,4411,18523,18690,18524,18521,8978,18518,9799,18694,11290,18693,
+18692,18701,18695,18703,11333,18706,18697,18698,18702,18705,18704,18696,18699,
+18716,18709,18707,18708,18713,18714,4617,5153,18712,18691,18711,18715,18710,
+18717,18719,18718,18721,18720,18489,18725,18722,18723,18724,18726,5707,18728,
+18727,7183,6195,15622,18729,7216,4632,18730,4145,7478,18731,6196,18732,3904,
+10268,18733,7753,18740,18737,8782,18738,18735,5437,18734,18741,5653,8509,
+18747,18743,8468,18742,18745,18736,18746,18748,10062,18744,18749,18751,5938,
+18739,3872,18750,6458,11605,18752,18753,8276,11521,18754,11284,18755,18756,
+10563,18757,6431,11522,18762,18763,7479,18761,11334,18758,18760,7964,7773,
+18759,18764,10498,18766,18765,4683,10762,18767,18779,18769,18770,18771,18772,
+18776,18777,18775,18773,18768,18774,18778,20246,4359,18781,5438,18780,18945,
+18944,18947,18946,18948,7184,18949,18950,18951,7965,11318,18952,10499,9765,
+18953,18954,5898,5131,18955,6730,9760,18956,4655,18957,18959,11350,18958,7717,
+18960,18961,18962,4912,18963,18964,18965,18966,4656,18967,18968,18969,4433,
+7687,18970,18971,18972,5919,9050,18973,
+5686,7733,18976,9475,18975,5648,18974,8534,5132,18977,18978,7480,5708,18979,
+10763,7998,5205,11092,8233,18980,7718,8783,7481,18981,18984,18985,6429,8481,
+18983,7482,10269,18982,6731,4146,18989,5687,6733,6732,11820,18988,18987,8198,
+5164,11810,4633,7483,18986,18991,18992,18990,5943,11295,6734,9734,18995,7967,
+8737,11285,18998,5963,7966,18994,18999,5964,18996,18997,18993,8001,9512,8718,
+4412,10063,5154,8979,19002,19000,8747,7968,4913,19001,7738,11561,11807,19003,
+19014,8980,19013,19010,19018,19011,19007,9051,19006,19004,11264,6735,19008,
+19005,19012,7251,5920,8537,10788,4153,3905,9476,19016,19015,9541,19020,19009,
+19019,19021,5899,19017,6197,6964,19022,11319,19025,19028,19026,10260,19023,
+5439,19027,19029,19033,19030,19032,19031,19034,6928,19036,19035,10311,19200,
+5688,19037,19201,19202,5155,17696,7512,19203,5965,19204,19205,6685,14637,
+19206,19207,7185,19208,19209,19210,19211,19212,8714,19213,19215,19214,9477,
+19216,10764,19217,19218,19219,19220,9529,7484,19221,6218,12045,19222,19223,
+10270,19224,19232,19225,19227,19226,19228,10789,19229,19230,19231,19233,4620,
+9030,10312,6465,6198,10286,4414,10029,19236,4914,7988,19235,19240,8792,11074,
+19238,19239,5133,19241,9794,8510,10064,9244,19237,10790,4427,19243,11783,8993,
+11812,6736,19242,8464,19259,8199,9559,10287,19246,6686,6737,7485,9796,5900,
+19245,19244,10313,6944,9265,19248,19249,6199,19247,19250,19251,19253,8450,
+19252,4933,19255,19254,19256,19258,19260,19261,7989,6958,19262,4657,
+19263,8277,19264,19265,10314,5134,19266,8981,4154,19267,6992,7765,8460,19270,
+19269,19268,19276,19274,19271,19273,19272,19275,5206,19279,7990,19280,5944,
+19277,19278,11784,8982,8200,19281,19284,19282,19283,11320,9478,19287,19285,
+19286,19288,19464,19291,19292,19290,19289,9052,19456,19460,19457,19293,19458,
+19459,19466,19461,7991,19463,19465,19462,19468,7186,19467,19469,19470,19473,
+19472,19471,19475,19474,11093,19477,19476,19478,19479,19481,19480,7719,19482,
+5452,19483,19485,19486,19487,19484,19488,6965,19489,5135,5650,5901,19490,9551,
+9245,19491,19494,6931,19493,19492,5689,19495,4658,19497,6459,19496,19505,
+19499,19501,10564,19498,19500,19504,19502,5136,19503,19506,9785,11575,7187,
+19507,11265,19509,19508,19512,11296,19511,4684,19510,19515,19514,19513,9233,
+19516,19517,19518,6219,5636,19519,19520,19521,7720,19522,6924,19523,19524,
+12544,12381,19525,17487,19526,8707,7690,9759,19527,10548,9011,6237,8712,4105,
+10839,7734,5693,5440,10549,19528,19530,19529,4415,9557,19531,9814,9234,19532,
+7217,19534,11041,19549,19536,19537,9000,8511,8278,9479,19535,5172,19544,19541,
+19716,9480,8767,19538,9053,9266,19539,19543,7743,9798,9003,7969,19542,8461,
+8451,19540,3848,11777,19545,8512,7188,7721,19547,19546,3918,19548,10254,19718,
+9530,7754,8760,5463,19717,11286,4126,10550,4416,19712,19713,19714,19715,9498,
+8706,3906,19719,19720,21250,8476,19721,4178,8235,5902,11321,19722,9227,8279,
+6966,19723,19726,7236,19724,8202,8201,3907,11562,19728,10065,19730,19729,
+19727,16963,4915,19533,19732,19731,19733,11287,9536,10765,19734,6968,19735,
+19736,19737,9216,3913,6200,11801,19741,5651,19738,19739,10323,4659,11288,5406,
+9267,19742,19743,19744,9217,19746,19745,9522,19747,7189,6975,9786,8784,6993,
+7755,19748,19749,7740,19750,19751,19752,11342,7190,19754,19753,6201,6226,6687,
+19757,7237,19756,19755,8520,5966,7970,9999,7192,19758,7486,19761,19759,19760,
+19763,19762,7513,19764,19765,19766,10031,6450,6976,19767,19768,11523,7204,
+11085,11563,19769,5441,19770,9218,19773,4695,7722,19771,19772,9023,10804,5467,
+19775,19776,19774,19778,9534,4642,19782,19779,19781,19777,20014,19780,11594,
+5945,19790,9235,19785,19788,19786,19791,19792,19784,19797,4179,19783,9996,
+19787,7487,6202,10791,5443,7205,9499,8204,19795,19789,19794,11042,8983,19796,
+19793,8203,19800,19799,19798,10766,7258,19801,10558,4147,10277,8785,5207,
+19803,6204,6667,19802,7756,7757,19968,19970,7514,19969,19971,5426,10276,6977,
+11778,19805,6487,11806,19973,19972,19974,19804,9544,9268,9014,19979,8738,
+19975,19976,5644,19978,5903,19977,7488,4696,19983,6430,8280,9001,4634,19981,
+19982,8994,19980,19984,19990,19993,19992,9228,19985,19986,19989,19991,5407,
+19994,19988,19987,19998,19999,20000,19997,19996,7489,9481,19995,20004,20002,
+20003,20001,8535,20005,20006,20008,4916,20007,11097,20019,20009,20012,20010,
+20011,20013,20015,20016,20017,20020,20018,20021,20023,20022,8984,11078,20024,
+8205,20025,10531,20026,4618,4123,4918,4917,20027,20028,20029,20030,20031,4919,
+4660,6205,10005,20033,20032,20034,4155,20037,20036,20035,20038,20041,3878,
+20039,20043,20042,20045,20044,20046,9485,20047,20048,20050,20049,10315,20051,
+20052,6468,20053,20054,10792,8234,3843,8490,20055,10316,20058,20056,6206,
+20057,5921,10532,20060,20224,20061,20225,4096,7735,7259,4920,20226,9797,20228,
+4097,20227,8995,11564,9482,20059,11525,5904,11322,5464,11539,5639,8513,17920,
+20229,4619,7758,4661,20231,20232,20230,5699,6460,7490,4098,11576,20234,19725,
+20233,20237,20235,20236,20238,20239,11595,20240,20241,7976,10010,7772,4934,
+11289,4428,7191,5946,20244,20243,6738,20245,20242,6663,20249,18700,12597,7766,
+20247,11524,9552,4106,8002,6933,10518,4127,11596,11338,20250,9252,7002,20251,
+20252,7723,20253,11597,20248,20255,20257,20256,20254,20258,20259,8281,4417,
+20260,11031,20261,20262,11785,14864,20263,20264,20265,20269,20266,20267,20268,
+20270,7971,11094,7972,20271,10066,20272,21042,11051,20273,20274,20275,4662,
+20277,7736,20278,5635,20279,20283,20281,20282,4690,20280,20284,20285,3879,
+20286,20287,7491,20288,5158,20291,20290,20289,19024,10555,20292,20293,20294,
+20295,20296,20297,4921,20298,20299,9730,20301,4378,20304,20303,4099,5408,
+10534,8985,6401,6207,7238,7739,20306,20305,11297,4935,10033,9531,7771,11565,
+5690,20309,20308,10794,9483,4143,20310,20307,10288,11337,20311,20312,20314,
+8521,4666,4667,20313,4936,5905,4937,9246,11583,5947,20315,20316,20317,20480,
+20482,20481,10326,20483,20484,20485,20486,20488,20487,20489,10067,17707,7688,
+5137,20490,
+20491,12555,15386,10034,3930,3866,6739,10767,7517,20492,11070,20493,11323,
+4129,6688,20494,4429,20495,20496,20498,20499,20501,20497,20500,4922,20502,
+20503,20504,20505,20506,20508,20507,20510,20513,20509,20511,20512,20514,5409,
+6994,20515,20516,6208,20517,4637,9774,20518,20519,8761,9546,20520,9820,8491,
+4151,5453,5454,8786,20525,5455,4430,20524,20522,20523,20521,20535,20526,20527,
+20528,20529,20531,20530,7224,20532,20534,5138,20533,8282,5906,20536,8492,
+20537,9484,20538,20543,20541,20540,20542,20539,20545,20544,20547,5410,20546,
+20548,20549,20551,20550,20552,20554,20553,6235,20555,20556,4635,20557,20558,
+7760,20559,20560,20561,20562,6209,20563,20564,20565,20566,20567,10000,20569,
+10245,20570,20568,20572,20571,20573,20736,20737,20738,20739,20740,20741,20742,
+20743,20744,20745,20746,20747,20748,20749,15380,20750,17239,5139,4608,6417,
+20752,20751,11012,20754,20755,20753,20756,10817,20757,5210,11780,20758,20760,
+3869,20761,10506,20759,20762,20763,20764,20765,20766,10829,6668,6489,8206,
+20767,20770,20768,20771,5968,20769,20772,20773,20774,20778,6665,8515,20779,
+20776,20775,20777,5694,20783,20782,20781,3858,20793,20789,20790,20786,20792,
+20788,4673,11819,20791,20787,20785,20784,20795,20798,20797,20796,10280,20794,
+3922,20799,20801,4686,20780,4118,20803,20802,20800,8716,10831,11577,20804,
+20805,20806,20807,20808,8986,20809,10006,20814,20810,20811,10768,11043,9519,
+20815,20816,9501,20813,20812,4361,20824,20823,4180,20821,20820,20818,4698,
+20817,6929,4360,6210,20827,20826,20825,
+20822,20828,20829,20996,20995,20997,4108,20992,20993,6227,11032,20994,10769,
+21002,20998,21003,21000,20999,5691,21004,21005,21006,21001,20819,21007,9024,
+21011,21012,21010,21009,21015,21008,21013,21014,21017,21016,21019,21020,21021,
+11816,21018,8522,6476,21022,21023,21024,21025,21026,5907,21027,21028,6926,
+21029,21030,21031,21032,21035,21033,11803,21034,11598,21036,11578,21037,9821,
+21038,21040,21041,21039,6220,11052,10818,13654,15423,10842,4362,21043,5167,
+21044,21045,21046,6228,21047,16179,11066,8514,21048,21050,21049,21051,21052,
+21053,21054,21055,21056,21057,21058,21059,21060,21061,21062,21063,9219,5948,
+21065,8236,21066,21067,10240,21068,21069,16918,19257,20300,21070,21071,21073,
+21074,21075,11599,21072,21076,21077,21079,21078,21081,21082,21080,11541,21083,
+21084,16947,21085,9,83,79,82,84,41,42,85,59,3,4,30,527,528,529,530,531,532,
+533,534,535,536,6,7,66,64,67,8,86,544,545,546,547,548,549,550,551,552,553,554,
+555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,45,46,15,17,13,
+576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,
+595,596,597,598,599,600,601,47,34,48,16,78,
diff --git a/libc-top-half/musl/src/locale/setlocale.c b/libc-top-half/musl/src/locale/setlocale.c
new file mode 100644
index 0000000..360c443
--- /dev/null
+++ b/libc-top-half/musl/src/locale/setlocale.c
@@ -0,0 +1,78 @@
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include "locale_impl.h"
+#include "libc.h"
+#include "lock.h"
+
+static char buf[LC_ALL*(LOCALE_NAME_MAX+1)];
+
+char *setlocale(int cat, const char *name)
+{
+ const struct __locale_map *lm;
+
+ if ((unsigned)cat > LC_ALL) return 0;
+
+ LOCK(__locale_lock);
+
+ /* For LC_ALL, setlocale is required to return a string which
+ * encodes the current setting for all categories. The format of
+ * this string is unspecified, and only the following code, which
+ * performs both the serialization and deserialization, depends
+ * on the format, so it can easily be changed if needed. */
+ if (cat == LC_ALL) {
+ int i;
+ if (name) {
+ struct __locale_struct tmp_locale;
+ char part[LOCALE_NAME_MAX+1] = "C.UTF-8";
+ const char *p = name;
+ for (i=0; i<LC_ALL; i++) {
+ const char *z = __strchrnul(p, ';');
+ if (z-p <= LOCALE_NAME_MAX) {
+ memcpy(part, p, z-p);
+ part[z-p] = 0;
+ if (*z) p = z+1;
+ }
+ lm = __get_locale(i, part);
+ if (lm == LOC_MAP_FAILED) {
+ UNLOCK(__locale_lock);
+ return 0;
+ }
+ tmp_locale.cat[i] = lm;
+ }
+ libc.global_locale = tmp_locale;
+ }
+ char *s = buf;
+ const char *part;
+ int same = 0;
+ for (i=0; i<LC_ALL; i++) {
+ const struct __locale_map *lm =
+ libc.global_locale.cat[i];
+ if (lm == libc.global_locale.cat[0]) same++;
+ part = lm ? lm->name : "C";
+ size_t l = strlen(part);
+ memcpy(s, part, l);
+ s[l] = ';';
+ s += l+1;
+ }
+ *--s = 0;
+ UNLOCK(__locale_lock);
+ return same==LC_ALL ? (char *)part : buf;
+ }
+
+ if (name) {
+ lm = __get_locale(cat, name);
+ if (lm == LOC_MAP_FAILED) {
+ UNLOCK(__locale_lock);
+ return 0;
+ }
+ libc.global_locale.cat[cat] = lm;
+ } else {
+ lm = libc.global_locale.cat[cat];
+ }
+ char *ret = lm ? (char *)lm->name : "C";
+
+ UNLOCK(__locale_lock);
+
+ return ret;
+}
diff --git a/libc-top-half/musl/src/locale/strcoll.c b/libc-top-half/musl/src/locale/strcoll.c
new file mode 100644
index 0000000..dd3cbc4
--- /dev/null
+++ b/libc-top-half/musl/src/locale/strcoll.c
@@ -0,0 +1,15 @@
+#include <string.h>
+#include <locale.h>
+#include "locale_impl.h"
+
+int __strcoll_l(const char *l, const char *r, locale_t loc)
+{
+ return strcmp(l, r);
+}
+
+int strcoll(const char *l, const char *r)
+{
+ return __strcoll_l(l, r, CURRENT_LOCALE);
+}
+
+weak_alias(__strcoll_l, strcoll_l);
diff --git a/libc-top-half/musl/src/locale/strfmon.c b/libc-top-half/musl/src/locale/strfmon.c
new file mode 100644
index 0000000..7cf2136
--- /dev/null
+++ b/libc-top-half/musl/src/locale/strfmon.c
@@ -0,0 +1,101 @@
+#include <stdio.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include <monetary.h>
+#include <errno.h>
+#include "locale_impl.h"
+
+static ssize_t vstrfmon_l(char *s, size_t n, locale_t loc, const char *fmt, va_list ap)
+{
+ size_t l;
+ double x;
+ int fill, nogrp, negpar, nosym, left, intl;
+ int lp, rp, w, fw;
+ char *s0=s;
+ for (; n && *fmt; ) {
+ if (*fmt != '%') {
+ literal:
+ *s++ = *fmt++;
+ n--;
+ continue;
+ }
+ fmt++;
+ if (*fmt == '%') goto literal;
+
+ fill = ' ';
+ nogrp = 0;
+ negpar = 0;
+ nosym = 0;
+ left = 0;
+ for (; ; fmt++) {
+ switch (*fmt) {
+ case '=':
+ fill = *++fmt;
+ continue;
+ case '^':
+ nogrp = 1;
+ continue;
+ case '(':
+ negpar = 1;
+ case '+':
+ continue;
+ case '!':
+ nosym = 1;
+ continue;
+ case '-':
+ left = 1;
+ continue;
+ }
+ break;
+ }
+
+ for (fw=0; isdigit(*fmt); fmt++)
+ fw = 10*fw + (*fmt-'0');
+ lp = 0;
+ rp = 2;
+ if (*fmt=='#') for (lp=0, fmt++; isdigit(*fmt); fmt++)
+ lp = 10*lp + (*fmt-'0');
+ if (*fmt=='.') for (rp=0, fmt++; isdigit(*fmt); fmt++)
+ rp = 10*rp + (*fmt-'0');
+
+ intl = *fmt++ == 'i';
+
+ w = lp + 1 + rp;
+ if (!left && fw>w) w = fw;
+
+ x = va_arg(ap, double);
+ l = snprintf(s, n, "%*.*f", w, rp, x);
+ if (l >= n) {
+ errno = E2BIG;
+ return -1;
+ }
+ s += l;
+ n -= l;
+ }
+ return s-s0;
+}
+
+ssize_t strfmon_l(char *restrict s, size_t n, locale_t loc, const char *restrict fmt, ...)
+{
+ va_list ap;
+ ssize_t ret;
+
+ va_start(ap, fmt);
+ ret = vstrfmon_l(s, n, loc, fmt, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+
+ssize_t strfmon(char *restrict s, size_t n, const char *restrict fmt, ...)
+{
+ va_list ap;
+ ssize_t ret;
+
+ va_start(ap, fmt);
+ ret = vstrfmon_l(s, n, CURRENT_LOCALE, fmt, ap);
+ va_end(ap);
+
+ return ret;
+}
diff --git a/libc-top-half/musl/src/locale/strtod_l.c b/libc-top-half/musl/src/locale/strtod_l.c
new file mode 100644
index 0000000..574ba14
--- /dev/null
+++ b/libc-top-half/musl/src/locale/strtod_l.c
@@ -0,0 +1,22 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <locale.h>
+
+float strtof_l(const char *restrict s, char **restrict p, locale_t l)
+{
+ return strtof(s, p);
+}
+
+double strtod_l(const char *restrict s, char **restrict p, locale_t l)
+{
+ return strtod(s, p);
+}
+
+long double strtold_l(const char *restrict s, char **restrict p, locale_t l)
+{
+ return strtold(s, p);
+}
+
+weak_alias(strtof_l, __strtof_l);
+weak_alias(strtod_l, __strtod_l);
+weak_alias(strtold_l, __strtold_l);
diff --git a/libc-top-half/musl/src/locale/strxfrm.c b/libc-top-half/musl/src/locale/strxfrm.c
new file mode 100644
index 0000000..c66c620
--- /dev/null
+++ b/libc-top-half/musl/src/locale/strxfrm.c
@@ -0,0 +1,18 @@
+#include <string.h>
+#include <locale.h>
+#include "locale_impl.h"
+
+/* collate only by code points */
+size_t __strxfrm_l(char *restrict dest, const char *restrict src, size_t n, locale_t loc)
+{
+ size_t l = strlen(src);
+ if (n > l) strcpy(dest, src);
+ return l;
+}
+
+size_t strxfrm(char *restrict dest, const char *restrict src, size_t n)
+{
+ return __strxfrm_l(dest, src, n, CURRENT_LOCALE);
+}
+
+weak_alias(__strxfrm_l, strxfrm_l);
diff --git a/libc-top-half/musl/src/locale/textdomain.c b/libc-top-half/musl/src/locale/textdomain.c
new file mode 100644
index 0000000..d727539
--- /dev/null
+++ b/libc-top-half/musl/src/locale/textdomain.c
@@ -0,0 +1,42 @@
+#include <libintl.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <limits.h>
+
+static char *current_domain;
+
+char *__gettextdomain()
+{
+ return current_domain ? current_domain : "messages";
+}
+
+char *textdomain(const char *domainname)
+{
+ if (!domainname) return __gettextdomain();
+
+ size_t domlen = strlen(domainname);
+ if (domlen > NAME_MAX) {
+ errno = EINVAL;
+ return 0;
+ }
+
+ if (!current_domain) {
+ current_domain = malloc(NAME_MAX+1);
+ if (!current_domain) return 0;
+ }
+
+ memcpy(current_domain, domainname, domlen+1);
+
+ return current_domain;
+}
+
+char *gettext(const char *msgid)
+{
+ return dgettext(0, msgid);
+}
+
+char *ngettext(const char *msgid1, const char *msgid2, unsigned long int n)
+{
+ return dngettext(0, msgid1, msgid2, n);
+}
diff --git a/libc-top-half/musl/src/locale/uselocale.c b/libc-top-half/musl/src/locale/uselocale.c
new file mode 100644
index 0000000..0cb9969
--- /dev/null
+++ b/libc-top-half/musl/src/locale/uselocale.c
@@ -0,0 +1,27 @@
+#include "locale_impl.h"
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#include "pthread_impl.h"
+#endif
+#include "libc.h"
+
+locale_t __uselocale(locale_t new)
+{
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ pthread_t self = __pthread_self();
+ locale_t old = self->locale;
+#else
+ locale_t old = libc.current_locale;
+ if (!old) old = LC_GLOBAL_LOCALE;
+#endif
+ locale_t global = &libc.global_locale;
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ if (new) self->locale = new == LC_GLOBAL_LOCALE ? global : new;
+#else
+ if (new) libc.current_locale = new == LC_GLOBAL_LOCALE ? global : new;
+#endif
+
+ return old == global ? LC_GLOBAL_LOCALE : old;
+}
+
+weak_alias(__uselocale, uselocale);
diff --git a/libc-top-half/musl/src/locale/wcscoll.c b/libc-top-half/musl/src/locale/wcscoll.c
new file mode 100644
index 0000000..ad2cc69
--- /dev/null
+++ b/libc-top-half/musl/src/locale/wcscoll.c
@@ -0,0 +1,16 @@
+#include <wchar.h>
+#include <locale.h>
+#include "locale_impl.h"
+
+/* FIXME: stub */
+int __wcscoll_l(const wchar_t *l, const wchar_t *r, locale_t locale)
+{
+ return wcscmp(l, r);
+}
+
+int wcscoll(const wchar_t *l, const wchar_t *r)
+{
+ return __wcscoll_l(l, r, CURRENT_LOCALE);
+}
+
+weak_alias(__wcscoll_l, wcscoll_l);
diff --git a/libc-top-half/musl/src/locale/wcsxfrm.c b/libc-top-half/musl/src/locale/wcsxfrm.c
new file mode 100644
index 0000000..05e3e11
--- /dev/null
+++ b/libc-top-half/musl/src/locale/wcsxfrm.c
@@ -0,0 +1,23 @@
+#include <wchar.h>
+#include <locale.h>
+#include "locale_impl.h"
+
+/* collate only by code points */
+size_t __wcsxfrm_l(wchar_t *restrict dest, const wchar_t *restrict src, size_t n, locale_t loc)
+{
+ size_t l = wcslen(src);
+ if (l < n) {
+ wmemcpy(dest, src, l+1);
+ } else if (n) {
+ wmemcpy(dest, src, n-1);
+ dest[n-1] = 0;
+ }
+ return l;
+}
+
+size_t wcsxfrm(wchar_t *restrict dest, const wchar_t *restrict src, size_t n)
+{
+ return __wcsxfrm_l(dest, src, n, CURRENT_LOCALE);
+}
+
+weak_alias(__wcsxfrm_l, wcsxfrm_l);
diff --git a/libc-top-half/musl/src/malloc/calloc.c b/libc-top-half/musl/src/malloc/calloc.c
new file mode 100644
index 0000000..bf6bddc
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/calloc.c
@@ -0,0 +1,45 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+#include "dynlink.h"
+
+static size_t mal0_clear(char *p, size_t n)
+{
+ const size_t pagesz = 4096; /* arbitrary */
+ if (n < pagesz) return n;
+#ifdef __GNUC__
+ typedef uint64_t __attribute__((__may_alias__)) T;
+#else
+ typedef unsigned char T;
+#endif
+ char *pp = p + n;
+ size_t i = (uintptr_t)pp & (pagesz - 1);
+ for (;;) {
+ pp = memset(pp - i, 0, i);
+ if (pp - p < pagesz) return pp - p;
+ for (i = pagesz; i; i -= 2*sizeof(T), pp -= 2*sizeof(T))
+ if (((T *)pp)[-1] | ((T *)pp)[-2])
+ break;
+ }
+}
+
+static int allzerop(void *p)
+{
+ return 0;
+}
+weak_alias(allzerop, __malloc_allzerop);
+
+void *calloc(size_t m, size_t n)
+{
+ if (n && m > (size_t)-1/n) {
+ errno = ENOMEM;
+ return 0;
+ }
+ n *= m;
+ void *p = malloc(n);
+ if (!p || (!__malloc_replaced && __malloc_allzerop(p)))
+ return p;
+ n = mal0_clear(p, n);
+ return memset(p, 0, n);
+}
diff --git a/libc-top-half/musl/src/malloc/free.c b/libc-top-half/musl/src/malloc/free.c
new file mode 100644
index 0000000..3944f7b
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/free.c
@@ -0,0 +1,6 @@
+#include <stdlib.h>
+
+void free(void *p)
+{
+ __libc_free(p);
+}
diff --git a/libc-top-half/musl/src/malloc/libc_calloc.c b/libc-top-half/musl/src/malloc/libc_calloc.c
new file mode 100644
index 0000000..d25eabe
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/libc_calloc.c
@@ -0,0 +1,4 @@
+#define calloc __libc_calloc
+#define malloc __libc_malloc
+
+#include "calloc.c"
diff --git a/libc-top-half/musl/src/malloc/lite_malloc.c b/libc-top-half/musl/src/malloc/lite_malloc.c
new file mode 100644
index 0000000..43a988f
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/lite_malloc.c
@@ -0,0 +1,118 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include <limits.h>
+#include <errno.h>
+#include <sys/mman.h>
+#include "libc.h"
+#include "lock.h"
+#include "syscall.h"
+#include "fork_impl.h"
+
+#define ALIGN 16
+
+/* This function returns true if the interval [old,new]
+ * intersects the 'len'-sized interval below &libc.auxv
+ * (interpreted as the main-thread stack) or below &b
+ * (the current stack). It is used to defend against
+ * buggy brk implementations that can cross the stack. */
+
+static int traverses_stack_p(uintptr_t old, uintptr_t new)
+{
+ const uintptr_t len = 8<<20;
+ uintptr_t a, b;
+
+ b = (uintptr_t)libc.auxv;
+ a = b > len ? b-len : 0;
+ if (new>a && old<b) return 1;
+
+ b = (uintptr_t)&b;
+ a = b > len ? b-len : 0;
+ if (new>a && old<b) return 1;
+
+ return 0;
+}
+
+static volatile int lock[1];
+volatile int *const __bump_lockptr = lock;
+
+static void *__simple_malloc(size_t n)
+{
+ static uintptr_t brk, cur, end;
+ static unsigned mmap_step;
+ size_t align=1;
+ void *p;
+
+ if (n > SIZE_MAX/2) {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ if (!n) n++;
+ while (align<n && align<ALIGN)
+ align += align;
+
+ LOCK(lock);
+
+ cur += -cur & align-1;
+
+ if (n > end-cur) {
+ size_t req = n - (end-cur) + PAGE_SIZE-1 & -PAGE_SIZE;
+
+ if (!cur) {
+ brk = __syscall(SYS_brk, 0);
+ brk += -brk & PAGE_SIZE-1;
+ cur = end = brk;
+ }
+
+ if (brk == end && req < SIZE_MAX-brk
+ && !traverses_stack_p(brk, brk+req)
+ && __syscall(SYS_brk, brk+req)==brk+req) {
+ brk = end += req;
+ } else {
+ int new_area = 0;
+ req = n + PAGE_SIZE-1 & -PAGE_SIZE;
+ /* Only make a new area rather than individual mmap
+ * if wasted space would be over 1/8 of the map. */
+ if (req-n > req/8) {
+ /* Geometric area size growth up to 64 pages,
+ * bounding waste by 1/8 of the area. */
+ size_t min = PAGE_SIZE<<(mmap_step/2);
+ if (min-n > end-cur) {
+ if (req < min) {
+ req = min;
+ if (mmap_step < 12)
+ mmap_step++;
+ }
+ new_area = 1;
+ }
+ }
+ void *mem = __mmap(0, req, PROT_READ|PROT_WRITE,
+ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ if (mem == MAP_FAILED || !new_area) {
+ UNLOCK(lock);
+ return mem==MAP_FAILED ? 0 : mem;
+ }
+ cur = (uintptr_t)mem;
+ end = cur + req;
+ }
+ }
+
+ p = (void *)cur;
+ cur += n;
+ UNLOCK(lock);
+ return p;
+}
+
+weak_alias(__simple_malloc, __libc_malloc_impl);
+
+void *__libc_malloc(size_t n)
+{
+ return __libc_malloc_impl(n);
+}
+
+static void *default_malloc(size_t n)
+{
+ return __libc_malloc_impl(n);
+}
+
+weak_alias(default_malloc, malloc);
diff --git a/libc-top-half/musl/src/malloc/mallocng/aligned_alloc.c b/libc-top-half/musl/src/malloc/mallocng/aligned_alloc.c
new file mode 100644
index 0000000..e0862a8
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/mallocng/aligned_alloc.c
@@ -0,0 +1,60 @@
+#include <stdlib.h>
+#include <errno.h>
+#include "meta.h"
+
+void *aligned_alloc(size_t align, size_t len)
+{
+ if ((align & -align) != align) {
+ errno = EINVAL;
+ return 0;
+ }
+
+ if (len > SIZE_MAX - align || align >= (1ULL<<31)*UNIT) {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ if (DISABLE_ALIGNED_ALLOC) {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ if (align <= UNIT) align = UNIT;
+
+ unsigned char *p = malloc(len + align - UNIT);
+ if (!p)
+ return 0;
+
+ struct meta *g = get_meta(p);
+ int idx = get_slot_index(p);
+ size_t stride = get_stride(g);
+ unsigned char *start = g->mem->storage + stride*idx;
+ unsigned char *end = g->mem->storage + stride*(idx+1) - IB;
+ size_t adj = -(uintptr_t)p & (align-1);
+
+ if (!adj) {
+ set_size(p, end, len);
+ return p;
+ }
+ p += adj;
+ uint32_t offset = (size_t)(p-g->mem->storage)/UNIT;
+ if (offset <= 0xffff) {
+ *(uint16_t *)(p-2) = offset;
+ p[-4] = 0;
+ } else {
+ // use a 32-bit offset if 16-bit doesn't fit. for this,
+ // 16-bit field must be zero, [-4] byte nonzero.
+ *(uint16_t *)(p-2) = 0;
+ *(uint32_t *)(p-8) = offset;
+ p[-4] = 1;
+ }
+ p[-3] = idx;
+ set_size(p, end, len);
+ // store offset to aligned enframing. this facilitates cycling
+ // offset and also iteration of heap for debugging/measurement.
+ // for extreme overalignment it won't fit but these are classless
+ // allocations anyway.
+ *(uint16_t *)(start - 2) = (size_t)(p-start)/UNIT;
+ start[-3] = 7<<5;
+ return p;
+}
diff --git a/libc-top-half/musl/src/malloc/mallocng/donate.c b/libc-top-half/musl/src/malloc/mallocng/donate.c
new file mode 100644
index 0000000..41d850f
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/mallocng/donate.c
@@ -0,0 +1,39 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include <limits.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <errno.h>
+
+#include "meta.h"
+
+static void donate(unsigned char *base, size_t len)
+{
+ uintptr_t a = (uintptr_t)base;
+ uintptr_t b = a + len;
+ a += -a & (UNIT-1);
+ b -= b & (UNIT-1);
+ memset(base, 0, len);
+ for (int sc=47; sc>0 && b>a; sc-=4) {
+ if (b-a < (size_classes[sc]+1)*UNIT) continue;
+ struct meta *m = alloc_meta();
+ m->avail_mask = 0;
+ m->freed_mask = 1;
+ m->mem = (void *)a;
+ m->mem->meta = m;
+ m->last_idx = 0;
+ m->freeable = 0;
+ m->sizeclass = sc;
+ m->maplen = 0;
+ *((unsigned char *)m->mem+UNIT-4) = 0;
+ *((unsigned char *)m->mem+UNIT-3) = 255;
+ m->mem->storage[size_classes[sc]*UNIT-4] = 0;
+ queue(&ctx.active[sc], m);
+ a += (size_classes[sc]+1)*UNIT;
+ }
+}
+
+void __malloc_donate(char *start, char *end)
+{
+ donate((void *)start, end-start);
+}
diff --git a/libc-top-half/musl/src/malloc/mallocng/free.c b/libc-top-half/musl/src/malloc/mallocng/free.c
new file mode 100644
index 0000000..418a085
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/mallocng/free.c
@@ -0,0 +1,151 @@
+#define _BSD_SOURCE
+#include <stdlib.h>
+#include <sys/mman.h>
+
+#include "meta.h"
+
+struct mapinfo {
+ void *base;
+ size_t len;
+};
+
+static struct mapinfo nontrivial_free(struct meta *, int);
+
+static struct mapinfo free_group(struct meta *g)
+{
+ struct mapinfo mi = { 0 };
+ int sc = g->sizeclass;
+ if (sc < 48) {
+ ctx.usage_by_class[sc] -= g->last_idx+1;
+ }
+ if (g->maplen) {
+ step_seq();
+ record_seq(sc);
+ mi.base = g->mem;
+ mi.len = g->maplen*4096UL;
+ } else {
+ void *p = g->mem;
+ struct meta *m = get_meta(p);
+ int idx = get_slot_index(p);
+ g->mem->meta = 0;
+ // not checking size/reserved here; it's intentionally invalid
+ mi = nontrivial_free(m, idx);
+ }
+ free_meta(g);
+ return mi;
+}
+
+static int okay_to_free(struct meta *g)
+{
+ int sc = g->sizeclass;
+
+ if (!g->freeable) return 0;
+
+ // always free individual mmaps not suitable for reuse
+ if (sc >= 48 || get_stride(g) < UNIT*size_classes[sc])
+ return 1;
+
+ // always free groups allocated inside another group's slot
+ // since recreating them should not be expensive and they
+ // might be blocking freeing of a much larger group.
+ if (!g->maplen) return 1;
+
+ // if there is another non-full group, free this one to
+ // consolidate future allocations, reduce fragmentation.
+ if (g->next != g) return 1;
+
+ // free any group in a size class that's not bouncing
+ if (!is_bouncing(sc)) return 1;
+
+ size_t cnt = g->last_idx+1;
+ size_t usage = ctx.usage_by_class[sc];
+
+ // if usage is high enough that a larger count should be
+ // used, free the low-count group so a new one will be made.
+ if (9*cnt <= usage && cnt < 20)
+ return 1;
+
+ // otherwise, keep the last group in a bouncing class.
+ return 0;
+}
+
+static struct mapinfo nontrivial_free(struct meta *g, int i)
+{
+ uint32_t self = 1u<<i;
+ int sc = g->sizeclass;
+ uint32_t mask = g->freed_mask | g->avail_mask;
+
+ if (mask+self == (2u<<g->last_idx)-1 && okay_to_free(g)) {
+ // any multi-slot group is necessarily on an active list
+ // here, but single-slot groups might or might not be.
+ if (g->next) {
+ assert(sc < 48);
+ int activate_new = (ctx.active[sc]==g);
+ dequeue(&ctx.active[sc], g);
+ if (activate_new && ctx.active[sc])
+ activate_group(ctx.active[sc]);
+ }
+ return free_group(g);
+ } else if (!mask) {
+ assert(sc < 48);
+ // might still be active if there were no allocations
+ // after last available slot was taken.
+ if (ctx.active[sc] != g) {
+ queue(&ctx.active[sc], g);
+ }
+ }
+ a_or(&g->freed_mask, self);
+ return (struct mapinfo){ 0 };
+}
+
+void free(void *p)
+{
+ if (!p) return;
+
+ struct meta *g = get_meta(p);
+ int idx = get_slot_index(p);
+ size_t stride = get_stride(g);
+ unsigned char *start = g->mem->storage + stride*idx;
+ unsigned char *end = start + stride - IB;
+ get_nominal_size(p, end);
+ uint32_t self = 1u<<idx, all = (2u<<g->last_idx)-1;
+ ((unsigned char *)p)[-3] = 255;
+ // invalidate offset to group header, and cycle offset of
+ // used region within slot if current offset is zero.
+ *(uint16_t *)((char *)p-2) = 0;
+
+ // release any whole pages contained in the slot to be freed
+ // unless it's a single-slot group that will be unmapped.
+ if (((uintptr_t)(start-1) ^ (uintptr_t)end) >= 2*PGSZ && g->last_idx) {
+ unsigned char *base = start + (-(uintptr_t)start & (PGSZ-1));
+ size_t len = (end-base) & -PGSZ;
+ if (len) {
+ int e = errno;
+ madvise(base, len, MADV_FREE);
+ errno = e;
+ }
+ }
+
+ // atomic free without locking if this is neither first or last slot
+ for (;;) {
+ uint32_t freed = g->freed_mask;
+ uint32_t avail = g->avail_mask;
+ uint32_t mask = freed | avail;
+ assert(!(mask&self));
+ if (!freed || mask+self==all) break;
+ if (!MT)
+ g->freed_mask = freed+self;
+ else if (a_cas(&g->freed_mask, freed, freed+self)!=freed)
+ continue;
+ return;
+ }
+
+ wrlock();
+ struct mapinfo mi = nontrivial_free(g, idx);
+ unlock();
+ if (mi.len) {
+ int e = errno;
+ munmap(mi.base, mi.len);
+ errno = e;
+ }
+}
diff --git a/libc-top-half/musl/src/malloc/mallocng/glue.h b/libc-top-half/musl/src/malloc/mallocng/glue.h
new file mode 100644
index 0000000..151c48b
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/mallocng/glue.h
@@ -0,0 +1,93 @@
+#ifndef MALLOC_GLUE_H
+#define MALLOC_GLUE_H
+
+#include <stdint.h>
+#include <sys/mman.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <elf.h>
+#include <string.h>
+#include "atomic.h"
+#include "syscall.h"
+#include "libc.h"
+#include "lock.h"
+#include "dynlink.h"
+
+// use macros to appropriately namespace these.
+#define size_classes __malloc_size_classes
+#define ctx __malloc_context
+#define alloc_meta __malloc_alloc_meta
+#define is_allzero __malloc_allzerop
+#define dump_heap __dump_heap
+
+#define malloc __libc_malloc_impl
+#define realloc __libc_realloc
+#define free __libc_free
+
+#if USE_REAL_ASSERT
+#include <assert.h>
+#else
+#undef assert
+#define assert(x) do { if (!(x)) a_crash(); } while(0)
+#endif
+
+#define brk(p) ((uintptr_t)__syscall(SYS_brk, p))
+
+#define mmap __mmap
+#define madvise __madvise
+#define mremap __mremap
+
+#define DISABLE_ALIGNED_ALLOC (__malloc_replaced && !__aligned_alloc_replaced)
+
+static inline uint64_t get_random_secret()
+{
+ uint64_t secret = (uintptr_t)&secret * 1103515245;
+ for (size_t i=0; libc.auxv[i]; i+=2)
+ if (libc.auxv[i]==AT_RANDOM)
+ memcpy(&secret, (char *)libc.auxv[i+1]+8, sizeof secret);
+ return secret;
+}
+
+#ifndef PAGESIZE
+#define PAGESIZE PAGE_SIZE
+#endif
+
+#define MT (libc.need_locks)
+
+#define RDLOCK_IS_EXCLUSIVE 1
+
+__attribute__((__visibility__("hidden")))
+extern int __malloc_lock[1];
+
+#define LOCK_OBJ_DEF \
+int __malloc_lock[1]; \
+void __malloc_atfork(int who) { malloc_atfork(who); }
+
+static inline void rdlock()
+{
+ if (MT) LOCK(__malloc_lock);
+}
+static inline void wrlock()
+{
+ if (MT) LOCK(__malloc_lock);
+}
+static inline void unlock()
+{
+ UNLOCK(__malloc_lock);
+}
+static inline void upgradelock()
+{
+}
+static inline void resetlock()
+{
+ __malloc_lock[0] = 0;
+}
+
+static inline void malloc_atfork(int who)
+{
+ if (who<0) rdlock();
+ else if (who>0) resetlock();
+ else unlock();
+}
+
+#endif
diff --git a/libc-top-half/musl/src/malloc/mallocng/malloc.c b/libc-top-half/musl/src/malloc/mallocng/malloc.c
new file mode 100644
index 0000000..d695ab8
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/mallocng/malloc.c
@@ -0,0 +1,387 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include <limits.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <errno.h>
+
+#include "meta.h"
+
+LOCK_OBJ_DEF;
+
+const uint16_t size_classes[] = {
+ 1, 2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 12, 15,
+ 18, 20, 25, 31,
+ 36, 42, 50, 63,
+ 72, 84, 102, 127,
+ 146, 170, 204, 255,
+ 292, 340, 409, 511,
+ 584, 682, 818, 1023,
+ 1169, 1364, 1637, 2047,
+ 2340, 2730, 3276, 4095,
+ 4680, 5460, 6552, 8191,
+};
+
+static const uint8_t small_cnt_tab[][3] = {
+ { 30, 30, 30 },
+ { 31, 15, 15 },
+ { 20, 10, 10 },
+ { 31, 15, 7 },
+ { 25, 12, 6 },
+ { 21, 10, 5 },
+ { 18, 8, 4 },
+ { 31, 15, 7 },
+ { 28, 14, 6 },
+};
+
+static const uint8_t med_cnt_tab[4] = { 28, 24, 20, 32 };
+
+struct malloc_context ctx = { 0 };
+
+struct meta *alloc_meta(void)
+{
+ struct meta *m;
+ unsigned char *p;
+ if (!ctx.init_done) {
+#ifndef PAGESIZE
+ ctx.pagesize = get_page_size();
+#endif
+ ctx.secret = get_random_secret();
+ ctx.init_done = 1;
+ }
+ size_t pagesize = PGSZ;
+ if (pagesize < 4096) pagesize = 4096;
+ if ((m = dequeue_head(&ctx.free_meta_head))) return m;
+ if (!ctx.avail_meta_count) {
+ int need_unprotect = 1;
+ if (!ctx.avail_meta_area_count && ctx.brk!=-1) {
+ uintptr_t new = ctx.brk + pagesize;
+ int need_guard = 0;
+ if (!ctx.brk) {
+ need_guard = 1;
+ ctx.brk = brk(0);
+ // some ancient kernels returned _ebss
+ // instead of next page as initial brk.
+ ctx.brk += -ctx.brk & (pagesize-1);
+ new = ctx.brk + 2*pagesize;
+ }
+ if (brk(new) != new) {
+ ctx.brk = -1;
+ } else {
+ if (need_guard) mmap((void *)ctx.brk, pagesize,
+ PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);
+ ctx.brk = new;
+ ctx.avail_meta_areas = (void *)(new - pagesize);
+ ctx.avail_meta_area_count = pagesize>>12;
+ need_unprotect = 0;
+ }
+ }
+ if (!ctx.avail_meta_area_count) {
+ size_t n = 2UL << ctx.meta_alloc_shift;
+ p = mmap(0, n*pagesize, PROT_NONE,
+ MAP_PRIVATE|MAP_ANON, -1, 0);
+ if (p==MAP_FAILED) return 0;
+ ctx.avail_meta_areas = p + pagesize;
+ ctx.avail_meta_area_count = (n-1)*(pagesize>>12);
+ ctx.meta_alloc_shift++;
+ }
+ p = ctx.avail_meta_areas;
+ if ((uintptr_t)p & (pagesize-1)) need_unprotect = 0;
+ if (need_unprotect)
+ if (mprotect(p, pagesize, PROT_READ|PROT_WRITE)
+ && errno != ENOSYS)
+ return 0;
+ ctx.avail_meta_area_count--;
+ ctx.avail_meta_areas = p + 4096;
+ if (ctx.meta_area_tail) {
+ ctx.meta_area_tail->next = (void *)p;
+ } else {
+ ctx.meta_area_head = (void *)p;
+ }
+ ctx.meta_area_tail = (void *)p;
+ ctx.meta_area_tail->check = ctx.secret;
+ ctx.avail_meta_count = ctx.meta_area_tail->nslots
+ = (4096-sizeof(struct meta_area))/sizeof *m;
+ ctx.avail_meta = ctx.meta_area_tail->slots;
+ }
+ ctx.avail_meta_count--;
+ m = ctx.avail_meta++;
+ m->prev = m->next = 0;
+ return m;
+}
+
+static uint32_t try_avail(struct meta **pm)
+{
+ struct meta *m = *pm;
+ uint32_t first;
+ if (!m) return 0;
+ uint32_t mask = m->avail_mask;
+ if (!mask) {
+ if (!m) return 0;
+ if (!m->freed_mask) {
+ dequeue(pm, m);
+ m = *pm;
+ if (!m) return 0;
+ } else {
+ m = m->next;
+ *pm = m;
+ }
+
+ mask = m->freed_mask;
+
+ // skip fully-free group unless it's the only one
+ // or it's a permanently non-freeable group
+ if (mask == (2u<<m->last_idx)-1 && m->freeable) {
+ m = m->next;
+ *pm = m;
+ mask = m->freed_mask;
+ }
+
+ // activate more slots in a not-fully-active group
+ // if needed, but only as a last resort. prefer using
+ // any other group with free slots. this avoids
+ // touching & dirtying as-yet-unused pages.
+ if (!(mask & ((2u<<m->mem->active_idx)-1))) {
+ if (m->next != m) {
+ m = m->next;
+ *pm = m;
+ } else {
+ int cnt = m->mem->active_idx + 2;
+ int size = size_classes[m->sizeclass]*UNIT;
+ int span = UNIT + size*cnt;
+ // activate up to next 4k boundary
+ while ((span^(span+size-1)) < 4096) {
+ cnt++;
+ span += size;
+ }
+ if (cnt > m->last_idx+1)
+ cnt = m->last_idx+1;
+ m->mem->active_idx = cnt-1;
+ }
+ }
+ mask = activate_group(m);
+ assert(mask);
+ decay_bounces(m->sizeclass);
+ }
+ first = mask&-mask;
+ m->avail_mask = mask-first;
+ return first;
+}
+
+static int alloc_slot(int, size_t);
+
+static struct meta *alloc_group(int sc, size_t req)
+{
+ size_t size = UNIT*size_classes[sc];
+ int i = 0, cnt;
+ unsigned char *p;
+ struct meta *m = alloc_meta();
+ if (!m) return 0;
+ size_t usage = ctx.usage_by_class[sc];
+ size_t pagesize = PGSZ;
+ int active_idx;
+ if (sc < 9) {
+ while (i<2 && 4*small_cnt_tab[sc][i] > usage)
+ i++;
+ cnt = small_cnt_tab[sc][i];
+ } else {
+ // lookup max number of slots fitting in power-of-two size
+ // from a table, along with number of factors of two we
+ // can divide out without a remainder or reaching 1.
+ cnt = med_cnt_tab[sc&3];
+
+ // reduce cnt to avoid excessive eagar allocation.
+ while (!(cnt&1) && 4*cnt > usage)
+ cnt >>= 1;
+
+ // data structures don't support groups whose slot offsets
+ // in units don't fit in 16 bits.
+ while (size*cnt >= 65536*UNIT)
+ cnt >>= 1;
+ }
+
+ // If we selected a count of 1 above but it's not sufficient to use
+ // mmap, increase to 2. Then it might be; if not it will nest.
+ if (cnt==1 && size*cnt+UNIT <= pagesize/2) cnt = 2;
+
+ // All choices of size*cnt are "just below" a power of two, so anything
+ // larger than half the page size should be allocated as whole pages.
+ if (size*cnt+UNIT > pagesize/2) {
+ // check/update bounce counter to start/increase retention
+ // of freed maps, and inhibit use of low-count, odd-size
+ // small mappings and single-slot groups if activated.
+ int nosmall = is_bouncing(sc);
+ account_bounce(sc);
+ step_seq();
+
+ // since the following count reduction opportunities have
+ // an absolute memory usage cost, don't overdo them. count
+ // coarse usage as part of usage.
+ if (!(sc&1) && sc<32) usage += ctx.usage_by_class[sc+1];
+
+ // try to drop to a lower count if the one found above
+ // increases usage by more than 25%. these reduced counts
+ // roughly fill an integral number of pages, just not a
+ // power of two, limiting amount of unusable space.
+ if (4*cnt > usage && !nosmall) {
+ if (0);
+ else if ((sc&3)==1 && size*cnt>8*pagesize) cnt = 2;
+ else if ((sc&3)==2 && size*cnt>4*pagesize) cnt = 3;
+ else if ((sc&3)==0 && size*cnt>8*pagesize) cnt = 3;
+ else if ((sc&3)==0 && size*cnt>2*pagesize) cnt = 5;
+ }
+ size_t needed = size*cnt + UNIT;
+ needed += -needed & (pagesize-1);
+
+ // produce an individually-mmapped allocation if usage is low,
+ // bounce counter hasn't triggered, and either it saves memory
+ // or it avoids eagar slot allocation without wasting too much.
+ if (!nosmall && cnt<=7) {
+ req += IB + UNIT;
+ req += -req & (pagesize-1);
+ if (req<size+UNIT || (req>=4*pagesize && 2*cnt>usage)) {
+ cnt = 1;
+ needed = req;
+ }
+ }
+
+ p = mmap(0, needed, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
+ if (p==MAP_FAILED) {
+ free_meta(m);
+ return 0;
+ }
+ m->maplen = needed>>12;
+ ctx.mmap_counter++;
+ active_idx = (4096-UNIT)/size-1;
+ if (active_idx > cnt-1) active_idx = cnt-1;
+ if (active_idx < 0) active_idx = 0;
+ } else {
+ int j = size_to_class(UNIT+cnt*size-IB);
+ int idx = alloc_slot(j, UNIT+cnt*size-IB);
+ if (idx < 0) {
+ free_meta(m);
+ return 0;
+ }
+ struct meta *g = ctx.active[j];
+ p = enframe(g, idx, UNIT*size_classes[j]-IB, ctx.mmap_counter);
+ m->maplen = 0;
+ p[-3] = (p[-3]&31) | (6<<5);
+ for (int i=0; i<=cnt; i++)
+ p[UNIT+i*size-4] = 0;
+ active_idx = cnt-1;
+ }
+ ctx.usage_by_class[sc] += cnt;
+ m->avail_mask = (2u<<active_idx)-1;
+ m->freed_mask = (2u<<(cnt-1))-1 - m->avail_mask;
+ m->mem = (void *)p;
+ m->mem->meta = m;
+ m->mem->active_idx = active_idx;
+ m->last_idx = cnt-1;
+ m->freeable = 1;
+ m->sizeclass = sc;
+ return m;
+}
+
+static int alloc_slot(int sc, size_t req)
+{
+ uint32_t first = try_avail(&ctx.active[sc]);
+ if (first) return a_ctz_32(first);
+
+ struct meta *g = alloc_group(sc, req);
+ if (!g) return -1;
+
+ g->avail_mask--;
+ queue(&ctx.active[sc], g);
+ return 0;
+}
+
+void *malloc(size_t n)
+{
+ if (size_overflows(n)) return 0;
+ struct meta *g;
+ uint32_t mask, first;
+ int sc;
+ int idx;
+ int ctr;
+
+ if (n >= MMAP_THRESHOLD) {
+ size_t needed = n + IB + UNIT;
+ void *p = mmap(0, needed, PROT_READ|PROT_WRITE,
+ MAP_PRIVATE|MAP_ANON, -1, 0);
+ if (p==MAP_FAILED) return 0;
+ wrlock();
+ step_seq();
+ g = alloc_meta();
+ if (!g) {
+ unlock();
+ munmap(p, needed);
+ return 0;
+ }
+ g->mem = p;
+ g->mem->meta = g;
+ g->last_idx = 0;
+ g->freeable = 1;
+ g->sizeclass = 63;
+ g->maplen = (needed+4095)/4096;
+ g->avail_mask = g->freed_mask = 0;
+ // use a global counter to cycle offset in
+ // individually-mmapped allocations.
+ ctx.mmap_counter++;
+ idx = 0;
+ goto success;
+ }
+
+ sc = size_to_class(n);
+
+ rdlock();
+ g = ctx.active[sc];
+
+ // use coarse size classes initially when there are not yet
+ // any groups of desired size. this allows counts of 2 or 3
+ // to be allocated at first rather than having to start with
+ // 7 or 5, the min counts for even size classes.
+ if (!g && sc>=4 && sc<32 && sc!=6 && !(sc&1) && !ctx.usage_by_class[sc]) {
+ size_t usage = ctx.usage_by_class[sc|1];
+ // if a new group may be allocated, count it toward
+ // usage in deciding if we can use coarse class.
+ if (!ctx.active[sc|1] || (!ctx.active[sc|1]->avail_mask
+ && !ctx.active[sc|1]->freed_mask))
+ usage += 3;
+ if (usage <= 12)
+ sc |= 1;
+ g = ctx.active[sc];
+ }
+
+ for (;;) {
+ mask = g ? g->avail_mask : 0;
+ first = mask&-mask;
+ if (!first) break;
+ if (RDLOCK_IS_EXCLUSIVE || !MT)
+ g->avail_mask = mask-first;
+ else if (a_cas(&g->avail_mask, mask, mask-first)!=mask)
+ continue;
+ idx = a_ctz_32(first);
+ goto success;
+ }
+ upgradelock();
+
+ idx = alloc_slot(sc, n);
+ if (idx < 0) {
+ unlock();
+ return 0;
+ }
+ g = ctx.active[sc];
+
+success:
+ ctr = ctx.mmap_counter;
+ unlock();
+ return enframe(g, idx, n, ctr);
+}
+
+int is_allzero(void *p)
+{
+ struct meta *g = get_meta(p);
+ return g->sizeclass >= 48 ||
+ get_stride(g) < UNIT*size_classes[g->sizeclass];
+}
diff --git a/libc-top-half/musl/src/malloc/mallocng/malloc_usable_size.c b/libc-top-half/musl/src/malloc/mallocng/malloc_usable_size.c
new file mode 100644
index 0000000..ce6a960
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/mallocng/malloc_usable_size.c
@@ -0,0 +1,13 @@
+#include <stdlib.h>
+#include "meta.h"
+
+size_t malloc_usable_size(void *p)
+{
+ if (!p) return 0;
+ struct meta *g = get_meta(p);
+ int idx = get_slot_index(p);
+ size_t stride = get_stride(g);
+ unsigned char *start = g->mem->storage + stride*idx;
+ unsigned char *end = start + stride - IB;
+ return get_nominal_size(p, end);
+}
diff --git a/libc-top-half/musl/src/malloc/mallocng/meta.h b/libc-top-half/musl/src/malloc/mallocng/meta.h
new file mode 100644
index 0000000..61ec53f
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/mallocng/meta.h
@@ -0,0 +1,288 @@
+#ifndef MALLOC_META_H
+#define MALLOC_META_H
+
+#include <stdint.h>
+#include <errno.h>
+#include <limits.h>
+#include "glue.h"
+
+__attribute__((__visibility__("hidden")))
+extern const uint16_t size_classes[];
+
+#define MMAP_THRESHOLD 131052
+
+#define UNIT 16
+#define IB 4
+
+struct group {
+ struct meta *meta;
+ unsigned char active_idx:5;
+ char pad[UNIT - sizeof(struct meta *) - 1];
+ unsigned char storage[];
+};
+
+struct meta {
+ struct meta *prev, *next;
+ struct group *mem;
+ volatile int avail_mask, freed_mask;
+ uintptr_t last_idx:5;
+ uintptr_t freeable:1;
+ uintptr_t sizeclass:6;
+ uintptr_t maplen:8*sizeof(uintptr_t)-12;
+};
+
+struct meta_area {
+ uint64_t check;
+ struct meta_area *next;
+ int nslots;
+ struct meta slots[];
+};
+
+struct malloc_context {
+ uint64_t secret;
+#ifndef PAGESIZE
+ size_t pagesize;
+#endif
+ int init_done;
+ unsigned mmap_counter;
+ struct meta *free_meta_head;
+ struct meta *avail_meta;
+ size_t avail_meta_count, avail_meta_area_count, meta_alloc_shift;
+ struct meta_area *meta_area_head, *meta_area_tail;
+ unsigned char *avail_meta_areas;
+ struct meta *active[48];
+ size_t usage_by_class[48];
+ uint8_t unmap_seq[32], bounces[32];
+ uint8_t seq;
+ uintptr_t brk;
+};
+
+__attribute__((__visibility__("hidden")))
+extern struct malloc_context ctx;
+
+#ifdef PAGESIZE
+#define PGSZ PAGESIZE
+#else
+#define PGSZ ctx.pagesize
+#endif
+
+__attribute__((__visibility__("hidden")))
+struct meta *alloc_meta(void);
+
+__attribute__((__visibility__("hidden")))
+int is_allzero(void *);
+
+static inline void queue(struct meta **phead, struct meta *m)
+{
+ assert(!m->next);
+ assert(!m->prev);
+ if (*phead) {
+ struct meta *head = *phead;
+ m->next = head;
+ m->prev = head->prev;
+ m->next->prev = m->prev->next = m;
+ } else {
+ m->prev = m->next = m;
+ *phead = m;
+ }
+}
+
+static inline void dequeue(struct meta **phead, struct meta *m)
+{
+ if (m->next != m) {
+ m->prev->next = m->next;
+ m->next->prev = m->prev;
+ if (*phead == m) *phead = m->next;
+ } else {
+ *phead = 0;
+ }
+ m->prev = m->next = 0;
+}
+
+static inline struct meta *dequeue_head(struct meta **phead)
+{
+ struct meta *m = *phead;
+ if (m) dequeue(phead, m);
+ return m;
+}
+
+static inline void free_meta(struct meta *m)
+{
+ *m = (struct meta){0};
+ queue(&ctx.free_meta_head, m);
+}
+
+static inline uint32_t activate_group(struct meta *m)
+{
+ assert(!m->avail_mask);
+ uint32_t mask, act = (2u<<m->mem->active_idx)-1;
+ do mask = m->freed_mask;
+ while (a_cas(&m->freed_mask, mask, mask&~act)!=mask);
+ return m->avail_mask = mask & act;
+}
+
+static inline int get_slot_index(const unsigned char *p)
+{
+ return p[-3] & 31;
+}
+
+static inline struct meta *get_meta(const unsigned char *p)
+{
+ assert(!((uintptr_t)p & 15));
+ int offset = *(const uint16_t *)(p - 2);
+ int index = get_slot_index(p);
+ if (p[-4]) {
+ assert(!offset);
+ offset = *(uint32_t *)(p - 8);
+ assert(offset > 0xffff);
+ }
+ const struct group *base = (const void *)(p - UNIT*offset - UNIT);
+ const struct meta *meta = base->meta;
+ assert(meta->mem == base);
+ assert(index <= meta->last_idx);
+ assert(!(meta->avail_mask & (1u<<index)));
+ assert(!(meta->freed_mask & (1u<<index)));
+ const struct meta_area *area = (void *)((uintptr_t)meta & -4096);
+ assert(area->check == ctx.secret);
+ if (meta->sizeclass < 48) {
+ assert(offset >= size_classes[meta->sizeclass]*index);
+ assert(offset < size_classes[meta->sizeclass]*(index+1));
+ } else {
+ assert(meta->sizeclass == 63);
+ }
+ if (meta->maplen) {
+ assert(offset <= meta->maplen*4096UL/UNIT - 1);
+ }
+ return (struct meta *)meta;
+}
+
+static inline size_t get_nominal_size(const unsigned char *p, const unsigned char *end)
+{
+ size_t reserved = p[-3] >> 5;
+ if (reserved >= 5) {
+ assert(reserved == 5);
+ reserved = *(const uint32_t *)(end-4);
+ assert(reserved >= 5);
+ assert(!end[-5]);
+ }
+ assert(reserved <= end-p);
+ assert(!*(end-reserved));
+ // also check the slot's overflow byte
+ assert(!*end);
+ return end-reserved-p;
+}
+
+static inline size_t get_stride(const struct meta *g)
+{
+ if (!g->last_idx && g->maplen) {
+ return g->maplen*4096UL - UNIT;
+ } else {
+ return UNIT*size_classes[g->sizeclass];
+ }
+}
+
+static inline void set_size(unsigned char *p, unsigned char *end, size_t n)
+{
+ int reserved = end-p-n;
+ if (reserved) end[-reserved] = 0;
+ if (reserved >= 5) {
+ *(uint32_t *)(end-4) = reserved;
+ end[-5] = 0;
+ reserved = 5;
+ }
+ p[-3] = (p[-3]&31) + (reserved<<5);
+}
+
+static inline void *enframe(struct meta *g, int idx, size_t n, int ctr)
+{
+ size_t stride = get_stride(g);
+ size_t slack = (stride-IB-n)/UNIT;
+ unsigned char *p = g->mem->storage + stride*idx;
+ unsigned char *end = p+stride-IB;
+ // cycle offset within slot to increase interval to address
+ // reuse, facilitate trapping double-free.
+ int off = (p[-3] ? *(uint16_t *)(p-2) + 1 : ctr) & 255;
+ assert(!p[-4]);
+ if (off > slack) {
+ size_t m = slack;
+ m |= m>>1; m |= m>>2; m |= m>>4;
+ off &= m;
+ if (off > slack) off -= slack+1;
+ assert(off <= slack);
+ }
+ if (off) {
+ // store offset in unused header at offset zero
+ // if enframing at non-zero offset.
+ *(uint16_t *)(p-2) = off;
+ p[-3] = 7<<5;
+ p += UNIT*off;
+ // for nonzero offset there is no permanent check
+ // byte, so make one.
+ p[-4] = 0;
+ }
+ *(uint16_t *)(p-2) = (size_t)(p-g->mem->storage)/UNIT;
+ p[-3] = idx;
+ set_size(p, end, n);
+ return p;
+}
+
+static inline int size_to_class(size_t n)
+{
+ n = (n+IB-1)>>4;
+ if (n<10) return n;
+ n++;
+ int i = (28-a_clz_32(n))*4 + 8;
+ if (n>size_classes[i+1]) i+=2;
+ if (n>size_classes[i]) i++;
+ return i;
+}
+
+static inline int size_overflows(size_t n)
+{
+ if (n >= SIZE_MAX/2 - 4096) {
+ errno = ENOMEM;
+ return 1;
+ }
+ return 0;
+}
+
+static inline void step_seq(void)
+{
+ if (ctx.seq==255) {
+ for (int i=0; i<32; i++) ctx.unmap_seq[i] = 0;
+ ctx.seq = 1;
+ } else {
+ ctx.seq++;
+ }
+}
+
+static inline void record_seq(int sc)
+{
+ if (sc-7U < 32) ctx.unmap_seq[sc-7] = ctx.seq;
+}
+
+static inline void account_bounce(int sc)
+{
+ if (sc-7U < 32) {
+ int seq = ctx.unmap_seq[sc-7];
+ if (seq && ctx.seq-seq < 10) {
+ if (ctx.bounces[sc-7]+1 < 100)
+ ctx.bounces[sc-7]++;
+ else
+ ctx.bounces[sc-7] = 150;
+ }
+ }
+}
+
+static inline void decay_bounces(int sc)
+{
+ if (sc-7U < 32 && ctx.bounces[sc-7])
+ ctx.bounces[sc-7]--;
+}
+
+static inline int is_bouncing(int sc)
+{
+ return (sc-7U < 32 && ctx.bounces[sc-7] >= 100);
+}
+
+#endif
diff --git a/libc-top-half/musl/src/malloc/mallocng/realloc.c b/libc-top-half/musl/src/malloc/mallocng/realloc.c
new file mode 100644
index 0000000..18769f4
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/mallocng/realloc.c
@@ -0,0 +1,51 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <string.h>
+#include "meta.h"
+
+void *realloc(void *p, size_t n)
+{
+ if (!p) return malloc(n);
+ if (size_overflows(n)) return 0;
+
+ struct meta *g = get_meta(p);
+ int idx = get_slot_index(p);
+ size_t stride = get_stride(g);
+ unsigned char *start = g->mem->storage + stride*idx;
+ unsigned char *end = start + stride - IB;
+ size_t old_size = get_nominal_size(p, end);
+ size_t avail_size = end-(unsigned char *)p;
+ void *new;
+
+ // only resize in-place if size class matches
+ if (n <= avail_size && n<MMAP_THRESHOLD
+ && size_to_class(n)+1 >= g->sizeclass) {
+ set_size(p, end, n);
+ return p;
+ }
+
+ // use mremap if old and new size are both mmap-worthy
+ if (g->sizeclass>=48 && n>=MMAP_THRESHOLD) {
+ assert(g->sizeclass==63);
+ size_t base = (unsigned char *)p-start;
+ size_t needed = (n + base + UNIT + IB + 4095) & -4096;
+ new = g->maplen*4096UL == needed ? g->mem :
+ mremap(g->mem, g->maplen*4096UL, needed, MREMAP_MAYMOVE);
+ if (new!=MAP_FAILED) {
+ g->mem = new;
+ g->maplen = needed/4096;
+ p = g->mem->storage + base;
+ end = g->mem->storage + (needed - UNIT) - IB;
+ *end = 0;
+ set_size(p, end, n);
+ return p;
+ }
+ }
+
+ new = malloc(n);
+ if (!new) return 0;
+ memcpy(new, p, n < old_size ? n : old_size);
+ free(p);
+ return new;
+}
diff --git a/libc-top-half/musl/src/malloc/memalign.c b/libc-top-half/musl/src/malloc/memalign.c
new file mode 100644
index 0000000..32cd87d
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/memalign.c
@@ -0,0 +1,7 @@
+#define _BSD_SOURCE
+#include <stdlib.h>
+
+void *memalign(size_t align, size_t len)
+{
+ return aligned_alloc(align, len);
+}
diff --git a/libc-top-half/musl/src/malloc/oldmalloc/aligned_alloc.c b/libc-top-half/musl/src/malloc/oldmalloc/aligned_alloc.c
new file mode 100644
index 0000000..4adca3b
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/oldmalloc/aligned_alloc.c
@@ -0,0 +1,53 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include <errno.h>
+#include "malloc_impl.h"
+
+void *aligned_alloc(size_t align, size_t len)
+{
+ unsigned char *mem, *new;
+
+ if ((align & -align) != align) {
+ errno = EINVAL;
+ return 0;
+ }
+
+ if (len > SIZE_MAX - align ||
+ (__malloc_replaced && !__aligned_alloc_replaced)) {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ if (align <= SIZE_ALIGN)
+ return malloc(len);
+
+ if (!(mem = malloc(len + align-1)))
+ return 0;
+
+ new = (void *)((uintptr_t)mem + align-1 & -align);
+ if (new == mem) return mem;
+
+ struct chunk *c = MEM_TO_CHUNK(mem);
+ struct chunk *n = MEM_TO_CHUNK(new);
+
+ if (IS_MMAPPED(c)) {
+ /* Apply difference between aligned and original
+ * address to the "extra" field of mmapped chunk. */
+ n->psize = c->psize + (new-mem);
+ n->csize = c->csize - (new-mem);
+ return new;
+ }
+
+ struct chunk *t = NEXT_CHUNK(c);
+
+ /* Split the allocated chunk into two chunks. The aligned part
+ * that will be used has the size in its footer reduced by the
+ * difference between the aligned and original addresses, and
+ * the resulting size copied to its header. A new header and
+ * footer are written for the split-off part to be freed. */
+ n->psize = c->csize = C_INUSE | (new-mem);
+ n->csize = t->psize -= new-mem;
+
+ __bin_chunk(c);
+ return new;
+}
diff --git a/libc-top-half/musl/src/malloc/oldmalloc/malloc.c b/libc-top-half/musl/src/malloc/oldmalloc/malloc.c
new file mode 100644
index 0000000..25d00d4
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/oldmalloc/malloc.c
@@ -0,0 +1,556 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <stdint.h>
+#include <errno.h>
+#include <sys/mman.h>
+#include "libc.h"
+#include "atomic.h"
+#include "pthread_impl.h"
+#include "malloc_impl.h"
+#include "fork_impl.h"
+
+#define malloc __libc_malloc_impl
+#define realloc __libc_realloc
+#define free __libc_free
+
+#if defined(__GNUC__) && defined(__PIC__)
+#define inline inline __attribute__((always_inline))
+#endif
+
+static struct {
+ volatile uint64_t binmap;
+ struct bin bins[64];
+ volatile int split_merge_lock[2];
+} mal;
+
+/* Synchronization tools */
+
+static inline void lock(volatile int *lk)
+{
+ int need_locks = libc.need_locks;
+ if (need_locks) {
+ while(a_swap(lk, 1)) __wait(lk, lk+1, 1, 1);
+ if (need_locks < 0) libc.need_locks = 0;
+ }
+}
+
+static inline void unlock(volatile int *lk)
+{
+ if (lk[0]) {
+ a_store(lk, 0);
+ if (lk[1]) __wake(lk, 1, 1);
+ }
+}
+
+static inline void lock_bin(int i)
+{
+ lock(mal.bins[i].lock);
+ if (!mal.bins[i].head)
+ mal.bins[i].head = mal.bins[i].tail = BIN_TO_CHUNK(i);
+}
+
+static inline void unlock_bin(int i)
+{
+ unlock(mal.bins[i].lock);
+}
+
+static int first_set(uint64_t x)
+{
+#if 1
+ return a_ctz_64(x);
+#else
+ static const char debruijn64[64] = {
+ 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28,
+ 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11,
+ 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10,
+ 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12
+ };
+ static const char debruijn32[32] = {
+ 0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13,
+ 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14
+ };
+ if (sizeof(long) < 8) {
+ uint32_t y = x;
+ if (!y) {
+ y = x>>32;
+ return 32 + debruijn32[(y&-y)*0x076be629 >> 27];
+ }
+ return debruijn32[(y&-y)*0x076be629 >> 27];
+ }
+ return debruijn64[(x&-x)*0x022fdd63cc95386dull >> 58];
+#endif
+}
+
+static const unsigned char bin_tab[60] = {
+ 32,33,34,35,36,36,37,37,38,38,39,39,
+ 40,40,40,40,41,41,41,41,42,42,42,42,43,43,43,43,
+ 44,44,44,44,44,44,44,44,45,45,45,45,45,45,45,45,
+ 46,46,46,46,46,46,46,46,47,47,47,47,47,47,47,47,
+};
+
+static int bin_index(size_t x)
+{
+ x = x / SIZE_ALIGN - 1;
+ if (x <= 32) return x;
+ if (x < 512) return bin_tab[x/8-4];
+ if (x > 0x1c00) return 63;
+ return bin_tab[x/128-4] + 16;
+}
+
+static int bin_index_up(size_t x)
+{
+ x = x / SIZE_ALIGN - 1;
+ if (x <= 32) return x;
+ x--;
+ if (x < 512) return bin_tab[x/8-4] + 1;
+ return bin_tab[x/128-4] + 17;
+}
+
+#if 0
+void __dump_heap(int x)
+{
+ struct chunk *c;
+ int i;
+ for (c = (void *)mal.heap; CHUNK_SIZE(c); c = NEXT_CHUNK(c))
+ fprintf(stderr, "base %p size %zu (%d) flags %d/%d\n",
+ c, CHUNK_SIZE(c), bin_index(CHUNK_SIZE(c)),
+ c->csize & 15,
+ NEXT_CHUNK(c)->psize & 15);
+ for (i=0; i<64; i++) {
+ if (mal.bins[i].head != BIN_TO_CHUNK(i) && mal.bins[i].head) {
+ fprintf(stderr, "bin %d: %p\n", i, mal.bins[i].head);
+ if (!(mal.binmap & 1ULL<<i))
+ fprintf(stderr, "missing from binmap!\n");
+ } else if (mal.binmap & 1ULL<<i)
+ fprintf(stderr, "binmap wrongly contains %d!\n", i);
+ }
+}
+#endif
+
+/* This function returns true if the interval [old,new]
+ * intersects the 'len'-sized interval below &libc.auxv
+ * (interpreted as the main-thread stack) or below &b
+ * (the current stack). It is used to defend against
+ * buggy brk implementations that can cross the stack. */
+
+static int traverses_stack_p(uintptr_t old, uintptr_t new)
+{
+ const uintptr_t len = 8<<20;
+ uintptr_t a, b;
+
+ b = (uintptr_t)libc.auxv;
+ a = b > len ? b-len : 0;
+ if (new>a && old<b) return 1;
+
+ b = (uintptr_t)&b;
+ a = b > len ? b-len : 0;
+ if (new>a && old<b) return 1;
+
+ return 0;
+}
+
+/* Expand the heap in-place if brk can be used, or otherwise via mmap,
+ * using an exponential lower bound on growth by mmap to make
+ * fragmentation asymptotically irrelevant. The size argument is both
+ * an input and an output, since the caller needs to know the size
+ * allocated, which will be larger than requested due to page alignment
+ * and mmap minimum size rules. The caller is responsible for locking
+ * to prevent concurrent calls. */
+
+static void *__expand_heap(size_t *pn)
+{
+ static uintptr_t brk;
+ static unsigned mmap_step;
+ size_t n = *pn;
+
+ if (n > SIZE_MAX/2 - PAGE_SIZE) {
+ errno = ENOMEM;
+ return 0;
+ }
+ n += -n & PAGE_SIZE-1;
+
+ if (!brk) {
+ brk = __syscall(SYS_brk, 0);
+ brk += -brk & PAGE_SIZE-1;
+ }
+
+ if (n < SIZE_MAX-brk && !traverses_stack_p(brk, brk+n)
+ && __syscall(SYS_brk, brk+n)==brk+n) {
+ *pn = n;
+ brk += n;
+ return (void *)(brk-n);
+ }
+
+ size_t min = (size_t)PAGE_SIZE << mmap_step/2;
+ if (n < min) n = min;
+ void *area = __mmap(0, n, PROT_READ|PROT_WRITE,
+ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ if (area == MAP_FAILED) return 0;
+ *pn = n;
+ mmap_step++;
+ return area;
+}
+
+static struct chunk *expand_heap(size_t n)
+{
+ static void *end;
+ void *p;
+ struct chunk *w;
+
+ /* The argument n already accounts for the caller's chunk
+ * overhead needs, but if the heap can't be extended in-place,
+ * we need room for an extra zero-sized sentinel chunk. */
+ n += SIZE_ALIGN;
+
+ p = __expand_heap(&n);
+ if (!p) return 0;
+
+ /* If not just expanding existing space, we need to make a
+ * new sentinel chunk below the allocated space. */
+ if (p != end) {
+ /* Valid/safe because of the prologue increment. */
+ n -= SIZE_ALIGN;
+ p = (char *)p + SIZE_ALIGN;
+ w = MEM_TO_CHUNK(p);
+ w->psize = 0 | C_INUSE;
+ }
+
+ /* Record new heap end and fill in footer. */
+ end = (char *)p + n;
+ w = MEM_TO_CHUNK(end);
+ w->psize = n | C_INUSE;
+ w->csize = 0 | C_INUSE;
+
+ /* Fill in header, which may be new or may be replacing a
+ * zero-size sentinel header at the old end-of-heap. */
+ w = MEM_TO_CHUNK(p);
+ w->csize = n | C_INUSE;
+
+ return w;
+}
+
+static int adjust_size(size_t *n)
+{
+ /* Result of pointer difference must fit in ptrdiff_t. */
+ if (*n-1 > PTRDIFF_MAX - SIZE_ALIGN - PAGE_SIZE) {
+ if (*n) {
+ errno = ENOMEM;
+ return -1;
+ } else {
+ *n = SIZE_ALIGN;
+ return 0;
+ }
+ }
+ *n = (*n + OVERHEAD + SIZE_ALIGN - 1) & SIZE_MASK;
+ return 0;
+}
+
+static void unbin(struct chunk *c, int i)
+{
+ if (c->prev == c->next)
+ a_and_64(&mal.binmap, ~(1ULL<<i));
+ c->prev->next = c->next;
+ c->next->prev = c->prev;
+ c->csize |= C_INUSE;
+ NEXT_CHUNK(c)->psize |= C_INUSE;
+}
+
+static void bin_chunk(struct chunk *self, int i)
+{
+ self->next = BIN_TO_CHUNK(i);
+ self->prev = mal.bins[i].tail;
+ self->next->prev = self;
+ self->prev->next = self;
+ if (self->prev == BIN_TO_CHUNK(i))
+ a_or_64(&mal.binmap, 1ULL<<i);
+}
+
+static void trim(struct chunk *self, size_t n)
+{
+ size_t n1 = CHUNK_SIZE(self);
+ struct chunk *next, *split;
+
+ if (n >= n1 - DONTCARE) return;
+
+ next = NEXT_CHUNK(self);
+ split = (void *)((char *)self + n);
+
+ split->psize = n | C_INUSE;
+ split->csize = n1-n;
+ next->psize = n1-n;
+ self->csize = n | C_INUSE;
+
+ int i = bin_index(n1-n);
+ lock_bin(i);
+
+ bin_chunk(split, i);
+
+ unlock_bin(i);
+}
+
+void *malloc(size_t n)
+{
+ struct chunk *c;
+ int i, j;
+ uint64_t mask;
+
+ if (adjust_size(&n) < 0) return 0;
+
+ if (n > MMAP_THRESHOLD) {
+ size_t len = n + OVERHEAD + PAGE_SIZE - 1 & -PAGE_SIZE;
+ char *base = __mmap(0, len, PROT_READ|PROT_WRITE,
+ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ if (base == (void *)-1) return 0;
+ c = (void *)(base + SIZE_ALIGN - OVERHEAD);
+ c->csize = len - (SIZE_ALIGN - OVERHEAD);
+ c->psize = SIZE_ALIGN - OVERHEAD;
+ return CHUNK_TO_MEM(c);
+ }
+
+ i = bin_index_up(n);
+ if (i<63 && (mal.binmap & (1ULL<<i))) {
+ lock_bin(i);
+ c = mal.bins[i].head;
+ if (c != BIN_TO_CHUNK(i) && CHUNK_SIZE(c)-n <= DONTCARE) {
+ unbin(c, i);
+ unlock_bin(i);
+ return CHUNK_TO_MEM(c);
+ }
+ unlock_bin(i);
+ }
+ lock(mal.split_merge_lock);
+ for (mask = mal.binmap & -(1ULL<<i); mask; mask -= (mask&-mask)) {
+ j = first_set(mask);
+ lock_bin(j);
+ c = mal.bins[j].head;
+ if (c != BIN_TO_CHUNK(j)) {
+ unbin(c, j);
+ unlock_bin(j);
+ break;
+ }
+ unlock_bin(j);
+ }
+ if (!mask) {
+ c = expand_heap(n);
+ if (!c) {
+ unlock(mal.split_merge_lock);
+ return 0;
+ }
+ }
+ trim(c, n);
+ unlock(mal.split_merge_lock);
+ return CHUNK_TO_MEM(c);
+}
+
+int __malloc_allzerop(void *p)
+{
+ return IS_MMAPPED(MEM_TO_CHUNK(p));
+}
+
+void *realloc(void *p, size_t n)
+{
+ struct chunk *self, *next;
+ size_t n0, n1;
+ void *new;
+
+ if (!p) return malloc(n);
+
+ if (adjust_size(&n) < 0) return 0;
+
+ self = MEM_TO_CHUNK(p);
+ n1 = n0 = CHUNK_SIZE(self);
+
+ if (n<=n0 && n0-n<=DONTCARE) return p;
+
+ if (IS_MMAPPED(self)) {
+ size_t extra = self->psize;
+ char *base = (char *)self - extra;
+ size_t oldlen = n0 + extra;
+ size_t newlen = n + extra;
+ /* Crash on realloc of freed chunk */
+ if (extra & 1) a_crash();
+ if (newlen < PAGE_SIZE && (new = malloc(n-OVERHEAD))) {
+ n0 = n;
+ goto copy_free_ret;
+ }
+ newlen = (newlen + PAGE_SIZE-1) & -PAGE_SIZE;
+ if (oldlen == newlen) return p;
+ base = __mremap(base, oldlen, newlen, MREMAP_MAYMOVE);
+ if (base == (void *)-1)
+ goto copy_realloc;
+ self = (void *)(base + extra);
+ self->csize = newlen - extra;
+ return CHUNK_TO_MEM(self);
+ }
+
+ next = NEXT_CHUNK(self);
+
+ /* Crash on corrupted footer (likely from buffer overflow) */
+ if (next->psize != self->csize) a_crash();
+
+ if (n < n0) {
+ int i = bin_index_up(n);
+ int j = bin_index(n0);
+ if (i<j && (mal.binmap & (1ULL << i)))
+ goto copy_realloc;
+ struct chunk *split = (void *)((char *)self + n);
+ self->csize = split->psize = n | C_INUSE;
+ split->csize = next->psize = n0-n | C_INUSE;
+ __bin_chunk(split);
+ return CHUNK_TO_MEM(self);
+ }
+
+ lock(mal.split_merge_lock);
+
+ size_t nsize = next->csize & C_INUSE ? 0 : CHUNK_SIZE(next);
+ if (n0+nsize >= n) {
+ int i = bin_index(nsize);
+ lock_bin(i);
+ if (!(next->csize & C_INUSE)) {
+ unbin(next, i);
+ unlock_bin(i);
+ next = NEXT_CHUNK(next);
+ self->csize = next->psize = n0+nsize | C_INUSE;
+ trim(self, n);
+ unlock(mal.split_merge_lock);
+ return CHUNK_TO_MEM(self);
+ }
+ unlock_bin(i);
+ }
+ unlock(mal.split_merge_lock);
+
+copy_realloc:
+ /* As a last resort, allocate a new chunk and copy to it. */
+ new = malloc(n-OVERHEAD);
+ if (!new) return 0;
+copy_free_ret:
+ memcpy(new, p, (n<n0 ? n : n0) - OVERHEAD);
+ free(CHUNK_TO_MEM(self));
+ return new;
+}
+
+void __bin_chunk(struct chunk *self)
+{
+ struct chunk *next = NEXT_CHUNK(self);
+
+ /* Crash on corrupted footer (likely from buffer overflow) */
+ if (next->psize != self->csize) a_crash();
+
+ lock(mal.split_merge_lock);
+
+ size_t osize = CHUNK_SIZE(self), size = osize;
+
+ /* Since we hold split_merge_lock, only transition from free to
+ * in-use can race; in-use to free is impossible */
+ size_t psize = self->psize & C_INUSE ? 0 : CHUNK_PSIZE(self);
+ size_t nsize = next->csize & C_INUSE ? 0 : CHUNK_SIZE(next);
+
+ if (psize) {
+ int i = bin_index(psize);
+ lock_bin(i);
+ if (!(self->psize & C_INUSE)) {
+ struct chunk *prev = PREV_CHUNK(self);
+ unbin(prev, i);
+ self = prev;
+ size += psize;
+ }
+ unlock_bin(i);
+ }
+ if (nsize) {
+ int i = bin_index(nsize);
+ lock_bin(i);
+ if (!(next->csize & C_INUSE)) {
+ unbin(next, i);
+ next = NEXT_CHUNK(next);
+ size += nsize;
+ }
+ unlock_bin(i);
+ }
+
+ int i = bin_index(size);
+ lock_bin(i);
+
+ self->csize = size;
+ next->psize = size;
+ bin_chunk(self, i);
+ unlock(mal.split_merge_lock);
+
+ /* Replace middle of large chunks with fresh zero pages */
+ if (size > RECLAIM && (size^(size-osize)) > size-osize) {
+ uintptr_t a = (uintptr_t)self + SIZE_ALIGN+PAGE_SIZE-1 & -PAGE_SIZE;
+ uintptr_t b = (uintptr_t)next - SIZE_ALIGN & -PAGE_SIZE;
+ int e = errno;
+#if 1
+ __madvise((void *)a, b-a, MADV_DONTNEED);
+#else
+ __mmap((void *)a, b-a, PROT_READ|PROT_WRITE,
+ MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
+#endif
+ errno = e;
+ }
+
+ unlock_bin(i);
+}
+
+static void unmap_chunk(struct chunk *self)
+{
+ size_t extra = self->psize;
+ char *base = (char *)self - extra;
+ size_t len = CHUNK_SIZE(self) + extra;
+ /* Crash on double free */
+ if (extra & 1) a_crash();
+ int e = errno;
+ __munmap(base, len);
+ errno = e;
+}
+
+void free(void *p)
+{
+ if (!p) return;
+
+ struct chunk *self = MEM_TO_CHUNK(p);
+
+ if (IS_MMAPPED(self))
+ unmap_chunk(self);
+ else
+ __bin_chunk(self);
+}
+
+void __malloc_donate(char *start, char *end)
+{
+ size_t align_start_up = (SIZE_ALIGN-1) & (-(uintptr_t)start - OVERHEAD);
+ size_t align_end_down = (SIZE_ALIGN-1) & (uintptr_t)end;
+
+ /* Getting past this condition ensures that the padding for alignment
+ * and header overhead will not overflow and will leave a nonzero
+ * multiple of SIZE_ALIGN bytes between start and end. */
+ if (end - start <= OVERHEAD + align_start_up + align_end_down)
+ return;
+ start += align_start_up + OVERHEAD;
+ end -= align_end_down;
+
+ struct chunk *c = MEM_TO_CHUNK(start), *n = MEM_TO_CHUNK(end);
+ c->psize = n->csize = C_INUSE;
+ c->csize = n->psize = C_INUSE | (end-start);
+ __bin_chunk(c);
+}
+
+void __malloc_atfork(int who)
+{
+ if (who<0) {
+ lock(mal.split_merge_lock);
+ for (int i=0; i<64; i++)
+ lock(mal.bins[i].lock);
+ } else if (!who) {
+ for (int i=0; i<64; i++)
+ unlock(mal.bins[i].lock);
+ unlock(mal.split_merge_lock);
+ } else {
+ for (int i=0; i<64; i++)
+ mal.bins[i].lock[0] = mal.bins[i].lock[1] = 0;
+ mal.split_merge_lock[1] = 0;
+ mal.split_merge_lock[0] = 0;
+ }
+}
diff --git a/libc-top-half/musl/src/malloc/oldmalloc/malloc_impl.h b/libc-top-half/musl/src/malloc/oldmalloc/malloc_impl.h
new file mode 100644
index 0000000..e1cf477
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/oldmalloc/malloc_impl.h
@@ -0,0 +1,39 @@
+#ifndef MALLOC_IMPL_H
+#define MALLOC_IMPL_H
+
+#include <sys/mman.h>
+#include "dynlink.h"
+
+struct chunk {
+ size_t psize, csize;
+ struct chunk *next, *prev;
+};
+
+struct bin {
+ volatile int lock[2];
+ struct chunk *head;
+ struct chunk *tail;
+};
+
+#define SIZE_ALIGN (4*sizeof(size_t))
+#define SIZE_MASK (-SIZE_ALIGN)
+#define OVERHEAD (2*sizeof(size_t))
+#define MMAP_THRESHOLD (0x1c00*SIZE_ALIGN)
+#define DONTCARE 16
+#define RECLAIM 163840
+
+#define CHUNK_SIZE(c) ((c)->csize & -2)
+#define CHUNK_PSIZE(c) ((c)->psize & -2)
+#define PREV_CHUNK(c) ((struct chunk *)((char *)(c) - CHUNK_PSIZE(c)))
+#define NEXT_CHUNK(c) ((struct chunk *)((char *)(c) + CHUNK_SIZE(c)))
+#define MEM_TO_CHUNK(p) (struct chunk *)((char *)(p) - OVERHEAD)
+#define CHUNK_TO_MEM(c) (void *)((char *)(c) + OVERHEAD)
+#define BIN_TO_CHUNK(i) (MEM_TO_CHUNK(&mal.bins[i].head))
+
+#define C_INUSE ((size_t)1)
+
+#define IS_MMAPPED(c) !((c)->csize & (C_INUSE))
+
+hidden void __bin_chunk(struct chunk *);
+
+#endif
diff --git a/libc-top-half/musl/src/malloc/oldmalloc/malloc_usable_size.c b/libc-top-half/musl/src/malloc/oldmalloc/malloc_usable_size.c
new file mode 100644
index 0000000..672b518
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/oldmalloc/malloc_usable_size.c
@@ -0,0 +1,9 @@
+#include <malloc.h>
+#include "malloc_impl.h"
+
+hidden void *(*const __realloc_dep)(void *, size_t) = realloc;
+
+size_t malloc_usable_size(void *p)
+{
+ return p ? CHUNK_SIZE(MEM_TO_CHUNK(p)) - OVERHEAD : 0;
+}
diff --git a/libc-top-half/musl/src/malloc/posix_memalign.c b/libc-top-half/musl/src/malloc/posix_memalign.c
new file mode 100644
index 0000000..ad4d8f4
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/posix_memalign.c
@@ -0,0 +1,11 @@
+#include <stdlib.h>
+#include <errno.h>
+
+int posix_memalign(void **res, size_t align, size_t len)
+{
+ if (align < sizeof(void *)) return EINVAL;
+ void *mem = aligned_alloc(align, len);
+ if (!mem) return errno;
+ *res = mem;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/malloc/realloc.c b/libc-top-half/musl/src/malloc/realloc.c
new file mode 100644
index 0000000..fb0e8b7
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/realloc.c
@@ -0,0 +1,6 @@
+#include <stdlib.h>
+
+void *realloc(void *p, size_t n)
+{
+ return __libc_realloc(p, n);
+}
diff --git a/libc-top-half/musl/src/malloc/reallocarray.c b/libc-top-half/musl/src/malloc/reallocarray.c
new file mode 100644
index 0000000..4a6ebe4
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/reallocarray.c
@@ -0,0 +1,13 @@
+#define _BSD_SOURCE
+#include <errno.h>
+#include <stdlib.h>
+
+void *reallocarray(void *ptr, size_t m, size_t n)
+{
+ if (n && m > -1 / n) {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ return realloc(ptr, m * n);
+}
diff --git a/libc-top-half/musl/src/malloc/replaced.c b/libc-top-half/musl/src/malloc/replaced.c
new file mode 100644
index 0000000..07fce61
--- /dev/null
+++ b/libc-top-half/musl/src/malloc/replaced.c
@@ -0,0 +1,4 @@
+#include "dynlink.h"
+
+int __malloc_replaced;
+int __aligned_alloc_replaced;
diff --git a/libc-top-half/musl/src/math/__cos.c b/libc-top-half/musl/src/math/__cos.c
new file mode 100644
index 0000000..46cefb3
--- /dev/null
+++ b/libc-top-half/musl/src/math/__cos.c
@@ -0,0 +1,71 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/k_cos.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/*
+ * __cos( x, y )
+ * kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164
+ * Input x is assumed to be bounded by ~pi/4 in magnitude.
+ * Input y is the tail of x.
+ *
+ * Algorithm
+ * 1. Since cos(-x) = cos(x), we need only to consider positive x.
+ * 2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0.
+ * 3. cos(x) is approximated by a polynomial of degree 14 on
+ * [0,pi/4]
+ * 4 14
+ * cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x
+ * where the remez error is
+ *
+ * | 2 4 6 8 10 12 14 | -58
+ * |cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x +C6*x )| <= 2
+ * | |
+ *
+ * 4 6 8 10 12 14
+ * 4. let r = C1*x +C2*x +C3*x +C4*x +C5*x +C6*x , then
+ * cos(x) ~ 1 - x*x/2 + r
+ * since cos(x+y) ~ cos(x) - sin(x)*y
+ * ~ cos(x) - x*y,
+ * a correction term is necessary in cos(x) and hence
+ * cos(x+y) = 1 - (x*x/2 - (r - x*y))
+ * For better accuracy, rearrange to
+ * cos(x+y) ~ w + (tmp + (r-x*y))
+ * where w = 1 - x*x/2 and tmp is a tiny correction term
+ * (1 - x*x/2 == w + tmp exactly in infinite precision).
+ * The exactness of w + tmp in infinite precision depends on w
+ * and tmp having the same precision as x. If they have extra
+ * precision due to compiler bugs, then the extra precision is
+ * only good provided it is retained in all terms of the final
+ * expression for cos(). Retention happens in all cases tested
+ * under FreeBSD, so don't pessimize things by forcibly clipping
+ * any extra precision in w.
+ */
+
+#include "libm.h"
+
+static const double
+C1 = 4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */
+C2 = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */
+C3 = 2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */
+C4 = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */
+C5 = 2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */
+C6 = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */
+
+double __cos(double x, double y)
+{
+ double_t hz,z,r,w;
+
+ z = x*x;
+ w = z*z;
+ r = z*(C1+z*(C2+z*C3)) + w*w*(C4+z*(C5+z*C6));
+ hz = 0.5*z;
+ w = 1.0-hz;
+ return w + (((1.0-w)-hz) + (z*r-x*y));
+}
diff --git a/libc-top-half/musl/src/math/__cosdf.c b/libc-top-half/musl/src/math/__cosdf.c
new file mode 100644
index 0000000..2124989
--- /dev/null
+++ b/libc-top-half/musl/src/math/__cosdf.c
@@ -0,0 +1,35 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/k_cosf.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Debugged and optimized by Bruce D. Evans.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+/* |cos(x) - c(x)| < 2**-34.1 (~[-5.37e-11, 5.295e-11]). */
+static const double
+C0 = -0x1ffffffd0c5e81.0p-54, /* -0.499999997251031003120 */
+C1 = 0x155553e1053a42.0p-57, /* 0.0416666233237390631894 */
+C2 = -0x16c087e80f1e27.0p-62, /* -0.00138867637746099294692 */
+C3 = 0x199342e0ee5069.0p-68; /* 0.0000243904487962774090654 */
+
+float __cosdf(double x)
+{
+ double_t r, w, z;
+
+ /* Try to optimize for parallel evaluation as in __tandf.c. */
+ z = x*x;
+ w = z*z;
+ r = C2+z*C3;
+ return ((1.0+z*C0) + w*C1) + (w*z)*r;
+}
diff --git a/libc-top-half/musl/src/math/__cosl.c b/libc-top-half/musl/src/math/__cosl.c
new file mode 100644
index 0000000..fa522dd
--- /dev/null
+++ b/libc-top-half/musl/src/math/__cosl.c
@@ -0,0 +1,96 @@
+/* origin: FreeBSD /usr/src/lib/msun/ld80/k_cosl.c */
+/* origin: FreeBSD /usr/src/lib/msun/ld128/k_cosl.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+
+#include "libm.h"
+
+#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+#if LDBL_MANT_DIG == 64
+/*
+ * ld80 version of __cos.c. See __cos.c for most comments.
+ */
+/*
+ * Domain [-0.7854, 0.7854], range ~[-2.43e-23, 2.425e-23]:
+ * |cos(x) - c(x)| < 2**-75.1
+ *
+ * The coefficients of c(x) were generated by a pari-gp script using
+ * a Remez algorithm that searches for the best higher coefficients
+ * after rounding leading coefficients to a specified precision.
+ *
+ * Simpler methods like Chebyshev or basic Remez barely suffice for
+ * cos() in 64-bit precision, because we want the coefficient of x^2
+ * to be precisely -0.5 so that multiplying by it is exact, and plain
+ * rounding of the coefficients of a good polynomial approximation only
+ * gives this up to about 64-bit precision. Plain rounding also gives
+ * a mediocre approximation for the coefficient of x^4, but a rounding
+ * error of 0.5 ulps for this coefficient would only contribute ~0.01
+ * ulps to the final error, so this is unimportant. Rounding errors in
+ * higher coefficients are even less important.
+ *
+ * In fact, coefficients above the x^4 one only need to have 53-bit
+ * precision, and this is more efficient. We get this optimization
+ * almost for free from the complications needed to search for the best
+ * higher coefficients.
+ */
+static const long double
+C1 = 0.0416666666666666666136L; /* 0xaaaaaaaaaaaaaa9b.0p-68 */
+static const double
+C2 = -0.0013888888888888874, /* -0x16c16c16c16c10.0p-62 */
+C3 = 0.000024801587301571716, /* 0x1a01a01a018e22.0p-68 */
+C4 = -0.00000027557319215507120, /* -0x127e4fb7602f22.0p-74 */
+C5 = 0.0000000020876754400407278, /* 0x11eed8caaeccf1.0p-81 */
+C6 = -1.1470297442401303e-11, /* -0x19393412bd1529.0p-89 */
+C7 = 4.7383039476436467e-14; /* 0x1aac9d9af5c43e.0p-97 */
+#define POLY(z) (z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*(C6+z*C7)))))))
+#elif LDBL_MANT_DIG == 113
+/*
+ * ld128 version of __cos.c. See __cos.c for most comments.
+ */
+/*
+ * Domain [-0.7854, 0.7854], range ~[-1.80e-37, 1.79e-37]:
+ * |cos(x) - c(x))| < 2**-122.0
+ *
+ * 113-bit precision requires more care than 64-bit precision, since
+ * simple methods give a minimax polynomial with coefficient for x^2
+ * that is 1 ulp below 0.5, but we want it to be precisely 0.5. See
+ * above for more details.
+ */
+static const long double
+C1 = 0.04166666666666666666666666666666658424671L,
+C2 = -0.001388888888888888888888888888863490893732L,
+C3 = 0.00002480158730158730158730158600795304914210L,
+C4 = -0.2755731922398589065255474947078934284324e-6L,
+C5 = 0.2087675698786809897659225313136400793948e-8L,
+C6 = -0.1147074559772972315817149986812031204775e-10L,
+C7 = 0.4779477332386808976875457937252120293400e-13L;
+static const double
+C8 = -0.1561920696721507929516718307820958119868e-15,
+C9 = 0.4110317413744594971475941557607804508039e-18,
+C10 = -0.8896592467191938803288521958313920156409e-21,
+C11 = 0.1601061435794535138244346256065192782581e-23;
+#define POLY(z) (z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*(C6+z*(C7+ \
+ z*(C8+z*(C9+z*(C10+z*C11)))))))))))
+#endif
+
+long double __cosl(long double x, long double y)
+{
+ long double hz,z,r,w;
+
+ z = x*x;
+ r = POLY(z);
+ hz = 0.5*z;
+ w = 1.0-hz;
+ return w + (((1.0-w)-hz) + (z*r-x*y));
+}
+#endif
diff --git a/libc-top-half/musl/src/math/__expo2.c b/libc-top-half/musl/src/math/__expo2.c
new file mode 100644
index 0000000..4ff17df
--- /dev/null
+++ b/libc-top-half/musl/src/math/__expo2.c
@@ -0,0 +1,25 @@
+#include "libm.h"
+
+/* k is such that k*ln2 has minimal relative error and x - kln2 > log(DBL_MIN) */
+static const int k = 2043;
+static const double kln2 = 0x1.62066151add8bp+10;
+
+/* exp(x)/2 for x >= log(DBL_MAX), slightly better than 0.5*exp(x/2)*exp(x/2) */
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+double __expo2(double x, double sign)
+#else
+double __expo2(double x)
+#endif
+{
+ double scale;
+
+ /* note that k is odd and scale*scale overflows */
+ INSERT_WORDS(scale, (uint32_t)(0x3ff + k/2) << 20, 0);
+ /* exp(x - k ln2) * 2**(k-1) */
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+ /* in directed rounding correct sign before rounding or overflow is important */
+ return exp(x - kln2) * (sign * scale) * scale;
+#else
+ return exp(x - kln2) * scale * scale;
+#endif
+}
diff --git a/libc-top-half/musl/src/math/__expo2f.c b/libc-top-half/musl/src/math/__expo2f.c
new file mode 100644
index 0000000..acbaeb4
--- /dev/null
+++ b/libc-top-half/musl/src/math/__expo2f.c
@@ -0,0 +1,25 @@
+#include "libm.h"
+
+/* k is such that k*ln2 has minimal relative error and x - kln2 > log(FLT_MIN) */
+static const int k = 235;
+static const float kln2 = 0x1.45c778p+7f;
+
+/* expf(x)/2 for x >= log(FLT_MAX), slightly better than 0.5f*expf(x/2)*expf(x/2) */
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+float __expo2f(float x, float sign)
+#else
+float __expo2f(float x)
+#endif
+{
+ float scale;
+
+ /* note that k is odd and scale*scale overflows */
+ SET_FLOAT_WORD(scale, (uint32_t)(0x7f + k/2) << 23);
+ /* exp(x - k ln2) * 2**(k-1) */
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+ /* in directed rounding correct sign before rounding or overflow is important */
+ return expf(x - kln2) * (sign * scale) * scale;
+#else
+ return expf(x - kln2) * scale * scale;
+#endif
+}
diff --git a/libc-top-half/musl/src/math/__fpclassify.c b/libc-top-half/musl/src/math/__fpclassify.c
new file mode 100644
index 0000000..f7c0e2d
--- /dev/null
+++ b/libc-top-half/musl/src/math/__fpclassify.c
@@ -0,0 +1,11 @@
+#include <math.h>
+#include <stdint.h>
+
+int __fpclassify(double x)
+{
+ union {double f; uint64_t i;} u = {x};
+ int e = u.i>>52 & 0x7ff;
+ if (!e) return u.i<<1 ? FP_SUBNORMAL : FP_ZERO;
+ if (e==0x7ff) return u.i<<12 ? FP_NAN : FP_INFINITE;
+ return FP_NORMAL;
+}
diff --git a/libc-top-half/musl/src/math/__fpclassifyf.c b/libc-top-half/musl/src/math/__fpclassifyf.c
new file mode 100644
index 0000000..fd00eb1
--- /dev/null
+++ b/libc-top-half/musl/src/math/__fpclassifyf.c
@@ -0,0 +1,11 @@
+#include <math.h>
+#include <stdint.h>
+
+int __fpclassifyf(float x)
+{
+ union {float f; uint32_t i;} u = {x};
+ int e = u.i>>23 & 0xff;
+ if (!e) return u.i<<1 ? FP_SUBNORMAL : FP_ZERO;
+ if (e==0xff) return u.i<<9 ? FP_NAN : FP_INFINITE;
+ return FP_NORMAL;
+}
diff --git a/libc-top-half/musl/src/math/__fpclassifyl.c b/libc-top-half/musl/src/math/__fpclassifyl.c
new file mode 100644
index 0000000..e41781b
--- /dev/null
+++ b/libc-top-half/musl/src/math/__fpclassifyl.c
@@ -0,0 +1,42 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+int __fpclassifyl(long double x)
+{
+ return __fpclassify(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+int __fpclassifyl(long double x)
+{
+ union ldshape u = {x};
+ int e = u.i.se & 0x7fff;
+ int msb = u.i.m>>63;
+ if (!e && !msb)
+ return u.i.m ? FP_SUBNORMAL : FP_ZERO;
+ if (e == 0x7fff) {
+ /* The x86 variant of 80-bit extended precision only admits
+ * one representation of each infinity, with the mantissa msb
+ * necessarily set. The version with it clear is invalid/nan.
+ * The m68k variant, however, allows either, and tooling uses
+ * the version with it clear. */
+ if (__BYTE_ORDER == __LITTLE_ENDIAN && !msb)
+ return FP_NAN;
+ return u.i.m << 1 ? FP_NAN : FP_INFINITE;
+ }
+ if (!msb)
+ return FP_NAN;
+ return FP_NORMAL;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+int __fpclassifyl(long double x)
+{
+ union ldshape u = {x};
+ int e = u.i.se & 0x7fff;
+ u.i.se = 0;
+ if (!e)
+ return u.i2.lo | u.i2.hi ? FP_SUBNORMAL : FP_ZERO;
+ if (e == 0x7fff)
+ return u.i2.lo | u.i2.hi ? FP_NAN : FP_INFINITE;
+ return FP_NORMAL;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/__invtrigl.c b/libc-top-half/musl/src/math/__invtrigl.c
new file mode 100644
index 0000000..48f83aa
--- /dev/null
+++ b/libc-top-half/musl/src/math/__invtrigl.c
@@ -0,0 +1,63 @@
+#include <float.h>
+#include "__invtrigl.h"
+
+#if LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+static const long double
+pS0 = 1.66666666666666666631e-01L,
+pS1 = -4.16313987993683104320e-01L,
+pS2 = 3.69068046323246813704e-01L,
+pS3 = -1.36213932016738603108e-01L,
+pS4 = 1.78324189708471965733e-02L,
+pS5 = -2.19216428382605211588e-04L,
+pS6 = -7.10526623669075243183e-06L,
+qS1 = -2.94788392796209867269e+00L,
+qS2 = 3.27309890266528636716e+00L,
+qS3 = -1.68285799854822427013e+00L,
+qS4 = 3.90699412641738801874e-01L,
+qS5 = -3.14365703596053263322e-02L;
+
+const long double pio2_hi = 1.57079632679489661926L;
+const long double pio2_lo = -2.50827880633416601173e-20L;
+
+/* used in asinl() and acosl() */
+/* R(x^2) is a rational approximation of (asin(x)-x)/x^3 with Remez algorithm */
+long double __invtrigl_R(long double z)
+{
+ long double p, q;
+ p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*(pS5+z*pS6))))));
+ q = 1.0+z*(qS1+z*(qS2+z*(qS3+z*(qS4+z*qS5))));
+ return p/q;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+static const long double
+pS0 = 1.66666666666666666666666666666700314e-01L,
+pS1 = -7.32816946414566252574527475428622708e-01L,
+pS2 = 1.34215708714992334609030036562143589e+00L,
+pS3 = -1.32483151677116409805070261790752040e+00L,
+pS4 = 7.61206183613632558824485341162121989e-01L,
+pS5 = -2.56165783329023486777386833928147375e-01L,
+pS6 = 4.80718586374448793411019434585413855e-02L,
+pS7 = -4.42523267167024279410230886239774718e-03L,
+pS8 = 1.44551535183911458253205638280410064e-04L,
+pS9 = -2.10558957916600254061591040482706179e-07L,
+qS1 = -4.84690167848739751544716485245697428e+00L,
+qS2 = 9.96619113536172610135016921140206980e+00L,
+qS3 = -1.13177895428973036660836798461641458e+01L,
+qS4 = 7.74004374389488266169304117714658761e+00L,
+qS5 = -3.25871986053534084709023539900339905e+00L,
+qS6 = 8.27830318881232209752469022352928864e-01L,
+qS7 = -1.18768052702942805423330715206348004e-01L,
+qS8 = 8.32600764660522313269101537926539470e-03L,
+qS9 = -1.99407384882605586705979504567947007e-04L;
+
+const long double pio2_hi = 1.57079632679489661923132169163975140L;
+const long double pio2_lo = 4.33590506506189051239852201302167613e-35L;
+
+long double __invtrigl_R(long double z)
+{
+ long double p, q;
+ p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*(pS5+z*(pS6+z*(pS7+z*(pS8+z*pS9)))))))));
+ q = 1.0+z*(qS1+z*(qS2+z*(qS3+z*(qS4+z*(qS5+z*(qS6+z*(qS7+z*(qS8+z*qS9))))))));
+ return p/q;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/__invtrigl.h b/libc-top-half/musl/src/math/__invtrigl.h
new file mode 100644
index 0000000..bee7931
--- /dev/null
+++ b/libc-top-half/musl/src/math/__invtrigl.h
@@ -0,0 +1,8 @@
+#include <features.h>
+
+/* shared by acosl, asinl and atan2l */
+#define pio2_hi __pio2_hi
+#define pio2_lo __pio2_lo
+hidden extern const long double pio2_hi, pio2_lo;
+
+hidden long double __invtrigl_R(long double z);
diff --git a/libc-top-half/musl/src/math/__math_divzero.c b/libc-top-half/musl/src/math/__math_divzero.c
new file mode 100644
index 0000000..59d2135
--- /dev/null
+++ b/libc-top-half/musl/src/math/__math_divzero.c
@@ -0,0 +1,6 @@
+#include "libm.h"
+
+double __math_divzero(uint32_t sign)
+{
+ return fp_barrier(sign ? -1.0 : 1.0) / 0.0;
+}
diff --git a/libc-top-half/musl/src/math/__math_divzerof.c b/libc-top-half/musl/src/math/__math_divzerof.c
new file mode 100644
index 0000000..ce046f3
--- /dev/null
+++ b/libc-top-half/musl/src/math/__math_divzerof.c
@@ -0,0 +1,6 @@
+#include "libm.h"
+
+float __math_divzerof(uint32_t sign)
+{
+ return fp_barrierf(sign ? -1.0f : 1.0f) / 0.0f;
+}
diff --git a/libc-top-half/musl/src/math/__math_invalid.c b/libc-top-half/musl/src/math/__math_invalid.c
new file mode 100644
index 0000000..1774049
--- /dev/null
+++ b/libc-top-half/musl/src/math/__math_invalid.c
@@ -0,0 +1,6 @@
+#include "libm.h"
+
+double __math_invalid(double x)
+{
+ return (x - x) / (x - x);
+}
diff --git a/libc-top-half/musl/src/math/__math_invalidf.c b/libc-top-half/musl/src/math/__math_invalidf.c
new file mode 100644
index 0000000..357d4b1
--- /dev/null
+++ b/libc-top-half/musl/src/math/__math_invalidf.c
@@ -0,0 +1,6 @@
+#include "libm.h"
+
+float __math_invalidf(float x)
+{
+ return (x - x) / (x - x);
+}
diff --git a/libc-top-half/musl/src/math/__math_invalidl.c b/libc-top-half/musl/src/math/__math_invalidl.c
new file mode 100644
index 0000000..1fca99d
--- /dev/null
+++ b/libc-top-half/musl/src/math/__math_invalidl.c
@@ -0,0 +1,9 @@
+#include <float.h>
+#include "libm.h"
+
+#if LDBL_MANT_DIG != DBL_MANT_DIG
+long double __math_invalidl(long double x)
+{
+ return (x - x) / (x - x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/__math_oflow.c b/libc-top-half/musl/src/math/__math_oflow.c
new file mode 100644
index 0000000..c85dbf9
--- /dev/null
+++ b/libc-top-half/musl/src/math/__math_oflow.c
@@ -0,0 +1,6 @@
+#include "libm.h"
+
+double __math_oflow(uint32_t sign)
+{
+ return __math_xflow(sign, 0x1p769);
+}
diff --git a/libc-top-half/musl/src/math/__math_oflowf.c b/libc-top-half/musl/src/math/__math_oflowf.c
new file mode 100644
index 0000000..fa7d062
--- /dev/null
+++ b/libc-top-half/musl/src/math/__math_oflowf.c
@@ -0,0 +1,6 @@
+#include "libm.h"
+
+float __math_oflowf(uint32_t sign)
+{
+ return __math_xflowf(sign, 0x1p97f);
+}
diff --git a/libc-top-half/musl/src/math/__math_uflow.c b/libc-top-half/musl/src/math/__math_uflow.c
new file mode 100644
index 0000000..b90594a
--- /dev/null
+++ b/libc-top-half/musl/src/math/__math_uflow.c
@@ -0,0 +1,6 @@
+#include "libm.h"
+
+double __math_uflow(uint32_t sign)
+{
+ return __math_xflow(sign, 0x1p-767);
+}
diff --git a/libc-top-half/musl/src/math/__math_uflowf.c b/libc-top-half/musl/src/math/__math_uflowf.c
new file mode 100644
index 0000000..94d50f2
--- /dev/null
+++ b/libc-top-half/musl/src/math/__math_uflowf.c
@@ -0,0 +1,6 @@
+#include "libm.h"
+
+float __math_uflowf(uint32_t sign)
+{
+ return __math_xflowf(sign, 0x1p-95f);
+}
diff --git a/libc-top-half/musl/src/math/__math_xflow.c b/libc-top-half/musl/src/math/__math_xflow.c
new file mode 100644
index 0000000..744203c
--- /dev/null
+++ b/libc-top-half/musl/src/math/__math_xflow.c
@@ -0,0 +1,6 @@
+#include "libm.h"
+
+double __math_xflow(uint32_t sign, double y)
+{
+ return eval_as_double(fp_barrier(sign ? -y : y) * y);
+}
diff --git a/libc-top-half/musl/src/math/__math_xflowf.c b/libc-top-half/musl/src/math/__math_xflowf.c
new file mode 100644
index 0000000..f2c8478
--- /dev/null
+++ b/libc-top-half/musl/src/math/__math_xflowf.c
@@ -0,0 +1,6 @@
+#include "libm.h"
+
+float __math_xflowf(uint32_t sign, float y)
+{
+ return eval_as_float(fp_barrierf(sign ? -y : y) * y);
+}
diff --git a/libc-top-half/musl/src/math/__polevll.c b/libc-top-half/musl/src/math/__polevll.c
new file mode 100644
index 0000000..ce1a840
--- /dev/null
+++ b/libc-top-half/musl/src/math/__polevll.c
@@ -0,0 +1,93 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/polevll.c */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Evaluate polynomial
+ *
+ *
+ * SYNOPSIS:
+ *
+ * int N;
+ * long double x, y, coef[N+1], polevl[];
+ *
+ * y = polevll( x, coef, N );
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Evaluates polynomial of degree N:
+ *
+ * 2 N
+ * y = C + C x + C x +...+ C x
+ * 0 1 2 N
+ *
+ * Coefficients are stored in reverse order:
+ *
+ * coef[0] = C , ..., coef[N] = C .
+ * N 0
+ *
+ * The function p1evll() assumes that coef[N] = 1.0 and is
+ * omitted from the array. Its calling arguments are
+ * otherwise the same as polevll().
+ *
+ *
+ * SPEED:
+ *
+ * In the interest of speed, there are no checks for out
+ * of bounds arithmetic. This routine is used by most of
+ * the functions in the library. Depending on available
+ * equipment features, the user may wish to rewrite the
+ * program in microcode or assembly language.
+ *
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+#else
+/*
+ * Polynomial evaluator:
+ * P[0] x^n + P[1] x^(n-1) + ... + P[n]
+ */
+long double __polevll(long double x, const long double *P, int n)
+{
+ long double y;
+
+ y = *P++;
+ do {
+ y = y * x + *P++;
+ } while (--n);
+
+ return y;
+}
+
+/*
+ * Polynomial evaluator:
+ * x^n + P[0] x^(n-1) + P[1] x^(n-2) + ... + P[n]
+ */
+long double __p1evll(long double x, const long double *P, int n)
+{
+ long double y;
+
+ n -= 1;
+ y = x + *P++;
+ do {
+ y = y * x + *P++;
+ } while (--n);
+
+ return y;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/__rem_pio2.c b/libc-top-half/musl/src/math/__rem_pio2.c
new file mode 100644
index 0000000..326cda7
--- /dev/null
+++ b/libc-top-half/musl/src/math/__rem_pio2.c
@@ -0,0 +1,194 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_rem_pio2.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * Optimized by Bruce D. Evans.
+ */
+/* __rem_pio2(x,y)
+ *
+ * return the remainder of x rem pi/2 in y[0]+y[1]
+ * use __rem_pio2_large() for large x
+ */
+
+#include "libm.h"
+
+#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1
+#define EPS DBL_EPSILON
+#elif FLT_EVAL_METHOD==2
+#define EPS LDBL_EPSILON
+#endif
+
+/*
+ * invpio2: 53 bits of 2/pi
+ * pio2_1: first 33 bit of pi/2
+ * pio2_1t: pi/2 - pio2_1
+ * pio2_2: second 33 bit of pi/2
+ * pio2_2t: pi/2 - (pio2_1+pio2_2)
+ * pio2_3: third 33 bit of pi/2
+ * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
+ */
+static const double
+toint = 1.5/EPS,
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+pio4 = 0x1.921fb54442d18p-1,
+#endif
+invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
+pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
+pio2_1t = 6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */
+pio2_2 = 6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */
+pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
+pio2_3 = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
+pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */
+
+/* caller must handle the case when reduction is not needed: |x| ~<= pi/4 */
+int __rem_pio2(double x, double *y)
+{
+ union {double f; uint64_t i;} u = {x};
+ double_t z,w,t,r,fn;
+ double tx[3],ty[2];
+ uint32_t ix;
+ int sign, n, ex, ey, i;
+
+ sign = u.i>>63;
+ ix = u.i>>32 & 0x7fffffff;
+ if (ix <= 0x400f6a7a) { /* |x| ~<= 5pi/4 */
+ if ((ix & 0xfffff) == 0x921fb) /* |x| ~= pi/2 or 2pi/2 */
+ goto medium; /* cancellation -- use medium case */
+ if (ix <= 0x4002d97c) { /* |x| ~<= 3pi/4 */
+ if (!sign) {
+ z = x - pio2_1; /* one round good to 85 bits */
+ y[0] = z - pio2_1t;
+ y[1] = (z-y[0]) - pio2_1t;
+ return 1;
+ } else {
+ z = x + pio2_1;
+ y[0] = z + pio2_1t;
+ y[1] = (z-y[0]) + pio2_1t;
+ return -1;
+ }
+ } else {
+ if (!sign) {
+ z = x - 2*pio2_1;
+ y[0] = z - 2*pio2_1t;
+ y[1] = (z-y[0]) - 2*pio2_1t;
+ return 2;
+ } else {
+ z = x + 2*pio2_1;
+ y[0] = z + 2*pio2_1t;
+ y[1] = (z-y[0]) + 2*pio2_1t;
+ return -2;
+ }
+ }
+ }
+ if (ix <= 0x401c463b) { /* |x| ~<= 9pi/4 */
+ if (ix <= 0x4015fdbc) { /* |x| ~<= 7pi/4 */
+ if (ix == 0x4012d97c) /* |x| ~= 3pi/2 */
+ goto medium;
+ if (!sign) {
+ z = x - 3*pio2_1;
+ y[0] = z - 3*pio2_1t;
+ y[1] = (z-y[0]) - 3*pio2_1t;
+ return 3;
+ } else {
+ z = x + 3*pio2_1;
+ y[0] = z + 3*pio2_1t;
+ y[1] = (z-y[0]) + 3*pio2_1t;
+ return -3;
+ }
+ } else {
+ if (ix == 0x401921fb) /* |x| ~= 4pi/2 */
+ goto medium;
+ if (!sign) {
+ z = x - 4*pio2_1;
+ y[0] = z - 4*pio2_1t;
+ y[1] = (z-y[0]) - 4*pio2_1t;
+ return 4;
+ } else {
+ z = x + 4*pio2_1;
+ y[0] = z + 4*pio2_1t;
+ y[1] = (z-y[0]) + 4*pio2_1t;
+ return -4;
+ }
+ }
+ }
+ if (ix < 0x413921fb) { /* |x| ~< 2^20*(pi/2), medium size */
+medium:
+ /* rint(x/(pi/2)) */
+ fn = (double_t)x*invpio2 + toint - toint;
+ n = (int32_t)fn;
+ r = x - fn*pio2_1;
+ w = fn*pio2_1t; /* 1st round, good to 85 bits */
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+ /* Matters with directed rounding. */
+ if (predict_false(r - w < -pio4)) {
+ n--;
+ fn--;
+ r = x - fn*pio2_1;
+ w = fn*pio2_1t;
+ } else if (predict_false(r - w > pio4)) {
+ n++;
+ fn++;
+ r = x - fn*pio2_1;
+ w = fn*pio2_1t;
+ }
+#endif
+ y[0] = r - w;
+ u.f = y[0];
+ ey = u.i>>52 & 0x7ff;
+ ex = ix>>20;
+ if (ex - ey > 16) { /* 2nd round, good to 118 bits */
+ t = r;
+ w = fn*pio2_2;
+ r = t - w;
+ w = fn*pio2_2t - ((t-r)-w);
+ y[0] = r - w;
+ u.f = y[0];
+ ey = u.i>>52 & 0x7ff;
+ if (ex - ey > 49) { /* 3rd round, good to 151 bits, covers all cases */
+ t = r;
+ w = fn*pio2_3;
+ r = t - w;
+ w = fn*pio2_3t - ((t-r)-w);
+ y[0] = r - w;
+ }
+ }
+ y[1] = (r - y[0]) - w;
+ return n;
+ }
+ /*
+ * all other (large) arguments
+ */
+ if (ix >= 0x7ff00000) { /* x is inf or NaN */
+ y[0] = y[1] = x - x;
+ return 0;
+ }
+ /* set z = scalbn(|x|,-ilogb(x)+23) */
+ u.f = x;
+ u.i &= (uint64_t)-1>>12;
+ u.i |= (uint64_t)(0x3ff + 23)<<52;
+ z = u.f;
+ for (i=0; i < 2; i++) {
+ tx[i] = (double)(int32_t)z;
+ z = (z-tx[i])*0x1p24;
+ }
+ tx[i] = z;
+ /* skip zero terms, first term is non-zero */
+ while (tx[i] == 0.0)
+ i--;
+ n = __rem_pio2_large(tx,ty,(int)(ix>>20)-(0x3ff+23),i+1,1);
+ if (sign) {
+ y[0] = -ty[0];
+ y[1] = -ty[1];
+ return -n;
+ }
+ y[0] = ty[0];
+ y[1] = ty[1];
+ return n;
+}
diff --git a/libc-top-half/musl/src/math/__rem_pio2_large.c b/libc-top-half/musl/src/math/__rem_pio2_large.c
new file mode 100644
index 0000000..958f28c
--- /dev/null
+++ b/libc-top-half/musl/src/math/__rem_pio2_large.c
@@ -0,0 +1,442 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/k_rem_pio2.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/*
+ * __rem_pio2_large(x,y,e0,nx,prec)
+ * double x[],y[]; int e0,nx,prec;
+ *
+ * __rem_pio2_large return the last three digits of N with
+ * y = x - N*pi/2
+ * so that |y| < pi/2.
+ *
+ * The method is to compute the integer (mod 8) and fraction parts of
+ * (2/pi)*x without doing the full multiplication. In general we
+ * skip the part of the product that are known to be a huge integer (
+ * more accurately, = 0 mod 8 ). Thus the number of operations are
+ * independent of the exponent of the input.
+ *
+ * (2/pi) is represented by an array of 24-bit integers in ipio2[].
+ *
+ * Input parameters:
+ * x[] The input value (must be positive) is broken into nx
+ * pieces of 24-bit integers in double precision format.
+ * x[i] will be the i-th 24 bit of x. The scaled exponent
+ * of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
+ * match x's up to 24 bits.
+ *
+ * Example of breaking a double positive z into x[0]+x[1]+x[2]:
+ * e0 = ilogb(z)-23
+ * z = scalbn(z,-e0)
+ * for i = 0,1,2
+ * x[i] = floor(z)
+ * z = (z-x[i])*2**24
+ *
+ *
+ * y[] ouput result in an array of double precision numbers.
+ * The dimension of y[] is:
+ * 24-bit precision 1
+ * 53-bit precision 2
+ * 64-bit precision 2
+ * 113-bit precision 3
+ * The actual value is the sum of them. Thus for 113-bit
+ * precison, one may have to do something like:
+ *
+ * long double t,w,r_head, r_tail;
+ * t = (long double)y[2] + (long double)y[1];
+ * w = (long double)y[0];
+ * r_head = t+w;
+ * r_tail = w - (r_head - t);
+ *
+ * e0 The exponent of x[0]. Must be <= 16360 or you need to
+ * expand the ipio2 table.
+ *
+ * nx dimension of x[]
+ *
+ * prec an integer indicating the precision:
+ * 0 24 bits (single)
+ * 1 53 bits (double)
+ * 2 64 bits (extended)
+ * 3 113 bits (quad)
+ *
+ * External function:
+ * double scalbn(), floor();
+ *
+ *
+ * Here is the description of some local variables:
+ *
+ * jk jk+1 is the initial number of terms of ipio2[] needed
+ * in the computation. The minimum and recommended value
+ * for jk is 3,4,4,6 for single, double, extended, and quad.
+ * jk+1 must be 2 larger than you might expect so that our
+ * recomputation test works. (Up to 24 bits in the integer
+ * part (the 24 bits of it that we compute) and 23 bits in
+ * the fraction part may be lost to cancelation before we
+ * recompute.)
+ *
+ * jz local integer variable indicating the number of
+ * terms of ipio2[] used.
+ *
+ * jx nx - 1
+ *
+ * jv index for pointing to the suitable ipio2[] for the
+ * computation. In general, we want
+ * ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
+ * is an integer. Thus
+ * e0-3-24*jv >= 0 or (e0-3)/24 >= jv
+ * Hence jv = max(0,(e0-3)/24).
+ *
+ * jp jp+1 is the number of terms in PIo2[] needed, jp = jk.
+ *
+ * q[] double array with integral value, representing the
+ * 24-bits chunk of the product of x and 2/pi.
+ *
+ * q0 the corresponding exponent of q[0]. Note that the
+ * exponent for q[i] would be q0-24*i.
+ *
+ * PIo2[] double precision array, obtained by cutting pi/2
+ * into 24 bits chunks.
+ *
+ * f[] ipio2[] in floating point
+ *
+ * iq[] integer array by breaking up q[] in 24-bits chunk.
+ *
+ * fq[] final product of x*(2/pi) in fq[0],..,fq[jk]
+ *
+ * ih integer. If >0 it indicates q[] is >= 0.5, hence
+ * it also indicates the *sign* of the result.
+ *
+ */
+/*
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+#include "libm.h"
+
+static const int init_jk[] = {3,4,4,6}; /* initial value for jk */
+
+/*
+ * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
+ *
+ * integer array, contains the (24*i)-th to (24*i+23)-th
+ * bit of 2/pi after binary point. The corresponding
+ * floating value is
+ *
+ * ipio2[i] * 2^(-24(i+1)).
+ *
+ * NB: This table must have at least (e0-3)/24 + jk terms.
+ * For quad precision (e0 <= 16360, jk = 6), this is 686.
+ */
+static const int32_t ipio2[] = {
+0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,
+0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,
+0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,
+0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,
+0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,
+0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,
+0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
+0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
+0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
+0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
+0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
+
+#if LDBL_MAX_EXP > 1024
+0x47C419, 0xC367CD, 0xDCE809, 0x2A8359, 0xC4768B, 0x961CA6,
+0xDDAF44, 0xD15719, 0x053EA5, 0xFF0705, 0x3F7E33, 0xE832C2,
+0xDE4F98, 0x327DBB, 0xC33D26, 0xEF6B1E, 0x5EF89F, 0x3A1F35,
+0xCAF27F, 0x1D87F1, 0x21907C, 0x7C246A, 0xFA6ED5, 0x772D30,
+0x433B15, 0xC614B5, 0x9D19C3, 0xC2C4AD, 0x414D2C, 0x5D000C,
+0x467D86, 0x2D71E3, 0x9AC69B, 0x006233, 0x7CD2B4, 0x97A7B4,
+0xD55537, 0xF63ED7, 0x1810A3, 0xFC764D, 0x2A9D64, 0xABD770,
+0xF87C63, 0x57B07A, 0xE71517, 0x5649C0, 0xD9D63B, 0x3884A7,
+0xCB2324, 0x778AD6, 0x23545A, 0xB91F00, 0x1B0AF1, 0xDFCE19,
+0xFF319F, 0x6A1E66, 0x615799, 0x47FBAC, 0xD87F7E, 0xB76522,
+0x89E832, 0x60BFE6, 0xCDC4EF, 0x09366C, 0xD43F5D, 0xD7DE16,
+0xDE3B58, 0x929BDE, 0x2822D2, 0xE88628, 0x4D58E2, 0x32CAC6,
+0x16E308, 0xCB7DE0, 0x50C017, 0xA71DF3, 0x5BE018, 0x34132E,
+0x621283, 0x014883, 0x5B8EF5, 0x7FB0AD, 0xF2E91E, 0x434A48,
+0xD36710, 0xD8DDAA, 0x425FAE, 0xCE616A, 0xA4280A, 0xB499D3,
+0xF2A606, 0x7F775C, 0x83C2A3, 0x883C61, 0x78738A, 0x5A8CAF,
+0xBDD76F, 0x63A62D, 0xCBBFF4, 0xEF818D, 0x67C126, 0x45CA55,
+0x36D9CA, 0xD2A828, 0x8D61C2, 0x77C912, 0x142604, 0x9B4612,
+0xC459C4, 0x44C5C8, 0x91B24D, 0xF31700, 0xAD43D4, 0xE54929,
+0x10D5FD, 0xFCBE00, 0xCC941E, 0xEECE70, 0xF53E13, 0x80F1EC,
+0xC3E7B3, 0x28F8C7, 0x940593, 0x3E71C1, 0xB3092E, 0xF3450B,
+0x9C1288, 0x7B20AB, 0x9FB52E, 0xC29247, 0x2F327B, 0x6D550C,
+0x90A772, 0x1FE76B, 0x96CB31, 0x4A1679, 0xE27941, 0x89DFF4,
+0x9794E8, 0x84E6E2, 0x973199, 0x6BED88, 0x365F5F, 0x0EFDBB,
+0xB49A48, 0x6CA467, 0x427271, 0x325D8D, 0xB8159F, 0x09E5BC,
+0x25318D, 0x3974F7, 0x1C0530, 0x010C0D, 0x68084B, 0x58EE2C,
+0x90AA47, 0x02E774, 0x24D6BD, 0xA67DF7, 0x72486E, 0xEF169F,
+0xA6948E, 0xF691B4, 0x5153D1, 0xF20ACF, 0x339820, 0x7E4BF5,
+0x6863B2, 0x5F3EDD, 0x035D40, 0x7F8985, 0x295255, 0xC06437,
+0x10D86D, 0x324832, 0x754C5B, 0xD4714E, 0x6E5445, 0xC1090B,
+0x69F52A, 0xD56614, 0x9D0727, 0x50045D, 0xDB3BB4, 0xC576EA,
+0x17F987, 0x7D6B49, 0xBA271D, 0x296996, 0xACCCC6, 0x5414AD,
+0x6AE290, 0x89D988, 0x50722C, 0xBEA404, 0x940777, 0x7030F3,
+0x27FC00, 0xA871EA, 0x49C266, 0x3DE064, 0x83DD97, 0x973FA3,
+0xFD9443, 0x8C860D, 0xDE4131, 0x9D3992, 0x8C70DD, 0xE7B717,
+0x3BDF08, 0x2B3715, 0xA0805C, 0x93805A, 0x921110, 0xD8E80F,
+0xAF806C, 0x4BFFDB, 0x0F9038, 0x761859, 0x15A562, 0xBBCB61,
+0xB989C7, 0xBD4010, 0x04F2D2, 0x277549, 0xF6B6EB, 0xBB22DB,
+0xAA140A, 0x2F2689, 0x768364, 0x333B09, 0x1A940E, 0xAA3A51,
+0xC2A31D, 0xAEEDAF, 0x12265C, 0x4DC26D, 0x9C7A2D, 0x9756C0,
+0x833F03, 0xF6F009, 0x8C402B, 0x99316D, 0x07B439, 0x15200C,
+0x5BC3D8, 0xC492F5, 0x4BADC6, 0xA5CA4E, 0xCD37A7, 0x36A9E6,
+0x9492AB, 0x6842DD, 0xDE6319, 0xEF8C76, 0x528B68, 0x37DBFC,
+0xABA1AE, 0x3115DF, 0xA1AE00, 0xDAFB0C, 0x664D64, 0xB705ED,
+0x306529, 0xBF5657, 0x3AFF47, 0xB9F96A, 0xF3BE75, 0xDF9328,
+0x3080AB, 0xF68C66, 0x15CB04, 0x0622FA, 0x1DE4D9, 0xA4B33D,
+0x8F1B57, 0x09CD36, 0xE9424E, 0xA4BE13, 0xB52333, 0x1AAAF0,
+0xA8654F, 0xA5C1D2, 0x0F3F0B, 0xCD785B, 0x76F923, 0x048B7B,
+0x721789, 0x53A6C6, 0xE26E6F, 0x00EBEF, 0x584A9B, 0xB7DAC4,
+0xBA66AA, 0xCFCF76, 0x1D02D1, 0x2DF1B1, 0xC1998C, 0x77ADC3,
+0xDA4886, 0xA05DF7, 0xF480C6, 0x2FF0AC, 0x9AECDD, 0xBC5C3F,
+0x6DDED0, 0x1FC790, 0xB6DB2A, 0x3A25A3, 0x9AAF00, 0x9353AD,
+0x0457B6, 0xB42D29, 0x7E804B, 0xA707DA, 0x0EAA76, 0xA1597B,
+0x2A1216, 0x2DB7DC, 0xFDE5FA, 0xFEDB89, 0xFDBE89, 0x6C76E4,
+0xFCA906, 0x70803E, 0x156E85, 0xFF87FD, 0x073E28, 0x336761,
+0x86182A, 0xEABD4D, 0xAFE7B3, 0x6E6D8F, 0x396795, 0x5BBF31,
+0x48D784, 0x16DF30, 0x432DC7, 0x356125, 0xCE70C9, 0xB8CB30,
+0xFD6CBF, 0xA200A4, 0xE46C05, 0xA0DD5A, 0x476F21, 0xD21262,
+0x845CB9, 0x496170, 0xE0566B, 0x015299, 0x375550, 0xB7D51E,
+0xC4F133, 0x5F6E13, 0xE4305D, 0xA92E85, 0xC3B21D, 0x3632A1,
+0xA4B708, 0xD4B1EA, 0x21F716, 0xE4698F, 0x77FF27, 0x80030C,
+0x2D408D, 0xA0CD4F, 0x99A520, 0xD3A2B3, 0x0A5D2F, 0x42F9B4,
+0xCBDA11, 0xD0BE7D, 0xC1DB9B, 0xBD17AB, 0x81A2CA, 0x5C6A08,
+0x17552E, 0x550027, 0xF0147F, 0x8607E1, 0x640B14, 0x8D4196,
+0xDEBE87, 0x2AFDDA, 0xB6256B, 0x34897B, 0xFEF305, 0x9EBFB9,
+0x4F6A68, 0xA82A4A, 0x5AC44F, 0xBCF82D, 0x985AD7, 0x95C7F4,
+0x8D4D0D, 0xA63A20, 0x5F57A4, 0xB13F14, 0x953880, 0x0120CC,
+0x86DD71, 0xB6DEC9, 0xF560BF, 0x11654D, 0x6B0701, 0xACB08C,
+0xD0C0B2, 0x485551, 0x0EFB1E, 0xC37295, 0x3B06A3, 0x3540C0,
+0x7BDC06, 0xCC45E0, 0xFA294E, 0xC8CAD6, 0x41F3E8, 0xDE647C,
+0xD8649B, 0x31BED9, 0xC397A4, 0xD45877, 0xC5E369, 0x13DAF0,
+0x3C3ABA, 0x461846, 0x5F7555, 0xF5BDD2, 0xC6926E, 0x5D2EAC,
+0xED440E, 0x423E1C, 0x87C461, 0xE9FD29, 0xF3D6E7, 0xCA7C22,
+0x35916F, 0xC5E008, 0x8DD7FF, 0xE26A6E, 0xC6FDB0, 0xC10893,
+0x745D7C, 0xB2AD6B, 0x9D6ECD, 0x7B723E, 0x6A11C6, 0xA9CFF7,
+0xDF7329, 0xBAC9B5, 0x5100B7, 0x0DB2E2, 0x24BA74, 0x607DE5,
+0x8AD874, 0x2C150D, 0x0C1881, 0x94667E, 0x162901, 0x767A9F,
+0xBEFDFD, 0xEF4556, 0x367ED9, 0x13D9EC, 0xB9BA8B, 0xFC97C4,
+0x27A831, 0xC36EF1, 0x36C594, 0x56A8D8, 0xB5A8B4, 0x0ECCCF,
+0x2D8912, 0x34576F, 0x89562C, 0xE3CE99, 0xB920D6, 0xAA5E6B,
+0x9C2A3E, 0xCC5F11, 0x4A0BFD, 0xFBF4E1, 0x6D3B8E, 0x2C86E2,
+0x84D4E9, 0xA9B4FC, 0xD1EEEF, 0xC9352E, 0x61392F, 0x442138,
+0xC8D91B, 0x0AFC81, 0x6A4AFB, 0xD81C2F, 0x84B453, 0x8C994E,
+0xCC2254, 0xDC552A, 0xD6C6C0, 0x96190B, 0xB8701A, 0x649569,
+0x605A26, 0xEE523F, 0x0F117F, 0x11B5F4, 0xF5CBFC, 0x2DBC34,
+0xEEBC34, 0xCC5DE8, 0x605EDD, 0x9B8E67, 0xEF3392, 0xB817C9,
+0x9B5861, 0xBC57E1, 0xC68351, 0x103ED8, 0x4871DD, 0xDD1C2D,
+0xA118AF, 0x462C21, 0xD7F359, 0x987AD9, 0xC0549E, 0xFA864F,
+0xFC0656, 0xAE79E5, 0x362289, 0x22AD38, 0xDC9367, 0xAAE855,
+0x382682, 0x9BE7CA, 0xA40D51, 0xB13399, 0x0ED7A9, 0x480569,
+0xF0B265, 0xA7887F, 0x974C88, 0x36D1F9, 0xB39221, 0x4A827B,
+0x21CF98, 0xDC9F40, 0x5547DC, 0x3A74E1, 0x42EB67, 0xDF9DFE,
+0x5FD45E, 0xA4677B, 0x7AACBA, 0xA2F655, 0x23882B, 0x55BA41,
+0x086E59, 0x862A21, 0x834739, 0xE6E389, 0xD49EE5, 0x40FB49,
+0xE956FF, 0xCA0F1C, 0x8A59C5, 0x2BFA94, 0xC5C1D3, 0xCFC50F,
+0xAE5ADB, 0x86C547, 0x624385, 0x3B8621, 0x94792C, 0x876110,
+0x7B4C2A, 0x1A2C80, 0x12BF43, 0x902688, 0x893C78, 0xE4C4A8,
+0x7BDBE5, 0xC23AC4, 0xEAF426, 0x8A67F7, 0xBF920D, 0x2BA365,
+0xB1933D, 0x0B7CBD, 0xDC51A4, 0x63DD27, 0xDDE169, 0x19949A,
+0x9529A8, 0x28CE68, 0xB4ED09, 0x209F44, 0xCA984E, 0x638270,
+0x237C7E, 0x32B90F, 0x8EF5A7, 0xE75614, 0x08F121, 0x2A9DB5,
+0x4D7E6F, 0x5119A5, 0xABF9B5, 0xD6DF82, 0x61DD96, 0x023616,
+0x9F3AC4, 0xA1A283, 0x6DED72, 0x7A8D39, 0xA9B882, 0x5C326B,
+0x5B2746, 0xED3400, 0x7700D2, 0x55F4FC, 0x4D5901, 0x8071E0,
+#endif
+};
+
+static const double PIo2[] = {
+ 1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
+ 7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
+ 5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
+ 3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
+ 1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
+ 1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
+ 2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
+ 2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
+};
+
+int __rem_pio2_large(double *x, double *y, int e0, int nx, int prec)
+{
+ int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
+ double z,fw,f[20],fq[20],q[20];
+
+ /* initialize jk*/
+ jk = init_jk[prec];
+ jp = jk;
+
+ /* determine jx,jv,q0, note that 3>q0 */
+ jx = nx-1;
+ jv = (e0-3)/24; if(jv<0) jv=0;
+ q0 = e0-24*(jv+1);
+
+ /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
+ j = jv-jx; m = jx+jk;
+ for (i=0; i<=m; i++,j++)
+ f[i] = j<0 ? 0.0 : (double)ipio2[j];
+
+ /* compute q[0],q[1],...q[jk] */
+ for (i=0; i<=jk; i++) {
+ for (j=0,fw=0.0; j<=jx; j++)
+ fw += x[j]*f[jx+i-j];
+ q[i] = fw;
+ }
+
+ jz = jk;
+recompute:
+ /* distill q[] into iq[] reversingly */
+ for (i=0,j=jz,z=q[jz]; j>0; i++,j--) {
+ fw = (double)(int32_t)(0x1p-24*z);
+ iq[i] = (int32_t)(z - 0x1p24*fw);
+ z = q[j-1]+fw;
+ }
+
+ /* compute n */
+ z = scalbn(z,q0); /* actual value of z */
+ z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */
+ n = (int32_t)z;
+ z -= (double)n;
+ ih = 0;
+ if (q0 > 0) { /* need iq[jz-1] to determine n */
+ i = iq[jz-1]>>(24-q0); n += i;
+ iq[jz-1] -= i<<(24-q0);
+ ih = iq[jz-1]>>(23-q0);
+ }
+ else if (q0 == 0) ih = iq[jz-1]>>23;
+ else if (z >= 0.5) ih = 2;
+
+ if (ih > 0) { /* q > 0.5 */
+ n += 1; carry = 0;
+ for (i=0; i<jz; i++) { /* compute 1-q */
+ j = iq[i];
+ if (carry == 0) {
+ if (j != 0) {
+ carry = 1;
+ iq[i] = 0x1000000 - j;
+ }
+ } else
+ iq[i] = 0xffffff - j;
+ }
+ if (q0 > 0) { /* rare case: chance is 1 in 12 */
+ switch(q0) {
+ case 1:
+ iq[jz-1] &= 0x7fffff; break;
+ case 2:
+ iq[jz-1] &= 0x3fffff; break;
+ }
+ }
+ if (ih == 2) {
+ z = 1.0 - z;
+ if (carry != 0)
+ z -= scalbn(1.0,q0);
+ }
+ }
+
+ /* check if recomputation is needed */
+ if (z == 0.0) {
+ j = 0;
+ for (i=jz-1; i>=jk; i--) j |= iq[i];
+ if (j == 0) { /* need recomputation */
+ for (k=1; iq[jk-k]==0; k++); /* k = no. of terms needed */
+
+ for (i=jz+1; i<=jz+k; i++) { /* add q[jz+1] to q[jz+k] */
+ f[jx+i] = (double)ipio2[jv+i];
+ for (j=0,fw=0.0; j<=jx; j++)
+ fw += x[j]*f[jx+i-j];
+ q[i] = fw;
+ }
+ jz += k;
+ goto recompute;
+ }
+ }
+
+ /* chop off zero terms */
+ if (z == 0.0) {
+ jz -= 1;
+ q0 -= 24;
+ while (iq[jz] == 0) {
+ jz--;
+ q0 -= 24;
+ }
+ } else { /* break z into 24-bit if necessary */
+ z = scalbn(z,-q0);
+ if (z >= 0x1p24) {
+ fw = (double)(int32_t)(0x1p-24*z);
+ iq[jz] = (int32_t)(z - 0x1p24*fw);
+ jz += 1;
+ q0 += 24;
+ iq[jz] = (int32_t)fw;
+ } else
+ iq[jz] = (int32_t)z;
+ }
+
+ /* convert integer "bit" chunk to floating-point value */
+ fw = scalbn(1.0,q0);
+ for (i=jz; i>=0; i--) {
+ q[i] = fw*(double)iq[i];
+ fw *= 0x1p-24;
+ }
+
+ /* compute PIo2[0,...,jp]*q[jz,...,0] */
+ for(i=jz; i>=0; i--) {
+ for (fw=0.0,k=0; k<=jp && k<=jz-i; k++)
+ fw += PIo2[k]*q[i+k];
+ fq[jz-i] = fw;
+ }
+
+ /* compress fq[] into y[] */
+ switch(prec) {
+ case 0:
+ fw = 0.0;
+ for (i=jz; i>=0; i--)
+ fw += fq[i];
+ y[0] = ih==0 ? fw : -fw;
+ break;
+ case 1:
+ case 2:
+ fw = 0.0;
+ for (i=jz; i>=0; i--)
+ fw += fq[i];
+ // TODO: drop excess precision here once double_t is used
+ fw = (double)fw;
+ y[0] = ih==0 ? fw : -fw;
+ fw = fq[0]-fw;
+ for (i=1; i<=jz; i++)
+ fw += fq[i];
+ y[1] = ih==0 ? fw : -fw;
+ break;
+ case 3: /* painful */
+ for (i=jz; i>0; i--) {
+ fw = fq[i-1]+fq[i];
+ fq[i] += fq[i-1]-fw;
+ fq[i-1] = fw;
+ }
+ for (i=jz; i>1; i--) {
+ fw = fq[i-1]+fq[i];
+ fq[i] += fq[i-1]-fw;
+ fq[i-1] = fw;
+ }
+ for (fw=0.0,i=jz; i>=2; i--)
+ fw += fq[i];
+ if (ih==0) {
+ y[0] = fq[0]; y[1] = fq[1]; y[2] = fw;
+ } else {
+ y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw;
+ }
+ }
+ return n&7;
+}
diff --git a/libc-top-half/musl/src/math/__rem_pio2f.c b/libc-top-half/musl/src/math/__rem_pio2f.c
new file mode 100644
index 0000000..034ed81
--- /dev/null
+++ b/libc-top-half/musl/src/math/__rem_pio2f.c
@@ -0,0 +1,90 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_rem_pio2f.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Debugged and optimized by Bruce D. Evans.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* __rem_pio2f(x,y)
+ *
+ * return the remainder of x rem pi/2 in *y
+ * use double precision for everything except passing x
+ * use __rem_pio2_large() for large x
+ */
+
+#include "libm.h"
+
+#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1
+#define EPS DBL_EPSILON
+#elif FLT_EVAL_METHOD==2
+#define EPS LDBL_EPSILON
+#endif
+
+/*
+ * invpio2: 53 bits of 2/pi
+ * pio2_1: first 25 bits of pi/2
+ * pio2_1t: pi/2 - pio2_1
+ */
+static const double
+toint = 1.5/EPS,
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+pio4 = 0x1.921fb6p-1,
+#endif
+invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
+pio2_1 = 1.57079631090164184570e+00, /* 0x3FF921FB, 0x50000000 */
+pio2_1t = 1.58932547735281966916e-08; /* 0x3E5110b4, 0x611A6263 */
+
+int __rem_pio2f(float x, double *y)
+{
+ union {float f; uint32_t i;} u = {x};
+ double tx[1],ty[1];
+ double_t fn;
+ uint32_t ix;
+ int n, sign, e0;
+
+ ix = u.i & 0x7fffffff;
+ /* 25+53 bit pi is good enough for medium size */
+ if (ix < 0x4dc90fdb) { /* |x| ~< 2^28*(pi/2), medium size */
+ /* Use a specialized rint() to get fn. */
+ fn = (double_t)x*invpio2 + toint - toint;
+ n = (int32_t)fn;
+ *y = x - fn*pio2_1 - fn*pio2_1t;
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+ /* Matters with directed rounding. */
+ if (predict_false(*y < -pio4)) {
+ n--;
+ fn--;
+ *y = x - fn*pio2_1 - fn*pio2_1t;
+ } else if (predict_false(*y > pio4)) {
+ n++;
+ fn++;
+ *y = x - fn*pio2_1 - fn*pio2_1t;
+ }
+#endif
+ return n;
+ }
+ if(ix>=0x7f800000) { /* x is inf or NaN */
+ *y = x-x;
+ return 0;
+ }
+ /* scale x into [2^23, 2^24-1] */
+ sign = u.i>>31;
+ e0 = (ix>>23) - (0x7f+23); /* e0 = ilogb(|x|)-23, positive */
+ u.i = ix - (e0<<23);
+ tx[0] = u.f;
+ n = __rem_pio2_large(tx,ty,e0,1,0);
+ if (sign) {
+ *y = -ty[0];
+ return -n;
+ }
+ *y = ty[0];
+ return n;
+}
diff --git a/libc-top-half/musl/src/math/__rem_pio2l.c b/libc-top-half/musl/src/math/__rem_pio2l.c
new file mode 100644
index 0000000..e73a86b
--- /dev/null
+++ b/libc-top-half/musl/src/math/__rem_pio2l.c
@@ -0,0 +1,159 @@
+/* origin: FreeBSD /usr/src/lib/msun/ld80/e_rem_pio2.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * Optimized by Bruce D. Evans.
+ */
+#include "libm.h"
+#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+/* ld80 and ld128 version of __rem_pio2(x,y)
+ *
+ * return the remainder of x rem pi/2 in y[0]+y[1]
+ * use __rem_pio2_large() for large x
+ */
+
+static const long double toint = 1.5/LDBL_EPSILON;
+
+#if LDBL_MANT_DIG == 64
+/* u ~< 0x1p25*pi/2 */
+#define SMALL(u) (((u.i.se & 0x7fffU)<<16 | u.i.m>>48) < ((0x3fff + 25)<<16 | 0x921f>>1 | 0x8000))
+#define QUOBITS(x) ((uint32_t)(int32_t)x & 0x7fffffff)
+#define ROUND1 22
+#define ROUND2 61
+#define NX 3
+#define NY 2
+/*
+ * invpio2: 64 bits of 2/pi
+ * pio2_1: first 39 bits of pi/2
+ * pio2_1t: pi/2 - pio2_1
+ * pio2_2: second 39 bits of pi/2
+ * pio2_2t: pi/2 - (pio2_1+pio2_2)
+ * pio2_3: third 39 bits of pi/2
+ * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
+ */
+static const double
+pio2_1 = 1.57079632679597125389e+00, /* 0x3FF921FB, 0x54444000 */
+pio2_2 = -1.07463465549783099519e-12, /* -0x12e7b967674000.0p-92 */
+pio2_3 = 6.36831716351370313614e-25; /* 0x18a2e037074000.0p-133 */
+static const long double
+pio4 = 0x1.921fb54442d1846ap-1L,
+invpio2 = 6.36619772367581343076e-01L, /* 0xa2f9836e4e44152a.0p-64 */
+pio2_1t = -1.07463465549719416346e-12L, /* -0x973dcb3b399d747f.0p-103 */
+pio2_2t = 6.36831716351095013979e-25L, /* 0xc51701b839a25205.0p-144 */
+pio2_3t = -2.75299651904407171810e-37L; /* -0xbb5bf6c7ddd660ce.0p-185 */
+#elif LDBL_MANT_DIG == 113
+/* u ~< 0x1p45*pi/2 */
+#define SMALL(u) (((u.i.se & 0x7fffU)<<16 | u.i.top) < ((0x3fff + 45)<<16 | 0x921f))
+#define QUOBITS(x) ((uint32_t)(int64_t)x & 0x7fffffff)
+#define ROUND1 51
+#define ROUND2 119
+#define NX 5
+#define NY 3
+static const long double
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+pio4 = 0x1.921fb54442d18469898cc51701b8p-1L,
+#endif
+invpio2 = 6.3661977236758134307553505349005747e-01L, /* 0x145f306dc9c882a53f84eafa3ea6a.0p-113 */
+pio2_1 = 1.5707963267948966192292994253909555e+00L, /* 0x1921fb54442d18469800000000000.0p-112 */
+pio2_1t = 2.0222662487959507323996846200947577e-21L, /* 0x13198a2e03707344a4093822299f3.0p-181 */
+pio2_2 = 2.0222662487959507323994779168837751e-21L, /* 0x13198a2e03707344a400000000000.0p-181 */
+pio2_2t = 2.0670321098263988236496903051604844e-43L, /* 0x127044533e63a0105df531d89cd91.0p-254 */
+pio2_3 = 2.0670321098263988236499468110329591e-43L, /* 0x127044533e63a0105e00000000000.0p-254 */
+pio2_3t = -2.5650587247459238361625433492959285e-65L; /* -0x159c4ec64ddaeb5f78671cbfb2210.0p-327 */
+#endif
+
+int __rem_pio2l(long double x, long double *y)
+{
+ union ldshape u,uz;
+ long double z,w,t,r,fn;
+ double tx[NX],ty[NY];
+ int ex,ey,n,i;
+
+ u.f = x;
+ ex = u.i.se & 0x7fff;
+ if (SMALL(u)) {
+ /* rint(x/(pi/2)) */
+ fn = x*invpio2 + toint - toint;
+ n = QUOBITS(fn);
+ r = x-fn*pio2_1;
+ w = fn*pio2_1t; /* 1st round good to 102/180 bits (ld80/ld128) */
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+ /* Matters with directed rounding. */
+ if (predict_false(r - w < -pio4)) {
+ n--;
+ fn--;
+ r = x - fn*pio2_1;
+ w = fn*pio2_1t;
+ } else if (predict_false(r - w > pio4)) {
+ n++;
+ fn++;
+ r = x - fn*pio2_1;
+ w = fn*pio2_1t;
+ }
+#endif
+ y[0] = r-w;
+ u.f = y[0];
+ ey = u.i.se & 0x7fff;
+ if (ex - ey > ROUND1) { /* 2nd iteration needed, good to 141/248 (ld80/ld128) */
+ t = r;
+ w = fn*pio2_2;
+ r = t-w;
+ w = fn*pio2_2t-((t-r)-w);
+ y[0] = r-w;
+ u.f = y[0];
+ ey = u.i.se & 0x7fff;
+ if (ex - ey > ROUND2) { /* 3rd iteration, good to 180/316 bits */
+ t = r; /* will cover all possible cases (not verified for ld128) */
+ w = fn*pio2_3;
+ r = t-w;
+ w = fn*pio2_3t-((t-r)-w);
+ y[0] = r-w;
+ }
+ }
+ y[1] = (r - y[0]) - w;
+ return n;
+ }
+ /*
+ * all other (large) arguments
+ */
+ if (ex == 0x7fff) { /* x is inf or NaN */
+ y[0] = y[1] = x - x;
+ return 0;
+ }
+ /* set z = scalbn(|x|,-ilogb(x)+23) */
+ uz.f = x;
+ uz.i.se = 0x3fff + 23;
+ z = uz.f;
+ for (i=0; i < NX - 1; i++) {
+ tx[i] = (double)(int32_t)z;
+ z = (z-tx[i])*0x1p24;
+ }
+ tx[i] = z;
+ while (tx[i] == 0)
+ i--;
+ n = __rem_pio2_large(tx, ty, ex-0x3fff-23, i+1, NY);
+ w = ty[1];
+ if (NY == 3)
+ w += ty[2];
+ r = ty[0] + w;
+ /* TODO: for ld128 this does not follow the recommendation of the
+ comments of __rem_pio2_large which seem wrong if |ty[0]| > |ty[1]+ty[2]| */
+ w -= r - ty[0];
+ if (u.i.se >> 15) {
+ y[0] = -r;
+ y[1] = -w;
+ return -n;
+ }
+ y[0] = r;
+ y[1] = w;
+ return n;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/__signbit.c b/libc-top-half/musl/src/math/__signbit.c
new file mode 100644
index 0000000..e700b6b
--- /dev/null
+++ b/libc-top-half/musl/src/math/__signbit.c
@@ -0,0 +1,13 @@
+#include "libm.h"
+
+// FIXME: macro in math.h
+int __signbit(double x)
+{
+ union {
+ double d;
+ uint64_t i;
+ } y = { x };
+ return y.i>>63;
+}
+
+
diff --git a/libc-top-half/musl/src/math/__signbitf.c b/libc-top-half/musl/src/math/__signbitf.c
new file mode 100644
index 0000000..40ad3cf
--- /dev/null
+++ b/libc-top-half/musl/src/math/__signbitf.c
@@ -0,0 +1,11 @@
+#include "libm.h"
+
+// FIXME: macro in math.h
+int __signbitf(float x)
+{
+ union {
+ float f;
+ uint32_t i;
+ } y = { x };
+ return y.i>>31;
+}
diff --git a/libc-top-half/musl/src/math/__signbitl.c b/libc-top-half/musl/src/math/__signbitl.c
new file mode 100644
index 0000000..63b3dc5
--- /dev/null
+++ b/libc-top-half/musl/src/math/__signbitl.c
@@ -0,0 +1,14 @@
+#include "libm.h"
+
+#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+int __signbitl(long double x)
+{
+ union ldshape u = {x};
+ return u.i.se >> 15;
+}
+#elif LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+int __signbitl(long double x)
+{
+ return __signbit(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/__sin.c b/libc-top-half/musl/src/math/__sin.c
new file mode 100644
index 0000000..4030949
--- /dev/null
+++ b/libc-top-half/musl/src/math/__sin.c
@@ -0,0 +1,64 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/k_sin.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* __sin( x, y, iy)
+ * kernel sin function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854
+ * Input x is assumed to be bounded by ~pi/4 in magnitude.
+ * Input y is the tail of x.
+ * Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
+ *
+ * Algorithm
+ * 1. Since sin(-x) = -sin(x), we need only to consider positive x.
+ * 2. Callers must return sin(-0) = -0 without calling here since our
+ * odd polynomial is not evaluated in a way that preserves -0.
+ * Callers may do the optimization sin(x) ~ x for tiny x.
+ * 3. sin(x) is approximated by a polynomial of degree 13 on
+ * [0,pi/4]
+ * 3 13
+ * sin(x) ~ x + S1*x + ... + S6*x
+ * where
+ *
+ * |sin(x) 2 4 6 8 10 12 | -58
+ * |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2
+ * | x |
+ *
+ * 4. sin(x+y) = sin(x) + sin'(x')*y
+ * ~ sin(x) + (1-x*x/2)*y
+ * For better accuracy, let
+ * 3 2 2 2 2
+ * r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
+ * then 3 2
+ * sin(x) = x + (S1*x + (x *(r-y/2)+y))
+ */
+
+#include "libm.h"
+
+static const double
+S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */
+S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */
+S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */
+S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */
+S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */
+S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */
+
+double __sin(double x, double y, int iy)
+{
+ double_t z,r,v,w;
+
+ z = x*x;
+ w = z*z;
+ r = S2 + z*(S3 + z*S4) + z*w*(S5 + z*S6);
+ v = z*x;
+ if (iy == 0)
+ return x + v*(S1 + z*r);
+ else
+ return x - ((z*(0.5*y - v*r) - y) - v*S1);
+}
diff --git a/libc-top-half/musl/src/math/__sindf.c b/libc-top-half/musl/src/math/__sindf.c
new file mode 100644
index 0000000..8fec2a3
--- /dev/null
+++ b/libc-top-half/musl/src/math/__sindf.c
@@ -0,0 +1,36 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/k_sinf.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Optimized by Bruce D. Evans.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+/* |sin(x)/x - s(x)| < 2**-37.5 (~[-4.89e-12, 4.824e-12]). */
+static const double
+S1 = -0x15555554cbac77.0p-55, /* -0.166666666416265235595 */
+S2 = 0x111110896efbb2.0p-59, /* 0.0083333293858894631756 */
+S3 = -0x1a00f9e2cae774.0p-65, /* -0.000198393348360966317347 */
+S4 = 0x16cd878c3b46a7.0p-71; /* 0.0000027183114939898219064 */
+
+float __sindf(double x)
+{
+ double_t r, s, w, z;
+
+ /* Try to optimize for parallel evaluation as in __tandf.c. */
+ z = x*x;
+ w = z*z;
+ r = S3 + z*S4;
+ s = z*x;
+ return (x + s*(S1 + z*S2)) + s*w*r;
+}
diff --git a/libc-top-half/musl/src/math/__sinl.c b/libc-top-half/musl/src/math/__sinl.c
new file mode 100644
index 0000000..2525bbe
--- /dev/null
+++ b/libc-top-half/musl/src/math/__sinl.c
@@ -0,0 +1,78 @@
+/* origin: FreeBSD /usr/src/lib/msun/ld80/k_sinl.c */
+/* origin: FreeBSD /usr/src/lib/msun/ld128/k_sinl.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+#if LDBL_MANT_DIG == 64
+/*
+ * ld80 version of __sin.c. See __sin.c for most comments.
+ */
+/*
+ * Domain [-0.7854, 0.7854], range ~[-1.89e-22, 1.915e-22]
+ * |sin(x)/x - s(x)| < 2**-72.1
+ *
+ * See __cosl.c for more details about the polynomial.
+ */
+static const long double
+S1 = -0.166666666666666666671L; /* -0xaaaaaaaaaaaaaaab.0p-66 */
+static const double
+S2 = 0.0083333333333333332, /* 0x11111111111111.0p-59 */
+S3 = -0.00019841269841269427, /* -0x1a01a01a019f81.0p-65 */
+S4 = 0.0000027557319223597490, /* 0x171de3a55560f7.0p-71 */
+S5 = -0.000000025052108218074604, /* -0x1ae64564f16cad.0p-78 */
+S6 = 1.6059006598854211e-10, /* 0x161242b90243b5.0p-85 */
+S7 = -7.6429779983024564e-13, /* -0x1ae42ebd1b2e00.0p-93 */
+S8 = 2.6174587166648325e-15; /* 0x179372ea0b3f64.0p-101 */
+#define POLY(z) (S2+z*(S3+z*(S4+z*(S5+z*(S6+z*(S7+z*S8))))))
+#elif LDBL_MANT_DIG == 113
+/*
+ * ld128 version of __sin.c. See __sin.c for most comments.
+ */
+/*
+ * Domain [-0.7854, 0.7854], range ~[-1.53e-37, 1.659e-37]
+ * |sin(x)/x - s(x)| < 2**-122.1
+ *
+ * See __cosl.c for more details about the polynomial.
+ */
+static const long double
+S1 = -0.16666666666666666666666666666666666606732416116558L,
+S2 = 0.0083333333333333333333333333333331135404851288270047L,
+S3 = -0.00019841269841269841269841269839935785325638310428717L,
+S4 = 0.27557319223985890652557316053039946268333231205686e-5L,
+S5 = -0.25052108385441718775048214826384312253862930064745e-7L,
+S6 = 0.16059043836821614596571832194524392581082444805729e-9L,
+S7 = -0.76471637318198151807063387954939213287488216303768e-12L,
+S8 = 0.28114572543451292625024967174638477283187397621303e-14L;
+static const double
+S9 = -0.82206352458348947812512122163446202498005154296863e-17,
+S10 = 0.19572940011906109418080609928334380560135358385256e-19,
+S11 = -0.38680813379701966970673724299207480965452616911420e-22,
+S12 = 0.64038150078671872796678569586315881020659912139412e-25;
+#define POLY(z) (S2+z*(S3+z*(S4+z*(S5+z*(S6+z*(S7+z*(S8+ \
+ z*(S9+z*(S10+z*(S11+z*S12))))))))))
+#endif
+
+long double __sinl(long double x, long double y, int iy)
+{
+ long double z,r,v;
+
+ z = x*x;
+ v = z*x;
+ r = POLY(z);
+ if (iy == 0)
+ return x+v*(S1+z*r);
+ return x-((z*(0.5*y-v*r)-y)-v*S1);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/__tan.c b/libc-top-half/musl/src/math/__tan.c
new file mode 100644
index 0000000..8019844
--- /dev/null
+++ b/libc-top-half/musl/src/math/__tan.c
@@ -0,0 +1,110 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/k_tan.c */
+/*
+ * ====================================================
+ * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* __tan( x, y, k )
+ * kernel tan function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854
+ * Input x is assumed to be bounded by ~pi/4 in magnitude.
+ * Input y is the tail of x.
+ * Input odd indicates whether tan (if odd = 0) or -1/tan (if odd = 1) is returned.
+ *
+ * Algorithm
+ * 1. Since tan(-x) = -tan(x), we need only to consider positive x.
+ * 2. Callers must return tan(-0) = -0 without calling here since our
+ * odd polynomial is not evaluated in a way that preserves -0.
+ * Callers may do the optimization tan(x) ~ x for tiny x.
+ * 3. tan(x) is approximated by a odd polynomial of degree 27 on
+ * [0,0.67434]
+ * 3 27
+ * tan(x) ~ x + T1*x + ... + T13*x
+ * where
+ *
+ * |tan(x) 2 4 26 | -59.2
+ * |----- - (1+T1*x +T2*x +.... +T13*x )| <= 2
+ * | x |
+ *
+ * Note: tan(x+y) = tan(x) + tan'(x)*y
+ * ~ tan(x) + (1+x*x)*y
+ * Therefore, for better accuracy in computing tan(x+y), let
+ * 3 2 2 2 2
+ * r = x *(T2+x *(T3+x *(...+x *(T12+x *T13))))
+ * then
+ * 3 2
+ * tan(x+y) = x + (T1*x + (x *(r+y)+y))
+ *
+ * 4. For x in [0.67434,pi/4], let y = pi/4 - x, then
+ * tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))
+ * = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
+ */
+
+#include "libm.h"
+
+static const double T[] = {
+ 3.33333333333334091986e-01, /* 3FD55555, 55555563 */
+ 1.33333333333201242699e-01, /* 3FC11111, 1110FE7A */
+ 5.39682539762260521377e-02, /* 3FABA1BA, 1BB341FE */
+ 2.18694882948595424599e-02, /* 3F9664F4, 8406D637 */
+ 8.86323982359930005737e-03, /* 3F8226E3, E96E8493 */
+ 3.59207910759131235356e-03, /* 3F6D6D22, C9560328 */
+ 1.45620945432529025516e-03, /* 3F57DBC8, FEE08315 */
+ 5.88041240820264096874e-04, /* 3F4344D8, F2F26501 */
+ 2.46463134818469906812e-04, /* 3F3026F7, 1A8D1068 */
+ 7.81794442939557092300e-05, /* 3F147E88, A03792A6 */
+ 7.14072491382608190305e-05, /* 3F12B80F, 32F0A7E9 */
+ -1.85586374855275456654e-05, /* BEF375CB, DB605373 */
+ 2.59073051863633712884e-05, /* 3EFB2A70, 74BF7AD4 */
+},
+pio4 = 7.85398163397448278999e-01, /* 3FE921FB, 54442D18 */
+pio4lo = 3.06161699786838301793e-17; /* 3C81A626, 33145C07 */
+
+double __tan(double x, double y, int odd)
+{
+ double_t z, r, v, w, s, a;
+ double w0, a0;
+ uint32_t hx;
+ int big, sign;
+
+ GET_HIGH_WORD(hx,x);
+ big = (hx&0x7fffffff) >= 0x3FE59428; /* |x| >= 0.6744 */
+ if (big) {
+ sign = hx>>31;
+ if (sign) {
+ x = -x;
+ y = -y;
+ }
+ x = (pio4 - x) + (pio4lo - y);
+ y = 0.0;
+ }
+ z = x * x;
+ w = z * z;
+ /*
+ * Break x^5*(T[1]+x^2*T[2]+...) into
+ * x^5(T[1]+x^4*T[3]+...+x^20*T[11]) +
+ * x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12]))
+ */
+ r = T[1] + w*(T[3] + w*(T[5] + w*(T[7] + w*(T[9] + w*T[11]))));
+ v = z*(T[2] + w*(T[4] + w*(T[6] + w*(T[8] + w*(T[10] + w*T[12])))));
+ s = z * x;
+ r = y + z*(s*(r + v) + y) + s*T[0];
+ w = x + r;
+ if (big) {
+ s = 1 - 2*odd;
+ v = s - 2.0 * (x + (r - w*w/(w + s)));
+ return sign ? -v : v;
+ }
+ if (!odd)
+ return w;
+ /* -1.0/(x+r) has up to 2ulp error, so compute it accurately */
+ w0 = w;
+ SET_LOW_WORD(w0, 0);
+ v = r - (w0 - x); /* w0+v = r+x */
+ a0 = a = -1.0 / w;
+ SET_LOW_WORD(a0, 0);
+ return a0 + a*(1.0 + a0*w0 + a0*v);
+}
diff --git a/libc-top-half/musl/src/math/__tandf.c b/libc-top-half/musl/src/math/__tandf.c
new file mode 100644
index 0000000..25047ee
--- /dev/null
+++ b/libc-top-half/musl/src/math/__tandf.c
@@ -0,0 +1,54 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/k_tanf.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Optimized by Bruce D. Evans.
+ */
+/*
+ * ====================================================
+ * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+/* |tan(x)/x - t(x)| < 2**-25.5 (~[-2e-08, 2e-08]). */
+static const double T[] = {
+ 0x15554d3418c99f.0p-54, /* 0.333331395030791399758 */
+ 0x1112fd38999f72.0p-55, /* 0.133392002712976742718 */
+ 0x1b54c91d865afe.0p-57, /* 0.0533812378445670393523 */
+ 0x191df3908c33ce.0p-58, /* 0.0245283181166547278873 */
+ 0x185dadfcecf44e.0p-61, /* 0.00297435743359967304927 */
+ 0x1362b9bf971bcd.0p-59, /* 0.00946564784943673166728 */
+};
+
+float __tandf(double x, int odd)
+{
+ double_t z,r,w,s,t,u;
+
+ z = x*x;
+ /*
+ * Split up the polynomial into small independent terms to give
+ * opportunities for parallel evaluation. The chosen splitting is
+ * micro-optimized for Athlons (XP, X64). It costs 2 multiplications
+ * relative to Horner's method on sequential machines.
+ *
+ * We add the small terms from lowest degree up for efficiency on
+ * non-sequential machines (the lowest degree terms tend to be ready
+ * earlier). Apart from this, we don't care about order of
+ * operations, and don't need to to care since we have precision to
+ * spare. However, the chosen splitting is good for accuracy too,
+ * and would give results as accurate as Horner's method if the
+ * small terms were added from highest degree down.
+ */
+ r = T[4] + z*T[5];
+ t = T[2] + z*T[3];
+ w = z*z;
+ s = z*x;
+ u = T[0] + z*T[1];
+ r = (x + s*u) + (s*w)*(t + w*r);
+ return odd ? -1.0/r : r;
+}
diff --git a/libc-top-half/musl/src/math/__tanl.c b/libc-top-half/musl/src/math/__tanl.c
new file mode 100644
index 0000000..54abc3d
--- /dev/null
+++ b/libc-top-half/musl/src/math/__tanl.c
@@ -0,0 +1,143 @@
+/* origin: FreeBSD /usr/src/lib/msun/ld80/k_tanl.c */
+/* origin: FreeBSD /usr/src/lib/msun/ld128/k_tanl.c */
+/*
+ * ====================================================
+ * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+#if LDBL_MANT_DIG == 64
+/*
+ * ld80 version of __tan.c. See __tan.c for most comments.
+ */
+/*
+ * Domain [-0.67434, 0.67434], range ~[-2.25e-22, 1.921e-22]
+ * |tan(x)/x - t(x)| < 2**-71.9
+ *
+ * See __cosl.c for more details about the polynomial.
+ */
+static const long double
+T3 = 0.333333333333333333180L, /* 0xaaaaaaaaaaaaaaa5.0p-65 */
+T5 = 0.133333333333333372290L, /* 0x88888888888893c3.0p-66 */
+T7 = 0.0539682539682504975744L, /* 0xdd0dd0dd0dc13ba2.0p-68 */
+pio4 = 0.785398163397448309628L, /* 0xc90fdaa22168c235.0p-64 */
+pio4lo = -1.25413940316708300586e-20L; /* -0xece675d1fc8f8cbb.0p-130 */
+static const double
+T9 = 0.021869488536312216, /* 0x1664f4882cc1c2.0p-58 */
+T11 = 0.0088632355256619590, /* 0x1226e355c17612.0p-59 */
+T13 = 0.0035921281113786528, /* 0x1d6d3d185d7ff8.0p-61 */
+T15 = 0.0014558334756312418, /* 0x17da354aa3f96b.0p-62 */
+T17 = 0.00059003538700862256, /* 0x13559358685b83.0p-63 */
+T19 = 0.00023907843576635544, /* 0x1f56242026b5be.0p-65 */
+T21 = 0.000097154625656538905, /* 0x1977efc26806f4.0p-66 */
+T23 = 0.000038440165747303162, /* 0x14275a09b3ceac.0p-67 */
+T25 = 0.000018082171885432524, /* 0x12f5e563e5487e.0p-68 */
+T27 = 0.0000024196006108814377, /* 0x144c0d80cc6896.0p-71 */
+T29 = 0.0000078293456938132840, /* 0x106b59141a6cb3.0p-69 */
+T31 = -0.0000032609076735050182, /* -0x1b5abef3ba4b59.0p-71 */
+T33 = 0.0000023261313142559411; /* 0x13835436c0c87f.0p-71 */
+#define RPOLY(w) (T5 + w * (T9 + w * (T13 + w * (T17 + w * (T21 + \
+ w * (T25 + w * (T29 + w * T33)))))))
+#define VPOLY(w) (T7 + w * (T11 + w * (T15 + w * (T19 + w * (T23 + \
+ w * (T27 + w * T31))))))
+#elif LDBL_MANT_DIG == 113
+/*
+ * ld128 version of __tan.c. See __tan.c for most comments.
+ */
+/*
+ * Domain [-0.67434, 0.67434], range ~[-3.37e-36, 1.982e-37]
+ * |tan(x)/x - t(x)| < 2**-117.8 (XXX should be ~1e-37)
+ *
+ * See __cosl.c for more details about the polynomial.
+ */
+static const long double
+T3 = 0x1.5555555555555555555555555553p-2L,
+T5 = 0x1.1111111111111111111111111eb5p-3L,
+T7 = 0x1.ba1ba1ba1ba1ba1ba1ba1b694cd6p-5L,
+T9 = 0x1.664f4882c10f9f32d6bbe09d8bcdp-6L,
+T11 = 0x1.226e355e6c23c8f5b4f5762322eep-7L,
+T13 = 0x1.d6d3d0e157ddfb5fed8e84e27b37p-9L,
+T15 = 0x1.7da36452b75e2b5fce9ee7c2c92ep-10L,
+T17 = 0x1.355824803674477dfcf726649efep-11L,
+T19 = 0x1.f57d7734d1656e0aceb716f614c2p-13L,
+T21 = 0x1.967e18afcb180ed942dfdc518d6cp-14L,
+T23 = 0x1.497d8eea21e95bc7e2aa79b9f2cdp-15L,
+T25 = 0x1.0b132d39f055c81be49eff7afd50p-16L,
+T27 = 0x1.b0f72d33eff7bfa2fbc1059d90b6p-18L,
+T29 = 0x1.5ef2daf21d1113df38d0fbc00267p-19L,
+T31 = 0x1.1c77d6eac0234988cdaa04c96626p-20L,
+T33 = 0x1.cd2a5a292b180e0bdd701057dfe3p-22L,
+T35 = 0x1.75c7357d0298c01a31d0a6f7d518p-23L,
+T37 = 0x1.2f3190f4718a9a520f98f50081fcp-24L,
+pio4 = 0x1.921fb54442d18469898cc51701b8p-1L,
+pio4lo = 0x1.cd129024e088a67cc74020bbea60p-116L;
+static const double
+T39 = 0.000000028443389121318352, /* 0x1e8a7592977938.0p-78 */
+T41 = 0.000000011981013102001973, /* 0x19baa1b1223219.0p-79 */
+T43 = 0.0000000038303578044958070, /* 0x107385dfb24529.0p-80 */
+T45 = 0.0000000034664378216909893, /* 0x1dc6c702a05262.0p-81 */
+T47 = -0.0000000015090641701997785, /* -0x19ecef3569ebb6.0p-82 */
+T49 = 0.0000000029449552300483952, /* 0x194c0668da786a.0p-81 */
+T51 = -0.0000000022006995706097711, /* -0x12e763b8845268.0p-81 */
+T53 = 0.0000000015468200913196612, /* 0x1a92fc98c29554.0p-82 */
+T55 = -0.00000000061311613386849674, /* -0x151106cbc779a9.0p-83 */
+T57 = 1.4912469681508012e-10; /* 0x147edbdba6f43a.0p-85 */
+#define RPOLY(w) (T5 + w * (T9 + w * (T13 + w * (T17 + w * (T21 + \
+ w * (T25 + w * (T29 + w * (T33 + w * (T37 + w * (T41 + \
+ w * (T45 + w * (T49 + w * (T53 + w * T57)))))))))))))
+#define VPOLY(w) (T7 + w * (T11 + w * (T15 + w * (T19 + w * (T23 + \
+ w * (T27 + w * (T31 + w * (T35 + w * (T39 + w * (T43 + \
+ w * (T47 + w * (T51 + w * T55))))))))))))
+#endif
+
+long double __tanl(long double x, long double y, int odd) {
+ long double z, r, v, w, s, a, t;
+ int big, sign;
+
+ big = fabsl(x) >= 0.67434;
+ if (big) {
+ sign = 0;
+ if (x < 0) {
+ sign = 1;
+ x = -x;
+ y = -y;
+ }
+ x = (pio4 - x) + (pio4lo - y);
+ y = 0.0;
+ }
+ z = x * x;
+ w = z * z;
+ r = RPOLY(w);
+ v = z * VPOLY(w);
+ s = z * x;
+ r = y + z * (s * (r + v) + y) + T3 * s;
+ w = x + r;
+ if (big) {
+ s = 1 - 2*odd;
+ v = s - 2.0 * (x + (r - w * w / (w + s)));
+ return sign ? -v : v;
+ }
+ if (!odd)
+ return w;
+ /*
+ * if allow error up to 2 ulp, simply return
+ * -1.0 / (x+r) here
+ */
+ /* compute -1.0 / (x+r) accurately */
+ z = w;
+ z = z + 0x1p32 - 0x1p32;
+ v = r - (z - x); /* z+v = r+x */
+ t = a = -1.0 / w; /* a = -1.0/w */
+ t = t + 0x1p32 - 0x1p32;
+ s = 1.0 + t * z;
+ return t + a * (s + t * v);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/aarch64/ceil.c b/libc-top-half/musl/src/math/aarch64/ceil.c
new file mode 100644
index 0000000..ac80c1d
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/ceil.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double ceil(double x)
+{
+ __asm__ ("frintp %d0, %d1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/ceilf.c b/libc-top-half/musl/src/math/aarch64/ceilf.c
new file mode 100644
index 0000000..1ef1e9c
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/ceilf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float ceilf(float x)
+{
+ __asm__ ("frintp %s0, %s1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/fabs.c b/libc-top-half/musl/src/math/aarch64/fabs.c
new file mode 100644
index 0000000..5c3ecaf
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/fabs.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double fabs(double x)
+{
+ __asm__ ("fabs %d0, %d1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/fabsf.c b/libc-top-half/musl/src/math/aarch64/fabsf.c
new file mode 100644
index 0000000..7fde981
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/fabsf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float fabsf(float x)
+{
+ __asm__ ("fabs %s0, %s1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/floor.c b/libc-top-half/musl/src/math/aarch64/floor.c
new file mode 100644
index 0000000..50ffdb2
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/floor.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double floor(double x)
+{
+ __asm__ ("frintm %d0, %d1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/floorf.c b/libc-top-half/musl/src/math/aarch64/floorf.c
new file mode 100644
index 0000000..8d007e9
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/floorf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float floorf(float x)
+{
+ __asm__ ("frintm %s0, %s1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/fma.c b/libc-top-half/musl/src/math/aarch64/fma.c
new file mode 100644
index 0000000..2450ea7
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/fma.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double fma(double x, double y, double z)
+{
+ __asm__ ("fmadd %d0, %d1, %d2, %d3" : "=w"(x) : "w"(x), "w"(y), "w"(z));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/fmaf.c b/libc-top-half/musl/src/math/aarch64/fmaf.c
new file mode 100644
index 0000000..9a14721
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/fmaf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float fmaf(float x, float y, float z)
+{
+ __asm__ ("fmadd %s0, %s1, %s2, %s3" : "=w"(x) : "w"(x), "w"(y), "w"(z));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/fmax.c b/libc-top-half/musl/src/math/aarch64/fmax.c
new file mode 100644
index 0000000..86dcb3b
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/fmax.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double fmax(double x, double y)
+{
+ __asm__ ("fmaxnm %d0, %d1, %d2" : "=w"(x) : "w"(x), "w"(y));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/fmaxf.c b/libc-top-half/musl/src/math/aarch64/fmaxf.c
new file mode 100644
index 0000000..ee5eac2
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/fmaxf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float fmaxf(float x, float y)
+{
+ __asm__ ("fmaxnm %s0, %s1, %s2" : "=w"(x) : "w"(x), "w"(y));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/fmin.c b/libc-top-half/musl/src/math/aarch64/fmin.c
new file mode 100644
index 0000000..f1e9980
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/fmin.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double fmin(double x, double y)
+{
+ __asm__ ("fminnm %d0, %d1, %d2" : "=w"(x) : "w"(x), "w"(y));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/fminf.c b/libc-top-half/musl/src/math/aarch64/fminf.c
new file mode 100644
index 0000000..80468f6
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/fminf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float fminf(float x, float y)
+{
+ __asm__ ("fminnm %s0, %s1, %s2" : "=w"(x) : "w"(x), "w"(y));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/llrint.c b/libc-top-half/musl/src/math/aarch64/llrint.c
new file mode 100644
index 0000000..a9e07a9
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/llrint.c
@@ -0,0 +1,10 @@
+#include <math.h>
+
+long long llrint(double x)
+{
+ long long n;
+ __asm__ (
+ "frintx %d1, %d1\n"
+ "fcvtzs %x0, %d1\n" : "=r"(n), "+w"(x));
+ return n;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/llrintf.c b/libc-top-half/musl/src/math/aarch64/llrintf.c
new file mode 100644
index 0000000..12b6804
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/llrintf.c
@@ -0,0 +1,10 @@
+#include <math.h>
+
+long long llrintf(float x)
+{
+ long long n;
+ __asm__ (
+ "frintx %s1, %s1\n"
+ "fcvtzs %x0, %s1\n" : "=r"(n), "+w"(x));
+ return n;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/llround.c b/libc-top-half/musl/src/math/aarch64/llround.c
new file mode 100644
index 0000000..e09ddd4
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/llround.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long long llround(double x)
+{
+ long long n;
+ __asm__ ("fcvtas %x0, %d1" : "=r"(n) : "w"(x));
+ return n;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/llroundf.c b/libc-top-half/musl/src/math/aarch64/llroundf.c
new file mode 100644
index 0000000..1669959
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/llroundf.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long long llroundf(float x)
+{
+ long long n;
+ __asm__ ("fcvtas %x0, %s1" : "=r"(n) : "w"(x));
+ return n;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/lrint.c b/libc-top-half/musl/src/math/aarch64/lrint.c
new file mode 100644
index 0000000..cb7785a
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/lrint.c
@@ -0,0 +1,10 @@
+#include <math.h>
+
+long lrint(double x)
+{
+ long n;
+ __asm__ (
+ "frintx %d1, %d1\n"
+ "fcvtzs %x0, %d1\n" : "=r"(n), "+w"(x));
+ return n;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/lrintf.c b/libc-top-half/musl/src/math/aarch64/lrintf.c
new file mode 100644
index 0000000..4d750d6
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/lrintf.c
@@ -0,0 +1,10 @@
+#include <math.h>
+
+long lrintf(float x)
+{
+ long n;
+ __asm__ (
+ "frintx %s1, %s1\n"
+ "fcvtzs %x0, %s1\n" : "=r"(n), "+w"(x));
+ return n;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/lround.c b/libc-top-half/musl/src/math/aarch64/lround.c
new file mode 100644
index 0000000..85656c7
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/lround.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long lround(double x)
+{
+ long n;
+ __asm__ ("fcvtas %x0, %d1" : "=r"(n) : "w"(x));
+ return n;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/lroundf.c b/libc-top-half/musl/src/math/aarch64/lroundf.c
new file mode 100644
index 0000000..32e51f3
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/lroundf.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long lroundf(float x)
+{
+ long n;
+ __asm__ ("fcvtas %x0, %s1" : "=r"(n) : "w"(x));
+ return n;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/nearbyint.c b/libc-top-half/musl/src/math/aarch64/nearbyint.c
new file mode 100644
index 0000000..9c3fdb4
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/nearbyint.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double nearbyint(double x)
+{
+ __asm__ ("frinti %d0, %d1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/nearbyintf.c b/libc-top-half/musl/src/math/aarch64/nearbyintf.c
new file mode 100644
index 0000000..8e7f61d
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/nearbyintf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float nearbyintf(float x)
+{
+ __asm__ ("frinti %s0, %s1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/rint.c b/libc-top-half/musl/src/math/aarch64/rint.c
new file mode 100644
index 0000000..45b194b
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/rint.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double rint(double x)
+{
+ __asm__ ("frintx %d0, %d1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/rintf.c b/libc-top-half/musl/src/math/aarch64/rintf.c
new file mode 100644
index 0000000..1ae7dd2
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/rintf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float rintf(float x)
+{
+ __asm__ ("frintx %s0, %s1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/round.c b/libc-top-half/musl/src/math/aarch64/round.c
new file mode 100644
index 0000000..897a84c
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/round.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double round(double x)
+{
+ __asm__ ("frinta %d0, %d1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/roundf.c b/libc-top-half/musl/src/math/aarch64/roundf.c
new file mode 100644
index 0000000..91637ea
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/roundf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float roundf(float x)
+{
+ __asm__ ("frinta %s0, %s1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/sqrt.c b/libc-top-half/musl/src/math/aarch64/sqrt.c
new file mode 100644
index 0000000..fe93c3e
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/sqrt.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double sqrt(double x)
+{
+ __asm__ ("fsqrt %d0, %d1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/sqrtf.c b/libc-top-half/musl/src/math/aarch64/sqrtf.c
new file mode 100644
index 0000000..275c7f3
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/sqrtf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float sqrtf(float x)
+{
+ __asm__ ("fsqrt %s0, %s1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/trunc.c b/libc-top-half/musl/src/math/aarch64/trunc.c
new file mode 100644
index 0000000..e592147
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/trunc.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double trunc(double x)
+{
+ __asm__ ("frintz %d0, %d1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/aarch64/truncf.c b/libc-top-half/musl/src/math/aarch64/truncf.c
new file mode 100644
index 0000000..20ef30f
--- /dev/null
+++ b/libc-top-half/musl/src/math/aarch64/truncf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float truncf(float x)
+{
+ __asm__ ("frintz %s0, %s1" : "=w"(x) : "w"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/acos.c b/libc-top-half/musl/src/math/acos.c
new file mode 100644
index 0000000..ea9c87b
--- /dev/null
+++ b/libc-top-half/musl/src/math/acos.c
@@ -0,0 +1,101 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_acos.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* acos(x)
+ * Method :
+ * acos(x) = pi/2 - asin(x)
+ * acos(-x) = pi/2 + asin(x)
+ * For |x|<=0.5
+ * acos(x) = pi/2 - (x + x*x^2*R(x^2)) (see asin.c)
+ * For x>0.5
+ * acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2)))
+ * = 2asin(sqrt((1-x)/2))
+ * = 2s + 2s*z*R(z) ...z=(1-x)/2, s=sqrt(z)
+ * = 2f + (2c + 2s*z*R(z))
+ * where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term
+ * for f so that f+c ~ sqrt(z).
+ * For x<-0.5
+ * acos(x) = pi - 2asin(sqrt((1-|x|)/2))
+ * = pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z)
+ *
+ * Special cases:
+ * if x is NaN, return x itself;
+ * if |x|>1, return NaN with invalid signal.
+ *
+ * Function needed: sqrt
+ */
+
+#include "libm.h"
+
+static const double
+pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
+pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
+pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
+pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
+pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
+pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
+pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
+pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
+qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
+qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
+qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
+qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
+
+static double R(double z)
+{
+ double_t p, q;
+ p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
+ q = 1.0+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
+ return p/q;
+}
+
+double acos(double x)
+{
+ double z,w,s,c,df;
+ uint32_t hx,ix;
+
+ GET_HIGH_WORD(hx, x);
+ ix = hx & 0x7fffffff;
+ /* |x| >= 1 or nan */
+ if (ix >= 0x3ff00000) {
+ uint32_t lx;
+
+ GET_LOW_WORD(lx,x);
+ if ((ix-0x3ff00000 | lx) == 0) {
+ /* acos(1)=0, acos(-1)=pi */
+ if (hx >> 31)
+ return 2*pio2_hi + 0x1p-120f;
+ return 0;
+ }
+ return 0/(x-x);
+ }
+ /* |x| < 0.5 */
+ if (ix < 0x3fe00000) {
+ if (ix <= 0x3c600000) /* |x| < 2**-57 */
+ return pio2_hi + 0x1p-120f;
+ return pio2_hi - (x - (pio2_lo-x*R(x*x)));
+ }
+ /* x < -0.5 */
+ if (hx >> 31) {
+ z = (1.0+x)*0.5;
+ s = sqrt(z);
+ w = R(z)*s-pio2_lo;
+ return 2*(pio2_hi - (s+w));
+ }
+ /* x > 0.5 */
+ z = (1.0-x)*0.5;
+ s = sqrt(z);
+ df = s;
+ SET_LOW_WORD(df,0);
+ c = (z-df*df)/(s+df);
+ w = R(z)*s+c;
+ return 2*(df+w);
+}
diff --git a/libc-top-half/musl/src/math/acosf.c b/libc-top-half/musl/src/math/acosf.c
new file mode 100644
index 0000000..8ee1a71
--- /dev/null
+++ b/libc-top-half/musl/src/math/acosf.c
@@ -0,0 +1,71 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_acosf.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+static const float
+pio2_hi = 1.5707962513e+00, /* 0x3fc90fda */
+pio2_lo = 7.5497894159e-08, /* 0x33a22168 */
+pS0 = 1.6666586697e-01,
+pS1 = -4.2743422091e-02,
+pS2 = -8.6563630030e-03,
+qS1 = -7.0662963390e-01;
+
+static float R(float z)
+{
+ float_t p, q;
+ p = z*(pS0+z*(pS1+z*pS2));
+ q = 1.0f+z*qS1;
+ return p/q;
+}
+
+float acosf(float x)
+{
+ float z,w,s,c,df;
+ uint32_t hx,ix;
+
+ GET_FLOAT_WORD(hx, x);
+ ix = hx & 0x7fffffff;
+ /* |x| >= 1 or nan */
+ if (ix >= 0x3f800000) {
+ if (ix == 0x3f800000) {
+ if (hx >> 31)
+ return 2*pio2_hi + 0x1p-120f;
+ return 0;
+ }
+ return 0/(x-x);
+ }
+ /* |x| < 0.5 */
+ if (ix < 0x3f000000) {
+ if (ix <= 0x32800000) /* |x| < 2**-26 */
+ return pio2_hi + 0x1p-120f;
+ return pio2_hi - (x - (pio2_lo-x*R(x*x)));
+ }
+ /* x < -0.5 */
+ if (hx >> 31) {
+ z = (1+x)*0.5f;
+ s = sqrtf(z);
+ w = R(z)*s-pio2_lo;
+ return 2*(pio2_hi - (s+w));
+ }
+ /* x > 0.5 */
+ z = (1-x)*0.5f;
+ s = sqrtf(z);
+ GET_FLOAT_WORD(hx,s);
+ SET_FLOAT_WORD(df,hx&0xfffff000);
+ c = (z-df*df)/(s+df);
+ w = R(z)*s+c;
+ return 2*(df+w);
+}
diff --git a/libc-top-half/musl/src/math/acosh.c b/libc-top-half/musl/src/math/acosh.c
new file mode 100644
index 0000000..badbf90
--- /dev/null
+++ b/libc-top-half/musl/src/math/acosh.c
@@ -0,0 +1,24 @@
+#include "libm.h"
+
+#if FLT_EVAL_METHOD==2
+#undef sqrt
+#define sqrt sqrtl
+#endif
+
+/* acosh(x) = log(x + sqrt(x*x-1)) */
+double acosh(double x)
+{
+ union {double f; uint64_t i;} u = {.f = x};
+ unsigned e = u.i >> 52 & 0x7ff;
+
+ /* x < 1 domain error is handled in the called functions */
+
+ if (e < 0x3ff + 1)
+ /* |x| < 2, up to 2ulp error in [1,1.125] */
+ return log1p(x-1 + sqrt((x-1)*(x-1)+2*(x-1)));
+ if (e < 0x3ff + 26)
+ /* |x| < 0x1p26 */
+ return log(2*x - 1/(x+sqrt(x*x-1)));
+ /* |x| >= 0x1p26 or nan */
+ return log(x) + 0.693147180559945309417232121458176568;
+}
diff --git a/libc-top-half/musl/src/math/acoshf.c b/libc-top-half/musl/src/math/acoshf.c
new file mode 100644
index 0000000..b773d48
--- /dev/null
+++ b/libc-top-half/musl/src/math/acoshf.c
@@ -0,0 +1,26 @@
+#include "libm.h"
+
+#if FLT_EVAL_METHOD==2
+#undef sqrtf
+#define sqrtf sqrtl
+#elif FLT_EVAL_METHOD==1
+#undef sqrtf
+#define sqrtf sqrt
+#endif
+
+/* acosh(x) = log(x + sqrt(x*x-1)) */
+float acoshf(float x)
+{
+ union {float f; uint32_t i;} u = {x};
+ uint32_t a = u.i & 0x7fffffff;
+
+ if (a < 0x3f800000+(1<<23))
+ /* |x| < 2, invalid if x < 1 */
+ /* up to 2ulp error in [1,1.125] */
+ return log1pf(x-1 + sqrtf((x-1)*(x-1)+2*(x-1)));
+ if (u.i < 0x3f800000+(12<<23))
+ /* 2 <= x < 0x1p12 */
+ return logf(2*x - 1/(x+sqrtf(x*x-1)));
+ /* x >= 0x1p12 or x <= -2 or nan */
+ return logf(x) + 0.693147180559945309417232121458176568f;
+}
diff --git a/libc-top-half/musl/src/math/acoshl.c b/libc-top-half/musl/src/math/acoshl.c
new file mode 100644
index 0000000..8d4b43f
--- /dev/null
+++ b/libc-top-half/musl/src/math/acoshl.c
@@ -0,0 +1,29 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double acoshl(long double x)
+{
+ return acosh(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+/* acosh(x) = log(x + sqrt(x*x-1)) */
+long double acoshl(long double x)
+{
+ union ldshape u = {x};
+ int e = u.i.se & 0x7fff;
+
+ if (e < 0x3fff + 1)
+ /* |x| < 2, invalid if x < 1 or nan */
+ return log1pl(x-1 + sqrtl((x-1)*(x-1)+2*(x-1)));
+ if (e < 0x3fff + 32)
+ /* |x| < 0x1p32 */
+ return logl(2*x - 1/(x+sqrtl(x*x-1)));
+ return logl(x) + 0.693147180559945309417232121458176568L;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double acoshl(long double x)
+{
+ return acosh(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/acosl.c b/libc-top-half/musl/src/math/acosl.c
new file mode 100644
index 0000000..c03bdf0
--- /dev/null
+++ b/libc-top-half/musl/src/math/acosl.c
@@ -0,0 +1,67 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_acosl.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/*
+ * See comments in acos.c.
+ * Converted to long double by David Schultz <das@FreeBSD.ORG>.
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double acosl(long double x)
+{
+ return acos(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+#include "__invtrigl.h"
+#if LDBL_MANT_DIG == 64
+#define CLEARBOTTOM(u) (u.i.m &= -1ULL << 32)
+#elif LDBL_MANT_DIG == 113
+#define CLEARBOTTOM(u) (u.i.lo = 0)
+#endif
+
+long double acosl(long double x)
+{
+ union ldshape u = {x};
+ long double z, s, c, f;
+ uint16_t e = u.i.se & 0x7fff;
+
+ /* |x| >= 1 or nan */
+ if (e >= 0x3fff) {
+ if (x == 1)
+ return 0;
+ if (x == -1)
+ return 2*pio2_hi + 0x1p-120f;
+ return 0/(x-x);
+ }
+ /* |x| < 0.5 */
+ if (e < 0x3fff - 1) {
+ if (e < 0x3fff - LDBL_MANT_DIG - 1)
+ return pio2_hi + 0x1p-120f;
+ return pio2_hi - (__invtrigl_R(x*x)*x - pio2_lo + x);
+ }
+ /* x < -0.5 */
+ if (u.i.se >> 15) {
+ z = (1 + x)*0.5;
+ s = sqrtl(z);
+ return 2*(pio2_hi - (__invtrigl_R(z)*s - pio2_lo + s));
+ }
+ /* x > 0.5 */
+ z = (1 - x)*0.5;
+ s = sqrtl(z);
+ u.f = s;
+ CLEARBOTTOM(u);
+ f = u.f;
+ c = (z - f*f)/(s + f);
+ return 2*(__invtrigl_R(z)*s + c + f);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/arm/fabs.c b/libc-top-half/musl/src/math/arm/fabs.c
new file mode 100644
index 0000000..6e1d367
--- /dev/null
+++ b/libc-top-half/musl/src/math/arm/fabs.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __ARM_PCS_VFP && __ARM_FP&8
+
+double fabs(double x)
+{
+ __asm__ ("vabs.f64 %P0, %P1" : "=w"(x) : "w"(x));
+ return x;
+}
+
+#else
+
+#include "../fabs.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/arm/fabsf.c b/libc-top-half/musl/src/math/arm/fabsf.c
new file mode 100644
index 0000000..4a217c9
--- /dev/null
+++ b/libc-top-half/musl/src/math/arm/fabsf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __ARM_PCS_VFP && !BROKEN_VFP_ASM
+
+float fabsf(float x)
+{
+ __asm__ ("vabs.f32 %0, %1" : "=t"(x) : "t"(x));
+ return x;
+}
+
+#else
+
+#include "../fabsf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/arm/fma.c b/libc-top-half/musl/src/math/arm/fma.c
new file mode 100644
index 0000000..2a9b8ef
--- /dev/null
+++ b/libc-top-half/musl/src/math/arm/fma.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __ARM_FEATURE_FMA && __ARM_FP&8 && !__SOFTFP__
+
+double fma(double x, double y, double z)
+{
+ __asm__ ("vfma.f64 %P0, %P1, %P2" : "+w"(z) : "w"(x), "w"(y));
+ return z;
+}
+
+#else
+
+#include "../fma.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/arm/fmaf.c b/libc-top-half/musl/src/math/arm/fmaf.c
new file mode 100644
index 0000000..a1793d2
--- /dev/null
+++ b/libc-top-half/musl/src/math/arm/fmaf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __ARM_FEATURE_FMA && __ARM_FP&4 && !__SOFTFP__ && !BROKEN_VFP_ASM
+
+float fmaf(float x, float y, float z)
+{
+ __asm__ ("vfma.f32 %0, %1, %2" : "+t"(z) : "t"(x), "t"(y));
+ return z;
+}
+
+#else
+
+#include "../fmaf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/arm/sqrt.c b/libc-top-half/musl/src/math/arm/sqrt.c
new file mode 100644
index 0000000..567e2e9
--- /dev/null
+++ b/libc-top-half/musl/src/math/arm/sqrt.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if (__ARM_PCS_VFP || (__VFP_FP__ && !__SOFTFP__)) && (__ARM_FP&8)
+
+double sqrt(double x)
+{
+ __asm__ ("vsqrt.f64 %P0, %P1" : "=w"(x) : "w"(x));
+ return x;
+}
+
+#else
+
+#include "../sqrt.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/arm/sqrtf.c b/libc-top-half/musl/src/math/arm/sqrtf.c
new file mode 100644
index 0000000..3269329
--- /dev/null
+++ b/libc-top-half/musl/src/math/arm/sqrtf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if (__ARM_PCS_VFP || (__VFP_FP__ && !__SOFTFP__)) && !BROKEN_VFP_ASM
+
+float sqrtf(float x)
+{
+ __asm__ ("vsqrt.f32 %0, %1" : "=t"(x) : "t"(x));
+ return x;
+}
+
+#else
+
+#include "../sqrtf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/asin.c b/libc-top-half/musl/src/math/asin.c
new file mode 100644
index 0000000..c926b18
--- /dev/null
+++ b/libc-top-half/musl/src/math/asin.c
@@ -0,0 +1,107 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_asin.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* asin(x)
+ * Method :
+ * Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
+ * we approximate asin(x) on [0,0.5] by
+ * asin(x) = x + x*x^2*R(x^2)
+ * where
+ * R(x^2) is a rational approximation of (asin(x)-x)/x^3
+ * and its remez error is bounded by
+ * |(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75)
+ *
+ * For x in [0.5,1]
+ * asin(x) = pi/2-2*asin(sqrt((1-x)/2))
+ * Let y = (1-x), z = y/2, s := sqrt(z), and pio2_hi+pio2_lo=pi/2;
+ * then for x>0.98
+ * asin(x) = pi/2 - 2*(s+s*z*R(z))
+ * = pio2_hi - (2*(s+s*z*R(z)) - pio2_lo)
+ * For x<=0.98, let pio4_hi = pio2_hi/2, then
+ * f = hi part of s;
+ * c = sqrt(z) - f = (z-f*f)/(s+f) ...f+c=sqrt(z)
+ * and
+ * asin(x) = pi/2 - 2*(s+s*z*R(z))
+ * = pio4_hi+(pio4-2s)-(2s*z*R(z)-pio2_lo)
+ * = pio4_hi+(pio4-2f)-(2s*z*R(z)-(pio2_lo+2c))
+ *
+ * Special cases:
+ * if x is NaN, return x itself;
+ * if |x|>1, return NaN with invalid signal.
+ *
+ */
+
+#include "libm.h"
+
+static const double
+pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
+pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
+/* coefficients for R(x^2) */
+pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
+pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
+pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
+pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
+pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
+pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
+qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
+qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
+qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
+qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
+
+static double R(double z)
+{
+ double_t p, q;
+ p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
+ q = 1.0+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
+ return p/q;
+}
+
+double asin(double x)
+{
+ double z,r,s;
+ uint32_t hx,ix;
+
+ GET_HIGH_WORD(hx, x);
+ ix = hx & 0x7fffffff;
+ /* |x| >= 1 or nan */
+ if (ix >= 0x3ff00000) {
+ uint32_t lx;
+ GET_LOW_WORD(lx, x);
+ if ((ix-0x3ff00000 | lx) == 0)
+ /* asin(1) = +-pi/2 with inexact */
+ return x*pio2_hi + 0x1p-120f;
+ return 0/(x-x);
+ }
+ /* |x| < 0.5 */
+ if (ix < 0x3fe00000) {
+ /* if 0x1p-1022 <= |x| < 0x1p-26, avoid raising underflow */
+ if (ix < 0x3e500000 && ix >= 0x00100000)
+ return x;
+ return x + x*R(x*x);
+ }
+ /* 1 > |x| >= 0.5 */
+ z = (1 - fabs(x))*0.5;
+ s = sqrt(z);
+ r = R(z);
+ if (ix >= 0x3fef3333) { /* if |x| > 0.975 */
+ x = pio2_hi-(2*(s+s*r)-pio2_lo);
+ } else {
+ double f,c;
+ /* f+c = sqrt(z) */
+ f = s;
+ SET_LOW_WORD(f,0);
+ c = (z-f*f)/(s+f);
+ x = 0.5*pio2_hi - (2*s*r - (pio2_lo-2*c) - (0.5*pio2_hi-2*f));
+ }
+ if (hx >> 31)
+ return -x;
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/asinf.c b/libc-top-half/musl/src/math/asinf.c
new file mode 100644
index 0000000..bcd304a
--- /dev/null
+++ b/libc-top-half/musl/src/math/asinf.c
@@ -0,0 +1,61 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_asinf.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+#include "libm.h"
+
+static const double
+pio2 = 1.570796326794896558e+00;
+
+static const float
+/* coefficients for R(x^2) */
+pS0 = 1.6666586697e-01,
+pS1 = -4.2743422091e-02,
+pS2 = -8.6563630030e-03,
+qS1 = -7.0662963390e-01;
+
+static float R(float z)
+{
+ float_t p, q;
+ p = z*(pS0+z*(pS1+z*pS2));
+ q = 1.0f+z*qS1;
+ return p/q;
+}
+
+float asinf(float x)
+{
+ double s;
+ float z;
+ uint32_t hx,ix;
+
+ GET_FLOAT_WORD(hx, x);
+ ix = hx & 0x7fffffff;
+ if (ix >= 0x3f800000) { /* |x| >= 1 */
+ if (ix == 0x3f800000) /* |x| == 1 */
+ return x*pio2 + 0x1p-120f; /* asin(+-1) = +-pi/2 with inexact */
+ return 0/(x-x); /* asin(|x|>1) is NaN */
+ }
+ if (ix < 0x3f000000) { /* |x| < 0.5 */
+ /* if 0x1p-126 <= |x| < 0x1p-12, avoid raising underflow */
+ if (ix < 0x39800000 && ix >= 0x00800000)
+ return x;
+ return x + x*R(x*x);
+ }
+ /* 1 > |x| >= 0.5 */
+ z = (1 - fabsf(x))*0.5f;
+ s = sqrt(z);
+ x = pio2 - 2*(s+s*R(z));
+ if (hx >> 31)
+ return -x;
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/asinh.c b/libc-top-half/musl/src/math/asinh.c
new file mode 100644
index 0000000..0829f22
--- /dev/null
+++ b/libc-top-half/musl/src/math/asinh.c
@@ -0,0 +1,28 @@
+#include "libm.h"
+
+/* asinh(x) = sign(x)*log(|x|+sqrt(x*x+1)) ~= x - x^3/6 + o(x^5) */
+double asinh(double x)
+{
+ union {double f; uint64_t i;} u = {.f = x};
+ unsigned e = u.i >> 52 & 0x7ff;
+ unsigned s = u.i >> 63;
+
+ /* |x| */
+ u.i &= (uint64_t)-1/2;
+ x = u.f;
+
+ if (e >= 0x3ff + 26) {
+ /* |x| >= 0x1p26 or inf or nan */
+ x = log(x) + 0.693147180559945309417232121458176568;
+ } else if (e >= 0x3ff + 1) {
+ /* |x| >= 2 */
+ x = log(2*x + 1/(sqrt(x*x+1)+x));
+ } else if (e >= 0x3ff - 26) {
+ /* |x| >= 0x1p-26, up to 1.6ulp error in [0.125,0.5] */
+ x = log1p(x + x*x/(sqrt(x*x+1)+1));
+ } else {
+ /* |x| < 0x1p-26, raise inexact if x != 0 */
+ FORCE_EVAL(x + 0x1p120f);
+ }
+ return s ? -x : x;
+}
diff --git a/libc-top-half/musl/src/math/asinhf.c b/libc-top-half/musl/src/math/asinhf.c
new file mode 100644
index 0000000..fc9f091
--- /dev/null
+++ b/libc-top-half/musl/src/math/asinhf.c
@@ -0,0 +1,28 @@
+#include "libm.h"
+
+/* asinh(x) = sign(x)*log(|x|+sqrt(x*x+1)) ~= x - x^3/6 + o(x^5) */
+float asinhf(float x)
+{
+ union {float f; uint32_t i;} u = {.f = x};
+ uint32_t i = u.i & 0x7fffffff;
+ unsigned s = u.i >> 31;
+
+ /* |x| */
+ u.i = i;
+ x = u.f;
+
+ if (i >= 0x3f800000 + (12<<23)) {
+ /* |x| >= 0x1p12 or inf or nan */
+ x = logf(x) + 0.693147180559945309417232121458176568f;
+ } else if (i >= 0x3f800000 + (1<<23)) {
+ /* |x| >= 2 */
+ x = logf(2*x + 1/(sqrtf(x*x+1)+x));
+ } else if (i >= 0x3f800000 - (12<<23)) {
+ /* |x| >= 0x1p-12, up to 1.6ulp error in [0.125,0.5] */
+ x = log1pf(x + x*x/(sqrtf(x*x+1)+1));
+ } else {
+ /* |x| < 0x1p-12, raise inexact if x!=0 */
+ FORCE_EVAL(x + 0x1p120f);
+ }
+ return s ? -x : x;
+}
diff --git a/libc-top-half/musl/src/math/asinhl.c b/libc-top-half/musl/src/math/asinhl.c
new file mode 100644
index 0000000..8635f52
--- /dev/null
+++ b/libc-top-half/musl/src/math/asinhl.c
@@ -0,0 +1,41 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double asinhl(long double x)
+{
+ return asinh(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+/* asinh(x) = sign(x)*log(|x|+sqrt(x*x+1)) ~= x - x^3/6 + o(x^5) */
+long double asinhl(long double x)
+{
+ union ldshape u = {x};
+ unsigned e = u.i.se & 0x7fff;
+ unsigned s = u.i.se >> 15;
+
+ /* |x| */
+ u.i.se = e;
+ x = u.f;
+
+ if (e >= 0x3fff + 32) {
+ /* |x| >= 0x1p32 or inf or nan */
+ x = logl(x) + 0.693147180559945309417232121458176568L;
+ } else if (e >= 0x3fff + 1) {
+ /* |x| >= 2 */
+ x = logl(2*x + 1/(sqrtl(x*x+1)+x));
+ } else if (e >= 0x3fff - 32) {
+ /* |x| >= 0x1p-32 */
+ x = log1pl(x + x*x/(sqrtl(x*x+1)+1));
+ } else {
+ /* |x| < 0x1p-32, raise inexact if x!=0 */
+ FORCE_EVAL(x + 0x1p120f);
+ }
+ return s ? -x : x;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double asinhl(long double x)
+{
+ return asinh(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/asinl.c b/libc-top-half/musl/src/math/asinl.c
new file mode 100644
index 0000000..347c535
--- /dev/null
+++ b/libc-top-half/musl/src/math/asinl.c
@@ -0,0 +1,71 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_asinl.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/*
+ * See comments in asin.c.
+ * Converted to long double by David Schultz <das@FreeBSD.ORG>.
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double asinl(long double x)
+{
+ return asin(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+#include "__invtrigl.h"
+#if LDBL_MANT_DIG == 64
+#define CLOSETO1(u) (u.i.m>>56 >= 0xf7)
+#define CLEARBOTTOM(u) (u.i.m &= -1ULL << 32)
+#elif LDBL_MANT_DIG == 113
+#define CLOSETO1(u) (u.i.top >= 0xee00)
+#define CLEARBOTTOM(u) (u.i.lo = 0)
+#endif
+
+long double asinl(long double x)
+{
+ union ldshape u = {x};
+ long double z, r, s;
+ uint16_t e = u.i.se & 0x7fff;
+ int sign = u.i.se >> 15;
+
+ if (e >= 0x3fff) { /* |x| >= 1 or nan */
+ /* asin(+-1)=+-pi/2 with inexact */
+ if (x == 1 || x == -1)
+ return x*pio2_hi + 0x1p-120f;
+ return 0/(x-x);
+ }
+ if (e < 0x3fff - 1) { /* |x| < 0.5 */
+ if (e < 0x3fff - (LDBL_MANT_DIG+1)/2) {
+ /* return x with inexact if x!=0 */
+ FORCE_EVAL(x + 0x1p120f);
+ return x;
+ }
+ return x + x*__invtrigl_R(x*x);
+ }
+ /* 1 > |x| >= 0.5 */
+ z = (1.0 - fabsl(x))*0.5;
+ s = sqrtl(z);
+ r = __invtrigl_R(z);
+ if (CLOSETO1(u)) {
+ x = pio2_hi - (2*(s+s*r)-pio2_lo);
+ } else {
+ long double f, c;
+ u.f = s;
+ CLEARBOTTOM(u);
+ f = u.f;
+ c = (z - f*f)/(s + f);
+ x = 0.5*pio2_hi-(2*s*r - (pio2_lo-2*c) - (0.5*pio2_hi-2*f));
+ }
+ return sign ? -x : x;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/atan.c b/libc-top-half/musl/src/math/atan.c
new file mode 100644
index 0000000..63b0ab2
--- /dev/null
+++ b/libc-top-half/musl/src/math/atan.c
@@ -0,0 +1,116 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_atan.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* atan(x)
+ * Method
+ * 1. Reduce x to positive by atan(x) = -atan(-x).
+ * 2. According to the integer k=4t+0.25 chopped, t=x, the argument
+ * is further reduced to one of the following intervals and the
+ * arctangent of t is evaluated by the corresponding formula:
+ *
+ * [0,7/16] atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
+ * [7/16,11/16] atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) )
+ * [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) )
+ * [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) )
+ * [39/16,INF] atan(x) = atan(INF) + atan( -1/t )
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+
+#include "libm.h"
+
+static const double atanhi[] = {
+ 4.63647609000806093515e-01, /* atan(0.5)hi 0x3FDDAC67, 0x0561BB4F */
+ 7.85398163397448278999e-01, /* atan(1.0)hi 0x3FE921FB, 0x54442D18 */
+ 9.82793723247329054082e-01, /* atan(1.5)hi 0x3FEF730B, 0xD281F69B */
+ 1.57079632679489655800e+00, /* atan(inf)hi 0x3FF921FB, 0x54442D18 */
+};
+
+static const double atanlo[] = {
+ 2.26987774529616870924e-17, /* atan(0.5)lo 0x3C7A2B7F, 0x222F65E2 */
+ 3.06161699786838301793e-17, /* atan(1.0)lo 0x3C81A626, 0x33145C07 */
+ 1.39033110312309984516e-17, /* atan(1.5)lo 0x3C700788, 0x7AF0CBBD */
+ 6.12323399573676603587e-17, /* atan(inf)lo 0x3C91A626, 0x33145C07 */
+};
+
+static const double aT[] = {
+ 3.33333333333329318027e-01, /* 0x3FD55555, 0x5555550D */
+ -1.99999999998764832476e-01, /* 0xBFC99999, 0x9998EBC4 */
+ 1.42857142725034663711e-01, /* 0x3FC24924, 0x920083FF */
+ -1.11111104054623557880e-01, /* 0xBFBC71C6, 0xFE231671 */
+ 9.09088713343650656196e-02, /* 0x3FB745CD, 0xC54C206E */
+ -7.69187620504482999495e-02, /* 0xBFB3B0F2, 0xAF749A6D */
+ 6.66107313738753120669e-02, /* 0x3FB10D66, 0xA0D03D51 */
+ -5.83357013379057348645e-02, /* 0xBFADDE2D, 0x52DEFD9A */
+ 4.97687799461593236017e-02, /* 0x3FA97B4B, 0x24760DEB */
+ -3.65315727442169155270e-02, /* 0xBFA2B444, 0x2C6A6C2F */
+ 1.62858201153657823623e-02, /* 0x3F90AD3A, 0xE322DA11 */
+};
+
+double atan(double x)
+{
+ double_t w,s1,s2,z;
+ uint32_t ix,sign;
+ int id;
+
+ GET_HIGH_WORD(ix, x);
+ sign = ix >> 31;
+ ix &= 0x7fffffff;
+ if (ix >= 0x44100000) { /* if |x| >= 2^66 */
+ if (isnan(x))
+ return x;
+ z = atanhi[3] + 0x1p-120f;
+ return sign ? -z : z;
+ }
+ if (ix < 0x3fdc0000) { /* |x| < 0.4375 */
+ if (ix < 0x3e400000) { /* |x| < 2^-27 */
+ if (ix < 0x00100000)
+ /* raise underflow for subnormal x */
+ FORCE_EVAL((float)x);
+ return x;
+ }
+ id = -1;
+ } else {
+ x = fabs(x);
+ if (ix < 0x3ff30000) { /* |x| < 1.1875 */
+ if (ix < 0x3fe60000) { /* 7/16 <= |x| < 11/16 */
+ id = 0;
+ x = (2.0*x-1.0)/(2.0+x);
+ } else { /* 11/16 <= |x| < 19/16 */
+ id = 1;
+ x = (x-1.0)/(x+1.0);
+ }
+ } else {
+ if (ix < 0x40038000) { /* |x| < 2.4375 */
+ id = 2;
+ x = (x-1.5)/(1.0+1.5*x);
+ } else { /* 2.4375 <= |x| < 2^66 */
+ id = 3;
+ x = -1.0/x;
+ }
+ }
+ }
+ /* end of argument reduction */
+ z = x*x;
+ w = z*z;
+ /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */
+ s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10])))));
+ s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9]))));
+ if (id < 0)
+ return x - x*(s1+s2);
+ z = atanhi[id] - (x*(s1+s2) - atanlo[id] - x);
+ return sign ? -z : z;
+}
diff --git a/libc-top-half/musl/src/math/atan2.c b/libc-top-half/musl/src/math/atan2.c
new file mode 100644
index 0000000..5a1903c
--- /dev/null
+++ b/libc-top-half/musl/src/math/atan2.c
@@ -0,0 +1,107 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_atan2.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ */
+/* atan2(y,x)
+ * Method :
+ * 1. Reduce y to positive by atan2(y,x)=-atan2(-y,x).
+ * 2. Reduce x to positive by (if x and y are unexceptional):
+ * ARG (x+iy) = arctan(y/x) ... if x > 0,
+ * ARG (x+iy) = pi - arctan[y/(-x)] ... if x < 0,
+ *
+ * Special cases:
+ *
+ * ATAN2((anything), NaN ) is NaN;
+ * ATAN2(NAN , (anything) ) is NaN;
+ * ATAN2(+-0, +(anything but NaN)) is +-0 ;
+ * ATAN2(+-0, -(anything but NaN)) is +-pi ;
+ * ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2;
+ * ATAN2(+-(anything but INF and NaN), +INF) is +-0 ;
+ * ATAN2(+-(anything but INF and NaN), -INF) is +-pi;
+ * ATAN2(+-INF,+INF ) is +-pi/4 ;
+ * ATAN2(+-INF,-INF ) is +-3pi/4;
+ * ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2;
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+#include "libm.h"
+
+static const double
+pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */
+pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
+
+double atan2(double y, double x)
+{
+ double z;
+ uint32_t m,lx,ly,ix,iy;
+
+ if (isnan(x) || isnan(y))
+ return x+y;
+ EXTRACT_WORDS(ix, lx, x);
+ EXTRACT_WORDS(iy, ly, y);
+ if ((ix-0x3ff00000 | lx) == 0) /* x = 1.0 */
+ return atan(y);
+ m = ((iy>>31)&1) | ((ix>>30)&2); /* 2*sign(x)+sign(y) */
+ ix = ix & 0x7fffffff;
+ iy = iy & 0x7fffffff;
+
+ /* when y = 0 */
+ if ((iy|ly) == 0) {
+ switch(m) {
+ case 0:
+ case 1: return y; /* atan(+-0,+anything)=+-0 */
+ case 2: return pi; /* atan(+0,-anything) = pi */
+ case 3: return -pi; /* atan(-0,-anything) =-pi */
+ }
+ }
+ /* when x = 0 */
+ if ((ix|lx) == 0)
+ return m&1 ? -pi/2 : pi/2;
+ /* when x is INF */
+ if (ix == 0x7ff00000) {
+ if (iy == 0x7ff00000) {
+ switch(m) {
+ case 0: return pi/4; /* atan(+INF,+INF) */
+ case 1: return -pi/4; /* atan(-INF,+INF) */
+ case 2: return 3*pi/4; /* atan(+INF,-INF) */
+ case 3: return -3*pi/4; /* atan(-INF,-INF) */
+ }
+ } else {
+ switch(m) {
+ case 0: return 0.0; /* atan(+...,+INF) */
+ case 1: return -0.0; /* atan(-...,+INF) */
+ case 2: return pi; /* atan(+...,-INF) */
+ case 3: return -pi; /* atan(-...,-INF) */
+ }
+ }
+ }
+ /* |y/x| > 0x1p64 */
+ if (ix+(64<<20) < iy || iy == 0x7ff00000)
+ return m&1 ? -pi/2 : pi/2;
+
+ /* z = atan(|y/x|) without spurious underflow */
+ if ((m&2) && iy+(64<<20) < ix) /* |y/x| < 0x1p-64, x<0 */
+ z = 0;
+ else
+ z = atan(fabs(y/x));
+ switch (m) {
+ case 0: return z; /* atan(+,+) */
+ case 1: return -z; /* atan(-,+) */
+ case 2: return pi - (z-pi_lo); /* atan(+,-) */
+ default: /* case 3 */
+ return (z-pi_lo) - pi; /* atan(-,-) */
+ }
+}
diff --git a/libc-top-half/musl/src/math/atan2f.c b/libc-top-half/musl/src/math/atan2f.c
new file mode 100644
index 0000000..c634d00
--- /dev/null
+++ b/libc-top-half/musl/src/math/atan2f.c
@@ -0,0 +1,83 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_atan2f.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+static const float
+pi = 3.1415927410e+00, /* 0x40490fdb */
+pi_lo = -8.7422776573e-08; /* 0xb3bbbd2e */
+
+float atan2f(float y, float x)
+{
+ float z;
+ uint32_t m,ix,iy;
+
+ if (isnan(x) || isnan(y))
+ return x+y;
+ GET_FLOAT_WORD(ix, x);
+ GET_FLOAT_WORD(iy, y);
+ if (ix == 0x3f800000) /* x=1.0 */
+ return atanf(y);
+ m = ((iy>>31)&1) | ((ix>>30)&2); /* 2*sign(x)+sign(y) */
+ ix &= 0x7fffffff;
+ iy &= 0x7fffffff;
+
+ /* when y = 0 */
+ if (iy == 0) {
+ switch (m) {
+ case 0:
+ case 1: return y; /* atan(+-0,+anything)=+-0 */
+ case 2: return pi; /* atan(+0,-anything) = pi */
+ case 3: return -pi; /* atan(-0,-anything) =-pi */
+ }
+ }
+ /* when x = 0 */
+ if (ix == 0)
+ return m&1 ? -pi/2 : pi/2;
+ /* when x is INF */
+ if (ix == 0x7f800000) {
+ if (iy == 0x7f800000) {
+ switch (m) {
+ case 0: return pi/4; /* atan(+INF,+INF) */
+ case 1: return -pi/4; /* atan(-INF,+INF) */
+ case 2: return 3*pi/4; /*atan(+INF,-INF)*/
+ case 3: return -3*pi/4; /*atan(-INF,-INF)*/
+ }
+ } else {
+ switch (m) {
+ case 0: return 0.0f; /* atan(+...,+INF) */
+ case 1: return -0.0f; /* atan(-...,+INF) */
+ case 2: return pi; /* atan(+...,-INF) */
+ case 3: return -pi; /* atan(-...,-INF) */
+ }
+ }
+ }
+ /* |y/x| > 0x1p26 */
+ if (ix+(26<<23) < iy || iy == 0x7f800000)
+ return m&1 ? -pi/2 : pi/2;
+
+ /* z = atan(|y/x|) with correct underflow */
+ if ((m&2) && iy+(26<<23) < ix) /*|y/x| < 0x1p-26, x < 0 */
+ z = 0.0;
+ else
+ z = atanf(fabsf(y/x));
+ switch (m) {
+ case 0: return z; /* atan(+,+) */
+ case 1: return -z; /* atan(-,+) */
+ case 2: return pi - (z-pi_lo); /* atan(+,-) */
+ default: /* case 3 */
+ return (z-pi_lo) - pi; /* atan(-,-) */
+ }
+}
diff --git a/libc-top-half/musl/src/math/atan2l.c b/libc-top-half/musl/src/math/atan2l.c
new file mode 100644
index 0000000..f0937a9
--- /dev/null
+++ b/libc-top-half/musl/src/math/atan2l.c
@@ -0,0 +1,85 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_atan2l.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ */
+/*
+ * See comments in atan2.c.
+ * Converted to long double by David Schultz <das@FreeBSD.ORG>.
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double atan2l(long double y, long double x)
+{
+ return atan2(y, x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+#include "__invtrigl.h"
+
+long double atan2l(long double y, long double x)
+{
+ union ldshape ux, uy;
+ long double z;
+ int m, ex, ey;
+
+ if (isnan(x) || isnan(y))
+ return x+y;
+ if (x == 1)
+ return atanl(y);
+ ux.f = x;
+ uy.f = y;
+ ex = ux.i.se & 0x7fff;
+ ey = uy.i.se & 0x7fff;
+ m = 2*(ux.i.se>>15) | uy.i.se>>15;
+ if (y == 0) {
+ switch(m) {
+ case 0:
+ case 1: return y; /* atan(+-0,+anything)=+-0 */
+ case 2: return 2*pio2_hi; /* atan(+0,-anything) = pi */
+ case 3: return -2*pio2_hi; /* atan(-0,-anything) =-pi */
+ }
+ }
+ if (x == 0)
+ return m&1 ? -pio2_hi : pio2_hi;
+ if (ex == 0x7fff) {
+ if (ey == 0x7fff) {
+ switch(m) {
+ case 0: return pio2_hi/2; /* atan(+INF,+INF) */
+ case 1: return -pio2_hi/2; /* atan(-INF,+INF) */
+ case 2: return 1.5*pio2_hi; /* atan(+INF,-INF) */
+ case 3: return -1.5*pio2_hi; /* atan(-INF,-INF) */
+ }
+ } else {
+ switch(m) {
+ case 0: return 0.0; /* atan(+...,+INF) */
+ case 1: return -0.0; /* atan(-...,+INF) */
+ case 2: return 2*pio2_hi; /* atan(+...,-INF) */
+ case 3: return -2*pio2_hi; /* atan(-...,-INF) */
+ }
+ }
+ }
+ if (ex+120 < ey || ey == 0x7fff)
+ return m&1 ? -pio2_hi : pio2_hi;
+ /* z = atan(|y/x|) without spurious underflow */
+ if ((m&2) && ey+120 < ex) /* |y/x| < 0x1p-120, x<0 */
+ z = 0.0;
+ else
+ z = atanl(fabsl(y/x));
+ switch (m) {
+ case 0: return z; /* atan(+,+) */
+ case 1: return -z; /* atan(-,+) */
+ case 2: return 2*pio2_hi-(z-2*pio2_lo); /* atan(+,-) */
+ default: /* case 3 */
+ return (z-2*pio2_lo)-2*pio2_hi; /* atan(-,-) */
+ }
+}
+#endif
diff --git a/libc-top-half/musl/src/math/atanf.c b/libc-top-half/musl/src/math/atanf.c
new file mode 100644
index 0000000..178341b
--- /dev/null
+++ b/libc-top-half/musl/src/math/atanf.c
@@ -0,0 +1,94 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_atanf.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+
+#include "libm.h"
+
+static const float atanhi[] = {
+ 4.6364760399e-01, /* atan(0.5)hi 0x3eed6338 */
+ 7.8539812565e-01, /* atan(1.0)hi 0x3f490fda */
+ 9.8279368877e-01, /* atan(1.5)hi 0x3f7b985e */
+ 1.5707962513e+00, /* atan(inf)hi 0x3fc90fda */
+};
+
+static const float atanlo[] = {
+ 5.0121582440e-09, /* atan(0.5)lo 0x31ac3769 */
+ 3.7748947079e-08, /* atan(1.0)lo 0x33222168 */
+ 3.4473217170e-08, /* atan(1.5)lo 0x33140fb4 */
+ 7.5497894159e-08, /* atan(inf)lo 0x33a22168 */
+};
+
+static const float aT[] = {
+ 3.3333328366e-01,
+ -1.9999158382e-01,
+ 1.4253635705e-01,
+ -1.0648017377e-01,
+ 6.1687607318e-02,
+};
+
+float atanf(float x)
+{
+ float_t w,s1,s2,z;
+ uint32_t ix,sign;
+ int id;
+
+ GET_FLOAT_WORD(ix, x);
+ sign = ix>>31;
+ ix &= 0x7fffffff;
+ if (ix >= 0x4c800000) { /* if |x| >= 2**26 */
+ if (isnan(x))
+ return x;
+ z = atanhi[3] + 0x1p-120f;
+ return sign ? -z : z;
+ }
+ if (ix < 0x3ee00000) { /* |x| < 0.4375 */
+ if (ix < 0x39800000) { /* |x| < 2**-12 */
+ if (ix < 0x00800000)
+ /* raise underflow for subnormal x */
+ FORCE_EVAL(x*x);
+ return x;
+ }
+ id = -1;
+ } else {
+ x = fabsf(x);
+ if (ix < 0x3f980000) { /* |x| < 1.1875 */
+ if (ix < 0x3f300000) { /* 7/16 <= |x| < 11/16 */
+ id = 0;
+ x = (2.0f*x - 1.0f)/(2.0f + x);
+ } else { /* 11/16 <= |x| < 19/16 */
+ id = 1;
+ x = (x - 1.0f)/(x + 1.0f);
+ }
+ } else {
+ if (ix < 0x401c0000) { /* |x| < 2.4375 */
+ id = 2;
+ x = (x - 1.5f)/(1.0f + 1.5f*x);
+ } else { /* 2.4375 <= |x| < 2**26 */
+ id = 3;
+ x = -1.0f/x;
+ }
+ }
+ }
+ /* end of argument reduction */
+ z = x*x;
+ w = z*z;
+ /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */
+ s1 = z*(aT[0]+w*(aT[2]+w*aT[4]));
+ s2 = w*(aT[1]+w*aT[3]);
+ if (id < 0)
+ return x - x*(s1+s2);
+ z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
+ return sign ? -z : z;
+}
diff --git a/libc-top-half/musl/src/math/atanh.c b/libc-top-half/musl/src/math/atanh.c
new file mode 100644
index 0000000..63a035d
--- /dev/null
+++ b/libc-top-half/musl/src/math/atanh.c
@@ -0,0 +1,29 @@
+#include "libm.h"
+
+/* atanh(x) = log((1+x)/(1-x))/2 = log1p(2x/(1-x))/2 ~= x + x^3/3 + o(x^5) */
+double atanh(double x)
+{
+ union {double f; uint64_t i;} u = {.f = x};
+ unsigned e = u.i >> 52 & 0x7ff;
+ unsigned s = u.i >> 63;
+ double_t y;
+
+ /* |x| */
+ u.i &= (uint64_t)-1/2;
+ y = u.f;
+
+ if (e < 0x3ff - 1) {
+ if (e < 0x3ff - 32) {
+ /* handle underflow */
+ if (e == 0)
+ FORCE_EVAL((float)y);
+ } else {
+ /* |x| < 0.5, up to 1.7ulp error */
+ y = 0.5*log1p(2*y + 2*y*y/(1-y));
+ }
+ } else {
+ /* avoid overflow */
+ y = 0.5*log1p(2*(y/(1-y)));
+ }
+ return s ? -y : y;
+}
diff --git a/libc-top-half/musl/src/math/atanhf.c b/libc-top-half/musl/src/math/atanhf.c
new file mode 100644
index 0000000..65f07c0
--- /dev/null
+++ b/libc-top-half/musl/src/math/atanhf.c
@@ -0,0 +1,28 @@
+#include "libm.h"
+
+/* atanh(x) = log((1+x)/(1-x))/2 = log1p(2x/(1-x))/2 ~= x + x^3/3 + o(x^5) */
+float atanhf(float x)
+{
+ union {float f; uint32_t i;} u = {.f = x};
+ unsigned s = u.i >> 31;
+ float_t y;
+
+ /* |x| */
+ u.i &= 0x7fffffff;
+ y = u.f;
+
+ if (u.i < 0x3f800000 - (1<<23)) {
+ if (u.i < 0x3f800000 - (32<<23)) {
+ /* handle underflow */
+ if (u.i < (1<<23))
+ FORCE_EVAL((float)(y*y));
+ } else {
+ /* |x| < 0.5, up to 1.7ulp error */
+ y = 0.5f*log1pf(2*y + 2*y*y/(1-y));
+ }
+ } else {
+ /* avoid overflow */
+ y = 0.5f*log1pf(2*(y/(1-y)));
+ }
+ return s ? -y : y;
+}
diff --git a/libc-top-half/musl/src/math/atanhl.c b/libc-top-half/musl/src/math/atanhl.c
new file mode 100644
index 0000000..87cd1cd
--- /dev/null
+++ b/libc-top-half/musl/src/math/atanhl.c
@@ -0,0 +1,35 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double atanhl(long double x)
+{
+ return atanh(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+/* atanh(x) = log((1+x)/(1-x))/2 = log1p(2x/(1-x))/2 ~= x + x^3/3 + o(x^5) */
+long double atanhl(long double x)
+{
+ union ldshape u = {x};
+ unsigned e = u.i.se & 0x7fff;
+ unsigned s = u.i.se >> 15;
+
+ /* |x| */
+ u.i.se = e;
+ x = u.f;
+
+ if (e < 0x3ff - 1) {
+ if (e < 0x3ff - LDBL_MANT_DIG/2) {
+ /* handle underflow */
+ if (e == 0)
+ FORCE_EVAL((float)x);
+ } else {
+ /* |x| < 0.5, up to 1.7ulp error */
+ x = 0.5*log1pl(2*x + 2*x*x/(1-x));
+ }
+ } else {
+ /* avoid overflow */
+ x = 0.5*log1pl(2*(x/(1-x)));
+ }
+ return s ? -x : x;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/atanl.c b/libc-top-half/musl/src/math/atanl.c
new file mode 100644
index 0000000..c3b0c92
--- /dev/null
+++ b/libc-top-half/musl/src/math/atanl.c
@@ -0,0 +1,184 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_atanl.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/*
+ * See comments in atan.c.
+ * Converted to long double by David Schultz <das@FreeBSD.ORG>.
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double atanl(long double x)
+{
+ return atan(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+
+#if LDBL_MANT_DIG == 64
+#define EXPMAN(u) ((u.i.se & 0x7fff)<<8 | (u.i.m>>55 & 0xff))
+
+static const long double atanhi[] = {
+ 4.63647609000806116202e-01L,
+ 7.85398163397448309628e-01L,
+ 9.82793723247329067960e-01L,
+ 1.57079632679489661926e+00L,
+};
+
+static const long double atanlo[] = {
+ 1.18469937025062860669e-20L,
+ -1.25413940316708300586e-20L,
+ 2.55232234165405176172e-20L,
+ -2.50827880633416601173e-20L,
+};
+
+static const long double aT[] = {
+ 3.33333333333333333017e-01L,
+ -1.99999999999999632011e-01L,
+ 1.42857142857046531280e-01L,
+ -1.11111111100562372733e-01L,
+ 9.09090902935647302252e-02L,
+ -7.69230552476207730353e-02L,
+ 6.66661718042406260546e-02L,
+ -5.88158892835030888692e-02L,
+ 5.25499891539726639379e-02L,
+ -4.70119845393155721494e-02L,
+ 4.03539201366454414072e-02L,
+ -2.91303858419364158725e-02L,
+ 1.24822046299269234080e-02L,
+};
+
+static long double T_even(long double x)
+{
+ return aT[0] + x * (aT[2] + x * (aT[4] + x * (aT[6] +
+ x * (aT[8] + x * (aT[10] + x * aT[12])))));
+}
+
+static long double T_odd(long double x)
+{
+ return aT[1] + x * (aT[3] + x * (aT[5] + x * (aT[7] +
+ x * (aT[9] + x * aT[11]))));
+}
+#elif LDBL_MANT_DIG == 113
+#define EXPMAN(u) ((u.i.se & 0x7fff)<<8 | u.i.top>>8)
+
+static const long double atanhi[] = {
+ 4.63647609000806116214256231461214397e-01L,
+ 7.85398163397448309615660845819875699e-01L,
+ 9.82793723247329067985710611014666038e-01L,
+ 1.57079632679489661923132169163975140e+00L,
+};
+
+static const long double atanlo[] = {
+ 4.89509642257333492668618435220297706e-36L,
+ 2.16795253253094525619926100651083806e-35L,
+ -2.31288434538183565909319952098066272e-35L,
+ 4.33590506506189051239852201302167613e-35L,
+};
+
+static const long double aT[] = {
+ 3.33333333333333333333333333333333125e-01L,
+ -1.99999999999999999999999999999180430e-01L,
+ 1.42857142857142857142857142125269827e-01L,
+ -1.11111111111111111111110834490810169e-01L,
+ 9.09090909090909090908522355708623681e-02L,
+ -7.69230769230769230696553844935357021e-02L,
+ 6.66666666666666660390096773046256096e-02L,
+ -5.88235294117646671706582985209643694e-02L,
+ 5.26315789473666478515847092020327506e-02L,
+ -4.76190476189855517021024424991436144e-02L,
+ 4.34782608678695085948531993458097026e-02L,
+ -3.99999999632663469330634215991142368e-02L,
+ 3.70370363987423702891250829918659723e-02L,
+ -3.44827496515048090726669907612335954e-02L,
+ 3.22579620681420149871973710852268528e-02L,
+ -3.03020767654269261041647570626778067e-02L,
+ 2.85641979882534783223403715930946138e-02L,
+ -2.69824879726738568189929461383741323e-02L,
+ 2.54194698498808542954187110873675769e-02L,
+ -2.35083879708189059926183138130183215e-02L,
+ 2.04832358998165364349957325067131428e-02L,
+ -1.54489555488544397858507248612362957e-02L,
+ 8.64492360989278761493037861575248038e-03L,
+ -2.58521121597609872727919154569765469e-03L,
+};
+
+static long double T_even(long double x)
+{
+ return (aT[0] + x * (aT[2] + x * (aT[4] + x * (aT[6] + x * (aT[8] +
+ x * (aT[10] + x * (aT[12] + x * (aT[14] + x * (aT[16] +
+ x * (aT[18] + x * (aT[20] + x * aT[22])))))))))));
+}
+
+static long double T_odd(long double x)
+{
+ return (aT[1] + x * (aT[3] + x * (aT[5] + x * (aT[7] + x * (aT[9] +
+ x * (aT[11] + x * (aT[13] + x * (aT[15] + x * (aT[17] +
+ x * (aT[19] + x * (aT[21] + x * aT[23])))))))))));
+}
+#endif
+
+long double atanl(long double x)
+{
+ union ldshape u = {x};
+ long double w, s1, s2, z;
+ int id;
+ unsigned e = u.i.se & 0x7fff;
+ unsigned sign = u.i.se >> 15;
+ unsigned expman;
+
+ if (e >= 0x3fff + LDBL_MANT_DIG + 1) { /* if |x| is large, atan(x)~=pi/2 */
+ if (isnan(x))
+ return x;
+ return sign ? -atanhi[3] : atanhi[3];
+ }
+ /* Extract the exponent and the first few bits of the mantissa. */
+ expman = EXPMAN(u);
+ if (expman < ((0x3fff - 2) << 8) + 0xc0) { /* |x| < 0.4375 */
+ if (e < 0x3fff - (LDBL_MANT_DIG+1)/2) { /* if |x| is small, atanl(x)~=x */
+ /* raise underflow if subnormal */
+ if (e == 0)
+ FORCE_EVAL((float)x);
+ return x;
+ }
+ id = -1;
+ } else {
+ x = fabsl(x);
+ if (expman < (0x3fff << 8) + 0x30) { /* |x| < 1.1875 */
+ if (expman < ((0x3fff - 1) << 8) + 0x60) { /* 7/16 <= |x| < 11/16 */
+ id = 0;
+ x = (2.0*x-1.0)/(2.0+x);
+ } else { /* 11/16 <= |x| < 19/16 */
+ id = 1;
+ x = (x-1.0)/(x+1.0);
+ }
+ } else {
+ if (expman < ((0x3fff + 1) << 8) + 0x38) { /* |x| < 2.4375 */
+ id = 2;
+ x = (x-1.5)/(1.0+1.5*x);
+ } else { /* 2.4375 <= |x| */
+ id = 3;
+ x = -1.0/x;
+ }
+ }
+ }
+ /* end of argument reduction */
+ z = x*x;
+ w = z*z;
+ /* break sum aT[i]z**(i+1) into odd and even poly */
+ s1 = z*T_even(w);
+ s2 = w*T_odd(w);
+ if (id < 0)
+ return x - x*(s1+s2);
+ z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
+ return sign ? -z : z;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/cbrt.c b/libc-top-half/musl/src/math/cbrt.c
new file mode 100644
index 0000000..7599d3e
--- /dev/null
+++ b/libc-top-half/musl/src/math/cbrt.c
@@ -0,0 +1,103 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_cbrt.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * Optimized by Bruce D. Evans.
+ */
+/* cbrt(x)
+ * Return cube root of x
+ */
+
+#include <math.h>
+#include <stdint.h>
+
+static const uint32_t
+B1 = 715094163, /* B1 = (1023-1023/3-0.03306235651)*2**20 */
+B2 = 696219795; /* B2 = (1023-1023/3-54/3-0.03306235651)*2**20 */
+
+/* |1/cbrt(x) - p(x)| < 2**-23.5 (~[-7.93e-8, 7.929e-8]). */
+static const double
+P0 = 1.87595182427177009643, /* 0x3ffe03e6, 0x0f61e692 */
+P1 = -1.88497979543377169875, /* 0xbffe28e0, 0x92f02420 */
+P2 = 1.621429720105354466140, /* 0x3ff9f160, 0x4a49d6c2 */
+P3 = -0.758397934778766047437, /* 0xbfe844cb, 0xbee751d9 */
+P4 = 0.145996192886612446982; /* 0x3fc2b000, 0xd4e4edd7 */
+
+double cbrt(double x)
+{
+ union {double f; uint64_t i;} u = {x};
+ double_t r,s,t,w;
+ uint32_t hx = u.i>>32 & 0x7fffffff;
+
+ if (hx >= 0x7ff00000) /* cbrt(NaN,INF) is itself */
+ return x+x;
+
+ /*
+ * Rough cbrt to 5 bits:
+ * cbrt(2**e*(1+m) ~= 2**(e/3)*(1+(e%3+m)/3)
+ * where e is integral and >= 0, m is real and in [0, 1), and "/" and
+ * "%" are integer division and modulus with rounding towards minus
+ * infinity. The RHS is always >= the LHS and has a maximum relative
+ * error of about 1 in 16. Adding a bias of -0.03306235651 to the
+ * (e%3+m)/3 term reduces the error to about 1 in 32. With the IEEE
+ * floating point representation, for finite positive normal values,
+ * ordinary integer divison of the value in bits magically gives
+ * almost exactly the RHS of the above provided we first subtract the
+ * exponent bias (1023 for doubles) and later add it back. We do the
+ * subtraction virtually to keep e >= 0 so that ordinary integer
+ * division rounds towards minus infinity; this is also efficient.
+ */
+ if (hx < 0x00100000) { /* zero or subnormal? */
+ u.f = x*0x1p54;
+ hx = u.i>>32 & 0x7fffffff;
+ if (hx == 0)
+ return x; /* cbrt(0) is itself */
+ hx = hx/3 + B2;
+ } else
+ hx = hx/3 + B1;
+ u.i &= 1ULL<<63;
+ u.i |= (uint64_t)hx << 32;
+ t = u.f;
+
+ /*
+ * New cbrt to 23 bits:
+ * cbrt(x) = t*cbrt(x/t**3) ~= t*P(t**3/x)
+ * where P(r) is a polynomial of degree 4 that approximates 1/cbrt(r)
+ * to within 2**-23.5 when |r - 1| < 1/10. The rough approximation
+ * has produced t such than |t/cbrt(x) - 1| ~< 1/32, and cubing this
+ * gives us bounds for r = t**3/x.
+ *
+ * Try to optimize for parallel evaluation as in __tanf.c.
+ */
+ r = (t*t)*(t/x);
+ t = t*((P0+r*(P1+r*P2))+((r*r)*r)*(P3+r*P4));
+
+ /*
+ * Round t away from zero to 23 bits (sloppily except for ensuring that
+ * the result is larger in magnitude than cbrt(x) but not much more than
+ * 2 23-bit ulps larger). With rounding towards zero, the error bound
+ * would be ~5/6 instead of ~4/6. With a maximum error of 2 23-bit ulps
+ * in the rounded t, the infinite-precision error in the Newton
+ * approximation barely affects third digit in the final error
+ * 0.667; the error in the rounded t can be up to about 3 23-bit ulps
+ * before the final error is larger than 0.667 ulps.
+ */
+ u.f = t;
+ u.i = (u.i + 0x80000000) & 0xffffffffc0000000ULL;
+ t = u.f;
+
+ /* one step Newton iteration to 53 bits with error < 0.667 ulps */
+ s = t*t; /* t*t is exact */
+ r = x/s; /* error <= 0.5 ulps; |r| < |t| */
+ w = t+t; /* t+t is exact */
+ r = (r-t)/(w+r); /* r-t is exact; w+r ~= 3*t */
+ t = t+t*r; /* error <= 0.5 + 0.5/3 + epsilon */
+ return t;
+}
diff --git a/libc-top-half/musl/src/math/cbrtf.c b/libc-top-half/musl/src/math/cbrtf.c
new file mode 100644
index 0000000..89c2c86
--- /dev/null
+++ b/libc-top-half/musl/src/math/cbrtf.c
@@ -0,0 +1,66 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_cbrtf.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Debugged and optimized by Bruce D. Evans.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* cbrtf(x)
+ * Return cube root of x
+ */
+
+#include <math.h>
+#include <stdint.h>
+
+static const unsigned
+B1 = 709958130, /* B1 = (127-127.0/3-0.03306235651)*2**23 */
+B2 = 642849266; /* B2 = (127-127.0/3-24/3-0.03306235651)*2**23 */
+
+float cbrtf(float x)
+{
+ double_t r,T;
+ union {float f; uint32_t i;} u = {x};
+ uint32_t hx = u.i & 0x7fffffff;
+
+ if (hx >= 0x7f800000) /* cbrt(NaN,INF) is itself */
+ return x + x;
+
+ /* rough cbrt to 5 bits */
+ if (hx < 0x00800000) { /* zero or subnormal? */
+ if (hx == 0)
+ return x; /* cbrt(+-0) is itself */
+ u.f = x*0x1p24f;
+ hx = u.i & 0x7fffffff;
+ hx = hx/3 + B2;
+ } else
+ hx = hx/3 + B1;
+ u.i &= 0x80000000;
+ u.i |= hx;
+
+ /*
+ * First step Newton iteration (solving t*t-x/t == 0) to 16 bits. In
+ * double precision so that its terms can be arranged for efficiency
+ * without causing overflow or underflow.
+ */
+ T = u.f;
+ r = T*T*T;
+ T = T*((double_t)x+x+r)/(x+r+r);
+
+ /*
+ * Second step Newton iteration to 47 bits. In double precision for
+ * efficiency and accuracy.
+ */
+ r = T*T*T;
+ T = T*((double_t)x+x+r)/(x+r+r);
+
+ /* rounding to 24 bits is perfect in round-to-nearest mode */
+ return T;
+}
diff --git a/libc-top-half/musl/src/math/cbrtl.c b/libc-top-half/musl/src/math/cbrtl.c
new file mode 100644
index 0000000..ceff913
--- /dev/null
+++ b/libc-top-half/musl/src/math/cbrtl.c
@@ -0,0 +1,124 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_cbrtl.c */
+/*-
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2009-2011, Bruce D. Evans, Steven G. Kargl, David Schultz.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * The argument reduction and testing for exceptional cases was
+ * written by Steven G. Kargl with input from Bruce D. Evans
+ * and David A. Schultz.
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double cbrtl(long double x)
+{
+ return cbrt(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+static const unsigned B1 = 709958130; /* B1 = (127-127.0/3-0.03306235651)*2**23 */
+
+long double cbrtl(long double x)
+{
+ union ldshape u = {x}, v;
+ union {float f; uint32_t i;} uft;
+ long double r, s, t, w;
+ double_t dr, dt, dx;
+ float_t ft;
+ int e = u.i.se & 0x7fff;
+ int sign = u.i.se & 0x8000;
+
+ /*
+ * If x = +-Inf, then cbrt(x) = +-Inf.
+ * If x = NaN, then cbrt(x) = NaN.
+ */
+ if (e == 0x7fff)
+ return x + x;
+ if (e == 0) {
+ /* Adjust subnormal numbers. */
+ u.f *= 0x1p120;
+ e = u.i.se & 0x7fff;
+ /* If x = +-0, then cbrt(x) = +-0. */
+ if (e == 0)
+ return x;
+ e -= 120;
+ }
+ e -= 0x3fff;
+ u.i.se = 0x3fff;
+ x = u.f;
+ switch (e % 3) {
+ case 1:
+ case -2:
+ x *= 2;
+ e--;
+ break;
+ case 2:
+ case -1:
+ x *= 4;
+ e -= 2;
+ break;
+ }
+ v.f = 1.0;
+ v.i.se = sign | (0x3fff + e/3);
+
+ /*
+ * The following is the guts of s_cbrtf, with the handling of
+ * special values removed and extra care for accuracy not taken,
+ * but with most of the extra accuracy not discarded.
+ */
+
+ /* ~5-bit estimate: */
+ uft.f = x;
+ uft.i = (uft.i & 0x7fffffff)/3 + B1;
+ ft = uft.f;
+
+ /* ~16-bit estimate: */
+ dx = x;
+ dt = ft;
+ dr = dt * dt * dt;
+ dt = dt * (dx + dx + dr) / (dx + dr + dr);
+
+ /* ~47-bit estimate: */
+ dr = dt * dt * dt;
+ dt = dt * (dx + dx + dr) / (dx + dr + dr);
+
+#if LDBL_MANT_DIG == 64
+ /*
+ * dt is cbrtl(x) to ~47 bits (after x has been reduced to 1 <= x < 8).
+ * Round it away from zero to 32 bits (32 so that t*t is exact, and
+ * away from zero for technical reasons).
+ */
+ t = dt + (0x1.0p32L + 0x1.0p-31L) - 0x1.0p32;
+#elif LDBL_MANT_DIG == 113
+ /*
+ * Round dt away from zero to 47 bits. Since we don't trust the 47,
+ * add 2 47-bit ulps instead of 1 to round up. Rounding is slow and
+ * might be avoidable in this case, since on most machines dt will
+ * have been evaluated in 53-bit precision and the technical reasons
+ * for rounding up might not apply to either case in cbrtl() since
+ * dt is much more accurate than needed.
+ */
+ t = dt + 0x2.0p-46 + 0x1.0p60L - 0x1.0p60;
+#endif
+
+ /*
+ * Final step Newton iteration to 64 or 113 bits with
+ * error < 0.667 ulps
+ */
+ s = t*t; /* t*t is exact */
+ r = x/s; /* error <= 0.5 ulps; |r| < |t| */
+ w = t+t; /* t+t is exact */
+ r = (r-t)/(w+r); /* r-t is exact; w+r ~= 3*t */
+ t = t+t*r; /* error <= 0.5 + 0.5/3 + epsilon */
+
+ t *= v.f;
+ return t;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/ceil.c b/libc-top-half/musl/src/math/ceil.c
new file mode 100644
index 0000000..b13e6f2
--- /dev/null
+++ b/libc-top-half/musl/src/math/ceil.c
@@ -0,0 +1,31 @@
+#include "libm.h"
+
+#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1
+#define EPS DBL_EPSILON
+#elif FLT_EVAL_METHOD==2
+#define EPS LDBL_EPSILON
+#endif
+static const double_t toint = 1/EPS;
+
+double ceil(double x)
+{
+ union {double f; uint64_t i;} u = {x};
+ int e = u.i >> 52 & 0x7ff;
+ double_t y;
+
+ if (e >= 0x3ff+52 || x == 0)
+ return x;
+ /* y = int(x) - x, where int(x) is an integer neighbor of x */
+ if (u.i >> 63)
+ y = x - toint + toint - x;
+ else
+ y = x + toint - toint - x;
+ /* special case because of non-nearest rounding modes */
+ if (e <= 0x3ff-1) {
+ FORCE_EVAL(y);
+ return u.i >> 63 ? -0.0 : 1;
+ }
+ if (y < 0)
+ return x + y + 1;
+ return x + y;
+}
diff --git a/libc-top-half/musl/src/math/ceilf.c b/libc-top-half/musl/src/math/ceilf.c
new file mode 100644
index 0000000..869835f
--- /dev/null
+++ b/libc-top-half/musl/src/math/ceilf.c
@@ -0,0 +1,27 @@
+#include "libm.h"
+
+float ceilf(float x)
+{
+ union {float f; uint32_t i;} u = {x};
+ int e = (int)(u.i >> 23 & 0xff) - 0x7f;
+ uint32_t m;
+
+ if (e >= 23)
+ return x;
+ if (e >= 0) {
+ m = 0x007fffff >> e;
+ if ((u.i & m) == 0)
+ return x;
+ FORCE_EVAL(x + 0x1p120f);
+ if (u.i >> 31 == 0)
+ u.i += m;
+ u.i &= ~m;
+ } else {
+ FORCE_EVAL(x + 0x1p120f);
+ if (u.i >> 31)
+ u.f = -0.0;
+ else if (u.i << 1)
+ u.f = 1.0;
+ }
+ return u.f;
+}
diff --git a/libc-top-half/musl/src/math/ceill.c b/libc-top-half/musl/src/math/ceill.c
new file mode 100644
index 0000000..60a8302
--- /dev/null
+++ b/libc-top-half/musl/src/math/ceill.c
@@ -0,0 +1,34 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double ceill(long double x)
+{
+ return ceil(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+
+static const long double toint = 1/LDBL_EPSILON;
+
+long double ceill(long double x)
+{
+ union ldshape u = {x};
+ int e = u.i.se & 0x7fff;
+ long double y;
+
+ if (e >= 0x3fff+LDBL_MANT_DIG-1 || x == 0)
+ return x;
+ /* y = int(x) - x, where int(x) is an integer neighbor of x */
+ if (u.i.se >> 15)
+ y = x - toint + toint - x;
+ else
+ y = x + toint - toint - x;
+ /* special case because of non-nearest rounding modes */
+ if (e <= 0x3fff-1) {
+ FORCE_EVAL(y);
+ return u.i.se >> 15 ? -0.0 : 1;
+ }
+ if (y < 0)
+ return x + y + 1;
+ return x + y;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/copysign.c b/libc-top-half/musl/src/math/copysign.c
new file mode 100644
index 0000000..b09331b
--- /dev/null
+++ b/libc-top-half/musl/src/math/copysign.c
@@ -0,0 +1,8 @@
+#include "libm.h"
+
+double copysign(double x, double y) {
+ union {double f; uint64_t i;} ux={x}, uy={y};
+ ux.i &= -1ULL/2;
+ ux.i |= uy.i & 1ULL<<63;
+ return ux.f;
+}
diff --git a/libc-top-half/musl/src/math/copysignf.c b/libc-top-half/musl/src/math/copysignf.c
new file mode 100644
index 0000000..0af6ae9
--- /dev/null
+++ b/libc-top-half/musl/src/math/copysignf.c
@@ -0,0 +1,10 @@
+#include <math.h>
+#include <stdint.h>
+
+float copysignf(float x, float y)
+{
+ union {float f; uint32_t i;} ux={x}, uy={y};
+ ux.i &= 0x7fffffff;
+ ux.i |= uy.i & 0x80000000;
+ return ux.f;
+}
diff --git a/libc-top-half/musl/src/math/copysignl.c b/libc-top-half/musl/src/math/copysignl.c
new file mode 100644
index 0000000..9dd933c
--- /dev/null
+++ b/libc-top-half/musl/src/math/copysignl.c
@@ -0,0 +1,16 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double copysignl(long double x, long double y)
+{
+ return copysign(x, y);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+long double copysignl(long double x, long double y)
+{
+ union ldshape ux = {x}, uy = {y};
+ ux.i.se &= 0x7fff;
+ ux.i.se |= uy.i.se & 0x8000;
+ return ux.f;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/cos.c b/libc-top-half/musl/src/math/cos.c
new file mode 100644
index 0000000..ee97f68
--- /dev/null
+++ b/libc-top-half/musl/src/math/cos.c
@@ -0,0 +1,77 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_cos.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* cos(x)
+ * Return cosine function of x.
+ *
+ * kernel function:
+ * __sin ... sine function on [-pi/4,pi/4]
+ * __cos ... cosine function on [-pi/4,pi/4]
+ * __rem_pio2 ... argument reduction routine
+ *
+ * Method.
+ * Let S,C and T denote the sin, cos and tan respectively on
+ * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ * in [-pi/4 , +pi/4], and let n = k mod 4.
+ * We have
+ *
+ * n sin(x) cos(x) tan(x)
+ * ----------------------------------------------------------
+ * 0 S C T
+ * 1 C -S -1/T
+ * 2 -S -C T
+ * 3 -C S -1/T
+ * ----------------------------------------------------------
+ *
+ * Special cases:
+ * Let trig be any of sin, cos, or tan.
+ * trig(+-INF) is NaN, with signals;
+ * trig(NaN) is that NaN;
+ *
+ * Accuracy:
+ * TRIG(x) returns trig(x) nearly rounded
+ */
+
+#include "libm.h"
+
+double cos(double x)
+{
+ double y[2];
+ uint32_t ix;
+ unsigned n;
+
+ GET_HIGH_WORD(ix, x);
+ ix &= 0x7fffffff;
+
+ /* |x| ~< pi/4 */
+ if (ix <= 0x3fe921fb) {
+ if (ix < 0x3e46a09e) { /* |x| < 2**-27 * sqrt(2) */
+ /* raise inexact if x!=0 */
+ FORCE_EVAL(x + 0x1p120f);
+ return 1.0;
+ }
+ return __cos(x, 0);
+ }
+
+ /* cos(Inf or NaN) is NaN */
+ if (ix >= 0x7ff00000)
+ return x-x;
+
+ /* argument reduction */
+ n = __rem_pio2(x, y);
+ switch (n&3) {
+ case 0: return __cos(y[0], y[1]);
+ case 1: return -__sin(y[0], y[1], 1);
+ case 2: return -__cos(y[0], y[1]);
+ default:
+ return __sin(y[0], y[1], 1);
+ }
+}
diff --git a/libc-top-half/musl/src/math/cosf.c b/libc-top-half/musl/src/math/cosf.c
new file mode 100644
index 0000000..23f3e5b
--- /dev/null
+++ b/libc-top-half/musl/src/math/cosf.c
@@ -0,0 +1,78 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_cosf.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Optimized by Bruce D. Evans.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+/* Small multiples of pi/2 rounded to double precision. */
+static const double
+c1pio2 = 1*M_PI_2, /* 0x3FF921FB, 0x54442D18 */
+c2pio2 = 2*M_PI_2, /* 0x400921FB, 0x54442D18 */
+c3pio2 = 3*M_PI_2, /* 0x4012D97C, 0x7F3321D2 */
+c4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */
+
+float cosf(float x)
+{
+ double y;
+ uint32_t ix;
+ unsigned n, sign;
+
+ GET_FLOAT_WORD(ix, x);
+ sign = ix >> 31;
+ ix &= 0x7fffffff;
+
+ if (ix <= 0x3f490fda) { /* |x| ~<= pi/4 */
+ if (ix < 0x39800000) { /* |x| < 2**-12 */
+ /* raise inexact if x != 0 */
+ FORCE_EVAL(x + 0x1p120f);
+ return 1.0f;
+ }
+ return __cosdf(x);
+ }
+ if (ix <= 0x407b53d1) { /* |x| ~<= 5*pi/4 */
+ if (ix > 0x4016cbe3) /* |x| ~> 3*pi/4 */
+ return -__cosdf(sign ? x+c2pio2 : x-c2pio2);
+ else {
+ if (sign)
+ return __sindf(x + c1pio2);
+ else
+ return __sindf(c1pio2 - x);
+ }
+ }
+ if (ix <= 0x40e231d5) { /* |x| ~<= 9*pi/4 */
+ if (ix > 0x40afeddf) /* |x| ~> 7*pi/4 */
+ return __cosdf(sign ? x+c4pio2 : x-c4pio2);
+ else {
+ if (sign)
+ return __sindf(-x - c3pio2);
+ else
+ return __sindf(x - c3pio2);
+ }
+ }
+
+ /* cos(Inf or NaN) is NaN */
+ if (ix >= 0x7f800000)
+ return x-x;
+
+ /* general argument reduction needed */
+ n = __rem_pio2f(x,&y);
+ switch (n&3) {
+ case 0: return __cosdf(y);
+ case 1: return __sindf(-y);
+ case 2: return -__cosdf(y);
+ default:
+ return __sindf(y);
+ }
+}
diff --git a/libc-top-half/musl/src/math/cosh.c b/libc-top-half/musl/src/math/cosh.c
new file mode 100644
index 0000000..2cdf002
--- /dev/null
+++ b/libc-top-half/musl/src/math/cosh.c
@@ -0,0 +1,44 @@
+#include "libm.h"
+
+/* cosh(x) = (exp(x) + 1/exp(x))/2
+ * = 1 + 0.5*(exp(x)-1)*(exp(x)-1)/exp(x)
+ * = 1 + x*x/2 + o(x^4)
+ */
+double cosh(double x)
+{
+ union {double f; uint64_t i;} u = {.f = x};
+ uint32_t w;
+ double t;
+
+ /* |x| */
+ u.i &= (uint64_t)-1/2;
+ x = u.f;
+ w = u.i >> 32;
+
+ /* |x| < log(2) */
+ if (w < 0x3fe62e42) {
+ if (w < 0x3ff00000 - (26<<20)) {
+ /* raise inexact if x!=0 */
+ FORCE_EVAL(x + 0x1p120f);
+ return 1;
+ }
+ t = expm1(x);
+ return 1 + t*t/(2*(1+t));
+ }
+
+ /* |x| < log(DBL_MAX) */
+ if (w < 0x40862e42) {
+ t = exp(x);
+ /* note: if x>log(0x1p26) then the 1/t is not needed */
+ return 0.5*(t + 1/t);
+ }
+
+ /* |x| > log(DBL_MAX) or nan */
+ /* note: the result is stored to handle overflow */
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+ t = __expo2(x, 1.0);
+#else
+ t = __expo2(x);
+#endif
+ return t;
+}
diff --git a/libc-top-half/musl/src/math/coshf.c b/libc-top-half/musl/src/math/coshf.c
new file mode 100644
index 0000000..b946c0b
--- /dev/null
+++ b/libc-top-half/musl/src/math/coshf.c
@@ -0,0 +1,37 @@
+#include "libm.h"
+
+float coshf(float x)
+{
+ union {float f; uint32_t i;} u = {.f = x};
+ uint32_t w;
+ float t;
+
+ /* |x| */
+ u.i &= 0x7fffffff;
+ x = u.f;
+ w = u.i;
+
+ /* |x| < log(2) */
+ if (w < 0x3f317217) {
+ if (w < 0x3f800000 - (12<<23)) {
+ FORCE_EVAL(x + 0x1p120f);
+ return 1;
+ }
+ t = expm1f(x);
+ return 1 + t*t/(2*(1+t));
+ }
+
+ /* |x| < log(FLT_MAX) */
+ if (w < 0x42b17217) {
+ t = expf(x);
+ return 0.5f*(t + 1/t);
+ }
+
+ /* |x| > log(FLT_MAX) or nan */
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+ t = __expo2f(x, 1.0f);
+#else
+ t = __expo2f(x);
+#endif
+ return t;
+}
diff --git a/libc-top-half/musl/src/math/coshl.c b/libc-top-half/musl/src/math/coshl.c
new file mode 100644
index 0000000..06a56fe
--- /dev/null
+++ b/libc-top-half/musl/src/math/coshl.c
@@ -0,0 +1,47 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double coshl(long double x)
+{
+ return cosh(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+long double coshl(long double x)
+{
+ union ldshape u = {x};
+ unsigned ex = u.i.se & 0x7fff;
+ uint32_t w;
+ long double t;
+
+ /* |x| */
+ u.i.se = ex;
+ x = u.f;
+ w = u.i.m >> 32;
+
+ /* |x| < log(2) */
+ if (ex < 0x3fff-1 || (ex == 0x3fff-1 && w < 0xb17217f7)) {
+ if (ex < 0x3fff-32) {
+ FORCE_EVAL(x + 0x1p120f);
+ return 1;
+ }
+ t = expm1l(x);
+ return 1 + t*t/(2*(1+t));
+ }
+
+ /* |x| < log(LDBL_MAX) */
+ if (ex < 0x3fff+13 || (ex == 0x3fff+13 && w < 0xb17217f7)) {
+ t = expl(x);
+ return 0.5*(t + 1/t);
+ }
+
+ /* |x| > log(LDBL_MAX) or nan */
+ t = expl(0.5*x);
+ return 0.5*t*t;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double coshl(long double x)
+{
+ return cosh(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/cosl.c b/libc-top-half/musl/src/math/cosl.c
new file mode 100644
index 0000000..79c41c7
--- /dev/null
+++ b/libc-top-half/musl/src/math/cosl.c
@@ -0,0 +1,39 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double cosl(long double x) {
+ return cos(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+long double cosl(long double x)
+{
+ union ldshape u = {x};
+ unsigned n;
+ long double y[2], hi, lo;
+
+ u.i.se &= 0x7fff;
+ if (u.i.se == 0x7fff)
+ return x - x;
+ x = u.f;
+ if (x < M_PI_4) {
+ if (u.i.se < 0x3fff - LDBL_MANT_DIG)
+ /* raise inexact if x!=0 */
+ return 1.0 + x;
+ return __cosl(x, 0);
+ }
+ n = __rem_pio2l(x, y);
+ hi = y[0];
+ lo = y[1];
+ switch (n & 3) {
+ case 0:
+ return __cosl(hi, lo);
+ case 1:
+ return -__sinl(hi, lo, 1);
+ case 2:
+ return -__cosl(hi, lo);
+ case 3:
+ default:
+ return __sinl(hi, lo, 1);
+ }
+}
+#endif
diff --git a/libc-top-half/musl/src/math/erf.c b/libc-top-half/musl/src/math/erf.c
new file mode 100644
index 0000000..2f30a29
--- /dev/null
+++ b/libc-top-half/musl/src/math/erf.c
@@ -0,0 +1,273 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_erf.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* double erf(double x)
+ * double erfc(double x)
+ * x
+ * 2 |\
+ * erf(x) = --------- | exp(-t*t)dt
+ * sqrt(pi) \|
+ * 0
+ *
+ * erfc(x) = 1-erf(x)
+ * Note that
+ * erf(-x) = -erf(x)
+ * erfc(-x) = 2 - erfc(x)
+ *
+ * Method:
+ * 1. For |x| in [0, 0.84375]
+ * erf(x) = x + x*R(x^2)
+ * erfc(x) = 1 - erf(x) if x in [-.84375,0.25]
+ * = 0.5 + ((0.5-x)-x*R) if x in [0.25,0.84375]
+ * where R = P/Q where P is an odd poly of degree 8 and
+ * Q is an odd poly of degree 10.
+ * -57.90
+ * | R - (erf(x)-x)/x | <= 2
+ *
+ *
+ * Remark. The formula is derived by noting
+ * erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....)
+ * and that
+ * 2/sqrt(pi) = 1.128379167095512573896158903121545171688
+ * is close to one. The interval is chosen because the fix
+ * point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is
+ * near 0.6174), and by some experiment, 0.84375 is chosen to
+ * guarantee the error is less than one ulp for erf.
+ *
+ * 2. For |x| in [0.84375,1.25], let s = |x| - 1, and
+ * c = 0.84506291151 rounded to single (24 bits)
+ * erf(x) = sign(x) * (c + P1(s)/Q1(s))
+ * erfc(x) = (1-c) - P1(s)/Q1(s) if x > 0
+ * 1+(c+P1(s)/Q1(s)) if x < 0
+ * |P1/Q1 - (erf(|x|)-c)| <= 2**-59.06
+ * Remark: here we use the taylor series expansion at x=1.
+ * erf(1+s) = erf(1) + s*Poly(s)
+ * = 0.845.. + P1(s)/Q1(s)
+ * That is, we use rational approximation to approximate
+ * erf(1+s) - (c = (single)0.84506291151)
+ * Note that |P1/Q1|< 0.078 for x in [0.84375,1.25]
+ * where
+ * P1(s) = degree 6 poly in s
+ * Q1(s) = degree 6 poly in s
+ *
+ * 3. For x in [1.25,1/0.35(~2.857143)],
+ * erfc(x) = (1/x)*exp(-x*x-0.5625+R1/S1)
+ * erf(x) = 1 - erfc(x)
+ * where
+ * R1(z) = degree 7 poly in z, (z=1/x^2)
+ * S1(z) = degree 8 poly in z
+ *
+ * 4. For x in [1/0.35,28]
+ * erfc(x) = (1/x)*exp(-x*x-0.5625+R2/S2) if x > 0
+ * = 2.0 - (1/x)*exp(-x*x-0.5625+R2/S2) if -6<x<0
+ * = 2.0 - tiny (if x <= -6)
+ * erf(x) = sign(x)*(1.0 - erfc(x)) if x < 6, else
+ * erf(x) = sign(x)*(1.0 - tiny)
+ * where
+ * R2(z) = degree 6 poly in z, (z=1/x^2)
+ * S2(z) = degree 7 poly in z
+ *
+ * Note1:
+ * To compute exp(-x*x-0.5625+R/S), let s be a single
+ * precision number and s := x; then
+ * -x*x = -s*s + (s-x)*(s+x)
+ * exp(-x*x-0.5626+R/S) =
+ * exp(-s*s-0.5625)*exp((s-x)*(s+x)+R/S);
+ * Note2:
+ * Here 4 and 5 make use of the asymptotic series
+ * exp(-x*x)
+ * erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) )
+ * x*sqrt(pi)
+ * We use rational approximation to approximate
+ * g(s)=f(1/x^2) = log(erfc(x)*x) - x*x + 0.5625
+ * Here is the error bound for R1/S1 and R2/S2
+ * |R1/S1 - f(x)| < 2**(-62.57)
+ * |R2/S2 - f(x)| < 2**(-61.52)
+ *
+ * 5. For inf > x >= 28
+ * erf(x) = sign(x) *(1 - tiny) (raise inexact)
+ * erfc(x) = tiny*tiny (raise underflow) if x > 0
+ * = 2 - tiny if x<0
+ *
+ * 7. Special case:
+ * erf(0) = 0, erf(inf) = 1, erf(-inf) = -1,
+ * erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2,
+ * erfc/erf(NaN) is NaN
+ */
+
+#include "libm.h"
+
+static const double
+erx = 8.45062911510467529297e-01, /* 0x3FEB0AC1, 0x60000000 */
+/*
+ * Coefficients for approximation to erf on [0,0.84375]
+ */
+efx8 = 1.02703333676410069053e+00, /* 0x3FF06EBA, 0x8214DB69 */
+pp0 = 1.28379167095512558561e-01, /* 0x3FC06EBA, 0x8214DB68 */
+pp1 = -3.25042107247001499370e-01, /* 0xBFD4CD7D, 0x691CB913 */
+pp2 = -2.84817495755985104766e-02, /* 0xBF9D2A51, 0xDBD7194F */
+pp3 = -5.77027029648944159157e-03, /* 0xBF77A291, 0x236668E4 */
+pp4 = -2.37630166566501626084e-05, /* 0xBEF8EAD6, 0x120016AC */
+qq1 = 3.97917223959155352819e-01, /* 0x3FD97779, 0xCDDADC09 */
+qq2 = 6.50222499887672944485e-02, /* 0x3FB0A54C, 0x5536CEBA */
+qq3 = 5.08130628187576562776e-03, /* 0x3F74D022, 0xC4D36B0F */
+qq4 = 1.32494738004321644526e-04, /* 0x3F215DC9, 0x221C1A10 */
+qq5 = -3.96022827877536812320e-06, /* 0xBED09C43, 0x42A26120 */
+/*
+ * Coefficients for approximation to erf in [0.84375,1.25]
+ */
+pa0 = -2.36211856075265944077e-03, /* 0xBF6359B8, 0xBEF77538 */
+pa1 = 4.14856118683748331666e-01, /* 0x3FDA8D00, 0xAD92B34D */
+pa2 = -3.72207876035701323847e-01, /* 0xBFD7D240, 0xFBB8C3F1 */
+pa3 = 3.18346619901161753674e-01, /* 0x3FD45FCA, 0x805120E4 */
+pa4 = -1.10894694282396677476e-01, /* 0xBFBC6398, 0x3D3E28EC */
+pa5 = 3.54783043256182359371e-02, /* 0x3FA22A36, 0x599795EB */
+pa6 = -2.16637559486879084300e-03, /* 0xBF61BF38, 0x0A96073F */
+qa1 = 1.06420880400844228286e-01, /* 0x3FBB3E66, 0x18EEE323 */
+qa2 = 5.40397917702171048937e-01, /* 0x3FE14AF0, 0x92EB6F33 */
+qa3 = 7.18286544141962662868e-02, /* 0x3FB2635C, 0xD99FE9A7 */
+qa4 = 1.26171219808761642112e-01, /* 0x3FC02660, 0xE763351F */
+qa5 = 1.36370839120290507362e-02, /* 0x3F8BEDC2, 0x6B51DD1C */
+qa6 = 1.19844998467991074170e-02, /* 0x3F888B54, 0x5735151D */
+/*
+ * Coefficients for approximation to erfc in [1.25,1/0.35]
+ */
+ra0 = -9.86494403484714822705e-03, /* 0xBF843412, 0x600D6435 */
+ra1 = -6.93858572707181764372e-01, /* 0xBFE63416, 0xE4BA7360 */
+ra2 = -1.05586262253232909814e+01, /* 0xC0251E04, 0x41B0E726 */
+ra3 = -6.23753324503260060396e+01, /* 0xC04F300A, 0xE4CBA38D */
+ra4 = -1.62396669462573470355e+02, /* 0xC0644CB1, 0x84282266 */
+ra5 = -1.84605092906711035994e+02, /* 0xC067135C, 0xEBCCABB2 */
+ra6 = -8.12874355063065934246e+01, /* 0xC0545265, 0x57E4D2F2 */
+ra7 = -9.81432934416914548592e+00, /* 0xC023A0EF, 0xC69AC25C */
+sa1 = 1.96512716674392571292e+01, /* 0x4033A6B9, 0xBD707687 */
+sa2 = 1.37657754143519042600e+02, /* 0x4061350C, 0x526AE721 */
+sa3 = 4.34565877475229228821e+02, /* 0x407B290D, 0xD58A1A71 */
+sa4 = 6.45387271733267880336e+02, /* 0x40842B19, 0x21EC2868 */
+sa5 = 4.29008140027567833386e+02, /* 0x407AD021, 0x57700314 */
+sa6 = 1.08635005541779435134e+02, /* 0x405B28A3, 0xEE48AE2C */
+sa7 = 6.57024977031928170135e+00, /* 0x401A47EF, 0x8E484A93 */
+sa8 = -6.04244152148580987438e-02, /* 0xBFAEEFF2, 0xEE749A62 */
+/*
+ * Coefficients for approximation to erfc in [1/.35,28]
+ */
+rb0 = -9.86494292470009928597e-03, /* 0xBF843412, 0x39E86F4A */
+rb1 = -7.99283237680523006574e-01, /* 0xBFE993BA, 0x70C285DE */
+rb2 = -1.77579549177547519889e+01, /* 0xC031C209, 0x555F995A */
+rb3 = -1.60636384855821916062e+02, /* 0xC064145D, 0x43C5ED98 */
+rb4 = -6.37566443368389627722e+02, /* 0xC083EC88, 0x1375F228 */
+rb5 = -1.02509513161107724954e+03, /* 0xC0900461, 0x6A2E5992 */
+rb6 = -4.83519191608651397019e+02, /* 0xC07E384E, 0x9BDC383F */
+sb1 = 3.03380607434824582924e+01, /* 0x403E568B, 0x261D5190 */
+sb2 = 3.25792512996573918826e+02, /* 0x40745CAE, 0x221B9F0A */
+sb3 = 1.53672958608443695994e+03, /* 0x409802EB, 0x189D5118 */
+sb4 = 3.19985821950859553908e+03, /* 0x40A8FFB7, 0x688C246A */
+sb5 = 2.55305040643316442583e+03, /* 0x40A3F219, 0xCEDF3BE6 */
+sb6 = 4.74528541206955367215e+02, /* 0x407DA874, 0xE79FE763 */
+sb7 = -2.24409524465858183362e+01; /* 0xC03670E2, 0x42712D62 */
+
+static double erfc1(double x)
+{
+ double_t s,P,Q;
+
+ s = fabs(x) - 1;
+ P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+ Q = 1+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+ return 1 - erx - P/Q;
+}
+
+static double erfc2(uint32_t ix, double x)
+{
+ double_t s,R,S;
+ double z;
+
+ if (ix < 0x3ff40000) /* |x| < 1.25 */
+ return erfc1(x);
+
+ x = fabs(x);
+ s = 1/(x*x);
+ if (ix < 0x4006db6d) { /* |x| < 1/.35 ~ 2.85714 */
+ R = ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
+ ra5+s*(ra6+s*ra7))))));
+ S = 1.0+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
+ sa5+s*(sa6+s*(sa7+s*sa8)))))));
+ } else { /* |x| > 1/.35 */
+ R = rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
+ rb5+s*rb6)))));
+ S = 1.0+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
+ sb5+s*(sb6+s*sb7))))));
+ }
+ z = x;
+ SET_LOW_WORD(z,0);
+ return exp(-z*z-0.5625)*exp((z-x)*(z+x)+R/S)/x;
+}
+
+double erf(double x)
+{
+ double r,s,z,y;
+ uint32_t ix;
+ int sign;
+
+ GET_HIGH_WORD(ix, x);
+ sign = ix>>31;
+ ix &= 0x7fffffff;
+ if (ix >= 0x7ff00000) {
+ /* erf(nan)=nan, erf(+-inf)=+-1 */
+ return 1-2*sign + 1/x;
+ }
+ if (ix < 0x3feb0000) { /* |x| < 0.84375 */
+ if (ix < 0x3e300000) { /* |x| < 2**-28 */
+ /* avoid underflow */
+ return 0.125*(8*x + efx8*x);
+ }
+ z = x*x;
+ r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+ s = 1.0+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+ y = r/s;
+ return x + x*y;
+ }
+ if (ix < 0x40180000) /* 0.84375 <= |x| < 6 */
+ y = 1 - erfc2(ix,x);
+ else
+ y = 1 - 0x1p-1022;
+ return sign ? -y : y;
+}
+
+double erfc(double x)
+{
+ double r,s,z,y;
+ uint32_t ix;
+ int sign;
+
+ GET_HIGH_WORD(ix, x);
+ sign = ix>>31;
+ ix &= 0x7fffffff;
+ if (ix >= 0x7ff00000) {
+ /* erfc(nan)=nan, erfc(+-inf)=0,2 */
+ return 2*sign + 1/x;
+ }
+ if (ix < 0x3feb0000) { /* |x| < 0.84375 */
+ if (ix < 0x3c700000) /* |x| < 2**-56 */
+ return 1.0 - x;
+ z = x*x;
+ r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+ s = 1.0+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+ y = r/s;
+ if (sign || ix < 0x3fd00000) { /* x < 1/4 */
+ return 1.0 - (x+x*y);
+ }
+ return 0.5 - (x - 0.5 + x*y);
+ }
+ if (ix < 0x403c0000) { /* 0.84375 <= |x| < 28 */
+ return sign ? 2 - erfc2(ix,x) : erfc2(ix,x);
+ }
+ return sign ? 2 - 0x1p-1022 : 0x1p-1022*0x1p-1022;
+}
diff --git a/libc-top-half/musl/src/math/erff.c b/libc-top-half/musl/src/math/erff.c
new file mode 100644
index 0000000..ed5f397
--- /dev/null
+++ b/libc-top-half/musl/src/math/erff.c
@@ -0,0 +1,183 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_erff.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+static const float
+erx = 8.4506291151e-01, /* 0x3f58560b */
+/*
+ * Coefficients for approximation to erf on [0,0.84375]
+ */
+efx8 = 1.0270333290e+00, /* 0x3f8375d4 */
+pp0 = 1.2837916613e-01, /* 0x3e0375d4 */
+pp1 = -3.2504209876e-01, /* 0xbea66beb */
+pp2 = -2.8481749818e-02, /* 0xbce9528f */
+pp3 = -5.7702702470e-03, /* 0xbbbd1489 */
+pp4 = -2.3763017452e-05, /* 0xb7c756b1 */
+qq1 = 3.9791721106e-01, /* 0x3ecbbbce */
+qq2 = 6.5022252500e-02, /* 0x3d852a63 */
+qq3 = 5.0813062117e-03, /* 0x3ba68116 */
+qq4 = 1.3249473704e-04, /* 0x390aee49 */
+qq5 = -3.9602282413e-06, /* 0xb684e21a */
+/*
+ * Coefficients for approximation to erf in [0.84375,1.25]
+ */
+pa0 = -2.3621185683e-03, /* 0xbb1acdc6 */
+pa1 = 4.1485610604e-01, /* 0x3ed46805 */
+pa2 = -3.7220788002e-01, /* 0xbebe9208 */
+pa3 = 3.1834661961e-01, /* 0x3ea2fe54 */
+pa4 = -1.1089469492e-01, /* 0xbde31cc2 */
+pa5 = 3.5478305072e-02, /* 0x3d1151b3 */
+pa6 = -2.1663755178e-03, /* 0xbb0df9c0 */
+qa1 = 1.0642088205e-01, /* 0x3dd9f331 */
+qa2 = 5.4039794207e-01, /* 0x3f0a5785 */
+qa3 = 7.1828655899e-02, /* 0x3d931ae7 */
+qa4 = 1.2617121637e-01, /* 0x3e013307 */
+qa5 = 1.3637083583e-02, /* 0x3c5f6e13 */
+qa6 = 1.1984500103e-02, /* 0x3c445aa3 */
+/*
+ * Coefficients for approximation to erfc in [1.25,1/0.35]
+ */
+ra0 = -9.8649440333e-03, /* 0xbc21a093 */
+ra1 = -6.9385856390e-01, /* 0xbf31a0b7 */
+ra2 = -1.0558626175e+01, /* 0xc128f022 */
+ra3 = -6.2375331879e+01, /* 0xc2798057 */
+ra4 = -1.6239666748e+02, /* 0xc322658c */
+ra5 = -1.8460508728e+02, /* 0xc3389ae7 */
+ra6 = -8.1287437439e+01, /* 0xc2a2932b */
+ra7 = -9.8143291473e+00, /* 0xc11d077e */
+sa1 = 1.9651271820e+01, /* 0x419d35ce */
+sa2 = 1.3765776062e+02, /* 0x4309a863 */
+sa3 = 4.3456588745e+02, /* 0x43d9486f */
+sa4 = 6.4538726807e+02, /* 0x442158c9 */
+sa5 = 4.2900814819e+02, /* 0x43d6810b */
+sa6 = 1.0863500214e+02, /* 0x42d9451f */
+sa7 = 6.5702495575e+00, /* 0x40d23f7c */
+sa8 = -6.0424413532e-02, /* 0xbd777f97 */
+/*
+ * Coefficients for approximation to erfc in [1/.35,28]
+ */
+rb0 = -9.8649431020e-03, /* 0xbc21a092 */
+rb1 = -7.9928326607e-01, /* 0xbf4c9dd4 */
+rb2 = -1.7757955551e+01, /* 0xc18e104b */
+rb3 = -1.6063638306e+02, /* 0xc320a2ea */
+rb4 = -6.3756646729e+02, /* 0xc41f6441 */
+rb5 = -1.0250950928e+03, /* 0xc480230b */
+rb6 = -4.8351919556e+02, /* 0xc3f1c275 */
+sb1 = 3.0338060379e+01, /* 0x41f2b459 */
+sb2 = 3.2579251099e+02, /* 0x43a2e571 */
+sb3 = 1.5367296143e+03, /* 0x44c01759 */
+sb4 = 3.1998581543e+03, /* 0x4547fdbb */
+sb5 = 2.5530502930e+03, /* 0x451f90ce */
+sb6 = 4.7452853394e+02, /* 0x43ed43a7 */
+sb7 = -2.2440952301e+01; /* 0xc1b38712 */
+
+static float erfc1(float x)
+{
+ float_t s,P,Q;
+
+ s = fabsf(x) - 1;
+ P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+ Q = 1+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+ return 1 - erx - P/Q;
+}
+
+static float erfc2(uint32_t ix, float x)
+{
+ float_t s,R,S;
+ float z;
+
+ if (ix < 0x3fa00000) /* |x| < 1.25 */
+ return erfc1(x);
+
+ x = fabsf(x);
+ s = 1/(x*x);
+ if (ix < 0x4036db6d) { /* |x| < 1/0.35 */
+ R = ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
+ ra5+s*(ra6+s*ra7))))));
+ S = 1.0f+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
+ sa5+s*(sa6+s*(sa7+s*sa8)))))));
+ } else { /* |x| >= 1/0.35 */
+ R = rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
+ rb5+s*rb6)))));
+ S = 1.0f+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
+ sb5+s*(sb6+s*sb7))))));
+ }
+ GET_FLOAT_WORD(ix, x);
+ SET_FLOAT_WORD(z, ix&0xffffe000);
+ return expf(-z*z - 0.5625f) * expf((z-x)*(z+x) + R/S)/x;
+}
+
+float erff(float x)
+{
+ float r,s,z,y;
+ uint32_t ix;
+ int sign;
+
+ GET_FLOAT_WORD(ix, x);
+ sign = ix>>31;
+ ix &= 0x7fffffff;
+ if (ix >= 0x7f800000) {
+ /* erf(nan)=nan, erf(+-inf)=+-1 */
+ return 1-2*sign + 1/x;
+ }
+ if (ix < 0x3f580000) { /* |x| < 0.84375 */
+ if (ix < 0x31800000) { /* |x| < 2**-28 */
+ /*avoid underflow */
+ return 0.125f*(8*x + efx8*x);
+ }
+ z = x*x;
+ r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+ s = 1+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+ y = r/s;
+ return x + x*y;
+ }
+ if (ix < 0x40c00000) /* |x| < 6 */
+ y = 1 - erfc2(ix,x);
+ else
+ y = 1 - 0x1p-120f;
+ return sign ? -y : y;
+}
+
+float erfcf(float x)
+{
+ float r,s,z,y;
+ uint32_t ix;
+ int sign;
+
+ GET_FLOAT_WORD(ix, x);
+ sign = ix>>31;
+ ix &= 0x7fffffff;
+ if (ix >= 0x7f800000) {
+ /* erfc(nan)=nan, erfc(+-inf)=0,2 */
+ return 2*sign + 1/x;
+ }
+
+ if (ix < 0x3f580000) { /* |x| < 0.84375 */
+ if (ix < 0x23800000) /* |x| < 2**-56 */
+ return 1.0f - x;
+ z = x*x;
+ r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+ s = 1.0f+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+ y = r/s;
+ if (sign || ix < 0x3e800000) /* x < 1/4 */
+ return 1.0f - (x+x*y);
+ return 0.5f - (x - 0.5f + x*y);
+ }
+ if (ix < 0x41e00000) { /* |x| < 28 */
+ return sign ? 2 - erfc2(ix,x) : erfc2(ix,x);
+ }
+ return sign ? 2 - 0x1p-120f : 0x1p-120f*0x1p-120f;
+}
diff --git a/libc-top-half/musl/src/math/erfl.c b/libc-top-half/musl/src/math/erfl.c
new file mode 100644
index 0000000..e267c23
--- /dev/null
+++ b/libc-top-half/musl/src/math/erfl.c
@@ -0,0 +1,353 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_erfl.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/* double erf(double x)
+ * double erfc(double x)
+ * x
+ * 2 |\
+ * erf(x) = --------- | exp(-t*t)dt
+ * sqrt(pi) \|
+ * 0
+ *
+ * erfc(x) = 1-erf(x)
+ * Note that
+ * erf(-x) = -erf(x)
+ * erfc(-x) = 2 - erfc(x)
+ *
+ * Method:
+ * 1. For |x| in [0, 0.84375]
+ * erf(x) = x + x*R(x^2)
+ * erfc(x) = 1 - erf(x) if x in [-.84375,0.25]
+ * = 0.5 + ((0.5-x)-x*R) if x in [0.25,0.84375]
+ * Remark. The formula is derived by noting
+ * erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....)
+ * and that
+ * 2/sqrt(pi) = 1.128379167095512573896158903121545171688
+ * is close to one. The interval is chosen because the fix
+ * point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is
+ * near 0.6174), and by some experiment, 0.84375 is chosen to
+ * guarantee the error is less than one ulp for erf.
+ *
+ * 2. For |x| in [0.84375,1.25], let s = |x| - 1, and
+ * c = 0.84506291151 rounded to single (24 bits)
+ * erf(x) = sign(x) * (c + P1(s)/Q1(s))
+ * erfc(x) = (1-c) - P1(s)/Q1(s) if x > 0
+ * 1+(c+P1(s)/Q1(s)) if x < 0
+ * Remark: here we use the taylor series expansion at x=1.
+ * erf(1+s) = erf(1) + s*Poly(s)
+ * = 0.845.. + P1(s)/Q1(s)
+ * Note that |P1/Q1|< 0.078 for x in [0.84375,1.25]
+ *
+ * 3. For x in [1.25,1/0.35(~2.857143)],
+ * erfc(x) = (1/x)*exp(-x*x-0.5625+R1(z)/S1(z))
+ * z=1/x^2
+ * erf(x) = 1 - erfc(x)
+ *
+ * 4. For x in [1/0.35,107]
+ * erfc(x) = (1/x)*exp(-x*x-0.5625+R2/S2) if x > 0
+ * = 2.0 - (1/x)*exp(-x*x-0.5625+R2(z)/S2(z))
+ * if -6.666<x<0
+ * = 2.0 - tiny (if x <= -6.666)
+ * z=1/x^2
+ * erf(x) = sign(x)*(1.0 - erfc(x)) if x < 6.666, else
+ * erf(x) = sign(x)*(1.0 - tiny)
+ * Note1:
+ * To compute exp(-x*x-0.5625+R/S), let s be a single
+ * precision number and s := x; then
+ * -x*x = -s*s + (s-x)*(s+x)
+ * exp(-x*x-0.5626+R/S) =
+ * exp(-s*s-0.5625)*exp((s-x)*(s+x)+R/S);
+ * Note2:
+ * Here 4 and 5 make use of the asymptotic series
+ * exp(-x*x)
+ * erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) )
+ * x*sqrt(pi)
+ *
+ * 5. For inf > x >= 107
+ * erf(x) = sign(x) *(1 - tiny) (raise inexact)
+ * erfc(x) = tiny*tiny (raise underflow) if x > 0
+ * = 2 - tiny if x<0
+ *
+ * 7. Special case:
+ * erf(0) = 0, erf(inf) = 1, erf(-inf) = -1,
+ * erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2,
+ * erfc/erf(NaN) is NaN
+ */
+
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double erfl(long double x)
+{
+ return erf(x);
+}
+long double erfcl(long double x)
+{
+ return erfc(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+static const long double
+erx = 0.845062911510467529296875L,
+
+/*
+ * Coefficients for approximation to erf on [0,0.84375]
+ */
+/* 8 * (2/sqrt(pi) - 1) */
+efx8 = 1.0270333367641005911692712249723613735048E0L,
+pp[6] = {
+ 1.122751350964552113068262337278335028553E6L,
+ -2.808533301997696164408397079650699163276E6L,
+ -3.314325479115357458197119660818768924100E5L,
+ -6.848684465326256109712135497895525446398E4L,
+ -2.657817695110739185591505062971929859314E3L,
+ -1.655310302737837556654146291646499062882E2L,
+},
+qq[6] = {
+ 8.745588372054466262548908189000448124232E6L,
+ 3.746038264792471129367533128637019611485E6L,
+ 7.066358783162407559861156173539693900031E5L,
+ 7.448928604824620999413120955705448117056E4L,
+ 4.511583986730994111992253980546131408924E3L,
+ 1.368902937933296323345610240009071254014E2L,
+ /* 1.000000000000000000000000000000000000000E0 */
+},
+
+/*
+ * Coefficients for approximation to erf in [0.84375,1.25]
+ */
+/* erf(x+1) = 0.845062911510467529296875 + pa(x)/qa(x)
+ -0.15625 <= x <= +.25
+ Peak relative error 8.5e-22 */
+pa[8] = {
+ -1.076952146179812072156734957705102256059E0L,
+ 1.884814957770385593365179835059971587220E2L,
+ -5.339153975012804282890066622962070115606E1L,
+ 4.435910679869176625928504532109635632618E1L,
+ 1.683219516032328828278557309642929135179E1L,
+ -2.360236618396952560064259585299045804293E0L,
+ 1.852230047861891953244413872297940938041E0L,
+ 9.394994446747752308256773044667843200719E-2L,
+},
+qa[7] = {
+ 4.559263722294508998149925774781887811255E2L,
+ 3.289248982200800575749795055149780689738E2L,
+ 2.846070965875643009598627918383314457912E2L,
+ 1.398715859064535039433275722017479994465E2L,
+ 6.060190733759793706299079050985358190726E1L,
+ 2.078695677795422351040502569964299664233E1L,
+ 4.641271134150895940966798357442234498546E0L,
+ /* 1.000000000000000000000000000000000000000E0 */
+},
+
+/*
+ * Coefficients for approximation to erfc in [1.25,1/0.35]
+ */
+/* erfc(1/x) = x exp (-1/x^2 - 0.5625 + ra(x^2)/sa(x^2))
+ 1/2.85711669921875 < 1/x < 1/1.25
+ Peak relative error 3.1e-21 */
+ra[] = {
+ 1.363566591833846324191000679620738857234E-1L,
+ 1.018203167219873573808450274314658434507E1L,
+ 1.862359362334248675526472871224778045594E2L,
+ 1.411622588180721285284945138667933330348E3L,
+ 5.088538459741511988784440103218342840478E3L,
+ 8.928251553922176506858267311750789273656E3L,
+ 7.264436000148052545243018622742770549982E3L,
+ 2.387492459664548651671894725748959751119E3L,
+ 2.220916652813908085449221282808458466556E2L,
+},
+sa[] = {
+ -1.382234625202480685182526402169222331847E1L,
+ -3.315638835627950255832519203687435946482E2L,
+ -2.949124863912936259747237164260785326692E3L,
+ -1.246622099070875940506391433635999693661E4L,
+ -2.673079795851665428695842853070996219632E4L,
+ -2.880269786660559337358397106518918220991E4L,
+ -1.450600228493968044773354186390390823713E4L,
+ -2.874539731125893533960680525192064277816E3L,
+ -1.402241261419067750237395034116942296027E2L,
+ /* 1.000000000000000000000000000000000000000E0 */
+},
+
+/*
+ * Coefficients for approximation to erfc in [1/.35,107]
+ */
+/* erfc(1/x) = x exp (-1/x^2 - 0.5625 + rb(x^2)/sb(x^2))
+ 1/6.6666259765625 < 1/x < 1/2.85711669921875
+ Peak relative error 4.2e-22 */
+rb[] = {
+ -4.869587348270494309550558460786501252369E-5L,
+ -4.030199390527997378549161722412466959403E-3L,
+ -9.434425866377037610206443566288917589122E-2L,
+ -9.319032754357658601200655161585539404155E-1L,
+ -4.273788174307459947350256581445442062291E0L,
+ -8.842289940696150508373541814064198259278E0L,
+ -7.069215249419887403187988144752613025255E0L,
+ -1.401228723639514787920274427443330704764E0L,
+},
+sb[] = {
+ 4.936254964107175160157544545879293019085E-3L,
+ 1.583457624037795744377163924895349412015E-1L,
+ 1.850647991850328356622940552450636420484E0L,
+ 9.927611557279019463768050710008450625415E0L,
+ 2.531667257649436709617165336779212114570E1L,
+ 2.869752886406743386458304052862814690045E1L,
+ 1.182059497870819562441683560749192539345E1L,
+ /* 1.000000000000000000000000000000000000000E0 */
+},
+/* erfc(1/x) = x exp (-1/x^2 - 0.5625 + rc(x^2)/sc(x^2))
+ 1/107 <= 1/x <= 1/6.6666259765625
+ Peak relative error 1.1e-21 */
+rc[] = {
+ -8.299617545269701963973537248996670806850E-5L,
+ -6.243845685115818513578933902532056244108E-3L,
+ -1.141667210620380223113693474478394397230E-1L,
+ -7.521343797212024245375240432734425789409E-1L,
+ -1.765321928311155824664963633786967602934E0L,
+ -1.029403473103215800456761180695263439188E0L,
+},
+sc[] = {
+ 8.413244363014929493035952542677768808601E-3L,
+ 2.065114333816877479753334599639158060979E-1L,
+ 1.639064941530797583766364412782135680148E0L,
+ 4.936788463787115555582319302981666347450E0L,
+ 5.005177727208955487404729933261347679090E0L,
+ /* 1.000000000000000000000000000000000000000E0 */
+};
+
+static long double erfc1(long double x)
+{
+ long double s,P,Q;
+
+ s = fabsl(x) - 1;
+ P = pa[0] + s * (pa[1] + s * (pa[2] +
+ s * (pa[3] + s * (pa[4] + s * (pa[5] + s * (pa[6] + s * pa[7]))))));
+ Q = qa[0] + s * (qa[1] + s * (qa[2] +
+ s * (qa[3] + s * (qa[4] + s * (qa[5] + s * (qa[6] + s))))));
+ return 1 - erx - P / Q;
+}
+
+static long double erfc2(uint32_t ix, long double x)
+{
+ union ldshape u;
+ long double s,z,R,S;
+
+ if (ix < 0x3fffa000) /* 0.84375 <= |x| < 1.25 */
+ return erfc1(x);
+
+ x = fabsl(x);
+ s = 1 / (x * x);
+ if (ix < 0x4000b6db) { /* 1.25 <= |x| < 2.857 ~ 1/.35 */
+ R = ra[0] + s * (ra[1] + s * (ra[2] + s * (ra[3] + s * (ra[4] +
+ s * (ra[5] + s * (ra[6] + s * (ra[7] + s * ra[8])))))));
+ S = sa[0] + s * (sa[1] + s * (sa[2] + s * (sa[3] + s * (sa[4] +
+ s * (sa[5] + s * (sa[6] + s * (sa[7] + s * (sa[8] + s))))))));
+ } else if (ix < 0x4001d555) { /* 2.857 <= |x| < 6.6666259765625 */
+ R = rb[0] + s * (rb[1] + s * (rb[2] + s * (rb[3] + s * (rb[4] +
+ s * (rb[5] + s * (rb[6] + s * rb[7]))))));
+ S = sb[0] + s * (sb[1] + s * (sb[2] + s * (sb[3] + s * (sb[4] +
+ s * (sb[5] + s * (sb[6] + s))))));
+ } else { /* 6.666 <= |x| < 107 (erfc only) */
+ R = rc[0] + s * (rc[1] + s * (rc[2] + s * (rc[3] +
+ s * (rc[4] + s * rc[5]))));
+ S = sc[0] + s * (sc[1] + s * (sc[2] + s * (sc[3] +
+ s * (sc[4] + s))));
+ }
+ u.f = x;
+ u.i.m &= -1ULL << 40;
+ z = u.f;
+ return expl(-z*z - 0.5625) * expl((z - x) * (z + x) + R / S) / x;
+}
+
+long double erfl(long double x)
+{
+ long double r, s, z, y;
+ union ldshape u = {x};
+ uint32_t ix = (u.i.se & 0x7fffU)<<16 | u.i.m>>48;
+ int sign = u.i.se >> 15;
+
+ if (ix >= 0x7fff0000)
+ /* erf(nan)=nan, erf(+-inf)=+-1 */
+ return 1 - 2*sign + 1/x;
+ if (ix < 0x3ffed800) { /* |x| < 0.84375 */
+ if (ix < 0x3fde8000) { /* |x| < 2**-33 */
+ return 0.125 * (8 * x + efx8 * x); /* avoid underflow */
+ }
+ z = x * x;
+ r = pp[0] + z * (pp[1] +
+ z * (pp[2] + z * (pp[3] + z * (pp[4] + z * pp[5]))));
+ s = qq[0] + z * (qq[1] +
+ z * (qq[2] + z * (qq[3] + z * (qq[4] + z * (qq[5] + z)))));
+ y = r / s;
+ return x + x * y;
+ }
+ if (ix < 0x4001d555) /* |x| < 6.6666259765625 */
+ y = 1 - erfc2(ix,x);
+ else
+ y = 1 - 0x1p-16382L;
+ return sign ? -y : y;
+}
+
+long double erfcl(long double x)
+{
+ long double r, s, z, y;
+ union ldshape u = {x};
+ uint32_t ix = (u.i.se & 0x7fffU)<<16 | u.i.m>>48;
+ int sign = u.i.se >> 15;
+
+ if (ix >= 0x7fff0000)
+ /* erfc(nan) = nan, erfc(+-inf) = 0,2 */
+ return 2*sign + 1/x;
+ if (ix < 0x3ffed800) { /* |x| < 0.84375 */
+ if (ix < 0x3fbe0000) /* |x| < 2**-65 */
+ return 1.0 - x;
+ z = x * x;
+ r = pp[0] + z * (pp[1] +
+ z * (pp[2] + z * (pp[3] + z * (pp[4] + z * pp[5]))));
+ s = qq[0] + z * (qq[1] +
+ z * (qq[2] + z * (qq[3] + z * (qq[4] + z * (qq[5] + z)))));
+ y = r / s;
+ if (ix < 0x3ffd8000) /* x < 1/4 */
+ return 1.0 - (x + x * y);
+ return 0.5 - (x - 0.5 + x * y);
+ }
+ if (ix < 0x4005d600) /* |x| < 107 */
+ return sign ? 2 - erfc2(ix,x) : erfc2(ix,x);
+ y = 0x1p-16382L;
+ return sign ? 2 - y : y*y;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double erfl(long double x)
+{
+ return erf(x);
+}
+long double erfcl(long double x)
+{
+ return erfc(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/exp.c b/libc-top-half/musl/src/math/exp.c
new file mode 100644
index 0000000..b764d73
--- /dev/null
+++ b/libc-top-half/musl/src/math/exp.c
@@ -0,0 +1,134 @@
+/*
+ * Double-precision e^x function.
+ *
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <math.h>
+#include <stdint.h>
+#include "libm.h"
+#include "exp_data.h"
+
+#define N (1 << EXP_TABLE_BITS)
+#define InvLn2N __exp_data.invln2N
+#define NegLn2hiN __exp_data.negln2hiN
+#define NegLn2loN __exp_data.negln2loN
+#define Shift __exp_data.shift
+#define T __exp_data.tab
+#define C2 __exp_data.poly[5 - EXP_POLY_ORDER]
+#define C3 __exp_data.poly[6 - EXP_POLY_ORDER]
+#define C4 __exp_data.poly[7 - EXP_POLY_ORDER]
+#define C5 __exp_data.poly[8 - EXP_POLY_ORDER]
+
+/* Handle cases that may overflow or underflow when computing the result that
+ is scale*(1+TMP) without intermediate rounding. The bit representation of
+ scale is in SBITS, however it has a computed exponent that may have
+ overflown into the sign bit so that needs to be adjusted before using it as
+ a double. (int32_t)KI is the k used in the argument reduction and exponent
+ adjustment of scale, positive k here means the result may overflow and
+ negative k means the result may underflow. */
+static inline double specialcase(double_t tmp, uint64_t sbits, uint64_t ki)
+{
+ double_t scale, y;
+
+ if ((ki & 0x80000000) == 0) {
+ /* k > 0, the exponent of scale might have overflowed by <= 460. */
+ sbits -= 1009ull << 52;
+ scale = asdouble(sbits);
+ y = 0x1p1009 * (scale + scale * tmp);
+ return eval_as_double(y);
+ }
+ /* k < 0, need special care in the subnormal range. */
+ sbits += 1022ull << 52;
+ scale = asdouble(sbits);
+ y = scale + scale * tmp;
+ if (y < 1.0) {
+ /* Round y to the right precision before scaling it into the subnormal
+ range to avoid double rounding that can cause 0.5+E/2 ulp error where
+ E is the worst-case ulp error outside the subnormal range. So this
+ is only useful if the goal is better than 1 ulp worst-case error. */
+ double_t hi, lo;
+ lo = scale - y + scale * tmp;
+ hi = 1.0 + y;
+ lo = 1.0 - hi + y + lo;
+ y = eval_as_double(hi + lo) - 1.0;
+ /* Avoid -0.0 with downward rounding. */
+ if (WANT_ROUNDING && y == 0.0)
+ y = 0.0;
+ /* The underflow exception needs to be signaled explicitly. */
+ fp_force_eval(fp_barrier(0x1p-1022) * 0x1p-1022);
+ }
+ y = 0x1p-1022 * y;
+ return eval_as_double(y);
+}
+
+/* Top 12 bits of a double (sign and exponent bits). */
+static inline uint32_t top12(double x)
+{
+ return asuint64(x) >> 52;
+}
+
+double exp(double x)
+{
+ uint32_t abstop;
+ uint64_t ki, idx, top, sbits;
+ double_t kd, z, r, r2, scale, tail, tmp;
+
+ abstop = top12(x) & 0x7ff;
+ if (predict_false(abstop - top12(0x1p-54) >= top12(512.0) - top12(0x1p-54))) {
+ if (abstop - top12(0x1p-54) >= 0x80000000)
+ /* Avoid spurious underflow for tiny x. */
+ /* Note: 0 is common input. */
+ return WANT_ROUNDING ? 1.0 + x : 1.0;
+ if (abstop >= top12(1024.0)) {
+ if (asuint64(x) == asuint64(-INFINITY))
+ return 0.0;
+ if (abstop >= top12(INFINITY))
+ return 1.0 + x;
+ if (asuint64(x) >> 63)
+ return __math_uflow(0);
+ else
+ return __math_oflow(0);
+ }
+ /* Large x is special cased below. */
+ abstop = 0;
+ }
+
+ /* exp(x) = 2^(k/N) * exp(r), with exp(r) in [2^(-1/2N),2^(1/2N)]. */
+ /* x = ln2/N*k + r, with int k and r in [-ln2/2N, ln2/2N]. */
+ z = InvLn2N * x;
+#if TOINT_INTRINSICS
+ kd = roundtoint(z);
+ ki = converttoint(z);
+#elif EXP_USE_TOINT_NARROW
+ /* z - kd is in [-0.5-2^-16, 0.5] in all rounding modes. */
+ kd = eval_as_double(z + Shift);
+ ki = asuint64(kd) >> 16;
+ kd = (double_t)(int32_t)ki;
+#else
+ /* z - kd is in [-1, 1] in non-nearest rounding modes. */
+ kd = eval_as_double(z + Shift);
+ ki = asuint64(kd);
+ kd -= Shift;
+#endif
+ r = x + kd * NegLn2hiN + kd * NegLn2loN;
+ /* 2^(k/N) ~= scale * (1 + tail). */
+ idx = 2 * (ki % N);
+ top = ki << (52 - EXP_TABLE_BITS);
+ tail = asdouble(T[idx]);
+ /* This is only a valid scale when -1023*N < k < 1024*N. */
+ sbits = T[idx + 1] + top;
+ /* exp(x) = 2^(k/N) * exp(r) ~= scale + scale * (tail + exp(r) - 1). */
+ /* Evaluation is optimized assuming superscalar pipelined execution. */
+ r2 = r * r;
+ /* Without fma the worst case error is 0.25/N ulp larger. */
+ /* Worst case error is less than 0.5+1.11/N+(abs poly error * 2^53) ulp. */
+ tmp = tail + r + r2 * (C2 + r * C3) + r2 * r2 * (C4 + r * C5);
+ if (predict_false(abstop == 0))
+ return specialcase(tmp, sbits, ki);
+ scale = asdouble(sbits);
+ /* Note: tmp == 0 or |tmp| > 2^-200 and scale > 2^-739, so there
+ is no spurious underflow here even without fma. */
+ return eval_as_double(scale + scale * tmp);
+}
diff --git a/libc-top-half/musl/src/math/exp10.c b/libc-top-half/musl/src/math/exp10.c
new file mode 100644
index 0000000..26899eb
--- /dev/null
+++ b/libc-top-half/musl/src/math/exp10.c
@@ -0,0 +1,24 @@
+#define _GNU_SOURCE
+#include <math.h>
+#include <stdint.h>
+
+double exp10(double x)
+{
+ static const double p10[] = {
+ 1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10,
+ 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1,
+ 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
+ 1e10, 1e11, 1e12, 1e13, 1e14, 1e15
+ };
+ double n, y = modf(x, &n);
+ union {double f; uint64_t i;} u = {n};
+ /* fabs(n) < 16 without raising invalid on nan */
+ if ((u.i>>52 & 0x7ff) < 0x3ff+4) {
+ if (!y) return p10[(int)n+15];
+ y = exp2(3.32192809488736234787031942948939 * y);
+ return y * p10[(int)n+15];
+ }
+ return pow(10.0, x);
+}
+
+weak_alias(exp10, pow10);
diff --git a/libc-top-half/musl/src/math/exp10f.c b/libc-top-half/musl/src/math/exp10f.c
new file mode 100644
index 0000000..d009f0a
--- /dev/null
+++ b/libc-top-half/musl/src/math/exp10f.c
@@ -0,0 +1,22 @@
+#define _GNU_SOURCE
+#include <math.h>
+#include <stdint.h>
+
+float exp10f(float x)
+{
+ static const float p10[] = {
+ 1e-7f, 1e-6f, 1e-5f, 1e-4f, 1e-3f, 1e-2f, 1e-1f,
+ 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7
+ };
+ float n, y = modff(x, &n);
+ union {float f; uint32_t i;} u = {n};
+ /* fabsf(n) < 8 without raising invalid on nan */
+ if ((u.i>>23 & 0xff) < 0x7f+3) {
+ if (!y) return p10[(int)n+7];
+ y = exp2f(3.32192809488736234787031942948939f * y);
+ return y * p10[(int)n+7];
+ }
+ return exp2(3.32192809488736234787031942948939 * x);
+}
+
+weak_alias(exp10f, pow10f);
diff --git a/libc-top-half/musl/src/math/exp10l.c b/libc-top-half/musl/src/math/exp10l.c
new file mode 100644
index 0000000..f3da1a0
--- /dev/null
+++ b/libc-top-half/musl/src/math/exp10l.c
@@ -0,0 +1,32 @@
+#define _GNU_SOURCE
+#include <float.h>
+#include <math.h>
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double exp10l(long double x)
+{
+ return exp10(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+long double exp10l(long double x)
+{
+ static const long double p10[] = {
+ 1e-15L, 1e-14L, 1e-13L, 1e-12L, 1e-11L, 1e-10L,
+ 1e-9L, 1e-8L, 1e-7L, 1e-6L, 1e-5L, 1e-4L, 1e-3L, 1e-2L, 1e-1L,
+ 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
+ 1e10, 1e11, 1e12, 1e13, 1e14, 1e15
+ };
+ long double n, y = modfl(x, &n);
+ union ldshape u = {n};
+ /* fabsl(n) < 16 without raising invalid on nan */
+ if ((u.i.se & 0x7fff) < 0x3fff+4) {
+ if (!y) return p10[(int)n+15];
+ y = exp2l(3.32192809488736234787031942948939L * y);
+ return y * p10[(int)n+15];
+ }
+ return powl(10.0, x);
+}
+#endif
+
+weak_alias(exp10l, pow10l);
diff --git a/libc-top-half/musl/src/math/exp2.c b/libc-top-half/musl/src/math/exp2.c
new file mode 100644
index 0000000..e0ff54b
--- /dev/null
+++ b/libc-top-half/musl/src/math/exp2.c
@@ -0,0 +1,121 @@
+/*
+ * Double-precision 2^x function.
+ *
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <math.h>
+#include <stdint.h>
+#include "libm.h"
+#include "exp_data.h"
+
+#define N (1 << EXP_TABLE_BITS)
+#define Shift __exp_data.exp2_shift
+#define T __exp_data.tab
+#define C1 __exp_data.exp2_poly[0]
+#define C2 __exp_data.exp2_poly[1]
+#define C3 __exp_data.exp2_poly[2]
+#define C4 __exp_data.exp2_poly[3]
+#define C5 __exp_data.exp2_poly[4]
+
+/* Handle cases that may overflow or underflow when computing the result that
+ is scale*(1+TMP) without intermediate rounding. The bit representation of
+ scale is in SBITS, however it has a computed exponent that may have
+ overflown into the sign bit so that needs to be adjusted before using it as
+ a double. (int32_t)KI is the k used in the argument reduction and exponent
+ adjustment of scale, positive k here means the result may overflow and
+ negative k means the result may underflow. */
+static inline double specialcase(double_t tmp, uint64_t sbits, uint64_t ki)
+{
+ double_t scale, y;
+
+ if ((ki & 0x80000000) == 0) {
+ /* k > 0, the exponent of scale might have overflowed by 1. */
+ sbits -= 1ull << 52;
+ scale = asdouble(sbits);
+ y = 2 * (scale + scale * tmp);
+ return eval_as_double(y);
+ }
+ /* k < 0, need special care in the subnormal range. */
+ sbits += 1022ull << 52;
+ scale = asdouble(sbits);
+ y = scale + scale * tmp;
+ if (y < 1.0) {
+ /* Round y to the right precision before scaling it into the subnormal
+ range to avoid double rounding that can cause 0.5+E/2 ulp error where
+ E is the worst-case ulp error outside the subnormal range. So this
+ is only useful if the goal is better than 1 ulp worst-case error. */
+ double_t hi, lo;
+ lo = scale - y + scale * tmp;
+ hi = 1.0 + y;
+ lo = 1.0 - hi + y + lo;
+ y = eval_as_double(hi + lo) - 1.0;
+ /* Avoid -0.0 with downward rounding. */
+ if (WANT_ROUNDING && y == 0.0)
+ y = 0.0;
+ /* The underflow exception needs to be signaled explicitly. */
+ fp_force_eval(fp_barrier(0x1p-1022) * 0x1p-1022);
+ }
+ y = 0x1p-1022 * y;
+ return eval_as_double(y);
+}
+
+/* Top 12 bits of a double (sign and exponent bits). */
+static inline uint32_t top12(double x)
+{
+ return asuint64(x) >> 52;
+}
+
+double exp2(double x)
+{
+ uint32_t abstop;
+ uint64_t ki, idx, top, sbits;
+ double_t kd, r, r2, scale, tail, tmp;
+
+ abstop = top12(x) & 0x7ff;
+ if (predict_false(abstop - top12(0x1p-54) >= top12(512.0) - top12(0x1p-54))) {
+ if (abstop - top12(0x1p-54) >= 0x80000000)
+ /* Avoid spurious underflow for tiny x. */
+ /* Note: 0 is common input. */
+ return WANT_ROUNDING ? 1.0 + x : 1.0;
+ if (abstop >= top12(1024.0)) {
+ if (asuint64(x) == asuint64(-INFINITY))
+ return 0.0;
+ if (abstop >= top12(INFINITY))
+ return 1.0 + x;
+ if (!(asuint64(x) >> 63))
+ return __math_oflow(0);
+ else if (asuint64(x) >= asuint64(-1075.0))
+ return __math_uflow(0);
+ }
+ if (2 * asuint64(x) > 2 * asuint64(928.0))
+ /* Large x is special cased below. */
+ abstop = 0;
+ }
+
+ /* exp2(x) = 2^(k/N) * 2^r, with 2^r in [2^(-1/2N),2^(1/2N)]. */
+ /* x = k/N + r, with int k and r in [-1/2N, 1/2N]. */
+ kd = eval_as_double(x + Shift);
+ ki = asuint64(kd); /* k. */
+ kd -= Shift; /* k/N for int k. */
+ r = x - kd;
+ /* 2^(k/N) ~= scale * (1 + tail). */
+ idx = 2 * (ki % N);
+ top = ki << (52 - EXP_TABLE_BITS);
+ tail = asdouble(T[idx]);
+ /* This is only a valid scale when -1023*N < k < 1024*N. */
+ sbits = T[idx + 1] + top;
+ /* exp2(x) = 2^(k/N) * 2^r ~= scale + scale * (tail + 2^r - 1). */
+ /* Evaluation is optimized assuming superscalar pipelined execution. */
+ r2 = r * r;
+ /* Without fma the worst case error is 0.5/N ulp larger. */
+ /* Worst case error is less than 0.5+0.86/N+(abs poly error * 2^53) ulp. */
+ tmp = tail + r * C1 + r2 * (C2 + r * C3) + r2 * r2 * (C4 + r * C5);
+ if (predict_false(abstop == 0))
+ return specialcase(tmp, sbits, ki);
+ scale = asdouble(sbits);
+ /* Note: tmp == 0 or |tmp| > 2^-65 and scale > 2^-928, so there
+ is no spurious underflow here even without fma. */
+ return eval_as_double(scale + scale * tmp);
+}
diff --git a/libc-top-half/musl/src/math/exp2f.c b/libc-top-half/musl/src/math/exp2f.c
new file mode 100644
index 0000000..0360482
--- /dev/null
+++ b/libc-top-half/musl/src/math/exp2f.c
@@ -0,0 +1,69 @@
+/*
+ * Single-precision 2^x function.
+ *
+ * Copyright (c) 2017-2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <math.h>
+#include <stdint.h>
+#include "libm.h"
+#include "exp2f_data.h"
+
+/*
+EXP2F_TABLE_BITS = 5
+EXP2F_POLY_ORDER = 3
+
+ULP error: 0.502 (nearest rounding.)
+Relative error: 1.69 * 2^-34 in [-1/64, 1/64] (before rounding.)
+Wrong count: 168353 (all nearest rounding wrong results with fma.)
+Non-nearest ULP error: 1 (rounded ULP error)
+*/
+
+#define N (1 << EXP2F_TABLE_BITS)
+#define T __exp2f_data.tab
+#define C __exp2f_data.poly
+#define SHIFT __exp2f_data.shift_scaled
+
+static inline uint32_t top12(float x)
+{
+ return asuint(x) >> 20;
+}
+
+float exp2f(float x)
+{
+ uint32_t abstop;
+ uint64_t ki, t;
+ double_t kd, xd, z, r, r2, y, s;
+
+ xd = (double_t)x;
+ abstop = top12(x) & 0x7ff;
+ if (predict_false(abstop >= top12(128.0f))) {
+ /* |x| >= 128 or x is nan. */
+ if (asuint(x) == asuint(-INFINITY))
+ return 0.0f;
+ if (abstop >= top12(INFINITY))
+ return x + x;
+ if (x > 0.0f)
+ return __math_oflowf(0);
+ if (x <= -150.0f)
+ return __math_uflowf(0);
+ }
+
+ /* x = k/N + r with r in [-1/(2N), 1/(2N)] and int k. */
+ kd = eval_as_double(xd + SHIFT);
+ ki = asuint64(kd);
+ kd -= SHIFT; /* k/N for int k. */
+ r = xd - kd;
+
+ /* exp2(x) = 2^(k/N) * 2^r ~= s * (C0*r^3 + C1*r^2 + C2*r + 1) */
+ t = T[ki % N];
+ t += ki << (52 - EXP2F_TABLE_BITS);
+ s = asdouble(t);
+ z = C[0] * r + C[1];
+ r2 = r * r;
+ y = C[2] * r + 1;
+ y = z * r2 + y;
+ y = y * s;
+ return eval_as_float(y);
+}
diff --git a/libc-top-half/musl/src/math/exp2f_data.c b/libc-top-half/musl/src/math/exp2f_data.c
new file mode 100644
index 0000000..be32472
--- /dev/null
+++ b/libc-top-half/musl/src/math/exp2f_data.c
@@ -0,0 +1,35 @@
+/*
+ * Shared data between expf, exp2f and powf.
+ *
+ * Copyright (c) 2017-2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "exp2f_data.h"
+
+#define N (1 << EXP2F_TABLE_BITS)
+
+const struct exp2f_data __exp2f_data = {
+ /* tab[i] = uint(2^(i/N)) - (i << 52-BITS)
+ used for computing 2^(k/N) for an int |k| < 150 N as
+ double(tab[k%N] + (k << 52-BITS)) */
+ .tab = {
+0x3ff0000000000000, 0x3fefd9b0d3158574, 0x3fefb5586cf9890f, 0x3fef9301d0125b51,
+0x3fef72b83c7d517b, 0x3fef54873168b9aa, 0x3fef387a6e756238, 0x3fef1e9df51fdee1,
+0x3fef06fe0a31b715, 0x3feef1a7373aa9cb, 0x3feedea64c123422, 0x3feece086061892d,
+0x3feebfdad5362a27, 0x3feeb42b569d4f82, 0x3feeab07dd485429, 0x3feea47eb03a5585,
+0x3feea09e667f3bcd, 0x3fee9f75e8ec5f74, 0x3feea11473eb0187, 0x3feea589994cce13,
+0x3feeace5422aa0db, 0x3feeb737b0cdc5e5, 0x3feec49182a3f090, 0x3feed503b23e255d,
+0x3feee89f995ad3ad, 0x3feeff76f2fb5e47, 0x3fef199bdd85529c, 0x3fef3720dcef9069,
+0x3fef5818dcfba487, 0x3fef7c97337b9b5f, 0x3fefa4afa2a490da, 0x3fefd0765b6e4540,
+ },
+ .shift_scaled = 0x1.8p+52 / N,
+ .poly = {
+ 0x1.c6af84b912394p-5, 0x1.ebfce50fac4f3p-3, 0x1.62e42ff0c52d6p-1,
+ },
+ .shift = 0x1.8p+52,
+ .invln2_scaled = 0x1.71547652b82fep+0 * N,
+ .poly_scaled = {
+ 0x1.c6af84b912394p-5/N/N/N, 0x1.ebfce50fac4f3p-3/N/N, 0x1.62e42ff0c52d6p-1/N,
+ },
+};
diff --git a/libc-top-half/musl/src/math/exp2f_data.h b/libc-top-half/musl/src/math/exp2f_data.h
new file mode 100644
index 0000000..fe744f1
--- /dev/null
+++ b/libc-top-half/musl/src/math/exp2f_data.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2017-2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef _EXP2F_DATA_H
+#define _EXP2F_DATA_H
+
+#include <features.h>
+#include <stdint.h>
+
+/* Shared between expf, exp2f and powf. */
+#define EXP2F_TABLE_BITS 5
+#define EXP2F_POLY_ORDER 3
+extern hidden const struct exp2f_data {
+ uint64_t tab[1 << EXP2F_TABLE_BITS];
+ double shift_scaled;
+ double poly[EXP2F_POLY_ORDER];
+ double shift;
+ double invln2_scaled;
+ double poly_scaled[EXP2F_POLY_ORDER];
+} __exp2f_data;
+
+#endif
diff --git a/libc-top-half/musl/src/math/exp2l.c b/libc-top-half/musl/src/math/exp2l.c
new file mode 100644
index 0000000..3565c1e
--- /dev/null
+++ b/libc-top-half/musl/src/math/exp2l.c
@@ -0,0 +1,619 @@
+/* origin: FreeBSD /usr/src/lib/msun/ld80/s_exp2l.c and /usr/src/lib/msun/ld128/s_exp2l.c */
+/*-
+ * Copyright (c) 2005-2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double exp2l(long double x)
+{
+ return exp2(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+#define TBLBITS 7
+#define TBLSIZE (1 << TBLBITS)
+
+static const double
+redux = 0x1.8p63 / TBLSIZE,
+P1 = 0x1.62e42fefa39efp-1,
+P2 = 0x1.ebfbdff82c58fp-3,
+P3 = 0x1.c6b08d7049fap-5,
+P4 = 0x1.3b2ab6fba4da5p-7,
+P5 = 0x1.5d8804780a736p-10,
+P6 = 0x1.430918835e33dp-13;
+
+static const double tbl[TBLSIZE * 2] = {
+ 0x1.6a09e667f3bcdp-1, -0x1.bdd3413b2648p-55,
+ 0x1.6c012750bdabfp-1, -0x1.2895667ff0cp-57,
+ 0x1.6dfb23c651a2fp-1, -0x1.bbe3a683c88p-58,
+ 0x1.6ff7df9519484p-1, -0x1.83c0f25860fp-56,
+ 0x1.71f75e8ec5f74p-1, -0x1.16e4786887bp-56,
+ 0x1.73f9a48a58174p-1, -0x1.0a8d96c65d5p-55,
+ 0x1.75feb564267c9p-1, -0x1.0245957316ep-55,
+ 0x1.780694fde5d3fp-1, 0x1.866b80a0216p-55,
+ 0x1.7a11473eb0187p-1, -0x1.41577ee0499p-56,
+ 0x1.7c1ed0130c132p-1, 0x1.f124cd1164ep-55,
+ 0x1.7e2f336cf4e62p-1, 0x1.05d02ba157ap-57,
+ 0x1.80427543e1a12p-1, -0x1.27c86626d97p-55,
+ 0x1.82589994cce13p-1, -0x1.d4c1dd41533p-55,
+ 0x1.8471a4623c7adp-1, -0x1.8d684a341cep-56,
+ 0x1.868d99b4492edp-1, -0x1.fc6f89bd4f68p-55,
+ 0x1.88ac7d98a6699p-1, 0x1.994c2f37cb5p-55,
+ 0x1.8ace5422aa0dbp-1, 0x1.6e9f156864bp-55,
+ 0x1.8cf3216b5448cp-1, -0x1.0d55e32e9e4p-57,
+ 0x1.8f1ae99157736p-1, 0x1.5cc13a2e397p-56,
+ 0x1.9145b0b91ffc6p-1, -0x1.dd6792e5825p-55,
+ 0x1.93737b0cdc5e5p-1, -0x1.75fc781b58p-58,
+ 0x1.95a44cbc8520fp-1, -0x1.64b7c96a5fp-57,
+ 0x1.97d829fde4e5p-1, -0x1.d185b7c1b86p-55,
+ 0x1.9a0f170ca07bap-1, -0x1.173bd91cee6p-55,
+ 0x1.9c49182a3f09p-1, 0x1.c7c46b071f2p-57,
+ 0x1.9e86319e32323p-1, 0x1.824ca78e64cp-57,
+ 0x1.a0c667b5de565p-1, -0x1.359495d1cd5p-55,
+ 0x1.a309bec4a2d33p-1, 0x1.6305c7ddc368p-55,
+ 0x1.a5503b23e255dp-1, -0x1.d2f6edb8d42p-55,
+ 0x1.a799e1330b358p-1, 0x1.bcb7ecac564p-55,
+ 0x1.a9e6b5579fdbfp-1, 0x1.0fac90ef7fdp-55,
+ 0x1.ac36bbfd3f37ap-1, -0x1.f9234cae76dp-56,
+ 0x1.ae89f995ad3adp-1, 0x1.7a1cd345dcc8p-55,
+ 0x1.b0e07298db666p-1, -0x1.bdef54c80e4p-55,
+ 0x1.b33a2b84f15fbp-1, -0x1.2805e3084d8p-58,
+ 0x1.b59728de5593ap-1, -0x1.c71dfbbba6ep-55,
+ 0x1.b7f76f2fb5e47p-1, -0x1.5584f7e54acp-57,
+ 0x1.ba5b030a1064ap-1, -0x1.efcd30e5429p-55,
+ 0x1.bcc1e904bc1d2p-1, 0x1.23dd07a2d9fp-56,
+ 0x1.bf2c25bd71e09p-1, -0x1.efdca3f6b9c8p-55,
+ 0x1.c199bdd85529cp-1, 0x1.11065895049p-56,
+ 0x1.c40ab5fffd07ap-1, 0x1.b4537e083c6p-55,
+ 0x1.c67f12e57d14bp-1, 0x1.2884dff483c8p-55,
+ 0x1.c8f6d9406e7b5p-1, 0x1.1acbc48805cp-57,
+ 0x1.cb720dcef9069p-1, 0x1.503cbd1e94ap-57,
+ 0x1.cdf0b555dc3fap-1, -0x1.dd83b53829dp-56,
+ 0x1.d072d4a07897cp-1, -0x1.cbc3743797a8p-55,
+ 0x1.d2f87080d89f2p-1, -0x1.d487b719d858p-55,
+ 0x1.d5818dcfba487p-1, 0x1.2ed02d75b37p-56,
+ 0x1.d80e316c98398p-1, -0x1.11ec18bedep-55,
+ 0x1.da9e603db3285p-1, 0x1.c2300696db5p-55,
+ 0x1.dd321f301b46p-1, 0x1.2da5778f019p-55,
+ 0x1.dfc97337b9b5fp-1, -0x1.1a5cd4f184b8p-55,
+ 0x1.e264614f5a129p-1, -0x1.7b627817a148p-55,
+ 0x1.e502ee78b3ff6p-1, 0x1.39e8980a9cdp-56,
+ 0x1.e7a51fbc74c83p-1, 0x1.2d522ca0c8ep-55,
+ 0x1.ea4afa2a490dap-1, -0x1.e9c23179c288p-55,
+ 0x1.ecf482d8e67f1p-1, -0x1.c93f3b411ad8p-55,
+ 0x1.efa1bee615a27p-1, 0x1.dc7f486a4b68p-55,
+ 0x1.f252b376bba97p-1, 0x1.3a1a5bf0d8e8p-55,
+ 0x1.f50765b6e454p-1, 0x1.9d3e12dd8a18p-55,
+ 0x1.f7bfdad9cbe14p-1, -0x1.dbb12d00635p-55,
+ 0x1.fa7c1819e90d8p-1, 0x1.74853f3a593p-56,
+ 0x1.fd3c22b8f71f1p-1, 0x1.2eb74966578p-58,
+ 0x1p+0, 0x0p+0,
+ 0x1.0163da9fb3335p+0, 0x1.b61299ab8cd8p-54,
+ 0x1.02c9a3e778061p+0, -0x1.19083535b08p-56,
+ 0x1.04315e86e7f85p+0, -0x1.0a31c1977c98p-54,
+ 0x1.059b0d3158574p+0, 0x1.d73e2a475b4p-55,
+ 0x1.0706b29ddf6dep+0, -0x1.c91dfe2b13cp-55,
+ 0x1.0874518759bc8p+0, 0x1.186be4bb284p-57,
+ 0x1.09e3ecac6f383p+0, 0x1.14878183161p-54,
+ 0x1.0b5586cf9890fp+0, 0x1.8a62e4adc61p-54,
+ 0x1.0cc922b7247f7p+0, 0x1.01edc16e24f8p-54,
+ 0x1.0e3ec32d3d1a2p+0, 0x1.03a1727c58p-59,
+ 0x1.0fb66affed31bp+0, -0x1.b9bedc44ebcp-57,
+ 0x1.11301d0125b51p+0, -0x1.6c51039449bp-54,
+ 0x1.12abdc06c31ccp+0, -0x1.1b514b36ca8p-58,
+ 0x1.1429aaea92dep+0, -0x1.32fbf9af1368p-54,
+ 0x1.15a98c8a58e51p+0, 0x1.2406ab9eeabp-55,
+ 0x1.172b83c7d517bp+0, -0x1.19041b9d78ap-55,
+ 0x1.18af9388c8deap+0, -0x1.11023d1970f8p-54,
+ 0x1.1a35beb6fcb75p+0, 0x1.e5b4c7b4969p-55,
+ 0x1.1bbe084045cd4p+0, -0x1.95386352ef6p-54,
+ 0x1.1d4873168b9aap+0, 0x1.e016e00a264p-54,
+ 0x1.1ed5022fcd91dp+0, -0x1.1df98027bb78p-54,
+ 0x1.2063b88628cd6p+0, 0x1.dc775814a85p-55,
+ 0x1.21f49917ddc96p+0, 0x1.2a97e9494a6p-55,
+ 0x1.2387a6e756238p+0, 0x1.9b07eb6c7058p-54,
+ 0x1.251ce4fb2a63fp+0, 0x1.ac155bef4f5p-55,
+ 0x1.26b4565e27cddp+0, 0x1.2bd339940eap-55,
+ 0x1.284dfe1f56381p+0, -0x1.a4c3a8c3f0d8p-54,
+ 0x1.29e9df51fdee1p+0, 0x1.612e8afad12p-55,
+ 0x1.2b87fd0dad99p+0, -0x1.10adcd6382p-59,
+ 0x1.2d285a6e4030bp+0, 0x1.0024754db42p-54,
+ 0x1.2ecafa93e2f56p+0, 0x1.1ca0f45d524p-56,
+ 0x1.306fe0a31b715p+0, 0x1.6f46ad23183p-55,
+ 0x1.32170fc4cd831p+0, 0x1.a9ce78e1804p-55,
+ 0x1.33c08b26416ffp+0, 0x1.327218436598p-54,
+ 0x1.356c55f929ff1p+0, -0x1.b5cee5c4e46p-55,
+ 0x1.371a7373aa9cbp+0, -0x1.63aeabf42ebp-54,
+ 0x1.38cae6d05d866p+0, -0x1.e958d3c99048p-54,
+ 0x1.3a7db34e59ff7p+0, -0x1.5e436d661f6p-56,
+ 0x1.3c32dc313a8e5p+0, -0x1.efff8375d2ap-54,
+ 0x1.3dea64c123422p+0, 0x1.ada0911f09fp-55,
+ 0x1.3fa4504ac801cp+0, -0x1.7d023f956fap-54,
+ 0x1.4160a21f72e2ap+0, -0x1.ef3691c309p-58,
+ 0x1.431f5d950a897p+0, -0x1.1c7dde35f7ap-55,
+ 0x1.44e086061892dp+0, 0x1.89b7a04ef8p-59,
+ 0x1.46a41ed1d0057p+0, 0x1.c944bd1648a8p-54,
+ 0x1.486a2b5c13cdp+0, 0x1.3c1a3b69062p-56,
+ 0x1.4a32af0d7d3dep+0, 0x1.9cb62f3d1be8p-54,
+ 0x1.4bfdad5362a27p+0, 0x1.d4397afec42p-56,
+ 0x1.4dcb299fddd0dp+0, 0x1.8ecdbbc6a78p-54,
+ 0x1.4f9b2769d2ca7p+0, -0x1.4b309d25958p-54,
+ 0x1.516daa2cf6642p+0, -0x1.f768569bd94p-55,
+ 0x1.5342b569d4f82p+0, -0x1.07abe1db13dp-55,
+ 0x1.551a4ca5d920fp+0, -0x1.d689cefede6p-55,
+ 0x1.56f4736b527dap+0, 0x1.9bb2c011d938p-54,
+ 0x1.58d12d497c7fdp+0, 0x1.295e15b9a1ep-55,
+ 0x1.5ab07dd485429p+0, 0x1.6324c0546478p-54,
+ 0x1.5c9268a5946b7p+0, 0x1.c4b1b81698p-60,
+ 0x1.5e76f15ad2148p+0, 0x1.ba6f93080e68p-54,
+ 0x1.605e1b976dc09p+0, -0x1.3e2429b56de8p-54,
+ 0x1.6247eb03a5585p+0, -0x1.383c17e40b48p-54,
+ 0x1.6434634ccc32p+0, -0x1.c483c759d89p-55,
+ 0x1.6623882552225p+0, -0x1.bb60987591cp-54,
+ 0x1.68155d44ca973p+0, 0x1.038ae44f74p-57,
+};
+
+/*
+ * exp2l(x): compute the base 2 exponential of x
+ *
+ * Accuracy: Peak error < 0.511 ulp.
+ *
+ * Method: (equally-spaced tables)
+ *
+ * Reduce x:
+ * x = 2**k + y, for integer k and |y| <= 1/2.
+ * Thus we have exp2l(x) = 2**k * exp2(y).
+ *
+ * Reduce y:
+ * y = i/TBLSIZE + z for integer i near y * TBLSIZE.
+ * Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z),
+ * with |z| <= 2**-(TBLBITS+1).
+ *
+ * We compute exp2(i/TBLSIZE) via table lookup and exp2(z) via a
+ * degree-6 minimax polynomial with maximum error under 2**-69.
+ * The table entries each have 104 bits of accuracy, encoded as
+ * a pair of double precision values.
+ */
+long double exp2l(long double x)
+{
+ union ldshape u = {x};
+ int e = u.i.se & 0x7fff;
+ long double r, z;
+ uint32_t i0;
+ union {uint32_t u; int32_t i;} k;
+
+ /* Filter out exceptional cases. */
+ if (e >= 0x3fff + 13) { /* |x| >= 8192 or x is NaN */
+ if (u.i.se >= 0x3fff + 14 && u.i.se >> 15 == 0)
+ /* overflow */
+ return x * 0x1p16383L;
+ if (e == 0x7fff) /* -inf or -nan */
+ return -1/x;
+ if (x < -16382) {
+ if (x <= -16446 || x - 0x1p63 + 0x1p63 != x)
+ /* underflow */
+ FORCE_EVAL((float)(-0x1p-149/x));
+ if (x <= -16446)
+ return 0;
+ }
+ } else if (e < 0x3fff - 64) {
+ return 1 + x;
+ }
+
+ /*
+ * Reduce x, computing z, i0, and k. The low bits of x + redux
+ * contain the 16-bit integer part of the exponent (k) followed by
+ * TBLBITS fractional bits (i0). We use bit tricks to extract these
+ * as integers, then set z to the remainder.
+ *
+ * Example: Suppose x is 0xabc.123456p0 and TBLBITS is 8.
+ * Then the low-order word of x + redux is 0x000abc12,
+ * We split this into k = 0xabc and i0 = 0x12 (adjusted to
+ * index into the table), then we compute z = 0x0.003456p0.
+ */
+ u.f = x + redux;
+ i0 = u.i.m + TBLSIZE / 2;
+ k.u = i0 / TBLSIZE * TBLSIZE;
+ k.i /= TBLSIZE;
+ i0 %= TBLSIZE;
+ u.f -= redux;
+ z = x - u.f;
+
+ /* Compute r = exp2l(y) = exp2lt[i0] * p(z). */
+ long double t_hi = tbl[2*i0];
+ long double t_lo = tbl[2*i0 + 1];
+ /* XXX This gives > 1 ulp errors outside of FE_TONEAREST mode */
+ r = t_lo + (t_hi + t_lo) * z * (P1 + z * (P2 + z * (P3 + z * (P4
+ + z * (P5 + z * P6))))) + t_hi;
+
+ return scalbnl(r, k.i);
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+#define TBLBITS 7
+#define TBLSIZE (1 << TBLBITS)
+
+static const long double
+ P1 = 0x1.62e42fefa39ef35793c7673007e6p-1L,
+ P2 = 0x1.ebfbdff82c58ea86f16b06ec9736p-3L,
+ P3 = 0x1.c6b08d704a0bf8b33a762bad3459p-5L,
+ P4 = 0x1.3b2ab6fba4e7729ccbbe0b4f3fc2p-7L,
+ P5 = 0x1.5d87fe78a67311071dee13fd11d9p-10L,
+ P6 = 0x1.430912f86c7876f4b663b23c5fe5p-13L;
+
+static const double
+ P7 = 0x1.ffcbfc588b041p-17,
+ P8 = 0x1.62c0223a5c7c7p-20,
+ P9 = 0x1.b52541ff59713p-24,
+ P10 = 0x1.e4cf56a391e22p-28,
+ redux = 0x1.8p112 / TBLSIZE;
+
+static const long double tbl[TBLSIZE] = {
+ 0x1.6a09e667f3bcc908b2fb1366dfeap-1L,
+ 0x1.6c012750bdabeed76a99800f4edep-1L,
+ 0x1.6dfb23c651a2ef220e2cbe1bc0d4p-1L,
+ 0x1.6ff7df9519483cf87e1b4f3e1e98p-1L,
+ 0x1.71f75e8ec5f73dd2370f2ef0b148p-1L,
+ 0x1.73f9a48a58173bd5c9a4e68ab074p-1L,
+ 0x1.75feb564267c8bf6e9aa33a489a8p-1L,
+ 0x1.780694fde5d3f619ae02808592a4p-1L,
+ 0x1.7a11473eb0186d7d51023f6ccb1ap-1L,
+ 0x1.7c1ed0130c1327c49334459378dep-1L,
+ 0x1.7e2f336cf4e62105d02ba1579756p-1L,
+ 0x1.80427543e1a11b60de67649a3842p-1L,
+ 0x1.82589994cce128acf88afab34928p-1L,
+ 0x1.8471a4623c7acce52f6b97c6444cp-1L,
+ 0x1.868d99b4492ec80e41d90ac2556ap-1L,
+ 0x1.88ac7d98a669966530bcdf2d4cc0p-1L,
+ 0x1.8ace5422aa0db5ba7c55a192c648p-1L,
+ 0x1.8cf3216b5448bef2aa1cd161c57ap-1L,
+ 0x1.8f1ae991577362b982745c72eddap-1L,
+ 0x1.9145b0b91ffc588a61b469f6b6a0p-1L,
+ 0x1.93737b0cdc5e4f4501c3f2540ae8p-1L,
+ 0x1.95a44cbc8520ee9b483695a0e7fep-1L,
+ 0x1.97d829fde4e4f8b9e920f91e8eb6p-1L,
+ 0x1.9a0f170ca07b9ba3109b8c467844p-1L,
+ 0x1.9c49182a3f0901c7c46b071f28dep-1L,
+ 0x1.9e86319e323231824ca78e64c462p-1L,
+ 0x1.a0c667b5de564b29ada8b8cabbacp-1L,
+ 0x1.a309bec4a2d3358c171f770db1f4p-1L,
+ 0x1.a5503b23e255c8b424491caf88ccp-1L,
+ 0x1.a799e1330b3586f2dfb2b158f31ep-1L,
+ 0x1.a9e6b5579fdbf43eb243bdff53a2p-1L,
+ 0x1.ac36bbfd3f379c0db966a3126988p-1L,
+ 0x1.ae89f995ad3ad5e8734d17731c80p-1L,
+ 0x1.b0e07298db66590842acdfc6fb4ep-1L,
+ 0x1.b33a2b84f15faf6bfd0e7bd941b0p-1L,
+ 0x1.b59728de559398e3881111648738p-1L,
+ 0x1.b7f76f2fb5e46eaa7b081ab53ff6p-1L,
+ 0x1.ba5b030a10649840cb3c6af5b74cp-1L,
+ 0x1.bcc1e904bc1d2247ba0f45b3d06cp-1L,
+ 0x1.bf2c25bd71e088408d7025190cd0p-1L,
+ 0x1.c199bdd85529c2220cb12a0916bap-1L,
+ 0x1.c40ab5fffd07a6d14df820f17deap-1L,
+ 0x1.c67f12e57d14b4a2137fd20f2a26p-1L,
+ 0x1.c8f6d9406e7b511acbc48805c3f6p-1L,
+ 0x1.cb720dcef90691503cbd1e949d0ap-1L,
+ 0x1.cdf0b555dc3f9c44f8958fac4f12p-1L,
+ 0x1.d072d4a07897b8d0f22f21a13792p-1L,
+ 0x1.d2f87080d89f18ade123989ea50ep-1L,
+ 0x1.d5818dcfba48725da05aeb66dff8p-1L,
+ 0x1.d80e316c98397bb84f9d048807a0p-1L,
+ 0x1.da9e603db3285708c01a5b6d480cp-1L,
+ 0x1.dd321f301b4604b695de3c0630c0p-1L,
+ 0x1.dfc97337b9b5eb968cac39ed284cp-1L,
+ 0x1.e264614f5a128a12761fa17adc74p-1L,
+ 0x1.e502ee78b3ff6273d130153992d0p-1L,
+ 0x1.e7a51fbc74c834b548b2832378a4p-1L,
+ 0x1.ea4afa2a490d9858f73a18f5dab4p-1L,
+ 0x1.ecf482d8e67f08db0312fb949d50p-1L,
+ 0x1.efa1bee615a27771fd21a92dabb6p-1L,
+ 0x1.f252b376bba974e8696fc3638f24p-1L,
+ 0x1.f50765b6e4540674f84b762861a6p-1L,
+ 0x1.f7bfdad9cbe138913b4bfe72bd78p-1L,
+ 0x1.fa7c1819e90d82e90a7e74b26360p-1L,
+ 0x1.fd3c22b8f71f10975ba4b32bd006p-1L,
+ 0x1.0000000000000000000000000000p+0L,
+ 0x1.0163da9fb33356d84a66ae336e98p+0L,
+ 0x1.02c9a3e778060ee6f7caca4f7a18p+0L,
+ 0x1.04315e86e7f84bd738f9a20da442p+0L,
+ 0x1.059b0d31585743ae7c548eb68c6ap+0L,
+ 0x1.0706b29ddf6ddc6dc403a9d87b1ep+0L,
+ 0x1.0874518759bc808c35f25d942856p+0L,
+ 0x1.09e3ecac6f3834521e060c584d5cp+0L,
+ 0x1.0b5586cf9890f6298b92b7184200p+0L,
+ 0x1.0cc922b7247f7407b705b893dbdep+0L,
+ 0x1.0e3ec32d3d1a2020742e4f8af794p+0L,
+ 0x1.0fb66affed31af232091dd8a169ep+0L,
+ 0x1.11301d0125b50a4ebbf1aed9321cp+0L,
+ 0x1.12abdc06c31cbfb92bad324d6f84p+0L,
+ 0x1.1429aaea92ddfb34101943b2588ep+0L,
+ 0x1.15a98c8a58e512480d573dd562aep+0L,
+ 0x1.172b83c7d517adcdf7c8c50eb162p+0L,
+ 0x1.18af9388c8de9bbbf70b9a3c269cp+0L,
+ 0x1.1a35beb6fcb753cb698f692d2038p+0L,
+ 0x1.1bbe084045cd39ab1e72b442810ep+0L,
+ 0x1.1d4873168b9aa7805b8028990be8p+0L,
+ 0x1.1ed5022fcd91cb8819ff61121fbep+0L,
+ 0x1.2063b88628cd63b8eeb0295093f6p+0L,
+ 0x1.21f49917ddc962552fd29294bc20p+0L,
+ 0x1.2387a6e75623866c1fadb1c159c0p+0L,
+ 0x1.251ce4fb2a63f3582ab7de9e9562p+0L,
+ 0x1.26b4565e27cdd257a673281d3068p+0L,
+ 0x1.284dfe1f5638096cf15cf03c9fa0p+0L,
+ 0x1.29e9df51fdee12c25d15f5a25022p+0L,
+ 0x1.2b87fd0dad98ffddea46538fca24p+0L,
+ 0x1.2d285a6e4030b40091d536d0733ep+0L,
+ 0x1.2ecafa93e2f5611ca0f45d5239a4p+0L,
+ 0x1.306fe0a31b7152de8d5a463063bep+0L,
+ 0x1.32170fc4cd8313539cf1c3009330p+0L,
+ 0x1.33c08b26416ff4c9c8610d96680ep+0L,
+ 0x1.356c55f929ff0c94623476373be4p+0L,
+ 0x1.371a7373aa9caa7145502f45452ap+0L,
+ 0x1.38cae6d05d86585a9cb0d9bed530p+0L,
+ 0x1.3a7db34e59ff6ea1bc9299e0a1fep+0L,
+ 0x1.3c32dc313a8e484001f228b58cf0p+0L,
+ 0x1.3dea64c12342235b41223e13d7eep+0L,
+ 0x1.3fa4504ac801ba0bf701aa417b9cp+0L,
+ 0x1.4160a21f72e29f84325b8f3dbacap+0L,
+ 0x1.431f5d950a896dc704439410b628p+0L,
+ 0x1.44e086061892d03136f409df0724p+0L,
+ 0x1.46a41ed1d005772512f459229f0ap+0L,
+ 0x1.486a2b5c13cd013c1a3b69062f26p+0L,
+ 0x1.4a32af0d7d3de672d8bcf46f99b4p+0L,
+ 0x1.4bfdad5362a271d4397afec42e36p+0L,
+ 0x1.4dcb299fddd0d63b36ef1a9e19dep+0L,
+ 0x1.4f9b2769d2ca6ad33d8b69aa0b8cp+0L,
+ 0x1.516daa2cf6641c112f52c84d6066p+0L,
+ 0x1.5342b569d4f81df0a83c49d86bf4p+0L,
+ 0x1.551a4ca5d920ec52ec620243540cp+0L,
+ 0x1.56f4736b527da66ecb004764e61ep+0L,
+ 0x1.58d12d497c7fd252bc2b7343d554p+0L,
+ 0x1.5ab07dd48542958c93015191e9a8p+0L,
+ 0x1.5c9268a5946b701c4b1b81697ed4p+0L,
+ 0x1.5e76f15ad21486e9be4c20399d12p+0L,
+ 0x1.605e1b976dc08b076f592a487066p+0L,
+ 0x1.6247eb03a5584b1f0fa06fd2d9eap+0L,
+ 0x1.6434634ccc31fc76f8714c4ee122p+0L,
+ 0x1.66238825522249127d9e29b92ea2p+0L,
+ 0x1.68155d44ca973081c57227b9f69ep+0L,
+};
+
+static const float eps[TBLSIZE] = {
+ -0x1.5c50p-101,
+ -0x1.5d00p-106,
+ 0x1.8e90p-102,
+ -0x1.5340p-103,
+ 0x1.1bd0p-102,
+ -0x1.4600p-105,
+ -0x1.7a40p-104,
+ 0x1.d590p-102,
+ -0x1.d590p-101,
+ 0x1.b100p-103,
+ -0x1.0d80p-105,
+ 0x1.6b00p-103,
+ -0x1.9f00p-105,
+ 0x1.c400p-103,
+ 0x1.e120p-103,
+ -0x1.c100p-104,
+ -0x1.9d20p-103,
+ 0x1.a800p-108,
+ 0x1.4c00p-106,
+ -0x1.9500p-106,
+ 0x1.6900p-105,
+ -0x1.29d0p-100,
+ 0x1.4c60p-103,
+ 0x1.13a0p-102,
+ -0x1.5b60p-103,
+ -0x1.1c40p-103,
+ 0x1.db80p-102,
+ 0x1.91a0p-102,
+ 0x1.dc00p-105,
+ 0x1.44c0p-104,
+ 0x1.9710p-102,
+ 0x1.8760p-103,
+ -0x1.a720p-103,
+ 0x1.ed20p-103,
+ -0x1.49c0p-102,
+ -0x1.e000p-111,
+ 0x1.86a0p-103,
+ 0x1.2b40p-103,
+ -0x1.b400p-108,
+ 0x1.1280p-99,
+ -0x1.02d8p-102,
+ -0x1.e3d0p-103,
+ -0x1.b080p-105,
+ -0x1.f100p-107,
+ -0x1.16c0p-105,
+ -0x1.1190p-103,
+ -0x1.a7d2p-100,
+ 0x1.3450p-103,
+ -0x1.67c0p-105,
+ 0x1.4b80p-104,
+ -0x1.c4e0p-103,
+ 0x1.6000p-108,
+ -0x1.3f60p-105,
+ 0x1.93f0p-104,
+ 0x1.5fe0p-105,
+ 0x1.6f80p-107,
+ -0x1.7600p-106,
+ 0x1.21e0p-106,
+ -0x1.3a40p-106,
+ -0x1.40c0p-104,
+ -0x1.9860p-105,
+ -0x1.5d40p-108,
+ -0x1.1d70p-106,
+ 0x1.2760p-105,
+ 0x0.0000p+0,
+ 0x1.21e2p-104,
+ -0x1.9520p-108,
+ -0x1.5720p-106,
+ -0x1.4810p-106,
+ -0x1.be00p-109,
+ 0x1.0080p-105,
+ -0x1.5780p-108,
+ -0x1.d460p-105,
+ -0x1.6140p-105,
+ 0x1.4630p-104,
+ 0x1.ad50p-103,
+ 0x1.82e0p-105,
+ 0x1.1d3cp-101,
+ 0x1.6100p-107,
+ 0x1.ec30p-104,
+ 0x1.f200p-108,
+ 0x1.0b40p-103,
+ 0x1.3660p-102,
+ 0x1.d9d0p-103,
+ -0x1.02d0p-102,
+ 0x1.b070p-103,
+ 0x1.b9c0p-104,
+ -0x1.01c0p-103,
+ -0x1.dfe0p-103,
+ 0x1.1b60p-104,
+ -0x1.ae94p-101,
+ -0x1.3340p-104,
+ 0x1.b3d8p-102,
+ -0x1.6e40p-105,
+ -0x1.3670p-103,
+ 0x1.c140p-104,
+ 0x1.1840p-101,
+ 0x1.1ab0p-102,
+ -0x1.a400p-104,
+ 0x1.1f00p-104,
+ -0x1.7180p-103,
+ 0x1.4ce0p-102,
+ 0x1.9200p-107,
+ -0x1.54c0p-103,
+ 0x1.1b80p-105,
+ -0x1.1828p-101,
+ 0x1.5720p-102,
+ -0x1.a060p-100,
+ 0x1.9160p-102,
+ 0x1.a280p-104,
+ 0x1.3400p-107,
+ 0x1.2b20p-102,
+ 0x1.7800p-108,
+ 0x1.cfd0p-101,
+ 0x1.2ef0p-102,
+ -0x1.2760p-99,
+ 0x1.b380p-104,
+ 0x1.0048p-101,
+ -0x1.60b0p-102,
+ 0x1.a1ccp-100,
+ -0x1.a640p-104,
+ -0x1.08a0p-101,
+ 0x1.7e60p-102,
+ 0x1.22c0p-103,
+ -0x1.7200p-106,
+ 0x1.f0f0p-102,
+ 0x1.eb4ep-99,
+ 0x1.c6e0p-103,
+};
+
+/*
+ * exp2l(x): compute the base 2 exponential of x
+ *
+ * Accuracy: Peak error < 0.502 ulp.
+ *
+ * Method: (accurate tables)
+ *
+ * Reduce x:
+ * x = 2**k + y, for integer k and |y| <= 1/2.
+ * Thus we have exp2(x) = 2**k * exp2(y).
+ *
+ * Reduce y:
+ * y = i/TBLSIZE + z - eps[i] for integer i near y * TBLSIZE.
+ * Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z - eps[i]),
+ * with |z - eps[i]| <= 2**-8 + 2**-98 for the table used.
+ *
+ * We compute exp2(i/TBLSIZE) via table lookup and exp2(z - eps[i]) via
+ * a degree-10 minimax polynomial with maximum error under 2**-120.
+ * The values in exp2t[] and eps[] are chosen such that
+ * exp2t[i] = exp2(i/TBLSIZE + eps[i]), and eps[i] is a small offset such
+ * that exp2t[i] is accurate to 2**-122.
+ *
+ * Note that the range of i is +-TBLSIZE/2, so we actually index the tables
+ * by i0 = i + TBLSIZE/2.
+ *
+ * This method is due to Gal, with many details due to Gal and Bachelis:
+ *
+ * Gal, S. and Bachelis, B. An Accurate Elementary Mathematical Library
+ * for the IEEE Floating Point Standard. TOMS 17(1), 26-46 (1991).
+ */
+long double
+exp2l(long double x)
+{
+ union ldshape u = {x};
+ int e = u.i.se & 0x7fff;
+ long double r, z, t;
+ uint32_t i0;
+ union {uint32_t u; int32_t i;} k;
+
+ /* Filter out exceptional cases. */
+ if (e >= 0x3fff + 14) { /* |x| >= 16384 or x is NaN */
+ if (u.i.se >= 0x3fff + 15 && u.i.se >> 15 == 0)
+ /* overflow */
+ return x * 0x1p16383L;
+ if (e == 0x7fff) /* -inf or -nan */
+ return -1/x;
+ if (x < -16382) {
+ if (x <= -16495 || x - 0x1p112 + 0x1p112 != x)
+ /* underflow */
+ FORCE_EVAL((float)(-0x1p-149/x));
+ if (x <= -16446)
+ return 0;
+ }
+ } else if (e < 0x3fff - 114) {
+ return 1 + x;
+ }
+
+ /*
+ * Reduce x, computing z, i0, and k. The low bits of x + redux
+ * contain the 16-bit integer part of the exponent (k) followed by
+ * TBLBITS fractional bits (i0). We use bit tricks to extract these
+ * as integers, then set z to the remainder.
+ *
+ * Example: Suppose x is 0xabc.123456p0 and TBLBITS is 8.
+ * Then the low-order word of x + redux is 0x000abc12,
+ * We split this into k = 0xabc and i0 = 0x12 (adjusted to
+ * index into the table), then we compute z = 0x0.003456p0.
+ */
+ u.f = x + redux;
+ i0 = u.i2.lo + TBLSIZE / 2;
+ k.u = i0 / TBLSIZE * TBLSIZE;
+ k.i /= TBLSIZE;
+ i0 %= TBLSIZE;
+ u.f -= redux;
+ z = x - u.f;
+
+ /* Compute r = exp2(y) = exp2t[i0] * p(z - eps[i]). */
+ t = tbl[i0];
+ z -= eps[i0];
+ r = t + t * z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * (P5 + z * (P6
+ + z * (P7 + z * (P8 + z * (P9 + z * P10)))))))));
+
+ return scalbnl(r, k.i);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/exp_data.c b/libc-top-half/musl/src/math/exp_data.c
new file mode 100644
index 0000000..21be014
--- /dev/null
+++ b/libc-top-half/musl/src/math/exp_data.c
@@ -0,0 +1,182 @@
+/*
+ * Shared data between exp, exp2 and pow.
+ *
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "exp_data.h"
+
+#define N (1 << EXP_TABLE_BITS)
+
+const struct exp_data __exp_data = {
+// N/ln2
+.invln2N = 0x1.71547652b82fep0 * N,
+// -ln2/N
+.negln2hiN = -0x1.62e42fefa0000p-8,
+.negln2loN = -0x1.cf79abc9e3b3ap-47,
+// Used for rounding when !TOINT_INTRINSICS
+#if EXP_USE_TOINT_NARROW
+.shift = 0x1800000000.8p0,
+#else
+.shift = 0x1.8p52,
+#endif
+// exp polynomial coefficients.
+.poly = {
+// abs error: 1.555*2^-66
+// ulp error: 0.509 (0.511 without fma)
+// if |x| < ln2/256+eps
+// abs error if |x| < ln2/256+0x1p-15: 1.09*2^-65
+// abs error if |x| < ln2/128: 1.7145*2^-56
+0x1.ffffffffffdbdp-2,
+0x1.555555555543cp-3,
+0x1.55555cf172b91p-5,
+0x1.1111167a4d017p-7,
+},
+.exp2_shift = 0x1.8p52 / N,
+// exp2 polynomial coefficients.
+.exp2_poly = {
+// abs error: 1.2195*2^-65
+// ulp error: 0.507 (0.511 without fma)
+// if |x| < 1/256
+// abs error if |x| < 1/128: 1.9941*2^-56
+0x1.62e42fefa39efp-1,
+0x1.ebfbdff82c424p-3,
+0x1.c6b08d70cf4b5p-5,
+0x1.3b2abd24650ccp-7,
+0x1.5d7e09b4e3a84p-10,
+},
+// 2^(k/N) ~= H[k]*(1 + T[k]) for int k in [0,N)
+// tab[2*k] = asuint64(T[k])
+// tab[2*k+1] = asuint64(H[k]) - (k << 52)/N
+.tab = {
+0x0, 0x3ff0000000000000,
+0x3c9b3b4f1a88bf6e, 0x3feff63da9fb3335,
+0xbc7160139cd8dc5d, 0x3fefec9a3e778061,
+0xbc905e7a108766d1, 0x3fefe315e86e7f85,
+0x3c8cd2523567f613, 0x3fefd9b0d3158574,
+0xbc8bce8023f98efa, 0x3fefd06b29ddf6de,
+0x3c60f74e61e6c861, 0x3fefc74518759bc8,
+0x3c90a3e45b33d399, 0x3fefbe3ecac6f383,
+0x3c979aa65d837b6d, 0x3fefb5586cf9890f,
+0x3c8eb51a92fdeffc, 0x3fefac922b7247f7,
+0x3c3ebe3d702f9cd1, 0x3fefa3ec32d3d1a2,
+0xbc6a033489906e0b, 0x3fef9b66affed31b,
+0xbc9556522a2fbd0e, 0x3fef9301d0125b51,
+0xbc5080ef8c4eea55, 0x3fef8abdc06c31cc,
+0xbc91c923b9d5f416, 0x3fef829aaea92de0,
+0x3c80d3e3e95c55af, 0x3fef7a98c8a58e51,
+0xbc801b15eaa59348, 0x3fef72b83c7d517b,
+0xbc8f1ff055de323d, 0x3fef6af9388c8dea,
+0x3c8b898c3f1353bf, 0x3fef635beb6fcb75,
+0xbc96d99c7611eb26, 0x3fef5be084045cd4,
+0x3c9aecf73e3a2f60, 0x3fef54873168b9aa,
+0xbc8fe782cb86389d, 0x3fef4d5022fcd91d,
+0x3c8a6f4144a6c38d, 0x3fef463b88628cd6,
+0x3c807a05b0e4047d, 0x3fef3f49917ddc96,
+0x3c968efde3a8a894, 0x3fef387a6e756238,
+0x3c875e18f274487d, 0x3fef31ce4fb2a63f,
+0x3c80472b981fe7f2, 0x3fef2b4565e27cdd,
+0xbc96b87b3f71085e, 0x3fef24dfe1f56381,
+0x3c82f7e16d09ab31, 0x3fef1e9df51fdee1,
+0xbc3d219b1a6fbffa, 0x3fef187fd0dad990,
+0x3c8b3782720c0ab4, 0x3fef1285a6e4030b,
+0x3c6e149289cecb8f, 0x3fef0cafa93e2f56,
+0x3c834d754db0abb6, 0x3fef06fe0a31b715,
+0x3c864201e2ac744c, 0x3fef0170fc4cd831,
+0x3c8fdd395dd3f84a, 0x3feefc08b26416ff,
+0xbc86a3803b8e5b04, 0x3feef6c55f929ff1,
+0xbc924aedcc4b5068, 0x3feef1a7373aa9cb,
+0xbc9907f81b512d8e, 0x3feeecae6d05d866,
+0xbc71d1e83e9436d2, 0x3feee7db34e59ff7,
+0xbc991919b3ce1b15, 0x3feee32dc313a8e5,
+0x3c859f48a72a4c6d, 0x3feedea64c123422,
+0xbc9312607a28698a, 0x3feeda4504ac801c,
+0xbc58a78f4817895b, 0x3feed60a21f72e2a,
+0xbc7c2c9b67499a1b, 0x3feed1f5d950a897,
+0x3c4363ed60c2ac11, 0x3feece086061892d,
+0x3c9666093b0664ef, 0x3feeca41ed1d0057,
+0x3c6ecce1daa10379, 0x3feec6a2b5c13cd0,
+0x3c93ff8e3f0f1230, 0x3feec32af0d7d3de,
+0x3c7690cebb7aafb0, 0x3feebfdad5362a27,
+0x3c931dbdeb54e077, 0x3feebcb299fddd0d,
+0xbc8f94340071a38e, 0x3feeb9b2769d2ca7,
+0xbc87deccdc93a349, 0x3feeb6daa2cf6642,
+0xbc78dec6bd0f385f, 0x3feeb42b569d4f82,
+0xbc861246ec7b5cf6, 0x3feeb1a4ca5d920f,
+0x3c93350518fdd78e, 0x3feeaf4736b527da,
+0x3c7b98b72f8a9b05, 0x3feead12d497c7fd,
+0x3c9063e1e21c5409, 0x3feeab07dd485429,
+0x3c34c7855019c6ea, 0x3feea9268a5946b7,
+0x3c9432e62b64c035, 0x3feea76f15ad2148,
+0xbc8ce44a6199769f, 0x3feea5e1b976dc09,
+0xbc8c33c53bef4da8, 0x3feea47eb03a5585,
+0xbc845378892be9ae, 0x3feea34634ccc320,
+0xbc93cedd78565858, 0x3feea23882552225,
+0x3c5710aa807e1964, 0x3feea155d44ca973,
+0xbc93b3efbf5e2228, 0x3feea09e667f3bcd,
+0xbc6a12ad8734b982, 0x3feea012750bdabf,
+0xbc6367efb86da9ee, 0x3fee9fb23c651a2f,
+0xbc80dc3d54e08851, 0x3fee9f7df9519484,
+0xbc781f647e5a3ecf, 0x3fee9f75e8ec5f74,
+0xbc86ee4ac08b7db0, 0x3fee9f9a48a58174,
+0xbc8619321e55e68a, 0x3fee9feb564267c9,
+0x3c909ccb5e09d4d3, 0x3feea0694fde5d3f,
+0xbc7b32dcb94da51d, 0x3feea11473eb0187,
+0x3c94ecfd5467c06b, 0x3feea1ed0130c132,
+0x3c65ebe1abd66c55, 0x3feea2f336cf4e62,
+0xbc88a1c52fb3cf42, 0x3feea427543e1a12,
+0xbc9369b6f13b3734, 0x3feea589994cce13,
+0xbc805e843a19ff1e, 0x3feea71a4623c7ad,
+0xbc94d450d872576e, 0x3feea8d99b4492ed,
+0x3c90ad675b0e8a00, 0x3feeaac7d98a6699,
+0x3c8db72fc1f0eab4, 0x3feeace5422aa0db,
+0xbc65b6609cc5e7ff, 0x3feeaf3216b5448c,
+0x3c7bf68359f35f44, 0x3feeb1ae99157736,
+0xbc93091fa71e3d83, 0x3feeb45b0b91ffc6,
+0xbc5da9b88b6c1e29, 0x3feeb737b0cdc5e5,
+0xbc6c23f97c90b959, 0x3feeba44cbc8520f,
+0xbc92434322f4f9aa, 0x3feebd829fde4e50,
+0xbc85ca6cd7668e4b, 0x3feec0f170ca07ba,
+0x3c71affc2b91ce27, 0x3feec49182a3f090,
+0x3c6dd235e10a73bb, 0x3feec86319e32323,
+0xbc87c50422622263, 0x3feecc667b5de565,
+0x3c8b1c86e3e231d5, 0x3feed09bec4a2d33,
+0xbc91bbd1d3bcbb15, 0x3feed503b23e255d,
+0x3c90cc319cee31d2, 0x3feed99e1330b358,
+0x3c8469846e735ab3, 0x3feede6b5579fdbf,
+0xbc82dfcd978e9db4, 0x3feee36bbfd3f37a,
+0x3c8c1a7792cb3387, 0x3feee89f995ad3ad,
+0xbc907b8f4ad1d9fa, 0x3feeee07298db666,
+0xbc55c3d956dcaeba, 0x3feef3a2b84f15fb,
+0xbc90a40e3da6f640, 0x3feef9728de5593a,
+0xbc68d6f438ad9334, 0x3feeff76f2fb5e47,
+0xbc91eee26b588a35, 0x3fef05b030a1064a,
+0x3c74ffd70a5fddcd, 0x3fef0c1e904bc1d2,
+0xbc91bdfbfa9298ac, 0x3fef12c25bd71e09,
+0x3c736eae30af0cb3, 0x3fef199bdd85529c,
+0x3c8ee3325c9ffd94, 0x3fef20ab5fffd07a,
+0x3c84e08fd10959ac, 0x3fef27f12e57d14b,
+0x3c63cdaf384e1a67, 0x3fef2f6d9406e7b5,
+0x3c676b2c6c921968, 0x3fef3720dcef9069,
+0xbc808a1883ccb5d2, 0x3fef3f0b555dc3fa,
+0xbc8fad5d3ffffa6f, 0x3fef472d4a07897c,
+0xbc900dae3875a949, 0x3fef4f87080d89f2,
+0x3c74a385a63d07a7, 0x3fef5818dcfba487,
+0xbc82919e2040220f, 0x3fef60e316c98398,
+0x3c8e5a50d5c192ac, 0x3fef69e603db3285,
+0x3c843a59ac016b4b, 0x3fef7321f301b460,
+0xbc82d52107b43e1f, 0x3fef7c97337b9b5f,
+0xbc892ab93b470dc9, 0x3fef864614f5a129,
+0x3c74b604603a88d3, 0x3fef902ee78b3ff6,
+0x3c83c5ec519d7271, 0x3fef9a51fbc74c83,
+0xbc8ff7128fd391f0, 0x3fefa4afa2a490da,
+0xbc8dae98e223747d, 0x3fefaf482d8e67f1,
+0x3c8ec3bc41aa2008, 0x3fefba1bee615a27,
+0x3c842b94c3a9eb32, 0x3fefc52b376bba97,
+0x3c8a64a931d185ee, 0x3fefd0765b6e4540,
+0xbc8e37bae43be3ed, 0x3fefdbfdad9cbe14,
+0x3c77893b4d91cd9d, 0x3fefe7c1819e90d8,
+0x3c5305c14160cc89, 0x3feff3c22b8f71f1,
+},
+};
diff --git a/libc-top-half/musl/src/math/exp_data.h b/libc-top-half/musl/src/math/exp_data.h
new file mode 100644
index 0000000..3e24bac
--- /dev/null
+++ b/libc-top-half/musl/src/math/exp_data.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef _EXP_DATA_H
+#define _EXP_DATA_H
+
+#include <features.h>
+#include <stdint.h>
+
+#define EXP_TABLE_BITS 7
+#define EXP_POLY_ORDER 5
+#define EXP_USE_TOINT_NARROW 0
+#define EXP2_POLY_ORDER 5
+extern hidden const struct exp_data {
+ double invln2N;
+ double shift;
+ double negln2hiN;
+ double negln2loN;
+ double poly[4]; /* Last four coefficients. */
+ double exp2_shift;
+ double exp2_poly[EXP2_POLY_ORDER];
+ uint64_t tab[2*(1 << EXP_TABLE_BITS)];
+} __exp_data;
+
+#endif
diff --git a/libc-top-half/musl/src/math/expf.c b/libc-top-half/musl/src/math/expf.c
new file mode 100644
index 0000000..f9fbf8e
--- /dev/null
+++ b/libc-top-half/musl/src/math/expf.c
@@ -0,0 +1,80 @@
+/*
+ * Single-precision e^x function.
+ *
+ * Copyright (c) 2017-2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <math.h>
+#include <stdint.h>
+#include "libm.h"
+#include "exp2f_data.h"
+
+/*
+EXP2F_TABLE_BITS = 5
+EXP2F_POLY_ORDER = 3
+
+ULP error: 0.502 (nearest rounding.)
+Relative error: 1.69 * 2^-34 in [-ln2/64, ln2/64] (before rounding.)
+Wrong count: 170635 (all nearest rounding wrong results with fma.)
+Non-nearest ULP error: 1 (rounded ULP error)
+*/
+
+#define N (1 << EXP2F_TABLE_BITS)
+#define InvLn2N __exp2f_data.invln2_scaled
+#define T __exp2f_data.tab
+#define C __exp2f_data.poly_scaled
+
+static inline uint32_t top12(float x)
+{
+ return asuint(x) >> 20;
+}
+
+float expf(float x)
+{
+ uint32_t abstop;
+ uint64_t ki, t;
+ double_t kd, xd, z, r, r2, y, s;
+
+ xd = (double_t)x;
+ abstop = top12(x) & 0x7ff;
+ if (predict_false(abstop >= top12(88.0f))) {
+ /* |x| >= 88 or x is nan. */
+ if (asuint(x) == asuint(-INFINITY))
+ return 0.0f;
+ if (abstop >= top12(INFINITY))
+ return x + x;
+ if (x > 0x1.62e42ep6f) /* x > log(0x1p128) ~= 88.72 */
+ return __math_oflowf(0);
+ if (x < -0x1.9fe368p6f) /* x < log(0x1p-150) ~= -103.97 */
+ return __math_uflowf(0);
+ }
+
+ /* x*N/Ln2 = k + r with r in [-1/2, 1/2] and int k. */
+ z = InvLn2N * xd;
+
+ /* Round and convert z to int, the result is in [-150*N, 128*N] and
+ ideally ties-to-even rule is used, otherwise the magnitude of r
+ can be bigger which gives larger approximation error. */
+#if TOINT_INTRINSICS
+ kd = roundtoint(z);
+ ki = converttoint(z);
+#else
+# define SHIFT __exp2f_data.shift
+ kd = eval_as_double(z + SHIFT);
+ ki = asuint64(kd);
+ kd -= SHIFT;
+#endif
+ r = z - kd;
+
+ /* exp(x) = 2^(k/N) * 2^(r/N) ~= s * (C0*r^3 + C1*r^2 + C2*r + 1) */
+ t = T[ki % N];
+ t += ki << (52 - EXP2F_TABLE_BITS);
+ s = asdouble(t);
+ z = C[0] * r + C[1];
+ r2 = r * r;
+ y = C[2] * r + 1;
+ y = z * r2 + y;
+ y = y * s;
+ return eval_as_float(y);
+}
diff --git a/libc-top-half/musl/src/math/expl.c b/libc-top-half/musl/src/math/expl.c
new file mode 100644
index 0000000..0a7f44f
--- /dev/null
+++ b/libc-top-half/musl/src/math/expl.c
@@ -0,0 +1,128 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_expl.c */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Exponential function, long double precision
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, expl();
+ *
+ * y = expl( x );
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns e (2.71828...) raised to the x power.
+ *
+ * Range reduction is accomplished by separating the argument
+ * into an integer k and fraction f such that
+ *
+ * x k f
+ * e = 2 e.
+ *
+ * A Pade' form of degree 5/6 is used to approximate exp(f) - 1
+ * in the basic range [-0.5 ln 2, 0.5 ln 2].
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE +-10000 50000 1.12e-19 2.81e-20
+ *
+ *
+ * Error amplification in the exponential function can be
+ * a serious matter. The error propagation involves
+ * exp( X(1+delta) ) = exp(X) ( 1 + X*delta + ... ),
+ * which shows that a 1 lsb error in representing X produces
+ * a relative error of X times 1 lsb in the function.
+ * While the routine gives an accurate result for arguments
+ * that are exactly represented by a long double precision
+ * computer number, the result contains amplified roundoff
+ * error for large arguments not exactly represented.
+ *
+ *
+ * ERROR MESSAGES:
+ *
+ * message condition value returned
+ * exp underflow x < MINLOG 0.0
+ * exp overflow x > MAXLOG MAXNUM
+ *
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double expl(long double x)
+{
+ return exp(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+
+static const long double P[3] = {
+ 1.2617719307481059087798E-4L,
+ 3.0299440770744196129956E-2L,
+ 9.9999999999999999991025E-1L,
+};
+static const long double Q[4] = {
+ 3.0019850513866445504159E-6L,
+ 2.5244834034968410419224E-3L,
+ 2.2726554820815502876593E-1L,
+ 2.0000000000000000000897E0L,
+};
+static const long double
+LN2HI = 6.9314575195312500000000E-1L,
+LN2LO = 1.4286068203094172321215E-6L,
+LOG2E = 1.4426950408889634073599E0L;
+
+long double expl(long double x)
+{
+ long double px, xx;
+ int k;
+
+ if (isnan(x))
+ return x;
+ if (x > 11356.5234062941439488L) /* x > ln(2^16384 - 0.5) */
+ return x * 0x1p16383L;
+ if (x < -11399.4985314888605581L) /* x < ln(2^-16446) */
+ return -0x1p-16445L/x;
+
+ /* Express e**x = e**f 2**k
+ * = e**(f + k ln(2))
+ */
+ px = floorl(LOG2E * x + 0.5);
+ k = px;
+ x -= px * LN2HI;
+ x -= px * LN2LO;
+
+ /* rational approximation of the fractional part:
+ * e**x = 1 + 2x P(x**2)/(Q(x**2) - x P(x**2))
+ */
+ xx = x * x;
+ px = x * __polevll(xx, P, 2);
+ x = px/(__polevll(xx, Q, 3) - px);
+ x = 1.0 + 2.0 * x;
+ return scalbnl(x, k);
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double expl(long double x)
+{
+ return exp(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/expm1.c b/libc-top-half/musl/src/math/expm1.c
new file mode 100644
index 0000000..ac1e61e
--- /dev/null
+++ b/libc-top-half/musl/src/math/expm1.c
@@ -0,0 +1,201 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_expm1.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* expm1(x)
+ * Returns exp(x)-1, the exponential of x minus 1.
+ *
+ * Method
+ * 1. Argument reduction:
+ * Given x, find r and integer k such that
+ *
+ * x = k*ln2 + r, |r| <= 0.5*ln2 ~ 0.34658
+ *
+ * Here a correction term c will be computed to compensate
+ * the error in r when rounded to a floating-point number.
+ *
+ * 2. Approximating expm1(r) by a special rational function on
+ * the interval [0,0.34658]:
+ * Since
+ * r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 - r^4/360 + ...
+ * we define R1(r*r) by
+ * r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 * R1(r*r)
+ * That is,
+ * R1(r**2) = 6/r *((exp(r)+1)/(exp(r)-1) - 2/r)
+ * = 6/r * ( 1 + 2.0*(1/(exp(r)-1) - 1/r))
+ * = 1 - r^2/60 + r^4/2520 - r^6/100800 + ...
+ * We use a special Remez algorithm on [0,0.347] to generate
+ * a polynomial of degree 5 in r*r to approximate R1. The
+ * maximum error of this polynomial approximation is bounded
+ * by 2**-61. In other words,
+ * R1(z) ~ 1.0 + Q1*z + Q2*z**2 + Q3*z**3 + Q4*z**4 + Q5*z**5
+ * where Q1 = -1.6666666666666567384E-2,
+ * Q2 = 3.9682539681370365873E-4,
+ * Q3 = -9.9206344733435987357E-6,
+ * Q4 = 2.5051361420808517002E-7,
+ * Q5 = -6.2843505682382617102E-9;
+ * z = r*r,
+ * with error bounded by
+ * | 5 | -61
+ * | 1.0+Q1*z+...+Q5*z - R1(z) | <= 2
+ * | |
+ *
+ * expm1(r) = exp(r)-1 is then computed by the following
+ * specific way which minimize the accumulation rounding error:
+ * 2 3
+ * r r [ 3 - (R1 + R1*r/2) ]
+ * expm1(r) = r + --- + --- * [--------------------]
+ * 2 2 [ 6 - r*(3 - R1*r/2) ]
+ *
+ * To compensate the error in the argument reduction, we use
+ * expm1(r+c) = expm1(r) + c + expm1(r)*c
+ * ~ expm1(r) + c + r*c
+ * Thus c+r*c will be added in as the correction terms for
+ * expm1(r+c). Now rearrange the term to avoid optimization
+ * screw up:
+ * ( 2 2 )
+ * ({ ( r [ R1 - (3 - R1*r/2) ] ) } r )
+ * expm1(r+c)~r - ({r*(--- * [--------------------]-c)-c} - --- )
+ * ({ ( 2 [ 6 - r*(3 - R1*r/2) ] ) } 2 )
+ * ( )
+ *
+ * = r - E
+ * 3. Scale back to obtain expm1(x):
+ * From step 1, we have
+ * expm1(x) = either 2^k*[expm1(r)+1] - 1
+ * = or 2^k*[expm1(r) + (1-2^-k)]
+ * 4. Implementation notes:
+ * (A). To save one multiplication, we scale the coefficient Qi
+ * to Qi*2^i, and replace z by (x^2)/2.
+ * (B). To achieve maximum accuracy, we compute expm1(x) by
+ * (i) if x < -56*ln2, return -1.0, (raise inexact if x!=inf)
+ * (ii) if k=0, return r-E
+ * (iii) if k=-1, return 0.5*(r-E)-0.5
+ * (iv) if k=1 if r < -0.25, return 2*((r+0.5)- E)
+ * else return 1.0+2.0*(r-E);
+ * (v) if (k<-2||k>56) return 2^k(1-(E-r)) - 1 (or exp(x)-1)
+ * (vi) if k <= 20, return 2^k((1-2^-k)-(E-r)), else
+ * (vii) return 2^k(1-((E+2^-k)-r))
+ *
+ * Special cases:
+ * expm1(INF) is INF, expm1(NaN) is NaN;
+ * expm1(-INF) is -1, and
+ * for finite argument, only expm1(0)=0 is exact.
+ *
+ * Accuracy:
+ * according to an error analysis, the error is always less than
+ * 1 ulp (unit in the last place).
+ *
+ * Misc. info.
+ * For IEEE double
+ * if x > 7.09782712893383973096e+02 then expm1(x) overflow
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+#include "libm.h"
+
+static const double
+o_threshold = 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */
+ln2_hi = 6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */
+ln2_lo = 1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */
+invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */
+/* Scaled Q's: Qn_here = 2**n * Qn_above, for R(2*z) where z = hxs = x*x/2: */
+Q1 = -3.33333333333331316428e-02, /* BFA11111 111110F4 */
+Q2 = 1.58730158725481460165e-03, /* 3F5A01A0 19FE5585 */
+Q3 = -7.93650757867487942473e-05, /* BF14CE19 9EAADBB7 */
+Q4 = 4.00821782732936239552e-06, /* 3ED0CFCA 86E65239 */
+Q5 = -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */
+
+double expm1(double x)
+{
+ double_t y,hi,lo,c,t,e,hxs,hfx,r1,twopk;
+ union {double f; uint64_t i;} u = {x};
+ uint32_t hx = u.i>>32 & 0x7fffffff;
+ int k, sign = u.i>>63;
+
+ /* filter out huge and non-finite argument */
+ if (hx >= 0x4043687A) { /* if |x|>=56*ln2 */
+ if (isnan(x))
+ return x;
+ if (sign)
+ return -1;
+ if (x > o_threshold) {
+ x *= 0x1p1023;
+ return x;
+ }
+ }
+
+ /* argument reduction */
+ if (hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */
+ if (hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */
+ if (!sign) {
+ hi = x - ln2_hi;
+ lo = ln2_lo;
+ k = 1;
+ } else {
+ hi = x + ln2_hi;
+ lo = -ln2_lo;
+ k = -1;
+ }
+ } else {
+ k = invln2*x + (sign ? -0.5 : 0.5);
+ t = k;
+ hi = x - t*ln2_hi; /* t*ln2_hi is exact here */
+ lo = t*ln2_lo;
+ }
+ x = hi-lo;
+ c = (hi-x)-lo;
+ } else if (hx < 0x3c900000) { /* |x| < 2**-54, return x */
+ if (hx < 0x00100000)
+ FORCE_EVAL((float)x);
+ return x;
+ } else
+ k = 0;
+
+ /* x is now in primary range */
+ hfx = 0.5*x;
+ hxs = x*hfx;
+ r1 = 1.0+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5))));
+ t = 3.0-r1*hfx;
+ e = hxs*((r1-t)/(6.0 - x*t));
+ if (k == 0) /* c is 0 */
+ return x - (x*e-hxs);
+ e = x*(e-c) - c;
+ e -= hxs;
+ /* exp(x) ~ 2^k (x_reduced - e + 1) */
+ if (k == -1)
+ return 0.5*(x-e) - 0.5;
+ if (k == 1) {
+ if (x < -0.25)
+ return -2.0*(e-(x+0.5));
+ return 1.0+2.0*(x-e);
+ }
+ u.i = (uint64_t)(0x3ff + k)<<52; /* 2^k */
+ twopk = u.f;
+ if (k < 0 || k > 56) { /* suffice to return exp(x)-1 */
+ y = x - e + 1.0;
+ if (k == 1024)
+ y = y*2.0*0x1p1023;
+ else
+ y = y*twopk;
+ return y - 1.0;
+ }
+ u.i = (uint64_t)(0x3ff - k)<<52; /* 2^-k */
+ if (k < 20)
+ y = (x-e+(1-u.f))*twopk;
+ else
+ y = (x-(e+u.f)+1)*twopk;
+ return y;
+}
diff --git a/libc-top-half/musl/src/math/expm1f.c b/libc-top-half/musl/src/math/expm1f.c
new file mode 100644
index 0000000..09a41af
--- /dev/null
+++ b/libc-top-half/musl/src/math/expm1f.c
@@ -0,0 +1,110 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_expm1f.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+static const float
+ln2_hi = 6.9313812256e-01, /* 0x3f317180 */
+ln2_lo = 9.0580006145e-06, /* 0x3717f7d1 */
+invln2 = 1.4426950216e+00, /* 0x3fb8aa3b */
+/*
+ * Domain [-0.34568, 0.34568], range ~[-6.694e-10, 6.696e-10]:
+ * |6 / x * (1 + 2 * (1 / (exp(x) - 1) - 1 / x)) - q(x)| < 2**-30.04
+ * Scaled coefficients: Qn_here = 2**n * Qn_for_q (see s_expm1.c):
+ */
+Q1 = -3.3333212137e-2, /* -0x888868.0p-28 */
+Q2 = 1.5807170421e-3; /* 0xcf3010.0p-33 */
+
+float expm1f(float x)
+{
+ float_t y,hi,lo,c,t,e,hxs,hfx,r1,twopk;
+ union {float f; uint32_t i;} u = {x};
+ uint32_t hx = u.i & 0x7fffffff;
+ int k, sign = u.i >> 31;
+
+ /* filter out huge and non-finite argument */
+ if (hx >= 0x4195b844) { /* if |x|>=27*ln2 */
+ if (hx > 0x7f800000) /* NaN */
+ return x;
+ if (sign)
+ return -1;
+ if (hx > 0x42b17217) { /* x > log(FLT_MAX) */
+ x *= 0x1p127f;
+ return x;
+ }
+ }
+
+ /* argument reduction */
+ if (hx > 0x3eb17218) { /* if |x| > 0.5 ln2 */
+ if (hx < 0x3F851592) { /* and |x| < 1.5 ln2 */
+ if (!sign) {
+ hi = x - ln2_hi;
+ lo = ln2_lo;
+ k = 1;
+ } else {
+ hi = x + ln2_hi;
+ lo = -ln2_lo;
+ k = -1;
+ }
+ } else {
+ k = invln2*x + (sign ? -0.5f : 0.5f);
+ t = k;
+ hi = x - t*ln2_hi; /* t*ln2_hi is exact here */
+ lo = t*ln2_lo;
+ }
+ x = hi-lo;
+ c = (hi-x)-lo;
+ } else if (hx < 0x33000000) { /* when |x|<2**-25, return x */
+ if (hx < 0x00800000)
+ FORCE_EVAL(x*x);
+ return x;
+ } else
+ k = 0;
+
+ /* x is now in primary range */
+ hfx = 0.5f*x;
+ hxs = x*hfx;
+ r1 = 1.0f+hxs*(Q1+hxs*Q2);
+ t = 3.0f - r1*hfx;
+ e = hxs*((r1-t)/(6.0f - x*t));
+ if (k == 0) /* c is 0 */
+ return x - (x*e-hxs);
+ e = x*(e-c) - c;
+ e -= hxs;
+ /* exp(x) ~ 2^k (x_reduced - e + 1) */
+ if (k == -1)
+ return 0.5f*(x-e) - 0.5f;
+ if (k == 1) {
+ if (x < -0.25f)
+ return -2.0f*(e-(x+0.5f));
+ return 1.0f + 2.0f*(x-e);
+ }
+ u.i = (0x7f+k)<<23; /* 2^k */
+ twopk = u.f;
+ if (k < 0 || k > 56) { /* suffice to return exp(x)-1 */
+ y = x - e + 1.0f;
+ if (k == 128)
+ y = y*2.0f*0x1p127f;
+ else
+ y = y*twopk;
+ return y - 1.0f;
+ }
+ u.i = (0x7f-k)<<23; /* 2^-k */
+ if (k < 23)
+ y = (x-e+(1-u.f))*twopk;
+ else
+ y = (x-(e+u.f)+1)*twopk;
+ return y;
+}
diff --git a/libc-top-half/musl/src/math/expm1l.c b/libc-top-half/musl/src/math/expm1l.c
new file mode 100644
index 0000000..d171507
--- /dev/null
+++ b/libc-top-half/musl/src/math/expm1l.c
@@ -0,0 +1,123 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_expm1l.c */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Exponential function, minus 1
+ * Long double precision
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, expm1l();
+ *
+ * y = expm1l( x );
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns e (2.71828...) raised to the x power, minus 1.
+ *
+ * Range reduction is accomplished by separating the argument
+ * into an integer k and fraction f such that
+ *
+ * x k f
+ * e = 2 e.
+ *
+ * An expansion x + .5 x^2 + x^3 R(x) approximates exp(f) - 1
+ * in the basic range [-0.5 ln 2, 0.5 ln 2].
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE -45,+maxarg 200,000 1.2e-19 2.5e-20
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double expm1l(long double x)
+{
+ return expm1(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+
+/* exp(x) - 1 = x + 0.5 x^2 + x^3 P(x)/Q(x)
+ -.5 ln 2 < x < .5 ln 2
+ Theoretical peak relative error = 3.4e-22 */
+static const long double
+P0 = -1.586135578666346600772998894928250240826E4L,
+P1 = 2.642771505685952966904660652518429479531E3L,
+P2 = -3.423199068835684263987132888286791620673E2L,
+P3 = 1.800826371455042224581246202420972737840E1L,
+P4 = -5.238523121205561042771939008061958820811E-1L,
+Q0 = -9.516813471998079611319047060563358064497E4L,
+Q1 = 3.964866271411091674556850458227710004570E4L,
+Q2 = -7.207678383830091850230366618190187434796E3L,
+Q3 = 7.206038318724600171970199625081491823079E2L,
+Q4 = -4.002027679107076077238836622982900945173E1L,
+/* Q5 = 1.000000000000000000000000000000000000000E0 */
+/* C1 + C2 = ln 2 */
+C1 = 6.93145751953125E-1L,
+C2 = 1.428606820309417232121458176568075500134E-6L,
+/* ln 2^-65 */
+minarg = -4.5054566736396445112120088E1L,
+/* ln 2^16384 */
+maxarg = 1.1356523406294143949492E4L;
+
+long double expm1l(long double x)
+{
+ long double px, qx, xx;
+ int k;
+
+ if (isnan(x))
+ return x;
+ if (x > maxarg)
+ return x*0x1p16383L; /* overflow, unless x==inf */
+ if (x == 0.0)
+ return x;
+ if (x < minarg)
+ return -1.0;
+
+ xx = C1 + C2;
+ /* Express x = ln 2 (k + remainder), remainder not exceeding 1/2. */
+ px = floorl(0.5 + x / xx);
+ k = px;
+ /* remainder times ln 2 */
+ x -= px * C1;
+ x -= px * C2;
+
+ /* Approximate exp(remainder ln 2).*/
+ px = (((( P4 * x + P3) * x + P2) * x + P1) * x + P0) * x;
+ qx = (((( x + Q4) * x + Q3) * x + Q2) * x + Q1) * x + Q0;
+ xx = x * x;
+ qx = x + (0.5 * xx + xx * px / qx);
+
+ /* exp(x) = exp(k ln 2) exp(remainder ln 2) = 2^k exp(remainder ln 2).
+ We have qx = exp(remainder ln 2) - 1, so
+ exp(x) - 1 = 2^k (qx + 1) - 1 = 2^k qx + 2^k - 1. */
+ px = scalbnl(1.0, k);
+ x = px * qx + (px - 1.0);
+ return x;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double expm1l(long double x)
+{
+ return expm1(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/fabs.c b/libc-top-half/musl/src/math/fabs.c
new file mode 100644
index 0000000..e8258cf
--- /dev/null
+++ b/libc-top-half/musl/src/math/fabs.c
@@ -0,0 +1,9 @@
+#include <math.h>
+#include <stdint.h>
+
+double fabs(double x)
+{
+ union {double f; uint64_t i;} u = {x};
+ u.i &= -1ULL/2;
+ return u.f;
+}
diff --git a/libc-top-half/musl/src/math/fabsf.c b/libc-top-half/musl/src/math/fabsf.c
new file mode 100644
index 0000000..4efc8d6
--- /dev/null
+++ b/libc-top-half/musl/src/math/fabsf.c
@@ -0,0 +1,9 @@
+#include <math.h>
+#include <stdint.h>
+
+float fabsf(float x)
+{
+ union {float f; uint32_t i;} u = {x};
+ u.i &= 0x7fffffff;
+ return u.f;
+}
diff --git a/libc-top-half/musl/src/math/fabsl.c b/libc-top-half/musl/src/math/fabsl.c
new file mode 100644
index 0000000..c4f36ec
--- /dev/null
+++ b/libc-top-half/musl/src/math/fabsl.c
@@ -0,0 +1,15 @@
+#include "libm.h"
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double fabsl(long double x)
+{
+ return fabs(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+long double fabsl(long double x)
+{
+ union ldshape u = {x};
+
+ u.i.se &= 0x7fff;
+ return u.f;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/fdim.c b/libc-top-half/musl/src/math/fdim.c
new file mode 100644
index 0000000..9585460
--- /dev/null
+++ b/libc-top-half/musl/src/math/fdim.c
@@ -0,0 +1,10 @@
+#include <math.h>
+
+double fdim(double x, double y)
+{
+ if (isnan(x))
+ return x;
+ if (isnan(y))
+ return y;
+ return x > y ? x - y : 0;
+}
diff --git a/libc-top-half/musl/src/math/fdimf.c b/libc-top-half/musl/src/math/fdimf.c
new file mode 100644
index 0000000..543c364
--- /dev/null
+++ b/libc-top-half/musl/src/math/fdimf.c
@@ -0,0 +1,10 @@
+#include <math.h>
+
+float fdimf(float x, float y)
+{
+ if (isnan(x))
+ return x;
+ if (isnan(y))
+ return y;
+ return x > y ? x - y : 0;
+}
diff --git a/libc-top-half/musl/src/math/fdiml.c b/libc-top-half/musl/src/math/fdiml.c
new file mode 100644
index 0000000..62e29b7
--- /dev/null
+++ b/libc-top-half/musl/src/math/fdiml.c
@@ -0,0 +1,18 @@
+#include <math.h>
+#include <float.h>
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double fdiml(long double x, long double y)
+{
+ return fdim(x, y);
+}
+#else
+long double fdiml(long double x, long double y)
+{
+ if (isnan(x))
+ return x;
+ if (isnan(y))
+ return y;
+ return x > y ? x - y : 0;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/finite.c b/libc-top-half/musl/src/math/finite.c
new file mode 100644
index 0000000..25a0575
--- /dev/null
+++ b/libc-top-half/musl/src/math/finite.c
@@ -0,0 +1,7 @@
+#define _GNU_SOURCE
+#include <math.h>
+
+int finite(double x)
+{
+ return isfinite(x);
+}
diff --git a/libc-top-half/musl/src/math/finitef.c b/libc-top-half/musl/src/math/finitef.c
new file mode 100644
index 0000000..2c4c771
--- /dev/null
+++ b/libc-top-half/musl/src/math/finitef.c
@@ -0,0 +1,7 @@
+#define _GNU_SOURCE
+#include <math.h>
+
+int finitef(float x)
+{
+ return isfinite(x);
+}
diff --git a/libc-top-half/musl/src/math/floor.c b/libc-top-half/musl/src/math/floor.c
new file mode 100644
index 0000000..14a31cd
--- /dev/null
+++ b/libc-top-half/musl/src/math/floor.c
@@ -0,0 +1,31 @@
+#include "libm.h"
+
+#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1
+#define EPS DBL_EPSILON
+#elif FLT_EVAL_METHOD==2
+#define EPS LDBL_EPSILON
+#endif
+static const double_t toint = 1/EPS;
+
+double floor(double x)
+{
+ union {double f; uint64_t i;} u = {x};
+ int e = u.i >> 52 & 0x7ff;
+ double_t y;
+
+ if (e >= 0x3ff+52 || x == 0)
+ return x;
+ /* y = int(x) - x, where int(x) is an integer neighbor of x */
+ if (u.i >> 63)
+ y = x - toint + toint - x;
+ else
+ y = x + toint - toint - x;
+ /* special case because of non-nearest rounding modes */
+ if (e <= 0x3ff-1) {
+ FORCE_EVAL(y);
+ return u.i >> 63 ? -1 : 0;
+ }
+ if (y > 0)
+ return x + y - 1;
+ return x + y;
+}
diff --git a/libc-top-half/musl/src/math/floorf.c b/libc-top-half/musl/src/math/floorf.c
new file mode 100644
index 0000000..dceec73
--- /dev/null
+++ b/libc-top-half/musl/src/math/floorf.c
@@ -0,0 +1,27 @@
+#include "libm.h"
+
+float floorf(float x)
+{
+ union {float f; uint32_t i;} u = {x};
+ int e = (int)(u.i >> 23 & 0xff) - 0x7f;
+ uint32_t m;
+
+ if (e >= 23)
+ return x;
+ if (e >= 0) {
+ m = 0x007fffff >> e;
+ if ((u.i & m) == 0)
+ return x;
+ FORCE_EVAL(x + 0x1p120f);
+ if (u.i >> 31)
+ u.i += m;
+ u.i &= ~m;
+ } else {
+ FORCE_EVAL(x + 0x1p120f);
+ if (u.i >> 31 == 0)
+ u.i = 0;
+ else if (u.i << 1)
+ u.f = -1.0;
+ }
+ return u.f;
+}
diff --git a/libc-top-half/musl/src/math/floorl.c b/libc-top-half/musl/src/math/floorl.c
new file mode 100644
index 0000000..16aaec4
--- /dev/null
+++ b/libc-top-half/musl/src/math/floorl.c
@@ -0,0 +1,34 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double floorl(long double x)
+{
+ return floor(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+
+static const long double toint = 1/LDBL_EPSILON;
+
+long double floorl(long double x)
+{
+ union ldshape u = {x};
+ int e = u.i.se & 0x7fff;
+ long double y;
+
+ if (e >= 0x3fff+LDBL_MANT_DIG-1 || x == 0)
+ return x;
+ /* y = int(x) - x, where int(x) is an integer neighbor of x */
+ if (u.i.se >> 15)
+ y = x - toint + toint - x;
+ else
+ y = x + toint - toint - x;
+ /* special case because of non-nearest rounding modes */
+ if (e <= 0x3fff-1) {
+ FORCE_EVAL(y);
+ return u.i.se >> 15 ? -1 : 0;
+ }
+ if (y > 0)
+ return x + y - 1;
+ return x + y;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/fma.c b/libc-top-half/musl/src/math/fma.c
new file mode 100644
index 0000000..0c6f90c
--- /dev/null
+++ b/libc-top-half/musl/src/math/fma.c
@@ -0,0 +1,183 @@
+#include <stdint.h>
+#include <float.h>
+#include <math.h>
+#include "atomic.h"
+
+#define ASUINT64(x) ((union {double f; uint64_t i;}){x}).i
+#define ZEROINFNAN (0x7ff-0x3ff-52-1)
+
+struct num { uint64_t m; int e; int sign; };
+
+static struct num normalize(double x)
+{
+ uint64_t ix = ASUINT64(x);
+ int e = ix>>52;
+ int sign = e & 0x800;
+ e &= 0x7ff;
+ if (!e) {
+ ix = ASUINT64(x*0x1p63);
+ e = ix>>52 & 0x7ff;
+ e = e ? e-63 : 0x800;
+ }
+ ix &= (1ull<<52)-1;
+ ix |= 1ull<<52;
+ ix <<= 1;
+ e -= 0x3ff + 52 + 1;
+ return (struct num){ix,e,sign};
+}
+
+static void mul(uint64_t *hi, uint64_t *lo, uint64_t x, uint64_t y)
+{
+ uint64_t t1,t2,t3;
+ uint64_t xlo = (uint32_t)x, xhi = x>>32;
+ uint64_t ylo = (uint32_t)y, yhi = y>>32;
+
+ t1 = xlo*ylo;
+ t2 = xlo*yhi + xhi*ylo;
+ t3 = xhi*yhi;
+ *lo = t1 + (t2<<32);
+ *hi = t3 + (t2>>32) + (t1 > *lo);
+}
+
+double fma(double x, double y, double z)
+{
+ #pragma STDC FENV_ACCESS ON
+
+ /* normalize so top 10bits and last bit are 0 */
+ struct num nx, ny, nz;
+ nx = normalize(x);
+ ny = normalize(y);
+ nz = normalize(z);
+
+ if (nx.e >= ZEROINFNAN || ny.e >= ZEROINFNAN)
+ return x*y + z;
+ if (nz.e >= ZEROINFNAN) {
+ if (nz.e > ZEROINFNAN) /* z==0 */
+ return x*y + z;
+ return z;
+ }
+
+ /* mul: r = x*y */
+ uint64_t rhi, rlo, zhi, zlo;
+ mul(&rhi, &rlo, nx.m, ny.m);
+ /* either top 20 or 21 bits of rhi and last 2 bits of rlo are 0 */
+
+ /* align exponents */
+ int e = nx.e + ny.e;
+ int d = nz.e - e;
+ /* shift bits z<<=kz, r>>=kr, so kz+kr == d, set e = e+kr (== ez-kz) */
+ if (d > 0) {
+ if (d < 64) {
+ zlo = nz.m<<d;
+ zhi = nz.m>>64-d;
+ } else {
+ zlo = 0;
+ zhi = nz.m;
+ e = nz.e - 64;
+ d -= 64;
+ if (d == 0) {
+ } else if (d < 64) {
+ rlo = rhi<<64-d | rlo>>d | !!(rlo<<64-d);
+ rhi = rhi>>d;
+ } else {
+ rlo = 1;
+ rhi = 0;
+ }
+ }
+ } else {
+ zhi = 0;
+ d = -d;
+ if (d == 0) {
+ zlo = nz.m;
+ } else if (d < 64) {
+ zlo = nz.m>>d | !!(nz.m<<64-d);
+ } else {
+ zlo = 1;
+ }
+ }
+
+ /* add */
+ int sign = nx.sign^ny.sign;
+ int samesign = !(sign^nz.sign);
+ int nonzero = 1;
+ if (samesign) {
+ /* r += z */
+ rlo += zlo;
+ rhi += zhi + (rlo < zlo);
+ } else {
+ /* r -= z */
+ uint64_t t = rlo;
+ rlo -= zlo;
+ rhi = rhi - zhi - (t < rlo);
+ if (rhi>>63) {
+ rlo = -rlo;
+ rhi = -rhi-!!rlo;
+ sign = !sign;
+ }
+ nonzero = !!rhi;
+ }
+
+ /* set rhi to top 63bit of the result (last bit is sticky) */
+ if (nonzero) {
+ e += 64;
+ d = a_clz_64(rhi)-1;
+ /* note: d > 0 */
+ rhi = rhi<<d | rlo>>64-d | !!(rlo<<d);
+ } else if (rlo) {
+ d = a_clz_64(rlo)-1;
+ if (d < 0)
+ rhi = rlo>>1 | (rlo&1);
+ else
+ rhi = rlo<<d;
+ } else {
+ /* exact +-0 */
+ return x*y + z;
+ }
+ e -= d;
+
+ /* convert to double */
+ int64_t i = rhi; /* i is in [1<<62,(1<<63)-1] */
+ if (sign)
+ i = -i;
+ double r = i; /* |r| is in [0x1p62,0x1p63] */
+
+ if (e < -1022-62) {
+ /* result is subnormal before rounding */
+ if (e == -1022-63) {
+ double c = 0x1p63;
+ if (sign)
+ c = -c;
+ if (r == c) {
+ /* min normal after rounding, underflow depends
+ on arch behaviour which can be imitated by
+ a double to float conversion */
+ float fltmin = 0x0.ffffff8p-63*FLT_MIN * r;
+ return DBL_MIN/FLT_MIN * fltmin;
+ }
+ /* one bit is lost when scaled, add another top bit to
+ only round once at conversion if it is inexact */
+ if (rhi << 53) {
+ i = rhi>>1 | (rhi&1) | 1ull<<62;
+ if (sign)
+ i = -i;
+ r = i;
+ r = 2*r - c; /* remove top bit */
+
+ /* raise underflow portably, such that it
+ cannot be optimized away */
+ {
+ double_t tiny = DBL_MIN/FLT_MIN * r;
+ r += (double)(tiny*tiny) * (r-r);
+ }
+ }
+ } else {
+ /* only round once when scaled */
+ d = 10;
+ i = ( rhi>>d | !!(rhi<<64-d) ) << d;
+ if (sign)
+ i = -i;
+ r = i;
+ }
+ }
+ return scalbn(r, e);
+}
diff --git a/libc-top-half/musl/src/math/fmaf.c b/libc-top-half/musl/src/math/fmaf.c
new file mode 100644
index 0000000..7c65acf
--- /dev/null
+++ b/libc-top-half/musl/src/math/fmaf.c
@@ -0,0 +1,92 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_fmaf.c */
+/*-
+ * Copyright (c) 2005-2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <fenv.h>
+#include <math.h>
+#include <stdint.h>
+
+/*
+ * Fused multiply-add: Compute x * y + z with a single rounding error.
+ *
+ * A double has more than twice as much precision than a float, so
+ * direct double-precision arithmetic suffices, except where double
+ * rounding occurs.
+ */
+float fmaf(float x, float y, float z)
+{
+ #pragma STDC FENV_ACCESS ON
+ double xy, result;
+ union {double f; uint64_t i;} u;
+ int e;
+
+ xy = (double)x * y;
+ result = xy + z;
+ u.f = result;
+ e = u.i>>52 & 0x7ff;
+ /* Common case: The double precision result is fine. */
+ if ((u.i & 0x1fffffff) != 0x10000000 || /* not a halfway case */
+ e == 0x7ff || /* NaN */
+ (result - xy == z && result - z == xy) || /* exact */
+ fegetround() != FE_TONEAREST) /* not round-to-nearest */
+ {
+ /*
+ underflow may not be raised correctly, example:
+ fmaf(0x1p-120f, 0x1p-120f, 0x1p-149f)
+ */
+#if defined(FE_INEXACT) && defined(FE_UNDERFLOW)
+ if (e < 0x3ff-126 && e >= 0x3ff-149 && fetestexcept(FE_INEXACT)) {
+ feclearexcept(FE_INEXACT);
+ /* TODO: gcc and clang bug workaround */
+ volatile float vz = z;
+ result = xy + vz;
+ if (fetestexcept(FE_INEXACT))
+ feraiseexcept(FE_UNDERFLOW);
+ else
+ feraiseexcept(FE_INEXACT);
+ }
+#endif
+ z = result;
+ return z;
+ }
+
+ /*
+ * If result is inexact, and exactly halfway between two float values,
+ * we need to adjust the low-order bit in the direction of the error.
+ */
+ double err;
+ int neg = u.i >> 63;
+ if (neg == (z > xy))
+ err = xy - result + z;
+ else
+ err = z - result + xy;
+ if (neg == (err < 0))
+ u.i++;
+ else
+ u.i--;
+ z = u.f;
+ return z;
+}
diff --git a/libc-top-half/musl/src/math/fmal.c b/libc-top-half/musl/src/math/fmal.c
new file mode 100644
index 0000000..dd0e263
--- /dev/null
+++ b/libc-top-half/musl/src/math/fmal.c
@@ -0,0 +1,297 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_fmal.c */
+/*-
+ * Copyright (c) 2005-2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "libm.h"
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double fmal(long double x, long double y, long double z)
+{
+ return fma(x, y, z);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+#include <fenv.h>
+#if LDBL_MANT_DIG == 64
+#define LASTBIT(u) (u.i.m & 1)
+#define SPLIT (0x1p32L + 1)
+#elif LDBL_MANT_DIG == 113
+#define LASTBIT(u) (u.i.lo & 1)
+#define SPLIT (0x1p57L + 1)
+#endif
+
+/*
+ * A struct dd represents a floating-point number with twice the precision
+ * of a long double. We maintain the invariant that "hi" stores the high-order
+ * bits of the result.
+ */
+struct dd {
+ long double hi;
+ long double lo;
+};
+
+/*
+ * Compute a+b exactly, returning the exact result in a struct dd. We assume
+ * that both a and b are finite, but make no assumptions about their relative
+ * magnitudes.
+ */
+static inline struct dd dd_add(long double a, long double b)
+{
+ struct dd ret;
+ long double s;
+
+ ret.hi = a + b;
+ s = ret.hi - a;
+ ret.lo = (a - (ret.hi - s)) + (b - s);
+ return (ret);
+}
+
+/*
+ * Compute a+b, with a small tweak: The least significant bit of the
+ * result is adjusted into a sticky bit summarizing all the bits that
+ * were lost to rounding. This adjustment negates the effects of double
+ * rounding when the result is added to another number with a higher
+ * exponent. For an explanation of round and sticky bits, see any reference
+ * on FPU design, e.g.,
+ *
+ * J. Coonen. An Implementation Guide to a Proposed Standard for
+ * Floating-Point Arithmetic. Computer, vol. 13, no. 1, Jan 1980.
+ */
+static inline long double add_adjusted(long double a, long double b)
+{
+ struct dd sum;
+ union ldshape u;
+
+ sum = dd_add(a, b);
+ if (sum.lo != 0) {
+ u.f = sum.hi;
+ if (!LASTBIT(u))
+ sum.hi = nextafterl(sum.hi, INFINITY * sum.lo);
+ }
+ return (sum.hi);
+}
+
+/*
+ * Compute ldexp(a+b, scale) with a single rounding error. It is assumed
+ * that the result will be subnormal, and care is taken to ensure that
+ * double rounding does not occur.
+ */
+static inline long double add_and_denormalize(long double a, long double b, int scale)
+{
+ struct dd sum;
+ int bits_lost;
+ union ldshape u;
+
+ sum = dd_add(a, b);
+
+ /*
+ * If we are losing at least two bits of accuracy to denormalization,
+ * then the first lost bit becomes a round bit, and we adjust the
+ * lowest bit of sum.hi to make it a sticky bit summarizing all the
+ * bits in sum.lo. With the sticky bit adjusted, the hardware will
+ * break any ties in the correct direction.
+ *
+ * If we are losing only one bit to denormalization, however, we must
+ * break the ties manually.
+ */
+ if (sum.lo != 0) {
+ u.f = sum.hi;
+ bits_lost = -u.i.se - scale + 1;
+ if ((bits_lost != 1) ^ LASTBIT(u))
+ sum.hi = nextafterl(sum.hi, INFINITY * sum.lo);
+ }
+ return scalbnl(sum.hi, scale);
+}
+
+/*
+ * Compute a*b exactly, returning the exact result in a struct dd. We assume
+ * that both a and b are normalized, so no underflow or overflow will occur.
+ * The current rounding mode must be round-to-nearest.
+ */
+static inline struct dd dd_mul(long double a, long double b)
+{
+ struct dd ret;
+ long double ha, hb, la, lb, p, q;
+
+ p = a * SPLIT;
+ ha = a - p;
+ ha += p;
+ la = a - ha;
+
+ p = b * SPLIT;
+ hb = b - p;
+ hb += p;
+ lb = b - hb;
+
+ p = ha * hb;
+ q = ha * lb + la * hb;
+
+ ret.hi = p + q;
+ ret.lo = p - ret.hi + q + la * lb;
+ return (ret);
+}
+
+/*
+ * Fused multiply-add: Compute x * y + z with a single rounding error.
+ *
+ * We use scaling to avoid overflow/underflow, along with the
+ * canonical precision-doubling technique adapted from:
+ *
+ * Dekker, T. A Floating-Point Technique for Extending the
+ * Available Precision. Numer. Math. 18, 224-242 (1971).
+ */
+long double fmal(long double x, long double y, long double z)
+{
+ #pragma STDC FENV_ACCESS ON
+ long double xs, ys, zs, adj;
+ struct dd xy, r;
+ int oround;
+ int ex, ey, ez;
+ int spread;
+
+ /*
+ * Handle special cases. The order of operations and the particular
+ * return values here are crucial in handling special cases involving
+ * infinities, NaNs, overflows, and signed zeroes correctly.
+ */
+ if (!isfinite(x) || !isfinite(y))
+ return (x * y + z);
+ if (!isfinite(z))
+ return (z);
+ if (x == 0.0 || y == 0.0)
+ return (x * y + z);
+ if (z == 0.0)
+ return (x * y);
+
+ xs = frexpl(x, &ex);
+ ys = frexpl(y, &ey);
+ zs = frexpl(z, &ez);
+ oround = fegetround();
+ spread = ex + ey - ez;
+
+ /*
+ * If x * y and z are many orders of magnitude apart, the scaling
+ * will overflow, so we handle these cases specially. Rounding
+ * modes other than FE_TONEAREST are painful.
+ */
+ if (spread < -LDBL_MANT_DIG) {
+#ifdef FE_INEXACT
+ feraiseexcept(FE_INEXACT);
+#endif
+#ifdef FE_UNDERFLOW
+ if (!isnormal(z))
+ feraiseexcept(FE_UNDERFLOW);
+#endif
+ switch (oround) {
+ default: /* FE_TONEAREST */
+ return (z);
+#ifdef FE_TOWARDZERO
+ case FE_TOWARDZERO:
+ if (x > 0.0 ^ y < 0.0 ^ z < 0.0)
+ return (z);
+ else
+ return (nextafterl(z, 0));
+#endif
+#ifdef FE_DOWNWARD
+ case FE_DOWNWARD:
+ if (x > 0.0 ^ y < 0.0)
+ return (z);
+ else
+ return (nextafterl(z, -INFINITY));
+#endif
+#ifdef FE_UPWARD
+ case FE_UPWARD:
+ if (x > 0.0 ^ y < 0.0)
+ return (nextafterl(z, INFINITY));
+ else
+ return (z);
+#endif
+ }
+ }
+ if (spread <= LDBL_MANT_DIG * 2)
+ zs = scalbnl(zs, -spread);
+ else
+ zs = copysignl(LDBL_MIN, zs);
+
+ fesetround(FE_TONEAREST);
+
+ /*
+ * Basic approach for round-to-nearest:
+ *
+ * (xy.hi, xy.lo) = x * y (exact)
+ * (r.hi, r.lo) = xy.hi + z (exact)
+ * adj = xy.lo + r.lo (inexact; low bit is sticky)
+ * result = r.hi + adj (correctly rounded)
+ */
+ xy = dd_mul(xs, ys);
+ r = dd_add(xy.hi, zs);
+
+ spread = ex + ey;
+
+ if (r.hi == 0.0) {
+ /*
+ * When the addends cancel to 0, ensure that the result has
+ * the correct sign.
+ */
+ fesetround(oround);
+#ifdef __wasilibc_unmodified_upstream // WASI doesn't need old GCC workarounds
+ volatile long double vzs = zs; /* XXX gcc CSE bug workaround */
+#else
+ long double vzs = zs;
+#endif
+ return xy.hi + vzs + scalbnl(xy.lo, spread);
+ }
+
+ if (oround != FE_TONEAREST) {
+ /*
+ * There is no need to worry about double rounding in directed
+ * rounding modes.
+ * But underflow may not be raised correctly, example in downward rounding:
+ * fmal(0x1.0000000001p-16000L, 0x1.0000000001p-400L, -0x1p-16440L)
+ */
+ long double ret;
+#if defined(FE_INEXACT) && defined(FE_UNDERFLOW)
+ int e = fetestexcept(FE_INEXACT);
+ feclearexcept(FE_INEXACT);
+#endif
+ fesetround(oround);
+ adj = r.lo + xy.lo;
+ ret = scalbnl(r.hi + adj, spread);
+#if defined(FE_INEXACT) && defined(FE_UNDERFLOW)
+ if (ilogbl(ret) < -16382 && fetestexcept(FE_INEXACT))
+ feraiseexcept(FE_UNDERFLOW);
+ else if (e)
+ feraiseexcept(FE_INEXACT);
+#endif
+ return ret;
+ }
+
+ adj = add_adjusted(r.lo, xy.lo);
+ if (spread + ilogbl(r.hi) > -16383)
+ return scalbnl(r.hi + adj, spread);
+ else
+ return add_and_denormalize(r.hi, adj, spread);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/fmax.c b/libc-top-half/musl/src/math/fmax.c
new file mode 100644
index 0000000..94f0caa
--- /dev/null
+++ b/libc-top-half/musl/src/math/fmax.c
@@ -0,0 +1,13 @@
+#include <math.h>
+
+double fmax(double x, double y)
+{
+ if (isnan(x))
+ return y;
+ if (isnan(y))
+ return x;
+ /* handle signed zeros, see C99 Annex F.9.9.2 */
+ if (signbit(x) != signbit(y))
+ return signbit(x) ? y : x;
+ return x < y ? y : x;
+}
diff --git a/libc-top-half/musl/src/math/fmaxf.c b/libc-top-half/musl/src/math/fmaxf.c
new file mode 100644
index 0000000..695d817
--- /dev/null
+++ b/libc-top-half/musl/src/math/fmaxf.c
@@ -0,0 +1,13 @@
+#include <math.h>
+
+float fmaxf(float x, float y)
+{
+ if (isnan(x))
+ return y;
+ if (isnan(y))
+ return x;
+ /* handle signed zeroes, see C99 Annex F.9.9.2 */
+ if (signbit(x) != signbit(y))
+ return signbit(x) ? y : x;
+ return x < y ? y : x;
+}
diff --git a/libc-top-half/musl/src/math/fmaxl.c b/libc-top-half/musl/src/math/fmaxl.c
new file mode 100644
index 0000000..4b03158
--- /dev/null
+++ b/libc-top-half/musl/src/math/fmaxl.c
@@ -0,0 +1,21 @@
+#include <math.h>
+#include <float.h>
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double fmaxl(long double x, long double y)
+{
+ return fmax(x, y);
+}
+#else
+long double fmaxl(long double x, long double y)
+{
+ if (isnan(x))
+ return y;
+ if (isnan(y))
+ return x;
+ /* handle signed zeros, see C99 Annex F.9.9.2 */
+ if (signbit(x) != signbit(y))
+ return signbit(x) ? y : x;
+ return x < y ? y : x;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/fmin.c b/libc-top-half/musl/src/math/fmin.c
new file mode 100644
index 0000000..08a8fd1
--- /dev/null
+++ b/libc-top-half/musl/src/math/fmin.c
@@ -0,0 +1,13 @@
+#include <math.h>
+
+double fmin(double x, double y)
+{
+ if (isnan(x))
+ return y;
+ if (isnan(y))
+ return x;
+ /* handle signed zeros, see C99 Annex F.9.9.2 */
+ if (signbit(x) != signbit(y))
+ return signbit(x) ? x : y;
+ return x < y ? x : y;
+}
diff --git a/libc-top-half/musl/src/math/fminf.c b/libc-top-half/musl/src/math/fminf.c
new file mode 100644
index 0000000..3573c7d
--- /dev/null
+++ b/libc-top-half/musl/src/math/fminf.c
@@ -0,0 +1,13 @@
+#include <math.h>
+
+float fminf(float x, float y)
+{
+ if (isnan(x))
+ return y;
+ if (isnan(y))
+ return x;
+ /* handle signed zeros, see C99 Annex F.9.9.2 */
+ if (signbit(x) != signbit(y))
+ return signbit(x) ? x : y;
+ return x < y ? x : y;
+}
diff --git a/libc-top-half/musl/src/math/fminl.c b/libc-top-half/musl/src/math/fminl.c
new file mode 100644
index 0000000..69bc24a
--- /dev/null
+++ b/libc-top-half/musl/src/math/fminl.c
@@ -0,0 +1,21 @@
+#include <math.h>
+#include <float.h>
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double fminl(long double x, long double y)
+{
+ return fmin(x, y);
+}
+#else
+long double fminl(long double x, long double y)
+{
+ if (isnan(x))
+ return y;
+ if (isnan(y))
+ return x;
+ /* handle signed zeros, see C99 Annex F.9.9.2 */
+ if (signbit(x) != signbit(y))
+ return signbit(x) ? x : y;
+ return x < y ? x : y;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/fmod.c b/libc-top-half/musl/src/math/fmod.c
new file mode 100644
index 0000000..6849722
--- /dev/null
+++ b/libc-top-half/musl/src/math/fmod.c
@@ -0,0 +1,68 @@
+#include <math.h>
+#include <stdint.h>
+
+double fmod(double x, double y)
+{
+ union {double f; uint64_t i;} ux = {x}, uy = {y};
+ int ex = ux.i>>52 & 0x7ff;
+ int ey = uy.i>>52 & 0x7ff;
+ int sx = ux.i>>63;
+ uint64_t i;
+
+ /* in the followings uxi should be ux.i, but then gcc wrongly adds */
+ /* float load/store to inner loops ruining performance and code size */
+ uint64_t uxi = ux.i;
+
+ if (uy.i<<1 == 0 || isnan(y) || ex == 0x7ff)
+ return (x*y)/(x*y);
+ if (uxi<<1 <= uy.i<<1) {
+ if (uxi<<1 == uy.i<<1)
+ return 0*x;
+ return x;
+ }
+
+ /* normalize x and y */
+ if (!ex) {
+ for (i = uxi<<12; i>>63 == 0; ex--, i <<= 1);
+ uxi <<= -ex + 1;
+ } else {
+ uxi &= -1ULL >> 12;
+ uxi |= 1ULL << 52;
+ }
+ if (!ey) {
+ for (i = uy.i<<12; i>>63 == 0; ey--, i <<= 1);
+ uy.i <<= -ey + 1;
+ } else {
+ uy.i &= -1ULL >> 12;
+ uy.i |= 1ULL << 52;
+ }
+
+ /* x mod y */
+ for (; ex > ey; ex--) {
+ i = uxi - uy.i;
+ if (i >> 63 == 0) {
+ if (i == 0)
+ return 0*x;
+ uxi = i;
+ }
+ uxi <<= 1;
+ }
+ i = uxi - uy.i;
+ if (i >> 63 == 0) {
+ if (i == 0)
+ return 0*x;
+ uxi = i;
+ }
+ for (; uxi>>52 == 0; uxi <<= 1, ex--);
+
+ /* scale result */
+ if (ex > 0) {
+ uxi -= 1ULL << 52;
+ uxi |= (uint64_t)ex << 52;
+ } else {
+ uxi >>= -ex + 1;
+ }
+ uxi |= (uint64_t)sx << 63;
+ ux.i = uxi;
+ return ux.f;
+}
diff --git a/libc-top-half/musl/src/math/fmodf.c b/libc-top-half/musl/src/math/fmodf.c
new file mode 100644
index 0000000..ff58f93
--- /dev/null
+++ b/libc-top-half/musl/src/math/fmodf.c
@@ -0,0 +1,65 @@
+#include <math.h>
+#include <stdint.h>
+
+float fmodf(float x, float y)
+{
+ union {float f; uint32_t i;} ux = {x}, uy = {y};
+ int ex = ux.i>>23 & 0xff;
+ int ey = uy.i>>23 & 0xff;
+ uint32_t sx = ux.i & 0x80000000;
+ uint32_t i;
+ uint32_t uxi = ux.i;
+
+ if (uy.i<<1 == 0 || isnan(y) || ex == 0xff)
+ return (x*y)/(x*y);
+ if (uxi<<1 <= uy.i<<1) {
+ if (uxi<<1 == uy.i<<1)
+ return 0*x;
+ return x;
+ }
+
+ /* normalize x and y */
+ if (!ex) {
+ for (i = uxi<<9; i>>31 == 0; ex--, i <<= 1);
+ uxi <<= -ex + 1;
+ } else {
+ uxi &= -1U >> 9;
+ uxi |= 1U << 23;
+ }
+ if (!ey) {
+ for (i = uy.i<<9; i>>31 == 0; ey--, i <<= 1);
+ uy.i <<= -ey + 1;
+ } else {
+ uy.i &= -1U >> 9;
+ uy.i |= 1U << 23;
+ }
+
+ /* x mod y */
+ for (; ex > ey; ex--) {
+ i = uxi - uy.i;
+ if (i >> 31 == 0) {
+ if (i == 0)
+ return 0*x;
+ uxi = i;
+ }
+ uxi <<= 1;
+ }
+ i = uxi - uy.i;
+ if (i >> 31 == 0) {
+ if (i == 0)
+ return 0*x;
+ uxi = i;
+ }
+ for (; uxi>>23 == 0; uxi <<= 1, ex--);
+
+ /* scale result up */
+ if (ex > 0) {
+ uxi -= 1U << 23;
+ uxi |= (uint32_t)ex << 23;
+ } else {
+ uxi >>= -ex + 1;
+ }
+ uxi |= sx;
+ ux.i = uxi;
+ return ux.f;
+}
diff --git a/libc-top-half/musl/src/math/fmodl.c b/libc-top-half/musl/src/math/fmodl.c
new file mode 100644
index 0000000..9f5b873
--- /dev/null
+++ b/libc-top-half/musl/src/math/fmodl.c
@@ -0,0 +1,105 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double fmodl(long double x, long double y)
+{
+ return fmod(x, y);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+long double fmodl(long double x, long double y)
+{
+ union ldshape ux = {x}, uy = {y};
+ int ex = ux.i.se & 0x7fff;
+ int ey = uy.i.se & 0x7fff;
+ int sx = ux.i.se & 0x8000;
+
+ if (y == 0 || isnan(y) || ex == 0x7fff)
+ return (x*y)/(x*y);
+ ux.i.se = ex;
+ uy.i.se = ey;
+ if (ux.f <= uy.f) {
+ if (ux.f == uy.f)
+ return 0*x;
+ return x;
+ }
+
+ /* normalize x and y */
+ if (!ex) {
+ ux.f *= 0x1p120f;
+ ex = ux.i.se - 120;
+ }
+ if (!ey) {
+ uy.f *= 0x1p120f;
+ ey = uy.i.se - 120;
+ }
+
+ /* x mod y */
+#if LDBL_MANT_DIG == 64
+ uint64_t i, mx, my;
+ mx = ux.i.m;
+ my = uy.i.m;
+ for (; ex > ey; ex--) {
+ i = mx - my;
+ if (mx >= my) {
+ if (i == 0)
+ return 0*x;
+ mx = 2*i;
+ } else if (2*mx < mx) {
+ mx = 2*mx - my;
+ } else {
+ mx = 2*mx;
+ }
+ }
+ i = mx - my;
+ if (mx >= my) {
+ if (i == 0)
+ return 0*x;
+ mx = i;
+ }
+ for (; mx >> 63 == 0; mx *= 2, ex--);
+ ux.i.m = mx;
+#elif LDBL_MANT_DIG == 113
+ uint64_t hi, lo, xhi, xlo, yhi, ylo;
+ xhi = (ux.i2.hi & -1ULL>>16) | 1ULL<<48;
+ yhi = (uy.i2.hi & -1ULL>>16) | 1ULL<<48;
+ xlo = ux.i2.lo;
+ ylo = uy.i2.lo;
+ for (; ex > ey; ex--) {
+ hi = xhi - yhi;
+ lo = xlo - ylo;
+ if (xlo < ylo)
+ hi -= 1;
+ if (hi >> 63 == 0) {
+ if ((hi|lo) == 0)
+ return 0*x;
+ xhi = 2*hi + (lo>>63);
+ xlo = 2*lo;
+ } else {
+ xhi = 2*xhi + (xlo>>63);
+ xlo = 2*xlo;
+ }
+ }
+ hi = xhi - yhi;
+ lo = xlo - ylo;
+ if (xlo < ylo)
+ hi -= 1;
+ if (hi >> 63 == 0) {
+ if ((hi|lo) == 0)
+ return 0*x;
+ xhi = hi;
+ xlo = lo;
+ }
+ for (; xhi >> 48 == 0; xhi = 2*xhi + (xlo>>63), xlo = 2*xlo, ex--);
+ ux.i2.hi = xhi;
+ ux.i2.lo = xlo;
+#endif
+
+ /* scale result */
+ if (ex <= 0) {
+ ux.i.se = (ex+120)|sx;
+ ux.f *= 0x1p-120f;
+ } else
+ ux.i.se = ex|sx;
+ return ux.f;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/frexp.c b/libc-top-half/musl/src/math/frexp.c
new file mode 100644
index 0000000..27b6266
--- /dev/null
+++ b/libc-top-half/musl/src/math/frexp.c
@@ -0,0 +1,23 @@
+#include <math.h>
+#include <stdint.h>
+
+double frexp(double x, int *e)
+{
+ union { double d; uint64_t i; } y = { x };
+ int ee = y.i>>52 & 0x7ff;
+
+ if (!ee) {
+ if (x) {
+ x = frexp(x*0x1p64, e);
+ *e -= 64;
+ } else *e = 0;
+ return x;
+ } else if (ee == 0x7ff) {
+ return x;
+ }
+
+ *e = ee - 0x3fe;
+ y.i &= 0x800fffffffffffffull;
+ y.i |= 0x3fe0000000000000ull;
+ return y.d;
+}
diff --git a/libc-top-half/musl/src/math/frexpf.c b/libc-top-half/musl/src/math/frexpf.c
new file mode 100644
index 0000000..0787097
--- /dev/null
+++ b/libc-top-half/musl/src/math/frexpf.c
@@ -0,0 +1,23 @@
+#include <math.h>
+#include <stdint.h>
+
+float frexpf(float x, int *e)
+{
+ union { float f; uint32_t i; } y = { x };
+ int ee = y.i>>23 & 0xff;
+
+ if (!ee) {
+ if (x) {
+ x = frexpf(x*0x1p64, e);
+ *e -= 64;
+ } else *e = 0;
+ return x;
+ } else if (ee == 0xff) {
+ return x;
+ }
+
+ *e = ee - 0x7e;
+ y.i &= 0x807ffffful;
+ y.i |= 0x3f000000ul;
+ return y.f;
+}
diff --git a/libc-top-half/musl/src/math/frexpl.c b/libc-top-half/musl/src/math/frexpl.c
new file mode 100644
index 0000000..3c1b553
--- /dev/null
+++ b/libc-top-half/musl/src/math/frexpl.c
@@ -0,0 +1,29 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double frexpl(long double x, int *e)
+{
+ return frexp(x, e);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+long double frexpl(long double x, int *e)
+{
+ union ldshape u = {x};
+ int ee = u.i.se & 0x7fff;
+
+ if (!ee) {
+ if (x) {
+ x = frexpl(x*0x1p120, e);
+ *e -= 120;
+ } else *e = 0;
+ return x;
+ } else if (ee == 0x7fff) {
+ return x;
+ }
+
+ *e = ee - 0x3ffe;
+ u.i.se &= 0x8000;
+ u.i.se |= 0x3ffe;
+ return u.f;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/hypot.c b/libc-top-half/musl/src/math/hypot.c
new file mode 100644
index 0000000..6071bf1
--- /dev/null
+++ b/libc-top-half/musl/src/math/hypot.c
@@ -0,0 +1,67 @@
+#include <math.h>
+#include <stdint.h>
+#include <float.h>
+
+#if FLT_EVAL_METHOD > 1U && LDBL_MANT_DIG == 64
+#define SPLIT (0x1p32 + 1)
+#else
+#define SPLIT (0x1p27 + 1)
+#endif
+
+static void sq(double_t *hi, double_t *lo, double x)
+{
+ double_t xh, xl, xc;
+
+ xc = (double_t)x*SPLIT;
+ xh = x - xc + xc;
+ xl = x - xh;
+ *hi = (double_t)x*x;
+ *lo = xh*xh - *hi + 2*xh*xl + xl*xl;
+}
+
+double hypot(double x, double y)
+{
+ union {double f; uint64_t i;} ux = {x}, uy = {y}, ut;
+ int ex, ey;
+ double_t hx, lx, hy, ly, z;
+
+ /* arrange |x| >= |y| */
+ ux.i &= -1ULL>>1;
+ uy.i &= -1ULL>>1;
+ if (ux.i < uy.i) {
+ ut = ux;
+ ux = uy;
+ uy = ut;
+ }
+
+ /* special cases */
+ ex = ux.i>>52;
+ ey = uy.i>>52;
+ x = ux.f;
+ y = uy.f;
+ /* note: hypot(inf,nan) == inf */
+ if (ey == 0x7ff)
+ return y;
+ if (ex == 0x7ff || uy.i == 0)
+ return x;
+ /* note: hypot(x,y) ~= x + y*y/x/2 with inexact for small y/x */
+ /* 64 difference is enough for ld80 double_t */
+ if (ex - ey > 64)
+ return x + y;
+
+ /* precise sqrt argument in nearest rounding mode without overflow */
+ /* xh*xh must not overflow and xl*xl must not underflow in sq */
+ z = 1;
+ if (ex > 0x3ff+510) {
+ z = 0x1p700;
+ x *= 0x1p-700;
+ y *= 0x1p-700;
+ } else if (ey < 0x3ff-450) {
+ z = 0x1p-700;
+ x *= 0x1p700;
+ y *= 0x1p700;
+ }
+ sq(&hx, &lx, x);
+ sq(&hy, &ly, y);
+ return z*sqrt(ly+lx+hy+hx);
+}
diff --git a/libc-top-half/musl/src/math/hypotf.c b/libc-top-half/musl/src/math/hypotf.c
new file mode 100644
index 0000000..2fc214b
--- /dev/null
+++ b/libc-top-half/musl/src/math/hypotf.c
@@ -0,0 +1,35 @@
+#include <math.h>
+#include <stdint.h>
+
+float hypotf(float x, float y)
+{
+ union {float f; uint32_t i;} ux = {x}, uy = {y}, ut;
+ float_t z;
+
+ ux.i &= -1U>>1;
+ uy.i &= -1U>>1;
+ if (ux.i < uy.i) {
+ ut = ux;
+ ux = uy;
+ uy = ut;
+ }
+
+ x = ux.f;
+ y = uy.f;
+ if (uy.i == 0xff<<23)
+ return y;
+ if (ux.i >= 0xff<<23 || uy.i == 0 || ux.i - uy.i >= 25<<23)
+ return x + y;
+
+ z = 1;
+ if (ux.i >= (0x7f+60)<<23) {
+ z = 0x1p90f;
+ x *= 0x1p-90f;
+ y *= 0x1p-90f;
+ } else if (uy.i < (0x7f-60)<<23) {
+ z = 0x1p-90f;
+ x *= 0x1p90f;
+ y *= 0x1p90f;
+ }
+ return z*sqrtf((double)x*x + (double)y*y);
+}
diff --git a/libc-top-half/musl/src/math/hypotl.c b/libc-top-half/musl/src/math/hypotl.c
new file mode 100644
index 0000000..479aa92
--- /dev/null
+++ b/libc-top-half/musl/src/math/hypotl.c
@@ -0,0 +1,66 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double hypotl(long double x, long double y)
+{
+ return hypot(x, y);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+#if LDBL_MANT_DIG == 64
+#define SPLIT (0x1p32L+1)
+#elif LDBL_MANT_DIG == 113
+#define SPLIT (0x1p57L+1)
+#endif
+
+static void sq(long double *hi, long double *lo, long double x)
+{
+ long double xh, xl, xc;
+ xc = x*SPLIT;
+ xh = x - xc + xc;
+ xl = x - xh;
+ *hi = x*x;
+ *lo = xh*xh - *hi + 2*xh*xl + xl*xl;
+}
+
+long double hypotl(long double x, long double y)
+{
+ union ldshape ux = {x}, uy = {y};
+ int ex, ey;
+ long double hx, lx, hy, ly, z;
+
+ ux.i.se &= 0x7fff;
+ uy.i.se &= 0x7fff;
+ if (ux.i.se < uy.i.se) {
+ ex = uy.i.se;
+ ey = ux.i.se;
+ x = uy.f;
+ y = ux.f;
+ } else {
+ ex = ux.i.se;
+ ey = uy.i.se;
+ x = ux.f;
+ y = uy.f;
+ }
+
+ if (ex == 0x7fff && isinf(y))
+ return y;
+ if (ex == 0x7fff || y == 0)
+ return x;
+ if (ex - ey > LDBL_MANT_DIG)
+ return x + y;
+
+ z = 1;
+ if (ex > 0x3fff+8000) {
+ z = 0x1p10000L;
+ x *= 0x1p-10000L;
+ y *= 0x1p-10000L;
+ } else if (ey < 0x3fff-8000) {
+ z = 0x1p-10000L;
+ x *= 0x1p10000L;
+ y *= 0x1p10000L;
+ }
+ sq(&hx, &lx, x);
+ sq(&hy, &ly, y);
+ return z*sqrtl(ly+lx+hy+hx);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/i386/__invtrigl.s b/libc-top-half/musl/src/math/i386/__invtrigl.s
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/__invtrigl.s
diff --git a/libc-top-half/musl/src/math/i386/acos.s b/libc-top-half/musl/src/math/i386/acos.s
new file mode 100644
index 0000000..af423a2
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/acos.s
@@ -0,0 +1,18 @@
+# use acos(x) = atan2(fabs(sqrt((1-x)*(1+x))), x)
+
+.global acos
+.type acos,@function
+acos:
+ fldl 4(%esp)
+ fld %st(0)
+ fld1
+ fsub %st(0),%st(1)
+ fadd %st(2)
+ fmulp
+ fsqrt
+ fabs # fix sign of zero (matters in downward rounding mode)
+ fxch %st(1)
+ fpatan
+ fstpl 4(%esp)
+ fldl 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/acosf.s b/libc-top-half/musl/src/math/i386/acosf.s
new file mode 100644
index 0000000..d2cdfdb
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/acosf.s
@@ -0,0 +1,16 @@
+.global acosf
+.type acosf,@function
+acosf:
+ flds 4(%esp)
+ fld %st(0)
+ fld1
+ fsub %st(0),%st(1)
+ fadd %st(2)
+ fmulp
+ fsqrt
+ fabs # fix sign of zero (matters in downward rounding mode)
+ fxch %st(1)
+ fpatan
+ fstps 4(%esp)
+ flds 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/acosl.s b/libc-top-half/musl/src/math/i386/acosl.s
new file mode 100644
index 0000000..599c823
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/acosl.s
@@ -0,0 +1,14 @@
+.global acosl
+.type acosl,@function
+acosl:
+ fldt 4(%esp)
+ fld %st(0)
+ fld1
+ fsub %st(0),%st(1)
+ fadd %st(2)
+ fmulp
+ fsqrt
+ fabs # fix sign of zero (matters in downward rounding mode)
+ fxch %st(1)
+ fpatan
+ ret
diff --git a/libc-top-half/musl/src/math/i386/asin.s b/libc-top-half/musl/src/math/i386/asin.s
new file mode 100644
index 0000000..2bc8356
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/asin.s
@@ -0,0 +1,21 @@
+.global asin
+.type asin,@function
+asin:
+ fldl 4(%esp)
+ mov 8(%esp),%eax
+ add %eax,%eax
+ cmp $0x00200000,%eax
+ jb 1f
+ fld %st(0)
+ fld1
+ fsub %st(0),%st(1)
+ fadd %st(2)
+ fmulp
+ fsqrt
+ fpatan
+ fstpl 4(%esp)
+ fldl 4(%esp)
+ ret
+ # subnormal x, return x with underflow
+1: fsts 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/asinf.s b/libc-top-half/musl/src/math/i386/asinf.s
new file mode 100644
index 0000000..0590975
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/asinf.s
@@ -0,0 +1,23 @@
+.global asinf
+.type asinf,@function
+asinf:
+ flds 4(%esp)
+ mov 4(%esp),%eax
+ add %eax,%eax
+ cmp $0x01000000,%eax
+ jb 1f
+ fld %st(0)
+ fld1
+ fsub %st(0),%st(1)
+ fadd %st(2)
+ fmulp
+ fsqrt
+ fpatan
+ fstps 4(%esp)
+ flds 4(%esp)
+ ret
+ # subnormal x, return x with underflow
+1: fld %st(0)
+ fmul %st(1)
+ fstps 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/asinl.s b/libc-top-half/musl/src/math/i386/asinl.s
new file mode 100644
index 0000000..e973fc8
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/asinl.s
@@ -0,0 +1,12 @@
+.global asinl
+.type asinl,@function
+asinl:
+ fldt 4(%esp)
+ fld %st(0)
+ fld1
+ fsub %st(0),%st(1)
+ fadd %st(2)
+ fmulp
+ fsqrt
+ fpatan
+ ret
diff --git a/libc-top-half/musl/src/math/i386/atan.s b/libc-top-half/musl/src/math/i386/atan.s
new file mode 100644
index 0000000..2c57f6b
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/atan.s
@@ -0,0 +1,16 @@
+.global atan
+.type atan,@function
+atan:
+ fldl 4(%esp)
+ mov 8(%esp),%eax
+ add %eax,%eax
+ cmp $0x00200000,%eax
+ jb 1f
+ fld1
+ fpatan
+ fstpl 4(%esp)
+ fldl 4(%esp)
+ ret
+ # subnormal x, return x with underflow
+1: fsts 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/atan2.s b/libc-top-half/musl/src/math/i386/atan2.s
new file mode 100644
index 0000000..8bc441b
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/atan2.s
@@ -0,0 +1,15 @@
+.global atan2
+.type atan2,@function
+atan2:
+ fldl 4(%esp)
+ fldl 12(%esp)
+ fpatan
+ fstpl 4(%esp)
+ fldl 4(%esp)
+ mov 8(%esp),%eax
+ add %eax,%eax
+ cmp $0x00200000,%eax
+ jae 1f
+ # subnormal x, return x with underflow
+ fsts 4(%esp)
+1: ret
diff --git a/libc-top-half/musl/src/math/i386/atan2f.s b/libc-top-half/musl/src/math/i386/atan2f.s
new file mode 100644
index 0000000..3908c86
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/atan2f.s
@@ -0,0 +1,17 @@
+.global atan2f
+.type atan2f,@function
+atan2f:
+ flds 4(%esp)
+ flds 8(%esp)
+ fpatan
+ fstps 4(%esp)
+ flds 4(%esp)
+ mov 4(%esp),%eax
+ add %eax,%eax
+ cmp $0x01000000,%eax
+ jae 1f
+ # subnormal x, return x with underflow
+ fld %st(0)
+ fmul %st(1)
+ fstps 4(%esp)
+1: ret
diff --git a/libc-top-half/musl/src/math/i386/atan2l.s b/libc-top-half/musl/src/math/i386/atan2l.s
new file mode 100644
index 0000000..adf6e10
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/atan2l.s
@@ -0,0 +1,7 @@
+.global atan2l
+.type atan2l,@function
+atan2l:
+ fldt 4(%esp)
+ fldt 16(%esp)
+ fpatan
+ ret
diff --git a/libc-top-half/musl/src/math/i386/atanf.s b/libc-top-half/musl/src/math/i386/atanf.s
new file mode 100644
index 0000000..c2cbe2e
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/atanf.s
@@ -0,0 +1,18 @@
+.global atanf
+.type atanf,@function
+atanf:
+ flds 4(%esp)
+ mov 4(%esp),%eax
+ add %eax,%eax
+ cmp $0x01000000,%eax
+ jb 1f
+ fld1
+ fpatan
+ fstps 4(%esp)
+ flds 4(%esp)
+ ret
+ # subnormal x, return x with underflow
+1: fld %st(0)
+ fmul %st(1)
+ fstps 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/atanl.s b/libc-top-half/musl/src/math/i386/atanl.s
new file mode 100644
index 0000000..c508bc4
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/atanl.s
@@ -0,0 +1,7 @@
+.global atanl
+.type atanl,@function
+atanl:
+ fldt 4(%esp)
+ fld1
+ fpatan
+ ret
diff --git a/libc-top-half/musl/src/math/i386/ceil.s b/libc-top-half/musl/src/math/i386/ceil.s
new file mode 100644
index 0000000..bc29f15
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/ceil.s
@@ -0,0 +1 @@
+# see floor.s
diff --git a/libc-top-half/musl/src/math/i386/ceilf.s b/libc-top-half/musl/src/math/i386/ceilf.s
new file mode 100644
index 0000000..bc29f15
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/ceilf.s
@@ -0,0 +1 @@
+# see floor.s
diff --git a/libc-top-half/musl/src/math/i386/ceill.s b/libc-top-half/musl/src/math/i386/ceill.s
new file mode 100644
index 0000000..bc29f15
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/ceill.s
@@ -0,0 +1 @@
+# see floor.s
diff --git a/libc-top-half/musl/src/math/i386/exp2l.s b/libc-top-half/musl/src/math/i386/exp2l.s
new file mode 100644
index 0000000..8125761
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/exp2l.s
@@ -0,0 +1 @@
+# see exp_ld.s
diff --git a/libc-top-half/musl/src/math/i386/exp_ld.s b/libc-top-half/musl/src/math/i386/exp_ld.s
new file mode 100644
index 0000000..99cba01
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/exp_ld.s
@@ -0,0 +1,93 @@
+.global expm1l
+.type expm1l,@function
+expm1l:
+ fldt 4(%esp)
+ fldl2e
+ fmulp
+ mov $0xc2820000,%eax
+ push %eax
+ flds (%esp)
+ pop %eax
+ fucomp %st(1)
+ fnstsw %ax
+ sahf
+ fld1
+ jb 1f
+ # x*log2e < -65, return -1 without underflow
+ fstp %st(1)
+ fchs
+ ret
+1: fld %st(1)
+ fabs
+ fucom %st(1)
+ fnstsw %ax
+ fstp %st(0)
+ fstp %st(0)
+ sahf
+ ja 1f
+ f2xm1
+ ret
+1: call 1f
+ fld1
+ fsubrp
+ ret
+
+.global exp2l
+.global __exp2l
+.hidden __exp2l
+.type exp2l,@function
+exp2l:
+__exp2l:
+ fldt 4(%esp)
+1: sub $12,%esp
+ fld %st(0)
+ fstpt (%esp)
+ mov 8(%esp),%ax
+ and $0x7fff,%ax
+ cmp $0x3fff+13,%ax
+ jb 4f # |x| < 8192
+ cmp $0x3fff+15,%ax
+ jae 3f # |x| >= 32768
+ fsts (%esp)
+ cmpl $0xc67ff800,(%esp)
+ jb 2f # x > -16382
+ movl $0x5f000000,(%esp)
+ flds (%esp) # 0x1p63
+ fld %st(1)
+ fsub %st(1)
+ faddp
+ fucomp %st(1)
+ fnstsw
+ sahf
+ je 2f # x - 0x1p63 + 0x1p63 == x
+ movl $1,(%esp)
+ flds (%esp) # 0x1p-149
+ fdiv %st(1)
+ fstps (%esp) # raise underflow
+2: fld1
+ fld %st(1)
+ frndint
+ fxch %st(2)
+ fsub %st(2) # st(0)=x-rint(x), st(1)=1, st(2)=rint(x)
+ f2xm1
+ faddp # 2^(x-rint(x))
+1: fscale
+ fstp %st(1)
+ add $12,%esp
+ ret
+3: xor %eax,%eax
+4: cmp $0x3fff-64,%ax
+ fld1
+ jb 1b # |x| < 0x1p-64
+ fstpt (%esp)
+ fistl 8(%esp)
+ fildl 8(%esp)
+ fsubrp %st(1)
+ addl $0x3fff,8(%esp)
+ f2xm1
+ fld1
+ faddp # 2^(x-rint(x))
+ fldt (%esp) # 2^rint(x)
+ fmulp
+ add $12,%esp
+ ret
diff --git a/libc-top-half/musl/src/math/i386/expl.s b/libc-top-half/musl/src/math/i386/expl.s
new file mode 100644
index 0000000..b5124e8
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/expl.s
@@ -0,0 +1,101 @@
+# exp(x) = 2^hi + 2^hi (2^lo - 1)
+# where hi+lo = log2e*x with 128bit precision
+# exact log2e*x calculation depends on nearest rounding mode
+# using the exact multiplication method of Dekker and Veltkamp
+
+.global expl
+.type expl,@function
+expl:
+ fldt 4(%esp)
+
+ # interesting case: 0x1p-32 <= |x| < 16384
+ # check if (exponent|0x8000) is in [0xbfff-32, 0xbfff+13]
+ mov 12(%esp), %ax
+ or $0x8000, %ax
+ sub $0xbfdf, %ax
+ cmp $45, %ax
+ jbe 2f
+ test %ax, %ax
+ fld1
+ js 1f
+ # if |x|>=0x1p14 or nan return 2^trunc(x)
+ fscale
+ fstp %st(1)
+ ret
+ # if |x|<0x1p-32 return 1+x
+1: faddp
+ ret
+
+ # should be 0x1.71547652b82fe178p0L == 0x3fff b8aa3b29 5c17f0bc
+ # it will be wrong on non-nearest rounding mode
+2: fldl2e
+ subl $44, %esp
+ # hi = log2e_hi*x
+ # 2^hi = exp2l(hi)
+ fmul %st(1),%st
+ fld %st(0)
+ fstpt (%esp)
+ fstpt 16(%esp)
+ fstpt 32(%esp)
+.hidden __exp2l
+ call __exp2l
+ # if 2^hi == inf return 2^hi
+ fld %st(0)
+ fstpt (%esp)
+ cmpw $0x7fff, 8(%esp)
+ je 1f
+ fldt 32(%esp)
+ fldt 16(%esp)
+ # fpu stack: 2^hi x hi
+ # exact mult: x*log2e
+ fld %st(1)
+ # c = 0x1p32+1
+ pushl $0x41f00000
+ pushl $0x00100000
+ fldl (%esp)
+ # xh = x - c*x + c*x
+ # xl = x - xh
+ fmulp
+ fld %st(2)
+ fsub %st(1), %st
+ faddp
+ fld %st(2)
+ fsub %st(1), %st
+ # yh = log2e_hi - c*log2e_hi + c*log2e_hi
+ pushl $0x3ff71547
+ pushl $0x65200000
+ fldl (%esp)
+ # fpu stack: 2^hi x hi xh xl yh
+ # lo = hi - xh*yh + xl*yh
+ fld %st(2)
+ fmul %st(1), %st
+ fsubp %st, %st(4)
+ fmul %st(1), %st
+ faddp %st, %st(3)
+ # yl = log2e_hi - yh
+ pushl $0x3de705fc
+ pushl $0x2f000000
+ fldl (%esp)
+ # fpu stack: 2^hi x lo xh xl yl
+ # lo += xh*yl + xl*yl
+ fmul %st, %st(2)
+ fmulp %st, %st(1)
+ fxch %st(2)
+ faddp
+ faddp
+ # log2e_lo
+ pushl $0xbfbe
+ pushl $0x82f0025f
+ pushl $0x2dc582ee
+ fldt (%esp)
+ addl $36,%esp
+ # fpu stack: 2^hi x lo log2e_lo
+ # lo += log2e_lo*x
+ # return 2^hi + 2^hi (2^lo - 1)
+ fmulp %st, %st(2)
+ faddp
+ f2xm1
+ fmul %st(1), %st
+ faddp
+1: addl $44, %esp
+ ret
diff --git a/libc-top-half/musl/src/math/i386/expm1l.s b/libc-top-half/musl/src/math/i386/expm1l.s
new file mode 100644
index 0000000..8125761
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/expm1l.s
@@ -0,0 +1 @@
+# see exp_ld.s
diff --git a/libc-top-half/musl/src/math/i386/fabs.c b/libc-top-half/musl/src/math/i386/fabs.c
new file mode 100644
index 0000000..3967278
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/fabs.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double fabs(double x)
+{
+ __asm__ ("fabs" : "+t"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/i386/fabsf.c b/libc-top-half/musl/src/math/i386/fabsf.c
new file mode 100644
index 0000000..d882eee
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/fabsf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float fabsf(float x)
+{
+ __asm__ ("fabs" : "+t"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/i386/fabsl.c b/libc-top-half/musl/src/math/i386/fabsl.c
new file mode 100644
index 0000000..cc1c9ed
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/fabsl.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+long double fabsl(long double x)
+{
+ __asm__ ("fabs" : "+t"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/i386/floor.s b/libc-top-half/musl/src/math/i386/floor.s
new file mode 100644
index 0000000..46ba88d
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/floor.s
@@ -0,0 +1,67 @@
+.global floorf
+.type floorf,@function
+floorf:
+ flds 4(%esp)
+ jmp 1f
+
+.global floorl
+.type floorl,@function
+floorl:
+ fldt 4(%esp)
+ jmp 1f
+
+.global floor
+.type floor,@function
+floor:
+ fldl 4(%esp)
+1: mov $0x7,%al
+1: fstcw 4(%esp)
+ mov 5(%esp),%ah
+ mov %al,5(%esp)
+ fldcw 4(%esp)
+ frndint
+ mov %ah,5(%esp)
+ fldcw 4(%esp)
+ ret
+
+.global ceil
+.type ceil,@function
+ceil:
+ fldl 4(%esp)
+ mov $0xb,%al
+ jmp 1b
+
+.global ceilf
+.type ceilf,@function
+ceilf:
+ flds 4(%esp)
+ mov $0xb,%al
+ jmp 1b
+
+.global ceill
+.type ceill,@function
+ceill:
+ fldt 4(%esp)
+ mov $0xb,%al
+ jmp 1b
+
+.global trunc
+.type trunc,@function
+trunc:
+ fldl 4(%esp)
+ mov $0xf,%al
+ jmp 1b
+
+.global truncf
+.type truncf,@function
+truncf:
+ flds 4(%esp)
+ mov $0xf,%al
+ jmp 1b
+
+.global truncl
+.type truncl,@function
+truncl:
+ fldt 4(%esp)
+ mov $0xf,%al
+ jmp 1b
diff --git a/libc-top-half/musl/src/math/i386/floorf.s b/libc-top-half/musl/src/math/i386/floorf.s
new file mode 100644
index 0000000..bc29f15
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/floorf.s
@@ -0,0 +1 @@
+# see floor.s
diff --git a/libc-top-half/musl/src/math/i386/floorl.s b/libc-top-half/musl/src/math/i386/floorl.s
new file mode 100644
index 0000000..bc29f15
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/floorl.s
@@ -0,0 +1 @@
+# see floor.s
diff --git a/libc-top-half/musl/src/math/i386/fmod.c b/libc-top-half/musl/src/math/i386/fmod.c
new file mode 100644
index 0000000..ea0c58d
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/fmod.c
@@ -0,0 +1,10 @@
+#include <math.h>
+
+double fmod(double x, double y)
+{
+ unsigned short fpsr;
+ // fprem does not introduce excess precision into x
+ do __asm__ ("fprem; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
+ while (fpsr & 0x400);
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/i386/fmodf.c b/libc-top-half/musl/src/math/i386/fmodf.c
new file mode 100644
index 0000000..90b56ab
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/fmodf.c
@@ -0,0 +1,10 @@
+#include <math.h>
+
+float fmodf(float x, float y)
+{
+ unsigned short fpsr;
+ // fprem does not introduce excess precision into x
+ do __asm__ ("fprem; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
+ while (fpsr & 0x400);
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/i386/fmodl.c b/libc-top-half/musl/src/math/i386/fmodl.c
new file mode 100644
index 0000000..3daeab0
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/fmodl.c
@@ -0,0 +1,9 @@
+#include <math.h>
+
+long double fmodl(long double x, long double y)
+{
+ unsigned short fpsr;
+ do __asm__ ("fprem; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
+ while (fpsr & 0x400);
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/i386/hypot.s b/libc-top-half/musl/src/math/i386/hypot.s
new file mode 100644
index 0000000..299c2e1
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/hypot.s
@@ -0,0 +1,45 @@
+.global hypot
+.type hypot,@function
+hypot:
+ mov 8(%esp),%eax
+ mov 16(%esp),%ecx
+ add %eax,%eax
+ add %ecx,%ecx
+ and %eax,%ecx
+ cmp $0xffe00000,%ecx
+ jae 2f
+ or 4(%esp),%eax
+ jnz 1f
+ fldl 12(%esp)
+ fabs
+ ret
+1: mov 16(%esp),%eax
+ add %eax,%eax
+ or 12(%esp),%eax
+ jnz 1f
+ fldl 4(%esp)
+ fabs
+ ret
+1: fldl 4(%esp)
+ fld %st(0)
+ fmulp
+ fldl 12(%esp)
+ fld %st(0)
+ fmulp
+ faddp
+ fsqrt
+ ret
+2: sub $0xffe00000,%eax
+ or 4(%esp),%eax
+ jnz 1f
+ fldl 4(%esp)
+ fabs
+ ret
+1: mov 16(%esp),%eax
+ add %eax,%eax
+ sub $0xffe00000,%eax
+ or 12(%esp),%eax
+ fldl 12(%esp)
+ jnz 1f
+ fabs
+1: ret
diff --git a/libc-top-half/musl/src/math/i386/hypotf.s b/libc-top-half/musl/src/math/i386/hypotf.s
new file mode 100644
index 0000000..068935e
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/hypotf.s
@@ -0,0 +1,42 @@
+.global hypotf
+.type hypotf,@function
+hypotf:
+ mov 4(%esp),%eax
+ mov 8(%esp),%ecx
+ add %eax,%eax
+ add %ecx,%ecx
+ and %eax,%ecx
+ cmp $0xff000000,%ecx
+ jae 2f
+ test %eax,%eax
+ jnz 1f
+ flds 8(%esp)
+ fabs
+ ret
+1: mov 8(%esp),%eax
+ add %eax,%eax
+ jnz 1f
+ flds 4(%esp)
+ fabs
+ ret
+1: flds 4(%esp)
+ fld %st(0)
+ fmulp
+ flds 8(%esp)
+ fld %st(0)
+ fmulp
+ faddp
+ fsqrt
+ ret
+2: cmp $0xff000000,%eax
+ jnz 1f
+ flds 4(%esp)
+ fabs
+ ret
+1: mov 8(%esp),%eax
+ add %eax,%eax
+ cmp $0xff000000,%eax
+ flds 8(%esp)
+ jnz 1f
+ fabs
+1: ret
diff --git a/libc-top-half/musl/src/math/i386/ldexp.s b/libc-top-half/musl/src/math/i386/ldexp.s
new file mode 100644
index 0000000..c430f78
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/ldexp.s
@@ -0,0 +1 @@
+# see scalbn.s
diff --git a/libc-top-half/musl/src/math/i386/ldexpf.s b/libc-top-half/musl/src/math/i386/ldexpf.s
new file mode 100644
index 0000000..3f8e4b9
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/ldexpf.s
@@ -0,0 +1 @@
+# see scalbnf.s
diff --git a/libc-top-half/musl/src/math/i386/ldexpl.s b/libc-top-half/musl/src/math/i386/ldexpl.s
new file mode 100644
index 0000000..86fe562
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/ldexpl.s
@@ -0,0 +1 @@
+# see scalbnl.s
diff --git a/libc-top-half/musl/src/math/i386/llrint.c b/libc-top-half/musl/src/math/i386/llrint.c
new file mode 100644
index 0000000..aa40081
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/llrint.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long long llrint(double x)
+{
+ long long r;
+ __asm__ ("fistpll %0" : "=m"(r) : "t"(x) : "st");
+ return r;
+}
diff --git a/libc-top-half/musl/src/math/i386/llrintf.c b/libc-top-half/musl/src/math/i386/llrintf.c
new file mode 100644
index 0000000..c41a317
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/llrintf.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long long llrintf(float x)
+{
+ long long r;
+ __asm__ ("fistpll %0" : "=m"(r) : "t"(x) : "st");
+ return r;
+}
diff --git a/libc-top-half/musl/src/math/i386/llrintl.c b/libc-top-half/musl/src/math/i386/llrintl.c
new file mode 100644
index 0000000..c439ef2
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/llrintl.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long long llrintl(long double x)
+{
+ long long r;
+ __asm__ ("fistpll %0" : "=m"(r) : "t"(x) : "st");
+ return r;
+}
diff --git a/libc-top-half/musl/src/math/i386/log.s b/libc-top-half/musl/src/math/i386/log.s
new file mode 100644
index 0000000..08c5992
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/log.s
@@ -0,0 +1,9 @@
+.global log
+.type log,@function
+log:
+ fldln2
+ fldl 4(%esp)
+ fyl2x
+ fstpl 4(%esp)
+ fldl 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/log10.s b/libc-top-half/musl/src/math/i386/log10.s
new file mode 100644
index 0000000..120e91e
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/log10.s
@@ -0,0 +1,9 @@
+.global log10
+.type log10,@function
+log10:
+ fldlg2
+ fldl 4(%esp)
+ fyl2x
+ fstpl 4(%esp)
+ fldl 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/log10f.s b/libc-top-half/musl/src/math/i386/log10f.s
new file mode 100644
index 0000000..b055493
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/log10f.s
@@ -0,0 +1,9 @@
+.global log10f
+.type log10f,@function
+log10f:
+ fldlg2
+ flds 4(%esp)
+ fyl2x
+ fstps 4(%esp)
+ flds 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/log10l.s b/libc-top-half/musl/src/math/i386/log10l.s
new file mode 100644
index 0000000..aaa44f2
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/log10l.s
@@ -0,0 +1,7 @@
+.global log10l
+.type log10l,@function
+log10l:
+ fldlg2
+ fldt 4(%esp)
+ fyl2x
+ ret
diff --git a/libc-top-half/musl/src/math/i386/log1p.s b/libc-top-half/musl/src/math/i386/log1p.s
new file mode 100644
index 0000000..f3c95f8
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/log1p.s
@@ -0,0 +1,25 @@
+.global log1p
+.type log1p,@function
+log1p:
+ mov 8(%esp),%eax
+ fldln2
+ and $0x7fffffff,%eax
+ fldl 4(%esp)
+ cmp $0x3fd28f00,%eax
+ ja 1f
+ cmp $0x00100000,%eax
+ jb 2f
+ fyl2xp1
+ fstpl 4(%esp)
+ fldl 4(%esp)
+ ret
+1: fld1
+ faddp
+ fyl2x
+ fstpl 4(%esp)
+ fldl 4(%esp)
+ ret
+ # subnormal x, return x with underflow
+2: fsts 4(%esp)
+ fstp %st(1)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/log1pf.s b/libc-top-half/musl/src/math/i386/log1pf.s
new file mode 100644
index 0000000..9f13d95
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/log1pf.s
@@ -0,0 +1,26 @@
+.global log1pf
+.type log1pf,@function
+log1pf:
+ mov 4(%esp),%eax
+ fldln2
+ and $0x7fffffff,%eax
+ flds 4(%esp)
+ cmp $0x3e940000,%eax
+ ja 1f
+ cmp $0x00800000,%eax
+ jb 2f
+ fyl2xp1
+ fstps 4(%esp)
+ flds 4(%esp)
+ ret
+1: fld1
+ faddp
+ fyl2x
+ fstps 4(%esp)
+ flds 4(%esp)
+ ret
+ # subnormal x, return x with underflow
+2: fxch
+ fmul %st(1)
+ fstps 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/log1pl.s b/libc-top-half/musl/src/math/i386/log1pl.s
new file mode 100644
index 0000000..a048ab6
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/log1pl.s
@@ -0,0 +1,15 @@
+.global log1pl
+.type log1pl,@function
+log1pl:
+ mov 10(%esp),%eax
+ fldln2
+ and $0x7fffffff,%eax
+ fldt 4(%esp)
+ cmp $0x3ffd9400,%eax
+ ja 1f
+ fyl2xp1
+ ret
+1: fld1
+ faddp
+ fyl2x
+ ret
diff --git a/libc-top-half/musl/src/math/i386/log2.s b/libc-top-half/musl/src/math/i386/log2.s
new file mode 100644
index 0000000..7eff0b6
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/log2.s
@@ -0,0 +1,9 @@
+.global log2
+.type log2,@function
+log2:
+ fld1
+ fldl 4(%esp)
+ fyl2x
+ fstpl 4(%esp)
+ fldl 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/log2f.s b/libc-top-half/musl/src/math/i386/log2f.s
new file mode 100644
index 0000000..b32fa2f
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/log2f.s
@@ -0,0 +1,9 @@
+.global log2f
+.type log2f,@function
+log2f:
+ fld1
+ flds 4(%esp)
+ fyl2x
+ fstps 4(%esp)
+ flds 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/log2l.s b/libc-top-half/musl/src/math/i386/log2l.s
new file mode 100644
index 0000000..c58f56f
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/log2l.s
@@ -0,0 +1,7 @@
+.global log2l
+.type log2l,@function
+log2l:
+ fld1
+ fldt 4(%esp)
+ fyl2x
+ ret
diff --git a/libc-top-half/musl/src/math/i386/logf.s b/libc-top-half/musl/src/math/i386/logf.s
new file mode 100644
index 0000000..4d0346a
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/logf.s
@@ -0,0 +1,9 @@
+.global logf
+.type logf,@function
+logf:
+ fldln2
+ flds 4(%esp)
+ fyl2x
+ fstps 4(%esp)
+ flds 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/logl.s b/libc-top-half/musl/src/math/i386/logl.s
new file mode 100644
index 0000000..d4e3339
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/logl.s
@@ -0,0 +1,7 @@
+.global logl
+.type logl,@function
+logl:
+ fldln2
+ fldt 4(%esp)
+ fyl2x
+ ret
diff --git a/libc-top-half/musl/src/math/i386/lrint.c b/libc-top-half/musl/src/math/i386/lrint.c
new file mode 100644
index 0000000..89563ab
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/lrint.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long lrint(double x)
+{
+ long r;
+ __asm__ ("fistpl %0" : "=m"(r) : "t"(x) : "st");
+ return r;
+}
diff --git a/libc-top-half/musl/src/math/i386/lrintf.c b/libc-top-half/musl/src/math/i386/lrintf.c
new file mode 100644
index 0000000..0bbf29d
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/lrintf.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long lrintf(float x)
+{
+ long r;
+ __asm__ ("fistpl %0" : "=m"(r) : "t"(x) : "st");
+ return r;
+}
diff --git a/libc-top-half/musl/src/math/i386/lrintl.c b/libc-top-half/musl/src/math/i386/lrintl.c
new file mode 100644
index 0000000..eb8c090
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/lrintl.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long lrintl(long double x)
+{
+ long r;
+ __asm__ ("fistpl %0" : "=m"(r) : "t"(x) : "st");
+ return r;
+}
diff --git a/libc-top-half/musl/src/math/i386/remainder.c b/libc-top-half/musl/src/math/i386/remainder.c
new file mode 100644
index 0000000..c083df9
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/remainder.c
@@ -0,0 +1,12 @@
+#include <math.h>
+
+double remainder(double x, double y)
+{
+ unsigned short fpsr;
+ // fprem1 does not introduce excess precision into x
+ do __asm__ ("fprem1; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
+ while (fpsr & 0x400);
+ return x;
+}
+
+weak_alias(remainder, drem);
diff --git a/libc-top-half/musl/src/math/i386/remainderf.c b/libc-top-half/musl/src/math/i386/remainderf.c
new file mode 100644
index 0000000..280207d
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/remainderf.c
@@ -0,0 +1,12 @@
+#include <math.h>
+
+float remainderf(float x, float y)
+{
+ unsigned short fpsr;
+ // fprem1 does not introduce excess precision into x
+ do __asm__ ("fprem1; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
+ while (fpsr & 0x400);
+ return x;
+}
+
+weak_alias(remainderf, dremf);
diff --git a/libc-top-half/musl/src/math/i386/remainderl.c b/libc-top-half/musl/src/math/i386/remainderl.c
new file mode 100644
index 0000000..8cf7507
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/remainderl.c
@@ -0,0 +1,9 @@
+#include <math.h>
+
+long double remainderl(long double x, long double y)
+{
+ unsigned short fpsr;
+ do __asm__ ("fprem1; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
+ while (fpsr & 0x400);
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/i386/remquo.s b/libc-top-half/musl/src/math/i386/remquo.s
new file mode 100644
index 0000000..598e754
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/remquo.s
@@ -0,0 +1,50 @@
+.global remquof
+.type remquof,@function
+remquof:
+ mov 12(%esp),%ecx
+ flds 8(%esp)
+ flds 4(%esp)
+ mov 11(%esp),%dh
+ xor 7(%esp),%dh
+ jmp 1f
+
+.global remquol
+.type remquol,@function
+remquol:
+ mov 28(%esp),%ecx
+ fldt 16(%esp)
+ fldt 4(%esp)
+ mov 25(%esp),%dh
+ xor 13(%esp),%dh
+ jmp 1f
+
+.global remquo
+.type remquo,@function
+remquo:
+ mov 20(%esp),%ecx
+ fldl 12(%esp)
+ fldl 4(%esp)
+ mov 19(%esp),%dh
+ xor 11(%esp),%dh
+1: fprem1
+ fnstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ mov %ah,%dl
+ shr %dl
+ and $1,%dl
+ mov %ah,%al
+ shr $5,%al
+ and $2,%al
+ or %al,%dl
+ mov %ah,%al
+ shl $2,%al
+ and $4,%al
+ or %al,%dl
+ test %dh,%dh
+ jns 1f
+ neg %dl
+1: movsbl %dl,%edx
+ mov %edx,(%ecx)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/remquof.s b/libc-top-half/musl/src/math/i386/remquof.s
new file mode 100644
index 0000000..511a6bc
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/remquof.s
@@ -0,0 +1 @@
+# see remquo.s
diff --git a/libc-top-half/musl/src/math/i386/remquol.s b/libc-top-half/musl/src/math/i386/remquol.s
new file mode 100644
index 0000000..511a6bc
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/remquol.s
@@ -0,0 +1 @@
+# see remquo.s
diff --git a/libc-top-half/musl/src/math/i386/rint.c b/libc-top-half/musl/src/math/i386/rint.c
new file mode 100644
index 0000000..a5276a6
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/rint.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double rint(double x)
+{
+ __asm__ ("frndint" : "+t"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/i386/rintf.c b/libc-top-half/musl/src/math/i386/rintf.c
new file mode 100644
index 0000000..bb4121a
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/rintf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float rintf(float x)
+{
+ __asm__ ("frndint" : "+t"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/i386/rintl.c b/libc-top-half/musl/src/math/i386/rintl.c
new file mode 100644
index 0000000..e1a9207
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/rintl.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+long double rintl(long double x)
+{
+ __asm__ ("frndint" : "+t"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/i386/scalbln.s b/libc-top-half/musl/src/math/i386/scalbln.s
new file mode 100644
index 0000000..c430f78
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/scalbln.s
@@ -0,0 +1 @@
+# see scalbn.s
diff --git a/libc-top-half/musl/src/math/i386/scalblnf.s b/libc-top-half/musl/src/math/i386/scalblnf.s
new file mode 100644
index 0000000..3f8e4b9
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/scalblnf.s
@@ -0,0 +1 @@
+# see scalbnf.s
diff --git a/libc-top-half/musl/src/math/i386/scalblnl.s b/libc-top-half/musl/src/math/i386/scalblnl.s
new file mode 100644
index 0000000..86fe562
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/scalblnl.s
@@ -0,0 +1 @@
+# see scalbnl.s
diff --git a/libc-top-half/musl/src/math/i386/scalbn.s b/libc-top-half/musl/src/math/i386/scalbn.s
new file mode 100644
index 0000000..8bf302f
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/scalbn.s
@@ -0,0 +1,33 @@
+.global ldexp
+.type ldexp,@function
+ldexp:
+ nop
+
+.global scalbln
+.type scalbln,@function
+scalbln:
+ nop
+
+.global scalbn
+.type scalbn,@function
+scalbn:
+ mov 12(%esp),%eax
+ add $0x3ffe,%eax
+ cmp $0x7ffd,%eax
+ jb 1f
+ sub $0x3ffe,%eax
+ sar $31,%eax
+ xor $0xfff,%eax
+ add $0x3ffe,%eax
+1: inc %eax
+ fldl 4(%esp)
+ mov %eax,12(%esp)
+ mov $0x80000000,%eax
+ mov %eax,8(%esp)
+ xor %eax,%eax
+ mov %eax,4(%esp)
+ fldt 4(%esp)
+ fmulp
+ fstpl 4(%esp)
+ fldl 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/scalbnf.s b/libc-top-half/musl/src/math/i386/scalbnf.s
new file mode 100644
index 0000000..9cb9ef5
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/scalbnf.s
@@ -0,0 +1,32 @@
+.global ldexpf
+.type ldexpf,@function
+ldexpf:
+ nop
+
+.global scalblnf
+.type scalblnf,@function
+scalblnf:
+ nop
+
+.global scalbnf
+.type scalbnf,@function
+scalbnf:
+ mov 8(%esp),%eax
+ add $0x3fe,%eax
+ cmp $0x7fd,%eax
+ jb 1f
+ sub $0x3fe,%eax
+ sar $31,%eax
+ xor $0x1ff,%eax
+ add $0x3fe,%eax
+1: inc %eax
+ shl $20,%eax
+ flds 4(%esp)
+ mov %eax,8(%esp)
+ xor %eax,%eax
+ mov %eax,4(%esp)
+ fldl 4(%esp)
+ fmulp
+ fstps 4(%esp)
+ flds 4(%esp)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/scalbnl.s b/libc-top-half/musl/src/math/i386/scalbnl.s
new file mode 100644
index 0000000..54414c2
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/scalbnl.s
@@ -0,0 +1,32 @@
+.global ldexpl
+.type ldexpl,@function
+ldexpl:
+ nop
+
+.global scalblnl
+.type scalblnl,@function
+scalblnl:
+ nop
+
+.global scalbnl
+.type scalbnl,@function
+scalbnl:
+ mov 16(%esp),%eax
+ add $0x3ffe,%eax
+ cmp $0x7ffd,%eax
+ jae 1f
+ inc %eax
+ fldt 4(%esp)
+ mov %eax,12(%esp)
+ mov $0x80000000,%eax
+ mov %eax,8(%esp)
+ xor %eax,%eax
+ mov %eax,4(%esp)
+ fldt 4(%esp)
+ fmulp
+ ret
+1: fildl 16(%esp)
+ fldt 4(%esp)
+ fscale
+ fstp %st(1)
+ ret
diff --git a/libc-top-half/musl/src/math/i386/sqrt.c b/libc-top-half/musl/src/math/i386/sqrt.c
new file mode 100644
index 0000000..934fbcc
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/sqrt.c
@@ -0,0 +1,15 @@
+#include "libm.h"
+
+double sqrt(double x)
+{
+ union ldshape ux;
+ unsigned fpsr;
+ __asm__ ("fsqrt; fnstsw %%ax": "=t"(ux.f), "=a"(fpsr) : "0"(x));
+ if ((ux.i.m & 0x7ff) != 0x400)
+ return (double)ux.f;
+ /* Rounding to double would have encountered an exact halfway case.
+ Adjust mantissa downwards if fsqrt rounded up, else upwards.
+ (result of fsqrt could not have been exact) */
+ ux.i.m ^= (fpsr & 0x200) + 0x300;
+ return (double)ux.f;
+}
diff --git a/libc-top-half/musl/src/math/i386/sqrtf.c b/libc-top-half/musl/src/math/i386/sqrtf.c
new file mode 100644
index 0000000..41c65c2
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/sqrtf.c
@@ -0,0 +1,12 @@
+#include <math.h>
+
+float sqrtf(float x)
+{
+ long double t;
+ /* The long double result has sufficient precision so that
+ * second rounding to float still keeps the returned value
+ * correctly rounded, see Pierre Roux, "Innocuous Double
+ * Rounding of Basic Arithmetic Operations". */
+ __asm__ ("fsqrt" : "=t"(t) : "0"(x));
+ return (float)t;
+}
diff --git a/libc-top-half/musl/src/math/i386/sqrtl.c b/libc-top-half/musl/src/math/i386/sqrtl.c
new file mode 100644
index 0000000..864cfcc
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/sqrtl.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+long double sqrtl(long double x)
+{
+ __asm__ ("fsqrt" : "+t"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/i386/trunc.s b/libc-top-half/musl/src/math/i386/trunc.s
new file mode 100644
index 0000000..bc29f15
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/trunc.s
@@ -0,0 +1 @@
+# see floor.s
diff --git a/libc-top-half/musl/src/math/i386/truncf.s b/libc-top-half/musl/src/math/i386/truncf.s
new file mode 100644
index 0000000..bc29f15
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/truncf.s
@@ -0,0 +1 @@
+# see floor.s
diff --git a/libc-top-half/musl/src/math/i386/truncl.s b/libc-top-half/musl/src/math/i386/truncl.s
new file mode 100644
index 0000000..bc29f15
--- /dev/null
+++ b/libc-top-half/musl/src/math/i386/truncl.s
@@ -0,0 +1 @@
+# see floor.s
diff --git a/libc-top-half/musl/src/math/ilogb.c b/libc-top-half/musl/src/math/ilogb.c
new file mode 100644
index 0000000..64d4015
--- /dev/null
+++ b/libc-top-half/musl/src/math/ilogb.c
@@ -0,0 +1,26 @@
+#include <limits.h>
+#include "libm.h"
+
+int ilogb(double x)
+{
+ #pragma STDC FENV_ACCESS ON
+ union {double f; uint64_t i;} u = {x};
+ uint64_t i = u.i;
+ int e = i>>52 & 0x7ff;
+
+ if (!e) {
+ i <<= 12;
+ if (i == 0) {
+ FORCE_EVAL(0/0.0f);
+ return FP_ILOGB0;
+ }
+ /* subnormal x */
+ for (e = -0x3ff; i>>63 == 0; e--, i<<=1);
+ return e;
+ }
+ if (e == 0x7ff) {
+ FORCE_EVAL(0/0.0f);
+ return i<<12 ? FP_ILOGBNAN : INT_MAX;
+ }
+ return e - 0x3ff;
+}
diff --git a/libc-top-half/musl/src/math/ilogbf.c b/libc-top-half/musl/src/math/ilogbf.c
new file mode 100644
index 0000000..e23ba20
--- /dev/null
+++ b/libc-top-half/musl/src/math/ilogbf.c
@@ -0,0 +1,26 @@
+#include <limits.h>
+#include "libm.h"
+
+int ilogbf(float x)
+{
+ #pragma STDC FENV_ACCESS ON
+ union {float f; uint32_t i;} u = {x};
+ uint32_t i = u.i;
+ int e = i>>23 & 0xff;
+
+ if (!e) {
+ i <<= 9;
+ if (i == 0) {
+ FORCE_EVAL(0/0.0f);
+ return FP_ILOGB0;
+ }
+ /* subnormal x */
+ for (e = -0x7f; i>>31 == 0; e--, i<<=1);
+ return e;
+ }
+ if (e == 0xff) {
+ FORCE_EVAL(0/0.0f);
+ return i<<9 ? FP_ILOGBNAN : INT_MAX;
+ }
+ return e - 0x7f;
+}
diff --git a/libc-top-half/musl/src/math/ilogbl.c b/libc-top-half/musl/src/math/ilogbl.c
new file mode 100644
index 0000000..7b1a9cf
--- /dev/null
+++ b/libc-top-half/musl/src/math/ilogbl.c
@@ -0,0 +1,55 @@
+#include <limits.h>
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+int ilogbl(long double x)
+{
+ return ilogb(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+int ilogbl(long double x)
+{
+ #pragma STDC FENV_ACCESS ON
+ union ldshape u = {x};
+ uint64_t m = u.i.m;
+ int e = u.i.se & 0x7fff;
+
+ if (!e) {
+ if (m == 0) {
+ FORCE_EVAL(0/0.0f);
+ return FP_ILOGB0;
+ }
+ /* subnormal x */
+ for (e = -0x3fff+1; m>>63 == 0; e--, m<<=1);
+ return e;
+ }
+ if (e == 0x7fff) {
+ FORCE_EVAL(0/0.0f);
+ return m<<1 ? FP_ILOGBNAN : INT_MAX;
+ }
+ return e - 0x3fff;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+int ilogbl(long double x)
+{
+ #pragma STDC FENV_ACCESS ON
+ union ldshape u = {x};
+ int e = u.i.se & 0x7fff;
+
+ if (!e) {
+ if (x == 0) {
+ FORCE_EVAL(0/0.0f);
+ return FP_ILOGB0;
+ }
+ /* subnormal x */
+ x *= 0x1p120;
+ return ilogbl(x) - 120;
+ }
+ if (e == 0x7fff) {
+ FORCE_EVAL(0/0.0f);
+ u.i.se = 0;
+ return u.f ? FP_ILOGBNAN : INT_MAX;
+ }
+ return e - 0x3fff;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/j0.c b/libc-top-half/musl/src/math/j0.c
new file mode 100644
index 0000000..d722d94
--- /dev/null
+++ b/libc-top-half/musl/src/math/j0.c
@@ -0,0 +1,375 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_j0.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* j0(x), y0(x)
+ * Bessel function of the first and second kinds of order zero.
+ * Method -- j0(x):
+ * 1. For tiny x, we use j0(x) = 1 - x^2/4 + x^4/64 - ...
+ * 2. Reduce x to |x| since j0(x)=j0(-x), and
+ * for x in (0,2)
+ * j0(x) = 1-z/4+ z^2*R0/S0, where z = x*x;
+ * (precision: |j0-1+z/4-z^2R0/S0 |<2**-63.67 )
+ * for x in (2,inf)
+ * j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0))
+ * where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
+ * as follow:
+ * cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
+ * = 1/sqrt(2) * (cos(x) + sin(x))
+ * sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4)
+ * = 1/sqrt(2) * (sin(x) - cos(x))
+ * (To avoid cancellation, use
+ * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+ * to compute the worse one.)
+ *
+ * 3 Special cases
+ * j0(nan)= nan
+ * j0(0) = 1
+ * j0(inf) = 0
+ *
+ * Method -- y0(x):
+ * 1. For x<2.
+ * Since
+ * y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x^2/4 - ...)
+ * therefore y0(x)-2/pi*j0(x)*ln(x) is an even function.
+ * We use the following function to approximate y0,
+ * y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x^2
+ * where
+ * U(z) = u00 + u01*z + ... + u06*z^6
+ * V(z) = 1 + v01*z + ... + v04*z^4
+ * with absolute approximation error bounded by 2**-72.
+ * Note: For tiny x, U/V = u0 and j0(x)~1, hence
+ * y0(tiny) = u0 + (2/pi)*ln(tiny), (choose tiny<2**-27)
+ * 2. For x>=2.
+ * y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0))
+ * where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
+ * by the method mentioned above.
+ * 3. Special cases: y0(0)=-inf, y0(x<0)=NaN, y0(inf)=0.
+ */
+
+#include "libm.h"
+
+static double pzero(double), qzero(double);
+
+static const double
+invsqrtpi = 5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */
+tpi = 6.36619772367581382433e-01; /* 0x3FE45F30, 0x6DC9C883 */
+
+/* common method when |x|>=2 */
+static double common(uint32_t ix, double x, int y0)
+{
+ double s,c,ss,cc,z;
+
+ /*
+ * j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x-pi/4)-q0(x)*sin(x-pi/4))
+ * y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x-pi/4)+q0(x)*cos(x-pi/4))
+ *
+ * sin(x-pi/4) = (sin(x) - cos(x))/sqrt(2)
+ * cos(x-pi/4) = (sin(x) + cos(x))/sqrt(2)
+ * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+ */
+ s = sin(x);
+ c = cos(x);
+ if (y0)
+ c = -c;
+ cc = s+c;
+ /* avoid overflow in 2*x, big ulp error when x>=0x1p1023 */
+ if (ix < 0x7fe00000) {
+ ss = s-c;
+ z = -cos(2*x);
+ if (s*c < 0)
+ cc = z/ss;
+ else
+ ss = z/cc;
+ if (ix < 0x48000000) {
+ if (y0)
+ ss = -ss;
+ cc = pzero(x)*cc-qzero(x)*ss;
+ }
+ }
+ return invsqrtpi*cc/sqrt(x);
+}
+
+/* R0/S0 on [0, 2.00] */
+static const double
+R02 = 1.56249999999999947958e-02, /* 0x3F8FFFFF, 0xFFFFFFFD */
+R03 = -1.89979294238854721751e-04, /* 0xBF28E6A5, 0xB61AC6E9 */
+R04 = 1.82954049532700665670e-06, /* 0x3EBEB1D1, 0x0C503919 */
+R05 = -4.61832688532103189199e-09, /* 0xBE33D5E7, 0x73D63FCE */
+S01 = 1.56191029464890010492e-02, /* 0x3F8FFCE8, 0x82C8C2A4 */
+S02 = 1.16926784663337450260e-04, /* 0x3F1EA6D2, 0xDD57DBF4 */
+S03 = 5.13546550207318111446e-07, /* 0x3EA13B54, 0xCE84D5A9 */
+S04 = 1.16614003333790000205e-09; /* 0x3E1408BC, 0xF4745D8F */
+
+double j0(double x)
+{
+ double z,r,s;
+ uint32_t ix;
+
+ GET_HIGH_WORD(ix, x);
+ ix &= 0x7fffffff;
+
+ /* j0(+-inf)=0, j0(nan)=nan */
+ if (ix >= 0x7ff00000)
+ return 1/(x*x);
+ x = fabs(x);
+
+ if (ix >= 0x40000000) { /* |x| >= 2 */
+ /* large ulp error near zeros: 2.4, 5.52, 8.6537,.. */
+ return common(ix,x,0);
+ }
+
+ /* 1 - x*x/4 + x*x*R(x^2)/S(x^2) */
+ if (ix >= 0x3f200000) { /* |x| >= 2**-13 */
+ /* up to 4ulp error close to 2 */
+ z = x*x;
+ r = z*(R02+z*(R03+z*(R04+z*R05)));
+ s = 1+z*(S01+z*(S02+z*(S03+z*S04)));
+ return (1+x/2)*(1-x/2) + z*(r/s);
+ }
+
+ /* 1 - x*x/4 */
+ /* prevent underflow */
+ /* inexact should be raised when x!=0, this is not done correctly */
+ if (ix >= 0x38000000) /* |x| >= 2**-127 */
+ x = 0.25*x*x;
+ return 1 - x;
+}
+
+static const double
+u00 = -7.38042951086872317523e-02, /* 0xBFB2E4D6, 0x99CBD01F */
+u01 = 1.76666452509181115538e-01, /* 0x3FC69D01, 0x9DE9E3FC */
+u02 = -1.38185671945596898896e-02, /* 0xBF8C4CE8, 0xB16CFA97 */
+u03 = 3.47453432093683650238e-04, /* 0x3F36C54D, 0x20B29B6B */
+u04 = -3.81407053724364161125e-06, /* 0xBECFFEA7, 0x73D25CAD */
+u05 = 1.95590137035022920206e-08, /* 0x3E550057, 0x3B4EABD4 */
+u06 = -3.98205194132103398453e-11, /* 0xBDC5E43D, 0x693FB3C8 */
+v01 = 1.27304834834123699328e-02, /* 0x3F8A1270, 0x91C9C71A */
+v02 = 7.60068627350353253702e-05, /* 0x3F13ECBB, 0xF578C6C1 */
+v03 = 2.59150851840457805467e-07, /* 0x3E91642D, 0x7FF202FD */
+v04 = 4.41110311332675467403e-10; /* 0x3DFE5018, 0x3BD6D9EF */
+
+double y0(double x)
+{
+ double z,u,v;
+ uint32_t ix,lx;
+
+ EXTRACT_WORDS(ix, lx, x);
+
+ /* y0(nan)=nan, y0(<0)=nan, y0(0)=-inf, y0(inf)=0 */
+ if ((ix<<1 | lx) == 0)
+ return -1/0.0;
+ if (ix>>31)
+ return 0/0.0;
+ if (ix >= 0x7ff00000)
+ return 1/x;
+
+ if (ix >= 0x40000000) { /* x >= 2 */
+ /* large ulp errors near zeros: 3.958, 7.086,.. */
+ return common(ix,x,1);
+ }
+
+ /* U(x^2)/V(x^2) + (2/pi)*j0(x)*log(x) */
+ if (ix >= 0x3e400000) { /* x >= 2**-27 */
+ /* large ulp error near the first zero, x ~= 0.89 */
+ z = x*x;
+ u = u00+z*(u01+z*(u02+z*(u03+z*(u04+z*(u05+z*u06)))));
+ v = 1.0+z*(v01+z*(v02+z*(v03+z*v04)));
+ return u/v + tpi*(j0(x)*log(x));
+ }
+ return u00 + tpi*log(x);
+}
+
+/* The asymptotic expansions of pzero is
+ * 1 - 9/128 s^2 + 11025/98304 s^4 - ..., where s = 1/x.
+ * For x >= 2, We approximate pzero by
+ * pzero(x) = 1 + (R/S)
+ * where R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10
+ * S = 1 + pS0*s^2 + ... + pS4*s^10
+ * and
+ * | pzero(x)-1-R/S | <= 2 ** ( -60.26)
+ */
+static const double pR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+ 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+ -7.03124999999900357484e-02, /* 0xBFB1FFFF, 0xFFFFFD32 */
+ -8.08167041275349795626e+00, /* 0xC02029D0, 0xB44FA779 */
+ -2.57063105679704847262e+02, /* 0xC0701102, 0x7B19E863 */
+ -2.48521641009428822144e+03, /* 0xC0A36A6E, 0xCD4DCAFC */
+ -5.25304380490729545272e+03, /* 0xC0B4850B, 0x36CC643D */
+};
+static const double pS8[5] = {
+ 1.16534364619668181717e+02, /* 0x405D2233, 0x07A96751 */
+ 3.83374475364121826715e+03, /* 0x40ADF37D, 0x50596938 */
+ 4.05978572648472545552e+04, /* 0x40E3D2BB, 0x6EB6B05F */
+ 1.16752972564375915681e+05, /* 0x40FC810F, 0x8F9FA9BD */
+ 4.76277284146730962675e+04, /* 0x40E74177, 0x4F2C49DC */
+};
+
+static const double pR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ -1.14125464691894502584e-11, /* 0xBDA918B1, 0x47E495CC */
+ -7.03124940873599280078e-02, /* 0xBFB1FFFF, 0xE69AFBC6 */
+ -4.15961064470587782438e+00, /* 0xC010A370, 0xF90C6BBF */
+ -6.76747652265167261021e+01, /* 0xC050EB2F, 0x5A7D1783 */
+ -3.31231299649172967747e+02, /* 0xC074B3B3, 0x6742CC63 */
+ -3.46433388365604912451e+02, /* 0xC075A6EF, 0x28A38BD7 */
+};
+static const double pS5[5] = {
+ 6.07539382692300335975e+01, /* 0x404E6081, 0x0C98C5DE */
+ 1.05125230595704579173e+03, /* 0x40906D02, 0x5C7E2864 */
+ 5.97897094333855784498e+03, /* 0x40B75AF8, 0x8FBE1D60 */
+ 9.62544514357774460223e+03, /* 0x40C2CCB8, 0xFA76FA38 */
+ 2.40605815922939109441e+03, /* 0x40A2CC1D, 0xC70BE864 */
+};
+
+static const double pR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+ -2.54704601771951915620e-09, /* 0xBE25E103, 0x6FE1AA86 */
+ -7.03119616381481654654e-02, /* 0xBFB1FFF6, 0xF7C0E24B */
+ -2.40903221549529611423e+00, /* 0xC00345B2, 0xAEA48074 */
+ -2.19659774734883086467e+01, /* 0xC035F74A, 0x4CB94E14 */
+ -5.80791704701737572236e+01, /* 0xC04D0A22, 0x420A1A45 */
+ -3.14479470594888503854e+01, /* 0xC03F72AC, 0xA892D80F */
+};
+static const double pS3[5] = {
+ 3.58560338055209726349e+01, /* 0x4041ED92, 0x84077DD3 */
+ 3.61513983050303863820e+02, /* 0x40769839, 0x464A7C0E */
+ 1.19360783792111533330e+03, /* 0x4092A66E, 0x6D1061D6 */
+ 1.12799679856907414432e+03, /* 0x40919FFC, 0xB8C39B7E */
+ 1.73580930813335754692e+02, /* 0x4065B296, 0xFC379081 */
+};
+
+static const double pR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ -8.87534333032526411254e-08, /* 0xBE77D316, 0xE927026D */
+ -7.03030995483624743247e-02, /* 0xBFB1FF62, 0x495E1E42 */
+ -1.45073846780952986357e+00, /* 0xBFF73639, 0x8A24A843 */
+ -7.63569613823527770791e+00, /* 0xC01E8AF3, 0xEDAFA7F3 */
+ -1.11931668860356747786e+01, /* 0xC02662E6, 0xC5246303 */
+ -3.23364579351335335033e+00, /* 0xC009DE81, 0xAF8FE70F */
+};
+static const double pS2[5] = {
+ 2.22202997532088808441e+01, /* 0x40363865, 0x908B5959 */
+ 1.36206794218215208048e+02, /* 0x4061069E, 0x0EE8878F */
+ 2.70470278658083486789e+02, /* 0x4070E786, 0x42EA079B */
+ 1.53875394208320329881e+02, /* 0x40633C03, 0x3AB6FAFF */
+ 1.46576176948256193810e+01, /* 0x402D50B3, 0x44391809 */
+};
+
+static double pzero(double x)
+{
+ const double *p,*q;
+ double_t z,r,s;
+ uint32_t ix;
+
+ GET_HIGH_WORD(ix, x);
+ ix &= 0x7fffffff;
+ if (ix >= 0x40200000){p = pR8; q = pS8;}
+ else if (ix >= 0x40122E8B){p = pR5; q = pS5;}
+ else if (ix >= 0x4006DB6D){p = pR3; q = pS3;}
+ else /*ix >= 0x40000000*/ {p = pR2; q = pS2;}
+ z = 1.0/(x*x);
+ r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+ s = 1.0+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+ return 1.0 + r/s;
+}
+
+
+/* For x >= 8, the asymptotic expansions of qzero is
+ * -1/8 s + 75/1024 s^3 - ..., where s = 1/x.
+ * We approximate pzero by
+ * qzero(x) = s*(-1.25 + (R/S))
+ * where R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10
+ * S = 1 + qS0*s^2 + ... + qS5*s^12
+ * and
+ * | qzero(x)/s +1.25-R/S | <= 2 ** ( -61.22)
+ */
+static const double qR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+ 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+ 7.32421874999935051953e-02, /* 0x3FB2BFFF, 0xFFFFFE2C */
+ 1.17682064682252693899e+01, /* 0x40278952, 0x5BB334D6 */
+ 5.57673380256401856059e+02, /* 0x40816D63, 0x15301825 */
+ 8.85919720756468632317e+03, /* 0x40C14D99, 0x3E18F46D */
+ 3.70146267776887834771e+04, /* 0x40E212D4, 0x0E901566 */
+};
+static const double qS8[6] = {
+ 1.63776026895689824414e+02, /* 0x406478D5, 0x365B39BC */
+ 8.09834494656449805916e+03, /* 0x40BFA258, 0x4E6B0563 */
+ 1.42538291419120476348e+05, /* 0x41016652, 0x54D38C3F */
+ 8.03309257119514397345e+05, /* 0x412883DA, 0x83A52B43 */
+ 8.40501579819060512818e+05, /* 0x4129A66B, 0x28DE0B3D */
+ -3.43899293537866615225e+05, /* 0xC114FD6D, 0x2C9530C5 */
+};
+
+static const double qR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ 1.84085963594515531381e-11, /* 0x3DB43D8F, 0x29CC8CD9 */
+ 7.32421766612684765896e-02, /* 0x3FB2BFFF, 0xD172B04C */
+ 5.83563508962056953777e+00, /* 0x401757B0, 0xB9953DD3 */
+ 1.35111577286449829671e+02, /* 0x4060E392, 0x0A8788E9 */
+ 1.02724376596164097464e+03, /* 0x40900CF9, 0x9DC8C481 */
+ 1.98997785864605384631e+03, /* 0x409F17E9, 0x53C6E3A6 */
+};
+static const double qS5[6] = {
+ 8.27766102236537761883e+01, /* 0x4054B1B3, 0xFB5E1543 */
+ 2.07781416421392987104e+03, /* 0x40A03BA0, 0xDA21C0CE */
+ 1.88472887785718085070e+04, /* 0x40D267D2, 0x7B591E6D */
+ 5.67511122894947329769e+04, /* 0x40EBB5E3, 0x97E02372 */
+ 3.59767538425114471465e+04, /* 0x40E19118, 0x1F7A54A0 */
+ -5.35434275601944773371e+03, /* 0xC0B4EA57, 0xBEDBC609 */
+};
+
+static const double qR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+ 4.37741014089738620906e-09, /* 0x3E32CD03, 0x6ADECB82 */
+ 7.32411180042911447163e-02, /* 0x3FB2BFEE, 0x0E8D0842 */
+ 3.34423137516170720929e+00, /* 0x400AC0FC, 0x61149CF5 */
+ 4.26218440745412650017e+01, /* 0x40454F98, 0x962DAEDD */
+ 1.70808091340565596283e+02, /* 0x406559DB, 0xE25EFD1F */
+ 1.66733948696651168575e+02, /* 0x4064D77C, 0x81FA21E0 */
+};
+static const double qS3[6] = {
+ 4.87588729724587182091e+01, /* 0x40486122, 0xBFE343A6 */
+ 7.09689221056606015736e+02, /* 0x40862D83, 0x86544EB3 */
+ 3.70414822620111362994e+03, /* 0x40ACF04B, 0xE44DFC63 */
+ 6.46042516752568917582e+03, /* 0x40B93C6C, 0xD7C76A28 */
+ 2.51633368920368957333e+03, /* 0x40A3A8AA, 0xD94FB1C0 */
+ -1.49247451836156386662e+02, /* 0xC062A7EB, 0x201CF40F */
+};
+
+static const double qR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ 1.50444444886983272379e-07, /* 0x3E84313B, 0x54F76BDB */
+ 7.32234265963079278272e-02, /* 0x3FB2BEC5, 0x3E883E34 */
+ 1.99819174093815998816e+00, /* 0x3FFFF897, 0xE727779C */
+ 1.44956029347885735348e+01, /* 0x402CFDBF, 0xAAF96FE5 */
+ 3.16662317504781540833e+01, /* 0x403FAA8E, 0x29FBDC4A */
+ 1.62527075710929267416e+01, /* 0x403040B1, 0x71814BB4 */
+};
+static const double qS2[6] = {
+ 3.03655848355219184498e+01, /* 0x403E5D96, 0xF7C07AED */
+ 2.69348118608049844624e+02, /* 0x4070D591, 0xE4D14B40 */
+ 8.44783757595320139444e+02, /* 0x408A6645, 0x22B3BF22 */
+ 8.82935845112488550512e+02, /* 0x408B977C, 0x9C5CC214 */
+ 2.12666388511798828631e+02, /* 0x406A9553, 0x0E001365 */
+ -5.31095493882666946917e+00, /* 0xC0153E6A, 0xF8B32931 */
+};
+
+static double qzero(double x)
+{
+ const double *p,*q;
+ double_t s,r,z;
+ uint32_t ix;
+
+ GET_HIGH_WORD(ix, x);
+ ix &= 0x7fffffff;
+ if (ix >= 0x40200000){p = qR8; q = qS8;}
+ else if (ix >= 0x40122E8B){p = qR5; q = qS5;}
+ else if (ix >= 0x4006DB6D){p = qR3; q = qS3;}
+ else /*ix >= 0x40000000*/ {p = qR2; q = qS2;}
+ z = 1.0/(x*x);
+ r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+ s = 1.0+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+ return (-.125 + r/s)/x;
+}
diff --git a/libc-top-half/musl/src/math/j0f.c b/libc-top-half/musl/src/math/j0f.c
new file mode 100644
index 0000000..fab554a
--- /dev/null
+++ b/libc-top-half/musl/src/math/j0f.c
@@ -0,0 +1,314 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_j0f.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#define _GNU_SOURCE
+#include "libm.h"
+
+static float pzerof(float), qzerof(float);
+
+static const float
+invsqrtpi = 5.6418961287e-01, /* 0x3f106ebb */
+tpi = 6.3661974669e-01; /* 0x3f22f983 */
+
+static float common(uint32_t ix, float x, int y0)
+{
+ float z,s,c,ss,cc;
+ /*
+ * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
+ * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
+ */
+ s = sinf(x);
+ c = cosf(x);
+ if (y0)
+ c = -c;
+ cc = s+c;
+ if (ix < 0x7f000000) {
+ ss = s-c;
+ z = -cosf(2*x);
+ if (s*c < 0)
+ cc = z/ss;
+ else
+ ss = z/cc;
+ if (ix < 0x58800000) {
+ if (y0)
+ ss = -ss;
+ cc = pzerof(x)*cc-qzerof(x)*ss;
+ }
+ }
+ return invsqrtpi*cc/sqrtf(x);
+}
+
+/* R0/S0 on [0, 2.00] */
+static const float
+R02 = 1.5625000000e-02, /* 0x3c800000 */
+R03 = -1.8997929874e-04, /* 0xb947352e */
+R04 = 1.8295404516e-06, /* 0x35f58e88 */
+R05 = -4.6183270541e-09, /* 0xb19eaf3c */
+S01 = 1.5619102865e-02, /* 0x3c7fe744 */
+S02 = 1.1692678527e-04, /* 0x38f53697 */
+S03 = 5.1354652442e-07, /* 0x3509daa6 */
+S04 = 1.1661400734e-09; /* 0x30a045e8 */
+
+float j0f(float x)
+{
+ float z,r,s;
+ uint32_t ix;
+
+ GET_FLOAT_WORD(ix, x);
+ ix &= 0x7fffffff;
+ if (ix >= 0x7f800000)
+ return 1/(x*x);
+ x = fabsf(x);
+
+ if (ix >= 0x40000000) { /* |x| >= 2 */
+ /* large ulp error near zeros */
+ return common(ix, x, 0);
+ }
+ if (ix >= 0x3a000000) { /* |x| >= 2**-11 */
+ /* up to 4ulp error near 2 */
+ z = x*x;
+ r = z*(R02+z*(R03+z*(R04+z*R05)));
+ s = 1+z*(S01+z*(S02+z*(S03+z*S04)));
+ return (1+x/2)*(1-x/2) + z*(r/s);
+ }
+ if (ix >= 0x21800000) /* |x| >= 2**-60 */
+ x = 0.25f*x*x;
+ return 1 - x;
+}
+
+static const float
+u00 = -7.3804296553e-02, /* 0xbd9726b5 */
+u01 = 1.7666645348e-01, /* 0x3e34e80d */
+u02 = -1.3818567619e-02, /* 0xbc626746 */
+u03 = 3.4745343146e-04, /* 0x39b62a69 */
+u04 = -3.8140706238e-06, /* 0xb67ff53c */
+u05 = 1.9559013964e-08, /* 0x32a802ba */
+u06 = -3.9820518410e-11, /* 0xae2f21eb */
+v01 = 1.2730483897e-02, /* 0x3c509385 */
+v02 = 7.6006865129e-05, /* 0x389f65e0 */
+v03 = 2.5915085189e-07, /* 0x348b216c */
+v04 = 4.4111031494e-10; /* 0x2ff280c2 */
+
+float y0f(float x)
+{
+ float z,u,v;
+ uint32_t ix;
+
+ GET_FLOAT_WORD(ix, x);
+ if ((ix & 0x7fffffff) == 0)
+ return -1/0.0f;
+ if (ix>>31)
+ return 0/0.0f;
+ if (ix >= 0x7f800000)
+ return 1/x;
+ if (ix >= 0x40000000) { /* |x| >= 2.0 */
+ /* large ulp error near zeros */
+ return common(ix,x,1);
+ }
+ if (ix >= 0x39000000) { /* x >= 2**-13 */
+ /* large ulp error at x ~= 0.89 */
+ z = x*x;
+ u = u00+z*(u01+z*(u02+z*(u03+z*(u04+z*(u05+z*u06)))));
+ v = 1+z*(v01+z*(v02+z*(v03+z*v04)));
+ return u/v + tpi*(j0f(x)*logf(x));
+ }
+ return u00 + tpi*logf(x);
+}
+
+/* The asymptotic expansions of pzero is
+ * 1 - 9/128 s^2 + 11025/98304 s^4 - ..., where s = 1/x.
+ * For x >= 2, We approximate pzero by
+ * pzero(x) = 1 + (R/S)
+ * where R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10
+ * S = 1 + pS0*s^2 + ... + pS4*s^10
+ * and
+ * | pzero(x)-1-R/S | <= 2 ** ( -60.26)
+ */
+static const float pR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+ 0.0000000000e+00, /* 0x00000000 */
+ -7.0312500000e-02, /* 0xbd900000 */
+ -8.0816707611e+00, /* 0xc1014e86 */
+ -2.5706311035e+02, /* 0xc3808814 */
+ -2.4852163086e+03, /* 0xc51b5376 */
+ -5.2530439453e+03, /* 0xc5a4285a */
+};
+static const float pS8[5] = {
+ 1.1653436279e+02, /* 0x42e91198 */
+ 3.8337448730e+03, /* 0x456f9beb */
+ 4.0597855469e+04, /* 0x471e95db */
+ 1.1675296875e+05, /* 0x47e4087c */
+ 4.7627726562e+04, /* 0x473a0bba */
+};
+static const float pR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ -1.1412546255e-11, /* 0xad48c58a */
+ -7.0312492549e-02, /* 0xbd8fffff */
+ -4.1596107483e+00, /* 0xc0851b88 */
+ -6.7674766541e+01, /* 0xc287597b */
+ -3.3123129272e+02, /* 0xc3a59d9b */
+ -3.4643338013e+02, /* 0xc3ad3779 */
+};
+static const float pS5[5] = {
+ 6.0753936768e+01, /* 0x42730408 */
+ 1.0512523193e+03, /* 0x44836813 */
+ 5.9789707031e+03, /* 0x45bad7c4 */
+ 9.6254453125e+03, /* 0x461665c8 */
+ 2.4060581055e+03, /* 0x451660ee */
+};
+
+static const float pR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+ -2.5470459075e-09, /* 0xb12f081b */
+ -7.0311963558e-02, /* 0xbd8fffb8 */
+ -2.4090321064e+00, /* 0xc01a2d95 */
+ -2.1965976715e+01, /* 0xc1afba52 */
+ -5.8079170227e+01, /* 0xc2685112 */
+ -3.1447946548e+01, /* 0xc1fb9565 */
+};
+static const float pS3[5] = {
+ 3.5856033325e+01, /* 0x420f6c94 */
+ 3.6151397705e+02, /* 0x43b4c1ca */
+ 1.1936077881e+03, /* 0x44953373 */
+ 1.1279968262e+03, /* 0x448cffe6 */
+ 1.7358093262e+02, /* 0x432d94b8 */
+};
+
+static const float pR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ -8.8753431271e-08, /* 0xb3be98b7 */
+ -7.0303097367e-02, /* 0xbd8ffb12 */
+ -1.4507384300e+00, /* 0xbfb9b1cc */
+ -7.6356959343e+00, /* 0xc0f4579f */
+ -1.1193166733e+01, /* 0xc1331736 */
+ -3.2336456776e+00, /* 0xc04ef40d */
+};
+static const float pS2[5] = {
+ 2.2220300674e+01, /* 0x41b1c32d */
+ 1.3620678711e+02, /* 0x430834f0 */
+ 2.7047027588e+02, /* 0x43873c32 */
+ 1.5387539673e+02, /* 0x4319e01a */
+ 1.4657617569e+01, /* 0x416a859a */
+};
+
+static float pzerof(float x)
+{
+ const float *p,*q;
+ float_t z,r,s;
+ uint32_t ix;
+
+ GET_FLOAT_WORD(ix, x);
+ ix &= 0x7fffffff;
+ if (ix >= 0x41000000){p = pR8; q = pS8;}
+ else if (ix >= 0x409173eb){p = pR5; q = pS5;}
+ else if (ix >= 0x4036d917){p = pR3; q = pS3;}
+ else /*ix >= 0x40000000*/ {p = pR2; q = pS2;}
+ z = 1.0f/(x*x);
+ r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+ s = 1.0f+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+ return 1.0f + r/s;
+}
+
+
+/* For x >= 8, the asymptotic expansions of qzero is
+ * -1/8 s + 75/1024 s^3 - ..., where s = 1/x.
+ * We approximate pzero by
+ * qzero(x) = s*(-1.25 + (R/S))
+ * where R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10
+ * S = 1 + qS0*s^2 + ... + qS5*s^12
+ * and
+ * | qzero(x)/s +1.25-R/S | <= 2 ** ( -61.22)
+ */
+static const float qR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+ 0.0000000000e+00, /* 0x00000000 */
+ 7.3242187500e-02, /* 0x3d960000 */
+ 1.1768206596e+01, /* 0x413c4a93 */
+ 5.5767340088e+02, /* 0x440b6b19 */
+ 8.8591972656e+03, /* 0x460a6cca */
+ 3.7014625000e+04, /* 0x471096a0 */
+};
+static const float qS8[6] = {
+ 1.6377603149e+02, /* 0x4323c6aa */
+ 8.0983447266e+03, /* 0x45fd12c2 */
+ 1.4253829688e+05, /* 0x480b3293 */
+ 8.0330925000e+05, /* 0x49441ed4 */
+ 8.4050156250e+05, /* 0x494d3359 */
+ -3.4389928125e+05, /* 0xc8a7eb69 */
+};
+
+static const float qR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ 1.8408595828e-11, /* 0x2da1ec79 */
+ 7.3242180049e-02, /* 0x3d95ffff */
+ 5.8356351852e+00, /* 0x40babd86 */
+ 1.3511157227e+02, /* 0x43071c90 */
+ 1.0272437744e+03, /* 0x448067cd */
+ 1.9899779053e+03, /* 0x44f8bf4b */
+};
+static const float qS5[6] = {
+ 8.2776611328e+01, /* 0x42a58da0 */
+ 2.0778142090e+03, /* 0x4501dd07 */
+ 1.8847289062e+04, /* 0x46933e94 */
+ 5.6751113281e+04, /* 0x475daf1d */
+ 3.5976753906e+04, /* 0x470c88c1 */
+ -5.3543427734e+03, /* 0xc5a752be */
+};
+
+static const float qR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+ 4.3774099900e-09, /* 0x3196681b */
+ 7.3241114616e-02, /* 0x3d95ff70 */
+ 3.3442313671e+00, /* 0x405607e3 */
+ 4.2621845245e+01, /* 0x422a7cc5 */
+ 1.7080809021e+02, /* 0x432acedf */
+ 1.6673394775e+02, /* 0x4326bbe4 */
+};
+static const float qS3[6] = {
+ 4.8758872986e+01, /* 0x42430916 */
+ 7.0968920898e+02, /* 0x44316c1c */
+ 3.7041481934e+03, /* 0x4567825f */
+ 6.4604252930e+03, /* 0x45c9e367 */
+ 2.5163337402e+03, /* 0x451d4557 */
+ -1.4924745178e+02, /* 0xc3153f59 */
+};
+
+static const float qR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ 1.5044444979e-07, /* 0x342189db */
+ 7.3223426938e-02, /* 0x3d95f62a */
+ 1.9981917143e+00, /* 0x3fffc4bf */
+ 1.4495602608e+01, /* 0x4167edfd */
+ 3.1666231155e+01, /* 0x41fd5471 */
+ 1.6252708435e+01, /* 0x4182058c */
+};
+static const float qS2[6] = {
+ 3.0365585327e+01, /* 0x41f2ecb8 */
+ 2.6934811401e+02, /* 0x4386ac8f */
+ 8.4478375244e+02, /* 0x44533229 */
+ 8.8293585205e+02, /* 0x445cbbe5 */
+ 2.1266638184e+02, /* 0x4354aa98 */
+ -5.3109550476e+00, /* 0xc0a9f358 */
+};
+
+static float qzerof(float x)
+{
+ const float *p,*q;
+ float_t s,r,z;
+ uint32_t ix;
+
+ GET_FLOAT_WORD(ix, x);
+ ix &= 0x7fffffff;
+ if (ix >= 0x41000000){p = qR8; q = qS8;}
+ else if (ix >= 0x409173eb){p = qR5; q = qS5;}
+ else if (ix >= 0x4036d917){p = qR3; q = qS3;}
+ else /*ix >= 0x40000000*/ {p = qR2; q = qS2;}
+ z = 1.0f/(x*x);
+ r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+ s = 1.0f+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+ return (-.125f + r/s)/x;
+}
diff --git a/libc-top-half/musl/src/math/j1.c b/libc-top-half/musl/src/math/j1.c
new file mode 100644
index 0000000..df724d1
--- /dev/null
+++ b/libc-top-half/musl/src/math/j1.c
@@ -0,0 +1,362 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_j1.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* j1(x), y1(x)
+ * Bessel function of the first and second kinds of order zero.
+ * Method -- j1(x):
+ * 1. For tiny x, we use j1(x) = x/2 - x^3/16 + x^5/384 - ...
+ * 2. Reduce x to |x| since j1(x)=-j1(-x), and
+ * for x in (0,2)
+ * j1(x) = x/2 + x*z*R0/S0, where z = x*x;
+ * (precision: |j1/x - 1/2 - R0/S0 |<2**-61.51 )
+ * for x in (2,inf)
+ * j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1))
+ * y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
+ * where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
+ * as follow:
+ * cos(x1) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
+ * = 1/sqrt(2) * (sin(x) - cos(x))
+ * sin(x1) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+ * = -1/sqrt(2) * (sin(x) + cos(x))
+ * (To avoid cancellation, use
+ * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+ * to compute the worse one.)
+ *
+ * 3 Special cases
+ * j1(nan)= nan
+ * j1(0) = 0
+ * j1(inf) = 0
+ *
+ * Method -- y1(x):
+ * 1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN
+ * 2. For x<2.
+ * Since
+ * y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x^3-...)
+ * therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function.
+ * We use the following function to approximate y1,
+ * y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x^2
+ * where for x in [0,2] (abs err less than 2**-65.89)
+ * U(z) = U0[0] + U0[1]*z + ... + U0[4]*z^4
+ * V(z) = 1 + v0[0]*z + ... + v0[4]*z^5
+ * Note: For tiny x, 1/x dominate y1 and hence
+ * y1(tiny) = -2/pi/tiny, (choose tiny<2**-54)
+ * 3. For x>=2.
+ * y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
+ * where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
+ * by method mentioned above.
+ */
+
+#include "libm.h"
+
+static double pone(double), qone(double);
+
+static const double
+invsqrtpi = 5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */
+tpi = 6.36619772367581382433e-01; /* 0x3FE45F30, 0x6DC9C883 */
+
+static double common(uint32_t ix, double x, int y1, int sign)
+{
+ double z,s,c,ss,cc;
+
+ /*
+ * j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x-3pi/4)-q1(x)*sin(x-3pi/4))
+ * y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x-3pi/4)+q1(x)*cos(x-3pi/4))
+ *
+ * sin(x-3pi/4) = -(sin(x) + cos(x))/sqrt(2)
+ * cos(x-3pi/4) = (sin(x) - cos(x))/sqrt(2)
+ * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+ */
+ s = sin(x);
+ if (y1)
+ s = -s;
+ c = cos(x);
+ cc = s-c;
+ if (ix < 0x7fe00000) {
+ /* avoid overflow in 2*x */
+ ss = -s-c;
+ z = cos(2*x);
+ if (s*c > 0)
+ cc = z/ss;
+ else
+ ss = z/cc;
+ if (ix < 0x48000000) {
+ if (y1)
+ ss = -ss;
+ cc = pone(x)*cc-qone(x)*ss;
+ }
+ }
+ if (sign)
+ cc = -cc;
+ return invsqrtpi*cc/sqrt(x);
+}
+
+/* R0/S0 on [0,2] */
+static const double
+r00 = -6.25000000000000000000e-02, /* 0xBFB00000, 0x00000000 */
+r01 = 1.40705666955189706048e-03, /* 0x3F570D9F, 0x98472C61 */
+r02 = -1.59955631084035597520e-05, /* 0xBEF0C5C6, 0xBA169668 */
+r03 = 4.96727999609584448412e-08, /* 0x3E6AAAFA, 0x46CA0BD9 */
+s01 = 1.91537599538363460805e-02, /* 0x3F939D0B, 0x12637E53 */
+s02 = 1.85946785588630915560e-04, /* 0x3F285F56, 0xB9CDF664 */
+s03 = 1.17718464042623683263e-06, /* 0x3EB3BFF8, 0x333F8498 */
+s04 = 5.04636257076217042715e-09, /* 0x3E35AC88, 0xC97DFF2C */
+s05 = 1.23542274426137913908e-11; /* 0x3DAB2ACF, 0xCFB97ED8 */
+
+double j1(double x)
+{
+ double z,r,s;
+ uint32_t ix;
+ int sign;
+
+ GET_HIGH_WORD(ix, x);
+ sign = ix>>31;
+ ix &= 0x7fffffff;
+ if (ix >= 0x7ff00000)
+ return 1/(x*x);
+ if (ix >= 0x40000000) /* |x| >= 2 */
+ return common(ix, fabs(x), 0, sign);
+ if (ix >= 0x38000000) { /* |x| >= 2**-127 */
+ z = x*x;
+ r = z*(r00+z*(r01+z*(r02+z*r03)));
+ s = 1+z*(s01+z*(s02+z*(s03+z*(s04+z*s05))));
+ z = r/s;
+ } else
+ /* avoid underflow, raise inexact if x!=0 */
+ z = x;
+ return (0.5 + z)*x;
+}
+
+static const double U0[5] = {
+ -1.96057090646238940668e-01, /* 0xBFC91866, 0x143CBC8A */
+ 5.04438716639811282616e-02, /* 0x3FA9D3C7, 0x76292CD1 */
+ -1.91256895875763547298e-03, /* 0xBF5F55E5, 0x4844F50F */
+ 2.35252600561610495928e-05, /* 0x3EF8AB03, 0x8FA6B88E */
+ -9.19099158039878874504e-08, /* 0xBE78AC00, 0x569105B8 */
+};
+static const double V0[5] = {
+ 1.99167318236649903973e-02, /* 0x3F94650D, 0x3F4DA9F0 */
+ 2.02552581025135171496e-04, /* 0x3F2A8C89, 0x6C257764 */
+ 1.35608801097516229404e-06, /* 0x3EB6C05A, 0x894E8CA6 */
+ 6.22741452364621501295e-09, /* 0x3E3ABF1D, 0x5BA69A86 */
+ 1.66559246207992079114e-11, /* 0x3DB25039, 0xDACA772A */
+};
+
+double y1(double x)
+{
+ double z,u,v;
+ uint32_t ix,lx;
+
+ EXTRACT_WORDS(ix, lx, x);
+ /* y1(nan)=nan, y1(<0)=nan, y1(0)=-inf, y1(inf)=0 */
+ if ((ix<<1 | lx) == 0)
+ return -1/0.0;
+ if (ix>>31)
+ return 0/0.0;
+ if (ix >= 0x7ff00000)
+ return 1/x;
+
+ if (ix >= 0x40000000) /* x >= 2 */
+ return common(ix, x, 1, 0);
+ if (ix < 0x3c900000) /* x < 2**-54 */
+ return -tpi/x;
+ z = x*x;
+ u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4])));
+ v = 1+z*(V0[0]+z*(V0[1]+z*(V0[2]+z*(V0[3]+z*V0[4]))));
+ return x*(u/v) + tpi*(j1(x)*log(x)-1/x);
+}
+
+/* For x >= 8, the asymptotic expansions of pone is
+ * 1 + 15/128 s^2 - 4725/2^15 s^4 - ..., where s = 1/x.
+ * We approximate pone by
+ * pone(x) = 1 + (R/S)
+ * where R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10
+ * S = 1 + ps0*s^2 + ... + ps4*s^10
+ * and
+ * | pone(x)-1-R/S | <= 2 ** ( -60.06)
+ */
+
+static const double pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+ 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+ 1.17187499999988647970e-01, /* 0x3FBDFFFF, 0xFFFFFCCE */
+ 1.32394806593073575129e+01, /* 0x402A7A9D, 0x357F7FCE */
+ 4.12051854307378562225e+02, /* 0x4079C0D4, 0x652EA590 */
+ 3.87474538913960532227e+03, /* 0x40AE457D, 0xA3A532CC */
+ 7.91447954031891731574e+03, /* 0x40BEEA7A, 0xC32782DD */
+};
+static const double ps8[5] = {
+ 1.14207370375678408436e+02, /* 0x405C8D45, 0x8E656CAC */
+ 3.65093083420853463394e+03, /* 0x40AC85DC, 0x964D274F */
+ 3.69562060269033463555e+04, /* 0x40E20B86, 0x97C5BB7F */
+ 9.76027935934950801311e+04, /* 0x40F7D42C, 0xB28F17BB */
+ 3.08042720627888811578e+04, /* 0x40DE1511, 0x697A0B2D */
+};
+
+static const double pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ 1.31990519556243522749e-11, /* 0x3DAD0667, 0xDAE1CA7D */
+ 1.17187493190614097638e-01, /* 0x3FBDFFFF, 0xE2C10043 */
+ 6.80275127868432871736e+00, /* 0x401B3604, 0x6E6315E3 */
+ 1.08308182990189109773e+02, /* 0x405B13B9, 0x452602ED */
+ 5.17636139533199752805e+02, /* 0x40802D16, 0xD052D649 */
+ 5.28715201363337541807e+02, /* 0x408085B8, 0xBB7E0CB7 */
+};
+static const double ps5[5] = {
+ 5.92805987221131331921e+01, /* 0x404DA3EA, 0xA8AF633D */
+ 9.91401418733614377743e+02, /* 0x408EFB36, 0x1B066701 */
+ 5.35326695291487976647e+03, /* 0x40B4E944, 0x5706B6FB */
+ 7.84469031749551231769e+03, /* 0x40BEA4B0, 0xB8A5BB15 */
+ 1.50404688810361062679e+03, /* 0x40978030, 0x036F5E51 */
+};
+
+static const double pr3[6] = {
+ 3.02503916137373618024e-09, /* 0x3E29FC21, 0xA7AD9EDD */
+ 1.17186865567253592491e-01, /* 0x3FBDFFF5, 0x5B21D17B */
+ 3.93297750033315640650e+00, /* 0x400F76BC, 0xE85EAD8A */
+ 3.51194035591636932736e+01, /* 0x40418F48, 0x9DA6D129 */
+ 9.10550110750781271918e+01, /* 0x4056C385, 0x4D2C1837 */
+ 4.85590685197364919645e+01, /* 0x4048478F, 0x8EA83EE5 */
+};
+static const double ps3[5] = {
+ 3.47913095001251519989e+01, /* 0x40416549, 0xA134069C */
+ 3.36762458747825746741e+02, /* 0x40750C33, 0x07F1A75F */
+ 1.04687139975775130551e+03, /* 0x40905B7C, 0x5037D523 */
+ 8.90811346398256432622e+02, /* 0x408BD67D, 0xA32E31E9 */
+ 1.03787932439639277504e+02, /* 0x4059F26D, 0x7C2EED53 */
+};
+
+static const double pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ 1.07710830106873743082e-07, /* 0x3E7CE9D4, 0xF65544F4 */
+ 1.17176219462683348094e-01, /* 0x3FBDFF42, 0xBE760D83 */
+ 2.36851496667608785174e+00, /* 0x4002F2B7, 0xF98FAEC0 */
+ 1.22426109148261232917e+01, /* 0x40287C37, 0x7F71A964 */
+ 1.76939711271687727390e+01, /* 0x4031B1A8, 0x177F8EE2 */
+ 5.07352312588818499250e+00, /* 0x40144B49, 0xA574C1FE */
+};
+static const double ps2[5] = {
+ 2.14364859363821409488e+01, /* 0x40356FBD, 0x8AD5ECDC */
+ 1.25290227168402751090e+02, /* 0x405F5293, 0x14F92CD5 */
+ 2.32276469057162813669e+02, /* 0x406D08D8, 0xD5A2DBD9 */
+ 1.17679373287147100768e+02, /* 0x405D6B7A, 0xDA1884A9 */
+ 8.36463893371618283368e+00, /* 0x4020BAB1, 0xF44E5192 */
+};
+
+static double pone(double x)
+{
+ const double *p,*q;
+ double_t z,r,s;
+ uint32_t ix;
+
+ GET_HIGH_WORD(ix, x);
+ ix &= 0x7fffffff;
+ if (ix >= 0x40200000){p = pr8; q = ps8;}
+ else if (ix >= 0x40122E8B){p = pr5; q = ps5;}
+ else if (ix >= 0x4006DB6D){p = pr3; q = ps3;}
+ else /*ix >= 0x40000000*/ {p = pr2; q = ps2;}
+ z = 1.0/(x*x);
+ r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+ s = 1.0+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+ return 1.0+ r/s;
+}
+
+/* For x >= 8, the asymptotic expansions of qone is
+ * 3/8 s - 105/1024 s^3 - ..., where s = 1/x.
+ * We approximate pone by
+ * qone(x) = s*(0.375 + (R/S))
+ * where R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10
+ * S = 1 + qs1*s^2 + ... + qs6*s^12
+ * and
+ * | qone(x)/s -0.375-R/S | <= 2 ** ( -61.13)
+ */
+
+static const double qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+ 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+ -1.02539062499992714161e-01, /* 0xBFBA3FFF, 0xFFFFFDF3 */
+ -1.62717534544589987888e+01, /* 0xC0304591, 0xA26779F7 */
+ -7.59601722513950107896e+02, /* 0xC087BCD0, 0x53E4B576 */
+ -1.18498066702429587167e+04, /* 0xC0C724E7, 0x40F87415 */
+ -4.84385124285750353010e+04, /* 0xC0E7A6D0, 0x65D09C6A */
+};
+static const double qs8[6] = {
+ 1.61395369700722909556e+02, /* 0x40642CA6, 0xDE5BCDE5 */
+ 7.82538599923348465381e+03, /* 0x40BE9162, 0xD0D88419 */
+ 1.33875336287249578163e+05, /* 0x4100579A, 0xB0B75E98 */
+ 7.19657723683240939863e+05, /* 0x4125F653, 0x72869C19 */
+ 6.66601232617776375264e+05, /* 0x412457D2, 0x7719AD5C */
+ -2.94490264303834643215e+05, /* 0xC111F969, 0x0EA5AA18 */
+};
+
+static const double qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ -2.08979931141764104297e-11, /* 0xBDB6FA43, 0x1AA1A098 */
+ -1.02539050241375426231e-01, /* 0xBFBA3FFF, 0xCB597FEF */
+ -8.05644828123936029840e+00, /* 0xC0201CE6, 0xCA03AD4B */
+ -1.83669607474888380239e+02, /* 0xC066F56D, 0x6CA7B9B0 */
+ -1.37319376065508163265e+03, /* 0xC09574C6, 0x6931734F */
+ -2.61244440453215656817e+03, /* 0xC0A468E3, 0x88FDA79D */
+};
+static const double qs5[6] = {
+ 8.12765501384335777857e+01, /* 0x405451B2, 0xFF5A11B2 */
+ 1.99179873460485964642e+03, /* 0x409F1F31, 0xE77BF839 */
+ 1.74684851924908907677e+04, /* 0x40D10F1F, 0x0D64CE29 */
+ 4.98514270910352279316e+04, /* 0x40E8576D, 0xAABAD197 */
+ 2.79480751638918118260e+04, /* 0x40DB4B04, 0xCF7C364B */
+ -4.71918354795128470869e+03, /* 0xC0B26F2E, 0xFCFFA004 */
+};
+
+static const double qr3[6] = {
+ -5.07831226461766561369e-09, /* 0xBE35CFA9, 0xD38FC84F */
+ -1.02537829820837089745e-01, /* 0xBFBA3FEB, 0x51AEED54 */
+ -4.61011581139473403113e+00, /* 0xC01270C2, 0x3302D9FF */
+ -5.78472216562783643212e+01, /* 0xC04CEC71, 0xC25D16DA */
+ -2.28244540737631695038e+02, /* 0xC06C87D3, 0x4718D55F */
+ -2.19210128478909325622e+02, /* 0xC06B66B9, 0x5F5C1BF6 */
+};
+static const double qs3[6] = {
+ 4.76651550323729509273e+01, /* 0x4047D523, 0xCCD367E4 */
+ 6.73865112676699709482e+02, /* 0x40850EEB, 0xC031EE3E */
+ 3.38015286679526343505e+03, /* 0x40AA684E, 0x448E7C9A */
+ 5.54772909720722782367e+03, /* 0x40B5ABBA, 0xA61D54A6 */
+ 1.90311919338810798763e+03, /* 0x409DBC7A, 0x0DD4DF4B */
+ -1.35201191444307340817e+02, /* 0xC060E670, 0x290A311F */
+};
+
+static const double qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ -1.78381727510958865572e-07, /* 0xBE87F126, 0x44C626D2 */
+ -1.02517042607985553460e-01, /* 0xBFBA3E8E, 0x9148B010 */
+ -2.75220568278187460720e+00, /* 0xC0060484, 0x69BB4EDA */
+ -1.96636162643703720221e+01, /* 0xC033A9E2, 0xC168907F */
+ -4.23253133372830490089e+01, /* 0xC04529A3, 0xDE104AAA */
+ -2.13719211703704061733e+01, /* 0xC0355F36, 0x39CF6E52 */
+};
+static const double qs2[6] = {
+ 2.95333629060523854548e+01, /* 0x403D888A, 0x78AE64FF */
+ 2.52981549982190529136e+02, /* 0x406F9F68, 0xDB821CBA */
+ 7.57502834868645436472e+02, /* 0x4087AC05, 0xCE49A0F7 */
+ 7.39393205320467245656e+02, /* 0x40871B25, 0x48D4C029 */
+ 1.55949003336666123687e+02, /* 0x40637E5E, 0x3C3ED8D4 */
+ -4.95949898822628210127e+00, /* 0xC013D686, 0xE71BE86B */
+};
+
+static double qone(double x)
+{
+ const double *p,*q;
+ double_t s,r,z;
+ uint32_t ix;
+
+ GET_HIGH_WORD(ix, x);
+ ix &= 0x7fffffff;
+ if (ix >= 0x40200000){p = qr8; q = qs8;}
+ else if (ix >= 0x40122E8B){p = qr5; q = qs5;}
+ else if (ix >= 0x4006DB6D){p = qr3; q = qs3;}
+ else /*ix >= 0x40000000*/ {p = qr2; q = qs2;}
+ z = 1.0/(x*x);
+ r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+ s = 1.0+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+ return (.375 + r/s)/x;
+}
diff --git a/libc-top-half/musl/src/math/j1f.c b/libc-top-half/musl/src/math/j1f.c
new file mode 100644
index 0000000..3434c53
--- /dev/null
+++ b/libc-top-half/musl/src/math/j1f.c
@@ -0,0 +1,310 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_j1f.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#define _GNU_SOURCE
+#include "libm.h"
+
+static float ponef(float), qonef(float);
+
+static const float
+invsqrtpi = 5.6418961287e-01, /* 0x3f106ebb */
+tpi = 6.3661974669e-01; /* 0x3f22f983 */
+
+static float common(uint32_t ix, float x, int y1, int sign)
+{
+ double z,s,c,ss,cc;
+
+ s = sinf(x);
+ if (y1)
+ s = -s;
+ c = cosf(x);
+ cc = s-c;
+ if (ix < 0x7f000000) {
+ ss = -s-c;
+ z = cosf(2*x);
+ if (s*c > 0)
+ cc = z/ss;
+ else
+ ss = z/cc;
+ if (ix < 0x58800000) {
+ if (y1)
+ ss = -ss;
+ cc = ponef(x)*cc-qonef(x)*ss;
+ }
+ }
+ if (sign)
+ cc = -cc;
+ return invsqrtpi*cc/sqrtf(x);
+}
+
+/* R0/S0 on [0,2] */
+static const float
+r00 = -6.2500000000e-02, /* 0xbd800000 */
+r01 = 1.4070566976e-03, /* 0x3ab86cfd */
+r02 = -1.5995563444e-05, /* 0xb7862e36 */
+r03 = 4.9672799207e-08, /* 0x335557d2 */
+s01 = 1.9153760746e-02, /* 0x3c9ce859 */
+s02 = 1.8594678841e-04, /* 0x3942fab6 */
+s03 = 1.1771846857e-06, /* 0x359dffc2 */
+s04 = 5.0463624390e-09, /* 0x31ad6446 */
+s05 = 1.2354227016e-11; /* 0x2d59567e */
+
+float j1f(float x)
+{
+ float z,r,s;
+ uint32_t ix;
+ int sign;
+
+ GET_FLOAT_WORD(ix, x);
+ sign = ix>>31;
+ ix &= 0x7fffffff;
+ if (ix >= 0x7f800000)
+ return 1/(x*x);
+ if (ix >= 0x40000000) /* |x| >= 2 */
+ return common(ix, fabsf(x), 0, sign);
+ if (ix >= 0x39000000) { /* |x| >= 2**-13 */
+ z = x*x;
+ r = z*(r00+z*(r01+z*(r02+z*r03)));
+ s = 1+z*(s01+z*(s02+z*(s03+z*(s04+z*s05))));
+ z = 0.5f + r/s;
+ } else
+ z = 0.5f;
+ return z*x;
+}
+
+static const float U0[5] = {
+ -1.9605709612e-01, /* 0xbe48c331 */
+ 5.0443872809e-02, /* 0x3d4e9e3c */
+ -1.9125689287e-03, /* 0xbafaaf2a */
+ 2.3525259166e-05, /* 0x37c5581c */
+ -9.1909917899e-08, /* 0xb3c56003 */
+};
+static const float V0[5] = {
+ 1.9916731864e-02, /* 0x3ca3286a */
+ 2.0255257550e-04, /* 0x3954644b */
+ 1.3560879779e-06, /* 0x35b602d4 */
+ 6.2274145840e-09, /* 0x31d5f8eb */
+ 1.6655924903e-11, /* 0x2d9281cf */
+};
+
+float y1f(float x)
+{
+ float z,u,v;
+ uint32_t ix;
+
+ GET_FLOAT_WORD(ix, x);
+ if ((ix & 0x7fffffff) == 0)
+ return -1/0.0f;
+ if (ix>>31)
+ return 0/0.0f;
+ if (ix >= 0x7f800000)
+ return 1/x;
+ if (ix >= 0x40000000) /* |x| >= 2.0 */
+ return common(ix,x,1,0);
+ if (ix < 0x33000000) /* x < 2**-25 */
+ return -tpi/x;
+ z = x*x;
+ u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4])));
+ v = 1.0f+z*(V0[0]+z*(V0[1]+z*(V0[2]+z*(V0[3]+z*V0[4]))));
+ return x*(u/v) + tpi*(j1f(x)*logf(x)-1.0f/x);
+}
+
+/* For x >= 8, the asymptotic expansions of pone is
+ * 1 + 15/128 s^2 - 4725/2^15 s^4 - ..., where s = 1/x.
+ * We approximate pone by
+ * pone(x) = 1 + (R/S)
+ * where R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10
+ * S = 1 + ps0*s^2 + ... + ps4*s^10
+ * and
+ * | pone(x)-1-R/S | <= 2 ** ( -60.06)
+ */
+
+static const float pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+ 0.0000000000e+00, /* 0x00000000 */
+ 1.1718750000e-01, /* 0x3df00000 */
+ 1.3239480972e+01, /* 0x4153d4ea */
+ 4.1205184937e+02, /* 0x43ce06a3 */
+ 3.8747453613e+03, /* 0x45722bed */
+ 7.9144794922e+03, /* 0x45f753d6 */
+};
+static const float ps8[5] = {
+ 1.1420736694e+02, /* 0x42e46a2c */
+ 3.6509309082e+03, /* 0x45642ee5 */
+ 3.6956207031e+04, /* 0x47105c35 */
+ 9.7602796875e+04, /* 0x47bea166 */
+ 3.0804271484e+04, /* 0x46f0a88b */
+};
+
+static const float pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ 1.3199052094e-11, /* 0x2d68333f */
+ 1.1718749255e-01, /* 0x3defffff */
+ 6.8027510643e+00, /* 0x40d9b023 */
+ 1.0830818176e+02, /* 0x42d89dca */
+ 5.1763616943e+02, /* 0x440168b7 */
+ 5.2871520996e+02, /* 0x44042dc6 */
+};
+static const float ps5[5] = {
+ 5.9280597687e+01, /* 0x426d1f55 */
+ 9.9140142822e+02, /* 0x4477d9b1 */
+ 5.3532670898e+03, /* 0x45a74a23 */
+ 7.8446904297e+03, /* 0x45f52586 */
+ 1.5040468750e+03, /* 0x44bc0180 */
+};
+
+static const float pr3[6] = {
+ 3.0250391081e-09, /* 0x314fe10d */
+ 1.1718686670e-01, /* 0x3defffab */
+ 3.9329774380e+00, /* 0x407bb5e7 */
+ 3.5119403839e+01, /* 0x420c7a45 */
+ 9.1055007935e+01, /* 0x42b61c2a */
+ 4.8559066772e+01, /* 0x42423c7c */
+};
+static const float ps3[5] = {
+ 3.4791309357e+01, /* 0x420b2a4d */
+ 3.3676245117e+02, /* 0x43a86198 */
+ 1.0468714600e+03, /* 0x4482dbe3 */
+ 8.9081134033e+02, /* 0x445eb3ed */
+ 1.0378793335e+02, /* 0x42cf936c */
+};
+
+static const float pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ 1.0771083225e-07, /* 0x33e74ea8 */
+ 1.1717621982e-01, /* 0x3deffa16 */
+ 2.3685150146e+00, /* 0x401795c0 */
+ 1.2242610931e+01, /* 0x4143e1bc */
+ 1.7693971634e+01, /* 0x418d8d41 */
+ 5.0735230446e+00, /* 0x40a25a4d */
+};
+static const float ps2[5] = {
+ 2.1436485291e+01, /* 0x41ab7dec */
+ 1.2529022980e+02, /* 0x42fa9499 */
+ 2.3227647400e+02, /* 0x436846c7 */
+ 1.1767937469e+02, /* 0x42eb5bd7 */
+ 8.3646392822e+00, /* 0x4105d590 */
+};
+
+static float ponef(float x)
+{
+ const float *p,*q;
+ float_t z,r,s;
+ uint32_t ix;
+
+ GET_FLOAT_WORD(ix, x);
+ ix &= 0x7fffffff;
+ if (ix >= 0x41000000){p = pr8; q = ps8;}
+ else if (ix >= 0x409173eb){p = pr5; q = ps5;}
+ else if (ix >= 0x4036d917){p = pr3; q = ps3;}
+ else /*ix >= 0x40000000*/ {p = pr2; q = ps2;}
+ z = 1.0f/(x*x);
+ r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+ s = 1.0f+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+ return 1.0f + r/s;
+}
+
+/* For x >= 8, the asymptotic expansions of qone is
+ * 3/8 s - 105/1024 s^3 - ..., where s = 1/x.
+ * We approximate pone by
+ * qone(x) = s*(0.375 + (R/S))
+ * where R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10
+ * S = 1 + qs1*s^2 + ... + qs6*s^12
+ * and
+ * | qone(x)/s -0.375-R/S | <= 2 ** ( -61.13)
+ */
+
+static const float qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+ 0.0000000000e+00, /* 0x00000000 */
+ -1.0253906250e-01, /* 0xbdd20000 */
+ -1.6271753311e+01, /* 0xc1822c8d */
+ -7.5960174561e+02, /* 0xc43de683 */
+ -1.1849806641e+04, /* 0xc639273a */
+ -4.8438511719e+04, /* 0xc73d3683 */
+};
+static const float qs8[6] = {
+ 1.6139537048e+02, /* 0x43216537 */
+ 7.8253862305e+03, /* 0x45f48b17 */
+ 1.3387534375e+05, /* 0x4802bcd6 */
+ 7.1965775000e+05, /* 0x492fb29c */
+ 6.6660125000e+05, /* 0x4922be94 */
+ -2.9449025000e+05, /* 0xc88fcb48 */
+};
+
+static const float qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ -2.0897993405e-11, /* 0xadb7d219 */
+ -1.0253904760e-01, /* 0xbdd1fffe */
+ -8.0564479828e+00, /* 0xc100e736 */
+ -1.8366960144e+02, /* 0xc337ab6b */
+ -1.3731937256e+03, /* 0xc4aba633 */
+ -2.6124443359e+03, /* 0xc523471c */
+};
+static const float qs5[6] = {
+ 8.1276550293e+01, /* 0x42a28d98 */
+ 1.9917987061e+03, /* 0x44f8f98f */
+ 1.7468484375e+04, /* 0x468878f8 */
+ 4.9851425781e+04, /* 0x4742bb6d */
+ 2.7948074219e+04, /* 0x46da5826 */
+ -4.7191835938e+03, /* 0xc5937978 */
+};
+
+static const float qr3[6] = {
+ -5.0783124372e-09, /* 0xb1ae7d4f */
+ -1.0253783315e-01, /* 0xbdd1ff5b */
+ -4.6101160049e+00, /* 0xc0938612 */
+ -5.7847221375e+01, /* 0xc267638e */
+ -2.2824453735e+02, /* 0xc3643e9a */
+ -2.1921012878e+02, /* 0xc35b35cb */
+};
+static const float qs3[6] = {
+ 4.7665153503e+01, /* 0x423ea91e */
+ 6.7386511230e+02, /* 0x4428775e */
+ 3.3801528320e+03, /* 0x45534272 */
+ 5.5477290039e+03, /* 0x45ad5dd5 */
+ 1.9031191406e+03, /* 0x44ede3d0 */
+ -1.3520118713e+02, /* 0xc3073381 */
+};
+
+static const float qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ -1.7838172539e-07, /* 0xb43f8932 */
+ -1.0251704603e-01, /* 0xbdd1f475 */
+ -2.7522056103e+00, /* 0xc0302423 */
+ -1.9663616180e+01, /* 0xc19d4f16 */
+ -4.2325313568e+01, /* 0xc2294d1f */
+ -2.1371921539e+01, /* 0xc1aaf9b2 */
+};
+static const float qs2[6] = {
+ 2.9533363342e+01, /* 0x41ec4454 */
+ 2.5298155212e+02, /* 0x437cfb47 */
+ 7.5750280762e+02, /* 0x443d602e */
+ 7.3939318848e+02, /* 0x4438d92a */
+ 1.5594900513e+02, /* 0x431bf2f2 */
+ -4.9594988823e+00, /* 0xc09eb437 */
+};
+
+static float qonef(float x)
+{
+ const float *p,*q;
+ float_t s,r,z;
+ uint32_t ix;
+
+ GET_FLOAT_WORD(ix, x);
+ ix &= 0x7fffffff;
+ if (ix >= 0x41000000){p = qr8; q = qs8;}
+ else if (ix >= 0x409173eb){p = qr5; q = qs5;}
+ else if (ix >= 0x4036d917){p = qr3; q = qs3;}
+ else /*ix >= 0x40000000*/ {p = qr2; q = qs2;}
+ z = 1.0f/(x*x);
+ r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+ s = 1.0f+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+ return (.375f + r/s)/x;
+}
diff --git a/libc-top-half/musl/src/math/jn.c b/libc-top-half/musl/src/math/jn.c
new file mode 100644
index 0000000..4878a54
--- /dev/null
+++ b/libc-top-half/musl/src/math/jn.c
@@ -0,0 +1,280 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_jn.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/*
+ * jn(n, x), yn(n, x)
+ * floating point Bessel's function of the 1st and 2nd kind
+ * of order n
+ *
+ * Special cases:
+ * y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
+ * y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
+ * Note 2. About jn(n,x), yn(n,x)
+ * For n=0, j0(x) is called,
+ * for n=1, j1(x) is called,
+ * for n<=x, forward recursion is used starting
+ * from values of j0(x) and j1(x).
+ * for n>x, a continued fraction approximation to
+ * j(n,x)/j(n-1,x) is evaluated and then backward
+ * recursion is used starting from a supposed value
+ * for j(n,x). The resulting value of j(0,x) is
+ * compared with the actual value to correct the
+ * supposed value of j(n,x).
+ *
+ * yn(n,x) is similar in all respects, except
+ * that forward recursion is used for all
+ * values of n>1.
+ */
+
+#include "libm.h"
+
+static const double invsqrtpi = 5.64189583547756279280e-01; /* 0x3FE20DD7, 0x50429B6D */
+
+double jn(int n, double x)
+{
+ uint32_t ix, lx;
+ int nm1, i, sign;
+ double a, b, temp;
+
+ EXTRACT_WORDS(ix, lx, x);
+ sign = ix>>31;
+ ix &= 0x7fffffff;
+
+ if ((ix | (lx|-lx)>>31) > 0x7ff00000) /* nan */
+ return x;
+
+ /* J(-n,x) = (-1)^n * J(n, x), J(n, -x) = (-1)^n * J(n, x)
+ * Thus, J(-n,x) = J(n,-x)
+ */
+ /* nm1 = |n|-1 is used instead of |n| to handle n==INT_MIN */
+ if (n == 0)
+ return j0(x);
+ if (n < 0) {
+ nm1 = -(n+1);
+ x = -x;
+ sign ^= 1;
+ } else
+ nm1 = n-1;
+ if (nm1 == 0)
+ return j1(x);
+
+ sign &= n; /* even n: 0, odd n: signbit(x) */
+ x = fabs(x);
+ if ((ix|lx) == 0 || ix == 0x7ff00000) /* if x is 0 or inf */
+ b = 0.0;
+ else if (nm1 < x) {
+ /* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */
+ if (ix >= 0x52d00000) { /* x > 2**302 */
+ /* (x >> n**2)
+ * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+ * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+ * Let s=sin(x), c=cos(x),
+ * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
+ *
+ * n sin(xn)*sqt2 cos(xn)*sqt2
+ * ----------------------------------
+ * 0 s-c c+s
+ * 1 -s-c -c+s
+ * 2 -s+c -c-s
+ * 3 s+c c-s
+ */
+ switch(nm1&3) {
+ case 0: temp = -cos(x)+sin(x); break;
+ case 1: temp = -cos(x)-sin(x); break;
+ case 2: temp = cos(x)-sin(x); break;
+ default:
+ case 3: temp = cos(x)+sin(x); break;
+ }
+ b = invsqrtpi*temp/sqrt(x);
+ } else {
+ a = j0(x);
+ b = j1(x);
+ for (i=0; i<nm1; ) {
+ i++;
+ temp = b;
+ b = b*(2.0*i/x) - a; /* avoid underflow */
+ a = temp;
+ }
+ }
+ } else {
+ if (ix < 0x3e100000) { /* x < 2**-29 */
+ /* x is tiny, return the first Taylor expansion of J(n,x)
+ * J(n,x) = 1/n!*(x/2)^n - ...
+ */
+ if (nm1 > 32) /* underflow */
+ b = 0.0;
+ else {
+ temp = x*0.5;
+ b = temp;
+ a = 1.0;
+ for (i=2; i<=nm1+1; i++) {
+ a *= (double)i; /* a = n! */
+ b *= temp; /* b = (x/2)^n */
+ }
+ b = b/a;
+ }
+ } else {
+ /* use backward recurrence */
+ /* x x^2 x^2
+ * J(n,x)/J(n-1,x) = ---- ------ ------ .....
+ * 2n - 2(n+1) - 2(n+2)
+ *
+ * 1 1 1
+ * (for large x) = ---- ------ ------ .....
+ * 2n 2(n+1) 2(n+2)
+ * -- - ------ - ------ -
+ * x x x
+ *
+ * Let w = 2n/x and h=2/x, then the above quotient
+ * is equal to the continued fraction:
+ * 1
+ * = -----------------------
+ * 1
+ * w - -----------------
+ * 1
+ * w+h - ---------
+ * w+2h - ...
+ *
+ * To determine how many terms needed, let
+ * Q(0) = w, Q(1) = w(w+h) - 1,
+ * Q(k) = (w+k*h)*Q(k-1) - Q(k-2),
+ * When Q(k) > 1e4 good for single
+ * When Q(k) > 1e9 good for double
+ * When Q(k) > 1e17 good for quadruple
+ */
+ /* determine k */
+ double t,q0,q1,w,h,z,tmp,nf;
+ int k;
+
+ nf = nm1 + 1.0;
+ w = 2*nf/x;
+ h = 2/x;
+ z = w+h;
+ q0 = w;
+ q1 = w*z - 1.0;
+ k = 1;
+ while (q1 < 1.0e9) {
+ k += 1;
+ z += h;
+ tmp = z*q1 - q0;
+ q0 = q1;
+ q1 = tmp;
+ }
+ for (t=0.0, i=k; i>=0; i--)
+ t = 1/(2*(i+nf)/x - t);
+ a = t;
+ b = 1.0;
+ /* estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n)
+ * Hence, if n*(log(2n/x)) > ...
+ * single 8.8722839355e+01
+ * double 7.09782712893383973096e+02
+ * long double 1.1356523406294143949491931077970765006170e+04
+ * then recurrent value may overflow and the result is
+ * likely underflow to zero
+ */
+ tmp = nf*log(fabs(w));
+ if (tmp < 7.09782712893383973096e+02) {
+ for (i=nm1; i>0; i--) {
+ temp = b;
+ b = b*(2.0*i)/x - a;
+ a = temp;
+ }
+ } else {
+ for (i=nm1; i>0; i--) {
+ temp = b;
+ b = b*(2.0*i)/x - a;
+ a = temp;
+ /* scale b to avoid spurious overflow */
+ if (b > 0x1p500) {
+ a /= b;
+ t /= b;
+ b = 1.0;
+ }
+ }
+ }
+ z = j0(x);
+ w = j1(x);
+ if (fabs(z) >= fabs(w))
+ b = t*z/b;
+ else
+ b = t*w/a;
+ }
+ }
+ return sign ? -b : b;
+}
+
+
+double yn(int n, double x)
+{
+ uint32_t ix, lx, ib;
+ int nm1, sign, i;
+ double a, b, temp;
+
+ EXTRACT_WORDS(ix, lx, x);
+ sign = ix>>31;
+ ix &= 0x7fffffff;
+
+ if ((ix | (lx|-lx)>>31) > 0x7ff00000) /* nan */
+ return x;
+ if (sign && (ix|lx)!=0) /* x < 0 */
+ return 0/0.0;
+ if (ix == 0x7ff00000)
+ return 0.0;
+
+ if (n == 0)
+ return y0(x);
+ if (n < 0) {
+ nm1 = -(n+1);
+ sign = n&1;
+ } else {
+ nm1 = n-1;
+ sign = 0;
+ }
+ if (nm1 == 0)
+ return sign ? -y1(x) : y1(x);
+
+ if (ix >= 0x52d00000) { /* x > 2**302 */
+ /* (x >> n**2)
+ * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+ * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+ * Let s=sin(x), c=cos(x),
+ * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
+ *
+ * n sin(xn)*sqt2 cos(xn)*sqt2
+ * ----------------------------------
+ * 0 s-c c+s
+ * 1 -s-c -c+s
+ * 2 -s+c -c-s
+ * 3 s+c c-s
+ */
+ switch(nm1&3) {
+ case 0: temp = -sin(x)-cos(x); break;
+ case 1: temp = -sin(x)+cos(x); break;
+ case 2: temp = sin(x)+cos(x); break;
+ default:
+ case 3: temp = sin(x)-cos(x); break;
+ }
+ b = invsqrtpi*temp/sqrt(x);
+ } else {
+ a = y0(x);
+ b = y1(x);
+ /* quit if b is -inf */
+ GET_HIGH_WORD(ib, b);
+ for (i=0; i<nm1 && ib!=0xfff00000; ){
+ i++;
+ temp = b;
+ b = (2.0*i/x)*b - a;
+ GET_HIGH_WORD(ib, b);
+ a = temp;
+ }
+ }
+ return sign ? -b : b;
+}
diff --git a/libc-top-half/musl/src/math/jnf.c b/libc-top-half/musl/src/math/jnf.c
new file mode 100644
index 0000000..f63c062
--- /dev/null
+++ b/libc-top-half/musl/src/math/jnf.c
@@ -0,0 +1,202 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_jnf.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#define _GNU_SOURCE
+#include "libm.h"
+
+float jnf(int n, float x)
+{
+ uint32_t ix;
+ int nm1, sign, i;
+ float a, b, temp;
+
+ GET_FLOAT_WORD(ix, x);
+ sign = ix>>31;
+ ix &= 0x7fffffff;
+ if (ix > 0x7f800000) /* nan */
+ return x;
+
+ /* J(-n,x) = J(n,-x), use |n|-1 to avoid overflow in -n */
+ if (n == 0)
+ return j0f(x);
+ if (n < 0) {
+ nm1 = -(n+1);
+ x = -x;
+ sign ^= 1;
+ } else
+ nm1 = n-1;
+ if (nm1 == 0)
+ return j1f(x);
+
+ sign &= n; /* even n: 0, odd n: signbit(x) */
+ x = fabsf(x);
+ if (ix == 0 || ix == 0x7f800000) /* if x is 0 or inf */
+ b = 0.0f;
+ else if (nm1 < x) {
+ /* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */
+ a = j0f(x);
+ b = j1f(x);
+ for (i=0; i<nm1; ){
+ i++;
+ temp = b;
+ b = b*(2.0f*i/x) - a;
+ a = temp;
+ }
+ } else {
+ if (ix < 0x35800000) { /* x < 2**-20 */
+ /* x is tiny, return the first Taylor expansion of J(n,x)
+ * J(n,x) = 1/n!*(x/2)^n - ...
+ */
+ if (nm1 > 8) /* underflow */
+ nm1 = 8;
+ temp = 0.5f * x;
+ b = temp;
+ a = 1.0f;
+ for (i=2; i<=nm1+1; i++) {
+ a *= (float)i; /* a = n! */
+ b *= temp; /* b = (x/2)^n */
+ }
+ b = b/a;
+ } else {
+ /* use backward recurrence */
+ /* x x^2 x^2
+ * J(n,x)/J(n-1,x) = ---- ------ ------ .....
+ * 2n - 2(n+1) - 2(n+2)
+ *
+ * 1 1 1
+ * (for large x) = ---- ------ ------ .....
+ * 2n 2(n+1) 2(n+2)
+ * -- - ------ - ------ -
+ * x x x
+ *
+ * Let w = 2n/x and h=2/x, then the above quotient
+ * is equal to the continued fraction:
+ * 1
+ * = -----------------------
+ * 1
+ * w - -----------------
+ * 1
+ * w+h - ---------
+ * w+2h - ...
+ *
+ * To determine how many terms needed, let
+ * Q(0) = w, Q(1) = w(w+h) - 1,
+ * Q(k) = (w+k*h)*Q(k-1) - Q(k-2),
+ * When Q(k) > 1e4 good for single
+ * When Q(k) > 1e9 good for double
+ * When Q(k) > 1e17 good for quadruple
+ */
+ /* determine k */
+ float t,q0,q1,w,h,z,tmp,nf;
+ int k;
+
+ nf = nm1+1.0f;
+ w = 2*nf/x;
+ h = 2/x;
+ z = w+h;
+ q0 = w;
+ q1 = w*z - 1.0f;
+ k = 1;
+ while (q1 < 1.0e4f) {
+ k += 1;
+ z += h;
+ tmp = z*q1 - q0;
+ q0 = q1;
+ q1 = tmp;
+ }
+ for (t=0.0f, i=k; i>=0; i--)
+ t = 1.0f/(2*(i+nf)/x-t);
+ a = t;
+ b = 1.0f;
+ /* estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n)
+ * Hence, if n*(log(2n/x)) > ...
+ * single 8.8722839355e+01
+ * double 7.09782712893383973096e+02
+ * long double 1.1356523406294143949491931077970765006170e+04
+ * then recurrent value may overflow and the result is
+ * likely underflow to zero
+ */
+ tmp = nf*logf(fabsf(w));
+ if (tmp < 88.721679688f) {
+ for (i=nm1; i>0; i--) {
+ temp = b;
+ b = 2.0f*i*b/x - a;
+ a = temp;
+ }
+ } else {
+ for (i=nm1; i>0; i--){
+ temp = b;
+ b = 2.0f*i*b/x - a;
+ a = temp;
+ /* scale b to avoid spurious overflow */
+ if (b > 0x1p60f) {
+ a /= b;
+ t /= b;
+ b = 1.0f;
+ }
+ }
+ }
+ z = j0f(x);
+ w = j1f(x);
+ if (fabsf(z) >= fabsf(w))
+ b = t*z/b;
+ else
+ b = t*w/a;
+ }
+ }
+ return sign ? -b : b;
+}
+
+float ynf(int n, float x)
+{
+ uint32_t ix, ib;
+ int nm1, sign, i;
+ float a, b, temp;
+
+ GET_FLOAT_WORD(ix, x);
+ sign = ix>>31;
+ ix &= 0x7fffffff;
+ if (ix > 0x7f800000) /* nan */
+ return x;
+ if (sign && ix != 0) /* x < 0 */
+ return 0/0.0f;
+ if (ix == 0x7f800000)
+ return 0.0f;
+
+ if (n == 0)
+ return y0f(x);
+ if (n < 0) {
+ nm1 = -(n+1);
+ sign = n&1;
+ } else {
+ nm1 = n-1;
+ sign = 0;
+ }
+ if (nm1 == 0)
+ return sign ? -y1f(x) : y1f(x);
+
+ a = y0f(x);
+ b = y1f(x);
+ /* quit if b is -inf */
+ GET_FLOAT_WORD(ib,b);
+ for (i = 0; i < nm1 && ib != 0xff800000; ) {
+ i++;
+ temp = b;
+ b = (2.0f*i/x)*b - a;
+ GET_FLOAT_WORD(ib, b);
+ a = temp;
+ }
+ return sign ? -b : b;
+}
diff --git a/libc-top-half/musl/src/math/ldexp.c b/libc-top-half/musl/src/math/ldexp.c
new file mode 100644
index 0000000..f4d1cd6
--- /dev/null
+++ b/libc-top-half/musl/src/math/ldexp.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+double ldexp(double x, int n)
+{
+ return scalbn(x, n);
+}
diff --git a/libc-top-half/musl/src/math/ldexpf.c b/libc-top-half/musl/src/math/ldexpf.c
new file mode 100644
index 0000000..3bad5f3
--- /dev/null
+++ b/libc-top-half/musl/src/math/ldexpf.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+float ldexpf(float x, int n)
+{
+ return scalbnf(x, n);
+}
diff --git a/libc-top-half/musl/src/math/ldexpl.c b/libc-top-half/musl/src/math/ldexpl.c
new file mode 100644
index 0000000..fd145cc
--- /dev/null
+++ b/libc-top-half/musl/src/math/ldexpl.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+long double ldexpl(long double x, int n)
+{
+ return scalbnl(x, n);
+}
diff --git a/libc-top-half/musl/src/math/lgamma.c b/libc-top-half/musl/src/math/lgamma.c
new file mode 100644
index 0000000..2fc9b47
--- /dev/null
+++ b/libc-top-half/musl/src/math/lgamma.c
@@ -0,0 +1,7 @@
+#include <math.h>
+#include "libm.h"
+
+double lgamma(double x)
+{
+ return __lgamma_r(x, &__signgam);
+}
diff --git a/libc-top-half/musl/src/math/lgamma_r.c b/libc-top-half/musl/src/math/lgamma_r.c
new file mode 100644
index 0000000..f9984cd
--- /dev/null
+++ b/libc-top-half/musl/src/math/lgamma_r.c
@@ -0,0 +1,283 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_lgamma_r.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ */
+/* lgamma_r(x, signgamp)
+ * Reentrant version of the logarithm of the Gamma function
+ * with user provide pointer for the sign of Gamma(x).
+ *
+ * Method:
+ * 1. Argument Reduction for 0 < x <= 8
+ * Since gamma(1+s)=s*gamma(s), for x in [0,8], we may
+ * reduce x to a number in [1.5,2.5] by
+ * lgamma(1+s) = log(s) + lgamma(s)
+ * for example,
+ * lgamma(7.3) = log(6.3) + lgamma(6.3)
+ * = log(6.3*5.3) + lgamma(5.3)
+ * = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3)
+ * 2. Polynomial approximation of lgamma around its
+ * minimun ymin=1.461632144968362245 to maintain monotonicity.
+ * On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use
+ * Let z = x-ymin;
+ * lgamma(x) = -1.214862905358496078218 + z^2*poly(z)
+ * where
+ * poly(z) is a 14 degree polynomial.
+ * 2. Rational approximation in the primary interval [2,3]
+ * We use the following approximation:
+ * s = x-2.0;
+ * lgamma(x) = 0.5*s + s*P(s)/Q(s)
+ * with accuracy
+ * |P/Q - (lgamma(x)-0.5s)| < 2**-61.71
+ * Our algorithms are based on the following observation
+ *
+ * zeta(2)-1 2 zeta(3)-1 3
+ * lgamma(2+s) = s*(1-Euler) + --------- * s - --------- * s + ...
+ * 2 3
+ *
+ * where Euler = 0.5771... is the Euler constant, which is very
+ * close to 0.5.
+ *
+ * 3. For x>=8, we have
+ * lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+....
+ * (better formula:
+ * lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...)
+ * Let z = 1/x, then we approximation
+ * f(z) = lgamma(x) - (x-0.5)(log(x)-1)
+ * by
+ * 3 5 11
+ * w = w0 + w1*z + w2*z + w3*z + ... + w6*z
+ * where
+ * |w - f(z)| < 2**-58.74
+ *
+ * 4. For negative x, since (G is gamma function)
+ * -x*G(-x)*G(x) = pi/sin(pi*x),
+ * we have
+ * G(x) = pi/(sin(pi*x)*(-x)*G(-x))
+ * since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0
+ * Hence, for x<0, signgam = sign(sin(pi*x)) and
+ * lgamma(x) = log(|Gamma(x)|)
+ * = log(pi/(|x*sin(pi*x)|)) - lgamma(-x);
+ * Note: one should avoid compute pi*(-x) directly in the
+ * computation of sin(pi*(-x)).
+ *
+ * 5. Special Cases
+ * lgamma(2+s) ~ s*(1-Euler) for tiny s
+ * lgamma(1) = lgamma(2) = 0
+ * lgamma(x) ~ -log(|x|) for tiny x
+ * lgamma(0) = lgamma(neg.integer) = inf and raise divide-by-zero
+ * lgamma(inf) = inf
+ * lgamma(-inf) = inf (bug for bug compatible with C99!?)
+ *
+ */
+
+#include "libm.h"
+
+static const double
+pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */
+a0 = 7.72156649015328655494e-02, /* 0x3FB3C467, 0xE37DB0C8 */
+a1 = 3.22467033424113591611e-01, /* 0x3FD4A34C, 0xC4A60FAD */
+a2 = 6.73523010531292681824e-02, /* 0x3FB13E00, 0x1A5562A7 */
+a3 = 2.05808084325167332806e-02, /* 0x3F951322, 0xAC92547B */
+a4 = 7.38555086081402883957e-03, /* 0x3F7E404F, 0xB68FEFE8 */
+a5 = 2.89051383673415629091e-03, /* 0x3F67ADD8, 0xCCB7926B */
+a6 = 1.19270763183362067845e-03, /* 0x3F538A94, 0x116F3F5D */
+a7 = 5.10069792153511336608e-04, /* 0x3F40B6C6, 0x89B99C00 */
+a8 = 2.20862790713908385557e-04, /* 0x3F2CF2EC, 0xED10E54D */
+a9 = 1.08011567247583939954e-04, /* 0x3F1C5088, 0x987DFB07 */
+a10 = 2.52144565451257326939e-05, /* 0x3EFA7074, 0x428CFA52 */
+a11 = 4.48640949618915160150e-05, /* 0x3F07858E, 0x90A45837 */
+tc = 1.46163214496836224576e+00, /* 0x3FF762D8, 0x6356BE3F */
+tf = -1.21486290535849611461e-01, /* 0xBFBF19B9, 0xBCC38A42 */
+/* tt = -(tail of tf) */
+tt = -3.63867699703950536541e-18, /* 0xBC50C7CA, 0xA48A971F */
+t0 = 4.83836122723810047042e-01, /* 0x3FDEF72B, 0xC8EE38A2 */
+t1 = -1.47587722994593911752e-01, /* 0xBFC2E427, 0x8DC6C509 */
+t2 = 6.46249402391333854778e-02, /* 0x3FB08B42, 0x94D5419B */
+t3 = -3.27885410759859649565e-02, /* 0xBFA0C9A8, 0xDF35B713 */
+t4 = 1.79706750811820387126e-02, /* 0x3F9266E7, 0x970AF9EC */
+t5 = -1.03142241298341437450e-02, /* 0xBF851F9F, 0xBA91EC6A */
+t6 = 6.10053870246291332635e-03, /* 0x3F78FCE0, 0xE370E344 */
+t7 = -3.68452016781138256760e-03, /* 0xBF6E2EFF, 0xB3E914D7 */
+t8 = 2.25964780900612472250e-03, /* 0x3F6282D3, 0x2E15C915 */
+t9 = -1.40346469989232843813e-03, /* 0xBF56FE8E, 0xBF2D1AF1 */
+t10 = 8.81081882437654011382e-04, /* 0x3F4CDF0C, 0xEF61A8E9 */
+t11 = -5.38595305356740546715e-04, /* 0xBF41A610, 0x9C73E0EC */
+t12 = 3.15632070903625950361e-04, /* 0x3F34AF6D, 0x6C0EBBF7 */
+t13 = -3.12754168375120860518e-04, /* 0xBF347F24, 0xECC38C38 */
+t14 = 3.35529192635519073543e-04, /* 0x3F35FD3E, 0xE8C2D3F4 */
+u0 = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */
+u1 = 6.32827064025093366517e-01, /* 0x3FE4401E, 0x8B005DFF */
+u2 = 1.45492250137234768737e+00, /* 0x3FF7475C, 0xD119BD6F */
+u3 = 9.77717527963372745603e-01, /* 0x3FEF4976, 0x44EA8450 */
+u4 = 2.28963728064692451092e-01, /* 0x3FCD4EAE, 0xF6010924 */
+u5 = 1.33810918536787660377e-02, /* 0x3F8B678B, 0xBF2BAB09 */
+v1 = 2.45597793713041134822e+00, /* 0x4003A5D7, 0xC2BD619C */
+v2 = 2.12848976379893395361e+00, /* 0x40010725, 0xA42B18F5 */
+v3 = 7.69285150456672783825e-01, /* 0x3FE89DFB, 0xE45050AF */
+v4 = 1.04222645593369134254e-01, /* 0x3FBAAE55, 0xD6537C88 */
+v5 = 3.21709242282423911810e-03, /* 0x3F6A5ABB, 0x57D0CF61 */
+s0 = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */
+s1 = 2.14982415960608852501e-01, /* 0x3FCB848B, 0x36E20878 */
+s2 = 3.25778796408930981787e-01, /* 0x3FD4D98F, 0x4F139F59 */
+s3 = 1.46350472652464452805e-01, /* 0x3FC2BB9C, 0xBEE5F2F7 */
+s4 = 2.66422703033638609560e-02, /* 0x3F9B481C, 0x7E939961 */
+s5 = 1.84028451407337715652e-03, /* 0x3F5E26B6, 0x7368F239 */
+s6 = 3.19475326584100867617e-05, /* 0x3F00BFEC, 0xDD17E945 */
+r1 = 1.39200533467621045958e+00, /* 0x3FF645A7, 0x62C4AB74 */
+r2 = 7.21935547567138069525e-01, /* 0x3FE71A18, 0x93D3DCDC */
+r3 = 1.71933865632803078993e-01, /* 0x3FC601ED, 0xCCFBDF27 */
+r4 = 1.86459191715652901344e-02, /* 0x3F9317EA, 0x742ED475 */
+r5 = 7.77942496381893596434e-04, /* 0x3F497DDA, 0xCA41A95B */
+r6 = 7.32668430744625636189e-06, /* 0x3EDEBAF7, 0xA5B38140 */
+w0 = 4.18938533204672725052e-01, /* 0x3FDACFE3, 0x90C97D69 */
+w1 = 8.33333333333329678849e-02, /* 0x3FB55555, 0x5555553B */
+w2 = -2.77777777728775536470e-03, /* 0xBF66C16C, 0x16B02E5C */
+w3 = 7.93650558643019558500e-04, /* 0x3F4A019F, 0x98CF38B6 */
+w4 = -5.95187557450339963135e-04, /* 0xBF4380CB, 0x8C0FE741 */
+w5 = 8.36339918996282139126e-04, /* 0x3F4B67BA, 0x4CDAD5D1 */
+w6 = -1.63092934096575273989e-03; /* 0xBF5AB89D, 0x0B9E43E4 */
+
+/* sin(pi*x) assuming x > 2^-100, if sin(pi*x)==0 the sign is arbitrary */
+static double sin_pi(double x)
+{
+ int n;
+
+ /* spurious inexact if odd int */
+ x = 2.0*(x*0.5 - floor(x*0.5)); /* x mod 2.0 */
+
+ n = (int)(x*4.0);
+ n = (n+1)/2;
+ x -= n*0.5f;
+ x *= pi;
+
+ switch (n) {
+ default: /* case 4: */
+ case 0: return __sin(x, 0.0, 0);
+ case 1: return __cos(x, 0.0);
+ case 2: return __sin(-x, 0.0, 0);
+ case 3: return -__cos(x, 0.0);
+ }
+}
+
+double __lgamma_r(double x, int *signgamp)
+{
+ union {double f; uint64_t i;} u = {x};
+ double_t t,y,z,nadj,p,p1,p2,p3,q,r,w;
+ uint32_t ix;
+ int sign,i;
+
+ /* purge off +-inf, NaN, +-0, tiny and negative arguments */
+ *signgamp = 1;
+ sign = u.i>>63;
+ ix = u.i>>32 & 0x7fffffff;
+ if (ix >= 0x7ff00000)
+ return x*x;
+ if (ix < (0x3ff-70)<<20) { /* |x|<2**-70, return -log(|x|) */
+ if(sign) {
+ x = -x;
+ *signgamp = -1;
+ }
+ return -log(x);
+ }
+ if (sign) {
+ x = -x;
+ t = sin_pi(x);
+ if (t == 0.0) /* -integer */
+ return 1.0/(x-x);
+ if (t > 0.0)
+ *signgamp = -1;
+ else
+ t = -t;
+ nadj = log(pi/(t*x));
+ }
+
+ /* purge off 1 and 2 */
+ if ((ix == 0x3ff00000 || ix == 0x40000000) && (uint32_t)u.i == 0)
+ r = 0;
+ /* for x < 2.0 */
+ else if (ix < 0x40000000) {
+ if (ix <= 0x3feccccc) { /* lgamma(x) = lgamma(x+1)-log(x) */
+ r = -log(x);
+ if (ix >= 0x3FE76944) {
+ y = 1.0 - x;
+ i = 0;
+ } else if (ix >= 0x3FCDA661) {
+ y = x - (tc-1.0);
+ i = 1;
+ } else {
+ y = x;
+ i = 2;
+ }
+ } else {
+ r = 0.0;
+ if (ix >= 0x3FFBB4C3) { /* [1.7316,2] */
+ y = 2.0 - x;
+ i = 0;
+ } else if(ix >= 0x3FF3B4C4) { /* [1.23,1.73] */
+ y = x - tc;
+ i = 1;
+ } else {
+ y = x - 1.0;
+ i = 2;
+ }
+ }
+ switch (i) {
+ case 0:
+ z = y*y;
+ p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10))));
+ p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11)))));
+ p = y*p1+p2;
+ r += (p-0.5*y);
+ break;
+ case 1:
+ z = y*y;
+ w = z*y;
+ p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12))); /* parallel comp */
+ p2 = t1+w*(t4+w*(t7+w*(t10+w*t13)));
+ p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
+ p = z*p1-(tt-w*(p2+y*p3));
+ r += tf + p;
+ break;
+ case 2:
+ p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
+ p2 = 1.0+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
+ r += -0.5*y + p1/p2;
+ }
+ } else if (ix < 0x40200000) { /* x < 8.0 */
+ i = (int)x;
+ y = x - (double)i;
+ p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6))))));
+ q = 1.0+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6)))));
+ r = 0.5*y+p/q;
+ z = 1.0; /* lgamma(1+s) = log(s) + lgamma(s) */
+ switch (i) {
+ case 7: z *= y + 6.0; /* FALLTHRU */
+ case 6: z *= y + 5.0; /* FALLTHRU */
+ case 5: z *= y + 4.0; /* FALLTHRU */
+ case 4: z *= y + 3.0; /* FALLTHRU */
+ case 3: z *= y + 2.0; /* FALLTHRU */
+ r += log(z);
+ break;
+ }
+ } else if (ix < 0x43900000) { /* 8.0 <= x < 2**58 */
+ t = log(x);
+ z = 1.0/x;
+ y = z*z;
+ w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
+ r = (x-0.5)*(t-1.0)+w;
+ } else /* 2**58 <= x <= inf */
+ r = x*(log(x)-1.0);
+ if (sign)
+ r = nadj - r;
+ return r;
+}
+
+weak_alias(__lgamma_r, lgamma_r);
diff --git a/libc-top-half/musl/src/math/lgammaf.c b/libc-top-half/musl/src/math/lgammaf.c
new file mode 100644
index 0000000..2ae051d
--- /dev/null
+++ b/libc-top-half/musl/src/math/lgammaf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+#include "libm.h"
+
+float lgammaf(float x)
+{
+ return __lgammaf_r(x, &__signgam);
+}
diff --git a/libc-top-half/musl/src/math/lgammaf_r.c b/libc-top-half/musl/src/math/lgammaf_r.c
new file mode 100644
index 0000000..3f353f1
--- /dev/null
+++ b/libc-top-half/musl/src/math/lgammaf_r.c
@@ -0,0 +1,218 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_lgammaf_r.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+static const float
+pi = 3.1415927410e+00, /* 0x40490fdb */
+a0 = 7.7215664089e-02, /* 0x3d9e233f */
+a1 = 3.2246702909e-01, /* 0x3ea51a66 */
+a2 = 6.7352302372e-02, /* 0x3d89f001 */
+a3 = 2.0580807701e-02, /* 0x3ca89915 */
+a4 = 7.3855509982e-03, /* 0x3bf2027e */
+a5 = 2.8905137442e-03, /* 0x3b3d6ec6 */
+a6 = 1.1927076848e-03, /* 0x3a9c54a1 */
+a7 = 5.1006977446e-04, /* 0x3a05b634 */
+a8 = 2.2086278477e-04, /* 0x39679767 */
+a9 = 1.0801156895e-04, /* 0x38e28445 */
+a10 = 2.5214456400e-05, /* 0x37d383a2 */
+a11 = 4.4864096708e-05, /* 0x383c2c75 */
+tc = 1.4616321325e+00, /* 0x3fbb16c3 */
+tf = -1.2148628384e-01, /* 0xbdf8cdcd */
+/* tt = -(tail of tf) */
+tt = 6.6971006518e-09, /* 0x31e61c52 */
+t0 = 4.8383611441e-01, /* 0x3ef7b95e */
+t1 = -1.4758771658e-01, /* 0xbe17213c */
+t2 = 6.4624942839e-02, /* 0x3d845a15 */
+t3 = -3.2788541168e-02, /* 0xbd064d47 */
+t4 = 1.7970675603e-02, /* 0x3c93373d */
+t5 = -1.0314224288e-02, /* 0xbc28fcfe */
+t6 = 6.1005386524e-03, /* 0x3bc7e707 */
+t7 = -3.6845202558e-03, /* 0xbb7177fe */
+t8 = 2.2596477065e-03, /* 0x3b141699 */
+t9 = -1.4034647029e-03, /* 0xbab7f476 */
+t10 = 8.8108185446e-04, /* 0x3a66f867 */
+t11 = -5.3859531181e-04, /* 0xba0d3085 */
+t12 = 3.1563205994e-04, /* 0x39a57b6b */
+t13 = -3.1275415677e-04, /* 0xb9a3f927 */
+t14 = 3.3552918467e-04, /* 0x39afe9f7 */
+u0 = -7.7215664089e-02, /* 0xbd9e233f */
+u1 = 6.3282704353e-01, /* 0x3f2200f4 */
+u2 = 1.4549225569e+00, /* 0x3fba3ae7 */
+u3 = 9.7771751881e-01, /* 0x3f7a4bb2 */
+u4 = 2.2896373272e-01, /* 0x3e6a7578 */
+u5 = 1.3381091878e-02, /* 0x3c5b3c5e */
+v1 = 2.4559779167e+00, /* 0x401d2ebe */
+v2 = 2.1284897327e+00, /* 0x4008392d */
+v3 = 7.6928514242e-01, /* 0x3f44efdf */
+v4 = 1.0422264785e-01, /* 0x3dd572af */
+v5 = 3.2170924824e-03, /* 0x3b52d5db */
+s0 = -7.7215664089e-02, /* 0xbd9e233f */
+s1 = 2.1498242021e-01, /* 0x3e5c245a */
+s2 = 3.2577878237e-01, /* 0x3ea6cc7a */
+s3 = 1.4635047317e-01, /* 0x3e15dce6 */
+s4 = 2.6642270386e-02, /* 0x3cda40e4 */
+s5 = 1.8402845599e-03, /* 0x3af135b4 */
+s6 = 3.1947532989e-05, /* 0x3805ff67 */
+r1 = 1.3920053244e+00, /* 0x3fb22d3b */
+r2 = 7.2193557024e-01, /* 0x3f38d0c5 */
+r3 = 1.7193385959e-01, /* 0x3e300f6e */
+r4 = 1.8645919859e-02, /* 0x3c98bf54 */
+r5 = 7.7794247773e-04, /* 0x3a4beed6 */
+r6 = 7.3266842264e-06, /* 0x36f5d7bd */
+w0 = 4.1893854737e-01, /* 0x3ed67f1d */
+w1 = 8.3333335817e-02, /* 0x3daaaaab */
+w2 = -2.7777778450e-03, /* 0xbb360b61 */
+w3 = 7.9365057172e-04, /* 0x3a500cfd */
+w4 = -5.9518753551e-04, /* 0xba1c065c */
+w5 = 8.3633989561e-04, /* 0x3a5b3dd2 */
+w6 = -1.6309292987e-03; /* 0xbad5c4e8 */
+
+/* sin(pi*x) assuming x > 2^-100, if sin(pi*x)==0 the sign is arbitrary */
+static float sin_pi(float x)
+{
+ double_t y;
+ int n;
+
+ /* spurious inexact if odd int */
+ x = 2*(x*0.5f - floorf(x*0.5f)); /* x mod 2.0 */
+
+ n = (int)(x*4);
+ n = (n+1)/2;
+ y = x - n*0.5f;
+ y *= 3.14159265358979323846;
+ switch (n) {
+ default: /* case 4: */
+ case 0: return __sindf(y);
+ case 1: return __cosdf(y);
+ case 2: return __sindf(-y);
+ case 3: return -__cosdf(y);
+ }
+}
+
+float __lgammaf_r(float x, int *signgamp)
+{
+ union {float f; uint32_t i;} u = {x};
+ float t,y,z,nadj,p,p1,p2,p3,q,r,w;
+ uint32_t ix;
+ int i,sign;
+
+ /* purge off +-inf, NaN, +-0, tiny and negative arguments */
+ *signgamp = 1;
+ sign = u.i>>31;
+ ix = u.i & 0x7fffffff;
+ if (ix >= 0x7f800000)
+ return x*x;
+ if (ix < 0x35000000) { /* |x| < 2**-21, return -log(|x|) */
+ if (sign) {
+ *signgamp = -1;
+ x = -x;
+ }
+ return -logf(x);
+ }
+ if (sign) {
+ x = -x;
+ t = sin_pi(x);
+ if (t == 0.0f) /* -integer */
+ return 1.0f/(x-x);
+ if (t > 0.0f)
+ *signgamp = -1;
+ else
+ t = -t;
+ nadj = logf(pi/(t*x));
+ }
+
+ /* purge off 1 and 2 */
+ if (ix == 0x3f800000 || ix == 0x40000000)
+ r = 0;
+ /* for x < 2.0 */
+ else if (ix < 0x40000000) {
+ if (ix <= 0x3f666666) { /* lgamma(x) = lgamma(x+1)-log(x) */
+ r = -logf(x);
+ if (ix >= 0x3f3b4a20) {
+ y = 1.0f - x;
+ i = 0;
+ } else if (ix >= 0x3e6d3308) {
+ y = x - (tc-1.0f);
+ i = 1;
+ } else {
+ y = x;
+ i = 2;
+ }
+ } else {
+ r = 0.0f;
+ if (ix >= 0x3fdda618) { /* [1.7316,2] */
+ y = 2.0f - x;
+ i = 0;
+ } else if (ix >= 0x3F9da620) { /* [1.23,1.73] */
+ y = x - tc;
+ i = 1;
+ } else {
+ y = x - 1.0f;
+ i = 2;
+ }
+ }
+ switch(i) {
+ case 0:
+ z = y*y;
+ p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10))));
+ p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11)))));
+ p = y*p1+p2;
+ r += p - 0.5f*y;
+ break;
+ case 1:
+ z = y*y;
+ w = z*y;
+ p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12))); /* parallel comp */
+ p2 = t1+w*(t4+w*(t7+w*(t10+w*t13)));
+ p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
+ p = z*p1-(tt-w*(p2+y*p3));
+ r += (tf + p);
+ break;
+ case 2:
+ p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
+ p2 = 1.0f+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
+ r += -0.5f*y + p1/p2;
+ }
+ } else if (ix < 0x41000000) { /* x < 8.0 */
+ i = (int)x;
+ y = x - (float)i;
+ p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6))))));
+ q = 1.0f+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6)))));
+ r = 0.5f*y+p/q;
+ z = 1.0f; /* lgamma(1+s) = log(s) + lgamma(s) */
+ switch (i) {
+ case 7: z *= y + 6.0f; /* FALLTHRU */
+ case 6: z *= y + 5.0f; /* FALLTHRU */
+ case 5: z *= y + 4.0f; /* FALLTHRU */
+ case 4: z *= y + 3.0f; /* FALLTHRU */
+ case 3: z *= y + 2.0f; /* FALLTHRU */
+ r += logf(z);
+ break;
+ }
+ } else if (ix < 0x5c800000) { /* 8.0 <= x < 2**58 */
+ t = logf(x);
+ z = 1.0f/x;
+ y = z*z;
+ w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
+ r = (x-0.5f)*(t-1.0f)+w;
+ } else /* 2**58 <= x <= inf */
+ r = x*(logf(x)-1.0f);
+ if (sign)
+ r = nadj - r;
+ return r;
+}
+
+weak_alias(__lgammaf_r, lgammaf_r);
diff --git a/libc-top-half/musl/src/math/lgammal.c b/libc-top-half/musl/src/math/lgammal.c
new file mode 100644
index 0000000..abbd4fc
--- /dev/null
+++ b/libc-top-half/musl/src/math/lgammal.c
@@ -0,0 +1,353 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_lgammal.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/* lgammal(x)
+ * Reentrant version of the logarithm of the Gamma function
+ * with user provide pointer for the sign of Gamma(x).
+ *
+ * Method:
+ * 1. Argument Reduction for 0 < x <= 8
+ * Since gamma(1+s)=s*gamma(s), for x in [0,8], we may
+ * reduce x to a number in [1.5,2.5] by
+ * lgamma(1+s) = log(s) + lgamma(s)
+ * for example,
+ * lgamma(7.3) = log(6.3) + lgamma(6.3)
+ * = log(6.3*5.3) + lgamma(5.3)
+ * = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3)
+ * 2. Polynomial approximation of lgamma around its
+ * minimun ymin=1.461632144968362245 to maintain monotonicity.
+ * On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use
+ * Let z = x-ymin;
+ * lgamma(x) = -1.214862905358496078218 + z^2*poly(z)
+ * 2. Rational approximation in the primary interval [2,3]
+ * We use the following approximation:
+ * s = x-2.0;
+ * lgamma(x) = 0.5*s + s*P(s)/Q(s)
+ * Our algorithms are based on the following observation
+ *
+ * zeta(2)-1 2 zeta(3)-1 3
+ * lgamma(2+s) = s*(1-Euler) + --------- * s - --------- * s + ...
+ * 2 3
+ *
+ * where Euler = 0.5771... is the Euler constant, which is very
+ * close to 0.5.
+ *
+ * 3. For x>=8, we have
+ * lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+....
+ * (better formula:
+ * lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...)
+ * Let z = 1/x, then we approximation
+ * f(z) = lgamma(x) - (x-0.5)(log(x)-1)
+ * by
+ * 3 5 11
+ * w = w0 + w1*z + w2*z + w3*z + ... + w6*z
+ *
+ * 4. For negative x, since (G is gamma function)
+ * -x*G(-x)*G(x) = pi/sin(pi*x),
+ * we have
+ * G(x) = pi/(sin(pi*x)*(-x)*G(-x))
+ * since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0
+ * Hence, for x<0, signgam = sign(sin(pi*x)) and
+ * lgamma(x) = log(|Gamma(x)|)
+ * = log(pi/(|x*sin(pi*x)|)) - lgamma(-x);
+ * Note: one should avoid compute pi*(-x) directly in the
+ * computation of sin(pi*(-x)).
+ *
+ * 5. Special Cases
+ * lgamma(2+s) ~ s*(1-Euler) for tiny s
+ * lgamma(1)=lgamma(2)=0
+ * lgamma(x) ~ -log(x) for tiny x
+ * lgamma(0) = lgamma(inf) = inf
+ * lgamma(-integer) = +-inf
+ *
+ */
+
+#define _GNU_SOURCE
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double __lgammal_r(long double x, int *sg)
+{
+ return __lgamma_r(x, sg);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+static const long double
+pi = 3.14159265358979323846264L,
+
+/* lgam(1+x) = 0.5 x + x a(x)/b(x)
+ -0.268402099609375 <= x <= 0
+ peak relative error 6.6e-22 */
+a0 = -6.343246574721079391729402781192128239938E2L,
+a1 = 1.856560238672465796768677717168371401378E3L,
+a2 = 2.404733102163746263689288466865843408429E3L,
+a3 = 8.804188795790383497379532868917517596322E2L,
+a4 = 1.135361354097447729740103745999661157426E2L,
+a5 = 3.766956539107615557608581581190400021285E0L,
+
+b0 = 8.214973713960928795704317259806842490498E3L,
+b1 = 1.026343508841367384879065363925870888012E4L,
+b2 = 4.553337477045763320522762343132210919277E3L,
+b3 = 8.506975785032585797446253359230031874803E2L,
+b4 = 6.042447899703295436820744186992189445813E1L,
+/* b5 = 1.000000000000000000000000000000000000000E0 */
+
+
+tc = 1.4616321449683623412626595423257213284682E0L,
+tf = -1.2148629053584961146050602565082954242826E-1, /* double precision */
+/* tt = (tail of tf), i.e. tf + tt has extended precision. */
+tt = 3.3649914684731379602768989080467587736363E-18L,
+/* lgam ( 1.4616321449683623412626595423257213284682E0 ) =
+-1.2148629053584960809551455717769158215135617312999903886372437313313530E-1 */
+
+/* lgam (x + tc) = tf + tt + x g(x)/h(x)
+ -0.230003726999612341262659542325721328468 <= x
+ <= 0.2699962730003876587373404576742786715318
+ peak relative error 2.1e-21 */
+g0 = 3.645529916721223331888305293534095553827E-18L,
+g1 = 5.126654642791082497002594216163574795690E3L,
+g2 = 8.828603575854624811911631336122070070327E3L,
+g3 = 5.464186426932117031234820886525701595203E3L,
+g4 = 1.455427403530884193180776558102868592293E3L,
+g5 = 1.541735456969245924860307497029155838446E2L,
+g6 = 4.335498275274822298341872707453445815118E0L,
+
+h0 = 1.059584930106085509696730443974495979641E4L,
+h1 = 2.147921653490043010629481226937850618860E4L,
+h2 = 1.643014770044524804175197151958100656728E4L,
+h3 = 5.869021995186925517228323497501767586078E3L,
+h4 = 9.764244777714344488787381271643502742293E2L,
+h5 = 6.442485441570592541741092969581997002349E1L,
+/* h6 = 1.000000000000000000000000000000000000000E0 */
+
+
+/* lgam (x+1) = -0.5 x + x u(x)/v(x)
+ -0.100006103515625 <= x <= 0.231639862060546875
+ peak relative error 1.3e-21 */
+u0 = -8.886217500092090678492242071879342025627E1L,
+u1 = 6.840109978129177639438792958320783599310E2L,
+u2 = 2.042626104514127267855588786511809932433E3L,
+u3 = 1.911723903442667422201651063009856064275E3L,
+u4 = 7.447065275665887457628865263491667767695E2L,
+u5 = 1.132256494121790736268471016493103952637E2L,
+u6 = 4.484398885516614191003094714505960972894E0L,
+
+v0 = 1.150830924194461522996462401210374632929E3L,
+v1 = 3.399692260848747447377972081399737098610E3L,
+v2 = 3.786631705644460255229513563657226008015E3L,
+v3 = 1.966450123004478374557778781564114347876E3L,
+v4 = 4.741359068914069299837355438370682773122E2L,
+v5 = 4.508989649747184050907206782117647852364E1L,
+/* v6 = 1.000000000000000000000000000000000000000E0 */
+
+
+/* lgam (x+2) = .5 x + x s(x)/r(x)
+ 0 <= x <= 1
+ peak relative error 7.2e-22 */
+s0 = 1.454726263410661942989109455292824853344E6L,
+s1 = -3.901428390086348447890408306153378922752E6L,
+s2 = -6.573568698209374121847873064292963089438E6L,
+s3 = -3.319055881485044417245964508099095984643E6L,
+s4 = -7.094891568758439227560184618114707107977E5L,
+s5 = -6.263426646464505837422314539808112478303E4L,
+s6 = -1.684926520999477529949915657519454051529E3L,
+
+r0 = -1.883978160734303518163008696712983134698E7L,
+r1 = -2.815206082812062064902202753264922306830E7L,
+r2 = -1.600245495251915899081846093343626358398E7L,
+r3 = -4.310526301881305003489257052083370058799E6L,
+r4 = -5.563807682263923279438235987186184968542E5L,
+r5 = -3.027734654434169996032905158145259713083E4L,
+r6 = -4.501995652861105629217250715790764371267E2L,
+/* r6 = 1.000000000000000000000000000000000000000E0 */
+
+
+/* lgam(x) = ( x - 0.5 ) * log(x) - x + LS2PI + 1/x w(1/x^2)
+ x >= 8
+ Peak relative error 1.51e-21
+w0 = LS2PI - 0.5 */
+w0 = 4.189385332046727417803e-1L,
+w1 = 8.333333333333331447505E-2L,
+w2 = -2.777777777750349603440E-3L,
+w3 = 7.936507795855070755671E-4L,
+w4 = -5.952345851765688514613E-4L,
+w5 = 8.412723297322498080632E-4L,
+w6 = -1.880801938119376907179E-3L,
+w7 = 4.885026142432270781165E-3L;
+
+/* sin(pi*x) assuming x > 2^-1000, if sin(pi*x)==0 the sign is arbitrary */
+static long double sin_pi(long double x)
+{
+ int n;
+
+ /* spurious inexact if odd int */
+ x *= 0.5;
+ x = 2.0*(x - floorl(x)); /* x mod 2.0 */
+
+ n = (int)(x*4.0);
+ n = (n+1)/2;
+ x -= n*0.5f;
+ x *= pi;
+
+ switch (n) {
+ default: /* case 4: */
+ case 0: return __sinl(x, 0.0, 0);
+ case 1: return __cosl(x, 0.0);
+ case 2: return __sinl(-x, 0.0, 0);
+ case 3: return -__cosl(x, 0.0);
+ }
+}
+
+long double __lgammal_r(long double x, int *sg) {
+ long double t, y, z, nadj, p, p1, p2, q, r, w;
+ union ldshape u = {x};
+ uint32_t ix = (u.i.se & 0x7fffU)<<16 | u.i.m>>48;
+ int sign = u.i.se >> 15;
+ int i;
+
+ *sg = 1;
+
+ /* purge off +-inf, NaN, +-0, tiny and negative arguments */
+ if (ix >= 0x7fff0000)
+ return x * x;
+ if (ix < 0x3fc08000) { /* |x|<2**-63, return -log(|x|) */
+ if (sign) {
+ *sg = -1;
+ x = -x;
+ }
+ return -logl(x);
+ }
+ if (sign) {
+ x = -x;
+ t = sin_pi(x);
+ if (t == 0.0)
+ return 1.0 / (x-x); /* -integer */
+ if (t > 0.0)
+ *sg = -1;
+ else
+ t = -t;
+ nadj = logl(pi / (t * x));
+ }
+
+ /* purge off 1 and 2 (so the sign is ok with downward rounding) */
+ if ((ix == 0x3fff8000 || ix == 0x40008000) && u.i.m == 0) {
+ r = 0;
+ } else if (ix < 0x40008000) { /* x < 2.0 */
+ if (ix <= 0x3ffee666) { /* 8.99993896484375e-1 */
+ /* lgamma(x) = lgamma(x+1) - log(x) */
+ r = -logl(x);
+ if (ix >= 0x3ffebb4a) { /* 7.31597900390625e-1 */
+ y = x - 1.0;
+ i = 0;
+ } else if (ix >= 0x3ffced33) { /* 2.31639862060546875e-1 */
+ y = x - (tc - 1.0);
+ i = 1;
+ } else { /* x < 0.23 */
+ y = x;
+ i = 2;
+ }
+ } else {
+ r = 0.0;
+ if (ix >= 0x3fffdda6) { /* 1.73162841796875 */
+ /* [1.7316,2] */
+ y = x - 2.0;
+ i = 0;
+ } else if (ix >= 0x3fff9da6) { /* 1.23162841796875 */
+ /* [1.23,1.73] */
+ y = x - tc;
+ i = 1;
+ } else {
+ /* [0.9, 1.23] */
+ y = x - 1.0;
+ i = 2;
+ }
+ }
+ switch (i) {
+ case 0:
+ p1 = a0 + y * (a1 + y * (a2 + y * (a3 + y * (a4 + y * a5))));
+ p2 = b0 + y * (b1 + y * (b2 + y * (b3 + y * (b4 + y))));
+ r += 0.5 * y + y * p1/p2;
+ break;
+ case 1:
+ p1 = g0 + y * (g1 + y * (g2 + y * (g3 + y * (g4 + y * (g5 + y * g6)))));
+ p2 = h0 + y * (h1 + y * (h2 + y * (h3 + y * (h4 + y * (h5 + y)))));
+ p = tt + y * p1/p2;
+ r += (tf + p);
+ break;
+ case 2:
+ p1 = y * (u0 + y * (u1 + y * (u2 + y * (u3 + y * (u4 + y * (u5 + y * u6))))));
+ p2 = v0 + y * (v1 + y * (v2 + y * (v3 + y * (v4 + y * (v5 + y)))));
+ r += (-0.5 * y + p1 / p2);
+ }
+ } else if (ix < 0x40028000) { /* 8.0 */
+ /* x < 8.0 */
+ i = (int)x;
+ y = x - (double)i;
+ p = y * (s0 + y * (s1 + y * (s2 + y * (s3 + y * (s4 + y * (s5 + y * s6))))));
+ q = r0 + y * (r1 + y * (r2 + y * (r3 + y * (r4 + y * (r5 + y * (r6 + y))))));
+ r = 0.5 * y + p / q;
+ z = 1.0;
+ /* lgamma(1+s) = log(s) + lgamma(s) */
+ switch (i) {
+ case 7:
+ z *= (y + 6.0); /* FALLTHRU */
+ case 6:
+ z *= (y + 5.0); /* FALLTHRU */
+ case 5:
+ z *= (y + 4.0); /* FALLTHRU */
+ case 4:
+ z *= (y + 3.0); /* FALLTHRU */
+ case 3:
+ z *= (y + 2.0); /* FALLTHRU */
+ r += logl(z);
+ break;
+ }
+ } else if (ix < 0x40418000) { /* 2^66 */
+ /* 8.0 <= x < 2**66 */
+ t = logl(x);
+ z = 1.0 / x;
+ y = z * z;
+ w = w0 + z * (w1 + y * (w2 + y * (w3 + y * (w4 + y * (w5 + y * (w6 + y * w7))))));
+ r = (x - 0.5) * (t - 1.0) + w;
+ } else /* 2**66 <= x <= inf */
+ r = x * (logl(x) - 1.0);
+ if (sign)
+ r = nadj - r;
+ return r;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double __lgammal_r(long double x, int *sg)
+{
+ return __lgamma_r(x, sg);
+}
+#endif
+
+long double lgammal(long double x)
+{
+ return __lgammal_r(x, &__signgam);
+}
+
+weak_alias(__lgammal_r, lgammal_r);
diff --git a/libc-top-half/musl/src/math/llrint.c b/libc-top-half/musl/src/math/llrint.c
new file mode 100644
index 0000000..4f583ae
--- /dev/null
+++ b/libc-top-half/musl/src/math/llrint.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+/* uses LLONG_MAX > 2^53, see comments in lrint.c */
+
+long long llrint(double x)
+{
+ return rint(x);
+}
diff --git a/libc-top-half/musl/src/math/llrintf.c b/libc-top-half/musl/src/math/llrintf.c
new file mode 100644
index 0000000..96949a0
--- /dev/null
+++ b/libc-top-half/musl/src/math/llrintf.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+/* uses LLONG_MAX > 2^24, see comments in lrint.c */
+
+long long llrintf(float x)
+{
+ return rintf(x);
+}
diff --git a/libc-top-half/musl/src/math/llrintl.c b/libc-top-half/musl/src/math/llrintl.c
new file mode 100644
index 0000000..3449f6f
--- /dev/null
+++ b/libc-top-half/musl/src/math/llrintl.c
@@ -0,0 +1,36 @@
+#include <limits.h>
+#include <fenv.h>
+#include "libm.h"
+
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long long llrintl(long double x)
+{
+ return llrint(x);
+}
+#elif defined(FE_INEXACT)
+/*
+see comments in lrint.c
+
+Note that if LLONG_MAX == 0x7fffffffffffffff && LDBL_MANT_DIG == 64
+then x == 2**63 - 0.5 is the only input that overflows and
+raises inexact (with tonearest or upward rounding mode)
+*/
+long long llrintl(long double x)
+{
+ #pragma STDC FENV_ACCESS ON
+ int e;
+
+ e = fetestexcept(FE_INEXACT);
+ x = rintl(x);
+ if (!e && (x > LLONG_MAX || x < LLONG_MIN))
+ feclearexcept(FE_INEXACT);
+ /* conversion */
+ return x;
+}
+#else
+long long llrintl(long double x)
+{
+ return rintl(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/llround.c b/libc-top-half/musl/src/math/llround.c
new file mode 100644
index 0000000..4d94787
--- /dev/null
+++ b/libc-top-half/musl/src/math/llround.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+long long llround(double x)
+{
+ return round(x);
+}
diff --git a/libc-top-half/musl/src/math/llroundf.c b/libc-top-half/musl/src/math/llroundf.c
new file mode 100644
index 0000000..19eb77e
--- /dev/null
+++ b/libc-top-half/musl/src/math/llroundf.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+long long llroundf(float x)
+{
+ return roundf(x);
+}
diff --git a/libc-top-half/musl/src/math/llroundl.c b/libc-top-half/musl/src/math/llroundl.c
new file mode 100644
index 0000000..2c2ee5e
--- /dev/null
+++ b/libc-top-half/musl/src/math/llroundl.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+long long llroundl(long double x)
+{
+ return roundl(x);
+}
diff --git a/libc-top-half/musl/src/math/log.c b/libc-top-half/musl/src/math/log.c
new file mode 100644
index 0000000..cc52585
--- /dev/null
+++ b/libc-top-half/musl/src/math/log.c
@@ -0,0 +1,112 @@
+/*
+ * Double-precision log(x) function.
+ *
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <math.h>
+#include <stdint.h>
+#include "libm.h"
+#include "log_data.h"
+
+#define T __log_data.tab
+#define T2 __log_data.tab2
+#define B __log_data.poly1
+#define A __log_data.poly
+#define Ln2hi __log_data.ln2hi
+#define Ln2lo __log_data.ln2lo
+#define N (1 << LOG_TABLE_BITS)
+#define OFF 0x3fe6000000000000
+
+/* Top 16 bits of a double. */
+static inline uint32_t top16(double x)
+{
+ return asuint64(x) >> 48;
+}
+
+double log(double x)
+{
+ double_t w, z, r, r2, r3, y, invc, logc, kd, hi, lo;
+ uint64_t ix, iz, tmp;
+ uint32_t top;
+ int k, i;
+
+ ix = asuint64(x);
+ top = top16(x);
+#define LO asuint64(1.0 - 0x1p-4)
+#define HI asuint64(1.0 + 0x1.09p-4)
+ if (predict_false(ix - LO < HI - LO)) {
+ /* Handle close to 1.0 inputs separately. */
+ /* Fix sign of zero with downward rounding when x==1. */
+ if (WANT_ROUNDING && predict_false(ix == asuint64(1.0)))
+ return 0;
+ r = x - 1.0;
+ r2 = r * r;
+ r3 = r * r2;
+ y = r3 *
+ (B[1] + r * B[2] + r2 * B[3] +
+ r3 * (B[4] + r * B[5] + r2 * B[6] +
+ r3 * (B[7] + r * B[8] + r2 * B[9] + r3 * B[10])));
+ /* Worst-case error is around 0.507 ULP. */
+ w = r * 0x1p27;
+ double_t rhi = r + w - w;
+ double_t rlo = r - rhi;
+ w = rhi * rhi * B[0]; /* B[0] == -0.5. */
+ hi = r + w;
+ lo = r - hi + w;
+ lo += B[0] * rlo * (rhi + r);
+ y += lo;
+ y += hi;
+ return eval_as_double(y);
+ }
+ if (predict_false(top - 0x0010 >= 0x7ff0 - 0x0010)) {
+ /* x < 0x1p-1022 or inf or nan. */
+ if (ix * 2 == 0)
+ return __math_divzero(1);
+ if (ix == asuint64(INFINITY)) /* log(inf) == inf. */
+ return x;
+ if ((top & 0x8000) || (top & 0x7ff0) == 0x7ff0)
+ return __math_invalid(x);
+ /* x is subnormal, normalize it. */
+ ix = asuint64(x * 0x1p52);
+ ix -= 52ULL << 52;
+ }
+
+ /* x = 2^k z; where z is in range [OFF,2*OFF) and exact.
+ The range is split into N subintervals.
+ The ith subinterval contains z and c is near its center. */
+ tmp = ix - OFF;
+ i = (tmp >> (52 - LOG_TABLE_BITS)) % N;
+ k = (int64_t)tmp >> 52; /* arithmetic shift */
+ iz = ix - (tmp & 0xfffULL << 52);
+ invc = T[i].invc;
+ logc = T[i].logc;
+ z = asdouble(iz);
+
+ /* log(x) = log1p(z/c-1) + log(c) + k*Ln2. */
+ /* r ~= z/c - 1, |r| < 1/(2*N). */
+#if __FP_FAST_FMA
+ /* rounding error: 0x1p-55/N. */
+ r = __builtin_fma(z, invc, -1.0);
+#else
+ /* rounding error: 0x1p-55/N + 0x1p-66. */
+ r = (z - T2[i].chi - T2[i].clo) * invc;
+#endif
+ kd = (double_t)k;
+
+ /* hi + lo = r + log(c) + k*Ln2. */
+ w = kd * Ln2hi + logc;
+ hi = w + r;
+ lo = w - hi + r + kd * Ln2lo;
+
+ /* log(x) = lo + (log1p(r) - r) + hi. */
+ r2 = r * r; /* rounding error: 0x1p-54/N^2. */
+ /* Worst case error if |y| > 0x1p-5:
+ 0.5 + 4.13/N + abs-poly-error*2^57 ULP (+ 0.002 ULP without fma)
+ Worst case error if |y| > 0x1p-4:
+ 0.5 + 2.06/N + abs-poly-error*2^56 ULP (+ 0.001 ULP without fma). */
+ y = lo + r2 * A[0] +
+ r * r2 * (A[1] + r * A[2] + r2 * (A[3] + r * A[4])) + hi;
+ return eval_as_double(y);
+}
diff --git a/libc-top-half/musl/src/math/log10.c b/libc-top-half/musl/src/math/log10.c
new file mode 100644
index 0000000..8102687
--- /dev/null
+++ b/libc-top-half/musl/src/math/log10.c
@@ -0,0 +1,101 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_log10.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/*
+ * Return the base 10 logarithm of x. See log.c for most comments.
+ *
+ * Reduce x to 2^k (1+f) and calculate r = log(1+f) - f + f*f/2
+ * as in log.c, then combine and scale in extra precision:
+ * log10(x) = (f - f*f/2 + r)/log(10) + k*log10(2)
+ */
+
+#include <math.h>
+#include <stdint.h>
+
+static const double
+ivln10hi = 4.34294481878168880939e-01, /* 0x3fdbcb7b, 0x15200000 */
+ivln10lo = 2.50829467116452752298e-11, /* 0x3dbb9438, 0xca9aadd5 */
+log10_2hi = 3.01029995663611771306e-01, /* 0x3FD34413, 0x509F6000 */
+log10_2lo = 3.69423907715893078616e-13, /* 0x3D59FEF3, 0x11F12B36 */
+Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */
+Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */
+Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */
+Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */
+Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */
+Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */
+Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */
+
+double log10(double x)
+{
+ union {double f; uint64_t i;} u = {x};
+ double_t hfsq,f,s,z,R,w,t1,t2,dk,y,hi,lo,val_hi,val_lo;
+ uint32_t hx;
+ int k;
+
+ hx = u.i>>32;
+ k = 0;
+ if (hx < 0x00100000 || hx>>31) {
+ if (u.i<<1 == 0)
+ return -1/(x*x); /* log(+-0)=-inf */
+ if (hx>>31)
+ return (x-x)/0.0; /* log(-#) = NaN */
+ /* subnormal number, scale x up */
+ k -= 54;
+ x *= 0x1p54;
+ u.f = x;
+ hx = u.i>>32;
+ } else if (hx >= 0x7ff00000) {
+ return x;
+ } else if (hx == 0x3ff00000 && u.i<<32 == 0)
+ return 0;
+
+ /* reduce x into [sqrt(2)/2, sqrt(2)] */
+ hx += 0x3ff00000 - 0x3fe6a09e;
+ k += (int)(hx>>20) - 0x3ff;
+ hx = (hx&0x000fffff) + 0x3fe6a09e;
+ u.i = (uint64_t)hx<<32 | (u.i&0xffffffff);
+ x = u.f;
+
+ f = x - 1.0;
+ hfsq = 0.5*f*f;
+ s = f/(2.0+f);
+ z = s*s;
+ w = z*z;
+ t1 = w*(Lg2+w*(Lg4+w*Lg6));
+ t2 = z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
+ R = t2 + t1;
+
+ /* See log2.c for details. */
+ /* hi+lo = f - hfsq + s*(hfsq+R) ~ log(1+f) */
+ hi = f - hfsq;
+ u.f = hi;
+ u.i &= (uint64_t)-1<<32;
+ hi = u.f;
+ lo = f - hi - hfsq + s*(hfsq+R);
+
+ /* val_hi+val_lo ~ log10(1+f) + k*log10(2) */
+ val_hi = hi*ivln10hi;
+ dk = k;
+ y = dk*log10_2hi;
+ val_lo = dk*log10_2lo + (lo+hi)*ivln10lo + lo*ivln10hi;
+
+ /*
+ * Extra precision in for adding y is not strictly needed
+ * since there is no very large cancellation near x = sqrt(2) or
+ * x = 1/sqrt(2), but we do it anyway since it costs little on CPUs
+ * with some parallelism and it reduces the error for many args.
+ */
+ w = y + val_hi;
+ val_lo += (y - w) + val_hi;
+ val_hi = w;
+
+ return val_lo + val_hi;
+}
diff --git a/libc-top-half/musl/src/math/log10f.c b/libc-top-half/musl/src/math/log10f.c
new file mode 100644
index 0000000..9ca2f01
--- /dev/null
+++ b/libc-top-half/musl/src/math/log10f.c
@@ -0,0 +1,77 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_log10f.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/*
+ * See comments in log10.c.
+ */
+
+#include <math.h>
+#include <stdint.h>
+
+static const float
+ivln10hi = 4.3432617188e-01, /* 0x3ede6000 */
+ivln10lo = -3.1689971365e-05, /* 0xb804ead9 */
+log10_2hi = 3.0102920532e-01, /* 0x3e9a2080 */
+log10_2lo = 7.9034151668e-07, /* 0x355427db */
+/* |(log(1+s)-log(1-s))/s - Lg(s)| < 2**-34.24 (~[-4.95e-11, 4.97e-11]). */
+Lg1 = 0xaaaaaa.0p-24, /* 0.66666662693 */
+Lg2 = 0xccce13.0p-25, /* 0.40000972152 */
+Lg3 = 0x91e9ee.0p-25, /* 0.28498786688 */
+Lg4 = 0xf89e26.0p-26; /* 0.24279078841 */
+
+float log10f(float x)
+{
+ union {float f; uint32_t i;} u = {x};
+ float_t hfsq,f,s,z,R,w,t1,t2,dk,hi,lo;
+ uint32_t ix;
+ int k;
+
+ ix = u.i;
+ k = 0;
+ if (ix < 0x00800000 || ix>>31) { /* x < 2**-126 */
+ if (ix<<1 == 0)
+ return -1/(x*x); /* log(+-0)=-inf */
+ if (ix>>31)
+ return (x-x)/0.0f; /* log(-#) = NaN */
+ /* subnormal number, scale up x */
+ k -= 25;
+ x *= 0x1p25f;
+ u.f = x;
+ ix = u.i;
+ } else if (ix >= 0x7f800000) {
+ return x;
+ } else if (ix == 0x3f800000)
+ return 0;
+
+ /* reduce x into [sqrt(2)/2, sqrt(2)] */
+ ix += 0x3f800000 - 0x3f3504f3;
+ k += (int)(ix>>23) - 0x7f;
+ ix = (ix&0x007fffff) + 0x3f3504f3;
+ u.i = ix;
+ x = u.f;
+
+ f = x - 1.0f;
+ s = f/(2.0f + f);
+ z = s*s;
+ w = z*z;
+ t1= w*(Lg2+w*Lg4);
+ t2= z*(Lg1+w*Lg3);
+ R = t2 + t1;
+ hfsq = 0.5f*f*f;
+
+ hi = f - hfsq;
+ u.f = hi;
+ u.i &= 0xfffff000;
+ hi = u.f;
+ lo = f - hi - hfsq + s*(hfsq+R);
+ dk = k;
+ return dk*log10_2lo + (lo+hi)*ivln10lo + lo*ivln10hi + hi*ivln10hi + dk*log10_2hi;
+}
diff --git a/libc-top-half/musl/src/math/log10l.c b/libc-top-half/musl/src/math/log10l.c
new file mode 100644
index 0000000..63dcc28
--- /dev/null
+++ b/libc-top-half/musl/src/math/log10l.c
@@ -0,0 +1,191 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_log10l.c */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Common logarithm, long double precision
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, log10l();
+ *
+ * y = log10l( x );
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns the base 10 logarithm of x.
+ *
+ * The argument is separated into its exponent and fractional
+ * parts. If the exponent is between -1 and +1, the logarithm
+ * of the fraction is approximated by
+ *
+ * log(1+x) = x - 0.5 x**2 + x**3 P(x)/Q(x).
+ *
+ * Otherwise, setting z = 2(x-1)/x+1),
+ *
+ * log(x) = z + z**3 P(z)/Q(z).
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE 0.5, 2.0 30000 9.0e-20 2.6e-20
+ * IEEE exp(+-10000) 30000 6.0e-20 2.3e-20
+ *
+ * In the tests over the interval exp(+-10000), the logarithms
+ * of the random arguments were uniformly distributed over
+ * [-10000, +10000].
+ *
+ * ERROR MESSAGES:
+ *
+ * log singularity: x = 0; returns MINLOG
+ * log domain: x < 0; returns MINLOG
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double log10l(long double x)
+{
+ return log10(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+/* Coefficients for log(1+x) = x - x**2/2 + x**3 P(x)/Q(x)
+ * 1/sqrt(2) <= x < sqrt(2)
+ * Theoretical peak relative error = 6.2e-22
+ */
+static const long double P[] = {
+ 4.9962495940332550844739E-1L,
+ 1.0767376367209449010438E1L,
+ 7.7671073698359539859595E1L,
+ 2.5620629828144409632571E2L,
+ 4.2401812743503691187826E2L,
+ 3.4258224542413922935104E2L,
+ 1.0747524399916215149070E2L,
+};
+static const long double Q[] = {
+/* 1.0000000000000000000000E0,*/
+ 2.3479774160285863271658E1L,
+ 1.9444210022760132894510E2L,
+ 7.7952888181207260646090E2L,
+ 1.6911722418503949084863E3L,
+ 2.0307734695595183428202E3L,
+ 1.2695660352705325274404E3L,
+ 3.2242573199748645407652E2L,
+};
+
+/* Coefficients for log(x) = z + z^3 P(z^2)/Q(z^2),
+ * where z = 2(x-1)/(x+1)
+ * 1/sqrt(2) <= x < sqrt(2)
+ * Theoretical peak relative error = 6.16e-22
+ */
+static const long double R[4] = {
+ 1.9757429581415468984296E-3L,
+-7.1990767473014147232598E-1L,
+ 1.0777257190312272158094E1L,
+-3.5717684488096787370998E1L,
+};
+static const long double S[4] = {
+/* 1.00000000000000000000E0L,*/
+-2.6201045551331104417768E1L,
+ 1.9361891836232102174846E2L,
+-4.2861221385716144629696E2L,
+};
+/* log10(2) */
+#define L102A 0.3125L
+#define L102B -1.1470004336018804786261e-2L
+/* log10(e) */
+#define L10EA 0.5L
+#define L10EB -6.5705518096748172348871e-2L
+
+#define SQRTH 0.70710678118654752440L
+
+long double log10l(long double x)
+{
+ long double y, z;
+ int e;
+
+ if (isnan(x))
+ return x;
+ if(x <= 0.0) {
+ if(x == 0.0)
+ return -1.0 / (x*x);
+ return (x - x) / 0.0;
+ }
+ if (x == INFINITY)
+ return INFINITY;
+ /* separate mantissa from exponent */
+ /* Note, frexp is used so that denormal numbers
+ * will be handled properly.
+ */
+ x = frexpl(x, &e);
+
+ /* logarithm using log(x) = z + z**3 P(z)/Q(z),
+ * where z = 2(x-1)/x+1)
+ */
+ if (e > 2 || e < -2) {
+ if (x < SQRTH) { /* 2(2x-1)/(2x+1) */
+ e -= 1;
+ z = x - 0.5;
+ y = 0.5 * z + 0.5;
+ } else { /* 2 (x-1)/(x+1) */
+ z = x - 0.5;
+ z -= 0.5;
+ y = 0.5 * x + 0.5;
+ }
+ x = z / y;
+ z = x*x;
+ y = x * (z * __polevll(z, R, 3) / __p1evll(z, S, 3));
+ goto done;
+ }
+
+ /* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */
+ if (x < SQRTH) {
+ e -= 1;
+ x = 2.0*x - 1.0;
+ } else {
+ x = x - 1.0;
+ }
+ z = x*x;
+ y = x * (z * __polevll(x, P, 6) / __p1evll(x, Q, 7));
+ y = y - 0.5*z;
+
+done:
+ /* Multiply log of fraction by log10(e)
+ * and base 2 exponent by log10(2).
+ *
+ * ***CAUTION***
+ *
+ * This sequence of operations is critical and it may
+ * be horribly defeated by some compiler optimizers.
+ */
+ z = y * (L10EB);
+ z += x * (L10EB);
+ z += e * (L102B);
+ z += y * (L10EA);
+ z += x * (L10EA);
+ z += e * (L102A);
+ return z;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double log10l(long double x)
+{
+ return log10(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/log1p.c b/libc-top-half/musl/src/math/log1p.c
new file mode 100644
index 0000000..0097134
--- /dev/null
+++ b/libc-top-half/musl/src/math/log1p.c
@@ -0,0 +1,122 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_log1p.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* double log1p(double x)
+ * Return the natural logarithm of 1+x.
+ *
+ * Method :
+ * 1. Argument Reduction: find k and f such that
+ * 1+x = 2^k * (1+f),
+ * where sqrt(2)/2 < 1+f < sqrt(2) .
+ *
+ * Note. If k=0, then f=x is exact. However, if k!=0, then f
+ * may not be representable exactly. In that case, a correction
+ * term is need. Let u=1+x rounded. Let c = (1+x)-u, then
+ * log(1+x) - log(u) ~ c/u. Thus, we proceed to compute log(u),
+ * and add back the correction term c/u.
+ * (Note: when x > 2**53, one can simply return log(x))
+ *
+ * 2. Approximation of log(1+f): See log.c
+ *
+ * 3. Finally, log1p(x) = k*ln2 + log(1+f) + c/u. See log.c
+ *
+ * Special cases:
+ * log1p(x) is NaN with signal if x < -1 (including -INF) ;
+ * log1p(+INF) is +INF; log1p(-1) is -INF with signal;
+ * log1p(NaN) is that NaN with no signal.
+ *
+ * Accuracy:
+ * according to an error analysis, the error is always less than
+ * 1 ulp (unit in the last place).
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ *
+ * Note: Assuming log() return accurate answer, the following
+ * algorithm can be used to compute log1p(x) to within a few ULP:
+ *
+ * u = 1+x;
+ * if(u==1.0) return x ; else
+ * return log(u)*(x/(u-1.0));
+ *
+ * See HP-15C Advanced Functions Handbook, p.193.
+ */
+
+#include "libm.h"
+
+static const double
+ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */
+ln2_lo = 1.90821492927058770002e-10, /* 3dea39ef 35793c76 */
+Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */
+Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */
+Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */
+Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */
+Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */
+Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */
+Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */
+
+double log1p(double x)
+{
+ union {double f; uint64_t i;} u = {x};
+ double_t hfsq,f,c,s,z,R,w,t1,t2,dk;
+ uint32_t hx,hu;
+ int k;
+
+ hx = u.i>>32;
+ k = 1;
+ if (hx < 0x3fda827a || hx>>31) { /* 1+x < sqrt(2)+ */
+ if (hx >= 0xbff00000) { /* x <= -1.0 */
+ if (x == -1)
+ return x/0.0; /* log1p(-1) = -inf */
+ return (x-x)/0.0; /* log1p(x<-1) = NaN */
+ }
+ if (hx<<1 < 0x3ca00000<<1) { /* |x| < 2**-53 */
+ /* underflow if subnormal */
+ if ((hx&0x7ff00000) == 0)
+ FORCE_EVAL((float)x);
+ return x;
+ }
+ if (hx <= 0xbfd2bec4) { /* sqrt(2)/2- <= 1+x < sqrt(2)+ */
+ k = 0;
+ c = 0;
+ f = x;
+ }
+ } else if (hx >= 0x7ff00000)
+ return x;
+ if (k) {
+ u.f = 1 + x;
+ hu = u.i>>32;
+ hu += 0x3ff00000 - 0x3fe6a09e;
+ k = (int)(hu>>20) - 0x3ff;
+ /* correction term ~ log(1+x)-log(u), avoid underflow in c/u */
+ if (k < 54) {
+ c = k >= 2 ? 1-(u.f-x) : x-(u.f-1);
+ c /= u.f;
+ } else
+ c = 0;
+ /* reduce u into [sqrt(2)/2, sqrt(2)] */
+ hu = (hu&0x000fffff) + 0x3fe6a09e;
+ u.i = (uint64_t)hu<<32 | (u.i&0xffffffff);
+ f = u.f - 1;
+ }
+ hfsq = 0.5*f*f;
+ s = f/(2.0+f);
+ z = s*s;
+ w = z*z;
+ t1 = w*(Lg2+w*(Lg4+w*Lg6));
+ t2 = z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
+ R = t2 + t1;
+ dk = k;
+ return s*(hfsq+R) + (dk*ln2_lo+c) - hfsq + f + dk*ln2_hi;
+}
diff --git a/libc-top-half/musl/src/math/log1pf.c b/libc-top-half/musl/src/math/log1pf.c
new file mode 100644
index 0000000..23985c3
--- /dev/null
+++ b/libc-top-half/musl/src/math/log1pf.c
@@ -0,0 +1,77 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_log1pf.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+static const float
+ln2_hi = 6.9313812256e-01, /* 0x3f317180 */
+ln2_lo = 9.0580006145e-06, /* 0x3717f7d1 */
+/* |(log(1+s)-log(1-s))/s - Lg(s)| < 2**-34.24 (~[-4.95e-11, 4.97e-11]). */
+Lg1 = 0xaaaaaa.0p-24, /* 0.66666662693 */
+Lg2 = 0xccce13.0p-25, /* 0.40000972152 */
+Lg3 = 0x91e9ee.0p-25, /* 0.28498786688 */
+Lg4 = 0xf89e26.0p-26; /* 0.24279078841 */
+
+float log1pf(float x)
+{
+ union {float f; uint32_t i;} u = {x};
+ float_t hfsq,f,c,s,z,R,w,t1,t2,dk;
+ uint32_t ix,iu;
+ int k;
+
+ ix = u.i;
+ k = 1;
+ if (ix < 0x3ed413d0 || ix>>31) { /* 1+x < sqrt(2)+ */
+ if (ix >= 0xbf800000) { /* x <= -1.0 */
+ if (x == -1)
+ return x/0.0f; /* log1p(-1)=+inf */
+ return (x-x)/0.0f; /* log1p(x<-1)=NaN */
+ }
+ if (ix<<1 < 0x33800000<<1) { /* |x| < 2**-24 */
+ /* underflow if subnormal */
+ if ((ix&0x7f800000) == 0)
+ FORCE_EVAL(x*x);
+ return x;
+ }
+ if (ix <= 0xbe95f619) { /* sqrt(2)/2- <= 1+x < sqrt(2)+ */
+ k = 0;
+ c = 0;
+ f = x;
+ }
+ } else if (ix >= 0x7f800000)
+ return x;
+ if (k) {
+ u.f = 1 + x;
+ iu = u.i;
+ iu += 0x3f800000 - 0x3f3504f3;
+ k = (int)(iu>>23) - 0x7f;
+ /* correction term ~ log(1+x)-log(u), avoid underflow in c/u */
+ if (k < 25) {
+ c = k >= 2 ? 1-(u.f-x) : x-(u.f-1);
+ c /= u.f;
+ } else
+ c = 0;
+ /* reduce u into [sqrt(2)/2, sqrt(2)] */
+ iu = (iu&0x007fffff) + 0x3f3504f3;
+ u.i = iu;
+ f = u.f - 1;
+ }
+ s = f/(2.0f + f);
+ z = s*s;
+ w = z*z;
+ t1= w*(Lg2+w*Lg4);
+ t2= z*(Lg1+w*Lg3);
+ R = t2 + t1;
+ hfsq = 0.5f*f*f;
+ dk = k;
+ return s*(hfsq+R) + (dk*ln2_lo+c) - hfsq + f + dk*ln2_hi;
+}
diff --git a/libc-top-half/musl/src/math/log1pl.c b/libc-top-half/musl/src/math/log1pl.c
new file mode 100644
index 0000000..141b5f0
--- /dev/null
+++ b/libc-top-half/musl/src/math/log1pl.c
@@ -0,0 +1,177 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/ld80/s_log1pl.c */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Relative error logarithm
+ * Natural logarithm of 1+x, long double precision
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, log1pl();
+ *
+ * y = log1pl( x );
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns the base e (2.718...) logarithm of 1+x.
+ *
+ * The argument 1+x is separated into its exponent and fractional
+ * parts. If the exponent is between -1 and +1, the logarithm
+ * of the fraction is approximated by
+ *
+ * log(1+x) = x - 0.5 x^2 + x^3 P(x)/Q(x).
+ *
+ * Otherwise, setting z = 2(x-1)/x+1),
+ *
+ * log(x) = z + z^3 P(z)/Q(z).
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE -1.0, 9.0 100000 8.2e-20 2.5e-20
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double log1pl(long double x)
+{
+ return log1p(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+/* Coefficients for log(1+x) = x - x^2 / 2 + x^3 P(x)/Q(x)
+ * 1/sqrt(2) <= x < sqrt(2)
+ * Theoretical peak relative error = 2.32e-20
+ */
+static const long double P[] = {
+ 4.5270000862445199635215E-5L,
+ 4.9854102823193375972212E-1L,
+ 6.5787325942061044846969E0L,
+ 2.9911919328553073277375E1L,
+ 6.0949667980987787057556E1L,
+ 5.7112963590585538103336E1L,
+ 2.0039553499201281259648E1L,
+};
+static const long double Q[] = {
+/* 1.0000000000000000000000E0,*/
+ 1.5062909083469192043167E1L,
+ 8.3047565967967209469434E1L,
+ 2.2176239823732856465394E2L,
+ 3.0909872225312059774938E2L,
+ 2.1642788614495947685003E2L,
+ 6.0118660497603843919306E1L,
+};
+
+/* Coefficients for log(x) = z + z^3 P(z^2)/Q(z^2),
+ * where z = 2(x-1)/(x+1)
+ * 1/sqrt(2) <= x < sqrt(2)
+ * Theoretical peak relative error = 6.16e-22
+ */
+static const long double R[4] = {
+ 1.9757429581415468984296E-3L,
+-7.1990767473014147232598E-1L,
+ 1.0777257190312272158094E1L,
+-3.5717684488096787370998E1L,
+};
+static const long double S[4] = {
+/* 1.00000000000000000000E0L,*/
+-2.6201045551331104417768E1L,
+ 1.9361891836232102174846E2L,
+-4.2861221385716144629696E2L,
+};
+static const long double C1 = 6.9314575195312500000000E-1L;
+static const long double C2 = 1.4286068203094172321215E-6L;
+
+#define SQRTH 0.70710678118654752440L
+
+long double log1pl(long double xm1)
+{
+ long double x, y, z;
+ int e;
+
+ if (isnan(xm1))
+ return xm1;
+ if (xm1 == INFINITY)
+ return xm1;
+ if (xm1 == 0.0)
+ return xm1;
+
+ x = xm1 + 1.0;
+
+ /* Test for domain errors. */
+ if (x <= 0.0) {
+ if (x == 0.0)
+ return -1/(x*x); /* -inf with divbyzero */
+ return 0/0.0f; /* nan with invalid */
+ }
+
+ /* Separate mantissa from exponent.
+ Use frexp so that denormal numbers will be handled properly. */
+ x = frexpl(x, &e);
+
+ /* logarithm using log(x) = z + z^3 P(z)/Q(z),
+ where z = 2(x-1)/x+1) */
+ if (e > 2 || e < -2) {
+ if (x < SQRTH) { /* 2(2x-1)/(2x+1) */
+ e -= 1;
+ z = x - 0.5;
+ y = 0.5 * z + 0.5;
+ } else { /* 2 (x-1)/(x+1) */
+ z = x - 0.5;
+ z -= 0.5;
+ y = 0.5 * x + 0.5;
+ }
+ x = z / y;
+ z = x*x;
+ z = x * (z * __polevll(z, R, 3) / __p1evll(z, S, 3));
+ z = z + e * C2;
+ z = z + x;
+ z = z + e * C1;
+ return z;
+ }
+
+ /* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */
+ if (x < SQRTH) {
+ e -= 1;
+ if (e != 0)
+ x = 2.0 * x - 1.0;
+ else
+ x = xm1;
+ } else {
+ if (e != 0)
+ x = x - 1.0;
+ else
+ x = xm1;
+ }
+ z = x*x;
+ y = x * (z * __polevll(x, P, 6) / __p1evll(x, Q, 6));
+ y = y + e * C2;
+ z = y - 0.5 * z;
+ z = z + x;
+ z = z + e * C1;
+ return z;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double log1pl(long double x)
+{
+ return log1p(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/log2.c b/libc-top-half/musl/src/math/log2.c
new file mode 100644
index 0000000..1276ed4
--- /dev/null
+++ b/libc-top-half/musl/src/math/log2.c
@@ -0,0 +1,122 @@
+/*
+ * Double-precision log2(x) function.
+ *
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <math.h>
+#include <stdint.h>
+#include "libm.h"
+#include "log2_data.h"
+
+#define T __log2_data.tab
+#define T2 __log2_data.tab2
+#define B __log2_data.poly1
+#define A __log2_data.poly
+#define InvLn2hi __log2_data.invln2hi
+#define InvLn2lo __log2_data.invln2lo
+#define N (1 << LOG2_TABLE_BITS)
+#define OFF 0x3fe6000000000000
+
+/* Top 16 bits of a double. */
+static inline uint32_t top16(double x)
+{
+ return asuint64(x) >> 48;
+}
+
+double log2(double x)
+{
+ double_t z, r, r2, r4, y, invc, logc, kd, hi, lo, t1, t2, t3, p;
+ uint64_t ix, iz, tmp;
+ uint32_t top;
+ int k, i;
+
+ ix = asuint64(x);
+ top = top16(x);
+#define LO asuint64(1.0 - 0x1.5b51p-5)
+#define HI asuint64(1.0 + 0x1.6ab2p-5)
+ if (predict_false(ix - LO < HI - LO)) {
+ /* Handle close to 1.0 inputs separately. */
+ /* Fix sign of zero with downward rounding when x==1. */
+ if (WANT_ROUNDING && predict_false(ix == asuint64(1.0)))
+ return 0;
+ r = x - 1.0;
+#if __FP_FAST_FMA
+ hi = r * InvLn2hi;
+ lo = r * InvLn2lo + __builtin_fma(r, InvLn2hi, -hi);
+#else
+ double_t rhi, rlo;
+ rhi = asdouble(asuint64(r) & -1ULL << 32);
+ rlo = r - rhi;
+ hi = rhi * InvLn2hi;
+ lo = rlo * InvLn2hi + r * InvLn2lo;
+#endif
+ r2 = r * r; /* rounding error: 0x1p-62. */
+ r4 = r2 * r2;
+ /* Worst-case error is less than 0.54 ULP (0.55 ULP without fma). */
+ p = r2 * (B[0] + r * B[1]);
+ y = hi + p;
+ lo += hi - y + p;
+ lo += r4 * (B[2] + r * B[3] + r2 * (B[4] + r * B[5]) +
+ r4 * (B[6] + r * B[7] + r2 * (B[8] + r * B[9])));
+ y += lo;
+ return eval_as_double(y);
+ }
+ if (predict_false(top - 0x0010 >= 0x7ff0 - 0x0010)) {
+ /* x < 0x1p-1022 or inf or nan. */
+ if (ix * 2 == 0)
+ return __math_divzero(1);
+ if (ix == asuint64(INFINITY)) /* log(inf) == inf. */
+ return x;
+ if ((top & 0x8000) || (top & 0x7ff0) == 0x7ff0)
+ return __math_invalid(x);
+ /* x is subnormal, normalize it. */
+ ix = asuint64(x * 0x1p52);
+ ix -= 52ULL << 52;
+ }
+
+ /* x = 2^k z; where z is in range [OFF,2*OFF) and exact.
+ The range is split into N subintervals.
+ The ith subinterval contains z and c is near its center. */
+ tmp = ix - OFF;
+ i = (tmp >> (52 - LOG2_TABLE_BITS)) % N;
+ k = (int64_t)tmp >> 52; /* arithmetic shift */
+ iz = ix - (tmp & 0xfffULL << 52);
+ invc = T[i].invc;
+ logc = T[i].logc;
+ z = asdouble(iz);
+ kd = (double_t)k;
+
+ /* log2(x) = log2(z/c) + log2(c) + k. */
+ /* r ~= z/c - 1, |r| < 1/(2*N). */
+#if __FP_FAST_FMA
+ /* rounding error: 0x1p-55/N. */
+ r = __builtin_fma(z, invc, -1.0);
+ t1 = r * InvLn2hi;
+ t2 = r * InvLn2lo + __builtin_fma(r, InvLn2hi, -t1);
+#else
+ double_t rhi, rlo;
+ /* rounding error: 0x1p-55/N + 0x1p-65. */
+ r = (z - T2[i].chi - T2[i].clo) * invc;
+ rhi = asdouble(asuint64(r) & -1ULL << 32);
+ rlo = r - rhi;
+ t1 = rhi * InvLn2hi;
+ t2 = rlo * InvLn2hi + r * InvLn2lo;
+#endif
+
+ /* hi + lo = r/ln2 + log2(c) + k. */
+ t3 = kd + logc;
+ hi = t3 + t1;
+ lo = t3 - hi + t1 + t2;
+
+ /* log2(r+1) = r/ln2 + r^2*poly(r). */
+ /* Evaluation is optimized assuming superscalar pipelined execution. */
+ r2 = r * r; /* rounding error: 0x1p-54/N^2. */
+ r4 = r2 * r2;
+ /* Worst-case error if |y| > 0x1p-4: 0.547 ULP (0.550 ULP without fma).
+ ~ 0.5 + 2/N/ln2 + abs-poly-error*0x1p56 ULP (+ 0.003 ULP without fma). */
+ p = A[0] + r * A[1] + r2 * (A[2] + r * A[3]) + r4 * (A[4] + r * A[5]);
+ y = lo + r2 * p + hi;
+ return eval_as_double(y);
+}
diff --git a/libc-top-half/musl/src/math/log2_data.c b/libc-top-half/musl/src/math/log2_data.c
new file mode 100644
index 0000000..3dd1ca5
--- /dev/null
+++ b/libc-top-half/musl/src/math/log2_data.c
@@ -0,0 +1,201 @@
+/*
+ * Data for log2.
+ *
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "log2_data.h"
+
+#define N (1 << LOG2_TABLE_BITS)
+
+const struct log2_data __log2_data = {
+// First coefficient: 0x1.71547652b82fe1777d0ffda0d24p0
+.invln2hi = 0x1.7154765200000p+0,
+.invln2lo = 0x1.705fc2eefa200p-33,
+.poly1 = {
+// relative error: 0x1.2fad8188p-63
+// in -0x1.5b51p-5 0x1.6ab2p-5
+-0x1.71547652b82fep-1,
+0x1.ec709dc3a03f7p-2,
+-0x1.71547652b7c3fp-2,
+0x1.2776c50f05be4p-2,
+-0x1.ec709dd768fe5p-3,
+0x1.a61761ec4e736p-3,
+-0x1.7153fbc64a79bp-3,
+0x1.484d154f01b4ap-3,
+-0x1.289e4a72c383cp-3,
+0x1.0b32f285aee66p-3,
+},
+.poly = {
+// relative error: 0x1.a72c2bf8p-58
+// abs error: 0x1.67a552c8p-66
+// in -0x1.f45p-8 0x1.f45p-8
+-0x1.71547652b8339p-1,
+0x1.ec709dc3a04bep-2,
+-0x1.7154764702ffbp-2,
+0x1.2776c50034c48p-2,
+-0x1.ec7b328ea92bcp-3,
+0x1.a6225e117f92ep-3,
+},
+/* Algorithm:
+
+ x = 2^k z
+ log2(x) = k + log2(c) + log2(z/c)
+ log2(z/c) = poly(z/c - 1)
+
+where z is in [1.6p-1; 1.6p0] which is split into N subintervals and z falls
+into the ith one, then table entries are computed as
+
+ tab[i].invc = 1/c
+ tab[i].logc = (double)log2(c)
+ tab2[i].chi = (double)c
+ tab2[i].clo = (double)(c - (double)c)
+
+where c is near the center of the subinterval and is chosen by trying +-2^29
+floating point invc candidates around 1/center and selecting one for which
+
+ 1) the rounding error in 0x1.8p10 + logc is 0,
+ 2) the rounding error in z - chi - clo is < 0x1p-64 and
+ 3) the rounding error in (double)log2(c) is minimized (< 0x1p-68).
+
+Note: 1) ensures that k + logc can be computed without rounding error, 2)
+ensures that z/c - 1 can be computed as (z - chi - clo)*invc with close to a
+single rounding error when there is no fast fma for z*invc - 1, 3) ensures
+that logc + poly(z/c - 1) has small error, however near x == 1 when
+|log2(x)| < 0x1p-4, this is not enough so that is special cased. */
+.tab = {
+{0x1.724286bb1acf8p+0, -0x1.1095feecdb000p-1},
+{0x1.6e1f766d2cca1p+0, -0x1.08494bd76d000p-1},
+{0x1.6a13d0e30d48ap+0, -0x1.00143aee8f800p-1},
+{0x1.661ec32d06c85p+0, -0x1.efec5360b4000p-2},
+{0x1.623fa951198f8p+0, -0x1.dfdd91ab7e000p-2},
+{0x1.5e75ba4cf026cp+0, -0x1.cffae0cc79000p-2},
+{0x1.5ac055a214fb8p+0, -0x1.c043811fda000p-2},
+{0x1.571ed0f166e1ep+0, -0x1.b0b67323ae000p-2},
+{0x1.53909590bf835p+0, -0x1.a152f5a2db000p-2},
+{0x1.5014fed61adddp+0, -0x1.9217f5af86000p-2},
+{0x1.4cab88e487bd0p+0, -0x1.8304db0719000p-2},
+{0x1.49539b4334feep+0, -0x1.74189f9a9e000p-2},
+{0x1.460cbdfafd569p+0, -0x1.6552bb5199000p-2},
+{0x1.42d664ee4b953p+0, -0x1.56b23a29b1000p-2},
+{0x1.3fb01111dd8a6p+0, -0x1.483650f5fa000p-2},
+{0x1.3c995b70c5836p+0, -0x1.39de937f6a000p-2},
+{0x1.3991c4ab6fd4ap+0, -0x1.2baa1538d6000p-2},
+{0x1.3698e0ce099b5p+0, -0x1.1d98340ca4000p-2},
+{0x1.33ae48213e7b2p+0, -0x1.0fa853a40e000p-2},
+{0x1.30d191985bdb1p+0, -0x1.01d9c32e73000p-2},
+{0x1.2e025cab271d7p+0, -0x1.e857da2fa6000p-3},
+{0x1.2b404cf13cd82p+0, -0x1.cd3c8633d8000p-3},
+{0x1.288b02c7ccb50p+0, -0x1.b26034c14a000p-3},
+{0x1.25e2263944de5p+0, -0x1.97c1c2f4fe000p-3},
+{0x1.234563d8615b1p+0, -0x1.7d6023f800000p-3},
+{0x1.20b46e33eaf38p+0, -0x1.633a71a05e000p-3},
+{0x1.1e2eefdcda3ddp+0, -0x1.494f5e9570000p-3},
+{0x1.1bb4a580b3930p+0, -0x1.2f9e424e0a000p-3},
+{0x1.19453847f2200p+0, -0x1.162595afdc000p-3},
+{0x1.16e06c0d5d73cp+0, -0x1.f9c9a75bd8000p-4},
+{0x1.1485f47b7e4c2p+0, -0x1.c7b575bf9c000p-4},
+{0x1.12358ad0085d1p+0, -0x1.960c60ff48000p-4},
+{0x1.0fef00f532227p+0, -0x1.64ce247b60000p-4},
+{0x1.0db2077d03a8fp+0, -0x1.33f78b2014000p-4},
+{0x1.0b7e6d65980d9p+0, -0x1.0387d1a42c000p-4},
+{0x1.0953efe7b408dp+0, -0x1.a6f9208b50000p-5},
+{0x1.07325cac53b83p+0, -0x1.47a954f770000p-5},
+{0x1.05197e40d1b5cp+0, -0x1.d23a8c50c0000p-6},
+{0x1.03091c1208ea2p+0, -0x1.16a2629780000p-6},
+{0x1.0101025b37e21p+0, -0x1.720f8d8e80000p-8},
+{0x1.fc07ef9caa76bp-1, 0x1.6fe53b1500000p-7},
+{0x1.f4465d3f6f184p-1, 0x1.11ccce10f8000p-5},
+{0x1.ecc079f84107fp-1, 0x1.c4dfc8c8b8000p-5},
+{0x1.e573a99975ae8p-1, 0x1.3aa321e574000p-4},
+{0x1.de5d6f0bd3de6p-1, 0x1.918a0d08b8000p-4},
+{0x1.d77b681ff38b3p-1, 0x1.e72e9da044000p-4},
+{0x1.d0cb5724de943p-1, 0x1.1dcd2507f6000p-3},
+{0x1.ca4b2dc0e7563p-1, 0x1.476ab03dea000p-3},
+{0x1.c3f8ee8d6cb51p-1, 0x1.7074377e22000p-3},
+{0x1.bdd2b4f020c4cp-1, 0x1.98ede8ba94000p-3},
+{0x1.b7d6c006015cap-1, 0x1.c0db86ad2e000p-3},
+{0x1.b20366e2e338fp-1, 0x1.e840aafcee000p-3},
+{0x1.ac57026295039p-1, 0x1.0790ab4678000p-2},
+{0x1.a6d01bc2731ddp-1, 0x1.1ac056801c000p-2},
+{0x1.a16d3bc3ff18bp-1, 0x1.2db11d4fee000p-2},
+{0x1.9c2d14967feadp-1, 0x1.406464ec58000p-2},
+{0x1.970e4f47c9902p-1, 0x1.52dbe093af000p-2},
+{0x1.920fb3982bcf2p-1, 0x1.651902050d000p-2},
+{0x1.8d30187f759f1p-1, 0x1.771d2cdeaf000p-2},
+{0x1.886e5ebb9f66dp-1, 0x1.88e9c857d9000p-2},
+{0x1.83c97b658b994p-1, 0x1.9a80155e16000p-2},
+{0x1.7f405ffc61022p-1, 0x1.abe186ed3d000p-2},
+{0x1.7ad22181415cap-1, 0x1.bd0f2aea0e000p-2},
+{0x1.767dcf99eff8cp-1, 0x1.ce0a43dbf4000p-2},
+},
+#if !__FP_FAST_FMA
+.tab2 = {
+{0x1.6200012b90a8ep-1, 0x1.904ab0644b605p-55},
+{0x1.66000045734a6p-1, 0x1.1ff9bea62f7a9p-57},
+{0x1.69fffc325f2c5p-1, 0x1.27ecfcb3c90bap-55},
+{0x1.6e00038b95a04p-1, 0x1.8ff8856739326p-55},
+{0x1.71fffe09994e3p-1, 0x1.afd40275f82b1p-55},
+{0x1.7600015590e1p-1, -0x1.2fd75b4238341p-56},
+{0x1.7a00012655bd5p-1, 0x1.808e67c242b76p-56},
+{0x1.7e0003259e9a6p-1, -0x1.208e426f622b7p-57},
+{0x1.81fffedb4b2d2p-1, -0x1.402461ea5c92fp-55},
+{0x1.860002dfafcc3p-1, 0x1.df7f4a2f29a1fp-57},
+{0x1.89ffff78c6b5p-1, -0x1.e0453094995fdp-55},
+{0x1.8e00039671566p-1, -0x1.a04f3bec77b45p-55},
+{0x1.91fffe2bf1745p-1, -0x1.7fa34400e203cp-56},
+{0x1.95fffcc5c9fd1p-1, -0x1.6ff8005a0695dp-56},
+{0x1.9a0003bba4767p-1, 0x1.0f8c4c4ec7e03p-56},
+{0x1.9dfffe7b92da5p-1, 0x1.e7fd9478c4602p-55},
+{0x1.a1fffd72efdafp-1, -0x1.a0c554dcdae7ep-57},
+{0x1.a5fffde04ff95p-1, 0x1.67da98ce9b26bp-55},
+{0x1.a9fffca5e8d2bp-1, -0x1.284c9b54c13dep-55},
+{0x1.adfffddad03eap-1, 0x1.812c8ea602e3cp-58},
+{0x1.b1ffff10d3d4dp-1, -0x1.efaddad27789cp-55},
+{0x1.b5fffce21165ap-1, 0x1.3cb1719c61237p-58},
+{0x1.b9fffd950e674p-1, 0x1.3f7d94194cep-56},
+{0x1.be000139ca8afp-1, 0x1.50ac4215d9bcp-56},
+{0x1.c20005b46df99p-1, 0x1.beea653e9c1c9p-57},
+{0x1.c600040b9f7aep-1, -0x1.c079f274a70d6p-56},
+{0x1.ca0006255fd8ap-1, -0x1.a0b4076e84c1fp-56},
+{0x1.cdfffd94c095dp-1, 0x1.8f933f99ab5d7p-55},
+{0x1.d1ffff975d6cfp-1, -0x1.82c08665fe1bep-58},
+{0x1.d5fffa2561c93p-1, -0x1.b04289bd295f3p-56},
+{0x1.d9fff9d228b0cp-1, 0x1.70251340fa236p-55},
+{0x1.de00065bc7e16p-1, -0x1.5011e16a4d80cp-56},
+{0x1.e200002f64791p-1, 0x1.9802f09ef62ep-55},
+{0x1.e600057d7a6d8p-1, -0x1.e0b75580cf7fap-56},
+{0x1.ea00027edc00cp-1, -0x1.c848309459811p-55},
+{0x1.ee0006cf5cb7cp-1, -0x1.f8027951576f4p-55},
+{0x1.f2000782b7dccp-1, -0x1.f81d97274538fp-55},
+{0x1.f6000260c450ap-1, -0x1.071002727ffdcp-59},
+{0x1.f9fffe88cd533p-1, -0x1.81bdce1fda8bp-58},
+{0x1.fdfffd50f8689p-1, 0x1.7f91acb918e6ep-55},
+{0x1.0200004292367p+0, 0x1.b7ff365324681p-54},
+{0x1.05fffe3e3d668p+0, 0x1.6fa08ddae957bp-55},
+{0x1.0a0000a85a757p+0, -0x1.7e2de80d3fb91p-58},
+{0x1.0e0001a5f3fccp+0, -0x1.1823305c5f014p-54},
+{0x1.11ffff8afbaf5p+0, -0x1.bfabb6680bac2p-55},
+{0x1.15fffe54d91adp+0, -0x1.d7f121737e7efp-54},
+{0x1.1a00011ac36e1p+0, 0x1.c000a0516f5ffp-54},
+{0x1.1e00019c84248p+0, -0x1.082fbe4da5dap-54},
+{0x1.220000ffe5e6ep+0, -0x1.8fdd04c9cfb43p-55},
+{0x1.26000269fd891p+0, 0x1.cfe2a7994d182p-55},
+{0x1.2a00029a6e6dap+0, -0x1.00273715e8bc5p-56},
+{0x1.2dfffe0293e39p+0, 0x1.b7c39dab2a6f9p-54},
+{0x1.31ffff7dcf082p+0, 0x1.df1336edc5254p-56},
+{0x1.35ffff05a8b6p+0, -0x1.e03564ccd31ebp-54},
+{0x1.3a0002e0eaeccp+0, 0x1.5f0e74bd3a477p-56},
+{0x1.3e000043bb236p+0, 0x1.c7dcb149d8833p-54},
+{0x1.4200002d187ffp+0, 0x1.e08afcf2d3d28p-56},
+{0x1.460000d387cb1p+0, 0x1.20837856599a6p-55},
+{0x1.4a00004569f89p+0, -0x1.9fa5c904fbcd2p-55},
+{0x1.4e000043543f3p+0, -0x1.81125ed175329p-56},
+{0x1.51fffcc027f0fp+0, 0x1.883d8847754dcp-54},
+{0x1.55ffffd87b36fp+0, -0x1.709e731d02807p-55},
+{0x1.59ffff21df7bap+0, 0x1.7f79f68727b02p-55},
+{0x1.5dfffebfc3481p+0, -0x1.180902e30e93ep-54},
+},
+#endif
+};
diff --git a/libc-top-half/musl/src/math/log2_data.h b/libc-top-half/musl/src/math/log2_data.h
new file mode 100644
index 0000000..276a786
--- /dev/null
+++ b/libc-top-half/musl/src/math/log2_data.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef _LOG2_DATA_H
+#define _LOG2_DATA_H
+
+#include <features.h>
+
+#define LOG2_TABLE_BITS 6
+#define LOG2_POLY_ORDER 7
+#define LOG2_POLY1_ORDER 11
+extern hidden const struct log2_data {
+ double invln2hi;
+ double invln2lo;
+ double poly[LOG2_POLY_ORDER - 1];
+ double poly1[LOG2_POLY1_ORDER - 1];
+ struct {
+ double invc, logc;
+ } tab[1 << LOG2_TABLE_BITS];
+#if !__FP_FAST_FMA
+ struct {
+ double chi, clo;
+ } tab2[1 << LOG2_TABLE_BITS];
+#endif
+} __log2_data;
+
+#endif
diff --git a/libc-top-half/musl/src/math/log2f.c b/libc-top-half/musl/src/math/log2f.c
new file mode 100644
index 0000000..c368f88
--- /dev/null
+++ b/libc-top-half/musl/src/math/log2f.c
@@ -0,0 +1,72 @@
+/*
+ * Single-precision log2 function.
+ *
+ * Copyright (c) 2017-2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <math.h>
+#include <stdint.h>
+#include "libm.h"
+#include "log2f_data.h"
+
+/*
+LOG2F_TABLE_BITS = 4
+LOG2F_POLY_ORDER = 4
+
+ULP error: 0.752 (nearest rounding.)
+Relative error: 1.9 * 2^-26 (before rounding.)
+*/
+
+#define N (1 << LOG2F_TABLE_BITS)
+#define T __log2f_data.tab
+#define A __log2f_data.poly
+#define OFF 0x3f330000
+
+float log2f(float x)
+{
+ double_t z, r, r2, p, y, y0, invc, logc;
+ uint32_t ix, iz, top, tmp;
+ int k, i;
+
+ ix = asuint(x);
+ /* Fix sign of zero with downward rounding when x==1. */
+ if (WANT_ROUNDING && predict_false(ix == 0x3f800000))
+ return 0;
+ if (predict_false(ix - 0x00800000 >= 0x7f800000 - 0x00800000)) {
+ /* x < 0x1p-126 or inf or nan. */
+ if (ix * 2 == 0)
+ return __math_divzerof(1);
+ if (ix == 0x7f800000) /* log2(inf) == inf. */
+ return x;
+ if ((ix & 0x80000000) || ix * 2 >= 0xff000000)
+ return __math_invalidf(x);
+ /* x is subnormal, normalize it. */
+ ix = asuint(x * 0x1p23f);
+ ix -= 23 << 23;
+ }
+
+ /* x = 2^k z; where z is in range [OFF,2*OFF] and exact.
+ The range is split into N subintervals.
+ The ith subinterval contains z and c is near its center. */
+ tmp = ix - OFF;
+ i = (tmp >> (23 - LOG2F_TABLE_BITS)) % N;
+ top = tmp & 0xff800000;
+ iz = ix - top;
+ k = (int32_t)tmp >> 23; /* arithmetic shift */
+ invc = T[i].invc;
+ logc = T[i].logc;
+ z = (double_t)asfloat(iz);
+
+ /* log2(x) = log1p(z/c-1)/ln2 + log2(c) + k */
+ r = z * invc - 1;
+ y0 = logc + (double_t)k;
+
+ /* Pipelined polynomial evaluation to approximate log1p(r)/ln2. */
+ r2 = r * r;
+ y = A[1] * r + A[2];
+ y = A[0] * r2 + y;
+ p = A[3] * r + y0;
+ y = y * r2 + p;
+ return eval_as_float(y);
+}
diff --git a/libc-top-half/musl/src/math/log2f_data.c b/libc-top-half/musl/src/math/log2f_data.c
new file mode 100644
index 0000000..24e450f
--- /dev/null
+++ b/libc-top-half/musl/src/math/log2f_data.c
@@ -0,0 +1,33 @@
+/*
+ * Data definition for log2f.
+ *
+ * Copyright (c) 2017-2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "log2f_data.h"
+
+const struct log2f_data __log2f_data = {
+ .tab = {
+ { 0x1.661ec79f8f3bep+0, -0x1.efec65b963019p-2 },
+ { 0x1.571ed4aaf883dp+0, -0x1.b0b6832d4fca4p-2 },
+ { 0x1.49539f0f010bp+0, -0x1.7418b0a1fb77bp-2 },
+ { 0x1.3c995b0b80385p+0, -0x1.39de91a6dcf7bp-2 },
+ { 0x1.30d190c8864a5p+0, -0x1.01d9bf3f2b631p-2 },
+ { 0x1.25e227b0b8eap+0, -0x1.97c1d1b3b7afp-3 },
+ { 0x1.1bb4a4a1a343fp+0, -0x1.2f9e393af3c9fp-3 },
+ { 0x1.12358f08ae5bap+0, -0x1.960cbbf788d5cp-4 },
+ { 0x1.0953f419900a7p+0, -0x1.a6f9db6475fcep-5 },
+ { 0x1p+0, 0x0p+0 },
+ { 0x1.e608cfd9a47acp-1, 0x1.338ca9f24f53dp-4 },
+ { 0x1.ca4b31f026aap-1, 0x1.476a9543891bap-3 },
+ { 0x1.b2036576afce6p-1, 0x1.e840b4ac4e4d2p-3 },
+ { 0x1.9c2d163a1aa2dp-1, 0x1.40645f0c6651cp-2 },
+ { 0x1.886e6037841edp-1, 0x1.88e9c2c1b9ff8p-2 },
+ { 0x1.767dcf5534862p-1, 0x1.ce0a44eb17bccp-2 },
+ },
+ .poly = {
+ -0x1.712b6f70a7e4dp-2, 0x1.ecabf496832ep-2, -0x1.715479ffae3dep-1,
+ 0x1.715475f35c8b8p0,
+ }
+};
diff --git a/libc-top-half/musl/src/math/log2f_data.h b/libc-top-half/musl/src/math/log2f_data.h
new file mode 100644
index 0000000..4fa4895
--- /dev/null
+++ b/libc-top-half/musl/src/math/log2f_data.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2017-2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef _LOG2F_DATA_H
+#define _LOG2F_DATA_H
+
+#include <features.h>
+
+#define LOG2F_TABLE_BITS 4
+#define LOG2F_POLY_ORDER 4
+extern hidden const struct log2f_data {
+ struct {
+ double invc, logc;
+ } tab[1 << LOG2F_TABLE_BITS];
+ double poly[LOG2F_POLY_ORDER];
+} __log2f_data;
+
+#endif
diff --git a/libc-top-half/musl/src/math/log2l.c b/libc-top-half/musl/src/math/log2l.c
new file mode 100644
index 0000000..722b451
--- /dev/null
+++ b/libc-top-half/musl/src/math/log2l.c
@@ -0,0 +1,182 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_log2l.c */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Base 2 logarithm, long double precision
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, log2l();
+ *
+ * y = log2l( x );
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns the base 2 logarithm of x.
+ *
+ * The argument is separated into its exponent and fractional
+ * parts. If the exponent is between -1 and +1, the (natural)
+ * logarithm of the fraction is approximated by
+ *
+ * log(1+x) = x - 0.5 x**2 + x**3 P(x)/Q(x).
+ *
+ * Otherwise, setting z = 2(x-1)/x+1),
+ *
+ * log(x) = z + z**3 P(z)/Q(z).
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE 0.5, 2.0 30000 9.8e-20 2.7e-20
+ * IEEE exp(+-10000) 70000 5.4e-20 2.3e-20
+ *
+ * In the tests over the interval exp(+-10000), the logarithms
+ * of the random arguments were uniformly distributed over
+ * [-10000, +10000].
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double log2l(long double x)
+{
+ return log2(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+/* Coefficients for ln(1+x) = x - x**2/2 + x**3 P(x)/Q(x)
+ * 1/sqrt(2) <= x < sqrt(2)
+ * Theoretical peak relative error = 6.2e-22
+ */
+static const long double P[] = {
+ 4.9962495940332550844739E-1L,
+ 1.0767376367209449010438E1L,
+ 7.7671073698359539859595E1L,
+ 2.5620629828144409632571E2L,
+ 4.2401812743503691187826E2L,
+ 3.4258224542413922935104E2L,
+ 1.0747524399916215149070E2L,
+};
+static const long double Q[] = {
+/* 1.0000000000000000000000E0,*/
+ 2.3479774160285863271658E1L,
+ 1.9444210022760132894510E2L,
+ 7.7952888181207260646090E2L,
+ 1.6911722418503949084863E3L,
+ 2.0307734695595183428202E3L,
+ 1.2695660352705325274404E3L,
+ 3.2242573199748645407652E2L,
+};
+
+/* Coefficients for log(x) = z + z^3 P(z^2)/Q(z^2),
+ * where z = 2(x-1)/(x+1)
+ * 1/sqrt(2) <= x < sqrt(2)
+ * Theoretical peak relative error = 6.16e-22
+ */
+static const long double R[4] = {
+ 1.9757429581415468984296E-3L,
+-7.1990767473014147232598E-1L,
+ 1.0777257190312272158094E1L,
+-3.5717684488096787370998E1L,
+};
+static const long double S[4] = {
+/* 1.00000000000000000000E0L,*/
+-2.6201045551331104417768E1L,
+ 1.9361891836232102174846E2L,
+-4.2861221385716144629696E2L,
+};
+/* log2(e) - 1 */
+#define LOG2EA 4.4269504088896340735992e-1L
+
+#define SQRTH 0.70710678118654752440L
+
+long double log2l(long double x)
+{
+ long double y, z;
+ int e;
+
+ if (isnan(x))
+ return x;
+ if (x == INFINITY)
+ return x;
+ if (x <= 0.0) {
+ if (x == 0.0)
+ return -1/(x*x); /* -inf with divbyzero */
+ return 0/0.0f; /* nan with invalid */
+ }
+
+ /* separate mantissa from exponent */
+ /* Note, frexp is used so that denormal numbers
+ * will be handled properly.
+ */
+ x = frexpl(x, &e);
+
+ /* logarithm using log(x) = z + z**3 P(z)/Q(z),
+ * where z = 2(x-1)/x+1)
+ */
+ if (e > 2 || e < -2) {
+ if (x < SQRTH) { /* 2(2x-1)/(2x+1) */
+ e -= 1;
+ z = x - 0.5;
+ y = 0.5 * z + 0.5;
+ } else { /* 2 (x-1)/(x+1) */
+ z = x - 0.5;
+ z -= 0.5;
+ y = 0.5 * x + 0.5;
+ }
+ x = z / y;
+ z = x*x;
+ y = x * (z * __polevll(z, R, 3) / __p1evll(z, S, 3));
+ goto done;
+ }
+
+ /* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */
+ if (x < SQRTH) {
+ e -= 1;
+ x = 2.0*x - 1.0;
+ } else {
+ x = x - 1.0;
+ }
+ z = x*x;
+ y = x * (z * __polevll(x, P, 6) / __p1evll(x, Q, 7));
+ y = y - 0.5*z;
+
+done:
+ /* Multiply log of fraction by log2(e)
+ * and base 2 exponent by 1
+ *
+ * ***CAUTION***
+ *
+ * This sequence of operations is critical and it may
+ * be horribly defeated by some compiler optimizers.
+ */
+ z = y * LOG2EA;
+ z += x * LOG2EA;
+ z += y;
+ z += x;
+ z += e;
+ return z;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double log2l(long double x)
+{
+ return log2(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/log_data.c b/libc-top-half/musl/src/math/log_data.c
new file mode 100644
index 0000000..1a6ec71
--- /dev/null
+++ b/libc-top-half/musl/src/math/log_data.c
@@ -0,0 +1,328 @@
+/*
+ * Data for log.
+ *
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "log_data.h"
+
+#define N (1 << LOG_TABLE_BITS)
+
+const struct log_data __log_data = {
+.ln2hi = 0x1.62e42fefa3800p-1,
+.ln2lo = 0x1.ef35793c76730p-45,
+.poly1 = {
+// relative error: 0x1.c04d76cp-63
+// in -0x1p-4 0x1.09p-4 (|log(1+x)| > 0x1p-4 outside the interval)
+-0x1p-1,
+0x1.5555555555577p-2,
+-0x1.ffffffffffdcbp-3,
+0x1.999999995dd0cp-3,
+-0x1.55555556745a7p-3,
+0x1.24924a344de3p-3,
+-0x1.fffffa4423d65p-4,
+0x1.c7184282ad6cap-4,
+-0x1.999eb43b068ffp-4,
+0x1.78182f7afd085p-4,
+-0x1.5521375d145cdp-4,
+},
+.poly = {
+// relative error: 0x1.926199e8p-56
+// abs error: 0x1.882ff33p-65
+// in -0x1.fp-9 0x1.fp-9
+-0x1.0000000000001p-1,
+0x1.555555551305bp-2,
+-0x1.fffffffeb459p-3,
+0x1.999b324f10111p-3,
+-0x1.55575e506c89fp-3,
+},
+/* Algorithm:
+
+ x = 2^k z
+ log(x) = k ln2 + log(c) + log(z/c)
+ log(z/c) = poly(z/c - 1)
+
+where z is in [1.6p-1; 1.6p0] which is split into N subintervals and z falls
+into the ith one, then table entries are computed as
+
+ tab[i].invc = 1/c
+ tab[i].logc = (double)log(c)
+ tab2[i].chi = (double)c
+ tab2[i].clo = (double)(c - (double)c)
+
+where c is near the center of the subinterval and is chosen by trying +-2^29
+floating point invc candidates around 1/center and selecting one for which
+
+ 1) the rounding error in 0x1.8p9 + logc is 0,
+ 2) the rounding error in z - chi - clo is < 0x1p-66 and
+ 3) the rounding error in (double)log(c) is minimized (< 0x1p-66).
+
+Note: 1) ensures that k*ln2hi + logc can be computed without rounding error,
+2) ensures that z/c - 1 can be computed as (z - chi - clo)*invc with close to
+a single rounding error when there is no fast fma for z*invc - 1, 3) ensures
+that logc + poly(z/c - 1) has small error, however near x == 1 when
+|log(x)| < 0x1p-4, this is not enough so that is special cased. */
+.tab = {
+{0x1.734f0c3e0de9fp+0, -0x1.7cc7f79e69000p-2},
+{0x1.713786a2ce91fp+0, -0x1.76feec20d0000p-2},
+{0x1.6f26008fab5a0p+0, -0x1.713e31351e000p-2},
+{0x1.6d1a61f138c7dp+0, -0x1.6b85b38287800p-2},
+{0x1.6b1490bc5b4d1p+0, -0x1.65d5590807800p-2},
+{0x1.69147332f0cbap+0, -0x1.602d076180000p-2},
+{0x1.6719f18224223p+0, -0x1.5a8ca86909000p-2},
+{0x1.6524f99a51ed9p+0, -0x1.54f4356035000p-2},
+{0x1.63356aa8f24c4p+0, -0x1.4f637c36b4000p-2},
+{0x1.614b36b9ddc14p+0, -0x1.49da7fda85000p-2},
+{0x1.5f66452c65c4cp+0, -0x1.445923989a800p-2},
+{0x1.5d867b5912c4fp+0, -0x1.3edf439b0b800p-2},
+{0x1.5babccb5b90dep+0, -0x1.396ce448f7000p-2},
+{0x1.59d61f2d91a78p+0, -0x1.3401e17bda000p-2},
+{0x1.5805612465687p+0, -0x1.2e9e2ef468000p-2},
+{0x1.56397cee76bd3p+0, -0x1.2941b3830e000p-2},
+{0x1.54725e2a77f93p+0, -0x1.23ec58cda8800p-2},
+{0x1.52aff42064583p+0, -0x1.1e9e129279000p-2},
+{0x1.50f22dbb2bddfp+0, -0x1.1956d2b48f800p-2},
+{0x1.4f38f4734ded7p+0, -0x1.141679ab9f800p-2},
+{0x1.4d843cfde2840p+0, -0x1.0edd094ef9800p-2},
+{0x1.4bd3ec078a3c8p+0, -0x1.09aa518db1000p-2},
+{0x1.4a27fc3e0258ap+0, -0x1.047e65263b800p-2},
+{0x1.4880524d48434p+0, -0x1.feb224586f000p-3},
+{0x1.46dce1b192d0bp+0, -0x1.f474a7517b000p-3},
+{0x1.453d9d3391854p+0, -0x1.ea4443d103000p-3},
+{0x1.43a2744b4845ap+0, -0x1.e020d44e9b000p-3},
+{0x1.420b54115f8fbp+0, -0x1.d60a22977f000p-3},
+{0x1.40782da3ef4b1p+0, -0x1.cc00104959000p-3},
+{0x1.3ee8f5d57fe8fp+0, -0x1.c202956891000p-3},
+{0x1.3d5d9a00b4ce9p+0, -0x1.b81178d811000p-3},
+{0x1.3bd60c010c12bp+0, -0x1.ae2c9ccd3d000p-3},
+{0x1.3a5242b75dab8p+0, -0x1.a45402e129000p-3},
+{0x1.38d22cd9fd002p+0, -0x1.9a877681df000p-3},
+{0x1.3755bc5847a1cp+0, -0x1.90c6d69483000p-3},
+{0x1.35dce49ad36e2p+0, -0x1.87120a645c000p-3},
+{0x1.34679984dd440p+0, -0x1.7d68fb4143000p-3},
+{0x1.32f5cceffcb24p+0, -0x1.73cb83c627000p-3},
+{0x1.3187775a10d49p+0, -0x1.6a39a9b376000p-3},
+{0x1.301c8373e3990p+0, -0x1.60b3154b7a000p-3},
+{0x1.2eb4ebb95f841p+0, -0x1.5737d76243000p-3},
+{0x1.2d50a0219a9d1p+0, -0x1.4dc7b8fc23000p-3},
+{0x1.2bef9a8b7fd2ap+0, -0x1.4462c51d20000p-3},
+{0x1.2a91c7a0c1babp+0, -0x1.3b08abc830000p-3},
+{0x1.293726014b530p+0, -0x1.31b996b490000p-3},
+{0x1.27dfa5757a1f5p+0, -0x1.2875490a44000p-3},
+{0x1.268b39b1d3bbfp+0, -0x1.1f3b9f879a000p-3},
+{0x1.2539d838ff5bdp+0, -0x1.160c8252ca000p-3},
+{0x1.23eb7aac9083bp+0, -0x1.0ce7f57f72000p-3},
+{0x1.22a012ba940b6p+0, -0x1.03cdc49fea000p-3},
+{0x1.2157996cc4132p+0, -0x1.f57bdbc4b8000p-4},
+{0x1.201201dd2fc9bp+0, -0x1.e370896404000p-4},
+{0x1.1ecf4494d480bp+0, -0x1.d17983ef94000p-4},
+{0x1.1d8f5528f6569p+0, -0x1.bf9674ed8a000p-4},
+{0x1.1c52311577e7cp+0, -0x1.adc79202f6000p-4},
+{0x1.1b17c74cb26e9p+0, -0x1.9c0c3e7288000p-4},
+{0x1.19e010c2c1ab6p+0, -0x1.8a646b372c000p-4},
+{0x1.18ab07bb670bdp+0, -0x1.78d01b3ac0000p-4},
+{0x1.1778a25efbcb6p+0, -0x1.674f145380000p-4},
+{0x1.1648d354c31dap+0, -0x1.55e0e6d878000p-4},
+{0x1.151b990275fddp+0, -0x1.4485cdea1e000p-4},
+{0x1.13f0ea432d24cp+0, -0x1.333d94d6aa000p-4},
+{0x1.12c8b7210f9dap+0, -0x1.22079f8c56000p-4},
+{0x1.11a3028ecb531p+0, -0x1.10e4698622000p-4},
+{0x1.107fbda8434afp+0, -0x1.ffa6c6ad20000p-5},
+{0x1.0f5ee0f4e6bb3p+0, -0x1.dda8d4a774000p-5},
+{0x1.0e4065d2a9fcep+0, -0x1.bbcece4850000p-5},
+{0x1.0d244632ca521p+0, -0x1.9a1894012c000p-5},
+{0x1.0c0a77ce2981ap+0, -0x1.788583302c000p-5},
+{0x1.0af2f83c636d1p+0, -0x1.5715e67d68000p-5},
+{0x1.09ddb98a01339p+0, -0x1.35c8a49658000p-5},
+{0x1.08cabaf52e7dfp+0, -0x1.149e364154000p-5},
+{0x1.07b9f2f4e28fbp+0, -0x1.e72c082eb8000p-6},
+{0x1.06ab58c358f19p+0, -0x1.a55f152528000p-6},
+{0x1.059eea5ecf92cp+0, -0x1.63d62cf818000p-6},
+{0x1.04949cdd12c90p+0, -0x1.228fb8caa0000p-6},
+{0x1.038c6c6f0ada9p+0, -0x1.c317b20f90000p-7},
+{0x1.02865137932a9p+0, -0x1.419355daa0000p-7},
+{0x1.0182427ea7348p+0, -0x1.81203c2ec0000p-8},
+{0x1.008040614b195p+0, -0x1.0040979240000p-9},
+{0x1.fe01ff726fa1ap-1, 0x1.feff384900000p-9},
+{0x1.fa11cc261ea74p-1, 0x1.7dc41353d0000p-7},
+{0x1.f6310b081992ep-1, 0x1.3cea3c4c28000p-6},
+{0x1.f25f63ceeadcdp-1, 0x1.b9fc114890000p-6},
+{0x1.ee9c8039113e7p-1, 0x1.1b0d8ce110000p-5},
+{0x1.eae8078cbb1abp-1, 0x1.58a5bd001c000p-5},
+{0x1.e741aa29d0c9bp-1, 0x1.95c8340d88000p-5},
+{0x1.e3a91830a99b5p-1, 0x1.d276aef578000p-5},
+{0x1.e01e009609a56p-1, 0x1.07598e598c000p-4},
+{0x1.dca01e577bb98p-1, 0x1.253f5e30d2000p-4},
+{0x1.d92f20b7c9103p-1, 0x1.42edd8b380000p-4},
+{0x1.d5cac66fb5ccep-1, 0x1.606598757c000p-4},
+{0x1.d272caa5ede9dp-1, 0x1.7da76356a0000p-4},
+{0x1.cf26e3e6b2ccdp-1, 0x1.9ab434e1c6000p-4},
+{0x1.cbe6da2a77902p-1, 0x1.b78c7bb0d6000p-4},
+{0x1.c8b266d37086dp-1, 0x1.d431332e72000p-4},
+{0x1.c5894bd5d5804p-1, 0x1.f0a3171de6000p-4},
+{0x1.c26b533bb9f8cp-1, 0x1.067152b914000p-3},
+{0x1.bf583eeece73fp-1, 0x1.147858292b000p-3},
+{0x1.bc4fd75db96c1p-1, 0x1.2266ecdca3000p-3},
+{0x1.b951e0c864a28p-1, 0x1.303d7a6c55000p-3},
+{0x1.b65e2c5ef3e2cp-1, 0x1.3dfc33c331000p-3},
+{0x1.b374867c9888bp-1, 0x1.4ba366b7a8000p-3},
+{0x1.b094b211d304ap-1, 0x1.5933928d1f000p-3},
+{0x1.adbe885f2ef7ep-1, 0x1.66acd2418f000p-3},
+{0x1.aaf1d31603da2p-1, 0x1.740f8ec669000p-3},
+{0x1.a82e63fd358a7p-1, 0x1.815c0f51af000p-3},
+{0x1.a5740ef09738bp-1, 0x1.8e92954f68000p-3},
+{0x1.a2c2a90ab4b27p-1, 0x1.9bb3602f84000p-3},
+{0x1.a01a01393f2d1p-1, 0x1.a8bed1c2c0000p-3},
+{0x1.9d79f24db3c1bp-1, 0x1.b5b515c01d000p-3},
+{0x1.9ae2505c7b190p-1, 0x1.c2967ccbcc000p-3},
+{0x1.9852ef297ce2fp-1, 0x1.cf635d5486000p-3},
+{0x1.95cbaeea44b75p-1, 0x1.dc1bd3446c000p-3},
+{0x1.934c69de74838p-1, 0x1.e8c01b8cfe000p-3},
+{0x1.90d4f2f6752e6p-1, 0x1.f5509c0179000p-3},
+{0x1.8e6528effd79dp-1, 0x1.00e6c121fb800p-2},
+{0x1.8bfce9fcc007cp-1, 0x1.071b80e93d000p-2},
+{0x1.899c0dabec30ep-1, 0x1.0d46b9e867000p-2},
+{0x1.87427aa2317fbp-1, 0x1.13687334bd000p-2},
+{0x1.84f00acb39a08p-1, 0x1.1980d67234800p-2},
+{0x1.82a49e8653e55p-1, 0x1.1f8ffe0cc8000p-2},
+{0x1.8060195f40260p-1, 0x1.2595fd7636800p-2},
+{0x1.7e22563e0a329p-1, 0x1.2b9300914a800p-2},
+{0x1.7beb377dcb5adp-1, 0x1.3187210436000p-2},
+{0x1.79baa679725c2p-1, 0x1.377266dec1800p-2},
+{0x1.77907f2170657p-1, 0x1.3d54ffbaf3000p-2},
+{0x1.756cadbd6130cp-1, 0x1.432eee32fe000p-2},
+},
+#if !__FP_FAST_FMA
+.tab2 = {
+{0x1.61000014fb66bp-1, 0x1.e026c91425b3cp-56},
+{0x1.63000034db495p-1, 0x1.dbfea48005d41p-55},
+{0x1.650000d94d478p-1, 0x1.e7fa786d6a5b7p-55},
+{0x1.67000074e6fadp-1, 0x1.1fcea6b54254cp-57},
+{0x1.68ffffedf0faep-1, -0x1.c7e274c590efdp-56},
+{0x1.6b0000763c5bcp-1, -0x1.ac16848dcda01p-55},
+{0x1.6d0001e5cc1f6p-1, 0x1.33f1c9d499311p-55},
+{0x1.6efffeb05f63ep-1, -0x1.e80041ae22d53p-56},
+{0x1.710000e86978p-1, 0x1.bff6671097952p-56},
+{0x1.72ffffc67e912p-1, 0x1.c00e226bd8724p-55},
+{0x1.74fffdf81116ap-1, -0x1.e02916ef101d2p-57},
+{0x1.770000f679c9p-1, -0x1.7fc71cd549c74p-57},
+{0x1.78ffffa7ec835p-1, 0x1.1bec19ef50483p-55},
+{0x1.7affffe20c2e6p-1, -0x1.07e1729cc6465p-56},
+{0x1.7cfffed3fc9p-1, -0x1.08072087b8b1cp-55},
+{0x1.7efffe9261a76p-1, 0x1.dc0286d9df9aep-55},
+{0x1.81000049ca3e8p-1, 0x1.97fd251e54c33p-55},
+{0x1.8300017932c8fp-1, -0x1.afee9b630f381p-55},
+{0x1.850000633739cp-1, 0x1.9bfbf6b6535bcp-55},
+{0x1.87000204289c6p-1, -0x1.bbf65f3117b75p-55},
+{0x1.88fffebf57904p-1, -0x1.9006ea23dcb57p-55},
+{0x1.8b00022bc04dfp-1, -0x1.d00df38e04b0ap-56},
+{0x1.8cfffe50c1b8ap-1, -0x1.8007146ff9f05p-55},
+{0x1.8effffc918e43p-1, 0x1.3817bd07a7038p-55},
+{0x1.910001efa5fc7p-1, 0x1.93e9176dfb403p-55},
+{0x1.9300013467bb9p-1, 0x1.f804e4b980276p-56},
+{0x1.94fffe6ee076fp-1, -0x1.f7ef0d9ff622ep-55},
+{0x1.96fffde3c12d1p-1, -0x1.082aa962638bap-56},
+{0x1.98ffff4458a0dp-1, -0x1.7801b9164a8efp-55},
+{0x1.9afffdd982e3ep-1, -0x1.740e08a5a9337p-55},
+{0x1.9cfffed49fb66p-1, 0x1.fce08c19bep-60},
+{0x1.9f00020f19c51p-1, -0x1.a3faa27885b0ap-55},
+{0x1.a10001145b006p-1, 0x1.4ff489958da56p-56},
+{0x1.a300007bbf6fap-1, 0x1.cbeab8a2b6d18p-55},
+{0x1.a500010971d79p-1, 0x1.8fecadd78793p-55},
+{0x1.a70001df52e48p-1, -0x1.f41763dd8abdbp-55},
+{0x1.a90001c593352p-1, -0x1.ebf0284c27612p-55},
+{0x1.ab0002a4f3e4bp-1, -0x1.9fd043cff3f5fp-57},
+{0x1.acfffd7ae1ed1p-1, -0x1.23ee7129070b4p-55},
+{0x1.aefffee510478p-1, 0x1.a063ee00edea3p-57},
+{0x1.b0fffdb650d5bp-1, 0x1.a06c8381f0ab9p-58},
+{0x1.b2ffffeaaca57p-1, -0x1.9011e74233c1dp-56},
+{0x1.b4fffd995badcp-1, -0x1.9ff1068862a9fp-56},
+{0x1.b7000249e659cp-1, 0x1.aff45d0864f3ep-55},
+{0x1.b8ffff987164p-1, 0x1.cfe7796c2c3f9p-56},
+{0x1.bafffd204cb4fp-1, -0x1.3ff27eef22bc4p-57},
+{0x1.bcfffd2415c45p-1, -0x1.cffb7ee3bea21p-57},
+{0x1.beffff86309dfp-1, -0x1.14103972e0b5cp-55},
+{0x1.c0fffe1b57653p-1, 0x1.bc16494b76a19p-55},
+{0x1.c2ffff1fa57e3p-1, -0x1.4feef8d30c6edp-57},
+{0x1.c4fffdcbfe424p-1, -0x1.43f68bcec4775p-55},
+{0x1.c6fffed54b9f7p-1, 0x1.47ea3f053e0ecp-55},
+{0x1.c8fffeb998fd5p-1, 0x1.383068df992f1p-56},
+{0x1.cb0002125219ap-1, -0x1.8fd8e64180e04p-57},
+{0x1.ccfffdd94469cp-1, 0x1.e7ebe1cc7ea72p-55},
+{0x1.cefffeafdc476p-1, 0x1.ebe39ad9f88fep-55},
+{0x1.d1000169af82bp-1, 0x1.57d91a8b95a71p-56},
+{0x1.d30000d0ff71dp-1, 0x1.9c1906970c7dap-55},
+{0x1.d4fffea790fc4p-1, -0x1.80e37c558fe0cp-58},
+{0x1.d70002edc87e5p-1, -0x1.f80d64dc10f44p-56},
+{0x1.d900021dc82aap-1, -0x1.47c8f94fd5c5cp-56},
+{0x1.dafffd86b0283p-1, 0x1.c7f1dc521617ep-55},
+{0x1.dd000296c4739p-1, 0x1.8019eb2ffb153p-55},
+{0x1.defffe54490f5p-1, 0x1.e00d2c652cc89p-57},
+{0x1.e0fffcdabf694p-1, -0x1.f8340202d69d2p-56},
+{0x1.e2fffdb52c8ddp-1, 0x1.b00c1ca1b0864p-56},
+{0x1.e4ffff24216efp-1, 0x1.2ffa8b094ab51p-56},
+{0x1.e6fffe88a5e11p-1, -0x1.7f673b1efbe59p-58},
+{0x1.e9000119eff0dp-1, -0x1.4808d5e0bc801p-55},
+{0x1.eafffdfa51744p-1, 0x1.80006d54320b5p-56},
+{0x1.ed0001a127fa1p-1, -0x1.002f860565c92p-58},
+{0x1.ef00007babcc4p-1, -0x1.540445d35e611p-55},
+{0x1.f0ffff57a8d02p-1, -0x1.ffb3139ef9105p-59},
+{0x1.f30001ee58ac7p-1, 0x1.a81acf2731155p-55},
+{0x1.f4ffff5823494p-1, 0x1.a3f41d4d7c743p-55},
+{0x1.f6ffffca94c6bp-1, -0x1.202f41c987875p-57},
+{0x1.f8fffe1f9c441p-1, 0x1.77dd1f477e74bp-56},
+{0x1.fafffd2e0e37ep-1, -0x1.f01199a7ca331p-57},
+{0x1.fd0001c77e49ep-1, 0x1.181ee4bceacb1p-56},
+{0x1.feffff7e0c331p-1, -0x1.e05370170875ap-57},
+{0x1.00ffff465606ep+0, -0x1.a7ead491c0adap-55},
+{0x1.02ffff3867a58p+0, -0x1.77f69c3fcb2ep-54},
+{0x1.04ffffdfc0d17p+0, 0x1.7bffe34cb945bp-54},
+{0x1.0700003cd4d82p+0, 0x1.20083c0e456cbp-55},
+{0x1.08ffff9f2cbe8p+0, -0x1.dffdfbe37751ap-57},
+{0x1.0b000010cda65p+0, -0x1.13f7faee626ebp-54},
+{0x1.0d00001a4d338p+0, 0x1.07dfa79489ff7p-55},
+{0x1.0effffadafdfdp+0, -0x1.7040570d66bcp-56},
+{0x1.110000bbafd96p+0, 0x1.e80d4846d0b62p-55},
+{0x1.12ffffae5f45dp+0, 0x1.dbffa64fd36efp-54},
+{0x1.150000dd59ad9p+0, 0x1.a0077701250aep-54},
+{0x1.170000f21559ap+0, 0x1.dfdf9e2e3deeep-55},
+{0x1.18ffffc275426p+0, 0x1.10030dc3b7273p-54},
+{0x1.1b000123d3c59p+0, 0x1.97f7980030188p-54},
+{0x1.1cffff8299eb7p+0, -0x1.5f932ab9f8c67p-57},
+{0x1.1effff48ad4p+0, 0x1.37fbf9da75bebp-54},
+{0x1.210000c8b86a4p+0, 0x1.f806b91fd5b22p-54},
+{0x1.2300003854303p+0, 0x1.3ffc2eb9fbf33p-54},
+{0x1.24fffffbcf684p+0, 0x1.601e77e2e2e72p-56},
+{0x1.26ffff52921d9p+0, 0x1.ffcbb767f0c61p-56},
+{0x1.2900014933a3cp+0, -0x1.202ca3c02412bp-56},
+{0x1.2b00014556313p+0, -0x1.2808233f21f02p-54},
+{0x1.2cfffebfe523bp+0, -0x1.8ff7e384fdcf2p-55},
+{0x1.2f0000bb8ad96p+0, -0x1.5ff51503041c5p-55},
+{0x1.30ffffb7ae2afp+0, -0x1.10071885e289dp-55},
+{0x1.32ffffeac5f7fp+0, -0x1.1ff5d3fb7b715p-54},
+{0x1.350000ca66756p+0, 0x1.57f82228b82bdp-54},
+{0x1.3700011fbf721p+0, 0x1.000bac40dd5ccp-55},
+{0x1.38ffff9592fb9p+0, -0x1.43f9d2db2a751p-54},
+{0x1.3b00004ddd242p+0, 0x1.57f6b707638e1p-55},
+{0x1.3cffff5b2c957p+0, 0x1.a023a10bf1231p-56},
+{0x1.3efffeab0b418p+0, 0x1.87f6d66b152bp-54},
+{0x1.410001532aff4p+0, 0x1.7f8375f198524p-57},
+{0x1.4300017478b29p+0, 0x1.301e672dc5143p-55},
+{0x1.44fffe795b463p+0, 0x1.9ff69b8b2895ap-55},
+{0x1.46fffe80475ep+0, -0x1.5c0b19bc2f254p-54},
+{0x1.48fffef6fc1e7p+0, 0x1.b4009f23a2a72p-54},
+{0x1.4afffe5bea704p+0, -0x1.4ffb7bf0d7d45p-54},
+{0x1.4d000171027dep+0, -0x1.9c06471dc6a3dp-54},
+{0x1.4f0000ff03ee2p+0, 0x1.77f890b85531cp-54},
+{0x1.5100012dc4bd1p+0, 0x1.004657166a436p-57},
+{0x1.530001605277ap+0, -0x1.6bfcece233209p-54},
+{0x1.54fffecdb704cp+0, -0x1.902720505a1d7p-55},
+{0x1.56fffef5f54a9p+0, 0x1.bbfe60ec96412p-54},
+{0x1.5900017e61012p+0, 0x1.87ec581afef9p-55},
+{0x1.5b00003c93e92p+0, -0x1.f41080abf0ccp-54},
+{0x1.5d0001d4919bcp+0, -0x1.8812afb254729p-54},
+{0x1.5efffe7b87a89p+0, -0x1.47eb780ed6904p-54},
+},
+#endif
+};
diff --git a/libc-top-half/musl/src/math/log_data.h b/libc-top-half/musl/src/math/log_data.h
new file mode 100644
index 0000000..1be22ab
--- /dev/null
+++ b/libc-top-half/musl/src/math/log_data.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef _LOG_DATA_H
+#define _LOG_DATA_H
+
+#include <features.h>
+
+#define LOG_TABLE_BITS 7
+#define LOG_POLY_ORDER 6
+#define LOG_POLY1_ORDER 12
+extern hidden const struct log_data {
+ double ln2hi;
+ double ln2lo;
+ double poly[LOG_POLY_ORDER - 1]; /* First coefficient is 1. */
+ double poly1[LOG_POLY1_ORDER - 1];
+ struct {
+ double invc, logc;
+ } tab[1 << LOG_TABLE_BITS];
+#if !__FP_FAST_FMA
+ struct {
+ double chi, clo;
+ } tab2[1 << LOG_TABLE_BITS];
+#endif
+} __log_data;
+
+#endif
diff --git a/libc-top-half/musl/src/math/logb.c b/libc-top-half/musl/src/math/logb.c
new file mode 100644
index 0000000..7f8bdfa
--- /dev/null
+++ b/libc-top-half/musl/src/math/logb.c
@@ -0,0 +1,17 @@
+#include <math.h>
+
+/*
+special cases:
+ logb(+-0) = -inf, and raise divbyzero
+ logb(+-inf) = +inf
+ logb(nan) = nan
+*/
+
+double logb(double x)
+{
+ if (!isfinite(x))
+ return x * x;
+ if (x == 0)
+ return -1/(x*x);
+ return ilogb(x);
+}
diff --git a/libc-top-half/musl/src/math/logbf.c b/libc-top-half/musl/src/math/logbf.c
new file mode 100644
index 0000000..a0a0b5e
--- /dev/null
+++ b/libc-top-half/musl/src/math/logbf.c
@@ -0,0 +1,10 @@
+#include <math.h>
+
+float logbf(float x)
+{
+ if (!isfinite(x))
+ return x * x;
+ if (x == 0)
+ return -1/(x*x);
+ return ilogbf(x);
+}
diff --git a/libc-top-half/musl/src/math/logbl.c b/libc-top-half/musl/src/math/logbl.c
new file mode 100644
index 0000000..962973a
--- /dev/null
+++ b/libc-top-half/musl/src/math/logbl.c
@@ -0,0 +1,16 @@
+#include <math.h>
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double logbl(long double x)
+{
+ return logb(x);
+}
+#else
+long double logbl(long double x)
+{
+ if (!isfinite(x))
+ return x * x;
+ if (x == 0)
+ return -1/(x*x);
+ return ilogbl(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/logf.c b/libc-top-half/musl/src/math/logf.c
new file mode 100644
index 0000000..7ee5d7f
--- /dev/null
+++ b/libc-top-half/musl/src/math/logf.c
@@ -0,0 +1,71 @@
+/*
+ * Single-precision log function.
+ *
+ * Copyright (c) 2017-2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <math.h>
+#include <stdint.h>
+#include "libm.h"
+#include "logf_data.h"
+
+/*
+LOGF_TABLE_BITS = 4
+LOGF_POLY_ORDER = 4
+
+ULP error: 0.818 (nearest rounding.)
+Relative error: 1.957 * 2^-26 (before rounding.)
+*/
+
+#define T __logf_data.tab
+#define A __logf_data.poly
+#define Ln2 __logf_data.ln2
+#define N (1 << LOGF_TABLE_BITS)
+#define OFF 0x3f330000
+
+float logf(float x)
+{
+ double_t z, r, r2, y, y0, invc, logc;
+ uint32_t ix, iz, tmp;
+ int k, i;
+
+ ix = asuint(x);
+ /* Fix sign of zero with downward rounding when x==1. */
+ if (WANT_ROUNDING && predict_false(ix == 0x3f800000))
+ return 0;
+ if (predict_false(ix - 0x00800000 >= 0x7f800000 - 0x00800000)) {
+ /* x < 0x1p-126 or inf or nan. */
+ if (ix * 2 == 0)
+ return __math_divzerof(1);
+ if (ix == 0x7f800000) /* log(inf) == inf. */
+ return x;
+ if ((ix & 0x80000000) || ix * 2 >= 0xff000000)
+ return __math_invalidf(x);
+ /* x is subnormal, normalize it. */
+ ix = asuint(x * 0x1p23f);
+ ix -= 23 << 23;
+ }
+
+ /* x = 2^k z; where z is in range [OFF,2*OFF] and exact.
+ The range is split into N subintervals.
+ The ith subinterval contains z and c is near its center. */
+ tmp = ix - OFF;
+ i = (tmp >> (23 - LOGF_TABLE_BITS)) % N;
+ k = (int32_t)tmp >> 23; /* arithmetic shift */
+ iz = ix - (tmp & 0x1ff << 23);
+ invc = T[i].invc;
+ logc = T[i].logc;
+ z = (double_t)asfloat(iz);
+
+ /* log(x) = log1p(z/c-1) + log(c) + k*Ln2 */
+ r = z * invc - 1;
+ y0 = logc + (double_t)k * Ln2;
+
+ /* Pipelined polynomial evaluation to approximate log1p(r). */
+ r2 = r * r;
+ y = A[1] * r + A[2];
+ y = A[0] * r2 + y;
+ y = y * r2 + (y0 + r);
+ return eval_as_float(y);
+}
diff --git a/libc-top-half/musl/src/math/logf_data.c b/libc-top-half/musl/src/math/logf_data.c
new file mode 100644
index 0000000..857221f
--- /dev/null
+++ b/libc-top-half/musl/src/math/logf_data.c
@@ -0,0 +1,33 @@
+/*
+ * Data definition for logf.
+ *
+ * Copyright (c) 2017-2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "logf_data.h"
+
+const struct logf_data __logf_data = {
+ .tab = {
+ { 0x1.661ec79f8f3bep+0, -0x1.57bf7808caadep-2 },
+ { 0x1.571ed4aaf883dp+0, -0x1.2bef0a7c06ddbp-2 },
+ { 0x1.49539f0f010bp+0, -0x1.01eae7f513a67p-2 },
+ { 0x1.3c995b0b80385p+0, -0x1.b31d8a68224e9p-3 },
+ { 0x1.30d190c8864a5p+0, -0x1.6574f0ac07758p-3 },
+ { 0x1.25e227b0b8eap+0, -0x1.1aa2bc79c81p-3 },
+ { 0x1.1bb4a4a1a343fp+0, -0x1.a4e76ce8c0e5ep-4 },
+ { 0x1.12358f08ae5bap+0, -0x1.1973c5a611cccp-4 },
+ { 0x1.0953f419900a7p+0, -0x1.252f438e10c1ep-5 },
+ { 0x1p+0, 0x0p+0 },
+ { 0x1.e608cfd9a47acp-1, 0x1.aa5aa5df25984p-5 },
+ { 0x1.ca4b31f026aap-1, 0x1.c5e53aa362eb4p-4 },
+ { 0x1.b2036576afce6p-1, 0x1.526e57720db08p-3 },
+ { 0x1.9c2d163a1aa2dp-1, 0x1.bc2860d22477p-3 },
+ { 0x1.886e6037841edp-1, 0x1.1058bc8a07ee1p-2 },
+ { 0x1.767dcf5534862p-1, 0x1.4043057b6ee09p-2 },
+ },
+ .ln2 = 0x1.62e42fefa39efp-1,
+ .poly = {
+ -0x1.00ea348b88334p-2, 0x1.5575b0be00b6ap-2, -0x1.ffffef20a4123p-2,
+ }
+};
diff --git a/libc-top-half/musl/src/math/logf_data.h b/libc-top-half/musl/src/math/logf_data.h
new file mode 100644
index 0000000..00cff6f
--- /dev/null
+++ b/libc-top-half/musl/src/math/logf_data.h
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2017-2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef _LOGF_DATA_H
+#define _LOGF_DATA_H
+
+#include <features.h>
+
+#define LOGF_TABLE_BITS 4
+#define LOGF_POLY_ORDER 4
+extern hidden const struct logf_data {
+ struct {
+ double invc, logc;
+ } tab[1 << LOGF_TABLE_BITS];
+ double ln2;
+ double poly[LOGF_POLY_ORDER - 1]; /* First order coefficient is 1. */
+} __logf_data;
+
+#endif
diff --git a/libc-top-half/musl/src/math/logl.c b/libc-top-half/musl/src/math/logl.c
new file mode 100644
index 0000000..5d53659
--- /dev/null
+++ b/libc-top-half/musl/src/math/logl.c
@@ -0,0 +1,175 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_logl.c */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Natural logarithm, long double precision
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, logl();
+ *
+ * y = logl( x );
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns the base e (2.718...) logarithm of x.
+ *
+ * The argument is separated into its exponent and fractional
+ * parts. If the exponent is between -1 and +1, the logarithm
+ * of the fraction is approximated by
+ *
+ * log(1+x) = x - 0.5 x**2 + x**3 P(x)/Q(x).
+ *
+ * Otherwise, setting z = 2(x-1)/(x+1),
+ *
+ * log(x) = log(1+z/2) - log(1-z/2) = z + z**3 P(z)/Q(z).
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE 0.5, 2.0 150000 8.71e-20 2.75e-20
+ * IEEE exp(+-10000) 100000 5.39e-20 2.34e-20
+ *
+ * In the tests over the interval exp(+-10000), the logarithms
+ * of the random arguments were uniformly distributed over
+ * [-10000, +10000].
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double logl(long double x)
+{
+ return log(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+/* Coefficients for log(1+x) = x - x**2/2 + x**3 P(x)/Q(x)
+ * 1/sqrt(2) <= x < sqrt(2)
+ * Theoretical peak relative error = 2.32e-20
+ */
+static const long double P[] = {
+ 4.5270000862445199635215E-5L,
+ 4.9854102823193375972212E-1L,
+ 6.5787325942061044846969E0L,
+ 2.9911919328553073277375E1L,
+ 6.0949667980987787057556E1L,
+ 5.7112963590585538103336E1L,
+ 2.0039553499201281259648E1L,
+};
+static const long double Q[] = {
+/* 1.0000000000000000000000E0,*/
+ 1.5062909083469192043167E1L,
+ 8.3047565967967209469434E1L,
+ 2.2176239823732856465394E2L,
+ 3.0909872225312059774938E2L,
+ 2.1642788614495947685003E2L,
+ 6.0118660497603843919306E1L,
+};
+
+/* Coefficients for log(x) = z + z^3 P(z^2)/Q(z^2),
+ * where z = 2(x-1)/(x+1)
+ * 1/sqrt(2) <= x < sqrt(2)
+ * Theoretical peak relative error = 6.16e-22
+ */
+static const long double R[4] = {
+ 1.9757429581415468984296E-3L,
+-7.1990767473014147232598E-1L,
+ 1.0777257190312272158094E1L,
+-3.5717684488096787370998E1L,
+};
+static const long double S[4] = {
+/* 1.00000000000000000000E0L,*/
+-2.6201045551331104417768E1L,
+ 1.9361891836232102174846E2L,
+-4.2861221385716144629696E2L,
+};
+static const long double C1 = 6.9314575195312500000000E-1L;
+static const long double C2 = 1.4286068203094172321215E-6L;
+
+#define SQRTH 0.70710678118654752440L
+
+long double logl(long double x)
+{
+ long double y, z;
+ int e;
+
+ if (isnan(x))
+ return x;
+ if (x == INFINITY)
+ return x;
+ if (x <= 0.0) {
+ if (x == 0.0)
+ return -1/(x*x); /* -inf with divbyzero */
+ return 0/0.0f; /* nan with invalid */
+ }
+
+ /* separate mantissa from exponent */
+ /* Note, frexp is used so that denormal numbers
+ * will be handled properly.
+ */
+ x = frexpl(x, &e);
+
+ /* logarithm using log(x) = z + z**3 P(z)/Q(z),
+ * where z = 2(x-1)/(x+1)
+ */
+ if (e > 2 || e < -2) {
+ if (x < SQRTH) { /* 2(2x-1)/(2x+1) */
+ e -= 1;
+ z = x - 0.5;
+ y = 0.5 * z + 0.5;
+ } else { /* 2 (x-1)/(x+1) */
+ z = x - 0.5;
+ z -= 0.5;
+ y = 0.5 * x + 0.5;
+ }
+ x = z / y;
+ z = x*x;
+ z = x * (z * __polevll(z, R, 3) / __p1evll(z, S, 3));
+ z = z + e * C2;
+ z = z + x;
+ z = z + e * C1;
+ return z;
+ }
+
+ /* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */
+ if (x < SQRTH) {
+ e -= 1;
+ x = 2.0*x - 1.0;
+ } else {
+ x = x - 1.0;
+ }
+ z = x*x;
+ y = x * (z * __polevll(x, P, 6) / __p1evll(x, Q, 6));
+ y = y + e * C2;
+ z = y - 0.5*z;
+ /* Note, the sum of above terms does not exceed x/4,
+ * so it contributes at most about 1/4 lsb to the error.
+ */
+ z = z + x;
+ z = z + e * C1; /* This sum has an error of 1/2 lsb. */
+ return z;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double logl(long double x)
+{
+ return log(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/lrint.c b/libc-top-half/musl/src/math/lrint.c
new file mode 100644
index 0000000..ddee7a0
--- /dev/null
+++ b/libc-top-half/musl/src/math/lrint.c
@@ -0,0 +1,72 @@
+#include <limits.h>
+#include <fenv.h>
+#include <math.h>
+#include "libm.h"
+
+/*
+If the result cannot be represented (overflow, nan), then
+lrint raises the invalid exception.
+
+Otherwise if the input was not an integer then the inexact
+exception is raised.
+
+C99 is a bit vague about whether inexact exception is
+allowed to be raised when invalid is raised.
+(F.9 explicitly allows spurious inexact exceptions, F.9.6.5
+does not make it clear if that rule applies to lrint, but
+IEEE 754r 7.8 seems to forbid spurious inexact exception in
+the ineger conversion functions)
+
+So we try to make sure that no spurious inexact exception is
+raised in case of an overflow.
+
+If the bit size of long > precision of double, then there
+cannot be inexact rounding in case the result overflows,
+otherwise LONG_MAX and LONG_MIN can be represented exactly
+as a double.
+*/
+
+#if LONG_MAX < 1U<<53 && defined(FE_INEXACT)
+#include <float.h>
+#include <stdint.h>
+#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1
+#define EPS DBL_EPSILON
+#elif FLT_EVAL_METHOD==2
+#define EPS LDBL_EPSILON
+#endif
+#ifdef __GNUC__
+/* avoid stack frame in lrint */
+__attribute__((noinline))
+#endif
+static long lrint_slow(double x)
+{
+ #pragma STDC FENV_ACCESS ON
+ int e;
+
+ e = fetestexcept(FE_INEXACT);
+ x = rint(x);
+ if (!e && (x > LONG_MAX || x < LONG_MIN))
+ feclearexcept(FE_INEXACT);
+ /* conversion */
+ return x;
+}
+
+long lrint(double x)
+{
+ uint32_t abstop = asuint64(x)>>32 & 0x7fffffff;
+ uint64_t sign = asuint64(x) & (1ULL << 63);
+
+ if (abstop < 0x41dfffff) {
+ /* |x| < 0x7ffffc00, no overflow */
+ double_t toint = asdouble(asuint64(1/EPS) | sign);
+ double_t y = x + toint - toint;
+ return (long)y;
+ }
+ return lrint_slow(x);
+}
+#else
+long lrint(double x)
+{
+ return rint(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/lrintf.c b/libc-top-half/musl/src/math/lrintf.c
new file mode 100644
index 0000000..ca0b6a4
--- /dev/null
+++ b/libc-top-half/musl/src/math/lrintf.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+/* uses LONG_MAX > 2^24, see comments in lrint.c */
+
+long lrintf(float x)
+{
+ return rintf(x);
+}
diff --git a/libc-top-half/musl/src/math/lrintl.c b/libc-top-half/musl/src/math/lrintl.c
new file mode 100644
index 0000000..b2a8106
--- /dev/null
+++ b/libc-top-half/musl/src/math/lrintl.c
@@ -0,0 +1,36 @@
+#include <limits.h>
+#include <fenv.h>
+#include "libm.h"
+
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long lrintl(long double x)
+{
+ return lrint(x);
+}
+#elif defined(FE_INEXACT)
+/*
+see comments in lrint.c
+
+Note that if LONG_MAX == 0x7fffffffffffffff && LDBL_MANT_DIG == 64
+then x == 2**63 - 0.5 is the only input that overflows and
+raises inexact (with tonearest or upward rounding mode)
+*/
+long lrintl(long double x)
+{
+ #pragma STDC FENV_ACCESS ON
+ int e;
+
+ e = fetestexcept(FE_INEXACT);
+ x = rintl(x);
+ if (!e && (x > LONG_MAX || x < LONG_MIN))
+ feclearexcept(FE_INEXACT);
+ /* conversion */
+ return x;
+}
+#else
+long lrintl(long double x)
+{
+ return rintl(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/lround.c b/libc-top-half/musl/src/math/lround.c
new file mode 100644
index 0000000..b8b7954
--- /dev/null
+++ b/libc-top-half/musl/src/math/lround.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+long lround(double x)
+{
+ return round(x);
+}
diff --git a/libc-top-half/musl/src/math/lroundf.c b/libc-top-half/musl/src/math/lroundf.c
new file mode 100644
index 0000000..c4707e7
--- /dev/null
+++ b/libc-top-half/musl/src/math/lroundf.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+long lroundf(float x)
+{
+ return roundf(x);
+}
diff --git a/libc-top-half/musl/src/math/lroundl.c b/libc-top-half/musl/src/math/lroundl.c
new file mode 100644
index 0000000..094fdf6
--- /dev/null
+++ b/libc-top-half/musl/src/math/lroundl.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+long lroundl(long double x)
+{
+ return roundl(x);
+}
diff --git a/libc-top-half/musl/src/math/m68k/sqrtl.c b/libc-top-half/musl/src/math/m68k/sqrtl.c
new file mode 100644
index 0000000..b1c303c
--- /dev/null
+++ b/libc-top-half/musl/src/math/m68k/sqrtl.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __HAVE_68881__
+
+long double sqrtl(long double x)
+{
+ __asm__ ("fsqrt.x %1,%0" : "=f"(x) : "fm"(x));
+ return x;
+}
+
+#else
+
+#include "../sqrtl.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/mips/fabs.c b/libc-top-half/musl/src/math/mips/fabs.c
new file mode 100644
index 0000000..0a5aa3b
--- /dev/null
+++ b/libc-top-half/musl/src/math/mips/fabs.c
@@ -0,0 +1,16 @@
+#if !defined(__mips_soft_float) && defined(__mips_abs2008)
+
+#include <math.h>
+
+double fabs(double x)
+{
+ double r;
+ __asm__("abs.d %0,%1" : "=f"(r) : "f"(x));
+ return r;
+}
+
+#else
+
+#include "../fabs.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/mips/fabsf.c b/libc-top-half/musl/src/math/mips/fabsf.c
new file mode 100644
index 0000000..35307be
--- /dev/null
+++ b/libc-top-half/musl/src/math/mips/fabsf.c
@@ -0,0 +1,16 @@
+#if !defined(__mips_soft_float) && defined(__mips_abs2008)
+
+#include <math.h>
+
+float fabsf(float x)
+{
+ float r;
+ __asm__("abs.s %0,%1" : "=f"(r) : "f"(x));
+ return r;
+}
+
+#else
+
+#include "../fabsf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/mips/sqrt.c b/libc-top-half/musl/src/math/mips/sqrt.c
new file mode 100644
index 0000000..595c9db
--- /dev/null
+++ b/libc-top-half/musl/src/math/mips/sqrt.c
@@ -0,0 +1,16 @@
+#if !defined(__mips_soft_float) && __mips >= 3
+
+#include <math.h>
+
+double sqrt(double x)
+{
+ double r;
+ __asm__("sqrt.d %0,%1" : "=f"(r) : "f"(x));
+ return r;
+}
+
+#else
+
+#include "../sqrt.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/mips/sqrtf.c b/libc-top-half/musl/src/math/mips/sqrtf.c
new file mode 100644
index 0000000..84090d2
--- /dev/null
+++ b/libc-top-half/musl/src/math/mips/sqrtf.c
@@ -0,0 +1,16 @@
+#if !defined(__mips_soft_float) && __mips >= 2
+
+#include <math.h>
+
+float sqrtf(float x)
+{
+ float r;
+ __asm__("sqrt.s %0,%1" : "=f"(r) : "f"(x));
+ return r;
+}
+
+#else
+
+#include "../sqrtf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/modf.c b/libc-top-half/musl/src/math/modf.c
new file mode 100644
index 0000000..1c8a1db
--- /dev/null
+++ b/libc-top-half/musl/src/math/modf.c
@@ -0,0 +1,34 @@
+#include "libm.h"
+
+double modf(double x, double *iptr)
+{
+ union {double f; uint64_t i;} u = {x};
+ uint64_t mask;
+ int e = (int)(u.i>>52 & 0x7ff) - 0x3ff;
+
+ /* no fractional part */
+ if (e >= 52) {
+ *iptr = x;
+ if (e == 0x400 && u.i<<12 != 0) /* nan */
+ return x;
+ u.i &= 1ULL<<63;
+ return u.f;
+ }
+
+ /* no integral part*/
+ if (e < 0) {
+ u.i &= 1ULL<<63;
+ *iptr = u.f;
+ return x;
+ }
+
+ mask = -1ULL>>12>>e;
+ if ((u.i & mask) == 0) {
+ *iptr = x;
+ u.i &= 1ULL<<63;
+ return u.f;
+ }
+ u.i &= ~mask;
+ *iptr = u.f;
+ return x - u.f;
+}
diff --git a/libc-top-half/musl/src/math/modff.c b/libc-top-half/musl/src/math/modff.c
new file mode 100644
index 0000000..639514e
--- /dev/null
+++ b/libc-top-half/musl/src/math/modff.c
@@ -0,0 +1,34 @@
+#include "libm.h"
+
+float modff(float x, float *iptr)
+{
+ union {float f; uint32_t i;} u = {x};
+ uint32_t mask;
+ int e = (int)(u.i>>23 & 0xff) - 0x7f;
+
+ /* no fractional part */
+ if (e >= 23) {
+ *iptr = x;
+ if (e == 0x80 && u.i<<9 != 0) { /* nan */
+ return x;
+ }
+ u.i &= 0x80000000;
+ return u.f;
+ }
+ /* no integral part */
+ if (e < 0) {
+ u.i &= 0x80000000;
+ *iptr = u.f;
+ return x;
+ }
+
+ mask = 0x007fffff>>e;
+ if ((u.i & mask) == 0) {
+ *iptr = x;
+ u.i &= 0x80000000;
+ return u.f;
+ }
+ u.i &= ~mask;
+ *iptr = u.f;
+ return x - u.f;
+}
diff --git a/libc-top-half/musl/src/math/modfl.c b/libc-top-half/musl/src/math/modfl.c
new file mode 100644
index 0000000..a47b192
--- /dev/null
+++ b/libc-top-half/musl/src/math/modfl.c
@@ -0,0 +1,53 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double modfl(long double x, long double *iptr)
+{
+ double d;
+ long double r;
+
+ r = modf(x, &d);
+ *iptr = d;
+ return r;
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+
+static const long double toint = 1/LDBL_EPSILON;
+
+long double modfl(long double x, long double *iptr)
+{
+ union ldshape u = {x};
+ int e = (u.i.se & 0x7fff) - 0x3fff;
+ int s = u.i.se >> 15;
+ long double absx;
+ long double y;
+
+ /* no fractional part */
+ if (e >= LDBL_MANT_DIG-1) {
+ *iptr = x;
+ if (isnan(x))
+ return x;
+ return s ? -0.0 : 0.0;
+ }
+
+ /* no integral part*/
+ if (e < 0) {
+ *iptr = s ? -0.0 : 0.0;
+ return x;
+ }
+
+ /* raises spurious inexact */
+ absx = s ? -x : x;
+ y = absx + toint - toint - absx;
+ if (y == 0) {
+ *iptr = x;
+ return s ? -0.0 : 0.0;
+ }
+ if (y > 0)
+ y -= 1;
+ if (s)
+ y = -y;
+ *iptr = x + y;
+ return -y;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/nan.c b/libc-top-half/musl/src/math/nan.c
new file mode 100644
index 0000000..9e0826c
--- /dev/null
+++ b/libc-top-half/musl/src/math/nan.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+double nan(const char *s)
+{
+ return NAN;
+}
diff --git a/libc-top-half/musl/src/math/nanf.c b/libc-top-half/musl/src/math/nanf.c
new file mode 100644
index 0000000..752ce54
--- /dev/null
+++ b/libc-top-half/musl/src/math/nanf.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+float nanf(const char *s)
+{
+ return NAN;
+}
diff --git a/libc-top-half/musl/src/math/nanl.c b/libc-top-half/musl/src/math/nanl.c
new file mode 100644
index 0000000..969af56
--- /dev/null
+++ b/libc-top-half/musl/src/math/nanl.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+long double nanl(const char *s)
+{
+ return NAN;
+}
diff --git a/libc-top-half/musl/src/math/nearbyint.c b/libc-top-half/musl/src/math/nearbyint.c
new file mode 100644
index 0000000..f4e8aac
--- /dev/null
+++ b/libc-top-half/musl/src/math/nearbyint.c
@@ -0,0 +1,20 @@
+#include <fenv.h>
+#include <math.h>
+
+/* nearbyint is the same as rint, but it must not raise the inexact exception */
+
+double nearbyint(double x)
+{
+#ifdef FE_INEXACT
+ #pragma STDC FENV_ACCESS ON
+ int e;
+
+ e = fetestexcept(FE_INEXACT);
+#endif
+ x = rint(x);
+#ifdef FE_INEXACT
+ if (!e)
+ feclearexcept(FE_INEXACT);
+#endif
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/nearbyintf.c b/libc-top-half/musl/src/math/nearbyintf.c
new file mode 100644
index 0000000..092e9ff
--- /dev/null
+++ b/libc-top-half/musl/src/math/nearbyintf.c
@@ -0,0 +1,18 @@
+#include <fenv.h>
+#include <math.h>
+
+float nearbyintf(float x)
+{
+#ifdef FE_INEXACT
+ #pragma STDC FENV_ACCESS ON
+ int e;
+
+ e = fetestexcept(FE_INEXACT);
+#endif
+ x = rintf(x);
+#ifdef FE_INEXACT
+ if (!e)
+ feclearexcept(FE_INEXACT);
+#endif
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/nearbyintl.c b/libc-top-half/musl/src/math/nearbyintl.c
new file mode 100644
index 0000000..8285249
--- /dev/null
+++ b/libc-top-half/musl/src/math/nearbyintl.c
@@ -0,0 +1,26 @@
+#include <math.h>
+#include <float.h>
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double nearbyintl(long double x)
+{
+ return nearbyint(x);
+}
+#else
+#include <fenv.h>
+long double nearbyintl(long double x)
+{
+#ifdef FE_INEXACT
+ #pragma STDC FENV_ACCESS ON
+ int e;
+
+ e = fetestexcept(FE_INEXACT);
+#endif
+ x = rintl(x);
+#ifdef FE_INEXACT
+ if (!e)
+ feclearexcept(FE_INEXACT);
+#endif
+ return x;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/nextafter.c b/libc-top-half/musl/src/math/nextafter.c
new file mode 100644
index 0000000..ab5795a
--- /dev/null
+++ b/libc-top-half/musl/src/math/nextafter.c
@@ -0,0 +1,31 @@
+#include "libm.h"
+
+double nextafter(double x, double y)
+{
+ union {double f; uint64_t i;} ux={x}, uy={y};
+ uint64_t ax, ay;
+ int e;
+
+ if (isnan(x) || isnan(y))
+ return x + y;
+ if (ux.i == uy.i)
+ return y;
+ ax = ux.i & -1ULL/2;
+ ay = uy.i & -1ULL/2;
+ if (ax == 0) {
+ if (ay == 0)
+ return y;
+ ux.i = (uy.i & 1ULL<<63) | 1;
+ } else if (ax > ay || ((ux.i ^ uy.i) & 1ULL<<63))
+ ux.i--;
+ else
+ ux.i++;
+ e = ux.i >> 52 & 0x7ff;
+ /* raise overflow if ux.f is infinite and x is finite */
+ if (e == 0x7ff)
+ FORCE_EVAL(x+x);
+ /* raise underflow if ux.f is subnormal or zero */
+ if (e == 0)
+ FORCE_EVAL(x*x + ux.f*ux.f);
+ return ux.f;
+}
diff --git a/libc-top-half/musl/src/math/nextafterf.c b/libc-top-half/musl/src/math/nextafterf.c
new file mode 100644
index 0000000..75a09f7
--- /dev/null
+++ b/libc-top-half/musl/src/math/nextafterf.c
@@ -0,0 +1,30 @@
+#include "libm.h"
+
+float nextafterf(float x, float y)
+{
+ union {float f; uint32_t i;} ux={x}, uy={y};
+ uint32_t ax, ay, e;
+
+ if (isnan(x) || isnan(y))
+ return x + y;
+ if (ux.i == uy.i)
+ return y;
+ ax = ux.i & 0x7fffffff;
+ ay = uy.i & 0x7fffffff;
+ if (ax == 0) {
+ if (ay == 0)
+ return y;
+ ux.i = (uy.i & 0x80000000) | 1;
+ } else if (ax > ay || ((ux.i ^ uy.i) & 0x80000000))
+ ux.i--;
+ else
+ ux.i++;
+ e = ux.i & 0x7f800000;
+ /* raise overflow if ux.f is infinite and x is finite */
+ if (e == 0x7f800000)
+ FORCE_EVAL(x+x);
+ /* raise underflow if ux.f is subnormal or zero */
+ if (e == 0)
+ FORCE_EVAL(x*x + ux.f*ux.f);
+ return ux.f;
+}
diff --git a/libc-top-half/musl/src/math/nextafterl.c b/libc-top-half/musl/src/math/nextafterl.c
new file mode 100644
index 0000000..37e858f
--- /dev/null
+++ b/libc-top-half/musl/src/math/nextafterl.c
@@ -0,0 +1,75 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double nextafterl(long double x, long double y)
+{
+ return nextafter(x, y);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+long double nextafterl(long double x, long double y)
+{
+ union ldshape ux, uy;
+
+ if (isnan(x) || isnan(y))
+ return x + y;
+ if (x == y)
+ return y;
+ ux.f = x;
+ if (x == 0) {
+ uy.f = y;
+ ux.i.m = 1;
+ ux.i.se = uy.i.se & 0x8000;
+ } else if ((x < y) == !(ux.i.se & 0x8000)) {
+ ux.i.m++;
+ if (ux.i.m << 1 == 0) {
+ ux.i.m = 1ULL << 63;
+ ux.i.se++;
+ }
+ } else {
+ if (ux.i.m << 1 == 0) {
+ ux.i.se--;
+ if (ux.i.se)
+ ux.i.m = 0;
+ }
+ ux.i.m--;
+ }
+ /* raise overflow if ux is infinite and x is finite */
+ if ((ux.i.se & 0x7fff) == 0x7fff)
+ return x + x;
+ /* raise underflow if ux is subnormal or zero */
+ if ((ux.i.se & 0x7fff) == 0)
+ FORCE_EVAL(x*x + ux.f*ux.f);
+ return ux.f;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+long double nextafterl(long double x, long double y)
+{
+ union ldshape ux, uy;
+
+ if (isnan(x) || isnan(y))
+ return x + y;
+ if (x == y)
+ return y;
+ ux.f = x;
+ if (x == 0) {
+ uy.f = y;
+ ux.i.lo = 1;
+ ux.i.se = uy.i.se & 0x8000;
+ } else if ((x < y) == !(ux.i.se & 0x8000)) {
+ ux.i2.lo++;
+ if (ux.i2.lo == 0)
+ ux.i2.hi++;
+ } else {
+ if (ux.i2.lo == 0)
+ ux.i2.hi--;
+ ux.i2.lo--;
+ }
+ /* raise overflow if ux is infinite and x is finite */
+ if ((ux.i.se & 0x7fff) == 0x7fff)
+ return x + x;
+ /* raise underflow if ux is subnormal or zero */
+ if ((ux.i.se & 0x7fff) == 0)
+ FORCE_EVAL(x*x + ux.f*ux.f);
+ return ux.f;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/nexttoward.c b/libc-top-half/musl/src/math/nexttoward.c
new file mode 100644
index 0000000..827ee5c
--- /dev/null
+++ b/libc-top-half/musl/src/math/nexttoward.c
@@ -0,0 +1,42 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+double nexttoward(double x, long double y)
+{
+ return nextafter(x, y);
+}
+#else
+double nexttoward(double x, long double y)
+{
+ union {double f; uint64_t i;} ux = {x};
+ int e;
+
+ if (isnan(x) || isnan(y))
+ return x + y;
+ if (x == y)
+ return y;
+ if (x == 0) {
+ ux.i = 1;
+ if (signbit(y))
+ ux.i |= 1ULL<<63;
+ } else if (x < y) {
+ if (signbit(x))
+ ux.i--;
+ else
+ ux.i++;
+ } else {
+ if (signbit(x))
+ ux.i++;
+ else
+ ux.i--;
+ }
+ e = ux.i>>52 & 0x7ff;
+ /* raise overflow if ux.f is infinite and x is finite */
+ if (e == 0x7ff)
+ FORCE_EVAL(x+x);
+ /* raise underflow if ux.f is subnormal or zero */
+ if (e == 0)
+ FORCE_EVAL(x*x + ux.f*ux.f);
+ return ux.f;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/nexttowardf.c b/libc-top-half/musl/src/math/nexttowardf.c
new file mode 100644
index 0000000..bbf172f
--- /dev/null
+++ b/libc-top-half/musl/src/math/nexttowardf.c
@@ -0,0 +1,35 @@
+#include "libm.h"
+
+float nexttowardf(float x, long double y)
+{
+ union {float f; uint32_t i;} ux = {x};
+ uint32_t e;
+
+ if (isnan(x) || isnan(y))
+ return x + y;
+ if (x == y)
+ return y;
+ if (x == 0) {
+ ux.i = 1;
+ if (signbit(y))
+ ux.i |= 0x80000000;
+ } else if (x < y) {
+ if (signbit(x))
+ ux.i--;
+ else
+ ux.i++;
+ } else {
+ if (signbit(x))
+ ux.i++;
+ else
+ ux.i--;
+ }
+ e = ux.i & 0x7f800000;
+ /* raise overflow if ux.f is infinite and x is finite */
+ if (e == 0x7f800000)
+ FORCE_EVAL(x+x);
+ /* raise underflow if ux.f is subnormal or zero */
+ if (e == 0)
+ FORCE_EVAL(x*x + ux.f*ux.f);
+ return ux.f;
+}
diff --git a/libc-top-half/musl/src/math/nexttowardl.c b/libc-top-half/musl/src/math/nexttowardl.c
new file mode 100644
index 0000000..67a6340
--- /dev/null
+++ b/libc-top-half/musl/src/math/nexttowardl.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+long double nexttowardl(long double x, long double y)
+{
+ return nextafterl(x, y);
+}
diff --git a/libc-top-half/musl/src/math/pow.c b/libc-top-half/musl/src/math/pow.c
new file mode 100644
index 0000000..694c2ef
--- /dev/null
+++ b/libc-top-half/musl/src/math/pow.c
@@ -0,0 +1,343 @@
+/*
+ * Double-precision x^y function.
+ *
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <math.h>
+#include <stdint.h>
+#include "libm.h"
+#include "exp_data.h"
+#include "pow_data.h"
+
+/*
+Worst-case error: 0.54 ULP (~= ulperr_exp + 1024*Ln2*relerr_log*2^53)
+relerr_log: 1.3 * 2^-68 (Relative error of log, 1.5 * 2^-68 without fma)
+ulperr_exp: 0.509 ULP (ULP error of exp, 0.511 ULP without fma)
+*/
+
+#define T __pow_log_data.tab
+#define A __pow_log_data.poly
+#define Ln2hi __pow_log_data.ln2hi
+#define Ln2lo __pow_log_data.ln2lo
+#define N (1 << POW_LOG_TABLE_BITS)
+#define OFF 0x3fe6955500000000
+
+/* Top 12 bits of a double (sign and exponent bits). */
+static inline uint32_t top12(double x)
+{
+ return asuint64(x) >> 52;
+}
+
+/* Compute y+TAIL = log(x) where the rounded result is y and TAIL has about
+ additional 15 bits precision. IX is the bit representation of x, but
+ normalized in the subnormal range using the sign bit for the exponent. */
+static inline double_t log_inline(uint64_t ix, double_t *tail)
+{
+ /* double_t for better performance on targets with FLT_EVAL_METHOD==2. */
+ double_t z, r, y, invc, logc, logctail, kd, hi, t1, t2, lo, lo1, lo2, p;
+ uint64_t iz, tmp;
+ int k, i;
+
+ /* x = 2^k z; where z is in range [OFF,2*OFF) and exact.
+ The range is split into N subintervals.
+ The ith subinterval contains z and c is near its center. */
+ tmp = ix - OFF;
+ i = (tmp >> (52 - POW_LOG_TABLE_BITS)) % N;
+ k = (int64_t)tmp >> 52; /* arithmetic shift */
+ iz = ix - (tmp & 0xfffULL << 52);
+ z = asdouble(iz);
+ kd = (double_t)k;
+
+ /* log(x) = k*Ln2 + log(c) + log1p(z/c-1). */
+ invc = T[i].invc;
+ logc = T[i].logc;
+ logctail = T[i].logctail;
+
+ /* Note: 1/c is j/N or j/N/2 where j is an integer in [N,2N) and
+ |z/c - 1| < 1/N, so r = z/c - 1 is exactly representible. */
+#if __FP_FAST_FMA
+ r = __builtin_fma(z, invc, -1.0);
+#else
+ /* Split z such that rhi, rlo and rhi*rhi are exact and |rlo| <= |r|. */
+ double_t zhi = asdouble((iz + (1ULL << 31)) & (-1ULL << 32));
+ double_t zlo = z - zhi;
+ double_t rhi = zhi * invc - 1.0;
+ double_t rlo = zlo * invc;
+ r = rhi + rlo;
+#endif
+
+ /* k*Ln2 + log(c) + r. */
+ t1 = kd * Ln2hi + logc;
+ t2 = t1 + r;
+ lo1 = kd * Ln2lo + logctail;
+ lo2 = t1 - t2 + r;
+
+ /* Evaluation is optimized assuming superscalar pipelined execution. */
+ double_t ar, ar2, ar3, lo3, lo4;
+ ar = A[0] * r; /* A[0] = -0.5. */
+ ar2 = r * ar;
+ ar3 = r * ar2;
+ /* k*Ln2 + log(c) + r + A[0]*r*r. */
+#if __FP_FAST_FMA
+ hi = t2 + ar2;
+ lo3 = __builtin_fma(ar, r, -ar2);
+ lo4 = t2 - hi + ar2;
+#else
+ double_t arhi = A[0] * rhi;
+ double_t arhi2 = rhi * arhi;
+ hi = t2 + arhi2;
+ lo3 = rlo * (ar + arhi);
+ lo4 = t2 - hi + arhi2;
+#endif
+ /* p = log1p(r) - r - A[0]*r*r. */
+ p = (ar3 * (A[1] + r * A[2] +
+ ar2 * (A[3] + r * A[4] + ar2 * (A[5] + r * A[6]))));
+ lo = lo1 + lo2 + lo3 + lo4 + p;
+ y = hi + lo;
+ *tail = hi - y + lo;
+ return y;
+}
+
+#undef N
+#undef T
+#define N (1 << EXP_TABLE_BITS)
+#define InvLn2N __exp_data.invln2N
+#define NegLn2hiN __exp_data.negln2hiN
+#define NegLn2loN __exp_data.negln2loN
+#define Shift __exp_data.shift
+#define T __exp_data.tab
+#define C2 __exp_data.poly[5 - EXP_POLY_ORDER]
+#define C3 __exp_data.poly[6 - EXP_POLY_ORDER]
+#define C4 __exp_data.poly[7 - EXP_POLY_ORDER]
+#define C5 __exp_data.poly[8 - EXP_POLY_ORDER]
+#define C6 __exp_data.poly[9 - EXP_POLY_ORDER]
+
+/* Handle cases that may overflow or underflow when computing the result that
+ is scale*(1+TMP) without intermediate rounding. The bit representation of
+ scale is in SBITS, however it has a computed exponent that may have
+ overflown into the sign bit so that needs to be adjusted before using it as
+ a double. (int32_t)KI is the k used in the argument reduction and exponent
+ adjustment of scale, positive k here means the result may overflow and
+ negative k means the result may underflow. */
+static inline double specialcase(double_t tmp, uint64_t sbits, uint64_t ki)
+{
+ double_t scale, y;
+
+ if ((ki & 0x80000000) == 0) {
+ /* k > 0, the exponent of scale might have overflowed by <= 460. */
+ sbits -= 1009ull << 52;
+ scale = asdouble(sbits);
+ y = 0x1p1009 * (scale + scale * tmp);
+ return eval_as_double(y);
+ }
+ /* k < 0, need special care in the subnormal range. */
+ sbits += 1022ull << 52;
+ /* Note: sbits is signed scale. */
+ scale = asdouble(sbits);
+ y = scale + scale * tmp;
+ if (fabs(y) < 1.0) {
+ /* Round y to the right precision before scaling it into the subnormal
+ range to avoid double rounding that can cause 0.5+E/2 ulp error where
+ E is the worst-case ulp error outside the subnormal range. So this
+ is only useful if the goal is better than 1 ulp worst-case error. */
+ double_t hi, lo, one = 1.0;
+ if (y < 0.0)
+ one = -1.0;
+ lo = scale - y + scale * tmp;
+ hi = one + y;
+ lo = one - hi + y + lo;
+ y = eval_as_double(hi + lo) - one;
+ /* Fix the sign of 0. */
+ if (y == 0.0)
+ y = asdouble(sbits & 0x8000000000000000);
+ /* The underflow exception needs to be signaled explicitly. */
+ fp_force_eval(fp_barrier(0x1p-1022) * 0x1p-1022);
+ }
+ y = 0x1p-1022 * y;
+ return eval_as_double(y);
+}
+
+#define SIGN_BIAS (0x800 << EXP_TABLE_BITS)
+
+/* Computes sign*exp(x+xtail) where |xtail| < 2^-8/N and |xtail| <= |x|.
+ The sign_bias argument is SIGN_BIAS or 0 and sets the sign to -1 or 1. */
+static inline double exp_inline(double_t x, double_t xtail, uint32_t sign_bias)
+{
+ uint32_t abstop;
+ uint64_t ki, idx, top, sbits;
+ /* double_t for better performance on targets with FLT_EVAL_METHOD==2. */
+ double_t kd, z, r, r2, scale, tail, tmp;
+
+ abstop = top12(x) & 0x7ff;
+ if (predict_false(abstop - top12(0x1p-54) >=
+ top12(512.0) - top12(0x1p-54))) {
+ if (abstop - top12(0x1p-54) >= 0x80000000) {
+ /* Avoid spurious underflow for tiny x. */
+ /* Note: 0 is common input. */
+ double_t one = WANT_ROUNDING ? 1.0 + x : 1.0;
+ return sign_bias ? -one : one;
+ }
+ if (abstop >= top12(1024.0)) {
+ /* Note: inf and nan are already handled. */
+ if (asuint64(x) >> 63)
+ return __math_uflow(sign_bias);
+ else
+ return __math_oflow(sign_bias);
+ }
+ /* Large x is special cased below. */
+ abstop = 0;
+ }
+
+ /* exp(x) = 2^(k/N) * exp(r), with exp(r) in [2^(-1/2N),2^(1/2N)]. */
+ /* x = ln2/N*k + r, with int k and r in [-ln2/2N, ln2/2N]. */
+ z = InvLn2N * x;
+#if TOINT_INTRINSICS
+ kd = roundtoint(z);
+ ki = converttoint(z);
+#elif EXP_USE_TOINT_NARROW
+ /* z - kd is in [-0.5-2^-16, 0.5] in all rounding modes. */
+ kd = eval_as_double(z + Shift);
+ ki = asuint64(kd) >> 16;
+ kd = (double_t)(int32_t)ki;
+#else
+ /* z - kd is in [-1, 1] in non-nearest rounding modes. */
+ kd = eval_as_double(z + Shift);
+ ki = asuint64(kd);
+ kd -= Shift;
+#endif
+ r = x + kd * NegLn2hiN + kd * NegLn2loN;
+ /* The code assumes 2^-200 < |xtail| < 2^-8/N. */
+ r += xtail;
+ /* 2^(k/N) ~= scale * (1 + tail). */
+ idx = 2 * (ki % N);
+ top = (ki + sign_bias) << (52 - EXP_TABLE_BITS);
+ tail = asdouble(T[idx]);
+ /* This is only a valid scale when -1023*N < k < 1024*N. */
+ sbits = T[idx + 1] + top;
+ /* exp(x) = 2^(k/N) * exp(r) ~= scale + scale * (tail + exp(r) - 1). */
+ /* Evaluation is optimized assuming superscalar pipelined execution. */
+ r2 = r * r;
+ /* Without fma the worst case error is 0.25/N ulp larger. */
+ /* Worst case error is less than 0.5+1.11/N+(abs poly error * 2^53) ulp. */
+ tmp = tail + r + r2 * (C2 + r * C3) + r2 * r2 * (C4 + r * C5);
+ if (predict_false(abstop == 0))
+ return specialcase(tmp, sbits, ki);
+ scale = asdouble(sbits);
+ /* Note: tmp == 0 or |tmp| > 2^-200 and scale > 2^-739, so there
+ is no spurious underflow here even without fma. */
+ return eval_as_double(scale + scale * tmp);
+}
+
+/* Returns 0 if not int, 1 if odd int, 2 if even int. The argument is
+ the bit representation of a non-zero finite floating-point value. */
+static inline int checkint(uint64_t iy)
+{
+ int e = iy >> 52 & 0x7ff;
+ if (e < 0x3ff)
+ return 0;
+ if (e > 0x3ff + 52)
+ return 2;
+ if (iy & ((1ULL << (0x3ff + 52 - e)) - 1))
+ return 0;
+ if (iy & (1ULL << (0x3ff + 52 - e)))
+ return 1;
+ return 2;
+}
+
+/* Returns 1 if input is the bit representation of 0, infinity or nan. */
+static inline int zeroinfnan(uint64_t i)
+{
+ return 2 * i - 1 >= 2 * asuint64(INFINITY) - 1;
+}
+
+double pow(double x, double y)
+{
+ uint32_t sign_bias = 0;
+ uint64_t ix, iy;
+ uint32_t topx, topy;
+
+ ix = asuint64(x);
+ iy = asuint64(y);
+ topx = top12(x);
+ topy = top12(y);
+ if (predict_false(topx - 0x001 >= 0x7ff - 0x001 ||
+ (topy & 0x7ff) - 0x3be >= 0x43e - 0x3be)) {
+ /* Note: if |y| > 1075 * ln2 * 2^53 ~= 0x1.749p62 then pow(x,y) = inf/0
+ and if |y| < 2^-54 / 1075 ~= 0x1.e7b6p-65 then pow(x,y) = +-1. */
+ /* Special cases: (x < 0x1p-126 or inf or nan) or
+ (|y| < 0x1p-65 or |y| >= 0x1p63 or nan). */
+ if (predict_false(zeroinfnan(iy))) {
+ if (2 * iy == 0)
+ return issignaling_inline(x) ? x + y : 1.0;
+ if (ix == asuint64(1.0))
+ return issignaling_inline(y) ? x + y : 1.0;
+ if (2 * ix > 2 * asuint64(INFINITY) ||
+ 2 * iy > 2 * asuint64(INFINITY))
+ return x + y;
+ if (2 * ix == 2 * asuint64(1.0))
+ return 1.0;
+ if ((2 * ix < 2 * asuint64(1.0)) == !(iy >> 63))
+ return 0.0; /* |x|<1 && y==inf or |x|>1 && y==-inf. */
+ return y * y;
+ }
+ if (predict_false(zeroinfnan(ix))) {
+ double_t x2 = x * x;
+ if (ix >> 63 && checkint(iy) == 1)
+ x2 = -x2;
+ /* Without the barrier some versions of clang hoist the 1/x2 and
+ thus division by zero exception can be signaled spuriously. */
+ return iy >> 63 ? fp_barrier(1 / x2) : x2;
+ }
+ /* Here x and y are non-zero finite. */
+ if (ix >> 63) {
+ /* Finite x < 0. */
+ int yint = checkint(iy);
+ if (yint == 0)
+ return __math_invalid(x);
+ if (yint == 1)
+ sign_bias = SIGN_BIAS;
+ ix &= 0x7fffffffffffffff;
+ topx &= 0x7ff;
+ }
+ if ((topy & 0x7ff) - 0x3be >= 0x43e - 0x3be) {
+ /* Note: sign_bias == 0 here because y is not odd. */
+ if (ix == asuint64(1.0))
+ return 1.0;
+ if ((topy & 0x7ff) < 0x3be) {
+ /* |y| < 2^-65, x^y ~= 1 + y*log(x). */
+ if (WANT_ROUNDING)
+ return ix > asuint64(1.0) ? 1.0 + y :
+ 1.0 - y;
+ else
+ return 1.0;
+ }
+ return (ix > asuint64(1.0)) == (topy < 0x800) ?
+ __math_oflow(0) :
+ __math_uflow(0);
+ }
+ if (topx == 0) {
+ /* Normalize subnormal x so exponent becomes negative. */
+ ix = asuint64(x * 0x1p52);
+ ix &= 0x7fffffffffffffff;
+ ix -= 52ULL << 52;
+ }
+ }
+
+ double_t lo;
+ double_t hi = log_inline(ix, &lo);
+ double_t ehi, elo;
+#if __FP_FAST_FMA
+ ehi = y * hi;
+ elo = y * lo + __builtin_fma(y, hi, -ehi);
+#else
+ double_t yhi = asdouble(iy & -1ULL << 27);
+ double_t ylo = y - yhi;
+ double_t lhi = asdouble(asuint64(hi) & -1ULL << 27);
+ double_t llo = hi - lhi + lo;
+ ehi = yhi * lhi;
+ elo = ylo * lhi + y * llo; /* |elo| < |ehi| * 2^-25. */
+#endif
+ return exp_inline(ehi, elo, sign_bias);
+}
diff --git a/libc-top-half/musl/src/math/pow_data.c b/libc-top-half/musl/src/math/pow_data.c
new file mode 100644
index 0000000..81e760d
--- /dev/null
+++ b/libc-top-half/musl/src/math/pow_data.c
@@ -0,0 +1,180 @@
+/*
+ * Data for the log part of pow.
+ *
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "pow_data.h"
+
+#define N (1 << POW_LOG_TABLE_BITS)
+
+const struct pow_log_data __pow_log_data = {
+.ln2hi = 0x1.62e42fefa3800p-1,
+.ln2lo = 0x1.ef35793c76730p-45,
+.poly = {
+// relative error: 0x1.11922ap-70
+// in -0x1.6bp-8 0x1.6bp-8
+// Coefficients are scaled to match the scaling during evaluation.
+-0x1p-1,
+0x1.555555555556p-2 * -2,
+-0x1.0000000000006p-2 * -2,
+0x1.999999959554ep-3 * 4,
+-0x1.555555529a47ap-3 * 4,
+0x1.2495b9b4845e9p-3 * -8,
+-0x1.0002b8b263fc3p-3 * -8,
+},
+/* Algorithm:
+
+ x = 2^k z
+ log(x) = k ln2 + log(c) + log(z/c)
+ log(z/c) = poly(z/c - 1)
+
+where z is in [0x1.69555p-1; 0x1.69555p0] which is split into N subintervals
+and z falls into the ith one, then table entries are computed as
+
+ tab[i].invc = 1/c
+ tab[i].logc = round(0x1p43*log(c))/0x1p43
+ tab[i].logctail = (double)(log(c) - logc)
+
+where c is chosen near the center of the subinterval such that 1/c has only a
+few precision bits so z/c - 1 is exactly representible as double:
+
+ 1/c = center < 1 ? round(N/center)/N : round(2*N/center)/N/2
+
+Note: |z/c - 1| < 1/N for the chosen c, |log(c) - logc - logctail| < 0x1p-97,
+the last few bits of logc are rounded away so k*ln2hi + logc has no rounding
+error and the interval for z is selected such that near x == 1, where log(x)
+is tiny, large cancellation error is avoided in logc + poly(z/c - 1). */
+.tab = {
+#define A(a, b, c) {a, 0, b, c},
+A(0x1.6a00000000000p+0, -0x1.62c82f2b9c800p-2, 0x1.ab42428375680p-48)
+A(0x1.6800000000000p+0, -0x1.5d1bdbf580800p-2, -0x1.ca508d8e0f720p-46)
+A(0x1.6600000000000p+0, -0x1.5767717455800p-2, -0x1.362a4d5b6506dp-45)
+A(0x1.6400000000000p+0, -0x1.51aad872df800p-2, -0x1.684e49eb067d5p-49)
+A(0x1.6200000000000p+0, -0x1.4be5f95777800p-2, -0x1.41b6993293ee0p-47)
+A(0x1.6000000000000p+0, -0x1.4618bc21c6000p-2, 0x1.3d82f484c84ccp-46)
+A(0x1.5e00000000000p+0, -0x1.404308686a800p-2, 0x1.c42f3ed820b3ap-50)
+A(0x1.5c00000000000p+0, -0x1.3a64c55694800p-2, 0x1.0b1c686519460p-45)
+A(0x1.5a00000000000p+0, -0x1.347dd9a988000p-2, 0x1.5594dd4c58092p-45)
+A(0x1.5800000000000p+0, -0x1.2e8e2bae12000p-2, 0x1.67b1e99b72bd8p-45)
+A(0x1.5600000000000p+0, -0x1.2895a13de8800p-2, 0x1.5ca14b6cfb03fp-46)
+A(0x1.5600000000000p+0, -0x1.2895a13de8800p-2, 0x1.5ca14b6cfb03fp-46)
+A(0x1.5400000000000p+0, -0x1.22941fbcf7800p-2, -0x1.65a242853da76p-46)
+A(0x1.5200000000000p+0, -0x1.1c898c1699800p-2, -0x1.fafbc68e75404p-46)
+A(0x1.5000000000000p+0, -0x1.1675cababa800p-2, 0x1.f1fc63382a8f0p-46)
+A(0x1.4e00000000000p+0, -0x1.1058bf9ae4800p-2, -0x1.6a8c4fd055a66p-45)
+A(0x1.4c00000000000p+0, -0x1.0a324e2739000p-2, -0x1.c6bee7ef4030ep-47)
+A(0x1.4a00000000000p+0, -0x1.0402594b4d000p-2, -0x1.036b89ef42d7fp-48)
+A(0x1.4a00000000000p+0, -0x1.0402594b4d000p-2, -0x1.036b89ef42d7fp-48)
+A(0x1.4800000000000p+0, -0x1.fb9186d5e4000p-3, 0x1.d572aab993c87p-47)
+A(0x1.4600000000000p+0, -0x1.ef0adcbdc6000p-3, 0x1.b26b79c86af24p-45)
+A(0x1.4400000000000p+0, -0x1.e27076e2af000p-3, -0x1.72f4f543fff10p-46)
+A(0x1.4200000000000p+0, -0x1.d5c216b4fc000p-3, 0x1.1ba91bbca681bp-45)
+A(0x1.4000000000000p+0, -0x1.c8ff7c79aa000p-3, 0x1.7794f689f8434p-45)
+A(0x1.4000000000000p+0, -0x1.c8ff7c79aa000p-3, 0x1.7794f689f8434p-45)
+A(0x1.3e00000000000p+0, -0x1.bc286742d9000p-3, 0x1.94eb0318bb78fp-46)
+A(0x1.3c00000000000p+0, -0x1.af3c94e80c000p-3, 0x1.a4e633fcd9066p-52)
+A(0x1.3a00000000000p+0, -0x1.a23bc1fe2b000p-3, -0x1.58c64dc46c1eap-45)
+A(0x1.3a00000000000p+0, -0x1.a23bc1fe2b000p-3, -0x1.58c64dc46c1eap-45)
+A(0x1.3800000000000p+0, -0x1.9525a9cf45000p-3, -0x1.ad1d904c1d4e3p-45)
+A(0x1.3600000000000p+0, -0x1.87fa06520d000p-3, 0x1.bbdbf7fdbfa09p-45)
+A(0x1.3400000000000p+0, -0x1.7ab890210e000p-3, 0x1.bdb9072534a58p-45)
+A(0x1.3400000000000p+0, -0x1.7ab890210e000p-3, 0x1.bdb9072534a58p-45)
+A(0x1.3200000000000p+0, -0x1.6d60fe719d000p-3, -0x1.0e46aa3b2e266p-46)
+A(0x1.3000000000000p+0, -0x1.5ff3070a79000p-3, -0x1.e9e439f105039p-46)
+A(0x1.3000000000000p+0, -0x1.5ff3070a79000p-3, -0x1.e9e439f105039p-46)
+A(0x1.2e00000000000p+0, -0x1.526e5e3a1b000p-3, -0x1.0de8b90075b8fp-45)
+A(0x1.2c00000000000p+0, -0x1.44d2b6ccb8000p-3, 0x1.70cc16135783cp-46)
+A(0x1.2c00000000000p+0, -0x1.44d2b6ccb8000p-3, 0x1.70cc16135783cp-46)
+A(0x1.2a00000000000p+0, -0x1.371fc201e9000p-3, 0x1.178864d27543ap-48)
+A(0x1.2800000000000p+0, -0x1.29552f81ff000p-3, -0x1.48d301771c408p-45)
+A(0x1.2600000000000p+0, -0x1.1b72ad52f6000p-3, -0x1.e80a41811a396p-45)
+A(0x1.2600000000000p+0, -0x1.1b72ad52f6000p-3, -0x1.e80a41811a396p-45)
+A(0x1.2400000000000p+0, -0x1.0d77e7cd09000p-3, 0x1.a699688e85bf4p-47)
+A(0x1.2400000000000p+0, -0x1.0d77e7cd09000p-3, 0x1.a699688e85bf4p-47)
+A(0x1.2200000000000p+0, -0x1.fec9131dbe000p-4, -0x1.575545ca333f2p-45)
+A(0x1.2000000000000p+0, -0x1.e27076e2b0000p-4, 0x1.a342c2af0003cp-45)
+A(0x1.2000000000000p+0, -0x1.e27076e2b0000p-4, 0x1.a342c2af0003cp-45)
+A(0x1.1e00000000000p+0, -0x1.c5e548f5bc000p-4, -0x1.d0c57585fbe06p-46)
+A(0x1.1c00000000000p+0, -0x1.a926d3a4ae000p-4, 0x1.53935e85baac8p-45)
+A(0x1.1c00000000000p+0, -0x1.a926d3a4ae000p-4, 0x1.53935e85baac8p-45)
+A(0x1.1a00000000000p+0, -0x1.8c345d631a000p-4, 0x1.37c294d2f5668p-46)
+A(0x1.1a00000000000p+0, -0x1.8c345d631a000p-4, 0x1.37c294d2f5668p-46)
+A(0x1.1800000000000p+0, -0x1.6f0d28ae56000p-4, -0x1.69737c93373dap-45)
+A(0x1.1600000000000p+0, -0x1.51b073f062000p-4, 0x1.f025b61c65e57p-46)
+A(0x1.1600000000000p+0, -0x1.51b073f062000p-4, 0x1.f025b61c65e57p-46)
+A(0x1.1400000000000p+0, -0x1.341d7961be000p-4, 0x1.c5edaccf913dfp-45)
+A(0x1.1400000000000p+0, -0x1.341d7961be000p-4, 0x1.c5edaccf913dfp-45)
+A(0x1.1200000000000p+0, -0x1.16536eea38000p-4, 0x1.47c5e768fa309p-46)
+A(0x1.1000000000000p+0, -0x1.f0a30c0118000p-5, 0x1.d599e83368e91p-45)
+A(0x1.1000000000000p+0, -0x1.f0a30c0118000p-5, 0x1.d599e83368e91p-45)
+A(0x1.0e00000000000p+0, -0x1.b42dd71198000p-5, 0x1.c827ae5d6704cp-46)
+A(0x1.0e00000000000p+0, -0x1.b42dd71198000p-5, 0x1.c827ae5d6704cp-46)
+A(0x1.0c00000000000p+0, -0x1.77458f632c000p-5, -0x1.cfc4634f2a1eep-45)
+A(0x1.0c00000000000p+0, -0x1.77458f632c000p-5, -0x1.cfc4634f2a1eep-45)
+A(0x1.0a00000000000p+0, -0x1.39e87b9fec000p-5, 0x1.502b7f526feaap-48)
+A(0x1.0a00000000000p+0, -0x1.39e87b9fec000p-5, 0x1.502b7f526feaap-48)
+A(0x1.0800000000000p+0, -0x1.f829b0e780000p-6, -0x1.980267c7e09e4p-45)
+A(0x1.0800000000000p+0, -0x1.f829b0e780000p-6, -0x1.980267c7e09e4p-45)
+A(0x1.0600000000000p+0, -0x1.7b91b07d58000p-6, -0x1.88d5493faa639p-45)
+A(0x1.0400000000000p+0, -0x1.fc0a8b0fc0000p-7, -0x1.f1e7cf6d3a69cp-50)
+A(0x1.0400000000000p+0, -0x1.fc0a8b0fc0000p-7, -0x1.f1e7cf6d3a69cp-50)
+A(0x1.0200000000000p+0, -0x1.fe02a6b100000p-8, -0x1.9e23f0dda40e4p-46)
+A(0x1.0200000000000p+0, -0x1.fe02a6b100000p-8, -0x1.9e23f0dda40e4p-46)
+A(0x1.0000000000000p+0, 0x0.0000000000000p+0, 0x0.0000000000000p+0)
+A(0x1.0000000000000p+0, 0x0.0000000000000p+0, 0x0.0000000000000p+0)
+A(0x1.fc00000000000p-1, 0x1.0101575890000p-7, -0x1.0c76b999d2be8p-46)
+A(0x1.f800000000000p-1, 0x1.0205658938000p-6, -0x1.3dc5b06e2f7d2p-45)
+A(0x1.f400000000000p-1, 0x1.8492528c90000p-6, -0x1.aa0ba325a0c34p-45)
+A(0x1.f000000000000p-1, 0x1.0415d89e74000p-5, 0x1.111c05cf1d753p-47)
+A(0x1.ec00000000000p-1, 0x1.466aed42e0000p-5, -0x1.c167375bdfd28p-45)
+A(0x1.e800000000000p-1, 0x1.894aa149fc000p-5, -0x1.97995d05a267dp-46)
+A(0x1.e400000000000p-1, 0x1.ccb73cdddc000p-5, -0x1.a68f247d82807p-46)
+A(0x1.e200000000000p-1, 0x1.eea31c006c000p-5, -0x1.e113e4fc93b7bp-47)
+A(0x1.de00000000000p-1, 0x1.1973bd1466000p-4, -0x1.5325d560d9e9bp-45)
+A(0x1.da00000000000p-1, 0x1.3bdf5a7d1e000p-4, 0x1.cc85ea5db4ed7p-45)
+A(0x1.d600000000000p-1, 0x1.5e95a4d97a000p-4, -0x1.c69063c5d1d1ep-45)
+A(0x1.d400000000000p-1, 0x1.700d30aeac000p-4, 0x1.c1e8da99ded32p-49)
+A(0x1.d000000000000p-1, 0x1.9335e5d594000p-4, 0x1.3115c3abd47dap-45)
+A(0x1.cc00000000000p-1, 0x1.b6ac88dad6000p-4, -0x1.390802bf768e5p-46)
+A(0x1.ca00000000000p-1, 0x1.c885801bc4000p-4, 0x1.646d1c65aacd3p-45)
+A(0x1.c600000000000p-1, 0x1.ec739830a2000p-4, -0x1.dc068afe645e0p-45)
+A(0x1.c400000000000p-1, 0x1.fe89139dbe000p-4, -0x1.534d64fa10afdp-45)
+A(0x1.c000000000000p-1, 0x1.1178e8227e000p-3, 0x1.1ef78ce2d07f2p-45)
+A(0x1.be00000000000p-1, 0x1.1aa2b7e23f000p-3, 0x1.ca78e44389934p-45)
+A(0x1.ba00000000000p-1, 0x1.2d1610c868000p-3, 0x1.39d6ccb81b4a1p-47)
+A(0x1.b800000000000p-1, 0x1.365fcb0159000p-3, 0x1.62fa8234b7289p-51)
+A(0x1.b400000000000p-1, 0x1.4913d8333b000p-3, 0x1.5837954fdb678p-45)
+A(0x1.b200000000000p-1, 0x1.527e5e4a1b000p-3, 0x1.633e8e5697dc7p-45)
+A(0x1.ae00000000000p-1, 0x1.6574ebe8c1000p-3, 0x1.9cf8b2c3c2e78p-46)
+A(0x1.ac00000000000p-1, 0x1.6f0128b757000p-3, -0x1.5118de59c21e1p-45)
+A(0x1.aa00000000000p-1, 0x1.7898d85445000p-3, -0x1.c661070914305p-46)
+A(0x1.a600000000000p-1, 0x1.8beafeb390000p-3, -0x1.73d54aae92cd1p-47)
+A(0x1.a400000000000p-1, 0x1.95a5adcf70000p-3, 0x1.7f22858a0ff6fp-47)
+A(0x1.a000000000000p-1, 0x1.a93ed3c8ae000p-3, -0x1.8724350562169p-45)
+A(0x1.9e00000000000p-1, 0x1.b31d8575bd000p-3, -0x1.c358d4eace1aap-47)
+A(0x1.9c00000000000p-1, 0x1.bd087383be000p-3, -0x1.d4bc4595412b6p-45)
+A(0x1.9a00000000000p-1, 0x1.c6ffbc6f01000p-3, -0x1.1ec72c5962bd2p-48)
+A(0x1.9600000000000p-1, 0x1.db13db0d49000p-3, -0x1.aff2af715b035p-45)
+A(0x1.9400000000000p-1, 0x1.e530effe71000p-3, 0x1.212276041f430p-51)
+A(0x1.9200000000000p-1, 0x1.ef5ade4dd0000p-3, -0x1.a211565bb8e11p-51)
+A(0x1.9000000000000p-1, 0x1.f991c6cb3b000p-3, 0x1.bcbecca0cdf30p-46)
+A(0x1.8c00000000000p-1, 0x1.07138604d5800p-2, 0x1.89cdb16ed4e91p-48)
+A(0x1.8a00000000000p-1, 0x1.0c42d67616000p-2, 0x1.7188b163ceae9p-45)
+A(0x1.8800000000000p-1, 0x1.1178e8227e800p-2, -0x1.c210e63a5f01cp-45)
+A(0x1.8600000000000p-1, 0x1.16b5ccbacf800p-2, 0x1.b9acdf7a51681p-45)
+A(0x1.8400000000000p-1, 0x1.1bf99635a6800p-2, 0x1.ca6ed5147bdb7p-45)
+A(0x1.8200000000000p-1, 0x1.214456d0eb800p-2, 0x1.a87deba46baeap-47)
+A(0x1.7e00000000000p-1, 0x1.2bef07cdc9000p-2, 0x1.a9cfa4a5004f4p-45)
+A(0x1.7c00000000000p-1, 0x1.314f1e1d36000p-2, -0x1.8e27ad3213cb8p-45)
+A(0x1.7a00000000000p-1, 0x1.36b6776be1000p-2, 0x1.16ecdb0f177c8p-46)
+A(0x1.7800000000000p-1, 0x1.3c25277333000p-2, 0x1.83b54b606bd5cp-46)
+A(0x1.7600000000000p-1, 0x1.419b423d5e800p-2, 0x1.8e436ec90e09dp-47)
+A(0x1.7400000000000p-1, 0x1.4718dc271c800p-2, -0x1.f27ce0967d675p-45)
+A(0x1.7200000000000p-1, 0x1.4c9e09e173000p-2, -0x1.e20891b0ad8a4p-45)
+A(0x1.7000000000000p-1, 0x1.522ae0738a000p-2, 0x1.ebe708164c759p-45)
+A(0x1.6e00000000000p-1, 0x1.57bf753c8d000p-2, 0x1.fadedee5d40efp-46)
+A(0x1.6c00000000000p-1, 0x1.5d5bddf596000p-2, -0x1.a0b2a08a465dcp-47)
+},
+};
diff --git a/libc-top-half/musl/src/math/pow_data.h b/libc-top-half/musl/src/math/pow_data.h
new file mode 100644
index 0000000..5d609ae
--- /dev/null
+++ b/libc-top-half/musl/src/math/pow_data.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef _POW_DATA_H
+#define _POW_DATA_H
+
+#include <features.h>
+
+#define POW_LOG_TABLE_BITS 7
+#define POW_LOG_POLY_ORDER 8
+extern hidden const struct pow_log_data {
+ double ln2hi;
+ double ln2lo;
+ double poly[POW_LOG_POLY_ORDER - 1]; /* First coefficient is 1. */
+ /* Note: the pad field is unused, but allows slightly faster indexing. */
+ struct {
+ double invc, pad, logc, logctail;
+ } tab[1 << POW_LOG_TABLE_BITS];
+} __pow_log_data;
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc/fabs.c b/libc-top-half/musl/src/math/powerpc/fabs.c
new file mode 100644
index 0000000..9453a3a
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc/fabs.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__) || defined(BROKEN_PPC_D_ASM)
+
+#include "../fabs.c"
+
+#else
+
+double fabs(double x)
+{
+ __asm__ ("fabs %0, %1" : "=d"(x) : "d"(x));
+ return x;
+}
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc/fabsf.c b/libc-top-half/musl/src/math/powerpc/fabsf.c
new file mode 100644
index 0000000..2e9da58
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc/fabsf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
+
+#include "../fabsf.c"
+
+#else
+
+float fabsf(float x)
+{
+ __asm__ ("fabs %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc/fma.c b/libc-top-half/musl/src/math/powerpc/fma.c
new file mode 100644
index 0000000..0eb2ba1
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc/fma.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__) || defined(BROKEN_PPC_D_ASM)
+
+#include "../fma.c"
+
+#else
+
+double fma(double x, double y, double z)
+{
+ __asm__("fmadd %0, %1, %2, %3" : "=d"(x) : "d"(x), "d"(y), "d"(z));
+ return x;
+}
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc/fmaf.c b/libc-top-half/musl/src/math/powerpc/fmaf.c
new file mode 100644
index 0000000..dc1a749
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc/fmaf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
+
+#include "../fmaf.c"
+
+#else
+
+float fmaf(float x, float y, float z)
+{
+ __asm__("fmadds %0, %1, %2, %3" : "=f"(x) : "f"(x), "f"(y), "f"(z));
+ return x;
+}
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc/sqrt.c b/libc-top-half/musl/src/math/powerpc/sqrt.c
new file mode 100644
index 0000000..8718dbd
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc/sqrt.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if !defined _SOFT_FLOAT && defined _ARCH_PPCSQ
+
+double sqrt(double x)
+{
+ __asm__ ("fsqrt %0, %1\n" : "=d" (x) : "d" (x));
+ return x;
+}
+
+#else
+
+#include "../sqrt.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc/sqrtf.c b/libc-top-half/musl/src/math/powerpc/sqrtf.c
new file mode 100644
index 0000000..3431b67
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc/sqrtf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if !defined _SOFT_FLOAT && defined _ARCH_PPCSQ
+
+float sqrtf(float x)
+{
+ __asm__ ("fsqrts %0, %1\n" : "=f" (x) : "f" (x));
+ return x;
+}
+
+#else
+
+#include "../sqrtf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/ceil.c b/libc-top-half/musl/src/math/powerpc64/ceil.c
new file mode 100644
index 0000000..4b01133
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/ceil.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef _ARCH_PWR5X
+
+double ceil(double x)
+{
+ __asm__ ("frip %0, %1" : "=d"(x) : "d"(x));
+ return x;
+}
+
+#else
+
+#include "../ceil.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/ceilf.c b/libc-top-half/musl/src/math/powerpc64/ceilf.c
new file mode 100644
index 0000000..59ba396
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/ceilf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef _ARCH_PWR5X
+
+float ceilf(float x)
+{
+ __asm__ ("frip %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../ceilf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/fabs.c b/libc-top-half/musl/src/math/powerpc64/fabs.c
new file mode 100644
index 0000000..6123c75
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/fabs.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double fabs(double x)
+{
+ __asm__ ("fabs %0, %1" : "=d"(x) : "d"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/powerpc64/fabsf.c b/libc-top-half/musl/src/math/powerpc64/fabsf.c
new file mode 100644
index 0000000..e9e4564
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/fabsf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float fabsf(float x)
+{
+ __asm__ ("fabs %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/powerpc64/floor.c b/libc-top-half/musl/src/math/powerpc64/floor.c
new file mode 100644
index 0000000..4e68044
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/floor.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef _ARCH_PWR5X
+
+double floor(double x)
+{
+ __asm__ ("frim %0, %1" : "=d"(x) : "d"(x));
+ return x;
+}
+
+#else
+
+#include "../floor.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/floorf.c b/libc-top-half/musl/src/math/powerpc64/floorf.c
new file mode 100644
index 0000000..e1031ef
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/floorf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef _ARCH_PWR5X
+
+float floorf(float x)
+{
+ __asm__ ("frim %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../floorf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/fma.c b/libc-top-half/musl/src/math/powerpc64/fma.c
new file mode 100644
index 0000000..5aebd1a
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/fma.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double fma(double x, double y, double z)
+{
+ __asm__ ("fmadd %0, %1, %2, %3" : "=d"(x) : "d"(x), "d"(y), "d"(z));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/powerpc64/fmaf.c b/libc-top-half/musl/src/math/powerpc64/fmaf.c
new file mode 100644
index 0000000..c678fef
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/fmaf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float fmaf(float x, float y, float z)
+{
+ __asm__ ("fmadds %0, %1, %2, %3" : "=f"(x) : "f"(x), "f"(y), "f"(z));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/powerpc64/fmax.c b/libc-top-half/musl/src/math/powerpc64/fmax.c
new file mode 100644
index 0000000..992df7f
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/fmax.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef __VSX__
+
+double fmax(double x, double y)
+{
+ __asm__ ("xsmaxdp %x0, %x1, %x2" : "=ws"(x) : "ws"(x), "ws"(y));
+ return x;
+}
+
+#else
+
+#include "../fmax.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/fmaxf.c b/libc-top-half/musl/src/math/powerpc64/fmaxf.c
new file mode 100644
index 0000000..345a234
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/fmaxf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef __VSX__
+
+float fmaxf(float x, float y)
+{
+ __asm__ ("xsmaxdp %x0, %x1, %x2" : "=ww"(x) : "ww"(x), "ww"(y));
+ return x;
+}
+
+#else
+
+#include "../fmaxf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/fmin.c b/libc-top-half/musl/src/math/powerpc64/fmin.c
new file mode 100644
index 0000000..adf71ba
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/fmin.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef __VSX__
+
+double fmin(double x, double y)
+{
+ __asm__ ("xsmindp %x0, %x1, %x2" : "=ws"(x) : "ws"(x), "ws"(y));
+ return x;
+}
+
+#else
+
+#include "../fmin.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/fminf.c b/libc-top-half/musl/src/math/powerpc64/fminf.c
new file mode 100644
index 0000000..faf0e47
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/fminf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef __VSX__
+
+float fminf(float x, float y)
+{
+ __asm__ ("xsmindp %x0, %x1, %x2" : "=ww"(x) : "ww"(x), "ww"(y));
+ return x;
+}
+
+#else
+
+#include "../fminf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/lrint.c b/libc-top-half/musl/src/math/powerpc64/lrint.c
new file mode 100644
index 0000000..4e4b2e0
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/lrint.c
@@ -0,0 +1,16 @@
+#include <math.h>
+
+#ifdef _ARCH_PWR5X
+
+long lrint(double x)
+{
+ long n;
+ __asm__ ("fctid %0, %1" : "=d"(n) : "d"(x));
+ return n;
+}
+
+#else
+
+#include "../lrint.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/lrintf.c b/libc-top-half/musl/src/math/powerpc64/lrintf.c
new file mode 100644
index 0000000..9070fc0
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/lrintf.c
@@ -0,0 +1,16 @@
+#include <math.h>
+
+#ifdef _ARCH_PWR5X
+
+long lrintf(float x)
+{
+ long n;
+ __asm__ ("fctid %0, %1" : "=d"(n) : "f"(x));
+ return n;
+}
+
+#else
+
+#include "../lrintf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/lround.c b/libc-top-half/musl/src/math/powerpc64/lround.c
new file mode 100644
index 0000000..ee4d114
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/lround.c
@@ -0,0 +1,18 @@
+#include <math.h>
+
+#ifdef __VSX__
+
+long lround(double x)
+{
+ long n;
+ __asm__ (
+ "xsrdpi %1, %1\n"
+ "fctid %0, %1\n" : "=d"(n), "+d"(x));
+ return n;
+}
+
+#else
+
+#include "../lround.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/lroundf.c b/libc-top-half/musl/src/math/powerpc64/lroundf.c
new file mode 100644
index 0000000..033094f
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/lroundf.c
@@ -0,0 +1,18 @@
+#include <math.h>
+
+#ifdef __VSX__
+
+long lroundf(float x)
+{
+ long n;
+ __asm__ (
+ "xsrdpi %1, %1\n"
+ "fctid %0, %1\n" : "=d"(n), "+f"(x));
+ return n;
+}
+
+#else
+
+#include "../lroundf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/round.c b/libc-top-half/musl/src/math/powerpc64/round.c
new file mode 100644
index 0000000..4b9318e
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/round.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef _ARCH_PWR5X
+
+double round(double x)
+{
+ __asm__ ("frin %0, %1" : "=d"(x) : "d"(x));
+ return x;
+}
+
+#else
+
+#include "../round.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/roundf.c b/libc-top-half/musl/src/math/powerpc64/roundf.c
new file mode 100644
index 0000000..ae93f99
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/roundf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef _ARCH_PWR5X
+
+float roundf(float x)
+{
+ __asm__ ("frin %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../roundf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/sqrt.c b/libc-top-half/musl/src/math/powerpc64/sqrt.c
new file mode 100644
index 0000000..13bb98d
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/sqrt.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double sqrt(double x)
+{
+ __asm__ ("fsqrt %0, %1" : "=d"(x) : "d"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/powerpc64/sqrtf.c b/libc-top-half/musl/src/math/powerpc64/sqrtf.c
new file mode 100644
index 0000000..b6ecb10
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/sqrtf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float sqrtf(float x)
+{
+ __asm__ ("fsqrts %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/powerpc64/trunc.c b/libc-top-half/musl/src/math/powerpc64/trunc.c
new file mode 100644
index 0000000..5791854
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/trunc.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef _ARCH_PWR5X
+
+double trunc(double x)
+{
+ __asm__ ("friz %0, %1" : "=d"(x) : "d"(x));
+ return x;
+}
+
+#else
+
+#include "../trunc.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powerpc64/truncf.c b/libc-top-half/musl/src/math/powerpc64/truncf.c
new file mode 100644
index 0000000..94e638f
--- /dev/null
+++ b/libc-top-half/musl/src/math/powerpc64/truncf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#ifdef _ARCH_PWR5X
+
+float truncf(float x)
+{
+ __asm__ ("friz %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../truncf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/powf.c b/libc-top-half/musl/src/math/powf.c
new file mode 100644
index 0000000..de8fab5
--- /dev/null
+++ b/libc-top-half/musl/src/math/powf.c
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2017-2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <math.h>
+#include <stdint.h>
+#include "libm.h"
+#include "exp2f_data.h"
+#include "powf_data.h"
+
+/*
+POWF_LOG2_POLY_ORDER = 5
+EXP2F_TABLE_BITS = 5
+
+ULP error: 0.82 (~ 0.5 + relerr*2^24)
+relerr: 1.27 * 2^-26 (Relative error ~= 128*Ln2*relerr_log2 + relerr_exp2)
+relerr_log2: 1.83 * 2^-33 (Relative error of logx.)
+relerr_exp2: 1.69 * 2^-34 (Relative error of exp2(ylogx).)
+*/
+
+#define N (1 << POWF_LOG2_TABLE_BITS)
+#define T __powf_log2_data.tab
+#define A __powf_log2_data.poly
+#define OFF 0x3f330000
+
+/* Subnormal input is normalized so ix has negative biased exponent.
+ Output is multiplied by N (POWF_SCALE) if TOINT_INTRINICS is set. */
+static inline double_t log2_inline(uint32_t ix)
+{
+ double_t z, r, r2, r4, p, q, y, y0, invc, logc;
+ uint32_t iz, top, tmp;
+ int k, i;
+
+ /* x = 2^k z; where z is in range [OFF,2*OFF] and exact.
+ The range is split into N subintervals.
+ The ith subinterval contains z and c is near its center. */
+ tmp = ix - OFF;
+ i = (tmp >> (23 - POWF_LOG2_TABLE_BITS)) % N;
+ top = tmp & 0xff800000;
+ iz = ix - top;
+ k = (int32_t)top >> (23 - POWF_SCALE_BITS); /* arithmetic shift */
+ invc = T[i].invc;
+ logc = T[i].logc;
+ z = (double_t)asfloat(iz);
+
+ /* log2(x) = log1p(z/c-1)/ln2 + log2(c) + k */
+ r = z * invc - 1;
+ y0 = logc + (double_t)k;
+
+ /* Pipelined polynomial evaluation to approximate log1p(r)/ln2. */
+ r2 = r * r;
+ y = A[0] * r + A[1];
+ p = A[2] * r + A[3];
+ r4 = r2 * r2;
+ q = A[4] * r + y0;
+ q = p * r2 + q;
+ y = y * r4 + q;
+ return y;
+}
+
+#undef N
+#undef T
+#define N (1 << EXP2F_TABLE_BITS)
+#define T __exp2f_data.tab
+#define SIGN_BIAS (1 << (EXP2F_TABLE_BITS + 11))
+
+/* The output of log2 and thus the input of exp2 is either scaled by N
+ (in case of fast toint intrinsics) or not. The unscaled xd must be
+ in [-1021,1023], sign_bias sets the sign of the result. */
+static inline float exp2_inline(double_t xd, uint32_t sign_bias)
+{
+ uint64_t ki, ski, t;
+ double_t kd, z, r, r2, y, s;
+
+#if TOINT_INTRINSICS
+#define C __exp2f_data.poly_scaled
+ /* N*x = k + r with r in [-1/2, 1/2] */
+ kd = roundtoint(xd); /* k */
+ ki = converttoint(xd);
+#else
+#define C __exp2f_data.poly
+#define SHIFT __exp2f_data.shift_scaled
+ /* x = k/N + r with r in [-1/(2N), 1/(2N)] */
+ kd = eval_as_double(xd + SHIFT);
+ ki = asuint64(kd);
+ kd -= SHIFT; /* k/N */
+#endif
+ r = xd - kd;
+
+ /* exp2(x) = 2^(k/N) * 2^r ~= s * (C0*r^3 + C1*r^2 + C2*r + 1) */
+ t = T[ki % N];
+ ski = ki + sign_bias;
+ t += ski << (52 - EXP2F_TABLE_BITS);
+ s = asdouble(t);
+ z = C[0] * r + C[1];
+ r2 = r * r;
+ y = C[2] * r + 1;
+ y = z * r2 + y;
+ y = y * s;
+ return eval_as_float(y);
+}
+
+/* Returns 0 if not int, 1 if odd int, 2 if even int. The argument is
+ the bit representation of a non-zero finite floating-point value. */
+static inline int checkint(uint32_t iy)
+{
+ int e = iy >> 23 & 0xff;
+ if (e < 0x7f)
+ return 0;
+ if (e > 0x7f + 23)
+ return 2;
+ if (iy & ((1 << (0x7f + 23 - e)) - 1))
+ return 0;
+ if (iy & (1 << (0x7f + 23 - e)))
+ return 1;
+ return 2;
+}
+
+static inline int zeroinfnan(uint32_t ix)
+{
+ return 2 * ix - 1 >= 2u * 0x7f800000 - 1;
+}
+
+float powf(float x, float y)
+{
+ uint32_t sign_bias = 0;
+ uint32_t ix, iy;
+
+ ix = asuint(x);
+ iy = asuint(y);
+ if (predict_false(ix - 0x00800000 >= 0x7f800000 - 0x00800000 ||
+ zeroinfnan(iy))) {
+ /* Either (x < 0x1p-126 or inf or nan) or (y is 0 or inf or nan). */
+ if (predict_false(zeroinfnan(iy))) {
+ if (2 * iy == 0)
+ return issignalingf_inline(x) ? x + y : 1.0f;
+ if (ix == 0x3f800000)
+ return issignalingf_inline(y) ? x + y : 1.0f;
+ if (2 * ix > 2u * 0x7f800000 ||
+ 2 * iy > 2u * 0x7f800000)
+ return x + y;
+ if (2 * ix == 2 * 0x3f800000)
+ return 1.0f;
+ if ((2 * ix < 2 * 0x3f800000) == !(iy & 0x80000000))
+ return 0.0f; /* |x|<1 && y==inf or |x|>1 && y==-inf. */
+ return y * y;
+ }
+ if (predict_false(zeroinfnan(ix))) {
+ float_t x2 = x * x;
+ if (ix & 0x80000000 && checkint(iy) == 1)
+ x2 = -x2;
+ /* Without the barrier some versions of clang hoist the 1/x2 and
+ thus division by zero exception can be signaled spuriously. */
+ return iy & 0x80000000 ? fp_barrierf(1 / x2) : x2;
+ }
+ /* x and y are non-zero finite. */
+ if (ix & 0x80000000) {
+ /* Finite x < 0. */
+ int yint = checkint(iy);
+ if (yint == 0)
+ return __math_invalidf(x);
+ if (yint == 1)
+ sign_bias = SIGN_BIAS;
+ ix &= 0x7fffffff;
+ }
+ if (ix < 0x00800000) {
+ /* Normalize subnormal x so exponent becomes negative. */
+ ix = asuint(x * 0x1p23f);
+ ix &= 0x7fffffff;
+ ix -= 23 << 23;
+ }
+ }
+ double_t logx = log2_inline(ix);
+ double_t ylogx = y * logx; /* cannot overflow, y is single prec. */
+ if (predict_false((asuint64(ylogx) >> 47 & 0xffff) >=
+ asuint64(126.0 * POWF_SCALE) >> 47)) {
+ /* |y*log(x)| >= 126. */
+ if (ylogx > 0x1.fffffffd1d571p+6 * POWF_SCALE)
+ return __math_oflowf(sign_bias);
+ if (ylogx <= -150.0 * POWF_SCALE)
+ return __math_uflowf(sign_bias);
+ }
+ return exp2_inline(ylogx, sign_bias);
+}
diff --git a/libc-top-half/musl/src/math/powf_data.c b/libc-top-half/musl/src/math/powf_data.c
new file mode 100644
index 0000000..13e1d9a
--- /dev/null
+++ b/libc-top-half/musl/src/math/powf_data.c
@@ -0,0 +1,34 @@
+/*
+ * Data definition for powf.
+ *
+ * Copyright (c) 2017-2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "powf_data.h"
+
+const struct powf_log2_data __powf_log2_data = {
+ .tab = {
+ { 0x1.661ec79f8f3bep+0, -0x1.efec65b963019p-2 * POWF_SCALE },
+ { 0x1.571ed4aaf883dp+0, -0x1.b0b6832d4fca4p-2 * POWF_SCALE },
+ { 0x1.49539f0f010bp+0, -0x1.7418b0a1fb77bp-2 * POWF_SCALE },
+ { 0x1.3c995b0b80385p+0, -0x1.39de91a6dcf7bp-2 * POWF_SCALE },
+ { 0x1.30d190c8864a5p+0, -0x1.01d9bf3f2b631p-2 * POWF_SCALE },
+ { 0x1.25e227b0b8eap+0, -0x1.97c1d1b3b7afp-3 * POWF_SCALE },
+ { 0x1.1bb4a4a1a343fp+0, -0x1.2f9e393af3c9fp-3 * POWF_SCALE },
+ { 0x1.12358f08ae5bap+0, -0x1.960cbbf788d5cp-4 * POWF_SCALE },
+ { 0x1.0953f419900a7p+0, -0x1.a6f9db6475fcep-5 * POWF_SCALE },
+ { 0x1p+0, 0x0p+0 * POWF_SCALE },
+ { 0x1.e608cfd9a47acp-1, 0x1.338ca9f24f53dp-4 * POWF_SCALE },
+ { 0x1.ca4b31f026aap-1, 0x1.476a9543891bap-3 * POWF_SCALE },
+ { 0x1.b2036576afce6p-1, 0x1.e840b4ac4e4d2p-3 * POWF_SCALE },
+ { 0x1.9c2d163a1aa2dp-1, 0x1.40645f0c6651cp-2 * POWF_SCALE },
+ { 0x1.886e6037841edp-1, 0x1.88e9c2c1b9ff8p-2 * POWF_SCALE },
+ { 0x1.767dcf5534862p-1, 0x1.ce0a44eb17bccp-2 * POWF_SCALE },
+ },
+ .poly = {
+ 0x1.27616c9496e0bp-2 * POWF_SCALE, -0x1.71969a075c67ap-2 * POWF_SCALE,
+ 0x1.ec70a6ca7baddp-2 * POWF_SCALE, -0x1.7154748bef6c8p-1 * POWF_SCALE,
+ 0x1.71547652ab82bp0 * POWF_SCALE,
+ }
+};
diff --git a/libc-top-half/musl/src/math/powf_data.h b/libc-top-half/musl/src/math/powf_data.h
new file mode 100644
index 0000000..5b136e2
--- /dev/null
+++ b/libc-top-half/musl/src/math/powf_data.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2017-2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef _POWF_DATA_H
+#define _POWF_DATA_H
+
+#include "libm.h"
+#include "exp2f_data.h"
+
+#define POWF_LOG2_TABLE_BITS 4
+#define POWF_LOG2_POLY_ORDER 5
+#if TOINT_INTRINSICS
+#define POWF_SCALE_BITS EXP2F_TABLE_BITS
+#else
+#define POWF_SCALE_BITS 0
+#endif
+#define POWF_SCALE ((double)(1 << POWF_SCALE_BITS))
+extern hidden const struct powf_log2_data {
+ struct {
+ double invc, logc;
+ } tab[1 << POWF_LOG2_TABLE_BITS];
+ double poly[POWF_LOG2_POLY_ORDER];
+} __powf_log2_data;
+
+#endif
diff --git a/libc-top-half/musl/src/math/powl.c b/libc-top-half/musl/src/math/powl.c
new file mode 100644
index 0000000..c8463b7
--- /dev/null
+++ b/libc-top-half/musl/src/math/powl.c
@@ -0,0 +1,526 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_powl.c */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/* powl.c
+ *
+ * Power function, long double precision
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, z, powl();
+ *
+ * z = powl( x, y );
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Computes x raised to the yth power. Analytically,
+ *
+ * x**y = exp( y log(x) ).
+ *
+ * Following Cody and Waite, this program uses a lookup table
+ * of 2**-i/32 and pseudo extended precision arithmetic to
+ * obtain several extra bits of accuracy in both the logarithm
+ * and the exponential.
+ *
+ *
+ * ACCURACY:
+ *
+ * The relative error of pow(x,y) can be estimated
+ * by y dl ln(2), where dl is the absolute error of
+ * the internally computed base 2 logarithm. At the ends
+ * of the approximation interval the logarithm equal 1/32
+ * and its relative error is about 1 lsb = 1.1e-19. Hence
+ * the predicted relative error in the result is 2.3e-21 y .
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ *
+ * IEEE +-1000 40000 2.8e-18 3.7e-19
+ * .001 < x < 1000, with log(x) uniformly distributed.
+ * -1000 < y < 1000, y uniformly distributed.
+ *
+ * IEEE 0,8700 60000 6.5e-18 1.0e-18
+ * 0.99 < x < 1.01, 0 < y < 8700, uniformly distributed.
+ *
+ *
+ * ERROR MESSAGES:
+ *
+ * message condition value returned
+ * pow overflow x**y > MAXNUM INFINITY
+ * pow underflow x**y < 1/MAXNUM 0.0
+ * pow domain x<0 and y noninteger 0.0
+ *
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double powl(long double x, long double y)
+{
+ return pow(x, y);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+
+/* Table size */
+#define NXT 32
+
+/* log(1+x) = x - .5x^2 + x^3 * P(z)/Q(z)
+ * on the domain 2^(-1/32) - 1 <= x <= 2^(1/32) - 1
+ */
+static const long double P[] = {
+ 8.3319510773868690346226E-4L,
+ 4.9000050881978028599627E-1L,
+ 1.7500123722550302671919E0L,
+ 1.4000100839971580279335E0L,
+};
+static const long double Q[] = {
+/* 1.0000000000000000000000E0L,*/
+ 5.2500282295834889175431E0L,
+ 8.4000598057587009834666E0L,
+ 4.2000302519914740834728E0L,
+};
+/* A[i] = 2^(-i/32), rounded to IEEE long double precision.
+ * If i is even, A[i] + B[i/2] gives additional accuracy.
+ */
+static const long double A[33] = {
+ 1.0000000000000000000000E0L,
+ 9.7857206208770013448287E-1L,
+ 9.5760328069857364691013E-1L,
+ 9.3708381705514995065011E-1L,
+ 9.1700404320467123175367E-1L,
+ 8.9735453750155359320742E-1L,
+ 8.7812608018664974155474E-1L,
+ 8.5930964906123895780165E-1L,
+ 8.4089641525371454301892E-1L,
+ 8.2287773907698242225554E-1L,
+ 8.0524516597462715409607E-1L,
+ 7.8799042255394324325455E-1L,
+ 7.7110541270397041179298E-1L,
+ 7.5458221379671136985669E-1L,
+ 7.3841307296974965571198E-1L,
+ 7.2259040348852331001267E-1L,
+ 7.0710678118654752438189E-1L,
+ 6.9195494098191597746178E-1L,
+ 6.7712777346844636413344E-1L,
+ 6.6261832157987064729696E-1L,
+ 6.4841977732550483296079E-1L,
+ 6.3452547859586661129850E-1L,
+ 6.2092890603674202431705E-1L,
+ 6.0762367999023443907803E-1L,
+ 5.9460355750136053334378E-1L,
+ 5.8186242938878875689693E-1L,
+ 5.6939431737834582684856E-1L,
+ 5.5719337129794626814472E-1L,
+ 5.4525386633262882960438E-1L,
+ 5.3357020033841180906486E-1L,
+ 5.2213689121370692017331E-1L,
+ 5.1094857432705833910408E-1L,
+ 5.0000000000000000000000E-1L,
+};
+static const long double B[17] = {
+ 0.0000000000000000000000E0L,
+ 2.6176170809902549338711E-20L,
+-1.0126791927256478897086E-20L,
+ 1.3438228172316276937655E-21L,
+ 1.2207982955417546912101E-20L,
+-6.3084814358060867200133E-21L,
+ 1.3164426894366316434230E-20L,
+-1.8527916071632873716786E-20L,
+ 1.8950325588932570796551E-20L,
+ 1.5564775779538780478155E-20L,
+ 6.0859793637556860974380E-21L,
+-2.0208749253662532228949E-20L,
+ 1.4966292219224761844552E-20L,
+ 3.3540909728056476875639E-21L,
+-8.6987564101742849540743E-22L,
+-1.2327176863327626135542E-20L,
+ 0.0000000000000000000000E0L,
+};
+
+/* 2^x = 1 + x P(x),
+ * on the interval -1/32 <= x <= 0
+ */
+static const long double R[] = {
+ 1.5089970579127659901157E-5L,
+ 1.5402715328927013076125E-4L,
+ 1.3333556028915671091390E-3L,
+ 9.6181291046036762031786E-3L,
+ 5.5504108664798463044015E-2L,
+ 2.4022650695910062854352E-1L,
+ 6.9314718055994530931447E-1L,
+};
+
+#define MEXP (NXT*16384.0L)
+/* The following if denormal numbers are supported, else -MEXP: */
+#define MNEXP (-NXT*(16384.0L+64.0L))
+/* log2(e) - 1 */
+#define LOG2EA 0.44269504088896340735992L
+
+#define F W
+#define Fa Wa
+#define Fb Wb
+#define G W
+#define Ga Wa
+#define Gb u
+#define H W
+#define Ha Wb
+#define Hb Wb
+
+static const long double MAXLOGL = 1.1356523406294143949492E4L;
+static const long double MINLOGL = -1.13994985314888605586758E4L;
+static const long double LOGE2L = 6.9314718055994530941723E-1L;
+static const long double huge = 0x1p10000L;
+/* XXX Prevent gcc from erroneously constant folding this. */
+#ifdef __wasilibc_unmodified_upstream // WASI doesn't need old GCC workarounds
+static const volatile long double twom10000 = 0x1p-10000L;
+#else
+static const long double twom10000 = 0x1p-10000L;
+#endif
+
+static long double reducl(long double);
+static long double powil(long double, int);
+
+long double powl(long double x, long double y)
+{
+ /* double F, Fa, Fb, G, Ga, Gb, H, Ha, Hb */
+ int i, nflg, iyflg, yoddint;
+ long e;
+ volatile long double z=0;
+ long double w=0, W=0, Wa=0, Wb=0, ya=0, yb=0, u=0;
+
+ /* make sure no invalid exception is raised by nan comparision */
+ if (isnan(x)) {
+ if (!isnan(y) && y == 0.0)
+ return 1.0;
+ return x;
+ }
+ if (isnan(y)) {
+ if (x == 1.0)
+ return 1.0;
+ return y;
+ }
+ if (x == 1.0)
+ return 1.0; /* 1**y = 1, even if y is nan */
+ if (x == -1.0 && !isfinite(y))
+ return 1.0; /* -1**inf = 1 */
+ if (y == 0.0)
+ return 1.0; /* x**0 = 1, even if x is nan */
+ if (y == 1.0)
+ return x;
+ if (y >= LDBL_MAX) {
+ if (x > 1.0 || x < -1.0)
+ return INFINITY;
+ if (x != 0.0)
+ return 0.0;
+ }
+ if (y <= -LDBL_MAX) {
+ if (x > 1.0 || x < -1.0)
+ return 0.0;
+ if (x != 0.0 || y == -INFINITY)
+ return INFINITY;
+ }
+ if (x >= LDBL_MAX) {
+ if (y > 0.0)
+ return INFINITY;
+ return 0.0;
+ }
+
+ w = floorl(y);
+
+ /* Set iyflg to 1 if y is an integer. */
+ iyflg = 0;
+ if (w == y)
+ iyflg = 1;
+
+ /* Test for odd integer y. */
+ yoddint = 0;
+ if (iyflg) {
+ ya = fabsl(y);
+ ya = floorl(0.5 * ya);
+ yb = 0.5 * fabsl(w);
+ if( ya != yb )
+ yoddint = 1;
+ }
+
+ if (x <= -LDBL_MAX) {
+ if (y > 0.0) {
+ if (yoddint)
+ return -INFINITY;
+ return INFINITY;
+ }
+ if (y < 0.0) {
+ if (yoddint)
+ return -0.0;
+ return 0.0;
+ }
+ }
+ nflg = 0; /* (x<0)**(odd int) */
+ if (x <= 0.0) {
+ if (x == 0.0) {
+ if (y < 0.0) {
+ if (signbit(x) && yoddint)
+ /* (-0.0)**(-odd int) = -inf, divbyzero */
+ return -1.0/0.0;
+ /* (+-0.0)**(negative) = inf, divbyzero */
+ return 1.0/0.0;
+ }
+ if (signbit(x) && yoddint)
+ return -0.0;
+ return 0.0;
+ }
+ if (iyflg == 0)
+ return (x - x) / (x - x); /* (x<0)**(non-int) is NaN */
+ /* (x<0)**(integer) */
+ if (yoddint)
+ nflg = 1; /* negate result */
+ x = -x;
+ }
+ /* (+integer)**(integer) */
+ if (iyflg && floorl(x) == x && fabsl(y) < 32768.0) {
+ w = powil(x, (int)y);
+ return nflg ? -w : w;
+ }
+
+ /* separate significand from exponent */
+ x = frexpl(x, &i);
+ e = i;
+
+ /* find significand in antilog table A[] */
+ i = 1;
+ if (x <= A[17])
+ i = 17;
+ if (x <= A[i+8])
+ i += 8;
+ if (x <= A[i+4])
+ i += 4;
+ if (x <= A[i+2])
+ i += 2;
+ if (x >= A[1])
+ i = -1;
+ i += 1;
+
+ /* Find (x - A[i])/A[i]
+ * in order to compute log(x/A[i]):
+ *
+ * log(x) = log( a x/a ) = log(a) + log(x/a)
+ *
+ * log(x/a) = log(1+v), v = x/a - 1 = (x-a)/a
+ */
+ x -= A[i];
+ x -= B[i/2];
+ x /= A[i];
+
+ /* rational approximation for log(1+v):
+ *
+ * log(1+v) = v - v**2/2 + v**3 P(v) / Q(v)
+ */
+ z = x*x;
+ w = x * (z * __polevll(x, P, 3) / __p1evll(x, Q, 3));
+ w = w - 0.5*z;
+
+ /* Convert to base 2 logarithm:
+ * multiply by log2(e) = 1 + LOG2EA
+ */
+ z = LOG2EA * w;
+ z += w;
+ z += LOG2EA * x;
+ z += x;
+
+ /* Compute exponent term of the base 2 logarithm. */
+ w = -i;
+ w /= NXT;
+ w += e;
+ /* Now base 2 log of x is w + z. */
+
+ /* Multiply base 2 log by y, in extended precision. */
+
+ /* separate y into large part ya
+ * and small part yb less than 1/NXT
+ */
+ ya = reducl(y);
+ yb = y - ya;
+
+ /* (w+z)(ya+yb)
+ * = w*ya + w*yb + z*y
+ */
+ F = z * y + w * yb;
+ Fa = reducl(F);
+ Fb = F - Fa;
+
+ G = Fa + w * ya;
+ Ga = reducl(G);
+ Gb = G - Ga;
+
+ H = Fb + Gb;
+ Ha = reducl(H);
+ w = (Ga + Ha) * NXT;
+
+ /* Test the power of 2 for overflow */
+ if (w > MEXP)
+ return huge * huge; /* overflow */
+ if (w < MNEXP)
+ return twom10000 * twom10000; /* underflow */
+
+ e = w;
+ Hb = H - Ha;
+
+ if (Hb > 0.0) {
+ e += 1;
+ Hb -= 1.0/NXT; /*0.0625L;*/
+ }
+
+ /* Now the product y * log2(x) = Hb + e/NXT.
+ *
+ * Compute base 2 exponential of Hb,
+ * where -0.0625 <= Hb <= 0.
+ */
+ z = Hb * __polevll(Hb, R, 6); /* z = 2**Hb - 1 */
+
+ /* Express e/NXT as an integer plus a negative number of (1/NXT)ths.
+ * Find lookup table entry for the fractional power of 2.
+ */
+ if (e < 0)
+ i = 0;
+ else
+ i = 1;
+ i = e/NXT + i;
+ e = NXT*i - e;
+ w = A[e];
+ z = w * z; /* 2**-e * ( 1 + (2**Hb-1) ) */
+ z = z + w;
+ z = scalbnl(z, i); /* multiply by integer power of 2 */
+
+ if (nflg)
+ z = -z;
+ return z;
+}
+
+
+/* Find a multiple of 1/NXT that is within 1/NXT of x. */
+static long double reducl(long double x)
+{
+ long double t;
+
+ t = x * NXT;
+ t = floorl(t);
+ t = t / NXT;
+ return t;
+}
+
+/*
+ * Positive real raised to integer power, long double precision
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, powil();
+ * int n;
+ *
+ * y = powil( x, n );
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns argument x>0 raised to the nth power.
+ * The routine efficiently decomposes n as a sum of powers of
+ * two. The desired power is a product of two-to-the-kth
+ * powers of x. Thus to compute the 32767 power of x requires
+ * 28 multiplications instead of 32767 multiplications.
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic x domain n domain # trials peak rms
+ * IEEE .001,1000 -1022,1023 50000 4.3e-17 7.8e-18
+ * IEEE 1,2 -1022,1023 20000 3.9e-17 7.6e-18
+ * IEEE .99,1.01 0,8700 10000 3.6e-16 7.2e-17
+ *
+ * Returns MAXNUM on overflow, zero on underflow.
+ */
+
+static long double powil(long double x, int nn)
+{
+ long double ww, y;
+ long double s;
+ int n, e, sign, lx;
+
+ if (nn == 0)
+ return 1.0;
+
+ if (nn < 0) {
+ sign = -1;
+ n = -nn;
+ } else {
+ sign = 1;
+ n = nn;
+ }
+
+ /* Overflow detection */
+
+ /* Calculate approximate logarithm of answer */
+ s = x;
+ s = frexpl( s, &lx);
+ e = (lx - 1)*n;
+ if ((e == 0) || (e > 64) || (e < -64)) {
+ s = (s - 7.0710678118654752e-1L) / (s + 7.0710678118654752e-1L);
+ s = (2.9142135623730950L * s - 0.5 + lx) * nn * LOGE2L;
+ } else {
+ s = LOGE2L * e;
+ }
+
+ if (s > MAXLOGL)
+ return huge * huge; /* overflow */
+
+ if (s < MINLOGL)
+ return twom10000 * twom10000; /* underflow */
+ /* Handle tiny denormal answer, but with less accuracy
+ * since roundoff error in 1.0/x will be amplified.
+ * The precise demarcation should be the gradual underflow threshold.
+ */
+ if (s < -MAXLOGL+2.0) {
+ x = 1.0/x;
+ sign = -sign;
+ }
+
+ /* First bit of the power */
+ if (n & 1)
+ y = x;
+ else
+ y = 1.0;
+
+ ww = x;
+ n >>= 1;
+ while (n) {
+ ww = ww * ww; /* arg to the 2-to-the-kth power */
+ if (n & 1) /* if that bit is set, then include in product */
+ y *= ww;
+ n >>= 1;
+ }
+
+ if (sign < 0)
+ y = 1.0/y;
+ return y;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double powl(long double x, long double y)
+{
+ return pow(x, y);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/remainder.c b/libc-top-half/musl/src/math/remainder.c
new file mode 100644
index 0000000..612155f
--- /dev/null
+++ b/libc-top-half/musl/src/math/remainder.c
@@ -0,0 +1,9 @@
+#include <math.h>
+
+double remainder(double x, double y)
+{
+ int q;
+ return remquo(x, y, &q);
+}
+
+weak_alias(remainder, drem);
diff --git a/libc-top-half/musl/src/math/remainderf.c b/libc-top-half/musl/src/math/remainderf.c
new file mode 100644
index 0000000..bf1d7b2
--- /dev/null
+++ b/libc-top-half/musl/src/math/remainderf.c
@@ -0,0 +1,9 @@
+#include <math.h>
+
+float remainderf(float x, float y)
+{
+ int q;
+ return remquof(x, y, &q);
+}
+
+weak_alias(remainderf, dremf);
diff --git a/libc-top-half/musl/src/math/remainderl.c b/libc-top-half/musl/src/math/remainderl.c
new file mode 100644
index 0000000..2a13c1d
--- /dev/null
+++ b/libc-top-half/musl/src/math/remainderl.c
@@ -0,0 +1,15 @@
+#include <math.h>
+#include <float.h>
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double remainderl(long double x, long double y)
+{
+ return remainder(x, y);
+}
+#else
+long double remainderl(long double x, long double y)
+{
+ int q;
+ return remquol(x, y, &q);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/remquo.c b/libc-top-half/musl/src/math/remquo.c
new file mode 100644
index 0000000..59d5ad5
--- /dev/null
+++ b/libc-top-half/musl/src/math/remquo.c
@@ -0,0 +1,82 @@
+#include <math.h>
+#include <stdint.h>
+
+double remquo(double x, double y, int *quo)
+{
+ union {double f; uint64_t i;} ux = {x}, uy = {y};
+ int ex = ux.i>>52 & 0x7ff;
+ int ey = uy.i>>52 & 0x7ff;
+ int sx = ux.i>>63;
+ int sy = uy.i>>63;
+ uint32_t q;
+ uint64_t i;
+ uint64_t uxi = ux.i;
+
+ *quo = 0;
+ if (uy.i<<1 == 0 || isnan(y) || ex == 0x7ff)
+ return (x*y)/(x*y);
+ if (ux.i<<1 == 0)
+ return x;
+
+ /* normalize x and y */
+ if (!ex) {
+ for (i = uxi<<12; i>>63 == 0; ex--, i <<= 1);
+ uxi <<= -ex + 1;
+ } else {
+ uxi &= -1ULL >> 12;
+ uxi |= 1ULL << 52;
+ }
+ if (!ey) {
+ for (i = uy.i<<12; i>>63 == 0; ey--, i <<= 1);
+ uy.i <<= -ey + 1;
+ } else {
+ uy.i &= -1ULL >> 12;
+ uy.i |= 1ULL << 52;
+ }
+
+ q = 0;
+ if (ex < ey) {
+ if (ex+1 == ey)
+ goto end;
+ return x;
+ }
+
+ /* x mod y */
+ for (; ex > ey; ex--) {
+ i = uxi - uy.i;
+ if (i >> 63 == 0) {
+ uxi = i;
+ q++;
+ }
+ uxi <<= 1;
+ q <<= 1;
+ }
+ i = uxi - uy.i;
+ if (i >> 63 == 0) {
+ uxi = i;
+ q++;
+ }
+ if (uxi == 0)
+ ex = -60;
+ else
+ for (; uxi>>52 == 0; uxi <<= 1, ex--);
+end:
+ /* scale result and decide between |x| and |x|-|y| */
+ if (ex > 0) {
+ uxi -= 1ULL << 52;
+ uxi |= (uint64_t)ex << 52;
+ } else {
+ uxi >>= -ex + 1;
+ }
+ ux.i = uxi;
+ x = ux.f;
+ if (sy)
+ y = -y;
+ if (ex == ey || (ex+1 == ey && (2*x > y || (2*x == y && q%2)))) {
+ x -= y;
+ q++;
+ }
+ q &= 0x7fffffff;
+ *quo = sx^sy ? -(int)q : (int)q;
+ return sx ? -x : x;
+}
diff --git a/libc-top-half/musl/src/math/remquof.c b/libc-top-half/musl/src/math/remquof.c
new file mode 100644
index 0000000..2f41ff7
--- /dev/null
+++ b/libc-top-half/musl/src/math/remquof.c
@@ -0,0 +1,82 @@
+#include <math.h>
+#include <stdint.h>
+
+float remquof(float x, float y, int *quo)
+{
+ union {float f; uint32_t i;} ux = {x}, uy = {y};
+ int ex = ux.i>>23 & 0xff;
+ int ey = uy.i>>23 & 0xff;
+ int sx = ux.i>>31;
+ int sy = uy.i>>31;
+ uint32_t q;
+ uint32_t i;
+ uint32_t uxi = ux.i;
+
+ *quo = 0;
+ if (uy.i<<1 == 0 || isnan(y) || ex == 0xff)
+ return (x*y)/(x*y);
+ if (ux.i<<1 == 0)
+ return x;
+
+ /* normalize x and y */
+ if (!ex) {
+ for (i = uxi<<9; i>>31 == 0; ex--, i <<= 1);
+ uxi <<= -ex + 1;
+ } else {
+ uxi &= -1U >> 9;
+ uxi |= 1U << 23;
+ }
+ if (!ey) {
+ for (i = uy.i<<9; i>>31 == 0; ey--, i <<= 1);
+ uy.i <<= -ey + 1;
+ } else {
+ uy.i &= -1U >> 9;
+ uy.i |= 1U << 23;
+ }
+
+ q = 0;
+ if (ex < ey) {
+ if (ex+1 == ey)
+ goto end;
+ return x;
+ }
+
+ /* x mod y */
+ for (; ex > ey; ex--) {
+ i = uxi - uy.i;
+ if (i >> 31 == 0) {
+ uxi = i;
+ q++;
+ }
+ uxi <<= 1;
+ q <<= 1;
+ }
+ i = uxi - uy.i;
+ if (i >> 31 == 0) {
+ uxi = i;
+ q++;
+ }
+ if (uxi == 0)
+ ex = -30;
+ else
+ for (; uxi>>23 == 0; uxi <<= 1, ex--);
+end:
+ /* scale result and decide between |x| and |x|-|y| */
+ if (ex > 0) {
+ uxi -= 1U << 23;
+ uxi |= (uint32_t)ex << 23;
+ } else {
+ uxi >>= -ex + 1;
+ }
+ ux.i = uxi;
+ x = ux.f;
+ if (sy)
+ y = -y;
+ if (ex == ey || (ex+1 == ey && (2*x > y || (2*x == y && q%2)))) {
+ x -= y;
+ q++;
+ }
+ q &= 0x7fffffff;
+ *quo = sx^sy ? -(int)q : (int)q;
+ return sx ? -x : x;
+}
diff --git a/libc-top-half/musl/src/math/remquol.c b/libc-top-half/musl/src/math/remquol.c
new file mode 100644
index 0000000..9b065c0
--- /dev/null
+++ b/libc-top-half/musl/src/math/remquol.c
@@ -0,0 +1,124 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double remquol(long double x, long double y, int *quo)
+{
+ return remquo(x, y, quo);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+long double remquol(long double x, long double y, int *quo)
+{
+ union ldshape ux = {x}, uy = {y};
+ int ex = ux.i.se & 0x7fff;
+ int ey = uy.i.se & 0x7fff;
+ int sx = ux.i.se >> 15;
+ int sy = uy.i.se >> 15;
+ uint32_t q;
+
+ *quo = 0;
+ if (y == 0 || isnan(y) || ex == 0x7fff)
+ return (x*y)/(x*y);
+ if (x == 0)
+ return x;
+
+ /* normalize x and y */
+ if (!ex) {
+ ux.i.se = ex;
+ ux.f *= 0x1p120f;
+ ex = ux.i.se - 120;
+ }
+ if (!ey) {
+ uy.i.se = ey;
+ uy.f *= 0x1p120f;
+ ey = uy.i.se - 120;
+ }
+
+ q = 0;
+ if (ex >= ey) {
+ /* x mod y */
+#if LDBL_MANT_DIG == 64
+ uint64_t i, mx, my;
+ mx = ux.i.m;
+ my = uy.i.m;
+ for (; ex > ey; ex--) {
+ i = mx - my;
+ if (mx >= my) {
+ mx = 2*i;
+ q++;
+ q <<= 1;
+ } else if (2*mx < mx) {
+ mx = 2*mx - my;
+ q <<= 1;
+ q++;
+ } else {
+ mx = 2*mx;
+ q <<= 1;
+ }
+ }
+ i = mx - my;
+ if (mx >= my) {
+ mx = i;
+ q++;
+ }
+ if (mx == 0)
+ ex = -120;
+ else
+ for (; mx >> 63 == 0; mx *= 2, ex--);
+ ux.i.m = mx;
+#elif LDBL_MANT_DIG == 113
+ uint64_t hi, lo, xhi, xlo, yhi, ylo;
+ xhi = (ux.i2.hi & -1ULL>>16) | 1ULL<<48;
+ yhi = (uy.i2.hi & -1ULL>>16) | 1ULL<<48;
+ xlo = ux.i2.lo;
+ ylo = ux.i2.lo;
+ for (; ex > ey; ex--) {
+ hi = xhi - yhi;
+ lo = xlo - ylo;
+ if (xlo < ylo)
+ hi -= 1;
+ if (hi >> 63 == 0) {
+ xhi = 2*hi + (lo>>63);
+ xlo = 2*lo;
+ q++;
+ } else {
+ xhi = 2*xhi + (xlo>>63);
+ xlo = 2*xlo;
+ }
+ q <<= 1;
+ }
+ hi = xhi - yhi;
+ lo = xlo - ylo;
+ if (xlo < ylo)
+ hi -= 1;
+ if (hi >> 63 == 0) {
+ xhi = hi;
+ xlo = lo;
+ q++;
+ }
+ if ((xhi|xlo) == 0)
+ ex = -120;
+ else
+ for (; xhi >> 48 == 0; xhi = 2*xhi + (xlo>>63), xlo = 2*xlo, ex--);
+ ux.i2.hi = xhi;
+ ux.i2.lo = xlo;
+#endif
+ }
+
+ /* scale result and decide between |x| and |x|-|y| */
+ if (ex <= 0) {
+ ux.i.se = ex + 120;
+ ux.f *= 0x1p-120f;
+ } else
+ ux.i.se = ex;
+ x = ux.f;
+ if (sy)
+ y = -y;
+ if (ex == ey || (ex+1 == ey && (2*x > y || (2*x == y && q%2)))) {
+ x -= y;
+ q++;
+ }
+ q &= 0x7fffffff;
+ *quo = sx^sy ? -(int)q : (int)q;
+ return sx ? -x : x;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/rint.c b/libc-top-half/musl/src/math/rint.c
new file mode 100644
index 0000000..fbba390
--- /dev/null
+++ b/libc-top-half/musl/src/math/rint.c
@@ -0,0 +1,28 @@
+#include <float.h>
+#include <math.h>
+#include <stdint.h>
+
+#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1
+#define EPS DBL_EPSILON
+#elif FLT_EVAL_METHOD==2
+#define EPS LDBL_EPSILON
+#endif
+static const double_t toint = 1/EPS;
+
+double rint(double x)
+{
+ union {double f; uint64_t i;} u = {x};
+ int e = u.i>>52 & 0x7ff;
+ int s = u.i>>63;
+ double_t y;
+
+ if (e >= 0x3ff+52)
+ return x;
+ if (s)
+ y = x - toint + toint;
+ else
+ y = x + toint - toint;
+ if (y == 0)
+ return s ? -0.0 : 0;
+ return y;
+}
diff --git a/libc-top-half/musl/src/math/rintf.c b/libc-top-half/musl/src/math/rintf.c
new file mode 100644
index 0000000..9047688
--- /dev/null
+++ b/libc-top-half/musl/src/math/rintf.c
@@ -0,0 +1,30 @@
+#include <float.h>
+#include <math.h>
+#include <stdint.h>
+
+#if FLT_EVAL_METHOD==0
+#define EPS FLT_EPSILON
+#elif FLT_EVAL_METHOD==1
+#define EPS DBL_EPSILON
+#elif FLT_EVAL_METHOD==2
+#define EPS LDBL_EPSILON
+#endif
+static const float_t toint = 1/EPS;
+
+float rintf(float x)
+{
+ union {float f; uint32_t i;} u = {x};
+ int e = u.i>>23 & 0xff;
+ int s = u.i>>31;
+ float_t y;
+
+ if (e >= 0x7f+23)
+ return x;
+ if (s)
+ y = x - toint + toint;
+ else
+ y = x + toint - toint;
+ if (y == 0)
+ return s ? -0.0f : 0.0f;
+ return y;
+}
diff --git a/libc-top-half/musl/src/math/rintl.c b/libc-top-half/musl/src/math/rintl.c
new file mode 100644
index 0000000..374327d
--- /dev/null
+++ b/libc-top-half/musl/src/math/rintl.c
@@ -0,0 +1,29 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double rintl(long double x)
+{
+ return rint(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+
+static const long double toint = 1/LDBL_EPSILON;
+
+long double rintl(long double x)
+{
+ union ldshape u = {x};
+ int e = u.i.se & 0x7fff;
+ int s = u.i.se >> 15;
+ long double y;
+
+ if (e >= 0x3fff+LDBL_MANT_DIG-1)
+ return x;
+ if (s)
+ y = x - toint + toint;
+ else
+ y = x + toint - toint;
+ if (y == 0)
+ return 0*x;
+ return y;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/riscv64/copysign.c b/libc-top-half/musl/src/math/riscv64/copysign.c
new file mode 100644
index 0000000..c785417
--- /dev/null
+++ b/libc-top-half/musl/src/math/riscv64/copysign.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __riscv_flen >= 64
+
+double copysign(double x, double y)
+{
+ __asm__ ("fsgnj.d %0, %1, %2" : "=f"(x) : "f"(x), "f"(y));
+ return x;
+}
+
+#else
+
+#include "../copysign.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/riscv64/copysignf.c b/libc-top-half/musl/src/math/riscv64/copysignf.c
new file mode 100644
index 0000000..a125611
--- /dev/null
+++ b/libc-top-half/musl/src/math/riscv64/copysignf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __riscv_flen >= 32
+
+float copysignf(float x, float y)
+{
+ __asm__ ("fsgnj.s %0, %1, %2" : "=f"(x) : "f"(x), "f"(y));
+ return x;
+}
+
+#else
+
+#include "../copysignf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/riscv64/fabs.c b/libc-top-half/musl/src/math/riscv64/fabs.c
new file mode 100644
index 0000000..5290b6f
--- /dev/null
+++ b/libc-top-half/musl/src/math/riscv64/fabs.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __riscv_flen >= 64
+
+double fabs(double x)
+{
+ __asm__ ("fabs.d %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../fabs.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/riscv64/fabsf.c b/libc-top-half/musl/src/math/riscv64/fabsf.c
new file mode 100644
index 0000000..f5032e3
--- /dev/null
+++ b/libc-top-half/musl/src/math/riscv64/fabsf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __riscv_flen >= 32
+
+float fabsf(float x)
+{
+ __asm__ ("fabs.s %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../fabsf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/riscv64/fma.c b/libc-top-half/musl/src/math/riscv64/fma.c
new file mode 100644
index 0000000..99b0571
--- /dev/null
+++ b/libc-top-half/musl/src/math/riscv64/fma.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __riscv_flen >= 64
+
+double fma(double x, double y, double z)
+{
+ __asm__ ("fmadd.d %0, %1, %2, %3" : "=f"(x) : "f"(x), "f"(y), "f"(z));
+ return x;
+}
+
+#else
+
+#include "../fma.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/riscv64/fmaf.c b/libc-top-half/musl/src/math/riscv64/fmaf.c
new file mode 100644
index 0000000..f9dc47e
--- /dev/null
+++ b/libc-top-half/musl/src/math/riscv64/fmaf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __riscv_flen >= 32
+
+float fmaf(float x, float y, float z)
+{
+ __asm__ ("fmadd.s %0, %1, %2, %3" : "=f"(x) : "f"(x), "f"(y), "f"(z));
+ return x;
+}
+
+#else
+
+#include "../fmaf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/riscv64/fmax.c b/libc-top-half/musl/src/math/riscv64/fmax.c
new file mode 100644
index 0000000..023709c
--- /dev/null
+++ b/libc-top-half/musl/src/math/riscv64/fmax.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __riscv_flen >= 64
+
+double fmax(double x, double y)
+{
+ __asm__ ("fmax.d %0, %1, %2" : "=f"(x) : "f"(x), "f"(y));
+ return x;
+}
+
+#else
+
+#include "../fmax.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/riscv64/fmaxf.c b/libc-top-half/musl/src/math/riscv64/fmaxf.c
new file mode 100644
index 0000000..863d2bd
--- /dev/null
+++ b/libc-top-half/musl/src/math/riscv64/fmaxf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __riscv_flen >= 32
+
+float fmaxf(float x, float y)
+{
+ __asm__ ("fmax.s %0, %1, %2" : "=f"(x) : "f"(x), "f"(y));
+ return x;
+}
+
+#else
+
+#include "../fmaxf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/riscv64/fmin.c b/libc-top-half/musl/src/math/riscv64/fmin.c
new file mode 100644
index 0000000..a4e3b06
--- /dev/null
+++ b/libc-top-half/musl/src/math/riscv64/fmin.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __riscv_flen >= 64
+
+double fmin(double x, double y)
+{
+ __asm__ ("fmin.d %0, %1, %2" : "=f"(x) : "f"(x), "f"(y));
+ return x;
+}
+
+#else
+
+#include "../fmin.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/riscv64/fminf.c b/libc-top-half/musl/src/math/riscv64/fminf.c
new file mode 100644
index 0000000..32156e8
--- /dev/null
+++ b/libc-top-half/musl/src/math/riscv64/fminf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __riscv_flen >= 32
+
+float fminf(float x, float y)
+{
+ __asm__ ("fmin.s %0, %1, %2" : "=f"(x) : "f"(x), "f"(y));
+ return x;
+}
+
+#else
+
+#include "../fminf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/riscv64/sqrt.c b/libc-top-half/musl/src/math/riscv64/sqrt.c
new file mode 100644
index 0000000..867a504
--- /dev/null
+++ b/libc-top-half/musl/src/math/riscv64/sqrt.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __riscv_flen >= 64
+
+double sqrt(double x)
+{
+ __asm__ ("fsqrt.d %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../sqrt.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/riscv64/sqrtf.c b/libc-top-half/musl/src/math/riscv64/sqrtf.c
new file mode 100644
index 0000000..610c2cf
--- /dev/null
+++ b/libc-top-half/musl/src/math/riscv64/sqrtf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if __riscv_flen >= 32
+
+float sqrtf(float x)
+{
+ __asm__ ("fsqrt.s %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../sqrtf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/round.c b/libc-top-half/musl/src/math/round.c
new file mode 100644
index 0000000..130d58d
--- /dev/null
+++ b/libc-top-half/musl/src/math/round.c
@@ -0,0 +1,35 @@
+#include "libm.h"
+
+#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1
+#define EPS DBL_EPSILON
+#elif FLT_EVAL_METHOD==2
+#define EPS LDBL_EPSILON
+#endif
+static const double_t toint = 1/EPS;
+
+double round(double x)
+{
+ union {double f; uint64_t i;} u = {x};
+ int e = u.i >> 52 & 0x7ff;
+ double_t y;
+
+ if (e >= 0x3ff+52)
+ return x;
+ if (u.i >> 63)
+ x = -x;
+ if (e < 0x3ff-1) {
+ /* raise inexact if x!=0 */
+ FORCE_EVAL(x + toint);
+ return 0*u.f;
+ }
+ y = x + toint - toint - x;
+ if (y > 0.5)
+ y = y + x - 1;
+ else if (y <= -0.5)
+ y = y + x + 1;
+ else
+ y = y + x;
+ if (u.i >> 63)
+ y = -y;
+ return y;
+}
diff --git a/libc-top-half/musl/src/math/roundf.c b/libc-top-half/musl/src/math/roundf.c
new file mode 100644
index 0000000..e8210af
--- /dev/null
+++ b/libc-top-half/musl/src/math/roundf.c
@@ -0,0 +1,36 @@
+#include "libm.h"
+
+#if FLT_EVAL_METHOD==0
+#define EPS FLT_EPSILON
+#elif FLT_EVAL_METHOD==1
+#define EPS DBL_EPSILON
+#elif FLT_EVAL_METHOD==2
+#define EPS LDBL_EPSILON
+#endif
+static const float_t toint = 1/EPS;
+
+float roundf(float x)
+{
+ union {float f; uint32_t i;} u = {x};
+ int e = u.i >> 23 & 0xff;
+ float_t y;
+
+ if (e >= 0x7f+23)
+ return x;
+ if (u.i >> 31)
+ x = -x;
+ if (e < 0x7f-1) {
+ FORCE_EVAL(x + toint);
+ return 0*u.f;
+ }
+ y = x + toint - toint - x;
+ if (y > 0.5f)
+ y = y + x - 1;
+ else if (y <= -0.5f)
+ y = y + x + 1;
+ else
+ y = y + x;
+ if (u.i >> 31)
+ y = -y;
+ return y;
+}
diff --git a/libc-top-half/musl/src/math/roundl.c b/libc-top-half/musl/src/math/roundl.c
new file mode 100644
index 0000000..f4ff682
--- /dev/null
+++ b/libc-top-half/musl/src/math/roundl.c
@@ -0,0 +1,37 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double roundl(long double x)
+{
+ return round(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+
+static const long double toint = 1/LDBL_EPSILON;
+
+long double roundl(long double x)
+{
+ union ldshape u = {x};
+ int e = u.i.se & 0x7fff;
+ long double y;
+
+ if (e >= 0x3fff+LDBL_MANT_DIG-1)
+ return x;
+ if (u.i.se >> 15)
+ x = -x;
+ if (e < 0x3fff-1) {
+ FORCE_EVAL(x + toint);
+ return 0*u.f;
+ }
+ y = x + toint - toint - x;
+ if (y > 0.5)
+ y = y + x - 1;
+ else if (y <= -0.5)
+ y = y + x + 1;
+ else
+ y = y + x;
+ if (u.i.se >> 15)
+ y = -y;
+ return y;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/ceil.c b/libc-top-half/musl/src/math/s390x/ceil.c
new file mode 100644
index 0000000..aee17df
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/ceil.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+double ceil(double x)
+{
+ __asm__ ("fidbra %0, 6, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../ceil.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/ceilf.c b/libc-top-half/musl/src/math/s390x/ceilf.c
new file mode 100644
index 0000000..29ba8d4
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/ceilf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+float ceilf(float x)
+{
+ __asm__ ("fiebra %0, 6, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../ceilf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/ceill.c b/libc-top-half/musl/src/math/s390x/ceill.c
new file mode 100644
index 0000000..b838dc1
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/ceill.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+long double ceill(long double x)
+{
+ __asm__ ("fixbra %0, 6, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../ceill.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/fabs.c b/libc-top-half/musl/src/math/s390x/fabs.c
new file mode 100644
index 0000000..9bb51cb
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/fabs.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+double fabs(double x)
+{
+ __asm__ ("lpdbr %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../fabs.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/fabsf.c b/libc-top-half/musl/src/math/s390x/fabsf.c
new file mode 100644
index 0000000..9fd96bc
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/fabsf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+float fabsf(float x)
+{
+ __asm__ ("lpebr %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../fabsf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/fabsl.c b/libc-top-half/musl/src/math/s390x/fabsl.c
new file mode 100644
index 0000000..65f1005
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/fabsl.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+long double fabsl(long double x)
+{
+ __asm__ ("lpxbr %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../fabsl.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/floor.c b/libc-top-half/musl/src/math/s390x/floor.c
new file mode 100644
index 0000000..4c0c7f1
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/floor.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+double floor(double x)
+{
+ __asm__ ("fidbra %0, 7, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../floor.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/floorf.c b/libc-top-half/musl/src/math/s390x/floorf.c
new file mode 100644
index 0000000..ea28ec7
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/floorf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+float floorf(float x)
+{
+ __asm__ ("fiebra %0, 7, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../floorf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/floorl.c b/libc-top-half/musl/src/math/s390x/floorl.c
new file mode 100644
index 0000000..8a0e16a
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/floorl.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+long double floorl(long double x)
+{
+ __asm__ ("fixbra %0, 7, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../floorl.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/fma.c b/libc-top-half/musl/src/math/s390x/fma.c
new file mode 100644
index 0000000..86da0e4
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/fma.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double fma(double x, double y, double z)
+{
+ __asm__ ("madbr %0, %1, %2" : "+f"(z) : "f"(x), "f"(y));
+ return z;
+}
diff --git a/libc-top-half/musl/src/math/s390x/fmaf.c b/libc-top-half/musl/src/math/s390x/fmaf.c
new file mode 100644
index 0000000..f1aec6a
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/fmaf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float fmaf(float x, float y, float z)
+{
+ __asm__ ("maebr %0, %1, %2" : "+f"(z) : "f"(x), "f"(y));
+ return z;
+}
diff --git a/libc-top-half/musl/src/math/s390x/nearbyint.c b/libc-top-half/musl/src/math/s390x/nearbyint.c
new file mode 100644
index 0000000..b70da52
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/nearbyint.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+double nearbyint(double x)
+{
+ __asm__ ("fidbra %0, 0, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../nearbyint.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/nearbyintf.c b/libc-top-half/musl/src/math/s390x/nearbyintf.c
new file mode 100644
index 0000000..704f267
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/nearbyintf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+float nearbyintf(float x)
+{
+ __asm__ ("fiebra %0, 0, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../nearbyintf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/nearbyintl.c b/libc-top-half/musl/src/math/s390x/nearbyintl.c
new file mode 100644
index 0000000..b4bd552
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/nearbyintl.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+long double nearbyintl(long double x)
+{
+ __asm__ ("fixbra %0, 0, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../nearbyintl.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/rint.c b/libc-top-half/musl/src/math/s390x/rint.c
new file mode 100644
index 0000000..b02f09e
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/rint.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+double rint(double x)
+{
+ __asm__ ("fidbr %0, 0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../rint.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/rintf.c b/libc-top-half/musl/src/math/s390x/rintf.c
new file mode 100644
index 0000000..c9f1313
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/rintf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+float rintf(float x)
+{
+ __asm__ ("fiebr %0, 0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../rintf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/rintl.c b/libc-top-half/musl/src/math/s390x/rintl.c
new file mode 100644
index 0000000..bae5318
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/rintl.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+long double rintl(long double x)
+{
+ __asm__ ("fixbr %0, 0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../rintl.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/round.c b/libc-top-half/musl/src/math/s390x/round.c
new file mode 100644
index 0000000..71f8025
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/round.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+double round(double x)
+{
+ __asm__ ("fidbra %0, 1, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../round.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/roundf.c b/libc-top-half/musl/src/math/s390x/roundf.c
new file mode 100644
index 0000000..46d2e10
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/roundf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+float roundf(float x)
+{
+ __asm__ ("fiebra %0, 1, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../roundf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/roundl.c b/libc-top-half/musl/src/math/s390x/roundl.c
new file mode 100644
index 0000000..ce644dd
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/roundl.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+long double roundl(long double x)
+{
+ __asm__ ("fixbra %0, 1, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../roundl.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/sqrt.c b/libc-top-half/musl/src/math/s390x/sqrt.c
new file mode 100644
index 0000000..a80dc4a
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/sqrt.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+double sqrt(double x)
+{
+ __asm__ ("sqdbr %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../sqrt.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/sqrtf.c b/libc-top-half/musl/src/math/s390x/sqrtf.c
new file mode 100644
index 0000000..52f57eb
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/sqrtf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+float sqrtf(float x)
+{
+ __asm__ ("sqebr %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../sqrtf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/sqrtl.c b/libc-top-half/musl/src/math/s390x/sqrtl.c
new file mode 100644
index 0000000..5702d54
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/sqrtl.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+long double sqrtl(long double x)
+{
+ __asm__ ("sqxbr %0, %1" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../sqrtl.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/trunc.c b/libc-top-half/musl/src/math/s390x/trunc.c
new file mode 100644
index 0000000..3e5d886
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/trunc.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+double trunc(double x)
+{
+ __asm__ ("fidbra %0, 5, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../trunc.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/truncf.c b/libc-top-half/musl/src/math/s390x/truncf.c
new file mode 100644
index 0000000..9097bac
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/truncf.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+float truncf(float x)
+{
+ __asm__ ("fiebra %0, 5, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../truncf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/s390x/truncl.c b/libc-top-half/musl/src/math/s390x/truncl.c
new file mode 100644
index 0000000..4eb920a
--- /dev/null
+++ b/libc-top-half/musl/src/math/s390x/truncl.c
@@ -0,0 +1,15 @@
+#include <math.h>
+
+#if defined(__HTM__) || __ARCH__ >= 9
+
+long double truncl(long double x)
+{
+ __asm__ ("fixbra %0, 5, %1, 4" : "=f"(x) : "f"(x));
+ return x;
+}
+
+#else
+
+#include "../truncl.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/scalb.c b/libc-top-half/musl/src/math/scalb.c
new file mode 100644
index 0000000..efe69e6
--- /dev/null
+++ b/libc-top-half/musl/src/math/scalb.c
@@ -0,0 +1,35 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_scalb.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/*
+ * scalb(x, fn) is provide for
+ * passing various standard test suite. One
+ * should use scalbn() instead.
+ */
+
+#define _GNU_SOURCE
+#include <math.h>
+
+double scalb(double x, double fn)
+{
+ if (isnan(x) || isnan(fn))
+ return x*fn;
+ if (!isfinite(fn)) {
+ if (fn > 0.0)
+ return x*fn;
+ else
+ return x/(-fn);
+ }
+ if (rint(fn) != fn) return (fn-fn)/(fn-fn);
+ if ( fn > 65000.0) return scalbn(x, 65000);
+ if (-fn > 65000.0) return scalbn(x,-65000);
+ return scalbn(x,(int)fn);
+}
diff --git a/libc-top-half/musl/src/math/scalbf.c b/libc-top-half/musl/src/math/scalbf.c
new file mode 100644
index 0000000..f44ed5b
--- /dev/null
+++ b/libc-top-half/musl/src/math/scalbf.c
@@ -0,0 +1,32 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/e_scalbf.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#define _GNU_SOURCE
+#include <math.h>
+
+float scalbf(float x, float fn)
+{
+ if (isnan(x) || isnan(fn)) return x*fn;
+ if (!isfinite(fn)) {
+ if (fn > 0.0f)
+ return x*fn;
+ else
+ return x/(-fn);
+ }
+ if (rintf(fn) != fn) return (fn-fn)/(fn-fn);
+ if ( fn > 65000.0f) return scalbnf(x, 65000);
+ if (-fn > 65000.0f) return scalbnf(x,-65000);
+ return scalbnf(x,(int)fn);
+}
diff --git a/libc-top-half/musl/src/math/scalbln.c b/libc-top-half/musl/src/math/scalbln.c
new file mode 100644
index 0000000..e6f3f19
--- /dev/null
+++ b/libc-top-half/musl/src/math/scalbln.c
@@ -0,0 +1,11 @@
+#include <limits.h>
+#include <math.h>
+
+double scalbln(double x, long n)
+{
+ if (n > INT_MAX)
+ n = INT_MAX;
+ else if (n < INT_MIN)
+ n = INT_MIN;
+ return scalbn(x, n);
+}
diff --git a/libc-top-half/musl/src/math/scalblnf.c b/libc-top-half/musl/src/math/scalblnf.c
new file mode 100644
index 0000000..d8e8166
--- /dev/null
+++ b/libc-top-half/musl/src/math/scalblnf.c
@@ -0,0 +1,11 @@
+#include <limits.h>
+#include <math.h>
+
+float scalblnf(float x, long n)
+{
+ if (n > INT_MAX)
+ n = INT_MAX;
+ else if (n < INT_MIN)
+ n = INT_MIN;
+ return scalbnf(x, n);
+}
diff --git a/libc-top-half/musl/src/math/scalblnl.c b/libc-top-half/musl/src/math/scalblnl.c
new file mode 100644
index 0000000..854c51c
--- /dev/null
+++ b/libc-top-half/musl/src/math/scalblnl.c
@@ -0,0 +1,19 @@
+#include <limits.h>
+#include <math.h>
+#include <float.h>
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double scalblnl(long double x, long n)
+{
+ return scalbln(x, n);
+}
+#else
+long double scalblnl(long double x, long n)
+{
+ if (n > INT_MAX)
+ n = INT_MAX;
+ else if (n < INT_MIN)
+ n = INT_MIN;
+ return scalbnl(x, n);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/scalbn.c b/libc-top-half/musl/src/math/scalbn.c
new file mode 100644
index 0000000..182f561
--- /dev/null
+++ b/libc-top-half/musl/src/math/scalbn.c
@@ -0,0 +1,33 @@
+#include <math.h>
+#include <stdint.h>
+
+double scalbn(double x, int n)
+{
+ union {double f; uint64_t i;} u;
+ double_t y = x;
+
+ if (n > 1023) {
+ y *= 0x1p1023;
+ n -= 1023;
+ if (n > 1023) {
+ y *= 0x1p1023;
+ n -= 1023;
+ if (n > 1023)
+ n = 1023;
+ }
+ } else if (n < -1022) {
+ /* make sure final n < -53 to avoid double
+ rounding in the subnormal range */
+ y *= 0x1p-1022 * 0x1p53;
+ n += 1022 - 53;
+ if (n < -1022) {
+ y *= 0x1p-1022 * 0x1p53;
+ n += 1022 - 53;
+ if (n < -1022)
+ n = -1022;
+ }
+ }
+ u.i = (uint64_t)(0x3ff+n)<<52;
+ x = y * u.f;
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/scalbnf.c b/libc-top-half/musl/src/math/scalbnf.c
new file mode 100644
index 0000000..a5ad208
--- /dev/null
+++ b/libc-top-half/musl/src/math/scalbnf.c
@@ -0,0 +1,31 @@
+#include <math.h>
+#include <stdint.h>
+
+float scalbnf(float x, int n)
+{
+ union {float f; uint32_t i;} u;
+ float_t y = x;
+
+ if (n > 127) {
+ y *= 0x1p127f;
+ n -= 127;
+ if (n > 127) {
+ y *= 0x1p127f;
+ n -= 127;
+ if (n > 127)
+ n = 127;
+ }
+ } else if (n < -126) {
+ y *= 0x1p-126f * 0x1p24f;
+ n += 126 - 24;
+ if (n < -126) {
+ y *= 0x1p-126f * 0x1p24f;
+ n += 126 - 24;
+ if (n < -126)
+ n = -126;
+ }
+ }
+ u.i = (uint32_t)(0x7f+n)<<23;
+ x = y * u.f;
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/scalbnl.c b/libc-top-half/musl/src/math/scalbnl.c
new file mode 100644
index 0000000..db44dab
--- /dev/null
+++ b/libc-top-half/musl/src/math/scalbnl.c
@@ -0,0 +1,36 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double scalbnl(long double x, int n)
+{
+ return scalbn(x, n);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+long double scalbnl(long double x, int n)
+{
+ union ldshape u;
+
+ if (n > 16383) {
+ x *= 0x1p16383L;
+ n -= 16383;
+ if (n > 16383) {
+ x *= 0x1p16383L;
+ n -= 16383;
+ if (n > 16383)
+ n = 16383;
+ }
+ } else if (n < -16382) {
+ x *= 0x1p-16382L * 0x1p113L;
+ n += 16382 - 113;
+ if (n < -16382) {
+ x *= 0x1p-16382L * 0x1p113L;
+ n += 16382 - 113;
+ if (n < -16382)
+ n = -16382;
+ }
+ }
+ u.f = 1.0;
+ u.i.se = 0x3fff + n;
+ return x * u.f;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/signgam.c b/libc-top-half/musl/src/math/signgam.c
new file mode 100644
index 0000000..ee331b2
--- /dev/null
+++ b/libc-top-half/musl/src/math/signgam.c
@@ -0,0 +1,6 @@
+#include <math.h>
+#include "libm.h"
+
+int __signgam = 0;
+
+weak_alias(__signgam, signgam);
diff --git a/libc-top-half/musl/src/math/significand.c b/libc-top-half/musl/src/math/significand.c
new file mode 100644
index 0000000..40d9aa9
--- /dev/null
+++ b/libc-top-half/musl/src/math/significand.c
@@ -0,0 +1,7 @@
+#define _GNU_SOURCE
+#include <math.h>
+
+double significand(double x)
+{
+ return scalbn(x, -ilogb(x));
+}
diff --git a/libc-top-half/musl/src/math/significandf.c b/libc-top-half/musl/src/math/significandf.c
new file mode 100644
index 0000000..8a697e1
--- /dev/null
+++ b/libc-top-half/musl/src/math/significandf.c
@@ -0,0 +1,7 @@
+#define _GNU_SOURCE
+#include <math.h>
+
+float significandf(float x)
+{
+ return scalbnf(x, -ilogbf(x));
+}
diff --git a/libc-top-half/musl/src/math/sin.c b/libc-top-half/musl/src/math/sin.c
new file mode 100644
index 0000000..055e215
--- /dev/null
+++ b/libc-top-half/musl/src/math/sin.c
@@ -0,0 +1,78 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_sin.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* sin(x)
+ * Return sine function of x.
+ *
+ * kernel function:
+ * __sin ... sine function on [-pi/4,pi/4]
+ * __cos ... cose function on [-pi/4,pi/4]
+ * __rem_pio2 ... argument reduction routine
+ *
+ * Method.
+ * Let S,C and T denote the sin, cos and tan respectively on
+ * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ * in [-pi/4 , +pi/4], and let n = k mod 4.
+ * We have
+ *
+ * n sin(x) cos(x) tan(x)
+ * ----------------------------------------------------------
+ * 0 S C T
+ * 1 C -S -1/T
+ * 2 -S -C T
+ * 3 -C S -1/T
+ * ----------------------------------------------------------
+ *
+ * Special cases:
+ * Let trig be any of sin, cos, or tan.
+ * trig(+-INF) is NaN, with signals;
+ * trig(NaN) is that NaN;
+ *
+ * Accuracy:
+ * TRIG(x) returns trig(x) nearly rounded
+ */
+
+#include "libm.h"
+
+double sin(double x)
+{
+ double y[2];
+ uint32_t ix;
+ unsigned n;
+
+ /* High word of x. */
+ GET_HIGH_WORD(ix, x);
+ ix &= 0x7fffffff;
+
+ /* |x| ~< pi/4 */
+ if (ix <= 0x3fe921fb) {
+ if (ix < 0x3e500000) { /* |x| < 2**-26 */
+ /* raise inexact if x != 0 and underflow if subnormal*/
+ FORCE_EVAL(ix < 0x00100000 ? x/0x1p120f : x+0x1p120f);
+ return x;
+ }
+ return __sin(x, 0.0, 0);
+ }
+
+ /* sin(Inf or NaN) is NaN */
+ if (ix >= 0x7ff00000)
+ return x - x;
+
+ /* argument reduction needed */
+ n = __rem_pio2(x, y);
+ switch (n&3) {
+ case 0: return __sin(y[0], y[1], 1);
+ case 1: return __cos(y[0], y[1]);
+ case 2: return -__sin(y[0], y[1], 1);
+ default:
+ return -__cos(y[0], y[1]);
+ }
+}
diff --git a/libc-top-half/musl/src/math/sincos.c b/libc-top-half/musl/src/math/sincos.c
new file mode 100644
index 0000000..35b2d92
--- /dev/null
+++ b/libc-top-half/musl/src/math/sincos.c
@@ -0,0 +1,69 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_sin.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#define _GNU_SOURCE
+#include "libm.h"
+
+void sincos(double x, double *sin, double *cos)
+{
+ double y[2], s, c;
+ uint32_t ix;
+ unsigned n;
+
+ GET_HIGH_WORD(ix, x);
+ ix &= 0x7fffffff;
+
+ /* |x| ~< pi/4 */
+ if (ix <= 0x3fe921fb) {
+ /* if |x| < 2**-27 * sqrt(2) */
+ if (ix < 0x3e46a09e) {
+ /* raise inexact if x!=0 and underflow if subnormal */
+ FORCE_EVAL(ix < 0x00100000 ? x/0x1p120f : x+0x1p120f);
+ *sin = x;
+ *cos = 1.0;
+ return;
+ }
+ *sin = __sin(x, 0.0, 0);
+ *cos = __cos(x, 0.0);
+ return;
+ }
+
+ /* sincos(Inf or NaN) is NaN */
+ if (ix >= 0x7ff00000) {
+ *sin = *cos = x - x;
+ return;
+ }
+
+ /* argument reduction needed */
+ n = __rem_pio2(x, y);
+ s = __sin(y[0], y[1], 1);
+ c = __cos(y[0], y[1]);
+ switch (n&3) {
+ case 0:
+ *sin = s;
+ *cos = c;
+ break;
+ case 1:
+ *sin = c;
+ *cos = -s;
+ break;
+ case 2:
+ *sin = -s;
+ *cos = -c;
+ break;
+ case 3:
+ default:
+ *sin = -c;
+ *cos = s;
+ break;
+ }
+}
diff --git a/libc-top-half/musl/src/math/sincosf.c b/libc-top-half/musl/src/math/sincosf.c
new file mode 100644
index 0000000..f8ca723
--- /dev/null
+++ b/libc-top-half/musl/src/math/sincosf.c
@@ -0,0 +1,117 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_sinf.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Optimized by Bruce D. Evans.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#define _GNU_SOURCE
+#include "libm.h"
+
+/* Small multiples of pi/2 rounded to double precision. */
+static const double
+s1pio2 = 1*M_PI_2, /* 0x3FF921FB, 0x54442D18 */
+s2pio2 = 2*M_PI_2, /* 0x400921FB, 0x54442D18 */
+s3pio2 = 3*M_PI_2, /* 0x4012D97C, 0x7F3321D2 */
+s4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */
+
+void sincosf(float x, float *sin, float *cos)
+{
+ double y;
+ float_t s, c;
+ uint32_t ix;
+ unsigned n, sign;
+
+ GET_FLOAT_WORD(ix, x);
+ sign = ix >> 31;
+ ix &= 0x7fffffff;
+
+ /* |x| ~<= pi/4 */
+ if (ix <= 0x3f490fda) {
+ /* |x| < 2**-12 */
+ if (ix < 0x39800000) {
+ /* raise inexact if x!=0 and underflow if subnormal */
+ FORCE_EVAL(ix < 0x00100000 ? x/0x1p120f : x+0x1p120f);
+ *sin = x;
+ *cos = 1.0f;
+ return;
+ }
+ *sin = __sindf(x);
+ *cos = __cosdf(x);
+ return;
+ }
+
+ /* |x| ~<= 5*pi/4 */
+ if (ix <= 0x407b53d1) {
+ if (ix <= 0x4016cbe3) { /* |x| ~<= 3pi/4 */
+ if (sign) {
+ *sin = -__cosdf(x + s1pio2);
+ *cos = __sindf(x + s1pio2);
+ } else {
+ *sin = __cosdf(s1pio2 - x);
+ *cos = __sindf(s1pio2 - x);
+ }
+ return;
+ }
+ /* -sin(x+c) is not correct if x+c could be 0: -0 vs +0 */
+ *sin = -__sindf(sign ? x + s2pio2 : x - s2pio2);
+ *cos = -__cosdf(sign ? x + s2pio2 : x - s2pio2);
+ return;
+ }
+
+ /* |x| ~<= 9*pi/4 */
+ if (ix <= 0x40e231d5) {
+ if (ix <= 0x40afeddf) { /* |x| ~<= 7*pi/4 */
+ if (sign) {
+ *sin = __cosdf(x + s3pio2);
+ *cos = -__sindf(x + s3pio2);
+ } else {
+ *sin = -__cosdf(x - s3pio2);
+ *cos = __sindf(x - s3pio2);
+ }
+ return;
+ }
+ *sin = __sindf(sign ? x + s4pio2 : x - s4pio2);
+ *cos = __cosdf(sign ? x + s4pio2 : x - s4pio2);
+ return;
+ }
+
+ /* sin(Inf or NaN) is NaN */
+ if (ix >= 0x7f800000) {
+ *sin = *cos = x - x;
+ return;
+ }
+
+ /* general argument reduction needed */
+ n = __rem_pio2f(x, &y);
+ s = __sindf(y);
+ c = __cosdf(y);
+ switch (n&3) {
+ case 0:
+ *sin = s;
+ *cos = c;
+ break;
+ case 1:
+ *sin = c;
+ *cos = -s;
+ break;
+ case 2:
+ *sin = -s;
+ *cos = -c;
+ break;
+ case 3:
+ default:
+ *sin = -c;
+ *cos = s;
+ break;
+ }
+}
diff --git a/libc-top-half/musl/src/math/sincosl.c b/libc-top-half/musl/src/math/sincosl.c
new file mode 100644
index 0000000..d3ac1c4
--- /dev/null
+++ b/libc-top-half/musl/src/math/sincosl.c
@@ -0,0 +1,60 @@
+#define _GNU_SOURCE
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+void sincosl(long double x, long double *sin, long double *cos)
+{
+ double sind, cosd;
+ sincos(x, &sind, &cosd);
+ *sin = sind;
+ *cos = cosd;
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+void sincosl(long double x, long double *sin, long double *cos)
+{
+ union ldshape u = {x};
+ unsigned n;
+ long double y[2], s, c;
+
+ u.i.se &= 0x7fff;
+ if (u.i.se == 0x7fff) {
+ *sin = *cos = x - x;
+ return;
+ }
+ if (u.f < M_PI_4) {
+ if (u.i.se < 0x3fff - LDBL_MANT_DIG) {
+ /* raise underflow if subnormal */
+ if (u.i.se == 0) FORCE_EVAL(x*0x1p-120f);
+ *sin = x;
+ /* raise inexact if x!=0 */
+ *cos = 1.0 + x;
+ return;
+ }
+ *sin = __sinl(x, 0, 0);
+ *cos = __cosl(x, 0);
+ return;
+ }
+ n = __rem_pio2l(x, y);
+ s = __sinl(y[0], y[1], 1);
+ c = __cosl(y[0], y[1]);
+ switch (n & 3) {
+ case 0:
+ *sin = s;
+ *cos = c;
+ break;
+ case 1:
+ *sin = c;
+ *cos = -s;
+ break;
+ case 2:
+ *sin = -s;
+ *cos = -c;
+ break;
+ case 3:
+ default:
+ *sin = -c;
+ *cos = s;
+ break;
+ }
+}
+#endif
diff --git a/libc-top-half/musl/src/math/sinf.c b/libc-top-half/musl/src/math/sinf.c
new file mode 100644
index 0000000..64e39f5
--- /dev/null
+++ b/libc-top-half/musl/src/math/sinf.c
@@ -0,0 +1,76 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_sinf.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Optimized by Bruce D. Evans.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+/* Small multiples of pi/2 rounded to double precision. */
+static const double
+s1pio2 = 1*M_PI_2, /* 0x3FF921FB, 0x54442D18 */
+s2pio2 = 2*M_PI_2, /* 0x400921FB, 0x54442D18 */
+s3pio2 = 3*M_PI_2, /* 0x4012D97C, 0x7F3321D2 */
+s4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */
+
+float sinf(float x)
+{
+ double y;
+ uint32_t ix;
+ int n, sign;
+
+ GET_FLOAT_WORD(ix, x);
+ sign = ix >> 31;
+ ix &= 0x7fffffff;
+
+ if (ix <= 0x3f490fda) { /* |x| ~<= pi/4 */
+ if (ix < 0x39800000) { /* |x| < 2**-12 */
+ /* raise inexact if x!=0 and underflow if subnormal */
+ FORCE_EVAL(ix < 0x00800000 ? x/0x1p120f : x+0x1p120f);
+ return x;
+ }
+ return __sindf(x);
+ }
+ if (ix <= 0x407b53d1) { /* |x| ~<= 5*pi/4 */
+ if (ix <= 0x4016cbe3) { /* |x| ~<= 3pi/4 */
+ if (sign)
+ return -__cosdf(x + s1pio2);
+ else
+ return __cosdf(x - s1pio2);
+ }
+ return __sindf(sign ? -(x + s2pio2) : -(x - s2pio2));
+ }
+ if (ix <= 0x40e231d5) { /* |x| ~<= 9*pi/4 */
+ if (ix <= 0x40afeddf) { /* |x| ~<= 7*pi/4 */
+ if (sign)
+ return __cosdf(x + s3pio2);
+ else
+ return -__cosdf(x - s3pio2);
+ }
+ return __sindf(sign ? x + s4pio2 : x - s4pio2);
+ }
+
+ /* sin(Inf or NaN) is NaN */
+ if (ix >= 0x7f800000)
+ return x - x;
+
+ /* general argument reduction needed */
+ n = __rem_pio2f(x, &y);
+ switch (n&3) {
+ case 0: return __sindf(y);
+ case 1: return __cosdf(y);
+ case 2: return __sindf(-y);
+ default:
+ return -__cosdf(y);
+ }
+}
diff --git a/libc-top-half/musl/src/math/sinh.c b/libc-top-half/musl/src/math/sinh.c
new file mode 100644
index 0000000..c8dda8d
--- /dev/null
+++ b/libc-top-half/musl/src/math/sinh.c
@@ -0,0 +1,43 @@
+#include "libm.h"
+
+/* sinh(x) = (exp(x) - 1/exp(x))/2
+ * = (exp(x)-1 + (exp(x)-1)/exp(x))/2
+ * = x + x^3/6 + o(x^5)
+ */
+double sinh(double x)
+{
+ union {double f; uint64_t i;} u = {.f = x};
+ uint32_t w;
+ double t, h, absx;
+
+ h = 0.5;
+ if (u.i >> 63)
+ h = -h;
+ /* |x| */
+ u.i &= (uint64_t)-1/2;
+ absx = u.f;
+ w = u.i >> 32;
+
+ /* |x| < log(DBL_MAX) */
+ if (w < 0x40862e42) {
+ t = expm1(absx);
+ if (w < 0x3ff00000) {
+ if (w < 0x3ff00000 - (26<<20))
+ /* note: inexact and underflow are raised by expm1 */
+ /* note: this branch avoids spurious underflow */
+ return x;
+ return h*(2*t - t*t/(t+1));
+ }
+ /* note: |x|>log(0x1p26)+eps could be just h*exp(x) */
+ return h*(t + t/(t+1));
+ }
+
+ /* |x| > log(DBL_MAX) or nan */
+ /* note: the result is stored to handle overflow */
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+ t = __expo2(absx, 2*h);
+#else
+ t = 2*h*__expo2(absx);
+#endif
+ return t;
+}
diff --git a/libc-top-half/musl/src/math/sinhf.c b/libc-top-half/musl/src/math/sinhf.c
new file mode 100644
index 0000000..3ac49e2
--- /dev/null
+++ b/libc-top-half/musl/src/math/sinhf.c
@@ -0,0 +1,35 @@
+#include "libm.h"
+
+float sinhf(float x)
+{
+ union {float f; uint32_t i;} u = {.f = x};
+ uint32_t w;
+ float t, h, absx;
+
+ h = 0.5;
+ if (u.i >> 31)
+ h = -h;
+ /* |x| */
+ u.i &= 0x7fffffff;
+ absx = u.f;
+ w = u.i;
+
+ /* |x| < log(FLT_MAX) */
+ if (w < 0x42b17217) {
+ t = expm1f(absx);
+ if (w < 0x3f800000) {
+ if (w < 0x3f800000 - (12<<23))
+ return x;
+ return h*(2*t - t*t/(t+1));
+ }
+ return h*(t + t/(t+1));
+ }
+
+ /* |x| > logf(FLT_MAX) or nan */
+#ifdef __wasilibc_unmodified_upstream // Wasm doesn't have alternate rounding modes
+ t = __expo2f(absx, 2*h);
+#else
+ t = 2*h*__expo2f(absx);
+#endif
+ return t;
+}
diff --git a/libc-top-half/musl/src/math/sinhl.c b/libc-top-half/musl/src/math/sinhl.c
new file mode 100644
index 0000000..b305d4d
--- /dev/null
+++ b/libc-top-half/musl/src/math/sinhl.c
@@ -0,0 +1,43 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double sinhl(long double x)
+{
+ return sinh(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+long double sinhl(long double x)
+{
+ union ldshape u = {x};
+ unsigned ex = u.i.se & 0x7fff;
+ long double h, t, absx;
+
+ h = 0.5;
+ if (u.i.se & 0x8000)
+ h = -h;
+ /* |x| */
+ u.i.se = ex;
+ absx = u.f;
+
+ /* |x| < log(LDBL_MAX) */
+ if (ex < 0x3fff+13 || (ex == 0x3fff+13 && u.i.m>>32 < 0xb17217f7)) {
+ t = expm1l(absx);
+ if (ex < 0x3fff) {
+ if (ex < 0x3fff-32)
+ return x;
+ return h*(2*t - t*t/(1+t));
+ }
+ return h*(t + t/(t+1));
+ }
+
+ /* |x| > log(LDBL_MAX) or nan */
+ t = expl(0.5*absx);
+ return h*t*t;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double sinhl(long double x)
+{
+ return sinh(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/sinl.c b/libc-top-half/musl/src/math/sinl.c
new file mode 100644
index 0000000..9c0b16e
--- /dev/null
+++ b/libc-top-half/musl/src/math/sinl.c
@@ -0,0 +1,41 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double sinl(long double x)
+{
+ return sin(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+long double sinl(long double x)
+{
+ union ldshape u = {x};
+ unsigned n;
+ long double y[2], hi, lo;
+
+ u.i.se &= 0x7fff;
+ if (u.i.se == 0x7fff)
+ return x - x;
+ if (u.f < M_PI_4) {
+ if (u.i.se < 0x3fff - LDBL_MANT_DIG/2) {
+ /* raise inexact if x!=0 and underflow if subnormal */
+ FORCE_EVAL(u.i.se == 0 ? x*0x1p-120f : x+0x1p120f);
+ return x;
+ }
+ return __sinl(x, 0.0, 0);
+ }
+ n = __rem_pio2l(x, y);
+ hi = y[0];
+ lo = y[1];
+ switch (n & 3) {
+ case 0:
+ return __sinl(hi, lo, 1);
+ case 1:
+ return __cosl(hi, lo);
+ case 2:
+ return -__sinl(hi, lo, 1);
+ case 3:
+ default:
+ return -__cosl(hi, lo);
+ }
+}
+#endif
diff --git a/libc-top-half/musl/src/math/sqrt.c b/libc-top-half/musl/src/math/sqrt.c
new file mode 100644
index 0000000..5ba2655
--- /dev/null
+++ b/libc-top-half/musl/src/math/sqrt.c
@@ -0,0 +1,158 @@
+#include <stdint.h>
+#include <math.h>
+#include "libm.h"
+#include "sqrt_data.h"
+
+#define FENV_SUPPORT 1
+
+/* returns a*b*2^-32 - e, with error 0 <= e < 1. */
+static inline uint32_t mul32(uint32_t a, uint32_t b)
+{
+ return (uint64_t)a*b >> 32;
+}
+
+/* returns a*b*2^-64 - e, with error 0 <= e < 3. */
+static inline uint64_t mul64(uint64_t a, uint64_t b)
+{
+ uint64_t ahi = a>>32;
+ uint64_t alo = a&0xffffffff;
+ uint64_t bhi = b>>32;
+ uint64_t blo = b&0xffffffff;
+ return ahi*bhi + (ahi*blo >> 32) + (alo*bhi >> 32);
+}
+
+double sqrt(double x)
+{
+ uint64_t ix, top, m;
+
+ /* special case handling. */
+ ix = asuint64(x);
+ top = ix >> 52;
+ if (predict_false(top - 0x001 >= 0x7ff - 0x001)) {
+ /* x < 0x1p-1022 or inf or nan. */
+ if (ix * 2 == 0)
+ return x;
+ if (ix == 0x7ff0000000000000)
+ return x;
+ if (ix > 0x7ff0000000000000)
+ return __math_invalid(x);
+ /* x is subnormal, normalize it. */
+ ix = asuint64(x * 0x1p52);
+ top = ix >> 52;
+ top -= 52;
+ }
+
+ /* argument reduction:
+ x = 4^e m; with integer e, and m in [1, 4)
+ m: fixed point representation [2.62]
+ 2^e is the exponent part of the result. */
+ int even = top & 1;
+ m = (ix << 11) | 0x8000000000000000;
+ if (even) m >>= 1;
+ top = (top + 0x3ff) >> 1;
+
+ /* approximate r ~ 1/sqrt(m) and s ~ sqrt(m) when m in [1,4)
+
+ initial estimate:
+ 7bit table lookup (1bit exponent and 6bit significand).
+
+ iterative approximation:
+ using 2 goldschmidt iterations with 32bit int arithmetics
+ and a final iteration with 64bit int arithmetics.
+
+ details:
+
+ the relative error (e = r0 sqrt(m)-1) of a linear estimate
+ (r0 = a m + b) is |e| < 0.085955 ~ 0x1.6p-4 at best,
+ a table lookup is faster and needs one less iteration
+ 6 bit lookup table (128b) gives |e| < 0x1.f9p-8
+ 7 bit lookup table (256b) gives |e| < 0x1.fdp-9
+ for single and double prec 6bit is enough but for quad
+ prec 7bit is needed (or modified iterations). to avoid
+ one more iteration >=13bit table would be needed (16k).
+
+ a newton-raphson iteration for r is
+ w = r*r
+ u = 3 - m*w
+ r = r*u/2
+ can use a goldschmidt iteration for s at the end or
+ s = m*r
+
+ first goldschmidt iteration is
+ s = m*r
+ u = 3 - s*r
+ r = r*u/2
+ s = s*u/2
+ next goldschmidt iteration is
+ u = 3 - s*r
+ r = r*u/2
+ s = s*u/2
+ and at the end r is not computed only s.
+
+ they use the same amount of operations and converge at the
+ same quadratic rate, i.e. if
+ r1 sqrt(m) - 1 = e, then
+ r2 sqrt(m) - 1 = -3/2 e^2 - 1/2 e^3
+ the advantage of goldschmidt is that the mul for s and r
+ are independent (computed in parallel), however it is not
+ "self synchronizing": it only uses the input m in the
+ first iteration so rounding errors accumulate. at the end
+ or when switching to larger precision arithmetics rounding
+ errors dominate so the first iteration should be used.
+
+ the fixed point representations are
+ m: 2.30 r: 0.32, s: 2.30, d: 2.30, u: 2.30, three: 2.30
+ and after switching to 64 bit
+ m: 2.62 r: 0.64, s: 2.62, d: 2.62, u: 2.62, three: 2.62 */
+
+ static const uint64_t three = 0xc0000000;
+ uint64_t r, s, d, u, i;
+
+ i = (ix >> 46) % 128;
+ r = (uint32_t)__rsqrt_tab[i] << 16;
+ /* |r sqrt(m) - 1| < 0x1.fdp-9 */
+ s = mul32(m>>32, r);
+ /* |s/sqrt(m) - 1| < 0x1.fdp-9 */
+ d = mul32(s, r);
+ u = three - d;
+ r = mul32(r, u) << 1;
+ /* |r sqrt(m) - 1| < 0x1.7bp-16 */
+ s = mul32(s, u) << 1;
+ /* |s/sqrt(m) - 1| < 0x1.7bp-16 */
+ d = mul32(s, r);
+ u = three - d;
+ r = mul32(r, u) << 1;
+ /* |r sqrt(m) - 1| < 0x1.3704p-29 (measured worst-case) */
+ r = r << 32;
+ s = mul64(m, r);
+ d = mul64(s, r);
+ u = (three<<32) - d;
+ s = mul64(s, u); /* repr: 3.61 */
+ /* -0x1p-57 < s - sqrt(m) < 0x1.8001p-61 */
+ s = (s - 2) >> 9; /* repr: 12.52 */
+ /* -0x1.09p-52 < s - sqrt(m) < -0x1.fffcp-63 */
+
+ /* s < sqrt(m) < s + 0x1.09p-52,
+ compute nearest rounded result:
+ the nearest result to 52 bits is either s or s+0x1p-52,
+ we can decide by comparing (2^52 s + 0.5)^2 to 2^104 m. */
+ uint64_t d0, d1, d2;
+ double y, t;
+ d0 = (m << 42) - s*s;
+ d1 = s - d0;
+ d2 = d1 + s + 1;
+ s += d1 >> 63;
+ s &= 0x000fffffffffffff;
+ s |= top << 52;
+ y = asdouble(s);
+ if (FENV_SUPPORT) {
+ /* handle rounding modes and inexact exception:
+ only (s+1)^2 == 2^42 m case is exact otherwise
+ add a tiny value to cause the fenv effects. */
+ uint64_t tiny = predict_false(d2==0) ? 0 : 0x0010000000000000;
+ tiny |= (d1^d2) & 0x8000000000000000;
+ t = asdouble(tiny);
+ y = eval_as_double(y + t);
+ }
+ return y;
+}
diff --git a/libc-top-half/musl/src/math/sqrt_data.c b/libc-top-half/musl/src/math/sqrt_data.c
new file mode 100644
index 0000000..61bc22f
--- /dev/null
+++ b/libc-top-half/musl/src/math/sqrt_data.c
@@ -0,0 +1,19 @@
+#include "sqrt_data.h"
+const uint16_t __rsqrt_tab[128] = {
+0xb451,0xb2f0,0xb196,0xb044,0xaef9,0xadb6,0xac79,0xab43,
+0xaa14,0xa8eb,0xa7c8,0xa6aa,0xa592,0xa480,0xa373,0xa26b,
+0xa168,0xa06a,0x9f70,0x9e7b,0x9d8a,0x9c9d,0x9bb5,0x9ad1,
+0x99f0,0x9913,0x983a,0x9765,0x9693,0x95c4,0x94f8,0x9430,
+0x936b,0x92a9,0x91ea,0x912e,0x9075,0x8fbe,0x8f0a,0x8e59,
+0x8daa,0x8cfe,0x8c54,0x8bac,0x8b07,0x8a64,0x89c4,0x8925,
+0x8889,0x87ee,0x8756,0x86c0,0x862b,0x8599,0x8508,0x8479,
+0x83ec,0x8361,0x82d8,0x8250,0x81c9,0x8145,0x80c2,0x8040,
+0xff02,0xfd0e,0xfb25,0xf947,0xf773,0xf5aa,0xf3ea,0xf234,
+0xf087,0xeee3,0xed47,0xebb3,0xea27,0xe8a3,0xe727,0xe5b2,
+0xe443,0xe2dc,0xe17a,0xe020,0xdecb,0xdd7d,0xdc34,0xdaf1,
+0xd9b3,0xd87b,0xd748,0xd61a,0xd4f1,0xd3cd,0xd2ad,0xd192,
+0xd07b,0xcf69,0xce5b,0xcd51,0xcc4a,0xcb48,0xca4a,0xc94f,
+0xc858,0xc764,0xc674,0xc587,0xc49d,0xc3b7,0xc2d4,0xc1f4,
+0xc116,0xc03c,0xbf65,0xbe90,0xbdbe,0xbcef,0xbc23,0xbb59,
+0xba91,0xb9cc,0xb90a,0xb84a,0xb78c,0xb6d0,0xb617,0xb560,
+};
diff --git a/libc-top-half/musl/src/math/sqrt_data.h b/libc-top-half/musl/src/math/sqrt_data.h
new file mode 100644
index 0000000..260c7f9
--- /dev/null
+++ b/libc-top-half/musl/src/math/sqrt_data.h
@@ -0,0 +1,13 @@
+#ifndef _SQRT_DATA_H
+#define _SQRT_DATA_H
+
+#include <features.h>
+#include <stdint.h>
+
+/* if x in [1,2): i = (int)(64*x);
+ if x in [2,4): i = (int)(32*x-64);
+ __rsqrt_tab[i]*2^-16 is estimating 1/sqrt(x) with small relative error:
+ |__rsqrt_tab[i]*0x1p-16*sqrt(x) - 1| < -0x1.fdp-9 < 2^-8 */
+extern hidden const uint16_t __rsqrt_tab[128];
+
+#endif
diff --git a/libc-top-half/musl/src/math/sqrtf.c b/libc-top-half/musl/src/math/sqrtf.c
new file mode 100644
index 0000000..740d81c
--- /dev/null
+++ b/libc-top-half/musl/src/math/sqrtf.c
@@ -0,0 +1,83 @@
+#include <stdint.h>
+#include <math.h>
+#include "libm.h"
+#include "sqrt_data.h"
+
+#define FENV_SUPPORT 1
+
+static inline uint32_t mul32(uint32_t a, uint32_t b)
+{
+ return (uint64_t)a*b >> 32;
+}
+
+/* see sqrt.c for more detailed comments. */
+
+float sqrtf(float x)
+{
+ uint32_t ix, m, m1, m0, even, ey;
+
+ ix = asuint(x);
+ if (predict_false(ix - 0x00800000 >= 0x7f800000 - 0x00800000)) {
+ /* x < 0x1p-126 or inf or nan. */
+ if (ix * 2 == 0)
+ return x;
+ if (ix == 0x7f800000)
+ return x;
+ if (ix > 0x7f800000)
+ return __math_invalidf(x);
+ /* x is subnormal, normalize it. */
+ ix = asuint(x * 0x1p23f);
+ ix -= 23 << 23;
+ }
+
+ /* x = 4^e m; with int e and m in [1, 4). */
+ even = ix & 0x00800000;
+ m1 = (ix << 8) | 0x80000000;
+ m0 = (ix << 7) & 0x7fffffff;
+ m = even ? m0 : m1;
+
+ /* 2^e is the exponent part of the return value. */
+ ey = ix >> 1;
+ ey += 0x3f800000 >> 1;
+ ey &= 0x7f800000;
+
+ /* compute r ~ 1/sqrt(m), s ~ sqrt(m) with 2 goldschmidt iterations. */
+ static const uint32_t three = 0xc0000000;
+ uint32_t r, s, d, u, i;
+ i = (ix >> 17) % 128;
+ r = (uint32_t)__rsqrt_tab[i] << 16;
+ /* |r*sqrt(m) - 1| < 0x1p-8 */
+ s = mul32(m, r);
+ /* |s/sqrt(m) - 1| < 0x1p-8 */
+ d = mul32(s, r);
+ u = three - d;
+ r = mul32(r, u) << 1;
+ /* |r*sqrt(m) - 1| < 0x1.7bp-16 */
+ s = mul32(s, u) << 1;
+ /* |s/sqrt(m) - 1| < 0x1.7bp-16 */
+ d = mul32(s, r);
+ u = three - d;
+ s = mul32(s, u);
+ /* -0x1.03p-28 < s/sqrt(m) - 1 < 0x1.fp-31 */
+ s = (s - 1)>>6;
+ /* s < sqrt(m) < s + 0x1.08p-23 */
+
+ /* compute nearest rounded result. */
+ uint32_t d0, d1, d2;
+ float y, t;
+ d0 = (m << 16) - s*s;
+ d1 = s - d0;
+ d2 = d1 + s + 1;
+ s += d1 >> 31;
+ s &= 0x007fffff;
+ s |= ey;
+ y = asfloat(s);
+ if (FENV_SUPPORT) {
+ /* handle rounding and inexact exception. */
+ uint32_t tiny = predict_false(d2==0) ? 0 : 0x01000000;
+ tiny |= (d1^d2) & 0x80000000;
+ t = asfloat(tiny);
+ y = eval_as_float(y + t);
+ }
+ return y;
+}
diff --git a/libc-top-half/musl/src/math/sqrtl.c b/libc-top-half/musl/src/math/sqrtl.c
new file mode 100644
index 0000000..1b9f19c
--- /dev/null
+++ b/libc-top-half/musl/src/math/sqrtl.c
@@ -0,0 +1,259 @@
+#include <stdint.h>
+#include <math.h>
+#include <float.h>
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double sqrtl(long double x)
+{
+ return sqrt(x);
+}
+#elif (LDBL_MANT_DIG == 113 || LDBL_MANT_DIG == 64) && LDBL_MAX_EXP == 16384
+#include "sqrt_data.h"
+
+#define FENV_SUPPORT 1
+
+typedef struct {
+ uint64_t hi;
+ uint64_t lo;
+} u128;
+
+/* top: 16 bit sign+exponent, x: significand. */
+static inline long double mkldbl(uint64_t top, u128 x)
+{
+ union ldshape u;
+#if LDBL_MANT_DIG == 113
+ u.i2.hi = x.hi;
+ u.i2.lo = x.lo;
+ u.i2.hi &= 0x0000ffffffffffff;
+ u.i2.hi |= top << 48;
+#elif LDBL_MANT_DIG == 64
+ u.i.se = top;
+ u.i.m = x.lo;
+ /* force the top bit on non-zero (and non-subnormal) results. */
+ if (top & 0x7fff)
+ u.i.m |= 0x8000000000000000;
+#endif
+ return u.f;
+}
+
+/* return: top 16 bit is sign+exp and following bits are the significand. */
+static inline u128 asu128(long double x)
+{
+ union ldshape u = {.f=x};
+ u128 r;
+#if LDBL_MANT_DIG == 113
+ r.hi = u.i2.hi;
+ r.lo = u.i2.lo;
+#elif LDBL_MANT_DIG == 64
+ r.lo = u.i.m<<49;
+ /* ignore the top bit: pseudo numbers are not handled. */
+ r.hi = u.i.m>>15;
+ r.hi &= 0x0000ffffffffffff;
+ r.hi |= (uint64_t)u.i.se << 48;
+#endif
+ return r;
+}
+
+/* returns a*b*2^-32 - e, with error 0 <= e < 1. */
+static inline uint32_t mul32(uint32_t a, uint32_t b)
+{
+ return (uint64_t)a*b >> 32;
+}
+
+/* returns a*b*2^-64 - e, with error 0 <= e < 3. */
+static inline uint64_t mul64(uint64_t a, uint64_t b)
+{
+ uint64_t ahi = a>>32;
+ uint64_t alo = a&0xffffffff;
+ uint64_t bhi = b>>32;
+ uint64_t blo = b&0xffffffff;
+ return ahi*bhi + (ahi*blo >> 32) + (alo*bhi >> 32);
+}
+
+static inline u128 add64(u128 a, uint64_t b)
+{
+ u128 r;
+ r.lo = a.lo + b;
+ r.hi = a.hi;
+ if (r.lo < a.lo)
+ r.hi++;
+ return r;
+}
+
+static inline u128 add128(u128 a, u128 b)
+{
+ u128 r;
+ r.lo = a.lo + b.lo;
+ r.hi = a.hi + b.hi;
+ if (r.lo < a.lo)
+ r.hi++;
+ return r;
+}
+
+static inline u128 sub64(u128 a, uint64_t b)
+{
+ u128 r;
+ r.lo = a.lo - b;
+ r.hi = a.hi;
+ if (a.lo < b)
+ r.hi--;
+ return r;
+}
+
+static inline u128 sub128(u128 a, u128 b)
+{
+ u128 r;
+ r.lo = a.lo - b.lo;
+ r.hi = a.hi - b.hi;
+ if (a.lo < b.lo)
+ r.hi--;
+ return r;
+}
+
+/* a<<n, 0 <= n <= 127 */
+static inline u128 lsh(u128 a, int n)
+{
+ if (n == 0)
+ return a;
+ if (n >= 64) {
+ a.hi = a.lo<<(n-64);
+ a.lo = 0;
+ } else {
+ a.hi = (a.hi<<n) | (a.lo>>(64-n));
+ a.lo = a.lo<<n;
+ }
+ return a;
+}
+
+/* a>>n, 0 <= n <= 127 */
+static inline u128 rsh(u128 a, int n)
+{
+ if (n == 0)
+ return a;
+ if (n >= 64) {
+ a.lo = a.hi>>(n-64);
+ a.hi = 0;
+ } else {
+ a.lo = (a.lo>>n) | (a.hi<<(64-n));
+ a.hi = a.hi>>n;
+ }
+ return a;
+}
+
+/* returns a*b exactly. */
+static inline u128 mul64_128(uint64_t a, uint64_t b)
+{
+ u128 r;
+ uint64_t ahi = a>>32;
+ uint64_t alo = a&0xffffffff;
+ uint64_t bhi = b>>32;
+ uint64_t blo = b&0xffffffff;
+ uint64_t lo1 = ((ahi*blo)&0xffffffff) + ((alo*bhi)&0xffffffff) + (alo*blo>>32);
+ uint64_t lo2 = (alo*blo)&0xffffffff;
+ r.hi = ahi*bhi + (ahi*blo>>32) + (alo*bhi>>32) + (lo1>>32);
+ r.lo = (lo1<<32) + lo2;
+ return r;
+}
+
+/* returns a*b*2^-128 - e, with error 0 <= e < 7. */
+static inline u128 mul128(u128 a, u128 b)
+{
+ u128 hi = mul64_128(a.hi, b.hi);
+ uint64_t m1 = mul64(a.hi, b.lo);
+ uint64_t m2 = mul64(a.lo, b.hi);
+ return add64(add64(hi, m1), m2);
+}
+
+/* returns a*b % 2^128. */
+static inline u128 mul128_tail(u128 a, u128 b)
+{
+ u128 lo = mul64_128(a.lo, b.lo);
+ lo.hi += a.hi*b.lo + a.lo*b.hi;
+ return lo;
+}
+
+
+/* see sqrt.c for detailed comments. */
+
+long double sqrtl(long double x)
+{
+ u128 ix, ml;
+ uint64_t top;
+
+ ix = asu128(x);
+ top = ix.hi >> 48;
+ if (predict_false(top - 0x0001 >= 0x7fff - 0x0001)) {
+ /* x < 0x1p-16382 or inf or nan. */
+ if (2*ix.hi == 0 && ix.lo == 0)
+ return x;
+ if (ix.hi == 0x7fff000000000000 && ix.lo == 0)
+ return x;
+ if (top >= 0x7fff)
+ return __math_invalidl(x);
+ /* x is subnormal, normalize it. */
+ ix = asu128(x * 0x1p112);
+ top = ix.hi >> 48;
+ top -= 112;
+ }
+
+ /* x = 4^e m; with int e and m in [1, 4) */
+ int even = top & 1;
+ ml = lsh(ix, 15);
+ ml.hi |= 0x8000000000000000;
+ if (even) ml = rsh(ml, 1);
+ top = (top + 0x3fff) >> 1;
+
+ /* r ~ 1/sqrt(m) */
+ static const uint64_t three = 0xc0000000;
+ uint64_t r, s, d, u, i;
+ i = (ix.hi >> 42) % 128;
+ r = (uint32_t)__rsqrt_tab[i] << 16;
+ /* |r sqrt(m) - 1| < 0x1p-8 */
+ s = mul32(ml.hi>>32, r);
+ d = mul32(s, r);
+ u = three - d;
+ r = mul32(u, r) << 1;
+ /* |r sqrt(m) - 1| < 0x1.7bp-16, switch to 64bit */
+ r = r<<32;
+ s = mul64(ml.hi, r);
+ d = mul64(s, r);
+ u = (three<<32) - d;
+ r = mul64(u, r) << 1;
+ /* |r sqrt(m) - 1| < 0x1.a5p-31 */
+ s = mul64(u, s) << 1;
+ d = mul64(s, r);
+ u = (three<<32) - d;
+ r = mul64(u, r) << 1;
+ /* |r sqrt(m) - 1| < 0x1.c001p-59, switch to 128bit */
+
+ static const u128 threel = {.hi=three<<32, .lo=0};
+ u128 rl, sl, dl, ul;
+ rl.hi = r;
+ rl.lo = 0;
+ sl = mul128(ml, rl);
+ dl = mul128(sl, rl);
+ ul = sub128(threel, dl);
+ sl = mul128(ul, sl); /* repr: 3.125 */
+ /* -0x1p-116 < s - sqrt(m) < 0x3.8001p-125 */
+ sl = rsh(sub64(sl, 4), 125-(LDBL_MANT_DIG-1));
+ /* s < sqrt(m) < s + 1 ULP + tiny */
+
+ long double y;
+ u128 d2, d1, d0;
+ d0 = sub128(lsh(ml, 2*(LDBL_MANT_DIG-1)-126), mul128_tail(sl,sl));
+ d1 = sub128(sl, d0);
+ d2 = add128(add64(sl, 1), d1);
+ sl = add64(sl, d1.hi >> 63);
+ y = mkldbl(top, sl);
+ if (FENV_SUPPORT) {
+ /* handle rounding modes and inexact exception. */
+ top = predict_false((d2.hi|d2.lo)==0) ? 0 : 1;
+ top |= ((d1.hi^d2.hi)&0x8000000000000000) >> 48;
+ y += mkldbl(top, (u128){0});
+ }
+ return y;
+}
+#else
+#error unsupported long double format
+#endif
diff --git a/libc-top-half/musl/src/math/tan.c b/libc-top-half/musl/src/math/tan.c
new file mode 100644
index 0000000..9c724a4
--- /dev/null
+++ b/libc-top-half/musl/src/math/tan.c
@@ -0,0 +1,70 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_tan.c */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+/* tan(x)
+ * Return tangent function of x.
+ *
+ * kernel function:
+ * __tan ... tangent function on [-pi/4,pi/4]
+ * __rem_pio2 ... argument reduction routine
+ *
+ * Method.
+ * Let S,C and T denote the sin, cos and tan respectively on
+ * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ * in [-pi/4 , +pi/4], and let n = k mod 4.
+ * We have
+ *
+ * n sin(x) cos(x) tan(x)
+ * ----------------------------------------------------------
+ * 0 S C T
+ * 1 C -S -1/T
+ * 2 -S -C T
+ * 3 -C S -1/T
+ * ----------------------------------------------------------
+ *
+ * Special cases:
+ * Let trig be any of sin, cos, or tan.
+ * trig(+-INF) is NaN, with signals;
+ * trig(NaN) is that NaN;
+ *
+ * Accuracy:
+ * TRIG(x) returns trig(x) nearly rounded
+ */
+
+#include "libm.h"
+
+double tan(double x)
+{
+ double y[2];
+ uint32_t ix;
+ unsigned n;
+
+ GET_HIGH_WORD(ix, x);
+ ix &= 0x7fffffff;
+
+ /* |x| ~< pi/4 */
+ if (ix <= 0x3fe921fb) {
+ if (ix < 0x3e400000) { /* |x| < 2**-27 */
+ /* raise inexact if x!=0 and underflow if subnormal */
+ FORCE_EVAL(ix < 0x00100000 ? x/0x1p120f : x+0x1p120f);
+ return x;
+ }
+ return __tan(x, 0.0, 0);
+ }
+
+ /* tan(Inf or NaN) is NaN */
+ if (ix >= 0x7ff00000)
+ return x - x;
+
+ /* argument reduction */
+ n = __rem_pio2(x, y);
+ return __tan(y[0], y[1], n&1);
+}
diff --git a/libc-top-half/musl/src/math/tanf.c b/libc-top-half/musl/src/math/tanf.c
new file mode 100644
index 0000000..aba1977
--- /dev/null
+++ b/libc-top-half/musl/src/math/tanf.c
@@ -0,0 +1,64 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/s_tanf.c */
+/*
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Optimized by Bruce D. Evans.
+ */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include "libm.h"
+
+/* Small multiples of pi/2 rounded to double precision. */
+static const double
+t1pio2 = 1*M_PI_2, /* 0x3FF921FB, 0x54442D18 */
+t2pio2 = 2*M_PI_2, /* 0x400921FB, 0x54442D18 */
+t3pio2 = 3*M_PI_2, /* 0x4012D97C, 0x7F3321D2 */
+t4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */
+
+float tanf(float x)
+{
+ double y;
+ uint32_t ix;
+ unsigned n, sign;
+
+ GET_FLOAT_WORD(ix, x);
+ sign = ix >> 31;
+ ix &= 0x7fffffff;
+
+ if (ix <= 0x3f490fda) { /* |x| ~<= pi/4 */
+ if (ix < 0x39800000) { /* |x| < 2**-12 */
+ /* raise inexact if x!=0 and underflow if subnormal */
+ FORCE_EVAL(ix < 0x00800000 ? x/0x1p120f : x+0x1p120f);
+ return x;
+ }
+ return __tandf(x, 0);
+ }
+ if (ix <= 0x407b53d1) { /* |x| ~<= 5*pi/4 */
+ if (ix <= 0x4016cbe3) /* |x| ~<= 3pi/4 */
+ return __tandf((sign ? x+t1pio2 : x-t1pio2), 1);
+ else
+ return __tandf((sign ? x+t2pio2 : x-t2pio2), 0);
+ }
+ if (ix <= 0x40e231d5) { /* |x| ~<= 9*pi/4 */
+ if (ix <= 0x40afeddf) /* |x| ~<= 7*pi/4 */
+ return __tandf((sign ? x+t3pio2 : x-t3pio2), 1);
+ else
+ return __tandf((sign ? x+t4pio2 : x-t4pio2), 0);
+ }
+
+ /* tan(Inf or NaN) is NaN */
+ if (ix >= 0x7f800000)
+ return x - x;
+
+ /* argument reduction */
+ n = __rem_pio2f(x, &y);
+ return __tandf(y, n&1);
+}
diff --git a/libc-top-half/musl/src/math/tanh.c b/libc-top-half/musl/src/math/tanh.c
new file mode 100644
index 0000000..20d6dbc
--- /dev/null
+++ b/libc-top-half/musl/src/math/tanh.c
@@ -0,0 +1,45 @@
+#include "libm.h"
+
+/* tanh(x) = (exp(x) - exp(-x))/(exp(x) + exp(-x))
+ * = (exp(2*x) - 1)/(exp(2*x) - 1 + 2)
+ * = (1 - exp(-2*x))/(exp(-2*x) - 1 + 2)
+ */
+double tanh(double x)
+{
+ union {double f; uint64_t i;} u = {.f = x};
+ uint32_t w;
+ int sign;
+ double_t t;
+
+ /* x = |x| */
+ sign = u.i >> 63;
+ u.i &= (uint64_t)-1/2;
+ x = u.f;
+ w = u.i >> 32;
+
+ if (w > 0x3fe193ea) {
+ /* |x| > log(3)/2 ~= 0.5493 or nan */
+ if (w > 0x40340000) {
+ /* |x| > 20 or nan */
+ /* note: this branch avoids raising overflow */
+ t = 1 - 0/x;
+ } else {
+ t = expm1(2*x);
+ t = 1 - 2/(t+2);
+ }
+ } else if (w > 0x3fd058ae) {
+ /* |x| > log(5/3)/2 ~= 0.2554 */
+ t = expm1(2*x);
+ t = t/(t+2);
+ } else if (w >= 0x00100000) {
+ /* |x| >= 0x1p-1022, up to 2ulp error in [0.1,0.2554] */
+ t = expm1(-2*x);
+ t = -t/(t+2);
+ } else {
+ /* |x| is subnormal */
+ /* note: the branch above would not raise underflow in [0x1p-1023,0x1p-1022) */
+ FORCE_EVAL((float)x);
+ t = x;
+ }
+ return sign ? -t : t;
+}
diff --git a/libc-top-half/musl/src/math/tanhf.c b/libc-top-half/musl/src/math/tanhf.c
new file mode 100644
index 0000000..10636fb
--- /dev/null
+++ b/libc-top-half/musl/src/math/tanhf.c
@@ -0,0 +1,39 @@
+#include "libm.h"
+
+float tanhf(float x)
+{
+ union {float f; uint32_t i;} u = {.f = x};
+ uint32_t w;
+ int sign;
+ float t;
+
+ /* x = |x| */
+ sign = u.i >> 31;
+ u.i &= 0x7fffffff;
+ x = u.f;
+ w = u.i;
+
+ if (w > 0x3f0c9f54) {
+ /* |x| > log(3)/2 ~= 0.5493 or nan */
+ if (w > 0x41200000) {
+ /* |x| > 10 */
+ t = 1 + 0/x;
+ } else {
+ t = expm1f(2*x);
+ t = 1 - 2/(t+2);
+ }
+ } else if (w > 0x3e82c578) {
+ /* |x| > log(5/3)/2 ~= 0.2554 */
+ t = expm1f(2*x);
+ t = t/(t+2);
+ } else if (w >= 0x00800000) {
+ /* |x| >= 0x1p-126 */
+ t = expm1f(-2*x);
+ t = -t/(t+2);
+ } else {
+ /* |x| is subnormal */
+ FORCE_EVAL(x*x);
+ t = x;
+ }
+ return sign ? -t : t;
+}
diff --git a/libc-top-half/musl/src/math/tanhl.c b/libc-top-half/musl/src/math/tanhl.c
new file mode 100644
index 0000000..4e1aa9f
--- /dev/null
+++ b/libc-top-half/musl/src/math/tanhl.c
@@ -0,0 +1,48 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double tanhl(long double x)
+{
+ return tanh(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+long double tanhl(long double x)
+{
+ union ldshape u = {x};
+ unsigned ex = u.i.se & 0x7fff;
+ unsigned sign = u.i.se & 0x8000;
+ uint32_t w;
+ long double t;
+
+ /* x = |x| */
+ u.i.se = ex;
+ x = u.f;
+ w = u.i.m >> 32;
+
+ if (ex > 0x3ffe || (ex == 0x3ffe && w > 0x8c9f53d5)) {
+ /* |x| > log(3)/2 ~= 0.5493 or nan */
+ if (ex >= 0x3fff+5) {
+ /* |x| >= 32 */
+ t = 1 + 0/(x + 0x1p-120f);
+ } else {
+ t = expm1l(2*x);
+ t = 1 - 2/(t+2);
+ }
+ } else if (ex > 0x3ffd || (ex == 0x3ffd && w > 0x82c577d4)) {
+ /* |x| > log(5/3)/2 ~= 0.2554 */
+ t = expm1l(2*x);
+ t = t/(t+2);
+ } else {
+ /* |x| is small */
+ t = expm1l(-2*x);
+ t = -t/(t+2);
+ }
+ return sign ? -t : t;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double tanhl(long double x)
+{
+ return tanh(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/tanl.c b/libc-top-half/musl/src/math/tanl.c
new file mode 100644
index 0000000..6af0671
--- /dev/null
+++ b/libc-top-half/musl/src/math/tanl.c
@@ -0,0 +1,29 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double tanl(long double x)
+{
+ return tan(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+long double tanl(long double x)
+{
+ union ldshape u = {x};
+ long double y[2];
+ unsigned n;
+
+ u.i.se &= 0x7fff;
+ if (u.i.se == 0x7fff)
+ return x - x;
+ if (u.f < M_PI_4) {
+ if (u.i.se < 0x3fff - LDBL_MANT_DIG/2) {
+ /* raise inexact if x!=0 and underflow if subnormal */
+ FORCE_EVAL(u.i.se == 0 ? x*0x1p-120f : x+0x1p120f);
+ return x;
+ }
+ return __tanl(x, 0, 0);
+ }
+ n = __rem_pio2l(x, y);
+ return __tanl(y[0], y[1], n&1);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/tgamma.c b/libc-top-half/musl/src/math/tgamma.c
new file mode 100644
index 0000000..28f6e0f
--- /dev/null
+++ b/libc-top-half/musl/src/math/tgamma.c
@@ -0,0 +1,222 @@
+/*
+"A Precision Approximation of the Gamma Function" - Cornelius Lanczos (1964)
+"Lanczos Implementation of the Gamma Function" - Paul Godfrey (2001)
+"An Analysis of the Lanczos Gamma Approximation" - Glendon Ralph Pugh (2004)
+
+approximation method:
+
+ (x - 0.5) S(x)
+Gamma(x) = (x + g - 0.5) * ----------------
+ exp(x + g - 0.5)
+
+with
+ a1 a2 a3 aN
+S(x) ~= [ a0 + ----- + ----- + ----- + ... + ----- ]
+ x + 1 x + 2 x + 3 x + N
+
+with a0, a1, a2, a3,.. aN constants which depend on g.
+
+for x < 0 the following reflection formula is used:
+
+Gamma(x)*Gamma(-x) = -pi/(x sin(pi x))
+
+most ideas and constants are from boost and python
+*/
+#include "libm.h"
+
+static const double pi = 3.141592653589793238462643383279502884;
+
+/* sin(pi x) with x > 0x1p-100, if sin(pi*x)==0 the sign is arbitrary */
+static double sinpi(double x)
+{
+ int n;
+
+ /* argument reduction: x = |x| mod 2 */
+ /* spurious inexact when x is odd int */
+ x = x * 0.5;
+ x = 2 * (x - floor(x));
+
+ /* reduce x into [-.25,.25] */
+ n = 4 * x;
+ n = (n+1)/2;
+ x -= n * 0.5;
+
+ x *= pi;
+ switch (n) {
+ default: /* case 4 */
+ case 0:
+ return __sin(x, 0, 0);
+ case 1:
+ return __cos(x, 0);
+ case 2:
+ return __sin(-x, 0, 0);
+ case 3:
+ return -__cos(x, 0);
+ }
+}
+
+#define N 12
+//static const double g = 6.024680040776729583740234375;
+static const double gmhalf = 5.524680040776729583740234375;
+static const double Snum[N+1] = {
+ 23531376880.410759688572007674451636754734846804940,
+ 42919803642.649098768957899047001988850926355848959,
+ 35711959237.355668049440185451547166705960488635843,
+ 17921034426.037209699919755754458931112671403265390,
+ 6039542586.3520280050642916443072979210699388420708,
+ 1439720407.3117216736632230727949123939715485786772,
+ 248874557.86205415651146038641322942321632125127801,
+ 31426415.585400194380614231628318205362874684987640,
+ 2876370.6289353724412254090516208496135991145378768,
+ 186056.26539522349504029498971604569928220784236328,
+ 8071.6720023658162106380029022722506138218516325024,
+ 210.82427775157934587250973392071336271166969580291,
+ 2.5066282746310002701649081771338373386264310793408,
+};
+static const double Sden[N+1] = {
+ 0, 39916800, 120543840, 150917976, 105258076, 45995730, 13339535,
+ 2637558, 357423, 32670, 1925, 66, 1,
+};
+/* n! for small integer n */
+static const double fact[] = {
+ 1, 1, 2, 6, 24, 120, 720, 5040.0, 40320.0, 362880.0, 3628800.0, 39916800.0,
+ 479001600.0, 6227020800.0, 87178291200.0, 1307674368000.0, 20922789888000.0,
+ 355687428096000.0, 6402373705728000.0, 121645100408832000.0,
+ 2432902008176640000.0, 51090942171709440000.0, 1124000727777607680000.0,
+};
+
+/* S(x) rational function for positive x */
+static double S(double x)
+{
+ double_t num = 0, den = 0;
+ int i;
+
+ /* to avoid overflow handle large x differently */
+ if (x < 8)
+ for (i = N; i >= 0; i--) {
+ num = num * x + Snum[i];
+ den = den * x + Sden[i];
+ }
+ else
+ for (i = 0; i <= N; i++) {
+ num = num / x + Snum[i];
+ den = den / x + Sden[i];
+ }
+ return num/den;
+}
+
+double tgamma(double x)
+{
+ union {double f; uint64_t i;} u = {x};
+ double absx, y;
+ double_t dy, z, r;
+ uint32_t ix = u.i>>32 & 0x7fffffff;
+ int sign = u.i>>63;
+
+ /* special cases */
+ if (ix >= 0x7ff00000)
+ /* tgamma(nan)=nan, tgamma(inf)=inf, tgamma(-inf)=nan with invalid */
+ return x + INFINITY;
+ if (ix < (0x3ff-54)<<20)
+ /* |x| < 2^-54: tgamma(x) ~ 1/x, +-0 raises div-by-zero */
+ return 1/x;
+
+ /* integer arguments */
+ /* raise inexact when non-integer */
+ if (x == floor(x)) {
+ if (sign)
+ return 0/0.0;
+ if (x <= sizeof fact/sizeof *fact)
+ return fact[(int)x - 1];
+ }
+
+ /* x >= 172: tgamma(x)=inf with overflow */
+ /* x =< -184: tgamma(x)=+-0 with underflow */
+ if (ix >= 0x40670000) { /* |x| >= 184 */
+ if (sign) {
+ FORCE_EVAL((float)(0x1p-126/x));
+ if (floor(x) * 0.5 == floor(x * 0.5))
+ return 0;
+ return -0.0;
+ }
+ x *= 0x1p1023;
+ return x;
+ }
+
+ absx = sign ? -x : x;
+
+ /* handle the error of x + g - 0.5 */
+ y = absx + gmhalf;
+ if (absx > gmhalf) {
+ dy = y - absx;
+ dy -= gmhalf;
+ } else {
+ dy = y - gmhalf;
+ dy -= absx;
+ }
+
+ z = absx - 0.5;
+ r = S(absx) * exp(-y);
+ if (x < 0) {
+ /* reflection formula for negative x */
+ /* sinpi(absx) is not 0, integers are already handled */
+ r = -pi / (sinpi(absx) * absx * r);
+ dy = -dy;
+ z = -z;
+ }
+ r += dy * (gmhalf+0.5) * r / y;
+ z = pow(y, 0.5*z);
+ y = r * z * z;
+ return y;
+}
+
+#if 0
+double __lgamma_r(double x, int *sign)
+{
+ double r, absx;
+
+ *sign = 1;
+
+ /* special cases */
+ if (!isfinite(x))
+ /* lgamma(nan)=nan, lgamma(+-inf)=inf */
+ return x*x;
+
+ /* integer arguments */
+ if (x == floor(x) && x <= 2) {
+ /* n <= 0: lgamma(n)=inf with divbyzero */
+ /* n == 1,2: lgamma(n)=0 */
+ if (x <= 0)
+ return 1/0.0;
+ return 0;
+ }
+
+ absx = fabs(x);
+
+ /* lgamma(x) ~ -log(|x|) for tiny |x| */
+ if (absx < 0x1p-54) {
+ *sign = 1 - 2*!!signbit(x);
+ return -log(absx);
+ }
+
+ /* use tgamma for smaller |x| */
+ if (absx < 128) {
+ x = tgamma(x);
+ *sign = 1 - 2*!!signbit(x);
+ return log(fabs(x));
+ }
+
+ /* second term (log(S)-g) could be more precise here.. */
+ /* or with stirling: (|x|-0.5)*(log(|x|)-1) + poly(1/|x|) */
+ r = (absx-0.5)*(log(absx+gmhalf)-1) + (log(S(absx)) - (gmhalf+0.5));
+ if (x < 0) {
+ /* reflection formula for negative x */
+ x = sinpi(absx);
+ *sign = 2*!!signbit(x) - 1;
+ r = log(pi/(fabs(x)*absx)) - r;
+ }
+ return r;
+}
+
+weak_alias(__lgamma_r, lgamma_r);
+#endif
diff --git a/libc-top-half/musl/src/math/tgammaf.c b/libc-top-half/musl/src/math/tgammaf.c
new file mode 100644
index 0000000..b4ca51c
--- /dev/null
+++ b/libc-top-half/musl/src/math/tgammaf.c
@@ -0,0 +1,6 @@
+#include <math.h>
+
+float tgammaf(float x)
+{
+ return tgamma(x);
+}
diff --git a/libc-top-half/musl/src/math/tgammal.c b/libc-top-half/musl/src/math/tgammal.c
new file mode 100644
index 0000000..5336c5b
--- /dev/null
+++ b/libc-top-half/musl/src/math/tgammal.c
@@ -0,0 +1,281 @@
+/* origin: OpenBSD /usr/src/lib/libm/src/ld80/e_tgammal.c */
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Gamma function
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, tgammal();
+ *
+ * y = tgammal( x );
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns gamma function of the argument. The result is
+ * correctly signed.
+ *
+ * Arguments |x| <= 13 are reduced by recurrence and the function
+ * approximated by a rational function of degree 7/8 in the
+ * interval (2,3). Large arguments are handled by Stirling's
+ * formula. Large negative arguments are made positive using
+ * a reflection formula.
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE -40,+40 10000 3.6e-19 7.9e-20
+ * IEEE -1755,+1755 10000 4.8e-18 6.5e-19
+ *
+ * Accuracy for large arguments is dominated by error in powl().
+ *
+ */
+
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double tgammal(long double x)
+{
+ return tgamma(x);
+}
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
+/*
+tgamma(x+2) = tgamma(x+2) P(x)/Q(x)
+0 <= x <= 1
+Relative error
+n=7, d=8
+Peak error = 1.83e-20
+Relative error spread = 8.4e-23
+*/
+static const long double P[8] = {
+ 4.212760487471622013093E-5L,
+ 4.542931960608009155600E-4L,
+ 4.092666828394035500949E-3L,
+ 2.385363243461108252554E-2L,
+ 1.113062816019361559013E-1L,
+ 3.629515436640239168939E-1L,
+ 8.378004301573126728826E-1L,
+ 1.000000000000000000009E0L,
+};
+static const long double Q[9] = {
+-1.397148517476170440917E-5L,
+ 2.346584059160635244282E-4L,
+-1.237799246653152231188E-3L,
+-7.955933682494738320586E-4L,
+ 2.773706565840072979165E-2L,
+-4.633887671244534213831E-2L,
+-2.243510905670329164562E-1L,
+ 4.150160950588455434583E-1L,
+ 9.999999999999999999908E-1L,
+};
+
+/*
+static const long double P[] = {
+-3.01525602666895735709e0L,
+-3.25157411956062339893e1L,
+-2.92929976820724030353e2L,
+-1.70730828800510297666e3L,
+-7.96667499622741999770e3L,
+-2.59780216007146401957e4L,
+-5.99650230220855581642e4L,
+-7.15743521530849602425e4L
+};
+static const long double Q[] = {
+ 1.00000000000000000000e0L,
+-1.67955233807178858919e1L,
+ 8.85946791747759881659e1L,
+ 5.69440799097468430177e1L,
+-1.98526250512761318471e3L,
+ 3.31667508019495079814e3L,
+ 1.60577839621734713377e4L,
+-2.97045081369399940529e4L,
+-7.15743521530849602412e4L
+};
+*/
+#define MAXGAML 1755.455L
+/*static const long double LOGPI = 1.14472988584940017414L;*/
+
+/* Stirling's formula for the gamma function
+tgamma(x) = sqrt(2 pi) x^(x-.5) exp(-x) (1 + 1/x P(1/x))
+z(x) = x
+13 <= x <= 1024
+Relative error
+n=8, d=0
+Peak error = 9.44e-21
+Relative error spread = 8.8e-4
+*/
+static const long double STIR[9] = {
+ 7.147391378143610789273E-4L,
+-2.363848809501759061727E-5L,
+-5.950237554056330156018E-4L,
+ 6.989332260623193171870E-5L,
+ 7.840334842744753003862E-4L,
+-2.294719747873185405699E-4L,
+-2.681327161876304418288E-3L,
+ 3.472222222230075327854E-3L,
+ 8.333333333333331800504E-2L,
+};
+
+#define MAXSTIR 1024.0L
+static const long double SQTPI = 2.50662827463100050242E0L;
+
+/* 1/tgamma(x) = z P(z)
+ * z(x) = 1/x
+ * 0 < x < 0.03125
+ * Peak relative error 4.2e-23
+ */
+static const long double S[9] = {
+-1.193945051381510095614E-3L,
+ 7.220599478036909672331E-3L,
+-9.622023360406271645744E-3L,
+-4.219773360705915470089E-2L,
+ 1.665386113720805206758E-1L,
+-4.200263503403344054473E-2L,
+-6.558780715202540684668E-1L,
+ 5.772156649015328608253E-1L,
+ 1.000000000000000000000E0L,
+};
+
+/* 1/tgamma(-x) = z P(z)
+ * z(x) = 1/x
+ * 0 < x < 0.03125
+ * Peak relative error 5.16e-23
+ * Relative error spread = 2.5e-24
+ */
+static const long double SN[9] = {
+ 1.133374167243894382010E-3L,
+ 7.220837261893170325704E-3L,
+ 9.621911155035976733706E-3L,
+-4.219773343731191721664E-2L,
+-1.665386113944413519335E-1L,
+-4.200263503402112910504E-2L,
+ 6.558780715202536547116E-1L,
+ 5.772156649015328608727E-1L,
+-1.000000000000000000000E0L,
+};
+
+static const long double PIL = 3.1415926535897932384626L;
+
+/* Gamma function computed by Stirling's formula.
+ */
+static long double stirf(long double x)
+{
+ long double y, w, v;
+
+ w = 1.0/x;
+ /* For large x, use rational coefficients from the analytical expansion. */
+ if (x > 1024.0)
+ w = (((((6.97281375836585777429E-5L * w
+ + 7.84039221720066627474E-4L) * w
+ - 2.29472093621399176955E-4L) * w
+ - 2.68132716049382716049E-3L) * w
+ + 3.47222222222222222222E-3L) * w
+ + 8.33333333333333333333E-2L) * w
+ + 1.0;
+ else
+ w = 1.0 + w * __polevll(w, STIR, 8);
+ y = expl(x);
+ if (x > MAXSTIR) { /* Avoid overflow in pow() */
+ v = powl(x, 0.5L * x - 0.25L);
+ y = v * (v / y);
+ } else {
+ y = powl(x, x - 0.5L) / y;
+ }
+ y = SQTPI * y * w;
+ return y;
+}
+
+long double tgammal(long double x)
+{
+ long double p, q, z;
+
+ if (!isfinite(x))
+ return x + INFINITY;
+
+ q = fabsl(x);
+ if (q > 13.0) {
+ if (x < 0.0) {
+ p = floorl(q);
+ z = q - p;
+ if (z == 0)
+ return 0 / z;
+ if (q > MAXGAML) {
+ z = 0;
+ } else {
+ if (z > 0.5) {
+ p += 1.0;
+ z = q - p;
+ }
+ z = q * sinl(PIL * z);
+ z = fabsl(z) * stirf(q);
+ z = PIL/z;
+ }
+ if (0.5 * p == floorl(q * 0.5))
+ z = -z;
+ } else if (x > MAXGAML) {
+ z = x * 0x1p16383L;
+ } else {
+ z = stirf(x);
+ }
+ return z;
+ }
+
+ z = 1.0;
+ while (x >= 3.0) {
+ x -= 1.0;
+ z *= x;
+ }
+ while (x < -0.03125L) {
+ z /= x;
+ x += 1.0;
+ }
+ if (x <= 0.03125L)
+ goto small;
+ while (x < 2.0) {
+ z /= x;
+ x += 1.0;
+ }
+ if (x == 2.0)
+ return z;
+
+ x -= 2.0;
+ p = __polevll(x, P, 7);
+ q = __polevll(x, Q, 8);
+ z = z * p / q;
+ return z;
+
+small:
+ /* z==1 if x was originally +-0 */
+ if (x == 0 && z != 1)
+ return x / x;
+ if (x < 0.0) {
+ x = -x;
+ q = z / (x * __polevll(x, SN, 8));
+ } else
+ q = z / (x * __polevll(x, S, 8));
+ return q;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+// TODO: broken implementation to make things compile
+long double tgammal(long double x)
+{
+ return tgamma(x);
+}
+#endif
diff --git a/libc-top-half/musl/src/math/trunc.c b/libc-top-half/musl/src/math/trunc.c
new file mode 100644
index 0000000..d13711b
--- /dev/null
+++ b/libc-top-half/musl/src/math/trunc.c
@@ -0,0 +1,19 @@
+#include "libm.h"
+
+double trunc(double x)
+{
+ union {double f; uint64_t i;} u = {x};
+ int e = (int)(u.i >> 52 & 0x7ff) - 0x3ff + 12;
+ uint64_t m;
+
+ if (e >= 52 + 12)
+ return x;
+ if (e < 12)
+ e = 1;
+ m = -1ULL >> e;
+ if ((u.i & m) == 0)
+ return x;
+ FORCE_EVAL(x + 0x1p120f);
+ u.i &= ~m;
+ return u.f;
+}
diff --git a/libc-top-half/musl/src/math/truncf.c b/libc-top-half/musl/src/math/truncf.c
new file mode 100644
index 0000000..1a7d03c
--- /dev/null
+++ b/libc-top-half/musl/src/math/truncf.c
@@ -0,0 +1,19 @@
+#include "libm.h"
+
+float truncf(float x)
+{
+ union {float f; uint32_t i;} u = {x};
+ int e = (int)(u.i >> 23 & 0xff) - 0x7f + 9;
+ uint32_t m;
+
+ if (e >= 23 + 9)
+ return x;
+ if (e < 9)
+ e = 1;
+ m = -1U >> e;
+ if ((u.i & m) == 0)
+ return x;
+ FORCE_EVAL(x + 0x1p120f);
+ u.i &= ~m;
+ return u.f;
+}
diff --git a/libc-top-half/musl/src/math/truncl.c b/libc-top-half/musl/src/math/truncl.c
new file mode 100644
index 0000000..f07b193
--- /dev/null
+++ b/libc-top-half/musl/src/math/truncl.c
@@ -0,0 +1,34 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double truncl(long double x)
+{
+ return trunc(x);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+
+static const long double toint = 1/LDBL_EPSILON;
+
+long double truncl(long double x)
+{
+ union ldshape u = {x};
+ int e = u.i.se & 0x7fff;
+ int s = u.i.se >> 15;
+ long double y;
+
+ if (e >= 0x3fff+LDBL_MANT_DIG-1)
+ return x;
+ if (e <= 0x3fff-1) {
+ FORCE_EVAL(x + 0x1p120f);
+ return x*0;
+ }
+ /* y = int(|x|) - |x|, where int(|x|) is an integer neighbor of |x| */
+ if (s)
+ x = -x;
+ y = x + toint - toint - x;
+ if (y > 0)
+ y -= 1;
+ x += y;
+ return s ? -x : x;
+}
+#endif
diff --git a/libc-top-half/musl/src/math/x32/__invtrigl.s b/libc-top-half/musl/src/math/x32/__invtrigl.s
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/__invtrigl.s
diff --git a/libc-top-half/musl/src/math/x32/acosl.s b/libc-top-half/musl/src/math/x32/acosl.s
new file mode 100644
index 0000000..1abca12
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/acosl.s
@@ -0,0 +1,16 @@
+# see ../i386/acos.s
+
+.global acosl
+.type acosl,@function
+acosl:
+ fldt 8(%esp)
+1: fld %st(0)
+ fld1
+ fsub %st(0),%st(1)
+ fadd %st(2)
+ fmulp
+ fsqrt
+ fabs
+ fxch %st(1)
+ fpatan
+ ret
diff --git a/libc-top-half/musl/src/math/x32/asinl.s b/libc-top-half/musl/src/math/x32/asinl.s
new file mode 100644
index 0000000..7fe9f12
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/asinl.s
@@ -0,0 +1,12 @@
+.global asinl
+.type asinl,@function
+asinl:
+ fldt 8(%esp)
+1: fld %st(0)
+ fld1
+ fsub %st(0),%st(1)
+ fadd %st(2)
+ fmulp
+ fsqrt
+ fpatan
+ ret
diff --git a/libc-top-half/musl/src/math/x32/atan2l.s b/libc-top-half/musl/src/math/x32/atan2l.s
new file mode 100644
index 0000000..1ead078
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/atan2l.s
@@ -0,0 +1,7 @@
+.global atan2l
+.type atan2l,@function
+atan2l:
+ fldt 8(%esp)
+ fldt 24(%esp)
+ fpatan
+ ret
diff --git a/libc-top-half/musl/src/math/x32/atanl.s b/libc-top-half/musl/src/math/x32/atanl.s
new file mode 100644
index 0000000..f475fe0
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/atanl.s
@@ -0,0 +1,7 @@
+.global atanl
+.type atanl,@function
+atanl:
+ fldt 8(%esp)
+ fld1
+ fpatan
+ ret
diff --git a/libc-top-half/musl/src/math/x32/ceill.s b/libc-top-half/musl/src/math/x32/ceill.s
new file mode 100644
index 0000000..f5cfa3b
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/ceill.s
@@ -0,0 +1 @@
+# see floorl.s
diff --git a/libc-top-half/musl/src/math/x32/exp2l.s b/libc-top-half/musl/src/math/x32/exp2l.s
new file mode 100644
index 0000000..e9edb96
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/exp2l.s
@@ -0,0 +1,83 @@
+.global expm1l
+.type expm1l,@function
+expm1l:
+ fldt 8(%esp)
+ fldl2e
+ fmulp
+ movl $0xc2820000,-4(%esp)
+ flds -4(%esp)
+ fucomip %st(1),%st
+ fld1
+ jb 1f
+ # x*log2e <= -65, return -1 without underflow
+ fstp %st(1)
+ fchs
+ ret
+1: fld %st(1)
+ fabs
+ fucomip %st(1),%st
+ fstp %st(0)
+ ja 1f
+ f2xm1
+ ret
+1: push %rax
+ call 1f
+ pop %rax
+ fld1
+ fsubrp
+ ret
+
+.global exp2l
+.type exp2l,@function
+exp2l:
+ fldt 8(%esp)
+1: fld %st(0)
+ sub $16,%esp
+ fstpt (%esp)
+ mov 8(%esp),%ax
+ and $0x7fff,%ax
+ cmp $0x3fff+13,%ax
+ jb 4f # |x| < 8192
+ cmp $0x3fff+15,%ax
+ jae 3f # |x| >= 32768
+ fsts (%esp)
+ cmpl $0xc67ff800,(%esp)
+ jb 2f # x > -16382
+ movl $0x5f000000,(%esp)
+ flds (%esp) # 0x1p63
+ fld %st(1)
+ fsub %st(1)
+ faddp
+ fucomip %st(1),%st
+ je 2f # x - 0x1p63 + 0x1p63 == x
+ movl $1,(%esp)
+ flds (%esp) # 0x1p-149
+ fdiv %st(1)
+ fstps (%esp) # raise underflow
+2: fld1
+ fld %st(1)
+ frndint
+ fxch %st(2)
+ fsub %st(2) # st(0)=x-rint(x), st(1)=1, st(2)=rint(x)
+ f2xm1
+ faddp # 2^(x-rint(x))
+1: fscale
+ fstp %st(1)
+ add $16,%esp
+ ret
+3: xor %eax,%eax
+4: cmp $0x3fff-64,%ax
+ fld1
+ jb 1b # |x| < 0x1p-64
+ fstpt (%esp)
+ fistl 8(%esp)
+ fildl 8(%esp)
+ fsubrp %st(1)
+ addl $0x3fff,8(%esp)
+ f2xm1
+ fld1
+ faddp # 2^(x-rint(x))
+ fldt (%esp) # 2^rint(x)
+ fmulp
+ add $16,%esp
+ ret
diff --git a/libc-top-half/musl/src/math/x32/expl.s b/libc-top-half/musl/src/math/x32/expl.s
new file mode 100644
index 0000000..369f7bd
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/expl.s
@@ -0,0 +1,101 @@
+# exp(x) = 2^hi + 2^hi (2^lo - 1)
+# where hi+lo = log2e*x with 128bit precision
+# exact log2e*x calculation depends on nearest rounding mode
+# using the exact multiplication method of Dekker and Veltkamp
+
+.global expl
+.type expl,@function
+expl:
+ fldt 8(%esp)
+
+ # interesting case: 0x1p-32 <= |x| < 16384
+ # check if (exponent|0x8000) is in [0xbfff-32, 0xbfff+13]
+ mov 16(%esp), %ax
+ or $0x8000, %ax
+ sub $0xbfdf, %ax
+ cmp $45, %ax
+ jbe 2f
+ test %ax, %ax
+ fld1
+ js 1f
+ # if |x|>=0x1p14 or nan return 2^trunc(x)
+ fscale
+ fstp %st(1)
+ ret
+ # if |x|<0x1p-32 return 1+x
+1: faddp
+ ret
+
+ # should be 0x1.71547652b82fe178p0L == 0x3fff b8aa3b29 5c17f0bc
+ # it will be wrong on non-nearest rounding mode
+2: fldl2e
+ sub $48, %esp
+ # hi = log2e_hi*x
+ # 2^hi = exp2l(hi)
+ fmul %st(1),%st
+ fld %st(0)
+ fstpt (%esp)
+ fstpt 16(%esp)
+ fstpt 32(%esp)
+ call exp2l@PLT
+ # if 2^hi == inf return 2^hi
+ fld %st(0)
+ fstpt (%esp)
+ cmpw $0x7fff, 8(%esp)
+ je 1f
+ fldt 32(%esp)
+ fldt 16(%esp)
+ # fpu stack: 2^hi x hi
+ # exact mult: x*log2e
+ fld %st(1)
+ # c = 0x1p32+1
+ movq $0x41f0000000100000,%rax
+ pushq %rax
+ fldl (%esp)
+ # xh = x - c*x + c*x
+ # xl = x - xh
+ fmulp
+ fld %st(2)
+ fsub %st(1), %st
+ faddp
+ fld %st(2)
+ fsub %st(1), %st
+ # yh = log2e_hi - c*log2e_hi + c*log2e_hi
+ movq $0x3ff7154765200000,%rax
+ pushq %rax
+ fldl (%esp)
+ # fpu stack: 2^hi x hi xh xl yh
+ # lo = hi - xh*yh + xl*yh
+ fld %st(2)
+ fmul %st(1), %st
+ fsubp %st, %st(4)
+ fmul %st(1), %st
+ faddp %st, %st(3)
+ # yl = log2e_hi - yh
+ movq $0x3de705fc2f000000,%rax
+ pushq %rax
+ fldl (%esp)
+ # fpu stack: 2^hi x lo xh xl yl
+ # lo += xh*yl + xl*yl
+ fmul %st, %st(2)
+ fmulp %st, %st(1)
+ fxch %st(2)
+ faddp
+ faddp
+ # log2e_lo
+ movq $0xbfbe,%rax
+ pushq %rax
+ movq $0x82f0025f2dc582ee,%rax
+ pushq %rax
+ fldt (%esp)
+ add $40,%esp
+ # fpu stack: 2^hi x lo log2e_lo
+ # lo += log2e_lo*x
+ # return 2^hi + 2^hi (2^lo - 1)
+ fmulp %st, %st(2)
+ faddp
+ f2xm1
+ fmul %st(1), %st
+ faddp
+1: add $48, %esp
+ ret
diff --git a/libc-top-half/musl/src/math/x32/expm1l.s b/libc-top-half/musl/src/math/x32/expm1l.s
new file mode 100644
index 0000000..e773f08
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/expm1l.s
@@ -0,0 +1 @@
+# see exp2l.s
diff --git a/libc-top-half/musl/src/math/x32/fabs.s b/libc-top-half/musl/src/math/x32/fabs.s
new file mode 100644
index 0000000..5715005
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/fabs.s
@@ -0,0 +1,9 @@
+.global fabs
+.type fabs,@function
+fabs:
+ xor %eax,%eax
+ dec %rax
+ shr %rax
+ movq %rax,%xmm1
+ andpd %xmm1,%xmm0
+ ret
diff --git a/libc-top-half/musl/src/math/x32/fabsf.s b/libc-top-half/musl/src/math/x32/fabsf.s
new file mode 100644
index 0000000..501a1f1
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/fabsf.s
@@ -0,0 +1,7 @@
+.global fabsf
+.type fabsf,@function
+fabsf:
+ mov $0x7fffffff,%eax
+ movq %rax,%xmm1
+ andps %xmm1,%xmm0
+ ret
diff --git a/libc-top-half/musl/src/math/x32/fabsl.s b/libc-top-half/musl/src/math/x32/fabsl.s
new file mode 100644
index 0000000..4f215df
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/fabsl.s
@@ -0,0 +1,6 @@
+.global fabsl
+.type fabsl,@function
+fabsl:
+ fldt 8(%esp)
+ fabs
+ ret
diff --git a/libc-top-half/musl/src/math/x32/floorl.s b/libc-top-half/musl/src/math/x32/floorl.s
new file mode 100644
index 0000000..78dcb6d
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/floorl.s
@@ -0,0 +1,27 @@
+.global floorl
+.type floorl,@function
+floorl:
+ fldt 8(%esp)
+1: mov $0x7,%al
+1: fstcw 8(%esp)
+ mov 9(%esp),%ah
+ mov %al,9(%esp)
+ fldcw 8(%esp)
+ frndint
+ mov %ah,9(%esp)
+ fldcw 8(%esp)
+ ret
+
+.global ceill
+.type ceill,@function
+ceill:
+ fldt 8(%esp)
+ mov $0xb,%al
+ jmp 1b
+
+.global truncl
+.type truncl,@function
+truncl:
+ fldt 8(%esp)
+ mov $0xf,%al
+ jmp 1b
diff --git a/libc-top-half/musl/src/math/x32/fma.c b/libc-top-half/musl/src/math/x32/fma.c
new file mode 100644
index 0000000..4dd53f2
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/fma.c
@@ -0,0 +1,23 @@
+#include <math.h>
+
+#if __FMA__
+
+double fma(double x, double y, double z)
+{
+ __asm__ ("vfmadd132sd %1, %2, %0" : "+x" (x) : "x" (y), "x" (z));
+ return x;
+}
+
+#elif __FMA4__
+
+double fma(double x, double y, double z)
+{
+ __asm__ ("vfmaddsd %3, %2, %1, %0" : "=x" (x) : "x" (x), "x" (y), "x" (z));
+ return x;
+}
+
+#else
+
+#include "../fma.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/x32/fmaf.c b/libc-top-half/musl/src/math/x32/fmaf.c
new file mode 100644
index 0000000..30b971f
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/fmaf.c
@@ -0,0 +1,23 @@
+#include <math.h>
+
+#if __FMA__
+
+float fmaf(float x, float y, float z)
+{
+ __asm__ ("vfmadd132ss %1, %2, %0" : "+x" (x) : "x" (y), "x" (z));
+ return x;
+}
+
+#elif __FMA4__
+
+float fmaf(float x, float y, float z)
+{
+ __asm__ ("vfmaddss %3, %2, %1, %0" : "=x" (x) : "x" (x), "x" (y), "x" (z));
+ return x;
+}
+
+#else
+
+#include "../fmaf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/x32/fmodl.s b/libc-top-half/musl/src/math/x32/fmodl.s
new file mode 100644
index 0000000..c3f790c
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/fmodl.s
@@ -0,0 +1,11 @@
+.global fmodl
+.type fmodl,@function
+fmodl:
+ fldt 24(%esp)
+ fldt 8(%esp)
+1: fprem
+ fnstsw %ax
+ testb $4,%ah
+ jnz 1b
+ fstp %st(1)
+ ret
diff --git a/libc-top-half/musl/src/math/x32/llrint.s b/libc-top-half/musl/src/math/x32/llrint.s
new file mode 100644
index 0000000..bf47649
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/llrint.s
@@ -0,0 +1,5 @@
+.global llrint
+.type llrint,@function
+llrint:
+ cvtsd2si %xmm0,%rax
+ ret
diff --git a/libc-top-half/musl/src/math/x32/llrintf.s b/libc-top-half/musl/src/math/x32/llrintf.s
new file mode 100644
index 0000000..d7204ac
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/llrintf.s
@@ -0,0 +1,5 @@
+.global llrintf
+.type llrintf,@function
+llrintf:
+ cvtss2si %xmm0,%rax
+ ret
diff --git a/libc-top-half/musl/src/math/x32/llrintl.s b/libc-top-half/musl/src/math/x32/llrintl.s
new file mode 100644
index 0000000..0938607
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/llrintl.s
@@ -0,0 +1,7 @@
+.global llrintl
+.type llrintl,@function
+llrintl:
+ fldt 8(%esp)
+ fistpll 8(%esp)
+ mov 8(%esp),%rax
+ ret
diff --git a/libc-top-half/musl/src/math/x32/log10l.s b/libc-top-half/musl/src/math/x32/log10l.s
new file mode 100644
index 0000000..ef5bea3
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/log10l.s
@@ -0,0 +1,7 @@
+.global log10l
+.type log10l,@function
+log10l:
+ fldlg2
+ fldt 8(%esp)
+ fyl2x
+ ret
diff --git a/libc-top-half/musl/src/math/x32/log1pl.s b/libc-top-half/musl/src/math/x32/log1pl.s
new file mode 100644
index 0000000..2e64fd4
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/log1pl.s
@@ -0,0 +1,15 @@
+.global log1pl
+.type log1pl,@function
+log1pl:
+ mov 14(%esp),%eax
+ fldln2
+ and $0x7fffffff,%eax
+ fldt 8(%esp)
+ cmp $0x3ffd9400,%eax
+ ja 1f
+ fyl2xp1
+ ret
+1: fld1
+ faddp
+ fyl2x
+ ret
diff --git a/libc-top-half/musl/src/math/x32/log2l.s b/libc-top-half/musl/src/math/x32/log2l.s
new file mode 100644
index 0000000..bf88e8e
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/log2l.s
@@ -0,0 +1,7 @@
+.global log2l
+.type log2l,@function
+log2l:
+ fld1
+ fldt 8(%esp)
+ fyl2x
+ ret
diff --git a/libc-top-half/musl/src/math/x32/logl.s b/libc-top-half/musl/src/math/x32/logl.s
new file mode 100644
index 0000000..eff6450
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/logl.s
@@ -0,0 +1,7 @@
+.global logl
+.type logl,@function
+logl:
+ fldln2
+ fldt 8(%esp)
+ fyl2x
+ ret
diff --git a/libc-top-half/musl/src/math/x32/lrint.s b/libc-top-half/musl/src/math/x32/lrint.s
new file mode 100644
index 0000000..15fc245
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/lrint.s
@@ -0,0 +1,5 @@
+.global lrint
+.type lrint,@function
+lrint:
+ cvtsd2si %xmm0,%rax
+ ret
diff --git a/libc-top-half/musl/src/math/x32/lrintf.s b/libc-top-half/musl/src/math/x32/lrintf.s
new file mode 100644
index 0000000..488423d
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/lrintf.s
@@ -0,0 +1,5 @@
+.global lrintf
+.type lrintf,@function
+lrintf:
+ cvtss2si %xmm0,%rax
+ ret
diff --git a/libc-top-half/musl/src/math/x32/lrintl.s b/libc-top-half/musl/src/math/x32/lrintl.s
new file mode 100644
index 0000000..d4355c3
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/lrintl.s
@@ -0,0 +1,7 @@
+.global lrintl
+.type lrintl,@function
+lrintl:
+ fldt 8(%esp)
+ fistpl 8(%esp)
+ movl 8(%esp),%eax
+ ret
diff --git a/libc-top-half/musl/src/math/x32/remainderl.s b/libc-top-half/musl/src/math/x32/remainderl.s
new file mode 100644
index 0000000..376ba0e
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/remainderl.s
@@ -0,0 +1,11 @@
+.global remainderl
+.type remainderl,@function
+remainderl:
+ fldt 24(%esp)
+ fldt 8(%esp)
+1: fprem1
+ fnstsw %ax
+ testb $4,%ah
+ jnz 1b
+ fstp %st(1)
+ ret
diff --git a/libc-top-half/musl/src/math/x32/rintl.s b/libc-top-half/musl/src/math/x32/rintl.s
new file mode 100644
index 0000000..be1d2fa
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/rintl.s
@@ -0,0 +1,6 @@
+.global rintl
+.type rintl,@function
+rintl:
+ fldt 8(%esp)
+ frndint
+ ret
diff --git a/libc-top-half/musl/src/math/x32/sqrt.s b/libc-top-half/musl/src/math/x32/sqrt.s
new file mode 100644
index 0000000..d3c609f
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/sqrt.s
@@ -0,0 +1,4 @@
+.global sqrt
+.type sqrt,@function
+sqrt: sqrtsd %xmm0, %xmm0
+ ret
diff --git a/libc-top-half/musl/src/math/x32/sqrtf.s b/libc-top-half/musl/src/math/x32/sqrtf.s
new file mode 100644
index 0000000..eec48c6
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/sqrtf.s
@@ -0,0 +1,4 @@
+.global sqrtf
+.type sqrtf,@function
+sqrtf: sqrtss %xmm0, %xmm0
+ ret
diff --git a/libc-top-half/musl/src/math/x32/sqrtl.s b/libc-top-half/musl/src/math/x32/sqrtl.s
new file mode 100644
index 0000000..8d70856
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/sqrtl.s
@@ -0,0 +1,5 @@
+.global sqrtl
+.type sqrtl,@function
+sqrtl: fldt 8(%esp)
+ fsqrt
+ ret
diff --git a/libc-top-half/musl/src/math/x32/truncl.s b/libc-top-half/musl/src/math/x32/truncl.s
new file mode 100644
index 0000000..f5cfa3b
--- /dev/null
+++ b/libc-top-half/musl/src/math/x32/truncl.s
@@ -0,0 +1 @@
+# see floorl.s
diff --git a/libc-top-half/musl/src/math/x86_64/__invtrigl.s b/libc-top-half/musl/src/math/x86_64/__invtrigl.s
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/__invtrigl.s
diff --git a/libc-top-half/musl/src/math/x86_64/acosl.s b/libc-top-half/musl/src/math/x86_64/acosl.s
new file mode 100644
index 0000000..88e01b4
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/acosl.s
@@ -0,0 +1,16 @@
+# see ../i386/acos.s
+
+.global acosl
+.type acosl,@function
+acosl:
+ fldt 8(%rsp)
+1: fld %st(0)
+ fld1
+ fsub %st(0),%st(1)
+ fadd %st(2)
+ fmulp
+ fsqrt
+ fabs
+ fxch %st(1)
+ fpatan
+ ret
diff --git a/libc-top-half/musl/src/math/x86_64/asinl.s b/libc-top-half/musl/src/math/x86_64/asinl.s
new file mode 100644
index 0000000..ed212d9
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/asinl.s
@@ -0,0 +1,12 @@
+.global asinl
+.type asinl,@function
+asinl:
+ fldt 8(%rsp)
+1: fld %st(0)
+ fld1
+ fsub %st(0),%st(1)
+ fadd %st(2)
+ fmulp
+ fsqrt
+ fpatan
+ ret
diff --git a/libc-top-half/musl/src/math/x86_64/atan2l.s b/libc-top-half/musl/src/math/x86_64/atan2l.s
new file mode 100644
index 0000000..e5f0a3d
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/atan2l.s
@@ -0,0 +1,7 @@
+.global atan2l
+.type atan2l,@function
+atan2l:
+ fldt 8(%rsp)
+ fldt 24(%rsp)
+ fpatan
+ ret
diff --git a/libc-top-half/musl/src/math/x86_64/atanl.s b/libc-top-half/musl/src/math/x86_64/atanl.s
new file mode 100644
index 0000000..df76de5
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/atanl.s
@@ -0,0 +1,7 @@
+.global atanl
+.type atanl,@function
+atanl:
+ fldt 8(%rsp)
+ fld1
+ fpatan
+ ret
diff --git a/libc-top-half/musl/src/math/x86_64/ceill.s b/libc-top-half/musl/src/math/x86_64/ceill.s
new file mode 100644
index 0000000..f5cfa3b
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/ceill.s
@@ -0,0 +1 @@
+# see floorl.s
diff --git a/libc-top-half/musl/src/math/x86_64/exp2l.s b/libc-top-half/musl/src/math/x86_64/exp2l.s
new file mode 100644
index 0000000..effab2b
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/exp2l.s
@@ -0,0 +1,83 @@
+.global expm1l
+.type expm1l,@function
+expm1l:
+ fldt 8(%rsp)
+ fldl2e
+ fmulp
+ movl $0xc2820000,-4(%rsp)
+ flds -4(%rsp)
+ fucomip %st(1),%st
+ fld1
+ jb 1f
+ # x*log2e <= -65, return -1 without underflow
+ fstp %st(1)
+ fchs
+ ret
+1: fld %st(1)
+ fabs
+ fucomip %st(1),%st
+ fstp %st(0)
+ ja 1f
+ f2xm1
+ ret
+1: push %rax
+ call 1f
+ pop %rax
+ fld1
+ fsubrp
+ ret
+
+.global exp2l
+.type exp2l,@function
+exp2l:
+ fldt 8(%rsp)
+1: fld %st(0)
+ sub $16,%rsp
+ fstpt (%rsp)
+ mov 8(%rsp),%ax
+ and $0x7fff,%ax
+ cmp $0x3fff+13,%ax
+ jb 4f # |x| < 8192
+ cmp $0x3fff+15,%ax
+ jae 3f # |x| >= 32768
+ fsts (%rsp)
+ cmpl $0xc67ff800,(%rsp)
+ jb 2f # x > -16382
+ movl $0x5f000000,(%rsp)
+ flds (%rsp) # 0x1p63
+ fld %st(1)
+ fsub %st(1)
+ faddp
+ fucomip %st(1),%st
+ je 2f # x - 0x1p63 + 0x1p63 == x
+ movl $1,(%rsp)
+ flds (%rsp) # 0x1p-149
+ fdiv %st(1)
+ fstps (%rsp) # raise underflow
+2: fld1
+ fld %st(1)
+ frndint
+ fxch %st(2)
+ fsub %st(2) # st(0)=x-rint(x), st(1)=1, st(2)=rint(x)
+ f2xm1
+ faddp # 2^(x-rint(x))
+1: fscale
+ fstp %st(1)
+ add $16,%rsp
+ ret
+3: xor %eax,%eax
+4: cmp $0x3fff-64,%ax
+ fld1
+ jb 1b # |x| < 0x1p-64
+ fstpt (%rsp)
+ fistl 8(%rsp)
+ fildl 8(%rsp)
+ fsubrp %st(1)
+ addl $0x3fff,8(%rsp)
+ f2xm1
+ fld1
+ faddp # 2^(x-rint(x))
+ fldt (%rsp) # 2^rint(x)
+ fmulp
+ add $16,%rsp
+ ret
diff --git a/libc-top-half/musl/src/math/x86_64/expl.s b/libc-top-half/musl/src/math/x86_64/expl.s
new file mode 100644
index 0000000..798261d
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/expl.s
@@ -0,0 +1,101 @@
+# exp(x) = 2^hi + 2^hi (2^lo - 1)
+# where hi+lo = log2e*x with 128bit precision
+# exact log2e*x calculation depends on nearest rounding mode
+# using the exact multiplication method of Dekker and Veltkamp
+
+.global expl
+.type expl,@function
+expl:
+ fldt 8(%rsp)
+
+ # interesting case: 0x1p-32 <= |x| < 16384
+ # check if (exponent|0x8000) is in [0xbfff-32, 0xbfff+13]
+ mov 16(%rsp), %ax
+ or $0x8000, %ax
+ sub $0xbfdf, %ax
+ cmp $45, %ax
+ jbe 2f
+ test %ax, %ax
+ fld1
+ js 1f
+ # if |x|>=0x1p14 or nan return 2^trunc(x)
+ fscale
+ fstp %st(1)
+ ret
+ # if |x|<0x1p-32 return 1+x
+1: faddp
+ ret
+
+ # should be 0x1.71547652b82fe178p0L == 0x3fff b8aa3b29 5c17f0bc
+ # it will be wrong on non-nearest rounding mode
+2: fldl2e
+ subq $48, %rsp
+ # hi = log2e_hi*x
+ # 2^hi = exp2l(hi)
+ fmul %st(1),%st
+ fld %st(0)
+ fstpt (%rsp)
+ fstpt 16(%rsp)
+ fstpt 32(%rsp)
+ call exp2l@PLT
+ # if 2^hi == inf return 2^hi
+ fld %st(0)
+ fstpt (%rsp)
+ cmpw $0x7fff, 8(%rsp)
+ je 1f
+ fldt 32(%rsp)
+ fldt 16(%rsp)
+ # fpu stack: 2^hi x hi
+ # exact mult: x*log2e
+ fld %st(1)
+ # c = 0x1p32+1
+ movq $0x41f0000000100000,%rax
+ pushq %rax
+ fldl (%rsp)
+ # xh = x - c*x + c*x
+ # xl = x - xh
+ fmulp
+ fld %st(2)
+ fsub %st(1), %st
+ faddp
+ fld %st(2)
+ fsub %st(1), %st
+ # yh = log2e_hi - c*log2e_hi + c*log2e_hi
+ movq $0x3ff7154765200000,%rax
+ pushq %rax
+ fldl (%rsp)
+ # fpu stack: 2^hi x hi xh xl yh
+ # lo = hi - xh*yh + xl*yh
+ fld %st(2)
+ fmul %st(1), %st
+ fsubp %st, %st(4)
+ fmul %st(1), %st
+ faddp %st, %st(3)
+ # yl = log2e_hi - yh
+ movq $0x3de705fc2f000000,%rax
+ pushq %rax
+ fldl (%rsp)
+ # fpu stack: 2^hi x lo xh xl yl
+ # lo += xh*yl + xl*yl
+ fmul %st, %st(2)
+ fmulp %st, %st(1)
+ fxch %st(2)
+ faddp
+ faddp
+ # log2e_lo
+ movq $0xbfbe,%rax
+ pushq %rax
+ movq $0x82f0025f2dc582ee,%rax
+ pushq %rax
+ fldt (%rsp)
+ addq $40,%rsp
+ # fpu stack: 2^hi x lo log2e_lo
+ # lo += log2e_lo*x
+ # return 2^hi + 2^hi (2^lo - 1)
+ fmulp %st, %st(2)
+ faddp
+ f2xm1
+ fmul %st(1), %st
+ faddp
+1: addq $48, %rsp
+ ret
diff --git a/libc-top-half/musl/src/math/x86_64/expm1l.s b/libc-top-half/musl/src/math/x86_64/expm1l.s
new file mode 100644
index 0000000..e773f08
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/expm1l.s
@@ -0,0 +1 @@
+# see exp2l.s
diff --git a/libc-top-half/musl/src/math/x86_64/fabs.c b/libc-top-half/musl/src/math/x86_64/fabs.c
new file mode 100644
index 0000000..1656247
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/fabs.c
@@ -0,0 +1,10 @@
+#include <math.h>
+
+double fabs(double x)
+{
+ double t;
+ __asm__ ("pcmpeqd %0, %0" : "=x"(t)); // t = ~0
+ __asm__ ("psrlq $1, %0" : "+x"(t)); // t >>= 1
+ __asm__ ("andps %1, %0" : "+x"(x) : "x"(t)); // x &= t
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/fabsf.c b/libc-top-half/musl/src/math/x86_64/fabsf.c
new file mode 100644
index 0000000..36ea748
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/fabsf.c
@@ -0,0 +1,10 @@
+#include <math.h>
+
+float fabsf(float x)
+{
+ float t;
+ __asm__ ("pcmpeqd %0, %0" : "=x"(t)); // t = ~0
+ __asm__ ("psrld $1, %0" : "+x"(t)); // t >>= 1
+ __asm__ ("andps %1, %0" : "+x"(x) : "x"(t)); // x &= t
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/fabsl.c b/libc-top-half/musl/src/math/x86_64/fabsl.c
new file mode 100644
index 0000000..cc1c9ed
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/fabsl.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+long double fabsl(long double x)
+{
+ __asm__ ("fabs" : "+t"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/floorl.s b/libc-top-half/musl/src/math/x86_64/floorl.s
new file mode 100644
index 0000000..80da466
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/floorl.s
@@ -0,0 +1,27 @@
+.global floorl
+.type floorl,@function
+floorl:
+ fldt 8(%rsp)
+1: mov $0x7,%al
+1: fstcw 8(%rsp)
+ mov 9(%rsp),%ah
+ mov %al,9(%rsp)
+ fldcw 8(%rsp)
+ frndint
+ mov %ah,9(%rsp)
+ fldcw 8(%rsp)
+ ret
+
+.global ceill
+.type ceill,@function
+ceill:
+ fldt 8(%rsp)
+ mov $0xb,%al
+ jmp 1b
+
+.global truncl
+.type truncl,@function
+truncl:
+ fldt 8(%rsp)
+ mov $0xf,%al
+ jmp 1b
diff --git a/libc-top-half/musl/src/math/x86_64/fma.c b/libc-top-half/musl/src/math/x86_64/fma.c
new file mode 100644
index 0000000..4dd53f2
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/fma.c
@@ -0,0 +1,23 @@
+#include <math.h>
+
+#if __FMA__
+
+double fma(double x, double y, double z)
+{
+ __asm__ ("vfmadd132sd %1, %2, %0" : "+x" (x) : "x" (y), "x" (z));
+ return x;
+}
+
+#elif __FMA4__
+
+double fma(double x, double y, double z)
+{
+ __asm__ ("vfmaddsd %3, %2, %1, %0" : "=x" (x) : "x" (x), "x" (y), "x" (z));
+ return x;
+}
+
+#else
+
+#include "../fma.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/x86_64/fmaf.c b/libc-top-half/musl/src/math/x86_64/fmaf.c
new file mode 100644
index 0000000..30b971f
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/fmaf.c
@@ -0,0 +1,23 @@
+#include <math.h>
+
+#if __FMA__
+
+float fmaf(float x, float y, float z)
+{
+ __asm__ ("vfmadd132ss %1, %2, %0" : "+x" (x) : "x" (y), "x" (z));
+ return x;
+}
+
+#elif __FMA4__
+
+float fmaf(float x, float y, float z)
+{
+ __asm__ ("vfmaddss %3, %2, %1, %0" : "=x" (x) : "x" (x), "x" (y), "x" (z));
+ return x;
+}
+
+#else
+
+#include "../fmaf.c"
+
+#endif
diff --git a/libc-top-half/musl/src/math/x86_64/fmodl.c b/libc-top-half/musl/src/math/x86_64/fmodl.c
new file mode 100644
index 0000000..3daeab0
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/fmodl.c
@@ -0,0 +1,9 @@
+#include <math.h>
+
+long double fmodl(long double x, long double y)
+{
+ unsigned short fpsr;
+ do __asm__ ("fprem; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
+ while (fpsr & 0x400);
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/llrint.c b/libc-top-half/musl/src/math/x86_64/llrint.c
new file mode 100644
index 0000000..dd38a72
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/llrint.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long long llrint(double x)
+{
+ long long r;
+ __asm__ ("cvtsd2si %1, %0" : "=r"(r) : "x"(x));
+ return r;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/llrintf.c b/libc-top-half/musl/src/math/x86_64/llrintf.c
new file mode 100644
index 0000000..fc8625e
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/llrintf.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long long llrintf(float x)
+{
+ long long r;
+ __asm__ ("cvtss2si %1, %0" : "=r"(r) : "x"(x));
+ return r;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/llrintl.c b/libc-top-half/musl/src/math/x86_64/llrintl.c
new file mode 100644
index 0000000..c439ef2
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/llrintl.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long long llrintl(long double x)
+{
+ long long r;
+ __asm__ ("fistpll %0" : "=m"(r) : "t"(x) : "st");
+ return r;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/log10l.s b/libc-top-half/musl/src/math/x86_64/log10l.s
new file mode 100644
index 0000000..48ea4af
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/log10l.s
@@ -0,0 +1,7 @@
+.global log10l
+.type log10l,@function
+log10l:
+ fldlg2
+ fldt 8(%rsp)
+ fyl2x
+ ret
diff --git a/libc-top-half/musl/src/math/x86_64/log1pl.s b/libc-top-half/musl/src/math/x86_64/log1pl.s
new file mode 100644
index 0000000..955c9db
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/log1pl.s
@@ -0,0 +1,15 @@
+.global log1pl
+.type log1pl,@function
+log1pl:
+ mov 14(%rsp),%eax
+ fldln2
+ and $0x7fffffff,%eax
+ fldt 8(%rsp)
+ cmp $0x3ffd9400,%eax
+ ja 1f
+ fyl2xp1
+ ret
+1: fld1
+ faddp
+ fyl2x
+ ret
diff --git a/libc-top-half/musl/src/math/x86_64/log2l.s b/libc-top-half/musl/src/math/x86_64/log2l.s
new file mode 100644
index 0000000..ba08b9f
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/log2l.s
@@ -0,0 +1,7 @@
+.global log2l
+.type log2l,@function
+log2l:
+ fld1
+ fldt 8(%rsp)
+ fyl2x
+ ret
diff --git a/libc-top-half/musl/src/math/x86_64/logl.s b/libc-top-half/musl/src/math/x86_64/logl.s
new file mode 100644
index 0000000..20dd1f8
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/logl.s
@@ -0,0 +1,7 @@
+.global logl
+.type logl,@function
+logl:
+ fldln2
+ fldt 8(%rsp)
+ fyl2x
+ ret
diff --git a/libc-top-half/musl/src/math/x86_64/lrint.c b/libc-top-half/musl/src/math/x86_64/lrint.c
new file mode 100644
index 0000000..a742fec
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/lrint.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long lrint(double x)
+{
+ long r;
+ __asm__ ("cvtsd2si %1, %0" : "=r"(r) : "x"(x));
+ return r;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/lrintf.c b/libc-top-half/musl/src/math/x86_64/lrintf.c
new file mode 100644
index 0000000..2ba5639
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/lrintf.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long lrintf(float x)
+{
+ long r;
+ __asm__ ("cvtss2si %1, %0" : "=r"(r) : "x"(x));
+ return r;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/lrintl.c b/libc-top-half/musl/src/math/x86_64/lrintl.c
new file mode 100644
index 0000000..068e2e4
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/lrintl.c
@@ -0,0 +1,8 @@
+#include <math.h>
+
+long lrintl(long double x)
+{
+ long r;
+ __asm__ ("fistpll %0" : "=m"(r) : "t"(x) : "st");
+ return r;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/remainderl.c b/libc-top-half/musl/src/math/x86_64/remainderl.c
new file mode 100644
index 0000000..8cf7507
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/remainderl.c
@@ -0,0 +1,9 @@
+#include <math.h>
+
+long double remainderl(long double x, long double y)
+{
+ unsigned short fpsr;
+ do __asm__ ("fprem1; fnstsw %%ax" : "+t"(x), "=a"(fpsr) : "u"(y));
+ while (fpsr & 0x400);
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/remquol.c b/libc-top-half/musl/src/math/x86_64/remquol.c
new file mode 100644
index 0000000..60eef08
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/remquol.c
@@ -0,0 +1,32 @@
+#include <math.h>
+
+long double remquol(long double x, long double y, int *quo)
+{
+ signed char *cx = (void *)&x, *cy = (void *)&y;
+ /* By ensuring that addresses of x and y cannot be discarded,
+ * this empty asm guides GCC into representing extraction of
+ * their sign bits as memory loads rather than making x and y
+ * not-address-taken internally and using bitfield operations,
+ * which in the end wouldn't work out, as extraction from FPU
+ * registers needs to go through memory anyway. This way GCC
+ * should manage to use incoming stack slots without spills. */
+ __asm__ ("" :: "X"(cx), "X"(cy));
+
+ long double t = x;
+ unsigned fpsr;
+ do __asm__ ("fprem1; fnstsw %%ax" : "+t"(t), "=a"(fpsr) : "u"(y));
+ while (fpsr & 0x400);
+ /* C0, C1, C3 flags in x87 status word carry low bits of quotient:
+ * 15 14 13 12 11 10 9 8
+ * . C3 . . . C2 C1 C0
+ * . b1 . . . 0 b0 b2 */
+ unsigned char i = fpsr >> 8;
+ i = i>>4 | i<<4;
+ /* i[5:2] is now {b0 b2 ? b1}. Retrieve {0 b2 b1 b0} via
+ * in-register table lookup. */
+ unsigned qbits = 0x7575313164642020 >> (i & 60);
+ qbits &= 7;
+
+ *quo = (cx[9]^cy[9]) < 0 ? -qbits : qbits;
+ return t;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/rintl.c b/libc-top-half/musl/src/math/x86_64/rintl.c
new file mode 100644
index 0000000..e1a9207
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/rintl.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+long double rintl(long double x)
+{
+ __asm__ ("frndint" : "+t"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/sqrt.c b/libc-top-half/musl/src/math/x86_64/sqrt.c
new file mode 100644
index 0000000..657e09e
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/sqrt.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+double sqrt(double x)
+{
+ __asm__ ("sqrtsd %1, %0" : "=x"(x) : "x"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/sqrtf.c b/libc-top-half/musl/src/math/x86_64/sqrtf.c
new file mode 100644
index 0000000..720baec
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/sqrtf.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+float sqrtf(float x)
+{
+ __asm__ ("sqrtss %1, %0" : "=x"(x) : "x"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/sqrtl.c b/libc-top-half/musl/src/math/x86_64/sqrtl.c
new file mode 100644
index 0000000..864cfcc
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/sqrtl.c
@@ -0,0 +1,7 @@
+#include <math.h>
+
+long double sqrtl(long double x)
+{
+ __asm__ ("fsqrt" : "+t"(x));
+ return x;
+}
diff --git a/libc-top-half/musl/src/math/x86_64/truncl.s b/libc-top-half/musl/src/math/x86_64/truncl.s
new file mode 100644
index 0000000..f5cfa3b
--- /dev/null
+++ b/libc-top-half/musl/src/math/x86_64/truncl.s
@@ -0,0 +1 @@
+# see floorl.s
diff --git a/libc-top-half/musl/src/misc/a64l.c b/libc-top-half/musl/src/misc/a64l.c
new file mode 100644
index 0000000..6055771
--- /dev/null
+++ b/libc-top-half/musl/src/misc/a64l.c
@@ -0,0 +1,29 @@
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+static const char digits[] =
+ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+long a64l(const char *s)
+{
+ int e;
+ uint32_t x = 0;
+ for (e=0; e<36 && *s; e+=6, s++) {
+ const char *d = strchr(digits, *s);
+ if (!d) break;
+ x |= (uint32_t)(d-digits)<<e;
+ }
+ return (int32_t)x;
+}
+
+char *l64a(long x0)
+{
+ static char s[7];
+ char *p;
+ uint32_t x = x0;
+ for (p=s; x; p++, x>>=6)
+ *p = digits[x&63];
+ *p = 0;
+ return s;
+}
diff --git a/libc-top-half/musl/src/misc/basename.c b/libc-top-half/musl/src/misc/basename.c
new file mode 100644
index 0000000..438377b
--- /dev/null
+++ b/libc-top-half/musl/src/misc/basename.c
@@ -0,0 +1,14 @@
+#include <string.h>
+#include <libgen.h>
+
+char *basename(char *s)
+{
+ size_t i;
+ if (!s || !*s) return ".";
+ i = strlen(s)-1;
+ for (; i&&s[i]=='/'; i--) s[i] = 0;
+ for (; i&&s[i-1]!='/'; i--);
+ return s+i;
+}
+
+weak_alias(basename, __xpg_basename);
diff --git a/libc-top-half/musl/src/misc/dirname.c b/libc-top-half/musl/src/misc/dirname.c
new file mode 100644
index 0000000..dd57088
--- /dev/null
+++ b/libc-top-half/musl/src/misc/dirname.c
@@ -0,0 +1,14 @@
+#include <string.h>
+#include <libgen.h>
+
+char *dirname(char *s)
+{
+ size_t i;
+ if (!s || !*s) return ".";
+ i = strlen(s)-1;
+ for (; s[i]=='/'; i--) if (!i) return "/";
+ for (; s[i]!='/'; i--) if (!i) return ".";
+ for (; s[i]=='/'; i--) if (!i) return "/";
+ s[i+1] = 0;
+ return s;
+}
diff --git a/libc-top-half/musl/src/misc/ffs.c b/libc-top-half/musl/src/misc/ffs.c
new file mode 100644
index 0000000..673ce5a
--- /dev/null
+++ b/libc-top-half/musl/src/misc/ffs.c
@@ -0,0 +1,7 @@
+#include <strings.h>
+#include "atomic.h"
+
+int ffs(int i)
+{
+ return i ? a_ctz_l(i)+1 : 0;
+}
diff --git a/libc-top-half/musl/src/misc/ffsl.c b/libc-top-half/musl/src/misc/ffsl.c
new file mode 100644
index 0000000..0105c66
--- /dev/null
+++ b/libc-top-half/musl/src/misc/ffsl.c
@@ -0,0 +1,7 @@
+#include <strings.h>
+#include "atomic.h"
+
+int ffsl(long i)
+{
+ return i ? a_ctz_l(i)+1 : 0;
+}
diff --git a/libc-top-half/musl/src/misc/ffsll.c b/libc-top-half/musl/src/misc/ffsll.c
new file mode 100644
index 0000000..0c5ced8
--- /dev/null
+++ b/libc-top-half/musl/src/misc/ffsll.c
@@ -0,0 +1,7 @@
+#include <strings.h>
+#include "atomic.h"
+
+int ffsll(long long i)
+{
+ return i ? a_ctz_64(i)+1 : 0;
+}
diff --git a/libc-top-half/musl/src/misc/fmtmsg.c b/libc-top-half/musl/src/misc/fmtmsg.c
new file mode 100644
index 0000000..0c66076
--- /dev/null
+++ b/libc-top-half/musl/src/misc/fmtmsg.c
@@ -0,0 +1,96 @@
+/* Public domain fmtmsg()
+ * Written by Isaac Dunham, 2014
+ */
+#include <fmtmsg.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#include <pthread.h>
+#endif
+
+/*
+ * If lstr is the first part of bstr, check that the next char in bstr
+ * is either \0 or :
+ */
+static int _strcolcmp(const char *lstr, const char *bstr)
+{
+ size_t i = 0;
+ while (lstr[i] && bstr[i] && (bstr[i] == lstr[i])) i++;
+ if ( lstr[i] || (bstr[i] && bstr[i] != ':')) return 1;
+ return 0;
+}
+
+int fmtmsg(long classification, const char *label, int severity,
+ const char *text, const char *action, const char *tag)
+{
+ int ret = 0, i, consolefd, verb = 0;
+ char *errstring = MM_NULLSEV, *cmsg = getenv("MSGVERB");
+ char *const msgs[] = {
+ "label", "severity", "text", "action", "tag", NULL
+ };
+ int cs;
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+#endif
+
+ if (severity == MM_HALT) errstring = "HALT: ";
+ else if (severity == MM_ERROR) errstring = "ERROR: ";
+ else if (severity == MM_WARNING) errstring = "WARNING: ";
+ else if (severity == MM_INFO) errstring = "INFO: ";
+
+ if (classification & MM_CONSOLE) {
+ consolefd = open("/dev/console", O_WRONLY);
+ if (consolefd < 0) {
+ ret = MM_NOCON;
+ } else {
+ if (dprintf(consolefd, "%s%s%s%s%s%s%s%s\n",
+ label?label:"", label?": ":"",
+ severity?errstring:"", text?text:"",
+ action?"\nTO FIX: ":"",
+ action?action:"", action?" ":"",
+ tag?tag:"" )<1)
+ ret = MM_NOCON;
+ close(consolefd);
+ }
+ }
+
+ if (classification & MM_PRINT) {
+ while (cmsg && cmsg[0]) {
+ for(i=0; msgs[i]; i++) {
+ if (!_strcolcmp(msgs[i], cmsg)) break;
+ }
+ if (msgs[i] == NULL) {
+ //ignore MSGVERB-unrecognized component
+ verb = 0xFF;
+ break;
+ } else {
+ verb |= (1 << i);
+ cmsg = strchr(cmsg, ':');
+ if (cmsg) cmsg++;
+ }
+ }
+ if (!verb) verb = 0xFF;
+ if (dprintf(2, "%s%s%s%s%s%s%s%s\n",
+ (verb&1 && label) ? label : "",
+ (verb&1 && label) ? ": " : "",
+ (verb&2 && severity) ? errstring : "",
+ (verb&4 && text) ? text : "",
+ (verb&8 && action) ? "\nTO FIX: " : "",
+ (verb&8 && action) ? action : "",
+ (verb&8 && action) ? " " : "",
+ (verb&16 && tag) ? tag : "" ) < 1)
+ ret |= MM_NOMSG;
+ }
+ if ((ret & (MM_NOCON|MM_NOMSG)) == (MM_NOCON|MM_NOMSG))
+ ret = MM_NOTOK;
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ pthread_setcancelstate(cs, 0);
+#endif
+
+ return ret;
+}
diff --git a/libc-top-half/musl/src/misc/forkpty.c b/libc-top-half/musl/src/misc/forkpty.c
new file mode 100644
index 0000000..caf13ad
--- /dev/null
+++ b/libc-top-half/musl/src/misc/forkpty.c
@@ -0,0 +1,57 @@
+#include <pty.h>
+#include <utmp.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/wait.h>
+#include <pthread.h>
+
+int forkpty(int *pm, char *name, const struct termios *tio, const struct winsize *ws)
+{
+ int m, s, ec=0, p[2], cs;
+ pid_t pid=-1;
+ sigset_t set, oldset;
+
+ if (openpty(&m, &s, name, tio, ws) < 0) return -1;
+
+ sigfillset(&set);
+ pthread_sigmask(SIG_BLOCK, &set, &oldset);
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
+ if (pipe2(p, O_CLOEXEC)) {
+ close(s);
+ goto out;
+ }
+
+ pid = fork();
+ if (!pid) {
+ close(m);
+ close(p[0]);
+ if (login_tty(s)) {
+ write(p[1], &errno, sizeof errno);
+ _exit(127);
+ }
+ close(p[1]);
+ pthread_setcancelstate(cs, 0);
+ pthread_sigmask(SIG_SETMASK, &oldset, 0);
+ return 0;
+ }
+ close(s);
+ close(p[1]);
+ if (read(p[0], &ec, sizeof ec) > 0) {
+ int status;
+ waitpid(pid, &status, 0);
+ pid = -1;
+ errno = ec;
+ }
+ close(p[0]);
+
+out:
+ if (pid > 0) *pm = m;
+ else close(m);
+
+ pthread_setcancelstate(cs, 0);
+ pthread_sigmask(SIG_SETMASK, &oldset, 0);
+
+ return pid;
+}
diff --git a/libc-top-half/musl/src/misc/get_current_dir_name.c b/libc-top-half/musl/src/misc/get_current_dir_name.c
new file mode 100644
index 0000000..782cddc
--- /dev/null
+++ b/libc-top-half/musl/src/misc/get_current_dir_name.c
@@ -0,0 +1,15 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+char *get_current_dir_name(void) {
+ struct stat a, b;
+ char *res = getenv("PWD");
+ if (res && *res && !stat(res, &a) && !stat(".", &b)
+ && (a.st_dev == b.st_dev) && (a.st_ino == b.st_ino))
+ return strdup(res);
+ return getcwd(0, 0);
+}
diff --git a/libc-top-half/musl/src/misc/getauxval.c b/libc-top-half/musl/src/misc/getauxval.c
new file mode 100644
index 0000000..57f21ee
--- /dev/null
+++ b/libc-top-half/musl/src/misc/getauxval.c
@@ -0,0 +1,15 @@
+#include <sys/auxv.h>
+#include <errno.h>
+#include "libc.h"
+
+unsigned long __getauxval(unsigned long item)
+{
+ size_t *auxv = libc.auxv;
+ if (item == AT_SECURE) return libc.secure;
+ for (; *auxv; auxv+=2)
+ if (*auxv==item) return auxv[1];
+ errno = ENOENT;
+ return 0;
+}
+
+weak_alias(__getauxval, getauxval);
diff --git a/libc-top-half/musl/src/misc/getdomainname.c b/libc-top-half/musl/src/misc/getdomainname.c
new file mode 100644
index 0000000..59df566
--- /dev/null
+++ b/libc-top-half/musl/src/misc/getdomainname.c
@@ -0,0 +1,17 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <sys/utsname.h>
+#include <string.h>
+#include <errno.h>
+
+int getdomainname(char *name, size_t len)
+{
+ struct utsname temp;
+ uname(&temp);
+ if (!len || strlen(temp.domainname) >= len) {
+ errno = EINVAL;
+ return -1;
+ }
+ strcpy(name, temp.domainname);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/misc/getentropy.c b/libc-top-half/musl/src/misc/getentropy.c
new file mode 100644
index 0000000..651ea95
--- /dev/null
+++ b/libc-top-half/musl/src/misc/getentropy.c
@@ -0,0 +1,33 @@
+#define _BSD_SOURCE
+#include <unistd.h>
+#include <sys/random.h>
+#include <pthread.h>
+#include <errno.h>
+
+int getentropy(void *buffer, size_t len)
+{
+ int cs, ret = 0;
+ char *pos = buffer;
+
+ if (len > 256) {
+ errno = EIO;
+ return -1;
+ }
+
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
+ while (len) {
+ ret = getrandom(pos, len, 0);
+ if (ret < 0) {
+ if (errno == EINTR) continue;
+ else break;
+ }
+ pos += ret;
+ len -= ret;
+ ret = 0;
+ }
+
+ pthread_setcancelstate(cs, 0);
+
+ return ret;
+}
diff --git a/libc-top-half/musl/src/misc/gethostid.c b/libc-top-half/musl/src/misc/gethostid.c
new file mode 100644
index 0000000..25bb35d
--- /dev/null
+++ b/libc-top-half/musl/src/misc/gethostid.c
@@ -0,0 +1,6 @@
+#include <unistd.h>
+
+long gethostid()
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/misc/getopt.c b/libc-top-half/musl/src/misc/getopt.c
new file mode 100644
index 0000000..c3f6699
--- /dev/null
+++ b/libc-top-half/musl/src/misc/getopt.c
@@ -0,0 +1,105 @@
+#define _BSD_SOURCE
+#include <unistd.h>
+#include <wchar.h>
+#include <string.h>
+#include <limits.h>
+#include <stdlib.h>
+#include "locale_impl.h"
+#include "stdio_impl.h"
+
+char *optarg;
+int optind=1, opterr=1, optopt, __optpos, __optreset=0;
+
+#define optpos __optpos
+weak_alias(__optreset, optreset);
+
+void __getopt_msg(const char *a, const char *b, const char *c, size_t l)
+{
+ FILE *f = stderr;
+ b = __lctrans_cur(b);
+ FLOCK(f);
+ fputs(a, f)>=0
+ && fwrite(b, strlen(b), 1, f)
+ && fwrite(c, 1, l, f)==l
+ && putc('\n', f);
+ FUNLOCK(f);
+}
+
+int getopt(int argc, char * const argv[], const char *optstring)
+{
+ int i;
+ wchar_t c, d;
+ int k, l;
+ char *optchar;
+
+ if (!optind || __optreset) {
+ __optreset = 0;
+ __optpos = 0;
+ optind = 1;
+ }
+
+ if (optind >= argc || !argv[optind])
+ return -1;
+
+ if (argv[optind][0] != '-') {
+ if (optstring[0] == '-') {
+ optarg = argv[optind++];
+ return 1;
+ }
+ return -1;
+ }
+
+ if (!argv[optind][1])
+ return -1;
+
+ if (argv[optind][1] == '-' && !argv[optind][2])
+ return optind++, -1;
+
+ if (!optpos) optpos++;
+ if ((k = mbtowc(&c, argv[optind]+optpos, MB_LEN_MAX)) < 0) {
+ k = 1;
+ c = 0xfffd; /* replacement char */
+ }
+ optchar = argv[optind]+optpos;
+ optpos += k;
+
+ if (!argv[optind][optpos]) {
+ optind++;
+ optpos = 0;
+ }
+
+ if (optstring[0] == '-' || optstring[0] == '+')
+ optstring++;
+
+ i = 0;
+ d = 0;
+ do {
+ l = mbtowc(&d, optstring+i, MB_LEN_MAX);
+ if (l>0) i+=l; else i++;
+ } while (l && d != c);
+
+ if (d != c || c == ':') {
+ optopt = c;
+ if (optstring[0] != ':' && opterr)
+ __getopt_msg(argv[0], ": unrecognized option: ", optchar, k);
+ return '?';
+ }
+ if (optstring[i] == ':') {
+ optarg = 0;
+ if (optstring[i+1] != ':' || optpos) {
+ optarg = argv[optind++] + optpos;
+ optpos = 0;
+ }
+ if (optind > argc) {
+ optopt = c;
+ if (optstring[0] == ':') return ':';
+ if (opterr) __getopt_msg(argv[0],
+ ": option requires an argument: ",
+ optchar, k);
+ return '?';
+ }
+ }
+ return c;
+}
+
+weak_alias(getopt, __posix_getopt);
diff --git a/libc-top-half/musl/src/misc/getopt_long.c b/libc-top-half/musl/src/misc/getopt_long.c
new file mode 100644
index 0000000..6949ab1
--- /dev/null
+++ b/libc-top-half/musl/src/misc/getopt_long.c
@@ -0,0 +1,148 @@
+#define _GNU_SOURCE
+#include <stddef.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <getopt.h>
+#include <stdio.h>
+#include <string.h>
+#include "stdio_impl.h"
+
+extern int __optpos, __optreset;
+
+static void permute(char *const *argv, int dest, int src)
+{
+ char **av = (char **)argv;
+ char *tmp = av[src];
+ int i;
+ for (i=src; i>dest; i--)
+ av[i] = av[i-1];
+ av[dest] = tmp;
+}
+
+static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly);
+
+static int __getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly)
+{
+ int ret, skipped, resumed;
+ if (!optind || __optreset) {
+ __optreset = 0;
+ __optpos = 0;
+ optind = 1;
+ }
+ if (optind >= argc || !argv[optind]) return -1;
+ skipped = optind;
+ if (optstring[0] != '+' && optstring[0] != '-') {
+ int i;
+ for (i=optind; ; i++) {
+ if (i >= argc || !argv[i]) return -1;
+ if (argv[i][0] == '-' && argv[i][1]) break;
+ }
+ optind = i;
+ }
+ resumed = optind;
+ ret = __getopt_long_core(argc, argv, optstring, longopts, idx, longonly);
+ if (resumed > skipped) {
+ int i, cnt = optind-resumed;
+ for (i=0; i<cnt; i++)
+ permute(argv, skipped, optind-1);
+ optind = skipped + cnt;
+ }
+ return ret;
+}
+
+static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly)
+{
+ optarg = 0;
+ if (longopts && argv[optind][0] == '-' &&
+ ((longonly && argv[optind][1] && argv[optind][1] != '-') ||
+ (argv[optind][1] == '-' && argv[optind][2])))
+ {
+ int colon = optstring[optstring[0]=='+'||optstring[0]=='-']==':';
+ int i, cnt, match;
+ char *arg, *opt, *start = argv[optind]+1;
+ for (cnt=i=0; longopts[i].name; i++) {
+ const char *name = longopts[i].name;
+ opt = start;
+ if (*opt == '-') opt++;
+ while (*opt && *opt != '=' && *opt == *name)
+ name++, opt++;
+ if (*opt && *opt != '=') continue;
+ arg = opt;
+ match = i;
+ if (!*name) {
+ cnt = 1;
+ break;
+ }
+ cnt++;
+ }
+ if (cnt==1 && longonly && arg-start == mblen(start, MB_LEN_MAX)) {
+ int l = arg-start;
+ for (i=0; optstring[i]; i++) {
+ int j;
+ for (j=0; j<l && start[j]==optstring[i+j]; j++);
+ if (j==l) {
+ cnt++;
+ break;
+ }
+ }
+ }
+ if (cnt==1) {
+ i = match;
+ opt = arg;
+ optind++;
+ if (*opt == '=') {
+ if (!longopts[i].has_arg) {
+ optopt = longopts[i].val;
+ if (colon || !opterr)
+ return '?';
+ __getopt_msg(argv[0],
+ ": option does not take an argument: ",
+ longopts[i].name,
+ strlen(longopts[i].name));
+ return '?';
+ }
+ optarg = opt+1;
+ } else if (longopts[i].has_arg == required_argument) {
+ if (!(optarg = argv[optind])) {
+ optopt = longopts[i].val;
+ if (colon) return ':';
+ if (!opterr) return '?';
+ __getopt_msg(argv[0],
+ ": option requires an argument: ",
+ longopts[i].name,
+ strlen(longopts[i].name));
+ return '?';
+ }
+ optind++;
+ }
+ if (idx) *idx = i;
+ if (longopts[i].flag) {
+ *longopts[i].flag = longopts[i].val;
+ return 0;
+ }
+ return longopts[i].val;
+ }
+ if (argv[optind][1] == '-') {
+ optopt = 0;
+ if (!colon && opterr)
+ __getopt_msg(argv[0], cnt ?
+ ": option is ambiguous: " :
+ ": unrecognized option: ",
+ argv[optind]+2,
+ strlen(argv[optind]+2));
+ optind++;
+ return '?';
+ }
+ }
+ return getopt(argc, argv, optstring);
+}
+
+int getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx)
+{
+ return __getopt_long(argc, argv, optstring, longopts, idx, 0);
+}
+
+int getopt_long_only(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx)
+{
+ return __getopt_long(argc, argv, optstring, longopts, idx, 1);
+}
diff --git a/libc-top-half/musl/src/misc/getpriority.c b/libc-top-half/musl/src/misc/getpriority.c
new file mode 100644
index 0000000..5c0b168
--- /dev/null
+++ b/libc-top-half/musl/src/misc/getpriority.c
@@ -0,0 +1,9 @@
+#include <sys/resource.h>
+#include "syscall.h"
+
+int getpriority(int which, id_t who)
+{
+ int ret = syscall(SYS_getpriority, which, who);
+ if (ret < 0) return ret;
+ return 20-ret;
+}
diff --git a/libc-top-half/musl/src/misc/getresgid.c b/libc-top-half/musl/src/misc/getresgid.c
new file mode 100644
index 0000000..d00d9a9
--- /dev/null
+++ b/libc-top-half/musl/src/misc/getresgid.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include "syscall.h"
+
+int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid)
+{
+ return syscall(SYS_getresgid, rgid, egid, sgid);
+}
diff --git a/libc-top-half/musl/src/misc/getresuid.c b/libc-top-half/musl/src/misc/getresuid.c
new file mode 100644
index 0000000..d75d5d4
--- /dev/null
+++ b/libc-top-half/musl/src/misc/getresuid.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include "syscall.h"
+
+int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid)
+{
+ return syscall(SYS_getresuid, ruid, euid, suid);
+}
diff --git a/libc-top-half/musl/src/misc/getrlimit.c b/libc-top-half/musl/src/misc/getrlimit.c
new file mode 100644
index 0000000..2ab2f0f
--- /dev/null
+++ b/libc-top-half/musl/src/misc/getrlimit.c
@@ -0,0 +1,26 @@
+#include <sys/resource.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define FIX(x) do{ if ((x)>=SYSCALL_RLIM_INFINITY) (x)=RLIM_INFINITY; }while(0)
+
+int getrlimit(int resource, struct rlimit *rlim)
+{
+ unsigned long k_rlim[2];
+ int ret = syscall(SYS_prlimit64, 0, resource, 0, rlim);
+ if (!ret) {
+ FIX(rlim->rlim_cur);
+ FIX(rlim->rlim_max);
+ }
+ if (!ret || errno != ENOSYS)
+ return ret;
+ if (syscall(SYS_getrlimit, resource, k_rlim) < 0)
+ return -1;
+ rlim->rlim_cur = k_rlim[0] == -1UL ? RLIM_INFINITY : k_rlim[0];
+ rlim->rlim_max = k_rlim[1] == -1UL ? RLIM_INFINITY : k_rlim[1];
+ FIX(rlim->rlim_cur);
+ FIX(rlim->rlim_max);
+ return 0;
+}
+
+weak_alias(getrlimit, getrlimit64);
diff --git a/libc-top-half/musl/src/misc/getrusage.c b/libc-top-half/musl/src/misc/getrusage.c
new file mode 100644
index 0000000..8e03e2e
--- /dev/null
+++ b/libc-top-half/musl/src/misc/getrusage.c
@@ -0,0 +1,35 @@
+#include <sys/resource.h>
+#include <string.h>
+#include <errno.h>
+#include "syscall.h"
+
+int getrusage(int who, struct rusage *ru)
+{
+ int r;
+#ifdef SYS_getrusage_time64
+ long long kru64[18];
+ r = __syscall(SYS_getrusage_time64, who, kru64);
+ if (!r) {
+ ru->ru_utime = (struct timeval)
+ { .tv_sec = kru64[0], .tv_usec = kru64[1] };
+ ru->ru_stime = (struct timeval)
+ { .tv_sec = kru64[2], .tv_usec = kru64[3] };
+ char *slots = (char *)&ru->ru_maxrss;
+ for (int i=0; i<14; i++)
+ *(long *)(slots + i*sizeof(long)) = kru64[4+i];
+ }
+ if (SYS_getrusage_time64 == SYS_getrusage || r != -ENOSYS)
+ return __syscall_ret(r);
+#endif
+ char *dest = (char *)&ru->ru_maxrss - 4*sizeof(long);
+ r = __syscall(SYS_getrusage, who, dest);
+ if (!r && sizeof(time_t) > sizeof(long)) {
+ long kru[4];
+ memcpy(kru, dest, 4*sizeof(long));
+ ru->ru_utime = (struct timeval)
+ { .tv_sec = kru[0], .tv_usec = kru[1] };
+ ru->ru_stime = (struct timeval)
+ { .tv_sec = kru[2], .tv_usec = kru[3] };
+ }
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/misc/getsubopt.c b/libc-top-half/musl/src/misc/getsubopt.c
new file mode 100644
index 0000000..53ee957
--- /dev/null
+++ b/libc-top-half/musl/src/misc/getsubopt.c
@@ -0,0 +1,23 @@
+#include <stdlib.h>
+#include <string.h>
+
+int getsubopt(char **opt, char *const *keys, char **val)
+{
+ char *s = *opt;
+ int i;
+
+ *val = NULL;
+ *opt = strchr(s, ',');
+ if (*opt) *(*opt)++ = 0;
+ else *opt = s + strlen(s);
+
+ for (i=0; keys[i]; i++) {
+ size_t l = strlen(keys[i]);
+ if (strncmp(keys[i], s, l)) continue;
+ if (s[l] == '=')
+ *val = s + l + 1;
+ else if (s[l]) continue;
+ return i;
+ }
+ return -1;
+}
diff --git a/libc-top-half/musl/src/misc/initgroups.c b/libc-top-half/musl/src/misc/initgroups.c
new file mode 100644
index 0000000..922a958
--- /dev/null
+++ b/libc-top-half/musl/src/misc/initgroups.c
@@ -0,0 +1,11 @@
+#define _GNU_SOURCE
+#include <grp.h>
+#include <limits.h>
+
+int initgroups(const char *user, gid_t gid)
+{
+ gid_t groups[NGROUPS_MAX];
+ int count = NGROUPS_MAX;
+ if (getgrouplist(user, gid, groups, &count) < 0) return -1;
+ return setgroups(count, groups);
+}
diff --git a/libc-top-half/musl/src/misc/ioctl.c b/libc-top-half/musl/src/misc/ioctl.c
new file mode 100644
index 0000000..35804f0
--- /dev/null
+++ b/libc-top-half/musl/src/misc/ioctl.c
@@ -0,0 +1,151 @@
+#include <sys/ioctl.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <time.h>
+#include <sys/time.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+#include <endian.h>
+#include "syscall.h"
+
+#define alignof(t) offsetof(struct { char c; t x; }, x)
+
+#define W 1
+#define R 2
+#define WR 3
+
+struct ioctl_compat_map {
+ int new_req, old_req;
+ unsigned char old_size, dir, force_align, noffs;
+ unsigned char offsets[8];
+};
+
+#define NINTH(a,b,c,d,e,f,g,h,i,...) i
+#define COUNT(...) NINTH(__VA_ARGS__,8,7,6,5,4,3,2,1,0)
+#define OFFS(...) COUNT(__VA_ARGS__), { __VA_ARGS__ }
+
+/* yields a type for a struct with original size n, with a misaligned
+ * timeval/timespec expanded from 32- to 64-bit. for use with ioctl
+ * number producing macros; only size of result is meaningful. */
+#define new_misaligned(n) struct { int i; time_t t; char c[(n)-4]; }
+
+struct v4l2_event {
+ uint32_t a;
+ uint64_t b[8];
+ uint32_t c[2], ts[2], d[9];
+};
+
+static const struct ioctl_compat_map compat_map[] = {
+ { SIOCGSTAMP, SIOCGSTAMP_OLD, 8, R, 0, OFFS(0, 4) },
+ { SIOCGSTAMPNS, SIOCGSTAMPNS_OLD, 8, R, 0, OFFS(0, 4) },
+
+ /* SNDRV_TIMER_IOCTL_STATUS */
+ { _IOR('T', 0x14, char[96]), _IOR('T', 0x14, 88), 88, R, 0, OFFS(0,4) },
+
+ /* SNDRV_PCM_IOCTL_STATUS[_EXT] */
+ { _IOR('A', 0x20, char[128]), _IOR('A', 0x20, char[108]), 108, R, 1, OFFS(4,8,12,16,52,56,60,64) },
+ { _IOWR('A', 0x24, char[128]), _IOWR('A', 0x24, char[108]), 108, WR, 1, OFFS(4,8,12,16,52,56,60,64) },
+
+ /* SNDRV_RAWMIDI_IOCTL_STATUS */
+ { _IOWR('W', 0x20, char[48]), _IOWR('W', 0x20, char[36]), 36, WR, 1, OFFS(4,8) },
+
+ /* SNDRV_PCM_IOCTL_SYNC_PTR - with 3 subtables */
+ { _IOWR('A', 0x23, char[136]), _IOWR('A', 0x23, char[132]), 0, WR, 1, 0 },
+ { 0, 0, 4, WR, 1, 0 }, /* snd_pcm_sync_ptr (flags only) */
+ { 0, 0, 32, WR, 1, OFFS(8,12,16,24,28) }, /* snd_pcm_mmap_status */
+ { 0, 0, 4, WR, 1, 0 }, /* snd_pcm_mmap_control (each member) */
+
+ /* VIDIOC_QUERYBUF, VIDIOC_QBUF, VIDIOC_DQBUF, VIDIOC_PREPARE_BUF */
+ { _IOWR('V', 9, new_misaligned(68)), _IOWR('V', 9, char[68]), 68, WR, 1, OFFS(20, 24) },
+ { _IOWR('V', 15, new_misaligned(68)), _IOWR('V', 15, char[68]), 68, WR, 1, OFFS(20, 24) },
+ { _IOWR('V', 17, new_misaligned(68)), _IOWR('V', 17, char[68]), 68, WR, 1, OFFS(20, 24) },
+ { _IOWR('V', 93, new_misaligned(68)), _IOWR('V', 93, char[68]), 68, WR, 1, OFFS(20, 24) },
+
+ /* VIDIOC_DQEVENT */
+ { _IOR('V', 89, new_misaligned(120)), _IOR('V', 89, struct v4l2_event), sizeof(struct v4l2_event),
+ R, 0, OFFS(offsetof(struct v4l2_event, ts[0]), offsetof(struct v4l2_event, ts[1])) },
+
+ /* VIDIOC_OMAP3ISP_STAT_REQ */
+ { _IOWR('V', 192+6, char[32]), _IOWR('V', 192+6, char[24]), 22, WR, 0, OFFS(0,4) },
+
+ /* PPPIOCGIDLE */
+ { _IOR('t', 63, char[16]), _IOR('t', 63, char[8]), 8, R, 0, OFFS(0,4) },
+
+ /* PPGETTIME, PPSETTIME */
+ { _IOR('p', 0x95, char[16]), _IOR('p', 0x95, char[8]), 8, R, 0, OFFS(0,4) },
+ { _IOW('p', 0x96, char[16]), _IOW('p', 0x96, char[8]), 8, W, 0, OFFS(0,4) },
+
+ /* LPSETTIMEOUT */
+ { _IOW(0x6, 0xf, char[16]), 0x060f, 8, W, 0, OFFS(0,4) },
+};
+
+static void convert_ioctl_struct(const struct ioctl_compat_map *map, char *old, char *new, int dir)
+{
+ int new_offset = 0;
+ int old_offset = 0;
+ int old_size = map->old_size;
+ if (!(dir & map->dir)) return;
+ if (!map->old_size) {
+ /* offsets hard-coded for SNDRV_PCM_IOCTL_SYNC_PTR;
+ * if another exception appears this needs changing. */
+ convert_ioctl_struct(map+1, old, new, dir);
+ convert_ioctl_struct(map+2, old+4, new+8, dir);
+ /* snd_pcm_mmap_control, special-cased due to kernel
+ * type definition having been botched. */
+ int adj = BYTE_ORDER==BIG_ENDIAN ? 4 : 0;
+ convert_ioctl_struct(map+3, old+68, new+72+adj, dir);
+ convert_ioctl_struct(map+3, old+72, new+76+3*adj, dir);
+ return;
+ }
+ for (int i=0; i < map->noffs; i++) {
+ int ts_offset = map->offsets[i];
+ int len = ts_offset-old_offset;
+ if (dir==W) memcpy(old+old_offset, new+new_offset, len);
+ else memcpy(new+new_offset, old+old_offset, len);
+ new_offset += len;
+ old_offset += len;
+ long long new_ts;
+ long old_ts;
+ int align = map->force_align ? sizeof(time_t) : alignof(time_t);
+ new_offset += (align-1) & -new_offset;
+ if (dir==W) {
+ memcpy(&new_ts, new+new_offset, sizeof new_ts);
+ old_ts = new_ts;
+ memcpy(old+old_offset, &old_ts, sizeof old_ts);
+ } else {
+ memcpy(&old_ts, old+old_offset, sizeof old_ts);
+ new_ts = old_ts;
+ memcpy(new+new_offset, &new_ts, sizeof new_ts);
+ }
+ new_offset += sizeof new_ts;
+ old_offset += sizeof old_ts;
+ }
+ if (dir==W) memcpy(old+old_offset, new+new_offset, old_size-old_offset);
+ else memcpy(new+new_offset, old+old_offset, old_size-old_offset);
+}
+
+int ioctl(int fd, int req, ...)
+{
+ void *arg;
+ va_list ap;
+ va_start(ap, req);
+ arg = va_arg(ap, void *);
+ va_end(ap);
+ int r = __syscall(SYS_ioctl, fd, req, arg);
+ if (SIOCGSTAMP != SIOCGSTAMP_OLD && req && r==-ENOTTY) {
+ for (int i=0; i<sizeof compat_map/sizeof *compat_map; i++) {
+ if (compat_map[i].new_req != req) continue;
+ union {
+ long long align;
+ char buf[256];
+ } u;
+ convert_ioctl_struct(&compat_map[i], u.buf, arg, W);
+ r = __syscall(SYS_ioctl, fd, compat_map[i].old_req, u.buf);
+ if (r<0) break;
+ convert_ioctl_struct(&compat_map[i], u.buf, arg, R);
+ break;
+ }
+ }
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/misc/issetugid.c b/libc-top-half/musl/src/misc/issetugid.c
new file mode 100644
index 0000000..ddc2ca0
--- /dev/null
+++ b/libc-top-half/musl/src/misc/issetugid.c
@@ -0,0 +1,8 @@
+#define _BSD_SOURCE
+#include <unistd.h>
+#include "libc.h"
+
+int issetugid(void)
+{
+ return libc.secure;
+}
diff --git a/libc-top-half/musl/src/misc/lockf.c b/libc-top-half/musl/src/misc/lockf.c
new file mode 100644
index 0000000..16a80be
--- /dev/null
+++ b/libc-top-half/musl/src/misc/lockf.c
@@ -0,0 +1,32 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+int lockf(int fd, int op, off_t size)
+{
+ struct flock l = {
+ .l_type = F_WRLCK,
+ .l_whence = SEEK_CUR,
+ .l_len = size,
+ };
+ switch (op) {
+ case F_TEST:
+ l.l_type = F_RDLCK;
+ if (fcntl(fd, F_GETLK, &l) < 0)
+ return -1;
+ if (l.l_type == F_UNLCK || l.l_pid == getpid())
+ return 0;
+ errno = EACCES;
+ return -1;
+ case F_ULOCK:
+ l.l_type = F_UNLCK;
+ case F_TLOCK:
+ return fcntl(fd, F_SETLK, &l);
+ case F_LOCK:
+ return fcntl(fd, F_SETLKW, &l);
+ }
+ errno = EINVAL;
+ return -1;
+}
+
+weak_alias(lockf, lockf64);
diff --git a/libc-top-half/musl/src/misc/login_tty.c b/libc-top-half/musl/src/misc/login_tty.c
new file mode 100644
index 0000000..f0be0a0
--- /dev/null
+++ b/libc-top-half/musl/src/misc/login_tty.c
@@ -0,0 +1,14 @@
+#include <utmp.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+int login_tty(int fd)
+{
+ setsid();
+ if (ioctl(fd, TIOCSCTTY, (char *)0)) return -1;
+ dup2(fd, 0);
+ dup2(fd, 1);
+ dup2(fd, 2);
+ if (fd>2) close(fd);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/misc/mntent.c b/libc-top-half/musl/src/misc/mntent.c
new file mode 100644
index 0000000..eabb820
--- /dev/null
+++ b/libc-top-half/musl/src/misc/mntent.c
@@ -0,0 +1,77 @@
+#include <stdio.h>
+#include <string.h>
+#include <mntent.h>
+#include <errno.h>
+
+static char *internal_buf;
+static size_t internal_bufsize;
+
+#define SENTINEL (char *)&internal_buf
+
+FILE *setmntent(const char *name, const char *mode)
+{
+ return fopen(name, mode);
+}
+
+int endmntent(FILE *f)
+{
+ if (f) fclose(f);
+ return 1;
+}
+
+struct mntent *getmntent_r(FILE *f, struct mntent *mnt, char *linebuf, int buflen)
+{
+ int cnt, n[8], use_internal = (linebuf == SENTINEL);
+
+ mnt->mnt_freq = 0;
+ mnt->mnt_passno = 0;
+
+ do {
+ if (use_internal) {
+ getline(&internal_buf, &internal_bufsize, f);
+ linebuf = internal_buf;
+ } else {
+ fgets(linebuf, buflen, f);
+ }
+ if (feof(f) || ferror(f)) return 0;
+ if (!strchr(linebuf, '\n')) {
+ fscanf(f, "%*[^\n]%*[\n]");
+ errno = ERANGE;
+ return 0;
+ }
+ cnt = sscanf(linebuf, " %n%*s%n %n%*s%n %n%*s%n %n%*s%n %d %d",
+ n, n+1, n+2, n+3, n+4, n+5, n+6, n+7,
+ &mnt->mnt_freq, &mnt->mnt_passno);
+ } while (cnt < 2 || linebuf[n[0]] == '#');
+
+ linebuf[n[1]] = 0;
+ linebuf[n[3]] = 0;
+ linebuf[n[5]] = 0;
+ linebuf[n[7]] = 0;
+
+ mnt->mnt_fsname = linebuf+n[0];
+ mnt->mnt_dir = linebuf+n[2];
+ mnt->mnt_type = linebuf+n[4];
+ mnt->mnt_opts = linebuf+n[6];
+
+ return mnt;
+}
+
+struct mntent *getmntent(FILE *f)
+{
+ static struct mntent mnt;
+ return getmntent_r(f, &mnt, SENTINEL, 0);
+}
+
+int addmntent(FILE *f, const struct mntent *mnt)
+{
+ if (fseek(f, 0, SEEK_END)) return 1;
+ return fprintf(f, "%s\t%s\t%s\t%s\t%d\t%d\n",
+ mnt->mnt_fsname, mnt->mnt_dir, mnt->mnt_type, mnt->mnt_opts,
+ mnt->mnt_freq, mnt->mnt_passno) < 0;
+}
+
+char *hasmntopt(const struct mntent *mnt, const char *opt)
+{
+ return strstr(mnt->mnt_opts, opt);
+}
diff --git a/libc-top-half/musl/src/misc/nftw.c b/libc-top-half/musl/src/misc/nftw.c
new file mode 100644
index 0000000..ebfd615
--- /dev/null
+++ b/libc-top-half/musl/src/misc/nftw.c
@@ -0,0 +1,148 @@
+#include <ftw.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <limits.h>
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#include <pthread.h>
+#endif
+
+struct history
+{
+ struct history *chain;
+ dev_t dev;
+ ino_t ino;
+ int level;
+ int base;
+};
+
+#undef dirfd
+#define dirfd(d) (*(int *)d)
+
+static int do_nftw(char *path, int (*fn)(const char *, const struct stat *, int, struct FTW *), int fd_limit, int flags, struct history *h)
+{
+ size_t l = strlen(path), j = l && path[l-1]=='/' ? l-1 : l;
+ struct stat st;
+ struct history new;
+ int type;
+ int r;
+ int dfd;
+ int err;
+ struct FTW lev;
+
+ if ((flags & FTW_PHYS) ? lstat(path, &st) : stat(path, &st) < 0) {
+ if (!(flags & FTW_PHYS) && errno==ENOENT && !lstat(path, &st))
+ type = FTW_SLN;
+ else if (errno != EACCES) return -1;
+ else type = FTW_NS;
+ } else if (S_ISDIR(st.st_mode)) {
+ if (flags & FTW_DEPTH) type = FTW_DP;
+ else type = FTW_D;
+ } else if (S_ISLNK(st.st_mode)) {
+ if (flags & FTW_PHYS) type = FTW_SL;
+ else type = FTW_SLN;
+ } else {
+ type = FTW_F;
+ }
+
+ if ((flags & FTW_MOUNT) && h && st.st_dev != h->dev)
+ return 0;
+
+ new.chain = h;
+ new.dev = st.st_dev;
+ new.ino = st.st_ino;
+ new.level = h ? h->level+1 : 0;
+ new.base = j+1;
+
+ lev.level = new.level;
+ if (h) {
+ lev.base = h->base;
+ } else {
+ size_t k;
+ for (k=j; k && path[k]=='/'; k--);
+ for (; k && path[k-1]!='/'; k--);
+ lev.base = k;
+ }
+
+ if (type == FTW_D || type == FTW_DP) {
+ dfd = open(path, O_RDONLY);
+ err = errno;
+ if (dfd < 0 && err == EACCES) type = FTW_DNR;
+ if (!fd_limit) close(dfd);
+ }
+
+ if (!(flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev)))
+ return r;
+
+ for (; h; h = h->chain)
+ if (h->dev == st.st_dev && h->ino == st.st_ino)
+ return 0;
+
+ if ((type == FTW_D || type == FTW_DP) && fd_limit) {
+ if (dfd < 0) {
+ errno = err;
+ return -1;
+ }
+ DIR *d = fdopendir(dfd);
+ if (d) {
+ struct dirent *de;
+ while ((de = readdir(d))) {
+ if (de->d_name[0] == '.'
+ && (!de->d_name[1]
+ || (de->d_name[1]=='.'
+ && !de->d_name[2]))) continue;
+ if (strlen(de->d_name) >= PATH_MAX-l) {
+ errno = ENAMETOOLONG;
+ closedir(d);
+ return -1;
+ }
+ path[j]='/';
+ strcpy(path+j+1, de->d_name);
+ if ((r=do_nftw(path, fn, fd_limit-1, flags, &new))) {
+ closedir(d);
+ return r;
+ }
+ }
+ closedir(d);
+ } else {
+ close(dfd);
+ return -1;
+ }
+ }
+
+ path[l] = 0;
+ if ((flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev)))
+ return r;
+
+ return 0;
+}
+
+int nftw(const char *path, int (*fn)(const char *, const struct stat *, int, struct FTW *), int fd_limit, int flags)
+{
+ int r, cs;
+ size_t l;
+ char pathbuf[PATH_MAX+1];
+
+ if (fd_limit <= 0) return 0;
+
+ l = strlen(path);
+ if (l > PATH_MAX) {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+ memcpy(pathbuf, path, l+1);
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+#endif
+ r = do_nftw(pathbuf, fn, fd_limit, flags, NULL);
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ pthread_setcancelstate(cs, 0);
+#endif
+ return r;
+}
+
+weak_alias(nftw, nftw64);
diff --git a/libc-top-half/musl/src/misc/openpty.c b/libc-top-half/musl/src/misc/openpty.c
new file mode 100644
index 0000000..c107406
--- /dev/null
+++ b/libc-top-half/musl/src/misc/openpty.c
@@ -0,0 +1,40 @@
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <pty.h>
+#include <stdio.h>
+#include <pthread.h>
+
+/* Nonstandard, but vastly superior to the standard functions */
+
+int openpty(int *pm, int *ps, char *name, const struct termios *tio, const struct winsize *ws)
+{
+ int m, s, n=0, cs;
+ char buf[20];
+
+ m = open("/dev/ptmx", O_RDWR|O_NOCTTY);
+ if (m < 0) return -1;
+
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
+ if (ioctl(m, TIOCSPTLCK, &n) || ioctl (m, TIOCGPTN, &n))
+ goto fail;
+
+ if (!name) name = buf;
+ snprintf(name, sizeof buf, "/dev/pts/%d", n);
+ if ((s = open(name, O_RDWR|O_NOCTTY)) < 0)
+ goto fail;
+
+ if (tio) tcsetattr(s, TCSANOW, tio);
+ if (ws) ioctl(s, TIOCSWINSZ, ws);
+
+ *pm = m;
+ *ps = s;
+
+ pthread_setcancelstate(cs, 0);
+ return 0;
+fail:
+ close(m);
+ pthread_setcancelstate(cs, 0);
+ return -1;
+}
diff --git a/libc-top-half/musl/src/misc/ptsname.c b/libc-top-half/musl/src/misc/ptsname.c
new file mode 100644
index 0000000..58c151c
--- /dev/null
+++ b/libc-top-half/musl/src/misc/ptsname.c
@@ -0,0 +1,13 @@
+#include <stdlib.h>
+#include <errno.h>
+
+char *ptsname(int fd)
+{
+ static char buf[9 + sizeof(int)*3 + 1];
+ int err = __ptsname_r(fd, buf, sizeof buf);
+ if (err) {
+ errno = err;
+ return 0;
+ }
+ return buf;
+}
diff --git a/libc-top-half/musl/src/misc/pty.c b/libc-top-half/musl/src/misc/pty.c
new file mode 100644
index 0000000..a057714
--- /dev/null
+++ b/libc-top-half/musl/src/misc/pty.c
@@ -0,0 +1,35 @@
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "syscall.h"
+
+int posix_openpt(int flags)
+{
+ int r = open("/dev/ptmx", flags);
+ if (r < 0 && errno == ENOSPC) errno = EAGAIN;
+ return r;
+}
+
+int grantpt(int fd)
+{
+ return 0;
+}
+
+int unlockpt(int fd)
+{
+ int unlock = 0;
+ return ioctl(fd, TIOCSPTLCK, &unlock);
+}
+
+int __ptsname_r(int fd, char *buf, size_t len)
+{
+ int pty, err;
+ if (!buf) len = 0;
+ if ((err = __syscall(SYS_ioctl, fd, TIOCGPTN, &pty))) return -err;
+ if (snprintf(buf, len, "/dev/pts/%d", pty) >= len) return ERANGE;
+ return 0;
+}
+
+weak_alias(__ptsname_r, ptsname_r);
diff --git a/libc-top-half/musl/src/misc/realpath.c b/libc-top-half/musl/src/misc/realpath.c
new file mode 100644
index 0000000..db8b74d
--- /dev/null
+++ b/libc-top-half/musl/src/misc/realpath.c
@@ -0,0 +1,156 @@
+#include <stdlib.h>
+#include <limits.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+
+static size_t slash_len(const char *s)
+{
+ const char *s0 = s;
+ while (*s == '/') s++;
+ return s-s0;
+}
+
+char *realpath(const char *restrict filename, char *restrict resolved)
+{
+ char stack[PATH_MAX+1];
+ char output[PATH_MAX];
+ size_t p, q, l, l0, cnt=0, nup=0;
+ int check_dir=0;
+
+ if (!filename) {
+ errno = EINVAL;
+ return 0;
+ }
+ l = strnlen(filename, sizeof stack);
+ if (!l) {
+ errno = ENOENT;
+ return 0;
+ }
+ if (l >= PATH_MAX) goto toolong;
+ p = sizeof stack - l - 1;
+ q = 0;
+ memcpy(stack+p, filename, l+1);
+
+ /* Main loop. Each iteration pops the next part from stack of
+ * remaining path components and consumes any slashes that follow.
+ * If not a link, it's moved to output; if a link, contents are
+ * pushed to the stack. */
+restart:
+ for (; ; p+=slash_len(stack+p)) {
+ /* If stack starts with /, the whole component is / or //
+ * and the output state must be reset. */
+ if (stack[p] == '/') {
+ check_dir=0;
+ nup=0;
+ q=0;
+ output[q++] = '/';
+ p++;
+ /* Initial // is special. */
+ if (stack[p] == '/' && stack[p+1] != '/')
+ output[q++] = '/';
+ continue;
+ }
+
+ char *z = __strchrnul(stack+p, '/');
+ l0 = l = z-(stack+p);
+
+ if (!l && !check_dir) break;
+
+ /* Skip any . component but preserve check_dir status. */
+ if (l==1 && stack[p]=='.') {
+ p += l;
+ continue;
+ }
+
+ /* Copy next component onto output at least temporarily, to
+ * call readlink, but wait to advance output position until
+ * determining it's not a link. */
+ if (q && output[q-1] != '/') {
+ if (!p) goto toolong;
+ stack[--p] = '/';
+ l++;
+ }
+ if (q+l >= PATH_MAX) goto toolong;
+ memcpy(output+q, stack+p, l);
+ output[q+l] = 0;
+ p += l;
+
+ int up = 0;
+ if (l0==2 && stack[p-2]=='.' && stack[p-1]=='.') {
+ up = 1;
+ /* Any non-.. path components we could cancel start
+ * after nup repetitions of the 3-byte string "../";
+ * if there are none, accumulate .. components to
+ * later apply to cwd, if needed. */
+ if (q <= 3*nup) {
+ nup++;
+ q += l;
+ continue;
+ }
+ /* When previous components are already known to be
+ * directories, processing .. can skip readlink. */
+ if (!check_dir) goto skip_readlink;
+ }
+ ssize_t k = readlink(output, stack, p);
+ if (k==p) goto toolong;
+ if (!k) {
+ errno = ENOENT;
+ return 0;
+ }
+ if (k<0) {
+ if (errno != EINVAL) return 0;
+skip_readlink:
+ check_dir = 0;
+ if (up) {
+ while(q && output[q-1]!='/') q--;
+ if (q>1 && (q>2 || output[0]!='/')) q--;
+ continue;
+ }
+ if (l0) q += l;
+ check_dir = stack[p];
+ continue;
+ }
+ if (++cnt == SYMLOOP_MAX) {
+ errno = ELOOP;
+ return 0;
+ }
+
+ /* If link contents end in /, strip any slashes already on
+ * stack to avoid /->// or //->/// or spurious toolong. */
+ if (stack[k-1]=='/') while (stack[p]=='/') p++;
+ p -= k;
+ memmove(stack+p, stack, k);
+
+ /* Skip the stack advancement in case we have a new
+ * absolute base path. */
+ goto restart;
+ }
+
+ output[q] = 0;
+
+ if (output[0] != '/') {
+ if (!getcwd(stack, sizeof stack)) return 0;
+ l = strlen(stack);
+ /* Cancel any initial .. components. */
+ p = 0;
+ while (nup--) {
+ while(l>1 && stack[l-1]!='/') l--;
+ if (l>1) l--;
+ p += 2;
+ if (p<q) p++;
+ }
+ if (q-p && stack[l-1]!='/') stack[l++] = '/';
+ if (l + (q-p) + 1 >= PATH_MAX) goto toolong;
+ memmove(output + l, output + p, q - p + 1);
+ memcpy(output, stack, l);
+ q = l + q-p;
+ }
+
+ if (resolved) return memcpy(resolved, output, q+1);
+ else return strdup(output);
+
+toolong:
+ errno = ENAMETOOLONG;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/misc/setdomainname.c b/libc-top-half/musl/src/misc/setdomainname.c
new file mode 100644
index 0000000..22d3f74
--- /dev/null
+++ b/libc-top-half/musl/src/misc/setdomainname.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include "syscall.h"
+
+int setdomainname(const char *name, size_t len)
+{
+ return syscall(SYS_setdomainname, name, len);
+}
diff --git a/libc-top-half/musl/src/misc/setpriority.c b/libc-top-half/musl/src/misc/setpriority.c
new file mode 100644
index 0000000..3098cdf
--- /dev/null
+++ b/libc-top-half/musl/src/misc/setpriority.c
@@ -0,0 +1,7 @@
+#include <sys/resource.h>
+#include "syscall.h"
+
+int setpriority(int which, id_t who, int prio)
+{
+ return syscall(SYS_setpriority, which, who, prio);
+}
diff --git a/libc-top-half/musl/src/misc/setrlimit.c b/libc-top-half/musl/src/misc/setrlimit.c
new file mode 100644
index 0000000..8340aee
--- /dev/null
+++ b/libc-top-half/musl/src/misc/setrlimit.c
@@ -0,0 +1,47 @@
+#include <sys/resource.h>
+#include <errno.h>
+#include "syscall.h"
+#include "libc.h"
+
+#define MIN(a, b) ((a)<(b) ? (a) : (b))
+#define FIX(x) do{ if ((x)>=SYSCALL_RLIM_INFINITY) (x)=RLIM_INFINITY; }while(0)
+
+struct ctx {
+ unsigned long lim[2];
+ int res;
+ int err;
+};
+
+static void do_setrlimit(void *p)
+{
+ struct ctx *c = p;
+ if (c->err>0) return;
+ c->err = -__syscall(SYS_setrlimit, c->res, c->lim);
+}
+
+int setrlimit(int resource, const struct rlimit *rlim)
+{
+ struct rlimit tmp;
+ if (SYSCALL_RLIM_INFINITY != RLIM_INFINITY) {
+ tmp = *rlim;
+ FIX(tmp.rlim_cur);
+ FIX(tmp.rlim_max);
+ rlim = &tmp;
+ }
+ int ret = __syscall(SYS_prlimit64, 0, resource, rlim, 0);
+ if (ret != -ENOSYS) return __syscall_ret(ret);
+
+ struct ctx c = {
+ .lim[0] = MIN(rlim->rlim_cur, MIN(-1UL, SYSCALL_RLIM_INFINITY)),
+ .lim[1] = MIN(rlim->rlim_max, MIN(-1UL, SYSCALL_RLIM_INFINITY)),
+ .res = resource, .err = -1
+ };
+ __synccall(do_setrlimit, &c);
+ if (c.err) {
+ if (c.err>0) errno = c.err;
+ return -1;
+ }
+ return 0;
+}
+
+weak_alias(setrlimit, setrlimit64);
diff --git a/libc-top-half/musl/src/misc/syscall.c b/libc-top-half/musl/src/misc/syscall.c
new file mode 100644
index 0000000..6f3ef65
--- /dev/null
+++ b/libc-top-half/musl/src/misc/syscall.c
@@ -0,0 +1,21 @@
+#define _BSD_SOURCE
+#include <unistd.h>
+#include "syscall.h"
+#include <stdarg.h>
+
+#undef syscall
+
+long syscall(long n, ...)
+{
+ va_list ap;
+ syscall_arg_t a,b,c,d,e,f;
+ va_start(ap, n);
+ a=va_arg(ap, syscall_arg_t);
+ b=va_arg(ap, syscall_arg_t);
+ c=va_arg(ap, syscall_arg_t);
+ d=va_arg(ap, syscall_arg_t);
+ e=va_arg(ap, syscall_arg_t);
+ f=va_arg(ap, syscall_arg_t);
+ va_end(ap);
+ return __syscall_ret(__syscall(n,a,b,c,d,e,f));
+}
diff --git a/libc-top-half/musl/src/misc/syslog.c b/libc-top-half/musl/src/misc/syslog.c
new file mode 100644
index 0000000..b802acd
--- /dev/null
+++ b/libc-top-half/musl/src/misc/syslog.c
@@ -0,0 +1,162 @@
+#include <stdarg.h>
+#include <sys/socket.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <time.h>
+#include <signal.h>
+#include <string.h>
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#include <pthread.h>
+#endif
+#include <errno.h>
+#include <fcntl.h>
+#include "lock.h"
+#include "fork_impl.h"
+
+static volatile int lock[1];
+static char log_ident[32];
+static int log_opt;
+static int log_facility = LOG_USER;
+static int log_mask = 0xff;
+static int log_fd = -1;
+volatile int *const __syslog_lockptr = lock;
+
+int setlogmask(int maskpri)
+{
+ LOCK(lock);
+ int ret = log_mask;
+ if (maskpri) log_mask = maskpri;
+ UNLOCK(lock);
+ return ret;
+}
+
+static const struct {
+ short sun_family;
+ char sun_path[9];
+} log_addr = {
+ AF_UNIX,
+ "/dev/log"
+};
+
+void closelog(void)
+{
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ int cs;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+#endif
+ LOCK(lock);
+ close(log_fd);
+ log_fd = -1;
+ UNLOCK(lock);
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ pthread_setcancelstate(cs, 0);
+#endif
+}
+
+static void __openlog()
+{
+ log_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0);
+ if (log_fd >= 0) connect(log_fd, (void *)&log_addr, sizeof log_addr);
+}
+
+void openlog(const char *ident, int opt, int facility)
+{
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ int cs;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+#endif
+ LOCK(lock);
+
+ if (ident) {
+ size_t n = strnlen(ident, sizeof log_ident - 1);
+ memcpy(log_ident, ident, n);
+ log_ident[n] = 0;
+ } else {
+ log_ident[0] = 0;
+ }
+ log_opt = opt;
+ log_facility = facility;
+
+ if ((opt & LOG_NDELAY) && log_fd<0) __openlog();
+
+ UNLOCK(lock);
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ pthread_setcancelstate(cs, 0);
+#endif
+}
+
+static int is_lost_conn(int e)
+{
+ return e==ECONNREFUSED || e==ECONNRESET || e==ENOTCONN || e==EPIPE;
+}
+
+static void _vsyslog(int priority, const char *message, va_list ap)
+{
+ char timebuf[16];
+ time_t now;
+ struct tm tm;
+ char buf[1024];
+ int errno_save = errno;
+ int pid;
+ int l, l2;
+ int hlen;
+ int fd;
+
+ if (log_fd < 0) __openlog();
+
+ if (!(priority & LOG_FACMASK)) priority |= log_facility;
+
+ now = time(NULL);
+ gmtime_r(&now, &tm);
+ strftime(timebuf, sizeof timebuf, "%b %e %T", &tm);
+
+ pid = (log_opt & LOG_PID) ? getpid() : 0;
+ l = snprintf(buf, sizeof buf, "<%d>%s %n%s%s%.0d%s: ",
+ priority, timebuf, &hlen, log_ident, "["+!pid, pid, "]"+!pid);
+ errno = errno_save;
+ l2 = vsnprintf(buf+l, sizeof buf - l, message, ap);
+ if (l2 >= 0) {
+ if (l2 >= sizeof buf - l) l = sizeof buf - 1;
+ else l += l2;
+ if (buf[l-1] != '\n') buf[l++] = '\n';
+ if (send(log_fd, buf, l, 0) < 0 && (!is_lost_conn(errno)
+ || connect(log_fd, (void *)&log_addr, sizeof log_addr) < 0
+ || send(log_fd, buf, l, 0) < 0)
+ && (log_opt & LOG_CONS)) {
+ fd = open("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
+ if (fd >= 0) {
+ dprintf(fd, "%.*s", l-hlen, buf+hlen);
+ close(fd);
+ }
+ }
+ if (log_opt & LOG_PERROR) dprintf(2, "%.*s", l-hlen, buf+hlen);
+ }
+}
+
+static void __vsyslog(int priority, const char *message, va_list ap)
+{
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ int cs;
+#endif
+ if (!(log_mask & LOG_MASK(priority&7)) || (priority&~0x3ff)) return;
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+#endif
+ LOCK(lock);
+ _vsyslog(priority, message, ap);
+ UNLOCK(lock);
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ pthread_setcancelstate(cs, 0);
+#endif
+}
+
+void syslog(int priority, const char *message, ...)
+{
+ va_list ap;
+ va_start(ap, message);
+ __vsyslog(priority, message, ap);
+ va_end(ap);
+}
+
+weak_alias(__vsyslog, vsyslog);
diff --git a/libc-top-half/musl/src/misc/uname.c b/libc-top-half/musl/src/misc/uname.c
new file mode 100644
index 0000000..36e816a
--- /dev/null
+++ b/libc-top-half/musl/src/misc/uname.c
@@ -0,0 +1,32 @@
+#include <sys/utsname.h>
+#ifdef __wasilibc_unmodified_upstream // Implement uname with placeholders
+#include "syscall.h"
+#else
+#include <string.h>
+#endif
+
+int uname(struct utsname *uts)
+{
+#ifdef __wasilibc_unmodified_upstream // Implement uname with placeholders
+ return syscall(SYS_uname, uts);
+#else
+ // Just fill in the fields with placeholder values.
+ strcpy(uts->sysname, "wasi");
+ strcpy(uts->nodename, "(none)");
+ strcpy(uts->release, "0.0.0");
+ strcpy(uts->version, "0.0.0");
+#if defined(__wasm32__)
+ strcpy(uts->machine, "wasm32");
+#elif defined(__wasm64__)
+ strcpy(uts->machine, "wasm64");
+#else
+ strcpy(uts->machine, "unknown");
+#endif
+#ifdef _GNU_SOURCE
+ strcpy(uts->domainname, "(none)");
+#else
+ strcpy(uts->__domainname, "(none)");
+#endif
+ return 0;
+#endif
+}
diff --git a/libc-top-half/musl/src/misc/wordexp.c b/libc-top-half/musl/src/misc/wordexp.c
new file mode 100644
index 0000000..db83a69
--- /dev/null
+++ b/libc-top-half/musl/src/misc/wordexp.c
@@ -0,0 +1,187 @@
+#include <wordexp.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <limits.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "pthread_impl.h"
+
+static void reap(pid_t pid)
+{
+ int status;
+ while (waitpid(pid, &status, 0) < 0 && errno == EINTR);
+}
+
+static char *getword(FILE *f)
+{
+ char *s = 0;
+ return getdelim(&s, (size_t [1]){0}, 0, f) < 0 ? 0 : s;
+}
+
+static int do_wordexp(const char *s, wordexp_t *we, int flags)
+{
+ size_t i, l;
+ int sq=0, dq=0;
+ size_t np=0;
+ char *w, **tmp;
+ char *redir = (flags & WRDE_SHOWERR) ? "" : "2>/dev/null";
+ int err = 0;
+ FILE *f;
+ size_t wc = 0;
+ char **wv = 0;
+ int p[2];
+ pid_t pid;
+ sigset_t set;
+
+ if (flags & WRDE_REUSE) wordfree(we);
+
+ if (flags & WRDE_NOCMD) for (i=0; s[i]; i++) switch (s[i]) {
+ case '\\':
+ if (!sq && !s[++i]) return WRDE_SYNTAX;
+ break;
+ case '\'':
+ if (!dq) sq^=1;
+ break;
+ case '"':
+ if (!sq) dq^=1;
+ break;
+ case '(':
+ if (np) {
+ np++;
+ break;
+ }
+ case ')':
+ if (np) {
+ np--;
+ break;
+ }
+ case '\n':
+ case '|':
+ case '&':
+ case ';':
+ case '<':
+ case '>':
+ case '{':
+ case '}':
+ if (!(sq|dq|np)) return WRDE_BADCHAR;
+ break;
+ case '$':
+ if (sq) break;
+ if (s[i+1]=='(' && s[i+2]=='(') {
+ i += 2;
+ np += 2;
+ break;
+ } else if (s[i+1] != '(') break;
+ case '`':
+ if (sq) break;
+ return WRDE_CMDSUB;
+ }
+
+ if (flags & WRDE_APPEND) {
+ wc = we->we_wordc;
+ wv = we->we_wordv;
+ }
+
+ i = wc;
+ if (flags & WRDE_DOOFFS) {
+ if (we->we_offs > SIZE_MAX/sizeof(void *)/4)
+ goto nospace;
+ i += we->we_offs;
+ } else {
+ we->we_offs = 0;
+ }
+
+ if (pipe2(p, O_CLOEXEC) < 0) goto nospace;
+ __block_all_sigs(&set);
+ pid = fork();
+ __restore_sigs(&set);
+ if (pid < 0) {
+ close(p[0]);
+ close(p[1]);
+ goto nospace;
+ }
+ if (!pid) {
+ if (p[1] == 1) fcntl(1, F_SETFD, 0);
+ else dup2(p[1], 1);
+ execl("/bin/sh", "sh", "-c",
+ "eval \"printf %s\\\\\\\\0 x $1 $2\"",
+ "sh", s, redir, (char *)0);
+ _exit(1);
+ }
+ close(p[1]);
+
+ f = fdopen(p[0], "r");
+ if (!f) {
+ close(p[0]);
+ kill(pid, SIGKILL);
+ reap(pid);
+ goto nospace;
+ }
+
+ l = wv ? i+1 : 0;
+
+ free(getword(f));
+ if (feof(f)) {
+ fclose(f);
+ reap(pid);
+ return WRDE_SYNTAX;
+ }
+
+ while ((w = getword(f))) {
+ if (i+1 >= l) {
+ l += l/2+10;
+ tmp = realloc(wv, l*sizeof(char *));
+ if (!tmp) break;
+ wv = tmp;
+ }
+ wv[i++] = w;
+ wv[i] = 0;
+ }
+ if (!feof(f)) err = WRDE_NOSPACE;
+
+ fclose(f);
+ reap(pid);
+
+ if (!wv) wv = calloc(i+1, sizeof *wv);
+
+ we->we_wordv = wv;
+ we->we_wordc = i;
+
+ if (flags & WRDE_DOOFFS) {
+ if (wv) for (i=we->we_offs; i; i--)
+ we->we_wordv[i-1] = 0;
+ we->we_wordc -= we->we_offs;
+ }
+ return err;
+
+nospace:
+ if (!(flags & WRDE_APPEND)) {
+ we->we_wordc = 0;
+ we->we_wordv = 0;
+ }
+ return WRDE_NOSPACE;
+}
+
+int wordexp(const char *restrict s, wordexp_t *restrict we, int flags)
+{
+ int r, cs;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ r = do_wordexp(s, we, flags);
+ pthread_setcancelstate(cs, 0);
+ return r;
+}
+
+void wordfree(wordexp_t *we)
+{
+ size_t i;
+ if (!we->we_wordv) return;
+ for (i=0; i<we->we_wordc; i++) free(we->we_wordv[we->we_offs+i]);
+ free(we->we_wordv);
+ we->we_wordv = 0;
+ we->we_wordc = 0;
+}
diff --git a/libc-top-half/musl/src/mman/madvise.c b/libc-top-half/musl/src/mman/madvise.c
new file mode 100644
index 0000000..e0c7c0e
--- /dev/null
+++ b/libc-top-half/musl/src/mman/madvise.c
@@ -0,0 +1,9 @@
+#include <sys/mman.h>
+#include "syscall.h"
+
+int __madvise(void *addr, size_t len, int advice)
+{
+ return syscall(SYS_madvise, addr, len, advice);
+}
+
+weak_alias(__madvise, madvise);
diff --git a/libc-top-half/musl/src/mman/mincore.c b/libc-top-half/musl/src/mman/mincore.c
new file mode 100644
index 0000000..4bb19f8
--- /dev/null
+++ b/libc-top-half/musl/src/mman/mincore.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <sys/mman.h>
+#include "syscall.h"
+
+int mincore (void *addr, size_t len, unsigned char *vec)
+{
+ return syscall(SYS_mincore, addr, len, vec);
+}
diff --git a/libc-top-half/musl/src/mman/mlock.c b/libc-top-half/musl/src/mman/mlock.c
new file mode 100644
index 0000000..71af582
--- /dev/null
+++ b/libc-top-half/musl/src/mman/mlock.c
@@ -0,0 +1,11 @@
+#include <sys/mman.h>
+#include "syscall.h"
+
+int mlock(const void *addr, size_t len)
+{
+#ifdef SYS_mlock
+ return syscall(SYS_mlock, addr, len);
+#else
+ return syscall(SYS_mlock2, addr, len, 0);
+#endif
+}
diff --git a/libc-top-half/musl/src/mman/mlockall.c b/libc-top-half/musl/src/mman/mlockall.c
new file mode 100644
index 0000000..0ba4e66
--- /dev/null
+++ b/libc-top-half/musl/src/mman/mlockall.c
@@ -0,0 +1,7 @@
+#include <sys/mman.h>
+#include "syscall.h"
+
+int mlockall(int flags)
+{
+ return syscall(SYS_mlockall, flags);
+}
diff --git a/libc-top-half/musl/src/mman/mmap.c b/libc-top-half/musl/src/mman/mmap.c
new file mode 100644
index 0000000..eff88d8
--- /dev/null
+++ b/libc-top-half/musl/src/mman/mmap.c
@@ -0,0 +1,41 @@
+#include <unistd.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <stdint.h>
+#include <limits.h>
+#include "syscall.h"
+
+static void dummy(void) { }
+weak_alias(dummy, __vm_wait);
+
+#define UNIT SYSCALL_MMAP2_UNIT
+#define OFF_MASK ((-0x2000ULL << (8*sizeof(syscall_arg_t)-1)) | (UNIT-1))
+
+void *__mmap(void *start, size_t len, int prot, int flags, int fd, off_t off)
+{
+ long ret;
+ if (off & OFF_MASK) {
+ errno = EINVAL;
+ return MAP_FAILED;
+ }
+ if (len >= PTRDIFF_MAX) {
+ errno = ENOMEM;
+ return MAP_FAILED;
+ }
+ if (flags & MAP_FIXED) {
+ __vm_wait();
+ }
+#ifdef SYS_mmap2
+ ret = __syscall(SYS_mmap2, start, len, prot, flags, fd, off/UNIT);
+#else
+ ret = __syscall(SYS_mmap, start, len, prot, flags, fd, off);
+#endif
+ /* Fixup incorrect EPERM from kernel. */
+ if (ret == -EPERM && !start && (flags&MAP_ANON) && !(flags&MAP_FIXED))
+ ret = -ENOMEM;
+ return (void *)__syscall_ret(ret);
+}
+
+weak_alias(__mmap, mmap);
+
+weak_alias(mmap, mmap64);
diff --git a/libc-top-half/musl/src/mman/mprotect.c b/libc-top-half/musl/src/mman/mprotect.c
new file mode 100644
index 0000000..535787b
--- /dev/null
+++ b/libc-top-half/musl/src/mman/mprotect.c
@@ -0,0 +1,13 @@
+#include <sys/mman.h>
+#include "libc.h"
+#include "syscall.h"
+
+int __mprotect(void *addr, size_t len, int prot)
+{
+ size_t start, end;
+ start = (size_t)addr & -PAGE_SIZE;
+ end = (size_t)((char *)addr + len + PAGE_SIZE-1) & -PAGE_SIZE;
+ return syscall(SYS_mprotect, start, end-start, prot);
+}
+
+weak_alias(__mprotect, mprotect);
diff --git a/libc-top-half/musl/src/mman/mremap.c b/libc-top-half/musl/src/mman/mremap.c
new file mode 100644
index 0000000..cc6991a
--- /dev/null
+++ b/libc-top-half/musl/src/mman/mremap.c
@@ -0,0 +1,32 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <stdint.h>
+#include <stdarg.h>
+#include "syscall.h"
+
+static void dummy(void) { }
+weak_alias(dummy, __vm_wait);
+
+void *__mremap(void *old_addr, size_t old_len, size_t new_len, int flags, ...)
+{
+ va_list ap;
+ void *new_addr = 0;
+
+ if (new_len >= PTRDIFF_MAX) {
+ errno = ENOMEM;
+ return MAP_FAILED;
+ }
+
+ if (flags & MREMAP_FIXED) {
+ __vm_wait();
+ va_start(ap, flags);
+ new_addr = va_arg(ap, void *);
+ va_end(ap);
+ }
+
+ return (void *)syscall(SYS_mremap, old_addr, old_len, new_len, flags, new_addr);
+}
+
+weak_alias(__mremap, mremap);
diff --git a/libc-top-half/musl/src/mman/msync.c b/libc-top-half/musl/src/mman/msync.c
new file mode 100644
index 0000000..fcd8cdf
--- /dev/null
+++ b/libc-top-half/musl/src/mman/msync.c
@@ -0,0 +1,7 @@
+#include <sys/mman.h>
+#include "syscall.h"
+
+int msync(void *start, size_t len, int flags)
+{
+ return syscall_cp(SYS_msync, start, len, flags);
+}
diff --git a/libc-top-half/musl/src/mman/munlock.c b/libc-top-half/musl/src/mman/munlock.c
new file mode 100644
index 0000000..2cccef0
--- /dev/null
+++ b/libc-top-half/musl/src/mman/munlock.c
@@ -0,0 +1,7 @@
+#include <sys/mman.h>
+#include "syscall.h"
+
+int munlock(const void *addr, size_t len)
+{
+ return syscall(SYS_munlock, addr, len);
+}
diff --git a/libc-top-half/musl/src/mman/munlockall.c b/libc-top-half/musl/src/mman/munlockall.c
new file mode 100644
index 0000000..6e9d39d
--- /dev/null
+++ b/libc-top-half/musl/src/mman/munlockall.c
@@ -0,0 +1,7 @@
+#include <sys/mman.h>
+#include "syscall.h"
+
+int munlockall(void)
+{
+ return syscall(SYS_munlockall);
+}
diff --git a/libc-top-half/musl/src/mman/munmap.c b/libc-top-half/musl/src/mman/munmap.c
new file mode 100644
index 0000000..2bf83bb
--- /dev/null
+++ b/libc-top-half/musl/src/mman/munmap.c
@@ -0,0 +1,13 @@
+#include <sys/mman.h>
+#include "syscall.h"
+
+static void dummy(void) { }
+weak_alias(dummy, __vm_wait);
+
+int __munmap(void *start, size_t len)
+{
+ __vm_wait();
+ return syscall(SYS_munmap, start, len);
+}
+
+weak_alias(__munmap, munmap);
diff --git a/libc-top-half/musl/src/mman/posix_madvise.c b/libc-top-half/musl/src/mman/posix_madvise.c
new file mode 100644
index 0000000..e5e5acb
--- /dev/null
+++ b/libc-top-half/musl/src/mman/posix_madvise.c
@@ -0,0 +1,9 @@
+#define _GNU_SOURCE
+#include <sys/mman.h>
+#include "syscall.h"
+
+int posix_madvise(void *addr, size_t len, int advice)
+{
+ if (advice == MADV_DONTNEED) return 0;
+ return -__syscall(SYS_madvise, addr, len, advice);
+}
diff --git a/libc-top-half/musl/src/mman/shm_open.c b/libc-top-half/musl/src/mman/shm_open.c
new file mode 100644
index 0000000..79784bd
--- /dev/null
+++ b/libc-top-half/musl/src/mman/shm_open.c
@@ -0,0 +1,43 @@
+#include <sys/mman.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <limits.h>
+#include <pthread.h>
+
+char *__shm_mapname(const char *name, char *buf)
+{
+ char *p;
+ while (*name == '/') name++;
+ if (*(p = __strchrnul(name, '/')) || p==name ||
+ (p-name <= 2 && name[0]=='.' && p[-1]=='.')) {
+ errno = EINVAL;
+ return 0;
+ }
+ if (p-name > NAME_MAX) {
+ errno = ENAMETOOLONG;
+ return 0;
+ }
+ memcpy(buf, "/dev/shm/", 9);
+ memcpy(buf+9, name, p-name+1);
+ return buf;
+}
+
+int shm_open(const char *name, int flag, mode_t mode)
+{
+ int cs;
+ char buf[NAME_MAX+10];
+ if (!(name = __shm_mapname(name, buf))) return -1;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ int fd = open(name, flag|O_NOFOLLOW|O_CLOEXEC|O_NONBLOCK, mode);
+ pthread_setcancelstate(cs, 0);
+ return fd;
+}
+
+int shm_unlink(const char *name)
+{
+ char buf[NAME_MAX+10];
+ if (!(name = __shm_mapname(name, buf))) return -1;
+ return unlink(name);
+}
diff --git a/libc-top-half/musl/src/mq/mq_close.c b/libc-top-half/musl/src/mq/mq_close.c
new file mode 100644
index 0000000..a61f094
--- /dev/null
+++ b/libc-top-half/musl/src/mq/mq_close.c
@@ -0,0 +1,7 @@
+#include <mqueue.h>
+#include "syscall.h"
+
+int mq_close(mqd_t mqd)
+{
+ return syscall(SYS_close, mqd);
+}
diff --git a/libc-top-half/musl/src/mq/mq_getattr.c b/libc-top-half/musl/src/mq/mq_getattr.c
new file mode 100644
index 0000000..dce1806
--- /dev/null
+++ b/libc-top-half/musl/src/mq/mq_getattr.c
@@ -0,0 +1,7 @@
+#include <mqueue.h>
+#include "syscall.h"
+
+int mq_getattr(mqd_t mqd, struct mq_attr *attr)
+{
+ return mq_setattr(mqd, 0, attr);
+}
diff --git a/libc-top-half/musl/src/mq/mq_notify.c b/libc-top-half/musl/src/mq/mq_notify.c
new file mode 100644
index 0000000..221591c
--- /dev/null
+++ b/libc-top-half/musl/src/mq/mq_notify.c
@@ -0,0 +1,73 @@
+#include <mqueue.h>
+#include <pthread.h>
+#include <errno.h>
+#include <sys/socket.h>
+#include <signal.h>
+#include <unistd.h>
+#include "syscall.h"
+
+struct args {
+ pthread_barrier_t barrier;
+ int sock;
+ const struct sigevent *sev;
+};
+
+static void *start(void *p)
+{
+ struct args *args = p;
+ char buf[32];
+ ssize_t n;
+ int s = args->sock;
+ void (*func)(union sigval) = args->sev->sigev_notify_function;
+ union sigval val = args->sev->sigev_value;
+
+ pthread_barrier_wait(&args->barrier);
+ n = recv(s, buf, sizeof(buf), MSG_NOSIGNAL|MSG_WAITALL);
+ close(s);
+ if (n==sizeof buf && buf[sizeof buf - 1] == 1)
+ func(val);
+ return 0;
+}
+
+int mq_notify(mqd_t mqd, const struct sigevent *sev)
+{
+ struct args args = { .sev = sev };
+ pthread_attr_t attr;
+ pthread_t td;
+ int s;
+ struct sigevent sev2;
+ static const char zeros[32];
+
+ if (!sev || sev->sigev_notify != SIGEV_THREAD)
+ return syscall(SYS_mq_notify, mqd, sev);
+
+ s = socket(AF_NETLINK, SOCK_RAW|SOCK_CLOEXEC, 0);
+ if (s < 0) return -1;
+ args.sock = s;
+
+ if (sev->sigev_notify_attributes) attr = *sev->sigev_notify_attributes;
+ else pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ pthread_barrier_init(&args.barrier, 0, 2);
+
+ if (pthread_create(&td, &attr, start, &args)) {
+ __syscall(SYS_close, s);
+ errno = EAGAIN;
+ return -1;
+ }
+
+ pthread_barrier_wait(&args.barrier);
+ pthread_barrier_destroy(&args.barrier);
+
+ sev2.sigev_notify = SIGEV_THREAD;
+ sev2.sigev_signo = s;
+ sev2.sigev_value.sival_ptr = (void *)&zeros;
+
+ if (syscall(SYS_mq_notify, mqd, &sev2) < 0) {
+ pthread_cancel(td);
+ __syscall(SYS_close, s);
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/libc-top-half/musl/src/mq/mq_open.c b/libc-top-half/musl/src/mq/mq_open.c
new file mode 100644
index 0000000..aa91d58
--- /dev/null
+++ b/libc-top-half/musl/src/mq/mq_open.c
@@ -0,0 +1,19 @@
+#include <mqueue.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include "syscall.h"
+
+mqd_t mq_open(const char *name, int flags, ...)
+{
+ mode_t mode = 0;
+ struct mq_attr *attr = 0;
+ if (*name == '/') name++;
+ if (flags & O_CREAT) {
+ va_list ap;
+ va_start(ap, flags);
+ mode = va_arg(ap, mode_t);
+ attr = va_arg(ap, struct mq_attr *);
+ va_end(ap);
+ }
+ return syscall(SYS_mq_open, name, flags, mode, attr);
+}
diff --git a/libc-top-half/musl/src/mq/mq_receive.c b/libc-top-half/musl/src/mq/mq_receive.c
new file mode 100644
index 0000000..0b1bb4e
--- /dev/null
+++ b/libc-top-half/musl/src/mq/mq_receive.c
@@ -0,0 +1,6 @@
+#include <mqueue.h>
+
+ssize_t mq_receive(mqd_t mqd, char *msg, size_t len, unsigned *prio)
+{
+ return mq_timedreceive(mqd, msg, len, prio, 0);
+}
diff --git a/libc-top-half/musl/src/mq/mq_send.c b/libc-top-half/musl/src/mq/mq_send.c
new file mode 100644
index 0000000..1acb1b7
--- /dev/null
+++ b/libc-top-half/musl/src/mq/mq_send.c
@@ -0,0 +1,6 @@
+#include <mqueue.h>
+
+int mq_send(mqd_t mqd, const char *msg, size_t len, unsigned prio)
+{
+ return mq_timedsend(mqd, msg, len, prio, 0);
+}
diff --git a/libc-top-half/musl/src/mq/mq_setattr.c b/libc-top-half/musl/src/mq/mq_setattr.c
new file mode 100644
index 0000000..eae022e
--- /dev/null
+++ b/libc-top-half/musl/src/mq/mq_setattr.c
@@ -0,0 +1,7 @@
+#include <mqueue.h>
+#include "syscall.h"
+
+int mq_setattr(mqd_t mqd, const struct mq_attr *restrict new, struct mq_attr *restrict old)
+{
+ return syscall(SYS_mq_getsetattr, mqd, new, old);
+}
diff --git a/libc-top-half/musl/src/mq/mq_timedreceive.c b/libc-top-half/musl/src/mq/mq_timedreceive.c
new file mode 100644
index 0000000..f41b664
--- /dev/null
+++ b/libc-top-half/musl/src/mq/mq_timedreceive.c
@@ -0,0 +1,24 @@
+#include <mqueue.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
+
+ssize_t mq_timedreceive(mqd_t mqd, char *restrict msg, size_t len, unsigned *restrict prio, const struct timespec *restrict at)
+{
+#ifdef SYS_mq_timedreceive_time64
+ time_t s = at ? at->tv_sec : 0;
+ long ns = at ? at->tv_nsec : 0;
+ long r = -ENOSYS;
+ if (SYS_mq_timedreceive == SYS_mq_timedreceive_time64 || !IS32BIT(s))
+ r = __syscall_cp(SYS_mq_timedreceive_time64, mqd, msg, len, prio,
+ at ? ((long long []){at->tv_sec, at->tv_nsec}) : 0);
+ if (SYS_mq_timedreceive == SYS_mq_timedreceive_time64 || r != -ENOSYS)
+ return __syscall_ret(r);
+ return syscall_cp(SYS_mq_timedreceive, mqd, msg, len, prio,
+ at ? ((long[]){CLAMP(s), ns}) : 0);
+#else
+ return syscall_cp(SYS_mq_timedreceive, mqd, msg, len, prio, at);
+#endif
+}
diff --git a/libc-top-half/musl/src/mq/mq_timedsend.c b/libc-top-half/musl/src/mq/mq_timedsend.c
new file mode 100644
index 0000000..56cfcbb
--- /dev/null
+++ b/libc-top-half/musl/src/mq/mq_timedsend.c
@@ -0,0 +1,24 @@
+#include <mqueue.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
+
+int mq_timedsend(mqd_t mqd, const char *msg, size_t len, unsigned prio, const struct timespec *at)
+{
+#ifdef SYS_mq_timedsend_time64
+ time_t s = at ? at->tv_sec : 0;
+ long ns = at ? at->tv_nsec : 0;
+ long r = -ENOSYS;
+ if (SYS_mq_timedsend == SYS_mq_timedsend_time64 || !IS32BIT(s))
+ r = __syscall_cp(SYS_mq_timedsend_time64, mqd, msg, len, prio,
+ at ? ((long long []){at->tv_sec, at->tv_nsec}) : 0);
+ if (SYS_mq_timedsend == SYS_mq_timedsend_time64 || r != -ENOSYS)
+ return __syscall_ret(r);
+ return syscall_cp(SYS_mq_timedsend, mqd, msg, len, prio,
+ at ? ((long[]){CLAMP(s), ns}) : 0);
+#else
+ return syscall_cp(SYS_mq_timedsend, mqd, msg, len, prio, at);
+#endif
+}
diff --git a/libc-top-half/musl/src/mq/mq_unlink.c b/libc-top-half/musl/src/mq/mq_unlink.c
new file mode 100644
index 0000000..6a08a4c
--- /dev/null
+++ b/libc-top-half/musl/src/mq/mq_unlink.c
@@ -0,0 +1,16 @@
+#include <mqueue.h>
+#include <errno.h>
+#include "syscall.h"
+
+int mq_unlink(const char *name)
+{
+ int ret;
+ if (*name == '/') name++;
+ ret = __syscall(SYS_mq_unlink, name);
+ if (ret < 0) {
+ if (ret == -EPERM) ret = -EACCES;
+ errno = -ret;
+ return -1;
+ }
+ return ret;
+}
diff --git a/libc-top-half/musl/src/multibyte/btowc.c b/libc-top-half/musl/src/multibyte/btowc.c
new file mode 100644
index 0000000..8acd0a2
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/btowc.c
@@ -0,0 +1,10 @@
+#include <stdio.h>
+#include <wchar.h>
+#include <stdlib.h>
+#include "internal.h"
+
+wint_t btowc(int c)
+{
+ int b = (unsigned char)c;
+ return b<128U ? b : (MB_CUR_MAX==1 && c!=EOF) ? CODEUNIT(c) : WEOF;
+}
diff --git a/libc-top-half/musl/src/multibyte/c16rtomb.c b/libc-top-half/musl/src/multibyte/c16rtomb.c
new file mode 100644
index 0000000..39ca375
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/c16rtomb.c
@@ -0,0 +1,35 @@
+#include <uchar.h>
+#include <errno.h>
+#include <wchar.h>
+
+size_t c16rtomb(char *restrict s, char16_t c16, mbstate_t *restrict ps)
+{
+ static unsigned internal_state;
+ if (!ps) ps = (void *)&internal_state;
+ unsigned *x = (unsigned *)ps;
+ wchar_t wc;
+
+ if (!s) {
+ if (*x) goto ilseq;
+ return 1;
+ }
+
+ if (!*x && c16 - 0xd800u < 0x400) {
+ *x = c16 - 0xd7c0 << 10;
+ return 0;
+ }
+
+ if (*x) {
+ if (c16 - 0xdc00u >= 0x400) goto ilseq;
+ else wc = *x + c16 - 0xdc00;
+ *x = 0;
+ } else {
+ wc = c16;
+ }
+ return wcrtomb(s, wc, 0);
+
+ilseq:
+ *x = 0;
+ errno = EILSEQ;
+ return -1;
+}
diff --git a/libc-top-half/musl/src/multibyte/c32rtomb.c b/libc-top-half/musl/src/multibyte/c32rtomb.c
new file mode 100644
index 0000000..6785132
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/c32rtomb.c
@@ -0,0 +1,7 @@
+#include <uchar.h>
+#include <wchar.h>
+
+size_t c32rtomb(char *restrict s, char32_t c32, mbstate_t *restrict ps)
+{
+ return wcrtomb(s, c32, ps);
+}
diff --git a/libc-top-half/musl/src/multibyte/internal.c b/libc-top-half/musl/src/multibyte/internal.c
new file mode 100644
index 0000000..2f5aaa9
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/internal.c
@@ -0,0 +1,26 @@
+#include "internal.h"
+
+#define C(x) ( x<2 ? -1 : ( R(0x80,0xc0) | x ) )
+#define D(x) C((x+16))
+#define E(x) ( ( x==0 ? R(0xa0,0xc0) : \
+ x==0xd ? R(0x80,0xa0) : \
+ R(0x80,0xc0) ) \
+ | ( R(0x80,0xc0) >> 6 ) \
+ | x )
+#define F(x) ( ( x>=5 ? 0 : \
+ x==0 ? R(0x90,0xc0) : \
+ x==4 ? R(0x80,0x90) : \
+ R(0x80,0xc0) ) \
+ | ( R(0x80,0xc0) >> 6 ) \
+ | ( R(0x80,0xc0) >> 12 ) \
+ | x )
+
+const uint32_t bittab[] = {
+ C(0x2),C(0x3),C(0x4),C(0x5),C(0x6),C(0x7),
+ C(0x8),C(0x9),C(0xa),C(0xb),C(0xc),C(0xd),C(0xe),C(0xf),
+ D(0x0),D(0x1),D(0x2),D(0x3),D(0x4),D(0x5),D(0x6),D(0x7),
+ D(0x8),D(0x9),D(0xa),D(0xb),D(0xc),D(0xd),D(0xe),D(0xf),
+ E(0x0),E(0x1),E(0x2),E(0x3),E(0x4),E(0x5),E(0x6),E(0x7),
+ E(0x8),E(0x9),E(0xa),E(0xb),E(0xc),E(0xd),E(0xe),E(0xf),
+ F(0x0),F(0x1),F(0x2),F(0x3),F(0x4)
+};
diff --git a/libc-top-half/musl/src/multibyte/internal.h b/libc-top-half/musl/src/multibyte/internal.h
new file mode 100644
index 0000000..45bbc6d
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/internal.h
@@ -0,0 +1,24 @@
+#define bittab __fsmu8
+
+#include <stdint.h>
+#include <features.h>
+
+extern hidden const uint32_t bittab[];
+
+/* Upper 6 state bits are a negative integer offset to bound-check next byte */
+/* equivalent to: ( (b-0x80) | (b+offset) ) & ~0x3f */
+#define OOB(c,b) (((((b)>>3)-0x10)|(((b)>>3)+((int32_t)(c)>>26))) & ~7)
+
+/* Interval [a,b). Either a must be 80 or b must be c0, lower 3 bits clear. */
+#define R(a,b) ((uint32_t)((a==0x80 ? 0x40u-b : 0u-a) << 23))
+#define FAILSTATE R(0x80,0x80)
+
+#define SA 0xc2u
+#define SB 0xf4u
+
+/* Arbitrary encoding for representing code units instead of characters. */
+#define CODEUNIT(c) (0xdfff & (signed char)(c))
+#define IS_CODEUNIT(c) ((unsigned)(c)-0xdf80 < 0x80)
+
+/* Get inline definition of MB_CUR_MAX. */
+#include "locale_impl.h"
diff --git a/libc-top-half/musl/src/multibyte/mblen.c b/libc-top-half/musl/src/multibyte/mblen.c
new file mode 100644
index 0000000..a4304bf
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/mblen.c
@@ -0,0 +1,6 @@
+#include <stdlib.h>
+
+int mblen(const char *s, size_t n)
+{
+ return mbtowc(0, s, n);
+}
diff --git a/libc-top-half/musl/src/multibyte/mbrlen.c b/libc-top-half/musl/src/multibyte/mbrlen.c
new file mode 100644
index 0000000..accf4b3
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/mbrlen.c
@@ -0,0 +1,7 @@
+#include <wchar.h>
+
+size_t mbrlen(const char *restrict s, size_t n, mbstate_t *restrict st)
+{
+ static unsigned internal;
+ return mbrtowc(0, s, n, st ? st : (mbstate_t *)&internal);
+}
diff --git a/libc-top-half/musl/src/multibyte/mbrtoc16.c b/libc-top-half/musl/src/multibyte/mbrtoc16.c
new file mode 100644
index 0000000..765ff90
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/mbrtoc16.c
@@ -0,0 +1,30 @@
+#include <uchar.h>
+#include <wchar.h>
+
+size_t mbrtoc16(char16_t *restrict pc16, const char *restrict s, size_t n, mbstate_t *restrict ps)
+{
+ static unsigned internal_state;
+ if (!ps) ps = (void *)&internal_state;
+ unsigned *pending = (unsigned *)ps;
+
+ if (!s) return mbrtoc16(0, "", 1, ps);
+
+ /* mbrtowc states for partial UTF-8 characters have the high bit set;
+ * we use nonzero states without high bit for pending surrogates. */
+ if ((int)*pending > 0) {
+ if (pc16) *pc16 = *pending;
+ *pending = 0;
+ return -3;
+ }
+
+ wchar_t wc;
+ size_t ret = mbrtowc(&wc, s, n, ps);
+ if (ret <= 4) {
+ if (wc >= 0x10000) {
+ *pending = (wc & 0x3ff) + 0xdc00;
+ wc = 0xd7c0 + (wc >> 10);
+ }
+ if (pc16) *pc16 = wc;
+ }
+ return ret;
+}
diff --git a/libc-top-half/musl/src/multibyte/mbrtoc32.c b/libc-top-half/musl/src/multibyte/mbrtoc32.c
new file mode 100644
index 0000000..9b6b236
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/mbrtoc32.c
@@ -0,0 +1,13 @@
+#include <uchar.h>
+#include <wchar.h>
+
+size_t mbrtoc32(char32_t *restrict pc32, const char *restrict s, size_t n, mbstate_t *restrict ps)
+{
+ static unsigned internal_state;
+ if (!ps) ps = (void *)&internal_state;
+ if (!s) return mbrtoc32(0, "", 1, ps);
+ wchar_t wc;
+ size_t ret = mbrtowc(&wc, s, n, ps);
+ if (ret <= 4 && pc32) *pc32 = wc;
+ return ret;
+}
diff --git a/libc-top-half/musl/src/multibyte/mbrtowc.c b/libc-top-half/musl/src/multibyte/mbrtowc.c
new file mode 100644
index 0000000..c94819e
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/mbrtowc.c
@@ -0,0 +1,51 @@
+#include <stdlib.h>
+#include <wchar.h>
+#include <errno.h>
+#include "internal.h"
+
+size_t mbrtowc(wchar_t *restrict wc, const char *restrict src, size_t n, mbstate_t *restrict st)
+{
+ static unsigned internal_state;
+ unsigned c;
+ const unsigned char *s = (const void *)src;
+ const unsigned N = n;
+ wchar_t dummy;
+
+ if (!st) st = (void *)&internal_state;
+ c = *(unsigned *)st;
+
+ if (!s) {
+ if (c) goto ilseq;
+ return 0;
+ } else if (!wc) wc = &dummy;
+
+ if (!n) return -2;
+ if (!c) {
+ if (*s < 0x80) return !!(*wc = *s);
+ if (MB_CUR_MAX==1) return (*wc = CODEUNIT(*s)), 1;
+ if (*s-SA > SB-SA) goto ilseq;
+ c = bittab[*s++-SA]; n--;
+ }
+
+ if (n) {
+ if (OOB(c,*s)) goto ilseq;
+loop:
+ c = c<<6 | *s++-0x80; n--;
+ if (!(c&(1U<<31))) {
+ *(unsigned *)st = 0;
+ *wc = c;
+ return N-n;
+ }
+ if (n) {
+ if (*s-0x80u >= 0x40) goto ilseq;
+ goto loop;
+ }
+ }
+
+ *(unsigned *)st = c;
+ return -2;
+ilseq:
+ *(unsigned *)st = 0;
+ errno = EILSEQ;
+ return -1;
+}
diff --git a/libc-top-half/musl/src/multibyte/mbsinit.c b/libc-top-half/musl/src/multibyte/mbsinit.c
new file mode 100644
index 0000000..c608194
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/mbsinit.c
@@ -0,0 +1,6 @@
+#include <wchar.h>
+
+int mbsinit(const mbstate_t *st)
+{
+ return !st || !*(unsigned *)st;
+}
diff --git a/libc-top-half/musl/src/multibyte/mbsnrtowcs.c b/libc-top-half/musl/src/multibyte/mbsnrtowcs.c
new file mode 100644
index 0000000..931192e
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/mbsnrtowcs.c
@@ -0,0 +1,55 @@
+#include <wchar.h>
+
+size_t mbsnrtowcs(wchar_t *restrict wcs, const char **restrict src, size_t n, size_t wn, mbstate_t *restrict st)
+{
+ size_t l, cnt=0, n2;
+ wchar_t *ws, wbuf[256];
+ const char *s = *src;
+ const char *tmp_s;
+
+ if (!wcs) ws = wbuf, wn = sizeof wbuf / sizeof *wbuf;
+ else ws = wcs;
+
+ /* making sure output buffer size is at most n/4 will ensure
+ * that mbsrtowcs never reads more than n input bytes. thus
+ * we can use mbsrtowcs as long as it's practical.. */
+
+ while ( s && wn && ( (n2=n/4)>=wn || n2>32 ) ) {
+ if (n2>=wn) n2=wn;
+ tmp_s = s;
+ l = mbsrtowcs(ws, &s, n2, st);
+ if (!(l+1)) {
+ cnt = l;
+ wn = 0;
+ break;
+ }
+ if (ws != wbuf) {
+ ws += l;
+ wn -= l;
+ }
+ n = s ? n - (s - tmp_s) : 0;
+ cnt += l;
+ }
+ if (s) while (wn && n) {
+ l = mbrtowc(ws, s, n, st);
+ if (l+2<=2) {
+ if (!(l+1)) {
+ cnt = l;
+ break;
+ }
+ if (!l) {
+ s = 0;
+ break;
+ }
+ /* have to roll back partial character */
+ *(unsigned *)st = 0;
+ break;
+ }
+ s += l; n -= l;
+ /* safe - this loop runs fewer than sizeof(wbuf)/8 times */
+ ws++; wn--;
+ cnt++;
+ }
+ if (wcs) *src = s;
+ return cnt;
+}
diff --git a/libc-top-half/musl/src/multibyte/mbsrtowcs.c b/libc-top-half/musl/src/multibyte/mbsrtowcs.c
new file mode 100644
index 0000000..9b2f2df
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/mbsrtowcs.c
@@ -0,0 +1,120 @@
+#include <stdint.h>
+#include <wchar.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include "internal.h"
+
+size_t mbsrtowcs(wchar_t *restrict ws, const char **restrict src, size_t wn, mbstate_t *restrict st)
+{
+ const unsigned char *s = (const void *)*src;
+ size_t wn0 = wn;
+ unsigned c = 0;
+
+ if (st && (c = *(unsigned *)st)) {
+ if (ws) {
+ *(unsigned *)st = 0;
+ goto resume;
+ } else {
+ goto resume0;
+ }
+ }
+
+ if (MB_CUR_MAX==1) {
+ if (!ws) return strlen((const char *)s);
+ for (;;) {
+ if (!wn) {
+ *src = (const void *)s;
+ return wn0;
+ }
+ if (!*s) break;
+ c = *s++;
+ *ws++ = CODEUNIT(c);
+ wn--;
+ }
+ *ws = 0;
+ *src = 0;
+ return wn0-wn;
+ }
+
+ if (!ws) for (;;) {
+#ifdef __GNUC__
+ typedef uint32_t __attribute__((__may_alias__)) w32;
+ if (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {
+ while (!(( *(w32*)s | *(w32*)s-0x01010101) & 0x80808080)) {
+ s += 4;
+ wn -= 4;
+ }
+ }
+#endif
+ if (*s-1u < 0x7f) {
+ s++;
+ wn--;
+ continue;
+ }
+ if (*s-SA > SB-SA) break;
+ c = bittab[*s++-SA];
+resume0:
+ if (OOB(c,*s)) { s--; break; }
+ s++;
+ if (c&(1U<<25)) {
+ if (*s-0x80u >= 0x40) { s-=2; break; }
+ s++;
+ if (c&(1U<<19)) {
+ if (*s-0x80u >= 0x40) { s-=3; break; }
+ s++;
+ }
+ }
+ wn--;
+ c = 0;
+ } else for (;;) {
+ if (!wn) {
+ *src = (const void *)s;
+ return wn0;
+ }
+#ifdef __GNUC__
+ typedef uint32_t __attribute__((__may_alias__)) w32;
+ if (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {
+ while (wn>=5 && !(( *(w32*)s | *(w32*)s-0x01010101) & 0x80808080)) {
+ *ws++ = *s++;
+ *ws++ = *s++;
+ *ws++ = *s++;
+ *ws++ = *s++;
+ wn -= 4;
+ }
+ }
+#endif
+ if (*s-1u < 0x7f) {
+ *ws++ = *s++;
+ wn--;
+ continue;
+ }
+ if (*s-SA > SB-SA) break;
+ c = bittab[*s++-SA];
+resume:
+ if (OOB(c,*s)) { s--; break; }
+ c = (c<<6) | *s++-0x80;
+ if (c&(1U<<31)) {
+ if (*s-0x80u >= 0x40) { s-=2; break; }
+ c = (c<<6) | *s++-0x80;
+ if (c&(1U<<31)) {
+ if (*s-0x80u >= 0x40) { s-=3; break; }
+ c = (c<<6) | *s++-0x80;
+ }
+ }
+ *ws++ = c;
+ wn--;
+ c = 0;
+ }
+
+ if (!c && !*s) {
+ if (ws) {
+ *ws = 0;
+ *src = 0;
+ }
+ return wn0-wn;
+ }
+ errno = EILSEQ;
+ if (ws) *src = (const void *)s;
+ return -1;
+}
diff --git a/libc-top-half/musl/src/multibyte/mbstowcs.c b/libc-top-half/musl/src/multibyte/mbstowcs.c
new file mode 100644
index 0000000..dc0d459
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/mbstowcs.c
@@ -0,0 +1,7 @@
+#include <stdlib.h>
+#include <wchar.h>
+
+size_t mbstowcs(wchar_t *restrict ws, const char *restrict s, size_t wn)
+{
+ return mbsrtowcs(ws, (void*)&s, wn, 0);
+}
diff --git a/libc-top-half/musl/src/multibyte/mbtowc.c b/libc-top-half/musl/src/multibyte/mbtowc.c
new file mode 100644
index 0000000..c191bb0
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/mbtowc.c
@@ -0,0 +1,47 @@
+#include <stdlib.h>
+#include <wchar.h>
+#include <errno.h>
+#include "internal.h"
+
+int mbtowc(wchar_t *restrict wc, const char *restrict src, size_t n)
+{
+ unsigned c;
+ const unsigned char *s = (const void *)src;
+ wchar_t dummy;
+
+ if (!s) return 0;
+ if (!n) goto ilseq;
+ if (!wc) wc = &dummy;
+
+ if (*s < 0x80) return !!(*wc = *s);
+ if (MB_CUR_MAX==1) return (*wc = CODEUNIT(*s)), 1;
+ if (*s-SA > SB-SA) goto ilseq;
+ c = bittab[*s++-SA];
+
+ /* Avoid excessive checks against n: If shifting the state n-1
+ * times does not clear the high bit, then the value of n is
+ * insufficient to read a character */
+ if (n<4 && ((c<<(6*n-6)) & (1U<<31))) goto ilseq;
+
+ if (OOB(c,*s)) goto ilseq;
+ c = c<<6 | *s++-0x80;
+ if (!(c&(1U<<31))) {
+ *wc = c;
+ return 2;
+ }
+
+ if (*s-0x80u >= 0x40) goto ilseq;
+ c = c<<6 | *s++-0x80;
+ if (!(c&(1U<<31))) {
+ *wc = c;
+ return 3;
+ }
+
+ if (*s-0x80u >= 0x40) goto ilseq;
+ *wc = c<<6 | *s++-0x80;
+ return 4;
+
+ilseq:
+ errno = EILSEQ;
+ return -1;
+}
diff --git a/libc-top-half/musl/src/multibyte/wcrtomb.c b/libc-top-half/musl/src/multibyte/wcrtomb.c
new file mode 100644
index 0000000..8e34926
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/wcrtomb.c
@@ -0,0 +1,37 @@
+#include <stdlib.h>
+#include <wchar.h>
+#include <errno.h>
+#include "internal.h"
+
+size_t wcrtomb(char *restrict s, wchar_t wc, mbstate_t *restrict st)
+{
+ if (!s) return 1;
+ if ((unsigned)wc < 0x80) {
+ *s = wc;
+ return 1;
+ } else if (MB_CUR_MAX == 1) {
+ if (!IS_CODEUNIT(wc)) {
+ errno = EILSEQ;
+ return -1;
+ }
+ *s = wc;
+ return 1;
+ } else if ((unsigned)wc < 0x800) {
+ *s++ = 0xc0 | (wc>>6);
+ *s = 0x80 | (wc&0x3f);
+ return 2;
+ } else if ((unsigned)wc < 0xd800 || (unsigned)wc-0xe000 < 0x2000) {
+ *s++ = 0xe0 | (wc>>12);
+ *s++ = 0x80 | ((wc>>6)&0x3f);
+ *s = 0x80 | (wc&0x3f);
+ return 3;
+ } else if ((unsigned)wc-0x10000 < 0x100000) {
+ *s++ = 0xf0 | (wc>>18);
+ *s++ = 0x80 | ((wc>>12)&0x3f);
+ *s++ = 0x80 | ((wc>>6)&0x3f);
+ *s = 0x80 | (wc&0x3f);
+ return 4;
+ }
+ errno = EILSEQ;
+ return -1;
+}
diff --git a/libc-top-half/musl/src/multibyte/wcsnrtombs.c b/libc-top-half/musl/src/multibyte/wcsnrtombs.c
new file mode 100644
index 0000000..95e25e7
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/wcsnrtombs.c
@@ -0,0 +1,35 @@
+#include <wchar.h>
+#include <limits.h>
+#include <string.h>
+
+size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict wcs, size_t wn, size_t n, mbstate_t *restrict st)
+{
+ const wchar_t *ws = *wcs;
+ size_t cnt = 0;
+ if (!dst) n=0;
+ while (ws && wn) {
+ char tmp[MB_LEN_MAX];
+ size_t l = wcrtomb(n<MB_LEN_MAX ? tmp : dst, *ws, 0);
+ if (l==-1) {
+ cnt = -1;
+ break;
+ }
+ if (dst) {
+ if (n<MB_LEN_MAX) {
+ if (l>n) break;
+ memcpy(dst, tmp, l);
+ }
+ dst += l;
+ n -= l;
+ }
+ if (!*ws) {
+ ws = 0;
+ break;
+ }
+ ws++;
+ wn--;
+ cnt += l;
+ }
+ if (dst) *wcs = ws;
+ return cnt;
+}
diff --git a/libc-top-half/musl/src/multibyte/wcsrtombs.c b/libc-top-half/musl/src/multibyte/wcsrtombs.c
new file mode 100644
index 0000000..b5713ae
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/wcsrtombs.c
@@ -0,0 +1,55 @@
+#include <wchar.h>
+
+size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstate_t *restrict st)
+{
+ const wchar_t *ws2;
+ char buf[4];
+ size_t N = n, l;
+ if (!s) {
+ for (n=0, ws2=*ws; *ws2; ws2++) {
+ if (*ws2 >= 0x80u) {
+ l = wcrtomb(buf, *ws2, 0);
+ if (!(l+1)) return -1;
+ n += l;
+ } else n++;
+ }
+ return n;
+ }
+ while (n>=4) {
+ if (**ws-1u >= 0x7fu) {
+ if (!**ws) {
+ *s = 0;
+ *ws = 0;
+ return N-n;
+ }
+ l = wcrtomb(s, **ws, 0);
+ if (!(l+1)) return -1;
+ s += l;
+ n -= l;
+ } else {
+ *s++ = **ws;
+ n--;
+ }
+ (*ws)++;
+ }
+ while (n) {
+ if (**ws-1u >= 0x7fu) {
+ if (!**ws) {
+ *s = 0;
+ *ws = 0;
+ return N-n;
+ }
+ l = wcrtomb(buf, **ws, 0);
+ if (!(l+1)) return -1;
+ if (l>n) return N-n;
+ wcrtomb(s, **ws, 0);
+ s += l;
+ n -= l;
+ } else {
+ *s++ = **ws;
+ n--;
+ }
+ (*ws)++;
+ }
+ return N;
+}
diff --git a/libc-top-half/musl/src/multibyte/wcstombs.c b/libc-top-half/musl/src/multibyte/wcstombs.c
new file mode 100644
index 0000000..ab15287
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/wcstombs.c
@@ -0,0 +1,7 @@
+#include <stdlib.h>
+#include <wchar.h>
+
+size_t wcstombs(char *restrict s, const wchar_t *restrict ws, size_t n)
+{
+ return wcsrtombs(s, &(const wchar_t *){ws}, n, 0);
+}
diff --git a/libc-top-half/musl/src/multibyte/wctob.c b/libc-top-half/musl/src/multibyte/wctob.c
new file mode 100644
index 0000000..b484a3f
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/wctob.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "internal.h"
+
+int wctob(wint_t c)
+{
+ if (c < 128U) return c;
+ if (MB_CUR_MAX==1 && IS_CODEUNIT(c)) return (unsigned char)c;
+ return EOF;
+}
diff --git a/libc-top-half/musl/src/multibyte/wctomb.c b/libc-top-half/musl/src/multibyte/wctomb.c
new file mode 100644
index 0000000..bad41c5
--- /dev/null
+++ b/libc-top-half/musl/src/multibyte/wctomb.c
@@ -0,0 +1,8 @@
+#include <stdlib.h>
+#include <wchar.h>
+
+int wctomb(char *s, wchar_t wc)
+{
+ if (!s) return 0;
+ return wcrtomb(s, wc, 0);
+}
diff --git a/libc-top-half/musl/src/network/accept.c b/libc-top-half/musl/src/network/accept.c
new file mode 100644
index 0000000..a92406f
--- /dev/null
+++ b/libc-top-half/musl/src/network/accept.c
@@ -0,0 +1,7 @@
+#include <sys/socket.h>
+#include "syscall.h"
+
+int accept(int fd, struct sockaddr *restrict addr, socklen_t *restrict len)
+{
+ return socketcall_cp(accept, fd, addr, len, 0, 0, 0);
+}
diff --git a/libc-top-half/musl/src/network/accept4.c b/libc-top-half/musl/src/network/accept4.c
new file mode 100644
index 0000000..59ab172
--- /dev/null
+++ b/libc-top-half/musl/src/network/accept4.c
@@ -0,0 +1,19 @@
+#define _GNU_SOURCE
+#include <sys/socket.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int accept4(int fd, struct sockaddr *restrict addr, socklen_t *restrict len, int flg)
+{
+ if (!flg) return accept(fd, addr, len);
+ int ret = socketcall_cp(accept4, fd, addr, len, flg, 0, 0);
+ if (ret>=0 || (errno != ENOSYS && errno != EINVAL)) return ret;
+ ret = accept(fd, addr, len);
+ if (ret<0) return ret;
+ if (flg & SOCK_CLOEXEC)
+ __syscall(SYS_fcntl, ret, F_SETFD, FD_CLOEXEC);
+ if (flg & SOCK_NONBLOCK)
+ __syscall(SYS_fcntl, ret, F_SETFL, O_NONBLOCK);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/network/bind.c b/libc-top-half/musl/src/network/bind.c
new file mode 100644
index 0000000..07bb669
--- /dev/null
+++ b/libc-top-half/musl/src/network/bind.c
@@ -0,0 +1,7 @@
+#include <sys/socket.h>
+#include "syscall.h"
+
+int bind(int fd, const struct sockaddr *addr, socklen_t len)
+{
+ return socketcall(bind, fd, addr, len, 0, 0, 0);
+}
diff --git a/libc-top-half/musl/src/network/connect.c b/libc-top-half/musl/src/network/connect.c
new file mode 100644
index 0000000..289127b
--- /dev/null
+++ b/libc-top-half/musl/src/network/connect.c
@@ -0,0 +1,7 @@
+#include <sys/socket.h>
+#include "syscall.h"
+
+int connect(int fd, const struct sockaddr *addr, socklen_t len)
+{
+ return socketcall_cp(connect, fd, addr, len, 0, 0, 0);
+}
diff --git a/libc-top-half/musl/src/network/dn_comp.c b/libc-top-half/musl/src/network/dn_comp.c
new file mode 100644
index 0000000..f0ccd16
--- /dev/null
+++ b/libc-top-half/musl/src/network/dn_comp.c
@@ -0,0 +1,107 @@
+#include <string.h>
+#include <resolv.h>
+
+/* RFC 1035 message compression */
+
+/* label start offsets of a compressed domain name s */
+static int getoffs(short *offs, const unsigned char *base, const unsigned char *s)
+{
+ int i=0;
+ for (;;) {
+ while (*s & 0xc0) {
+ if ((*s & 0xc0) != 0xc0) return 0;
+ s = base + ((s[0]&0x3f)<<8 | s[1]);
+ }
+ if (!*s) return i;
+ if (s-base >= 0x4000) return 0;
+ offs[i++] = s-base;
+ s += *s + 1;
+ }
+}
+
+/* label lengths of an ascii domain name s */
+static int getlens(unsigned char *lens, const char *s, int l)
+{
+ int i=0,j=0,k=0;
+ for (;;) {
+ for (; j<l && s[j]!='.'; j++);
+ if (j-k-1u > 62) return 0;
+ lens[i++] = j-k;
+ if (j==l) return i;
+ k = ++j;
+ }
+}
+
+/* longest suffix match of an ascii domain with a compressed domain name dn */
+static int match(int *offset, const unsigned char *base, const unsigned char *dn,
+ const char *end, const unsigned char *lens, int nlen)
+{
+ int l, o, m=0;
+ short offs[128];
+ int noff = getoffs(offs, base, dn);
+ if (!noff) return 0;
+ for (;;) {
+ l = lens[--nlen];
+ o = offs[--noff];
+ end -= l;
+ if (l != base[o] || memcmp(base+o+1, end, l))
+ return m;
+ *offset = o;
+ m += l;
+ if (nlen) m++;
+ if (!nlen || !noff) return m;
+ end--;
+ }
+}
+
+int dn_comp(const char *src, unsigned char *dst, int space, unsigned char **dnptrs, unsigned char **lastdnptr)
+{
+ int i, j, n, m=0, offset, bestlen=0, bestoff;
+ unsigned char lens[127];
+ unsigned char **p;
+ const char *end;
+ size_t l = strnlen(src, 255);
+ if (l && src[l-1] == '.') l--;
+ if (l>253 || space<=0) return -1;
+ if (!l) {
+ *dst = 0;
+ return 1;
+ }
+ end = src+l;
+ n = getlens(lens, src, l);
+ if (!n) return -1;
+
+ p = dnptrs;
+ if (p && *p) for (p++; *p; p++) {
+ m = match(&offset, *dnptrs, *p, end, lens, n);
+ if (m > bestlen) {
+ bestlen = m;
+ bestoff = offset;
+ if (m == l)
+ break;
+ }
+ }
+
+ /* encode unmatched part */
+ if (space < l-bestlen+2+(bestlen-1 < l-1)) return -1;
+ memcpy(dst+1, src, l-bestlen);
+ for (i=j=0; i<l-bestlen; i+=lens[j++]+1)
+ dst[i] = lens[j];
+
+ /* add tail */
+ if (bestlen) {
+ dst[i++] = 0xc0 | bestoff>>8;
+ dst[i++] = bestoff;
+ } else
+ dst[i++] = 0;
+
+ /* save dst pointer */
+ if (i>2 && lastdnptr && dnptrs && *dnptrs) {
+ while (*p) p++;
+ if (p+1 < lastdnptr) {
+ *p++ = dst;
+ *p=0;
+ }
+ }
+ return i;
+}
diff --git a/libc-top-half/musl/src/network/dn_expand.c b/libc-top-half/musl/src/network/dn_expand.c
new file mode 100644
index 0000000..eac343a
--- /dev/null
+++ b/libc-top-half/musl/src/network/dn_expand.c
@@ -0,0 +1,33 @@
+#include <resolv.h>
+
+int __dn_expand(const unsigned char *base, const unsigned char *end, const unsigned char *src, char *dest, int space)
+{
+ const unsigned char *p = src;
+ char *dend, *dbegin = dest;
+ int len = -1, i, j;
+ if (p==end || space <= 0) return -1;
+ dend = dest + (space > 254 ? 254 : space);
+ /* detect reference loop using an iteration counter */
+ for (i=0; i < end-base; i+=2) {
+ /* loop invariants: p<end, dest<dend */
+ if (*p & 0xc0) {
+ if (p+1==end) return -1;
+ j = ((p[0] & 0x3f) << 8) | p[1];
+ if (len < 0) len = p+2-src;
+ if (j >= end-base) return -1;
+ p = base+j;
+ } else if (*p) {
+ if (dest != dbegin) *dest++ = '.';
+ j = *p++;
+ if (j >= end-p || j >= dend-dest) return -1;
+ while (j--) *dest++ = *p++;
+ } else {
+ *dest = 0;
+ if (len < 0) len = p+1-src;
+ return len;
+ }
+ }
+ return -1;
+}
+
+weak_alias(__dn_expand, dn_expand);
diff --git a/libc-top-half/musl/src/network/dn_skipname.c b/libc-top-half/musl/src/network/dn_skipname.c
new file mode 100644
index 0000000..eba65bb
--- /dev/null
+++ b/libc-top-half/musl/src/network/dn_skipname.c
@@ -0,0 +1,15 @@
+#include <resolv.h>
+
+int dn_skipname(const unsigned char *s, const unsigned char *end)
+{
+ const unsigned char *p = s;
+ while (p < end)
+ if (!*p) return p-s+1;
+ else if (*p>=192)
+ if (p+1<end) return p-s+2;
+ else break;
+ else
+ if (end-p<*p+1) break;
+ else p += *p + 1;
+ return -1;
+}
diff --git a/libc-top-half/musl/src/network/dns_parse.c b/libc-top-half/musl/src/network/dns_parse.c
new file mode 100644
index 0000000..e6ee19d
--- /dev/null
+++ b/libc-top-half/musl/src/network/dns_parse.c
@@ -0,0 +1,33 @@
+#include <string.h>
+#include "lookup.h"
+
+int __dns_parse(const unsigned char *r, int rlen, int (*callback)(void *, int, const void *, int, const void *), void *ctx)
+{
+ int qdcount, ancount;
+ const unsigned char *p;
+ int len;
+
+ if (rlen<12) return -1;
+ if ((r[3]&15)) return 0;
+ p = r+12;
+ qdcount = r[4]*256 + r[5];
+ ancount = r[6]*256 + r[7];
+ if (qdcount+ancount > 64) return -1;
+ while (qdcount--) {
+ while (p-r < rlen && *p-1U < 127) p++;
+ if (*p>193 || (*p==193 && p[1]>254) || p>r+rlen-6)
+ return -1;
+ p += 5 + !!*p;
+ }
+ while (ancount--) {
+ while (p-r < rlen && *p-1U < 127) p++;
+ if (*p>193 || (*p==193 && p[1]>254) || p>r+rlen-6)
+ return -1;
+ p += 1 + !!*p;
+ len = p[8]*256 + p[9];
+ if (p+len > r+rlen) return -1;
+ if (callback(ctx, p[1], p+10, len, r) < 0) return -1;
+ p += 10 + len;
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/network/ent.c b/libc-top-half/musl/src/network/ent.c
new file mode 100644
index 0000000..c6e0123
--- /dev/null
+++ b/libc-top-half/musl/src/network/ent.c
@@ -0,0 +1,22 @@
+#include <netdb.h>
+
+void sethostent(int x)
+{
+}
+
+struct hostent *gethostent()
+{
+ return 0;
+}
+
+struct netent *getnetent()
+{
+ return 0;
+}
+
+void endhostent(void)
+{
+}
+
+weak_alias(sethostent, setnetent);
+weak_alias(endhostent, endnetent);
diff --git a/libc-top-half/musl/src/network/ether.c b/libc-top-half/musl/src/network/ether.c
new file mode 100644
index 0000000..4304a97
--- /dev/null
+++ b/libc-top-half/musl/src/network/ether.c
@@ -0,0 +1,58 @@
+#include <stdlib.h>
+#include <netinet/ether.h>
+#include <stdio.h>
+
+struct ether_addr *ether_aton_r (const char *x, struct ether_addr *p_a)
+{
+ struct ether_addr a;
+ char *y;
+ for (int ii = 0; ii < 6; ii++) {
+ unsigned long int n;
+ if (ii != 0) {
+ if (x[0] != ':') return 0; /* bad format */
+ else x++;
+ }
+ n = strtoul (x, &y, 16);
+ x = y;
+ if (n > 0xFF) return 0; /* bad byte */
+ a.ether_addr_octet[ii] = n;
+ }
+ if (x[0] != 0) return 0; /* bad format */
+ *p_a = a;
+ return p_a;
+}
+
+struct ether_addr *ether_aton (const char *x)
+{
+ static struct ether_addr a;
+ return ether_aton_r (x, &a);
+}
+
+char *ether_ntoa_r (const struct ether_addr *p_a, char *x) {
+ char *y;
+ y = x;
+ for (int ii = 0; ii < 6; ii++) {
+ x += sprintf (x, ii == 0 ? "%.2X" : ":%.2X", p_a->ether_addr_octet[ii]);
+ }
+ return y;
+}
+
+char *ether_ntoa (const struct ether_addr *p_a) {
+ static char x[18];
+ return ether_ntoa_r (p_a, x);
+}
+
+int ether_line(const char *l, struct ether_addr *e, char *hostname)
+{
+ return -1;
+}
+
+int ether_ntohost(char *hostname, const struct ether_addr *e)
+{
+ return -1;
+}
+
+int ether_hostton(const char *hostname, struct ether_addr *e)
+{
+ return -1;
+}
diff --git a/libc-top-half/musl/src/network/freeaddrinfo.c b/libc-top-half/musl/src/network/freeaddrinfo.c
new file mode 100644
index 0000000..62241c2
--- /dev/null
+++ b/libc-top-half/musl/src/network/freeaddrinfo.c
@@ -0,0 +1,16 @@
+#include <stdlib.h>
+#include <stddef.h>
+#include <netdb.h>
+#include "lookup.h"
+#include "lock.h"
+
+void freeaddrinfo(struct addrinfo *p)
+{
+ size_t cnt;
+ for (cnt=1; p->ai_next; cnt++, p=p->ai_next);
+ struct aibuf *b = (void *)((char *)p - offsetof(struct aibuf, ai));
+ b -= b->slot;
+ LOCK(b->lock);
+ if (!(b->ref -= cnt)) free(b);
+ else UNLOCK(b->lock);
+}
diff --git a/libc-top-half/musl/src/network/gai_strerror.c b/libc-top-half/musl/src/network/gai_strerror.c
new file mode 100644
index 0000000..9596580
--- /dev/null
+++ b/libc-top-half/musl/src/network/gai_strerror.c
@@ -0,0 +1,25 @@
+#include <netdb.h>
+#include "locale_impl.h"
+
+static const char msgs[] =
+ "Invalid flags\0"
+ "Name does not resolve\0"
+ "Try again\0"
+ "Non-recoverable error\0"
+ "Unknown error\0"
+ "Unrecognized address family or invalid length\0"
+ "Unrecognized socket type\0"
+ "Unrecognized service\0"
+ "Unknown error\0"
+ "Out of memory\0"
+ "System error\0"
+ "Overflow\0"
+ "\0Unknown error";
+
+const char *gai_strerror(int ecode)
+{
+ const char *s;
+ for (s=msgs, ecode++; ecode && *s; ecode++, s++) for (; *s; s++);
+ if (!*s) s++;
+ return LCTRANS_CUR(s);
+}
diff --git a/libc-top-half/musl/src/network/getaddrinfo.c b/libc-top-half/musl/src/network/getaddrinfo.c
new file mode 100644
index 0000000..efaab30
--- /dev/null
+++ b/libc-top-half/musl/src/network/getaddrinfo.c
@@ -0,0 +1,135 @@
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <string.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <endian.h>
+#include <errno.h>
+#include "lookup.h"
+
+int getaddrinfo(const char *restrict host, const char *restrict serv, const struct addrinfo *restrict hint, struct addrinfo **restrict res)
+{
+ struct service ports[MAXSERVS];
+ struct address addrs[MAXADDRS];
+ char canon[256], *outcanon;
+ int nservs, naddrs, nais, canon_len, i, j, k;
+ int family = AF_UNSPEC, flags = 0, proto = 0, socktype = 0;
+ struct aibuf *out;
+
+ if (!host && !serv) return EAI_NONAME;
+
+ if (hint) {
+ family = hint->ai_family;
+ flags = hint->ai_flags;
+ proto = hint->ai_protocol;
+ socktype = hint->ai_socktype;
+
+ const int mask = AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST |
+ AI_V4MAPPED | AI_ALL | AI_ADDRCONFIG | AI_NUMERICSERV;
+ if ((flags & mask) != flags)
+ return EAI_BADFLAGS;
+
+ switch (family) {
+ case AF_INET:
+ case AF_INET6:
+ case AF_UNSPEC:
+ break;
+ default:
+ return EAI_FAMILY;
+ }
+ }
+
+ if (flags & AI_ADDRCONFIG) {
+ /* Define the "an address is configured" condition for address
+ * families via ability to create a socket for the family plus
+ * routability of the loopback address for the family. */
+ static const struct sockaddr_in lo4 = {
+ .sin_family = AF_INET, .sin_port = 65535,
+ .sin_addr.s_addr = __BYTE_ORDER == __BIG_ENDIAN
+ ? 0x7f000001 : 0x0100007f
+ };
+ static const struct sockaddr_in6 lo6 = {
+ .sin6_family = AF_INET6, .sin6_port = 65535,
+ .sin6_addr = IN6ADDR_LOOPBACK_INIT
+ };
+ int tf[2] = { AF_INET, AF_INET6 };
+ const void *ta[2] = { &lo4, &lo6 };
+ socklen_t tl[2] = { sizeof lo4, sizeof lo6 };
+ for (i=0; i<2; i++) {
+ if (family==tf[1-i]) continue;
+ int s = socket(tf[i], SOCK_CLOEXEC|SOCK_DGRAM,
+ IPPROTO_UDP);
+ if (s>=0) {
+ int cs;
+ pthread_setcancelstate(
+ PTHREAD_CANCEL_DISABLE, &cs);
+ int r = connect(s, ta[i], tl[i]);
+ pthread_setcancelstate(cs, 0);
+ close(s);
+ if (!r) continue;
+ }
+ switch (errno) {
+ case EADDRNOTAVAIL:
+ case EAFNOSUPPORT:
+ case EHOSTUNREACH:
+ case ENETDOWN:
+ case ENETUNREACH:
+ break;
+ default:
+ return EAI_SYSTEM;
+ }
+ if (family == tf[i]) return EAI_NONAME;
+ family = tf[1-i];
+ }
+ }
+
+ nservs = __lookup_serv(ports, serv, proto, socktype, flags);
+ if (nservs < 0) return nservs;
+
+ naddrs = __lookup_name(addrs, canon, host, family, flags);
+ if (naddrs < 0) return naddrs;
+
+ nais = nservs * naddrs;
+ canon_len = strlen(canon);
+ out = calloc(1, nais * sizeof(*out) + canon_len + 1);
+ if (!out) return EAI_MEMORY;
+
+ if (canon_len) {
+ outcanon = (void *)&out[nais];
+ memcpy(outcanon, canon, canon_len+1);
+ } else {
+ outcanon = 0;
+ }
+
+ for (k=i=0; i<naddrs; i++) for (j=0; j<nservs; j++, k++) {
+ out[k].slot = k;
+ out[k].ai = (struct addrinfo){
+ .ai_family = addrs[i].family,
+ .ai_socktype = ports[j].socktype,
+ .ai_protocol = ports[j].proto,
+ .ai_addrlen = addrs[i].family == AF_INET
+ ? sizeof(struct sockaddr_in)
+ : sizeof(struct sockaddr_in6),
+ .ai_addr = (void *)&out[k].sa,
+ .ai_canonname = outcanon };
+ if (k) out[k-1].ai.ai_next = &out[k].ai;
+ switch (addrs[i].family) {
+ case AF_INET:
+ out[k].sa.sin.sin_family = AF_INET;
+ out[k].sa.sin.sin_port = htons(ports[j].port);
+ memcpy(&out[k].sa.sin.sin_addr, &addrs[i].addr, 4);
+ break;
+ case AF_INET6:
+ out[k].sa.sin6.sin6_family = AF_INET6;
+ out[k].sa.sin6.sin6_port = htons(ports[j].port);
+ out[k].sa.sin6.sin6_scope_id = addrs[i].scopeid;
+ memcpy(&out[k].sa.sin6.sin6_addr, &addrs[i].addr, 16);
+ break;
+ }
+ }
+ out[0].ref = nais;
+ *res = &out->ai;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/network/gethostbyaddr.c b/libc-top-half/musl/src/network/gethostbyaddr.c
new file mode 100644
index 0000000..598e224
--- /dev/null
+++ b/libc-top-half/musl/src/network/gethostbyaddr.c
@@ -0,0 +1,24 @@
+#define _GNU_SOURCE
+
+#include <netdb.h>
+#include <errno.h>
+#include <stdlib.h>
+
+struct hostent *gethostbyaddr(const void *a, socklen_t l, int af)
+{
+ static struct hostent *h;
+ size_t size = 63;
+ struct hostent *res;
+ int err;
+ do {
+ free(h);
+ h = malloc(size+=size+1);
+ if (!h) {
+ h_errno = NO_RECOVERY;
+ return 0;
+ }
+ err = gethostbyaddr_r(a, l, af, h,
+ (void *)(h+1), size-sizeof *h, &res, &h_errno);
+ } while (err == ERANGE);
+ return err ? 0 : h;
+}
diff --git a/libc-top-half/musl/src/network/gethostbyaddr_r.c b/libc-top-half/musl/src/network/gethostbyaddr_r.c
new file mode 100644
index 0000000..0f1e61a
--- /dev/null
+++ b/libc-top-half/musl/src/network/gethostbyaddr_r.c
@@ -0,0 +1,71 @@
+#define _GNU_SOURCE
+
+#include <sys/socket.h>
+#include <netdb.h>
+#include <string.h>
+#include <netinet/in.h>
+#include <errno.h>
+#include <inttypes.h>
+
+int gethostbyaddr_r(const void *a, socklen_t l, int af,
+ struct hostent *h, char *buf, size_t buflen,
+ struct hostent **res, int *err)
+{
+ union {
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
+ } sa = { .sin.sin_family = af };
+ socklen_t sl = af==AF_INET6 ? sizeof sa.sin6 : sizeof sa.sin;
+ int i;
+
+ *res = 0;
+
+ /* Load address argument into sockaddr structure */
+ if (af==AF_INET6 && l==16) memcpy(&sa.sin6.sin6_addr, a, 16);
+ else if (af==AF_INET && l==4) memcpy(&sa.sin.sin_addr, a, 4);
+ else {
+ *err = NO_RECOVERY;
+ return EINVAL;
+ }
+
+ /* Align buffer and check for space for pointers and ip address */
+ i = (uintptr_t)buf & sizeof(char *)-1;
+ if (!i) i = sizeof(char *);
+ if (buflen <= 5*sizeof(char *)-i + l) return ERANGE;
+ buf += sizeof(char *)-i;
+ buflen -= 5*sizeof(char *)-i + l;
+
+ h->h_addr_list = (void *)buf;
+ buf += 2*sizeof(char *);
+ h->h_aliases = (void *)buf;
+ buf += 2*sizeof(char *);
+
+ h->h_addr_list[0] = buf;
+ memcpy(h->h_addr_list[0], a, l);
+ buf += l;
+ h->h_addr_list[1] = 0;
+ h->h_aliases[0] = buf;
+ h->h_aliases[1] = 0;
+
+ switch (getnameinfo((void *)&sa, sl, buf, buflen, 0, 0, 0)) {
+ case EAI_AGAIN:
+ *err = TRY_AGAIN;
+ return EAGAIN;
+ case EAI_OVERFLOW:
+ return ERANGE;
+ default:
+ case EAI_MEMORY:
+ case EAI_SYSTEM:
+ case EAI_FAIL:
+ *err = NO_RECOVERY;
+ return errno;
+ case 0:
+ break;
+ }
+
+ h->h_addrtype = af;
+ h->h_length = l;
+ h->h_name = h->h_aliases[0];
+ *res = h;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/network/gethostbyname.c b/libc-top-half/musl/src/network/gethostbyname.c
new file mode 100644
index 0000000..bfedf52
--- /dev/null
+++ b/libc-top-half/musl/src/network/gethostbyname.c
@@ -0,0 +1,11 @@
+#define _GNU_SOURCE
+
+#include <sys/socket.h>
+#include <netdb.h>
+#include <string.h>
+#include <netinet/in.h>
+
+struct hostent *gethostbyname(const char *name)
+{
+ return gethostbyname2(name, AF_INET);
+}
diff --git a/libc-top-half/musl/src/network/gethostbyname2.c b/libc-top-half/musl/src/network/gethostbyname2.c
new file mode 100644
index 0000000..dc9d662
--- /dev/null
+++ b/libc-top-half/musl/src/network/gethostbyname2.c
@@ -0,0 +1,25 @@
+#define _GNU_SOURCE
+
+#include <sys/socket.h>
+#include <netdb.h>
+#include <errno.h>
+#include <stdlib.h>
+
+struct hostent *gethostbyname2(const char *name, int af)
+{
+ static struct hostent *h;
+ size_t size = 63;
+ struct hostent *res;
+ int err;
+ do {
+ free(h);
+ h = malloc(size+=size+1);
+ if (!h) {
+ h_errno = NO_RECOVERY;
+ return 0;
+ }
+ err = gethostbyname2_r(name, af, h,
+ (void *)(h+1), size-sizeof *h, &res, &h_errno);
+ } while (err == ERANGE);
+ return err ? 0 : h;
+}
diff --git a/libc-top-half/musl/src/network/gethostbyname2_r.c b/libc-top-half/musl/src/network/gethostbyname2_r.c
new file mode 100644
index 0000000..fc89487
--- /dev/null
+++ b/libc-top-half/musl/src/network/gethostbyname2_r.c
@@ -0,0 +1,80 @@
+#define _GNU_SOURCE
+
+#include <sys/socket.h>
+#include <netdb.h>
+#include <string.h>
+#include <netinet/in.h>
+#include <errno.h>
+#include <stdint.h>
+#include "lookup.h"
+
+int gethostbyname2_r(const char *name, int af,
+ struct hostent *h, char *buf, size_t buflen,
+ struct hostent **res, int *err)
+{
+ struct address addrs[MAXADDRS];
+ char canon[256];
+ int i, cnt;
+ size_t align, need;
+
+ *res = 0;
+ cnt = __lookup_name(addrs, canon, name, af, AI_CANONNAME);
+ if (cnt<0) switch (cnt) {
+ case EAI_NONAME:
+ *err = HOST_NOT_FOUND;
+ return ENOENT;
+ case EAI_AGAIN:
+ *err = TRY_AGAIN;
+ return EAGAIN;
+ default:
+ case EAI_FAIL:
+ *err = NO_RECOVERY;
+ return EBADMSG;
+ case EAI_MEMORY:
+ case EAI_SYSTEM:
+ *err = NO_RECOVERY;
+ return errno;
+ }
+
+ h->h_addrtype = af;
+ h->h_length = af==AF_INET6 ? 16 : 4;
+
+ /* Align buffer */
+ align = -(uintptr_t)buf & sizeof(char *)-1;
+
+ need = 4*sizeof(char *);
+ need += (cnt + 1) * (sizeof(char *) + h->h_length);
+ need += strlen(name)+1;
+ need += strlen(canon)+1;
+ need += align;
+
+ if (need > buflen) return ERANGE;
+
+ buf += align;
+ h->h_aliases = (void *)buf;
+ buf += 3*sizeof(char *);
+ h->h_addr_list = (void *)buf;
+ buf += (cnt+1)*sizeof(char *);
+
+ for (i=0; i<cnt; i++) {
+ h->h_addr_list[i] = (void *)buf;
+ buf += h->h_length;
+ memcpy(h->h_addr_list[i], addrs[i].addr, h->h_length);
+ }
+ h->h_addr_list[i] = 0;
+
+ h->h_name = h->h_aliases[0] = buf;
+ strcpy(h->h_name, canon);
+ buf += strlen(h->h_name)+1;
+
+ if (strcmp(h->h_name, name)) {
+ h->h_aliases[1] = buf;
+ strcpy(h->h_aliases[1], name);
+ buf += strlen(h->h_aliases[1])+1;
+ } else h->h_aliases[1] = 0;
+
+ h->h_aliases[2] = 0;
+
+ *res = h;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/network/gethostbyname_r.c b/libc-top-half/musl/src/network/gethostbyname_r.c
new file mode 100644
index 0000000..cd87254
--- /dev/null
+++ b/libc-top-half/musl/src/network/gethostbyname_r.c
@@ -0,0 +1,11 @@
+#define _GNU_SOURCE
+
+#include <sys/socket.h>
+#include <netdb.h>
+
+int gethostbyname_r(const char *name,
+ struct hostent *h, char *buf, size_t buflen,
+ struct hostent **res, int *err)
+{
+ return gethostbyname2_r(name, AF_INET, h, buf, buflen, res, err);
+}
diff --git a/libc-top-half/musl/src/network/getifaddrs.c b/libc-top-half/musl/src/network/getifaddrs.c
new file mode 100644
index 0000000..fed75bd
--- /dev/null
+++ b/libc-top-half/musl/src/network/getifaddrs.c
@@ -0,0 +1,216 @@
+#define _GNU_SOURCE
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <ifaddrs.h>
+#include <syscall.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include "netlink.h"
+
+#define IFADDRS_HASH_SIZE 64
+
+/* getifaddrs() reports hardware addresses with PF_PACKET that implies
+ * struct sockaddr_ll. But e.g. Infiniband socket address length is
+ * longer than sockaddr_ll.ssl_addr[8] can hold. Use this hack struct
+ * to extend ssl_addr - callers should be able to still use it. */
+struct sockaddr_ll_hack {
+ unsigned short sll_family, sll_protocol;
+ int sll_ifindex;
+ unsigned short sll_hatype;
+ unsigned char sll_pkttype, sll_halen;
+ unsigned char sll_addr[24];
+};
+
+union sockany {
+ struct sockaddr sa;
+ struct sockaddr_ll_hack ll;
+ struct sockaddr_in v4;
+ struct sockaddr_in6 v6;
+};
+
+struct ifaddrs_storage {
+ struct ifaddrs ifa;
+ struct ifaddrs_storage *hash_next;
+ union sockany addr, netmask, ifu;
+ unsigned int index;
+ char name[IFNAMSIZ+1];
+};
+
+struct ifaddrs_ctx {
+ struct ifaddrs_storage *first;
+ struct ifaddrs_storage *last;
+ struct ifaddrs_storage *hash[IFADDRS_HASH_SIZE];
+};
+
+void freeifaddrs(struct ifaddrs *ifp)
+{
+ struct ifaddrs *n;
+ while (ifp) {
+ n = ifp->ifa_next;
+ free(ifp);
+ ifp = n;
+ }
+}
+
+static void copy_addr(struct sockaddr **r, int af, union sockany *sa, void *addr, size_t addrlen, int ifindex)
+{
+ uint8_t *dst;
+ int len;
+
+ switch (af) {
+ case AF_INET:
+ dst = (uint8_t*) &sa->v4.sin_addr;
+ len = 4;
+ break;
+ case AF_INET6:
+ dst = (uint8_t*) &sa->v6.sin6_addr;
+ len = 16;
+ if (IN6_IS_ADDR_LINKLOCAL(addr) || IN6_IS_ADDR_MC_LINKLOCAL(addr))
+ sa->v6.sin6_scope_id = ifindex;
+ break;
+ default:
+ return;
+ }
+ if (addrlen < len) return;
+ sa->sa.sa_family = af;
+ memcpy(dst, addr, len);
+ *r = &sa->sa;
+}
+
+static void gen_netmask(struct sockaddr **r, int af, union sockany *sa, int prefixlen)
+{
+ uint8_t addr[16] = {0};
+ int i;
+
+ if (prefixlen > 8*sizeof(addr)) prefixlen = 8*sizeof(addr);
+ i = prefixlen / 8;
+ memset(addr, 0xff, i);
+ if (i < sizeof(addr)) addr[i++] = 0xff << (8 - (prefixlen % 8));
+ copy_addr(r, af, sa, addr, sizeof(addr), 0);
+}
+
+static void copy_lladdr(struct sockaddr **r, union sockany *sa, void *addr, size_t addrlen, int ifindex, unsigned short hatype)
+{
+ if (addrlen > sizeof(sa->ll.sll_addr)) return;
+ sa->ll.sll_family = AF_PACKET;
+ sa->ll.sll_ifindex = ifindex;
+ sa->ll.sll_hatype = hatype;
+ sa->ll.sll_halen = addrlen;
+ memcpy(sa->ll.sll_addr, addr, addrlen);
+ *r = &sa->sa;
+}
+
+static int netlink_msg_to_ifaddr(void *pctx, struct nlmsghdr *h)
+{
+ struct ifaddrs_ctx *ctx = pctx;
+ struct ifaddrs_storage *ifs, *ifs0;
+ struct ifinfomsg *ifi = NLMSG_DATA(h);
+ struct ifaddrmsg *ifa = NLMSG_DATA(h);
+ struct rtattr *rta;
+ int stats_len = 0;
+
+ if (h->nlmsg_type == RTM_NEWLINK) {
+ for (rta = NLMSG_RTA(h, sizeof(*ifi)); NLMSG_RTAOK(rta, h); rta = RTA_NEXT(rta)) {
+ if (rta->rta_type != IFLA_STATS) continue;
+ stats_len = RTA_DATALEN(rta);
+ break;
+ }
+ } else {
+ for (ifs0 = ctx->hash[ifa->ifa_index % IFADDRS_HASH_SIZE]; ifs0; ifs0 = ifs0->hash_next)
+ if (ifs0->index == ifa->ifa_index)
+ break;
+ if (!ifs0) return 0;
+ }
+
+ ifs = calloc(1, sizeof(struct ifaddrs_storage) + stats_len);
+ if (ifs == 0) return -1;
+
+ if (h->nlmsg_type == RTM_NEWLINK) {
+ ifs->index = ifi->ifi_index;
+ ifs->ifa.ifa_flags = ifi->ifi_flags;
+
+ for (rta = NLMSG_RTA(h, sizeof(*ifi)); NLMSG_RTAOK(rta, h); rta = RTA_NEXT(rta)) {
+ switch (rta->rta_type) {
+ case IFLA_IFNAME:
+ if (RTA_DATALEN(rta) < sizeof(ifs->name)) {
+ memcpy(ifs->name, RTA_DATA(rta), RTA_DATALEN(rta));
+ ifs->ifa.ifa_name = ifs->name;
+ }
+ break;
+ case IFLA_ADDRESS:
+ copy_lladdr(&ifs->ifa.ifa_addr, &ifs->addr, RTA_DATA(rta), RTA_DATALEN(rta), ifi->ifi_index, ifi->ifi_type);
+ break;
+ case IFLA_BROADCAST:
+ copy_lladdr(&ifs->ifa.ifa_broadaddr, &ifs->ifu, RTA_DATA(rta), RTA_DATALEN(rta), ifi->ifi_index, ifi->ifi_type);
+ break;
+ case IFLA_STATS:
+ ifs->ifa.ifa_data = (void*)(ifs+1);
+ memcpy(ifs->ifa.ifa_data, RTA_DATA(rta), RTA_DATALEN(rta));
+ break;
+ }
+ }
+ if (ifs->ifa.ifa_name) {
+ unsigned int bucket = ifs->index % IFADDRS_HASH_SIZE;
+ ifs->hash_next = ctx->hash[bucket];
+ ctx->hash[bucket] = ifs;
+ }
+ } else {
+ ifs->ifa.ifa_name = ifs0->ifa.ifa_name;
+ ifs->ifa.ifa_flags = ifs0->ifa.ifa_flags;
+ for (rta = NLMSG_RTA(h, sizeof(*ifa)); NLMSG_RTAOK(rta, h); rta = RTA_NEXT(rta)) {
+ switch (rta->rta_type) {
+ case IFA_ADDRESS:
+ /* If ifa_addr is already set we, received an IFA_LOCAL before
+ * so treat this as destination address */
+ if (ifs->ifa.ifa_addr)
+ copy_addr(&ifs->ifa.ifa_dstaddr, ifa->ifa_family, &ifs->ifu, RTA_DATA(rta), RTA_DATALEN(rta), ifa->ifa_index);
+ else
+ copy_addr(&ifs->ifa.ifa_addr, ifa->ifa_family, &ifs->addr, RTA_DATA(rta), RTA_DATALEN(rta), ifa->ifa_index);
+ break;
+ case IFA_BROADCAST:
+ copy_addr(&ifs->ifa.ifa_broadaddr, ifa->ifa_family, &ifs->ifu, RTA_DATA(rta), RTA_DATALEN(rta), ifa->ifa_index);
+ break;
+ case IFA_LOCAL:
+ /* If ifa_addr is set and we get IFA_LOCAL, assume we have
+ * a point-to-point network. Move address to correct field. */
+ if (ifs->ifa.ifa_addr) {
+ ifs->ifu = ifs->addr;
+ ifs->ifa.ifa_dstaddr = &ifs->ifu.sa;
+ memset(&ifs->addr, 0, sizeof(ifs->addr));
+ }
+ copy_addr(&ifs->ifa.ifa_addr, ifa->ifa_family, &ifs->addr, RTA_DATA(rta), RTA_DATALEN(rta), ifa->ifa_index);
+ break;
+ case IFA_LABEL:
+ if (RTA_DATALEN(rta) < sizeof(ifs->name)) {
+ memcpy(ifs->name, RTA_DATA(rta), RTA_DATALEN(rta));
+ ifs->ifa.ifa_name = ifs->name;
+ }
+ break;
+ }
+ }
+ if (ifs->ifa.ifa_addr)
+ gen_netmask(&ifs->ifa.ifa_netmask, ifa->ifa_family, &ifs->netmask, ifa->ifa_prefixlen);
+ }
+
+ if (ifs->ifa.ifa_name) {
+ if (!ctx->first) ctx->first = ifs;
+ if (ctx->last) ctx->last->ifa.ifa_next = &ifs->ifa;
+ ctx->last = ifs;
+ } else {
+ free(ifs);
+ }
+ return 0;
+}
+
+int getifaddrs(struct ifaddrs **ifap)
+{
+ struct ifaddrs_ctx _ctx, *ctx = &_ctx;
+ int r;
+ memset(ctx, 0, sizeof *ctx);
+ r = __rtnetlink_enumerate(AF_UNSPEC, AF_UNSPEC, netlink_msg_to_ifaddr, ctx);
+ if (r == 0) *ifap = &ctx->first->ifa;
+ else freeifaddrs(&ctx->first->ifa);
+ return r;
+}
diff --git a/libc-top-half/musl/src/network/getnameinfo.c b/libc-top-half/musl/src/network/getnameinfo.c
new file mode 100644
index 0000000..949e181
--- /dev/null
+++ b/libc-top-half/musl/src/network/getnameinfo.c
@@ -0,0 +1,200 @@
+#include <netdb.h>
+#include <limits.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <net/if.h>
+#include <ctype.h>
+#include <resolv.h>
+#include "lookup.h"
+#include "stdio_impl.h"
+
+#define PTR_MAX (64 + sizeof ".in-addr.arpa")
+#define RR_PTR 12
+
+static char *itoa(char *p, unsigned x) {
+ p += 3*sizeof(int);
+ *--p = 0;
+ do {
+ *--p = '0' + x % 10;
+ x /= 10;
+ } while (x);
+ return p;
+}
+
+static void mkptr4(char *s, const unsigned char *ip)
+{
+ sprintf(s, "%d.%d.%d.%d.in-addr.arpa",
+ ip[3], ip[2], ip[1], ip[0]);
+}
+
+static void mkptr6(char *s, const unsigned char *ip)
+{
+ static const char xdigits[] = "0123456789abcdef";
+ int i;
+ for (i=15; i>=0; i--) {
+ *s++ = xdigits[ip[i]&15]; *s++ = '.';
+ *s++ = xdigits[ip[i]>>4]; *s++ = '.';
+ }
+ strcpy(s, "ip6.arpa");
+}
+
+static void reverse_hosts(char *buf, const unsigned char *a, unsigned scopeid, int family)
+{
+ char line[512], *p, *z;
+ unsigned char _buf[1032], atmp[16];
+ struct address iplit;
+ FILE _f, *f = __fopen_rb_ca("/etc/hosts", &_f, _buf, sizeof _buf);
+ if (!f) return;
+ if (family == AF_INET) {
+ memcpy(atmp+12, a, 4);
+ memcpy(atmp, "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12);
+ a = atmp;
+ }
+ while (fgets(line, sizeof line, f)) {
+ if ((p=strchr(line, '#'))) *p++='\n', *p=0;
+
+ for (p=line; *p && !isspace(*p); p++);
+ *p++ = 0;
+ if (__lookup_ipliteral(&iplit, line, AF_UNSPEC)<=0)
+ continue;
+
+ if (iplit.family == AF_INET) {
+ memcpy(iplit.addr+12, iplit.addr, 4);
+ memcpy(iplit.addr, "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12);
+ iplit.scopeid = 0;
+ }
+
+ if (memcmp(a, iplit.addr, 16) || iplit.scopeid != scopeid)
+ continue;
+
+ for (; *p && isspace(*p); p++);
+ for (z=p; *z && !isspace(*z); z++);
+ *z = 0;
+ if (z-p < 256) {
+ memcpy(buf, p, z-p+1);
+ break;
+ }
+ }
+ __fclose_ca(f);
+}
+
+static void reverse_services(char *buf, int port, int dgram)
+{
+ unsigned long svport;
+ char line[128], *p, *z;
+ unsigned char _buf[1032];
+ FILE _f, *f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf);
+ if (!f) return;
+ while (fgets(line, sizeof line, f)) {
+ if ((p=strchr(line, '#'))) *p++='\n', *p=0;
+
+ for (p=line; *p && !isspace(*p); p++);
+ if (!*p) continue;
+ *p++ = 0;
+ svport = strtoul(p, &z, 10);
+
+ if (svport != port || z==p) continue;
+ if (dgram && strncmp(z, "/udp", 4)) continue;
+ if (!dgram && strncmp(z, "/tcp", 4)) continue;
+ if (p-line > 32) continue;
+
+ memcpy(buf, line, p-line);
+ break;
+ }
+ __fclose_ca(f);
+}
+
+static int dns_parse_callback(void *c, int rr, const void *data, int len, const void *packet)
+{
+ if (rr != RR_PTR) return 0;
+ if (__dn_expand(packet, (const unsigned char *)packet + 512,
+ data, c, 256) <= 0)
+ *(char *)c = 0;
+ return 0;
+
+}
+
+int getnameinfo(const struct sockaddr *restrict sa, socklen_t sl,
+ char *restrict node, socklen_t nodelen,
+ char *restrict serv, socklen_t servlen,
+ int flags)
+{
+ char ptr[PTR_MAX];
+ char buf[256], num[3*sizeof(int)+1];
+ int af = sa->sa_family;
+ unsigned char *a;
+ unsigned scopeid;
+
+ switch (af) {
+ case AF_INET:
+ a = (void *)&((struct sockaddr_in *)sa)->sin_addr;
+ if (sl < sizeof(struct sockaddr_in)) return EAI_FAMILY;
+ mkptr4(ptr, a);
+ scopeid = 0;
+ break;
+ case AF_INET6:
+ a = (void *)&((struct sockaddr_in6 *)sa)->sin6_addr;
+ if (sl < sizeof(struct sockaddr_in6)) return EAI_FAMILY;
+ if (memcmp(a, "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12))
+ mkptr6(ptr, a);
+ else
+ mkptr4(ptr, a+12);
+ scopeid = ((struct sockaddr_in6 *)sa)->sin6_scope_id;
+ break;
+ default:
+ return EAI_FAMILY;
+ }
+
+ if (node && nodelen) {
+ buf[0] = 0;
+ if (!(flags & NI_NUMERICHOST)) {
+ reverse_hosts(buf, a, scopeid, af);
+ }
+ if (!*buf && !(flags & NI_NUMERICHOST)) {
+ unsigned char query[18+PTR_MAX], reply[512];
+ int qlen = __res_mkquery(0, ptr, 1, RR_PTR,
+ 0, 0, 0, query, sizeof query);
+ query[3] = 0; /* don't need AD flag */
+ int rlen = __res_send(query, qlen, reply, sizeof reply);
+ buf[0] = 0;
+ if (rlen > 0)
+ __dns_parse(reply, rlen, dns_parse_callback, buf);
+ }
+ if (!*buf) {
+ if (flags & NI_NAMEREQD) return EAI_NONAME;
+ inet_ntop(af, a, buf, sizeof buf);
+ if (scopeid) {
+ char *p = 0, tmp[IF_NAMESIZE+1];
+ if (!(flags & NI_NUMERICSCOPE) &&
+ (IN6_IS_ADDR_LINKLOCAL(a) ||
+ IN6_IS_ADDR_MC_LINKLOCAL(a)))
+ p = if_indextoname(scopeid, tmp+1);
+ if (!p)
+ p = itoa(num, scopeid);
+ *--p = '%';
+ strcat(buf, p);
+ }
+ }
+ if (strlen(buf) >= nodelen) return EAI_OVERFLOW;
+ strcpy(node, buf);
+ }
+
+ if (serv && servlen) {
+ char *p = buf;
+ int port = ntohs(((struct sockaddr_in *)sa)->sin_port);
+ buf[0] = 0;
+ if (!(flags & NI_NUMERICSERV))
+ reverse_services(buf, port, flags & NI_DGRAM);
+ if (!*p)
+ p = itoa(num, port);
+ if (strlen(p) >= servlen)
+ return EAI_OVERFLOW;
+ strcpy(serv, p);
+ }
+
+ return 0;
+}
diff --git a/libc-top-half/musl/src/network/getpeername.c b/libc-top-half/musl/src/network/getpeername.c
new file mode 100644
index 0000000..6567b45
--- /dev/null
+++ b/libc-top-half/musl/src/network/getpeername.c
@@ -0,0 +1,7 @@
+#include <sys/socket.h>
+#include "syscall.h"
+
+int getpeername(int fd, struct sockaddr *restrict addr, socklen_t *restrict len)
+{
+ return socketcall(getpeername, fd, addr, len, 0, 0, 0);
+}
diff --git a/libc-top-half/musl/src/network/getservbyname.c b/libc-top-half/musl/src/network/getservbyname.c
new file mode 100644
index 0000000..dd30376
--- /dev/null
+++ b/libc-top-half/musl/src/network/getservbyname.c
@@ -0,0 +1,12 @@
+#define _GNU_SOURCE
+#include <netdb.h>
+
+struct servent *getservbyname(const char *name, const char *prots)
+{
+ static struct servent se;
+ static char *buf[2];
+ struct servent *res;
+ if (getservbyname_r(name, prots, &se, (void *)buf, sizeof buf, &res))
+ return 0;
+ return &se;
+}
diff --git a/libc-top-half/musl/src/network/getservbyname_r.c b/libc-top-half/musl/src/network/getservbyname_r.c
new file mode 100644
index 0000000..cad6317
--- /dev/null
+++ b/libc-top-half/musl/src/network/getservbyname_r.c
@@ -0,0 +1,55 @@
+#define _GNU_SOURCE
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <inttypes.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include "lookup.h"
+
+#define ALIGN (sizeof(struct { char a; char *b; }) - sizeof(char *))
+
+int getservbyname_r(const char *name, const char *prots,
+ struct servent *se, char *buf, size_t buflen, struct servent **res)
+{
+ struct service servs[MAXSERVS];
+ int cnt, proto, align;
+
+ *res = 0;
+
+ /* Don't treat numeric port number strings as service records. */
+ char *end = "";
+ strtoul(name, &end, 10);
+ if (!*end) return ENOENT;
+
+ /* Align buffer */
+ align = -(uintptr_t)buf & ALIGN-1;
+ if (buflen < 2*sizeof(char *)+align)
+ return ERANGE;
+ buf += align;
+
+ if (!prots) proto = 0;
+ else if (!strcmp(prots, "tcp")) proto = IPPROTO_TCP;
+ else if (!strcmp(prots, "udp")) proto = IPPROTO_UDP;
+ else return EINVAL;
+
+ cnt = __lookup_serv(servs, name, proto, 0, 0);
+ if (cnt<0) switch (cnt) {
+ case EAI_MEMORY:
+ case EAI_SYSTEM:
+ return ENOMEM;
+ default:
+ return ENOENT;
+ }
+
+ se->s_name = (char *)name;
+ se->s_aliases = (void *)buf;
+ se->s_aliases[0] = se->s_name;
+ se->s_aliases[1] = 0;
+ se->s_port = htons(servs[0].port);
+ se->s_proto = servs[0].proto == IPPROTO_TCP ? "tcp" : "udp";
+
+ *res = se;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/network/getservbyport.c b/libc-top-half/musl/src/network/getservbyport.c
new file mode 100644
index 0000000..c9ecbb1
--- /dev/null
+++ b/libc-top-half/musl/src/network/getservbyport.c
@@ -0,0 +1,12 @@
+#define _GNU_SOURCE
+#include <netdb.h>
+
+struct servent *getservbyport(int port, const char *prots)
+{
+ static struct servent se;
+ static long buf[32/sizeof(long)];
+ struct servent *res;
+ if (getservbyport_r(port, prots, &se, (void *)buf, sizeof buf, &res))
+ return 0;
+ return &se;
+}
diff --git a/libc-top-half/musl/src/network/getservbyport_r.c b/libc-top-half/musl/src/network/getservbyport_r.c
new file mode 100644
index 0000000..b7f21c6
--- /dev/null
+++ b/libc-top-half/musl/src/network/getservbyport_r.c
@@ -0,0 +1,60 @@
+#define _GNU_SOURCE
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <inttypes.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+int getservbyport_r(int port, const char *prots,
+ struct servent *se, char *buf, size_t buflen, struct servent **res)
+{
+ int i;
+ struct sockaddr_in sin = {
+ .sin_family = AF_INET,
+ .sin_port = port,
+ };
+
+ if (!prots) {
+ int r = getservbyport_r(port, "tcp", se, buf, buflen, res);
+ if (r) r = getservbyport_r(port, "udp", se, buf, buflen, res);
+ return r;
+ }
+ *res = 0;
+
+ /* Align buffer */
+ i = (uintptr_t)buf & sizeof(char *)-1;
+ if (!i) i = sizeof(char *);
+ if (buflen < 3*sizeof(char *)-i)
+ return ERANGE;
+ buf += sizeof(char *)-i;
+ buflen -= sizeof(char *)-i;
+
+ if (strcmp(prots, "tcp") && strcmp(prots, "udp")) return EINVAL;
+
+ se->s_port = port;
+ se->s_proto = (char *)prots;
+ se->s_aliases = (void *)buf;
+ buf += 2*sizeof(char *);
+ buflen -= 2*sizeof(char *);
+ se->s_aliases[1] = 0;
+ se->s_aliases[0] = se->s_name = buf;
+
+ switch (getnameinfo((void *)&sin, sizeof sin, 0, 0, buf, buflen,
+ strcmp(prots, "udp") ? 0 : NI_DGRAM)) {
+ case EAI_MEMORY:
+ case EAI_SYSTEM:
+ return ENOMEM;
+ default:
+ return ENOENT;
+ case 0:
+ break;
+ }
+
+ /* A numeric port string is not a service record. */
+ if (strtol(buf, 0, 10)==ntohs(port)) return ENOENT;
+
+ *res = se;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/network/getsockname.c b/libc-top-half/musl/src/network/getsockname.c
new file mode 100644
index 0000000..7885fc1
--- /dev/null
+++ b/libc-top-half/musl/src/network/getsockname.c
@@ -0,0 +1,7 @@
+#include <sys/socket.h>
+#include "syscall.h"
+
+int getsockname(int fd, struct sockaddr *restrict addr, socklen_t *restrict len)
+{
+ return socketcall(getsockname, fd, addr, len, 0, 0, 0);
+}
diff --git a/libc-top-half/musl/src/network/getsockopt.c b/libc-top-half/musl/src/network/getsockopt.c
new file mode 100644
index 0000000..d3640d9
--- /dev/null
+++ b/libc-top-half/musl/src/network/getsockopt.c
@@ -0,0 +1,41 @@
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <errno.h>
+#include "syscall.h"
+
+int getsockopt(int fd, int level, int optname, void *restrict optval, socklen_t *restrict optlen)
+{
+ long tv32[2];
+ struct timeval *tv;
+
+ int r = __socketcall(getsockopt, fd, level, optname, optval, optlen, 0);
+
+ if (r==-ENOPROTOOPT) switch (level) {
+ case SOL_SOCKET:
+ switch (optname) {
+ case SO_RCVTIMEO:
+ case SO_SNDTIMEO:
+ if (SO_RCVTIMEO == SO_RCVTIMEO_OLD) break;
+ if (*optlen < sizeof *tv) return __syscall_ret(-EINVAL);
+ if (optname==SO_RCVTIMEO) optname=SO_RCVTIMEO_OLD;
+ if (optname==SO_SNDTIMEO) optname=SO_SNDTIMEO_OLD;
+ r = __socketcall(getsockopt, fd, level, optname,
+ tv32, (socklen_t[]){sizeof tv32}, 0);
+ if (r<0) break;
+ tv = optval;
+ tv->tv_sec = tv32[0];
+ tv->tv_usec = tv32[1];
+ *optlen = sizeof *tv;
+ break;
+ case SO_TIMESTAMP:
+ case SO_TIMESTAMPNS:
+ if (SO_TIMESTAMP == SO_TIMESTAMP_OLD) break;
+ if (optname==SO_TIMESTAMP) optname=SO_TIMESTAMP_OLD;
+ if (optname==SO_TIMESTAMPNS) optname=SO_TIMESTAMPNS_OLD;
+ r = __socketcall(getsockopt, fd, level,
+ optname, optval, optlen, 0);
+ break;
+ }
+ }
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/network/h_errno.c b/libc-top-half/musl/src/network/h_errno.c
new file mode 100644
index 0000000..638f771
--- /dev/null
+++ b/libc-top-half/musl/src/network/h_errno.c
@@ -0,0 +1,11 @@
+#include <netdb.h>
+#include "pthread_impl.h"
+
+#undef h_errno
+int h_errno;
+
+int *__h_errno_location(void)
+{
+ if (!__pthread_self()->stack) return &h_errno;
+ return &__pthread_self()->h_errno_val;
+}
diff --git a/libc-top-half/musl/src/network/herror.c b/libc-top-half/musl/src/network/herror.c
new file mode 100644
index 0000000..87f8cff
--- /dev/null
+++ b/libc-top-half/musl/src/network/herror.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <netdb.h>
+
+void herror(const char *msg)
+{
+ fprintf(stderr, "%s%s%s\n", msg?msg:"", msg?": ":"", hstrerror(h_errno));
+}
diff --git a/libc-top-half/musl/src/network/hstrerror.c b/libc-top-half/musl/src/network/hstrerror.c
new file mode 100644
index 0000000..a4d001c
--- /dev/null
+++ b/libc-top-half/musl/src/network/hstrerror.c
@@ -0,0 +1,18 @@
+#define _GNU_SOURCE
+#include <netdb.h>
+#include "locale_impl.h"
+
+static const char msgs[] =
+ "Host not found\0"
+ "Try again\0"
+ "Non-recoverable error\0"
+ "Address not available\0"
+ "\0Unknown error";
+
+const char *hstrerror(int ecode)
+{
+ const char *s;
+ for (s=msgs, ecode--; ecode && *s; ecode--, s++) for (; *s; s++);
+ if (!*s) s++;
+ return LCTRANS_CUR(s);
+}
diff --git a/libc-top-half/musl/src/network/htonl.c b/libc-top-half/musl/src/network/htonl.c
new file mode 100644
index 0000000..6622d16
--- /dev/null
+++ b/libc-top-half/musl/src/network/htonl.c
@@ -0,0 +1,8 @@
+#include <netinet/in.h>
+#include <byteswap.h>
+
+uint32_t htonl(uint32_t n)
+{
+ union { int i; char c; } u = { 1 };
+ return u.c ? bswap_32(n) : n;
+}
diff --git a/libc-top-half/musl/src/network/htons.c b/libc-top-half/musl/src/network/htons.c
new file mode 100644
index 0000000..03a3a1d
--- /dev/null
+++ b/libc-top-half/musl/src/network/htons.c
@@ -0,0 +1,8 @@
+#include <netinet/in.h>
+#include <byteswap.h>
+
+uint16_t htons(uint16_t n)
+{
+ union { int i; char c; } u = { 1 };
+ return u.c ? bswap_16(n) : n;
+}
diff --git a/libc-top-half/musl/src/network/if_freenameindex.c b/libc-top-half/musl/src/network/if_freenameindex.c
new file mode 100644
index 0000000..89bafcc
--- /dev/null
+++ b/libc-top-half/musl/src/network/if_freenameindex.c
@@ -0,0 +1,7 @@
+#include <net/if.h>
+#include <stdlib.h>
+
+void if_freenameindex(struct if_nameindex *idx)
+{
+ free(idx);
+}
diff --git a/libc-top-half/musl/src/network/if_indextoname.c b/libc-top-half/musl/src/network/if_indextoname.c
new file mode 100644
index 0000000..3b368bf
--- /dev/null
+++ b/libc-top-half/musl/src/network/if_indextoname.c
@@ -0,0 +1,23 @@
+#define _GNU_SOURCE
+#include <net/if.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <string.h>
+#include <errno.h>
+#include "syscall.h"
+
+char *if_indextoname(unsigned index, char *name)
+{
+ struct ifreq ifr;
+ int fd, r;
+
+ if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) return 0;
+ ifr.ifr_ifindex = index;
+ r = ioctl(fd, SIOCGIFNAME, &ifr);
+ __syscall(SYS_close, fd);
+ if (r < 0) {
+ if (errno == ENODEV) errno = ENXIO;
+ return 0;
+ }
+ return strncpy(name, ifr.ifr_name, IF_NAMESIZE);
+}
diff --git a/libc-top-half/musl/src/network/if_nameindex.c b/libc-top-half/musl/src/network/if_nameindex.c
new file mode 100644
index 0000000..2deaef7
--- /dev/null
+++ b/libc-top-half/musl/src/network/if_nameindex.c
@@ -0,0 +1,114 @@
+#define _GNU_SOURCE
+#include <net/if.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+#include "netlink.h"
+
+#define IFADDRS_HASH_SIZE 64
+
+struct ifnamemap {
+ unsigned int hash_next;
+ unsigned int index;
+ unsigned char namelen;
+ char name[IFNAMSIZ];
+};
+
+struct ifnameindexctx {
+ unsigned int num, allocated, str_bytes;
+ struct ifnamemap *list;
+ unsigned int hash[IFADDRS_HASH_SIZE];
+};
+
+static int netlink_msg_to_nameindex(void *pctx, struct nlmsghdr *h)
+{
+ struct ifnameindexctx *ctx = pctx;
+ struct ifnamemap *map;
+ struct rtattr *rta;
+ unsigned int i;
+ int index, type, namelen, bucket;
+
+ if (h->nlmsg_type == RTM_NEWLINK) {
+ struct ifinfomsg *ifi = NLMSG_DATA(h);
+ index = ifi->ifi_index;
+ type = IFLA_IFNAME;
+ rta = NLMSG_RTA(h, sizeof(*ifi));
+ } else {
+ struct ifaddrmsg *ifa = NLMSG_DATA(h);
+ index = ifa->ifa_index;
+ type = IFA_LABEL;
+ rta = NLMSG_RTA(h, sizeof(*ifa));
+ }
+ for (; NLMSG_RTAOK(rta, h); rta = RTA_NEXT(rta)) {
+ if (rta->rta_type != type) continue;
+
+ namelen = RTA_DATALEN(rta) - 1;
+ if (namelen > IFNAMSIZ) return 0;
+
+ /* suppress duplicates */
+ bucket = index % IFADDRS_HASH_SIZE;
+ i = ctx->hash[bucket];
+ while (i) {
+ map = &ctx->list[i-1];
+ if (map->index == index &&
+ map->namelen == namelen &&
+ memcmp(map->name, RTA_DATA(rta), namelen) == 0)
+ return 0;
+ i = map->hash_next;
+ }
+
+ if (ctx->num >= ctx->allocated) {
+ size_t a = ctx->allocated ? ctx->allocated * 2 + 1 : 8;
+ if (a > SIZE_MAX/sizeof *map) return -1;
+ map = realloc(ctx->list, a * sizeof *map);
+ if (!map) return -1;
+ ctx->list = map;
+ ctx->allocated = a;
+ }
+ map = &ctx->list[ctx->num];
+ map->index = index;
+ map->namelen = namelen;
+ memcpy(map->name, RTA_DATA(rta), namelen);
+ ctx->str_bytes += namelen + 1;
+ ctx->num++;
+ map->hash_next = ctx->hash[bucket];
+ ctx->hash[bucket] = ctx->num;
+ return 0;
+ }
+ return 0;
+}
+
+struct if_nameindex *if_nameindex()
+{
+ struct ifnameindexctx _ctx, *ctx = &_ctx;
+ struct if_nameindex *ifs = 0, *d;
+ struct ifnamemap *s;
+ char *p;
+ int i;
+ int cs;
+
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ memset(ctx, 0, sizeof(*ctx));
+ if (__rtnetlink_enumerate(AF_UNSPEC, AF_INET, netlink_msg_to_nameindex, ctx) < 0) goto err;
+
+ ifs = malloc(sizeof(struct if_nameindex[ctx->num+1]) + ctx->str_bytes);
+ if (!ifs) goto err;
+
+ p = (char*)(ifs + ctx->num + 1);
+ for (i = ctx->num, d = ifs, s = ctx->list; i; i--, s++, d++) {
+ d->if_index = s->index;
+ d->if_name = p;
+ memcpy(p, s->name, s->namelen);
+ p += s->namelen;
+ *p++ = 0;
+ }
+ d->if_index = 0;
+ d->if_name = 0;
+err:
+ pthread_setcancelstate(cs, 0);
+ free(ctx->list);
+ errno = ENOBUFS;
+ return ifs;
+}
diff --git a/libc-top-half/musl/src/network/if_nametoindex.c b/libc-top-half/musl/src/network/if_nametoindex.c
new file mode 100644
index 0000000..331413c
--- /dev/null
+++ b/libc-top-half/musl/src/network/if_nametoindex.c
@@ -0,0 +1,18 @@
+#define _GNU_SOURCE
+#include <net/if.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <string.h>
+#include "syscall.h"
+
+unsigned if_nametoindex(const char *name)
+{
+ struct ifreq ifr;
+ int fd, r;
+
+ if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) return 0;
+ strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
+ r = ioctl(fd, SIOCGIFINDEX, &ifr);
+ __syscall(SYS_close, fd);
+ return r < 0 ? 0 : ifr.ifr_ifindex;
+}
diff --git a/libc-top-half/musl/src/network/in6addr_any.c b/libc-top-half/musl/src/network/in6addr_any.c
new file mode 100644
index 0000000..995387f
--- /dev/null
+++ b/libc-top-half/musl/src/network/in6addr_any.c
@@ -0,0 +1,3 @@
+#include <netinet/in.h>
+
+const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
diff --git a/libc-top-half/musl/src/network/in6addr_loopback.c b/libc-top-half/musl/src/network/in6addr_loopback.c
new file mode 100644
index 0000000..b96005b
--- /dev/null
+++ b/libc-top-half/musl/src/network/in6addr_loopback.c
@@ -0,0 +1,3 @@
+#include <netinet/in.h>
+
+const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
diff --git a/libc-top-half/musl/src/network/inet_addr.c b/libc-top-half/musl/src/network/inet_addr.c
new file mode 100644
index 0000000..11ece3d
--- /dev/null
+++ b/libc-top-half/musl/src/network/inet_addr.c
@@ -0,0 +1,10 @@
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+in_addr_t inet_addr(const char *p)
+{
+ struct in_addr a;
+ if (!__inet_aton(p, &a)) return -1;
+ return a.s_addr;
+}
diff --git a/libc-top-half/musl/src/network/inet_aton.c b/libc-top-half/musl/src/network/inet_aton.c
new file mode 100644
index 0000000..c65f7c2
--- /dev/null
+++ b/libc-top-half/musl/src/network/inet_aton.c
@@ -0,0 +1,41 @@
+#include <ctype.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <stdlib.h>
+
+int __inet_aton(const char *s0, struct in_addr *dest)
+{
+ const char *s = s0;
+ unsigned char *d = (void *)dest;
+ unsigned long a[4] = { 0 };
+ char *z;
+ int i;
+
+ for (i=0; i<4; i++) {
+ a[i] = strtoul(s, &z, 0);
+ if (z==s || (*z && *z != '.') || !isdigit(*s))
+ return 0;
+ if (!*z) break;
+ s=z+1;
+ }
+ if (i==4) return 0;
+ switch (i) {
+ case 0:
+ a[1] = a[0] & 0xffffff;
+ a[0] >>= 24;
+ case 1:
+ a[2] = a[1] & 0xffff;
+ a[1] >>= 16;
+ case 2:
+ a[3] = a[2] & 0xff;
+ a[2] >>= 8;
+ }
+ for (i=0; i<4; i++) {
+ if (a[i] > 255) return 0;
+ d[i] = a[i];
+ }
+ return 1;
+}
+
+weak_alias(__inet_aton, inet_aton);
diff --git a/libc-top-half/musl/src/network/inet_legacy.c b/libc-top-half/musl/src/network/inet_legacy.c
new file mode 100644
index 0000000..621b47b
--- /dev/null
+++ b/libc-top-half/musl/src/network/inet_legacy.c
@@ -0,0 +1,32 @@
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+in_addr_t inet_network(const char *p)
+{
+ return ntohl(inet_addr(p));
+}
+
+struct in_addr inet_makeaddr(in_addr_t n, in_addr_t h)
+{
+ if (n < 256) h |= n<<24;
+ else if (n < 65536) h |= n<<16;
+ else h |= n<<8;
+ return (struct in_addr){ h };
+}
+
+in_addr_t inet_lnaof(struct in_addr in)
+{
+ uint32_t h = in.s_addr;
+ if (h>>24 < 128) return h & 0xffffff;
+ if (h>>24 < 192) return h & 0xffff;
+ return h & 0xff;
+}
+
+in_addr_t inet_netof(struct in_addr in)
+{
+ uint32_t h = in.s_addr;
+ if (h>>24 < 128) return h >> 24;
+ if (h>>24 < 192) return h >> 16;
+ return h >> 8;
+}
diff --git a/libc-top-half/musl/src/network/inet_ntoa.c b/libc-top-half/musl/src/network/inet_ntoa.c
new file mode 100644
index 0000000..71411e0
--- /dev/null
+++ b/libc-top-half/musl/src/network/inet_ntoa.c
@@ -0,0 +1,10 @@
+#include <arpa/inet.h>
+#include <stdio.h>
+
+char *inet_ntoa(struct in_addr in)
+{
+ static char buf[16];
+ unsigned char *a = (void *)&in;
+ snprintf(buf, sizeof buf, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
+ return buf;
+}
diff --git a/libc-top-half/musl/src/network/inet_ntop.c b/libc-top-half/musl/src/network/inet_ntop.c
new file mode 100644
index 0000000..4bfef2c
--- /dev/null
+++ b/libc-top-half/musl/src/network/inet_ntop.c
@@ -0,0 +1,54 @@
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+const char *inet_ntop(int af, const void *restrict a0, char *restrict s, socklen_t l)
+{
+ const unsigned char *a = a0;
+ int i, j, max, best;
+ char buf[100];
+
+ switch (af) {
+ case AF_INET:
+ if (snprintf(s, l, "%d.%d.%d.%d", a[0],a[1],a[2],a[3]) < l)
+ return s;
+ break;
+ case AF_INET6:
+ if (memcmp(a, "\0\0\0\0\0\0\0\0\0\0\377\377", 12))
+ snprintf(buf, sizeof buf,
+ "%x:%x:%x:%x:%x:%x:%x:%x",
+ 256*a[0]+a[1],256*a[2]+a[3],
+ 256*a[4]+a[5],256*a[6]+a[7],
+ 256*a[8]+a[9],256*a[10]+a[11],
+ 256*a[12]+a[13],256*a[14]+a[15]);
+ else
+ snprintf(buf, sizeof buf,
+ "%x:%x:%x:%x:%x:%x:%d.%d.%d.%d",
+ 256*a[0]+a[1],256*a[2]+a[3],
+ 256*a[4]+a[5],256*a[6]+a[7],
+ 256*a[8]+a[9],256*a[10]+a[11],
+ a[12],a[13],a[14],a[15]);
+ /* Replace longest /(^0|:)[:0]{2,}/ with "::" */
+ for (i=best=0, max=2; buf[i]; i++) {
+ if (i && buf[i] != ':') continue;
+ j = strspn(buf+i, ":0");
+ if (j>max) best=i, max=j;
+ }
+ if (max>3) {
+ buf[best] = buf[best+1] = ':';
+ memmove(buf+best+2, buf+best+max, i-best-max+1);
+ }
+ if (strlen(buf) < l) {
+ strcpy(s, buf);
+ return s;
+ }
+ break;
+ default:
+ errno = EAFNOSUPPORT;
+ return 0;
+ }
+ errno = ENOSPC;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/network/inet_pton.c b/libc-top-half/musl/src/network/inet_pton.c
new file mode 100644
index 0000000..d36c368
--- /dev/null
+++ b/libc-top-half/musl/src/network/inet_pton.c
@@ -0,0 +1,71 @@
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <ctype.h>
+#include <errno.h>
+#include <string.h>
+
+static int hexval(unsigned c)
+{
+ if (c-'0'<10) return c-'0';
+ c |= 32;
+ if (c-'a'<6) return c-'a'+10;
+ return -1;
+}
+
+int inet_pton(int af, const char *restrict s, void *restrict a0)
+{
+ uint16_t ip[8];
+ unsigned char *a = a0;
+ int i, j, v, d, brk=-1, need_v4=0;
+
+ if (af==AF_INET) {
+ for (i=0; i<4; i++) {
+ for (v=j=0; j<3 && isdigit(s[j]); j++)
+ v = 10*v + s[j]-'0';
+ if (j==0 || (j>1 && s[0]=='0') || v>255) return 0;
+ a[i] = v;
+ if (s[j]==0 && i==3) return 1;
+ if (s[j]!='.') return 0;
+ s += j+1;
+ }
+ return 0;
+ } else if (af!=AF_INET6) {
+ errno = EAFNOSUPPORT;
+ return -1;
+ }
+
+ if (*s==':' && *++s!=':') return 0;
+
+ for (i=0; ; i++) {
+ if (s[0]==':' && brk<0) {
+ brk=i;
+ ip[i&7]=0;
+ if (!*++s) break;
+ if (i==7) return 0;
+ continue;
+ }
+ for (v=j=0; j<4 && (d=hexval(s[j]))>=0; j++)
+ v=16*v+d;
+ if (j==0) return 0;
+ ip[i&7] = v;
+ if (!s[j] && (brk>=0 || i==7)) break;
+ if (i==7) return 0;
+ if (s[j]!=':') {
+ if (s[j]!='.' || (i<6 && brk<0)) return 0;
+ need_v4=1;
+ i++;
+ break;
+ }
+ s += j+1;
+ }
+ if (brk>=0) {
+ memmove(ip+brk+7-i, ip+brk, 2*(i+1-brk));
+ for (j=0; j<7-i; j++) ip[brk+j] = 0;
+ }
+ for (j=0; j<8; j++) {
+ *a++ = ip[j]>>8;
+ *a++ = ip[j];
+ }
+ if (need_v4 && inet_pton(AF_INET, (void *)s, a-4) <= 0) return 0;
+ return 1;
+}
diff --git a/libc-top-half/musl/src/network/listen.c b/libc-top-half/musl/src/network/listen.c
new file mode 100644
index 0000000..f84ad03
--- /dev/null
+++ b/libc-top-half/musl/src/network/listen.c
@@ -0,0 +1,7 @@
+#include <sys/socket.h>
+#include "syscall.h"
+
+int listen(int fd, int backlog)
+{
+ return socketcall(listen, fd, backlog, 0, 0, 0, 0);
+}
diff --git a/libc-top-half/musl/src/network/lookup.h b/libc-top-half/musl/src/network/lookup.h
new file mode 100644
index 0000000..ef66272
--- /dev/null
+++ b/libc-top-half/musl/src/network/lookup.h
@@ -0,0 +1,55 @@
+#ifndef LOOKUP_H
+#define LOOKUP_H
+
+#include <stdint.h>
+#include <stddef.h>
+#include <features.h>
+#include <netinet/in.h>
+#include <netdb.h>
+
+struct aibuf {
+ struct addrinfo ai;
+ union sa {
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
+ } sa;
+ volatile int lock[1];
+ short slot, ref;
+};
+
+struct address {
+ int family;
+ unsigned scopeid;
+ uint8_t addr[16];
+ int sortkey;
+};
+
+struct service {
+ uint16_t port;
+ unsigned char proto, socktype;
+};
+
+#define MAXNS 3
+
+struct resolvconf {
+ struct address ns[MAXNS];
+ unsigned nns, attempts, ndots;
+ unsigned timeout;
+};
+
+/* The limit of 48 results is a non-sharp bound on the number of addresses
+ * that can fit in one 512-byte DNS packet full of v4 results and a second
+ * packet full of v6 results. Due to headers, the actual limit is lower. */
+#define MAXADDRS 48
+#define MAXSERVS 2
+
+hidden int __lookup_serv(struct service buf[static MAXSERVS], const char *name, int proto, int socktype, int flags);
+hidden int __lookup_name(struct address buf[static MAXADDRS], char canon[static 256], const char *name, int family, int flags);
+hidden int __lookup_ipliteral(struct address buf[static 1], const char *name, int family);
+
+hidden int __get_resolv_conf(struct resolvconf *, char *, size_t);
+hidden int __res_msend_rc(int, const unsigned char *const *, const int *, unsigned char *const *, int *, int, const struct resolvconf *);
+
+hidden int __dns_parse(const unsigned char *, int, int (*)(void *, int, const void *, int, const void *), void *);
+
+#endif
diff --git a/libc-top-half/musl/src/network/lookup_ipliteral.c b/libc-top-half/musl/src/network/lookup_ipliteral.c
new file mode 100644
index 0000000..2fddab7
--- /dev/null
+++ b/libc-top-half/musl/src/network/lookup_ipliteral.c
@@ -0,0 +1,55 @@
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <net/if.h>
+#include <arpa/inet.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include "lookup.h"
+
+int __lookup_ipliteral(struct address buf[static 1], const char *name, int family)
+{
+ struct in_addr a4;
+ struct in6_addr a6;
+ if (__inet_aton(name, &a4) > 0) {
+ if (family == AF_INET6) /* wrong family */
+ return EAI_NONAME;
+ memcpy(&buf[0].addr, &a4, sizeof a4);
+ buf[0].family = AF_INET;
+ buf[0].scopeid = 0;
+ return 1;
+ }
+
+ char tmp[64];
+ char *p = strchr(name, '%'), *z;
+ unsigned long long scopeid = 0;
+ if (p && p-name < 64) {
+ memcpy(tmp, name, p-name);
+ tmp[p-name] = 0;
+ name = tmp;
+ }
+
+ if (inet_pton(AF_INET6, name, &a6) <= 0)
+ return 0;
+ if (family == AF_INET) /* wrong family */
+ return EAI_NONAME;
+
+ memcpy(&buf[0].addr, &a6, sizeof a6);
+ buf[0].family = AF_INET6;
+ if (p) {
+ if (isdigit(*++p)) scopeid = strtoull(p, &z, 10);
+ else z = p-1;
+ if (*z) {
+ if (!IN6_IS_ADDR_LINKLOCAL(&a6) &&
+ !IN6_IS_ADDR_MC_LINKLOCAL(&a6))
+ return EAI_NONAME;
+ scopeid = if_nametoindex(p);
+ if (!scopeid) return EAI_NONAME;
+ }
+ if (scopeid > UINT_MAX) return EAI_NONAME;
+ }
+ buf[0].scopeid = scopeid;
+ return 1;
+}
diff --git a/libc-top-half/musl/src/network/lookup_name.c b/libc-top-half/musl/src/network/lookup_name.c
new file mode 100644
index 0000000..aa558c1
--- /dev/null
+++ b/libc-top-half/musl/src/network/lookup_name.c
@@ -0,0 +1,425 @@
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <net/if.h>
+#include <arpa/inet.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <errno.h>
+#include <resolv.h>
+#include "lookup.h"
+#include "stdio_impl.h"
+#include "syscall.h"
+
+static int is_valid_hostname(const char *host)
+{
+ const unsigned char *s;
+ if (strnlen(host, 255)-1 >= 254 || mbstowcs(0, host, 0) == -1) return 0;
+ for (s=(void *)host; *s>=0x80 || *s=='.' || *s=='-' || isalnum(*s); s++);
+ return !*s;
+}
+
+static int name_from_null(struct address buf[static 2], const char *name, int family, int flags)
+{
+ int cnt = 0;
+ if (name) return 0;
+ if (flags & AI_PASSIVE) {
+ if (family != AF_INET6)
+ buf[cnt++] = (struct address){ .family = AF_INET };
+ if (family != AF_INET)
+ buf[cnt++] = (struct address){ .family = AF_INET6 };
+ } else {
+ if (family != AF_INET6)
+ buf[cnt++] = (struct address){ .family = AF_INET, .addr = { 127,0,0,1 } };
+ if (family != AF_INET)
+ buf[cnt++] = (struct address){ .family = AF_INET6, .addr = { [15] = 1 } };
+ }
+ return cnt;
+}
+
+static int name_from_numeric(struct address buf[static 1], const char *name, int family)
+{
+ return __lookup_ipliteral(buf, name, family);
+}
+
+static int name_from_hosts(struct address buf[static MAXADDRS], char canon[static 256], const char *name, int family)
+{
+ char line[512];
+ size_t l = strlen(name);
+ int cnt = 0, badfam = 0, have_canon = 0;
+ unsigned char _buf[1032];
+ FILE _f, *f = __fopen_rb_ca("/etc/hosts", &_f, _buf, sizeof _buf);
+ if (!f) switch (errno) {
+ case ENOENT:
+ case ENOTDIR:
+ case EACCES:
+ return 0;
+ default:
+ return EAI_SYSTEM;
+ }
+ while (fgets(line, sizeof line, f) && cnt < MAXADDRS) {
+ char *p, *z;
+
+ if ((p=strchr(line, '#'))) *p++='\n', *p=0;
+ for(p=line+1; (p=strstr(p, name)) &&
+ (!isspace(p[-1]) || !isspace(p[l])); p++);
+ if (!p) continue;
+
+ /* Isolate IP address to parse */
+ for (p=line; *p && !isspace(*p); p++);
+ *p++ = 0;
+ switch (name_from_numeric(buf+cnt, line, family)) {
+ case 1:
+ cnt++;
+ break;
+ case 0:
+ continue;
+ default:
+ badfam = EAI_NONAME;
+ break;
+ }
+
+ if (have_canon) continue;
+
+ /* Extract first name as canonical name */
+ for (; *p && isspace(*p); p++);
+ for (z=p; *z && !isspace(*z); z++);
+ *z = 0;
+ if (is_valid_hostname(p)) {
+ have_canon = 1;
+ memcpy(canon, p, z-p+1);
+ }
+ }
+ __fclose_ca(f);
+ return cnt ? cnt : badfam;
+}
+
+struct dpc_ctx {
+ struct address *addrs;
+ char *canon;
+ int cnt;
+};
+
+#define RR_A 1
+#define RR_CNAME 5
+#define RR_AAAA 28
+
+static int dns_parse_callback(void *c, int rr, const void *data, int len, const void *packet)
+{
+ char tmp[256];
+ struct dpc_ctx *ctx = c;
+ if (ctx->cnt >= MAXADDRS) return -1;
+ switch (rr) {
+ case RR_A:
+ if (len != 4) return -1;
+ ctx->addrs[ctx->cnt].family = AF_INET;
+ ctx->addrs[ctx->cnt].scopeid = 0;
+ memcpy(ctx->addrs[ctx->cnt++].addr, data, 4);
+ break;
+ case RR_AAAA:
+ if (len != 16) return -1;
+ ctx->addrs[ctx->cnt].family = AF_INET6;
+ ctx->addrs[ctx->cnt].scopeid = 0;
+ memcpy(ctx->addrs[ctx->cnt++].addr, data, 16);
+ break;
+ case RR_CNAME:
+ if (__dn_expand(packet, (const unsigned char *)packet + 512,
+ data, tmp, sizeof tmp) > 0 && is_valid_hostname(tmp))
+ strcpy(ctx->canon, tmp);
+ break;
+ }
+ return 0;
+}
+
+static int name_from_dns(struct address buf[static MAXADDRS], char canon[static 256], const char *name, int family, const struct resolvconf *conf)
+{
+ unsigned char qbuf[2][280], abuf[2][512];
+ const unsigned char *qp[2] = { qbuf[0], qbuf[1] };
+ unsigned char *ap[2] = { abuf[0], abuf[1] };
+ int qlens[2], alens[2];
+ int i, nq = 0;
+ struct dpc_ctx ctx = { .addrs = buf, .canon = canon };
+ static const struct { int af; int rr; } afrr[2] = {
+ { .af = AF_INET6, .rr = RR_A },
+ { .af = AF_INET, .rr = RR_AAAA },
+ };
+
+ for (i=0; i<2; i++) {
+ if (family != afrr[i].af) {
+ qlens[nq] = __res_mkquery(0, name, 1, afrr[i].rr,
+ 0, 0, 0, qbuf[nq], sizeof *qbuf);
+ if (qlens[nq] == -1)
+ return EAI_NONAME;
+ qbuf[nq][3] = 0; /* don't need AD flag */
+ nq++;
+ }
+ }
+
+ if (__res_msend_rc(nq, qp, qlens, ap, alens, sizeof *abuf, conf) < 0)
+ return EAI_SYSTEM;
+
+ for (i=0; i<nq; i++) {
+ if (alens[i] < 4 || (abuf[i][3] & 15) == 2) return EAI_AGAIN;
+ if ((abuf[i][3] & 15) == 3) return 0;
+ if ((abuf[i][3] & 15) != 0) return EAI_FAIL;
+ }
+
+ for (i=0; i<nq; i++)
+ __dns_parse(abuf[i], alens[i], dns_parse_callback, &ctx);
+
+ if (ctx.cnt) return ctx.cnt;
+ return EAI_NONAME;
+}
+
+static int name_from_dns_search(struct address buf[static MAXADDRS], char canon[static 256], const char *name, int family)
+{
+ char search[256];
+ struct resolvconf conf;
+ size_t l, dots;
+ char *p, *z;
+
+ if (__get_resolv_conf(&conf, search, sizeof search) < 0) return -1;
+
+ /* Count dots, suppress search when >=ndots or name ends in
+ * a dot, which is an explicit request for global scope. */
+ for (dots=l=0; name[l]; l++) if (name[l]=='.') dots++;
+ if (dots >= conf.ndots || name[l-1]=='.') *search = 0;
+
+ /* Strip final dot for canon, fail if multiple trailing dots. */
+ if (name[l-1]=='.') l--;
+ if (!l || name[l-1]=='.') return EAI_NONAME;
+
+ /* This can never happen; the caller already checked length. */
+ if (l >= 256) return EAI_NONAME;
+
+ /* Name with search domain appended is setup in canon[]. This both
+ * provides the desired default canonical name (if the requested
+ * name is not a CNAME record) and serves as a buffer for passing
+ * the full requested name to name_from_dns. */
+ memcpy(canon, name, l);
+ canon[l] = '.';
+
+ for (p=search; *p; p=z) {
+ for (; isspace(*p); p++);
+ for (z=p; *z && !isspace(*z); z++);
+ if (z==p) break;
+ if (z-p < 256 - l - 1) {
+ memcpy(canon+l+1, p, z-p);
+ canon[z-p+1+l] = 0;
+ int cnt = name_from_dns(buf, canon, canon, family, &conf);
+ if (cnt) return cnt;
+ }
+ }
+
+ canon[l] = 0;
+ return name_from_dns(buf, canon, name, family, &conf);
+}
+
+static const struct policy {
+ unsigned char addr[16];
+ unsigned char len, mask;
+ unsigned char prec, label;
+} defpolicy[] = {
+ { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1", 15, 0xff, 50, 0 },
+ { "\0\0\0\0\0\0\0\0\0\0\xff\xff", 11, 0xff, 35, 4 },
+ { "\x20\2", 1, 0xff, 30, 2 },
+ { "\x20\1", 3, 0xff, 5, 5 },
+ { "\xfc", 0, 0xfe, 3, 13 },
+#if 0
+ /* These are deprecated and/or returned to the address
+ * pool, so despite the RFC, treating them as special
+ * is probably wrong. */
+ { "", 11, 0xff, 1, 3 },
+ { "\xfe\xc0", 1, 0xc0, 1, 11 },
+ { "\x3f\xfe", 1, 0xff, 1, 12 },
+#endif
+ /* Last rule must match all addresses to stop loop. */
+ { "", 0, 0, 40, 1 },
+};
+
+static const struct policy *policyof(const struct in6_addr *a)
+{
+ int i;
+ for (i=0; ; i++) {
+ if (memcmp(a->s6_addr, defpolicy[i].addr, defpolicy[i].len))
+ continue;
+ if ((a->s6_addr[defpolicy[i].len] & defpolicy[i].mask)
+ != defpolicy[i].addr[defpolicy[i].len])
+ continue;
+ return defpolicy+i;
+ }
+}
+
+static int labelof(const struct in6_addr *a)
+{
+ return policyof(a)->label;
+}
+
+static int scopeof(const struct in6_addr *a)
+{
+ if (IN6_IS_ADDR_MULTICAST(a)) return a->s6_addr[1] & 15;
+ if (IN6_IS_ADDR_LINKLOCAL(a)) return 2;
+ if (IN6_IS_ADDR_LOOPBACK(a)) return 2;
+ if (IN6_IS_ADDR_SITELOCAL(a)) return 5;
+ return 14;
+}
+
+static int prefixmatch(const struct in6_addr *s, const struct in6_addr *d)
+{
+ /* FIXME: The common prefix length should be limited to no greater
+ * than the nominal length of the prefix portion of the source
+ * address. However the definition of the source prefix length is
+ * not clear and thus this limiting is not yet implemented. */
+ unsigned i;
+ for (i=0; i<128 && !((s->s6_addr[i/8]^d->s6_addr[i/8])&(128>>(i%8))); i++);
+ return i;
+}
+
+#define DAS_USABLE 0x40000000
+#define DAS_MATCHINGSCOPE 0x20000000
+#define DAS_MATCHINGLABEL 0x10000000
+#define DAS_PREC_SHIFT 20
+#define DAS_SCOPE_SHIFT 16
+#define DAS_PREFIX_SHIFT 8
+#define DAS_ORDER_SHIFT 0
+
+static int addrcmp(const void *_a, const void *_b)
+{
+ const struct address *a = _a, *b = _b;
+ return b->sortkey - a->sortkey;
+}
+
+int __lookup_name(struct address buf[static MAXADDRS], char canon[static 256], const char *name, int family, int flags)
+{
+ int cnt = 0, i, j;
+
+ *canon = 0;
+ if (name) {
+ /* reject empty name and check len so it fits into temp bufs */
+ size_t l = strnlen(name, 255);
+ if (l-1 >= 254)
+ return EAI_NONAME;
+ memcpy(canon, name, l+1);
+ }
+
+ /* Procedurally, a request for v6 addresses with the v4-mapped
+ * flag set is like a request for unspecified family, followed
+ * by filtering of the results. */
+ if (flags & AI_V4MAPPED) {
+ if (family == AF_INET6) family = AF_UNSPEC;
+ else flags -= AI_V4MAPPED;
+ }
+
+ /* Try each backend until there's at least one result. */
+ cnt = name_from_null(buf, name, family, flags);
+ if (!cnt) cnt = name_from_numeric(buf, name, family);
+ if (!cnt && !(flags & AI_NUMERICHOST)) {
+ cnt = name_from_hosts(buf, canon, name, family);
+ if (!cnt) cnt = name_from_dns_search(buf, canon, name, family);
+ }
+ if (cnt<=0) return cnt ? cnt : EAI_NONAME;
+
+ /* Filter/transform results for v4-mapped lookup, if requested. */
+ if (flags & AI_V4MAPPED) {
+ if (!(flags & AI_ALL)) {
+ /* If any v6 results exist, remove v4 results. */
+ for (i=0; i<cnt && buf[i].family != AF_INET6; i++);
+ if (i<cnt) {
+ for (j=0; i<cnt; i++) {
+ if (buf[i].family == AF_INET6)
+ buf[j++] = buf[i];
+ }
+ cnt = i = j;
+ }
+ }
+ /* Translate any remaining v4 results to v6 */
+ for (i=0; i<cnt; i++) {
+ if (buf[i].family != AF_INET) continue;
+ memcpy(buf[i].addr+12, buf[i].addr, 4);
+ memcpy(buf[i].addr, "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12);
+ buf[i].family = AF_INET6;
+ }
+ }
+
+ /* No further processing is needed if there are fewer than 2
+ * results or if there are only IPv4 results. */
+ if (cnt<2 || family==AF_INET) return cnt;
+ for (i=0; i<cnt; i++) if (buf[i].family != AF_INET) break;
+ if (i==cnt) return cnt;
+
+ int cs;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
+ /* The following implements a subset of RFC 3484/6724 destination
+ * address selection by generating a single 31-bit sort key for
+ * each address. Rules 3, 4, and 7 are omitted for having
+ * excessive runtime and code size cost and dubious benefit.
+ * So far the label/precedence table cannot be customized. */
+ for (i=0; i<cnt; i++) {
+ int family = buf[i].family;
+ int key = 0;
+ struct sockaddr_in6 sa6 = { 0 }, da6 = {
+ .sin6_family = AF_INET6,
+ .sin6_scope_id = buf[i].scopeid,
+ .sin6_port = 65535
+ };
+ struct sockaddr_in sa4 = { 0 }, da4 = {
+ .sin_family = AF_INET,
+ .sin_port = 65535
+ };
+ void *sa, *da;
+ socklen_t salen, dalen;
+ if (family == AF_INET6) {
+ memcpy(da6.sin6_addr.s6_addr, buf[i].addr, 16);
+ da = &da6; dalen = sizeof da6;
+ sa = &sa6; salen = sizeof sa6;
+ } else {
+ memcpy(sa6.sin6_addr.s6_addr,
+ "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12);
+ memcpy(da6.sin6_addr.s6_addr+12, buf[i].addr, 4);
+ memcpy(da6.sin6_addr.s6_addr,
+ "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12);
+ memcpy(da6.sin6_addr.s6_addr+12, buf[i].addr, 4);
+ memcpy(&da4.sin_addr, buf[i].addr, 4);
+ da = &da4; dalen = sizeof da4;
+ sa = &sa4; salen = sizeof sa4;
+ }
+ const struct policy *dpolicy = policyof(&da6.sin6_addr);
+ int dscope = scopeof(&da6.sin6_addr);
+ int dlabel = dpolicy->label;
+ int dprec = dpolicy->prec;
+ int prefixlen = 0;
+ int fd = socket(family, SOCK_DGRAM|SOCK_CLOEXEC, IPPROTO_UDP);
+ if (fd >= 0) {
+ if (!connect(fd, da, dalen)) {
+ key |= DAS_USABLE;
+ if (!getsockname(fd, sa, &salen)) {
+ if (family == AF_INET) memcpy(
+ sa6.sin6_addr.s6_addr+12,
+ &sa4.sin_addr, 4);
+ if (dscope == scopeof(&sa6.sin6_addr))
+ key |= DAS_MATCHINGSCOPE;
+ if (dlabel == labelof(&sa6.sin6_addr))
+ key |= DAS_MATCHINGLABEL;
+ prefixlen = prefixmatch(&sa6.sin6_addr,
+ &da6.sin6_addr);
+ }
+ }
+ close(fd);
+ }
+ key |= dprec << DAS_PREC_SHIFT;
+ key |= (15-dscope) << DAS_SCOPE_SHIFT;
+ key |= prefixlen << DAS_PREFIX_SHIFT;
+ key |= (MAXADDRS-i) << DAS_ORDER_SHIFT;
+ buf[i].sortkey = key;
+ }
+ qsort(buf, cnt, sizeof *buf, addrcmp);
+
+ pthread_setcancelstate(cs, 0);
+
+ return cnt;
+}
diff --git a/libc-top-half/musl/src/network/lookup_serv.c b/libc-top-half/musl/src/network/lookup_serv.c
new file mode 100644
index 0000000..ae38277
--- /dev/null
+++ b/libc-top-half/musl/src/network/lookup_serv.c
@@ -0,0 +1,114 @@
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "lookup.h"
+#include "stdio_impl.h"
+
+int __lookup_serv(struct service buf[static MAXSERVS], const char *name, int proto, int socktype, int flags)
+{
+ char line[128];
+ int cnt = 0;
+ char *p, *z = "";
+ unsigned long port = 0;
+
+ switch (socktype) {
+ case SOCK_STREAM:
+ switch (proto) {
+ case 0:
+ proto = IPPROTO_TCP;
+ case IPPROTO_TCP:
+ break;
+ default:
+ return EAI_SERVICE;
+ }
+ break;
+ case SOCK_DGRAM:
+ switch (proto) {
+ case 0:
+ proto = IPPROTO_UDP;
+ case IPPROTO_UDP:
+ break;
+ default:
+ return EAI_SERVICE;
+ }
+ case 0:
+ break;
+ default:
+ if (name) return EAI_SERVICE;
+ buf[0].port = 0;
+ buf[0].proto = proto;
+ buf[0].socktype = socktype;
+ return 1;
+ }
+
+ if (name) {
+ if (!*name) return EAI_SERVICE;
+ port = strtoul(name, &z, 10);
+ }
+ if (!*z) {
+ if (port > 65535) return EAI_SERVICE;
+ if (proto != IPPROTO_UDP) {
+ buf[cnt].port = port;
+ buf[cnt].socktype = SOCK_STREAM;
+ buf[cnt++].proto = IPPROTO_TCP;
+ }
+ if (proto != IPPROTO_TCP) {
+ buf[cnt].port = port;
+ buf[cnt].socktype = SOCK_DGRAM;
+ buf[cnt++].proto = IPPROTO_UDP;
+ }
+ return cnt;
+ }
+
+ if (flags & AI_NUMERICSERV) return EAI_NONAME;
+
+ size_t l = strlen(name);
+
+ unsigned char _buf[1032];
+ FILE _f, *f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf);
+ if (!f) switch (errno) {
+ case ENOENT:
+ case ENOTDIR:
+ case EACCES:
+ return EAI_SERVICE;
+ default:
+ return EAI_SYSTEM;
+ }
+
+ while (fgets(line, sizeof line, f) && cnt < MAXSERVS) {
+ if ((p=strchr(line, '#'))) *p++='\n', *p=0;
+
+ /* Find service name */
+ for(p=line; (p=strstr(p, name)); p++) {
+ if (p>line && !isspace(p[-1])) continue;
+ if (p[l] && !isspace(p[l])) continue;
+ break;
+ }
+ if (!p) continue;
+
+ /* Skip past canonical name at beginning of line */
+ for (p=line; *p && !isspace(*p); p++);
+
+ port = strtoul(p, &z, 10);
+ if (port > 65535 || z==p) continue;
+ if (!strncmp(z, "/udp", 4)) {
+ if (proto == IPPROTO_TCP) continue;
+ buf[cnt].port = port;
+ buf[cnt].socktype = SOCK_DGRAM;
+ buf[cnt++].proto = IPPROTO_UDP;
+ }
+ if (!strncmp(z, "/tcp", 4)) {
+ if (proto == IPPROTO_UDP) continue;
+ buf[cnt].port = port;
+ buf[cnt].socktype = SOCK_STREAM;
+ buf[cnt++].proto = IPPROTO_TCP;
+ }
+ }
+ __fclose_ca(f);
+ return cnt > 0 ? cnt : EAI_SERVICE;
+}
diff --git a/libc-top-half/musl/src/network/netlink.c b/libc-top-half/musl/src/network/netlink.c
new file mode 100644
index 0000000..94dba7f
--- /dev/null
+++ b/libc-top-half/musl/src/network/netlink.c
@@ -0,0 +1,52 @@
+#include <errno.h>
+#include <string.h>
+#include <syscall.h>
+#include <sys/socket.h>
+#include "netlink.h"
+
+static int __netlink_enumerate(int fd, unsigned int seq, int type, int af,
+ int (*cb)(void *ctx, struct nlmsghdr *h), void *ctx)
+{
+ struct nlmsghdr *h;
+ union {
+ uint8_t buf[8192];
+ struct {
+ struct nlmsghdr nlh;
+ struct rtgenmsg g;
+ } req;
+ struct nlmsghdr reply;
+ } u;
+ int r, ret;
+
+ memset(&u.req, 0, sizeof(u.req));
+ u.req.nlh.nlmsg_len = sizeof(u.req);
+ u.req.nlh.nlmsg_type = type;
+ u.req.nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST;
+ u.req.nlh.nlmsg_seq = seq;
+ u.req.g.rtgen_family = af;
+ r = send(fd, &u.req, sizeof(u.req), 0);
+ if (r < 0) return r;
+
+ while (1) {
+ r = recv(fd, u.buf, sizeof(u.buf), MSG_DONTWAIT);
+ if (r <= 0) return -1;
+ for (h = &u.reply; NLMSG_OK(h, (void*)&u.buf[r]); h = NLMSG_NEXT(h)) {
+ if (h->nlmsg_type == NLMSG_DONE) return 0;
+ if (h->nlmsg_type == NLMSG_ERROR) return -1;
+ ret = cb(ctx, h);
+ if (ret) return ret;
+ }
+ }
+}
+
+int __rtnetlink_enumerate(int link_af, int addr_af, int (*cb)(void *ctx, struct nlmsghdr *h), void *ctx)
+{
+ int fd, r;
+
+ fd = socket(PF_NETLINK, SOCK_RAW|SOCK_CLOEXEC, NETLINK_ROUTE);
+ if (fd < 0) return -1;
+ r = __netlink_enumerate(fd, 1, RTM_GETLINK, link_af, cb, ctx);
+ if (!r) r = __netlink_enumerate(fd, 2, RTM_GETADDR, addr_af, cb, ctx);
+ __syscall(SYS_close,fd);
+ return r;
+}
diff --git a/libc-top-half/musl/src/network/netlink.h b/libc-top-half/musl/src/network/netlink.h
new file mode 100644
index 0000000..38acb17
--- /dev/null
+++ b/libc-top-half/musl/src/network/netlink.h
@@ -0,0 +1,94 @@
+#include <stdint.h>
+
+/* linux/netlink.h */
+
+#define NETLINK_ROUTE 0
+
+struct nlmsghdr {
+ uint32_t nlmsg_len;
+ uint16_t nlmsg_type;
+ uint16_t nlmsg_flags;
+ uint32_t nlmsg_seq;
+ uint32_t nlmsg_pid;
+};
+
+#define NLM_F_REQUEST 1
+#define NLM_F_MULTI 2
+#define NLM_F_ACK 4
+
+#define NLM_F_ROOT 0x100
+#define NLM_F_MATCH 0x200
+#define NLM_F_ATOMIC 0x400
+#define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH)
+
+#define NLMSG_NOOP 0x1
+#define NLMSG_ERROR 0x2
+#define NLMSG_DONE 0x3
+#define NLMSG_OVERRUN 0x4
+
+/* linux/rtnetlink.h */
+
+#define RTM_NEWLINK 16
+#define RTM_GETLINK 18
+#define RTM_NEWADDR 20
+#define RTM_GETADDR 22
+
+struct rtattr {
+ unsigned short rta_len;
+ unsigned short rta_type;
+};
+
+struct rtgenmsg {
+ unsigned char rtgen_family;
+};
+
+struct ifinfomsg {
+ unsigned char ifi_family;
+ unsigned char __ifi_pad;
+ unsigned short ifi_type;
+ int ifi_index;
+ unsigned ifi_flags;
+ unsigned ifi_change;
+};
+
+/* linux/if_link.h */
+
+#define IFLA_ADDRESS 1
+#define IFLA_BROADCAST 2
+#define IFLA_IFNAME 3
+#define IFLA_STATS 7
+
+/* linux/if_addr.h */
+
+struct ifaddrmsg {
+ uint8_t ifa_family;
+ uint8_t ifa_prefixlen;
+ uint8_t ifa_flags;
+ uint8_t ifa_scope;
+ uint32_t ifa_index;
+};
+
+#define IFA_ADDRESS 1
+#define IFA_LOCAL 2
+#define IFA_LABEL 3
+#define IFA_BROADCAST 4
+
+/* musl */
+
+#define NETLINK_ALIGN(len) (((len)+3) & ~3)
+#define NLMSG_DATA(nlh) ((void*)((char*)(nlh)+sizeof(struct nlmsghdr)))
+#define NLMSG_DATALEN(nlh) ((nlh)->nlmsg_len-sizeof(struct nlmsghdr))
+#define NLMSG_DATAEND(nlh) ((char*)(nlh)+(nlh)->nlmsg_len)
+#define NLMSG_NEXT(nlh) (struct nlmsghdr*)((char*)(nlh)+NETLINK_ALIGN((nlh)->nlmsg_len))
+#define NLMSG_OK(nlh,end) ((char*)(end)-(char*)(nlh) >= sizeof(struct nlmsghdr))
+
+#define RTA_DATA(rta) ((void*)((char*)(rta)+sizeof(struct rtattr)))
+#define RTA_DATALEN(rta) ((rta)->rta_len-sizeof(struct rtattr))
+#define RTA_DATAEND(rta) ((char*)(rta)+(rta)->rta_len)
+#define RTA_NEXT(rta) (struct rtattr*)((char*)(rta)+NETLINK_ALIGN((rta)->rta_len))
+#define RTA_OK(nlh,end) ((char*)(end)-(char*)(rta) >= sizeof(struct rtattr))
+
+#define NLMSG_RTA(nlh,len) ((void*)((char*)(nlh)+sizeof(struct nlmsghdr)+NETLINK_ALIGN(len)))
+#define NLMSG_RTAOK(rta,nlh) RTA_OK(rta,NLMSG_DATAEND(nlh))
+
+hidden int __rtnetlink_enumerate(int link_af, int addr_af, int (*cb)(void *ctx, struct nlmsghdr *h), void *ctx);
diff --git a/libc-top-half/musl/src/network/netname.c b/libc-top-half/musl/src/network/netname.c
new file mode 100644
index 0000000..ba6e665
--- /dev/null
+++ b/libc-top-half/musl/src/network/netname.c
@@ -0,0 +1,12 @@
+#include <netdb.h>
+
+struct netent *getnetbyaddr(uint32_t net, int type)
+{
+ return 0;
+}
+
+struct netent *getnetbyname(const char *name)
+{
+ return 0;
+}
+
diff --git a/libc-top-half/musl/src/network/ns_parse.c b/libc-top-half/musl/src/network/ns_parse.c
new file mode 100644
index 0000000..d01da47
--- /dev/null
+++ b/libc-top-half/musl/src/network/ns_parse.c
@@ -0,0 +1,171 @@
+#define _BSD_SOURCE
+#include <errno.h>
+#include <stddef.h>
+#include <resolv.h>
+#include <arpa/nameser.h>
+
+const struct _ns_flagdata _ns_flagdata[16] = {
+ { 0x8000, 15 },
+ { 0x7800, 11 },
+ { 0x0400, 10 },
+ { 0x0200, 9 },
+ { 0x0100, 8 },
+ { 0x0080, 7 },
+ { 0x0040, 6 },
+ { 0x0020, 5 },
+ { 0x0010, 4 },
+ { 0x000f, 0 },
+ { 0x0000, 0 },
+ { 0x0000, 0 },
+ { 0x0000, 0 },
+ { 0x0000, 0 },
+ { 0x0000, 0 },
+ { 0x0000, 0 },
+};
+
+unsigned ns_get16(const unsigned char *cp)
+{
+ return cp[0]<<8 | cp[1];
+}
+
+unsigned long ns_get32(const unsigned char *cp)
+{
+ return (unsigned)cp[0]<<24 | cp[1]<<16 | cp[2]<<8 | cp[3];
+}
+
+void ns_put16(unsigned s, unsigned char *cp)
+{
+ *cp++ = s>>8;
+ *cp++ = s;
+}
+
+void ns_put32(unsigned long l, unsigned char *cp)
+{
+ *cp++ = l>>24;
+ *cp++ = l>>16;
+ *cp++ = l>>8;
+ *cp++ = l;
+}
+
+int ns_initparse(const unsigned char *msg, int msglen, ns_msg *handle)
+{
+ int i, r;
+
+ handle->_msg = msg;
+ handle->_eom = msg + msglen;
+ if (msglen < (2 + ns_s_max) * NS_INT16SZ) goto bad;
+ NS_GET16(handle->_id, msg);
+ NS_GET16(handle->_flags, msg);
+ for (i = 0; i < ns_s_max; i++) NS_GET16(handle->_counts[i], msg);
+ for (i = 0; i < ns_s_max; i++) {
+ if (handle->_counts[i]) {
+ handle->_sections[i] = msg;
+ r = ns_skiprr(msg, handle->_eom, i, handle->_counts[i]);
+ if (r < 0) return -1;
+ msg += r;
+ } else {
+ handle->_sections[i] = NULL;
+ }
+ }
+ if (msg != handle->_eom) goto bad;
+ handle->_sect = ns_s_max;
+ handle->_rrnum = -1;
+ handle->_msg_ptr = NULL;
+ return 0;
+bad:
+ errno = EMSGSIZE;
+ return -1;
+}
+
+int ns_skiprr(const unsigned char *ptr, const unsigned char *eom, ns_sect section, int count)
+{
+ const unsigned char *p = ptr;
+ int r;
+
+ while (count--) {
+ r = dn_skipname(p, eom);
+ if (r < 0) goto bad;
+ if (r + 2 * NS_INT16SZ > eom - p) goto bad;
+ p += r + 2 * NS_INT16SZ;
+ if (section != ns_s_qd) {
+ if (NS_INT32SZ + NS_INT16SZ > eom - p) goto bad;
+ p += NS_INT32SZ;
+ NS_GET16(r, p);
+ if (r > eom - p) goto bad;
+ p += r;
+ }
+ }
+ return p - ptr;
+bad:
+ errno = EMSGSIZE;
+ return -1;
+}
+
+int ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr)
+{
+ int r;
+
+ if (section < 0 || section >= ns_s_max) goto bad;
+ if (section != handle->_sect) {
+ handle->_sect = section;
+ handle->_rrnum = 0;
+ handle->_msg_ptr = handle->_sections[section];
+ }
+ if (rrnum == -1) rrnum = handle->_rrnum;
+ if (rrnum < 0 || rrnum >= handle->_counts[section]) goto bad;
+ if (rrnum < handle->_rrnum) {
+ handle->_rrnum = 0;
+ handle->_msg_ptr = handle->_sections[section];
+ }
+ if (rrnum > handle->_rrnum) {
+ r = ns_skiprr(handle->_msg_ptr, handle->_eom, section, rrnum - handle->_rrnum);
+ if (r < 0) return -1;
+ handle->_msg_ptr += r;
+ handle->_rrnum = rrnum;
+ }
+ r = ns_name_uncompress(handle->_msg, handle->_eom, handle->_msg_ptr, rr->name, NS_MAXDNAME);
+ if (r < 0) return -1;
+ handle->_msg_ptr += r;
+ if (2 * NS_INT16SZ > handle->_eom - handle->_msg_ptr) goto size;
+ NS_GET16(rr->type, handle->_msg_ptr);
+ NS_GET16(rr->rr_class, handle->_msg_ptr);
+ if (section != ns_s_qd) {
+ if (NS_INT32SZ + NS_INT16SZ > handle->_eom - handle->_msg_ptr) goto size;
+ NS_GET32(rr->ttl, handle->_msg_ptr);
+ NS_GET16(rr->rdlength, handle->_msg_ptr);
+ if (rr->rdlength > handle->_eom - handle->_msg_ptr) goto size;
+ rr->rdata = handle->_msg_ptr;
+ handle->_msg_ptr += rr->rdlength;
+ } else {
+ rr->ttl = 0;
+ rr->rdlength = 0;
+ rr->rdata = NULL;
+ }
+ handle->_rrnum++;
+ if (handle->_rrnum > handle->_counts[section]) {
+ handle->_sect = section + 1;
+ if (handle->_sect == ns_s_max) {
+ handle->_rrnum = -1;
+ handle->_msg_ptr = NULL;
+ } else {
+ handle->_rrnum = 0;
+ }
+ }
+ return 0;
+bad:
+ errno = ENODEV;
+ return -1;
+size:
+ errno = EMSGSIZE;
+ return -1;
+}
+
+int ns_name_uncompress(const unsigned char *msg, const unsigned char *eom,
+ const unsigned char *src, char *dst, size_t dstsiz)
+{
+ int r;
+ r = dn_expand(msg, eom, src, dst, dstsiz);
+ if (r < 0) errno = EMSGSIZE;
+ return r;
+}
+
diff --git a/libc-top-half/musl/src/network/ntohl.c b/libc-top-half/musl/src/network/ntohl.c
new file mode 100644
index 0000000..d6fce45
--- /dev/null
+++ b/libc-top-half/musl/src/network/ntohl.c
@@ -0,0 +1,8 @@
+#include <netinet/in.h>
+#include <byteswap.h>
+
+uint32_t ntohl(uint32_t n)
+{
+ union { int i; char c; } u = { 1 };
+ return u.c ? bswap_32(n) : n;
+}
diff --git a/libc-top-half/musl/src/network/ntohs.c b/libc-top-half/musl/src/network/ntohs.c
new file mode 100644
index 0000000..745cef4
--- /dev/null
+++ b/libc-top-half/musl/src/network/ntohs.c
@@ -0,0 +1,8 @@
+#include <netinet/in.h>
+#include <byteswap.h>
+
+uint16_t ntohs(uint16_t n)
+{
+ union { int i; char c; } u = { 1 };
+ return u.c ? bswap_16(n) : n;
+}
diff --git a/libc-top-half/musl/src/network/proto.c b/libc-top-half/musl/src/network/proto.c
new file mode 100644
index 0000000..c4fd34e
--- /dev/null
+++ b/libc-top-half/musl/src/network/proto.c
@@ -0,0 +1,84 @@
+#include <netdb.h>
+#include <string.h>
+
+/* do we really need all these?? */
+
+static int idx;
+static const unsigned char protos[] = {
+ "\000ip\0"
+ "\001icmp\0"
+ "\002igmp\0"
+ "\003ggp\0"
+ "\004ipencap\0"
+ "\005st\0"
+ "\006tcp\0"
+ "\010egp\0"
+ "\014pup\0"
+ "\021udp\0"
+ "\024hmp\0"
+ "\026xns-idp\0"
+ "\033rdp\0"
+ "\035iso-tp4\0"
+ "\044xtp\0"
+ "\045ddp\0"
+ "\046idpr-cmtp\0"
+ "\051ipv6\0"
+ "\053ipv6-route\0"
+ "\054ipv6-frag\0"
+ "\055idrp\0"
+ "\056rsvp\0"
+ "\057gre\0"
+ "\062esp\0"
+ "\063ah\0"
+ "\071skip\0"
+ "\072ipv6-icmp\0"
+ "\073ipv6-nonxt\0"
+ "\074ipv6-opts\0"
+ "\111rspf\0"
+ "\121vmtp\0"
+ "\131ospf\0"
+ "\136ipip\0"
+ "\142encap\0"
+ "\147pim\0"
+ "\377raw"
+};
+
+void endprotoent(void)
+{
+ idx = 0;
+}
+
+void setprotoent(int stayopen)
+{
+ idx = 0;
+}
+
+struct protoent *getprotoent(void)
+{
+ static struct protoent p;
+ static const char *aliases;
+ if (idx >= sizeof protos) return NULL;
+ p.p_proto = protos[idx];
+ p.p_name = (char *)&protos[idx+1];
+ p.p_aliases = (char **)&aliases;
+ idx += strlen(p.p_name) + 2;
+ return &p;
+}
+
+struct protoent *getprotobyname(const char *name)
+{
+ struct protoent *p;
+ endprotoent();
+ do p = getprotoent();
+ while (p && strcmp(name, p->p_name));
+ return p;
+}
+
+struct protoent *getprotobynumber(int num)
+{
+ struct protoent *p;
+ endprotoent();
+ do p = getprotoent();
+ while (p && p->p_proto != num);
+ return p;
+}
diff --git a/libc-top-half/musl/src/network/recv.c b/libc-top-half/musl/src/network/recv.c
new file mode 100644
index 0000000..5970048
--- /dev/null
+++ b/libc-top-half/musl/src/network/recv.c
@@ -0,0 +1,6 @@
+#include <sys/socket.h>
+
+ssize_t recv(int fd, void *buf, size_t len, int flags)
+{
+ return recvfrom(fd, buf, len, flags, 0, 0);
+}
diff --git a/libc-top-half/musl/src/network/recvfrom.c b/libc-top-half/musl/src/network/recvfrom.c
new file mode 100644
index 0000000..6191166
--- /dev/null
+++ b/libc-top-half/musl/src/network/recvfrom.c
@@ -0,0 +1,7 @@
+#include <sys/socket.h>
+#include "syscall.h"
+
+ssize_t recvfrom(int fd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict addr, socklen_t *restrict alen)
+{
+ return socketcall_cp(recvfrom, fd, buf, len, flags, addr, alen);
+}
diff --git a/libc-top-half/musl/src/network/recvmmsg.c b/libc-top-half/musl/src/network/recvmmsg.c
new file mode 100644
index 0000000..2978e2f
--- /dev/null
+++ b/libc-top-half/musl/src/network/recvmmsg.c
@@ -0,0 +1,39 @@
+#define _GNU_SOURCE
+#include <sys/socket.h>
+#include <limits.h>
+#include <errno.h>
+#include <time.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
+
+hidden void __convert_scm_timestamps(struct msghdr *, socklen_t);
+
+int recvmmsg(int fd, struct mmsghdr *msgvec, unsigned int vlen, unsigned int flags, struct timespec *timeout)
+{
+#if LONG_MAX > INT_MAX
+ struct mmsghdr *mh = msgvec;
+ unsigned int i;
+ for (i = vlen; i; i--, mh++)
+ mh->msg_hdr.__pad1 = mh->msg_hdr.__pad2 = 0;
+#endif
+#ifdef SYS_recvmmsg_time64
+ time_t s = timeout ? timeout->tv_sec : 0;
+ long ns = timeout ? timeout->tv_nsec : 0;
+ int r = __syscall_cp(SYS_recvmmsg_time64, fd, msgvec, vlen, flags,
+ timeout ? ((long long[]){s, ns}) : 0);
+ if (SYS_recvmmsg == SYS_recvmmsg_time64 || r!=-ENOSYS)
+ return __syscall_ret(r);
+ if (vlen > IOV_MAX) vlen = IOV_MAX;
+ socklen_t csize[vlen];
+ for (int i=0; i<vlen; i++) csize[i] = msgvec[i].msg_hdr.msg_controllen;
+ r = __syscall_cp(SYS_recvmmsg, fd, msgvec, vlen, flags,
+ timeout ? ((long[]){CLAMP(s), ns}) : 0);
+ for (int i=0; i<r; i++)
+ __convert_scm_timestamps(&msgvec[i].msg_hdr, csize[i]);
+ return __syscall_ret(r);
+#else
+ return syscall_cp(SYS_recvmmsg, fd, msgvec, vlen, flags, timeout);
+#endif
+}
diff --git a/libc-top-half/musl/src/network/recvmsg.c b/libc-top-half/musl/src/network/recvmsg.c
new file mode 100644
index 0000000..0364162
--- /dev/null
+++ b/libc-top-half/musl/src/network/recvmsg.c
@@ -0,0 +1,68 @@
+#include <sys/socket.h>
+#include <limits.h>
+#include <time.h>
+#include <sys/time.h>
+#include <string.h>
+#include "syscall.h"
+
+hidden void __convert_scm_timestamps(struct msghdr *, socklen_t);
+
+void __convert_scm_timestamps(struct msghdr *msg, socklen_t csize)
+{
+ if (SCM_TIMESTAMP == SCM_TIMESTAMP_OLD) return;
+ if (!msg->msg_control || !msg->msg_controllen) return;
+
+ struct cmsghdr *cmsg, *last=0;
+ long tmp;
+ long long tvts[2];
+ int type = 0;
+
+ for (cmsg=CMSG_FIRSTHDR(msg); cmsg; cmsg=CMSG_NXTHDR(msg, cmsg)) {
+ if (cmsg->cmsg_level==SOL_SOCKET) switch (cmsg->cmsg_type) {
+ case SCM_TIMESTAMP_OLD:
+ if (type) break;
+ type = SCM_TIMESTAMP;
+ goto common;
+ case SCM_TIMESTAMPNS_OLD:
+ type = SCM_TIMESTAMPNS;
+ common:
+ memcpy(&tmp, CMSG_DATA(cmsg), sizeof tmp);
+ tvts[0] = tmp;
+ memcpy(&tmp, CMSG_DATA(cmsg) + sizeof tmp, sizeof tmp);
+ tvts[1] = tmp;
+ break;
+ }
+ last = cmsg;
+ }
+ if (!last || !type) return;
+ if (CMSG_SPACE(sizeof tvts) > csize-msg->msg_controllen) {
+ msg->msg_flags |= MSG_CTRUNC;
+ return;
+ }
+ msg->msg_controllen += CMSG_SPACE(sizeof tvts);
+ cmsg = CMSG_NXTHDR(msg, last);
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = type;
+ cmsg->cmsg_len = CMSG_LEN(sizeof tvts);
+ memcpy(CMSG_DATA(cmsg), &tvts, sizeof tvts);
+}
+
+ssize_t recvmsg(int fd, struct msghdr *msg, int flags)
+{
+ ssize_t r;
+ socklen_t orig_controllen = msg->msg_controllen;
+#if LONG_MAX > INT_MAX
+ struct msghdr h, *orig = msg;
+ if (msg) {
+ h = *msg;
+ h.__pad1 = h.__pad2 = 0;
+ msg = &h;
+ }
+#endif
+ r = socketcall_cp(recvmsg, fd, msg, flags, 0, 0, 0);
+ if (r >= 0) __convert_scm_timestamps(msg, orig_controllen);
+#if LONG_MAX > INT_MAX
+ if (orig) *orig = h;
+#endif
+ return r;
+}
diff --git a/libc-top-half/musl/src/network/res_init.c b/libc-top-half/musl/src/network/res_init.c
new file mode 100644
index 0000000..5dba9df
--- /dev/null
+++ b/libc-top-half/musl/src/network/res_init.c
@@ -0,0 +1,6 @@
+#include <resolv.h>
+
+int res_init()
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/network/res_mkquery.c b/libc-top-half/musl/src/network/res_mkquery.c
new file mode 100644
index 0000000..33f50cb
--- /dev/null
+++ b/libc-top-half/musl/src/network/res_mkquery.c
@@ -0,0 +1,44 @@
+#include <resolv.h>
+#include <string.h>
+#include <time.h>
+
+int __res_mkquery(int op, const char *dname, int class, int type,
+ const unsigned char *data, int datalen,
+ const unsigned char *newrr, unsigned char *buf, int buflen)
+{
+ int id, i, j;
+ unsigned char q[280];
+ struct timespec ts;
+ size_t l = strnlen(dname, 255);
+ int n;
+
+ if (l && dname[l-1]=='.') l--;
+ n = 17+l+!!l;
+ if (l>253 || buflen<n || op>15u || class>255u || type>255u)
+ return -1;
+
+ /* Construct query template - ID will be filled later */
+ memset(q, 0, n);
+ q[2] = op*8 + 1;
+ q[3] = 32; /* AD */
+ q[5] = 1;
+ memcpy((char *)q+13, dname, l);
+ for (i=13; q[i]; i=j+1) {
+ for (j=i; q[j] && q[j] != '.'; j++);
+ if (j-i-1u > 62u) return -1;
+ q[i-1] = j-i;
+ }
+ q[i+1] = type;
+ q[i+3] = class;
+
+ /* Make a reasonably unpredictable id */
+ clock_gettime(CLOCK_REALTIME, &ts);
+ id = ts.tv_nsec + ts.tv_nsec/65536UL & 0xffff;
+ q[0] = id/256;
+ q[1] = id;
+
+ memcpy(buf, q, n);
+ return n;
+}
+
+weak_alias(__res_mkquery, res_mkquery);
diff --git a/libc-top-half/musl/src/network/res_msend.c b/libc-top-half/musl/src/network/res_msend.c
new file mode 100644
index 0000000..3e01800
--- /dev/null
+++ b/libc-top-half/musl/src/network/res_msend.c
@@ -0,0 +1,188 @@
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+#include <stdint.h>
+#include <string.h>
+#include <poll.h>
+#include <time.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.h>
+#include "stdio_impl.h"
+#include "syscall.h"
+#include "lookup.h"
+
+static void cleanup(void *p)
+{
+ __syscall(SYS_close, (intptr_t)p);
+}
+
+static unsigned long mtime()
+{
+ struct timespec ts;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ return (unsigned long)ts.tv_sec * 1000
+ + ts.tv_nsec / 1000000;
+}
+
+int __res_msend_rc(int nqueries, const unsigned char *const *queries,
+ const int *qlens, unsigned char *const *answers, int *alens, int asize,
+ const struct resolvconf *conf)
+{
+ int fd;
+ int timeout, attempts, retry_interval, servfail_retry;
+ union {
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
+ } sa = {0}, ns[MAXNS] = {{0}};
+ socklen_t sl = sizeof sa.sin;
+ int nns = 0;
+ int family = AF_INET;
+ int rlen;
+ int next;
+ int i, j;
+ int cs;
+ struct pollfd pfd;
+ unsigned long t0, t1, t2;
+
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
+ timeout = 1000*conf->timeout;
+ attempts = conf->attempts;
+
+ for (nns=0; nns<conf->nns; nns++) {
+ const struct address *iplit = &conf->ns[nns];
+ if (iplit->family == AF_INET) {
+ memcpy(&ns[nns].sin.sin_addr, iplit->addr, 4);
+ ns[nns].sin.sin_port = htons(53);
+ ns[nns].sin.sin_family = AF_INET;
+ } else {
+ sl = sizeof sa.sin6;
+ memcpy(&ns[nns].sin6.sin6_addr, iplit->addr, 16);
+ ns[nns].sin6.sin6_port = htons(53);
+ ns[nns].sin6.sin6_scope_id = iplit->scopeid;
+ ns[nns].sin6.sin6_family = family = AF_INET6;
+ }
+ }
+
+ /* Get local address and open/bind a socket */
+ sa.sin.sin_family = family;
+ fd = socket(family, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
+
+ /* Handle case where system lacks IPv6 support */
+ if (fd < 0 && family == AF_INET6 && errno == EAFNOSUPPORT) {
+ fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
+ family = AF_INET;
+ }
+ if (fd < 0 || bind(fd, (void *)&sa, sl) < 0) {
+ if (fd >= 0) close(fd);
+ pthread_setcancelstate(cs, 0);
+ return -1;
+ }
+
+ /* Past this point, there are no errors. Each individual query will
+ * yield either no reply (indicated by zero length) or an answer
+ * packet which is up to the caller to interpret. */
+
+ pthread_cleanup_push(cleanup, (void *)(intptr_t)fd);
+ pthread_setcancelstate(cs, 0);
+
+ /* Convert any IPv4 addresses in a mixed environment to v4-mapped */
+ if (family == AF_INET6) {
+ setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &(int){0}, sizeof 0);
+ for (i=0; i<nns; i++) {
+ if (ns[i].sin.sin_family != AF_INET) continue;
+ memcpy(ns[i].sin6.sin6_addr.s6_addr+12,
+ &ns[i].sin.sin_addr, 4);
+ memcpy(ns[i].sin6.sin6_addr.s6_addr,
+ "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12);
+ ns[i].sin6.sin6_family = AF_INET6;
+ ns[i].sin6.sin6_flowinfo = 0;
+ ns[i].sin6.sin6_scope_id = 0;
+ }
+ }
+
+ memset(alens, 0, sizeof *alens * nqueries);
+
+ pfd.fd = fd;
+ pfd.events = POLLIN;
+ retry_interval = timeout / attempts;
+ next = 0;
+ t0 = t2 = mtime();
+ t1 = t2 - retry_interval;
+
+ for (; t2-t0 < timeout; t2=mtime()) {
+ if (t2-t1 >= retry_interval) {
+ /* Query all configured namservers in parallel */
+ for (i=0; i<nqueries; i++)
+ if (!alens[i])
+ for (j=0; j<nns; j++)
+ sendto(fd, queries[i],
+ qlens[i], MSG_NOSIGNAL,
+ (void *)&ns[j], sl);
+ t1 = t2;
+ servfail_retry = 2 * nqueries;
+ }
+
+ /* Wait for a response, or until time to retry */
+ if (poll(&pfd, 1, t1+retry_interval-t2) <= 0) continue;
+
+ while ((rlen = recvfrom(fd, answers[next], asize, 0,
+ (void *)&sa, (socklen_t[1]){sl})) >= 0) {
+
+ /* Ignore non-identifiable packets */
+ if (rlen < 4) continue;
+
+ /* Ignore replies from addresses we didn't send to */
+ for (j=0; j<nns && memcmp(ns+j, &sa, sl); j++);
+ if (j==nns) continue;
+
+ /* Find which query this answer goes with, if any */
+ for (i=next; i<nqueries && (
+ answers[next][0] != queries[i][0] ||
+ answers[next][1] != queries[i][1] ); i++);
+ if (i==nqueries) continue;
+ if (alens[i]) continue;
+
+ /* Only accept positive or negative responses;
+ * retry immediately on server failure, and ignore
+ * all other codes such as refusal. */
+ switch (answers[next][3] & 15) {
+ case 0:
+ case 3:
+ break;
+ case 2:
+ if (servfail_retry && servfail_retry--)
+ sendto(fd, queries[i],
+ qlens[i], MSG_NOSIGNAL,
+ (void *)&ns[j], sl);
+ default:
+ continue;
+ }
+
+ /* Store answer in the right slot, or update next
+ * available temp slot if it's already in place. */
+ alens[i] = rlen;
+ if (i == next)
+ for (; next<nqueries && alens[next]; next++);
+ else
+ memcpy(answers[i], answers[next], rlen);
+
+ if (next == nqueries) goto out;
+ }
+ }
+out:
+ pthread_cleanup_pop(1);
+
+ return 0;
+}
+
+int __res_msend(int nqueries, const unsigned char *const *queries,
+ const int *qlens, unsigned char *const *answers, int *alens, int asize)
+{
+ struct resolvconf conf;
+ if (__get_resolv_conf(&conf, 0, 0) < 0) return -1;
+ return __res_msend_rc(nqueries, queries, qlens, answers, alens, asize, &conf);
+}
diff --git a/libc-top-half/musl/src/network/res_query.c b/libc-top-half/musl/src/network/res_query.c
new file mode 100644
index 0000000..506dc23
--- /dev/null
+++ b/libc-top-half/musl/src/network/res_query.c
@@ -0,0 +1,26 @@
+#define _BSD_SOURCE
+#include <resolv.h>
+#include <netdb.h>
+
+int res_query(const char *name, int class, int type, unsigned char *dest, int len)
+{
+ unsigned char q[280];
+ int ql = __res_mkquery(0, name, class, type, 0, 0, 0, q, sizeof q);
+ if (ql < 0) return ql;
+ int r = __res_send(q, ql, dest, len);
+ if (r<12) {
+ h_errno = TRY_AGAIN;
+ return -1;
+ }
+ if ((dest[3] & 15) == 3) {
+ h_errno = HOST_NOT_FOUND;
+ return -1;
+ }
+ if ((dest[3] & 15) == 0 && !dest[6] && !dest[7]) {
+ h_errno = NO_DATA;
+ return -1;
+ }
+ return r;
+}
+
+weak_alias(res_query, res_search);
diff --git a/libc-top-half/musl/src/network/res_querydomain.c b/libc-top-half/musl/src/network/res_querydomain.c
new file mode 100644
index 0000000..727e6f6
--- /dev/null
+++ b/libc-top-half/musl/src/network/res_querydomain.c
@@ -0,0 +1,14 @@
+#include <resolv.h>
+#include <string.h>
+
+int res_querydomain(const char *name, const char *domain, int class, int type, unsigned char *dest, int len)
+{
+ char tmp[255];
+ size_t nl = strnlen(name, 255);
+ size_t dl = strnlen(domain, 255);
+ if (nl+dl+1 > 254) return -1;
+ memcpy(tmp, name, nl);
+ tmp[nl] = '.';
+ memcpy(tmp+nl+1, domain, dl+1);
+ return res_query(tmp, class, type, dest, len);
+}
diff --git a/libc-top-half/musl/src/network/res_send.c b/libc-top-half/musl/src/network/res_send.c
new file mode 100644
index 0000000..ee4abf1
--- /dev/null
+++ b/libc-top-half/musl/src/network/res_send.c
@@ -0,0 +1,9 @@
+#include <resolv.h>
+
+int __res_send(const unsigned char *msg, int msglen, unsigned char *answer, int anslen)
+{
+ int r = __res_msend(1, &msg, &msglen, &answer, &anslen, anslen);
+ return r<0 || !anslen ? -1 : anslen;
+}
+
+weak_alias(__res_send, res_send);
diff --git a/libc-top-half/musl/src/network/res_state.c b/libc-top-half/musl/src/network/res_state.c
new file mode 100644
index 0000000..5c42cda
--- /dev/null
+++ b/libc-top-half/musl/src/network/res_state.c
@@ -0,0 +1,9 @@
+#include <resolv.h>
+
+/* This is completely unused, and exists purely to satisfy broken apps. */
+
+struct __res_state *__res_state()
+{
+ static struct __res_state res;
+ return &res;
+}
diff --git a/libc-top-half/musl/src/network/resolvconf.c b/libc-top-half/musl/src/network/resolvconf.c
new file mode 100644
index 0000000..ceabf08
--- /dev/null
+++ b/libc-top-half/musl/src/network/resolvconf.c
@@ -0,0 +1,94 @@
+#include "lookup.h"
+#include "stdio_impl.h"
+#include <ctype.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+
+int __get_resolv_conf(struct resolvconf *conf, char *search, size_t search_sz)
+{
+ char line[256];
+ unsigned char _buf[256];
+ FILE *f, _f;
+ int nns = 0;
+
+ conf->ndots = 1;
+ conf->timeout = 5;
+ conf->attempts = 2;
+ if (search) *search = 0;
+
+ f = __fopen_rb_ca("/etc/resolv.conf", &_f, _buf, sizeof _buf);
+ if (!f) switch (errno) {
+ case ENOENT:
+ case ENOTDIR:
+ case EACCES:
+ goto no_resolv_conf;
+ default:
+ return -1;
+ }
+
+ while (fgets(line, sizeof line, f)) {
+ char *p, *z;
+ if (!strchr(line, '\n') && !feof(f)) {
+ /* Ignore lines that get truncated rather than
+ * potentially misinterpreting them. */
+ int c;
+ do c = getc(f);
+ while (c != '\n' && c != EOF);
+ continue;
+ }
+ if (!strncmp(line, "options", 7) && isspace(line[7])) {
+ p = strstr(line, "ndots:");
+ if (p && isdigit(p[6])) {
+ p += 6;
+ unsigned long x = strtoul(p, &z, 10);
+ if (z != p) conf->ndots = x > 15 ? 15 : x;
+ }
+ p = strstr(line, "attempts:");
+ if (p && isdigit(p[9])) {
+ p += 9;
+ unsigned long x = strtoul(p, &z, 10);
+ if (z != p) conf->attempts = x > 10 ? 10 : x;
+ }
+ p = strstr(line, "timeout:");
+ if (p && (isdigit(p[8]) || p[8]=='.')) {
+ p += 8;
+ unsigned long x = strtoul(p, &z, 10);
+ if (z != p) conf->timeout = x > 60 ? 60 : x;
+ }
+ continue;
+ }
+ if (!strncmp(line, "nameserver", 10) && isspace(line[10])) {
+ if (nns >= MAXNS) continue;
+ for (p=line+11; isspace(*p); p++);
+ for (z=p; *z && !isspace(*z); z++);
+ *z=0;
+ if (__lookup_ipliteral(conf->ns+nns, p, AF_UNSPEC) > 0)
+ nns++;
+ continue;
+ }
+
+ if (!search) continue;
+ if ((strncmp(line, "domain", 6) && strncmp(line, "search", 6))
+ || !isspace(line[6]))
+ continue;
+ for (p=line+7; isspace(*p); p++);
+ size_t l = strlen(p);
+ /* This can never happen anyway with chosen buffer sizes. */
+ if (l >= search_sz) continue;
+ memcpy(search, p, l+1);
+ }
+
+ __fclose_ca(f);
+
+no_resolv_conf:
+ if (!nns) {
+ __lookup_ipliteral(conf->ns, "127.0.0.1", AF_UNSPEC);
+ nns = 1;
+ }
+
+ conf->nns = nns;
+
+ return 0;
+}
diff --git a/libc-top-half/musl/src/network/send.c b/libc-top-half/musl/src/network/send.c
new file mode 100644
index 0000000..9f10497
--- /dev/null
+++ b/libc-top-half/musl/src/network/send.c
@@ -0,0 +1,6 @@
+#include <sys/socket.h>
+
+ssize_t send(int fd, const void *buf, size_t len, int flags)
+{
+ return sendto(fd, buf, len, flags, 0, 0);
+}
diff --git a/libc-top-half/musl/src/network/sendmmsg.c b/libc-top-half/musl/src/network/sendmmsg.c
new file mode 100644
index 0000000..eeae1d0
--- /dev/null
+++ b/libc-top-half/musl/src/network/sendmmsg.c
@@ -0,0 +1,30 @@
+#define _GNU_SOURCE
+#include <sys/socket.h>
+#include <limits.h>
+#include <errno.h>
+#include "syscall.h"
+
+int sendmmsg(int fd, struct mmsghdr *msgvec, unsigned int vlen, unsigned int flags)
+{
+#if LONG_MAX > INT_MAX
+ /* Can't use the syscall directly because the kernel has the wrong
+ * idea for the types of msg_iovlen, msg_controllen, and cmsg_len,
+ * and the cmsg blocks cannot be modified in-place. */
+ int i;
+ if (vlen > IOV_MAX) vlen = IOV_MAX; /* This matches the kernel. */
+ if (!vlen) return 0;
+ for (i=0; i<vlen; i++) {
+ /* As an unfortunate inconsistency, the sendmmsg API uses
+ * unsigned int for the resulting msg_len, despite sendmsg
+ * returning ssize_t. However Linux limits the total bytes
+ * sent by sendmsg to INT_MAX, so the assignment is safe. */
+ ssize_t r = sendmsg(fd, &msgvec[i].msg_hdr, flags);
+ if (r < 0) goto error;
+ msgvec[i].msg_len = r;
+ }
+error:
+ return i ? i : -1;
+#else
+ return syscall_cp(SYS_sendmmsg, fd, msgvec, vlen, flags);
+#endif
+}
diff --git a/libc-top-half/musl/src/network/sendmsg.c b/libc-top-half/musl/src/network/sendmsg.c
new file mode 100644
index 0000000..80cc5f4
--- /dev/null
+++ b/libc-top-half/musl/src/network/sendmsg.c
@@ -0,0 +1,29 @@
+#include <sys/socket.h>
+#include <limits.h>
+#include <string.h>
+#include <errno.h>
+#include "syscall.h"
+
+ssize_t sendmsg(int fd, const struct msghdr *msg, int flags)
+{
+#if LONG_MAX > INT_MAX
+ struct msghdr h;
+ struct cmsghdr chbuf[1024/sizeof(struct cmsghdr)+1], *c;
+ if (msg) {
+ h = *msg;
+ h.__pad1 = h.__pad2 = 0;
+ msg = &h;
+ if (h.msg_controllen) {
+ if (h.msg_controllen > 1024) {
+ errno = ENOMEM;
+ return -1;
+ }
+ memcpy(chbuf, h.msg_control, h.msg_controllen);
+ h.msg_control = chbuf;
+ for (c=CMSG_FIRSTHDR(&h); c; c=CMSG_NXTHDR(&h,c))
+ c->__pad1 = 0;
+ }
+ }
+#endif
+ return socketcall_cp(sendmsg, fd, msg, flags, 0, 0, 0);
+}
diff --git a/libc-top-half/musl/src/network/sendto.c b/libc-top-half/musl/src/network/sendto.c
new file mode 100644
index 0000000..c598797
--- /dev/null
+++ b/libc-top-half/musl/src/network/sendto.c
@@ -0,0 +1,7 @@
+#include <sys/socket.h>
+#include "syscall.h"
+
+ssize_t sendto(int fd, const void *buf, size_t len, int flags, const struct sockaddr *addr, socklen_t alen)
+{
+ return socketcall_cp(sendto, fd, buf, len, flags, addr, alen);
+}
diff --git a/libc-top-half/musl/src/network/serv.c b/libc-top-half/musl/src/network/serv.c
new file mode 100644
index 0000000..41424e8
--- /dev/null
+++ b/libc-top-half/musl/src/network/serv.c
@@ -0,0 +1,14 @@
+#include <netdb.h>
+
+void endservent(void)
+{
+}
+
+void setservent(int stayopen)
+{
+}
+
+struct servent *getservent(void)
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/network/setsockopt.c b/libc-top-half/musl/src/network/setsockopt.c
new file mode 100644
index 0000000..612a194
--- /dev/null
+++ b/libc-top-half/musl/src/network/setsockopt.c
@@ -0,0 +1,46 @@
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
+
+int setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen)
+{
+ const struct timeval *tv;
+ time_t s;
+ suseconds_t us;
+
+ int r = __socketcall(setsockopt, fd, level, optname, optval, optlen, 0);
+
+ if (r==-ENOPROTOOPT) switch (level) {
+ case SOL_SOCKET:
+ switch (optname) {
+ case SO_RCVTIMEO:
+ case SO_SNDTIMEO:
+ if (SO_RCVTIMEO == SO_RCVTIMEO_OLD) break;
+ if (optlen < sizeof *tv) return __syscall_ret(-EINVAL);
+ tv = optval;
+ s = tv->tv_sec;
+ us = tv->tv_usec;
+ if (!IS32BIT(s)) return __syscall_ret(-ENOTSUP);
+
+ if (optname==SO_RCVTIMEO) optname=SO_RCVTIMEO_OLD;
+ if (optname==SO_SNDTIMEO) optname=SO_SNDTIMEO_OLD;
+
+ r = __socketcall(setsockopt, fd, level, optname,
+ ((long[]){s, CLAMP(us)}), 2*sizeof(long), 0);
+ break;
+ case SO_TIMESTAMP:
+ case SO_TIMESTAMPNS:
+ if (SO_TIMESTAMP == SO_TIMESTAMP_OLD) break;
+ if (optname==SO_TIMESTAMP) optname=SO_TIMESTAMP_OLD;
+ if (optname==SO_TIMESTAMPNS) optname=SO_TIMESTAMPNS_OLD;
+ r = __socketcall(setsockopt, fd, level,
+ optname, optval, optlen, 0);
+ break;
+ }
+ }
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/network/shutdown.c b/libc-top-half/musl/src/network/shutdown.c
new file mode 100644
index 0000000..10ca21a
--- /dev/null
+++ b/libc-top-half/musl/src/network/shutdown.c
@@ -0,0 +1,7 @@
+#include <sys/socket.h>
+#include "syscall.h"
+
+int shutdown(int fd, int how)
+{
+ return socketcall(shutdown, fd, how, 0, 0, 0, 0);
+}
diff --git a/libc-top-half/musl/src/network/sockatmark.c b/libc-top-half/musl/src/network/sockatmark.c
new file mode 100644
index 0000000..f474551
--- /dev/null
+++ b/libc-top-half/musl/src/network/sockatmark.c
@@ -0,0 +1,10 @@
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+
+int sockatmark(int s)
+{
+ int ret;
+ if (ioctl(s, SIOCATMARK, &ret) < 0)
+ return -1;
+ return ret;
+}
diff --git a/libc-top-half/musl/src/network/socket.c b/libc-top-half/musl/src/network/socket.c
new file mode 100644
index 0000000..afa1a7f
--- /dev/null
+++ b/libc-top-half/musl/src/network/socket.c
@@ -0,0 +1,21 @@
+#include <sys/socket.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "syscall.h"
+
+int socket(int domain, int type, int protocol)
+{
+ int s = __socketcall(socket, domain, type, protocol, 0, 0, 0);
+ if ((s==-EINVAL || s==-EPROTONOSUPPORT)
+ && (type&(SOCK_CLOEXEC|SOCK_NONBLOCK))) {
+ s = __socketcall(socket, domain,
+ type & ~(SOCK_CLOEXEC|SOCK_NONBLOCK),
+ protocol, 0, 0, 0);
+ if (s < 0) return __syscall_ret(s);
+ if (type & SOCK_CLOEXEC)
+ __syscall(SYS_fcntl, s, F_SETFD, FD_CLOEXEC);
+ if (type & SOCK_NONBLOCK)
+ __syscall(SYS_fcntl, s, F_SETFL, O_NONBLOCK);
+ }
+ return __syscall_ret(s);
+}
diff --git a/libc-top-half/musl/src/network/socketpair.c b/libc-top-half/musl/src/network/socketpair.c
new file mode 100644
index 0000000..f348962
--- /dev/null
+++ b/libc-top-half/musl/src/network/socketpair.c
@@ -0,0 +1,25 @@
+#include <sys/socket.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "syscall.h"
+
+int socketpair(int domain, int type, int protocol, int fd[2])
+{
+ int r = socketcall(socketpair, domain, type, protocol, fd, 0, 0);
+ if (r<0 && (errno==EINVAL || errno==EPROTONOSUPPORT)
+ && (type&(SOCK_CLOEXEC|SOCK_NONBLOCK))) {
+ r = socketcall(socketpair, domain,
+ type & ~(SOCK_CLOEXEC|SOCK_NONBLOCK),
+ protocol, fd, 0, 0);
+ if (r < 0) return r;
+ if (type & SOCK_CLOEXEC) {
+ __syscall(SYS_fcntl, fd[0], F_SETFD, FD_CLOEXEC);
+ __syscall(SYS_fcntl, fd[1], F_SETFD, FD_CLOEXEC);
+ }
+ if (type & SOCK_NONBLOCK) {
+ __syscall(SYS_fcntl, fd[0], F_SETFL, O_NONBLOCK);
+ __syscall(SYS_fcntl, fd[1], F_SETFL, O_NONBLOCK);
+ }
+ }
+ return r;
+}
diff --git a/libc-top-half/musl/src/passwd/fgetgrent.c b/libc-top-half/musl/src/passwd/fgetgrent.c
new file mode 100644
index 0000000..7d045fd
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/fgetgrent.c
@@ -0,0 +1,12 @@
+#define _GNU_SOURCE
+#include "pwf.h"
+
+struct group *fgetgrent(FILE *f)
+{
+ static char *line, **mem;
+ static struct group gr;
+ struct group *res;
+ size_t size=0, nmem=0;
+ __getgrent_a(f, &gr, &line, &size, &mem, &nmem, &res);
+ return res;
+}
diff --git a/libc-top-half/musl/src/passwd/fgetpwent.c b/libc-top-half/musl/src/passwd/fgetpwent.c
new file mode 100644
index 0000000..fd472a0
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/fgetpwent.c
@@ -0,0 +1,12 @@
+#define _GNU_SOURCE
+#include "pwf.h"
+
+struct passwd *fgetpwent(FILE *f)
+{
+ static char *line;
+ static struct passwd pw;
+ size_t size=0;
+ struct passwd *res;
+ __getpwent_a(f, &pw, &line, &size, &res);
+ return res;
+}
diff --git a/libc-top-half/musl/src/passwd/fgetspent.c b/libc-top-half/musl/src/passwd/fgetspent.c
new file mode 100644
index 0000000..47473bd
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/fgetspent.c
@@ -0,0 +1,15 @@
+#include "pwf.h"
+#include <pthread.h>
+
+struct spwd *fgetspent(FILE *f)
+{
+ static char *line;
+ static struct spwd sp;
+ size_t size = 0;
+ struct spwd *res = 0;
+ int cs;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ if (getline(&line, &size, f) >= 0 && __parsespent(line, &sp) >= 0) res = &sp;
+ pthread_setcancelstate(cs, 0);
+ return res;
+}
diff --git a/libc-top-half/musl/src/passwd/getgr_a.c b/libc-top-half/musl/src/passwd/getgr_a.c
new file mode 100644
index 0000000..afeb1ec
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/getgr_a.c
@@ -0,0 +1,169 @@
+#include <pthread.h>
+#include <byteswap.h>
+#include <string.h>
+#include <unistd.h>
+#include "pwf.h"
+#include "nscd.h"
+
+static char *itoa(char *p, uint32_t x)
+{
+ // number of digits in a uint32_t + NUL
+ p += 11;
+ *--p = 0;
+ do {
+ *--p = '0' + x % 10;
+ x /= 10;
+ } while (x);
+ return p;
+}
+
+int __getgr_a(const char *name, gid_t gid, struct group *gr, char **buf, size_t *size, char ***mem, size_t *nmem, struct group **res)
+{
+ FILE *f;
+ int rv = 0;
+ int cs;
+
+ *res = 0;
+
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ f = fopen("/etc/group", "rbe");
+ if (!f) {
+ rv = errno;
+ goto done;
+ }
+
+ while (!(rv = __getgrent_a(f, gr, buf, size, mem, nmem, res)) && *res) {
+ if (name && !strcmp(name, (*res)->gr_name)
+ || !name && (*res)->gr_gid == gid) {
+ break;
+ }
+ }
+ fclose(f);
+
+ if (!*res && (rv == 0 || rv == ENOENT || rv == ENOTDIR)) {
+ int32_t req = name ? GETGRBYNAME : GETGRBYGID;
+ int32_t i;
+ const char *key;
+ int32_t groupbuf[GR_LEN] = {0};
+ size_t len = 0;
+ size_t grlist_len = 0;
+ char gidbuf[11] = {0};
+ int swap = 0;
+ char *ptr;
+
+ if (name) {
+ key = name;
+ } else {
+ if (gid < 0 || gid > UINT32_MAX) {
+ rv = 0;
+ goto done;
+ }
+ key = itoa(gidbuf, gid);
+ }
+
+ f = __nscd_query(req, key, groupbuf, sizeof groupbuf, &swap);
+ if (!f) { rv = errno; goto done; }
+
+ if (!groupbuf[GRFOUND]) { rv = 0; goto cleanup_f; }
+
+ if (!groupbuf[GRNAMELEN] || !groupbuf[GRPASSWDLEN]) {
+ rv = EIO;
+ goto cleanup_f;
+ }
+
+ if (groupbuf[GRNAMELEN] > SIZE_MAX - groupbuf[GRPASSWDLEN]) {
+ rv = ENOMEM;
+ goto cleanup_f;
+ }
+ len = groupbuf[GRNAMELEN] + groupbuf[GRPASSWDLEN];
+
+ for (i = 0; i < groupbuf[GRMEMCNT]; i++) {
+ uint32_t name_len;
+ if (fread(&name_len, sizeof name_len, 1, f) < 1) {
+ rv = ferror(f) ? errno : EIO;
+ goto cleanup_f;
+ }
+ if (swap) {
+ name_len = bswap_32(name_len);
+ }
+ if (name_len > SIZE_MAX - grlist_len
+ || name_len > SIZE_MAX - len) {
+ rv = ENOMEM;
+ goto cleanup_f;
+ }
+ len += name_len;
+ grlist_len += name_len;
+ }
+
+ if (len > *size || !*buf) {
+ char *tmp = realloc(*buf, len);
+ if (!tmp) {
+ rv = errno;
+ goto cleanup_f;
+ }
+ *buf = tmp;
+ *size = len;
+ }
+
+ if (!fread(*buf, len, 1, f)) {
+ rv = ferror(f) ? errno : EIO;
+ goto cleanup_f;
+ }
+
+ if (groupbuf[GRMEMCNT] + 1 > *nmem) {
+ if (groupbuf[GRMEMCNT] + 1 > SIZE_MAX/sizeof(char*)) {
+ rv = ENOMEM;
+ goto cleanup_f;
+ }
+ char **tmp = realloc(*mem, (groupbuf[GRMEMCNT]+1)*sizeof(char*));
+ if (!tmp) {
+ rv = errno;
+ goto cleanup_f;
+ }
+ *mem = tmp;
+ *nmem = groupbuf[GRMEMCNT] + 1;
+ }
+
+ if (groupbuf[GRMEMCNT]) {
+ mem[0][0] = *buf + groupbuf[GRNAMELEN] + groupbuf[GRPASSWDLEN];
+ for (ptr = mem[0][0], i = 0; ptr != mem[0][0]+grlist_len; ptr++)
+ if (!*ptr) mem[0][++i] = ptr+1;
+ mem[0][i] = 0;
+
+ if (i != groupbuf[GRMEMCNT]) {
+ rv = EIO;
+ goto cleanup_f;
+ }
+ } else {
+ mem[0][0] = 0;
+ }
+
+ gr->gr_name = *buf;
+ gr->gr_passwd = gr->gr_name + groupbuf[GRNAMELEN];
+ gr->gr_gid = groupbuf[GRGID];
+ gr->gr_mem = *mem;
+
+ if (gr->gr_passwd[-1]
+ || gr->gr_passwd[groupbuf[GRPASSWDLEN]-1]) {
+ rv = EIO;
+ goto cleanup_f;
+ }
+
+ if (name && strcmp(name, gr->gr_name)
+ || !name && gid != gr->gr_gid) {
+ rv = EIO;
+ goto cleanup_f;
+ }
+
+ *res = gr;
+
+cleanup_f:
+ fclose(f);
+ goto done;
+ }
+
+done:
+ pthread_setcancelstate(cs, 0);
+ if (rv) errno = rv;
+ return rv;
+}
diff --git a/libc-top-half/musl/src/passwd/getgr_r.c b/libc-top-half/musl/src/passwd/getgr_r.c
new file mode 100644
index 0000000..f3e8f60
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/getgr_r.c
@@ -0,0 +1,49 @@
+#include "pwf.h"
+#include <pthread.h>
+
+#define FIX(x) (gr->gr_##x = gr->gr_##x-line+buf)
+
+static int getgr_r(const char *name, gid_t gid, struct group *gr, char *buf, size_t size, struct group **res)
+{
+ char *line = 0;
+ size_t len = 0;
+ char **mem = 0;
+ size_t nmem = 0;
+ int rv = 0;
+ size_t i;
+ int cs;
+
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
+ rv = __getgr_a(name, gid, gr, &line, &len, &mem, &nmem, res);
+ if (*res && size < len + (nmem+1)*sizeof(char *) + 32) {
+ *res = 0;
+ rv = ERANGE;
+ }
+ if (*res) {
+ buf += (16-(uintptr_t)buf)%16;
+ gr->gr_mem = (void *)buf;
+ buf += (nmem+1)*sizeof(char *);
+ memcpy(buf, line, len);
+ FIX(name);
+ FIX(passwd);
+ for (i=0; mem[i]; i++)
+ gr->gr_mem[i] = mem[i]-line+buf;
+ gr->gr_mem[i] = 0;
+ }
+ free(mem);
+ free(line);
+ pthread_setcancelstate(cs, 0);
+ if (rv) errno = rv;
+ return rv;
+}
+
+int getgrnam_r(const char *name, struct group *gr, char *buf, size_t size, struct group **res)
+{
+ return getgr_r(name, 0, gr, buf, size, res);
+}
+
+int getgrgid_r(gid_t gid, struct group *gr, char *buf, size_t size, struct group **res)
+{
+ return getgr_r(0, gid, gr, buf, size, res);
+}
diff --git a/libc-top-half/musl/src/passwd/getgrent.c b/libc-top-half/musl/src/passwd/getgrent.c
new file mode 100644
index 0000000..835b9ab
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/getgrent.c
@@ -0,0 +1,39 @@
+#include "pwf.h"
+
+static FILE *f;
+static char *line, **mem;
+static struct group gr;
+
+void setgrent()
+{
+ if (f) fclose(f);
+ f = 0;
+}
+
+weak_alias(setgrent, endgrent);
+
+struct group *getgrent()
+{
+ struct group *res;
+ size_t size=0, nmem=0;
+ if (!f) f = fopen("/etc/group", "rbe");
+ if (!f) return 0;
+ __getgrent_a(f, &gr, &line, &size, &mem, &nmem, &res);
+ return res;
+}
+
+struct group *getgrgid(gid_t gid)
+{
+ struct group *res;
+ size_t size=0, nmem=0;
+ __getgr_a(0, gid, &gr, &line, &size, &mem, &nmem, &res);
+ return res;
+}
+
+struct group *getgrnam(const char *name)
+{
+ struct group *res;
+ size_t size=0, nmem=0;
+ __getgr_a(name, 0, &gr, &line, &size, &mem, &nmem, &res);
+ return res;
+}
diff --git a/libc-top-half/musl/src/passwd/getgrent_a.c b/libc-top-half/musl/src/passwd/getgrent_a.c
new file mode 100644
index 0000000..7fc389d
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/getgrent_a.c
@@ -0,0 +1,68 @@
+#include "pwf.h"
+#include <pthread.h>
+
+static unsigned atou(char **s)
+{
+ unsigned x;
+ for (x=0; **s-'0'<10U; ++*s) x=10*x+(**s-'0');
+ return x;
+}
+
+int __getgrent_a(FILE *f, struct group *gr, char **line, size_t *size, char ***mem, size_t *nmem, struct group **res)
+{
+ ssize_t l;
+ char *s, *mems;
+ size_t i;
+ int rv = 0;
+ int cs;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ for (;;) {
+ if ((l=getline(line, size, f)) < 0) {
+ rv = ferror(f) ? errno : 0;
+ free(*line);
+ *line = 0;
+ gr = 0;
+ goto end;
+ }
+ line[0][l-1] = 0;
+
+ s = line[0];
+ gr->gr_name = s++;
+ if (!(s = strchr(s, ':'))) continue;
+
+ *s++ = 0; gr->gr_passwd = s;
+ if (!(s = strchr(s, ':'))) continue;
+
+ *s++ = 0; gr->gr_gid = atou(&s);
+ if (*s != ':') continue;
+
+ *s++ = 0; mems = s;
+ break;
+ }
+
+ for (*nmem=!!*s; *s; s++)
+ if (*s==',') ++*nmem;
+ free(*mem);
+ *mem = calloc(sizeof(char *), *nmem+1);
+ if (!*mem) {
+ rv = errno;
+ free(*line);
+ *line = 0;
+ gr = 0;
+ goto end;
+ }
+ if (*mems) {
+ mem[0][0] = mems;
+ for (s=mems, i=0; *s; s++)
+ if (*s==',') *s++ = 0, mem[0][++i] = s;
+ mem[0][++i] = 0;
+ } else {
+ mem[0][0] = 0;
+ }
+ gr->gr_mem = *mem;
+end:
+ pthread_setcancelstate(cs, 0);
+ *res = gr;
+ if(rv) errno = rv;
+ return rv;
+}
diff --git a/libc-top-half/musl/src/passwd/getgrouplist.c b/libc-top-half/musl/src/passwd/getgrouplist.c
new file mode 100644
index 0000000..301824c
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/getgrouplist.c
@@ -0,0 +1,81 @@
+#define _GNU_SOURCE
+#include "pwf.h"
+#include <grp.h>
+#include <string.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <byteswap.h>
+#include <errno.h>
+#include "nscd.h"
+
+int getgrouplist(const char *user, gid_t gid, gid_t *groups, int *ngroups)
+{
+ int rv, nlim, ret = -1;
+ ssize_t i, n = 1;
+ struct group gr;
+ struct group *res;
+ FILE *f;
+ int swap = 0;
+ int32_t resp[INITGR_LEN];
+ uint32_t *nscdbuf = 0;
+ char *buf = 0;
+ char **mem = 0;
+ size_t nmem = 0;
+ size_t size;
+ nlim = *ngroups;
+ if (nlim >= 1) *groups++ = gid;
+
+ f = __nscd_query(GETINITGR, user, resp, sizeof resp, &swap);
+ if (!f) goto cleanup;
+ if (resp[INITGRFOUND]) {
+ nscdbuf = calloc(resp[INITGRNGRPS], sizeof(uint32_t));
+ if (!nscdbuf) goto cleanup;
+ size_t nbytes = sizeof(*nscdbuf)*resp[INITGRNGRPS];
+ if (nbytes && !fread(nscdbuf, nbytes, 1, f)) {
+ if (!ferror(f)) errno = EIO;
+ goto cleanup;
+ }
+ if (swap) {
+ for (i = 0; i < resp[INITGRNGRPS]; i++)
+ nscdbuf[i] = bswap_32(nscdbuf[i]);
+ }
+ }
+ fclose(f);
+
+ f = fopen("/etc/group", "rbe");
+ if (!f && errno != ENOENT && errno != ENOTDIR)
+ goto cleanup;
+
+ if (f) {
+ while (!(rv = __getgrent_a(f, &gr, &buf, &size, &mem, &nmem, &res)) && res) {
+ if (nscdbuf)
+ for (i=0; i < resp[INITGRNGRPS]; i++) {
+ if (nscdbuf[i] == gr.gr_gid) nscdbuf[i] = gid;
+ }
+ for (i=0; gr.gr_mem[i] && strcmp(user, gr.gr_mem[i]); i++);
+ if (!gr.gr_mem[i]) continue;
+ if (++n <= nlim) *groups++ = gr.gr_gid;
+ }
+ if (rv) {
+ errno = rv;
+ goto cleanup;
+ }
+ }
+ if (nscdbuf) {
+ for(i=0; i < resp[INITGRNGRPS]; i++) {
+ if (nscdbuf[i] != gid)
+ if(++n <= nlim) *groups++ = nscdbuf[i];
+ }
+ }
+
+ ret = n > nlim ? -1 : n;
+ *ngroups = n;
+
+cleanup:
+ if (f) fclose(f);
+ free(nscdbuf);
+ free(buf);
+ free(mem);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/passwd/getpw_a.c b/libc-top-half/musl/src/passwd/getpw_a.c
new file mode 100644
index 0000000..15a70c0
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/getpw_a.c
@@ -0,0 +1,142 @@
+#include <pthread.h>
+#include <byteswap.h>
+#include <string.h>
+#include <unistd.h>
+#include "pwf.h"
+#include "nscd.h"
+
+static char *itoa(char *p, uint32_t x)
+{
+ // number of digits in a uint32_t + NUL
+ p += 11;
+ *--p = 0;
+ do {
+ *--p = '0' + x % 10;
+ x /= 10;
+ } while (x);
+ return p;
+}
+
+int __getpw_a(const char *name, uid_t uid, struct passwd *pw, char **buf, size_t *size, struct passwd **res)
+{
+ FILE *f;
+ int cs;
+ int rv = 0;
+
+ *res = 0;
+
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
+ f = fopen("/etc/passwd", "rbe");
+ if (!f) {
+ rv = errno;
+ goto done;
+ }
+
+ while (!(rv = __getpwent_a(f, pw, buf, size, res)) && *res) {
+ if (name && !strcmp(name, (*res)->pw_name)
+ || !name && (*res)->pw_uid == uid)
+ break;
+ }
+ fclose(f);
+
+ if (!*res && (rv == 0 || rv == ENOENT || rv == ENOTDIR)) {
+ int32_t req = name ? GETPWBYNAME : GETPWBYUID;
+ const char *key;
+ int32_t passwdbuf[PW_LEN] = {0};
+ size_t len = 0;
+ char uidbuf[11] = {0};
+
+ if (name) {
+ key = name;
+ } else {
+ /* uid outside of this range can't be queried with the
+ * nscd interface, but might happen if uid_t ever
+ * happens to be a larger type (this is not true as of
+ * now)
+ */
+ if(uid < 0 || uid > UINT32_MAX) {
+ rv = 0;
+ goto done;
+ }
+ key = itoa(uidbuf, uid);
+ }
+
+ f = __nscd_query(req, key, passwdbuf, sizeof passwdbuf, (int[]){0});
+ if (!f) { rv = errno; goto done; }
+
+ if(!passwdbuf[PWFOUND]) { rv = 0; goto cleanup_f; }
+
+ /* A zero length response from nscd is invalid. We ignore
+ * invalid responses and just report an error, rather than
+ * trying to do something with them.
+ */
+ if (!passwdbuf[PWNAMELEN] || !passwdbuf[PWPASSWDLEN]
+ || !passwdbuf[PWGECOSLEN] || !passwdbuf[PWDIRLEN]
+ || !passwdbuf[PWSHELLLEN]) {
+ rv = EIO;
+ goto cleanup_f;
+ }
+
+ if ((passwdbuf[PWNAMELEN]|passwdbuf[PWPASSWDLEN]
+ |passwdbuf[PWGECOSLEN]|passwdbuf[PWDIRLEN]
+ |passwdbuf[PWSHELLLEN]) >= SIZE_MAX/8) {
+ rv = ENOMEM;
+ goto cleanup_f;
+ }
+
+ len = passwdbuf[PWNAMELEN] + passwdbuf[PWPASSWDLEN]
+ + passwdbuf[PWGECOSLEN] + passwdbuf[PWDIRLEN]
+ + passwdbuf[PWSHELLLEN];
+
+ if (len > *size || !*buf) {
+ char *tmp = realloc(*buf, len);
+ if (!tmp) {
+ rv = errno;
+ goto cleanup_f;
+ }
+ *buf = tmp;
+ *size = len;
+ }
+
+ if (!fread(*buf, len, 1, f)) {
+ rv = ferror(f) ? errno : EIO;
+ goto cleanup_f;
+ }
+
+ pw->pw_name = *buf;
+ pw->pw_passwd = pw->pw_name + passwdbuf[PWNAMELEN];
+ pw->pw_gecos = pw->pw_passwd + passwdbuf[PWPASSWDLEN];
+ pw->pw_dir = pw->pw_gecos + passwdbuf[PWGECOSLEN];
+ pw->pw_shell = pw->pw_dir + passwdbuf[PWDIRLEN];
+ pw->pw_uid = passwdbuf[PWUID];
+ pw->pw_gid = passwdbuf[PWGID];
+
+ /* Don't assume that nscd made sure to null terminate strings.
+ * It's supposed to, but malicious nscd should be ignored
+ * rather than causing a crash.
+ */
+ if (pw->pw_passwd[-1] || pw->pw_gecos[-1] || pw->pw_dir[-1]
+ || pw->pw_shell[passwdbuf[PWSHELLLEN]-1]) {
+ rv = EIO;
+ goto cleanup_f;
+ }
+
+ if (name && strcmp(name, pw->pw_name)
+ || !name && uid != pw->pw_uid) {
+ rv = EIO;
+ goto cleanup_f;
+ }
+
+
+ *res = pw;
+cleanup_f:
+ fclose(f);
+ goto done;
+ }
+
+done:
+ pthread_setcancelstate(cs, 0);
+ if (rv) errno = rv;
+ return rv;
+}
diff --git a/libc-top-half/musl/src/passwd/getpw_r.c b/libc-top-half/musl/src/passwd/getpw_r.c
new file mode 100644
index 0000000..0c87ab0
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/getpw_r.c
@@ -0,0 +1,42 @@
+#include "pwf.h"
+#include <pthread.h>
+
+#define FIX(x) (pw->pw_##x = pw->pw_##x-line+buf)
+
+static int getpw_r(const char *name, uid_t uid, struct passwd *pw, char *buf, size_t size, struct passwd **res)
+{
+ char *line = 0;
+ size_t len = 0;
+ int rv = 0;
+ int cs;
+
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
+ rv = __getpw_a(name, uid, pw, &line, &len, res);
+ if (*res && size < len) {
+ *res = 0;
+ rv = ERANGE;
+ }
+ if (*res) {
+ memcpy(buf, line, len);
+ FIX(name);
+ FIX(passwd);
+ FIX(gecos);
+ FIX(dir);
+ FIX(shell);
+ }
+ free(line);
+ pthread_setcancelstate(cs, 0);
+ if (rv) errno = rv;
+ return rv;
+}
+
+int getpwnam_r(const char *name, struct passwd *pw, char *buf, size_t size, struct passwd **res)
+{
+ return getpw_r(name, 0, pw, buf, size, res);
+}
+
+int getpwuid_r(uid_t uid, struct passwd *pw, char *buf, size_t size, struct passwd **res)
+{
+ return getpw_r(0, uid, pw, buf, size, res);
+}
diff --git a/libc-top-half/musl/src/passwd/getpwent.c b/libc-top-half/musl/src/passwd/getpwent.c
new file mode 100644
index 0000000..f2bd516
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/getpwent.c
@@ -0,0 +1,37 @@
+#include "pwf.h"
+
+static FILE *f;
+static char *line;
+static struct passwd pw;
+static size_t size;
+
+void setpwent()
+{
+ if (f) fclose(f);
+ f = 0;
+}
+
+weak_alias(setpwent, endpwent);
+
+struct passwd *getpwent()
+{
+ struct passwd *res;
+ if (!f) f = fopen("/etc/passwd", "rbe");
+ if (!f) return 0;
+ __getpwent_a(f, &pw, &line, &size, &res);
+ return res;
+}
+
+struct passwd *getpwuid(uid_t uid)
+{
+ struct passwd *res;
+ __getpw_a(0, uid, &pw, &line, &size, &res);
+ return res;
+}
+
+struct passwd *getpwnam(const char *name)
+{
+ struct passwd *res;
+ __getpw_a(name, 0, &pw, &line, &size, &res);
+ return res;
+}
diff --git a/libc-top-half/musl/src/passwd/getpwent_a.c b/libc-top-half/musl/src/passwd/getpwent_a.c
new file mode 100644
index 0000000..d1b4b53
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/getpwent_a.c
@@ -0,0 +1,54 @@
+#include "pwf.h"
+#include <pthread.h>
+
+static unsigned atou(char **s)
+{
+ unsigned x;
+ for (x=0; **s-'0'<10U; ++*s) x=10*x+(**s-'0');
+ return x;
+}
+
+int __getpwent_a(FILE *f, struct passwd *pw, char **line, size_t *size, struct passwd **res)
+{
+ ssize_t l;
+ char *s;
+ int rv = 0;
+ int cs;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ for (;;) {
+ if ((l=getline(line, size, f)) < 0) {
+ rv = ferror(f) ? errno : 0;
+ free(*line);
+ *line = 0;
+ pw = 0;
+ break;
+ }
+ line[0][l-1] = 0;
+
+ s = line[0];
+ pw->pw_name = s++;
+ if (!(s = strchr(s, ':'))) continue;
+
+ *s++ = 0; pw->pw_passwd = s;
+ if (!(s = strchr(s, ':'))) continue;
+
+ *s++ = 0; pw->pw_uid = atou(&s);
+ if (*s != ':') continue;
+
+ *s++ = 0; pw->pw_gid = atou(&s);
+ if (*s != ':') continue;
+
+ *s++ = 0; pw->pw_gecos = s;
+ if (!(s = strchr(s, ':'))) continue;
+
+ *s++ = 0; pw->pw_dir = s;
+ if (!(s = strchr(s, ':'))) continue;
+
+ *s++ = 0; pw->pw_shell = s;
+ break;
+ }
+ pthread_setcancelstate(cs, 0);
+ *res = pw;
+ if (rv) errno = rv;
+ return rv;
+}
diff --git a/libc-top-half/musl/src/passwd/getspent.c b/libc-top-half/musl/src/passwd/getspent.c
new file mode 100644
index 0000000..8574a48
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/getspent.c
@@ -0,0 +1,14 @@
+#include "pwf.h"
+
+void setspent()
+{
+}
+
+void endspent()
+{
+}
+
+struct spwd *getspent()
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/passwd/getspnam.c b/libc-top-half/musl/src/passwd/getspnam.c
new file mode 100644
index 0000000..709b526
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/getspnam.c
@@ -0,0 +1,18 @@
+#include "pwf.h"
+
+#define LINE_LIM 256
+
+struct spwd *getspnam(const char *name)
+{
+ static struct spwd sp;
+ static char *line;
+ struct spwd *res;
+ int e;
+ int orig_errno = errno;
+
+ if (!line) line = malloc(LINE_LIM);
+ if (!line) return 0;
+ e = getspnam_r(name, &sp, line, LINE_LIM, &res);
+ errno = e ? e : orig_errno;
+ return res;
+}
diff --git a/libc-top-half/musl/src/passwd/getspnam_r.c b/libc-top-half/musl/src/passwd/getspnam_r.c
new file mode 100644
index 0000000..541e853
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/getspnam_r.c
@@ -0,0 +1,125 @@
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <ctype.h>
+#include <pthread.h>
+#include "pwf.h"
+
+/* This implementation support Openwall-style TCB passwords in place of
+ * traditional shadow, if the appropriate directories and files exist.
+ * Thus, it is careful to avoid following symlinks or blocking on fifos
+ * which a malicious user might create in place of his or her TCB shadow
+ * file. It also avoids any allocation to prevent memory-exhaustion
+ * attacks via huge TCB shadow files. */
+
+static long xatol(char **s)
+{
+ long x;
+ if (**s == ':' || **s == '\n') return -1;
+ for (x=0; **s-'0'<10U; ++*s) x=10*x+(**s-'0');
+ return x;
+}
+
+int __parsespent(char *s, struct spwd *sp)
+{
+ sp->sp_namp = s;
+ if (!(s = strchr(s, ':'))) return -1;
+ *s = 0;
+
+ sp->sp_pwdp = ++s;
+ if (!(s = strchr(s, ':'))) return -1;
+ *s = 0;
+
+ s++; sp->sp_lstchg = xatol(&s);
+ if (*s != ':') return -1;
+
+ s++; sp->sp_min = xatol(&s);
+ if (*s != ':') return -1;
+
+ s++; sp->sp_max = xatol(&s);
+ if (*s != ':') return -1;
+
+ s++; sp->sp_warn = xatol(&s);
+ if (*s != ':') return -1;
+
+ s++; sp->sp_inact = xatol(&s);
+ if (*s != ':') return -1;
+
+ s++; sp->sp_expire = xatol(&s);
+ if (*s != ':') return -1;
+
+ s++; sp->sp_flag = xatol(&s);
+ if (*s != '\n') return -1;
+ return 0;
+}
+
+static void cleanup(void *p)
+{
+ fclose(p);
+}
+
+int getspnam_r(const char *name, struct spwd *sp, char *buf, size_t size, struct spwd **res)
+{
+ char path[20+NAME_MAX];
+ FILE *f = 0;
+ int rv = 0;
+ int fd;
+ size_t k, l = strlen(name);
+ int skip = 0;
+ int cs;
+ int orig_errno = errno;
+
+ *res = 0;
+
+ /* Disallow potentially-malicious user names */
+ if (*name=='.' || strchr(name, '/') || !l)
+ return errno = EINVAL;
+
+ /* Buffer size must at least be able to hold name, plus some.. */
+ if (size < l+100)
+ return errno = ERANGE;
+
+ /* Protect against truncation */
+ if (snprintf(path, sizeof path, "/etc/tcb/%s/shadow", name) >= sizeof path)
+ return errno = EINVAL;
+
+ fd = open(path, O_RDONLY|O_NOFOLLOW|O_NONBLOCK|O_CLOEXEC);
+ if (fd >= 0) {
+ struct stat st = { 0 };
+ errno = EINVAL;
+ if (fstat(fd, &st) || !S_ISREG(st.st_mode) || !(f = fdopen(fd, "rb"))) {
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ close(fd);
+ pthread_setcancelstate(cs, 0);
+ return errno;
+ }
+ } else {
+ if (errno != ENOENT && errno != ENOTDIR)
+ return errno;
+ f = fopen("/etc/shadow", "rbe");
+ if (!f) {
+ if (errno != ENOENT && errno != ENOTDIR)
+ return errno;
+ return 0;
+ }
+ }
+
+ pthread_cleanup_push(cleanup, f);
+ while (fgets(buf, size, f) && (k=strlen(buf))>0) {
+ if (skip || strncmp(name, buf, l) || buf[l]!=':') {
+ skip = buf[k-1] != '\n';
+ continue;
+ }
+ if (buf[k-1] != '\n') {
+ rv = ERANGE;
+ break;
+ }
+
+ if (__parsespent(buf, sp) < 0) continue;
+ *res = sp;
+ break;
+ }
+ pthread_cleanup_pop(1);
+ errno = rv ? rv : orig_errno;
+ return rv;
+}
diff --git a/libc-top-half/musl/src/passwd/lckpwdf.c b/libc-top-half/musl/src/passwd/lckpwdf.c
new file mode 100644
index 0000000..2feda61
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/lckpwdf.c
@@ -0,0 +1,11 @@
+#include <shadow.h>
+
+int lckpwdf()
+{
+ return 0;
+}
+
+int ulckpwdf()
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/passwd/nscd.h b/libc-top-half/musl/src/passwd/nscd.h
new file mode 100644
index 0000000..ae5aa8d
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/nscd.h
@@ -0,0 +1,44 @@
+#ifndef NSCD_H
+#define NSCD_H
+
+#include <stdint.h>
+
+#define NSCDVERSION 2
+#define GETPWBYNAME 0
+#define GETPWBYUID 1
+#define GETGRBYNAME 2
+#define GETGRBYGID 3
+#define GETINITGR 15
+
+#define REQVERSION 0
+#define REQTYPE 1
+#define REQKEYLEN 2
+#define REQ_LEN 3
+
+#define PWVERSION 0
+#define PWFOUND 1
+#define PWNAMELEN 2
+#define PWPASSWDLEN 3
+#define PWUID 4
+#define PWGID 5
+#define PWGECOSLEN 6
+#define PWDIRLEN 7
+#define PWSHELLLEN 8
+#define PW_LEN 9
+
+#define GRVERSION 0
+#define GRFOUND 1
+#define GRNAMELEN 2
+#define GRPASSWDLEN 3
+#define GRGID 4
+#define GRMEMCNT 5
+#define GR_LEN 6
+
+#define INITGRVERSION 0
+#define INITGRFOUND 1
+#define INITGRNGRPS 2
+#define INITGR_LEN 3
+
+hidden FILE *__nscd_query(int32_t req, const char *key, int32_t *buf, size_t len, int *swap);
+
+#endif
diff --git a/libc-top-half/musl/src/passwd/nscd_query.c b/libc-top-half/musl/src/passwd/nscd_query.c
new file mode 100644
index 0000000..dc3406b
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/nscd_query.c
@@ -0,0 +1,115 @@
+#include <sys/socket.h>
+#include <byteswap.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+#include "nscd.h"
+
+static const struct {
+ short sun_family;
+ char sun_path[21];
+} addr = {
+ AF_UNIX,
+ "/var/run/nscd/socket"
+};
+
+FILE *__nscd_query(int32_t req, const char *key, int32_t *buf, size_t len, int *swap)
+{
+ size_t i;
+ int fd;
+ FILE *f = 0;
+ int32_t req_buf[REQ_LEN] = {
+ NSCDVERSION,
+ req,
+ strnlen(key,LOGIN_NAME_MAX)+1
+ };
+ struct msghdr msg = {
+ .msg_iov = (struct iovec[]){
+ {&req_buf, sizeof(req_buf)},
+ {(char*)key, strlen(key)+1}
+ },
+ .msg_iovlen = 2
+ };
+ int errno_save = errno;
+
+ *swap = 0;
+retry:
+ memset(buf, 0, len);
+ buf[0] = NSCDVERSION;
+
+ fd = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
+ if (fd < 0) {
+ if (errno == EAFNOSUPPORT) {
+ f = fopen("/dev/null", "re");
+ if (f)
+ errno = errno_save;
+ return f;
+ }
+ return 0;
+ }
+
+ if(!(f = fdopen(fd, "r"))) {
+ close(fd);
+ return 0;
+ }
+
+ if (req_buf[2] > LOGIN_NAME_MAX)
+ return f;
+
+ if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
+ /* If there isn't a running nscd we simulate a "not found"
+ * result and the caller is responsible for calling
+ * fclose on the (unconnected) socket. The value of
+ * errno must be left unchanged in this case. */
+ if (errno == EACCES || errno == ECONNREFUSED || errno == ENOENT) {
+ errno = errno_save;
+ return f;
+ }
+ goto error;
+ }
+
+ if (sendmsg(fd, &msg, MSG_NOSIGNAL) < 0)
+ goto error;
+
+ if (!fread(buf, len, 1, f)) {
+ /* If the VERSION entry mismatches nscd will disconnect. The
+ * most likely cause is that the endianness mismatched. So, we
+ * byteswap and try once more. (if we already swapped, just
+ * fail out)
+ */
+ if (ferror(f)) goto error;
+ if (!*swap) {
+ fclose(f);
+ for (i = 0; i < sizeof(req_buf)/sizeof(req_buf[0]); i++) {
+ req_buf[i] = bswap_32(req_buf[i]);
+ }
+ *swap = 1;
+ goto retry;
+ } else {
+ errno = EIO;
+ goto error;
+ }
+ }
+
+ if (*swap) {
+ for (i = 0; i < len/sizeof(buf[0]); i++) {
+ buf[i] = bswap_32(buf[i]);
+ }
+ }
+
+ /* The first entry in every nscd response is the version number. This
+ * really shouldn't happen, and is evidence of some form of malformed
+ * response.
+ */
+ if(buf[0] != NSCDVERSION) {
+ errno = EIO;
+ goto error;
+ }
+
+ return f;
+error:
+ fclose(f);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/passwd/putgrent.c b/libc-top-half/musl/src/passwd/putgrent.c
new file mode 100644
index 0000000..2a8257d
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/putgrent.c
@@ -0,0 +1,17 @@
+#define _GNU_SOURCE
+#include <grp.h>
+#include <stdio.h>
+
+int putgrent(const struct group *gr, FILE *f)
+{
+ int r;
+ size_t i;
+ flockfile(f);
+ if ((r = fprintf(f, "%s:%s:%u:", gr->gr_name, gr->gr_passwd, gr->gr_gid))<0) goto done;
+ if (gr->gr_mem) for (i=0; gr->gr_mem[i]; i++)
+ if ((r = fprintf(f, "%s%s", i?",":"", gr->gr_mem[i]))<0) goto done;
+ r = fputc('\n', f);
+done:
+ funlockfile(f);
+ return r<0 ? -1 : 0;
+}
diff --git a/libc-top-half/musl/src/passwd/putpwent.c b/libc-top-half/musl/src/passwd/putpwent.c
new file mode 100644
index 0000000..312b765
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/putpwent.c
@@ -0,0 +1,10 @@
+#define _GNU_SOURCE
+#include <pwd.h>
+#include <stdio.h>
+
+int putpwent(const struct passwd *pw, FILE *f)
+{
+ return fprintf(f, "%s:%s:%u:%u:%s:%s:%s\n",
+ pw->pw_name, pw->pw_passwd, pw->pw_uid, pw->pw_gid,
+ pw->pw_gecos, pw->pw_dir, pw->pw_shell)<0 ? -1 : 0;
+}
diff --git a/libc-top-half/musl/src/passwd/putspent.c b/libc-top-half/musl/src/passwd/putspent.c
new file mode 100644
index 0000000..55c41bb
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/putspent.c
@@ -0,0 +1,13 @@
+#include <shadow.h>
+#include <stdio.h>
+
+#define NUM(n) ((n) == -1 ? 0 : -1), ((n) == -1 ? 0 : (n))
+#define STR(s) ((s) ? (s) : "")
+
+int putspent(const struct spwd *sp, FILE *f)
+{
+ return fprintf(f, "%s:%s:%.*ld:%.*ld:%.*ld:%.*ld:%.*ld:%.*ld:%.*lu\n",
+ STR(sp->sp_namp), STR(sp->sp_pwdp), NUM(sp->sp_lstchg),
+ NUM(sp->sp_min), NUM(sp->sp_max), NUM(sp->sp_warn),
+ NUM(sp->sp_inact), NUM(sp->sp_expire), NUM(sp->sp_flag)) < 0 ? -1 : 0;
+}
diff --git a/libc-top-half/musl/src/passwd/pwf.h b/libc-top-half/musl/src/passwd/pwf.h
new file mode 100644
index 0000000..95bb6e0
--- /dev/null
+++ b/libc-top-half/musl/src/passwd/pwf.h
@@ -0,0 +1,15 @@
+#include <pwd.h>
+#include <grp.h>
+#include <shadow.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+hidden int __getpwent_a(FILE *f, struct passwd *pw, char **line, size_t *size, struct passwd **res);
+hidden int __getpw_a(const char *name, uid_t uid, struct passwd *pw, char **buf, size_t *size, struct passwd **res);
+hidden int __getgrent_a(FILE *f, struct group *gr, char **line, size_t *size, char ***mem, size_t *nmem, struct group **res);
+hidden int __getgr_a(const char *name, gid_t gid, struct group *gr, char **buf, size_t *size, char ***mem, size_t *nmem, struct group **res);
+hidden int __parsespent(char *s, struct spwd *sp);
diff --git a/libc-top-half/musl/src/prng/__rand48_step.c b/libc-top-half/musl/src/prng/__rand48_step.c
new file mode 100644
index 0000000..94703d0
--- /dev/null
+++ b/libc-top-half/musl/src/prng/__rand48_step.c
@@ -0,0 +1,14 @@
+#include <stdint.h>
+#include "rand48.h"
+
+uint64_t __rand48_step(unsigned short *xi, unsigned short *lc)
+{
+ uint64_t a, x;
+ x = xi[0] | xi[1]+0U<<16 | xi[2]+0ULL<<32;
+ a = lc[0] | lc[1]+0U<<16 | lc[2]+0ULL<<32;
+ x = a*x + lc[3];
+ xi[0] = x;
+ xi[1] = x>>16;
+ xi[2] = x>>32;
+ return x & 0xffffffffffffull;
+}
diff --git a/libc-top-half/musl/src/prng/__seed48.c b/libc-top-half/musl/src/prng/__seed48.c
new file mode 100644
index 0000000..e436b4d
--- /dev/null
+++ b/libc-top-half/musl/src/prng/__seed48.c
@@ -0,0 +1,3 @@
+#include "rand48.h"
+
+unsigned short __seed48[7] = { 0, 0, 0, 0xe66d, 0xdeec, 0x5, 0xb };
diff --git a/libc-top-half/musl/src/prng/drand48.c b/libc-top-half/musl/src/prng/drand48.c
new file mode 100644
index 0000000..08283e2
--- /dev/null
+++ b/libc-top-half/musl/src/prng/drand48.c
@@ -0,0 +1,17 @@
+#include <stdlib.h>
+#include <inttypes.h>
+#include "rand48.h"
+
+double erand48(unsigned short s[3])
+{
+ union {
+ uint64_t u;
+ double f;
+ } x = { 0x3ff0000000000000ULL | __rand48_step(s, __seed48+3)<<4 };
+ return x.f - 1.0;
+}
+
+double drand48(void)
+{
+ return erand48(__seed48);
+}
diff --git a/libc-top-half/musl/src/prng/lcong48.c b/libc-top-half/musl/src/prng/lcong48.c
new file mode 100644
index 0000000..030e514
--- /dev/null
+++ b/libc-top-half/musl/src/prng/lcong48.c
@@ -0,0 +1,8 @@
+#include <stdlib.h>
+#include <string.h>
+#include "rand48.h"
+
+void lcong48(unsigned short p[7])
+{
+ memcpy(__seed48, p, sizeof __seed48);
+}
diff --git a/libc-top-half/musl/src/prng/lrand48.c b/libc-top-half/musl/src/prng/lrand48.c
new file mode 100644
index 0000000..07e2b78
--- /dev/null
+++ b/libc-top-half/musl/src/prng/lrand48.c
@@ -0,0 +1,13 @@
+#include <stdlib.h>
+#include <inttypes.h>
+#include "rand48.h"
+
+long nrand48(unsigned short s[3])
+{
+ return __rand48_step(s, __seed48+3) >> 17;
+}
+
+long lrand48(void)
+{
+ return nrand48(__seed48);
+}
diff --git a/libc-top-half/musl/src/prng/mrand48.c b/libc-top-half/musl/src/prng/mrand48.c
new file mode 100644
index 0000000..f4a56e6
--- /dev/null
+++ b/libc-top-half/musl/src/prng/mrand48.c
@@ -0,0 +1,13 @@
+#include <stdlib.h>
+#include <inttypes.h>
+#include "rand48.h"
+
+long jrand48(unsigned short s[3])
+{
+ return (int32_t)(__rand48_step(s, __seed48+3) >> 16);
+}
+
+long mrand48(void)
+{
+ return jrand48(__seed48);
+}
diff --git a/libc-top-half/musl/src/prng/rand.c b/libc-top-half/musl/src/prng/rand.c
new file mode 100644
index 0000000..c000cd2
--- /dev/null
+++ b/libc-top-half/musl/src/prng/rand.c
@@ -0,0 +1,15 @@
+#include <stdlib.h>
+#include <stdint.h>
+
+static uint64_t seed;
+
+void srand(unsigned s)
+{
+ seed = s-1;
+}
+
+int rand(void)
+{
+ seed = 6364136223846793005ULL*seed + 1;
+ return seed>>33;
+}
diff --git a/libc-top-half/musl/src/prng/rand48.h b/libc-top-half/musl/src/prng/rand48.h
new file mode 100644
index 0000000..55cbec1
--- /dev/null
+++ b/libc-top-half/musl/src/prng/rand48.h
@@ -0,0 +1,5 @@
+#include <stdint.h>
+#include <features.h>
+
+hidden uint64_t __rand48_step(unsigned short *xi, unsigned short *lc);
+extern hidden unsigned short __seed48[7];
diff --git a/libc-top-half/musl/src/prng/rand_r.c b/libc-top-half/musl/src/prng/rand_r.c
new file mode 100644
index 0000000..638614c
--- /dev/null
+++ b/libc-top-half/musl/src/prng/rand_r.c
@@ -0,0 +1,15 @@
+#include <stdlib.h>
+
+static unsigned temper(unsigned x)
+{
+ x ^= x>>11;
+ x ^= x<<7 & 0x9D2C5680;
+ x ^= x<<15 & 0xEFC60000;
+ x ^= x>>18;
+ return x;
+}
+
+int rand_r(unsigned *seed)
+{
+ return temper(*seed = *seed * 1103515245 + 12345)/2;
+}
diff --git a/libc-top-half/musl/src/prng/random.c b/libc-top-half/musl/src/prng/random.c
new file mode 100644
index 0000000..daac028
--- /dev/null
+++ b/libc-top-half/musl/src/prng/random.c
@@ -0,0 +1,126 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include "lock.h"
+#include "fork_impl.h"
+
+/*
+this code uses the same lagged fibonacci generator as the
+original bsd random implementation except for the seeding
+which was broken in the original
+*/
+
+static uint32_t init[] = {
+0x00000000,0x5851f42d,0xc0b18ccf,0xcbb5f646,
+0xc7033129,0x30705b04,0x20fd5db4,0x9a8b7f78,
+0x502959d8,0xab894868,0x6c0356a7,0x88cdb7ff,
+0xb477d43f,0x70a3a52b,0xa8e4baf1,0xfd8341fc,
+0x8ae16fd9,0x742d2f7a,0x0d1f0796,0x76035e09,
+0x40f7702c,0x6fa72ca5,0xaaa84157,0x58a0df74,
+0xc74a0364,0xae533cc4,0x04185faf,0x6de3b115,
+0x0cab8628,0xf043bfa4,0x398150e9,0x37521657};
+
+static int n = 31;
+static int i = 3;
+static int j = 0;
+static uint32_t *x = init+1;
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+static volatile int lock[1];
+volatile int *const __random_lockptr = lock;
+#endif
+
+static uint32_t lcg31(uint32_t x) {
+ return (1103515245*x + 12345) & 0x7fffffff;
+}
+
+static uint64_t lcg64(uint64_t x) {
+ return 6364136223846793005ull*x + 1;
+}
+
+static void *savestate() {
+ x[-1] = (n<<16)|(i<<8)|j;
+ return x-1;
+}
+
+static void loadstate(uint32_t *state) {
+ x = state+1;
+ n = x[-1]>>16;
+ i = (x[-1]>>8)&0xff;
+ j = x[-1]&0xff;
+}
+
+static void __srandom(unsigned seed) {
+ int k;
+ uint64_t s = seed;
+
+ if (n == 0) {
+ x[0] = s;
+ return;
+ }
+ i = n == 31 || n == 7 ? 3 : 1;
+ j = 0;
+ for (k = 0; k < n; k++) {
+ s = lcg64(s);
+ x[k] = s>>32;
+ }
+ /* make sure x contains at least one odd number */
+ x[0] |= 1;
+}
+
+void srandom(unsigned seed) {
+ LOCK(lock);
+ __srandom(seed);
+ UNLOCK(lock);
+}
+
+char *initstate(unsigned seed, char *state, size_t size) {
+ void *old;
+
+ if (size < 8)
+ return 0;
+ LOCK(lock);
+ old = savestate();
+ if (size < 32)
+ n = 0;
+ else if (size < 64)
+ n = 7;
+ else if (size < 128)
+ n = 15;
+ else if (size < 256)
+ n = 31;
+ else
+ n = 63;
+ x = (uint32_t*)state + 1;
+ __srandom(seed);
+ savestate();
+ UNLOCK(lock);
+ return old;
+}
+
+char *setstate(char *state) {
+ void *old;
+
+ LOCK(lock);
+ old = savestate();
+ loadstate((uint32_t*)state);
+ UNLOCK(lock);
+ return old;
+}
+
+long random(void) {
+ long k;
+
+ LOCK(lock);
+ if (n == 0) {
+ k = x[0] = lcg31(x[0]);
+ goto end;
+ }
+ x[i] += x[j];
+ k = x[i]>>1;
+ if (++i == n)
+ i = 0;
+ if (++j == n)
+ j = 0;
+end:
+ UNLOCK(lock);
+ return k;
+}
diff --git a/libc-top-half/musl/src/prng/seed48.c b/libc-top-half/musl/src/prng/seed48.c
new file mode 100644
index 0000000..bce7b33
--- /dev/null
+++ b/libc-top-half/musl/src/prng/seed48.c
@@ -0,0 +1,11 @@
+#include <stdlib.h>
+#include <string.h>
+#include "rand48.h"
+
+unsigned short *seed48(unsigned short *s)
+{
+ static unsigned short p[3];
+ memcpy(p, __seed48, sizeof p);
+ memcpy(__seed48, s, sizeof p);
+ return p;
+}
diff --git a/libc-top-half/musl/src/prng/srand48.c b/libc-top-half/musl/src/prng/srand48.c
new file mode 100644
index 0000000..0a56f6a
--- /dev/null
+++ b/libc-top-half/musl/src/prng/srand48.c
@@ -0,0 +1,6 @@
+#include <stdlib.h>
+
+void srand48(long seed)
+{
+ seed48((unsigned short [3]){ 0x330e, seed, seed>>16 });
+}
diff --git a/libc-top-half/musl/src/process/_Fork.c b/libc-top-half/musl/src/process/_Fork.c
new file mode 100644
index 0000000..da06386
--- /dev/null
+++ b/libc-top-half/musl/src/process/_Fork.c
@@ -0,0 +1,38 @@
+#include <unistd.h>
+#include <signal.h>
+#include "syscall.h"
+#include "libc.h"
+#include "lock.h"
+#include "pthread_impl.h"
+#include "aio_impl.h"
+
+static void dummy(int x) { }
+weak_alias(dummy, __aio_atfork);
+
+pid_t _Fork(void)
+{
+ pid_t ret;
+ sigset_t set;
+ __block_all_sigs(&set);
+ __aio_atfork(-1);
+ LOCK(__abort_lock);
+#ifdef SYS_fork
+ ret = __syscall(SYS_fork);
+#else
+ ret = __syscall(SYS_clone, SIGCHLD, 0);
+#endif
+ if (!ret) {
+ pthread_t self = __pthread_self();
+ self->tid = __syscall(SYS_gettid);
+ self->robust_list.off = 0;
+ self->robust_list.pending = 0;
+ self->next = self->prev = self;
+ __thread_list_lock = 0;
+ libc.threads_minus_1 = 0;
+ if (libc.need_locks) libc.need_locks = -1;
+ }
+ UNLOCK(__abort_lock);
+ __aio_atfork(!ret);
+ __restore_sigs(&set);
+ return __syscall_ret(ret);
+}
diff --git a/libc-top-half/musl/src/process/arm/vfork.s b/libc-top-half/musl/src/process/arm/vfork.s
new file mode 100644
index 0000000..d7ec41b
--- /dev/null
+++ b/libc-top-half/musl/src/process/arm/vfork.s
@@ -0,0 +1,10 @@
+.syntax unified
+.global vfork
+.type vfork,%function
+vfork:
+ mov ip, r7
+ mov r7, 190
+ svc 0
+ mov r7, ip
+ .hidden __syscall_ret
+ b __syscall_ret
diff --git a/libc-top-half/musl/src/process/execl.c b/libc-top-half/musl/src/process/execl.c
new file mode 100644
index 0000000..5ee5c81
--- /dev/null
+++ b/libc-top-half/musl/src/process/execl.c
@@ -0,0 +1,22 @@
+#include <unistd.h>
+#include <stdarg.h>
+
+int execl(const char *path, const char *argv0, ...)
+{
+ int argc;
+ va_list ap;
+ va_start(ap, argv0);
+ for (argc=1; va_arg(ap, const char *); argc++);
+ va_end(ap);
+ {
+ int i;
+ char *argv[argc+1];
+ va_start(ap, argv0);
+ argv[0] = (char *)argv0;
+ for (i=1; i<argc; i++)
+ argv[i] = va_arg(ap, char *);
+ argv[i] = NULL;
+ va_end(ap);
+ return execv(path, argv);
+ }
+}
diff --git a/libc-top-half/musl/src/process/execle.c b/libc-top-half/musl/src/process/execle.c
new file mode 100644
index 0000000..37ca503
--- /dev/null
+++ b/libc-top-half/musl/src/process/execle.c
@@ -0,0 +1,23 @@
+#include <unistd.h>
+#include <stdarg.h>
+
+int execle(const char *path, const char *argv0, ...)
+{
+ int argc;
+ va_list ap;
+ va_start(ap, argv0);
+ for (argc=1; va_arg(ap, const char *); argc++);
+ va_end(ap);
+ {
+ int i;
+ char *argv[argc+1];
+ char **envp;
+ va_start(ap, argv0);
+ argv[0] = (char *)argv0;
+ for (i=1; i<=argc; i++)
+ argv[i] = va_arg(ap, char *);
+ envp = va_arg(ap, char **);
+ va_end(ap);
+ return execve(path, argv, envp);
+ }
+}
diff --git a/libc-top-half/musl/src/process/execlp.c b/libc-top-half/musl/src/process/execlp.c
new file mode 100644
index 0000000..5eed886
--- /dev/null
+++ b/libc-top-half/musl/src/process/execlp.c
@@ -0,0 +1,22 @@
+#include <unistd.h>
+#include <stdarg.h>
+
+int execlp(const char *file, const char *argv0, ...)
+{
+ int argc;
+ va_list ap;
+ va_start(ap, argv0);
+ for (argc=1; va_arg(ap, const char *); argc++);
+ va_end(ap);
+ {
+ int i;
+ char *argv[argc+1];
+ va_start(ap, argv0);
+ argv[0] = (char *)argv0;
+ for (i=1; i<argc; i++)
+ argv[i] = va_arg(ap, char *);
+ argv[i] = NULL;
+ va_end(ap);
+ return execvp(file, argv);
+ }
+}
diff --git a/libc-top-half/musl/src/process/execv.c b/libc-top-half/musl/src/process/execv.c
new file mode 100644
index 0000000..2ac0dec
--- /dev/null
+++ b/libc-top-half/musl/src/process/execv.c
@@ -0,0 +1,8 @@
+#include <unistd.h>
+
+extern char **__environ;
+
+int execv(const char *path, char *const argv[])
+{
+ return execve(path, argv, __environ);
+}
diff --git a/libc-top-half/musl/src/process/execve.c b/libc-top-half/musl/src/process/execve.c
new file mode 100644
index 0000000..70286a1
--- /dev/null
+++ b/libc-top-half/musl/src/process/execve.c
@@ -0,0 +1,8 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int execve(const char *path, char *const argv[], char *const envp[])
+{
+ /* do we need to use environ if envp is null? */
+ return syscall(SYS_execve, path, argv, envp);
+}
diff --git a/libc-top-half/musl/src/process/execvp.c b/libc-top-half/musl/src/process/execvp.c
new file mode 100644
index 0000000..ef3b9dd
--- /dev/null
+++ b/libc-top-half/musl/src/process/execvp.c
@@ -0,0 +1,60 @@
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <limits.h>
+
+extern char **__environ;
+
+int __execvpe(const char *file, char *const argv[], char *const envp[])
+{
+ const char *p, *z, *path = getenv("PATH");
+ size_t l, k;
+ int seen_eacces = 0;
+
+ errno = ENOENT;
+ if (!*file) return -1;
+
+ if (strchr(file, '/'))
+ return execve(file, argv, envp);
+
+ if (!path) path = "/usr/local/bin:/bin:/usr/bin";
+ k = strnlen(file, NAME_MAX+1);
+ if (k > NAME_MAX) {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+ l = strnlen(path, PATH_MAX-1)+1;
+
+ for(p=path; ; p=z) {
+ char b[l+k+1];
+ z = __strchrnul(p, ':');
+ if (z-p >= l) {
+ if (!*z++) break;
+ continue;
+ }
+ memcpy(b, p, z-p);
+ b[z-p] = '/';
+ memcpy(b+(z-p)+(z>p), file, k+1);
+ execve(b, argv, envp);
+ switch (errno) {
+ case EACCES:
+ seen_eacces = 1;
+ case ENOENT:
+ case ENOTDIR:
+ break;
+ default:
+ return -1;
+ }
+ if (!*z++) break;
+ }
+ if (seen_eacces) errno = EACCES;
+ return -1;
+}
+
+int execvp(const char *file, char *const argv[])
+{
+ return __execvpe(file, argv, __environ);
+}
+
+weak_alias(__execvpe, execvpe);
diff --git a/libc-top-half/musl/src/process/fdop.h b/libc-top-half/musl/src/process/fdop.h
new file mode 100644
index 0000000..7cf733b
--- /dev/null
+++ b/libc-top-half/musl/src/process/fdop.h
@@ -0,0 +1,17 @@
+#define FDOP_CLOSE 1
+#define FDOP_DUP2 2
+#define FDOP_OPEN 3
+#define FDOP_CHDIR 4
+#define FDOP_FCHDIR 5
+
+struct fdop {
+ struct fdop *next, *prev;
+ int cmd, fd, srcfd, oflag;
+ mode_t mode;
+ char path[];
+};
+
+#define malloc __libc_malloc
+#define calloc __libc_calloc
+#define realloc undef
+#define free __libc_free
diff --git a/libc-top-half/musl/src/process/fexecve.c b/libc-top-half/musl/src/process/fexecve.c
new file mode 100644
index 0000000..554c198
--- /dev/null
+++ b/libc-top-half/musl/src/process/fexecve.c
@@ -0,0 +1,16 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int fexecve(int fd, char *const argv[], char *const envp[])
+{
+ int r = __syscall(SYS_execveat, fd, "", argv, envp, AT_EMPTY_PATH);
+ if (r != -ENOSYS) return __syscall_ret(r);
+ char buf[15 + 3*sizeof(int)];
+ __procfdname(buf, fd);
+ execve(buf, argv, envp);
+ if (errno == ENOENT) errno = EBADF;
+ return -1;
+}
diff --git a/libc-top-half/musl/src/process/fork.c b/libc-top-half/musl/src/process/fork.c
new file mode 100644
index 0000000..54bc289
--- /dev/null
+++ b/libc-top-half/musl/src/process/fork.c
@@ -0,0 +1,86 @@
+#include <unistd.h>
+#include <errno.h>
+#include "libc.h"
+#include "lock.h"
+#include "pthread_impl.h"
+#include "fork_impl.h"
+
+static volatile int *const dummy_lockptr = 0;
+
+weak_alias(dummy_lockptr, __at_quick_exit_lockptr);
+weak_alias(dummy_lockptr, __atexit_lockptr);
+weak_alias(dummy_lockptr, __dlerror_lockptr);
+weak_alias(dummy_lockptr, __gettext_lockptr);
+weak_alias(dummy_lockptr, __locale_lockptr);
+weak_alias(dummy_lockptr, __random_lockptr);
+weak_alias(dummy_lockptr, __sem_open_lockptr);
+weak_alias(dummy_lockptr, __stdio_ofl_lockptr);
+weak_alias(dummy_lockptr, __syslog_lockptr);
+weak_alias(dummy_lockptr, __timezone_lockptr);
+weak_alias(dummy_lockptr, __bump_lockptr);
+
+weak_alias(dummy_lockptr, __vmlock_lockptr);
+
+static volatile int *const *const atfork_locks[] = {
+ &__at_quick_exit_lockptr,
+ &__atexit_lockptr,
+ &__dlerror_lockptr,
+ &__gettext_lockptr,
+ &__locale_lockptr,
+ &__random_lockptr,
+ &__sem_open_lockptr,
+ &__stdio_ofl_lockptr,
+ &__syslog_lockptr,
+ &__timezone_lockptr,
+ &__bump_lockptr,
+};
+
+static void dummy(int x) { }
+weak_alias(dummy, __fork_handler);
+weak_alias(dummy, __malloc_atfork);
+weak_alias(dummy, __ldso_atfork);
+
+static void dummy_0(void) { }
+weak_alias(dummy_0, __tl_lock);
+weak_alias(dummy_0, __tl_unlock);
+
+pid_t fork(void)
+{
+ sigset_t set;
+ __fork_handler(-1);
+ __block_app_sigs(&set);
+ int need_locks = libc.need_locks > 0;
+ if (need_locks) {
+ __ldso_atfork(-1);
+ __inhibit_ptc();
+ for (int i=0; i<sizeof atfork_locks/sizeof *atfork_locks; i++)
+ if (*atfork_locks[i]) LOCK(*atfork_locks[i]);
+ __malloc_atfork(-1);
+ __tl_lock();
+ }
+ pthread_t self=__pthread_self(), next=self->next;
+ pid_t ret = _Fork();
+ int errno_save = errno;
+ if (need_locks) {
+ if (!ret) {
+ for (pthread_t td=next; td!=self; td=td->next)
+ td->tid = -1;
+ if (__vmlock_lockptr) {
+ __vmlock_lockptr[0] = 0;
+ __vmlock_lockptr[1] = 0;
+ }
+ }
+ __tl_unlock();
+ __malloc_atfork(!ret);
+ for (int i=0; i<sizeof atfork_locks/sizeof *atfork_locks; i++)
+ if (*atfork_locks[i])
+ if (ret) UNLOCK(*atfork_locks[i]);
+ else **atfork_locks[i] = 0;
+ __release_ptc();
+ __ldso_atfork(!ret);
+ }
+ __restore_sigs(&set);
+ __fork_handler(!ret);
+ if (ret<0) errno = errno_save;
+ return ret;
+}
diff --git a/libc-top-half/musl/src/process/i386/vfork.s b/libc-top-half/musl/src/process/i386/vfork.s
new file mode 100644
index 0000000..3d0e6d6
--- /dev/null
+++ b/libc-top-half/musl/src/process/i386/vfork.s
@@ -0,0 +1,12 @@
+.global vfork
+.type vfork,@function
+vfork:
+ pop %edx
+ mov $190,%eax
+ int $128
+ push %edx
+ push %eax
+ .hidden __syscall_ret
+ call __syscall_ret
+ pop %edx
+ ret
diff --git a/libc-top-half/musl/src/process/posix_spawn.c b/libc-top-half/musl/src/process/posix_spawn.c
new file mode 100644
index 0000000..728551b
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawn.c
@@ -0,0 +1,214 @@
+#define _GNU_SOURCE
+#include <spawn.h>
+#include <sched.h>
+#include <unistd.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <sys/wait.h>
+#include "syscall.h"
+#include "lock.h"
+#include "pthread_impl.h"
+#include "fdop.h"
+
+struct args {
+ int p[2];
+ sigset_t oldmask;
+ const char *path;
+ const posix_spawn_file_actions_t *fa;
+ const posix_spawnattr_t *restrict attr;
+ char *const *argv, *const *envp;
+};
+
+static int __sys_dup2(int old, int new)
+{
+#ifdef SYS_dup2
+ return __syscall(SYS_dup2, old, new);
+#else
+ return __syscall(SYS_dup3, old, new, 0);
+#endif
+}
+
+static int child(void *args_vp)
+{
+ int i, ret;
+ struct sigaction sa = {0};
+ struct args *args = args_vp;
+ int p = args->p[1];
+ const posix_spawn_file_actions_t *fa = args->fa;
+ const posix_spawnattr_t *restrict attr = args->attr;
+ sigset_t hset;
+
+ close(args->p[0]);
+
+ /* All signal dispositions must be either SIG_DFL or SIG_IGN
+ * before signals are unblocked. Otherwise a signal handler
+ * from the parent might get run in the child while sharing
+ * memory, with unpredictable and dangerous results. To
+ * reduce overhead, sigaction has tracked for us which signals
+ * potentially have a signal handler. */
+ __get_handler_set(&hset);
+ for (i=1; i<_NSIG; i++) {
+ if ((attr->__flags & POSIX_SPAWN_SETSIGDEF)
+ && sigismember(&attr->__def, i)) {
+ sa.sa_handler = SIG_DFL;
+ } else if (sigismember(&hset, i)) {
+ if (i-32<3U) {
+ sa.sa_handler = SIG_IGN;
+ } else {
+ __libc_sigaction(i, 0, &sa);
+ if (sa.sa_handler==SIG_IGN) continue;
+ sa.sa_handler = SIG_DFL;
+ }
+ } else {
+ continue;
+ }
+ __libc_sigaction(i, &sa, 0);
+ }
+
+ if (attr->__flags & POSIX_SPAWN_SETSID)
+ if ((ret=__syscall(SYS_setsid)) < 0)
+ goto fail;
+
+ if (attr->__flags & POSIX_SPAWN_SETPGROUP)
+ if ((ret=__syscall(SYS_setpgid, 0, attr->__pgrp)))
+ goto fail;
+
+ /* Use syscalls directly because the library functions attempt
+ * to do a multi-threaded synchronized id-change, which would
+ * trash the parent's state. */
+ if (attr->__flags & POSIX_SPAWN_RESETIDS)
+ if ((ret=__syscall(SYS_setgid, __syscall(SYS_getgid))) ||
+ (ret=__syscall(SYS_setuid, __syscall(SYS_getuid))) )
+ goto fail;
+
+ if (fa && fa->__actions) {
+ struct fdop *op;
+ int fd;
+ for (op = fa->__actions; op->next; op = op->next);
+ for (; op; op = op->prev) {
+ /* It's possible that a file operation would clobber
+ * the pipe fd used for synchronizing with the
+ * parent. To avoid that, we dup the pipe onto
+ * an unoccupied fd. */
+ if (op->fd == p) {
+ ret = __syscall(SYS_dup, p);
+ if (ret < 0) goto fail;
+ __syscall(SYS_close, p);
+ p = ret;
+ }
+ switch(op->cmd) {
+ case FDOP_CLOSE:
+ __syscall(SYS_close, op->fd);
+ break;
+ case FDOP_DUP2:
+ fd = op->srcfd;
+ if (fd == p) {
+ ret = -EBADF;
+ goto fail;
+ }
+ if (fd != op->fd) {
+ if ((ret=__sys_dup2(fd, op->fd))<0)
+ goto fail;
+ } else {
+ ret = __syscall(SYS_fcntl, fd, F_GETFD);
+ ret = __syscall(SYS_fcntl, fd, F_SETFD,
+ ret & ~FD_CLOEXEC);
+ if (ret<0)
+ goto fail;
+ }
+ break;
+ case FDOP_OPEN:
+ fd = __sys_open(op->path, op->oflag, op->mode);
+ if ((ret=fd) < 0) goto fail;
+ if (fd != op->fd) {
+ if ((ret=__sys_dup2(fd, op->fd))<0)
+ goto fail;
+ __syscall(SYS_close, fd);
+ }
+ break;
+ case FDOP_CHDIR:
+ ret = __syscall(SYS_chdir, op->path);
+ if (ret<0) goto fail;
+ break;
+ case FDOP_FCHDIR:
+ ret = __syscall(SYS_fchdir, op->fd);
+ if (ret<0) goto fail;
+ break;
+ }
+ }
+ }
+
+ /* Close-on-exec flag may have been lost if we moved the pipe
+ * to a different fd. We don't use F_DUPFD_CLOEXEC above because
+ * it would fail on older kernels and atomicity is not needed --
+ * in this process there are no threads or signal handlers. */
+ __syscall(SYS_fcntl, p, F_SETFD, FD_CLOEXEC);
+
+ pthread_sigmask(SIG_SETMASK, (attr->__flags & POSIX_SPAWN_SETSIGMASK)
+ ? &attr->__mask : &args->oldmask, 0);
+
+ int (*exec)(const char *, char *const *, char *const *) =
+ attr->__fn ? (int (*)())attr->__fn : execve;
+
+ exec(args->path, args->argv, args->envp);
+ ret = -errno;
+
+fail:
+ /* Since sizeof errno < PIPE_BUF, the write is atomic. */
+ ret = -ret;
+ if (ret) while (__syscall(SYS_write, p, &ret, sizeof ret) < 0);
+ _exit(127);
+}
+
+
+int posix_spawn(pid_t *restrict res, const char *restrict path,
+ const posix_spawn_file_actions_t *fa,
+ const posix_spawnattr_t *restrict attr,
+ char *const argv[restrict], char *const envp[restrict])
+{
+ pid_t pid;
+ char stack[1024+PATH_MAX];
+ int ec=0, cs;
+ struct args args;
+
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
+ args.path = path;
+ args.fa = fa;
+ args.attr = attr ? attr : &(const posix_spawnattr_t){0};
+ args.argv = argv;
+ args.envp = envp;
+ pthread_sigmask(SIG_BLOCK, SIGALL_SET, &args.oldmask);
+
+ /* The lock guards both against seeing a SIGABRT disposition change
+ * by abort and against leaking the pipe fd to fork-without-exec. */
+ LOCK(__abort_lock);
+
+ if (pipe2(args.p, O_CLOEXEC)) {
+ UNLOCK(__abort_lock);
+ ec = errno;
+ goto fail;
+ }
+
+ pid = __clone(child, stack+sizeof stack,
+ CLONE_VM|CLONE_VFORK|SIGCHLD, &args);
+ close(args.p[1]);
+ UNLOCK(__abort_lock);
+
+ if (pid > 0) {
+ if (read(args.p[0], &ec, sizeof ec) != sizeof ec) ec = 0;
+ else waitpid(pid, &(int){0}, 0);
+ } else {
+ ec = -pid;
+ }
+
+ close(args.p[0]);
+
+ if (!ec && res) *res = pid;
+
+fail:
+ pthread_sigmask(SIG_SETMASK, &args.oldmask, 0);
+ pthread_setcancelstate(cs, 0);
+
+ return ec;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawn_file_actions_addchdir.c b/libc-top-half/musl/src/process/posix_spawn_file_actions_addchdir.c
new file mode 100644
index 0000000..7f2590a
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawn_file_actions_addchdir.c
@@ -0,0 +1,18 @@
+#include <spawn.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include "fdop.h"
+
+int posix_spawn_file_actions_addchdir_np(posix_spawn_file_actions_t *restrict fa, const char *restrict path)
+{
+ struct fdop *op = malloc(sizeof *op + strlen(path) + 1);
+ if (!op) return ENOMEM;
+ op->cmd = FDOP_CHDIR;
+ op->fd = -1;
+ strcpy(op->path, path);
+ if ((op->next = fa->__actions)) op->next->prev = op;
+ op->prev = 0;
+ fa->__actions = op;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawn_file_actions_addclose.c b/libc-top-half/musl/src/process/posix_spawn_file_actions_addclose.c
new file mode 100644
index 0000000..0c2ef8f
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawn_file_actions_addclose.c
@@ -0,0 +1,17 @@
+#include <spawn.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "fdop.h"
+
+int posix_spawn_file_actions_addclose(posix_spawn_file_actions_t *fa, int fd)
+{
+ if (fd < 0) return EBADF;
+ struct fdop *op = malloc(sizeof *op);
+ if (!op) return ENOMEM;
+ op->cmd = FDOP_CLOSE;
+ op->fd = fd;
+ if ((op->next = fa->__actions)) op->next->prev = op;
+ op->prev = 0;
+ fa->__actions = op;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawn_file_actions_adddup2.c b/libc-top-half/musl/src/process/posix_spawn_file_actions_adddup2.c
new file mode 100644
index 0000000..addca4d
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawn_file_actions_adddup2.c
@@ -0,0 +1,18 @@
+#include <spawn.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "fdop.h"
+
+int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *fa, int srcfd, int fd)
+{
+ if (srcfd < 0 || fd < 0) return EBADF;
+ struct fdop *op = malloc(sizeof *op);
+ if (!op) return ENOMEM;
+ op->cmd = FDOP_DUP2;
+ op->srcfd = srcfd;
+ op->fd = fd;
+ if ((op->next = fa->__actions)) op->next->prev = op;
+ op->prev = 0;
+ fa->__actions = op;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawn_file_actions_addfchdir.c b/libc-top-half/musl/src/process/posix_spawn_file_actions_addfchdir.c
new file mode 100644
index 0000000..e89ede8
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawn_file_actions_addfchdir.c
@@ -0,0 +1,18 @@
+#include <spawn.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include "fdop.h"
+
+int posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t *fa, int fd)
+{
+ if (fd < 0) return EBADF;
+ struct fdop *op = malloc(sizeof *op);
+ if (!op) return ENOMEM;
+ op->cmd = FDOP_FCHDIR;
+ op->fd = fd;
+ if ((op->next = fa->__actions)) op->next->prev = op;
+ op->prev = 0;
+ fa->__actions = op;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawn_file_actions_addopen.c b/libc-top-half/musl/src/process/posix_spawn_file_actions_addopen.c
new file mode 100644
index 0000000..82bbcec
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawn_file_actions_addopen.c
@@ -0,0 +1,21 @@
+#include <spawn.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include "fdop.h"
+
+int posix_spawn_file_actions_addopen(posix_spawn_file_actions_t *restrict fa, int fd, const char *restrict path, int flags, mode_t mode)
+{
+ if (fd < 0) return EBADF;
+ struct fdop *op = malloc(sizeof *op + strlen(path) + 1);
+ if (!op) return ENOMEM;
+ op->cmd = FDOP_OPEN;
+ op->fd = fd;
+ op->oflag = flags;
+ op->mode = mode;
+ strcpy(op->path, path);
+ if ((op->next = fa->__actions)) op->next->prev = op;
+ op->prev = 0;
+ fa->__actions = op;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawn_file_actions_destroy.c b/libc-top-half/musl/src/process/posix_spawn_file_actions_destroy.c
new file mode 100644
index 0000000..3251bab
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawn_file_actions_destroy.c
@@ -0,0 +1,14 @@
+#include <spawn.h>
+#include <stdlib.h>
+#include "fdop.h"
+
+int posix_spawn_file_actions_destroy(posix_spawn_file_actions_t *fa)
+{
+ struct fdop *op = fa->__actions, *next;
+ while (op) {
+ next = op->next;
+ free(op);
+ op = next;
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawn_file_actions_init.c b/libc-top-half/musl/src/process/posix_spawn_file_actions_init.c
new file mode 100644
index 0000000..89d5e12
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawn_file_actions_init.c
@@ -0,0 +1,7 @@
+#include <spawn.h>
+
+int posix_spawn_file_actions_init(posix_spawn_file_actions_t *fa)
+{
+ fa->__actions = 0;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawnattr_destroy.c b/libc-top-half/musl/src/process/posix_spawnattr_destroy.c
new file mode 100644
index 0000000..fc714a1
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawnattr_destroy.c
@@ -0,0 +1,6 @@
+#include <spawn.h>
+
+int posix_spawnattr_destroy(posix_spawnattr_t *attr)
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawnattr_getflags.c b/libc-top-half/musl/src/process/posix_spawnattr_getflags.c
new file mode 100644
index 0000000..aa635dd
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawnattr_getflags.c
@@ -0,0 +1,7 @@
+#include <spawn.h>
+
+int posix_spawnattr_getflags(const posix_spawnattr_t *restrict attr, short *restrict flags)
+{
+ *flags = attr->__flags;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawnattr_getpgroup.c b/libc-top-half/musl/src/process/posix_spawnattr_getpgroup.c
new file mode 100644
index 0000000..0480527
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawnattr_getpgroup.c
@@ -0,0 +1,7 @@
+#include <spawn.h>
+
+int posix_spawnattr_getpgroup(const posix_spawnattr_t *restrict attr, pid_t *restrict pgrp)
+{
+ *pgrp = attr->__pgrp;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawnattr_getsigdefault.c b/libc-top-half/musl/src/process/posix_spawnattr_getsigdefault.c
new file mode 100644
index 0000000..a49050a
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawnattr_getsigdefault.c
@@ -0,0 +1,7 @@
+#include <spawn.h>
+
+int posix_spawnattr_getsigdefault(const posix_spawnattr_t *restrict attr, sigset_t *restrict def)
+{
+ *def = attr->__def;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawnattr_getsigmask.c b/libc-top-half/musl/src/process/posix_spawnattr_getsigmask.c
new file mode 100644
index 0000000..f60ad7f
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawnattr_getsigmask.c
@@ -0,0 +1,7 @@
+#include <spawn.h>
+
+int posix_spawnattr_getsigmask(const posix_spawnattr_t *restrict attr, sigset_t *restrict mask)
+{
+ *mask = attr->__mask;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawnattr_init.c b/libc-top-half/musl/src/process/posix_spawnattr_init.c
new file mode 100644
index 0000000..0dcd868
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawnattr_init.c
@@ -0,0 +1,7 @@
+#include <spawn.h>
+
+int posix_spawnattr_init(posix_spawnattr_t *attr)
+{
+ *attr = (posix_spawnattr_t){ 0 };
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawnattr_sched.c b/libc-top-half/musl/src/process/posix_spawnattr_sched.c
new file mode 100644
index 0000000..3143635
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawnattr_sched.c
@@ -0,0 +1,25 @@
+#include <spawn.h>
+#include <sched.h>
+#include <errno.h>
+
+int posix_spawnattr_getschedparam(const posix_spawnattr_t *restrict attr,
+ struct sched_param *restrict schedparam)
+{
+ return ENOSYS;
+}
+
+int posix_spawnattr_setschedparam(posix_spawnattr_t *restrict attr,
+ const struct sched_param *restrict schedparam)
+{
+ return ENOSYS;
+}
+
+int posix_spawnattr_getschedpolicy(const posix_spawnattr_t *restrict attr, int *restrict policy)
+{
+ return ENOSYS;
+}
+
+int posix_spawnattr_setschedpolicy(posix_spawnattr_t *attr, int policy)
+{
+ return ENOSYS;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawnattr_setflags.c b/libc-top-half/musl/src/process/posix_spawnattr_setflags.c
new file mode 100644
index 0000000..6878099
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawnattr_setflags.c
@@ -0,0 +1,18 @@
+#include <spawn.h>
+#include <errno.h>
+
+int posix_spawnattr_setflags(posix_spawnattr_t *attr, short flags)
+{
+ const unsigned all_flags =
+ POSIX_SPAWN_RESETIDS |
+ POSIX_SPAWN_SETPGROUP |
+ POSIX_SPAWN_SETSIGDEF |
+ POSIX_SPAWN_SETSIGMASK |
+ POSIX_SPAWN_SETSCHEDPARAM |
+ POSIX_SPAWN_SETSCHEDULER |
+ POSIX_SPAWN_USEVFORK |
+ POSIX_SPAWN_SETSID;
+ if (flags & ~all_flags) return EINVAL;
+ attr->__flags = flags;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawnattr_setpgroup.c b/libc-top-half/musl/src/process/posix_spawnattr_setpgroup.c
new file mode 100644
index 0000000..f39596a
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawnattr_setpgroup.c
@@ -0,0 +1,7 @@
+#include <spawn.h>
+
+int posix_spawnattr_setpgroup(posix_spawnattr_t *attr, pid_t pgrp)
+{
+ attr->__pgrp = pgrp;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawnattr_setsigdefault.c b/libc-top-half/musl/src/process/posix_spawnattr_setsigdefault.c
new file mode 100644
index 0000000..5686972
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawnattr_setsigdefault.c
@@ -0,0 +1,7 @@
+#include <spawn.h>
+
+int posix_spawnattr_setsigdefault(posix_spawnattr_t *restrict attr, const sigset_t *restrict def)
+{
+ attr->__def = *def;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawnattr_setsigmask.c b/libc-top-half/musl/src/process/posix_spawnattr_setsigmask.c
new file mode 100644
index 0000000..f2532f8
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawnattr_setsigmask.c
@@ -0,0 +1,7 @@
+#include <spawn.h>
+
+int posix_spawnattr_setsigmask(posix_spawnattr_t *restrict attr, const sigset_t *restrict mask)
+{
+ attr->__mask = *mask;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/process/posix_spawnp.c b/libc-top-half/musl/src/process/posix_spawnp.c
new file mode 100644
index 0000000..aad6133
--- /dev/null
+++ b/libc-top-half/musl/src/process/posix_spawnp.c
@@ -0,0 +1,13 @@
+#include <spawn.h>
+#include <unistd.h>
+
+int posix_spawnp(pid_t *restrict res, const char *restrict file,
+ const posix_spawn_file_actions_t *fa,
+ const posix_spawnattr_t *restrict attr,
+ char *const argv[restrict], char *const envp[restrict])
+{
+ posix_spawnattr_t spawnp_attr = { 0 };
+ if (attr) spawnp_attr = *attr;
+ spawnp_attr.__fn = (void *)__execvpe;
+ return posix_spawn(res, file, fa, &spawnp_attr, argv, envp);
+}
diff --git a/libc-top-half/musl/src/process/s390x/vfork.s b/libc-top-half/musl/src/process/s390x/vfork.s
new file mode 100644
index 0000000..744f9d7
--- /dev/null
+++ b/libc-top-half/musl/src/process/s390x/vfork.s
@@ -0,0 +1,6 @@
+ .global vfork
+ .type vfork,%function
+vfork:
+ svc 190
+ .hidden __syscall_ret
+ jg __syscall_ret
diff --git a/libc-top-half/musl/src/process/sh/vfork.s b/libc-top-half/musl/src/process/sh/vfork.s
new file mode 100644
index 0000000..91dbde7
--- /dev/null
+++ b/libc-top-half/musl/src/process/sh/vfork.s
@@ -0,0 +1,20 @@
+.global vfork
+.type vfork,@function
+vfork:
+ mov #95, r3
+ add r3, r3
+
+ trapa #31
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+
+ mov r0, r4
+ mov.l 1f, r0
+2: braf r0
+ nop
+ .align 2
+ .hidden __syscall_ret
+1: .long __syscall_ret@PLT-(2b+4-.)
diff --git a/libc-top-half/musl/src/process/system.c b/libc-top-half/musl/src/process/system.c
new file mode 100644
index 0000000..5af59b8
--- /dev/null
+++ b/libc-top-half/musl/src/process/system.c
@@ -0,0 +1,46 @@
+#include <unistd.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <sys/wait.h>
+#include <spawn.h>
+#include <errno.h>
+#include "pthread_impl.h"
+
+extern char **__environ;
+
+int system(const char *cmd)
+{
+ pid_t pid;
+ sigset_t old, reset;
+ struct sigaction sa = { .sa_handler = SIG_IGN }, oldint, oldquit;
+ int status = -1, ret;
+ posix_spawnattr_t attr;
+
+ pthread_testcancel();
+
+ if (!cmd) return 1;
+
+ sigaction(SIGINT, &sa, &oldint);
+ sigaction(SIGQUIT, &sa, &oldquit);
+ sigaddset(&sa.sa_mask, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &sa.sa_mask, &old);
+
+ sigemptyset(&reset);
+ if (oldint.sa_handler != SIG_IGN) sigaddset(&reset, SIGINT);
+ if (oldquit.sa_handler != SIG_IGN) sigaddset(&reset, SIGQUIT);
+ posix_spawnattr_init(&attr);
+ posix_spawnattr_setsigmask(&attr, &old);
+ posix_spawnattr_setsigdefault(&attr, &reset);
+ posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSIGDEF|POSIX_SPAWN_SETSIGMASK);
+ ret = posix_spawn(&pid, "/bin/sh", 0, &attr,
+ (char *[]){"sh", "-c", (char *)cmd, 0}, __environ);
+ posix_spawnattr_destroy(&attr);
+
+ if (!ret) while (waitpid(pid, &status, 0)<0 && errno == EINTR);
+ sigaction(SIGINT, &oldint, NULL);
+ sigaction(SIGQUIT, &oldquit, NULL);
+ sigprocmask(SIG_SETMASK, &old, NULL);
+
+ if (ret) errno = ret;
+ return status;
+}
diff --git a/libc-top-half/musl/src/process/vfork.c b/libc-top-half/musl/src/process/vfork.c
new file mode 100644
index 0000000..d430c13
--- /dev/null
+++ b/libc-top-half/musl/src/process/vfork.c
@@ -0,0 +1,14 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <signal.h>
+#include "syscall.h"
+
+pid_t vfork(void)
+{
+ /* vfork syscall cannot be made from C code */
+#ifdef SYS_fork
+ return syscall(SYS_fork);
+#else
+ return syscall(SYS_clone, SIGCHLD, 0);
+#endif
+}
diff --git a/libc-top-half/musl/src/process/wait.c b/libc-top-half/musl/src/process/wait.c
new file mode 100644
index 0000000..34da102
--- /dev/null
+++ b/libc-top-half/musl/src/process/wait.c
@@ -0,0 +1,6 @@
+#include <sys/wait.h>
+
+pid_t wait(int *status)
+{
+ return waitpid((pid_t)-1, status, 0);
+}
diff --git a/libc-top-half/musl/src/process/waitid.c b/libc-top-half/musl/src/process/waitid.c
new file mode 100644
index 0000000..d688650
--- /dev/null
+++ b/libc-top-half/musl/src/process/waitid.c
@@ -0,0 +1,7 @@
+#include <sys/wait.h>
+#include "syscall.h"
+
+int waitid(idtype_t type, id_t id, siginfo_t *info, int options)
+{
+ return syscall_cp(SYS_waitid, type, id, info, options, 0);
+}
diff --git a/libc-top-half/musl/src/process/waitpid.c b/libc-top-half/musl/src/process/waitpid.c
new file mode 100644
index 0000000..1b65bf0
--- /dev/null
+++ b/libc-top-half/musl/src/process/waitpid.c
@@ -0,0 +1,7 @@
+#include <sys/wait.h>
+#include "syscall.h"
+
+pid_t waitpid(pid_t pid, int *status, int options)
+{
+ return syscall_cp(SYS_wait4, pid, status, options, 0);
+}
diff --git a/libc-top-half/musl/src/process/x32/vfork.s b/libc-top-half/musl/src/process/x32/vfork.s
new file mode 100644
index 0000000..0f0ca3e
--- /dev/null
+++ b/libc-top-half/musl/src/process/x32/vfork.s
@@ -0,0 +1,10 @@
+.global vfork
+.type vfork,@function
+vfork:
+ pop %rdx
+ mov $0x4000003a,%eax /* SYS_vfork */
+ syscall
+ push %rdx
+ mov %rax,%rdi
+ .hidden __syscall_ret
+ jmp __syscall_ret
diff --git a/libc-top-half/musl/src/process/x86_64/vfork.s b/libc-top-half/musl/src/process/x86_64/vfork.s
new file mode 100644
index 0000000..9114439
--- /dev/null
+++ b/libc-top-half/musl/src/process/x86_64/vfork.s
@@ -0,0 +1,10 @@
+.global vfork
+.type vfork,@function
+vfork:
+ pop %rdx
+ mov $58,%eax
+ syscall
+ push %rdx
+ mov %rax,%rdi
+ .hidden __syscall_ret
+ jmp __syscall_ret
diff --git a/libc-top-half/musl/src/regex/fnmatch.c b/libc-top-half/musl/src/regex/fnmatch.c
new file mode 100644
index 0000000..978fff8
--- /dev/null
+++ b/libc-top-half/musl/src/regex/fnmatch.c
@@ -0,0 +1,321 @@
+/*
+ * An implementation of what I call the "Sea of Stars" algorithm for
+ * POSIX fnmatch(). The basic idea is that we factor the pattern into
+ * a head component (which we match first and can reject without ever
+ * measuring the length of the string), an optional tail component
+ * (which only exists if the pattern contains at least one star), and
+ * an optional "sea of stars", a set of star-separated components
+ * between the head and tail. After the head and tail matches have
+ * been removed from the input string, the components in the "sea of
+ * stars" are matched sequentially by searching for their first
+ * occurrence past the end of the previous match.
+ *
+ * - Rich Felker, April 2012
+ */
+
+#include <string.h>
+#include <fnmatch.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <wctype.h>
+#include "locale_impl.h"
+
+#define END 0
+#define UNMATCHABLE -2
+#define BRACKET -3
+#define QUESTION -4
+#define STAR -5
+
+static int str_next(const char *str, size_t n, size_t *step)
+{
+ if (!n) {
+ *step = 0;
+ return 0;
+ }
+ if (str[0] >= 128U) {
+ wchar_t wc;
+ int k = mbtowc(&wc, str, n);
+ if (k<0) {
+ *step = 1;
+ return -1;
+ }
+ *step = k;
+ return wc;
+ }
+ *step = 1;
+ return str[0];
+}
+
+static int pat_next(const char *pat, size_t m, size_t *step, int flags)
+{
+ int esc = 0;
+ if (!m || !*pat) {
+ *step = 0;
+ return END;
+ }
+ *step = 1;
+ if (pat[0]=='\\' && pat[1] && !(flags & FNM_NOESCAPE)) {
+ *step = 2;
+ pat++;
+ esc = 1;
+ goto escaped;
+ }
+ if (pat[0]=='[') {
+ size_t k = 1;
+ if (k<m) if (pat[k] == '^' || pat[k] == '!') k++;
+ if (k<m) if (pat[k] == ']') k++;
+ for (; k<m && pat[k] && pat[k]!=']'; k++) {
+ if (k+1<m && pat[k+1] && pat[k]=='[' && (pat[k+1]==':' || pat[k+1]=='.' || pat[k+1]=='=')) {
+ int z = pat[k+1];
+ k+=2;
+ if (k<m && pat[k]) k++;
+ while (k<m && pat[k] && (pat[k-1]!=z || pat[k]!=']')) k++;
+ if (k==m || !pat[k]) break;
+ }
+ }
+ if (k==m || !pat[k]) {
+ *step = 1;
+ return '[';
+ }
+ *step = k+1;
+ return BRACKET;
+ }
+ if (pat[0] == '*')
+ return STAR;
+ if (pat[0] == '?')
+ return QUESTION;
+escaped:
+ if (pat[0] >= 128U) {
+ wchar_t wc;
+ int k = mbtowc(&wc, pat, m);
+ if (k<0) {
+ *step = 0;
+ return UNMATCHABLE;
+ }
+ *step = k + esc;
+ return wc;
+ }
+ return pat[0];
+}
+
+static int casefold(int k)
+{
+ int c = towupper(k);
+ return c == k ? towlower(k) : c;
+}
+
+static int match_bracket(const char *p, int k, int kfold)
+{
+ wchar_t wc;
+ int inv = 0;
+ p++;
+ if (*p=='^' || *p=='!') {
+ inv = 1;
+ p++;
+ }
+ if (*p==']') {
+ if (k==']') return !inv;
+ p++;
+ } else if (*p=='-') {
+ if (k=='-') return !inv;
+ p++;
+ }
+ wc = p[-1];
+ for (; *p != ']'; p++) {
+ if (p[0]=='-' && p[1]!=']') {
+ wchar_t wc2;
+ int l = mbtowc(&wc2, p+1, 4);
+ if (l < 0) return 0;
+ if (wc <= wc2)
+ if ((unsigned)k-wc <= wc2-wc ||
+ (unsigned)kfold-wc <= wc2-wc)
+ return !inv;
+ p += l-1;
+ continue;
+ }
+ if (p[0]=='[' && (p[1]==':' || p[1]=='.' || p[1]=='=')) {
+ const char *p0 = p+2;
+ int z = p[1];
+ p+=3;
+ while (p[-1]!=z || p[0]!=']') p++;
+ if (z == ':' && p-1-p0 < 16) {
+ char buf[16];
+ memcpy(buf, p0, p-1-p0);
+ buf[p-1-p0] = 0;
+ if (iswctype(k, wctype(buf)) ||
+ iswctype(kfold, wctype(buf)))
+ return !inv;
+ }
+ continue;
+ }
+ if (*p < 128U) {
+ wc = (unsigned char)*p;
+ } else {
+ int l = mbtowc(&wc, p, 4);
+ if (l < 0) return 0;
+ p += l-1;
+ }
+ if (wc==k || wc==kfold) return !inv;
+ }
+ return inv;
+}
+
+static int fnmatch_internal(const char *pat, size_t m, const char *str, size_t n, int flags)
+{
+ const char *p, *ptail, *endpat;
+ const char *s, *stail, *endstr;
+ size_t pinc, sinc, tailcnt=0;
+ int c, k, kfold;
+
+ if (flags & FNM_PERIOD) {
+ if (*str == '.' && *pat != '.')
+ return FNM_NOMATCH;
+ }
+ for (;;) {
+ switch ((c = pat_next(pat, m, &pinc, flags))) {
+ case UNMATCHABLE:
+ return FNM_NOMATCH;
+ case STAR:
+ pat++;
+ m--;
+ break;
+ default:
+ k = str_next(str, n, &sinc);
+ if (k <= 0)
+ return (c==END) ? 0 : FNM_NOMATCH;
+ str += sinc;
+ n -= sinc;
+ kfold = flags & FNM_CASEFOLD ? casefold(k) : k;
+ if (c == BRACKET) {
+ if (!match_bracket(pat, k, kfold))
+ return FNM_NOMATCH;
+ } else if (c != QUESTION && k != c && kfold != c) {
+ return FNM_NOMATCH;
+ }
+ pat+=pinc;
+ m-=pinc;
+ continue;
+ }
+ break;
+ }
+
+ /* Compute real pat length if it was initially unknown/-1 */
+ m = strnlen(pat, m);
+ endpat = pat + m;
+
+ /* Find the last * in pat and count chars needed after it */
+ for (p=ptail=pat; p<endpat; p+=pinc) {
+ switch (pat_next(p, endpat-p, &pinc, flags)) {
+ case UNMATCHABLE:
+ return FNM_NOMATCH;
+ case STAR:
+ tailcnt=0;
+ ptail = p+1;
+ break;
+ default:
+ tailcnt++;
+ break;
+ }
+ }
+
+ /* Past this point we need not check for UNMATCHABLE in pat,
+ * because all of pat has already been parsed once. */
+
+ /* Compute real str length if it was initially unknown/-1 */
+ n = strnlen(str, n);
+ endstr = str + n;
+ if (n < tailcnt) return FNM_NOMATCH;
+
+ /* Find the final tailcnt chars of str, accounting for UTF-8.
+ * On illegal sequences we may get it wrong, but in that case
+ * we necessarily have a matching failure anyway. */
+ for (s=endstr; s>str && tailcnt; tailcnt--) {
+ if (s[-1] < 128U || MB_CUR_MAX==1) s--;
+ else while ((unsigned char)*--s-0x80U<0x40 && s>str);
+ }
+ if (tailcnt) return FNM_NOMATCH;
+ stail = s;
+
+ /* Check that the pat and str tails match */
+ p = ptail;
+ for (;;) {
+ c = pat_next(p, endpat-p, &pinc, flags);
+ p += pinc;
+ if ((k = str_next(s, endstr-s, &sinc)) <= 0) {
+ if (c != END) return FNM_NOMATCH;
+ break;
+ }
+ s += sinc;
+ kfold = flags & FNM_CASEFOLD ? casefold(k) : k;
+ if (c == BRACKET) {
+ if (!match_bracket(p-pinc, k, kfold))
+ return FNM_NOMATCH;
+ } else if (c != QUESTION && k != c && kfold != c) {
+ return FNM_NOMATCH;
+ }
+ }
+
+ /* We're all done with the tails now, so throw them out */
+ endstr = stail;
+ endpat = ptail;
+
+ /* Match pattern components until there are none left */
+ while (pat<endpat) {
+ p = pat;
+ s = str;
+ for (;;) {
+ c = pat_next(p, endpat-p, &pinc, flags);
+ p += pinc;
+ /* Encountering * completes/commits a component */
+ if (c == STAR) {
+ pat = p;
+ str = s;
+ break;
+ }
+ k = str_next(s, endstr-s, &sinc);
+ if (!k)
+ return FNM_NOMATCH;
+ kfold = flags & FNM_CASEFOLD ? casefold(k) : k;
+ if (c == BRACKET) {
+ if (!match_bracket(p-pinc, k, kfold))
+ break;
+ } else if (c != QUESTION && k != c && kfold != c) {
+ break;
+ }
+ s += sinc;
+ }
+ if (c == STAR) continue;
+ /* If we failed, advance str, by 1 char if it's a valid
+ * char, or past all invalid bytes otherwise. */
+ k = str_next(str, endstr-str, &sinc);
+ if (k > 0) str += sinc;
+ else for (str++; str_next(str, endstr-str, &sinc)<0; str++);
+ }
+
+ return 0;
+}
+
+int fnmatch(const char *pat, const char *str, int flags)
+{
+ const char *s, *p;
+ size_t inc;
+ int c;
+ if (flags & FNM_PATHNAME) for (;;) {
+ for (s=str; *s && *s!='/'; s++);
+ for (p=pat; (c=pat_next(p, -1, &inc, flags))!=END && c!='/'; p+=inc);
+ if (c!=*s && (!*s || !(flags & FNM_LEADING_DIR)))
+ return FNM_NOMATCH;
+ if (fnmatch_internal(pat, p-pat, str, s-str, flags))
+ return FNM_NOMATCH;
+ if (!c) return 0;
+ str = s+1;
+ pat = p+inc;
+ } else if (flags & FNM_LEADING_DIR) {
+ for (s=str; *s; s++) {
+ if (*s != '/') continue;
+ if (!fnmatch_internal(pat, -1, str, s-str, flags))
+ return 0;
+ }
+ }
+ return fnmatch_internal(pat, -1, str, -1, flags);
+}
diff --git a/libc-top-half/musl/src/regex/glob.c b/libc-top-half/musl/src/regex/glob.c
new file mode 100644
index 0000000..78063a4
--- /dev/null
+++ b/libc-top-half/musl/src/regex/glob.c
@@ -0,0 +1,317 @@
+#define _BSD_SOURCE
+#include <glob.h>
+#include <fnmatch.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <limits.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stddef.h>
+#include <unistd.h>
+#ifdef __wasilibc_unmodified_upstream // WASI has no usernames
+#include <pwd.h>
+#endif
+
+struct match
+{
+ struct match *next;
+ char name[];
+};
+
+static int append(struct match **tail, const char *name, size_t len, int mark)
+{
+ struct match *new = malloc(sizeof(struct match) + len + 2);
+ if (!new) return -1;
+ (*tail)->next = new;
+ new->next = NULL;
+ memcpy(new->name, name, len+1);
+ if (mark && len && name[len-1]!='/') {
+ new->name[len] = '/';
+ new->name[len+1] = 0;
+ }
+ *tail = new;
+ return 0;
+}
+
+static int do_glob(char *buf, size_t pos, int type, char *pat, int flags, int (*errfunc)(const char *path, int err), struct match **tail)
+{
+ /* If GLOB_MARK is unused, we don't care about type. */
+ if (!type && !(flags & GLOB_MARK)) type = DT_REG;
+
+ /* Special-case the remaining pattern being all slashes, in
+ * which case we can use caller-passed type if it's a dir. */
+ if (*pat && type!=DT_DIR) type = 0;
+ while (pos+1 < PATH_MAX && *pat=='/') buf[pos++] = *pat++;
+
+ /* Consume maximal [escaped-]literal prefix of pattern, copying
+ * and un-escaping it to the running buffer as we go. */
+ ptrdiff_t i=0, j=0;
+ int in_bracket = 0, overflow = 0;
+ for (; pat[i]!='*' && pat[i]!='?' && (!in_bracket || pat[i]!=']'); i++) {
+ if (!pat[i]) {
+ if (overflow) return 0;
+ pat += i;
+ pos += j;
+ i = j = 0;
+ break;
+ } else if (pat[i] == '[') {
+ in_bracket = 1;
+ } else if (pat[i] == '\\' && !(flags & GLOB_NOESCAPE)) {
+ /* Backslashes inside a bracket are (at least by
+ * our interpretation) non-special, so if next
+ * char is ']' we have a complete expression. */
+ if (in_bracket && pat[i+1]==']') break;
+ /* Unpaired final backslash never matches. */
+ if (!pat[i+1]) return 0;
+ i++;
+ }
+ if (pat[i] == '/') {
+ if (overflow) return 0;
+ in_bracket = 0;
+ pat += i+1;
+ i = -1;
+ pos += j+1;
+ j = -1;
+ }
+ /* Only store a character if it fits in the buffer, but if
+ * a potential bracket expression is open, the overflow
+ * must be remembered and handled later only if the bracket
+ * is unterminated (and thereby a literal), so as not to
+ * disallow long bracket expressions with short matches. */
+ if (pos+(j+1) < PATH_MAX) {
+ buf[pos+j++] = pat[i];
+ } else if (in_bracket) {
+ overflow = 1;
+ } else {
+ return 0;
+ }
+ /* If we consume any new components, the caller-passed type
+ * or dummy type from above is no longer valid. */
+ type = 0;
+ }
+ buf[pos] = 0;
+ if (!*pat) {
+ /* If we consumed any components above, or if GLOB_MARK is
+ * requested and we don't yet know if the match is a dir,
+ * we must confirm the file exists and/or determine its type.
+ *
+ * If marking dirs, symlink type is inconclusive; we need the
+ * type for the symlink target, and therefore must try stat
+ * first unless type is known not to be a symlink. Otherwise,
+ * or if that fails, use lstat for determining existence to
+ * avoid false negatives in the case of broken symlinks. */
+ struct stat st;
+ if ((flags & GLOB_MARK) && (!type||type==DT_LNK) && !stat(buf, &st)) {
+ if (S_ISDIR(st.st_mode)) type = DT_DIR;
+ else type = DT_REG;
+ }
+ if (!type && lstat(buf, &st)) {
+ if (errno!=ENOENT && (errfunc(buf, errno) || (flags & GLOB_ERR)))
+ return GLOB_ABORTED;
+ return 0;
+ }
+ if (append(tail, buf, pos, (flags & GLOB_MARK) && type==DT_DIR))
+ return GLOB_NOSPACE;
+ return 0;
+ }
+ char *p2 = strchr(pat, '/'), saved_sep = '/';
+ /* Check if the '/' was escaped and, if so, remove the escape char
+ * so that it will not be unpaired when passed to fnmatch. */
+ if (p2 && !(flags & GLOB_NOESCAPE)) {
+ char *p;
+ for (p=p2; p>pat && p[-1]=='\\'; p--);
+ if ((p2-p)%2) {
+ p2--;
+ saved_sep = '\\';
+ }
+ }
+ DIR *dir = opendir(pos ? buf : ".");
+ if (!dir) {
+ if (errfunc(buf, errno) || (flags & GLOB_ERR))
+ return GLOB_ABORTED;
+ return 0;
+ }
+ int old_errno = errno;
+ struct dirent *de;
+ while (errno=0, de=readdir(dir)) {
+ /* Quickly skip non-directories when there's pattern left. */
+ if (p2 && de->d_type && de->d_type!=DT_DIR && de->d_type!=DT_LNK)
+ continue;
+
+ size_t l = strlen(de->d_name);
+ if (l >= PATH_MAX-pos) continue;
+
+ if (p2) *p2 = 0;
+
+ int fnm_flags= ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
+ | ((!(flags & GLOB_PERIOD)) ? FNM_PERIOD : 0);
+
+ if (fnmatch(pat, de->d_name, fnm_flags))
+ continue;
+
+ /* With GLOB_PERIOD, don't allow matching . or .. unless
+ * fnmatch would match them with FNM_PERIOD rules in effect. */
+ if (p2 && (flags & GLOB_PERIOD) && de->d_name[0]=='.'
+ && (!de->d_name[1] || de->d_name[1]=='.' && !de->d_name[2])
+ && fnmatch(pat, de->d_name, fnm_flags | FNM_PERIOD))
+ continue;
+
+ memcpy(buf+pos, de->d_name, l+1);
+ if (p2) *p2 = saved_sep;
+ int r = do_glob(buf, pos+l, de->d_type, p2 ? p2 : "", flags, errfunc, tail);
+ if (r) {
+ closedir(dir);
+ return r;
+ }
+ }
+ int readerr = errno;
+ if (p2) *p2 = saved_sep;
+ closedir(dir);
+ if (readerr && (errfunc(buf, errno) || (flags & GLOB_ERR)))
+ return GLOB_ABORTED;
+ errno = old_errno;
+ return 0;
+}
+
+static int ignore_err(const char *path, int err)
+{
+ return 0;
+}
+
+static void freelist(struct match *head)
+{
+ struct match *match, *next;
+ for (match=head->next; match; match=next) {
+ next = match->next;
+ free(match);
+ }
+}
+
+static int sort(const void *a, const void *b)
+{
+ return strcmp(*(const char **)a, *(const char **)b);
+}
+
+#ifdef __wasilibc_unmodified_upstream // WASI has no usernames
+static int expand_tilde(char **pat, char *buf, size_t *pos)
+{
+ char *p = *pat + 1;
+ size_t i = 0;
+
+ char delim, *name_end = __strchrnul(p, '/');
+ if ((delim = *name_end)) *name_end++ = 0;
+ *pat = name_end;
+
+ char *home = *p ? NULL : getenv("HOME");
+ if (!home) {
+ struct passwd pw, *res;
+ switch (*p ? getpwnam_r(p, &pw, buf, PATH_MAX, &res)
+ : getpwuid_r(getuid(), &pw, buf, PATH_MAX, &res)) {
+ case ENOMEM:
+ return GLOB_NOSPACE;
+ case 0:
+ if (!res)
+ default:
+ return GLOB_NOMATCH;
+ }
+ home = pw.pw_dir;
+ }
+ while (i < PATH_MAX - 2 && *home)
+ buf[i++] = *home++;
+ if (*home)
+ return GLOB_NOMATCH;
+ if ((buf[i] = delim))
+ buf[++i] = 0;
+ *pos = i;
+ return 0;
+}
+#endif
+
+int glob(const char *restrict pat, int flags, int (*errfunc)(const char *path, int err), glob_t *restrict g)
+{
+ struct match head = { .next = NULL }, *tail = &head;
+ size_t cnt, i;
+ size_t offs = (flags & GLOB_DOOFFS) ? g->gl_offs : 0;
+ int error = 0;
+ char buf[PATH_MAX];
+
+ if (!errfunc) errfunc = ignore_err;
+
+ if (!(flags & GLOB_APPEND)) {
+ g->gl_offs = offs;
+ g->gl_pathc = 0;
+ g->gl_pathv = NULL;
+ }
+
+ if (*pat) {
+ char *p = strdup(pat);
+ if (!p) return GLOB_NOSPACE;
+ buf[0] = 0;
+ size_t pos = 0;
+ char *s = p;
+#ifdef __wasilibc_unmodified_upstream // WASI has no usernames
+ if ((flags & (GLOB_TILDE | GLOB_TILDE_CHECK)) && *p == '~')
+ error = expand_tilde(&s, buf, &pos);
+#endif
+ if (!error)
+ error = do_glob(buf, pos, 0, s, flags, errfunc, &tail);
+ free(p);
+ }
+
+ if (error == GLOB_NOSPACE) {
+ freelist(&head);
+ return error;
+ }
+
+ for (cnt=0, tail=head.next; tail; tail=tail->next, cnt++);
+ if (!cnt) {
+ if (flags & GLOB_NOCHECK) {
+ tail = &head;
+ if (append(&tail, pat, strlen(pat), 0))
+ return GLOB_NOSPACE;
+ cnt++;
+ } else
+ return GLOB_NOMATCH;
+ }
+
+ if (flags & GLOB_APPEND) {
+ char **pathv = realloc(g->gl_pathv, (offs + g->gl_pathc + cnt + 1) * sizeof(char *));
+ if (!pathv) {
+ freelist(&head);
+ return GLOB_NOSPACE;
+ }
+ g->gl_pathv = pathv;
+ offs += g->gl_pathc;
+ } else {
+ g->gl_pathv = malloc((offs + cnt + 1) * sizeof(char *));
+ if (!g->gl_pathv) {
+ freelist(&head);
+ return GLOB_NOSPACE;
+ }
+ for (i=0; i<offs; i++)
+ g->gl_pathv[i] = NULL;
+ }
+ for (i=0, tail=head.next; i<cnt; tail=tail->next, i++)
+ g->gl_pathv[offs + i] = tail->name;
+ g->gl_pathv[offs + i] = NULL;
+ g->gl_pathc += cnt;
+
+ if (!(flags & GLOB_NOSORT))
+ qsort(g->gl_pathv+offs, cnt, sizeof(char *), sort);
+
+ return error;
+}
+
+void globfree(glob_t *g)
+{
+ size_t i;
+ for (i=0; i<g->gl_pathc; i++)
+ free(g->gl_pathv[g->gl_offs + i] - offsetof(struct match, name));
+ free(g->gl_pathv);
+ g->gl_pathc = 0;
+ g->gl_pathv = NULL;
+}
+
+weak_alias(glob, glob64);
+weak_alias(globfree, globfree64);
diff --git a/libc-top-half/musl/src/regex/regcomp.c b/libc-top-half/musl/src/regex/regcomp.c
new file mode 100644
index 0000000..fb24556
--- /dev/null
+++ b/libc-top-half/musl/src/regex/regcomp.c
@@ -0,0 +1,2953 @@
+/*
+ regcomp.c - TRE POSIX compatible regex compilation functions.
+
+ Copyright (c) 2001-2009 Ville Laurikari <vl@iki.fi>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+#include <string.h>
+#include <stdlib.h>
+#include <regex.h>
+#include <limits.h>
+#include <stdint.h>
+#include <ctype.h>
+
+#include "tre.h"
+
+#include <assert.h>
+
+/***********************************************************************
+ from tre-compile.h
+***********************************************************************/
+
+typedef struct {
+ int position;
+ int code_min;
+ int code_max;
+ int *tags;
+ int assertions;
+ tre_ctype_t class;
+ tre_ctype_t *neg_classes;
+ int backref;
+} tre_pos_and_tags_t;
+
+
+/***********************************************************************
+ from tre-ast.c and tre-ast.h
+***********************************************************************/
+
+/* The different AST node types. */
+typedef enum {
+ LITERAL,
+ CATENATION,
+ ITERATION,
+ UNION
+} tre_ast_type_t;
+
+/* Special subtypes of TRE_LITERAL. */
+#define EMPTY -1 /* Empty leaf (denotes empty string). */
+#define ASSERTION -2 /* Assertion leaf. */
+#define TAG -3 /* Tag leaf. */
+#define BACKREF -4 /* Back reference leaf. */
+
+#define IS_SPECIAL(x) ((x)->code_min < 0)
+#define IS_EMPTY(x) ((x)->code_min == EMPTY)
+#define IS_ASSERTION(x) ((x)->code_min == ASSERTION)
+#define IS_TAG(x) ((x)->code_min == TAG)
+#define IS_BACKREF(x) ((x)->code_min == BACKREF)
+
+
+/* A generic AST node. All AST nodes consist of this node on the top
+ level with `obj' pointing to the actual content. */
+typedef struct {
+ tre_ast_type_t type; /* Type of the node. */
+ void *obj; /* Pointer to actual node. */
+ int nullable;
+ int submatch_id;
+ int num_submatches;
+ int num_tags;
+ tre_pos_and_tags_t *firstpos;
+ tre_pos_and_tags_t *lastpos;
+} tre_ast_node_t;
+
+
+/* A "literal" node. These are created for assertions, back references,
+ tags, matching parameter settings, and all expressions that match one
+ character. */
+typedef struct {
+ long code_min;
+ long code_max;
+ int position;
+ tre_ctype_t class;
+ tre_ctype_t *neg_classes;
+} tre_literal_t;
+
+/* A "catenation" node. These are created when two regexps are concatenated.
+ If there are more than one subexpressions in sequence, the `left' part
+ holds all but the last, and `right' part holds the last subexpression
+ (catenation is left associative). */
+typedef struct {
+ tre_ast_node_t *left;
+ tre_ast_node_t *right;
+} tre_catenation_t;
+
+/* An "iteration" node. These are created for the "*", "+", "?", and "{m,n}"
+ operators. */
+typedef struct {
+ /* Subexpression to match. */
+ tre_ast_node_t *arg;
+ /* Minimum number of consecutive matches. */
+ int min;
+ /* Maximum number of consecutive matches. */
+ int max;
+ /* If 0, match as many characters as possible, if 1 match as few as
+ possible. Note that this does not always mean the same thing as
+ matching as many/few repetitions as possible. */
+ unsigned int minimal:1;
+} tre_iteration_t;
+
+/* An "union" node. These are created for the "|" operator. */
+typedef struct {
+ tre_ast_node_t *left;
+ tre_ast_node_t *right;
+} tre_union_t;
+
+
+static tre_ast_node_t *
+tre_ast_new_node(tre_mem_t mem, int type, void *obj)
+{
+ tre_ast_node_t *node = tre_mem_calloc(mem, sizeof *node);
+ if (!node || !obj)
+ return 0;
+ node->obj = obj;
+ node->type = type;
+ node->nullable = -1;
+ node->submatch_id = -1;
+ return node;
+}
+
+static tre_ast_node_t *
+tre_ast_new_literal(tre_mem_t mem, int code_min, int code_max, int position)
+{
+ tre_ast_node_t *node;
+ tre_literal_t *lit;
+
+ lit = tre_mem_calloc(mem, sizeof *lit);
+ node = tre_ast_new_node(mem, LITERAL, lit);
+ if (!node)
+ return 0;
+ lit->code_min = code_min;
+ lit->code_max = code_max;
+ lit->position = position;
+ return node;
+}
+
+static tre_ast_node_t *
+tre_ast_new_iter(tre_mem_t mem, tre_ast_node_t *arg, int min, int max, int minimal)
+{
+ tre_ast_node_t *node;
+ tre_iteration_t *iter;
+
+ iter = tre_mem_calloc(mem, sizeof *iter);
+ node = tre_ast_new_node(mem, ITERATION, iter);
+ if (!node)
+ return 0;
+ iter->arg = arg;
+ iter->min = min;
+ iter->max = max;
+ iter->minimal = minimal;
+ node->num_submatches = arg->num_submatches;
+ return node;
+}
+
+static tre_ast_node_t *
+tre_ast_new_union(tre_mem_t mem, tre_ast_node_t *left, tre_ast_node_t *right)
+{
+ tre_ast_node_t *node;
+ tre_union_t *un;
+
+ if (!left)
+ return right;
+ un = tre_mem_calloc(mem, sizeof *un);
+ node = tre_ast_new_node(mem, UNION, un);
+ if (!node || !right)
+ return 0;
+ un->left = left;
+ un->right = right;
+ node->num_submatches = left->num_submatches + right->num_submatches;
+ return node;
+}
+
+static tre_ast_node_t *
+tre_ast_new_catenation(tre_mem_t mem, tre_ast_node_t *left, tre_ast_node_t *right)
+{
+ tre_ast_node_t *node;
+ tre_catenation_t *cat;
+
+ if (!left)
+ return right;
+ cat = tre_mem_calloc(mem, sizeof *cat);
+ node = tre_ast_new_node(mem, CATENATION, cat);
+ if (!node)
+ return 0;
+ cat->left = left;
+ cat->right = right;
+ node->num_submatches = left->num_submatches + right->num_submatches;
+ return node;
+}
+
+
+/***********************************************************************
+ from tre-stack.c and tre-stack.h
+***********************************************************************/
+
+typedef struct tre_stack_rec tre_stack_t;
+
+/* Creates a new stack object. `size' is initial size in bytes, `max_size'
+ is maximum size, and `increment' specifies how much more space will be
+ allocated with realloc() if all space gets used up. Returns the stack
+ object or NULL if out of memory. */
+static tre_stack_t *
+tre_stack_new(int size, int max_size, int increment);
+
+/* Frees the stack object. */
+static void
+tre_stack_destroy(tre_stack_t *s);
+
+/* Returns the current number of objects in the stack. */
+static int
+tre_stack_num_objects(tre_stack_t *s);
+
+/* Each tre_stack_push_*(tre_stack_t *s, <type> value) function pushes
+ `value' on top of stack `s'. Returns REG_ESPACE if out of memory.
+ This tries to realloc() more space before failing if maximum size
+ has not yet been reached. Returns REG_OK if successful. */
+#define declare_pushf(typetag, type) \
+ static reg_errcode_t tre_stack_push_ ## typetag(tre_stack_t *s, type value)
+
+declare_pushf(voidptr, void *);
+declare_pushf(int, int);
+
+/* Each tre_stack_pop_*(tre_stack_t *s) function pops the topmost
+ element off of stack `s' and returns it. The stack must not be
+ empty. */
+#define declare_popf(typetag, type) \
+ static type tre_stack_pop_ ## typetag(tre_stack_t *s)
+
+declare_popf(voidptr, void *);
+declare_popf(int, int);
+
+/* Just to save some typing. */
+#define STACK_PUSH(s, typetag, value) \
+ do \
+ { \
+ status = tre_stack_push_ ## typetag(s, value); \
+ } \
+ while (/*CONSTCOND*/0)
+
+#define STACK_PUSHX(s, typetag, value) \
+ { \
+ status = tre_stack_push_ ## typetag(s, value); \
+ if (status != REG_OK) \
+ break; \
+ }
+
+#define STACK_PUSHR(s, typetag, value) \
+ { \
+ reg_errcode_t _status; \
+ _status = tre_stack_push_ ## typetag(s, value); \
+ if (_status != REG_OK) \
+ return _status; \
+ }
+
+union tre_stack_item {
+ void *voidptr_value;
+ int int_value;
+};
+
+struct tre_stack_rec {
+ int size;
+ int max_size;
+ int increment;
+ int ptr;
+ union tre_stack_item *stack;
+};
+
+
+static tre_stack_t *
+tre_stack_new(int size, int max_size, int increment)
+{
+ tre_stack_t *s;
+
+ s = xmalloc(sizeof(*s));
+ if (s != NULL)
+ {
+ s->stack = xmalloc(sizeof(*s->stack) * size);
+ if (s->stack == NULL)
+ {
+ xfree(s);
+ return NULL;
+ }
+ s->size = size;
+ s->max_size = max_size;
+ s->increment = increment;
+ s->ptr = 0;
+ }
+ return s;
+}
+
+static void
+tre_stack_destroy(tre_stack_t *s)
+{
+ xfree(s->stack);
+ xfree(s);
+}
+
+static int
+tre_stack_num_objects(tre_stack_t *s)
+{
+ return s->ptr;
+}
+
+static reg_errcode_t
+tre_stack_push(tre_stack_t *s, union tre_stack_item value)
+{
+ if (s->ptr < s->size)
+ {
+ s->stack[s->ptr] = value;
+ s->ptr++;
+ }
+ else
+ {
+ if (s->size >= s->max_size)
+ {
+ return REG_ESPACE;
+ }
+ else
+ {
+ union tre_stack_item *new_buffer;
+ int new_size;
+ new_size = s->size + s->increment;
+ if (new_size > s->max_size)
+ new_size = s->max_size;
+ new_buffer = xrealloc(s->stack, sizeof(*new_buffer) * new_size);
+ if (new_buffer == NULL)
+ {
+ return REG_ESPACE;
+ }
+ assert(new_size > s->size);
+ s->size = new_size;
+ s->stack = new_buffer;
+ tre_stack_push(s, value);
+ }
+ }
+ return REG_OK;
+}
+
+#define define_pushf(typetag, type) \
+ declare_pushf(typetag, type) { \
+ union tre_stack_item item; \
+ item.typetag ## _value = value; \
+ return tre_stack_push(s, item); \
+}
+
+define_pushf(int, int)
+define_pushf(voidptr, void *)
+
+#define define_popf(typetag, type) \
+ declare_popf(typetag, type) { \
+ return s->stack[--s->ptr].typetag ## _value; \
+ }
+
+define_popf(int, int)
+define_popf(voidptr, void *)
+
+
+/***********************************************************************
+ from tre-parse.c and tre-parse.h
+***********************************************************************/
+
+/* Parse context. */
+typedef struct {
+ /* Memory allocator. The AST is allocated using this. */
+ tre_mem_t mem;
+ /* Stack used for keeping track of regexp syntax. */
+ tre_stack_t *stack;
+ /* The parsed node after a parse function returns. */
+ tre_ast_node_t *n;
+ /* Position in the regexp pattern after a parse function returns. */
+ const char *s;
+ /* The first character of the last subexpression parsed. */
+ const char *start;
+ /* Current submatch ID. */
+ int submatch_id;
+ /* Current position (number of literal). */
+ int position;
+ /* The highest back reference or -1 if none seen so far. */
+ int max_backref;
+ /* Compilation flags. */
+ int cflags;
+} tre_parse_ctx_t;
+
+/* Some macros for expanding \w, \s, etc. */
+static const struct {
+ char c;
+ const char *expansion;
+} tre_macros[] = {
+ {'t', "\t"}, {'n', "\n"}, {'r', "\r"},
+ {'f', "\f"}, {'a', "\a"}, {'e', "\033"},
+ {'w', "[[:alnum:]_]"}, {'W', "[^[:alnum:]_]"}, {'s', "[[:space:]]"},
+ {'S', "[^[:space:]]"}, {'d', "[[:digit:]]"}, {'D', "[^[:digit:]]"},
+ { 0, 0 }
+};
+
+/* Expands a macro delimited by `regex' and `regex_end' to `buf', which
+ must have at least `len' items. Sets buf[0] to zero if the there
+ is no match in `tre_macros'. */
+static const char *tre_expand_macro(const char *s)
+{
+ int i;
+ for (i = 0; tre_macros[i].c && tre_macros[i].c != *s; i++);
+ return tre_macros[i].expansion;
+}
+
+static int
+tre_compare_lit(const void *a, const void *b)
+{
+ const tre_literal_t *const *la = a;
+ const tre_literal_t *const *lb = b;
+ /* assumes the range of valid code_min is < INT_MAX */
+ return la[0]->code_min - lb[0]->code_min;
+}
+
+struct literals {
+ tre_mem_t mem;
+ tre_literal_t **a;
+ int len;
+ int cap;
+};
+
+static tre_literal_t *tre_new_lit(struct literals *p)
+{
+ tre_literal_t **a;
+ if (p->len >= p->cap) {
+ if (p->cap >= 1<<15)
+ return 0;
+ p->cap *= 2;
+ a = xrealloc(p->a, p->cap * sizeof *p->a);
+ if (!a)
+ return 0;
+ p->a = a;
+ }
+ a = p->a + p->len++;
+ *a = tre_mem_calloc(p->mem, sizeof **a);
+ return *a;
+}
+
+static int add_icase_literals(struct literals *ls, int min, int max)
+{
+ tre_literal_t *lit;
+ int b, e, c;
+ for (c=min; c<=max; ) {
+ /* assumes islower(c) and isupper(c) are exclusive
+ and toupper(c)!=c if islower(c).
+ multiple opposite case characters are not supported */
+ if (tre_islower(c)) {
+ b = e = tre_toupper(c);
+ for (c++, e++; c<=max; c++, e++)
+ if (tre_toupper(c) != e) break;
+ } else if (tre_isupper(c)) {
+ b = e = tre_tolower(c);
+ for (c++, e++; c<=max; c++, e++)
+ if (tre_tolower(c) != e) break;
+ } else {
+ c++;
+ continue;
+ }
+ lit = tre_new_lit(ls);
+ if (!lit)
+ return -1;
+ lit->code_min = b;
+ lit->code_max = e-1;
+ lit->position = -1;
+ }
+ return 0;
+}
+
+
+/* Maximum number of character classes in a negated bracket expression. */
+#define MAX_NEG_CLASSES 64
+
+struct neg {
+ int negate;
+ int len;
+ tre_ctype_t a[MAX_NEG_CLASSES];
+};
+
+// TODO: parse bracket into a set of non-overlapping [lo,hi] ranges
+
+/*
+bracket grammar:
+Bracket = '[' List ']' | '[^' List ']'
+List = Term | List Term
+Term = Char | Range | Chclass | Eqclass
+Range = Char '-' Char | Char '-' '-'
+Char = Coll | coll_single
+Meta = ']' | '-'
+Coll = '[.' coll_single '.]' | '[.' coll_multi '.]' | '[.' Meta '.]'
+Eqclass = '[=' coll_single '=]' | '[=' coll_multi '=]'
+Chclass = '[:' class ':]'
+
+coll_single is a single char collating element but it can be
+ '-' only at the beginning or end of a List and
+ ']' only at the beginning of a List and
+ '^' anywhere except after the openning '['
+*/
+
+static reg_errcode_t parse_bracket_terms(tre_parse_ctx_t *ctx, const char *s, struct literals *ls, struct neg *neg)
+{
+ const char *start = s;
+ tre_ctype_t class;
+ int min, max;
+ wchar_t wc;
+ int len;
+
+ for (;;) {
+ class = 0;
+ len = mbtowc(&wc, s, -1);
+ if (len <= 0)
+ return *s ? REG_BADPAT : REG_EBRACK;
+ if (*s == ']' && s != start) {
+ ctx->s = s+1;
+ return REG_OK;
+ }
+ if (*s == '-' && s != start && s[1] != ']' &&
+ /* extension: [a-z--@] is accepted as [a-z]|[--@] */
+ (s[1] != '-' || s[2] == ']'))
+ return REG_ERANGE;
+ if (*s == '[' && (s[1] == '.' || s[1] == '='))
+ /* collating symbols and equivalence classes are not supported */
+ return REG_ECOLLATE;
+ if (*s == '[' && s[1] == ':') {
+ char tmp[CHARCLASS_NAME_MAX+1];
+ s += 2;
+ for (len=0; len < CHARCLASS_NAME_MAX && s[len]; len++) {
+ if (s[len] == ':') {
+ memcpy(tmp, s, len);
+ tmp[len] = 0;
+ class = tre_ctype(tmp);
+ break;
+ }
+ }
+ if (!class || s[len+1] != ']')
+ return REG_ECTYPE;
+ min = 0;
+ max = TRE_CHAR_MAX;
+ s += len+2;
+ } else {
+ min = max = wc;
+ s += len;
+ if (*s == '-' && s[1] != ']') {
+ s++;
+ len = mbtowc(&wc, s, -1);
+ max = wc;
+ /* XXX - Should use collation order instead of
+ encoding values in character ranges. */
+ if (len <= 0 || min > max)
+ return REG_ERANGE;
+ s += len;
+ }
+ }
+
+ if (class && neg->negate) {
+ if (neg->len >= MAX_NEG_CLASSES)
+ return REG_ESPACE;
+ neg->a[neg->len++] = class;
+ } else {
+ tre_literal_t *lit = tre_new_lit(ls);
+ if (!lit)
+ return REG_ESPACE;
+ lit->code_min = min;
+ lit->code_max = max;
+ lit->class = class;
+ lit->position = -1;
+
+ /* Add opposite-case codepoints if REG_ICASE is present.
+ It seems that POSIX requires that bracket negation
+ should happen before case-folding, but most practical
+ implementations do it the other way around. Changing
+ the order would need efficient representation of
+ case-fold ranges and bracket range sets even with
+ simple patterns so this is ok for now. */
+ if (ctx->cflags & REG_ICASE && !class)
+ if (add_icase_literals(ls, min, max))
+ return REG_ESPACE;
+ }
+ }
+}
+
+static reg_errcode_t parse_bracket(tre_parse_ctx_t *ctx, const char *s)
+{
+ int i, max, min, negmax, negmin;
+ tre_ast_node_t *node = 0, *n;
+ tre_ctype_t *nc = 0;
+ tre_literal_t *lit;
+ struct literals ls;
+ struct neg neg;
+ reg_errcode_t err;
+
+ ls.mem = ctx->mem;
+ ls.len = 0;
+ ls.cap = 32;
+ ls.a = xmalloc(ls.cap * sizeof *ls.a);
+ if (!ls.a)
+ return REG_ESPACE;
+ neg.len = 0;
+ neg.negate = *s == '^';
+ if (neg.negate)
+ s++;
+
+ err = parse_bracket_terms(ctx, s, &ls, &neg);
+ if (err != REG_OK)
+ goto parse_bracket_done;
+
+ if (neg.negate) {
+ /*
+ * With REG_NEWLINE, POSIX requires that newlines are not matched by
+ * any form of a non-matching list.
+ */
+ if (ctx->cflags & REG_NEWLINE) {
+ lit = tre_new_lit(&ls);
+ if (!lit) {
+ err = REG_ESPACE;
+ goto parse_bracket_done;
+ }
+ lit->code_min = '\n';
+ lit->code_max = '\n';
+ lit->position = -1;
+ }
+ /* Sort the array if we need to negate it. */
+ qsort(ls.a, ls.len, sizeof *ls.a, tre_compare_lit);
+ /* extra lit for the last negated range */
+ lit = tre_new_lit(&ls);
+ if (!lit) {
+ err = REG_ESPACE;
+ goto parse_bracket_done;
+ }
+ lit->code_min = TRE_CHAR_MAX+1;
+ lit->code_max = TRE_CHAR_MAX+1;
+ lit->position = -1;
+ /* negated classes */
+ if (neg.len) {
+ nc = tre_mem_alloc(ctx->mem, (neg.len+1)*sizeof *neg.a);
+ if (!nc) {
+ err = REG_ESPACE;
+ goto parse_bracket_done;
+ }
+ memcpy(nc, neg.a, neg.len*sizeof *neg.a);
+ nc[neg.len] = 0;
+ }
+ }
+
+ /* Build a union of the items in the array, negated if necessary. */
+ negmax = negmin = 0;
+ for (i = 0; i < ls.len; i++) {
+ lit = ls.a[i];
+ min = lit->code_min;
+ max = lit->code_max;
+ if (neg.negate) {
+ if (min <= negmin) {
+ /* Overlap. */
+ negmin = MAX(max + 1, negmin);
+ continue;
+ }
+ negmax = min - 1;
+ lit->code_min = negmin;
+ lit->code_max = negmax;
+ negmin = max + 1;
+ }
+ lit->position = ctx->position;
+ lit->neg_classes = nc;
+ n = tre_ast_new_node(ctx->mem, LITERAL, lit);
+ node = tre_ast_new_union(ctx->mem, node, n);
+ if (!node) {
+ err = REG_ESPACE;
+ break;
+ }
+ }
+
+parse_bracket_done:
+ xfree(ls.a);
+ ctx->position++;
+ ctx->n = node;
+ return err;
+}
+
+static const char *parse_dup_count(const char *s, int *n)
+{
+ *n = -1;
+ if (!isdigit(*s))
+ return s;
+ *n = 0;
+ for (;;) {
+ *n = 10 * *n + (*s - '0');
+ s++;
+ if (!isdigit(*s) || *n > RE_DUP_MAX)
+ break;
+ }
+ return s;
+}
+
+static const char *parse_dup(const char *s, int ere, int *pmin, int *pmax)
+{
+ int min, max;
+
+ s = parse_dup_count(s, &min);
+ if (*s == ',')
+ s = parse_dup_count(s+1, &max);
+ else
+ max = min;
+
+ if (
+ (max < min && max >= 0) ||
+ max > RE_DUP_MAX ||
+ min > RE_DUP_MAX ||
+ min < 0 ||
+ (!ere && *s++ != '\\') ||
+ *s++ != '}'
+ )
+ return 0;
+ *pmin = min;
+ *pmax = max;
+ return s;
+}
+
+static int hexval(unsigned c)
+{
+ if (c-'0'<10) return c-'0';
+ c |= 32;
+ if (c-'a'<6) return c-'a'+10;
+ return -1;
+}
+
+static reg_errcode_t marksub(tre_parse_ctx_t *ctx, tre_ast_node_t *node, int subid)
+{
+ if (node->submatch_id >= 0) {
+ tre_ast_node_t *n = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
+ if (!n)
+ return REG_ESPACE;
+ n = tre_ast_new_catenation(ctx->mem, n, node);
+ if (!n)
+ return REG_ESPACE;
+ n->num_submatches = node->num_submatches;
+ node = n;
+ }
+ node->submatch_id = subid;
+ node->num_submatches++;
+ ctx->n = node;
+ return REG_OK;
+}
+
+/*
+BRE grammar:
+Regex = Branch | '^' | '$' | '^$' | '^' Branch | Branch '$' | '^' Branch '$'
+Branch = Atom | Branch Atom
+Atom = char | quoted_char | '.' | Bracket | Atom Dup | '\(' Branch '\)' | back_ref
+Dup = '*' | '\{' Count '\}' | '\{' Count ',\}' | '\{' Count ',' Count '\}'
+
+(leading ^ and trailing $ in a sub expr may be an anchor or literal as well)
+
+ERE grammar:
+Regex = Branch | Regex '|' Branch
+Branch = Atom | Branch Atom
+Atom = char | quoted_char | '.' | Bracket | Atom Dup | '(' Regex ')' | '^' | '$'
+Dup = '*' | '+' | '?' | '{' Count '}' | '{' Count ',}' | '{' Count ',' Count '}'
+
+(a*+?, ^*, $+, \X, {, (|a) are unspecified)
+*/
+
+static reg_errcode_t parse_atom(tre_parse_ctx_t *ctx, const char *s)
+{
+ int len, ere = ctx->cflags & REG_EXTENDED;
+ const char *p;
+ tre_ast_node_t *node;
+ wchar_t wc;
+ switch (*s) {
+ case '[':
+ return parse_bracket(ctx, s+1);
+ case '\\':
+ p = tre_expand_macro(s+1);
+ if (p) {
+ /* assume \X expansion is a single atom */
+ reg_errcode_t err = parse_atom(ctx, p);
+ ctx->s = s+2;
+ return err;
+ }
+ /* extensions: \b, \B, \<, \>, \xHH \x{HHHH} */
+ switch (*++s) {
+ case 0:
+ return REG_EESCAPE;
+ case 'b':
+ node = tre_ast_new_literal(ctx->mem, ASSERTION, ASSERT_AT_WB, -1);
+ break;
+ case 'B':
+ node = tre_ast_new_literal(ctx->mem, ASSERTION, ASSERT_AT_WB_NEG, -1);
+ break;
+ case '<':
+ node = tre_ast_new_literal(ctx->mem, ASSERTION, ASSERT_AT_BOW, -1);
+ break;
+ case '>':
+ node = tre_ast_new_literal(ctx->mem, ASSERTION, ASSERT_AT_EOW, -1);
+ break;
+ case 'x':
+ s++;
+ int i, v = 0, c;
+ len = 2;
+ if (*s == '{') {
+ len = 8;
+ s++;
+ }
+ for (i=0; i<len && v<0x110000; i++) {
+ c = hexval(s[i]);
+ if (c < 0) break;
+ v = 16*v + c;
+ }
+ s += i;
+ if (len == 8) {
+ if (*s != '}')
+ return REG_EBRACE;
+ s++;
+ }
+ node = tre_ast_new_literal(ctx->mem, v, v, ctx->position++);
+ s--;
+ break;
+ case '{':
+ case '+':
+ case '?':
+ /* extension: treat \+, \? as repetitions in BRE */
+ /* reject repetitions after empty expression in BRE */
+ if (!ere)
+ return REG_BADRPT;
+ case '|':
+ /* extension: treat \| as alternation in BRE */
+ if (!ere) {
+ node = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
+ s--;
+ goto end;
+ }
+ /* fallthrough */
+ default:
+ if (!ere && (unsigned)*s-'1' < 9) {
+ /* back reference */
+ int val = *s - '0';
+ node = tre_ast_new_literal(ctx->mem, BACKREF, val, ctx->position++);
+ ctx->max_backref = MAX(val, ctx->max_backref);
+ } else {
+ /* extension: accept unknown escaped char
+ as a literal */
+ goto parse_literal;
+ }
+ }
+ s++;
+ break;
+ case '.':
+ if (ctx->cflags & REG_NEWLINE) {
+ tre_ast_node_t *tmp1, *tmp2;
+ tmp1 = tre_ast_new_literal(ctx->mem, 0, '\n'-1, ctx->position++);
+ tmp2 = tre_ast_new_literal(ctx->mem, '\n'+1, TRE_CHAR_MAX, ctx->position++);
+ if (tmp1 && tmp2)
+ node = tre_ast_new_union(ctx->mem, tmp1, tmp2);
+ else
+ node = 0;
+ } else {
+ node = tre_ast_new_literal(ctx->mem, 0, TRE_CHAR_MAX, ctx->position++);
+ }
+ s++;
+ break;
+ case '^':
+ /* '^' has a special meaning everywhere in EREs, and at beginning of BRE. */
+ if (!ere && s != ctx->start)
+ goto parse_literal;
+ node = tre_ast_new_literal(ctx->mem, ASSERTION, ASSERT_AT_BOL, -1);
+ s++;
+ break;
+ case '$':
+ /* '$' is special everywhere in EREs, and at the end of a BRE subexpression. */
+ if (!ere && s[1] && (s[1]!='\\'|| (s[2]!=')' && s[2]!='|')))
+ goto parse_literal;
+ node = tre_ast_new_literal(ctx->mem, ASSERTION, ASSERT_AT_EOL, -1);
+ s++;
+ break;
+ case '*':
+ case '{':
+ case '+':
+ case '?':
+ /* reject repetitions after empty expression in ERE */
+ if (ere)
+ return REG_BADRPT;
+ case '|':
+ if (!ere)
+ goto parse_literal;
+ case 0:
+ node = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
+ break;
+ default:
+parse_literal:
+ len = mbtowc(&wc, s, -1);
+ if (len < 0)
+ return REG_BADPAT;
+ if (ctx->cflags & REG_ICASE && (tre_isupper(wc) || tre_islower(wc))) {
+ tre_ast_node_t *tmp1, *tmp2;
+ /* multiple opposite case characters are not supported */
+ tmp1 = tre_ast_new_literal(ctx->mem, tre_toupper(wc), tre_toupper(wc), ctx->position);
+ tmp2 = tre_ast_new_literal(ctx->mem, tre_tolower(wc), tre_tolower(wc), ctx->position);
+ if (tmp1 && tmp2)
+ node = tre_ast_new_union(ctx->mem, tmp1, tmp2);
+ else
+ node = 0;
+ } else {
+ node = tre_ast_new_literal(ctx->mem, wc, wc, ctx->position);
+ }
+ ctx->position++;
+ s += len;
+ break;
+ }
+end:
+ if (!node)
+ return REG_ESPACE;
+ ctx->n = node;
+ ctx->s = s;
+ return REG_OK;
+}
+
+#define PUSHPTR(err, s, v) do { \
+ if ((err = tre_stack_push_voidptr(s, v)) != REG_OK) \
+ return err; \
+} while(0)
+
+#define PUSHINT(err, s, v) do { \
+ if ((err = tre_stack_push_int(s, v)) != REG_OK) \
+ return err; \
+} while(0)
+
+static reg_errcode_t tre_parse(tre_parse_ctx_t *ctx)
+{
+ tre_ast_node_t *nbranch=0, *nunion=0;
+ int ere = ctx->cflags & REG_EXTENDED;
+ const char *s = ctx->start;
+ int subid = 0;
+ int depth = 0;
+ reg_errcode_t err;
+ tre_stack_t *stack = ctx->stack;
+
+ PUSHINT(err, stack, subid++);
+ for (;;) {
+ if ((!ere && *s == '\\' && s[1] == '(') ||
+ (ere && *s == '(')) {
+ PUSHPTR(err, stack, nunion);
+ PUSHPTR(err, stack, nbranch);
+ PUSHINT(err, stack, subid++);
+ s++;
+ if (!ere)
+ s++;
+ depth++;
+ nbranch = nunion = 0;
+ ctx->start = s;
+ continue;
+ }
+ if ((!ere && *s == '\\' && s[1] == ')') ||
+ (ere && *s == ')' && depth)) {
+ ctx->n = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
+ if (!ctx->n)
+ return REG_ESPACE;
+ } else {
+ err = parse_atom(ctx, s);
+ if (err != REG_OK)
+ return err;
+ s = ctx->s;
+ }
+
+ parse_iter:
+ for (;;) {
+ int min, max;
+
+ if (*s!='\\' && *s!='*') {
+ if (!ere)
+ break;
+ if (*s!='+' && *s!='?' && *s!='{')
+ break;
+ }
+ if (*s=='\\' && ere)
+ break;
+ /* extension: treat \+, \? as repetitions in BRE */
+ if (*s=='\\' && s[1]!='+' && s[1]!='?' && s[1]!='{')
+ break;
+ if (*s=='\\')
+ s++;
+
+ /* handle ^* at the start of a BRE. */
+ if (!ere && s==ctx->start+1 && s[-1]=='^')
+ break;
+
+ /* extension: multiple consecutive *+?{,} is unspecified,
+ but (a+)+ has to be supported so accepting a++ makes
+ sense, note however that the RE_DUP_MAX limit can be
+ circumvented: (a{255}){255} uses a lot of memory.. */
+ if (*s=='{') {
+ s = parse_dup(s+1, ere, &min, &max);
+ if (!s)
+ return REG_BADBR;
+ } else {
+ min=0;
+ max=-1;
+ if (*s == '+')
+ min = 1;
+ if (*s == '?')
+ max = 1;
+ s++;
+ }
+ if (max == 0)
+ ctx->n = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
+ else
+ ctx->n = tre_ast_new_iter(ctx->mem, ctx->n, min, max, 0);
+ if (!ctx->n)
+ return REG_ESPACE;
+ }
+
+ nbranch = tre_ast_new_catenation(ctx->mem, nbranch, ctx->n);
+ if ((ere && *s == '|') ||
+ (ere && *s == ')' && depth) ||
+ (!ere && *s == '\\' && s[1] == ')') ||
+ /* extension: treat \| as alternation in BRE */
+ (!ere && *s == '\\' && s[1] == '|') ||
+ !*s) {
+ /* extension: empty branch is unspecified (), (|a), (a|)
+ here they are not rejected but match on empty string */
+ int c = *s;
+ nunion = tre_ast_new_union(ctx->mem, nunion, nbranch);
+ nbranch = 0;
+
+ if (c == '\\' && s[1] == '|') {
+ s+=2;
+ ctx->start = s;
+ } else if (c == '|') {
+ s++;
+ ctx->start = s;
+ } else {
+ if (c == '\\') {
+ if (!depth) return REG_EPAREN;
+ s+=2;
+ } else if (c == ')')
+ s++;
+ depth--;
+ err = marksub(ctx, nunion, tre_stack_pop_int(stack));
+ if (err != REG_OK)
+ return err;
+ if (!c && depth<0) {
+ ctx->submatch_id = subid;
+ return REG_OK;
+ }
+ if (!c || depth<0)
+ return REG_EPAREN;
+ nbranch = tre_stack_pop_voidptr(stack);
+ nunion = tre_stack_pop_voidptr(stack);
+ goto parse_iter;
+ }
+ }
+ }
+}
+
+
+/***********************************************************************
+ from tre-compile.c
+***********************************************************************/
+
+
+/*
+ TODO:
+ - Fix tre_ast_to_tnfa() to recurse using a stack instead of recursive
+ function calls.
+*/
+
+/*
+ Algorithms to setup tags so that submatch addressing can be done.
+*/
+
+
+/* Inserts a catenation node to the root of the tree given in `node'.
+ As the left child a new tag with number `tag_id' to `node' is added,
+ and the right child is the old root. */
+static reg_errcode_t
+tre_add_tag_left(tre_mem_t mem, tre_ast_node_t *node, int tag_id)
+{
+ tre_catenation_t *c;
+
+ c = tre_mem_alloc(mem, sizeof(*c));
+ if (c == NULL)
+ return REG_ESPACE;
+ c->left = tre_ast_new_literal(mem, TAG, tag_id, -1);
+ if (c->left == NULL)
+ return REG_ESPACE;
+ c->right = tre_mem_alloc(mem, sizeof(tre_ast_node_t));
+ if (c->right == NULL)
+ return REG_ESPACE;
+
+ c->right->obj = node->obj;
+ c->right->type = node->type;
+ c->right->nullable = -1;
+ c->right->submatch_id = -1;
+ c->right->firstpos = NULL;
+ c->right->lastpos = NULL;
+ c->right->num_tags = 0;
+ c->right->num_submatches = 0;
+ node->obj = c;
+ node->type = CATENATION;
+ return REG_OK;
+}
+
+/* Inserts a catenation node to the root of the tree given in `node'.
+ As the right child a new tag with number `tag_id' to `node' is added,
+ and the left child is the old root. */
+static reg_errcode_t
+tre_add_tag_right(tre_mem_t mem, tre_ast_node_t *node, int tag_id)
+{
+ tre_catenation_t *c;
+
+ c = tre_mem_alloc(mem, sizeof(*c));
+ if (c == NULL)
+ return REG_ESPACE;
+ c->right = tre_ast_new_literal(mem, TAG, tag_id, -1);
+ if (c->right == NULL)
+ return REG_ESPACE;
+ c->left = tre_mem_alloc(mem, sizeof(tre_ast_node_t));
+ if (c->left == NULL)
+ return REG_ESPACE;
+
+ c->left->obj = node->obj;
+ c->left->type = node->type;
+ c->left->nullable = -1;
+ c->left->submatch_id = -1;
+ c->left->firstpos = NULL;
+ c->left->lastpos = NULL;
+ c->left->num_tags = 0;
+ c->left->num_submatches = 0;
+ node->obj = c;
+ node->type = CATENATION;
+ return REG_OK;
+}
+
+typedef enum {
+ ADDTAGS_RECURSE,
+ ADDTAGS_AFTER_ITERATION,
+ ADDTAGS_AFTER_UNION_LEFT,
+ ADDTAGS_AFTER_UNION_RIGHT,
+ ADDTAGS_AFTER_CAT_LEFT,
+ ADDTAGS_AFTER_CAT_RIGHT,
+ ADDTAGS_SET_SUBMATCH_END
+} tre_addtags_symbol_t;
+
+
+typedef struct {
+ int tag;
+ int next_tag;
+} tre_tag_states_t;
+
+
+/* Go through `regset' and set submatch data for submatches that are
+ using this tag. */
+static void
+tre_purge_regset(int *regset, tre_tnfa_t *tnfa, int tag)
+{
+ int i;
+
+ for (i = 0; regset[i] >= 0; i++)
+ {
+ int id = regset[i] / 2;
+ int start = !(regset[i] % 2);
+ if (start)
+ tnfa->submatch_data[id].so_tag = tag;
+ else
+ tnfa->submatch_data[id].eo_tag = tag;
+ }
+ regset[0] = -1;
+}
+
+
+/* Adds tags to appropriate locations in the parse tree in `tree', so that
+ subexpressions marked for submatch addressing can be traced. */
+static reg_errcode_t
+tre_add_tags(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *tree,
+ tre_tnfa_t *tnfa)
+{
+ reg_errcode_t status = REG_OK;
+ tre_addtags_symbol_t symbol;
+ tre_ast_node_t *node = tree; /* Tree node we are currently looking at. */
+ int bottom = tre_stack_num_objects(stack);
+ /* True for first pass (counting number of needed tags) */
+ int first_pass = (mem == NULL || tnfa == NULL);
+ int *regset, *orig_regset;
+ int num_tags = 0; /* Total number of tags. */
+ int num_minimals = 0; /* Number of special minimal tags. */
+ int tag = 0; /* The tag that is to be added next. */
+ int next_tag = 1; /* Next tag to use after this one. */
+ int *parents; /* Stack of submatches the current submatch is
+ contained in. */
+ int minimal_tag = -1; /* Tag that marks the beginning of a minimal match. */
+ tre_tag_states_t *saved_states;
+
+ tre_tag_direction_t direction = TRE_TAG_MINIMIZE;
+ if (!first_pass)
+ {
+ tnfa->end_tag = 0;
+ tnfa->minimal_tags[0] = -1;
+ }
+
+ regset = xmalloc(sizeof(*regset) * ((tnfa->num_submatches + 1) * 2));
+ if (regset == NULL)
+ return REG_ESPACE;
+ regset[0] = -1;
+ orig_regset = regset;
+
+ parents = xmalloc(sizeof(*parents) * (tnfa->num_submatches + 1));
+ if (parents == NULL)
+ {
+ xfree(regset);
+ return REG_ESPACE;
+ }
+ parents[0] = -1;
+
+ saved_states = xmalloc(sizeof(*saved_states) * (tnfa->num_submatches + 1));
+ if (saved_states == NULL)
+ {
+ xfree(regset);
+ xfree(parents);
+ return REG_ESPACE;
+ }
+ else
+ {
+ unsigned int i;
+ for (i = 0; i <= tnfa->num_submatches; i++)
+ saved_states[i].tag = -1;
+ }
+
+ STACK_PUSH(stack, voidptr, node);
+ STACK_PUSH(stack, int, ADDTAGS_RECURSE);
+
+ while (tre_stack_num_objects(stack) > bottom)
+ {
+ if (status != REG_OK)
+ break;
+
+ symbol = (tre_addtags_symbol_t)tre_stack_pop_int(stack);
+ switch (symbol)
+ {
+
+ case ADDTAGS_SET_SUBMATCH_END:
+ {
+ int id = tre_stack_pop_int(stack);
+ int i;
+
+ /* Add end of this submatch to regset. */
+ for (i = 0; regset[i] >= 0; i++);
+ regset[i] = id * 2 + 1;
+ regset[i + 1] = -1;
+
+ /* Pop this submatch from the parents stack. */
+ for (i = 0; parents[i] >= 0; i++);
+ parents[i - 1] = -1;
+ break;
+ }
+
+ case ADDTAGS_RECURSE:
+ node = tre_stack_pop_voidptr(stack);
+
+ if (node->submatch_id >= 0)
+ {
+ int id = node->submatch_id;
+ int i;
+
+
+ /* Add start of this submatch to regset. */
+ for (i = 0; regset[i] >= 0; i++);
+ regset[i] = id * 2;
+ regset[i + 1] = -1;
+
+ if (!first_pass)
+ {
+ for (i = 0; parents[i] >= 0; i++);
+ tnfa->submatch_data[id].parents = NULL;
+ if (i > 0)
+ {
+ int *p = xmalloc(sizeof(*p) * (i + 1));
+ if (p == NULL)
+ {
+ status = REG_ESPACE;
+ break;
+ }
+ assert(tnfa->submatch_data[id].parents == NULL);
+ tnfa->submatch_data[id].parents = p;
+ for (i = 0; parents[i] >= 0; i++)
+ p[i] = parents[i];
+ p[i] = -1;
+ }
+ }
+
+ /* Add end of this submatch to regset after processing this
+ node. */
+ STACK_PUSHX(stack, int, node->submatch_id);
+ STACK_PUSHX(stack, int, ADDTAGS_SET_SUBMATCH_END);
+ }
+
+ switch (node->type)
+ {
+ case LITERAL:
+ {
+ tre_literal_t *lit = node->obj;
+
+ if (!IS_SPECIAL(lit) || IS_BACKREF(lit))
+ {
+ int i;
+ if (regset[0] >= 0)
+ {
+ /* Regset is not empty, so add a tag before the
+ literal or backref. */
+ if (!first_pass)
+ {
+ status = tre_add_tag_left(mem, node, tag);
+ tnfa->tag_directions[tag] = direction;
+ if (minimal_tag >= 0)
+ {
+ for (i = 0; tnfa->minimal_tags[i] >= 0; i++);
+ tnfa->minimal_tags[i] = tag;
+ tnfa->minimal_tags[i + 1] = minimal_tag;
+ tnfa->minimal_tags[i + 2] = -1;
+ minimal_tag = -1;
+ num_minimals++;
+ }
+ tre_purge_regset(regset, tnfa, tag);
+ }
+ else
+ {
+ node->num_tags = 1;
+ }
+
+ regset[0] = -1;
+ tag = next_tag;
+ num_tags++;
+ next_tag++;
+ }
+ }
+ else
+ {
+ assert(!IS_TAG(lit));
+ }
+ break;
+ }
+ case CATENATION:
+ {
+ tre_catenation_t *cat = node->obj;
+ tre_ast_node_t *left = cat->left;
+ tre_ast_node_t *right = cat->right;
+ int reserved_tag = -1;
+
+
+ /* After processing right child. */
+ STACK_PUSHX(stack, voidptr, node);
+ STACK_PUSHX(stack, int, ADDTAGS_AFTER_CAT_RIGHT);
+
+ /* Process right child. */
+ STACK_PUSHX(stack, voidptr, right);
+ STACK_PUSHX(stack, int, ADDTAGS_RECURSE);
+
+ /* After processing left child. */
+ STACK_PUSHX(stack, int, next_tag + left->num_tags);
+ if (left->num_tags > 0 && right->num_tags > 0)
+ {
+ /* Reserve the next tag to the right child. */
+ reserved_tag = next_tag;
+ next_tag++;
+ }
+ STACK_PUSHX(stack, int, reserved_tag);
+ STACK_PUSHX(stack, int, ADDTAGS_AFTER_CAT_LEFT);
+
+ /* Process left child. */
+ STACK_PUSHX(stack, voidptr, left);
+ STACK_PUSHX(stack, int, ADDTAGS_RECURSE);
+
+ }
+ break;
+ case ITERATION:
+ {
+ tre_iteration_t *iter = node->obj;
+
+ if (first_pass)
+ {
+ STACK_PUSHX(stack, int, regset[0] >= 0 || iter->minimal);
+ }
+ else
+ {
+ STACK_PUSHX(stack, int, tag);
+ STACK_PUSHX(stack, int, iter->minimal);
+ }
+ STACK_PUSHX(stack, voidptr, node);
+ STACK_PUSHX(stack, int, ADDTAGS_AFTER_ITERATION);
+
+ STACK_PUSHX(stack, voidptr, iter->arg);
+ STACK_PUSHX(stack, int, ADDTAGS_RECURSE);
+
+ /* Regset is not empty, so add a tag here. */
+ if (regset[0] >= 0 || iter->minimal)
+ {
+ if (!first_pass)
+ {
+ int i;
+ status = tre_add_tag_left(mem, node, tag);
+ if (iter->minimal)
+ tnfa->tag_directions[tag] = TRE_TAG_MAXIMIZE;
+ else
+ tnfa->tag_directions[tag] = direction;
+ if (minimal_tag >= 0)
+ {
+ for (i = 0; tnfa->minimal_tags[i] >= 0; i++);
+ tnfa->minimal_tags[i] = tag;
+ tnfa->minimal_tags[i + 1] = minimal_tag;
+ tnfa->minimal_tags[i + 2] = -1;
+ minimal_tag = -1;
+ num_minimals++;
+ }
+ tre_purge_regset(regset, tnfa, tag);
+ }
+
+ regset[0] = -1;
+ tag = next_tag;
+ num_tags++;
+ next_tag++;
+ }
+ direction = TRE_TAG_MINIMIZE;
+ }
+ break;
+ case UNION:
+ {
+ tre_union_t *uni = node->obj;
+ tre_ast_node_t *left = uni->left;
+ tre_ast_node_t *right = uni->right;
+ int left_tag;
+ int right_tag;
+
+ if (regset[0] >= 0)
+ {
+ left_tag = next_tag;
+ right_tag = next_tag + 1;
+ }
+ else
+ {
+ left_tag = tag;
+ right_tag = next_tag;
+ }
+
+ /* After processing right child. */
+ STACK_PUSHX(stack, int, right_tag);
+ STACK_PUSHX(stack, int, left_tag);
+ STACK_PUSHX(stack, voidptr, regset);
+ STACK_PUSHX(stack, int, regset[0] >= 0);
+ STACK_PUSHX(stack, voidptr, node);
+ STACK_PUSHX(stack, voidptr, right);
+ STACK_PUSHX(stack, voidptr, left);
+ STACK_PUSHX(stack, int, ADDTAGS_AFTER_UNION_RIGHT);
+
+ /* Process right child. */
+ STACK_PUSHX(stack, voidptr, right);
+ STACK_PUSHX(stack, int, ADDTAGS_RECURSE);
+
+ /* After processing left child. */
+ STACK_PUSHX(stack, int, ADDTAGS_AFTER_UNION_LEFT);
+
+ /* Process left child. */
+ STACK_PUSHX(stack, voidptr, left);
+ STACK_PUSHX(stack, int, ADDTAGS_RECURSE);
+
+ /* Regset is not empty, so add a tag here. */
+ if (regset[0] >= 0)
+ {
+ if (!first_pass)
+ {
+ int i;
+ status = tre_add_tag_left(mem, node, tag);
+ tnfa->tag_directions[tag] = direction;
+ if (minimal_tag >= 0)
+ {
+ for (i = 0; tnfa->minimal_tags[i] >= 0; i++);
+ tnfa->minimal_tags[i] = tag;
+ tnfa->minimal_tags[i + 1] = minimal_tag;
+ tnfa->minimal_tags[i + 2] = -1;
+ minimal_tag = -1;
+ num_minimals++;
+ }
+ tre_purge_regset(regset, tnfa, tag);
+ }
+
+ regset[0] = -1;
+ tag = next_tag;
+ num_tags++;
+ next_tag++;
+ }
+
+ if (node->num_submatches > 0)
+ {
+ /* The next two tags are reserved for markers. */
+ next_tag++;
+ tag = next_tag;
+ next_tag++;
+ }
+
+ break;
+ }
+ }
+
+ if (node->submatch_id >= 0)
+ {
+ int i;
+ /* Push this submatch on the parents stack. */
+ for (i = 0; parents[i] >= 0; i++);
+ parents[i] = node->submatch_id;
+ parents[i + 1] = -1;
+ }
+
+ break; /* end case: ADDTAGS_RECURSE */
+
+ case ADDTAGS_AFTER_ITERATION:
+ {
+ int minimal = 0;
+ int enter_tag;
+ node = tre_stack_pop_voidptr(stack);
+ if (first_pass)
+ {
+ node->num_tags = ((tre_iteration_t *)node->obj)->arg->num_tags
+ + tre_stack_pop_int(stack);
+ minimal_tag = -1;
+ }
+ else
+ {
+ minimal = tre_stack_pop_int(stack);
+ enter_tag = tre_stack_pop_int(stack);
+ if (minimal)
+ minimal_tag = enter_tag;
+ }
+
+ if (!first_pass)
+ {
+ if (minimal)
+ direction = TRE_TAG_MINIMIZE;
+ else
+ direction = TRE_TAG_MAXIMIZE;
+ }
+ break;
+ }
+
+ case ADDTAGS_AFTER_CAT_LEFT:
+ {
+ int new_tag = tre_stack_pop_int(stack);
+ next_tag = tre_stack_pop_int(stack);
+ if (new_tag >= 0)
+ {
+ tag = new_tag;
+ }
+ break;
+ }
+
+ case ADDTAGS_AFTER_CAT_RIGHT:
+ node = tre_stack_pop_voidptr(stack);
+ if (first_pass)
+ node->num_tags = ((tre_catenation_t *)node->obj)->left->num_tags
+ + ((tre_catenation_t *)node->obj)->right->num_tags;
+ break;
+
+ case ADDTAGS_AFTER_UNION_LEFT:
+ /* Lift the bottom of the `regset' array so that when processing
+ the right operand the items currently in the array are
+ invisible. The original bottom was saved at ADDTAGS_UNION and
+ will be restored at ADDTAGS_AFTER_UNION_RIGHT below. */
+ while (*regset >= 0)
+ regset++;
+ break;
+
+ case ADDTAGS_AFTER_UNION_RIGHT:
+ {
+ int added_tags, tag_left, tag_right;
+ tre_ast_node_t *left = tre_stack_pop_voidptr(stack);
+ tre_ast_node_t *right = tre_stack_pop_voidptr(stack);
+ node = tre_stack_pop_voidptr(stack);
+ added_tags = tre_stack_pop_int(stack);
+ if (first_pass)
+ {
+ node->num_tags = ((tre_union_t *)node->obj)->left->num_tags
+ + ((tre_union_t *)node->obj)->right->num_tags + added_tags
+ + ((node->num_submatches > 0) ? 2 : 0);
+ }
+ regset = tre_stack_pop_voidptr(stack);
+ tag_left = tre_stack_pop_int(stack);
+ tag_right = tre_stack_pop_int(stack);
+
+ /* Add tags after both children, the left child gets a smaller
+ tag than the right child. This guarantees that we prefer
+ the left child over the right child. */
+ /* XXX - This is not always necessary (if the children have
+ tags which must be seen for every match of that child). */
+ /* XXX - Check if this is the only place where tre_add_tag_right
+ is used. If so, use tre_add_tag_left (putting the tag before
+ the child as opposed after the child) and throw away
+ tre_add_tag_right. */
+ if (node->num_submatches > 0)
+ {
+ if (!first_pass)
+ {
+ status = tre_add_tag_right(mem, left, tag_left);
+ tnfa->tag_directions[tag_left] = TRE_TAG_MAXIMIZE;
+ if (status == REG_OK)
+ status = tre_add_tag_right(mem, right, tag_right);
+ tnfa->tag_directions[tag_right] = TRE_TAG_MAXIMIZE;
+ }
+ num_tags += 2;
+ }
+ direction = TRE_TAG_MAXIMIZE;
+ break;
+ }
+
+ default:
+ assert(0);
+ break;
+
+ } /* end switch(symbol) */
+ } /* end while(tre_stack_num_objects(stack) > bottom) */
+
+ if (!first_pass)
+ tre_purge_regset(regset, tnfa, tag);
+
+ if (!first_pass && minimal_tag >= 0)
+ {
+ int i;
+ for (i = 0; tnfa->minimal_tags[i] >= 0; i++);
+ tnfa->minimal_tags[i] = tag;
+ tnfa->minimal_tags[i + 1] = minimal_tag;
+ tnfa->minimal_tags[i + 2] = -1;
+ minimal_tag = -1;
+ num_minimals++;
+ }
+
+ assert(tree->num_tags == num_tags);
+ tnfa->end_tag = num_tags;
+ tnfa->num_tags = num_tags;
+ tnfa->num_minimals = num_minimals;
+ xfree(orig_regset);
+ xfree(parents);
+ xfree(saved_states);
+ return status;
+}
+
+
+
+/*
+ AST to TNFA compilation routines.
+*/
+
+typedef enum {
+ COPY_RECURSE,
+ COPY_SET_RESULT_PTR
+} tre_copyast_symbol_t;
+
+/* Flags for tre_copy_ast(). */
+#define COPY_REMOVE_TAGS 1
+#define COPY_MAXIMIZE_FIRST_TAG 2
+
+static reg_errcode_t
+tre_copy_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
+ int flags, int *pos_add, tre_tag_direction_t *tag_directions,
+ tre_ast_node_t **copy, int *max_pos)
+{
+ reg_errcode_t status = REG_OK;
+ int bottom = tre_stack_num_objects(stack);
+ int num_copied = 0;
+ int first_tag = 1;
+ tre_ast_node_t **result = copy;
+ tre_copyast_symbol_t symbol;
+
+ STACK_PUSH(stack, voidptr, ast);
+ STACK_PUSH(stack, int, COPY_RECURSE);
+
+ while (status == REG_OK && tre_stack_num_objects(stack) > bottom)
+ {
+ tre_ast_node_t *node;
+ if (status != REG_OK)
+ break;
+
+ symbol = (tre_copyast_symbol_t)tre_stack_pop_int(stack);
+ switch (symbol)
+ {
+ case COPY_SET_RESULT_PTR:
+ result = tre_stack_pop_voidptr(stack);
+ break;
+ case COPY_RECURSE:
+ node = tre_stack_pop_voidptr(stack);
+ switch (node->type)
+ {
+ case LITERAL:
+ {
+ tre_literal_t *lit = node->obj;
+ int pos = lit->position;
+ int min = lit->code_min;
+ int max = lit->code_max;
+ if (!IS_SPECIAL(lit) || IS_BACKREF(lit))
+ {
+ /* XXX - e.g. [ab] has only one position but two
+ nodes, so we are creating holes in the state space
+ here. Not fatal, just wastes memory. */
+ pos += *pos_add;
+ num_copied++;
+ }
+ else if (IS_TAG(lit) && (flags & COPY_REMOVE_TAGS))
+ {
+ /* Change this tag to empty. */
+ min = EMPTY;
+ max = pos = -1;
+ }
+ else if (IS_TAG(lit) && (flags & COPY_MAXIMIZE_FIRST_TAG)
+ && first_tag)
+ {
+ /* Maximize the first tag. */
+ tag_directions[max] = TRE_TAG_MAXIMIZE;
+ first_tag = 0;
+ }
+ *result = tre_ast_new_literal(mem, min, max, pos);
+ if (*result == NULL)
+ status = REG_ESPACE;
+ else {
+ tre_literal_t *p = (*result)->obj;
+ p->class = lit->class;
+ p->neg_classes = lit->neg_classes;
+ }
+
+ if (pos > *max_pos)
+ *max_pos = pos;
+ break;
+ }
+ case UNION:
+ {
+ tre_union_t *uni = node->obj;
+ tre_union_t *tmp;
+ *result = tre_ast_new_union(mem, uni->left, uni->right);
+ if (*result == NULL)
+ {
+ status = REG_ESPACE;
+ break;
+ }
+ tmp = (*result)->obj;
+ result = &tmp->left;
+ STACK_PUSHX(stack, voidptr, uni->right);
+ STACK_PUSHX(stack, int, COPY_RECURSE);
+ STACK_PUSHX(stack, voidptr, &tmp->right);
+ STACK_PUSHX(stack, int, COPY_SET_RESULT_PTR);
+ STACK_PUSHX(stack, voidptr, uni->left);
+ STACK_PUSHX(stack, int, COPY_RECURSE);
+ break;
+ }
+ case CATENATION:
+ {
+ tre_catenation_t *cat = node->obj;
+ tre_catenation_t *tmp;
+ *result = tre_ast_new_catenation(mem, cat->left, cat->right);
+ if (*result == NULL)
+ {
+ status = REG_ESPACE;
+ break;
+ }
+ tmp = (*result)->obj;
+ tmp->left = NULL;
+ tmp->right = NULL;
+ result = &tmp->left;
+
+ STACK_PUSHX(stack, voidptr, cat->right);
+ STACK_PUSHX(stack, int, COPY_RECURSE);
+ STACK_PUSHX(stack, voidptr, &tmp->right);
+ STACK_PUSHX(stack, int, COPY_SET_RESULT_PTR);
+ STACK_PUSHX(stack, voidptr, cat->left);
+ STACK_PUSHX(stack, int, COPY_RECURSE);
+ break;
+ }
+ case ITERATION:
+ {
+ tre_iteration_t *iter = node->obj;
+ STACK_PUSHX(stack, voidptr, iter->arg);
+ STACK_PUSHX(stack, int, COPY_RECURSE);
+ *result = tre_ast_new_iter(mem, iter->arg, iter->min,
+ iter->max, iter->minimal);
+ if (*result == NULL)
+ {
+ status = REG_ESPACE;
+ break;
+ }
+ iter = (*result)->obj;
+ result = &iter->arg;
+ break;
+ }
+ default:
+ assert(0);
+ break;
+ }
+ break;
+ }
+ }
+ *pos_add += num_copied;
+ return status;
+}
+
+typedef enum {
+ EXPAND_RECURSE,
+ EXPAND_AFTER_ITER
+} tre_expand_ast_symbol_t;
+
+/* Expands each iteration node that has a finite nonzero minimum or maximum
+ iteration count to a catenated sequence of copies of the node. */
+static reg_errcode_t
+tre_expand_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
+ int *position, tre_tag_direction_t *tag_directions)
+{
+ reg_errcode_t status = REG_OK;
+ int bottom = tre_stack_num_objects(stack);
+ int pos_add = 0;
+ int pos_add_total = 0;
+ int max_pos = 0;
+ int iter_depth = 0;
+
+ STACK_PUSHR(stack, voidptr, ast);
+ STACK_PUSHR(stack, int, EXPAND_RECURSE);
+ while (status == REG_OK && tre_stack_num_objects(stack) > bottom)
+ {
+ tre_ast_node_t *node;
+ tre_expand_ast_symbol_t symbol;
+
+ if (status != REG_OK)
+ break;
+
+ symbol = (tre_expand_ast_symbol_t)tre_stack_pop_int(stack);
+ node = tre_stack_pop_voidptr(stack);
+ switch (symbol)
+ {
+ case EXPAND_RECURSE:
+ switch (node->type)
+ {
+ case LITERAL:
+ {
+ tre_literal_t *lit= node->obj;
+ if (!IS_SPECIAL(lit) || IS_BACKREF(lit))
+ {
+ lit->position += pos_add;
+ if (lit->position > max_pos)
+ max_pos = lit->position;
+ }
+ break;
+ }
+ case UNION:
+ {
+ tre_union_t *uni = node->obj;
+ STACK_PUSHX(stack, voidptr, uni->right);
+ STACK_PUSHX(stack, int, EXPAND_RECURSE);
+ STACK_PUSHX(stack, voidptr, uni->left);
+ STACK_PUSHX(stack, int, EXPAND_RECURSE);
+ break;
+ }
+ case CATENATION:
+ {
+ tre_catenation_t *cat = node->obj;
+ STACK_PUSHX(stack, voidptr, cat->right);
+ STACK_PUSHX(stack, int, EXPAND_RECURSE);
+ STACK_PUSHX(stack, voidptr, cat->left);
+ STACK_PUSHX(stack, int, EXPAND_RECURSE);
+ break;
+ }
+ case ITERATION:
+ {
+ tre_iteration_t *iter = node->obj;
+ STACK_PUSHX(stack, int, pos_add);
+ STACK_PUSHX(stack, voidptr, node);
+ STACK_PUSHX(stack, int, EXPAND_AFTER_ITER);
+ STACK_PUSHX(stack, voidptr, iter->arg);
+ STACK_PUSHX(stack, int, EXPAND_RECURSE);
+ /* If we are going to expand this node at EXPAND_AFTER_ITER
+ then don't increase the `pos' fields of the nodes now, it
+ will get done when expanding. */
+ if (iter->min > 1 || iter->max > 1)
+ pos_add = 0;
+ iter_depth++;
+ break;
+ }
+ default:
+ assert(0);
+ break;
+ }
+ break;
+ case EXPAND_AFTER_ITER:
+ {
+ tre_iteration_t *iter = node->obj;
+ int pos_add_last;
+ pos_add = tre_stack_pop_int(stack);
+ pos_add_last = pos_add;
+ if (iter->min > 1 || iter->max > 1)
+ {
+ tre_ast_node_t *seq1 = NULL, *seq2 = NULL;
+ int j;
+ int pos_add_save = pos_add;
+
+ /* Create a catenated sequence of copies of the node. */
+ for (j = 0; j < iter->min; j++)
+ {
+ tre_ast_node_t *copy;
+ /* Remove tags from all but the last copy. */
+ int flags = ((j + 1 < iter->min)
+ ? COPY_REMOVE_TAGS
+ : COPY_MAXIMIZE_FIRST_TAG);
+ pos_add_save = pos_add;
+ status = tre_copy_ast(mem, stack, iter->arg, flags,
+ &pos_add, tag_directions, &copy,
+ &max_pos);
+ if (status != REG_OK)
+ return status;
+ if (seq1 != NULL)
+ seq1 = tre_ast_new_catenation(mem, seq1, copy);
+ else
+ seq1 = copy;
+ if (seq1 == NULL)
+ return REG_ESPACE;
+ }
+
+ if (iter->max == -1)
+ {
+ /* No upper limit. */
+ pos_add_save = pos_add;
+ status = tre_copy_ast(mem, stack, iter->arg, 0,
+ &pos_add, NULL, &seq2, &max_pos);
+ if (status != REG_OK)
+ return status;
+ seq2 = tre_ast_new_iter(mem, seq2, 0, -1, 0);
+ if (seq2 == NULL)
+ return REG_ESPACE;
+ }
+ else
+ {
+ for (j = iter->min; j < iter->max; j++)
+ {
+ tre_ast_node_t *tmp, *copy;
+ pos_add_save = pos_add;
+ status = tre_copy_ast(mem, stack, iter->arg, 0,
+ &pos_add, NULL, &copy, &max_pos);
+ if (status != REG_OK)
+ return status;
+ if (seq2 != NULL)
+ seq2 = tre_ast_new_catenation(mem, copy, seq2);
+ else
+ seq2 = copy;
+ if (seq2 == NULL)
+ return REG_ESPACE;
+ tmp = tre_ast_new_literal(mem, EMPTY, -1, -1);
+ if (tmp == NULL)
+ return REG_ESPACE;
+ seq2 = tre_ast_new_union(mem, tmp, seq2);
+ if (seq2 == NULL)
+ return REG_ESPACE;
+ }
+ }
+
+ pos_add = pos_add_save;
+ if (seq1 == NULL)
+ seq1 = seq2;
+ else if (seq2 != NULL)
+ seq1 = tre_ast_new_catenation(mem, seq1, seq2);
+ if (seq1 == NULL)
+ return REG_ESPACE;
+ node->obj = seq1->obj;
+ node->type = seq1->type;
+ }
+
+ iter_depth--;
+ pos_add_total += pos_add - pos_add_last;
+ if (iter_depth == 0)
+ pos_add = pos_add_total;
+
+ break;
+ }
+ default:
+ assert(0);
+ break;
+ }
+ }
+
+ *position += pos_add_total;
+
+ /* `max_pos' should never be larger than `*position' if the above
+ code works, but just an extra safeguard let's make sure
+ `*position' is set large enough so enough memory will be
+ allocated for the transition table. */
+ if (max_pos > *position)
+ *position = max_pos;
+
+ return status;
+}
+
+static tre_pos_and_tags_t *
+tre_set_empty(tre_mem_t mem)
+{
+ tre_pos_and_tags_t *new_set;
+
+ new_set = tre_mem_calloc(mem, sizeof(*new_set));
+ if (new_set == NULL)
+ return NULL;
+
+ new_set[0].position = -1;
+ new_set[0].code_min = -1;
+ new_set[0].code_max = -1;
+
+ return new_set;
+}
+
+static tre_pos_and_tags_t *
+tre_set_one(tre_mem_t mem, int position, int code_min, int code_max,
+ tre_ctype_t class, tre_ctype_t *neg_classes, int backref)
+{
+ tre_pos_and_tags_t *new_set;
+
+ new_set = tre_mem_calloc(mem, sizeof(*new_set) * 2);
+ if (new_set == NULL)
+ return NULL;
+
+ new_set[0].position = position;
+ new_set[0].code_min = code_min;
+ new_set[0].code_max = code_max;
+ new_set[0].class = class;
+ new_set[0].neg_classes = neg_classes;
+ new_set[0].backref = backref;
+ new_set[1].position = -1;
+ new_set[1].code_min = -1;
+ new_set[1].code_max = -1;
+
+ return new_set;
+}
+
+static tre_pos_and_tags_t *
+tre_set_union(tre_mem_t mem, tre_pos_and_tags_t *set1, tre_pos_and_tags_t *set2,
+ int *tags, int assertions)
+{
+ int s1, s2, i, j;
+ tre_pos_and_tags_t *new_set;
+ int *new_tags;
+ int num_tags;
+
+ for (num_tags = 0; tags != NULL && tags[num_tags] >= 0; num_tags++);
+ for (s1 = 0; set1[s1].position >= 0; s1++);
+ for (s2 = 0; set2[s2].position >= 0; s2++);
+ new_set = tre_mem_calloc(mem, sizeof(*new_set) * (s1 + s2 + 1));
+ if (!new_set )
+ return NULL;
+
+ for (s1 = 0; set1[s1].position >= 0; s1++)
+ {
+ new_set[s1].position = set1[s1].position;
+ new_set[s1].code_min = set1[s1].code_min;
+ new_set[s1].code_max = set1[s1].code_max;
+ new_set[s1].assertions = set1[s1].assertions | assertions;
+ new_set[s1].class = set1[s1].class;
+ new_set[s1].neg_classes = set1[s1].neg_classes;
+ new_set[s1].backref = set1[s1].backref;
+ if (set1[s1].tags == NULL && tags == NULL)
+ new_set[s1].tags = NULL;
+ else
+ {
+ for (i = 0; set1[s1].tags != NULL && set1[s1].tags[i] >= 0; i++);
+ new_tags = tre_mem_alloc(mem, (sizeof(*new_tags)
+ * (i + num_tags + 1)));
+ if (new_tags == NULL)
+ return NULL;
+ for (j = 0; j < i; j++)
+ new_tags[j] = set1[s1].tags[j];
+ for (i = 0; i < num_tags; i++)
+ new_tags[j + i] = tags[i];
+ new_tags[j + i] = -1;
+ new_set[s1].tags = new_tags;
+ }
+ }
+
+ for (s2 = 0; set2[s2].position >= 0; s2++)
+ {
+ new_set[s1 + s2].position = set2[s2].position;
+ new_set[s1 + s2].code_min = set2[s2].code_min;
+ new_set[s1 + s2].code_max = set2[s2].code_max;
+ /* XXX - why not | assertions here as well? */
+ new_set[s1 + s2].assertions = set2[s2].assertions;
+ new_set[s1 + s2].class = set2[s2].class;
+ new_set[s1 + s2].neg_classes = set2[s2].neg_classes;
+ new_set[s1 + s2].backref = set2[s2].backref;
+ if (set2[s2].tags == NULL)
+ new_set[s1 + s2].tags = NULL;
+ else
+ {
+ for (i = 0; set2[s2].tags[i] >= 0; i++);
+ new_tags = tre_mem_alloc(mem, sizeof(*new_tags) * (i + 1));
+ if (new_tags == NULL)
+ return NULL;
+ for (j = 0; j < i; j++)
+ new_tags[j] = set2[s2].tags[j];
+ new_tags[j] = -1;
+ new_set[s1 + s2].tags = new_tags;
+ }
+ }
+ new_set[s1 + s2].position = -1;
+ return new_set;
+}
+
+/* Finds the empty path through `node' which is the one that should be
+ taken according to POSIX.2 rules, and adds the tags on that path to
+ `tags'. `tags' may be NULL. If `num_tags_seen' is not NULL, it is
+ set to the number of tags seen on the path. */
+static reg_errcode_t
+tre_match_empty(tre_stack_t *stack, tre_ast_node_t *node, int *tags,
+ int *assertions, int *num_tags_seen)
+{
+ tre_literal_t *lit;
+ tre_union_t *uni;
+ tre_catenation_t *cat;
+ tre_iteration_t *iter;
+ int i;
+ int bottom = tre_stack_num_objects(stack);
+ reg_errcode_t status = REG_OK;
+ if (num_tags_seen)
+ *num_tags_seen = 0;
+
+ status = tre_stack_push_voidptr(stack, node);
+
+ /* Walk through the tree recursively. */
+ while (status == REG_OK && tre_stack_num_objects(stack) > bottom)
+ {
+ node = tre_stack_pop_voidptr(stack);
+
+ switch (node->type)
+ {
+ case LITERAL:
+ lit = (tre_literal_t *)node->obj;
+ switch (lit->code_min)
+ {
+ case TAG:
+ if (lit->code_max >= 0)
+ {
+ if (tags != NULL)
+ {
+ /* Add the tag to `tags'. */
+ for (i = 0; tags[i] >= 0; i++)
+ if (tags[i] == lit->code_max)
+ break;
+ if (tags[i] < 0)
+ {
+ tags[i] = lit->code_max;
+ tags[i + 1] = -1;
+ }
+ }
+ if (num_tags_seen)
+ (*num_tags_seen)++;
+ }
+ break;
+ case ASSERTION:
+ assert(lit->code_max >= 1
+ || lit->code_max <= ASSERT_LAST);
+ if (assertions != NULL)
+ *assertions |= lit->code_max;
+ break;
+ case EMPTY:
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ break;
+
+ case UNION:
+ /* Subexpressions starting earlier take priority over ones
+ starting later, so we prefer the left subexpression over the
+ right subexpression. */
+ uni = (tre_union_t *)node->obj;
+ if (uni->left->nullable)
+ STACK_PUSHX(stack, voidptr, uni->left)
+ else if (uni->right->nullable)
+ STACK_PUSHX(stack, voidptr, uni->right)
+ else
+ assert(0);
+ break;
+
+ case CATENATION:
+ /* The path must go through both children. */
+ cat = (tre_catenation_t *)node->obj;
+ assert(cat->left->nullable);
+ assert(cat->right->nullable);
+ STACK_PUSHX(stack, voidptr, cat->left);
+ STACK_PUSHX(stack, voidptr, cat->right);
+ break;
+
+ case ITERATION:
+ /* A match with an empty string is preferred over no match at
+ all, so we go through the argument if possible. */
+ iter = (tre_iteration_t *)node->obj;
+ if (iter->arg->nullable)
+ STACK_PUSHX(stack, voidptr, iter->arg);
+ break;
+
+ default:
+ assert(0);
+ break;
+ }
+ }
+
+ return status;
+}
+
+
+typedef enum {
+ NFL_RECURSE,
+ NFL_POST_UNION,
+ NFL_POST_CATENATION,
+ NFL_POST_ITERATION
+} tre_nfl_stack_symbol_t;
+
+
+/* Computes and fills in the fields `nullable', `firstpos', and `lastpos' for
+ the nodes of the AST `tree'. */
+static reg_errcode_t
+tre_compute_nfl(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *tree)
+{
+ int bottom = tre_stack_num_objects(stack);
+
+ STACK_PUSHR(stack, voidptr, tree);
+ STACK_PUSHR(stack, int, NFL_RECURSE);
+
+ while (tre_stack_num_objects(stack) > bottom)
+ {
+ tre_nfl_stack_symbol_t symbol;
+ tre_ast_node_t *node;
+
+ symbol = (tre_nfl_stack_symbol_t)tre_stack_pop_int(stack);
+ node = tre_stack_pop_voidptr(stack);
+ switch (symbol)
+ {
+ case NFL_RECURSE:
+ switch (node->type)
+ {
+ case LITERAL:
+ {
+ tre_literal_t *lit = (tre_literal_t *)node->obj;
+ if (IS_BACKREF(lit))
+ {
+ /* Back references: nullable = false, firstpos = {i},
+ lastpos = {i}. */
+ node->nullable = 0;
+ node->firstpos = tre_set_one(mem, lit->position, 0,
+ TRE_CHAR_MAX, 0, NULL, -1);
+ if (!node->firstpos)
+ return REG_ESPACE;
+ node->lastpos = tre_set_one(mem, lit->position, 0,
+ TRE_CHAR_MAX, 0, NULL,
+ (int)lit->code_max);
+ if (!node->lastpos)
+ return REG_ESPACE;
+ }
+ else if (lit->code_min < 0)
+ {
+ /* Tags, empty strings, params, and zero width assertions:
+ nullable = true, firstpos = {}, and lastpos = {}. */
+ node->nullable = 1;
+ node->firstpos = tre_set_empty(mem);
+ if (!node->firstpos)
+ return REG_ESPACE;
+ node->lastpos = tre_set_empty(mem);
+ if (!node->lastpos)
+ return REG_ESPACE;
+ }
+ else
+ {
+ /* Literal at position i: nullable = false, firstpos = {i},
+ lastpos = {i}. */
+ node->nullable = 0;
+ node->firstpos =
+ tre_set_one(mem, lit->position, (int)lit->code_min,
+ (int)lit->code_max, 0, NULL, -1);
+ if (!node->firstpos)
+ return REG_ESPACE;
+ node->lastpos = tre_set_one(mem, lit->position,
+ (int)lit->code_min,
+ (int)lit->code_max,
+ lit->class, lit->neg_classes,
+ -1);
+ if (!node->lastpos)
+ return REG_ESPACE;
+ }
+ break;
+ }
+
+ case UNION:
+ /* Compute the attributes for the two subtrees, and after that
+ for this node. */
+ STACK_PUSHR(stack, voidptr, node);
+ STACK_PUSHR(stack, int, NFL_POST_UNION);
+ STACK_PUSHR(stack, voidptr, ((tre_union_t *)node->obj)->right);
+ STACK_PUSHR(stack, int, NFL_RECURSE);
+ STACK_PUSHR(stack, voidptr, ((tre_union_t *)node->obj)->left);
+ STACK_PUSHR(stack, int, NFL_RECURSE);
+ break;
+
+ case CATENATION:
+ /* Compute the attributes for the two subtrees, and after that
+ for this node. */
+ STACK_PUSHR(stack, voidptr, node);
+ STACK_PUSHR(stack, int, NFL_POST_CATENATION);
+ STACK_PUSHR(stack, voidptr, ((tre_catenation_t *)node->obj)->right);
+ STACK_PUSHR(stack, int, NFL_RECURSE);
+ STACK_PUSHR(stack, voidptr, ((tre_catenation_t *)node->obj)->left);
+ STACK_PUSHR(stack, int, NFL_RECURSE);
+ break;
+
+ case ITERATION:
+ /* Compute the attributes for the subtree, and after that for
+ this node. */
+ STACK_PUSHR(stack, voidptr, node);
+ STACK_PUSHR(stack, int, NFL_POST_ITERATION);
+ STACK_PUSHR(stack, voidptr, ((tre_iteration_t *)node->obj)->arg);
+ STACK_PUSHR(stack, int, NFL_RECURSE);
+ break;
+ }
+ break; /* end case: NFL_RECURSE */
+
+ case NFL_POST_UNION:
+ {
+ tre_union_t *uni = (tre_union_t *)node->obj;
+ node->nullable = uni->left->nullable || uni->right->nullable;
+ node->firstpos = tre_set_union(mem, uni->left->firstpos,
+ uni->right->firstpos, NULL, 0);
+ if (!node->firstpos)
+ return REG_ESPACE;
+ node->lastpos = tre_set_union(mem, uni->left->lastpos,
+ uni->right->lastpos, NULL, 0);
+ if (!node->lastpos)
+ return REG_ESPACE;
+ break;
+ }
+
+ case NFL_POST_ITERATION:
+ {
+ tre_iteration_t *iter = (tre_iteration_t *)node->obj;
+
+ if (iter->min == 0 || iter->arg->nullable)
+ node->nullable = 1;
+ else
+ node->nullable = 0;
+ node->firstpos = iter->arg->firstpos;
+ node->lastpos = iter->arg->lastpos;
+ break;
+ }
+
+ case NFL_POST_CATENATION:
+ {
+ int num_tags, *tags, assertions;
+ reg_errcode_t status;
+ tre_catenation_t *cat = node->obj;
+ node->nullable = cat->left->nullable && cat->right->nullable;
+
+ /* Compute firstpos. */
+ if (cat->left->nullable)
+ {
+ /* The left side matches the empty string. Make a first pass
+ with tre_match_empty() to get the number of tags and
+ parameters. */
+ status = tre_match_empty(stack, cat->left,
+ NULL, NULL, &num_tags);
+ if (status != REG_OK)
+ return status;
+ /* Allocate arrays for the tags and parameters. */
+ tags = xmalloc(sizeof(*tags) * (num_tags + 1));
+ if (!tags)
+ return REG_ESPACE;
+ tags[0] = -1;
+ assertions = 0;
+ /* Second pass with tre_mach_empty() to get the list of
+ tags and parameters. */
+ status = tre_match_empty(stack, cat->left, tags,
+ &assertions, NULL);
+ if (status != REG_OK)
+ {
+ xfree(tags);
+ return status;
+ }
+ node->firstpos =
+ tre_set_union(mem, cat->right->firstpos, cat->left->firstpos,
+ tags, assertions);
+ xfree(tags);
+ if (!node->firstpos)
+ return REG_ESPACE;
+ }
+ else
+ {
+ node->firstpos = cat->left->firstpos;
+ }
+
+ /* Compute lastpos. */
+ if (cat->right->nullable)
+ {
+ /* The right side matches the empty string. Make a first pass
+ with tre_match_empty() to get the number of tags and
+ parameters. */
+ status = tre_match_empty(stack, cat->right,
+ NULL, NULL, &num_tags);
+ if (status != REG_OK)
+ return status;
+ /* Allocate arrays for the tags and parameters. */
+ tags = xmalloc(sizeof(int) * (num_tags + 1));
+ if (!tags)
+ return REG_ESPACE;
+ tags[0] = -1;
+ assertions = 0;
+ /* Second pass with tre_mach_empty() to get the list of
+ tags and parameters. */
+ status = tre_match_empty(stack, cat->right, tags,
+ &assertions, NULL);
+ if (status != REG_OK)
+ {
+ xfree(tags);
+ return status;
+ }
+ node->lastpos =
+ tre_set_union(mem, cat->left->lastpos, cat->right->lastpos,
+ tags, assertions);
+ xfree(tags);
+ if (!node->lastpos)
+ return REG_ESPACE;
+ }
+ else
+ {
+ node->lastpos = cat->right->lastpos;
+ }
+ break;
+ }
+
+ default:
+ assert(0);
+ break;
+ }
+ }
+
+ return REG_OK;
+}
+
+
+/* Adds a transition from each position in `p1' to each position in `p2'. */
+static reg_errcode_t
+tre_make_trans(tre_pos_and_tags_t *p1, tre_pos_and_tags_t *p2,
+ tre_tnfa_transition_t *transitions,
+ int *counts, int *offs)
+{
+ tre_pos_and_tags_t *orig_p2 = p2;
+ tre_tnfa_transition_t *trans;
+ int i, j, k, l, dup, prev_p2_pos;
+
+ if (transitions != NULL)
+ while (p1->position >= 0)
+ {
+ p2 = orig_p2;
+ prev_p2_pos = -1;
+ while (p2->position >= 0)
+ {
+ /* Optimization: if this position was already handled, skip it. */
+ if (p2->position == prev_p2_pos)
+ {
+ p2++;
+ continue;
+ }
+ prev_p2_pos = p2->position;
+ /* Set `trans' to point to the next unused transition from
+ position `p1->position'. */
+ trans = transitions + offs[p1->position];
+ while (trans->state != NULL)
+ {
+#if 0
+ /* If we find a previous transition from `p1->position' to
+ `p2->position', it is overwritten. This can happen only
+ if there are nested loops in the regexp, like in "((a)*)*".
+ In POSIX.2 repetition using the outer loop is always
+ preferred over using the inner loop. Therefore the
+ transition for the inner loop is useless and can be thrown
+ away. */
+ /* XXX - The same position is used for all nodes in a bracket
+ expression, so this optimization cannot be used (it will
+ break bracket expressions) unless I figure out a way to
+ detect it here. */
+ if (trans->state_id == p2->position)
+ {
+ break;
+ }
+#endif
+ trans++;
+ }
+
+ if (trans->state == NULL)
+ (trans + 1)->state = NULL;
+ /* Use the character ranges, assertions, etc. from `p1' for
+ the transition from `p1' to `p2'. */
+ trans->code_min = p1->code_min;
+ trans->code_max = p1->code_max;
+ trans->state = transitions + offs[p2->position];
+ trans->state_id = p2->position;
+ trans->assertions = p1->assertions | p2->assertions
+ | (p1->class ? ASSERT_CHAR_CLASS : 0)
+ | (p1->neg_classes != NULL ? ASSERT_CHAR_CLASS_NEG : 0);
+ if (p1->backref >= 0)
+ {
+ assert((trans->assertions & ASSERT_CHAR_CLASS) == 0);
+ assert(p2->backref < 0);
+ trans->u.backref = p1->backref;
+ trans->assertions |= ASSERT_BACKREF;
+ }
+ else
+ trans->u.class = p1->class;
+ if (p1->neg_classes != NULL)
+ {
+ for (i = 0; p1->neg_classes[i] != (tre_ctype_t)0; i++);
+ trans->neg_classes =
+ xmalloc(sizeof(*trans->neg_classes) * (i + 1));
+ if (trans->neg_classes == NULL)
+ return REG_ESPACE;
+ for (i = 0; p1->neg_classes[i] != (tre_ctype_t)0; i++)
+ trans->neg_classes[i] = p1->neg_classes[i];
+ trans->neg_classes[i] = (tre_ctype_t)0;
+ }
+ else
+ trans->neg_classes = NULL;
+
+ /* Find out how many tags this transition has. */
+ i = 0;
+ if (p1->tags != NULL)
+ while(p1->tags[i] >= 0)
+ i++;
+ j = 0;
+ if (p2->tags != NULL)
+ while(p2->tags[j] >= 0)
+ j++;
+
+ /* If we are overwriting a transition, free the old tag array. */
+ if (trans->tags != NULL)
+ xfree(trans->tags);
+ trans->tags = NULL;
+
+ /* If there were any tags, allocate an array and fill it. */
+ if (i + j > 0)
+ {
+ trans->tags = xmalloc(sizeof(*trans->tags) * (i + j + 1));
+ if (!trans->tags)
+ return REG_ESPACE;
+ i = 0;
+ if (p1->tags != NULL)
+ while(p1->tags[i] >= 0)
+ {
+ trans->tags[i] = p1->tags[i];
+ i++;
+ }
+ l = i;
+ j = 0;
+ if (p2->tags != NULL)
+ while (p2->tags[j] >= 0)
+ {
+ /* Don't add duplicates. */
+ dup = 0;
+ for (k = 0; k < i; k++)
+ if (trans->tags[k] == p2->tags[j])
+ {
+ dup = 1;
+ break;
+ }
+ if (!dup)
+ trans->tags[l++] = p2->tags[j];
+ j++;
+ }
+ trans->tags[l] = -1;
+ }
+
+ p2++;
+ }
+ p1++;
+ }
+ else
+ /* Compute a maximum limit for the number of transitions leaving
+ from each state. */
+ while (p1->position >= 0)
+ {
+ p2 = orig_p2;
+ while (p2->position >= 0)
+ {
+ counts[p1->position]++;
+ p2++;
+ }
+ p1++;
+ }
+ return REG_OK;
+}
+
+/* Converts the syntax tree to a TNFA. All the transitions in the TNFA are
+ labelled with one character range (there are no transitions on empty
+ strings). The TNFA takes O(n^2) space in the worst case, `n' is size of
+ the regexp. */
+static reg_errcode_t
+tre_ast_to_tnfa(tre_ast_node_t *node, tre_tnfa_transition_t *transitions,
+ int *counts, int *offs)
+{
+ tre_union_t *uni;
+ tre_catenation_t *cat;
+ tre_iteration_t *iter;
+ reg_errcode_t errcode = REG_OK;
+
+ /* XXX - recurse using a stack!. */
+ switch (node->type)
+ {
+ case LITERAL:
+ break;
+ case UNION:
+ uni = (tre_union_t *)node->obj;
+ errcode = tre_ast_to_tnfa(uni->left, transitions, counts, offs);
+ if (errcode != REG_OK)
+ return errcode;
+ errcode = tre_ast_to_tnfa(uni->right, transitions, counts, offs);
+ break;
+
+ case CATENATION:
+ cat = (tre_catenation_t *)node->obj;
+ /* Add a transition from each position in cat->left->lastpos
+ to each position in cat->right->firstpos. */
+ errcode = tre_make_trans(cat->left->lastpos, cat->right->firstpos,
+ transitions, counts, offs);
+ if (errcode != REG_OK)
+ return errcode;
+ errcode = tre_ast_to_tnfa(cat->left, transitions, counts, offs);
+ if (errcode != REG_OK)
+ return errcode;
+ errcode = tre_ast_to_tnfa(cat->right, transitions, counts, offs);
+ break;
+
+ case ITERATION:
+ iter = (tre_iteration_t *)node->obj;
+ assert(iter->max == -1 || iter->max == 1);
+
+ if (iter->max == -1)
+ {
+ assert(iter->min == 0 || iter->min == 1);
+ /* Add a transition from each last position in the iterated
+ expression to each first position. */
+ errcode = tre_make_trans(iter->arg->lastpos, iter->arg->firstpos,
+ transitions, counts, offs);
+ if (errcode != REG_OK)
+ return errcode;
+ }
+ errcode = tre_ast_to_tnfa(iter->arg, transitions, counts, offs);
+ break;
+ }
+ return errcode;
+}
+
+
+#define ERROR_EXIT(err) \
+ do \
+ { \
+ errcode = err; \
+ if (/*CONSTCOND*/1) \
+ goto error_exit; \
+ } \
+ while (/*CONSTCOND*/0)
+
+
+int
+regcomp(regex_t *restrict preg, const char *restrict regex, int cflags)
+{
+ tre_stack_t *stack;
+ tre_ast_node_t *tree, *tmp_ast_l, *tmp_ast_r;
+ tre_pos_and_tags_t *p;
+ int *counts = NULL, *offs = NULL;
+ int i, add = 0;
+ tre_tnfa_transition_t *transitions, *initial;
+ tre_tnfa_t *tnfa = NULL;
+ tre_submatch_data_t *submatch_data;
+ tre_tag_direction_t *tag_directions = NULL;
+ reg_errcode_t errcode;
+ tre_mem_t mem;
+
+ /* Parse context. */
+ tre_parse_ctx_t parse_ctx;
+
+ /* Allocate a stack used throughout the compilation process for various
+ purposes. */
+ stack = tre_stack_new(512, 1024000, 128);
+ if (!stack)
+ return REG_ESPACE;
+ /* Allocate a fast memory allocator. */
+ mem = tre_mem_new();
+ if (!mem)
+ {
+ tre_stack_destroy(stack);
+ return REG_ESPACE;
+ }
+
+ /* Parse the regexp. */
+ memset(&parse_ctx, 0, sizeof(parse_ctx));
+ parse_ctx.mem = mem;
+ parse_ctx.stack = stack;
+ parse_ctx.start = regex;
+ parse_ctx.cflags = cflags;
+ parse_ctx.max_backref = -1;
+ errcode = tre_parse(&parse_ctx);
+ if (errcode != REG_OK)
+ ERROR_EXIT(errcode);
+ preg->re_nsub = parse_ctx.submatch_id - 1;
+ tree = parse_ctx.n;
+
+#ifdef TRE_DEBUG
+ tre_ast_print(tree);
+#endif /* TRE_DEBUG */
+
+ /* Referring to nonexistent subexpressions is illegal. */
+ if (parse_ctx.max_backref > (int)preg->re_nsub)
+ ERROR_EXIT(REG_ESUBREG);
+
+ /* Allocate the TNFA struct. */
+ tnfa = xcalloc(1, sizeof(tre_tnfa_t));
+ if (tnfa == NULL)
+ ERROR_EXIT(REG_ESPACE);
+ tnfa->have_backrefs = parse_ctx.max_backref >= 0;
+ tnfa->have_approx = 0;
+ tnfa->num_submatches = parse_ctx.submatch_id;
+
+ /* Set up tags for submatch addressing. If REG_NOSUB is set and the
+ regexp does not have back references, this can be skipped. */
+ if (tnfa->have_backrefs || !(cflags & REG_NOSUB))
+ {
+
+ /* Figure out how many tags we will need. */
+ errcode = tre_add_tags(NULL, stack, tree, tnfa);
+ if (errcode != REG_OK)
+ ERROR_EXIT(errcode);
+
+ if (tnfa->num_tags > 0)
+ {
+ tag_directions = xmalloc(sizeof(*tag_directions)
+ * (tnfa->num_tags + 1));
+ if (tag_directions == NULL)
+ ERROR_EXIT(REG_ESPACE);
+ tnfa->tag_directions = tag_directions;
+ memset(tag_directions, -1,
+ sizeof(*tag_directions) * (tnfa->num_tags + 1));
+ }
+ tnfa->minimal_tags = xcalloc((unsigned)tnfa->num_tags * 2 + 1,
+ sizeof(*tnfa->minimal_tags));
+ if (tnfa->minimal_tags == NULL)
+ ERROR_EXIT(REG_ESPACE);
+
+ submatch_data = xcalloc((unsigned)parse_ctx.submatch_id,
+ sizeof(*submatch_data));
+ if (submatch_data == NULL)
+ ERROR_EXIT(REG_ESPACE);
+ tnfa->submatch_data = submatch_data;
+
+ errcode = tre_add_tags(mem, stack, tree, tnfa);
+ if (errcode != REG_OK)
+ ERROR_EXIT(errcode);
+
+ }
+
+ /* Expand iteration nodes. */
+ errcode = tre_expand_ast(mem, stack, tree, &parse_ctx.position,
+ tag_directions);
+ if (errcode != REG_OK)
+ ERROR_EXIT(errcode);
+
+ /* Add a dummy node for the final state.
+ XXX - For certain patterns this dummy node can be optimized away,
+ for example "a*" or "ab*". Figure out a simple way to detect
+ this possibility. */
+ tmp_ast_l = tree;
+ tmp_ast_r = tre_ast_new_literal(mem, 0, 0, parse_ctx.position++);
+ if (tmp_ast_r == NULL)
+ ERROR_EXIT(REG_ESPACE);
+
+ tree = tre_ast_new_catenation(mem, tmp_ast_l, tmp_ast_r);
+ if (tree == NULL)
+ ERROR_EXIT(REG_ESPACE);
+
+ errcode = tre_compute_nfl(mem, stack, tree);
+ if (errcode != REG_OK)
+ ERROR_EXIT(errcode);
+
+ counts = xmalloc(sizeof(int) * parse_ctx.position);
+ if (counts == NULL)
+ ERROR_EXIT(REG_ESPACE);
+
+ offs = xmalloc(sizeof(int) * parse_ctx.position);
+ if (offs == NULL)
+ ERROR_EXIT(REG_ESPACE);
+
+ for (i = 0; i < parse_ctx.position; i++)
+ counts[i] = 0;
+ tre_ast_to_tnfa(tree, NULL, counts, NULL);
+
+ add = 0;
+ for (i = 0; i < parse_ctx.position; i++)
+ {
+ offs[i] = add;
+ add += counts[i] + 1;
+ counts[i] = 0;
+ }
+ transitions = xcalloc((unsigned)add + 1, sizeof(*transitions));
+ if (transitions == NULL)
+ ERROR_EXIT(REG_ESPACE);
+ tnfa->transitions = transitions;
+ tnfa->num_transitions = add;
+
+ errcode = tre_ast_to_tnfa(tree, transitions, counts, offs);
+ if (errcode != REG_OK)
+ ERROR_EXIT(errcode);
+
+ tnfa->firstpos_chars = NULL;
+
+ p = tree->firstpos;
+ i = 0;
+ while (p->position >= 0)
+ {
+ i++;
+ p++;
+ }
+
+ initial = xcalloc((unsigned)i + 1, sizeof(tre_tnfa_transition_t));
+ if (initial == NULL)
+ ERROR_EXIT(REG_ESPACE);
+ tnfa->initial = initial;
+
+ i = 0;
+ for (p = tree->firstpos; p->position >= 0; p++)
+ {
+ initial[i].state = transitions + offs[p->position];
+ initial[i].state_id = p->position;
+ initial[i].tags = NULL;
+ /* Copy the arrays p->tags, and p->params, they are allocated
+ from a tre_mem object. */
+ if (p->tags)
+ {
+ int j;
+ for (j = 0; p->tags[j] >= 0; j++);
+ initial[i].tags = xmalloc(sizeof(*p->tags) * (j + 1));
+ if (!initial[i].tags)
+ ERROR_EXIT(REG_ESPACE);
+ memcpy(initial[i].tags, p->tags, sizeof(*p->tags) * (j + 1));
+ }
+ initial[i].assertions = p->assertions;
+ i++;
+ }
+ initial[i].state = NULL;
+
+ tnfa->num_transitions = add;
+ tnfa->final = transitions + offs[tree->lastpos[0].position];
+ tnfa->num_states = parse_ctx.position;
+ tnfa->cflags = cflags;
+
+ tre_mem_destroy(mem);
+ tre_stack_destroy(stack);
+ xfree(counts);
+ xfree(offs);
+
+ preg->TRE_REGEX_T_FIELD = (void *)tnfa;
+ return REG_OK;
+
+ error_exit:
+ /* Free everything that was allocated and return the error code. */
+ tre_mem_destroy(mem);
+ if (stack != NULL)
+ tre_stack_destroy(stack);
+ if (counts != NULL)
+ xfree(counts);
+ if (offs != NULL)
+ xfree(offs);
+ preg->TRE_REGEX_T_FIELD = (void *)tnfa;
+ regfree(preg);
+ return errcode;
+}
+
+
+
+
+void
+regfree(regex_t *preg)
+{
+ tre_tnfa_t *tnfa;
+ unsigned int i;
+ tre_tnfa_transition_t *trans;
+
+ tnfa = (void *)preg->TRE_REGEX_T_FIELD;
+ if (!tnfa)
+ return;
+
+ for (i = 0; i < tnfa->num_transitions; i++)
+ if (tnfa->transitions[i].state)
+ {
+ if (tnfa->transitions[i].tags)
+ xfree(tnfa->transitions[i].tags);
+ if (tnfa->transitions[i].neg_classes)
+ xfree(tnfa->transitions[i].neg_classes);
+ }
+ if (tnfa->transitions)
+ xfree(tnfa->transitions);
+
+ if (tnfa->initial)
+ {
+ for (trans = tnfa->initial; trans->state; trans++)
+ {
+ if (trans->tags)
+ xfree(trans->tags);
+ }
+ xfree(tnfa->initial);
+ }
+
+ if (tnfa->submatch_data)
+ {
+ for (i = 0; i < tnfa->num_submatches; i++)
+ if (tnfa->submatch_data[i].parents)
+ xfree(tnfa->submatch_data[i].parents);
+ xfree(tnfa->submatch_data);
+ }
+
+ if (tnfa->tag_directions)
+ xfree(tnfa->tag_directions);
+ if (tnfa->firstpos_chars)
+ xfree(tnfa->firstpos_chars);
+ if (tnfa->minimal_tags)
+ xfree(tnfa->minimal_tags);
+ xfree(tnfa);
+}
diff --git a/libc-top-half/musl/src/regex/regerror.c b/libc-top-half/musl/src/regex/regerror.c
new file mode 100644
index 0000000..5b347cc
--- /dev/null
+++ b/libc-top-half/musl/src/regex/regerror.c
@@ -0,0 +1,37 @@
+#include <string.h>
+#include <regex.h>
+#include <stdio.h>
+#include "locale_impl.h"
+
+/* Error message strings for error codes listed in `regex.h'. This list
+ needs to be in sync with the codes listed there, naturally. */
+
+/* Converted to single string by Rich Felker to remove the need for
+ * data relocations at runtime, 27 Feb 2006. */
+
+static const char messages[] = {
+ "No error\0"
+ "No match\0"
+ "Invalid regexp\0"
+ "Unknown collating element\0"
+ "Unknown character class name\0"
+ "Trailing backslash\0"
+ "Invalid back reference\0"
+ "Missing ']'\0"
+ "Missing ')'\0"
+ "Missing '}'\0"
+ "Invalid contents of {}\0"
+ "Invalid character range\0"
+ "Out of memory\0"
+ "Repetition not preceded by valid expression\0"
+ "\0Unknown error"
+};
+
+size_t regerror(int e, const regex_t *restrict preg, char *restrict buf, size_t size)
+{
+ const char *s;
+ for (s=messages; e && *s; e--, s+=strlen(s)+1);
+ if (!*s) s++;
+ s = LCTRANS_CUR(s);
+ return 1+snprintf(buf, size, "%s", s);
+}
diff --git a/libc-top-half/musl/src/regex/regexec.c b/libc-top-half/musl/src/regex/regexec.c
new file mode 100644
index 0000000..253b0e1
--- /dev/null
+++ b/libc-top-half/musl/src/regex/regexec.c
@@ -0,0 +1,1028 @@
+/*
+ regexec.c - TRE POSIX compatible matching functions (and more).
+
+ Copyright (c) 2001-2009 Ville Laurikari <vl@iki.fi>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+#include <limits.h>
+#include <stdint.h>
+
+#include <regex.h>
+
+#include "tre.h"
+
+#include <assert.h>
+
+static void
+tre_fill_pmatch(size_t nmatch, regmatch_t pmatch[], int cflags,
+ const tre_tnfa_t *tnfa, regoff_t *tags, regoff_t match_eo);
+
+/***********************************************************************
+ from tre-match-utils.h
+***********************************************************************/
+
+#define GET_NEXT_WCHAR() do { \
+ prev_c = next_c; pos += pos_add_next; \
+ if ((pos_add_next = mbtowc(&next_c, str_byte, MB_LEN_MAX)) <= 0) { \
+ if (pos_add_next < 0) { ret = REG_NOMATCH; goto error_exit; } \
+ else pos_add_next++; \
+ } \
+ str_byte += pos_add_next; \
+ } while (0)
+
+#define IS_WORD_CHAR(c) ((c) == L'_' || tre_isalnum(c))
+
+#define CHECK_ASSERTIONS(assertions) \
+ (((assertions & ASSERT_AT_BOL) \
+ && (pos > 0 || reg_notbol) \
+ && (prev_c != L'\n' || !reg_newline)) \
+ || ((assertions & ASSERT_AT_EOL) \
+ && (next_c != L'\0' || reg_noteol) \
+ && (next_c != L'\n' || !reg_newline)) \
+ || ((assertions & ASSERT_AT_BOW) \
+ && (IS_WORD_CHAR(prev_c) || !IS_WORD_CHAR(next_c))) \
+ || ((assertions & ASSERT_AT_EOW) \
+ && (!IS_WORD_CHAR(prev_c) || IS_WORD_CHAR(next_c))) \
+ || ((assertions & ASSERT_AT_WB) \
+ && (pos != 0 && next_c != L'\0' \
+ && IS_WORD_CHAR(prev_c) == IS_WORD_CHAR(next_c))) \
+ || ((assertions & ASSERT_AT_WB_NEG) \
+ && (pos == 0 || next_c == L'\0' \
+ || IS_WORD_CHAR(prev_c) != IS_WORD_CHAR(next_c))))
+
+#define CHECK_CHAR_CLASSES(trans_i, tnfa, eflags) \
+ (((trans_i->assertions & ASSERT_CHAR_CLASS) \
+ && !(tnfa->cflags & REG_ICASE) \
+ && !tre_isctype((tre_cint_t)prev_c, trans_i->u.class)) \
+ || ((trans_i->assertions & ASSERT_CHAR_CLASS) \
+ && (tnfa->cflags & REG_ICASE) \
+ && !tre_isctype(tre_tolower((tre_cint_t)prev_c),trans_i->u.class) \
+ && !tre_isctype(tre_toupper((tre_cint_t)prev_c),trans_i->u.class)) \
+ || ((trans_i->assertions & ASSERT_CHAR_CLASS_NEG) \
+ && tre_neg_char_classes_match(trans_i->neg_classes,(tre_cint_t)prev_c,\
+ tnfa->cflags & REG_ICASE)))
+
+
+
+
+/* Returns 1 if `t1' wins `t2', 0 otherwise. */
+static int
+tre_tag_order(int num_tags, tre_tag_direction_t *tag_directions,
+ regoff_t *t1, regoff_t *t2)
+{
+ int i;
+ for (i = 0; i < num_tags; i++)
+ {
+ if (tag_directions[i] == TRE_TAG_MINIMIZE)
+ {
+ if (t1[i] < t2[i])
+ return 1;
+ if (t1[i] > t2[i])
+ return 0;
+ }
+ else
+ {
+ if (t1[i] > t2[i])
+ return 1;
+ if (t1[i] < t2[i])
+ return 0;
+ }
+ }
+ /* assert(0);*/
+ return 0;
+}
+
+static int
+tre_neg_char_classes_match(tre_ctype_t *classes, tre_cint_t wc, int icase)
+{
+ while (*classes != (tre_ctype_t)0)
+ if ((!icase && tre_isctype(wc, *classes))
+ || (icase && (tre_isctype(tre_toupper(wc), *classes)
+ || tre_isctype(tre_tolower(wc), *classes))))
+ return 1; /* Match. */
+ else
+ classes++;
+ return 0; /* No match. */
+}
+
+
+/***********************************************************************
+ from tre-match-parallel.c
+***********************************************************************/
+
+/*
+ This algorithm searches for matches basically by reading characters
+ in the searched string one by one, starting at the beginning. All
+ matching paths in the TNFA are traversed in parallel. When two or
+ more paths reach the same state, exactly one is chosen according to
+ tag ordering rules; if returning submatches is not required it does
+ not matter which path is chosen.
+
+ The worst case time required for finding the leftmost and longest
+ match, or determining that there is no match, is always linearly
+ dependent on the length of the text being searched.
+
+ This algorithm cannot handle TNFAs with back referencing nodes.
+ See `tre-match-backtrack.c'.
+*/
+
+typedef struct {
+ tre_tnfa_transition_t *state;
+ regoff_t *tags;
+} tre_tnfa_reach_t;
+
+typedef struct {
+ regoff_t pos;
+ regoff_t **tags;
+} tre_reach_pos_t;
+
+
+static reg_errcode_t
+tre_tnfa_run_parallel(const tre_tnfa_t *tnfa, const void *string,
+ regoff_t *match_tags, int eflags,
+ regoff_t *match_end_ofs)
+{
+ /* State variables required by GET_NEXT_WCHAR. */
+ tre_char_t prev_c = 0, next_c = 0;
+ const char *str_byte = string;
+ regoff_t pos = -1;
+ regoff_t pos_add_next = 1;
+#ifdef TRE_MBSTATE
+ mbstate_t mbstate;
+#endif /* TRE_MBSTATE */
+ int reg_notbol = eflags & REG_NOTBOL;
+ int reg_noteol = eflags & REG_NOTEOL;
+ int reg_newline = tnfa->cflags & REG_NEWLINE;
+ reg_errcode_t ret;
+
+ char *buf;
+ tre_tnfa_transition_t *trans_i;
+ tre_tnfa_reach_t *reach, *reach_next, *reach_i, *reach_next_i;
+ tre_reach_pos_t *reach_pos;
+ int *tag_i;
+ int num_tags, i;
+
+ regoff_t match_eo = -1; /* end offset of match (-1 if no match found yet) */
+ int new_match = 0;
+ regoff_t *tmp_tags = NULL;
+ regoff_t *tmp_iptr;
+
+#ifdef TRE_MBSTATE
+ memset(&mbstate, '\0', sizeof(mbstate));
+#endif /* TRE_MBSTATE */
+
+ if (!match_tags)
+ num_tags = 0;
+ else
+ num_tags = tnfa->num_tags;
+
+ /* Allocate memory for temporary data required for matching. This needs to
+ be done for every matching operation to be thread safe. This allocates
+ everything in a single large block with calloc(). */
+ {
+ size_t tbytes, rbytes, pbytes, xbytes, total_bytes;
+ char *tmp_buf;
+
+ /* Ensure that tbytes and xbytes*num_states cannot overflow, and that
+ * they don't contribute more than 1/8 of SIZE_MAX to total_bytes. */
+ if (num_tags > SIZE_MAX/(8 * sizeof(regoff_t) * tnfa->num_states))
+ return REG_ESPACE;
+
+ /* Likewise check rbytes. */
+ if (tnfa->num_states+1 > SIZE_MAX/(8 * sizeof(*reach_next)))
+ return REG_ESPACE;
+
+ /* Likewise check pbytes. */
+ if (tnfa->num_states > SIZE_MAX/(8 * sizeof(*reach_pos)))
+ return REG_ESPACE;
+
+ /* Compute the length of the block we need. */
+ tbytes = sizeof(*tmp_tags) * num_tags;
+ rbytes = sizeof(*reach_next) * (tnfa->num_states + 1);
+ pbytes = sizeof(*reach_pos) * tnfa->num_states;
+ xbytes = sizeof(regoff_t) * num_tags;
+ total_bytes =
+ (sizeof(long) - 1) * 4 /* for alignment paddings */
+ + (rbytes + xbytes * tnfa->num_states) * 2 + tbytes + pbytes;
+
+ /* Allocate the memory. */
+ buf = calloc(total_bytes, 1);
+ if (buf == NULL)
+ return REG_ESPACE;
+
+ /* Get the various pointers within tmp_buf (properly aligned). */
+ tmp_tags = (void *)buf;
+ tmp_buf = buf + tbytes;
+ tmp_buf += ALIGN(tmp_buf, long);
+ reach_next = (void *)tmp_buf;
+ tmp_buf += rbytes;
+ tmp_buf += ALIGN(tmp_buf, long);
+ reach = (void *)tmp_buf;
+ tmp_buf += rbytes;
+ tmp_buf += ALIGN(tmp_buf, long);
+ reach_pos = (void *)tmp_buf;
+ tmp_buf += pbytes;
+ tmp_buf += ALIGN(tmp_buf, long);
+ for (i = 0; i < tnfa->num_states; i++)
+ {
+ reach[i].tags = (void *)tmp_buf;
+ tmp_buf += xbytes;
+ reach_next[i].tags = (void *)tmp_buf;
+ tmp_buf += xbytes;
+ }
+ }
+
+ for (i = 0; i < tnfa->num_states; i++)
+ reach_pos[i].pos = -1;
+
+ GET_NEXT_WCHAR();
+ pos = 0;
+
+ reach_next_i = reach_next;
+ while (1)
+ {
+ /* If no match found yet, add the initial states to `reach_next'. */
+ if (match_eo < 0)
+ {
+ trans_i = tnfa->initial;
+ while (trans_i->state != NULL)
+ {
+ if (reach_pos[trans_i->state_id].pos < pos)
+ {
+ if (trans_i->assertions
+ && CHECK_ASSERTIONS(trans_i->assertions))
+ {
+ trans_i++;
+ continue;
+ }
+
+ reach_next_i->state = trans_i->state;
+ for (i = 0; i < num_tags; i++)
+ reach_next_i->tags[i] = -1;
+ tag_i = trans_i->tags;
+ if (tag_i)
+ while (*tag_i >= 0)
+ {
+ if (*tag_i < num_tags)
+ reach_next_i->tags[*tag_i] = pos;
+ tag_i++;
+ }
+ if (reach_next_i->state == tnfa->final)
+ {
+ match_eo = pos;
+ new_match = 1;
+ for (i = 0; i < num_tags; i++)
+ match_tags[i] = reach_next_i->tags[i];
+ }
+ reach_pos[trans_i->state_id].pos = pos;
+ reach_pos[trans_i->state_id].tags = &reach_next_i->tags;
+ reach_next_i++;
+ }
+ trans_i++;
+ }
+ reach_next_i->state = NULL;
+ }
+ else
+ {
+ if (num_tags == 0 || reach_next_i == reach_next)
+ /* We have found a match. */
+ break;
+ }
+
+ /* Check for end of string. */
+ if (!next_c) break;
+
+ GET_NEXT_WCHAR();
+
+ /* Swap `reach' and `reach_next'. */
+ reach_i = reach;
+ reach = reach_next;
+ reach_next = reach_i;
+
+ /* For each state in `reach', weed out states that don't fulfill the
+ minimal matching conditions. */
+ if (tnfa->num_minimals && new_match)
+ {
+ new_match = 0;
+ reach_next_i = reach_next;
+ for (reach_i = reach; reach_i->state; reach_i++)
+ {
+ int skip = 0;
+ for (i = 0; tnfa->minimal_tags[i] >= 0; i += 2)
+ {
+ int end = tnfa->minimal_tags[i];
+ int start = tnfa->minimal_tags[i + 1];
+ if (end >= num_tags)
+ {
+ skip = 1;
+ break;
+ }
+ else if (reach_i->tags[start] == match_tags[start]
+ && reach_i->tags[end] < match_tags[end])
+ {
+ skip = 1;
+ break;
+ }
+ }
+ if (!skip)
+ {
+ reach_next_i->state = reach_i->state;
+ tmp_iptr = reach_next_i->tags;
+ reach_next_i->tags = reach_i->tags;
+ reach_i->tags = tmp_iptr;
+ reach_next_i++;
+ }
+ }
+ reach_next_i->state = NULL;
+
+ /* Swap `reach' and `reach_next'. */
+ reach_i = reach;
+ reach = reach_next;
+ reach_next = reach_i;
+ }
+
+ /* For each state in `reach' see if there is a transition leaving with
+ the current input symbol to a state not yet in `reach_next', and
+ add the destination states to `reach_next'. */
+ reach_next_i = reach_next;
+ for (reach_i = reach; reach_i->state; reach_i++)
+ {
+ for (trans_i = reach_i->state; trans_i->state; trans_i++)
+ {
+ /* Does this transition match the input symbol? */
+ if (trans_i->code_min <= (tre_cint_t)prev_c &&
+ trans_i->code_max >= (tre_cint_t)prev_c)
+ {
+ if (trans_i->assertions
+ && (CHECK_ASSERTIONS(trans_i->assertions)
+ || CHECK_CHAR_CLASSES(trans_i, tnfa, eflags)))
+ {
+ continue;
+ }
+
+ /* Compute the tags after this transition. */
+ for (i = 0; i < num_tags; i++)
+ tmp_tags[i] = reach_i->tags[i];
+ tag_i = trans_i->tags;
+ if (tag_i != NULL)
+ while (*tag_i >= 0)
+ {
+ if (*tag_i < num_tags)
+ tmp_tags[*tag_i] = pos;
+ tag_i++;
+ }
+
+ if (reach_pos[trans_i->state_id].pos < pos)
+ {
+ /* Found an unvisited node. */
+ reach_next_i->state = trans_i->state;
+ tmp_iptr = reach_next_i->tags;
+ reach_next_i->tags = tmp_tags;
+ tmp_tags = tmp_iptr;
+ reach_pos[trans_i->state_id].pos = pos;
+ reach_pos[trans_i->state_id].tags = &reach_next_i->tags;
+
+ if (reach_next_i->state == tnfa->final
+ && (match_eo == -1
+ || (num_tags > 0
+ && reach_next_i->tags[0] <= match_tags[0])))
+ {
+ match_eo = pos;
+ new_match = 1;
+ for (i = 0; i < num_tags; i++)
+ match_tags[i] = reach_next_i->tags[i];
+ }
+ reach_next_i++;
+
+ }
+ else
+ {
+ assert(reach_pos[trans_i->state_id].pos == pos);
+ /* Another path has also reached this state. We choose
+ the winner by examining the tag values for both
+ paths. */
+ if (tre_tag_order(num_tags, tnfa->tag_directions,
+ tmp_tags,
+ *reach_pos[trans_i->state_id].tags))
+ {
+ /* The new path wins. */
+ tmp_iptr = *reach_pos[trans_i->state_id].tags;
+ *reach_pos[trans_i->state_id].tags = tmp_tags;
+ if (trans_i->state == tnfa->final)
+ {
+ match_eo = pos;
+ new_match = 1;
+ for (i = 0; i < num_tags; i++)
+ match_tags[i] = tmp_tags[i];
+ }
+ tmp_tags = tmp_iptr;
+ }
+ }
+ }
+ }
+ }
+ reach_next_i->state = NULL;
+ }
+
+ *match_end_ofs = match_eo;
+ ret = match_eo >= 0 ? REG_OK : REG_NOMATCH;
+error_exit:
+ xfree(buf);
+ return ret;
+}
+
+
+
+/***********************************************************************
+ from tre-match-backtrack.c
+***********************************************************************/
+
+/*
+ This matcher is for regexps that use back referencing. Regexp matching
+ with back referencing is an NP-complete problem on the number of back
+ references. The easiest way to match them is to use a backtracking
+ routine which basically goes through all possible paths in the TNFA
+ and chooses the one which results in the best (leftmost and longest)
+ match. This can be spectacularly expensive and may run out of stack
+ space, but there really is no better known generic algorithm. Quoting
+ Henry Spencer from comp.compilers:
+ <URL: http://compilers.iecc.com/comparch/article/93-03-102>
+
+ POSIX.2 REs require longest match, which is really exciting to
+ implement since the obsolete ("basic") variant also includes
+ \<digit>. I haven't found a better way of tackling this than doing
+ a preliminary match using a DFA (or simulation) on a modified RE
+ that just replicates subREs for \<digit>, and then doing a
+ backtracking match to determine whether the subRE matches were
+ right. This can be rather slow, but I console myself with the
+ thought that people who use \<digit> deserve very slow execution.
+ (Pun unintentional but very appropriate.)
+
+*/
+
+typedef struct {
+ regoff_t pos;
+ const char *str_byte;
+ tre_tnfa_transition_t *state;
+ int state_id;
+ int next_c;
+ regoff_t *tags;
+#ifdef TRE_MBSTATE
+ mbstate_t mbstate;
+#endif /* TRE_MBSTATE */
+} tre_backtrack_item_t;
+
+typedef struct tre_backtrack_struct {
+ tre_backtrack_item_t item;
+ struct tre_backtrack_struct *prev;
+ struct tre_backtrack_struct *next;
+} *tre_backtrack_t;
+
+#ifdef TRE_MBSTATE
+#define BT_STACK_MBSTATE_IN stack->item.mbstate = (mbstate)
+#define BT_STACK_MBSTATE_OUT (mbstate) = stack->item.mbstate
+#else /* !TRE_MBSTATE */
+#define BT_STACK_MBSTATE_IN
+#define BT_STACK_MBSTATE_OUT
+#endif /* !TRE_MBSTATE */
+
+#define tre_bt_mem_new tre_mem_new
+#define tre_bt_mem_alloc tre_mem_alloc
+#define tre_bt_mem_destroy tre_mem_destroy
+
+
+#define BT_STACK_PUSH(_pos, _str_byte, _str_wide, _state, _state_id, _next_c, _tags, _mbstate) \
+ do \
+ { \
+ int i; \
+ if (!stack->next) \
+ { \
+ tre_backtrack_t s; \
+ s = tre_bt_mem_alloc(mem, sizeof(*s)); \
+ if (!s) \
+ { \
+ tre_bt_mem_destroy(mem); \
+ if (tags) \
+ xfree(tags); \
+ if (pmatch) \
+ xfree(pmatch); \
+ if (states_seen) \
+ xfree(states_seen); \
+ return REG_ESPACE; \
+ } \
+ s->prev = stack; \
+ s->next = NULL; \
+ s->item.tags = tre_bt_mem_alloc(mem, \
+ sizeof(*tags) * tnfa->num_tags); \
+ if (!s->item.tags) \
+ { \
+ tre_bt_mem_destroy(mem); \
+ if (tags) \
+ xfree(tags); \
+ if (pmatch) \
+ xfree(pmatch); \
+ if (states_seen) \
+ xfree(states_seen); \
+ return REG_ESPACE; \
+ } \
+ stack->next = s; \
+ stack = s; \
+ } \
+ else \
+ stack = stack->next; \
+ stack->item.pos = (_pos); \
+ stack->item.str_byte = (_str_byte); \
+ stack->item.state = (_state); \
+ stack->item.state_id = (_state_id); \
+ stack->item.next_c = (_next_c); \
+ for (i = 0; i < tnfa->num_tags; i++) \
+ stack->item.tags[i] = (_tags)[i]; \
+ BT_STACK_MBSTATE_IN; \
+ } \
+ while (0)
+
+#define BT_STACK_POP() \
+ do \
+ { \
+ int i; \
+ assert(stack->prev); \
+ pos = stack->item.pos; \
+ str_byte = stack->item.str_byte; \
+ state = stack->item.state; \
+ next_c = stack->item.next_c; \
+ for (i = 0; i < tnfa->num_tags; i++) \
+ tags[i] = stack->item.tags[i]; \
+ BT_STACK_MBSTATE_OUT; \
+ stack = stack->prev; \
+ } \
+ while (0)
+
+#undef MIN
+#define MIN(a, b) ((a) <= (b) ? (a) : (b))
+
+static reg_errcode_t
+tre_tnfa_run_backtrack(const tre_tnfa_t *tnfa, const void *string,
+ regoff_t *match_tags, int eflags, regoff_t *match_end_ofs)
+{
+ /* State variables required by GET_NEXT_WCHAR. */
+ tre_char_t prev_c = 0, next_c = 0;
+ const char *str_byte = string;
+ regoff_t pos = 0;
+ regoff_t pos_add_next = 1;
+#ifdef TRE_MBSTATE
+ mbstate_t mbstate;
+#endif /* TRE_MBSTATE */
+ int reg_notbol = eflags & REG_NOTBOL;
+ int reg_noteol = eflags & REG_NOTEOL;
+ int reg_newline = tnfa->cflags & REG_NEWLINE;
+
+ /* These are used to remember the necessary values of the above
+ variables to return to the position where the current search
+ started from. */
+ int next_c_start;
+ const char *str_byte_start;
+ regoff_t pos_start = -1;
+#ifdef TRE_MBSTATE
+ mbstate_t mbstate_start;
+#endif /* TRE_MBSTATE */
+
+ /* End offset of best match so far, or -1 if no match found yet. */
+ regoff_t match_eo = -1;
+ /* Tag arrays. */
+ int *next_tags;
+ regoff_t *tags = NULL;
+ /* Current TNFA state. */
+ tre_tnfa_transition_t *state;
+ int *states_seen = NULL;
+
+ /* Memory allocator to for allocating the backtracking stack. */
+ tre_mem_t mem = tre_bt_mem_new();
+
+ /* The backtracking stack. */
+ tre_backtrack_t stack;
+
+ tre_tnfa_transition_t *trans_i;
+ regmatch_t *pmatch = NULL;
+ int ret;
+
+#ifdef TRE_MBSTATE
+ memset(&mbstate, '\0', sizeof(mbstate));
+#endif /* TRE_MBSTATE */
+
+ if (!mem)
+ return REG_ESPACE;
+ stack = tre_bt_mem_alloc(mem, sizeof(*stack));
+ if (!stack)
+ {
+ ret = REG_ESPACE;
+ goto error_exit;
+ }
+ stack->prev = NULL;
+ stack->next = NULL;
+
+ if (tnfa->num_tags)
+ {
+ tags = xmalloc(sizeof(*tags) * tnfa->num_tags);
+ if (!tags)
+ {
+ ret = REG_ESPACE;
+ goto error_exit;
+ }
+ }
+ if (tnfa->num_submatches)
+ {
+ pmatch = xmalloc(sizeof(*pmatch) * tnfa->num_submatches);
+ if (!pmatch)
+ {
+ ret = REG_ESPACE;
+ goto error_exit;
+ }
+ }
+ if (tnfa->num_states)
+ {
+ states_seen = xmalloc(sizeof(*states_seen) * tnfa->num_states);
+ if (!states_seen)
+ {
+ ret = REG_ESPACE;
+ goto error_exit;
+ }
+ }
+
+ retry:
+ {
+ int i;
+ for (i = 0; i < tnfa->num_tags; i++)
+ {
+ tags[i] = -1;
+ if (match_tags)
+ match_tags[i] = -1;
+ }
+ for (i = 0; i < tnfa->num_states; i++)
+ states_seen[i] = 0;
+ }
+
+ state = NULL;
+ pos = pos_start;
+ GET_NEXT_WCHAR();
+ pos_start = pos;
+ next_c_start = next_c;
+ str_byte_start = str_byte;
+#ifdef TRE_MBSTATE
+ mbstate_start = mbstate;
+#endif /* TRE_MBSTATE */
+
+ /* Handle initial states. */
+ next_tags = NULL;
+ for (trans_i = tnfa->initial; trans_i->state; trans_i++)
+ {
+ if (trans_i->assertions && CHECK_ASSERTIONS(trans_i->assertions))
+ {
+ continue;
+ }
+ if (state == NULL)
+ {
+ /* Start from this state. */
+ state = trans_i->state;
+ next_tags = trans_i->tags;
+ }
+ else
+ {
+ /* Backtrack to this state. */
+ BT_STACK_PUSH(pos, str_byte, 0, trans_i->state,
+ trans_i->state_id, next_c, tags, mbstate);
+ {
+ int *tmp = trans_i->tags;
+ if (tmp)
+ while (*tmp >= 0)
+ stack->item.tags[*tmp++] = pos;
+ }
+ }
+ }
+
+ if (next_tags)
+ for (; *next_tags >= 0; next_tags++)
+ tags[*next_tags] = pos;
+
+
+ if (state == NULL)
+ goto backtrack;
+
+ while (1)
+ {
+ tre_tnfa_transition_t *next_state;
+ int empty_br_match;
+
+ if (state == tnfa->final)
+ {
+ if (match_eo < pos
+ || (match_eo == pos
+ && match_tags
+ && tre_tag_order(tnfa->num_tags, tnfa->tag_directions,
+ tags, match_tags)))
+ {
+ int i;
+ /* This match wins the previous match. */
+ match_eo = pos;
+ if (match_tags)
+ for (i = 0; i < tnfa->num_tags; i++)
+ match_tags[i] = tags[i];
+ }
+ /* Our TNFAs never have transitions leaving from the final state,
+ so we jump right to backtracking. */
+ goto backtrack;
+ }
+
+ /* Go to the next character in the input string. */
+ empty_br_match = 0;
+ trans_i = state;
+ if (trans_i->state && trans_i->assertions & ASSERT_BACKREF)
+ {
+ /* This is a back reference state. All transitions leaving from
+ this state have the same back reference "assertion". Instead
+ of reading the next character, we match the back reference. */
+ regoff_t so, eo;
+ int bt = trans_i->u.backref;
+ regoff_t bt_len;
+ int result;
+
+ /* Get the substring we need to match against. Remember to
+ turn off REG_NOSUB temporarily. */
+ tre_fill_pmatch(bt + 1, pmatch, tnfa->cflags & ~REG_NOSUB,
+ tnfa, tags, pos);
+ so = pmatch[bt].rm_so;
+ eo = pmatch[bt].rm_eo;
+ bt_len = eo - so;
+
+ result = strncmp((const char*)string + so, str_byte - 1,
+ (size_t)bt_len);
+
+ if (result == 0)
+ {
+ /* Back reference matched. Check for infinite loop. */
+ if (bt_len == 0)
+ empty_br_match = 1;
+ if (empty_br_match && states_seen[trans_i->state_id])
+ {
+ goto backtrack;
+ }
+
+ states_seen[trans_i->state_id] = empty_br_match;
+
+ /* Advance in input string and resync `prev_c', `next_c'
+ and pos. */
+ str_byte += bt_len - 1;
+ pos += bt_len - 1;
+ GET_NEXT_WCHAR();
+ }
+ else
+ {
+ goto backtrack;
+ }
+ }
+ else
+ {
+ /* Check for end of string. */
+ if (next_c == L'\0')
+ goto backtrack;
+
+ /* Read the next character. */
+ GET_NEXT_WCHAR();
+ }
+
+ next_state = NULL;
+ for (trans_i = state; trans_i->state; trans_i++)
+ {
+ if (trans_i->code_min <= (tre_cint_t)prev_c
+ && trans_i->code_max >= (tre_cint_t)prev_c)
+ {
+ if (trans_i->assertions
+ && (CHECK_ASSERTIONS(trans_i->assertions)
+ || CHECK_CHAR_CLASSES(trans_i, tnfa, eflags)))
+ {
+ continue;
+ }
+
+ if (next_state == NULL)
+ {
+ /* First matching transition. */
+ next_state = trans_i->state;
+ next_tags = trans_i->tags;
+ }
+ else
+ {
+ /* Second matching transition. We may need to backtrack here
+ to take this transition instead of the first one, so we
+ push this transition in the backtracking stack so we can
+ jump back here if needed. */
+ BT_STACK_PUSH(pos, str_byte, 0, trans_i->state,
+ trans_i->state_id, next_c, tags, mbstate);
+ {
+ int *tmp;
+ for (tmp = trans_i->tags; tmp && *tmp >= 0; tmp++)
+ stack->item.tags[*tmp] = pos;
+ }
+#if 0 /* XXX - it's important not to look at all transitions here to keep
+ the stack small! */
+ break;
+#endif
+ }
+ }
+ }
+
+ if (next_state != NULL)
+ {
+ /* Matching transitions were found. Take the first one. */
+ state = next_state;
+
+ /* Update the tag values. */
+ if (next_tags)
+ while (*next_tags >= 0)
+ tags[*next_tags++] = pos;
+ }
+ else
+ {
+ backtrack:
+ /* A matching transition was not found. Try to backtrack. */
+ if (stack->prev)
+ {
+ if (stack->item.state->assertions & ASSERT_BACKREF)
+ {
+ states_seen[stack->item.state_id] = 0;
+ }
+
+ BT_STACK_POP();
+ }
+ else if (match_eo < 0)
+ {
+ /* Try starting from a later position in the input string. */
+ /* Check for end of string. */
+ if (next_c == L'\0')
+ {
+ break;
+ }
+ next_c = next_c_start;
+#ifdef TRE_MBSTATE
+ mbstate = mbstate_start;
+#endif /* TRE_MBSTATE */
+ str_byte = str_byte_start;
+ goto retry;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+
+ ret = match_eo >= 0 ? REG_OK : REG_NOMATCH;
+ *match_end_ofs = match_eo;
+
+ error_exit:
+ tre_bt_mem_destroy(mem);
+#ifndef TRE_USE_ALLOCA
+ if (tags)
+ xfree(tags);
+ if (pmatch)
+ xfree(pmatch);
+ if (states_seen)
+ xfree(states_seen);
+#endif /* !TRE_USE_ALLOCA */
+
+ return ret;
+}
+
+/***********************************************************************
+ from regexec.c
+***********************************************************************/
+
+/* Fills the POSIX.2 regmatch_t array according to the TNFA tag and match
+ endpoint values. */
+static void
+tre_fill_pmatch(size_t nmatch, regmatch_t pmatch[], int cflags,
+ const tre_tnfa_t *tnfa, regoff_t *tags, regoff_t match_eo)
+{
+ tre_submatch_data_t *submatch_data;
+ unsigned int i, j;
+ int *parents;
+
+ i = 0;
+ if (match_eo >= 0 && !(cflags & REG_NOSUB))
+ {
+ /* Construct submatch offsets from the tags. */
+ submatch_data = tnfa->submatch_data;
+ while (i < tnfa->num_submatches && i < nmatch)
+ {
+ if (submatch_data[i].so_tag == tnfa->end_tag)
+ pmatch[i].rm_so = match_eo;
+ else
+ pmatch[i].rm_so = tags[submatch_data[i].so_tag];
+
+ if (submatch_data[i].eo_tag == tnfa->end_tag)
+ pmatch[i].rm_eo = match_eo;
+ else
+ pmatch[i].rm_eo = tags[submatch_data[i].eo_tag];
+
+ /* If either of the endpoints were not used, this submatch
+ was not part of the match. */
+ if (pmatch[i].rm_so == -1 || pmatch[i].rm_eo == -1)
+ pmatch[i].rm_so = pmatch[i].rm_eo = -1;
+
+ i++;
+ }
+ /* Reset all submatches that are not within all of their parent
+ submatches. */
+ i = 0;
+ while (i < tnfa->num_submatches && i < nmatch)
+ {
+ if (pmatch[i].rm_eo == -1)
+ assert(pmatch[i].rm_so == -1);
+ assert(pmatch[i].rm_so <= pmatch[i].rm_eo);
+
+ parents = submatch_data[i].parents;
+ if (parents != NULL)
+ for (j = 0; parents[j] >= 0; j++)
+ {
+ if (pmatch[i].rm_so < pmatch[parents[j]].rm_so
+ || pmatch[i].rm_eo > pmatch[parents[j]].rm_eo)
+ pmatch[i].rm_so = pmatch[i].rm_eo = -1;
+ }
+ i++;
+ }
+ }
+
+ while (i < nmatch)
+ {
+ pmatch[i].rm_so = -1;
+ pmatch[i].rm_eo = -1;
+ i++;
+ }
+}
+
+
+/*
+ Wrapper functions for POSIX compatible regexp matching.
+*/
+
+int
+regexec(const regex_t *restrict preg, const char *restrict string,
+ size_t nmatch, regmatch_t pmatch[restrict], int eflags)
+{
+ tre_tnfa_t *tnfa = (void *)preg->TRE_REGEX_T_FIELD;
+ reg_errcode_t status;
+ regoff_t *tags = NULL, eo;
+ if (tnfa->cflags & REG_NOSUB) nmatch = 0;
+ if (tnfa->num_tags > 0 && nmatch > 0)
+ {
+ tags = xmalloc(sizeof(*tags) * tnfa->num_tags);
+ if (tags == NULL)
+ return REG_ESPACE;
+ }
+
+ /* Dispatch to the appropriate matcher. */
+ if (tnfa->have_backrefs)
+ {
+ /* The regex has back references, use the backtracking matcher. */
+ status = tre_tnfa_run_backtrack(tnfa, string, tags, eflags, &eo);
+ }
+ else
+ {
+ /* Exact matching, no back references, use the parallel matcher. */
+ status = tre_tnfa_run_parallel(tnfa, string, tags, eflags, &eo);
+ }
+
+ if (status == REG_OK)
+ /* A match was found, so fill the submatch registers. */
+ tre_fill_pmatch(nmatch, pmatch, tnfa->cflags, tnfa, tags, eo);
+ if (tags)
+ xfree(tags);
+ return status;
+}
diff --git a/libc-top-half/musl/src/regex/tre-mem.c b/libc-top-half/musl/src/regex/tre-mem.c
new file mode 100644
index 0000000..86f809d
--- /dev/null
+++ b/libc-top-half/musl/src/regex/tre-mem.c
@@ -0,0 +1,158 @@
+/*
+ tre-mem.c - TRE memory allocator
+
+ Copyright (c) 2001-2009 Ville Laurikari <vl@iki.fi>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/*
+ This memory allocator is for allocating small memory blocks efficiently
+ in terms of memory overhead and execution speed. The allocated blocks
+ cannot be freed individually, only all at once. There can be multiple
+ allocators, though.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "tre.h"
+
+/*
+ This memory allocator is for allocating small memory blocks efficiently
+ in terms of memory overhead and execution speed. The allocated blocks
+ cannot be freed individually, only all at once. There can be multiple
+ allocators, though.
+*/
+
+/* Returns a new memory allocator or NULL if out of memory. */
+tre_mem_t
+tre_mem_new_impl(int provided, void *provided_block)
+{
+ tre_mem_t mem;
+ if (provided)
+ {
+ mem = provided_block;
+ memset(mem, 0, sizeof(*mem));
+ }
+ else
+ mem = xcalloc(1, sizeof(*mem));
+ if (mem == NULL)
+ return NULL;
+ return mem;
+}
+
+
+/* Frees the memory allocator and all memory allocated with it. */
+void
+tre_mem_destroy(tre_mem_t mem)
+{
+ tre_list_t *tmp, *l = mem->blocks;
+
+ while (l != NULL)
+ {
+ xfree(l->data);
+ tmp = l->next;
+ xfree(l);
+ l = tmp;
+ }
+ xfree(mem);
+}
+
+
+/* Allocates a block of `size' bytes from `mem'. Returns a pointer to the
+ allocated block or NULL if an underlying malloc() failed. */
+void *
+tre_mem_alloc_impl(tre_mem_t mem, int provided, void *provided_block,
+ int zero, size_t size)
+{
+ void *ptr;
+
+ if (mem->failed)
+ {
+ return NULL;
+ }
+
+ if (mem->n < size)
+ {
+ /* We need more memory than is available in the current block.
+ Allocate a new block. */
+ tre_list_t *l;
+ if (provided)
+ {
+ if (provided_block == NULL)
+ {
+ mem->failed = 1;
+ return NULL;
+ }
+ mem->ptr = provided_block;
+ mem->n = TRE_MEM_BLOCK_SIZE;
+ }
+ else
+ {
+ int block_size;
+ if (size * 8 > TRE_MEM_BLOCK_SIZE)
+ block_size = size * 8;
+ else
+ block_size = TRE_MEM_BLOCK_SIZE;
+ l = xmalloc(sizeof(*l));
+ if (l == NULL)
+ {
+ mem->failed = 1;
+ return NULL;
+ }
+ l->data = xmalloc(block_size);
+ if (l->data == NULL)
+ {
+ xfree(l);
+ mem->failed = 1;
+ return NULL;
+ }
+ l->next = NULL;
+ if (mem->current != NULL)
+ mem->current->next = l;
+ if (mem->blocks == NULL)
+ mem->blocks = l;
+ mem->current = l;
+ mem->ptr = l->data;
+ mem->n = block_size;
+ }
+ }
+
+ /* Make sure the next pointer will be aligned. */
+ size += ALIGN(mem->ptr + size, long);
+
+ /* Allocate from current block. */
+ ptr = mem->ptr;
+ mem->ptr += size;
+ mem->n -= size;
+
+ /* Set to zero if needed. */
+ if (zero)
+ memset(ptr, 0, size);
+
+ return ptr;
+}
diff --git a/libc-top-half/musl/src/regex/tre.h b/libc-top-half/musl/src/regex/tre.h
new file mode 100644
index 0000000..aed64f3
--- /dev/null
+++ b/libc-top-half/musl/src/regex/tre.h
@@ -0,0 +1,233 @@
+/*
+ tre-internal.h - TRE internal definitions
+
+ Copyright (c) 2001-2009 Ville Laurikari <vl@iki.fi>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+#include <regex.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#undef TRE_MBSTATE
+
+#ifdef __wasilibc_unmodified_upstream // Allow NDEBUG to be predefined.
+#define NDEBUG
+#endif
+
+#define TRE_REGEX_T_FIELD __opaque
+typedef int reg_errcode_t;
+
+typedef wchar_t tre_char_t;
+
+#define DPRINT(msg) do { } while(0)
+
+#define elementsof(x) ( sizeof(x) / sizeof(x[0]) )
+
+#define tre_mbrtowc(pwc, s, n, ps) (mbtowc((pwc), (s), (n)))
+
+/* Wide characters. */
+typedef wint_t tre_cint_t;
+#define TRE_CHAR_MAX 0x10ffff
+
+#define tre_isalnum iswalnum
+#define tre_isalpha iswalpha
+#define tre_isblank iswblank
+#define tre_iscntrl iswcntrl
+#define tre_isdigit iswdigit
+#define tre_isgraph iswgraph
+#define tre_islower iswlower
+#define tre_isprint iswprint
+#define tre_ispunct iswpunct
+#define tre_isspace iswspace
+#define tre_isupper iswupper
+#define tre_isxdigit iswxdigit
+
+#define tre_tolower towlower
+#define tre_toupper towupper
+#define tre_strlen wcslen
+
+/* Use system provided iswctype() and wctype(). */
+typedef wctype_t tre_ctype_t;
+#define tre_isctype iswctype
+#define tre_ctype wctype
+
+/* Returns number of bytes to add to (char *)ptr to make it
+ properly aligned for the type. */
+#define ALIGN(ptr, type) \
+ ((((long)ptr) % sizeof(type)) \
+ ? (sizeof(type) - (((long)ptr) % sizeof(type))) \
+ : 0)
+
+#undef MAX
+#undef MIN
+#define MAX(a, b) (((a) >= (b)) ? (a) : (b))
+#define MIN(a, b) (((a) <= (b)) ? (a) : (b))
+
+/* TNFA transition type. A TNFA state is an array of transitions,
+ the terminator is a transition with NULL `state'. */
+typedef struct tnfa_transition tre_tnfa_transition_t;
+
+struct tnfa_transition {
+ /* Range of accepted characters. */
+ tre_cint_t code_min;
+ tre_cint_t code_max;
+ /* Pointer to the destination state. */
+ tre_tnfa_transition_t *state;
+ /* ID number of the destination state. */
+ int state_id;
+ /* -1 terminated array of tags (or NULL). */
+ int *tags;
+ /* Assertion bitmap. */
+ int assertions;
+ /* Assertion parameters. */
+ union {
+ /* Character class assertion. */
+ tre_ctype_t class;
+ /* Back reference assertion. */
+ int backref;
+ } u;
+ /* Negative character class assertions. */
+ tre_ctype_t *neg_classes;
+};
+
+
+/* Assertions. */
+#define ASSERT_AT_BOL 1 /* Beginning of line. */
+#define ASSERT_AT_EOL 2 /* End of line. */
+#define ASSERT_CHAR_CLASS 4 /* Character class in `class'. */
+#define ASSERT_CHAR_CLASS_NEG 8 /* Character classes in `neg_classes'. */
+#define ASSERT_AT_BOW 16 /* Beginning of word. */
+#define ASSERT_AT_EOW 32 /* End of word. */
+#define ASSERT_AT_WB 64 /* Word boundary. */
+#define ASSERT_AT_WB_NEG 128 /* Not a word boundary. */
+#define ASSERT_BACKREF 256 /* A back reference in `backref'. */
+#define ASSERT_LAST 256
+
+/* Tag directions. */
+typedef enum {
+ TRE_TAG_MINIMIZE = 0,
+ TRE_TAG_MAXIMIZE = 1
+} tre_tag_direction_t;
+
+/* Instructions to compute submatch register values from tag values
+ after a successful match. */
+struct tre_submatch_data {
+ /* Tag that gives the value for rm_so (submatch start offset). */
+ int so_tag;
+ /* Tag that gives the value for rm_eo (submatch end offset). */
+ int eo_tag;
+ /* List of submatches this submatch is contained in. */
+ int *parents;
+};
+
+typedef struct tre_submatch_data tre_submatch_data_t;
+
+
+/* TNFA definition. */
+typedef struct tnfa tre_tnfa_t;
+
+struct tnfa {
+ tre_tnfa_transition_t *transitions;
+ unsigned int num_transitions;
+ tre_tnfa_transition_t *initial;
+ tre_tnfa_transition_t *final;
+ tre_submatch_data_t *submatch_data;
+ char *firstpos_chars;
+ int first_char;
+ unsigned int num_submatches;
+ tre_tag_direction_t *tag_directions;
+ int *minimal_tags;
+ int num_tags;
+ int num_minimals;
+ int end_tag;
+ int num_states;
+ int cflags;
+ int have_backrefs;
+ int have_approx;
+};
+
+/* from tre-mem.h: */
+
+#define TRE_MEM_BLOCK_SIZE 1024
+
+typedef struct tre_list {
+ void *data;
+ struct tre_list *next;
+} tre_list_t;
+
+typedef struct tre_mem_struct {
+ tre_list_t *blocks;
+ tre_list_t *current;
+ char *ptr;
+ size_t n;
+ int failed;
+ void **provided;
+} *tre_mem_t;
+
+#define tre_mem_new_impl __tre_mem_new_impl
+#define tre_mem_alloc_impl __tre_mem_alloc_impl
+#define tre_mem_destroy __tre_mem_destroy
+
+hidden tre_mem_t tre_mem_new_impl(int provided, void *provided_block);
+hidden void *tre_mem_alloc_impl(tre_mem_t mem, int provided, void *provided_block,
+ int zero, size_t size);
+
+/* Returns a new memory allocator or NULL if out of memory. */
+#define tre_mem_new() tre_mem_new_impl(0, NULL)
+
+/* Allocates a block of `size' bytes from `mem'. Returns a pointer to the
+ allocated block or NULL if an underlying malloc() failed. */
+#define tre_mem_alloc(mem, size) tre_mem_alloc_impl(mem, 0, NULL, 0, size)
+
+/* Allocates a block of `size' bytes from `mem'. Returns a pointer to the
+ allocated block or NULL if an underlying malloc() failed. The memory
+ is set to zero. */
+#define tre_mem_calloc(mem, size) tre_mem_alloc_impl(mem, 0, NULL, 1, size)
+
+#ifdef TRE_USE_ALLOCA
+/* alloca() versions. Like above, but memory is allocated with alloca()
+ instead of malloc(). */
+
+#define tre_mem_newa() \
+ tre_mem_new_impl(1, alloca(sizeof(struct tre_mem_struct)))
+
+#define tre_mem_alloca(mem, size) \
+ ((mem)->n >= (size) \
+ ? tre_mem_alloc_impl((mem), 1, NULL, 0, (size)) \
+ : tre_mem_alloc_impl((mem), 1, alloca(TRE_MEM_BLOCK_SIZE), 0, (size)))
+#endif /* TRE_USE_ALLOCA */
+
+
+/* Frees the memory allocator and all memory allocated with it. */
+hidden void tre_mem_destroy(tre_mem_t mem);
+
+#define xmalloc malloc
+#define xcalloc calloc
+#define xfree free
+#define xrealloc realloc
+
diff --git a/libc-top-half/musl/src/sched/affinity.c b/libc-top-half/musl/src/sched/affinity.c
new file mode 100644
index 0000000..948ece4
--- /dev/null
+++ b/libc-top-half/musl/src/sched/affinity.c
@@ -0,0 +1,33 @@
+#define _GNU_SOURCE
+#include <sched.h>
+#include <string.h>
+#include "pthread_impl.h"
+#include "syscall.h"
+
+int sched_setaffinity(pid_t tid, size_t size, const cpu_set_t *set)
+{
+ return syscall(SYS_sched_setaffinity, tid, size, set);
+}
+
+int pthread_setaffinity_np(pthread_t td, size_t size, const cpu_set_t *set)
+{
+ return -__syscall(SYS_sched_setaffinity, td->tid, size, set);
+}
+
+static int do_getaffinity(pid_t tid, size_t size, cpu_set_t *set)
+{
+ long ret = __syscall(SYS_sched_getaffinity, tid, size, set);
+ if (ret < 0) return ret;
+ if (ret < size) memset((char *)set+ret, 0, size-ret);
+ return 0;
+}
+
+int sched_getaffinity(pid_t tid, size_t size, cpu_set_t *set)
+{
+ return __syscall_ret(do_getaffinity(tid, size, set));
+}
+
+int pthread_getaffinity_np(pthread_t td, size_t size, cpu_set_t *set)
+{
+ return -do_getaffinity(td->tid, size, set);
+}
diff --git a/libc-top-half/musl/src/sched/sched_cpucount.c b/libc-top-half/musl/src/sched/sched_cpucount.c
new file mode 100644
index 0000000..94aa259
--- /dev/null
+++ b/libc-top-half/musl/src/sched/sched_cpucount.c
@@ -0,0 +1,11 @@
+#define _GNU_SOURCE
+#include <sched.h>
+
+int __sched_cpucount(size_t size, const cpu_set_t *set)
+{
+ size_t i, j, cnt=0;
+ const unsigned char *p = (const void *)set;
+ for (i=0; i<size; i++) for (j=0; j<8; j++)
+ if (p[i] & (1<<j)) cnt++;
+ return cnt;
+}
diff --git a/libc-top-half/musl/src/sched/sched_get_priority_max.c b/libc-top-half/musl/src/sched/sched_get_priority_max.c
new file mode 100644
index 0000000..30ae510
--- /dev/null
+++ b/libc-top-half/musl/src/sched/sched_get_priority_max.c
@@ -0,0 +1,12 @@
+#include <sched.h>
+#include "syscall.h"
+
+int sched_get_priority_max(int policy)
+{
+ return syscall(SYS_sched_get_priority_max, policy);
+}
+
+int sched_get_priority_min(int policy)
+{
+ return syscall(SYS_sched_get_priority_min, policy);
+}
diff --git a/libc-top-half/musl/src/sched/sched_getcpu.c b/libc-top-half/musl/src/sched/sched_getcpu.c
new file mode 100644
index 0000000..4ec5eaf
--- /dev/null
+++ b/libc-top-half/musl/src/sched/sched_getcpu.c
@@ -0,0 +1,42 @@
+#define _GNU_SOURCE
+#include <errno.h>
+#include <sched.h>
+#include "syscall.h"
+#include "atomic.h"
+
+#ifdef VDSO_GETCPU_SYM
+
+static void *volatile vdso_func;
+
+typedef long (*getcpu_f)(unsigned *, unsigned *, void *);
+
+static long getcpu_init(unsigned *cpu, unsigned *node, void *unused)
+{
+ void *p = __vdsosym(VDSO_GETCPU_VER, VDSO_GETCPU_SYM);
+ getcpu_f f = (getcpu_f)p;
+ a_cas_p(&vdso_func, (void *)getcpu_init, p);
+ return f ? f(cpu, node, unused) : -ENOSYS;
+}
+
+static void *volatile vdso_func = (void *)getcpu_init;
+
+#endif
+
+int sched_getcpu(void)
+{
+ int r;
+ unsigned cpu;
+
+#ifdef VDSO_GETCPU_SYM
+ getcpu_f f = (getcpu_f)vdso_func;
+ if (f) {
+ r = f(&cpu, 0, 0);
+ if (!r) return cpu;
+ if (r != -ENOSYS) return __syscall_ret(r);
+ }
+#endif
+
+ r = __syscall(SYS_getcpu, &cpu, 0, 0);
+ if (!r) return cpu;
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/sched/sched_getparam.c b/libc-top-half/musl/src/sched/sched_getparam.c
new file mode 100644
index 0000000..76f10e4
--- /dev/null
+++ b/libc-top-half/musl/src/sched/sched_getparam.c
@@ -0,0 +1,8 @@
+#include <sched.h>
+#include <errno.h>
+#include "syscall.h"
+
+int sched_getparam(pid_t pid, struct sched_param *param)
+{
+ return __syscall_ret(-ENOSYS);
+}
diff --git a/libc-top-half/musl/src/sched/sched_getscheduler.c b/libc-top-half/musl/src/sched/sched_getscheduler.c
new file mode 100644
index 0000000..394e508
--- /dev/null
+++ b/libc-top-half/musl/src/sched/sched_getscheduler.c
@@ -0,0 +1,8 @@
+#include <sched.h>
+#include <errno.h>
+#include "syscall.h"
+
+int sched_getscheduler(pid_t pid)
+{
+ return __syscall_ret(-ENOSYS);
+}
diff --git a/libc-top-half/musl/src/sched/sched_rr_get_interval.c b/libc-top-half/musl/src/sched/sched_rr_get_interval.c
new file mode 100644
index 0000000..33a3d1a
--- /dev/null
+++ b/libc-top-half/musl/src/sched/sched_rr_get_interval.c
@@ -0,0 +1,21 @@
+#include <sched.h>
+#include "syscall.h"
+
+int sched_rr_get_interval(pid_t pid, struct timespec *ts)
+{
+#ifdef SYS_sched_rr_get_interval_time64
+ /* On a 32-bit arch, use the old syscall if it exists. */
+ if (SYS_sched_rr_get_interval != SYS_sched_rr_get_interval_time64) {
+ long ts32[2];
+ int r = __syscall(SYS_sched_rr_get_interval, pid, ts32);
+ if (!r) {
+ ts->tv_sec = ts32[0];
+ ts->tv_nsec = ts32[1];
+ }
+ return __syscall_ret(r);
+ }
+#endif
+ /* If reaching this point, it's a 64-bit arch or time64-only
+ * 32-bit arch and we can get result directly into timespec. */
+ return syscall(SYS_sched_rr_get_interval, pid, ts);
+}
diff --git a/libc-top-half/musl/src/sched/sched_setparam.c b/libc-top-half/musl/src/sched/sched_setparam.c
new file mode 100644
index 0000000..18623ee
--- /dev/null
+++ b/libc-top-half/musl/src/sched/sched_setparam.c
@@ -0,0 +1,8 @@
+#include <sched.h>
+#include <errno.h>
+#include "syscall.h"
+
+int sched_setparam(pid_t pid, const struct sched_param *param)
+{
+ return __syscall_ret(-ENOSYS);
+}
diff --git a/libc-top-half/musl/src/sched/sched_setscheduler.c b/libc-top-half/musl/src/sched/sched_setscheduler.c
new file mode 100644
index 0000000..4435f21
--- /dev/null
+++ b/libc-top-half/musl/src/sched/sched_setscheduler.c
@@ -0,0 +1,8 @@
+#include <sched.h>
+#include <errno.h>
+#include "syscall.h"
+
+int sched_setscheduler(pid_t pid, int sched, const struct sched_param *param)
+{
+ return __syscall_ret(-ENOSYS);
+}
diff --git a/libc-top-half/musl/src/sched/sched_yield.c b/libc-top-half/musl/src/sched/sched_yield.c
new file mode 100644
index 0000000..ee6f0e7
--- /dev/null
+++ b/libc-top-half/musl/src/sched/sched_yield.c
@@ -0,0 +1,7 @@
+#include <sched.h>
+#include "syscall.h"
+
+int sched_yield()
+{
+ return syscall(SYS_sched_yield);
+}
diff --git a/libc-top-half/musl/src/search/hsearch.c b/libc-top-half/musl/src/search/hsearch.c
new file mode 100644
index 0000000..b3ac879
--- /dev/null
+++ b/libc-top-half/musl/src/search/hsearch.c
@@ -0,0 +1,153 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <string.h>
+#include <search.h>
+
+/*
+open addressing hash table with 2^n table size
+quadratic probing is used in case of hash collision
+tab indices and hash are size_t
+after resize fails with ENOMEM the state of tab is still usable
+
+with the posix api items cannot be iterated and length cannot be queried
+*/
+
+#define MINSIZE 8
+#define MAXSIZE ((size_t)-1/2 + 1)
+
+struct __tab {
+ ENTRY *entries;
+ size_t mask;
+ size_t used;
+};
+
+static struct hsearch_data htab;
+
+static int __hcreate_r(size_t, struct hsearch_data *);
+static void __hdestroy_r(struct hsearch_data *);
+static int __hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *);
+
+static size_t keyhash(char *k)
+{
+ unsigned char *p = (void *)k;
+ size_t h = 0;
+
+ while (*p)
+ h = 31*h + *p++;
+ return h;
+}
+
+static int resize(size_t nel, struct hsearch_data *htab)
+{
+ size_t newsize;
+ size_t i, j;
+ ENTRY *e, *newe;
+ ENTRY *oldtab = htab->__tab->entries;
+ ENTRY *oldend = htab->__tab->entries + htab->__tab->mask + 1;
+
+ if (nel > MAXSIZE)
+ nel = MAXSIZE;
+ for (newsize = MINSIZE; newsize < nel; newsize *= 2);
+ htab->__tab->entries = calloc(newsize, sizeof *htab->__tab->entries);
+ if (!htab->__tab->entries) {
+ htab->__tab->entries = oldtab;
+ return 0;
+ }
+ htab->__tab->mask = newsize - 1;
+ if (!oldtab)
+ return 1;
+ for (e = oldtab; e < oldend; e++)
+ if (e->key) {
+ for (i=keyhash(e->key),j=1; ; i+=j++) {
+ newe = htab->__tab->entries + (i & htab->__tab->mask);
+ if (!newe->key)
+ break;
+ }
+ *newe = *e;
+ }
+ free(oldtab);
+ return 1;
+}
+
+int hcreate(size_t nel)
+{
+ return __hcreate_r(nel, &htab);
+}
+
+void hdestroy(void)
+{
+ __hdestroy_r(&htab);
+}
+
+static ENTRY *lookup(char *key, size_t hash, struct hsearch_data *htab)
+{
+ size_t i, j;
+ ENTRY *e;
+
+ for (i=hash,j=1; ; i+=j++) {
+ e = htab->__tab->entries + (i & htab->__tab->mask);
+ if (!e->key || strcmp(e->key, key) == 0)
+ break;
+ }
+ return e;
+}
+
+ENTRY *hsearch(ENTRY item, ACTION action)
+{
+ ENTRY *e;
+
+ __hsearch_r(item, action, &e, &htab);
+ return e;
+}
+
+static int __hcreate_r(size_t nel, struct hsearch_data *htab)
+{
+ int r;
+
+ htab->__tab = calloc(1, sizeof *htab->__tab);
+ if (!htab->__tab)
+ return 0;
+ r = resize(nel, htab);
+ if (r == 0) {
+ free(htab->__tab);
+ htab->__tab = 0;
+ }
+ return r;
+}
+weak_alias(__hcreate_r, hcreate_r);
+
+static void __hdestroy_r(struct hsearch_data *htab)
+{
+ if (htab->__tab) free(htab->__tab->entries);
+ free(htab->__tab);
+ htab->__tab = 0;
+}
+weak_alias(__hdestroy_r, hdestroy_r);
+
+static int __hsearch_r(ENTRY item, ACTION action, ENTRY **retval, struct hsearch_data *htab)
+{
+ size_t hash = keyhash(item.key);
+ ENTRY *e = lookup(item.key, hash, htab);
+
+ if (e->key) {
+ *retval = e;
+ return 1;
+ }
+ if (action == FIND) {
+ *retval = 0;
+ return 0;
+ }
+ *e = item;
+ if (++htab->__tab->used > htab->__tab->mask - htab->__tab->mask/4) {
+ if (!resize(2*htab->__tab->used, htab)) {
+ htab->__tab->used--;
+ e->key = 0;
+ *retval = 0;
+ return 0;
+ }
+ e = lookup(item.key, hash, htab);
+ }
+ *retval = e;
+ return 1;
+}
+weak_alias(__hsearch_r, hsearch_r);
diff --git a/libc-top-half/musl/src/search/insque.c b/libc-top-half/musl/src/search/insque.c
new file mode 100644
index 0000000..b7475d8
--- /dev/null
+++ b/libc-top-half/musl/src/search/insque.c
@@ -0,0 +1,32 @@
+#include <search.h>
+
+struct node {
+ struct node *next;
+ struct node *prev;
+};
+
+void insque(void *element, void *pred)
+{
+ struct node *e = element;
+ struct node *p = pred;
+
+ if (!p) {
+ e->next = e->prev = 0;
+ return;
+ }
+ e->next = p->next;
+ e->prev = p;
+ p->next = e;
+ if (e->next)
+ e->next->prev = e;
+}
+
+void remque(void *element)
+{
+ struct node *e = element;
+
+ if (e->next)
+ e->next->prev = e->prev;
+ if (e->prev)
+ e->prev->next = e->next;
+}
diff --git a/libc-top-half/musl/src/search/lsearch.c b/libc-top-half/musl/src/search/lsearch.c
new file mode 100644
index 0000000..5eb5cc2
--- /dev/null
+++ b/libc-top-half/musl/src/search/lsearch.c
@@ -0,0 +1,31 @@
+#include <search.h>
+#include <string.h>
+
+void *lsearch(const void *key, void *base, size_t *nelp, size_t width,
+ int (*compar)(const void *, const void *))
+{
+ char (*p)[width] = base;
+ size_t n = *nelp;
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ if (compar(key, p[i]) == 0)
+ return p[i];
+ *nelp = n+1;
+ return memcpy(p[n], key, width);
+}
+
+void *lfind(const void *key, const void *base, size_t *nelp,
+ size_t width, int (*compar)(const void *, const void *))
+{
+ char (*p)[width] = (void *)base;
+ size_t n = *nelp;
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ if (compar(key, p[i]) == 0)
+ return p[i];
+ return 0;
+}
+
+
diff --git a/libc-top-half/musl/src/search/tdelete.c b/libc-top-half/musl/src/search/tdelete.c
new file mode 100644
index 0000000..b8bb924
--- /dev/null
+++ b/libc-top-half/musl/src/search/tdelete.c
@@ -0,0 +1,49 @@
+#include <stdlib.h>
+#include <search.h>
+#include "tsearch.h"
+
+void *tdelete(const void *restrict key, void **restrict rootp,
+ int(*cmp)(const void *, const void *))
+{
+ if (!rootp)
+ return 0;
+
+ void **a[MAXH+1];
+ struct node *n = *rootp;
+ struct node *parent;
+ struct node *child;
+ int i=0;
+ /* *a[0] is an arbitrary non-null pointer that is returned when
+ the root node is deleted. */
+ a[i++] = rootp;
+ a[i++] = rootp;
+ for (;;) {
+ if (!n)
+ return 0;
+ int c = cmp(key, n->key);
+ if (!c)
+ break;
+ a[i++] = &n->a[c>0];
+ n = n->a[c>0];
+ }
+ parent = *a[i-2];
+ if (n->a[0]) {
+ /* free the preceding node instead of the deleted one. */
+ struct node *deleted = n;
+ a[i++] = &n->a[0];
+ n = n->a[0];
+ while (n->a[1]) {
+ a[i++] = &n->a[1];
+ n = n->a[1];
+ }
+ deleted->key = n->key;
+ child = n->a[0];
+ } else {
+ child = n->a[1];
+ }
+ /* freed node has at most one child, move it up and rebalance. */
+ free(n);
+ *a[--i] = child;
+ while (--i && __tsearch_balance(a[i]));
+ return parent;
+}
diff --git a/libc-top-half/musl/src/search/tdestroy.c b/libc-top-half/musl/src/search/tdestroy.c
new file mode 100644
index 0000000..699a901
--- /dev/null
+++ b/libc-top-half/musl/src/search/tdestroy.c
@@ -0,0 +1,16 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <search.h>
+#include "tsearch.h"
+
+void tdestroy(void *root, void (*freekey)(void *))
+{
+ struct node *r = root;
+
+ if (r == 0)
+ return;
+ tdestroy(r->a[0], freekey);
+ tdestroy(r->a[1], freekey);
+ if (freekey) freekey((void *)r->key);
+ free(r);
+}
diff --git a/libc-top-half/musl/src/search/tfind.c b/libc-top-half/musl/src/search/tfind.c
new file mode 100644
index 0000000..9e1cf98
--- /dev/null
+++ b/libc-top-half/musl/src/search/tfind.c
@@ -0,0 +1,20 @@
+#include <search.h>
+#include "tsearch.h"
+
+void *tfind(const void *key, void *const *rootp,
+ int(*cmp)(const void *, const void *))
+{
+ if (!rootp)
+ return 0;
+
+ struct node *n = *rootp;
+ for (;;) {
+ if (!n)
+ break;
+ int c = cmp(key, n->key);
+ if (!c)
+ break;
+ n = n->a[c>0];
+ }
+ return n;
+}
diff --git a/libc-top-half/musl/src/search/tsearch.c b/libc-top-half/musl/src/search/tsearch.c
new file mode 100644
index 0000000..0de27d0
--- /dev/null
+++ b/libc-top-half/musl/src/search/tsearch.c
@@ -0,0 +1,92 @@
+#include <stdlib.h>
+#include <search.h>
+#include "tsearch.h"
+
+static inline int height(struct node *n) { return n ? n->h : 0; }
+
+static int rot(void **p, struct node *x, int dir /* deeper side */)
+{
+ struct node *y = x->a[dir];
+ struct node *z = y->a[!dir];
+ int hx = x->h;
+ int hz = height(z);
+ if (hz > height(y->a[dir])) {
+ /*
+ * x
+ * / \ dir z
+ * A y / \
+ * / \ --> x y
+ * z D /| |\
+ * / \ A B C D
+ * B C
+ */
+ x->a[dir] = z->a[!dir];
+ y->a[!dir] = z->a[dir];
+ z->a[!dir] = x;
+ z->a[dir] = y;
+ x->h = hz;
+ y->h = hz;
+ z->h = hz+1;
+ } else {
+ /*
+ * x y
+ * / \ / \
+ * A y --> x D
+ * / \ / \
+ * z D A z
+ */
+ x->a[dir] = z;
+ y->a[!dir] = x;
+ x->h = hz+1;
+ y->h = hz+2;
+ z = y;
+ }
+ *p = z;
+ return z->h - hx;
+}
+
+/* balance *p, return 0 if height is unchanged. */
+int __tsearch_balance(void **p)
+{
+ struct node *n = *p;
+ int h0 = height(n->a[0]);
+ int h1 = height(n->a[1]);
+ if (h0 - h1 + 1u < 3u) {
+ int old = n->h;
+ n->h = h0<h1 ? h1+1 : h0+1;
+ return n->h - old;
+ }
+ return rot(p, n, h0<h1);
+}
+
+void *tsearch(const void *key, void **rootp,
+ int (*cmp)(const void *, const void *))
+{
+ if (!rootp)
+ return 0;
+
+ void **a[MAXH];
+ struct node *n = *rootp;
+ struct node *r;
+ int i=0;
+ a[i++] = rootp;
+ for (;;) {
+ if (!n)
+ break;
+ int c = cmp(key, n->key);
+ if (!c)
+ return n;
+ a[i++] = &n->a[c>0];
+ n = n->a[c>0];
+ }
+ r = malloc(sizeof *r);
+ if (!r)
+ return 0;
+ r->key = key;
+ r->a[0] = r->a[1] = 0;
+ r->h = 1;
+ /* insert new node, rebalance ancestors. */
+ *a[--i] = r;
+ while (i && __tsearch_balance(a[--i]));
+ return r;
+}
diff --git a/libc-top-half/musl/src/search/tsearch.h b/libc-top-half/musl/src/search/tsearch.h
new file mode 100644
index 0000000..37d11d7
--- /dev/null
+++ b/libc-top-half/musl/src/search/tsearch.h
@@ -0,0 +1,13 @@
+#include <search.h>
+#include <features.h>
+
+/* AVL tree height < 1.44*log2(nodes+2)-0.3, MAXH is a safe upper bound. */
+#define MAXH (sizeof(void*)*8*3/2)
+
+struct node {
+ const void *key;
+ void *a[2];
+ int h;
+};
+
+hidden int __tsearch_balance(void **);
diff --git a/libc-top-half/musl/src/search/twalk.c b/libc-top-half/musl/src/search/twalk.c
new file mode 100644
index 0000000..53821cd
--- /dev/null
+++ b/libc-top-half/musl/src/search/twalk.c
@@ -0,0 +1,22 @@
+#include <search.h>
+#include "tsearch.h"
+
+static void walk(const struct node *r, void (*action)(const void *, VISIT, int), int d)
+{
+ if (!r)
+ return;
+ if (r->h == 1)
+ action(r, leaf, d);
+ else {
+ action(r, preorder, d);
+ walk(r->a[0], action, d+1);
+ action(r, postorder, d);
+ walk(r->a[1], action, d+1);
+ action(r, endorder, d);
+ }
+}
+
+void twalk(const void *root, void (*action)(const void *, VISIT, int))
+{
+ walk(root, action, 0);
+}
diff --git a/libc-top-half/musl/src/select/poll.c b/libc-top-half/musl/src/select/poll.c
new file mode 100644
index 0000000..c84c8a9
--- /dev/null
+++ b/libc-top-half/musl/src/select/poll.c
@@ -0,0 +1,15 @@
+#include <poll.h>
+#include <time.h>
+#include <signal.h>
+#include "syscall.h"
+
+int poll(struct pollfd *fds, nfds_t n, int timeout)
+{
+#ifdef SYS_poll
+ return syscall_cp(SYS_poll, fds, n, timeout);
+#else
+ return syscall_cp(SYS_ppoll, fds, n, timeout>=0 ?
+ &((struct timespec){ .tv_sec = timeout/1000,
+ .tv_nsec = timeout%1000*1000000 }) : 0, 0, _NSIG/8);
+#endif
+}
diff --git a/libc-top-half/musl/src/select/pselect.c b/libc-top-half/musl/src/select/pselect.c
new file mode 100644
index 0000000..54cfb29
--- /dev/null
+++ b/libc-top-half/musl/src/select/pselect.c
@@ -0,0 +1,26 @@
+#include <sys/select.h>
+#include <signal.h>
+#include <stdint.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
+
+int pselect(int n, fd_set *restrict rfds, fd_set *restrict wfds, fd_set *restrict efds, const struct timespec *restrict ts, const sigset_t *restrict mask)
+{
+ syscall_arg_t data[2] = { (uintptr_t)mask, _NSIG/8 };
+ time_t s = ts ? ts->tv_sec : 0;
+ long ns = ts ? ts->tv_nsec : 0;
+#ifdef SYS_pselect6_time64
+ int r = -ENOSYS;
+ if (SYS_pselect6 == SYS_pselect6_time64 || !IS32BIT(s))
+ r = __syscall_cp(SYS_pselect6_time64, n, rfds, wfds, efds,
+ ts ? ((long long[]){s, ns}) : 0, data);
+ if (SYS_pselect6 == SYS_pselect6_time64 || r!=-ENOSYS)
+ return __syscall_ret(r);
+ s = CLAMP(s);
+#endif
+ return syscall_cp(SYS_pselect6, n, rfds, wfds, efds,
+ ts ? ((long[]){s, ns}) : 0, data);
+}
diff --git a/libc-top-half/musl/src/select/select.c b/libc-top-half/musl/src/select/select.c
new file mode 100644
index 0000000..8a78688
--- /dev/null
+++ b/libc-top-half/musl/src/select/select.c
@@ -0,0 +1,44 @@
+#include <sys/select.h>
+#include <signal.h>
+#include <stdint.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
+
+int select(int n, fd_set *restrict rfds, fd_set *restrict wfds, fd_set *restrict efds, struct timeval *restrict tv)
+{
+ time_t s = tv ? tv->tv_sec : 0;
+ suseconds_t us = tv ? tv->tv_usec : 0;
+ long ns;
+ const time_t max_time = (1ULL<<8*sizeof(time_t)-1)-1;
+
+ if (s<0 || us<0) return __syscall_ret(-EINVAL);
+ if (us/1000000 > max_time - s) {
+ s = max_time;
+ us = 999999;
+ ns = 999999999;
+ } else {
+ s += us/1000000;
+ us %= 1000000;
+ ns = us*1000;
+ }
+
+#ifdef SYS_pselect6_time64
+ int r = -ENOSYS;
+ if (SYS_pselect6 == SYS_pselect6_time64 || !IS32BIT(s))
+ r = __syscall_cp(SYS_pselect6_time64, n, rfds, wfds, efds,
+ tv ? ((long long[]){s, ns}) : 0,
+ ((syscall_arg_t[]){ 0, _NSIG/8 }));
+ if (SYS_pselect6 == SYS_pselect6_time64 || r!=-ENOSYS)
+ return __syscall_ret(r);
+#endif
+#ifdef SYS_select
+ return syscall_cp(SYS_select, n, rfds, wfds, efds,
+ tv ? ((long[]){s, us}) : 0);
+#else
+ return syscall_cp(SYS_pselect6, n, rfds, wfds, efds,
+ tv ? ((long[]){s, ns}) : 0, ((syscall_arg_t[]){ 0, _NSIG/8 }));
+#endif
+}
diff --git a/libc-top-half/musl/src/setjmp/aarch64/longjmp.s b/libc-top-half/musl/src/setjmp/aarch64/longjmp.s
new file mode 100644
index 0000000..0af9c50
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/aarch64/longjmp.s
@@ -0,0 +1,23 @@
+.global _longjmp
+.global longjmp
+.type _longjmp,%function
+.type longjmp,%function
+_longjmp:
+longjmp:
+ // IHI0055B_aapcs64.pdf 5.1.1, 5.1.2 callee saved registers
+ ldp x19, x20, [x0,#0]
+ ldp x21, x22, [x0,#16]
+ ldp x23, x24, [x0,#32]
+ ldp x25, x26, [x0,#48]
+ ldp x27, x28, [x0,#64]
+ ldp x29, x30, [x0,#80]
+ ldr x2, [x0,#104]
+ mov sp, x2
+ ldp d8 , d9, [x0,#112]
+ ldp d10, d11, [x0,#128]
+ ldp d12, d13, [x0,#144]
+ ldp d14, d15, [x0,#160]
+
+ cmp w1, 0
+ csinc w0, w1, wzr, ne
+ br x30
diff --git a/libc-top-half/musl/src/setjmp/aarch64/setjmp.s b/libc-top-half/musl/src/setjmp/aarch64/setjmp.s
new file mode 100644
index 0000000..f49288a
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/aarch64/setjmp.s
@@ -0,0 +1,24 @@
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,@function
+.type _setjmp,@function
+.type setjmp,@function
+__setjmp:
+_setjmp:
+setjmp:
+ // IHI0055B_aapcs64.pdf 5.1.1, 5.1.2 callee saved registers
+ stp x19, x20, [x0,#0]
+ stp x21, x22, [x0,#16]
+ stp x23, x24, [x0,#32]
+ stp x25, x26, [x0,#48]
+ stp x27, x28, [x0,#64]
+ stp x29, x30, [x0,#80]
+ mov x2, sp
+ str x2, [x0,#104]
+ stp d8, d9, [x0,#112]
+ stp d10, d11, [x0,#128]
+ stp d12, d13, [x0,#144]
+ stp d14, d15, [x0,#160]
+ mov x0, #0
+ ret
diff --git a/libc-top-half/musl/src/setjmp/arm/longjmp.S b/libc-top-half/musl/src/setjmp/arm/longjmp.S
new file mode 100644
index 0000000..8df0b81
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/arm/longjmp.S
@@ -0,0 +1,50 @@
+.syntax unified
+.global _longjmp
+.global longjmp
+.type _longjmp,%function
+.type longjmp,%function
+_longjmp:
+longjmp:
+ mov ip,r0
+ movs r0,r1
+ moveq r0,#1
+ ldmia ip!, {v1,v2,v3,v4,v5,v6,sl,fp}
+ ldmia ip!, {r2,lr}
+ mov sp,r2
+
+ adr r1,1f
+ ldr r2,1f
+ ldr r1,[r1,r2]
+
+#if __ARM_ARCH < 8
+ tst r1,#0x260
+ beq 3f
+ // HWCAP_ARM_FPA
+ tst r1,#0x20
+ beq 2f
+ ldc p2, cr4, [ip], #48
+#endif
+2: tst r1,#0x40
+ beq 2f
+ .fpu vfp
+ vldmia ip!, {d8-d15}
+ .fpu softvfp
+ .eabi_attribute 10, 0
+ .eabi_attribute 27, 0
+#if __ARM_ARCH < 8
+ // HWCAP_ARM_IWMMXT
+2: tst r1,#0x200
+ beq 3f
+ ldcl p1, cr10, [ip], #8
+ ldcl p1, cr11, [ip], #8
+ ldcl p1, cr12, [ip], #8
+ ldcl p1, cr13, [ip], #8
+ ldcl p1, cr14, [ip], #8
+ ldcl p1, cr15, [ip], #8
+#endif
+2:
+3: bx lr
+
+.hidden __hwcap
+.align 2
+1: .word __hwcap-1b
diff --git a/libc-top-half/musl/src/setjmp/arm/setjmp.S b/libc-top-half/musl/src/setjmp/arm/setjmp.S
new file mode 100644
index 0000000..45731d2
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/arm/setjmp.S
@@ -0,0 +1,52 @@
+.syntax unified
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,%function
+.type _setjmp,%function
+.type setjmp,%function
+__setjmp:
+_setjmp:
+setjmp:
+ mov ip,r0
+ stmia ip!,{v1,v2,v3,v4,v5,v6,sl,fp}
+ mov r2,sp
+ stmia ip!,{r2,lr}
+ mov r0,#0
+
+ adr r1,1f
+ ldr r2,1f
+ ldr r1,[r1,r2]
+
+#if __ARM_ARCH < 8
+ tst r1,#0x260
+ beq 3f
+ // HWCAP_ARM_FPA
+ tst r1,#0x20
+ beq 2f
+ stc p2, cr4, [ip], #48
+#endif
+2: tst r1,#0x40
+ beq 2f
+ .fpu vfp
+ vstmia ip!, {d8-d15}
+ .fpu softvfp
+ .eabi_attribute 10, 0
+ .eabi_attribute 27, 0
+#if __ARM_ARCH < 8
+ // HWCAP_ARM_IWMMXT
+2: tst r1,#0x200
+ beq 3f
+ stcl p1, cr10, [ip], #8
+ stcl p1, cr11, [ip], #8
+ stcl p1, cr12, [ip], #8
+ stcl p1, cr13, [ip], #8
+ stcl p1, cr14, [ip], #8
+ stcl p1, cr15, [ip], #8
+#endif
+2:
+3: bx lr
+
+.hidden __hwcap
+.align 2
+1: .word __hwcap-1b
diff --git a/libc-top-half/musl/src/setjmp/i386/longjmp.s b/libc-top-half/musl/src/setjmp/i386/longjmp.s
new file mode 100644
index 0000000..8188f06
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/i386/longjmp.s
@@ -0,0 +1,16 @@
+.global _longjmp
+.global longjmp
+.type _longjmp,@function
+.type longjmp,@function
+_longjmp:
+longjmp:
+ mov 4(%esp),%edx
+ mov 8(%esp),%eax
+ cmp $1,%eax
+ adc $0, %al
+ mov (%edx),%ebx
+ mov 4(%edx),%esi
+ mov 8(%edx),%edi
+ mov 12(%edx),%ebp
+ mov 16(%edx),%esp
+ jmp *20(%edx)
diff --git a/libc-top-half/musl/src/setjmp/i386/setjmp.s b/libc-top-half/musl/src/setjmp/i386/setjmp.s
new file mode 100644
index 0000000..4d19cf8
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/i386/setjmp.s
@@ -0,0 +1,23 @@
+.global ___setjmp
+.hidden ___setjmp
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,@function
+.type _setjmp,@function
+.type setjmp,@function
+___setjmp:
+__setjmp:
+_setjmp:
+setjmp:
+ mov 4(%esp), %eax
+ mov %ebx, (%eax)
+ mov %esi, 4(%eax)
+ mov %edi, 8(%eax)
+ mov %ebp, 12(%eax)
+ lea 4(%esp), %ecx
+ mov %ecx, 16(%eax)
+ mov (%esp), %ecx
+ mov %ecx, 20(%eax)
+ xor %eax, %eax
+ ret
diff --git a/libc-top-half/musl/src/setjmp/longjmp.c b/libc-top-half/musl/src/setjmp/longjmp.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/longjmp.c
diff --git a/libc-top-half/musl/src/setjmp/m68k/longjmp.s b/libc-top-half/musl/src/setjmp/m68k/longjmp.s
new file mode 100644
index 0000000..cdb05fb
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/m68k/longjmp.s
@@ -0,0 +1,14 @@
+.global _longjmp
+.global longjmp
+.type _longjmp,@function
+.type longjmp,@function
+_longjmp:
+longjmp:
+ movea.l 4(%sp),%a0
+ move.l 8(%sp),%d0
+ bne 1f
+ move.l #1,%d0
+1: movem.l (%a0),%d2-%d7/%a2-%a7
+ fmovem.x 52(%a0),%fp2-%fp7
+ move.l 48(%a0),(%sp)
+ rts
diff --git a/libc-top-half/musl/src/setjmp/m68k/setjmp.s b/libc-top-half/musl/src/setjmp/m68k/setjmp.s
new file mode 100644
index 0000000..15e549b
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/m68k/setjmp.s
@@ -0,0 +1,18 @@
+.global ___setjmp
+.hidden ___setjmp
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,@function
+.type _setjmp,@function
+.type setjmp,@function
+___setjmp:
+__setjmp:
+_setjmp:
+setjmp:
+ movea.l 4(%sp),%a0
+ movem.l %d2-%d7/%a2-%a7,(%a0)
+ move.l (%sp),48(%a0)
+ fmovem.x %fp2-%fp7,52(%a0)
+ clr.l %d0
+ rts
diff --git a/libc-top-half/musl/src/setjmp/microblaze/longjmp.s b/libc-top-half/musl/src/setjmp/microblaze/longjmp.s
new file mode 100644
index 0000000..c076028
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/microblaze/longjmp.s
@@ -0,0 +1,29 @@
+.global _longjmp
+.global longjmp
+.type _longjmp,@function
+.type longjmp,@function
+_longjmp:
+longjmp:
+ addi r3, r6, 0
+ bnei r3, 1f
+ addi r3, r3, 1
+1: lwi r1, r5, 0
+ lwi r15, r5, 4
+ lwi r2, r5, 8
+ lwi r13, r5, 12
+ lwi r18, r5, 16
+ lwi r19, r5, 20
+ lwi r20, r5, 24
+ lwi r21, r5, 28
+ lwi r22, r5, 32
+ lwi r23, r5, 36
+ lwi r24, r5, 40
+ lwi r25, r5, 44
+ lwi r26, r5, 48
+ lwi r27, r5, 52
+ lwi r28, r5, 56
+ lwi r29, r5, 60
+ lwi r30, r5, 64
+ lwi r31, r5, 68
+ rtsd r15, 8
+ nop
diff --git a/libc-top-half/musl/src/setjmp/microblaze/setjmp.s b/libc-top-half/musl/src/setjmp/microblaze/setjmp.s
new file mode 100644
index 0000000..605ab20
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/microblaze/setjmp.s
@@ -0,0 +1,32 @@
+.global ___setjmp
+.hidden ___setjmp
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,@function
+.type _setjmp,@function
+.type setjmp,@function
+___setjmp:
+__setjmp:
+_setjmp:
+setjmp:
+ swi r1, r5, 0
+ swi r15, r5, 4
+ swi r2, r5, 8
+ swi r13, r5, 12
+ swi r18, r5, 16
+ swi r19, r5, 20
+ swi r20, r5, 24
+ swi r21, r5, 28
+ swi r22, r5, 32
+ swi r23, r5, 36
+ swi r24, r5, 40
+ swi r25, r5, 44
+ swi r26, r5, 48
+ swi r27, r5, 52
+ swi r28, r5, 56
+ swi r29, r5, 60
+ swi r30, r5, 64
+ swi r31, r5, 68
+ rtsd r15, 8
+ ori r3, r0, 0
diff --git a/libc-top-half/musl/src/setjmp/mips/longjmp.S b/libc-top-half/musl/src/setjmp/mips/longjmp.S
new file mode 100644
index 0000000..ecf4085
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/mips/longjmp.S
@@ -0,0 +1,34 @@
+.set noreorder
+
+.global _longjmp
+.global longjmp
+.type _longjmp,@function
+.type longjmp,@function
+_longjmp:
+longjmp:
+ move $2, $5
+ bne $2, $0, 1f
+ nop
+ addu $2, $2, 1
+1:
+#ifndef __mips_soft_float
+ l.d $f20, 56($4)
+ l.d $f22, 64($4)
+ l.d $f24, 72($4)
+ l.d $f26, 80($4)
+ l.d $f28, 88($4)
+ l.d $f30, 96($4)
+#endif
+ lw $ra, 0($4)
+ lw $sp, 4($4)
+ lw $16, 8($4)
+ lw $17, 12($4)
+ lw $18, 16($4)
+ lw $19, 20($4)
+ lw $20, 24($4)
+ lw $21, 28($4)
+ lw $22, 32($4)
+ lw $23, 36($4)
+ lw $30, 40($4)
+ jr $ra
+ lw $28, 44($4)
diff --git a/libc-top-half/musl/src/setjmp/mips/setjmp.S b/libc-top-half/musl/src/setjmp/mips/setjmp.S
new file mode 100644
index 0000000..7ae8832
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/mips/setjmp.S
@@ -0,0 +1,33 @@
+.set noreorder
+
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,@function
+.type _setjmp,@function
+.type setjmp,@function
+__setjmp:
+_setjmp:
+setjmp:
+ sw $ra, 0($4)
+ sw $sp, 4($4)
+ sw $16, 8($4)
+ sw $17, 12($4)
+ sw $18, 16($4)
+ sw $19, 20($4)
+ sw $20, 24($4)
+ sw $21, 28($4)
+ sw $22, 32($4)
+ sw $23, 36($4)
+ sw $30, 40($4)
+ sw $28, 44($4)
+#ifndef __mips_soft_float
+ s.d $f20, 56($4)
+ s.d $f22, 64($4)
+ s.d $f24, 72($4)
+ s.d $f26, 80($4)
+ s.d $f28, 88($4)
+ s.d $f30, 96($4)
+#endif
+ jr $ra
+ li $2, 0
diff --git a/libc-top-half/musl/src/setjmp/mips64/longjmp.S b/libc-top-half/musl/src/setjmp/mips64/longjmp.S
new file mode 100644
index 0000000..3db8a88
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/mips64/longjmp.S
@@ -0,0 +1,37 @@
+.set noreorder
+.global _longjmp
+.global longjmp
+.type _longjmp,@function
+.type longjmp,@function
+_longjmp:
+longjmp:
+ move $2, $5
+
+ bne $2, $0, 1f
+ nop
+ daddu $2, $2, 1
+1:
+#ifndef __mips_soft_float
+ ldc1 $24, 96($4)
+ ldc1 $25, 104($4)
+ ldc1 $26, 112($4)
+ ldc1 $27, 120($4)
+ ldc1 $28, 128($4)
+ ldc1 $29, 136($4)
+ ldc1 $30, 144($4)
+ ldc1 $31, 152($4)
+#endif
+ ld $ra, 0($4)
+ ld $sp, 8($4)
+ ld $gp, 16($4)
+ ld $16, 24($4)
+ ld $17, 32($4)
+ ld $18, 40($4)
+ ld $19, 48($4)
+ ld $20, 56($4)
+ ld $21, 64($4)
+ ld $22, 72($4)
+ ld $23, 80($4)
+ ld $30, 88($4)
+ jr $ra
+ nop
diff --git a/libc-top-half/musl/src/setjmp/mips64/setjmp.S b/libc-top-half/musl/src/setjmp/mips64/setjmp.S
new file mode 100644
index 0000000..b9646c2
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/mips64/setjmp.S
@@ -0,0 +1,34 @@
+.set noreorder
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,@function
+.type _setjmp,@function
+.type setjmp,@function
+__setjmp:
+_setjmp:
+setjmp:
+ sd $ra, 0($4)
+ sd $sp, 8($4)
+ sd $gp, 16($4)
+ sd $16, 24($4)
+ sd $17, 32($4)
+ sd $18, 40($4)
+ sd $19, 48($4)
+ sd $20, 56($4)
+ sd $21, 64($4)
+ sd $22, 72($4)
+ sd $23, 80($4)
+ sd $30, 88($4)
+#ifndef __mips_soft_float
+ sdc1 $24, 96($4)
+ sdc1 $25, 104($4)
+ sdc1 $26, 112($4)
+ sdc1 $27, 120($4)
+ sdc1 $28, 128($4)
+ sdc1 $29, 136($4)
+ sdc1 $30, 144($4)
+ sdc1 $31, 152($4)
+#endif
+ jr $ra
+ li $2, 0
diff --git a/libc-top-half/musl/src/setjmp/mipsn32/longjmp.S b/libc-top-half/musl/src/setjmp/mipsn32/longjmp.S
new file mode 100644
index 0000000..30c3ee0
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/mipsn32/longjmp.S
@@ -0,0 +1,36 @@
+.set noreorder
+.global _longjmp
+.global longjmp
+.type _longjmp,@function
+.type longjmp,@function
+_longjmp:
+longjmp:
+ move $2, $5
+ bne $2, $0, 1f
+ nop
+ addu $2, $2, 1
+1:
+#ifndef __mips_soft_float
+ ldc1 $24, 96($4)
+ ldc1 $25, 104($4)
+ ldc1 $26, 112($4)
+ ldc1 $27, 120($4)
+ ldc1 $28, 128($4)
+ ldc1 $29, 136($4)
+ ldc1 $30, 144($4)
+ ldc1 $31, 152($4)
+#endif
+ ld $ra, 0($4)
+ ld $sp, 8($4)
+ ld $gp, 16($4)
+ ld $16, 24($4)
+ ld $17, 32($4)
+ ld $18, 40($4)
+ ld $19, 48($4)
+ ld $20, 56($4)
+ ld $21, 64($4)
+ ld $22, 72($4)
+ ld $23, 80($4)
+ ld $30, 88($4)
+ jr $ra
+ nop
diff --git a/libc-top-half/musl/src/setjmp/mipsn32/setjmp.S b/libc-top-half/musl/src/setjmp/mipsn32/setjmp.S
new file mode 100644
index 0000000..b9646c2
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/mipsn32/setjmp.S
@@ -0,0 +1,34 @@
+.set noreorder
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,@function
+.type _setjmp,@function
+.type setjmp,@function
+__setjmp:
+_setjmp:
+setjmp:
+ sd $ra, 0($4)
+ sd $sp, 8($4)
+ sd $gp, 16($4)
+ sd $16, 24($4)
+ sd $17, 32($4)
+ sd $18, 40($4)
+ sd $19, 48($4)
+ sd $20, 56($4)
+ sd $21, 64($4)
+ sd $22, 72($4)
+ sd $23, 80($4)
+ sd $30, 88($4)
+#ifndef __mips_soft_float
+ sdc1 $24, 96($4)
+ sdc1 $25, 104($4)
+ sdc1 $26, 112($4)
+ sdc1 $27, 120($4)
+ sdc1 $28, 128($4)
+ sdc1 $29, 136($4)
+ sdc1 $30, 144($4)
+ sdc1 $31, 152($4)
+#endif
+ jr $ra
+ li $2, 0
diff --git a/libc-top-half/musl/src/setjmp/or1k/longjmp.s b/libc-top-half/musl/src/setjmp/or1k/longjmp.s
new file mode 100644
index 0000000..1db9fd9
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/or1k/longjmp.s
@@ -0,0 +1,25 @@
+.global _longjmp
+.global longjmp
+.type _longjmp,@function
+.type longjmp,@function
+_longjmp:
+longjmp:
+ l.sfeqi r4, 0
+ l.bnf 1f
+ l.addi r11, r4,0
+ l.ori r11, r0, 1
+1: l.lwz r1, 0(r3)
+ l.lwz r2, 4(r3)
+ l.lwz r9, 8(r3)
+ l.lwz r10, 12(r3)
+ l.lwz r14, 16(r3)
+ l.lwz r16, 20(r3)
+ l.lwz r18, 24(r3)
+ l.lwz r20, 28(r3)
+ l.lwz r22, 32(r3)
+ l.lwz r24, 36(r3)
+ l.lwz r26, 40(r3)
+ l.lwz r28, 44(r3)
+ l.lwz r30, 48(r3)
+ l.jr r9
+ l.nop
diff --git a/libc-top-half/musl/src/setjmp/or1k/setjmp.s b/libc-top-half/musl/src/setjmp/or1k/setjmp.s
new file mode 100644
index 0000000..0677033
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/or1k/setjmp.s
@@ -0,0 +1,27 @@
+.global ___setjmp
+.hidden ___setjmp
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,@function
+.type _setjmp,@function
+.type setjmp,@function
+___setjmp:
+__setjmp:
+_setjmp:
+setjmp:
+ l.sw 0(r3), r1
+ l.sw 4(r3), r2
+ l.sw 8(r3), r9
+ l.sw 12(r3), r10
+ l.sw 16(r3), r14
+ l.sw 20(r3), r16
+ l.sw 24(r3), r18
+ l.sw 28(r3), r20
+ l.sw 32(r3), r22
+ l.sw 36(r3), r24
+ l.sw 40(r3), r26
+ l.sw 44(r3), r28
+ l.sw 48(r3), r30
+ l.jr r9
+ l.ori r11,r0,0
diff --git a/libc-top-half/musl/src/setjmp/powerpc/longjmp.S b/libc-top-half/musl/src/setjmp/powerpc/longjmp.S
new file mode 100644
index 0000000..611389f
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/powerpc/longjmp.S
@@ -0,0 +1,99 @@
+ .global _longjmp
+ .global longjmp
+ .type _longjmp,@function
+ .type longjmp,@function
+_longjmp:
+longjmp:
+ /*
+ * void longjmp(jmp_buf env, int val);
+ * put val into return register and restore the env saved in setjmp
+ * if val(r4) is 0, put 1 there.
+ */
+ /* 0) move old return address into r0 */
+ lwz 0, 0(3)
+ /* 1) put it into link reg */
+ mtlr 0
+ /* 2 ) restore stack ptr */
+ lwz 1, 4(3)
+ /* 3) restore control reg */
+ lwz 0, 8(3)
+ mtcr 0
+ /* 4) restore r14-r31 */
+ lwz 14, 12(3)
+ lwz 15, 16(3)
+ lwz 16, 20(3)
+ lwz 17, 24(3)
+ lwz 18, 28(3)
+ lwz 19, 32(3)
+ lwz 20, 36(3)
+ lwz 21, 40(3)
+ lwz 22, 44(3)
+ lwz 23, 48(3)
+ lwz 24, 52(3)
+ lwz 25, 56(3)
+ lwz 26, 60(3)
+ lwz 27, 64(3)
+ lwz 28, 68(3)
+ lwz 29, 72(3)
+ lwz 30, 76(3)
+ lwz 31, 80(3)
+#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
+ mflr 0
+ bl 1f
+ .hidden __hwcap
+ .long __hwcap-.
+1: mflr 4
+ lwz 5, 0(4)
+ lwzx 4, 4, 5
+ andis. 4, 4, 0x80
+ beq 1f
+ .long 0x11c35b01 /* evldd 14,88(3) */
+ .long 0x11e36301 /* ... */
+ .long 0x12036b01
+ .long 0x12237301
+ .long 0x12437b01
+ .long 0x12638301
+ .long 0x12838b01
+ .long 0x12a39301
+ .long 0x12c39b01
+ .long 0x12e3a301
+ .long 0x1303ab01
+ .long 0x1323b301
+ .long 0x1343bb01
+ .long 0x1363c301
+ .long 0x1383cb01
+ .long 0x13a3d301
+ .long 0x13c3db01
+ .long 0x13e3e301 /* evldd 31,224(3) */
+ .long 0x11a3eb01 /* evldd 13,232(3) */
+1: mtlr 0
+#else
+ lfd 14,88(3)
+ lfd 15,96(3)
+ lfd 16,104(3)
+ lfd 17,112(3)
+ lfd 18,120(3)
+ lfd 19,128(3)
+ lfd 20,136(3)
+ lfd 21,144(3)
+ lfd 22,152(3)
+ lfd 23,160(3)
+ lfd 24,168(3)
+ lfd 25,176(3)
+ lfd 26,184(3)
+ lfd 27,192(3)
+ lfd 28,200(3)
+ lfd 29,208(3)
+ lfd 30,216(3)
+ lfd 31,224(3)
+#endif
+ /* 5) put val into return reg r3 */
+ mr 3, 4
+
+ /* 6) check if return value is 0, make it 1 in that case */
+ cmpwi cr7, 4, 0
+ bne cr7, 1f
+ li 3, 1
+1:
+ blr
+
diff --git a/libc-top-half/musl/src/setjmp/powerpc/setjmp.S b/libc-top-half/musl/src/setjmp/powerpc/setjmp.S
new file mode 100644
index 0000000..f1fcce3
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/powerpc/setjmp.S
@@ -0,0 +1,93 @@
+ .global ___setjmp
+ .hidden ___setjmp
+ .global __setjmp
+ .global _setjmp
+ .global setjmp
+ .type __setjmp,@function
+ .type _setjmp,@function
+ .type setjmp,@function
+___setjmp:
+__setjmp:
+_setjmp:
+setjmp:
+ /* 0) store IP int 0, then into the jmpbuf pointed to by r3 (first arg) */
+ mflr 0
+ stw 0, 0(3)
+ /* 1) store reg1 (SP) */
+ stw 1, 4(3)
+ /* 2) store cr */
+ mfcr 0
+ stw 0, 8(3)
+ /* 3) store r14-31 */
+ stw 14, 12(3)
+ stw 15, 16(3)
+ stw 16, 20(3)
+ stw 17, 24(3)
+ stw 18, 28(3)
+ stw 19, 32(3)
+ stw 20, 36(3)
+ stw 21, 40(3)
+ stw 22, 44(3)
+ stw 23, 48(3)
+ stw 24, 52(3)
+ stw 25, 56(3)
+ stw 26, 60(3)
+ stw 27, 64(3)
+ stw 28, 68(3)
+ stw 29, 72(3)
+ stw 30, 76(3)
+ stw 31, 80(3)
+#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
+ mflr 0
+ bl 1f
+ .hidden __hwcap
+ .long __hwcap-.
+1: mflr 4
+ lwz 5, 0(4)
+ lwzx 4, 4, 5
+ andis. 4, 4, 0x80
+ beq 1f
+ .long 0x11c35b21 /* evstdd 14,88(3) */
+ .long 0x11e36321 /* ... */
+ .long 0x12036b21
+ .long 0x12237321
+ .long 0x12437b21
+ .long 0x12638321
+ .long 0x12838b21
+ .long 0x12a39321
+ .long 0x12c39b21
+ .long 0x12e3a321
+ .long 0x1303ab21
+ .long 0x1323b321
+ .long 0x1343bb21
+ .long 0x1363c321
+ .long 0x1383cb21
+ .long 0x13a3d321
+ .long 0x13c3db21
+ .long 0x13e3e321 /* evstdd 31,224(3) */
+ .long 0x11a3eb21 /* evstdd 13,232(3) */
+1: mtlr 0
+#else
+ stfd 14,88(3)
+ stfd 15,96(3)
+ stfd 16,104(3)
+ stfd 17,112(3)
+ stfd 18,120(3)
+ stfd 19,128(3)
+ stfd 20,136(3)
+ stfd 21,144(3)
+ stfd 22,152(3)
+ stfd 23,160(3)
+ stfd 24,168(3)
+ stfd 25,176(3)
+ stfd 26,184(3)
+ stfd 27,192(3)
+ stfd 28,200(3)
+ stfd 29,208(3)
+ stfd 30,216(3)
+ stfd 31,224(3)
+#endif
+ /* 4) set return value to 0 */
+ li 3, 0
+ /* 5) return */
+ blr
diff --git a/libc-top-half/musl/src/setjmp/powerpc64/longjmp.s b/libc-top-half/musl/src/setjmp/powerpc64/longjmp.s
new file mode 100644
index 0000000..81d45ff
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/powerpc64/longjmp.s
@@ -0,0 +1,81 @@
+ .global _longjmp
+ .global longjmp
+ .type _longjmp,@function
+ .type longjmp,@function
+_longjmp:
+longjmp:
+ # 0) move old return address into the link register
+ ld 0, 0*8(3)
+ mtlr 0
+ # 1) restore cr
+ ld 0, 1*8(3)
+ mtcr 0
+ # 2) restore SP
+ ld 1, 2*8(3)
+ # 3) restore TOC into both r2 and the caller's stack.
+ # Which location is required depends on whether setjmp was called
+ # locally or non-locally, but it's always safe to restore to both.
+ ld 2, 3*8(3)
+ std 2, 24(1)
+ # 4) restore r14-r31
+ ld 14, 4*8(3)
+ ld 15, 5*8(3)
+ ld 16, 6*8(3)
+ ld 17, 7*8(3)
+ ld 18, 8*8(3)
+ ld 19, 9*8(3)
+ ld 20, 10*8(3)
+ ld 21, 11*8(3)
+ ld 22, 12*8(3)
+ ld 23, 13*8(3)
+ ld 24, 14*8(3)
+ ld 25, 15*8(3)
+ ld 26, 16*8(3)
+ ld 27, 17*8(3)
+ ld 28, 18*8(3)
+ ld 29, 19*8(3)
+ ld 30, 20*8(3)
+ ld 31, 21*8(3)
+ # 5) restore floating point registers f14-f31
+ lfd 14, 22*8(3)
+ lfd 15, 23*8(3)
+ lfd 16, 24*8(3)
+ lfd 17, 25*8(3)
+ lfd 18, 26*8(3)
+ lfd 19, 27*8(3)
+ lfd 20, 28*8(3)
+ lfd 21, 29*8(3)
+ lfd 22, 30*8(3)
+ lfd 23, 31*8(3)
+ lfd 24, 32*8(3)
+ lfd 25, 33*8(3)
+ lfd 26, 34*8(3)
+ lfd 27, 35*8(3)
+ lfd 28, 36*8(3)
+ lfd 29, 37*8(3)
+ lfd 30, 38*8(3)
+ lfd 31, 39*8(3)
+
+ # 6) restore vector registers v20-v31
+ addi 3, 3, 40*8
+ lvx 20, 0, 3 ; addi 3, 3, 16
+ lvx 21, 0, 3 ; addi 3, 3, 16
+ lvx 22, 0, 3 ; addi 3, 3, 16
+ lvx 23, 0, 3 ; addi 3, 3, 16
+ lvx 24, 0, 3 ; addi 3, 3, 16
+ lvx 25, 0, 3 ; addi 3, 3, 16
+ lvx 26, 0, 3 ; addi 3, 3, 16
+ lvx 27, 0, 3 ; addi 3, 3, 16
+ lvx 28, 0, 3 ; addi 3, 3, 16
+ lvx 29, 0, 3 ; addi 3, 3, 16
+ lvx 30, 0, 3 ; addi 3, 3, 16
+ lvx 31, 0, 3
+
+ # 7) return r4 ? r4 : 1
+ mr 3, 4
+ cmpwi cr7, 4, 0
+ bne cr7, 1f
+ li 3, 1
+1:
+ blr
+
diff --git a/libc-top-half/musl/src/setjmp/powerpc64/setjmp.s b/libc-top-half/musl/src/setjmp/powerpc64/setjmp.s
new file mode 100644
index 0000000..37683fd
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/powerpc64/setjmp.s
@@ -0,0 +1,89 @@
+ .global __setjmp
+ .global _setjmp
+ .global setjmp
+ .type __setjmp,@function
+ .type _setjmp,@function
+ .type setjmp,@function
+__setjmp:
+_setjmp:
+setjmp:
+ ld 5, 24(1) # load from the TOC slot in the caller's stack frame
+ b __setjmp_toc
+
+ .localentry __setjmp,.-__setjmp
+ .localentry _setjmp,.-_setjmp
+ .localentry setjmp,.-setjmp
+ mr 5, 2
+
+ .global __setjmp_toc
+ .hidden __setjmp_toc
+ # same as normal setjmp, except TOC pointer to save is provided in r5.
+ # r4 would normally be the 2nd parameter, but we're using r5 to simplify calling from sigsetjmp.
+ # solves the problem of knowing whether to save the TOC pointer from r2 or the caller's stack frame.
+__setjmp_toc:
+ # 0) store IP into 0, then into the jmpbuf pointed to by r3 (first arg)
+ mflr 0
+ std 0, 0*8(3)
+ # 1) store cr
+ mfcr 0
+ std 0, 1*8(3)
+ # 2) store SP and TOC
+ std 1, 2*8(3)
+ std 5, 3*8(3)
+ # 3) store r14-31
+ std 14, 4*8(3)
+ std 15, 5*8(3)
+ std 16, 6*8(3)
+ std 17, 7*8(3)
+ std 18, 8*8(3)
+ std 19, 9*8(3)
+ std 20, 10*8(3)
+ std 21, 11*8(3)
+ std 22, 12*8(3)
+ std 23, 13*8(3)
+ std 24, 14*8(3)
+ std 25, 15*8(3)
+ std 26, 16*8(3)
+ std 27, 17*8(3)
+ std 28, 18*8(3)
+ std 29, 19*8(3)
+ std 30, 20*8(3)
+ std 31, 21*8(3)
+ # 4) store floating point registers f14-f31
+ stfd 14, 22*8(3)
+ stfd 15, 23*8(3)
+ stfd 16, 24*8(3)
+ stfd 17, 25*8(3)
+ stfd 18, 26*8(3)
+ stfd 19, 27*8(3)
+ stfd 20, 28*8(3)
+ stfd 21, 29*8(3)
+ stfd 22, 30*8(3)
+ stfd 23, 31*8(3)
+ stfd 24, 32*8(3)
+ stfd 25, 33*8(3)
+ stfd 26, 34*8(3)
+ stfd 27, 35*8(3)
+ stfd 28, 36*8(3)
+ stfd 29, 37*8(3)
+ stfd 30, 38*8(3)
+ stfd 31, 39*8(3)
+
+ # 5) store vector registers v20-v31
+ addi 3, 3, 40*8
+ stvx 20, 0, 3 ; addi 3, 3, 16
+ stvx 21, 0, 3 ; addi 3, 3, 16
+ stvx 22, 0, 3 ; addi 3, 3, 16
+ stvx 23, 0, 3 ; addi 3, 3, 16
+ stvx 24, 0, 3 ; addi 3, 3, 16
+ stvx 25, 0, 3 ; addi 3, 3, 16
+ stvx 26, 0, 3 ; addi 3, 3, 16
+ stvx 27, 0, 3 ; addi 3, 3, 16
+ stvx 28, 0, 3 ; addi 3, 3, 16
+ stvx 29, 0, 3 ; addi 3, 3, 16
+ stvx 30, 0, 3 ; addi 3, 3, 16
+ stvx 31, 0, 3
+
+ # 6) return 0
+ li 3, 0
+ blr
diff --git a/libc-top-half/musl/src/setjmp/riscv64/longjmp.S b/libc-top-half/musl/src/setjmp/riscv64/longjmp.S
new file mode 100644
index 0000000..41e2d21
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/riscv64/longjmp.S
@@ -0,0 +1,42 @@
+.global __longjmp
+.global _longjmp
+.global longjmp
+.type __longjmp, %function
+.type _longjmp, %function
+.type longjmp, %function
+__longjmp:
+_longjmp:
+longjmp:
+ ld s0, 0(a0)
+ ld s1, 8(a0)
+ ld s2, 16(a0)
+ ld s3, 24(a0)
+ ld s4, 32(a0)
+ ld s5, 40(a0)
+ ld s6, 48(a0)
+ ld s7, 56(a0)
+ ld s8, 64(a0)
+ ld s9, 72(a0)
+ ld s10, 80(a0)
+ ld s11, 88(a0)
+ ld sp, 96(a0)
+ ld ra, 104(a0)
+
+#ifndef __riscv_float_abi_soft
+ fld fs0, 112(a0)
+ fld fs1, 120(a0)
+ fld fs2, 128(a0)
+ fld fs3, 136(a0)
+ fld fs4, 144(a0)
+ fld fs5, 152(a0)
+ fld fs6, 160(a0)
+ fld fs7, 168(a0)
+ fld fs8, 176(a0)
+ fld fs9, 184(a0)
+ fld fs10, 192(a0)
+ fld fs11, 200(a0)
+#endif
+
+ seqz a0, a1
+ add a0, a0, a1
+ ret
diff --git a/libc-top-half/musl/src/setjmp/riscv64/setjmp.S b/libc-top-half/musl/src/setjmp/riscv64/setjmp.S
new file mode 100644
index 0000000..5124967
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/riscv64/setjmp.S
@@ -0,0 +1,41 @@
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp, %function
+.type _setjmp, %function
+.type setjmp, %function
+__setjmp:
+_setjmp:
+setjmp:
+ sd s0, 0(a0)
+ sd s1, 8(a0)
+ sd s2, 16(a0)
+ sd s3, 24(a0)
+ sd s4, 32(a0)
+ sd s5, 40(a0)
+ sd s6, 48(a0)
+ sd s7, 56(a0)
+ sd s8, 64(a0)
+ sd s9, 72(a0)
+ sd s10, 80(a0)
+ sd s11, 88(a0)
+ sd sp, 96(a0)
+ sd ra, 104(a0)
+
+#ifndef __riscv_float_abi_soft
+ fsd fs0, 112(a0)
+ fsd fs1, 120(a0)
+ fsd fs2, 128(a0)
+ fsd fs3, 136(a0)
+ fsd fs4, 144(a0)
+ fsd fs5, 152(a0)
+ fsd fs6, 160(a0)
+ fsd fs7, 168(a0)
+ fsd fs8, 176(a0)
+ fsd fs9, 184(a0)
+ fsd fs10, 192(a0)
+ fsd fs11, 200(a0)
+#endif
+
+ li a0, 0
+ ret
diff --git a/libc-top-half/musl/src/setjmp/s390x/longjmp.s b/libc-top-half/musl/src/setjmp/s390x/longjmp.s
new file mode 100644
index 0000000..b2310f8
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/s390x/longjmp.s
@@ -0,0 +1,23 @@
+ .global _longjmp
+ .global longjmp
+ .type _longjmp,@function
+ .type longjmp,@function
+_longjmp:
+longjmp:
+
+1:
+ lmg %r6, %r15, 0(%r2)
+
+ ld %f8, 10*8(%r2)
+ ld %f9, 11*8(%r2)
+ ld %f10, 12*8(%r2)
+ ld %f11, 13*8(%r2)
+ ld %f12, 14*8(%r2)
+ ld %f13, 15*8(%r2)
+ ld %f14, 16*8(%r2)
+ ld %f15, 17*8(%r2)
+
+ ltgr %r2, %r3
+ bnzr %r14
+ lhi %r2, 1
+ br %r14
diff --git a/libc-top-half/musl/src/setjmp/s390x/setjmp.s b/libc-top-half/musl/src/setjmp/s390x/setjmp.s
new file mode 100644
index 0000000..afae1b6
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/s390x/setjmp.s
@@ -0,0 +1,25 @@
+ .global ___setjmp
+ .hidden ___setjmp
+ .global __setjmp
+ .global _setjmp
+ .global setjmp
+ .type __setjmp,@function
+ .type _setjmp,@function
+ .type setjmp,@function
+___setjmp:
+__setjmp:
+_setjmp:
+setjmp:
+ stmg %r6, %r15, 0(%r2)
+
+ std %f8, 10*8(%r2)
+ std %f9, 11*8(%r2)
+ std %f10, 12*8(%r2)
+ std %f11, 13*8(%r2)
+ std %f12, 14*8(%r2)
+ std %f13, 15*8(%r2)
+ std %f14, 16*8(%r2)
+ std %f15, 17*8(%r2)
+
+ lghi %r2, 0
+ br %r14
diff --git a/libc-top-half/musl/src/setjmp/setjmp.c b/libc-top-half/musl/src/setjmp/setjmp.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/setjmp.c
diff --git a/libc-top-half/musl/src/setjmp/sh/longjmp.S b/libc-top-half/musl/src/setjmp/sh/longjmp.S
new file mode 100644
index 0000000..08f668b
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/sh/longjmp.S
@@ -0,0 +1,28 @@
+.global _longjmp
+.global longjmp
+.type _longjmp, @function
+.type longjmp, @function
+_longjmp:
+longjmp:
+ mov.l @r4+, r8
+ mov.l @r4+, r9
+ mov.l @r4+, r10
+ mov.l @r4+, r11
+ mov.l @r4+, r12
+ mov.l @r4+, r13
+ mov.l @r4+, r14
+ mov.l @r4+, r15
+ lds.l @r4+, pr
+#if __SH_FPU_ANY__ || __SH4__
+ fmov.s @r4+, fr12
+ fmov.s @r4+, fr13
+ fmov.s @r4+, fr14
+ fmov.s @r4+, fr15
+#endif
+
+ tst r5, r5
+ movt r0
+ add r5, r0
+
+ rts
+ nop
diff --git a/libc-top-half/musl/src/setjmp/sh/setjmp.S b/libc-top-half/musl/src/setjmp/sh/setjmp.S
new file mode 100644
index 0000000..d476e63
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/sh/setjmp.S
@@ -0,0 +1,32 @@
+.global ___setjmp
+.hidden ___setjmp
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp, @function
+.type _setjmp, @function
+.type setjmp, @function
+___setjmp:
+__setjmp:
+_setjmp:
+setjmp:
+#if __SH_FPU_ANY__ || __SH4__
+ add #52, r4
+ fmov.s fr15, @-r4
+ fmov.s fr14, @-r4
+ fmov.s fr13, @-r4
+ fmov.s fr12, @-r4
+#else
+ add #36, r4
+#endif
+ sts.l pr, @-r4
+ mov.l r15, @-r4
+ mov.l r14, @-r4
+ mov.l r13, @-r4
+ mov.l r12, @-r4
+ mov.l r11, @-r4
+ mov.l r10, @-r4
+ mov.l r9, @-r4
+ mov.l r8, @-r4
+ rts
+ mov #0, r0
diff --git a/libc-top-half/musl/src/setjmp/x32/longjmp.s b/libc-top-half/musl/src/setjmp/x32/longjmp.s
new file mode 100644
index 0000000..1b2661c
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/x32/longjmp.s
@@ -0,0 +1,18 @@
+/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
+.global _longjmp
+.global longjmp
+.type _longjmp,@function
+.type longjmp,@function
+_longjmp:
+longjmp:
+ xor %eax,%eax
+ cmp $1,%esi /* CF = val ? 0 : 1 */
+ adc %esi,%eax /* eax = val + !val */
+ mov (%rdi),%rbx /* rdi is the jmp_buf, restore regs from it */
+ mov 8(%rdi),%rbp
+ mov 16(%rdi),%r12
+ mov 24(%rdi),%r13
+ mov 32(%rdi),%r14
+ mov 40(%rdi),%r15
+ mov 48(%rdi),%rsp
+ jmp *56(%rdi) /* goto saved address without altering rsp */
diff --git a/libc-top-half/musl/src/setjmp/x32/setjmp.s b/libc-top-half/musl/src/setjmp/x32/setjmp.s
new file mode 100644
index 0000000..d95e485
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/x32/setjmp.s
@@ -0,0 +1,22 @@
+/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,@function
+.type _setjmp,@function
+.type setjmp,@function
+__setjmp:
+_setjmp:
+setjmp:
+ mov %rbx,(%rdi) /* rdi is jmp_buf, move registers onto it */
+ mov %rbp,8(%rdi)
+ mov %r12,16(%rdi)
+ mov %r13,24(%rdi)
+ mov %r14,32(%rdi)
+ mov %r15,40(%rdi)
+ lea 8(%rsp),%rdx /* this is our rsp WITHOUT current ret addr */
+ mov %rdx,48(%rdi)
+ mov (%rsp),%rdx /* save return addr ptr for new rip */
+ mov %rdx,56(%rdi)
+ xor %eax,%eax /* always return 0 */
+ ret
diff --git a/libc-top-half/musl/src/setjmp/x86_64/longjmp.s b/libc-top-half/musl/src/setjmp/x86_64/longjmp.s
new file mode 100644
index 0000000..1b2661c
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/x86_64/longjmp.s
@@ -0,0 +1,18 @@
+/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
+.global _longjmp
+.global longjmp
+.type _longjmp,@function
+.type longjmp,@function
+_longjmp:
+longjmp:
+ xor %eax,%eax
+ cmp $1,%esi /* CF = val ? 0 : 1 */
+ adc %esi,%eax /* eax = val + !val */
+ mov (%rdi),%rbx /* rdi is the jmp_buf, restore regs from it */
+ mov 8(%rdi),%rbp
+ mov 16(%rdi),%r12
+ mov 24(%rdi),%r13
+ mov 32(%rdi),%r14
+ mov 40(%rdi),%r15
+ mov 48(%rdi),%rsp
+ jmp *56(%rdi) /* goto saved address without altering rsp */
diff --git a/libc-top-half/musl/src/setjmp/x86_64/setjmp.s b/libc-top-half/musl/src/setjmp/x86_64/setjmp.s
new file mode 100644
index 0000000..d95e485
--- /dev/null
+++ b/libc-top-half/musl/src/setjmp/x86_64/setjmp.s
@@ -0,0 +1,22 @@
+/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,@function
+.type _setjmp,@function
+.type setjmp,@function
+__setjmp:
+_setjmp:
+setjmp:
+ mov %rbx,(%rdi) /* rdi is jmp_buf, move registers onto it */
+ mov %rbp,8(%rdi)
+ mov %r12,16(%rdi)
+ mov %r13,24(%rdi)
+ mov %r14,32(%rdi)
+ mov %r15,40(%rdi)
+ lea 8(%rsp),%rdx /* this is our rsp WITHOUT current ret addr */
+ mov %rdx,48(%rdi)
+ mov (%rsp),%rdx /* save return addr ptr for new rip */
+ mov %rdx,56(%rdi)
+ xor %eax,%eax /* always return 0 */
+ ret
diff --git a/libc-top-half/musl/src/signal/aarch64/restore.s b/libc-top-half/musl/src/signal/aarch64/restore.s
new file mode 100644
index 0000000..d4e5fcf
--- /dev/null
+++ b/libc-top-half/musl/src/signal/aarch64/restore.s
@@ -0,0 +1,10 @@
+.global __restore
+.hidden __restore
+.type __restore,%function
+__restore:
+.global __restore_rt
+.hidden __restore_rt
+.type __restore_rt,%function
+__restore_rt:
+ mov x8,#139 // SYS_rt_sigreturn
+ svc 0
diff --git a/libc-top-half/musl/src/signal/aarch64/sigsetjmp.s b/libc-top-half/musl/src/signal/aarch64/sigsetjmp.s
new file mode 100644
index 0000000..75910c4
--- /dev/null
+++ b/libc-top-half/musl/src/signal/aarch64/sigsetjmp.s
@@ -0,0 +1,21 @@
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,%function
+.type __sigsetjmp,%function
+sigsetjmp:
+__sigsetjmp:
+ cbz x1,setjmp
+
+ str x30,[x0,#176]
+ str x19,[x0,#176+8+8]
+ mov x19,x0
+
+ bl setjmp
+
+ mov w1,w0
+ mov x0,x19
+ ldr x30,[x0,#176]
+ ldr x19,[x0,#176+8+8]
+
+.hidden __sigsetjmp_tail
+ b __sigsetjmp_tail
diff --git a/libc-top-half/musl/src/signal/arm/restore.s b/libc-top-half/musl/src/signal/arm/restore.s
new file mode 100644
index 0000000..fb086d9
--- /dev/null
+++ b/libc-top-half/musl/src/signal/arm/restore.s
@@ -0,0 +1,15 @@
+.syntax unified
+
+.global __restore
+.hidden __restore
+.type __restore,%function
+__restore:
+ mov r7,#119
+ swi 0x0
+
+.global __restore_rt
+.hidden __restore_rt
+.type __restore_rt,%function
+__restore_rt:
+ mov r7,#173
+ swi 0x0
diff --git a/libc-top-half/musl/src/signal/arm/sigsetjmp.s b/libc-top-half/musl/src/signal/arm/sigsetjmp.s
new file mode 100644
index 0000000..69ebbf4
--- /dev/null
+++ b/libc-top-half/musl/src/signal/arm/sigsetjmp.s
@@ -0,0 +1,24 @@
+.syntax unified
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,%function
+.type __sigsetjmp,%function
+sigsetjmp:
+__sigsetjmp:
+ tst r1,r1
+ bne 1f
+ b setjmp
+
+1: str lr,[r0,#256]
+ str r4,[r0,#260+8]
+ mov r4,r0
+
+ bl setjmp
+
+ mov r1,r0
+ mov r0,r4
+ ldr lr,[r0,#256]
+ ldr r4,[r0,#260+8]
+
+.hidden __sigsetjmp_tail
+ b __sigsetjmp_tail
diff --git a/libc-top-half/musl/src/signal/block.c b/libc-top-half/musl/src/signal/block.c
new file mode 100644
index 0000000..cc8698f
--- /dev/null
+++ b/libc-top-half/musl/src/signal/block.c
@@ -0,0 +1,44 @@
+#include "pthread_impl.h"
+#include "syscall.h"
+#include <signal.h>
+
+static const unsigned long all_mask[] = {
+#if ULONG_MAX == 0xffffffff && _NSIG > 65
+ -1UL, -1UL, -1UL, -1UL
+#elif ULONG_MAX == 0xffffffff || _NSIG > 65
+ -1UL, -1UL
+#else
+ -1UL
+#endif
+};
+
+static const unsigned long app_mask[] = {
+#if ULONG_MAX == 0xffffffff
+#if _NSIG == 65
+ 0x7fffffff, 0xfffffffc
+#else
+ 0x7fffffff, 0xfffffffc, -1UL, -1UL
+#endif
+#else
+#if _NSIG == 65
+ 0xfffffffc7fffffff
+#else
+ 0xfffffffc7fffffff, -1UL
+#endif
+#endif
+};
+
+void __block_all_sigs(void *set)
+{
+ __syscall(SYS_rt_sigprocmask, SIG_BLOCK, &all_mask, set, _NSIG/8);
+}
+
+void __block_app_sigs(void *set)
+{
+ __syscall(SYS_rt_sigprocmask, SIG_BLOCK, &app_mask, set, _NSIG/8);
+}
+
+void __restore_sigs(void *set)
+{
+ __syscall(SYS_rt_sigprocmask, SIG_SETMASK, set, 0, _NSIG/8);
+}
diff --git a/libc-top-half/musl/src/signal/getitimer.c b/libc-top-half/musl/src/signal/getitimer.c
new file mode 100644
index 0000000..36d1eb9
--- /dev/null
+++ b/libc-top-half/musl/src/signal/getitimer.c
@@ -0,0 +1,18 @@
+#include <sys/time.h>
+#include "syscall.h"
+
+int getitimer(int which, struct itimerval *old)
+{
+ if (sizeof(time_t) > sizeof(long)) {
+ long old32[4];
+ int r = __syscall(SYS_getitimer, which, old32);
+ if (!r) {
+ old->it_interval.tv_sec = old32[0];
+ old->it_interval.tv_usec = old32[1];
+ old->it_value.tv_sec = old32[2];
+ old->it_value.tv_usec = old32[3];
+ }
+ return __syscall_ret(r);
+ }
+ return syscall(SYS_getitimer, which, old);
+}
diff --git a/libc-top-half/musl/src/signal/i386/restore.s b/libc-top-half/musl/src/signal/i386/restore.s
new file mode 100644
index 0000000..ccc9430
--- /dev/null
+++ b/libc-top-half/musl/src/signal/i386/restore.s
@@ -0,0 +1,14 @@
+.global __restore
+.hidden __restore
+.type __restore,@function
+__restore:
+ popl %eax
+ movl $119, %eax
+ int $0x80
+
+.global __restore_rt
+.hidden __restore_rt
+.type __restore_rt,@function
+__restore_rt:
+ movl $173, %eax
+ int $0x80
diff --git a/libc-top-half/musl/src/signal/i386/sigsetjmp.s b/libc-top-half/musl/src/signal/i386/sigsetjmp.s
new file mode 100644
index 0000000..690b251
--- /dev/null
+++ b/libc-top-half/musl/src/signal/i386/sigsetjmp.s
@@ -0,0 +1,26 @@
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+sigsetjmp:
+__sigsetjmp:
+ mov 8(%esp),%ecx
+ jecxz 1f
+
+ mov 4(%esp),%eax
+ popl 24(%eax)
+ mov %ebx,28+8(%eax)
+ mov %eax,%ebx
+
+.hidden ___setjmp
+ call ___setjmp
+
+ pushl 24(%ebx)
+ mov %ebx,4(%esp)
+ mov %eax,8(%esp)
+ mov 28+8(%ebx),%ebx
+
+.hidden __sigsetjmp_tail
+ jmp __sigsetjmp_tail
+
+1: jmp ___setjmp
diff --git a/libc-top-half/musl/src/signal/kill.c b/libc-top-half/musl/src/signal/kill.c
new file mode 100644
index 0000000..0580573
--- /dev/null
+++ b/libc-top-half/musl/src/signal/kill.c
@@ -0,0 +1,7 @@
+#include <signal.h>
+#include "syscall.h"
+
+int kill(pid_t pid, int sig)
+{
+ return syscall(SYS_kill, pid, sig);
+}
diff --git a/libc-top-half/musl/src/signal/killpg.c b/libc-top-half/musl/src/signal/killpg.c
new file mode 100644
index 0000000..315ed44
--- /dev/null
+++ b/libc-top-half/musl/src/signal/killpg.c
@@ -0,0 +1,11 @@
+#include <signal.h>
+#include <errno.h>
+
+int killpg(pid_t pgid, int sig)
+{
+ if (pgid < 0) {
+ errno = EINVAL;
+ return -1;
+ }
+ return kill(-pgid, sig);
+}
diff --git a/libc-top-half/musl/src/signal/m68k/sigsetjmp.s b/libc-top-half/musl/src/signal/m68k/sigsetjmp.s
new file mode 100644
index 0000000..09bfa64
--- /dev/null
+++ b/libc-top-half/musl/src/signal/m68k/sigsetjmp.s
@@ -0,0 +1,29 @@
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+sigsetjmp:
+__sigsetjmp:
+ move.l 8(%sp),%d0
+ beq 1f
+
+ movea.l 4(%sp),%a1
+ move.l (%sp)+,156(%a1)
+ move.l %a2,156+4+8(%a1)
+ movea.l %a1,%a2
+
+.hidden ___setjmp
+ lea ___setjmp-.-8,%a1
+ jsr (%pc,%a1)
+
+ move.l 156(%a2),-(%sp)
+ move.l %a2,4(%sp)
+ move.l %d0,8(%sp)
+ movea.l 156+4+8(%a2),%a2
+
+.hidden __sigsetjmp_tail
+ lea __sigsetjmp_tail-.-8,%a1
+ jmp (%pc,%a1)
+
+1: lea ___setjmp-.-8,%a1
+ jmp (%pc,%a1)
diff --git a/libc-top-half/musl/src/signal/microblaze/restore.s b/libc-top-half/musl/src/signal/microblaze/restore.s
new file mode 100644
index 0000000..b3c9f57
--- /dev/null
+++ b/libc-top-half/musl/src/signal/microblaze/restore.s
@@ -0,0 +1,13 @@
+.global __restore
+.hidden __restore
+.type __restore,@function
+__restore:
+ ori r12, r0, 119
+ brki r14, 0x8
+
+.global __restore_rt
+.hidden __restore_rt
+.type __restore_rt,@function
+__restore_rt:
+ ori r12, r0, 173
+ brki r14, 0x8
diff --git a/libc-top-half/musl/src/signal/microblaze/sigsetjmp.s b/libc-top-half/musl/src/signal/microblaze/sigsetjmp.s
new file mode 100644
index 0000000..d1dd24c
--- /dev/null
+++ b/libc-top-half/musl/src/signal/microblaze/sigsetjmp.s
@@ -0,0 +1,22 @@
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+sigsetjmp:
+__sigsetjmp:
+.hidden ___setjmp
+ beqi r6, ___setjmp
+
+ swi r15,r5,72
+ swi r19,r5,72+4+8
+
+ brlid r15,___setjmp
+ ori r19,r5,0
+
+ ori r6,r3,0
+ ori r5,r19,0
+ lwi r15,r5,72
+ lwi r19,r5,72+4+8
+
+.hidden __sigsetjmp_tail
+ bri __sigsetjmp_tail
diff --git a/libc-top-half/musl/src/signal/mips/restore.s b/libc-top-half/musl/src/signal/mips/restore.s
new file mode 100644
index 0000000..b6dadce
--- /dev/null
+++ b/libc-top-half/musl/src/signal/mips/restore.s
@@ -0,0 +1,15 @@
+.set noreorder
+
+.global __restore_rt
+.hidden __restore_rt
+.type __restore_rt,@function
+__restore_rt:
+ li $2, 4193
+ syscall
+
+.global __restore
+.hidden __restore
+.type __restore,@function
+__restore:
+ li $2, 4119
+ syscall
diff --git a/libc-top-half/musl/src/signal/mips/sigsetjmp.s b/libc-top-half/musl/src/signal/mips/sigsetjmp.s
new file mode 100644
index 0000000..74b65ff
--- /dev/null
+++ b/libc-top-half/musl/src/signal/mips/sigsetjmp.s
@@ -0,0 +1,33 @@
+.set noreorder
+
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+sigsetjmp:
+__sigsetjmp:
+ lui $gp, %hi(_gp_disp)
+ addiu $gp, %lo(_gp_disp)
+ beq $5, $0, 1f
+ addu $gp, $gp, $25
+
+ sw $ra, 104($4)
+ sw $16, 104+4+16($4)
+
+ lw $25, %call16(setjmp)($gp)
+ jalr $25
+ move $16, $4
+
+ move $5,$2
+ move $4,$16
+ lw $ra, 104($4)
+ lw $16, 104+4+16($4)
+
+.hidden __sigsetjmp_tail
+ lw $25, %call16(__sigsetjmp_tail)($gp)
+ jr $25
+ nop
+
+1: lw $25, %call16(setjmp)($gp)
+ jr $25
+ nop
diff --git a/libc-top-half/musl/src/signal/mips64/restore.s b/libc-top-half/musl/src/signal/mips64/restore.s
new file mode 100644
index 0000000..401f8e7
--- /dev/null
+++ b/libc-top-half/musl/src/signal/mips64/restore.s
@@ -0,0 +1,11 @@
+.set noreorder
+.global __restore_rt
+.global __restore
+.hidden __restore_rt
+.hidden __restore
+.type __restore_rt,@function
+.type __restore,@function
+__restore_rt:
+__restore:
+ li $2,5211
+ syscall
diff --git a/libc-top-half/musl/src/signal/mips64/sigsetjmp.s b/libc-top-half/musl/src/signal/mips64/sigsetjmp.s
new file mode 100644
index 0000000..156e70b
--- /dev/null
+++ b/libc-top-half/musl/src/signal/mips64/sigsetjmp.s
@@ -0,0 +1,38 @@
+.set noreorder
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+sigsetjmp:
+__sigsetjmp:
+ lui $3, %hi(%neg(%gp_rel(sigsetjmp)))
+ daddiu $3, $3, %lo(%neg(%gp_rel(sigsetjmp)))
+
+ # comparing save mask with 0, if equals to 0 then
+ # sigsetjmp is equal to setjmp.
+ beq $5, $0, 1f
+ daddu $3, $3, $25
+ sd $ra, 160($4)
+ sd $16, 168($4)
+
+ # save base of got so that we can use it later
+ # once we return from 'longjmp'
+ sd $3, 176($4)
+ ld $25, %got_disp(setjmp)($3)
+ jalr $25
+ move $16, $4
+
+ move $5, $2 # Return from 'setjmp' or 'longjmp'
+ move $4, $16 # Restore the pointer-to-sigjmp_buf
+ ld $ra, 160($4) # Restore ra of sigsetjmp
+ ld $16, 168($4) # Restore $16 of sigsetjmp
+ ld $3, 176($4) # Restore base of got
+
+.hidden __sigsetjmp_tail
+ ld $25, %got_disp(__sigsetjmp_tail)($3)
+ jr $25
+ nop
+1:
+ ld $25, %got_disp(setjmp)($3)
+ jr $25
+ nop
diff --git a/libc-top-half/musl/src/signal/mipsn32/restore.s b/libc-top-half/musl/src/signal/mipsn32/restore.s
new file mode 100644
index 0000000..4cd4e1b
--- /dev/null
+++ b/libc-top-half/musl/src/signal/mipsn32/restore.s
@@ -0,0 +1,11 @@
+.set noreorder
+.global __restore_rt
+.global __restore
+.hidden __restore_rt
+.hidden __restore
+.type __restore_rt,@function
+.type __restore,@function
+__restore_rt:
+__restore:
+ li $2,6211
+ syscall
diff --git a/libc-top-half/musl/src/signal/mipsn32/sigsetjmp.s b/libc-top-half/musl/src/signal/mipsn32/sigsetjmp.s
new file mode 100644
index 0000000..c0c6961
--- /dev/null
+++ b/libc-top-half/musl/src/signal/mipsn32/sigsetjmp.s
@@ -0,0 +1,38 @@
+.set noreorder
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+sigsetjmp:
+__sigsetjmp:
+ lui $3, %hi(%neg(%gp_rel(sigsetjmp)))
+ addiu $3, $3, %lo(%neg(%gp_rel(sigsetjmp)))
+
+ # comparing save mask with 0, if equals to 0 then
+ # sigsetjmp is equal to setjmp.
+ beq $5, $0, 1f
+ addu $3, $3, $25
+ sd $ra, 160($4)
+ sd $16, 168($4)
+
+ # save base of got so that we can use it later
+ # once we return from 'longjmp'
+ sd $3, 176($4)
+ lw $25, %got_disp(setjmp)($3)
+ jalr $25
+ move $16, $4
+
+ move $5, $2 # Return from 'setjmp' or 'longjmp'
+ move $4, $16 # Restore the pointer-to-sigjmp_buf
+ ld $ra, 160($4) # Restore ra of sigsetjmp
+ ld $16, 168($4) # Restore $16 of sigsetjmp
+ ld $3, 176($4) # Restore base of got
+
+.hidden __sigsetjmp_tail
+ lw $25, %got_disp(__sigsetjmp_tail)($3)
+ jr $25
+ nop
+1:
+ lw $25, %got_disp(setjmp)($3)
+ jr $25
+ nop
diff --git a/libc-top-half/musl/src/signal/or1k/sigsetjmp.s b/libc-top-half/musl/src/signal/or1k/sigsetjmp.s
new file mode 100644
index 0000000..b9bcdae
--- /dev/null
+++ b/libc-top-half/musl/src/signal/or1k/sigsetjmp.s
@@ -0,0 +1,24 @@
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+sigsetjmp:
+__sigsetjmp:
+ l.sfeq r4, r0
+.hidden ___setjmp
+ l.bf ___setjmp
+
+ l.sw 52(r3), r9
+ l.sw 52+4+8(r3), r20
+
+ l.jal ___setjmp
+ l.ori r20, r3, 0
+
+ l.ori r4, r11, 0
+ l.ori r3, r20, 0
+
+ l.lwz r9, 52(r3)
+
+.hidden __sigsetjmp_tail
+ l.j __sigsetjmp_tail
+ l.lwz r20, 52+4+8(r3)
diff --git a/libc-top-half/musl/src/signal/powerpc/restore.s b/libc-top-half/musl/src/signal/powerpc/restore.s
new file mode 100644
index 0000000..29c8afd
--- /dev/null
+++ b/libc-top-half/musl/src/signal/powerpc/restore.s
@@ -0,0 +1,13 @@
+ .global __restore
+ .hidden __restore
+ .type __restore,%function
+__restore:
+ li 0, 119 #__NR_sigreturn
+ sc
+
+ .global __restore_rt
+ .hidden __restore_rt
+ .type __restore_rt,%function
+__restore_rt:
+ li 0, 172 # __NR_rt_sigreturn
+ sc
diff --git a/libc-top-half/musl/src/signal/powerpc/sigsetjmp.s b/libc-top-half/musl/src/signal/powerpc/sigsetjmp.s
new file mode 100644
index 0000000..152c3fe
--- /dev/null
+++ b/libc-top-half/musl/src/signal/powerpc/sigsetjmp.s
@@ -0,0 +1,27 @@
+ .global sigsetjmp
+ .global __sigsetjmp
+ .type sigsetjmp,%function
+ .type __sigsetjmp,%function
+sigsetjmp:
+__sigsetjmp:
+ cmpwi cr7, 4, 0
+ beq- cr7, 1f
+
+ mflr 5
+ stw 5, 448(3)
+ stw 16, 448+4+8(3)
+ mr 16, 3
+
+.hidden ___setjmp
+ bl ___setjmp
+
+ mr 4, 3
+ mr 3, 16
+ lwz 5, 448(3)
+ mtlr 5
+ lwz 16, 448+4+8(3)
+
+.hidden __sigsetjmp_tail
+ b __sigsetjmp_tail
+
+1: b ___setjmp
diff --git a/libc-top-half/musl/src/signal/powerpc64/restore.s b/libc-top-half/musl/src/signal/powerpc64/restore.s
new file mode 100644
index 0000000..29c8afd
--- /dev/null
+++ b/libc-top-half/musl/src/signal/powerpc64/restore.s
@@ -0,0 +1,13 @@
+ .global __restore
+ .hidden __restore
+ .type __restore,%function
+__restore:
+ li 0, 119 #__NR_sigreturn
+ sc
+
+ .global __restore_rt
+ .hidden __restore_rt
+ .type __restore_rt,%function
+__restore_rt:
+ li 0, 172 # __NR_rt_sigreturn
+ sc
diff --git a/libc-top-half/musl/src/signal/powerpc64/sigsetjmp.s b/libc-top-half/musl/src/signal/powerpc64/sigsetjmp.s
new file mode 100644
index 0000000..410c283
--- /dev/null
+++ b/libc-top-half/musl/src/signal/powerpc64/sigsetjmp.s
@@ -0,0 +1,37 @@
+ .global sigsetjmp
+ .global __sigsetjmp
+ .type sigsetjmp,%function
+ .type __sigsetjmp,%function
+ .hidden __setjmp_toc
+sigsetjmp:
+__sigsetjmp:
+ addis 2, 12, .TOC.-__sigsetjmp@ha
+ addi 2, 2, .TOC.-__sigsetjmp@l
+ ld 5, 24(1) # load from the TOC slot in the caller's stack frame
+ b 1f
+
+ .localentry sigsetjmp,.-sigsetjmp
+ .localentry __sigsetjmp,.-__sigsetjmp
+ mr 5, 2
+
+1:
+ cmpwi cr7, 4, 0
+ beq- cr7, __setjmp_toc
+
+ mflr 6
+ std 6, 512(3)
+ std 2, 512+16(3)
+ std 16, 512+24(3)
+ mr 16, 3
+
+ bl __setjmp_toc
+
+ mr 4, 3
+ mr 3, 16
+ ld 5, 512(3)
+ mtlr 5
+ ld 2, 512+16(3)
+ ld 16, 512+24(3)
+
+.hidden __sigsetjmp_tail
+ b __sigsetjmp_tail
diff --git a/libc-top-half/musl/src/signal/psiginfo.c b/libc-top-half/musl/src/signal/psiginfo.c
new file mode 100644
index 0000000..2b15982
--- /dev/null
+++ b/libc-top-half/musl/src/signal/psiginfo.c
@@ -0,0 +1,6 @@
+#include <signal.h>
+
+void psiginfo(const siginfo_t *si, const char *msg)
+{
+ psignal(si->si_signo, msg);
+}
diff --git a/libc-top-half/musl/src/signal/psignal.c b/libc-top-half/musl/src/signal/psignal.c
new file mode 100644
index 0000000..138dbe0
--- /dev/null
+++ b/libc-top-half/musl/src/signal/psignal.c
@@ -0,0 +1,27 @@
+#include "stdio_impl.h"
+#include <string.h>
+#include <signal.h>
+#include <errno.h>
+
+void psignal(int sig, const char *msg)
+{
+ FILE *f = stderr;
+ char *s = strsignal(sig);
+
+ FLOCK(f);
+
+ /* Save stderr's orientation and encoding rule, since psignal is not
+ * permitted to change them. Save errno and restore it if there is no
+ * error since fprintf might change it even on success but psignal is
+ * not permitted to do so. */
+ void *old_locale = f->locale;
+ int old_mode = f->mode;
+ int old_errno = errno;
+
+ if (fprintf(f, "%s%s%s\n", msg?msg:"", msg?": ":"", s)>=0)
+ errno = old_errno;
+ f->mode = old_mode;
+ f->locale = old_locale;
+
+ FUNLOCK(f);
+}
diff --git a/libc-top-half/musl/src/signal/raise.c b/libc-top-half/musl/src/signal/raise.c
new file mode 100644
index 0000000..f051201
--- /dev/null
+++ b/libc-top-half/musl/src/signal/raise.c
@@ -0,0 +1,13 @@
+#include <signal.h>
+#include <stdint.h>
+#include "syscall.h"
+#include "pthread_impl.h"
+
+int raise(int sig)
+{
+ sigset_t set;
+ __block_app_sigs(&set);
+ int ret = syscall(SYS_tkill, __pthread_self()->tid, sig);
+ __restore_sigs(&set);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/signal/restore.c b/libc-top-half/musl/src/signal/restore.c
new file mode 100644
index 0000000..5ec4f5d
--- /dev/null
+++ b/libc-top-half/musl/src/signal/restore.c
@@ -0,0 +1,12 @@
+#include <features.h>
+
+/* These functions will not work, but suffice for targets where the
+ * kernel sigaction structure does not actually use sa_restorer. */
+
+hidden void __restore()
+{
+}
+
+hidden void __restore_rt()
+{
+}
diff --git a/libc-top-half/musl/src/signal/riscv64/restore.s b/libc-top-half/musl/src/signal/riscv64/restore.s
new file mode 100644
index 0000000..40012c7
--- /dev/null
+++ b/libc-top-half/musl/src/signal/riscv64/restore.s
@@ -0,0 +1,8 @@
+.global __restore
+.type __restore, %function
+__restore:
+.global __restore_rt
+.type __restore_rt, %function
+__restore_rt:
+ li a7, 139 # SYS_rt_sigreturn
+ ecall
diff --git a/libc-top-half/musl/src/signal/riscv64/sigsetjmp.s b/libc-top-half/musl/src/signal/riscv64/sigsetjmp.s
new file mode 100644
index 0000000..f9bc162
--- /dev/null
+++ b/libc-top-half/musl/src/signal/riscv64/sigsetjmp.s
@@ -0,0 +1,23 @@
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp, %function
+.type __sigsetjmp, %function
+sigsetjmp:
+__sigsetjmp:
+ bnez a1, 1f
+ tail setjmp
+1:
+
+ sd ra, 208(a0)
+ sd s0, 224(a0)
+ mv s0, a0
+
+ call setjmp
+
+ mv a1, a0
+ mv a0, s0
+ ld s0, 224(a0)
+ ld ra, 208(a0)
+
+.hidden __sigsetjmp_tail
+ tail __sigsetjmp_tail
diff --git a/libc-top-half/musl/src/signal/s390x/restore.s b/libc-top-half/musl/src/signal/s390x/restore.s
new file mode 100644
index 0000000..88e33db
--- /dev/null
+++ b/libc-top-half/musl/src/signal/s390x/restore.s
@@ -0,0 +1,11 @@
+ .global __restore
+ .hidden __restore
+ .type __restore,%function
+__restore:
+ svc 119 #__NR_sigreturn
+
+ .global __restore_rt
+ .hidden __restore_rt
+ .type __restore_rt,%function
+__restore_rt:
+ svc 173 # __NR_rt_sigreturn
diff --git a/libc-top-half/musl/src/signal/s390x/sigsetjmp.s b/libc-top-half/musl/src/signal/s390x/sigsetjmp.s
new file mode 100644
index 0000000..41b1bd9
--- /dev/null
+++ b/libc-top-half/musl/src/signal/s390x/sigsetjmp.s
@@ -0,0 +1,23 @@
+ .global sigsetjmp
+ .global __sigsetjmp
+ .type sigsetjmp,%function
+ .type __sigsetjmp,%function
+ .hidden ___setjmp
+sigsetjmp:
+__sigsetjmp:
+ ltgr %r3, %r3
+ jz ___setjmp
+
+ stg %r14, 18*8(%r2)
+ stg %r6, 20*8(%r2)
+ lgr %r6, %r2
+
+ brasl %r14, ___setjmp
+
+ lgr %r3, %r2
+ lgr %r2, %r6
+ lg %r14, 18*8(%r2)
+ lg %r6, 20*8(%r2)
+
+.hidden __sigsetjmp_tail
+ jg __sigsetjmp_tail
diff --git a/libc-top-half/musl/src/signal/setitimer.c b/libc-top-half/musl/src/signal/setitimer.c
new file mode 100644
index 0000000..0dfbeb4
--- /dev/null
+++ b/libc-top-half/musl/src/signal/setitimer.c
@@ -0,0 +1,26 @@
+#include <sys/time.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+
+int setitimer(int which, const struct itimerval *restrict new, struct itimerval *restrict old)
+{
+ if (sizeof(time_t) > sizeof(long)) {
+ time_t is = new->it_interval.tv_sec, vs = new->it_value.tv_sec;
+ long ius = new->it_interval.tv_usec, vus = new->it_value.tv_usec;
+ if (!IS32BIT(is) || !IS32BIT(vs))
+ return __syscall_ret(-ENOTSUP);
+ long old32[4];
+ int r = __syscall(SYS_setitimer, which,
+ ((long[]){is, ius, vs, vus}), old32);
+ if (!r && old) {
+ old->it_interval.tv_sec = old32[0];
+ old->it_interval.tv_usec = old32[1];
+ old->it_value.tv_sec = old32[2];
+ old->it_value.tv_usec = old32[3];
+ }
+ return __syscall_ret(r);
+ }
+ return syscall(SYS_setitimer, which, new, old);
+}
diff --git a/libc-top-half/musl/src/signal/sh/restore.s b/libc-top-half/musl/src/signal/sh/restore.s
new file mode 100644
index 0000000..3a92199
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sh/restore.s
@@ -0,0 +1,24 @@
+.global __restore
+.hidden __restore
+__restore:
+ mov #119, r3 !__NR_sigreturn
+ trapa #31
+
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+
+.global __restore_rt
+.hidden __restore_rt
+__restore_rt:
+ mov #100, r3 !__NR_rt_sigreturn
+ add #73, r3
+ trapa #31
+
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
diff --git a/libc-top-half/musl/src/signal/sh/sigsetjmp.s b/libc-top-half/musl/src/signal/sh/sigsetjmp.s
new file mode 100644
index 0000000..1e2270b
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sh/sigsetjmp.s
@@ -0,0 +1,41 @@
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+sigsetjmp:
+__sigsetjmp:
+ tst r5, r5
+ bt 9f
+
+ mov r4, r6
+ add #60, r6
+ sts pr, r0
+ mov.l r0, @r6
+ mov.l r8, @(4+8,r6)
+
+ mov.l 1f, r0
+2: bsrf r0
+ mov r4, r8
+
+ mov r0, r5
+ mov r8, r4
+ mov r4, r6
+ add #60, r6
+
+ mov.l @r6, r0
+ lds r0, pr
+
+ mov.l 3f, r0
+4: braf r0
+ mov.l @(4+8,r4), r8
+
+9: mov.l 5f, r0
+6: braf r0
+ nop
+
+.align 2
+.hidden ___setjmp
+1: .long ___setjmp@PLT-(2b+4-.)
+.hidden __sigsetjmp_tail
+3: .long __sigsetjmp_tail@PLT-(4b+4-.)
+5: .long ___setjmp@PLT-(6b+4-.)
diff --git a/libc-top-half/musl/src/signal/sigaction.c b/libc-top-half/musl/src/signal/sigaction.c
new file mode 100644
index 0000000..2203471
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigaction.c
@@ -0,0 +1,84 @@
+#include <signal.h>
+#include <errno.h>
+#include <string.h>
+#include "syscall.h"
+#include "pthread_impl.h"
+#include "libc.h"
+#include "lock.h"
+#include "ksigaction.h"
+
+static int unmask_done;
+static unsigned long handler_set[_NSIG/(8*sizeof(long))];
+
+void __get_handler_set(sigset_t *set)
+{
+ memcpy(set, handler_set, sizeof handler_set);
+}
+
+volatile int __eintr_valid_flag;
+
+int __libc_sigaction(int sig, const struct sigaction *restrict sa, struct sigaction *restrict old)
+{
+ struct k_sigaction ksa, ksa_old;
+ if (sa) {
+ if ((uintptr_t)sa->sa_handler > 1UL) {
+ a_or_l(handler_set+(sig-1)/(8*sizeof(long)),
+ 1UL<<(sig-1)%(8*sizeof(long)));
+
+ /* If pthread_create has not yet been called,
+ * implementation-internal signals might not
+ * yet have been unblocked. They must be
+ * unblocked before any signal handler is
+ * installed, so that an application cannot
+ * receive an illegal sigset_t (with them
+ * blocked) as part of the ucontext_t passed
+ * to the signal handler. */
+ if (!libc.threaded && !unmask_done) {
+ __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK,
+ SIGPT_SET, 0, _NSIG/8);
+ unmask_done = 1;
+ }
+
+ if (!(sa->sa_flags & SA_RESTART)) {
+ a_store(&__eintr_valid_flag, 1);
+ }
+ }
+ ksa.handler = sa->sa_handler;
+ ksa.flags = sa->sa_flags | SA_RESTORER;
+ ksa.restorer = (sa->sa_flags & SA_SIGINFO) ? __restore_rt : __restore;
+ memcpy(&ksa.mask, &sa->sa_mask, _NSIG/8);
+ }
+ int r = __syscall(SYS_rt_sigaction, sig, sa?&ksa:0, old?&ksa_old:0, _NSIG/8);
+ if (old && !r) {
+ old->sa_handler = ksa_old.handler;
+ old->sa_flags = ksa_old.flags;
+ memcpy(&old->sa_mask, &ksa_old.mask, _NSIG/8);
+ }
+ return __syscall_ret(r);
+}
+
+int __sigaction(int sig, const struct sigaction *restrict sa, struct sigaction *restrict old)
+{
+ unsigned long set[_NSIG/(8*sizeof(long))];
+
+ if (sig-32U < 3 || sig-1U >= _NSIG-1) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* Doing anything with the disposition of SIGABRT requires a lock,
+ * so that it cannot be changed while abort is terminating the
+ * process and so any change made by abort can't be observed. */
+ if (sig == SIGABRT) {
+ __block_all_sigs(&set);
+ LOCK(__abort_lock);
+ }
+ int r = __libc_sigaction(sig, sa, old);
+ if (sig == SIGABRT) {
+ UNLOCK(__abort_lock);
+ __restore_sigs(&set);
+ }
+ return r;
+}
+
+weak_alias(__sigaction, sigaction);
diff --git a/libc-top-half/musl/src/signal/sigaddset.c b/libc-top-half/musl/src/signal/sigaddset.c
new file mode 100644
index 0000000..085d1f4
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigaddset.c
@@ -0,0 +1,13 @@
+#include <signal.h>
+#include <errno.h>
+
+int sigaddset(sigset_t *set, int sig)
+{
+ unsigned s = sig-1;
+ if (s >= _NSIG-1 || sig-32U < 3) {
+ errno = EINVAL;
+ return -1;
+ }
+ set->__bits[s/8/sizeof *set->__bits] |= 1UL<<(s&8*sizeof *set->__bits-1);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/signal/sigaltstack.c b/libc-top-half/musl/src/signal/sigaltstack.c
new file mode 100644
index 0000000..d3a6e82
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigaltstack.c
@@ -0,0 +1,18 @@
+#include <signal.h>
+#include <errno.h>
+#include "syscall.h"
+
+int sigaltstack(const stack_t *restrict ss, stack_t *restrict old)
+{
+ if (ss) {
+ if (!(ss->ss_flags & SS_DISABLE) && ss->ss_size < MINSIGSTKSZ) {
+ errno = ENOMEM;
+ return -1;
+ }
+ if (ss->ss_flags & SS_ONSTACK) {
+ errno = EINVAL;
+ return -1;
+ }
+ }
+ return syscall(SYS_sigaltstack, ss, old);
+}
diff --git a/libc-top-half/musl/src/signal/sigandset.c b/libc-top-half/musl/src/signal/sigandset.c
new file mode 100644
index 0000000..974186f
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigandset.c
@@ -0,0 +1,12 @@
+#define _GNU_SOURCE
+#include <signal.h>
+
+#define SST_SIZE (_NSIG/8/sizeof(long))
+
+int sigandset(sigset_t *dest, const sigset_t *left, const sigset_t *right)
+{
+ unsigned long i = 0, *d = (void*) dest, *l = (void*) left, *r = (void*) right;
+ for(; i < SST_SIZE; i++) d[i] = l[i] & r[i];
+ return 0;
+}
+
diff --git a/libc-top-half/musl/src/signal/sigdelset.c b/libc-top-half/musl/src/signal/sigdelset.c
new file mode 100644
index 0000000..ce69280
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigdelset.c
@@ -0,0 +1,13 @@
+#include <signal.h>
+#include <errno.h>
+
+int sigdelset(sigset_t *set, int sig)
+{
+ unsigned s = sig-1;
+ if (s >= _NSIG-1 || sig-32U < 3) {
+ errno = EINVAL;
+ return -1;
+ }
+ set->__bits[s/8/sizeof *set->__bits] &=~(1UL<<(s&8*sizeof *set->__bits-1));
+ return 0;
+}
diff --git a/libc-top-half/musl/src/signal/sigemptyset.c b/libc-top-half/musl/src/signal/sigemptyset.c
new file mode 100644
index 0000000..1d07471
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigemptyset.c
@@ -0,0 +1,13 @@
+#include <signal.h>
+#include <string.h>
+
+int sigemptyset(sigset_t *set)
+{
+ set->__bits[0] = 0;
+ if (sizeof(long)==4 || _NSIG > 65) set->__bits[1] = 0;
+ if (sizeof(long)==4 && _NSIG > 65) {
+ set->__bits[2] = 0;
+ set->__bits[3] = 0;
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/signal/sigfillset.c b/libc-top-half/musl/src/signal/sigfillset.c
new file mode 100644
index 0000000..16e7b4f
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigfillset.c
@@ -0,0 +1,18 @@
+#include <signal.h>
+#include <limits.h>
+
+int sigfillset(sigset_t *set)
+{
+#if ULONG_MAX == 0xffffffff
+ set->__bits[0] = 0x7ffffffful;
+ set->__bits[1] = 0xfffffffcul;
+ if (_NSIG > 65) {
+ set->__bits[2] = 0xfffffffful;
+ set->__bits[3] = 0xfffffffful;
+ }
+#else
+ set->__bits[0] = 0xfffffffc7ffffffful;
+ if (_NSIG > 65) set->__bits[1] = 0xfffffffffffffffful;
+#endif
+ return 0;
+}
diff --git a/libc-top-half/musl/src/signal/sighold.c b/libc-top-half/musl/src/signal/sighold.c
new file mode 100644
index 0000000..cfa2306
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sighold.c
@@ -0,0 +1,10 @@
+#include <signal.h>
+
+int sighold(int sig)
+{
+ sigset_t mask;
+
+ sigemptyset(&mask);
+ if (sigaddset(&mask, sig) < 0) return -1;
+ return sigprocmask(SIG_BLOCK, &mask, 0);
+}
diff --git a/libc-top-half/musl/src/signal/sigignore.c b/libc-top-half/musl/src/signal/sigignore.c
new file mode 100644
index 0000000..5ba05e1
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigignore.c
@@ -0,0 +1,11 @@
+#include <signal.h>
+
+int sigignore(int sig)
+{
+ struct sigaction sa;
+
+ sigemptyset(&sa.sa_mask);
+ sa.sa_handler = SIG_IGN;
+ sa.sa_flags = 0;
+ return sigaction(sig, &sa, 0);
+}
diff --git a/libc-top-half/musl/src/signal/siginterrupt.c b/libc-top-half/musl/src/signal/siginterrupt.c
new file mode 100644
index 0000000..7006340
--- /dev/null
+++ b/libc-top-half/musl/src/signal/siginterrupt.c
@@ -0,0 +1,12 @@
+#include <signal.h>
+
+int siginterrupt(int sig, int flag)
+{
+ struct sigaction sa;
+
+ sigaction(sig, 0, &sa);
+ if (flag) sa.sa_flags &= ~SA_RESTART;
+ else sa.sa_flags |= SA_RESTART;
+
+ return sigaction(sig, &sa, 0);
+}
diff --git a/libc-top-half/musl/src/signal/sigisemptyset.c b/libc-top-half/musl/src/signal/sigisemptyset.c
new file mode 100644
index 0000000..68b8662
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigisemptyset.c
@@ -0,0 +1,10 @@
+#define _GNU_SOURCE
+#include <signal.h>
+#include <string.h>
+
+int sigisemptyset(const sigset_t *set)
+{
+ for (size_t i=0; i<_NSIG/8/sizeof *set->__bits; i++)
+ if (set->__bits[i]) return 0;
+ return 1;
+}
diff --git a/libc-top-half/musl/src/signal/sigismember.c b/libc-top-half/musl/src/signal/sigismember.c
new file mode 100644
index 0000000..ab87d62
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigismember.c
@@ -0,0 +1,8 @@
+#include <signal.h>
+
+int sigismember(const sigset_t *set, int sig)
+{
+ unsigned s = sig-1;
+ if (s >= _NSIG-1) return 0;
+ return !!(set->__bits[s/8/sizeof *set->__bits] & 1UL<<(s&8*sizeof *set->__bits-1));
+}
diff --git a/libc-top-half/musl/src/signal/siglongjmp.c b/libc-top-half/musl/src/signal/siglongjmp.c
new file mode 100644
index 0000000..bc317ac
--- /dev/null
+++ b/libc-top-half/musl/src/signal/siglongjmp.c
@@ -0,0 +1,9 @@
+#include <setjmp.h>
+#include <signal.h>
+#include "syscall.h"
+#include "pthread_impl.h"
+
+_Noreturn void siglongjmp(sigjmp_buf buf, int ret)
+{
+ longjmp(buf, ret);
+}
diff --git a/libc-top-half/musl/src/signal/signal.c b/libc-top-half/musl/src/signal/signal.c
new file mode 100644
index 0000000..7a6dd17
--- /dev/null
+++ b/libc-top-half/musl/src/signal/signal.c
@@ -0,0 +1,13 @@
+#include <signal.h>
+#include "syscall.h"
+
+void (*signal(int sig, void (*func)(int)))(int)
+{
+ struct sigaction sa_old, sa = { .sa_handler = func, .sa_flags = SA_RESTART };
+ if (__sigaction(sig, &sa, &sa_old) < 0)
+ return SIG_ERR;
+ return sa_old.sa_handler;
+}
+
+weak_alias(signal, bsd_signal);
+weak_alias(signal, __sysv_signal);
diff --git a/libc-top-half/musl/src/signal/sigorset.c b/libc-top-half/musl/src/signal/sigorset.c
new file mode 100644
index 0000000..ed48873
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigorset.c
@@ -0,0 +1,12 @@
+#define _GNU_SOURCE
+#include <signal.h>
+
+#define SST_SIZE (_NSIG/8/sizeof(long))
+
+int sigorset(sigset_t *dest, const sigset_t *left, const sigset_t *right)
+{
+ unsigned long i = 0, *d = (void*) dest, *l = (void*) left, *r = (void*) right;
+ for(; i < SST_SIZE; i++) d[i] = l[i] | r[i];
+ return 0;
+}
+
diff --git a/libc-top-half/musl/src/signal/sigpause.c b/libc-top-half/musl/src/signal/sigpause.c
new file mode 100644
index 0000000..363d2fe
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigpause.c
@@ -0,0 +1,9 @@
+#include <signal.h>
+
+int sigpause(int sig)
+{
+ sigset_t mask;
+ sigprocmask(0, 0, &mask);
+ sigdelset(&mask, sig);
+ return sigsuspend(&mask);
+}
diff --git a/libc-top-half/musl/src/signal/sigpending.c b/libc-top-half/musl/src/signal/sigpending.c
new file mode 100644
index 0000000..3d193df
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigpending.c
@@ -0,0 +1,7 @@
+#include <signal.h>
+#include "syscall.h"
+
+int sigpending(sigset_t *set)
+{
+ return syscall(SYS_rt_sigpending, set, _NSIG/8);
+}
diff --git a/libc-top-half/musl/src/signal/sigprocmask.c b/libc-top-half/musl/src/signal/sigprocmask.c
new file mode 100644
index 0000000..297e20c
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigprocmask.c
@@ -0,0 +1,10 @@
+#include <signal.h>
+#include <errno.h>
+
+int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict old)
+{
+ int r = pthread_sigmask(how, set, old);
+ if (!r) return r;
+ errno = r;
+ return -1;
+}
diff --git a/libc-top-half/musl/src/signal/sigqueue.c b/libc-top-half/musl/src/signal/sigqueue.c
new file mode 100644
index 0000000..b75f0c5
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigqueue.c
@@ -0,0 +1,22 @@
+#include <signal.h>
+#include <string.h>
+#include <unistd.h>
+#include "syscall.h"
+#include "pthread_impl.h"
+
+int sigqueue(pid_t pid, int sig, const union sigval value)
+{
+ siginfo_t si;
+ sigset_t set;
+ int r;
+ memset(&si, 0, sizeof si);
+ si.si_signo = sig;
+ si.si_code = SI_QUEUE;
+ si.si_value = value;
+ si.si_uid = getuid();
+ __block_app_sigs(&set);
+ si.si_pid = getpid();
+ r = syscall(SYS_rt_sigqueueinfo, pid, sig, &si);
+ __restore_sigs(&set);
+ return r;
+}
diff --git a/libc-top-half/musl/src/signal/sigrelse.c b/libc-top-half/musl/src/signal/sigrelse.c
new file mode 100644
index 0000000..b4c5a00
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigrelse.c
@@ -0,0 +1,10 @@
+#include <signal.h>
+
+int sigrelse(int sig)
+{
+ sigset_t mask;
+
+ sigemptyset(&mask);
+ if (sigaddset(&mask, sig) < 0) return -1;
+ return sigprocmask(SIG_UNBLOCK, &mask, 0);
+}
diff --git a/libc-top-half/musl/src/signal/sigrtmax.c b/libc-top-half/musl/src/signal/sigrtmax.c
new file mode 100644
index 0000000..44dc88f
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigrtmax.c
@@ -0,0 +1,6 @@
+#include <signal.h>
+
+int __libc_current_sigrtmax()
+{
+ return _NSIG-1;
+}
diff --git a/libc-top-half/musl/src/signal/sigrtmin.c b/libc-top-half/musl/src/signal/sigrtmin.c
new file mode 100644
index 0000000..c5a1fd9
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigrtmin.c
@@ -0,0 +1,6 @@
+#include <signal.h>
+
+int __libc_current_sigrtmin()
+{
+ return 35;
+}
diff --git a/libc-top-half/musl/src/signal/sigset.c b/libc-top-half/musl/src/signal/sigset.c
new file mode 100644
index 0000000..f3e8c40
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigset.c
@@ -0,0 +1,27 @@
+#include <signal.h>
+
+void (*sigset(int sig, void (*handler)(int)))(int)
+{
+ struct sigaction sa, sa_old;
+ sigset_t mask, mask_old;
+
+ sigemptyset(&mask);
+ if (sigaddset(&mask, sig) < 0)
+ return SIG_ERR;
+
+ if (handler == SIG_HOLD) {
+ if (sigaction(sig, 0, &sa_old) < 0)
+ return SIG_ERR;
+ if (sigprocmask(SIG_BLOCK, &mask, &mask_old) < 0)
+ return SIG_ERR;
+ } else {
+ sa.sa_handler = handler;
+ sa.sa_flags = 0;
+ sigemptyset(&sa.sa_mask);
+ if (sigaction(sig, &sa, &sa_old) < 0)
+ return SIG_ERR;
+ if (sigprocmask(SIG_UNBLOCK, &mask, &mask_old) < 0)
+ return SIG_ERR;
+ }
+ return sigismember(&mask_old, sig) ? SIG_HOLD : sa_old.sa_handler;
+}
diff --git a/libc-top-half/musl/src/signal/sigsetjmp.c b/libc-top-half/musl/src/signal/sigsetjmp.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigsetjmp.c
diff --git a/libc-top-half/musl/src/signal/sigsetjmp_tail.c b/libc-top-half/musl/src/signal/sigsetjmp_tail.c
new file mode 100644
index 0000000..f2aa288
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigsetjmp_tail.c
@@ -0,0 +1,10 @@
+#include <setjmp.h>
+#include <signal.h>
+#include "syscall.h"
+
+hidden int __sigsetjmp_tail(sigjmp_buf jb, int ret)
+{
+ void *p = jb->__ss;
+ __syscall(SYS_rt_sigprocmask, SIG_SETMASK, ret?p:0, ret?0:p, _NSIG/8);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/signal/sigsuspend.c b/libc-top-half/musl/src/signal/sigsuspend.c
new file mode 100644
index 0000000..36e0602
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigsuspend.c
@@ -0,0 +1,7 @@
+#include <signal.h>
+#include "syscall.h"
+
+int sigsuspend(const sigset_t *mask)
+{
+ return syscall_cp(SYS_rt_sigsuspend, mask, _NSIG/8);
+}
diff --git a/libc-top-half/musl/src/signal/sigtimedwait.c b/libc-top-half/musl/src/signal/sigtimedwait.c
new file mode 100644
index 0000000..1287174
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigtimedwait.c
@@ -0,0 +1,32 @@
+#include <signal.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
+
+static int do_sigtimedwait(const sigset_t *restrict mask, siginfo_t *restrict si, const struct timespec *restrict ts)
+{
+#ifdef SYS_rt_sigtimedwait_time64
+ time_t s = ts ? ts->tv_sec : 0;
+ long ns = ts ? ts->tv_nsec : 0;
+ int r = -ENOSYS;
+ if (SYS_rt_sigtimedwait == SYS_rt_sigtimedwait_time64 || !IS32BIT(s))
+ r = __syscall_cp(SYS_rt_sigtimedwait_time64, mask, si,
+ ts ? ((long long[]){s, ns}) : 0, _NSIG/8);
+ if (SYS_rt_sigtimedwait == SYS_rt_sigtimedwait_time64 || r!=-ENOSYS)
+ return r;
+ return __syscall_cp(SYS_rt_sigtimedwait, mask, si,
+ ts ? ((long[]){CLAMP(s), ns}) : 0, _NSIG/8);;
+#else
+ return __syscall_cp(SYS_rt_sigtimedwait, mask, si, ts, _NSIG/8);
+#endif
+}
+
+int sigtimedwait(const sigset_t *restrict mask, siginfo_t *restrict si, const struct timespec *restrict timeout)
+{
+ int ret;
+ do ret = do_sigtimedwait(mask, si, timeout);
+ while (ret==-EINTR);
+ return __syscall_ret(ret);
+}
diff --git a/libc-top-half/musl/src/signal/sigwait.c b/libc-top-half/musl/src/signal/sigwait.c
new file mode 100644
index 0000000..c8822ee
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigwait.c
@@ -0,0 +1,10 @@
+#include <signal.h>
+
+int sigwait(const sigset_t *restrict mask, int *restrict sig)
+{
+ siginfo_t si;
+ if (sigtimedwait(mask, &si, 0) < 0)
+ return -1;
+ *sig = si.si_signo;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/signal/sigwaitinfo.c b/libc-top-half/musl/src/signal/sigwaitinfo.c
new file mode 100644
index 0000000..bb51f8b
--- /dev/null
+++ b/libc-top-half/musl/src/signal/sigwaitinfo.c
@@ -0,0 +1,6 @@
+#include <signal.h>
+
+int sigwaitinfo(const sigset_t *restrict mask, siginfo_t *restrict si)
+{
+ return sigtimedwait(mask, si, 0);
+}
diff --git a/libc-top-half/musl/src/signal/x32/getitimer.c b/libc-top-half/musl/src/signal/x32/getitimer.c
new file mode 100644
index 0000000..8a8046a
--- /dev/null
+++ b/libc-top-half/musl/src/signal/x32/getitimer.c
@@ -0,0 +1,7 @@
+#include <sys/time.h>
+#include "syscall.h"
+
+int getitimer(int which, struct itimerval *old)
+{
+ return syscall(SYS_getitimer, which, old);
+}
diff --git a/libc-top-half/musl/src/signal/x32/restore.s b/libc-top-half/musl/src/signal/x32/restore.s
new file mode 100644
index 0000000..1117446
--- /dev/null
+++ b/libc-top-half/musl/src/signal/x32/restore.s
@@ -0,0 +1,8 @@
+ nop
+.global __restore_rt
+.hidden __restore_rt
+.type __restore_rt,@function
+__restore_rt:
+ mov $0x40000201, %rax /* SYS_rt_sigreturn */
+ syscall
+.size __restore_rt,.-__restore_rt
diff --git a/libc-top-half/musl/src/signal/x32/setitimer.c b/libc-top-half/musl/src/signal/x32/setitimer.c
new file mode 100644
index 0000000..21b1f45
--- /dev/null
+++ b/libc-top-half/musl/src/signal/x32/setitimer.c
@@ -0,0 +1,7 @@
+#include <sys/time.h>
+#include "syscall.h"
+
+int setitimer(int which, const struct itimerval *restrict new, struct itimerval *restrict old)
+{
+ return syscall(SYS_setitimer, which, new, old);
+}
diff --git a/libc-top-half/musl/src/signal/x32/sigsetjmp.s b/libc-top-half/musl/src/signal/x32/sigsetjmp.s
new file mode 100644
index 0000000..1f02b0e
--- /dev/null
+++ b/libc-top-half/musl/src/signal/x32/sigsetjmp.s
@@ -0,0 +1,25 @@
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+sigsetjmp:
+__sigsetjmp:
+ test %esi,%esi
+ jz 1f
+
+ popq 64(%rdi)
+ mov %rbx,72+8(%rdi)
+ mov %rdi,%rbx
+
+ call setjmp@PLT
+
+ pushq 64(%rbx)
+ movl $0, 4(%rsp)
+ mov %rbx,%rdi
+ mov %eax,%esi
+ mov 72+8(%rbx),%rbx
+
+.hidden __sigsetjmp_tail
+ jmp __sigsetjmp_tail
+
+1: jmp setjmp@PLT
diff --git a/libc-top-half/musl/src/signal/x86_64/restore.s b/libc-top-half/musl/src/signal/x86_64/restore.s
new file mode 100644
index 0000000..27d6cf3
--- /dev/null
+++ b/libc-top-half/musl/src/signal/x86_64/restore.s
@@ -0,0 +1,8 @@
+ nop
+.global __restore_rt
+.hidden __restore_rt
+.type __restore_rt,@function
+__restore_rt:
+ mov $15, %rax
+ syscall
+.size __restore_rt,.-__restore_rt
diff --git a/libc-top-half/musl/src/signal/x86_64/sigsetjmp.s b/libc-top-half/musl/src/signal/x86_64/sigsetjmp.s
new file mode 100644
index 0000000..9a7695f
--- /dev/null
+++ b/libc-top-half/musl/src/signal/x86_64/sigsetjmp.s
@@ -0,0 +1,24 @@
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+sigsetjmp:
+__sigsetjmp:
+ test %esi,%esi
+ jz 1f
+
+ popq 64(%rdi)
+ mov %rbx,72+8(%rdi)
+ mov %rdi,%rbx
+
+ call setjmp@PLT
+
+ pushq 64(%rbx)
+ mov %rbx,%rdi
+ mov %eax,%esi
+ mov 72+8(%rbx),%rbx
+
+.hidden __sigsetjmp_tail
+ jmp __sigsetjmp_tail
+
+1: jmp setjmp@PLT
diff --git a/libc-top-half/musl/src/stat/__xstat.c b/libc-top-half/musl/src/stat/__xstat.c
new file mode 100644
index 0000000..630936a
--- /dev/null
+++ b/libc-top-half/musl/src/stat/__xstat.c
@@ -0,0 +1,40 @@
+#include <sys/stat.h>
+
+#if !_REDIR_TIME64
+
+int __fxstat(int ver, int fd, struct stat *buf)
+{
+ return fstat(fd, buf);
+}
+
+int __fxstatat(int ver, int fd, const char *path, struct stat *buf, int flag)
+{
+ return fstatat(fd, path, buf, flag);
+}
+
+int __lxstat(int ver, const char *path, struct stat *buf)
+{
+ return lstat(path, buf);
+}
+
+int __xstat(int ver, const char *path, struct stat *buf)
+{
+ return stat(path, buf);
+}
+
+weak_alias(__fxstat, __fxstat64);
+weak_alias(__fxstatat, __fxstatat64);
+weak_alias(__lxstat, __lxstat64);
+weak_alias(__xstat, __xstat64);
+
+#endif
+
+int __xmknod(int ver, const char *path, mode_t mode, dev_t *dev)
+{
+ return mknod(path, mode, *dev);
+}
+
+int __xmknodat(int ver, int fd, const char *path, mode_t mode, dev_t *dev)
+{
+ return mknodat(fd, path, mode, *dev);
+}
diff --git a/libc-top-half/musl/src/stat/chmod.c b/libc-top-half/musl/src/stat/chmod.c
new file mode 100644
index 0000000..d4f53c5
--- /dev/null
+++ b/libc-top-half/musl/src/stat/chmod.c
@@ -0,0 +1,12 @@
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int chmod(const char *path, mode_t mode)
+{
+#ifdef SYS_chmod
+ return syscall(SYS_chmod, path, mode);
+#else
+ return syscall(SYS_fchmodat, AT_FDCWD, path, mode);
+#endif
+}
diff --git a/libc-top-half/musl/src/stat/fchmod.c b/libc-top-half/musl/src/stat/fchmod.c
new file mode 100644
index 0000000..7a503ee
--- /dev/null
+++ b/libc-top-half/musl/src/stat/fchmod.c
@@ -0,0 +1,19 @@
+#include <sys/stat.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int fchmod(int fd, mode_t mode)
+{
+ int ret = __syscall(SYS_fchmod, fd, mode);
+ if (ret != -EBADF || __syscall(SYS_fcntl, fd, F_GETFD) < 0)
+ return __syscall_ret(ret);
+
+ char buf[15+3*sizeof(int)];
+ __procfdname(buf, fd);
+#ifdef SYS_chmod
+ return syscall(SYS_chmod, buf, mode);
+#else
+ return syscall(SYS_fchmodat, AT_FDCWD, buf, mode);
+#endif
+}
diff --git a/libc-top-half/musl/src/stat/fchmodat.c b/libc-top-half/musl/src/stat/fchmodat.c
new file mode 100644
index 0000000..4ee00b0
--- /dev/null
+++ b/libc-top-half/musl/src/stat/fchmodat.c
@@ -0,0 +1,38 @@
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "syscall.h"
+#include "kstat.h"
+
+int fchmodat(int fd, const char *path, mode_t mode, int flag)
+{
+ if (!flag) return syscall(SYS_fchmodat, fd, path, mode, flag);
+
+ if (flag != AT_SYMLINK_NOFOLLOW)
+ return __syscall_ret(-EINVAL);
+
+ struct kstat st;
+ int ret, fd2;
+ char proc[15+3*sizeof(int)];
+
+ if ((ret = __syscall(SYS_fstatat, fd, path, &st, flag)))
+ return __syscall_ret(ret);
+ if (S_ISLNK(st.st_mode))
+ return __syscall_ret(-EOPNOTSUPP);
+
+ if ((fd2 = __syscall(SYS_openat, fd, path, O_RDONLY|O_PATH|O_NOFOLLOW|O_NOCTTY|O_CLOEXEC)) < 0) {
+ if (fd2 == -ELOOP)
+ return __syscall_ret(-EOPNOTSUPP);
+ return __syscall_ret(fd2);
+ }
+
+ __procfdname(proc, fd2);
+ ret = __syscall(SYS_fstatat, AT_FDCWD, proc, &st, 0);
+ if (!ret) {
+ if (S_ISLNK(st.st_mode)) ret = -EOPNOTSUPP;
+ else ret = __syscall(SYS_fchmodat, AT_FDCWD, proc, mode);
+ }
+
+ __syscall(SYS_close, fd2);
+ return __syscall_ret(ret);
+}
diff --git a/libc-top-half/musl/src/stat/fstat.c b/libc-top-half/musl/src/stat/fstat.c
new file mode 100644
index 0000000..9bbb46d
--- /dev/null
+++ b/libc-top-half/musl/src/stat/fstat.c
@@ -0,0 +1,15 @@
+#define _BSD_SOURCE
+#include <sys/stat.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int fstat(int fd, struct stat *st)
+{
+ if (fd<0) return __syscall_ret(-EBADF);
+ return fstatat(fd, "", st, AT_EMPTY_PATH);
+}
+
+#if !_REDIR_TIME64
+weak_alias(fstat, fstat64);
+#endif
diff --git a/libc-top-half/musl/src/stat/fstatat.c b/libc-top-half/musl/src/stat/fstatat.c
new file mode 100644
index 0000000..de165b5
--- /dev/null
+++ b/libc-top-half/musl/src/stat/fstatat.c
@@ -0,0 +1,147 @@
+#define _BSD_SOURCE
+#include <sys/stat.h>
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdint.h>
+#include <sys/sysmacros.h>
+#include "syscall.h"
+#include "kstat.h"
+
+struct statx {
+ uint32_t stx_mask;
+ uint32_t stx_blksize;
+ uint64_t stx_attributes;
+ uint32_t stx_nlink;
+ uint32_t stx_uid;
+ uint32_t stx_gid;
+ uint16_t stx_mode;
+ uint16_t pad1;
+ uint64_t stx_ino;
+ uint64_t stx_size;
+ uint64_t stx_blocks;
+ uint64_t stx_attributes_mask;
+ struct {
+ int64_t tv_sec;
+ uint32_t tv_nsec;
+ int32_t pad;
+ } stx_atime, stx_btime, stx_ctime, stx_mtime;
+ uint32_t stx_rdev_major;
+ uint32_t stx_rdev_minor;
+ uint32_t stx_dev_major;
+ uint32_t stx_dev_minor;
+ uint64_t spare[14];
+};
+
+static int fstatat_statx(int fd, const char *restrict path, struct stat *restrict st, int flag)
+{
+ struct statx stx;
+
+ int ret = __syscall(SYS_statx, fd, path, flag, 0x7ff, &stx);
+ if (ret) return ret;
+
+ *st = (struct stat){
+ .st_dev = makedev(stx.stx_dev_major, stx.stx_dev_minor),
+ .st_ino = stx.stx_ino,
+ .st_mode = stx.stx_mode,
+ .st_nlink = stx.stx_nlink,
+ .st_uid = stx.stx_uid,
+ .st_gid = stx.stx_gid,
+ .st_rdev = makedev(stx.stx_rdev_major, stx.stx_rdev_minor),
+ .st_size = stx.stx_size,
+ .st_blksize = stx.stx_blksize,
+ .st_blocks = stx.stx_blocks,
+ .st_atim.tv_sec = stx.stx_atime.tv_sec,
+ .st_atim.tv_nsec = stx.stx_atime.tv_nsec,
+ .st_mtim.tv_sec = stx.stx_mtime.tv_sec,
+ .st_mtim.tv_nsec = stx.stx_mtime.tv_nsec,
+ .st_ctim.tv_sec = stx.stx_ctime.tv_sec,
+ .st_ctim.tv_nsec = stx.stx_ctime.tv_nsec,
+#if _REDIR_TIME64
+ .__st_atim32.tv_sec = stx.stx_atime.tv_sec,
+ .__st_atim32.tv_nsec = stx.stx_atime.tv_nsec,
+ .__st_mtim32.tv_sec = stx.stx_mtime.tv_sec,
+ .__st_mtim32.tv_nsec = stx.stx_mtime.tv_nsec,
+ .__st_ctim32.tv_sec = stx.stx_ctime.tv_sec,
+ .__st_ctim32.tv_nsec = stx.stx_ctime.tv_nsec,
+#endif
+ };
+ return 0;
+}
+
+static int fstatat_kstat(int fd, const char *restrict path, struct stat *restrict st, int flag)
+{
+ int ret;
+ struct kstat kst;
+
+ if (flag==AT_EMPTY_PATH && fd>=0 && !*path) {
+ ret = __syscall(SYS_fstat, fd, &kst);
+ if (ret==-EBADF && __syscall(SYS_fcntl, fd, F_GETFD)>=0) {
+ ret = __syscall(SYS_fstatat, fd, path, &kst, flag);
+ if (ret==-EINVAL) {
+ char buf[15+3*sizeof(int)];
+ __procfdname(buf, fd);
+#ifdef SYS_stat
+ ret = __syscall(SYS_stat, buf, &kst);
+#else
+ ret = __syscall(SYS_fstatat, AT_FDCWD, buf, &kst, 0);
+#endif
+ }
+ }
+ }
+#ifdef SYS_lstat
+ else if ((fd == AT_FDCWD || *path=='/') && flag==AT_SYMLINK_NOFOLLOW)
+ ret = __syscall(SYS_lstat, path, &kst);
+#endif
+#ifdef SYS_stat
+ else if ((fd == AT_FDCWD || *path=='/') && !flag)
+ ret = __syscall(SYS_stat, path, &kst);
+#endif
+ else ret = __syscall(SYS_fstatat, fd, path, &kst, flag);
+
+ if (ret) return ret;
+
+ *st = (struct stat){
+ .st_dev = kst.st_dev,
+ .st_ino = kst.st_ino,
+ .st_mode = kst.st_mode,
+ .st_nlink = kst.st_nlink,
+ .st_uid = kst.st_uid,
+ .st_gid = kst.st_gid,
+ .st_rdev = kst.st_rdev,
+ .st_size = kst.st_size,
+ .st_blksize = kst.st_blksize,
+ .st_blocks = kst.st_blocks,
+ .st_atim.tv_sec = kst.st_atime_sec,
+ .st_atim.tv_nsec = kst.st_atime_nsec,
+ .st_mtim.tv_sec = kst.st_mtime_sec,
+ .st_mtim.tv_nsec = kst.st_mtime_nsec,
+ .st_ctim.tv_sec = kst.st_ctime_sec,
+ .st_ctim.tv_nsec = kst.st_ctime_nsec,
+#if _REDIR_TIME64
+ .__st_atim32.tv_sec = kst.st_atime_sec,
+ .__st_atim32.tv_nsec = kst.st_atime_nsec,
+ .__st_mtim32.tv_sec = kst.st_mtime_sec,
+ .__st_mtim32.tv_nsec = kst.st_mtime_nsec,
+ .__st_ctim32.tv_sec = kst.st_ctime_sec,
+ .__st_ctim32.tv_nsec = kst.st_ctime_nsec,
+#endif
+ };
+
+ return 0;
+}
+
+int fstatat(int fd, const char *restrict path, struct stat *restrict st, int flag)
+{
+ int ret;
+ if (sizeof((struct kstat){0}.st_atime_sec) < sizeof(time_t)) {
+ ret = fstatat_statx(fd, path, st, flag);
+ if (ret!=-ENOSYS) return __syscall_ret(ret);
+ }
+ ret = fstatat_kstat(fd, path, st, flag);
+ return __syscall_ret(ret);
+}
+
+#if !_REDIR_TIME64
+weak_alias(fstatat, fstatat64);
+#endif
diff --git a/libc-top-half/musl/src/stat/futimens.c b/libc-top-half/musl/src/stat/futimens.c
new file mode 100644
index 0000000..360225b
--- /dev/null
+++ b/libc-top-half/musl/src/stat/futimens.c
@@ -0,0 +1,6 @@
+#include <sys/stat.h>
+
+int futimens(int fd, const struct timespec times[2])
+{
+ return utimensat(fd, 0, times, 0);
+}
diff --git a/libc-top-half/musl/src/stat/futimesat.c b/libc-top-half/musl/src/stat/futimesat.c
new file mode 100644
index 0000000..c29b2b7
--- /dev/null
+++ b/libc-top-half/musl/src/stat/futimesat.c
@@ -0,0 +1,31 @@
+#define _GNU_SOURCE
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <errno.h>
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+#include "syscall.h"
+#endif
+
+int __futimesat(int dirfd, const char *pathname, const struct timeval times[2])
+{
+ struct timespec ts[2];
+ if (times) {
+ int i;
+ for (i=0; i<2; i++) {
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ if (times[i].tv_usec >= 1000000ULL)
+ return __syscall_ret(-EINVAL);
+#else
+ if (times[i].tv_usec >= 1000000ULL) {
+ errno = EINVAL;
+ return -1;
+ }
+#endif
+ ts[i].tv_sec = times[i].tv_sec;
+ ts[i].tv_nsec = times[i].tv_usec * 1000;
+ }
+ }
+ return utimensat(dirfd, pathname, times ? ts : 0, 0);
+}
+
+weak_alias(__futimesat, futimesat);
diff --git a/libc-top-half/musl/src/stat/lchmod.c b/libc-top-half/musl/src/stat/lchmod.c
new file mode 100644
index 0000000..f324ba7
--- /dev/null
+++ b/libc-top-half/musl/src/stat/lchmod.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <sys/stat.h>
+#include <fcntl.h>
+
+int lchmod(const char *path, mode_t mode)
+{
+ return fchmodat(AT_FDCWD, path, mode, AT_SYMLINK_NOFOLLOW);
+}
diff --git a/libc-top-half/musl/src/stat/lstat.c b/libc-top-half/musl/src/stat/lstat.c
new file mode 100644
index 0000000..6fe004d
--- /dev/null
+++ b/libc-top-half/musl/src/stat/lstat.c
@@ -0,0 +1,11 @@
+#include <sys/stat.h>
+#include <fcntl.h>
+
+int lstat(const char *restrict path, struct stat *restrict buf)
+{
+ return fstatat(AT_FDCWD, path, buf, AT_SYMLINK_NOFOLLOW);
+}
+
+#if !_REDIR_TIME64
+weak_alias(lstat, lstat64);
+#endif
diff --git a/libc-top-half/musl/src/stat/mkdir.c b/libc-top-half/musl/src/stat/mkdir.c
new file mode 100644
index 0000000..32625b7
--- /dev/null
+++ b/libc-top-half/musl/src/stat/mkdir.c
@@ -0,0 +1,12 @@
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int mkdir(const char *path, mode_t mode)
+{
+#ifdef SYS_mkdir
+ return syscall(SYS_mkdir, path, mode);
+#else
+ return syscall(SYS_mkdirat, AT_FDCWD, path, mode);
+#endif
+}
diff --git a/libc-top-half/musl/src/stat/mkdirat.c b/libc-top-half/musl/src/stat/mkdirat.c
new file mode 100644
index 0000000..b8bc252
--- /dev/null
+++ b/libc-top-half/musl/src/stat/mkdirat.c
@@ -0,0 +1,7 @@
+#include <sys/stat.h>
+#include "syscall.h"
+
+int mkdirat(int fd, const char *path, mode_t mode)
+{
+ return syscall(SYS_mkdirat, fd, path, mode);
+}
diff --git a/libc-top-half/musl/src/stat/mkfifo.c b/libc-top-half/musl/src/stat/mkfifo.c
new file mode 100644
index 0000000..60efcf7
--- /dev/null
+++ b/libc-top-half/musl/src/stat/mkfifo.c
@@ -0,0 +1,6 @@
+#include <sys/stat.h>
+
+int mkfifo(const char *path, mode_t mode)
+{
+ return mknod(path, mode | S_IFIFO, 0);
+}
diff --git a/libc-top-half/musl/src/stat/mkfifoat.c b/libc-top-half/musl/src/stat/mkfifoat.c
new file mode 100644
index 0000000..d3a1f97
--- /dev/null
+++ b/libc-top-half/musl/src/stat/mkfifoat.c
@@ -0,0 +1,6 @@
+#include <sys/stat.h>
+
+int mkfifoat(int fd, const char *path, mode_t mode)
+{
+ return mknodat(fd, path, mode | S_IFIFO, 0);
+}
diff --git a/libc-top-half/musl/src/stat/mknod.c b/libc-top-half/musl/src/stat/mknod.c
new file mode 100644
index 0000000..beebd84
--- /dev/null
+++ b/libc-top-half/musl/src/stat/mknod.c
@@ -0,0 +1,12 @@
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int mknod(const char *path, mode_t mode, dev_t dev)
+{
+#ifdef SYS_mknod
+ return syscall(SYS_mknod, path, mode, dev);
+#else
+ return syscall(SYS_mknodat, AT_FDCWD, path, mode, dev);
+#endif
+}
diff --git a/libc-top-half/musl/src/stat/mknodat.c b/libc-top-half/musl/src/stat/mknodat.c
new file mode 100644
index 0000000..7c97c91
--- /dev/null
+++ b/libc-top-half/musl/src/stat/mknodat.c
@@ -0,0 +1,7 @@
+#include <sys/stat.h>
+#include "syscall.h"
+
+int mknodat(int fd, const char *path, mode_t mode, dev_t dev)
+{
+ return syscall(SYS_mknodat, fd, path, mode, dev);
+}
diff --git a/libc-top-half/musl/src/stat/stat.c b/libc-top-half/musl/src/stat/stat.c
new file mode 100644
index 0000000..ea70efc
--- /dev/null
+++ b/libc-top-half/musl/src/stat/stat.c
@@ -0,0 +1,11 @@
+#include <sys/stat.h>
+#include <fcntl.h>
+
+int stat(const char *restrict path, struct stat *restrict buf)
+{
+ return fstatat(AT_FDCWD, path, buf, 0);
+}
+
+#if !_REDIR_TIME64
+weak_alias(stat, stat64);
+#endif
diff --git a/libc-top-half/musl/src/stat/statvfs.c b/libc-top-half/musl/src/stat/statvfs.c
new file mode 100644
index 0000000..f65d1b5
--- /dev/null
+++ b/libc-top-half/musl/src/stat/statvfs.c
@@ -0,0 +1,63 @@
+#include <sys/statvfs.h>
+#include <sys/statfs.h>
+#include "syscall.h"
+
+static int __statfs(const char *path, struct statfs *buf)
+{
+ *buf = (struct statfs){0};
+#ifdef SYS_statfs64
+ return syscall(SYS_statfs64, path, sizeof *buf, buf);
+#else
+ return syscall(SYS_statfs, path, buf);
+#endif
+}
+
+static int __fstatfs(int fd, struct statfs *buf)
+{
+ *buf = (struct statfs){0};
+#ifdef SYS_fstatfs64
+ return syscall(SYS_fstatfs64, fd, sizeof *buf, buf);
+#else
+ return syscall(SYS_fstatfs, fd, buf);
+#endif
+}
+
+weak_alias(__statfs, statfs);
+weak_alias(__fstatfs, fstatfs);
+
+static void fixup(struct statvfs *out, const struct statfs *in)
+{
+ *out = (struct statvfs){0};
+ out->f_bsize = in->f_bsize;
+ out->f_frsize = in->f_frsize ? in->f_frsize : in->f_bsize;
+ out->f_blocks = in->f_blocks;
+ out->f_bfree = in->f_bfree;
+ out->f_bavail = in->f_bavail;
+ out->f_files = in->f_files;
+ out->f_ffree = in->f_ffree;
+ out->f_favail = in->f_ffree;
+ out->f_fsid = in->f_fsid.__val[0];
+ out->f_flag = in->f_flags;
+ out->f_namemax = in->f_namelen;
+}
+
+int statvfs(const char *restrict path, struct statvfs *restrict buf)
+{
+ struct statfs kbuf;
+ if (__statfs(path, &kbuf)<0) return -1;
+ fixup(buf, &kbuf);
+ return 0;
+}
+
+int fstatvfs(int fd, struct statvfs *buf)
+{
+ struct statfs kbuf;
+ if (__fstatfs(fd, &kbuf)<0) return -1;
+ fixup(buf, &kbuf);
+ return 0;
+}
+
+weak_alias(statvfs, statvfs64);
+weak_alias(statfs, statfs64);
+weak_alias(fstatvfs, fstatvfs64);
+weak_alias(fstatfs, fstatfs64);
diff --git a/libc-top-half/musl/src/stat/umask.c b/libc-top-half/musl/src/stat/umask.c
new file mode 100644
index 0000000..5ee913e
--- /dev/null
+++ b/libc-top-half/musl/src/stat/umask.c
@@ -0,0 +1,7 @@
+#include <sys/stat.h>
+#include "syscall.h"
+
+mode_t umask(mode_t mode)
+{
+ return syscall(SYS_umask, mode);
+}
diff --git a/libc-top-half/musl/src/stat/utimensat.c b/libc-top-half/musl/src/stat/utimensat.c
new file mode 100644
index 0000000..730723a
--- /dev/null
+++ b/libc-top-half/musl/src/stat/utimensat.c
@@ -0,0 +1,60 @@
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+#define NS_SPECIAL(ns) ((ns)==UTIME_NOW || (ns)==UTIME_OMIT)
+
+int utimensat(int fd, const char *path, const struct timespec times[2], int flags)
+{
+ int r;
+ if (times && times[0].tv_nsec==UTIME_NOW && times[1].tv_nsec==UTIME_NOW)
+ times = 0;
+#ifdef SYS_utimensat_time64
+ r = -ENOSYS;
+ time_t s0=0, s1=0;
+ long ns0=0, ns1=0;
+ if (times) {
+ ns0 = times[0].tv_nsec;
+ ns1 = times[1].tv_nsec;
+ if (!NS_SPECIAL(ns0)) s0 = times[0].tv_sec;
+ if (!NS_SPECIAL(ns1)) s1 = times[1].tv_sec;
+ }
+ if (SYS_utimensat == SYS_utimensat_time64 || !IS32BIT(s0) || !IS32BIT(s1))
+ r = __syscall(SYS_utimensat_time64, fd, path, times ?
+ ((long long[]){s0, ns0, s1, ns1}) : 0, flags);
+ if (SYS_utimensat == SYS_utimensat_time64 || r!=-ENOSYS)
+ return __syscall_ret(r);
+ if (!IS32BIT(s0) || !IS32BIT(s1))
+ return __syscall_ret(-ENOTSUP);
+ r = __syscall(SYS_utimensat, fd, path,
+ times ? ((long[]){s0, ns0, s1, ns1}) : 0, flags);
+#else
+ r = __syscall(SYS_utimensat, fd, path, times, flags);
+#endif
+
+#ifdef SYS_futimesat
+ if (r != -ENOSYS || flags) return __syscall_ret(r);
+ long *tv=0, tmp[4];
+ if (times) {
+ int i;
+ tv = tmp;
+ for (i=0; i<2; i++) {
+ if (times[i].tv_nsec >= 1000000000ULL) {
+ if (NS_SPECIAL(times[i].tv_nsec))
+ return __syscall_ret(-ENOSYS);
+ return __syscall_ret(-EINVAL);
+ }
+ tmp[2*i+0] = times[i].tv_sec;
+ tmp[2*i+1] = times[i].tv_nsec / 1000;
+ }
+ }
+
+ r = __syscall(SYS_futimesat, fd, path, tv);
+ if (r != -ENOSYS || fd != AT_FDCWD) return __syscall_ret(r);
+ r = __syscall(SYS_utimes, path, tv);
+#endif
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/stdio/__fclose_ca.c b/libc-top-half/musl/src/stdio/__fclose_ca.c
new file mode 100644
index 0000000..e0b12a1
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__fclose_ca.c
@@ -0,0 +1,6 @@
+#include "stdio_impl.h"
+
+int __fclose_ca(FILE *f)
+{
+ return f->close(f);
+}
diff --git a/libc-top-half/musl/src/stdio/__fdopen.c b/libc-top-half/musl/src/stdio/__fdopen.c
new file mode 100644
index 0000000..5c8df49
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__fdopen.c
@@ -0,0 +1,85 @@
+#include "stdio_impl.h"
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include "libc.h"
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+#else
+#include <__function___isatty.h>
+#endif
+
+FILE *__fdopen(int fd, const char *mode)
+{
+ FILE *f;
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ struct winsize wsz;
+#endif
+
+ /* Check for valid initial mode character */
+ if (!strchr("rwa", *mode)) {
+ errno = EINVAL;
+ return 0;
+ }
+
+ /* Allocate FILE+buffer or fail */
+ if (!(f=malloc(sizeof *f + UNGET + BUFSIZ))) return 0;
+
+ /* Zero-fill only the struct, not the buffer */
+ memset(f, 0, sizeof *f);
+
+ /* Impose mode restrictions */
+ if (!strchr(mode, '+')) f->flags = (*mode == 'r') ? F_NOWR : F_NORD;
+
+ /* Apply close-on-exec flag */
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ if (strchr(mode, 'e')) __syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC);
+#else
+ if (strchr(mode, 'e')) fcntl(fd, F_SETFD, FD_CLOEXEC);
+#endif
+
+ /* Set append mode on fd if opened for append */
+ if (*mode == 'a') {
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ int flags = __syscall(SYS_fcntl, fd, F_GETFL);
+#else
+ int flags = fcntl(fd, F_GETFL);
+#endif
+ if (!(flags & O_APPEND))
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ __syscall(SYS_fcntl, fd, F_SETFL, flags | O_APPEND);
+#else
+ fcntl(fd, F_SETFL, flags | O_APPEND);
+#endif
+ f->flags |= F_APP;
+ }
+
+ f->fd = fd;
+ f->buf = (unsigned char *)f + sizeof *f + UNGET;
+ f->buf_size = BUFSIZ;
+
+ /* Activate line buffered mode for terminals */
+ f->lbf = EOF;
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ if (!(f->flags & F_NOWR) && !__syscall(SYS_ioctl, fd, TIOCGWINSZ, &wsz))
+#else
+ if (!(f->flags & F_NOWR) && __isatty(fd))
+#endif
+ f->lbf = '\n';
+
+ /* Initialize op ptrs. No problem if some are unneeded. */
+ f->read = __stdio_read;
+ f->write = __stdio_write;
+ f->seek = __stdio_seek;
+ f->close = __stdio_close;
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ if (!libc.threaded) f->lock = -1;
+#endif
+
+ /* Add new FILE to open file list */
+ return __ofl_add(f);
+}
+
+weak_alias(__fdopen, fdopen);
diff --git a/libc-top-half/musl/src/stdio/__fmodeflags.c b/libc-top-half/musl/src/stdio/__fmodeflags.c
new file mode 100644
index 0000000..da9f23b
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__fmodeflags.c
@@ -0,0 +1,16 @@
+#include <fcntl.h>
+#include <string.h>
+
+int __fmodeflags(const char *mode)
+{
+ int flags;
+ if (strchr(mode, '+')) flags = O_RDWR;
+ else if (*mode == 'r') flags = O_RDONLY;
+ else flags = O_WRONLY;
+ if (strchr(mode, 'x')) flags |= O_EXCL;
+ if (strchr(mode, 'e')) flags |= O_CLOEXEC;
+ if (*mode != 'r') flags |= O_CREAT;
+ if (*mode == 'w') flags |= O_TRUNC;
+ if (*mode == 'a') flags |= O_APPEND;
+ return flags;
+}
diff --git a/libc-top-half/musl/src/stdio/__fopen_rb_ca.c b/libc-top-half/musl/src/stdio/__fopen_rb_ca.c
new file mode 100644
index 0000000..192050b
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__fopen_rb_ca.c
@@ -0,0 +1,32 @@
+#include "stdio_impl.h"
+#include <fcntl.h>
+#include <string.h>
+
+FILE *__fopen_rb_ca(const char *filename, FILE *f, unsigned char *buf, size_t len)
+{
+ memset(f, 0, sizeof *f);
+
+#ifdef __wasilibc_unmodified_upstream // WASI has no sys_open
+ f->fd = sys_open(filename, O_RDONLY|O_CLOEXEC);
+#else
+ f->fd = open(filename, O_RDONLY|O_CLOEXEC);
+#endif
+ if (f->fd < 0) return 0;
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ __syscall(SYS_fcntl, f->fd, F_SETFD, FD_CLOEXEC);
+#else
+ fcntl(f->fd, F_SETFD, FD_CLOEXEC);
+#endif
+
+ f->flags = F_NOWR | F_PERM;
+ f->buf = buf + UNGET;
+ f->buf_size = len - UNGET;
+ f->read = __stdio_read;
+ f->seek = __stdio_seek;
+ f->close = __stdio_close;
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ f->lock = -1;
+#endif
+
+ return f;
+}
diff --git a/libc-top-half/musl/src/stdio/__lockfile.c b/libc-top-half/musl/src/stdio/__lockfile.c
new file mode 100644
index 0000000..0f60a14
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__lockfile.c
@@ -0,0 +1,23 @@
+#include "stdio_impl.h"
+#include "pthread_impl.h"
+
+int __lockfile(FILE *f)
+{
+ int owner = f->lock, tid = __pthread_self()->tid;
+ if ((owner & ~MAYBE_WAITERS) == tid)
+ return 0;
+ owner = a_cas(&f->lock, 0, tid);
+ if (!owner) return 1;
+ while ((owner = a_cas(&f->lock, 0, tid|MAYBE_WAITERS))) {
+ if ((owner & MAYBE_WAITERS) ||
+ a_cas(&f->lock, owner, owner|MAYBE_WAITERS)==owner)
+ __futexwait(&f->lock, owner|MAYBE_WAITERS, 1);
+ }
+ return 1;
+}
+
+void __unlockfile(FILE *f)
+{
+ if (a_swap(&f->lock, 0) & MAYBE_WAITERS)
+ __wake(&f->lock, 1, 1);
+}
diff --git a/libc-top-half/musl/src/stdio/__overflow.c b/libc-top-half/musl/src/stdio/__overflow.c
new file mode 100644
index 0000000..e65a594
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__overflow.c
@@ -0,0 +1,10 @@
+#include "stdio_impl.h"
+
+int __overflow(FILE *f, int _c)
+{
+ unsigned char c = _c;
+ if (!f->wend && __towrite(f)) return EOF;
+ if (f->wpos != f->wend && c != f->lbf) return *f->wpos++ = c;
+ if (f->write(f, &c, 1)!=1) return EOF;
+ return c;
+}
diff --git a/libc-top-half/musl/src/stdio/__stdio_close.c b/libc-top-half/musl/src/stdio/__stdio_close.c
new file mode 100644
index 0000000..0d7c91e
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__stdio_close.c
@@ -0,0 +1,26 @@
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+#else
+#include <unistd.h>
+#endif
+#include "stdio_impl.h"
+#include "aio_impl.h"
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+static int dummy(int fd)
+{
+ return fd;
+}
+
+weak_alias(dummy, __aio_close);
+#else
+#define __aio_close(fd) (fd)
+#endif
+
+int __stdio_close(FILE *f)
+{
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ return syscall(SYS_close, __aio_close(f->fd));
+#else
+ return close(__aio_close(f->fd));
+#endif
+}
diff --git a/libc-top-half/musl/src/stdio/__stdio_exit.c b/libc-top-half/musl/src/stdio/__stdio_exit.c
new file mode 100644
index 0000000..a5e42c6
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__stdio_exit.c
@@ -0,0 +1,25 @@
+#include "stdio_impl.h"
+
+static FILE *volatile dummy_file = 0;
+weak_alias(dummy_file, __stdin_used);
+weak_alias(dummy_file, __stdout_used);
+weak_alias(dummy_file, __stderr_used);
+
+static void close_file(FILE *f)
+{
+ if (!f) return;
+ FFINALLOCK(f);
+ if (f->wpos != f->wbase) f->write(f, 0, 0);
+ if (f->rpos != f->rend) f->seek(f, f->rpos-f->rend, SEEK_CUR);
+}
+
+void __stdio_exit(void)
+{
+ FILE *f;
+ for (f=*__ofl_lock(); f; f=f->next) close_file(f);
+ close_file(__stdin_used);
+ close_file(__stdout_used);
+ close_file(__stderr_used);
+}
+
+weak_alias(__stdio_exit, __stdio_exit_needed);
diff --git a/libc-top-half/musl/src/stdio/__stdio_read.c b/libc-top-half/musl/src/stdio/__stdio_read.c
new file mode 100644
index 0000000..d701188
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__stdio_read.c
@@ -0,0 +1,33 @@
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+#else
+#include <unistd.h>
+#endif
+#include "stdio_impl.h"
+#include <sys/uio.h>
+
+size_t __stdio_read(FILE *f, unsigned char *buf, size_t len)
+{
+ struct iovec iov[2] = {
+ { .iov_base = buf, .iov_len = len - !!f->buf_size },
+ { .iov_base = f->buf, .iov_len = f->buf_size }
+ };
+ ssize_t cnt;
+
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ cnt = iov[0].iov_len ? syscall(SYS_readv, f->fd, iov, 2)
+ : syscall(SYS_read, f->fd, iov[1].iov_base, iov[1].iov_len);
+#else
+ cnt = iov[0].iov_len ? readv(f->fd, iov, 2)
+ : read(f->fd, iov[1].iov_base, iov[1].iov_len);
+#endif
+ if (cnt <= 0) {
+ f->flags |= cnt ? F_ERR : F_EOF;
+ return 0;
+ }
+ if (cnt <= iov[0].iov_len) return cnt;
+ cnt -= iov[0].iov_len;
+ f->rpos = f->buf;
+ f->rend = f->buf + cnt;
+ if (f->buf_size) buf[len-1] = *f->rpos++;
+ return len;
+}
diff --git a/libc-top-half/musl/src/stdio/__stdio_seek.c b/libc-top-half/musl/src/stdio/__stdio_seek.c
new file mode 100644
index 0000000..782c678
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__stdio_seek.c
@@ -0,0 +1,11 @@
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+#else
+#include <unistd.h>
+#endif
+#include "stdio_impl.h"
+#include "stdio_impl.h"
+
+off_t __stdio_seek(FILE *f, off_t off, int whence)
+{
+ return __lseek(f->fd, off, whence);
+}
diff --git a/libc-top-half/musl/src/stdio/__stdio_write.c b/libc-top-half/musl/src/stdio/__stdio_write.c
new file mode 100644
index 0000000..7537304
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__stdio_write.c
@@ -0,0 +1,38 @@
+#include "stdio_impl.h"
+#include <sys/uio.h>
+
+size_t __stdio_write(FILE *f, const unsigned char *buf, size_t len)
+{
+ struct iovec iovs[2] = {
+ { .iov_base = f->wbase, .iov_len = f->wpos-f->wbase },
+ { .iov_base = (void *)buf, .iov_len = len }
+ };
+ struct iovec *iov = iovs;
+ size_t rem = iov[0].iov_len + iov[1].iov_len;
+ int iovcnt = 2;
+ ssize_t cnt;
+ for (;;) {
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ cnt = syscall(SYS_writev, f->fd, iov, iovcnt);
+#else
+ cnt = writev(f->fd, iov, iovcnt);
+#endif
+ if (cnt == rem) {
+ f->wend = f->buf + f->buf_size;
+ f->wpos = f->wbase = f->buf;
+ return len;
+ }
+ if (cnt < 0) {
+ f->wpos = f->wbase = f->wend = 0;
+ f->flags |= F_ERR;
+ return iovcnt == 2 ? 0 : len-iov[0].iov_len;
+ }
+ rem -= cnt;
+ if (cnt > iov[0].iov_len) {
+ cnt -= iov[0].iov_len;
+ iov++; iovcnt--;
+ }
+ iov[0].iov_base = (char *)iov[0].iov_base + cnt;
+ iov[0].iov_len -= cnt;
+ }
+}
diff --git a/libc-top-half/musl/src/stdio/__stdout_write.c b/libc-top-half/musl/src/stdio/__stdout_write.c
new file mode 100644
index 0000000..8190ec5
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__stdout_write.c
@@ -0,0 +1,21 @@
+#include "stdio_impl.h"
+#include <sys/ioctl.h>
+#ifdef __wasilibc_unmodified_upstream // use isatty rather than manual ioctl
+#else
+#include <__function___isatty.h>
+#endif
+
+size_t __stdout_write(FILE *f, const unsigned char *buf, size_t len)
+{
+#ifdef __wasilibc_unmodified_upstream // use isatty rather than manual ioctl
+ struct winsize wsz;
+#endif
+ f->write = __stdio_write;
+#ifdef __wasilibc_unmodified_upstream // use isatty rather than manual ioctl
+ if (!(f->flags & F_SVB) && __syscall(SYS_ioctl, f->fd, TIOCGWINSZ, &wsz))
+#else
+ if (!(f->flags & F_SVB) && !__isatty(f->fd))
+#endif
+ f->lbf = -1;
+ return __stdio_write(f, buf, len);
+}
diff --git a/libc-top-half/musl/src/stdio/__toread.c b/libc-top-half/musl/src/stdio/__toread.c
new file mode 100644
index 0000000..f142ff0
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__toread.c
@@ -0,0 +1,19 @@
+#include <stdio_impl.h>
+
+int __toread(FILE *f)
+{
+ f->mode |= f->mode-1;
+ if (f->wpos != f->wbase) f->write(f, 0, 0);
+ f->wpos = f->wbase = f->wend = 0;
+ if (f->flags & F_NORD) {
+ f->flags |= F_ERR;
+ return EOF;
+ }
+ f->rpos = f->rend = f->buf + f->buf_size;
+ return (f->flags & F_EOF) ? EOF : 0;
+}
+
+hidden void __toread_needs_stdio_exit()
+{
+ __stdio_exit_needed();
+}
diff --git a/libc-top-half/musl/src/stdio/__towrite.c b/libc-top-half/musl/src/stdio/__towrite.c
new file mode 100644
index 0000000..4c9c66a
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__towrite.c
@@ -0,0 +1,23 @@
+#include "stdio_impl.h"
+
+int __towrite(FILE *f)
+{
+ f->mode |= f->mode-1;
+ if (f->flags & F_NOWR) {
+ f->flags |= F_ERR;
+ return EOF;
+ }
+ /* Clear read buffer (easier than summoning nasal demons) */
+ f->rpos = f->rend = 0;
+
+ /* Activate write through the buffer. */
+ f->wpos = f->wbase = f->buf;
+ f->wend = f->buf + f->buf_size;
+
+ return 0;
+}
+
+hidden void __towrite_needs_stdio_exit()
+{
+ __stdio_exit_needed();
+}
diff --git a/libc-top-half/musl/src/stdio/__uflow.c b/libc-top-half/musl/src/stdio/__uflow.c
new file mode 100644
index 0000000..2a88bca
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/__uflow.c
@@ -0,0 +1,11 @@
+#include "stdio_impl.h"
+
+/* This function assumes it will never be called if there is already
+ * data buffered for reading. */
+
+int __uflow(FILE *f)
+{
+ unsigned char c;
+ if (!__toread(f) && f->read(f, &c, 1)==1) return c;
+ return EOF;
+}
diff --git a/libc-top-half/musl/src/stdio/asprintf.c b/libc-top-half/musl/src/stdio/asprintf.c
new file mode 100644
index 0000000..4ec8353
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/asprintf.c
@@ -0,0 +1,13 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdarg.h>
+
+int asprintf(char **s, const char *fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vasprintf(s, fmt, ap);
+ va_end(ap);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/stdio/clearerr.c b/libc-top-half/musl/src/stdio/clearerr.c
new file mode 100644
index 0000000..3bf94d3
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/clearerr.c
@@ -0,0 +1,10 @@
+#include "stdio_impl.h"
+
+void clearerr(FILE *f)
+{
+ FLOCK(f);
+ f->flags &= ~(F_EOF|F_ERR);
+ FUNLOCK(f);
+}
+
+weak_alias(clearerr, clearerr_unlocked);
diff --git a/libc-top-half/musl/src/stdio/dprintf.c b/libc-top-half/musl/src/stdio/dprintf.c
new file mode 100644
index 0000000..93082ee
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/dprintf.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+int dprintf(int fd, const char *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vdprintf(fd, fmt, ap);
+ va_end(ap);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/stdio/ext.c b/libc-top-half/musl/src/stdio/ext.c
new file mode 100644
index 0000000..1fd9549
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/ext.c
@@ -0,0 +1,57 @@
+#define _GNU_SOURCE
+#include "stdio_impl.h"
+#include <stdio_ext.h>
+
+void _flushlbf(void)
+{
+ fflush(0);
+}
+
+int __fsetlocking(FILE *f, int type)
+{
+ return 0;
+}
+
+int __fwriting(FILE *f)
+{
+ return (f->flags & F_NORD) || f->wend;
+}
+
+int __freading(FILE *f)
+{
+ return (f->flags & F_NOWR) || f->rend;
+}
+
+int __freadable(FILE *f)
+{
+ return !(f->flags & F_NORD);
+}
+
+int __fwritable(FILE *f)
+{
+ return !(f->flags & F_NOWR);
+}
+
+int __flbf(FILE *f)
+{
+ return f->lbf >= 0;
+}
+
+size_t __fbufsize(FILE *f)
+{
+ return f->buf_size;
+}
+
+size_t __fpending(FILE *f)
+{
+ return f->wend ? f->wpos - f->wbase : 0;
+}
+
+int __fpurge(FILE *f)
+{
+ f->wpos = f->wbase = f->wend = 0;
+ f->rpos = f->rend = 0;
+ return 0;
+}
+
+weak_alias(__fpurge, fpurge);
diff --git a/libc-top-half/musl/src/stdio/ext2.c b/libc-top-half/musl/src/stdio/ext2.c
new file mode 100644
index 0000000..3416278
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/ext2.c
@@ -0,0 +1,24 @@
+#include "stdio_impl.h"
+#include <stdio_ext.h>
+
+size_t __freadahead(FILE *f)
+{
+ return f->rend ? f->rend - f->rpos : 0;
+}
+
+const char *__freadptr(FILE *f, size_t *sizep)
+{
+ if (f->rpos == f->rend) return 0;
+ *sizep = f->rend - f->rpos;
+ return (const char *)f->rpos;
+}
+
+void __freadptrinc(FILE *f, size_t inc)
+{
+ f->rpos += inc;
+}
+
+void __fseterr(FILE *f)
+{
+ f->flags |= F_ERR;
+}
diff --git a/libc-top-half/musl/src/stdio/fclose.c b/libc-top-half/musl/src/stdio/fclose.c
new file mode 100644
index 0000000..d594532
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fclose.c
@@ -0,0 +1,38 @@
+#include "stdio_impl.h"
+#include <stdlib.h>
+
+static void dummy(FILE *f) { }
+weak_alias(dummy, __unlist_locked_file);
+
+int fclose(FILE *f)
+{
+ int r;
+
+ FLOCK(f);
+ r = fflush(f);
+ r |= f->close(f);
+ FUNLOCK(f);
+
+ /* Past this point, f is closed and any further explict access
+ * to it is undefined. However, it still exists as an entry in
+ * the open file list and possibly in the thread's locked files
+ * list, if it was closed while explicitly locked. Functions
+ * which process these lists must tolerate dead FILE objects
+ * (which necessarily have inactive buffer pointers) without
+ * producing any side effects. */
+
+ if (f->flags & F_PERM) return r;
+
+ __unlist_locked_file(f);
+
+ FILE **head = __ofl_lock();
+ if (f->prev) f->prev->next = f->next;
+ if (f->next) f->next->prev = f->prev;
+ if (*head == f) *head = f->next;
+ __ofl_unlock();
+
+ free(f->getln_buf);
+ free(f);
+
+ return r;
+}
diff --git a/libc-top-half/musl/src/stdio/feof.c b/libc-top-half/musl/src/stdio/feof.c
new file mode 100644
index 0000000..56da6b9
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/feof.c
@@ -0,0 +1,14 @@
+#include "stdio_impl.h"
+
+#undef feof
+
+int feof(FILE *f)
+{
+ FLOCK(f);
+ int ret = !!(f->flags & F_EOF);
+ FUNLOCK(f);
+ return ret;
+}
+
+weak_alias(feof, feof_unlocked);
+weak_alias(feof, _IO_feof_unlocked);
diff --git a/libc-top-half/musl/src/stdio/ferror.c b/libc-top-half/musl/src/stdio/ferror.c
new file mode 100644
index 0000000..d692eed
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/ferror.c
@@ -0,0 +1,14 @@
+#include "stdio_impl.h"
+
+#undef ferror
+
+int ferror(FILE *f)
+{
+ FLOCK(f);
+ int ret = !!(f->flags & F_ERR);
+ FUNLOCK(f);
+ return ret;
+}
+
+weak_alias(ferror, ferror_unlocked);
+weak_alias(ferror, _IO_ferror_unlocked);
diff --git a/libc-top-half/musl/src/stdio/fflush.c b/libc-top-half/musl/src/stdio/fflush.c
new file mode 100644
index 0000000..b009437
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fflush.c
@@ -0,0 +1,47 @@
+#include "stdio_impl.h"
+
+/* stdout.c will override this if linked */
+static FILE *volatile dummy = 0;
+weak_alias(dummy, __stdout_used);
+weak_alias(dummy, __stderr_used);
+
+int fflush(FILE *f)
+{
+ if (!f) {
+ int r = 0;
+ if (__stdout_used) r |= fflush(__stdout_used);
+ if (__stderr_used) r |= fflush(__stderr_used);
+
+ for (f=*__ofl_lock(); f; f=f->next) {
+ FLOCK(f);
+ if (f->wpos != f->wbase) r |= fflush(f);
+ FUNLOCK(f);
+ }
+ __ofl_unlock();
+
+ return r;
+ }
+
+ FLOCK(f);
+
+ /* If writing, flush output */
+ if (f->wpos != f->wbase) {
+ f->write(f, 0, 0);
+ if (!f->wpos) {
+ FUNLOCK(f);
+ return EOF;
+ }
+ }
+
+ /* If reading, sync position, per POSIX */
+ if (f->rpos != f->rend) f->seek(f, f->rpos-f->rend, SEEK_CUR);
+
+ /* Clear read and write modes */
+ f->wpos = f->wbase = f->wend = 0;
+ f->rpos = f->rend = 0;
+
+ FUNLOCK(f);
+ return 0;
+}
+
+weak_alias(fflush, fflush_unlocked);
diff --git a/libc-top-half/musl/src/stdio/fgetc.c b/libc-top-half/musl/src/stdio/fgetc.c
new file mode 100644
index 0000000..2578afc
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fgetc.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+#include "getc.h"
+
+int fgetc(FILE *f)
+{
+ return do_getc(f);
+}
diff --git a/libc-top-half/musl/src/stdio/fgetln.c b/libc-top-half/musl/src/stdio/fgetln.c
new file mode 100644
index 0000000..5748435
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fgetln.c
@@ -0,0 +1,21 @@
+#define _GNU_SOURCE
+#include "stdio_impl.h"
+#include <string.h>
+
+char *fgetln(FILE *f, size_t *plen)
+{
+ char *ret = 0, *z;
+ ssize_t l;
+ FLOCK(f);
+ ungetc(getc_unlocked(f), f);
+ if (f->rend && (z=memchr(f->rpos, '\n', f->rend - f->rpos))) {
+ ret = (char *)f->rpos;
+ *plen = ++z - ret;
+ f->rpos = (void *)z;
+ } else if ((l = getline(&f->getln_buf, (size_t[]){0}, f)) > 0) {
+ *plen = l;
+ ret = f->getln_buf;
+ }
+ FUNLOCK(f);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/stdio/fgetpos.c b/libc-top-half/musl/src/stdio/fgetpos.c
new file mode 100644
index 0000000..50813d2
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fgetpos.c
@@ -0,0 +1,11 @@
+#include "stdio_impl.h"
+
+int fgetpos(FILE *restrict f, fpos_t *restrict pos)
+{
+ off_t off = __ftello(f);
+ if (off < 0) return -1;
+ *(long long *)pos = off;
+ return 0;
+}
+
+weak_alias(fgetpos, fgetpos64);
diff --git a/libc-top-half/musl/src/stdio/fgets.c b/libc-top-half/musl/src/stdio/fgets.c
new file mode 100644
index 0000000..6171f39
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fgets.c
@@ -0,0 +1,48 @@
+#include "stdio_impl.h"
+#include <string.h>
+
+#define MIN(a,b) ((a)<(b) ? (a) : (b))
+
+char *fgets(char *restrict s, int n, FILE *restrict f)
+{
+ char *p = s;
+ unsigned char *z;
+ size_t k;
+ int c;
+
+ FLOCK(f);
+
+ if (n--<=1) {
+ f->mode |= f->mode-1;
+ FUNLOCK(f);
+ if (n) return 0;
+ *s = 0;
+ return s;
+ }
+
+ while (n) {
+ if (f->rpos != f->rend) {
+ z = memchr(f->rpos, '\n', f->rend - f->rpos);
+ k = z ? z - f->rpos + 1 : f->rend - f->rpos;
+ k = MIN(k, n);
+ memcpy(p, f->rpos, k);
+ f->rpos += k;
+ p += k;
+ n -= k;
+ if (z || !n) break;
+ }
+ if ((c = getc_unlocked(f)) < 0) {
+ if (p==s || !feof(f)) s = 0;
+ break;
+ }
+ n--;
+ if ((*p++ = c) == '\n') break;
+ }
+ if (s) *p = 0;
+
+ FUNLOCK(f);
+
+ return s;
+}
+
+weak_alias(fgets, fgets_unlocked);
diff --git a/libc-top-half/musl/src/stdio/fgetwc.c b/libc-top-half/musl/src/stdio/fgetwc.c
new file mode 100644
index 0000000..aa10b81
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fgetwc.c
@@ -0,0 +1,68 @@
+#include "stdio_impl.h"
+#include "locale_impl.h"
+#include <wchar.h>
+#include <errno.h>
+
+static wint_t __fgetwc_unlocked_internal(FILE *f)
+{
+ wchar_t wc;
+ int c;
+ size_t l;
+
+ /* Convert character from buffer if possible */
+ if (f->rpos != f->rend) {
+ l = mbtowc(&wc, (void *)f->rpos, f->rend - f->rpos);
+ if (l+1 >= 1) {
+ f->rpos += l + !l; /* l==0 means 1 byte, null */
+ return wc;
+ }
+ }
+
+ /* Convert character byte-by-byte */
+ mbstate_t st = { 0 };
+ unsigned char b;
+ int first = 1;
+ do {
+ b = c = getc_unlocked(f);
+ if (c < 0) {
+ if (!first) {
+ f->flags |= F_ERR;
+ errno = EILSEQ;
+ }
+ return WEOF;
+ }
+ l = mbrtowc(&wc, (void *)&b, 1, &st);
+ if (l == -1) {
+ if (!first) {
+ f->flags |= F_ERR;
+ ungetc(b, f);
+ }
+ return WEOF;
+ }
+ first = 0;
+ } while (l == -2);
+
+ return wc;
+}
+
+wint_t __fgetwc_unlocked(FILE *f)
+{
+ locale_t *ploc = &CURRENT_LOCALE, loc = *ploc;
+ if (f->mode <= 0) fwide(f, 1);
+ *ploc = f->locale;
+ wchar_t wc = __fgetwc_unlocked_internal(f);
+ *ploc = loc;
+ return wc;
+}
+
+wint_t fgetwc(FILE *f)
+{
+ wint_t c;
+ FLOCK(f);
+ c = __fgetwc_unlocked(f);
+ FUNLOCK(f);
+ return c;
+}
+
+weak_alias(__fgetwc_unlocked, fgetwc_unlocked);
+weak_alias(__fgetwc_unlocked, getwc_unlocked);
diff --git a/libc-top-half/musl/src/stdio/fgetws.c b/libc-top-half/musl/src/stdio/fgetws.c
new file mode 100644
index 0000000..195cb43
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fgetws.c
@@ -0,0 +1,28 @@
+#include "stdio_impl.h"
+#include <wchar.h>
+
+wint_t __fgetwc_unlocked(FILE *);
+
+wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f)
+{
+ wchar_t *p = s;
+
+ if (!n--) return s;
+
+ FLOCK(f);
+
+ for (; n; n--) {
+ wint_t c = __fgetwc_unlocked(f);
+ if (c == WEOF) break;
+ *p++ = c;
+ if (c == '\n') break;
+ }
+ *p = 0;
+ if (ferror(f)) p = s;
+
+ FUNLOCK(f);
+
+ return (p == s) ? NULL : s;
+}
+
+weak_alias(fgetws, fgetws_unlocked);
diff --git a/libc-top-half/musl/src/stdio/fileno.c b/libc-top-half/musl/src/stdio/fileno.c
new file mode 100644
index 0000000..0bd0e98
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fileno.c
@@ -0,0 +1,16 @@
+#include "stdio_impl.h"
+#include <errno.h>
+
+int fileno(FILE *f)
+{
+ FLOCK(f);
+ int fd = f->fd;
+ FUNLOCK(f);
+ if (fd < 0) {
+ errno = EBADF;
+ return -1;
+ }
+ return fd;
+}
+
+weak_alias(fileno, fileno_unlocked);
diff --git a/libc-top-half/musl/src/stdio/flockfile.c b/libc-top-half/musl/src/stdio/flockfile.c
new file mode 100644
index 0000000..8e22065
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/flockfile.c
@@ -0,0 +1,9 @@
+#include "stdio_impl.h"
+#include "pthread_impl.h"
+
+void flockfile(FILE *f)
+{
+ if (!ftrylockfile(f)) return;
+ __lockfile(f);
+ __register_locked_file(f, __pthread_self());
+}
diff --git a/libc-top-half/musl/src/stdio/fmemopen.c b/libc-top-half/musl/src/stdio/fmemopen.c
new file mode 100644
index 0000000..3ee57b9
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fmemopen.c
@@ -0,0 +1,137 @@
+#include "stdio_impl.h"
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <inttypes.h>
+#include "libc.h"
+
+struct cookie {
+ size_t pos, len, size;
+ unsigned char *buf;
+ int mode;
+};
+
+struct mem_FILE {
+ FILE f;
+ struct cookie c;
+ unsigned char buf[UNGET+BUFSIZ], buf2[];
+};
+
+static off_t mseek(FILE *f, off_t off, int whence)
+{
+ ssize_t base;
+ struct cookie *c = f->cookie;
+ if (whence>2U) {
+fail:
+ errno = EINVAL;
+ return -1;
+ }
+#ifdef __wasilibc_unmodified_upstream // WASI's SEEK_* constants have different values.
+ base = (size_t [3]){0, c->pos, c->len}[whence];
+#else
+ base = (size_t [3]) {
+ [SEEK_SET] = 0,
+ [SEEK_CUR] = c->pos,
+ [SEEK_END] = c->len
+ }[whence];
+#endif
+ if (off < -base || off > (ssize_t)c->size-base) goto fail;
+ return c->pos = base+off;
+}
+
+static size_t mread(FILE *f, unsigned char *buf, size_t len)
+{
+ struct cookie *c = f->cookie;
+ size_t rem = c->len - c->pos;
+ if (c->pos > c->len) rem = 0;
+ if (len > rem) {
+ len = rem;
+ f->flags |= F_EOF;
+ }
+ memcpy(buf, c->buf+c->pos, len);
+ c->pos += len;
+ rem -= len;
+ if (rem > f->buf_size) rem = f->buf_size;
+ f->rpos = f->buf;
+ f->rend = f->buf + rem;
+ memcpy(f->rpos, c->buf+c->pos, rem);
+ c->pos += rem;
+ return len;
+}
+
+static size_t mwrite(FILE *f, const unsigned char *buf, size_t len)
+{
+ struct cookie *c = f->cookie;
+ size_t rem;
+ size_t len2 = f->wpos - f->wbase;
+ if (len2) {
+ f->wpos = f->wbase;
+ if (mwrite(f, f->wpos, len2) < len2) return 0;
+ }
+ if (c->mode == 'a') c->pos = c->len;
+ rem = c->size - c->pos;
+ if (len > rem) len = rem;
+ memcpy(c->buf+c->pos, buf, len);
+ c->pos += len;
+ if (c->pos > c->len) {
+ c->len = c->pos;
+ if (c->len < c->size) c->buf[c->len] = 0;
+ else if ((f->flags&F_NORD) && c->size) c->buf[c->size-1] = 0;
+ }
+ return len;
+}
+
+static int mclose(FILE *m)
+{
+ return 0;
+}
+
+FILE *fmemopen(void *restrict buf, size_t size, const char *restrict mode)
+{
+ struct mem_FILE *f;
+ int plus = !!strchr(mode, '+');
+
+ if (!strchr("rwa", *mode)) {
+ errno = EINVAL;
+ return 0;
+ }
+
+ if (!buf && size > PTRDIFF_MAX) {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ f = malloc(sizeof *f + (buf?0:size));
+ if (!f) return 0;
+ memset(f, 0, offsetof(struct mem_FILE, buf));
+ f->f.cookie = &f->c;
+ f->f.fd = -1;
+ f->f.lbf = EOF;
+ f->f.buf = f->buf + UNGET;
+ f->f.buf_size = sizeof f->buf - UNGET;
+ if (!buf) {
+ buf = f->buf2;
+ memset(buf, 0, size);
+ }
+
+ f->c.buf = buf;
+ f->c.size = size;
+ f->c.mode = *mode;
+
+ if (!plus) f->f.flags = (*mode == 'r') ? F_NOWR : F_NORD;
+ if (*mode == 'r') f->c.len = size;
+ else if (*mode == 'a') f->c.len = f->c.pos = strnlen(buf, size);
+ else if (plus) *f->c.buf = 0;
+
+ f->f.read = mread;
+ f->f.write = mwrite;
+ f->f.seek = mseek;
+ f->f.close = mclose;
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ if (!libc.threaded) f->f.lock = -1;
+#endif
+
+ return __ofl_add(&f->f);
+}
diff --git a/libc-top-half/musl/src/stdio/fopen.c b/libc-top-half/musl/src/stdio/fopen.c
new file mode 100644
index 0000000..670f438
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fopen.c
@@ -0,0 +1,51 @@
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+#else
+#include <unistd.h>
+#include <wasi/libc.h>
+#endif
+#include "stdio_impl.h"
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
+
+FILE *fopen(const char *restrict filename, const char *restrict mode)
+{
+ FILE *f;
+ int fd;
+ int flags;
+
+ /* Check for valid initial mode character */
+ if (!strchr("rwa", *mode)) {
+ errno = EINVAL;
+ return 0;
+ }
+
+ /* Compute the flags to pass to open() */
+ flags = __fmodeflags(mode);
+
+#ifdef __wasilibc_unmodified_upstream // WASI has no sys_open
+ fd = sys_open(filename, flags, 0666);
+#else
+ // WASI libc ignores the mode parameter anyway, so skip the varargs.
+ fd = __wasilibc_open_nomode(filename, flags);
+#endif
+ if (fd < 0) return 0;
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ if (flags & O_CLOEXEC)
+ __syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC);
+#else
+ /* Avoid __syscall, but also, FD_CLOEXEC is not supported in WASI. */
+#endif
+
+ f = __fdopen(fd, mode);
+ if (f) return f;
+
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ __syscall(SYS_close, fd);
+#else
+ close(fd);
+#endif
+ return 0;
+}
+
+weak_alias(fopen, fopen64);
diff --git a/libc-top-half/musl/src/stdio/fopencookie.c b/libc-top-half/musl/src/stdio/fopencookie.c
new file mode 100644
index 0000000..da042fe
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fopencookie.c
@@ -0,0 +1,135 @@
+#define _GNU_SOURCE
+#include "stdio_impl.h"
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+
+struct fcookie {
+ void *cookie;
+ cookie_io_functions_t iofuncs;
+};
+
+struct cookie_FILE {
+ FILE f;
+ struct fcookie fc;
+ unsigned char buf[UNGET+BUFSIZ];
+};
+
+static size_t cookieread(FILE *f, unsigned char *buf, size_t len)
+{
+ struct fcookie *fc = f->cookie;
+ ssize_t ret = -1;
+ size_t remain = len, readlen = 0;
+ size_t len2 = len - !!f->buf_size;
+
+ if (!fc->iofuncs.read) goto bail;
+
+ if (len2) {
+ ret = fc->iofuncs.read(fc->cookie, (char *) buf, len2);
+ if (ret <= 0) goto bail;
+
+ readlen += ret;
+ remain -= ret;
+ }
+
+ if (!f->buf_size || remain > !!f->buf_size) return readlen;
+
+ f->rpos = f->buf;
+ ret = fc->iofuncs.read(fc->cookie, (char *) f->rpos, f->buf_size);
+ if (ret <= 0) goto bail;
+ f->rend = f->rpos + ret;
+
+ buf[readlen++] = *f->rpos++;
+
+ return readlen;
+
+bail:
+ f->flags |= ret == 0 ? F_EOF : F_ERR;
+ f->rpos = f->rend = f->buf;
+ return readlen;
+}
+
+static size_t cookiewrite(FILE *f, const unsigned char *buf, size_t len)
+{
+ struct fcookie *fc = f->cookie;
+ ssize_t ret;
+ size_t len2 = f->wpos - f->wbase;
+ if (!fc->iofuncs.write) return len;
+ if (len2) {
+ f->wpos = f->wbase;
+ if (cookiewrite(f, f->wpos, len2) < len2) return 0;
+ }
+ ret = fc->iofuncs.write(fc->cookie, (const char *) buf, len);
+ if (ret < 0) {
+ f->wpos = f->wbase = f->wend = 0;
+ f->flags |= F_ERR;
+ return 0;
+ }
+ return ret;
+}
+
+static off_t cookieseek(FILE *f, off_t off, int whence)
+{
+ struct fcookie *fc = f->cookie;
+ int res;
+ if (whence > 2U) {
+ errno = EINVAL;
+ return -1;
+ }
+ if (!fc->iofuncs.seek) {
+ errno = ENOTSUP;
+ return -1;
+ }
+ res = fc->iofuncs.seek(fc->cookie, &off, whence);
+ if (res < 0)
+ return res;
+ return off;
+}
+
+static int cookieclose(FILE *f)
+{
+ struct fcookie *fc = f->cookie;
+ if (fc->iofuncs.close) return fc->iofuncs.close(fc->cookie);
+ return 0;
+}
+
+FILE *fopencookie(void *cookie, const char *mode, cookie_io_functions_t iofuncs)
+{
+ struct cookie_FILE *f;
+
+ /* Check for valid initial mode character */
+ if (!strchr("rwa", *mode)) {
+ errno = EINVAL;
+ return 0;
+ }
+
+ /* Allocate FILE+fcookie+buffer or fail */
+ if (!(f=malloc(sizeof *f))) return 0;
+
+ /* Zero-fill only the struct, not the buffer */
+ memset(&f->f, 0, sizeof f->f);
+
+ /* Impose mode restrictions */
+ if (!strchr(mode, '+')) f->f.flags = (*mode == 'r') ? F_NOWR : F_NORD;
+
+ /* Set up our fcookie */
+ f->fc.cookie = cookie;
+ f->fc.iofuncs = iofuncs;
+
+ f->f.fd = -1;
+ f->f.cookie = &f->fc;
+ f->f.buf = f->buf + UNGET;
+ f->f.buf_size = sizeof f->buf - UNGET;
+ f->f.lbf = EOF;
+
+ /* Initialize op ptrs. No problem if some are unneeded. */
+ f->f.read = cookieread;
+ f->f.write = cookiewrite;
+ f->f.seek = cookieseek;
+ f->f.close = cookieclose;
+
+ /* Add new FILE to open file list */
+ return __ofl_add(&f->f);
+}
diff --git a/libc-top-half/musl/src/stdio/fprintf.c b/libc-top-half/musl/src/stdio/fprintf.c
new file mode 100644
index 0000000..948743f
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fprintf.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+int fprintf(FILE *restrict f, const char *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vfprintf(f, fmt, ap);
+ va_end(ap);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/stdio/fputc.c b/libc-top-half/musl/src/stdio/fputc.c
new file mode 100644
index 0000000..f364ed3
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fputc.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+#include "putc.h"
+
+int fputc(int c, FILE *f)
+{
+ return do_putc(c, f);
+}
diff --git a/libc-top-half/musl/src/stdio/fputs.c b/libc-top-half/musl/src/stdio/fputs.c
new file mode 100644
index 0000000..1cf344f
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fputs.c
@@ -0,0 +1,10 @@
+#include "stdio_impl.h"
+#include <string.h>
+
+int fputs(const char *restrict s, FILE *restrict f)
+{
+ size_t l = strlen(s);
+ return (fwrite(s, 1, l, f)==l) - 1;
+}
+
+weak_alias(fputs, fputs_unlocked);
diff --git a/libc-top-half/musl/src/stdio/fputwc.c b/libc-top-half/musl/src/stdio/fputwc.c
new file mode 100644
index 0000000..789fe9c
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fputwc.c
@@ -0,0 +1,40 @@
+#include "stdio_impl.h"
+#include "locale_impl.h"
+#include <wchar.h>
+#include <limits.h>
+#include <ctype.h>
+
+wint_t __fputwc_unlocked(wchar_t c, FILE *f)
+{
+ char mbc[MB_LEN_MAX];
+ int l;
+ locale_t *ploc = &CURRENT_LOCALE, loc = *ploc;
+
+ if (f->mode <= 0) fwide(f, 1);
+ *ploc = f->locale;
+
+ if (isascii(c)) {
+ c = putc_unlocked(c, f);
+ } else if (f->wpos + MB_LEN_MAX < f->wend) {
+ l = wctomb((void *)f->wpos, c);
+ if (l < 0) c = WEOF;
+ else f->wpos += l;
+ } else {
+ l = wctomb(mbc, c);
+ if (l < 0 || __fwritex((void *)mbc, l, f) < l) c = WEOF;
+ }
+ if (c==WEOF) f->flags |= F_ERR;
+ *ploc = loc;
+ return c;
+}
+
+wint_t fputwc(wchar_t c, FILE *f)
+{
+ FLOCK(f);
+ c = __fputwc_unlocked(c, f);
+ FUNLOCK(f);
+ return c;
+}
+
+weak_alias(__fputwc_unlocked, fputwc_unlocked);
+weak_alias(__fputwc_unlocked, putwc_unlocked);
diff --git a/libc-top-half/musl/src/stdio/fputws.c b/libc-top-half/musl/src/stdio/fputws.c
new file mode 100644
index 0000000..0ed02f1
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fputws.c
@@ -0,0 +1,29 @@
+#include "stdio_impl.h"
+#include "locale_impl.h"
+#include <wchar.h>
+
+int fputws(const wchar_t *restrict ws, FILE *restrict f)
+{
+ unsigned char buf[BUFSIZ];
+ size_t l=0;
+ locale_t *ploc = &CURRENT_LOCALE, loc = *ploc;
+
+ FLOCK(f);
+
+ fwide(f, 1);
+ *ploc = f->locale;
+
+ while (ws && (l = wcsrtombs((void *)buf, (void*)&ws, sizeof buf, 0))+1 > 1)
+ if (__fwritex(buf, l, f) < l) {
+ FUNLOCK(f);
+ *ploc = loc;
+ return -1;
+ }
+
+ FUNLOCK(f);
+
+ *ploc = loc;
+ return l; /* 0 or -1 */
+}
+
+weak_alias(fputws, fputws_unlocked);
diff --git a/libc-top-half/musl/src/stdio/fread.c b/libc-top-half/musl/src/stdio/fread.c
new file mode 100644
index 0000000..a2116da
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fread.c
@@ -0,0 +1,38 @@
+#include "stdio_impl.h"
+#include <string.h>
+
+#define MIN(a,b) ((a)<(b) ? (a) : (b))
+
+size_t fread(void *restrict destv, size_t size, size_t nmemb, FILE *restrict f)
+{
+ unsigned char *dest = destv;
+ size_t len = size*nmemb, l = len, k;
+ if (!size) nmemb = 0;
+
+ FLOCK(f);
+
+ f->mode |= f->mode-1;
+
+ if (f->rpos != f->rend) {
+ /* First exhaust the buffer. */
+ k = MIN(f->rend - f->rpos, l);
+ memcpy(dest, f->rpos, k);
+ f->rpos += k;
+ dest += k;
+ l -= k;
+ }
+
+ /* Read the remainder directly */
+ for (; l; l-=k, dest+=k) {
+ k = __toread(f) ? 0 : f->read(f, dest, l);
+ if (!k) {
+ FUNLOCK(f);
+ return (len-l)/size;
+ }
+ }
+
+ FUNLOCK(f);
+ return nmemb;
+}
+
+weak_alias(fread, fread_unlocked);
diff --git a/libc-top-half/musl/src/stdio/freopen.c b/libc-top-half/musl/src/stdio/freopen.c
new file mode 100644
index 0000000..5331db0
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/freopen.c
@@ -0,0 +1,80 @@
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall, dup
+#include "stdio_impl.h"
+#else
+#include <wasi/libc.h>
+#endif
+#include <fcntl.h>
+#include <unistd.h>
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall, dup
+#else
+// Move this below fcntl.h and unistd.h so that the __syscall macro doesn't
+// cause trouble.
+#include "stdio_impl.h"
+#endif
+
+/* The basic idea of this implementation is to open a new FILE,
+ * hack the necessary parts of the new FILE into the old one, then
+ * close the new FILE. */
+
+/* Locking IS necessary because another thread may provably hold the
+ * lock, via flockfile or otherwise, when freopen is called, and in that
+ * case, freopen cannot act until the lock is released. */
+
+FILE *freopen(const char *restrict filename, const char *restrict mode, FILE *restrict f)
+{
+ int fl = __fmodeflags(mode);
+ FILE *f2;
+
+ FLOCK(f);
+
+ fflush(f);
+
+ if (!filename) {
+ if (fl&O_CLOEXEC)
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ __syscall(SYS_fcntl, f->fd, F_SETFD, FD_CLOEXEC);
+#else
+ fcntl(f->fd, F_SETFD, FD_CLOEXEC);
+#endif
+ fl &= ~(O_CREAT|O_EXCL|O_CLOEXEC);
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ if (syscall(SYS_fcntl, f->fd, F_SETFL, fl) < 0)
+#else
+ if (fcntl(f->fd, F_SETFL, fl) < 0)
+#endif
+ goto fail;
+ } else {
+ f2 = fopen(filename, mode);
+ if (!f2) goto fail;
+ if (f2->fd == f->fd) f2->fd = -1; /* avoid closing in fclose */
+#ifdef __wasilibc_unmodified_upstream // WASI has no dup
+ else if (__dup3(f2->fd, f->fd, fl&O_CLOEXEC)<0) goto fail2;
+#else
+ // WASI doesn't have dup3, but does have a way to renumber
+ // an existing file descriptor.
+ else {
+ if (__wasilibc_fd_renumber(f2->fd, f->fd)<0) goto fail2;
+ f2->fd = -1; /* avoid closing in fclose */
+ }
+#endif
+
+ f->flags = (f->flags & F_PERM) | f2->flags;
+ f->read = f2->read;
+ f->write = f2->write;
+ f->seek = f2->seek;
+ f->close = f2->close;
+
+ fclose(f2);
+ }
+
+ FUNLOCK(f);
+ return f;
+
+fail2:
+ fclose(f2);
+fail:
+ fclose(f);
+ return NULL;
+}
+
+weak_alias(freopen, freopen64);
diff --git a/libc-top-half/musl/src/stdio/fscanf.c b/libc-top-half/musl/src/stdio/fscanf.c
new file mode 100644
index 0000000..f639e11
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fscanf.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+int fscanf(FILE *restrict f, const char *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vfscanf(f, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+weak_alias(fscanf, __isoc99_fscanf);
diff --git a/libc-top-half/musl/src/stdio/fseek.c b/libc-top-half/musl/src/stdio/fseek.c
new file mode 100644
index 0000000..c07f7e9
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fseek.c
@@ -0,0 +1,50 @@
+#include "stdio_impl.h"
+#include <errno.h>
+
+int __fseeko_unlocked(FILE *f, off_t off, int whence)
+{
+ /* Fail immediately for invalid whence argument. */
+ if (whence != SEEK_CUR && whence != SEEK_SET && whence != SEEK_END) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* Adjust relative offset for unread data in buffer, if any. */
+ if (whence == SEEK_CUR && f->rend) off -= f->rend - f->rpos;
+
+ /* Flush write buffer, and report error on failure. */
+ if (f->wpos != f->wbase) {
+ f->write(f, 0, 0);
+ if (!f->wpos) return -1;
+ }
+
+ /* Leave writing mode */
+ f->wpos = f->wbase = f->wend = 0;
+
+ /* Perform the underlying seek. */
+ if (f->seek(f, off, whence) < 0) return -1;
+
+ /* If seek succeeded, file is seekable and we discard read buffer. */
+ f->rpos = f->rend = 0;
+ f->flags &= ~F_EOF;
+
+ return 0;
+}
+
+int __fseeko(FILE *f, off_t off, int whence)
+{
+ int result;
+ FLOCK(f);
+ result = __fseeko_unlocked(f, off, whence);
+ FUNLOCK(f);
+ return result;
+}
+
+int fseek(FILE *f, long off, int whence)
+{
+ return __fseeko(f, off, whence);
+}
+
+weak_alias(__fseeko, fseeko);
+
+weak_alias(fseeko, fseeko64);
diff --git a/libc-top-half/musl/src/stdio/fsetpos.c b/libc-top-half/musl/src/stdio/fsetpos.c
new file mode 100644
index 0000000..77ab8d8
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fsetpos.c
@@ -0,0 +1,8 @@
+#include "stdio_impl.h"
+
+int fsetpos(FILE *f, const fpos_t *pos)
+{
+ return __fseeko(f, *(const long long *)pos, SEEK_SET);
+}
+
+weak_alias(fsetpos, fsetpos64);
diff --git a/libc-top-half/musl/src/stdio/ftell.c b/libc-top-half/musl/src/stdio/ftell.c
new file mode 100644
index 0000000..1a2afbb
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/ftell.c
@@ -0,0 +1,41 @@
+#include "stdio_impl.h"
+#include <limits.h>
+#include <errno.h>
+
+off_t __ftello_unlocked(FILE *f)
+{
+ off_t pos = f->seek(f, 0,
+ (f->flags & F_APP) && f->wpos != f->wbase
+ ? SEEK_END : SEEK_CUR);
+ if (pos < 0) return pos;
+
+ /* Adjust for data in buffer. */
+ if (f->rend)
+ pos += f->rpos - f->rend;
+ else if (f->wbase)
+ pos += f->wpos - f->wbase;
+ return pos;
+}
+
+off_t __ftello(FILE *f)
+{
+ off_t pos;
+ FLOCK(f);
+ pos = __ftello_unlocked(f);
+ FUNLOCK(f);
+ return pos;
+}
+
+long ftell(FILE *f)
+{
+ off_t pos = __ftello(f);
+ if (pos > LONG_MAX) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ return pos;
+}
+
+weak_alias(__ftello, ftello);
+
+weak_alias(ftello, ftello64);
diff --git a/libc-top-half/musl/src/stdio/ftrylockfile.c b/libc-top-half/musl/src/stdio/ftrylockfile.c
new file mode 100644
index 0000000..5065058
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/ftrylockfile.c
@@ -0,0 +1,46 @@
+#include "stdio_impl.h"
+#include "pthread_impl.h"
+#include <limits.h>
+
+void __do_orphaned_stdio_locks()
+{
+ FILE *f;
+ for (f=__pthread_self()->stdio_locks; f; f=f->next_locked)
+ a_store(&f->lock, 0x40000000);
+}
+
+void __unlist_locked_file(FILE *f)
+{
+ if (f->lockcount) {
+ if (f->next_locked) f->next_locked->prev_locked = f->prev_locked;
+ if (f->prev_locked) f->prev_locked->next_locked = f->next_locked;
+ else __pthread_self()->stdio_locks = f->next_locked;
+ }
+}
+
+void __register_locked_file(FILE *f, pthread_t self)
+{
+ f->lockcount = 1;
+ f->prev_locked = 0;
+ f->next_locked = self->stdio_locks;
+ if (f->next_locked) f->next_locked->prev_locked = f;
+ self->stdio_locks = f;
+}
+
+int ftrylockfile(FILE *f)
+{
+ pthread_t self = __pthread_self();
+ int tid = self->tid;
+ int owner = f->lock;
+ if ((owner & ~MAYBE_WAITERS) == tid) {
+ if (f->lockcount == LONG_MAX)
+ return -1;
+ f->lockcount++;
+ return 0;
+ }
+ if (owner < 0) f->lock = owner = 0;
+ if (owner || a_cas(&f->lock, 0, tid))
+ return -1;
+ __register_locked_file(f, self);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/stdio/funlockfile.c b/libc-top-half/musl/src/stdio/funlockfile.c
new file mode 100644
index 0000000..44d8b0d
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/funlockfile.c
@@ -0,0 +1,13 @@
+#include "stdio_impl.h"
+#include "pthread_impl.h"
+
+void funlockfile(FILE *f)
+{
+ if (f->lockcount == 1) {
+ __unlist_locked_file(f);
+ f->lockcount = 0;
+ __unlockfile(f);
+ } else {
+ f->lockcount--;
+ }
+}
diff --git a/libc-top-half/musl/src/stdio/fwide.c b/libc-top-half/musl/src/stdio/fwide.c
new file mode 100644
index 0000000..8bab634
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fwide.c
@@ -0,0 +1,16 @@
+#include <wchar.h>
+#include "stdio_impl.h"
+#include "locale_impl.h"
+
+int fwide(FILE *f, int mode)
+{
+ FLOCK(f);
+ if (mode) {
+ if (!f->locale) f->locale = MB_CUR_MAX==1
+ ? C_LOCALE : UTF8_LOCALE;
+ if (!f->mode) f->mode = mode>0 ? 1 : -1;
+ }
+ mode = f->mode;
+ FUNLOCK(f);
+ return mode;
+}
diff --git a/libc-top-half/musl/src/stdio/fwprintf.c b/libc-top-half/musl/src/stdio/fwprintf.c
new file mode 100644
index 0000000..9ce4f01
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fwprintf.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <wchar.h>
+
+int fwprintf(FILE *restrict f, const wchar_t *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vfwprintf(f, fmt, ap);
+ va_end(ap);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/stdio/fwrite.c b/libc-top-half/musl/src/stdio/fwrite.c
new file mode 100644
index 0000000..7a567b2
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fwrite.c
@@ -0,0 +1,38 @@
+#include "stdio_impl.h"
+#include <string.h>
+
+size_t __fwritex(const unsigned char *restrict s, size_t l, FILE *restrict f)
+{
+ size_t i=0;
+
+ if (!f->wend && __towrite(f)) return 0;
+
+ if (l > f->wend - f->wpos) return f->write(f, s, l);
+
+ if (f->lbf >= 0) {
+ /* Match /^(.*\n|)/ */
+ for (i=l; i && s[i-1] != '\n'; i--);
+ if (i) {
+ size_t n = f->write(f, s, i);
+ if (n < i) return n;
+ s += i;
+ l -= i;
+ }
+ }
+
+ memcpy(f->wpos, s, l);
+ f->wpos += l;
+ return l+i;
+}
+
+size_t fwrite(const void *restrict src, size_t size, size_t nmemb, FILE *restrict f)
+{
+ size_t k, l = size*nmemb;
+ if (!size) nmemb = 0;
+ FLOCK(f);
+ k = __fwritex(src, l, f);
+ FUNLOCK(f);
+ return k==l ? nmemb : k/size;
+}
+
+weak_alias(fwrite, fwrite_unlocked);
diff --git a/libc-top-half/musl/src/stdio/fwscanf.c b/libc-top-half/musl/src/stdio/fwscanf.c
new file mode 100644
index 0000000..530bb7c
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/fwscanf.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <wchar.h>
+
+int fwscanf(FILE *restrict f, const wchar_t *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vfwscanf(f, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+weak_alias(fwscanf,__isoc99_fwscanf);
diff --git a/libc-top-half/musl/src/stdio/getc.c b/libc-top-half/musl/src/stdio/getc.c
new file mode 100644
index 0000000..8409fc2
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/getc.c
@@ -0,0 +1,9 @@
+#include <stdio.h>
+#include "getc.h"
+
+int getc(FILE *f)
+{
+ return do_getc(f);
+}
+
+weak_alias(getc, _IO_getc);
diff --git a/libc-top-half/musl/src/stdio/getc.h b/libc-top-half/musl/src/stdio/getc.h
new file mode 100644
index 0000000..e62e3f0
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/getc.h
@@ -0,0 +1,29 @@
+#include "stdio_impl.h"
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#include "pthread_impl.h"
+
+#ifdef __GNUC__
+__attribute__((__noinline__))
+#endif
+static int locking_getc(FILE *f)
+{
+ if (a_cas(&f->lock, 0, MAYBE_WAITERS-1)) __lockfile(f);
+ int c = getc_unlocked(f);
+ if (a_swap(&f->lock, 0) & MAYBE_WAITERS)
+ __wake(&f->lock, 1, 1);
+ return c;
+}
+#endif
+
+static inline int do_getc(FILE *f)
+{
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ int l = f->lock;
+ if (l < 0 || l && (l & ~MAYBE_WAITERS) == __pthread_self()->tid)
+ return getc_unlocked(f);
+ return locking_getc(f);
+#else
+ // With no threads, locking is unnecessary.
+ return getc_unlocked(f);
+#endif
+}
diff --git a/libc-top-half/musl/src/stdio/getc_unlocked.c b/libc-top-half/musl/src/stdio/getc_unlocked.c
new file mode 100644
index 0000000..b38dad1
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/getc_unlocked.c
@@ -0,0 +1,9 @@
+#include "stdio_impl.h"
+
+int (getc_unlocked)(FILE *f)
+{
+ return getc_unlocked(f);
+}
+
+weak_alias (getc_unlocked, fgetc_unlocked);
+weak_alias (getc_unlocked, _IO_getc_unlocked);
diff --git a/libc-top-half/musl/src/stdio/getchar.c b/libc-top-half/musl/src/stdio/getchar.c
new file mode 100644
index 0000000..df395ca
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/getchar.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+#include "getc.h"
+
+int getchar(void)
+{
+ return do_getc(stdin);
+}
diff --git a/libc-top-half/musl/src/stdio/getchar_unlocked.c b/libc-top-half/musl/src/stdio/getchar_unlocked.c
new file mode 100644
index 0000000..355ac31
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/getchar_unlocked.c
@@ -0,0 +1,6 @@
+#include "stdio_impl.h"
+
+int getchar_unlocked(void)
+{
+ return getc_unlocked(stdin);
+}
diff --git a/libc-top-half/musl/src/stdio/getdelim.c b/libc-top-half/musl/src/stdio/getdelim.c
new file mode 100644
index 0000000..df11444
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/getdelim.c
@@ -0,0 +1,83 @@
+#include "stdio_impl.h"
+#include <string.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include <errno.h>
+
+ssize_t getdelim(char **restrict s, size_t *restrict n, int delim, FILE *restrict f)
+{
+ char *tmp;
+ unsigned char *z;
+ size_t k;
+ size_t i=0;
+ int c;
+
+ FLOCK(f);
+
+ if (!n || !s) {
+ f->mode |= f->mode-1;
+ f->flags |= F_ERR;
+ FUNLOCK(f);
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (!*s) *n=0;
+
+ for (;;) {
+ if (f->rpos != f->rend) {
+ z = memchr(f->rpos, delim, f->rend - f->rpos);
+ k = z ? z - f->rpos + 1 : f->rend - f->rpos;
+ } else {
+ z = 0;
+ k = 0;
+ }
+ if (i+k >= *n) {
+ size_t m = i+k+2;
+ if (!z && m < SIZE_MAX/4) m += m/2;
+ tmp = realloc(*s, m);
+ if (!tmp) {
+ m = i+k+2;
+ tmp = realloc(*s, m);
+ if (!tmp) {
+ /* Copy as much as fits and ensure no
+ * pushback remains in the FILE buf. */
+ k = *n-i;
+ memcpy(*s+i, f->rpos, k);
+ f->rpos += k;
+ f->mode |= f->mode-1;
+ f->flags |= F_ERR;
+ FUNLOCK(f);
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ *s = tmp;
+ *n = m;
+ }
+ if (k) {
+ memcpy(*s+i, f->rpos, k);
+ f->rpos += k;
+ i += k;
+ }
+ if (z) break;
+ if ((c = getc_unlocked(f)) == EOF) {
+ if (!i || !feof(f)) {
+ FUNLOCK(f);
+ return -1;
+ }
+ break;
+ }
+ /* If the byte read by getc won't fit without growing the
+ * output buffer, push it back for next iteration. */
+ if (i+1 >= *n) *--f->rpos = c;
+ else if (((*s)[i++] = c) == delim) break;
+ }
+ (*s)[i] = 0;
+
+ FUNLOCK(f);
+
+ return i;
+}
+
+weak_alias(getdelim, __getdelim);
diff --git a/libc-top-half/musl/src/stdio/getline.c b/libc-top-half/musl/src/stdio/getline.c
new file mode 100644
index 0000000..476d0b0
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/getline.c
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+ssize_t getline(char **restrict s, size_t *restrict n, FILE *restrict f)
+{
+ return getdelim(s, n, '\n', f);
+}
diff --git a/libc-top-half/musl/src/stdio/gets.c b/libc-top-half/musl/src/stdio/gets.c
new file mode 100644
index 0000000..17963b9
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/gets.c
@@ -0,0 +1,15 @@
+#include "stdio_impl.h"
+#include <limits.h>
+#include <string.h>
+
+char *gets(char *s)
+{
+ size_t i=0;
+ int c;
+ FLOCK(stdin);
+ while ((c=getc_unlocked(stdin)) != EOF && c != '\n') s[i++] = c;
+ s[i] = 0;
+ if (c != '\n' && (!feof(stdin) || !i)) s = 0;
+ FUNLOCK(stdin);
+ return s;
+}
diff --git a/libc-top-half/musl/src/stdio/getw.c b/libc-top-half/musl/src/stdio/getw.c
new file mode 100644
index 0000000..73d2c0d
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/getw.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+
+int getw(FILE *f)
+{
+ int x;
+ return fread(&x, sizeof x, 1, f) ? x : EOF;
+}
diff --git a/libc-top-half/musl/src/stdio/getwc.c b/libc-top-half/musl/src/stdio/getwc.c
new file mode 100644
index 0000000..a5008f0
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/getwc.c
@@ -0,0 +1,7 @@
+#include "stdio_impl.h"
+#include <wchar.h>
+
+wint_t getwc(FILE *f)
+{
+ return fgetwc(f);
+}
diff --git a/libc-top-half/musl/src/stdio/getwchar.c b/libc-top-half/musl/src/stdio/getwchar.c
new file mode 100644
index 0000000..bd89e0e
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/getwchar.c
@@ -0,0 +1,9 @@
+#include "stdio_impl.h"
+#include <wchar.h>
+
+wint_t getwchar(void)
+{
+ return fgetwc(stdin);
+}
+
+weak_alias(getwchar, getwchar_unlocked);
diff --git a/libc-top-half/musl/src/stdio/ofl.c b/libc-top-half/musl/src/stdio/ofl.c
new file mode 100644
index 0000000..33a8aa5
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/ofl.c
@@ -0,0 +1,20 @@
+#include "stdio_impl.h"
+#include "lock.h"
+#include "fork_impl.h"
+
+static FILE *ofl_head;
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+static volatile int ofl_lock[1];
+volatile int *const __stdio_ofl_lockptr = ofl_lock;
+#endif
+
+FILE **__ofl_lock()
+{
+ LOCK(ofl_lock);
+ return &ofl_head;
+}
+
+void __ofl_unlock()
+{
+ UNLOCK(ofl_lock);
+}
diff --git a/libc-top-half/musl/src/stdio/ofl_add.c b/libc-top-half/musl/src/stdio/ofl_add.c
new file mode 100644
index 0000000..d7de9f1
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/ofl_add.c
@@ -0,0 +1,11 @@
+#include "stdio_impl.h"
+
+FILE *__ofl_add(FILE *f)
+{
+ FILE **head = __ofl_lock();
+ f->next = *head;
+ if (*head) (*head)->prev = f;
+ *head = f;
+ __ofl_unlock();
+ return f;
+}
diff --git a/libc-top-half/musl/src/stdio/open_memstream.c b/libc-top-half/musl/src/stdio/open_memstream.c
new file mode 100644
index 0000000..aa50220
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/open_memstream.c
@@ -0,0 +1,109 @@
+#include "stdio_impl.h"
+#include <errno.h>
+#include <limits.h>
+#include <string.h>
+#include <stdlib.h>
+#include "libc.h"
+
+struct cookie {
+ char **bufp;
+ size_t *sizep;
+ size_t pos;
+ char *buf;
+ size_t len;
+ size_t space;
+};
+
+struct ms_FILE {
+ FILE f;
+ struct cookie c;
+ unsigned char buf[BUFSIZ];
+};
+
+static off_t ms_seek(FILE *f, off_t off, int whence)
+{
+ ssize_t base;
+ struct cookie *c = f->cookie;
+ if (whence>2U) {
+fail:
+ errno = EINVAL;
+ return -1;
+ }
+#ifdef __wasilibc_unmodified_upstream // WASI's SEEK_* constants have different values.
+ base = (size_t [3]){0, c->pos, c->len}[whence];
+#else
+ base = (size_t [3]) {
+ [SEEK_SET] = 0,
+ [SEEK_CUR] = c->pos,
+ [SEEK_END] = c->len
+ }[whence];
+#endif
+ if (off < -base || off > SSIZE_MAX-base) goto fail;
+ return c->pos = base+off;
+}
+
+static size_t ms_write(FILE *f, const unsigned char *buf, size_t len)
+{
+ struct cookie *c = f->cookie;
+ size_t len2 = f->wpos - f->wbase;
+ char *newbuf;
+ if (len2) {
+ f->wpos = f->wbase;
+ if (ms_write(f, f->wbase, len2) < len2) return 0;
+ }
+ if (len + c->pos >= c->space) {
+ len2 = 2*c->space+1 | c->pos+len+1;
+ newbuf = realloc(c->buf, len2);
+ if (!newbuf) return 0;
+ *c->bufp = c->buf = newbuf;
+ memset(c->buf + c->space, 0, len2 - c->space);
+ c->space = len2;
+ }
+ memcpy(c->buf+c->pos, buf, len);
+ c->pos += len;
+ if (c->pos >= c->len) c->len = c->pos;
+ *c->sizep = c->pos;
+ return len;
+}
+
+static int ms_close(FILE *f)
+{
+ return 0;
+}
+
+FILE *open_memstream(char **bufp, size_t *sizep)
+{
+ struct ms_FILE *f;
+ char *buf;
+
+ if (!(f=malloc(sizeof *f))) return 0;
+ if (!(buf=malloc(sizeof *buf))) {
+ free(f);
+ return 0;
+ }
+ memset(&f->f, 0, sizeof f->f);
+ memset(&f->c, 0, sizeof f->c);
+ f->f.cookie = &f->c;
+
+ f->c.bufp = bufp;
+ f->c.sizep = sizep;
+ f->c.pos = f->c.len = f->c.space = *sizep = 0;
+ f->c.buf = *bufp = buf;
+ *buf = 0;
+
+ f->f.flags = F_NORD;
+ f->f.fd = -1;
+ f->f.buf = f->buf;
+ f->f.buf_size = sizeof f->buf;
+ f->f.lbf = EOF;
+ f->f.write = ms_write;
+ f->f.seek = ms_seek;
+ f->f.close = ms_close;
+ f->f.mode = -1;
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ if (!libc.threaded) f->f.lock = -1;
+#endif
+
+ return __ofl_add(&f->f);
+}
diff --git a/libc-top-half/musl/src/stdio/open_wmemstream.c b/libc-top-half/musl/src/stdio/open_wmemstream.c
new file mode 100644
index 0000000..30ffcdf
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/open_wmemstream.c
@@ -0,0 +1,112 @@
+#include "stdio_impl.h"
+#include <wchar.h>
+#include <errno.h>
+#include <limits.h>
+#include <string.h>
+#include <stdlib.h>
+#include "libc.h"
+
+struct cookie {
+ wchar_t **bufp;
+ size_t *sizep;
+ size_t pos;
+ wchar_t *buf;
+ size_t len;
+ size_t space;
+ mbstate_t mbs;
+};
+
+struct wms_FILE {
+ FILE f;
+ struct cookie c;
+ unsigned char buf[1];
+};
+
+static off_t wms_seek(FILE *f, off_t off, int whence)
+{
+ ssize_t base;
+ struct cookie *c = f->cookie;
+ if (whence>2U) {
+fail:
+ errno = EINVAL;
+ return -1;
+ }
+#ifdef __wasilibc_unmodified_upstream // WASI's SEEK_* constants have different values.
+ base = (size_t [3]){0, c->pos, c->len}[whence];
+#else
+ base = (size_t [3]) {
+ [SEEK_SET] = 0,
+ [SEEK_CUR] = c->pos,
+ [SEEK_END] = c->len
+ }[whence];
+#endif
+ if (off < -base || off > SSIZE_MAX/4-base) goto fail;
+ memset(&c->mbs, 0, sizeof c->mbs);
+ return c->pos = base+off;
+}
+
+static size_t wms_write(FILE *f, const unsigned char *buf, size_t len)
+{
+ struct cookie *c = f->cookie;
+ size_t len2;
+ wchar_t *newbuf;
+ if (len + c->pos >= c->space) {
+ len2 = 2*c->space+1 | c->pos+len+1;
+ if (len2 > SSIZE_MAX/4) return 0;
+ newbuf = realloc(c->buf, len2*4);
+ if (!newbuf) return 0;
+ *c->bufp = c->buf = newbuf;
+ memset(c->buf + c->space, 0, 4*(len2 - c->space));
+ c->space = len2;
+ }
+
+ len2 = mbsnrtowcs(c->buf+c->pos, (void *)&buf, len, c->space-c->pos, &c->mbs);
+ if (len2 == -1) return 0;
+ c->pos += len2;
+ if (c->pos >= c->len) c->len = c->pos;
+ *c->sizep = c->pos;
+ return len;
+}
+
+static int wms_close(FILE *f)
+{
+ return 0;
+}
+
+FILE *open_wmemstream(wchar_t **bufp, size_t *sizep)
+{
+ struct wms_FILE *f;
+ wchar_t *buf;
+
+ if (!(f=malloc(sizeof *f))) return 0;
+ if (!(buf=malloc(sizeof *buf))) {
+ free(f);
+ return 0;
+ }
+ memset(&f->f, 0, sizeof f->f);
+ memset(&f->c, 0, sizeof f->c);
+ f->f.cookie = &f->c;
+
+ f->c.bufp = bufp;
+ f->c.sizep = sizep;
+ f->c.pos = f->c.len = f->c.space = *sizep = 0;
+ f->c.buf = *bufp = buf;
+ *buf = 0;
+
+ f->f.flags = F_NORD;
+ f->f.fd = -1;
+ f->f.buf = f->buf;
+ f->f.buf_size = 0;
+ f->f.lbf = EOF;
+ f->f.write = wms_write;
+ f->f.seek = wms_seek;
+ f->f.close = wms_close;
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ if (!libc.threaded) f->f.lock = -1;
+#endif
+
+ fwide(&f->f, 1);
+
+ return __ofl_add(&f->f);
+}
diff --git a/libc-top-half/musl/src/stdio/pclose.c b/libc-top-half/musl/src/stdio/pclose.c
new file mode 100644
index 0000000..080a426
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/pclose.c
@@ -0,0 +1,13 @@
+#include "stdio_impl.h"
+#include <errno.h>
+#include <unistd.h>
+
+int pclose(FILE *f)
+{
+ int status, r;
+ pid_t pid = f->pipe_pid;
+ fclose(f);
+ while ((r=__syscall(SYS_wait4, pid, &status, 0, 0)) == -EINTR);
+ if (r<0) return __syscall_ret(r);
+ return status;
+}
diff --git a/libc-top-half/musl/src/stdio/perror.c b/libc-top-half/musl/src/stdio/perror.c
new file mode 100644
index 0000000..d0943f2
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/perror.c
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include "stdio_impl.h"
+
+void perror(const char *msg)
+{
+ FILE *f = stderr;
+ char *errstr = strerror(errno);
+
+ FLOCK(f);
+
+ /* Save stderr's orientation and encoding rule, since perror is not
+ * permitted to change them. */
+ void *old_locale = f->locale;
+ int old_mode = f->mode;
+
+ if (msg && *msg) {
+ fwrite(msg, strlen(msg), 1, f);
+ fputc(':', f);
+ fputc(' ', f);
+ }
+ fwrite(errstr, strlen(errstr), 1, f);
+ fputc('\n', f);
+
+ f->mode = old_mode;
+ f->locale = old_locale;
+
+ FUNLOCK(f);
+}
diff --git a/libc-top-half/musl/src/stdio/popen.c b/libc-top-half/musl/src/stdio/popen.c
new file mode 100644
index 0000000..3ec8339
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/popen.c
@@ -0,0 +1,61 @@
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <spawn.h>
+#include "stdio_impl.h"
+#include "syscall.h"
+
+extern char **__environ;
+
+FILE *popen(const char *cmd, const char *mode)
+{
+ int p[2], op, e;
+ pid_t pid;
+ FILE *f;
+ posix_spawn_file_actions_t fa;
+
+ if (*mode == 'r') {
+ op = 0;
+ } else if (*mode == 'w') {
+ op = 1;
+ } else {
+ errno = EINVAL;
+ return 0;
+ }
+
+ if (pipe2(p, O_CLOEXEC)) return NULL;
+ f = fdopen(p[op], mode);
+ if (!f) {
+ __syscall(SYS_close, p[0]);
+ __syscall(SYS_close, p[1]);
+ return NULL;
+ }
+
+ e = ENOMEM;
+ if (!posix_spawn_file_actions_init(&fa)) {
+ for (FILE *l = *__ofl_lock(); l; l=l->next)
+ if (l->pipe_pid && posix_spawn_file_actions_addclose(&fa, l->fd))
+ goto fail;
+ if (!posix_spawn_file_actions_adddup2(&fa, p[1-op], 1-op)) {
+ if (!(e = posix_spawn(&pid, "/bin/sh", &fa, 0,
+ (char *[]){ "sh", "-c", (char *)cmd, 0 }, __environ))) {
+ posix_spawn_file_actions_destroy(&fa);
+ f->pipe_pid = pid;
+ if (!strchr(mode, 'e'))
+ fcntl(p[op], F_SETFD, 0);
+ __syscall(SYS_close, p[1-op]);
+ __ofl_unlock();
+ return f;
+ }
+ }
+fail:
+ __ofl_unlock();
+ posix_spawn_file_actions_destroy(&fa);
+ }
+ fclose(f);
+ __syscall(SYS_close, p[1-op]);
+
+ errno = e;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/stdio/printf.c b/libc-top-half/musl/src/stdio/printf.c
new file mode 100644
index 0000000..46cc6d8
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/printf.c
@@ -0,0 +1,17 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+int printf(const char *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vfprintf(stdout, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+#ifdef __wasilibc_unmodified_upstream // Changes to optimize printf/scanf when long double isn't needed
+#else
+weak_alias(printf, iprintf);
+weak_alias(printf, __small_printf);
+#endif
diff --git a/libc-top-half/musl/src/stdio/putc.c b/libc-top-half/musl/src/stdio/putc.c
new file mode 100644
index 0000000..4744d97
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/putc.c
@@ -0,0 +1,9 @@
+#include <stdio.h>
+#include "putc.h"
+
+int putc(int c, FILE *f)
+{
+ return do_putc(c, f);
+}
+
+weak_alias(putc, _IO_putc);
diff --git a/libc-top-half/musl/src/stdio/putc.h b/libc-top-half/musl/src/stdio/putc.h
new file mode 100644
index 0000000..2cc63d2
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/putc.h
@@ -0,0 +1,29 @@
+#include "stdio_impl.h"
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#include "pthread_impl.h"
+
+#ifdef __GNUC__
+__attribute__((__noinline__))
+#endif
+static int locking_putc(int c, FILE *f)
+{
+ if (a_cas(&f->lock, 0, MAYBE_WAITERS-1)) __lockfile(f);
+ c = putc_unlocked(c, f);
+ if (a_swap(&f->lock, 0) & MAYBE_WAITERS)
+ __wake(&f->lock, 1, 1);
+ return c;
+}
+#endif
+
+static inline int do_putc(int c, FILE *f)
+{
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ int l = f->lock;
+ if (l < 0 || l && (l & ~MAYBE_WAITERS) == __pthread_self()->tid)
+ return putc_unlocked(c, f);
+ return locking_putc(c, f);
+#else
+ // With no threads, locking is unnecessary.
+ return putc_unlocked(c, f);
+#endif
+}
diff --git a/libc-top-half/musl/src/stdio/putc_unlocked.c b/libc-top-half/musl/src/stdio/putc_unlocked.c
new file mode 100644
index 0000000..1007131
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/putc_unlocked.c
@@ -0,0 +1,9 @@
+#include "stdio_impl.h"
+
+int (putc_unlocked)(int c, FILE *f)
+{
+ return putc_unlocked(c, f);
+}
+
+weak_alias(putc_unlocked, fputc_unlocked);
+weak_alias(putc_unlocked, _IO_putc_unlocked);
diff --git a/libc-top-half/musl/src/stdio/putchar.c b/libc-top-half/musl/src/stdio/putchar.c
new file mode 100644
index 0000000..f044f16
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/putchar.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+#include "putc.h"
+
+int putchar(int c)
+{
+ return do_putc(c, stdout);
+}
diff --git a/libc-top-half/musl/src/stdio/putchar_unlocked.c b/libc-top-half/musl/src/stdio/putchar_unlocked.c
new file mode 100644
index 0000000..8b5d060
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/putchar_unlocked.c
@@ -0,0 +1,6 @@
+#include "stdio_impl.h"
+
+int putchar_unlocked(int c)
+{
+ return putc_unlocked(c, stdout);
+}
diff --git a/libc-top-half/musl/src/stdio/puts.c b/libc-top-half/musl/src/stdio/puts.c
new file mode 100644
index 0000000..5a38a49
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/puts.c
@@ -0,0 +1,10 @@
+#include "stdio_impl.h"
+
+int puts(const char *s)
+{
+ int r;
+ FLOCK(stdout);
+ r = -(fputs(s, stdout) < 0 || putc_unlocked('\n', stdout) < 0);
+ FUNLOCK(stdout);
+ return r;
+}
diff --git a/libc-top-half/musl/src/stdio/putw.c b/libc-top-half/musl/src/stdio/putw.c
new file mode 100644
index 0000000..0ff9d7f
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/putw.c
@@ -0,0 +1,7 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+
+int putw(int x, FILE *f)
+{
+ return (int)fwrite(&x, sizeof x, 1, f)-1;
+}
diff --git a/libc-top-half/musl/src/stdio/putwc.c b/libc-top-half/musl/src/stdio/putwc.c
new file mode 100644
index 0000000..4bb7473
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/putwc.c
@@ -0,0 +1,7 @@
+#include "stdio_impl.h"
+#include <wchar.h>
+
+wint_t putwc(wchar_t c, FILE *f)
+{
+ return fputwc(c, f);
+}
diff --git a/libc-top-half/musl/src/stdio/putwchar.c b/libc-top-half/musl/src/stdio/putwchar.c
new file mode 100644
index 0000000..b249c4a
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/putwchar.c
@@ -0,0 +1,9 @@
+#include "stdio_impl.h"
+#include <wchar.h>
+
+wint_t putwchar(wchar_t c)
+{
+ return fputwc(c, stdout);
+}
+
+weak_alias(putwchar, putwchar_unlocked);
diff --git a/libc-top-half/musl/src/stdio/remove.c b/libc-top-half/musl/src/stdio/remove.c
new file mode 100644
index 0000000..942e301
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/remove.c
@@ -0,0 +1,19 @@
+#include <stdio.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int remove(const char *path)
+{
+#ifdef SYS_unlink
+ int r = __syscall(SYS_unlink, path);
+#else
+ int r = __syscall(SYS_unlinkat, AT_FDCWD, path, 0);
+#endif
+#ifdef SYS_rmdir
+ if (r==-EISDIR) r = __syscall(SYS_rmdir, path);
+#else
+ if (r==-EISDIR) r = __syscall(SYS_unlinkat, AT_FDCWD, path, AT_REMOVEDIR);
+#endif
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/stdio/rename.c b/libc-top-half/musl/src/stdio/rename.c
new file mode 100644
index 0000000..f540adb
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/rename.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int rename(const char *old, const char *new)
+{
+#if defined(SYS_rename)
+ return syscall(SYS_rename, old, new);
+#elif defined(SYS_renameat)
+ return syscall(SYS_renameat, AT_FDCWD, old, AT_FDCWD, new);
+#else
+ return syscall(SYS_renameat2, AT_FDCWD, old, AT_FDCWD, new, 0);
+#endif
+}
diff --git a/libc-top-half/musl/src/stdio/rewind.c b/libc-top-half/musl/src/stdio/rewind.c
new file mode 100644
index 0000000..6f4b58b
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/rewind.c
@@ -0,0 +1,9 @@
+#include "stdio_impl.h"
+
+void rewind(FILE *f)
+{
+ FLOCK(f);
+ __fseeko_unlocked(f, 0, SEEK_SET);
+ f->flags &= ~F_ERR;
+ FUNLOCK(f);
+}
diff --git a/libc-top-half/musl/src/stdio/scanf.c b/libc-top-half/musl/src/stdio/scanf.c
new file mode 100644
index 0000000..bd77699
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/scanf.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+int scanf(const char *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vscanf(fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+weak_alias(scanf,__isoc99_scanf);
diff --git a/libc-top-half/musl/src/stdio/setbuf.c b/libc-top-half/musl/src/stdio/setbuf.c
new file mode 100644
index 0000000..74ad783
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/setbuf.c
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+void setbuf(FILE *restrict f, char *restrict buf)
+{
+ setvbuf(f, buf, buf ? _IOFBF : _IONBF, BUFSIZ);
+}
diff --git a/libc-top-half/musl/src/stdio/setbuffer.c b/libc-top-half/musl/src/stdio/setbuffer.c
new file mode 100644
index 0000000..71233d2
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/setbuffer.c
@@ -0,0 +1,7 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+
+void setbuffer(FILE *f, char *buf, size_t size)
+{
+ setvbuf(f, buf, buf ? _IOFBF : _IONBF, size);
+}
diff --git a/libc-top-half/musl/src/stdio/setlinebuf.c b/libc-top-half/musl/src/stdio/setlinebuf.c
new file mode 100644
index 0000000..b93c4d6
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/setlinebuf.c
@@ -0,0 +1,7 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+
+void setlinebuf(FILE *f)
+{
+ setvbuf(f, 0, _IOLBF, 0);
+}
diff --git a/libc-top-half/musl/src/stdio/setvbuf.c b/libc-top-half/musl/src/stdio/setvbuf.c
new file mode 100644
index 0000000..523dddc
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/setvbuf.c
@@ -0,0 +1,29 @@
+#include "stdio_impl.h"
+
+/* The behavior of this function is undefined except when it is the first
+ * operation on the stream, so the presence or absence of locking is not
+ * observable in a program whose behavior is defined. Thus no locking is
+ * performed here. No allocation of buffers is performed, but a buffer
+ * provided by the caller is used as long as it is suitably sized. */
+
+int setvbuf(FILE *restrict f, char *restrict buf, int type, size_t size)
+{
+ f->lbf = EOF;
+
+ if (type == _IONBF) {
+ f->buf_size = 0;
+ } else if (type == _IOLBF || type == _IOFBF) {
+ if (buf && size >= UNGET) {
+ f->buf = (void *)(buf + UNGET);
+ f->buf_size = size - UNGET;
+ }
+ if (type == _IOLBF && f->buf_size)
+ f->lbf = '\n';
+ } else {
+ return -1;
+ }
+
+ f->flags |= F_SVB;
+
+ return 0;
+}
diff --git a/libc-top-half/musl/src/stdio/snprintf.c b/libc-top-half/musl/src/stdio/snprintf.c
new file mode 100644
index 0000000..771503b
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/snprintf.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+int snprintf(char *restrict s, size_t n, const char *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vsnprintf(s, n, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
diff --git a/libc-top-half/musl/src/stdio/sprintf.c b/libc-top-half/musl/src/stdio/sprintf.c
new file mode 100644
index 0000000..9dff524
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/sprintf.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+int sprintf(char *restrict s, const char *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vsprintf(s, fmt, ap);
+ va_end(ap);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/stdio/sscanf.c b/libc-top-half/musl/src/stdio/sscanf.c
new file mode 100644
index 0000000..f2ac2f5
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/sscanf.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+int sscanf(const char *restrict s, const char *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vsscanf(s, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+weak_alias(sscanf,__isoc99_sscanf);
diff --git a/libc-top-half/musl/src/stdio/stderr.c b/libc-top-half/musl/src/stdio/stderr.c
new file mode 100644
index 0000000..5f24549
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/stderr.c
@@ -0,0 +1,20 @@
+#include "stdio_impl.h"
+
+#undef stderr
+
+static unsigned char buf[UNGET];
+hidden FILE __stderr_FILE = {
+ .buf = buf+UNGET,
+ .buf_size = 0,
+ .fd = 2,
+ .flags = F_PERM | F_NORD,
+ .lbf = -1,
+ .write = __stdio_write,
+ .seek = __stdio_seek,
+ .close = __stdio_close,
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ .lock = -1,
+#endif
+};
+FILE *const stderr = &__stderr_FILE;
+FILE *volatile __stderr_used = &__stderr_FILE;
diff --git a/libc-top-half/musl/src/stdio/stdin.c b/libc-top-half/musl/src/stdio/stdin.c
new file mode 100644
index 0000000..68e1c3f
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/stdin.c
@@ -0,0 +1,19 @@
+#include "stdio_impl.h"
+
+#undef stdin
+
+static unsigned char buf[BUFSIZ+UNGET];
+hidden FILE __stdin_FILE = {
+ .buf = buf+UNGET,
+ .buf_size = sizeof buf-UNGET,
+ .fd = 0,
+ .flags = F_PERM | F_NOWR,
+ .read = __stdio_read,
+ .seek = __stdio_seek,
+ .close = __stdio_close,
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ .lock = -1,
+#endif
+};
+FILE *const stdin = &__stdin_FILE;
+FILE *volatile __stdin_used = &__stdin_FILE;
diff --git a/libc-top-half/musl/src/stdio/stdout.c b/libc-top-half/musl/src/stdio/stdout.c
new file mode 100644
index 0000000..e0e2bce
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/stdout.c
@@ -0,0 +1,20 @@
+#include "stdio_impl.h"
+
+#undef stdout
+
+static unsigned char buf[BUFSIZ+UNGET];
+hidden FILE __stdout_FILE = {
+ .buf = buf+UNGET,
+ .buf_size = sizeof buf-UNGET,
+ .fd = 1,
+ .flags = F_PERM | F_NORD,
+ .lbf = '\n',
+ .write = __stdout_write,
+ .seek = __stdio_seek,
+ .close = __stdio_close,
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ .lock = -1,
+#endif
+};
+FILE *const stdout = &__stdout_FILE;
+FILE *volatile __stdout_used = &__stdout_FILE;
diff --git a/libc-top-half/musl/src/stdio/swprintf.c b/libc-top-half/musl/src/stdio/swprintf.c
new file mode 100644
index 0000000..f75eb11
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/swprintf.c
@@ -0,0 +1,13 @@
+#include <stdarg.h>
+#include <wchar.h>
+
+int swprintf(wchar_t *restrict s, size_t n, const wchar_t *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vswprintf(s, n, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
diff --git a/libc-top-half/musl/src/stdio/swscanf.c b/libc-top-half/musl/src/stdio/swscanf.c
new file mode 100644
index 0000000..03d572d
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/swscanf.c
@@ -0,0 +1,14 @@
+#include <stdarg.h>
+#include <wchar.h>
+
+int swscanf(const wchar_t *restrict s, const wchar_t *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vswscanf(s, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+weak_alias(swscanf,__isoc99_swscanf);
diff --git a/libc-top-half/musl/src/stdio/tempnam.c b/libc-top-half/musl/src/stdio/tempnam.c
new file mode 100644
index 0000000..565df6b
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/tempnam.c
@@ -0,0 +1,49 @@
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <limits.h>
+#include <string.h>
+#include <stdlib.h>
+#include "syscall.h"
+#include "kstat.h"
+
+#define MAXTRIES 100
+
+char *tempnam(const char *dir, const char *pfx)
+{
+ char s[PATH_MAX];
+ size_t l, dl, pl;
+ int try;
+ int r;
+
+ if (!dir) dir = P_tmpdir;
+ if (!pfx) pfx = "temp";
+
+ dl = strlen(dir);
+ pl = strlen(pfx);
+ l = dl + 1 + pl + 1 + 6;
+
+ if (l >= PATH_MAX) {
+ errno = ENAMETOOLONG;
+ return 0;
+ }
+
+ memcpy(s, dir, dl);
+ s[dl] = '/';
+ memcpy(s+dl+1, pfx, pl);
+ s[dl+1+pl] = '_';
+ s[l] = 0;
+
+ for (try=0; try<MAXTRIES; try++) {
+ __randname(s+l-6);
+#ifdef SYS_lstat
+ r = __syscall(SYS_lstat, s, &(struct kstat){0});
+#else
+ r = __syscall(SYS_fstatat, AT_FDCWD, s,
+ &(struct kstat){0}, AT_SYMLINK_NOFOLLOW);
+#endif
+ if (r == -ENOENT) return strdup(s);
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/stdio/tmpfile.c b/libc-top-half/musl/src/stdio/tmpfile.c
new file mode 100644
index 0000000..ae49398
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/tmpfile.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include "stdio_impl.h"
+
+#define MAXTRIES 100
+
+FILE *tmpfile(void)
+{
+ char s[] = "/tmp/tmpfile_XXXXXX";
+ int fd;
+ FILE *f;
+ int try;
+ for (try=0; try<MAXTRIES; try++) {
+ __randname(s+13);
+ fd = sys_open(s, O_RDWR|O_CREAT|O_EXCL, 0600);
+ if (fd >= 0) {
+#ifdef SYS_unlink
+ __syscall(SYS_unlink, s);
+#else
+ __syscall(SYS_unlinkat, AT_FDCWD, s, 0);
+#endif
+ f = __fdopen(fd, "w+");
+ if (!f) __syscall(SYS_close, fd);
+ return f;
+ }
+ }
+ return 0;
+}
+
+weak_alias(tmpfile, tmpfile64);
diff --git a/libc-top-half/musl/src/stdio/tmpnam.c b/libc-top-half/musl/src/stdio/tmpnam.c
new file mode 100644
index 0000000..d667a83
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/tmpnam.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <stdlib.h>
+#include "syscall.h"
+#include "kstat.h"
+
+#define MAXTRIES 100
+
+char *tmpnam(char *buf)
+{
+ static char internal[L_tmpnam];
+ char s[] = "/tmp/tmpnam_XXXXXX";
+ int try;
+ int r;
+ for (try=0; try<MAXTRIES; try++) {
+ __randname(s+12);
+#ifdef SYS_lstat
+ r = __syscall(SYS_lstat, s, &(struct kstat){0});
+#else
+ r = __syscall(SYS_fstatat, AT_FDCWD, s,
+ &(struct kstat){0}, AT_SYMLINK_NOFOLLOW);
+#endif
+ if (r == -ENOENT) return strcpy(buf ? buf : internal, s);
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/stdio/ungetc.c b/libc-top-half/musl/src/stdio/ungetc.c
new file mode 100644
index 0000000..bc629d4
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/ungetc.c
@@ -0,0 +1,20 @@
+#include "stdio_impl.h"
+
+int ungetc(int c, FILE *f)
+{
+ if (c == EOF) return c;
+
+ FLOCK(f);
+
+ if (!f->rpos) __toread(f);
+ if (!f->rpos || f->rpos <= f->buf - UNGET) {
+ FUNLOCK(f);
+ return EOF;
+ }
+
+ *--f->rpos = c;
+ f->flags &= ~F_EOF;
+
+ FUNLOCK(f);
+ return (unsigned char)c;
+}
diff --git a/libc-top-half/musl/src/stdio/ungetwc.c b/libc-top-half/musl/src/stdio/ungetwc.c
new file mode 100644
index 0000000..9edf366
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/ungetwc.c
@@ -0,0 +1,35 @@
+#include "stdio_impl.h"
+#include "locale_impl.h"
+#include <wchar.h>
+#include <limits.h>
+#include <ctype.h>
+#include <string.h>
+
+wint_t ungetwc(wint_t c, FILE *f)
+{
+ unsigned char mbc[MB_LEN_MAX];
+ int l;
+ locale_t *ploc = &CURRENT_LOCALE, loc = *ploc;
+
+ FLOCK(f);
+
+ if (f->mode <= 0) fwide(f, 1);
+ *ploc = f->locale;
+
+ if (!f->rpos) __toread(f);
+ if (!f->rpos || c == WEOF || (l = wcrtomb((void *)mbc, c, 0)) < 0 ||
+ f->rpos < f->buf - UNGET + l) {
+ FUNLOCK(f);
+ *ploc = loc;
+ return WEOF;
+ }
+
+ if (isascii(c)) *--f->rpos = c;
+ else memcpy(f->rpos -= l, mbc, l);
+
+ f->flags &= ~F_EOF;
+
+ FUNLOCK(f);
+ *ploc = loc;
+ return c;
+}
diff --git a/libc-top-half/musl/src/stdio/vasprintf.c b/libc-top-half/musl/src/stdio/vasprintf.c
new file mode 100644
index 0000000..08251bc
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vasprintf.c
@@ -0,0 +1,15 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+int vasprintf(char **s, const char *fmt, va_list ap)
+{
+ va_list ap2;
+ va_copy(ap2, ap);
+ int l = vsnprintf(0, 0, fmt, ap2);
+ va_end(ap2);
+
+ if (l<0 || !(*s=malloc(l+1U))) return -1;
+ return vsnprintf(*s, l+1U, fmt, ap);
+}
diff --git a/libc-top-half/musl/src/stdio/vdprintf.c b/libc-top-half/musl/src/stdio/vdprintf.c
new file mode 100644
index 0000000..cef0a1a
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vdprintf.c
@@ -0,0 +1,13 @@
+#include "stdio_impl.h"
+
+int vdprintf(int fd, const char *restrict fmt, va_list ap)
+{
+ FILE f = {
+ .fd = fd, .lbf = EOF, .write = __stdio_write,
+ .buf = (void *)fmt, .buf_size = 0,
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ .lock = -1
+#endif
+ };
+ return vfprintf(&f, fmt, ap);
+}
diff --git a/libc-top-half/musl/src/stdio/vfprintf.c b/libc-top-half/musl/src/stdio/vfprintf.c
new file mode 100644
index 0000000..7da2e50
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vfprintf.c
@@ -0,0 +1,737 @@
+#include "stdio_impl.h"
+#include <errno.h>
+#include <ctype.h>
+#include <limits.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <inttypes.h>
+#include <math.h>
+#include <float.h>
+#ifdef __wasilibc_unmodified_upstream // Changes to optimize printf/scanf when long double isn't needed
+#else
+#include "printscan.h"
+#endif
+
+/* Some useful macros */
+
+#define MAX(a,b) ((a)>(b) ? (a) : (b))
+#define MIN(a,b) ((a)<(b) ? (a) : (b))
+
+/* Convenient bit representation for modifier flags, which all fall
+ * within 31 codepoints of the space character. */
+
+#define ALT_FORM (1U<<'#'-' ')
+#define ZERO_PAD (1U<<'0'-' ')
+#define LEFT_ADJ (1U<<'-'-' ')
+#define PAD_POS (1U<<' '-' ')
+#define MARK_POS (1U<<'+'-' ')
+#define GROUPED (1U<<'\''-' ')
+
+#define FLAGMASK (ALT_FORM|ZERO_PAD|LEFT_ADJ|PAD_POS|MARK_POS|GROUPED)
+
+/* State machine to accept length modifiers + conversion specifiers.
+ * Result is 0 on failure, or an argument type to pop on success. */
+
+enum {
+ BARE, LPRE, LLPRE, HPRE, HHPRE, BIGLPRE,
+ ZTPRE, JPRE,
+ STOP,
+ PTR, INT, UINT, ULLONG,
+ LONG, ULONG,
+ SHORT, USHORT, CHAR, UCHAR,
+ LLONG, SIZET, IMAX, UMAX, PDIFF, UIPTR,
+ DBL, LDBL,
+ NOARG,
+ MAXSTATE
+};
+
+#define S(x) [(x)-'A']
+
+static const unsigned char states[]['z'-'A'+1] = {
+ { /* 0: bare types */
+ S('d') = INT, S('i') = INT,
+ S('o') = UINT, S('u') = UINT, S('x') = UINT, S('X') = UINT,
+ S('e') = DBL, S('f') = DBL, S('g') = DBL, S('a') = DBL,
+ S('E') = DBL, S('F') = DBL, S('G') = DBL, S('A') = DBL,
+ S('c') = CHAR, S('C') = INT,
+ S('s') = PTR, S('S') = PTR, S('p') = UIPTR, S('n') = PTR,
+ S('m') = NOARG,
+ S('l') = LPRE, S('h') = HPRE, S('L') = BIGLPRE,
+ S('z') = ZTPRE, S('j') = JPRE, S('t') = ZTPRE,
+ }, { /* 1: l-prefixed */
+ S('d') = LONG, S('i') = LONG,
+ S('o') = ULONG, S('u') = ULONG, S('x') = ULONG, S('X') = ULONG,
+ S('e') = DBL, S('f') = DBL, S('g') = DBL, S('a') = DBL,
+ S('E') = DBL, S('F') = DBL, S('G') = DBL, S('A') = DBL,
+ S('c') = INT, S('s') = PTR, S('n') = PTR,
+ S('l') = LLPRE,
+ }, { /* 2: ll-prefixed */
+ S('d') = LLONG, S('i') = LLONG,
+ S('o') = ULLONG, S('u') = ULLONG,
+ S('x') = ULLONG, S('X') = ULLONG,
+ S('n') = PTR,
+ }, { /* 3: h-prefixed */
+ S('d') = SHORT, S('i') = SHORT,
+ S('o') = USHORT, S('u') = USHORT,
+ S('x') = USHORT, S('X') = USHORT,
+ S('n') = PTR,
+ S('h') = HHPRE,
+ }, { /* 4: hh-prefixed */
+ S('d') = CHAR, S('i') = CHAR,
+ S('o') = UCHAR, S('u') = UCHAR,
+ S('x') = UCHAR, S('X') = UCHAR,
+ S('n') = PTR,
+ }, { /* 5: L-prefixed */
+ S('e') = LDBL, S('f') = LDBL, S('g') = LDBL, S('a') = LDBL,
+ S('E') = LDBL, S('F') = LDBL, S('G') = LDBL, S('A') = LDBL,
+ S('n') = PTR,
+ }, { /* 6: z- or t-prefixed (assumed to be same size) */
+ S('d') = PDIFF, S('i') = PDIFF,
+ S('o') = SIZET, S('u') = SIZET,
+ S('x') = SIZET, S('X') = SIZET,
+ S('n') = PTR,
+ }, { /* 7: j-prefixed */
+ S('d') = IMAX, S('i') = IMAX,
+ S('o') = UMAX, S('u') = UMAX,
+ S('x') = UMAX, S('X') = UMAX,
+ S('n') = PTR,
+ }
+};
+
+#define OOB(x) ((unsigned)(x)-'A' > 'z'-'A')
+
+union arg
+{
+ uintmax_t i;
+#if !defined(__wasilibc_printscan_no_floating_point)
+#if defined(__wasilibc_printscan_no_long_double)
+ long_double f;
+#else
+ long double f;
+#endif
+#endif
+ void *p;
+};
+
+static void pop_arg(union arg *arg, int type, va_list *ap)
+{
+ switch (type) {
+ case PTR: arg->p = va_arg(*ap, void *);
+ break; case INT: arg->i = va_arg(*ap, int);
+ break; case UINT: arg->i = va_arg(*ap, unsigned int);
+ break; case LONG: arg->i = va_arg(*ap, long);
+ break; case ULONG: arg->i = va_arg(*ap, unsigned long);
+ break; case ULLONG: arg->i = va_arg(*ap, unsigned long long);
+ break; case SHORT: arg->i = (short)va_arg(*ap, int);
+ break; case USHORT: arg->i = (unsigned short)va_arg(*ap, int);
+ break; case CHAR: arg->i = (signed char)va_arg(*ap, int);
+ break; case UCHAR: arg->i = (unsigned char)va_arg(*ap, int);
+ break; case LLONG: arg->i = va_arg(*ap, long long);
+ break; case SIZET: arg->i = va_arg(*ap, size_t);
+ break; case IMAX: arg->i = va_arg(*ap, intmax_t);
+ break; case UMAX: arg->i = va_arg(*ap, uintmax_t);
+ break; case PDIFF: arg->i = va_arg(*ap, ptrdiff_t);
+ break; case UIPTR: arg->i = (uintptr_t)va_arg(*ap, void *);
+#if defined(__wasilibc_printscan_no_floating_point)
+ break; case DBL:
+ case LDBL:
+ floating_point_not_supported();
+#else
+ break; case DBL: arg->f = va_arg(*ap, double);
+#if defined(__wasilibc_printscan_no_long_double)
+ break; case LDBL: long_double_not_supported();
+#else
+ break; case LDBL: arg->f = va_arg(*ap, long double);
+#endif
+#endif
+ }
+}
+
+static void out(FILE *f, const char *s, size_t l)
+{
+ if (!(f->flags & F_ERR)) __fwritex((void *)s, l, f);
+}
+
+static void pad(FILE *f, char c, int w, int l, int fl)
+{
+ char pad[256];
+ if (fl & (LEFT_ADJ | ZERO_PAD) || l >= w) return;
+ l = w - l;
+ memset(pad, c, l>sizeof pad ? sizeof pad : l);
+ for (; l >= sizeof pad; l -= sizeof pad)
+ out(f, pad, sizeof pad);
+ out(f, pad, l);
+}
+
+static const char xdigits[16] = {
+ "0123456789ABCDEF"
+};
+
+static char *fmt_x(uintmax_t x, char *s, int lower)
+{
+ for (; x; x>>=4) *--s = xdigits[(x&15)]|lower;
+ return s;
+}
+
+static char *fmt_o(uintmax_t x, char *s)
+{
+ for (; x; x>>=3) *--s = '0' + (x&7);
+ return s;
+}
+
+static char *fmt_u(uintmax_t x, char *s)
+{
+ unsigned long y;
+ for ( ; x>ULONG_MAX; x/=10) *--s = '0' + x%10;
+ for (y=x; y; y/=10) *--s = '0' + y%10;
+ return s;
+}
+
+#if !defined(__wasilibc_printscan_no_floating_point)
+/* Do not override this check. The floating point printing code below
+ * depends on the float.h constants being right. If they are wrong, it
+ * may overflow the stack. */
+#if LDBL_MANT_DIG == 53
+#if defined(__wasilibc_printscan_no_long_double)
+typedef char compiler_defines_long_double_incorrectly[9-(int)sizeof(long_double)];
+#else
+typedef char compiler_defines_long_double_incorrectly[9-(int)sizeof(long double)];
+#endif
+#endif
+
+#if defined(__wasilibc_printscan_no_long_double)
+static int fmt_fp(FILE *f, long_double y, int w, int p, int fl, int t)
+#else
+static int fmt_fp(FILE *f, long double y, int w, int p, int fl, int t)
+#endif
+{
+ uint32_t big[(LDBL_MANT_DIG+28)/29 + 1 // mantissa expansion
+ + (LDBL_MAX_EXP+LDBL_MANT_DIG+28+8)/9]; // exponent expansion
+ uint32_t *a, *d, *r, *z;
+ int e2=0, e, i, j, l;
+ char buf[9+LDBL_MANT_DIG/4], *s;
+ const char *prefix="-0X+0X 0X-0x+0x 0x";
+ int pl;
+ char ebuf0[3*sizeof(int)], *ebuf=&ebuf0[3*sizeof(int)], *estr;
+
+ pl=1;
+ if (signbit(y)) {
+ y=-y;
+ } else if (fl & MARK_POS) {
+ prefix+=3;
+ } else if (fl & PAD_POS) {
+ prefix+=6;
+ } else prefix++, pl=0;
+
+ if (!isfinite(y)) {
+ char *s = (t&32)?"inf":"INF";
+ if (y!=y) s=(t&32)?"nan":"NAN";
+ pad(f, ' ', w, 3+pl, fl&~ZERO_PAD);
+ out(f, prefix, pl);
+ out(f, s, 3);
+ pad(f, ' ', w, 3+pl, fl^LEFT_ADJ);
+ return MAX(w, 3+pl);
+ }
+
+ y = frexpl(y, &e2) * 2;
+ if (y) e2--;
+
+ if ((t|32)=='a') {
+#if defined(__wasilibc_printscan_no_long_double)
+ long_double round = 8.0;
+#else
+ long double round = 8.0;
+#endif
+ int re;
+
+ if (t&32) prefix += 9;
+ pl += 2;
+
+ if (p<0 || p>=LDBL_MANT_DIG/4-1) re=0;
+ else re=LDBL_MANT_DIG/4-1-p;
+
+ if (re) {
+ round *= 1<<(LDBL_MANT_DIG%4);
+ while (re--) round*=16;
+ if (*prefix=='-') {
+ y=-y;
+ y-=round;
+ y+=round;
+ y=-y;
+ } else {
+ y+=round;
+ y-=round;
+ }
+ }
+
+ estr=fmt_u(e2<0 ? -e2 : e2, ebuf);
+ if (estr==ebuf) *--estr='0';
+ *--estr = (e2<0 ? '-' : '+');
+ *--estr = t+('p'-'a');
+
+ s=buf;
+ do {
+ int x=y;
+ *s++=xdigits[x]|(t&32);
+ y=16*(y-x);
+ if (s-buf==1 && (y||p>0||(fl&ALT_FORM))) *s++='.';
+ } while (y);
+
+ if (p > INT_MAX-2-(ebuf-estr)-pl)
+ return -1;
+ if (p && s-buf-2 < p)
+ l = (p+2) + (ebuf-estr);
+ else
+ l = (s-buf) + (ebuf-estr);
+
+ pad(f, ' ', w, pl+l, fl);
+ out(f, prefix, pl);
+ pad(f, '0', w, pl+l, fl^ZERO_PAD);
+ out(f, buf, s-buf);
+ pad(f, '0', l-(ebuf-estr)-(s-buf), 0, 0);
+ out(f, estr, ebuf-estr);
+ pad(f, ' ', w, pl+l, fl^LEFT_ADJ);
+ return MAX(w, pl+l);
+ }
+ if (p<0) p=6;
+
+ if (y) y *= 0x1p28, e2-=28;
+
+ if (e2<0) a=r=z=big;
+ else a=r=z=big+sizeof(big)/sizeof(*big) - LDBL_MANT_DIG - 1;
+
+ do {
+ *z = y;
+ y = 1000000000*(y-*z++);
+ } while (y);
+
+ while (e2>0) {
+ uint32_t carry=0;
+ int sh=MIN(29,e2);
+ for (d=z-1; d>=a; d--) {
+ uint64_t x = ((uint64_t)*d<<sh)+carry;
+ *d = x % 1000000000;
+ carry = x / 1000000000;
+ }
+ if (carry) *--a = carry;
+ while (z>a && !z[-1]) z--;
+ e2-=sh;
+ }
+ while (e2<0) {
+ uint32_t carry=0, *b;
+ int sh=MIN(9,-e2), need=1+(p+LDBL_MANT_DIG/3U+8)/9;
+ for (d=a; d<z; d++) {
+ uint32_t rm = *d & (1<<sh)-1;
+ *d = (*d>>sh) + carry;
+ carry = (1000000000>>sh) * rm;
+ }
+ if (!*a) a++;
+ if (carry) *z++ = carry;
+ /* Avoid (slow!) computation past requested precision */
+ b = (t|32)=='f' ? r : a;
+ if (z-b > need) z = b+need;
+ e2+=sh;
+ }
+
+ if (a<z) for (i=10, e=9*(r-a); *a>=i; i*=10, e++);
+ else e=0;
+
+ /* Perform rounding: j is precision after the radix (possibly neg) */
+ j = p - ((t|32)!='f')*e - ((t|32)=='g' && p);
+ if (j < 9*(z-r-1)) {
+ uint32_t x;
+ /* We avoid C's broken division of negative numbers */
+ d = r + 1 + ((j+9*LDBL_MAX_EXP)/9 - LDBL_MAX_EXP);
+ j += 9*LDBL_MAX_EXP;
+ j %= 9;
+ for (i=10, j++; j<9; i*=10, j++);
+ x = *d % i;
+ /* Are there any significant digits past j? */
+ if (x || d+1!=z) {
+#if defined(__wasilibc_printscan_no_long_double)
+ long_double round = 2/LDBL_EPSILON;
+ long_double small;
+#else
+ long double round = 2/LDBL_EPSILON;
+ long double small;
+#endif
+ if ((*d/i & 1) || (i==1000000000 && d>a && (d[-1]&1)))
+ round += 2;
+ if (x<i/2) small=0x0.8p0;
+ else if (x==i/2 && d+1==z) small=0x1.0p0;
+ else small=0x1.8p0;
+ if (pl && *prefix=='-') round*=-1, small*=-1;
+ *d -= x;
+ /* Decide whether to round by probing round+small */
+ if (round+small != round) {
+ *d = *d + i;
+ while (*d > 999999999) {
+ *d--=0;
+ if (d<a) *--a=0;
+ (*d)++;
+ }
+ for (i=10, e=9*(r-a); *a>=i; i*=10, e++);
+ }
+ }
+ if (z>d+1) z=d+1;
+ }
+ for (; z>a && !z[-1]; z--);
+
+ if ((t|32)=='g') {
+ if (!p) p++;
+ if (p>e && e>=-4) {
+ t--;
+ p-=e+1;
+ } else {
+ t-=2;
+ p--;
+ }
+ if (!(fl&ALT_FORM)) {
+ /* Count trailing zeros in last place */
+ if (z>a && z[-1]) for (i=10, j=0; z[-1]%i==0; i*=10, j++);
+ else j=9;
+ if ((t|32)=='f')
+ p = MIN(p,MAX(0,9*(z-r-1)-j));
+ else
+ p = MIN(p,MAX(0,9*(z-r-1)+e-j));
+ }
+ }
+ if (p > INT_MAX-1-(p || (fl&ALT_FORM)))
+ return -1;
+ l = 1 + p + (p || (fl&ALT_FORM));
+ if ((t|32)=='f') {
+ if (e > INT_MAX-l) return -1;
+ if (e>0) l+=e;
+ } else {
+ estr=fmt_u(e<0 ? -e : e, ebuf);
+ while(ebuf-estr<2) *--estr='0';
+ *--estr = (e<0 ? '-' : '+');
+ *--estr = t;
+ if (ebuf-estr > INT_MAX-l) return -1;
+ l += ebuf-estr;
+ }
+
+ if (l > INT_MAX-pl) return -1;
+ pad(f, ' ', w, pl+l, fl);
+ out(f, prefix, pl);
+ pad(f, '0', w, pl+l, fl^ZERO_PAD);
+
+ if ((t|32)=='f') {
+ if (a>r) a=r;
+ for (d=a; d<=r; d++) {
+ char *s = fmt_u(*d, buf+9);
+ if (d!=a) while (s>buf) *--s='0';
+ else if (s==buf+9) *--s='0';
+ out(f, s, buf+9-s);
+ }
+ if (p || (fl&ALT_FORM)) out(f, ".", 1);
+ for (; d<z && p>0; d++, p-=9) {
+ char *s = fmt_u(*d, buf+9);
+ while (s>buf) *--s='0';
+ out(f, s, MIN(9,p));
+ }
+ pad(f, '0', p+9, 9, 0);
+ } else {
+ if (z<=a) z=a+1;
+ for (d=a; d<z && p>=0; d++) {
+ char *s = fmt_u(*d, buf+9);
+ if (s==buf+9) *--s='0';
+ if (d!=a) while (s>buf) *--s='0';
+ else {
+ out(f, s++, 1);
+ if (p>0||(fl&ALT_FORM)) out(f, ".", 1);
+ }
+ out(f, s, MIN(buf+9-s, p));
+ p -= buf+9-s;
+ }
+ pad(f, '0', p+18, 18, 0);
+ out(f, estr, ebuf-estr);
+ }
+
+ pad(f, ' ', w, pl+l, fl^LEFT_ADJ);
+
+ return MAX(w, pl+l);
+}
+#endif
+
+static int getint(char **s) {
+ int i;
+ for (i=0; isdigit(**s); (*s)++) {
+ if (i > INT_MAX/10U || **s-'0' > INT_MAX-10*i) i = -1;
+ else i = 10*i + (**s-'0');
+ }
+ return i;
+}
+
+static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg, int *nl_type)
+{
+ char *a, *z, *s=(char *)fmt;
+ unsigned l10n=0, fl;
+ int w, p, xp;
+ union arg arg;
+ int argpos;
+ unsigned st, ps;
+ int cnt=0, l=0;
+ size_t i;
+ char buf[sizeof(uintmax_t)*3+3+LDBL_MANT_DIG/4];
+ const char *prefix;
+ int t, pl;
+ wchar_t wc[2], *ws;
+ char mb[4];
+
+ for (;;) {
+ /* This error is only specified for snprintf, but since it's
+ * unspecified for other forms, do the same. Stop immediately
+ * on overflow; otherwise %n could produce wrong results. */
+ if (l > INT_MAX - cnt) goto overflow;
+
+ /* Update output count, end loop when fmt is exhausted */
+ cnt += l;
+ if (!*s) break;
+
+ /* Handle literal text and %% format specifiers */
+ for (a=s; *s && *s!='%'; s++);
+ for (z=s; s[0]=='%' && s[1]=='%'; z++, s+=2);
+ if (z-a > INT_MAX-cnt) goto overflow;
+ l = z-a;
+ if (f) out(f, a, l);
+ if (l) continue;
+
+ if (isdigit(s[1]) && s[2]=='$') {
+ l10n=1;
+ argpos = s[1]-'0';
+ s+=3;
+ } else {
+ argpos = -1;
+ s++;
+ }
+
+ /* Read modifier flags */
+ for (fl=0; (unsigned)*s-' '<32 && (FLAGMASK&(1U<<*s-' ')); s++)
+ fl |= 1U<<*s-' ';
+
+ /* Read field width */
+ if (*s=='*') {
+ if (isdigit(s[1]) && s[2]=='$') {
+ l10n=1;
+ nl_type[s[1]-'0'] = INT;
+ w = nl_arg[s[1]-'0'].i;
+ s+=3;
+ } else if (!l10n) {
+ w = f ? va_arg(*ap, int) : 0;
+ s++;
+ } else goto inval;
+ if (w<0) fl|=LEFT_ADJ, w=-w;
+ } else if ((w=getint(&s))<0) goto overflow;
+
+ /* Read precision */
+ if (*s=='.' && s[1]=='*') {
+ if (isdigit(s[2]) && s[3]=='$') {
+ nl_type[s[2]-'0'] = INT;
+ p = nl_arg[s[2]-'0'].i;
+ s+=4;
+ } else if (!l10n) {
+ p = f ? va_arg(*ap, int) : 0;
+ s+=2;
+ } else goto inval;
+ xp = (p>=0);
+ } else if (*s=='.') {
+ s++;
+ p = getint(&s);
+ xp = 1;
+ } else {
+ p = -1;
+ xp = 0;
+ }
+
+ /* Format specifier state machine */
+ st=0;
+ do {
+ if (OOB(*s)) goto inval;
+ ps=st;
+ st=states[st]S(*s++);
+ } while (st-1<STOP);
+ if (!st) goto inval;
+
+ /* Check validity of argument type (nl/normal) */
+ if (st==NOARG) {
+ if (argpos>=0) goto inval;
+ } else {
+ if (argpos>=0) nl_type[argpos]=st, arg=nl_arg[argpos];
+ else if (f) pop_arg(&arg, st, ap);
+ else return 0;
+ }
+
+ if (!f) continue;
+
+ z = buf + sizeof(buf);
+ prefix = "-+ 0X0x";
+ pl = 0;
+ t = s[-1];
+
+ /* Transform ls,lc -> S,C */
+ if (ps && (t&15)==3) t&=~32;
+
+ /* - and 0 flags are mutually exclusive */
+ if (fl & LEFT_ADJ) fl &= ~ZERO_PAD;
+
+ switch(t) {
+ case 'n':
+ switch(ps) {
+ case BARE: *(int *)arg.p = cnt; break;
+ case LPRE: *(long *)arg.p = cnt; break;
+ case LLPRE: *(long long *)arg.p = cnt; break;
+ case HPRE: *(unsigned short *)arg.p = cnt; break;
+ case HHPRE: *(unsigned char *)arg.p = cnt; break;
+ case ZTPRE: *(size_t *)arg.p = cnt; break;
+ case JPRE: *(uintmax_t *)arg.p = cnt; break;
+ }
+ continue;
+ case 'p':
+ p = MAX(p, 2*sizeof(void*));
+ t = 'x';
+ fl |= ALT_FORM;
+ case 'x': case 'X':
+ a = fmt_x(arg.i, z, t&32);
+ if (arg.i && (fl & ALT_FORM)) prefix+=(t>>4), pl=2;
+ if (0) {
+ case 'o':
+ a = fmt_o(arg.i, z);
+ if ((fl&ALT_FORM) && p<z-a+1) p=z-a+1;
+ } if (0) {
+ case 'd': case 'i':
+ pl=1;
+ if (arg.i>INTMAX_MAX) {
+ arg.i=-arg.i;
+ } else if (fl & MARK_POS) {
+ prefix++;
+ } else if (fl & PAD_POS) {
+ prefix+=2;
+ } else pl=0;
+ case 'u':
+ a = fmt_u(arg.i, z);
+ }
+ if (xp && p<0) goto overflow;
+ if (xp) fl &= ~ZERO_PAD;
+ if (!arg.i && !p) {
+ a=z;
+ break;
+ }
+ p = MAX(p, z-a + !arg.i);
+ break;
+ case 'c':
+ *(a=z-(p=1))=arg.i;
+ fl &= ~ZERO_PAD;
+ break;
+ case 'm':
+ if (1) a = strerror(errno); else
+ case 's':
+ a = arg.p ? arg.p : "(null)";
+ z = a + strnlen(a, p<0 ? INT_MAX : p);
+ if (p<0 && *z) goto overflow;
+ p = z-a;
+ fl &= ~ZERO_PAD;
+ break;
+ case 'C':
+ wc[0] = arg.i;
+ wc[1] = 0;
+ arg.p = wc;
+ p = -1;
+ case 'S':
+ ws = arg.p;
+ for (i=l=0; i<p && *ws && (l=wctomb(mb, *ws++))>=0 && l<=p-i; i+=l);
+ if (l<0) return -1;
+ if (i > INT_MAX) goto overflow;
+ p = i;
+ pad(f, ' ', w, p, fl);
+ ws = arg.p;
+ for (i=0; i<0U+p && *ws && i+(l=wctomb(mb, *ws++))<=p; i+=l)
+ out(f, mb, l);
+ pad(f, ' ', w, p, fl^LEFT_ADJ);
+ l = w>p ? w : p;
+ continue;
+#if !defined(__wasilibc_printscan_no_floating_point)
+ case 'e': case 'f': case 'g': case 'a':
+ case 'E': case 'F': case 'G': case 'A':
+ if (xp && p<0) goto overflow;
+ l = fmt_fp(f, arg.f, w, p, fl, t);
+ if (l<0) goto overflow;
+ continue;
+#endif
+ }
+
+ if (p < z-a) p = z-a;
+ if (p > INT_MAX-pl) goto overflow;
+ if (w < pl+p) w = pl+p;
+ if (w > INT_MAX-cnt) goto overflow;
+
+ pad(f, ' ', w, pl+p, fl);
+ out(f, prefix, pl);
+ pad(f, '0', w, pl+p, fl^ZERO_PAD);
+ pad(f, '0', p, z-a, 0);
+ out(f, a, z-a);
+ pad(f, ' ', w, pl+p, fl^LEFT_ADJ);
+
+ l = w;
+ }
+
+ if (f) return cnt;
+ if (!l10n) return 0;
+
+ for (i=1; i<=NL_ARGMAX && nl_type[i]; i++)
+ pop_arg(nl_arg+i, nl_type[i], ap);
+ for (; i<=NL_ARGMAX && !nl_type[i]; i++);
+ if (i<=NL_ARGMAX) goto inval;
+ return 1;
+
+inval:
+ errno = EINVAL;
+ return -1;
+overflow:
+ errno = EOVERFLOW;
+ return -1;
+}
+
+int vfprintf(FILE *restrict f, const char *restrict fmt, va_list ap)
+{
+ va_list ap2;
+ int nl_type[NL_ARGMAX+1] = {0};
+ union arg nl_arg[NL_ARGMAX+1];
+ unsigned char internal_buf[80], *saved_buf = 0;
+ int olderr;
+ int ret;
+
+ /* the copy allows passing va_list* even if va_list is an array */
+ va_copy(ap2, ap);
+ if (printf_core(0, fmt, &ap2, nl_arg, nl_type) < 0) {
+ va_end(ap2);
+ return -1;
+ }
+
+ FLOCK(f);
+ olderr = f->flags & F_ERR;
+ if (f->mode < 1) f->flags &= ~F_ERR;
+ if (!f->buf_size) {
+ saved_buf = f->buf;
+ f->buf = internal_buf;
+ f->buf_size = sizeof internal_buf;
+ f->wpos = f->wbase = f->wend = 0;
+ }
+ if (!f->wend && __towrite(f)) ret = -1;
+ else ret = printf_core(f, fmt, &ap2, nl_arg, nl_type);
+ if (saved_buf) {
+ f->write(f, 0, 0);
+ if (!f->wpos) ret = -1;
+ f->buf = saved_buf;
+ f->buf_size = 0;
+ f->wpos = f->wbase = f->wend = 0;
+ }
+ if (f->flags & F_ERR) ret = -1;
+ f->flags |= olderr;
+ FUNLOCK(f);
+ va_end(ap2);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/stdio/vfscanf.c b/libc-top-half/musl/src/stdio/vfscanf.c
new file mode 100644
index 0000000..b612bbd
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vfscanf.c
@@ -0,0 +1,351 @@
+#include <stdlib.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <wchar.h>
+#include <wctype.h>
+#include <limits.h>
+#include <string.h>
+#include <stdint.h>
+#ifdef __wasilibc_unmodified_upstream // Changes to optimize printf/scanf when long double isn't needed
+#else
+#include "printscan.h"
+#endif
+
+#include "stdio_impl.h"
+#include "shgetc.h"
+#include "intscan.h"
+#include "floatscan.h"
+
+#define SIZE_hh -2
+#define SIZE_h -1
+#define SIZE_def 0
+#define SIZE_l 1
+#define SIZE_L 2
+#define SIZE_ll 3
+
+static void store_int(void *dest, int size, unsigned long long i)
+{
+ if (!dest) return;
+ switch (size) {
+ case SIZE_hh:
+ *(char *)dest = i;
+ break;
+ case SIZE_h:
+ *(short *)dest = i;
+ break;
+ case SIZE_def:
+ *(int *)dest = i;
+ break;
+ case SIZE_l:
+ *(long *)dest = i;
+ break;
+ case SIZE_ll:
+ *(long long *)dest = i;
+ break;
+ }
+}
+
+static void *arg_n(va_list ap, unsigned int n)
+{
+ void *p;
+ unsigned int i;
+ va_list ap2;
+ va_copy(ap2, ap);
+ for (i=n; i>1; i--) va_arg(ap2, void *);
+ p = va_arg(ap2, void *);
+ va_end(ap2);
+ return p;
+}
+
+int vfscanf(FILE *restrict f, const char *restrict fmt, va_list ap)
+{
+ int width;
+ int size;
+ int alloc = 0;
+ int base;
+ const unsigned char *p;
+ int c, t;
+ char *s;
+ wchar_t *wcs;
+ mbstate_t st;
+ void *dest=NULL;
+ int invert;
+ int matches=0;
+ unsigned long long x;
+#if defined(__wasilibc_printscan_no_long_double)
+ long_double y;
+#else
+ long double y;
+#endif
+ off_t pos = 0;
+ unsigned char scanset[257];
+ size_t i, k;
+ wchar_t wc;
+
+ FLOCK(f);
+
+ if (!f->rpos) __toread(f);
+ if (!f->rpos) goto input_fail;
+
+ for (p=(const unsigned char *)fmt; *p; p++) {
+
+ alloc = 0;
+
+ if (isspace(*p)) {
+ while (isspace(p[1])) p++;
+ shlim(f, 0);
+ while (isspace(shgetc(f)));
+ shunget(f);
+ pos += shcnt(f);
+ continue;
+ }
+ if (*p != '%' || p[1] == '%') {
+ shlim(f, 0);
+ if (*p == '%') {
+ p++;
+ while (isspace((c=shgetc(f))));
+ } else {
+ c = shgetc(f);
+ }
+ if (c!=*p) {
+ shunget(f);
+ if (c<0) goto input_fail;
+ goto match_fail;
+ }
+ pos += shcnt(f);
+ continue;
+ }
+
+ p++;
+ if (*p=='*') {
+ dest = 0; p++;
+ } else if (isdigit(*p) && p[1]=='$') {
+ dest = arg_n(ap, *p-'0'); p+=2;
+ } else {
+ dest = va_arg(ap, void *);
+ }
+
+ for (width=0; isdigit(*p); p++) {
+ width = 10*width + *p - '0';
+ }
+
+ if (*p=='m') {
+ wcs = 0;
+ s = 0;
+ alloc = !!dest;
+ p++;
+ } else {
+ alloc = 0;
+ }
+
+ size = SIZE_def;
+ switch (*p++) {
+ case 'h':
+ if (*p == 'h') p++, size = SIZE_hh;
+ else size = SIZE_h;
+ break;
+ case 'l':
+ if (*p == 'l') p++, size = SIZE_ll;
+ else size = SIZE_l;
+ break;
+ case 'j':
+ size = SIZE_ll;
+ break;
+ case 'z':
+ case 't':
+ size = SIZE_l;
+ break;
+ case 'L':
+ size = SIZE_L;
+ break;
+ case 'd': case 'i': case 'o': case 'u': case 'x':
+ case 'a': case 'e': case 'f': case 'g':
+ case 'A': case 'E': case 'F': case 'G': case 'X':
+ case 's': case 'c': case '[':
+ case 'S': case 'C':
+ case 'p': case 'n':
+ p--;
+ break;
+ default:
+ goto fmt_fail;
+ }
+
+ t = *p;
+
+ /* C or S */
+ if ((t&0x2f) == 3) {
+ t |= 32;
+ size = SIZE_l;
+ }
+
+ switch (t) {
+ case 'c':
+ if (width < 1) width = 1;
+ case '[':
+ break;
+ case 'n':
+ store_int(dest, size, pos);
+ /* do not increment match count, etc! */
+ continue;
+ default:
+ shlim(f, 0);
+ while (isspace(shgetc(f)));
+ shunget(f);
+ pos += shcnt(f);
+ }
+
+ shlim(f, width);
+ if (shgetc(f) < 0) goto input_fail;
+ shunget(f);
+
+ switch (t) {
+ case 's':
+ case 'c':
+ case '[':
+ if (t == 'c' || t == 's') {
+ memset(scanset, -1, sizeof scanset);
+ scanset[0] = 0;
+ if (t == 's') {
+ scanset[1+'\t'] = 0;
+ scanset[1+'\n'] = 0;
+ scanset[1+'\v'] = 0;
+ scanset[1+'\f'] = 0;
+ scanset[1+'\r'] = 0;
+ scanset[1+' '] = 0;
+ }
+ } else {
+ if (*++p == '^') p++, invert = 1;
+ else invert = 0;
+ memset(scanset, invert, sizeof scanset);
+ scanset[0] = 0;
+ if (*p == '-') p++, scanset[1+'-'] = 1-invert;
+ else if (*p == ']') p++, scanset[1+']'] = 1-invert;
+ for (; *p != ']'; p++) {
+ if (!*p) goto fmt_fail;
+ if (*p=='-' && p[1] && p[1] != ']')
+ for (c=p++[-1]; c<*p; c++)
+ scanset[1+c] = 1-invert;
+ scanset[1+*p] = 1-invert;
+ }
+ }
+ wcs = 0;
+ s = 0;
+ i = 0;
+ k = t=='c' ? width+1U : 31;
+ if (size == SIZE_l) {
+ if (alloc) {
+ wcs = malloc(k*sizeof(wchar_t));
+ if (!wcs) goto alloc_fail;
+ } else {
+ wcs = dest;
+ }
+ st = (mbstate_t){0};
+ while (scanset[(c=shgetc(f))+1]) {
+ switch (mbrtowc(&wc, &(char){c}, 1, &st)) {
+ case -1:
+ goto input_fail;
+ case -2:
+ continue;
+ }
+ if (wcs) wcs[i++] = wc;
+ if (alloc && i==k) {
+ k+=k+1;
+ wchar_t *tmp = realloc(wcs, k*sizeof(wchar_t));
+ if (!tmp) goto alloc_fail;
+ wcs = tmp;
+ }
+ }
+ if (!mbsinit(&st)) goto input_fail;
+ } else if (alloc) {
+ s = malloc(k);
+ if (!s) goto alloc_fail;
+ while (scanset[(c=shgetc(f))+1]) {
+ s[i++] = c;
+ if (i==k) {
+ k+=k+1;
+ char *tmp = realloc(s, k);
+ if (!tmp) goto alloc_fail;
+ s = tmp;
+ }
+ }
+ } else if ((s = dest)) {
+ while (scanset[(c=shgetc(f))+1])
+ s[i++] = c;
+ } else {
+ while (scanset[(c=shgetc(f))+1]);
+ }
+ shunget(f);
+ if (!shcnt(f)) goto match_fail;
+ if (t == 'c' && shcnt(f) != width) goto match_fail;
+ if (alloc) {
+ if (size == SIZE_l) *(wchar_t **)dest = wcs;
+ else *(char **)dest = s;
+ }
+ if (t != 'c') {
+ if (wcs) wcs[i] = 0;
+ if (s) s[i] = 0;
+ }
+ break;
+ case 'p':
+ case 'X':
+ case 'x':
+ base = 16;
+ goto int_common;
+ case 'o':
+ base = 8;
+ goto int_common;
+ case 'd':
+ case 'u':
+ base = 10;
+ goto int_common;
+ case 'i':
+ base = 0;
+ int_common:
+ x = __intscan(f, base, 0, ULLONG_MAX);
+ if (!shcnt(f)) goto match_fail;
+ if (t=='p' && dest) *(void **)dest = (void *)(uintptr_t)x;
+ else store_int(dest, size, x);
+ break;
+ case 'a': case 'A':
+ case 'e': case 'E':
+ case 'f': case 'F':
+ case 'g': case 'G':
+ y = __floatscan(f, size, 0);
+ if (!shcnt(f)) goto match_fail;
+ if (dest) switch (size) {
+ case SIZE_def:
+ *(float *)dest = y;
+ break;
+ case SIZE_l:
+ *(double *)dest = y;
+ break;
+ case SIZE_L:
+#if defined(__wasilibc_printscan_no_long_double)
+ long_double_not_supported();
+#else
+ *(long double *)dest = y;
+#endif
+ break;
+ }
+ break;
+ }
+
+ pos += shcnt(f);
+ if (dest) matches++;
+ }
+ if (0) {
+fmt_fail:
+alloc_fail:
+input_fail:
+ if (!matches) matches--;
+match_fail:
+ if (alloc) {
+ free(s);
+ free(wcs);
+ }
+ }
+ FUNLOCK(f);
+ return matches;
+}
+
+weak_alias(vfscanf,__isoc99_vfscanf);
diff --git a/libc-top-half/musl/src/stdio/vfwprintf.c b/libc-top-half/musl/src/stdio/vfwprintf.c
new file mode 100644
index 0000000..e660fcc
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vfwprintf.c
@@ -0,0 +1,414 @@
+#include "stdio_impl.h"
+#include <errno.h>
+#include <ctype.h>
+#include <limits.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <inttypes.h>
+#ifdef __wasilibc_unmodified_upstream // Changes to optimize printf/scanf when long double isn't needed
+#else
+#include "printscan.h"
+#endif
+
+/* Convenient bit representation for modifier flags, which all fall
+ * within 31 codepoints of the space character. */
+
+#define ALT_FORM (1U<<'#'-' ')
+#define ZERO_PAD (1U<<'0'-' ')
+#define LEFT_ADJ (1U<<'-'-' ')
+#define PAD_POS (1U<<' '-' ')
+#define MARK_POS (1U<<'+'-' ')
+#define GROUPED (1U<<'\''-' ')
+
+#define FLAGMASK (ALT_FORM|ZERO_PAD|LEFT_ADJ|PAD_POS|MARK_POS|GROUPED)
+
+/* State machine to accept length modifiers + conversion specifiers.
+ * Result is 0 on failure, or an argument type to pop on success. */
+
+enum {
+ BARE, LPRE, LLPRE, HPRE, HHPRE, BIGLPRE,
+ ZTPRE, JPRE,
+ STOP,
+ PTR, INT, UINT, ULLONG,
+ LONG, ULONG,
+ SHORT, USHORT, CHAR, UCHAR,
+ LLONG, SIZET, IMAX, UMAX, PDIFF, UIPTR,
+ DBL, LDBL,
+ NOARG,
+ MAXSTATE
+};
+
+#define S(x) [(x)-'A']
+
+static const unsigned char states[]['z'-'A'+1] = {
+ { /* 0: bare types */
+ S('d') = INT, S('i') = INT,
+ S('o') = UINT, S('u') = UINT, S('x') = UINT, S('X') = UINT,
+ S('e') = DBL, S('f') = DBL, S('g') = DBL, S('a') = DBL,
+ S('E') = DBL, S('F') = DBL, S('G') = DBL, S('A') = DBL,
+ S('c') = CHAR, S('C') = INT,
+ S('s') = PTR, S('S') = PTR, S('p') = UIPTR, S('n') = PTR,
+ S('m') = NOARG,
+ S('l') = LPRE, S('h') = HPRE, S('L') = BIGLPRE,
+ S('z') = ZTPRE, S('j') = JPRE, S('t') = ZTPRE,
+ }, { /* 1: l-prefixed */
+ S('d') = LONG, S('i') = LONG,
+ S('o') = ULONG, S('u') = ULONG, S('x') = ULONG, S('X') = ULONG,
+ S('e') = DBL, S('f') = DBL, S('g') = DBL, S('a') = DBL,
+ S('E') = DBL, S('F') = DBL, S('G') = DBL, S('A') = DBL,
+ S('c') = INT, S('s') = PTR, S('n') = PTR,
+ S('l') = LLPRE,
+ }, { /* 2: ll-prefixed */
+ S('d') = LLONG, S('i') = LLONG,
+ S('o') = ULLONG, S('u') = ULLONG,
+ S('x') = ULLONG, S('X') = ULLONG,
+ S('n') = PTR,
+ }, { /* 3: h-prefixed */
+ S('d') = SHORT, S('i') = SHORT,
+ S('o') = USHORT, S('u') = USHORT,
+ S('x') = USHORT, S('X') = USHORT,
+ S('n') = PTR,
+ S('h') = HHPRE,
+ }, { /* 4: hh-prefixed */
+ S('d') = CHAR, S('i') = CHAR,
+ S('o') = UCHAR, S('u') = UCHAR,
+ S('x') = UCHAR, S('X') = UCHAR,
+ S('n') = PTR,
+ }, { /* 5: L-prefixed */
+ S('e') = LDBL, S('f') = LDBL, S('g') = LDBL, S('a') = LDBL,
+ S('E') = LDBL, S('F') = LDBL, S('G') = LDBL, S('A') = LDBL,
+ S('n') = PTR,
+ }, { /* 6: z- or t-prefixed (assumed to be same size) */
+ S('d') = PDIFF, S('i') = PDIFF,
+ S('o') = SIZET, S('u') = SIZET,
+ S('x') = SIZET, S('X') = SIZET,
+ S('n') = PTR,
+ }, { /* 7: j-prefixed */
+ S('d') = IMAX, S('i') = IMAX,
+ S('o') = UMAX, S('u') = UMAX,
+ S('x') = UMAX, S('X') = UMAX,
+ S('n') = PTR,
+ }
+};
+
+#define OOB(x) ((unsigned)(x)-'A' > 'z'-'A')
+
+union arg
+{
+ uintmax_t i;
+#if !defined(__wasilibc_printscan_no_floating_point)
+#if defined(__wasilibc_printscan_no_long_double)
+ long_double f;
+#else
+ long double f;
+#endif
+#endif
+ void *p;
+};
+
+static void pop_arg(union arg *arg, int type, va_list *ap)
+{
+ switch (type) {
+ case PTR: arg->p = va_arg(*ap, void *);
+ break; case INT: arg->i = va_arg(*ap, int);
+ break; case UINT: arg->i = va_arg(*ap, unsigned int);
+ break; case LONG: arg->i = va_arg(*ap, long);
+ break; case ULONG: arg->i = va_arg(*ap, unsigned long);
+ break; case ULLONG: arg->i = va_arg(*ap, unsigned long long);
+ break; case SHORT: arg->i = (short)va_arg(*ap, int);
+ break; case USHORT: arg->i = (unsigned short)va_arg(*ap, int);
+ break; case CHAR: arg->i = (signed char)va_arg(*ap, int);
+ break; case UCHAR: arg->i = (unsigned char)va_arg(*ap, int);
+ break; case LLONG: arg->i = va_arg(*ap, long long);
+ break; case SIZET: arg->i = va_arg(*ap, size_t);
+ break; case IMAX: arg->i = va_arg(*ap, intmax_t);
+ break; case UMAX: arg->i = va_arg(*ap, uintmax_t);
+ break; case PDIFF: arg->i = va_arg(*ap, ptrdiff_t);
+ break; case UIPTR: arg->i = (uintptr_t)va_arg(*ap, void *);
+#if defined(__wasilibc_printscan_no_floating_point)
+ break; case DBL:
+ break; case LDBL: floating_point_not_supported();
+#else
+ break; case DBL: arg->f = va_arg(*ap, double);
+#if defined(__wasilibc_printscan_no_long_double)
+ break; case LDBL: long_double_not_supported();
+#else
+ break; case LDBL: arg->f = va_arg(*ap, long double);
+#endif
+#endif
+ }
+}
+
+static void out(FILE *f, const wchar_t *s, size_t l)
+{
+ while (l-- && !(f->flags & F_ERR)) fputwc(*s++, f);
+}
+
+static int getint(wchar_t **s) {
+ int i;
+ for (i=0; iswdigit(**s); (*s)++) {
+ if (i > INT_MAX/10U || **s-'0' > INT_MAX-10*i) i = -1;
+ else i = 10*i + (**s-'0');
+ }
+ return i;
+}
+
+static const char sizeprefix['y'-'a'] = {
+['a'-'a']='L', ['e'-'a']='L', ['f'-'a']='L', ['g'-'a']='L',
+['d'-'a']='j', ['i'-'a']='j', ['o'-'a']='j', ['u'-'a']='j', ['x'-'a']='j',
+['p'-'a']='j'
+};
+
+static int wprintf_core(FILE *f, const wchar_t *fmt, va_list *ap, union arg *nl_arg, int *nl_type)
+{
+ wchar_t *a, *z, *s=(wchar_t *)fmt;
+ unsigned l10n=0, fl;
+ int w, p, xp;
+ union arg arg;
+ int argpos;
+ unsigned st, ps;
+ int cnt=0, l=0;
+ int i;
+ int t;
+ char *bs;
+ char charfmt[16];
+ wchar_t wc;
+
+ for (;;) {
+ /* This error is only specified for snprintf, but since it's
+ * unspecified for other forms, do the same. Stop immediately
+ * on overflow; otherwise %n could produce wrong results. */
+ if (l > INT_MAX - cnt) goto overflow;
+
+ /* Update output count, end loop when fmt is exhausted */
+ cnt += l;
+ if (!*s) break;
+
+ /* Handle literal text and %% format specifiers */
+ for (a=s; *s && *s!='%'; s++);
+ for (z=s; s[0]=='%' && s[1]=='%'; z++, s+=2);
+ if (z-a > INT_MAX-cnt) goto overflow;
+ l = z-a;
+ if (f) out(f, a, l);
+ if (l) continue;
+
+ if (iswdigit(s[1]) && s[2]=='$') {
+ l10n=1;
+ argpos = s[1]-'0';
+ s+=3;
+ } else {
+ argpos = -1;
+ s++;
+ }
+
+ /* Read modifier flags */
+ for (fl=0; (unsigned)*s-' '<32 && (FLAGMASK&(1U<<*s-' ')); s++)
+ fl |= 1U<<*s-' ';
+
+ /* Read field width */
+ if (*s=='*') {
+ if (iswdigit(s[1]) && s[2]=='$') {
+ l10n=1;
+ nl_type[s[1]-'0'] = INT;
+ w = nl_arg[s[1]-'0'].i;
+ s+=3;
+ } else if (!l10n) {
+ w = f ? va_arg(*ap, int) : 0;
+ s++;
+ } else goto inval;
+ if (w<0) fl|=LEFT_ADJ, w=-w;
+ } else if ((w=getint(&s))<0) goto overflow;
+
+ /* Read precision */
+ if (*s=='.' && s[1]=='*') {
+ if (isdigit(s[2]) && s[3]=='$') {
+ nl_type[s[2]-'0'] = INT;
+ p = nl_arg[s[2]-'0'].i;
+ s+=4;
+ } else if (!l10n) {
+ p = f ? va_arg(*ap, int) : 0;
+ s+=2;
+ } else goto inval;
+ xp = (p>=0);
+ } else if (*s=='.') {
+ s++;
+ p = getint(&s);
+ xp = 1;
+ } else {
+ p = -1;
+ xp = 0;
+ }
+
+ /* Format specifier state machine */
+ st=0;
+ do {
+ if (OOB(*s)) goto inval;
+ ps=st;
+ st=states[st]S(*s++);
+ } while (st-1<STOP);
+ if (!st) goto inval;
+
+ /* Check validity of argument type (nl/normal) */
+ if (st==NOARG) {
+ if (argpos>=0) goto inval;
+ } else {
+ if (argpos>=0) nl_type[argpos]=st, arg=nl_arg[argpos];
+ else if (f) pop_arg(&arg, st, ap);
+ else return 0;
+ }
+
+ if (!f) continue;
+ t = s[-1];
+ if (ps && (t&15)==3) t&=~32;
+
+ switch (t) {
+ case 'n':
+ switch(ps) {
+ case BARE: *(int *)arg.p = cnt; break;
+ case LPRE: *(long *)arg.p = cnt; break;
+ case LLPRE: *(long long *)arg.p = cnt; break;
+ case HPRE: *(unsigned short *)arg.p = cnt; break;
+ case HHPRE: *(unsigned char *)arg.p = cnt; break;
+ case ZTPRE: *(size_t *)arg.p = cnt; break;
+ case JPRE: *(uintmax_t *)arg.p = cnt; break;
+ }
+ continue;
+ case 'c':
+ if (w<1) w=1;
+ if (w>1 && !(fl&LEFT_ADJ)) fprintf(f, "%*s", w-1, "");
+ fputwc(btowc(arg.i), f);
+ if (w>1 && (fl&LEFT_ADJ)) fprintf(f, "%*s", w-1, "");
+ l = w;
+ continue;
+ case 'C':
+ fputwc(arg.i, f);
+ l = 1;
+ continue;
+ case 'S':
+ a = arg.p;
+ z = a + wcsnlen(a, p<0 ? INT_MAX : p);
+ if (p<0 && *z) goto overflow;
+ p = z-a;
+ if (w<p) w=p;
+ if (!(fl&LEFT_ADJ)) fprintf(f, "%*s", w-p, "");
+ out(f, a, p);
+ if ((fl&LEFT_ADJ)) fprintf(f, "%*s", w-p, "");
+ l=w;
+ continue;
+ case 'm':
+ arg.p = strerror(errno);
+ case 's':
+ if (!arg.p) arg.p = "(null)";
+ bs = arg.p;
+ for (i=l=0; l<(p<0?INT_MAX:p) && (i=mbtowc(&wc, bs, MB_LEN_MAX))>0; bs+=i, l++);
+ if (i<0) return -1;
+ if (p<0 && *bs) goto overflow;
+ p=l;
+ if (w<p) w=p;
+ if (!(fl&LEFT_ADJ)) fprintf(f, "%*s", w-p, "");
+ bs = arg.p;
+ while (l--) {
+ i=mbtowc(&wc, bs, MB_LEN_MAX);
+ bs+=i;
+ fputwc(wc, f);
+ }
+ if ((fl&LEFT_ADJ)) fprintf(f, "%*s", w-p, "");
+ l=w;
+ continue;
+ }
+
+ if (xp && p<0) goto overflow;
+#if defined(__wasilibc_printscan_no_long_double)
+ // Omit the 'L' modifier for floating-point cases.
+ switch (t|32) {
+ case 'a': case 'e': case 'f': case 'g':
+ snprintf(charfmt, sizeof charfmt, "%%%s%s%s%s%s*.*%c",
+ "#"+!(fl & ALT_FORM),
+ "+"+!(fl & MARK_POS),
+ "-"+!(fl & LEFT_ADJ),
+ " "+!(fl & PAD_POS),
+ "0"+!(fl & ZERO_PAD),
+ t);
+
+ l = fprintf(f, charfmt, w, p, arg.f);
+ break;
+ case 'd': case 'i': case 'o': case 'u': case 'x': case 'p':
+ snprintf(charfmt, sizeof charfmt, "%%%s%s%s%s%s*.*%c%c",
+ "#"+!(fl & ALT_FORM),
+ "+"+!(fl & MARK_POS),
+ "-"+!(fl & LEFT_ADJ),
+ " "+!(fl & PAD_POS),
+ "0"+!(fl & ZERO_PAD),
+ sizeprefix[(t|32)-'a'], t);
+
+ l = fprintf(f, charfmt, w, p, arg.i);
+ break;
+ }
+#else
+ snprintf(charfmt, sizeof charfmt, "%%%s%s%s%s%s*.*%c%c",
+ "#"+!(fl & ALT_FORM),
+ "+"+!(fl & MARK_POS),
+ "-"+!(fl & LEFT_ADJ),
+ " "+!(fl & PAD_POS),
+ "0"+!(fl & ZERO_PAD),
+ sizeprefix[(t|32)-'a'], t);
+
+ switch (t|32) {
+#if !defined(__wasilibc_printscan_no_floating_point)
+ case 'a': case 'e': case 'f': case 'g':
+ l = fprintf(f, charfmt, w, p, arg.f);
+ break;
+#endif
+ case 'd': case 'i': case 'o': case 'u': case 'x': case 'p':
+ l = fprintf(f, charfmt, w, p, arg.i);
+ break;
+ }
+#endif
+ }
+
+ if (f) return cnt;
+ if (!l10n) return 0;
+
+ for (i=1; i<=NL_ARGMAX && nl_type[i]; i++)
+ pop_arg(nl_arg+i, nl_type[i], ap);
+ for (; i<=NL_ARGMAX && !nl_type[i]; i++);
+ if (i<=NL_ARGMAX) return -1;
+ return 1;
+
+inval:
+ errno = EINVAL;
+ return -1;
+overflow:
+ errno = EOVERFLOW;
+ return -1;
+}
+
+int vfwprintf(FILE *restrict f, const wchar_t *restrict fmt, va_list ap)
+{
+ va_list ap2;
+ int nl_type[NL_ARGMAX] = {0};
+ union arg nl_arg[NL_ARGMAX];
+ int olderr;
+ int ret;
+
+ /* the copy allows passing va_list* even if va_list is an array */
+ va_copy(ap2, ap);
+ if (wprintf_core(0, fmt, &ap2, nl_arg, nl_type) < 0) {
+ va_end(ap2);
+ return -1;
+ }
+
+ FLOCK(f);
+ fwide(f, 1);
+ olderr = f->flags & F_ERR;
+ f->flags &= ~F_ERR;
+ ret = wprintf_core(f, fmt, &ap2, nl_arg, nl_type);
+ if (f->flags & F_ERR) ret = -1;
+ f->flags |= olderr;
+ FUNLOCK(f);
+ va_end(ap2);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/stdio/vfwscanf.c b/libc-top-half/musl/src/stdio/vfwscanf.c
new file mode 100644
index 0000000..82f4860
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vfwscanf.c
@@ -0,0 +1,332 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <wchar.h>
+#include <wctype.h>
+#include <limits.h>
+#include <string.h>
+
+#include "stdio_impl.h"
+#include "shgetc.h"
+#include "intscan.h"
+#include "floatscan.h"
+
+#define SIZE_hh -2
+#define SIZE_h -1
+#define SIZE_def 0
+#define SIZE_l 1
+#define SIZE_L 2
+#define SIZE_ll 3
+
+static void store_int(void *dest, int size, unsigned long long i)
+{
+ if (!dest) return;
+ switch (size) {
+ case SIZE_hh:
+ *(char *)dest = i;
+ break;
+ case SIZE_h:
+ *(short *)dest = i;
+ break;
+ case SIZE_def:
+ *(int *)dest = i;
+ break;
+ case SIZE_l:
+ *(long *)dest = i;
+ break;
+ case SIZE_ll:
+ *(long long *)dest = i;
+ break;
+ }
+}
+
+static void *arg_n(va_list ap, unsigned int n)
+{
+ void *p;
+ unsigned int i;
+ va_list ap2;
+ va_copy(ap2, ap);
+ for (i=n; i>1; i--) va_arg(ap2, void *);
+ p = va_arg(ap2, void *);
+ va_end(ap2);
+ return p;
+}
+
+static int in_set(const wchar_t *set, int c)
+{
+ int j;
+ const wchar_t *p = set;
+ if (*p == '-') {
+ if (c=='-') return 1;
+ p++;
+ } else if (*p == ']') {
+ if (c==']') return 1;
+ p++;
+ }
+ for (; *p && *p != ']'; p++) {
+ if (*p=='-' && p[1] && p[1] != ']')
+ for (j=p++[-1]; j<*p; j++)
+ if (c==j) return 1;
+ if (c==*p) return 1;
+ }
+ return 0;
+}
+
+#if 1
+#undef getwc
+#define getwc(f) \
+ ((f)->rpos != (f)->rend && *(f)->rpos < 128 ? *(f)->rpos++ : (getwc)(f))
+
+#undef ungetwc
+#define ungetwc(c,f) \
+ ((f)->rend && (c)<128U ? *--(f)->rpos : ungetwc((c),(f)))
+#endif
+
+int vfwscanf(FILE *restrict f, const wchar_t *restrict fmt, va_list ap)
+{
+ int width;
+ int size;
+ int alloc;
+ const wchar_t *p;
+ int c, t;
+ char *s;
+ wchar_t *wcs;
+ void *dest=NULL;
+ int invert;
+ int matches=0;
+ off_t pos = 0, cnt;
+ static const char size_pfx[][3] = { "hh", "h", "", "l", "L", "ll" };
+ char tmp[3*sizeof(int)+10];
+ const wchar_t *set;
+ size_t i, k;
+
+ FLOCK(f);
+
+ fwide(f, 1);
+
+ for (p=fmt; *p; p++) {
+
+ alloc = 0;
+
+ if (iswspace(*p)) {
+ while (iswspace(p[1])) p++;
+ while (iswspace((c=getwc(f)))) pos++;
+ ungetwc(c, f);
+ continue;
+ }
+ if (*p != '%' || p[1] == '%') {
+ if (*p == '%') {
+ p++;
+ while (iswspace((c=getwc(f)))) pos++;
+ } else {
+ c = getwc(f);
+ }
+ if (c!=*p) {
+ ungetwc(c, f);
+ if (c<0) goto input_fail;
+ goto match_fail;
+ }
+ pos++;
+ continue;
+ }
+
+ p++;
+ if (*p=='*') {
+ dest = 0; p++;
+ } else if (iswdigit(*p) && p[1]=='$') {
+ dest = arg_n(ap, *p-'0'); p+=2;
+ } else {
+ dest = va_arg(ap, void *);
+ }
+
+ for (width=0; iswdigit(*p); p++) {
+ width = 10*width + *p - '0';
+ }
+
+ if (*p=='m') {
+ wcs = 0;
+ s = 0;
+ alloc = !!dest;
+ p++;
+ } else {
+ alloc = 0;
+ }
+
+ size = SIZE_def;
+ switch (*p++) {
+ case 'h':
+ if (*p == 'h') p++, size = SIZE_hh;
+ else size = SIZE_h;
+ break;
+ case 'l':
+ if (*p == 'l') p++, size = SIZE_ll;
+ else size = SIZE_l;
+ break;
+ case 'j':
+ size = SIZE_ll;
+ break;
+ case 'z':
+ case 't':
+ size = SIZE_l;
+ break;
+ case 'L':
+ size = SIZE_L;
+ break;
+ case 'd': case 'i': case 'o': case 'u': case 'x':
+ case 'a': case 'e': case 'f': case 'g':
+ case 'A': case 'E': case 'F': case 'G': case 'X':
+ case 's': case 'c': case '[':
+ case 'S': case 'C':
+ case 'p': case 'n':
+ p--;
+ break;
+ default:
+ goto fmt_fail;
+ }
+
+ t = *p;
+
+ /* Transform S,C -> ls,lc */
+ if ((t&0x2f)==3) {
+ size = SIZE_l;
+ t |= 32;
+ }
+
+ if (t != 'n') {
+ if (t != '[' && (t|32) != 'c')
+ while (iswspace((c=getwc(f)))) pos++;
+ else
+ c=getwc(f);
+ if (c < 0) goto input_fail;
+ ungetwc(c, f);
+ }
+
+ switch (t) {
+ case 'n':
+ store_int(dest, size, pos);
+ /* do not increment match count, etc! */
+ continue;
+
+ case 's':
+ case 'c':
+ case '[':
+ if (t == 'c') {
+ if (width<1) width = 1;
+ invert = 1;
+ set = L"";
+ } else if (t == 's') {
+ invert = 1;
+ static const wchar_t spaces[] = {
+ ' ', '\t', '\n', '\r', 11, 12, 0x0085,
+ 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005,
+ 0x2006, 0x2008, 0x2009, 0x200a,
+ 0x2028, 0x2029, 0x205f, 0x3000, 0 };
+ set = spaces;
+ } else {
+ if (*++p == '^') p++, invert = 1;
+ else invert = 0;
+ set = p;
+ if (*p==']') p++;
+ while (*p!=']') {
+ if (!*p) goto fmt_fail;
+ p++;
+ }
+ }
+
+ s = (size == SIZE_def) ? dest : 0;
+ wcs = (size == SIZE_l) ? dest : 0;
+
+ int gotmatch = 0;
+
+ if (width < 1) width = -1;
+
+ i = 0;
+ if (alloc) {
+ k = t=='c' ? width+1U : 31;
+ if (size == SIZE_l) {
+ wcs = malloc(k*sizeof(wchar_t));
+ if (!wcs) goto alloc_fail;
+ } else {
+ s = malloc(k);
+ if (!s) goto alloc_fail;
+ }
+ }
+ while (width) {
+ if ((c=getwc(f))<0) break;
+ if (in_set(set, c) == invert)
+ break;
+ if (wcs) {
+ wcs[i++] = c;
+ if (alloc && i==k) {
+ k += k+1;
+ wchar_t *tmp = realloc(wcs, k*sizeof(wchar_t));
+ if (!tmp) goto alloc_fail;
+ wcs = tmp;
+ }
+ } else if (size != SIZE_l) {
+ int l = wctomb(s?s+i:tmp, c);
+ if (l<0) goto input_fail;
+ i += l;
+ if (alloc && i > k-4) {
+ k += k+1;
+ char *tmp = realloc(s, k);
+ if (!tmp) goto alloc_fail;
+ s = tmp;
+ }
+ }
+ pos++;
+ width-=(width>0);
+ gotmatch=1;
+ }
+ if (width) {
+ ungetwc(c, f);
+ if (t == 'c' || !gotmatch) goto match_fail;
+ }
+
+ if (alloc) {
+ if (size == SIZE_l) *(wchar_t **)dest = wcs;
+ else *(char **)dest = s;
+ }
+ if (t != 'c') {
+ if (wcs) wcs[i] = 0;
+ if (s) s[i] = 0;
+ }
+ break;
+
+ case 'd': case 'i': case 'o': case 'u': case 'x':
+ case 'a': case 'e': case 'f': case 'g':
+ case 'A': case 'E': case 'F': case 'G': case 'X':
+ case 'p':
+ if (width < 1) width = 0;
+ snprintf(tmp, sizeof tmp, "%.*s%.0d%s%c%%lln",
+ 1+!dest, "%*", width, size_pfx[size+2], t);
+ cnt = 0;
+ if (fscanf(f, tmp, dest?dest:&cnt, &cnt) == -1)
+ goto input_fail;
+ else if (!cnt)
+ goto match_fail;
+ pos += cnt;
+ break;
+ default:
+ goto fmt_fail;
+ }
+
+ if (dest) matches++;
+ }
+ if (0) {
+fmt_fail:
+alloc_fail:
+input_fail:
+ if (!matches) matches--;
+match_fail:
+ if (alloc) {
+ free(s);
+ free(wcs);
+ }
+ }
+ FUNLOCK(f);
+ return matches;
+}
+
+weak_alias(vfwscanf,__isoc99_vfwscanf);
diff --git a/libc-top-half/musl/src/stdio/vprintf.c b/libc-top-half/musl/src/stdio/vprintf.c
new file mode 100644
index 0000000..30d2bff
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vprintf.c
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+int vprintf(const char *restrict fmt, va_list ap)
+{
+ return vfprintf(stdout, fmt, ap);
+}
diff --git a/libc-top-half/musl/src/stdio/vscanf.c b/libc-top-half/musl/src/stdio/vscanf.c
new file mode 100644
index 0000000..9d46ab0
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vscanf.c
@@ -0,0 +1,9 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+int vscanf(const char *restrict fmt, va_list ap)
+{
+ return vfscanf(stdin, fmt, ap);
+}
+
+weak_alias(vscanf,__isoc99_vscanf);
diff --git a/libc-top-half/musl/src/stdio/vsnprintf.c b/libc-top-half/musl/src/stdio/vsnprintf.c
new file mode 100644
index 0000000..08989d6
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vsnprintf.c
@@ -0,0 +1,57 @@
+#include "stdio_impl.h"
+#include <limits.h>
+#include <string.h>
+#include <errno.h>
+#include <stdint.h>
+
+struct cookie {
+ char *s;
+ size_t n;
+};
+
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+
+static size_t sn_write(FILE *f, const unsigned char *s, size_t l)
+{
+ struct cookie *c = f->cookie;
+ size_t k = MIN(c->n, f->wpos - f->wbase);
+ if (k) {
+ memcpy(c->s, f->wbase, k);
+ c->s += k;
+ c->n -= k;
+ }
+ k = MIN(c->n, l);
+ if (k) {
+ memcpy(c->s, s, k);
+ c->s += k;
+ c->n -= k;
+ }
+ *c->s = 0;
+ f->wpos = f->wbase = f->buf;
+ /* pretend to succeed, even if we discarded extra data */
+ return l;
+}
+
+int vsnprintf(char *restrict s, size_t n, const char *restrict fmt, va_list ap)
+{
+ unsigned char buf[1];
+ char dummy[1];
+ struct cookie c = { .s = n ? s : dummy, .n = n ? n-1 : 0 };
+ FILE f = {
+ .lbf = EOF,
+ .write = sn_write,
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ .lock = -1,
+#endif
+ .buf = buf,
+ .cookie = &c,
+ };
+
+ if (n > INT_MAX) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ *c.s = 0;
+ return vfprintf(&f, fmt, ap);
+}
diff --git a/libc-top-half/musl/src/stdio/vsprintf.c b/libc-top-half/musl/src/stdio/vsprintf.c
new file mode 100644
index 0000000..c57349d
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vsprintf.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+#include <limits.h>
+
+int vsprintf(char *restrict s, const char *restrict fmt, va_list ap)
+{
+ return vsnprintf(s, INT_MAX, fmt, ap);
+}
diff --git a/libc-top-half/musl/src/stdio/vsscanf.c b/libc-top-half/musl/src/stdio/vsscanf.c
new file mode 100644
index 0000000..0e5b482
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vsscanf.c
@@ -0,0 +1,31 @@
+#include "stdio_impl.h"
+#include <string.h>
+
+static size_t string_read(FILE *f, unsigned char *buf, size_t len)
+{
+ char *src = f->cookie;
+ size_t k = len+256;
+ char *end = memchr(src, 0, k);
+ if (end) k = end-src;
+ if (k < len) len = k;
+ memcpy(buf, src, len);
+ f->rpos = (void *)(src+len);
+ f->rend = (void *)(src+k);
+ f->cookie = src+k;
+ return len;
+}
+
+int vsscanf(const char *restrict s, const char *restrict fmt, va_list ap)
+{
+ FILE f = {
+ .buf = (void *)s, .cookie = (void *)s,
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ .read = string_read, .lock = -1
+#else
+ .read = string_read
+#endif
+ };
+ return vfscanf(&f, fmt, ap);
+}
+
+weak_alias(vsscanf,__isoc99_vsscanf);
diff --git a/libc-top-half/musl/src/stdio/vswprintf.c b/libc-top-half/musl/src/stdio/vswprintf.c
new file mode 100644
index 0000000..bf9bcaf
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vswprintf.c
@@ -0,0 +1,62 @@
+#include "stdio_impl.h"
+#include <limits.h>
+#include <errno.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <wchar.h>
+
+struct cookie {
+ wchar_t *ws;
+ size_t l;
+};
+
+static size_t sw_write(FILE *f, const unsigned char *s, size_t l)
+{
+ size_t l0 = l;
+ int i = 0;
+ struct cookie *c = f->cookie;
+ if (s!=f->wbase && sw_write(f, f->wbase, f->wpos-f->wbase)==-1)
+ return -1;
+ while (c->l && l && (i=mbtowc(c->ws, (void *)s, l))>=0) {
+ s+=i;
+ l-=i;
+ c->l--;
+ c->ws++;
+ }
+ *c->ws = 0;
+ if (i < 0) {
+ f->wpos = f->wbase = f->wend = 0;
+ f->flags |= F_ERR;
+ return i;
+ }
+ f->wend = f->buf + f->buf_size;
+ f->wpos = f->wbase = f->buf;
+ return l0;
+}
+
+int vswprintf(wchar_t *restrict s, size_t n, const wchar_t *restrict fmt, va_list ap)
+{
+ int r;
+ unsigned char buf[256];
+ struct cookie c = { s, n-1 };
+ FILE f = {
+ .lbf = EOF,
+ .write = sw_write,
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ .lock = -1,
+#endif
+ .buf = buf,
+ .buf_size = sizeof buf,
+ .cookie = &c,
+ };
+
+ if (!n) {
+ return -1;
+ } else if (n > INT_MAX) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ r = vfwprintf(&f, fmt, ap);
+ sw_write(&f, 0, 0);
+ return r>=n ? -1 : r;
+}
diff --git a/libc-top-half/musl/src/stdio/vswscanf.c b/libc-top-half/musl/src/stdio/vswscanf.c
new file mode 100644
index 0000000..ea82710
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vswscanf.c
@@ -0,0 +1,42 @@
+#include "stdio_impl.h"
+#include <wchar.h>
+
+static size_t wstring_read(FILE *f, unsigned char *buf, size_t len)
+{
+ const wchar_t *src = f->cookie;
+ size_t k;
+
+ if (!src) return 0;
+
+ k = wcsrtombs((void *)f->buf, &src, f->buf_size, 0);
+ if (k==(size_t)-1) {
+ f->rpos = f->rend = 0;
+ return 0;
+ }
+
+ f->rpos = f->buf;
+ f->rend = f->buf + k;
+ f->cookie = (void *)src;
+
+ if (!len || !k) return 0;
+
+ *buf = *f->rpos++;
+ return 1;
+}
+
+int vswscanf(const wchar_t *restrict s, const wchar_t *restrict fmt, va_list ap)
+{
+ unsigned char buf[256];
+ FILE f = {
+ .buf = buf, .buf_size = sizeof buf,
+ .cookie = (void *)s,
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ .read = wstring_read, .lock = -1
+#else
+ .read = wstring_read
+#endif
+ };
+ return vfwscanf(&f, fmt, ap);
+}
+
+weak_alias(vswscanf,__isoc99_vswscanf);
diff --git a/libc-top-half/musl/src/stdio/vwprintf.c b/libc-top-half/musl/src/stdio/vwprintf.c
new file mode 100644
index 0000000..eeeecdc
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vwprintf.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+#include <wchar.h>
+
+int vwprintf(const wchar_t *restrict fmt, va_list ap)
+{
+ return vfwprintf(stdout, fmt, ap);
+}
diff --git a/libc-top-half/musl/src/stdio/vwscanf.c b/libc-top-half/musl/src/stdio/vwscanf.c
new file mode 100644
index 0000000..5a3931e
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/vwscanf.c
@@ -0,0 +1,10 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <wchar.h>
+
+int vwscanf(const wchar_t *restrict fmt, va_list ap)
+{
+ return vfwscanf(stdin, fmt, ap);
+}
+
+weak_alias(vwscanf,__isoc99_vwscanf);
diff --git a/libc-top-half/musl/src/stdio/wprintf.c b/libc-top-half/musl/src/stdio/wprintf.c
new file mode 100644
index 0000000..342cd97
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/wprintf.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <wchar.h>
+
+int wprintf(const wchar_t *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vwprintf(fmt, ap);
+ va_end(ap);
+ return ret;
+}
diff --git a/libc-top-half/musl/src/stdio/wscanf.c b/libc-top-half/musl/src/stdio/wscanf.c
new file mode 100644
index 0000000..4dfec25
--- /dev/null
+++ b/libc-top-half/musl/src/stdio/wscanf.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <wchar.h>
+
+int wscanf(const wchar_t *restrict fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vwscanf(fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+weak_alias(wscanf,__isoc99_wscanf);
diff --git a/libc-top-half/musl/src/stdlib/abs.c b/libc-top-half/musl/src/stdlib/abs.c
new file mode 100644
index 0000000..e721fdc
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/abs.c
@@ -0,0 +1,6 @@
+#include <stdlib.h>
+
+int abs(int a)
+{
+ return a>0 ? a : -a;
+}
diff --git a/libc-top-half/musl/src/stdlib/atof.c b/libc-top-half/musl/src/stdlib/atof.c
new file mode 100644
index 0000000..f7fcd82
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/atof.c
@@ -0,0 +1,6 @@
+#include <stdlib.h>
+
+double atof(const char *s)
+{
+ return strtod(s, 0);
+}
diff --git a/libc-top-half/musl/src/stdlib/atoi.c b/libc-top-half/musl/src/stdlib/atoi.c
new file mode 100644
index 0000000..9baca7b
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/atoi.c
@@ -0,0 +1,16 @@
+#include <stdlib.h>
+#include <ctype.h>
+
+int atoi(const char *s)
+{
+ int n=0, neg=0;
+ while (isspace(*s)) s++;
+ switch (*s) {
+ case '-': neg=1;
+ case '+': s++;
+ }
+ /* Compute n as a negative number to avoid overflow on INT_MIN */
+ while (isdigit(*s))
+ n = 10*n - (*s++ - '0');
+ return neg ? n : -n;
+}
diff --git a/libc-top-half/musl/src/stdlib/atol.c b/libc-top-half/musl/src/stdlib/atol.c
new file mode 100644
index 0000000..140ea3e
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/atol.c
@@ -0,0 +1,17 @@
+#include <stdlib.h>
+#include <ctype.h>
+
+long atol(const char *s)
+{
+ long n=0;
+ int neg=0;
+ while (isspace(*s)) s++;
+ switch (*s) {
+ case '-': neg=1;
+ case '+': s++;
+ }
+ /* Compute n as a negative number to avoid overflow on LONG_MIN */
+ while (isdigit(*s))
+ n = 10*n - (*s++ - '0');
+ return neg ? n : -n;
+}
diff --git a/libc-top-half/musl/src/stdlib/atoll.c b/libc-top-half/musl/src/stdlib/atoll.c
new file mode 100644
index 0000000..b693048
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/atoll.c
@@ -0,0 +1,17 @@
+#include <stdlib.h>
+#include <ctype.h>
+
+long long atoll(const char *s)
+{
+ long long n=0;
+ int neg=0;
+ while (isspace(*s)) s++;
+ switch (*s) {
+ case '-': neg=1;
+ case '+': s++;
+ }
+ /* Compute n as a negative number to avoid overflow on LLONG_MIN */
+ while (isdigit(*s))
+ n = 10*n - (*s++ - '0');
+ return neg ? n : -n;
+}
diff --git a/libc-top-half/musl/src/stdlib/bsearch.c b/libc-top-half/musl/src/stdlib/bsearch.c
new file mode 100644
index 0000000..fe050ea
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/bsearch.c
@@ -0,0 +1,20 @@
+#include <stdlib.h>
+
+void *bsearch(const void *key, const void *base, size_t nel, size_t width, int (*cmp)(const void *, const void *))
+{
+ void *try;
+ int sign;
+ while (nel > 0) {
+ try = (char *)base + width*(nel/2);
+ sign = cmp(key, try);
+ if (sign < 0) {
+ nel /= 2;
+ } else if (sign > 0) {
+ base = (char *)try + width;
+ nel -= nel/2+1;
+ } else {
+ return try;
+ }
+ }
+ return NULL;
+}
diff --git a/libc-top-half/musl/src/stdlib/div.c b/libc-top-half/musl/src/stdlib/div.c
new file mode 100644
index 0000000..e42c1f1
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/div.c
@@ -0,0 +1,6 @@
+#include <stdlib.h>
+
+div_t div(int num, int den)
+{
+ return (div_t){ num/den, num%den };
+}
diff --git a/libc-top-half/musl/src/stdlib/ecvt.c b/libc-top-half/musl/src/stdlib/ecvt.c
new file mode 100644
index 0000000..797b664
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/ecvt.c
@@ -0,0 +1,20 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <stdio.h>
+
+char *ecvt(double x, int n, int *dp, int *sign)
+{
+ static char buf[16];
+ char tmp[32];
+ int i, j;
+
+ if (n-1U > 15) n = 15;
+ sprintf(tmp, "%.*e", n-1, x);
+ i = *sign = (tmp[0]=='-');
+ for (j=0; tmp[i]!='e'; j+=(tmp[i++]!='.'))
+ buf[j] = tmp[i];
+ buf[j] = 0;
+ *dp = atoi(tmp+i+1)+1;
+
+ return buf;
+}
diff --git a/libc-top-half/musl/src/stdlib/fcvt.c b/libc-top-half/musl/src/stdlib/fcvt.c
new file mode 100644
index 0000000..f90928f
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/fcvt.c
@@ -0,0 +1,25 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+char *fcvt(double x, int n, int *dp, int *sign)
+{
+ char tmp[1500];
+ int i, lz;
+
+ if (n > 1400U) n = 1400;
+ sprintf(tmp, "%.*f", n, x);
+ i = (tmp[0] == '-');
+ if (tmp[i] == '0') lz = strspn(tmp+i+2, "0");
+ else lz = -(int)strcspn(tmp+i, ".");
+
+ if (n<=lz) {
+ *sign = i;
+ *dp = 1;
+ if (n>14U) n = 14;
+ return "000000000000000"+14-n;
+ }
+
+ return ecvt(x, n-lz, dp, sign);
+}
diff --git a/libc-top-half/musl/src/stdlib/gcvt.c b/libc-top-half/musl/src/stdlib/gcvt.c
new file mode 100644
index 0000000..f29bc30
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/gcvt.c
@@ -0,0 +1,9 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <stdio.h>
+
+char *gcvt(double x, int n, char *b)
+{
+ sprintf(b, "%.*g", n, x);
+ return b;
+}
diff --git a/libc-top-half/musl/src/stdlib/imaxabs.c b/libc-top-half/musl/src/stdlib/imaxabs.c
new file mode 100644
index 0000000..8100181
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/imaxabs.c
@@ -0,0 +1,6 @@
+#include <inttypes.h>
+
+intmax_t imaxabs(intmax_t a)
+{
+ return a>0 ? a : -a;
+}
diff --git a/libc-top-half/musl/src/stdlib/imaxdiv.c b/libc-top-half/musl/src/stdlib/imaxdiv.c
new file mode 100644
index 0000000..b2ce821
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/imaxdiv.c
@@ -0,0 +1,6 @@
+#include <inttypes.h>
+
+imaxdiv_t imaxdiv(intmax_t num, intmax_t den)
+{
+ return (imaxdiv_t){ num/den, num%den };
+}
diff --git a/libc-top-half/musl/src/stdlib/labs.c b/libc-top-half/musl/src/stdlib/labs.c
new file mode 100644
index 0000000..83ddb14
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/labs.c
@@ -0,0 +1,6 @@
+#include <stdlib.h>
+
+long labs(long a)
+{
+ return a>0 ? a : -a;
+}
diff --git a/libc-top-half/musl/src/stdlib/ldiv.c b/libc-top-half/musl/src/stdlib/ldiv.c
new file mode 100644
index 0000000..36eb960
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/ldiv.c
@@ -0,0 +1,6 @@
+#include <stdlib.h>
+
+ldiv_t ldiv(long num, long den)
+{
+ return (ldiv_t){ num/den, num%den };
+}
diff --git a/libc-top-half/musl/src/stdlib/llabs.c b/libc-top-half/musl/src/stdlib/llabs.c
new file mode 100644
index 0000000..9dfaf5c
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/llabs.c
@@ -0,0 +1,6 @@
+#include <stdlib.h>
+
+long long llabs(long long a)
+{
+ return a>0 ? a : -a;
+}
diff --git a/libc-top-half/musl/src/stdlib/lldiv.c b/libc-top-half/musl/src/stdlib/lldiv.c
new file mode 100644
index 0000000..7aaf7a0
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/lldiv.c
@@ -0,0 +1,6 @@
+#include <stdlib.h>
+
+lldiv_t lldiv(long long num, long long den)
+{
+ return (lldiv_t){ num/den, num%den };
+}
diff --git a/libc-top-half/musl/src/stdlib/qsort.c b/libc-top-half/musl/src/stdlib/qsort.c
new file mode 100644
index 0000000..314ddc2
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/qsort.c
@@ -0,0 +1,221 @@
+/* Copyright (C) 2011 by Valentin Ochs
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+/* Minor changes by Rich Felker for integration in musl, 2011-04-27. */
+
+/* Smoothsort, an adaptive variant of Heapsort. Memory usage: O(1).
+ Run time: Worst case O(n log n), close to O(n) in the mostly-sorted case. */
+
+#define _BSD_SOURCE
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "atomic.h"
+#define ntz(x) a_ctz_l((x))
+
+typedef int (*cmpfun)(const void *, const void *, void *);
+
+static inline int pntz(size_t p[2]) {
+ int r = ntz(p[0] - 1);
+ if(r != 0 || (r = 8*sizeof(size_t) + ntz(p[1])) != 8*sizeof(size_t)) {
+ return r;
+ }
+ return 0;
+}
+
+static void cycle(size_t width, unsigned char* ar[], int n)
+{
+ unsigned char tmp[256];
+ size_t l;
+ int i;
+
+ if(n < 2) {
+ return;
+ }
+
+ ar[n] = tmp;
+ while(width) {
+ l = sizeof(tmp) < width ? sizeof(tmp) : width;
+ memcpy(ar[n], ar[0], l);
+ for(i = 0; i < n; i++) {
+ memcpy(ar[i], ar[i + 1], l);
+ ar[i] += l;
+ }
+ width -= l;
+ }
+}
+
+/* shl() and shr() need n > 0 */
+static inline void shl(size_t p[2], int n)
+{
+ if(n >= 8 * sizeof(size_t)) {
+ n -= 8 * sizeof(size_t);
+ p[1] = p[0];
+ p[0] = 0;
+ }
+ p[1] <<= n;
+ p[1] |= p[0] >> (sizeof(size_t) * 8 - n);
+ p[0] <<= n;
+}
+
+static inline void shr(size_t p[2], int n)
+{
+ if(n >= 8 * sizeof(size_t)) {
+ n -= 8 * sizeof(size_t);
+ p[0] = p[1];
+ p[1] = 0;
+ }
+ p[0] >>= n;
+ p[0] |= p[1] << (sizeof(size_t) * 8 - n);
+ p[1] >>= n;
+}
+
+static void sift(unsigned char *head, size_t width, cmpfun cmp, void *arg, int pshift, size_t lp[])
+{
+ unsigned char *rt, *lf;
+ unsigned char *ar[14 * sizeof(size_t) + 1];
+ int i = 1;
+
+ ar[0] = head;
+ while(pshift > 1) {
+ rt = head - width;
+ lf = head - width - lp[pshift - 2];
+
+ if(cmp(ar[0], lf, arg) >= 0 && cmp(ar[0], rt, arg) >= 0) {
+ break;
+ }
+ if(cmp(lf, rt, arg) >= 0) {
+ ar[i++] = lf;
+ head = lf;
+ pshift -= 1;
+ } else {
+ ar[i++] = rt;
+ head = rt;
+ pshift -= 2;
+ }
+ }
+ cycle(width, ar, i);
+}
+
+static void trinkle(unsigned char *head, size_t width, cmpfun cmp, void *arg, size_t pp[2], int pshift, int trusty, size_t lp[])
+{
+ unsigned char *stepson,
+ *rt, *lf;
+ size_t p[2];
+ unsigned char *ar[14 * sizeof(size_t) + 1];
+ int i = 1;
+ int trail;
+
+ p[0] = pp[0];
+ p[1] = pp[1];
+
+ ar[0] = head;
+ while(p[0] != 1 || p[1] != 0) {
+ stepson = head - lp[pshift];
+ if(cmp(stepson, ar[0], arg) <= 0) {
+ break;
+ }
+ if(!trusty && pshift > 1) {
+ rt = head - width;
+ lf = head - width - lp[pshift - 2];
+ if(cmp(rt, stepson, arg) >= 0 || cmp(lf, stepson, arg) >= 0) {
+ break;
+ }
+ }
+
+ ar[i++] = stepson;
+ head = stepson;
+ trail = pntz(p);
+ shr(p, trail);
+ pshift += trail;
+ trusty = 0;
+ }
+ if(!trusty) {
+ cycle(width, ar, i);
+ sift(head, width, cmp, arg, pshift, lp);
+ }
+}
+
+void __qsort_r(void *base, size_t nel, size_t width, cmpfun cmp, void *arg)
+{
+ size_t lp[12*sizeof(size_t)];
+ size_t i, size = width * nel;
+ unsigned char *head, *high;
+ size_t p[2] = {1, 0};
+ int pshift = 1;
+ int trail;
+
+ if (!size) return;
+
+ head = base;
+ high = head + size - width;
+
+ /* Precompute Leonardo numbers, scaled by element width */
+ for(lp[0]=lp[1]=width, i=2; (lp[i]=lp[i-2]+lp[i-1]+width) < size; i++);
+
+ while(head < high) {
+ if((p[0] & 3) == 3) {
+ sift(head, width, cmp, arg, pshift, lp);
+ shr(p, 2);
+ pshift += 2;
+ } else {
+ if(lp[pshift - 1] >= high - head) {
+ trinkle(head, width, cmp, arg, p, pshift, 0, lp);
+ } else {
+ sift(head, width, cmp, arg, pshift, lp);
+ }
+
+ if(pshift == 1) {
+ shl(p, 1);
+ pshift = 0;
+ } else {
+ shl(p, pshift - 1);
+ pshift = 1;
+ }
+ }
+
+ p[0] |= 1;
+ head += width;
+ }
+
+ trinkle(head, width, cmp, arg, p, pshift, 0, lp);
+
+ while(pshift != 1 || p[0] != 1 || p[1] != 0) {
+ if(pshift <= 1) {
+ trail = pntz(p);
+ shr(p, trail);
+ pshift += trail;
+ } else {
+ shl(p, 2);
+ pshift -= 2;
+ p[0] ^= 7;
+ shr(p, 1);
+ trinkle(head - lp[pshift] - width, width, cmp, arg, p, pshift + 1, 1, lp);
+ shl(p, 1);
+ p[0] |= 1;
+ trinkle(head - width, width, cmp, arg, p, pshift, 1, lp);
+ }
+ head -= width;
+ }
+}
+
+weak_alias(__qsort_r, qsort_r);
diff --git a/libc-top-half/musl/src/stdlib/qsort_nr.c b/libc-top-half/musl/src/stdlib/qsort_nr.c
new file mode 100644
index 0000000..efe7cce
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/qsort_nr.c
@@ -0,0 +1,14 @@
+#define _BSD_SOURCE
+#include <stdlib.h>
+
+typedef int (*cmpfun)(const void *, const void *);
+
+static int wrapper_cmp(const void *v1, const void *v2, void *cmp)
+{
+ return ((cmpfun)cmp)(v1, v2);
+}
+
+void qsort(void *base, size_t nel, size_t width, cmpfun cmp)
+{
+ __qsort_r(base, nel, width, wrapper_cmp, cmp);
+}
diff --git a/libc-top-half/musl/src/stdlib/strtod.c b/libc-top-half/musl/src/stdlib/strtod.c
new file mode 100644
index 0000000..184bca4
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/strtod.c
@@ -0,0 +1,48 @@
+#include <stdlib.h>
+#ifdef __wasilibc_unmodified_upstream // Changes to optimize printf/scanf when long double isn't needed
+#else
+#include "printscan.h"
+#define __NEED_locale_t
+#include <bits/alltypes.h>
+#endif
+#include "shgetc.h"
+#include "floatscan.h"
+#include "stdio_impl.h"
+
+#if defined(__wasilibc_printscan_no_long_double)
+static long_double strtox(const char *s, char **p, int prec)
+#else
+static long double strtox(const char *s, char **p, int prec)
+#endif
+{
+ FILE f;
+ sh_fromstring(&f, s);
+ shlim(&f, 0);
+#if defined(__wasilibc_printscan_no_long_double)
+ long_double y = __floatscan(&f, prec, 1);
+#else
+ long double y = __floatscan(&f, prec, 1);
+#endif
+ off_t cnt = shcnt(&f);
+ if (p) *p = cnt ? (char *)s + cnt : (char *)s;
+ return y;
+}
+
+float strtof(const char *restrict s, char **restrict p)
+{
+ return strtox(s, p, 0);
+}
+
+double strtod(const char *restrict s, char **restrict p)
+{
+ return strtox(s, p, 1);
+}
+
+long double strtold(const char *restrict s, char **restrict p)
+{
+#if defined(__wasilibc_printscan_no_long_double)
+ long_double_not_supported();
+#else
+ return strtox(s, p, 2);
+#endif
+}
diff --git a/libc-top-half/musl/src/stdlib/strtol.c b/libc-top-half/musl/src/stdlib/strtol.c
new file mode 100644
index 0000000..bfefea6
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/strtol.c
@@ -0,0 +1,56 @@
+#include "stdio_impl.h"
+#include "intscan.h"
+#include "shgetc.h"
+#include <inttypes.h>
+#include <limits.h>
+#include <ctype.h>
+
+static unsigned long long strtox(const char *s, char **p, int base, unsigned long long lim)
+{
+ FILE f;
+ sh_fromstring(&f, s);
+ shlim(&f, 0);
+ unsigned long long y = __intscan(&f, base, 1, lim);
+ if (p) {
+ size_t cnt = shcnt(&f);
+ *p = (char *)s + cnt;
+ }
+ return y;
+}
+
+unsigned long long strtoull(const char *restrict s, char **restrict p, int base)
+{
+ return strtox(s, p, base, ULLONG_MAX);
+}
+
+long long strtoll(const char *restrict s, char **restrict p, int base)
+{
+ return strtox(s, p, base, LLONG_MIN);
+}
+
+unsigned long strtoul(const char *restrict s, char **restrict p, int base)
+{
+ return strtox(s, p, base, ULONG_MAX);
+}
+
+long strtol(const char *restrict s, char **restrict p, int base)
+{
+ return strtox(s, p, base, 0UL+LONG_MIN);
+}
+
+intmax_t strtoimax(const char *restrict s, char **restrict p, int base)
+{
+ return strtoll(s, p, base);
+}
+
+uintmax_t strtoumax(const char *restrict s, char **restrict p, int base)
+{
+ return strtoull(s, p, base);
+}
+
+weak_alias(strtol, __strtol_internal);
+weak_alias(strtoul, __strtoul_internal);
+weak_alias(strtoll, __strtoll_internal);
+weak_alias(strtoull, __strtoull_internal);
+weak_alias(strtoimax, __strtoimax_internal);
+weak_alias(strtoumax, __strtoumax_internal);
diff --git a/libc-top-half/musl/src/stdlib/wcstod.c b/libc-top-half/musl/src/stdlib/wcstod.c
new file mode 100644
index 0000000..97b894e
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/wcstod.c
@@ -0,0 +1,82 @@
+#ifdef __wasilibc_unmodified_upstream // Changes to optimize printf/scanf when long double isn't needed
+#else
+#include "printscan.h"
+#endif
+#include "shgetc.h"
+#include "floatscan.h"
+#include "stdio_impl.h"
+#include <wchar.h>
+#include <wctype.h>
+
+/* This read function heavily cheats. It knows:
+ * (1) len will always be 1
+ * (2) non-ascii characters don't matter */
+
+static size_t do_read(FILE *f, unsigned char *buf, size_t len)
+{
+ size_t i;
+ const wchar_t *wcs = f->cookie;
+
+ if (!wcs[0]) wcs=L"@";
+ for (i=0; i<f->buf_size && wcs[i]; i++)
+ f->buf[i] = wcs[i] < 128 ? wcs[i] : '@';
+ f->rpos = f->buf;
+ f->rend = f->buf + i;
+ f->cookie = (void *)(wcs+i);
+
+ if (i && len) {
+ *buf = *f->rpos++;
+ return 1;
+ }
+ return 0;
+}
+
+#if defined(__wasilibc_printscan_no_long_double)
+static long_double wcstox(const wchar_t *s, wchar_t **p, int prec)
+#else
+static long double wcstox(const wchar_t *s, wchar_t **p, int prec)
+#endif
+{
+ wchar_t *t = (wchar_t *)s;
+ unsigned char buf[64];
+ FILE f = {0};
+ f.flags = 0;
+ f.rpos = f.rend = f.buf = buf + 4;
+ f.buf_size = sizeof buf - 4;
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ f.lock = -1;
+#endif
+ f.read = do_read;
+ while (iswspace(*t)) t++;
+ f.cookie = (void *)t;
+ shlim(&f, 0);
+#if defined(__wasilibc_printscan_no_long_double)
+ long_double y = __floatscan(&f, prec, 1);
+#else
+ long double y = __floatscan(&f, prec, 1);
+#endif
+ if (p) {
+ size_t cnt = shcnt(&f);
+ *p = cnt ? t + cnt : (wchar_t *)s;
+ }
+ return y;
+}
+
+float wcstof(const wchar_t *restrict s, wchar_t **restrict p)
+{
+ return wcstox(s, p, 0);
+}
+
+double wcstod(const wchar_t *restrict s, wchar_t **restrict p)
+{
+ return wcstox(s, p, 1);
+}
+
+long double wcstold(const wchar_t *restrict s, wchar_t **restrict p)
+{
+#if defined(__wasilibc_printscan_no_long_double)
+ long_double_not_supported();
+#else
+ return wcstox(s, p, 2);
+#endif
+}
diff --git a/libc-top-half/musl/src/stdlib/wcstol.c b/libc-top-half/musl/src/stdlib/wcstol.c
new file mode 100644
index 0000000..3aefd06
--- /dev/null
+++ b/libc-top-half/musl/src/stdlib/wcstol.c
@@ -0,0 +1,83 @@
+#include "stdio_impl.h"
+#include "intscan.h"
+#include "shgetc.h"
+#include <inttypes.h>
+#include <limits.h>
+#include <wctype.h>
+#include <wchar.h>
+
+/* This read function heavily cheats. It knows:
+ * (1) len will always be 1
+ * (2) non-ascii characters don't matter */
+
+static size_t do_read(FILE *f, unsigned char *buf, size_t len)
+{
+ size_t i;
+ const wchar_t *wcs = f->cookie;
+
+ if (!wcs[0]) wcs=L"@";
+ for (i=0; i<f->buf_size && wcs[i]; i++)
+ f->buf[i] = wcs[i] < 128 ? wcs[i] : '@';
+ f->rpos = f->buf;
+ f->rend = f->buf + i;
+ f->cookie = (void *)(wcs+i);
+
+ if (i && len) {
+ *buf = *f->rpos++;
+ return 1;
+ }
+ return 0;
+}
+
+static unsigned long long wcstox(const wchar_t *s, wchar_t **p, int base, unsigned long long lim)
+{
+ wchar_t *t = (wchar_t *)s;
+ unsigned char buf[64];
+ FILE f = {0};
+ f.flags = 0;
+ f.rpos = f.rend = f.buf = buf + 4;
+ f.buf_size = sizeof buf - 4;
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ f.lock = -1;
+#endif
+ f.read = do_read;
+ while (iswspace(*t)) t++;
+ f.cookie = (void *)t;
+ shlim(&f, 0);
+ unsigned long long y = __intscan(&f, base, 1, lim);
+ if (p) {
+ size_t cnt = shcnt(&f);
+ *p = cnt ? t + cnt : (wchar_t *)s;
+ }
+ return y;
+}
+
+unsigned long long wcstoull(const wchar_t *restrict s, wchar_t **restrict p, int base)
+{
+ return wcstox(s, p, base, ULLONG_MAX);
+}
+
+long long wcstoll(const wchar_t *restrict s, wchar_t **restrict p, int base)
+{
+ return wcstox(s, p, base, LLONG_MIN);
+}
+
+unsigned long wcstoul(const wchar_t *restrict s, wchar_t **restrict p, int base)
+{
+ return wcstox(s, p, base, ULONG_MAX);
+}
+
+long wcstol(const wchar_t *restrict s, wchar_t **restrict p, int base)
+{
+ return wcstox(s, p, base, 0UL+LONG_MIN);
+}
+
+intmax_t wcstoimax(const wchar_t *restrict s, wchar_t **restrict p, int base)
+{
+ return wcstoll(s, p, base);
+}
+
+uintmax_t wcstoumax(const wchar_t *restrict s, wchar_t **restrict p, int base)
+{
+ return wcstoull(s, p, base);
+}
diff --git a/libc-top-half/musl/src/string/aarch64/memcpy.S b/libc-top-half/musl/src/string/aarch64/memcpy.S
new file mode 100644
index 0000000..48bb8a8
--- /dev/null
+++ b/libc-top-half/musl/src/string/aarch64/memcpy.S
@@ -0,0 +1,186 @@
+/*
+ * memcpy - copy memory area
+ *
+ * Copyright (c) 2012-2020, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+/* Assumptions:
+ *
+ * ARMv8-a, AArch64, unaligned accesses.
+ *
+ */
+
+#define dstin x0
+#define src x1
+#define count x2
+#define dst x3
+#define srcend x4
+#define dstend x5
+#define A_l x6
+#define A_lw w6
+#define A_h x7
+#define B_l x8
+#define B_lw w8
+#define B_h x9
+#define C_l x10
+#define C_lw w10
+#define C_h x11
+#define D_l x12
+#define D_h x13
+#define E_l x14
+#define E_h x15
+#define F_l x16
+#define F_h x17
+#define G_l count
+#define G_h dst
+#define H_l src
+#define H_h srcend
+#define tmp1 x14
+
+/* This implementation of memcpy uses unaligned accesses and branchless
+ sequences to keep the code small, simple and improve performance.
+
+ Copies are split into 3 main cases: small copies of up to 32 bytes, medium
+ copies of up to 128 bytes, and large copies. The overhead of the overlap
+ check is negligible since it is only required for large copies.
+
+ Large copies use a software pipelined loop processing 64 bytes per iteration.
+ The destination pointer is 16-byte aligned to minimize unaligned accesses.
+ The loop tail is handled by always copying 64 bytes from the end.
+*/
+
+.global memcpy
+.type memcpy,%function
+memcpy:
+ add srcend, src, count
+ add dstend, dstin, count
+ cmp count, 128
+ b.hi .Lcopy_long
+ cmp count, 32
+ b.hi .Lcopy32_128
+
+ /* Small copies: 0..32 bytes. */
+ cmp count, 16
+ b.lo .Lcopy16
+ ldp A_l, A_h, [src]
+ ldp D_l, D_h, [srcend, -16]
+ stp A_l, A_h, [dstin]
+ stp D_l, D_h, [dstend, -16]
+ ret
+
+ /* Copy 8-15 bytes. */
+.Lcopy16:
+ tbz count, 3, .Lcopy8
+ ldr A_l, [src]
+ ldr A_h, [srcend, -8]
+ str A_l, [dstin]
+ str A_h, [dstend, -8]
+ ret
+
+ .p2align 3
+ /* Copy 4-7 bytes. */
+.Lcopy8:
+ tbz count, 2, .Lcopy4
+ ldr A_lw, [src]
+ ldr B_lw, [srcend, -4]
+ str A_lw, [dstin]
+ str B_lw, [dstend, -4]
+ ret
+
+ /* Copy 0..3 bytes using a branchless sequence. */
+.Lcopy4:
+ cbz count, .Lcopy0
+ lsr tmp1, count, 1
+ ldrb A_lw, [src]
+ ldrb C_lw, [srcend, -1]
+ ldrb B_lw, [src, tmp1]
+ strb A_lw, [dstin]
+ strb B_lw, [dstin, tmp1]
+ strb C_lw, [dstend, -1]
+.Lcopy0:
+ ret
+
+ .p2align 4
+ /* Medium copies: 33..128 bytes. */
+.Lcopy32_128:
+ ldp A_l, A_h, [src]
+ ldp B_l, B_h, [src, 16]
+ ldp C_l, C_h, [srcend, -32]
+ ldp D_l, D_h, [srcend, -16]
+ cmp count, 64
+ b.hi .Lcopy128
+ stp A_l, A_h, [dstin]
+ stp B_l, B_h, [dstin, 16]
+ stp C_l, C_h, [dstend, -32]
+ stp D_l, D_h, [dstend, -16]
+ ret
+
+ .p2align 4
+ /* Copy 65..128 bytes. */
+.Lcopy128:
+ ldp E_l, E_h, [src, 32]
+ ldp F_l, F_h, [src, 48]
+ cmp count, 96
+ b.ls .Lcopy96
+ ldp G_l, G_h, [srcend, -64]
+ ldp H_l, H_h, [srcend, -48]
+ stp G_l, G_h, [dstend, -64]
+ stp H_l, H_h, [dstend, -48]
+.Lcopy96:
+ stp A_l, A_h, [dstin]
+ stp B_l, B_h, [dstin, 16]
+ stp E_l, E_h, [dstin, 32]
+ stp F_l, F_h, [dstin, 48]
+ stp C_l, C_h, [dstend, -32]
+ stp D_l, D_h, [dstend, -16]
+ ret
+
+ .p2align 4
+ /* Copy more than 128 bytes. */
+.Lcopy_long:
+
+ /* Copy 16 bytes and then align dst to 16-byte alignment. */
+
+ ldp D_l, D_h, [src]
+ and tmp1, dstin, 15
+ bic dst, dstin, 15
+ sub src, src, tmp1
+ add count, count, tmp1 /* Count is now 16 too large. */
+ ldp A_l, A_h, [src, 16]
+ stp D_l, D_h, [dstin]
+ ldp B_l, B_h, [src, 32]
+ ldp C_l, C_h, [src, 48]
+ ldp D_l, D_h, [src, 64]!
+ subs count, count, 128 + 16 /* Test and readjust count. */
+ b.ls .Lcopy64_from_end
+
+.Lloop64:
+ stp A_l, A_h, [dst, 16]
+ ldp A_l, A_h, [src, 16]
+ stp B_l, B_h, [dst, 32]
+ ldp B_l, B_h, [src, 32]
+ stp C_l, C_h, [dst, 48]
+ ldp C_l, C_h, [src, 48]
+ stp D_l, D_h, [dst, 64]!
+ ldp D_l, D_h, [src, 64]!
+ subs count, count, 64
+ b.hi .Lloop64
+
+ /* Write the last iteration and copy 64 bytes from the end. */
+.Lcopy64_from_end:
+ ldp E_l, E_h, [srcend, -64]
+ stp A_l, A_h, [dst, 16]
+ ldp A_l, A_h, [srcend, -48]
+ stp B_l, B_h, [dst, 32]
+ ldp B_l, B_h, [srcend, -32]
+ stp C_l, C_h, [dst, 48]
+ ldp C_l, C_h, [srcend, -16]
+ stp D_l, D_h, [dst, 64]
+ stp E_l, E_h, [dstend, -64]
+ stp A_l, A_h, [dstend, -48]
+ stp B_l, B_h, [dstend, -32]
+ stp C_l, C_h, [dstend, -16]
+ ret
+
+.size memcpy,.-memcpy
diff --git a/libc-top-half/musl/src/string/aarch64/memset.S b/libc-top-half/musl/src/string/aarch64/memset.S
new file mode 100644
index 0000000..f0d29b7
--- /dev/null
+++ b/libc-top-half/musl/src/string/aarch64/memset.S
@@ -0,0 +1,115 @@
+/*
+ * memset - fill memory with a constant byte
+ *
+ * Copyright (c) 2012-2020, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+
+/* Assumptions:
+ *
+ * ARMv8-a, AArch64, Advanced SIMD, unaligned accesses.
+ *
+ */
+
+#define dstin x0
+#define val x1
+#define valw w1
+#define count x2
+#define dst x3
+#define dstend x4
+#define zva_val x5
+
+.global memset
+.type memset,%function
+memset:
+
+ dup v0.16B, valw
+ add dstend, dstin, count
+
+ cmp count, 96
+ b.hi .Lset_long
+ cmp count, 16
+ b.hs .Lset_medium
+ mov val, v0.D[0]
+
+ /* Set 0..15 bytes. */
+ tbz count, 3, 1f
+ str val, [dstin]
+ str val, [dstend, -8]
+ ret
+ nop
+1: tbz count, 2, 2f
+ str valw, [dstin]
+ str valw, [dstend, -4]
+ ret
+2: cbz count, 3f
+ strb valw, [dstin]
+ tbz count, 1, 3f
+ strh valw, [dstend, -2]
+3: ret
+
+ /* Set 17..96 bytes. */
+.Lset_medium:
+ str q0, [dstin]
+ tbnz count, 6, .Lset96
+ str q0, [dstend, -16]
+ tbz count, 5, 1f
+ str q0, [dstin, 16]
+ str q0, [dstend, -32]
+1: ret
+
+ .p2align 4
+ /* Set 64..96 bytes. Write 64 bytes from the start and
+ 32 bytes from the end. */
+.Lset96:
+ str q0, [dstin, 16]
+ stp q0, q0, [dstin, 32]
+ stp q0, q0, [dstend, -32]
+ ret
+
+ .p2align 4
+.Lset_long:
+ and valw, valw, 255
+ bic dst, dstin, 15
+ str q0, [dstin]
+ cmp count, 160
+ ccmp valw, 0, 0, hs
+ b.ne .Lno_zva
+
+#ifndef SKIP_ZVA_CHECK
+ mrs zva_val, dczid_el0
+ and zva_val, zva_val, 31
+ cmp zva_val, 4 /* ZVA size is 64 bytes. */
+ b.ne .Lno_zva
+#endif
+ str q0, [dst, 16]
+ stp q0, q0, [dst, 32]
+ bic dst, dst, 63
+ sub count, dstend, dst /* Count is now 64 too large. */
+ sub count, count, 128 /* Adjust count and bias for loop. */
+
+ .p2align 4
+.Lzva_loop:
+ add dst, dst, 64
+ dc zva, dst
+ subs count, count, 64
+ b.hi .Lzva_loop
+ stp q0, q0, [dstend, -64]
+ stp q0, q0, [dstend, -32]
+ ret
+
+.Lno_zva:
+ sub count, dstend, dst /* Count is 16 too large. */
+ sub dst, dst, 16 /* Dst is biased by -32. */
+ sub count, count, 64 + 16 /* Adjust count and bias for loop. */
+.Lno_zva_loop:
+ stp q0, q0, [dst, 32]
+ stp q0, q0, [dst, 64]!
+ subs count, count, 64
+ b.hi .Lno_zva_loop
+ stp q0, q0, [dstend, -64]
+ stp q0, q0, [dstend, -32]
+ ret
+
+.size memset,.-memset
+
diff --git a/libc-top-half/musl/src/string/arm/__aeabi_memcpy.s b/libc-top-half/musl/src/string/arm/__aeabi_memcpy.s
new file mode 100644
index 0000000..3a527e4
--- /dev/null
+++ b/libc-top-half/musl/src/string/arm/__aeabi_memcpy.s
@@ -0,0 +1,45 @@
+.syntax unified
+
+.global __aeabi_memcpy8
+.global __aeabi_memcpy4
+.global __aeabi_memcpy
+.global __aeabi_memmove8
+.global __aeabi_memmove4
+.global __aeabi_memmove
+
+.type __aeabi_memcpy8,%function
+.type __aeabi_memcpy4,%function
+.type __aeabi_memcpy,%function
+.type __aeabi_memmove8,%function
+.type __aeabi_memmove4,%function
+.type __aeabi_memmove,%function
+
+__aeabi_memmove8:
+__aeabi_memmove4:
+__aeabi_memmove:
+ cmp r0, r1
+ bls 3f
+ cmp r2, #0
+ beq 2f
+ adds r0, r0, r2
+ adds r2, r1, r2
+1: subs r2, r2, #1
+ ldrb r3, [r2]
+ subs r0, r0, #1
+ strb r3, [r0]
+ cmp r1, r2
+ bne 1b
+2: bx lr
+__aeabi_memcpy8:
+__aeabi_memcpy4:
+__aeabi_memcpy:
+3: cmp r2, #0
+ beq 2f
+ adds r2, r1, r2
+1: ldrb r3, [r1]
+ adds r1, r1, #1
+ strb r3, [r0]
+ adds r0, r0, #1
+ cmp r1, r2
+ bne 1b
+2: bx lr
diff --git a/libc-top-half/musl/src/string/arm/__aeabi_memset.s b/libc-top-half/musl/src/string/arm/__aeabi_memset.s
new file mode 100644
index 0000000..f9f6058
--- /dev/null
+++ b/libc-top-half/musl/src/string/arm/__aeabi_memset.s
@@ -0,0 +1,31 @@
+.syntax unified
+
+.global __aeabi_memclr8
+.global __aeabi_memclr4
+.global __aeabi_memclr
+.global __aeabi_memset8
+.global __aeabi_memset4
+.global __aeabi_memset
+
+.type __aeabi_memclr8,%function
+.type __aeabi_memclr4,%function
+.type __aeabi_memclr,%function
+.type __aeabi_memset8,%function
+.type __aeabi_memset4,%function
+.type __aeabi_memset,%function
+
+__aeabi_memclr8:
+__aeabi_memclr4:
+__aeabi_memclr:
+ movs r2, #0
+__aeabi_memset8:
+__aeabi_memset4:
+__aeabi_memset:
+ cmp r1, #0
+ beq 2f
+ adds r1, r0, r1
+1: strb r2, [r0]
+ adds r0, r0, #1
+ cmp r1, r0
+ bne 1b
+2: bx lr
diff --git a/libc-top-half/musl/src/string/arm/memcpy.S b/libc-top-half/musl/src/string/arm/memcpy.S
new file mode 100644
index 0000000..869e344
--- /dev/null
+++ b/libc-top-half/musl/src/string/arm/memcpy.S
@@ -0,0 +1,479 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * Optimized memcpy() for ARM.
+ *
+ * note that memcpy() always returns the destination pointer,
+ * so we have to preserve R0.
+ */
+
+/*
+ * This file has been modified from the original for use in musl libc.
+ * The main changes are: addition of .type memcpy,%function to make the
+ * code safely callable from thumb mode, adjusting the return
+ * instructions to be compatible with pre-thumb ARM cpus, removal of
+ * prefetch code that is not compatible with older cpus and support for
+ * building as thumb 2 and big-endian.
+ */
+
+.syntax unified
+
+.global memcpy
+.type memcpy,%function
+memcpy:
+ /* The stack must always be 64-bits aligned to be compliant with the
+ * ARM ABI. Since we have to save R0, we might as well save R4
+ * which we can use for better pipelining of the reads below
+ */
+ .fnstart
+ .save {r0, r4, lr}
+ stmfd sp!, {r0, r4, lr}
+ /* Making room for r5-r11 which will be spilled later */
+ .pad #28
+ sub sp, sp, #28
+
+ /* it simplifies things to take care of len<4 early */
+ cmp r2, #4
+ blo copy_last_3_and_return
+
+ /* compute the offset to align the source
+ * offset = (4-(src&3))&3 = -src & 3
+ */
+ rsb r3, r1, #0
+ ands r3, r3, #3
+ beq src_aligned
+
+ /* align source to 32 bits. We need to insert 2 instructions between
+ * a ldr[b|h] and str[b|h] because byte and half-word instructions
+ * stall 2 cycles.
+ */
+ movs r12, r3, lsl #31
+ sub r2, r2, r3 /* we know that r3 <= r2 because r2 >= 4 */
+ ldrbmi r3, [r1], #1
+ ldrbcs r4, [r1], #1
+ ldrbcs r12,[r1], #1
+ strbmi r3, [r0], #1
+ strbcs r4, [r0], #1
+ strbcs r12,[r0], #1
+
+src_aligned:
+
+ /* see if src and dst are aligned together (congruent) */
+ eor r12, r0, r1
+ tst r12, #3
+ bne non_congruent
+
+ /* Use post-incriment mode for stm to spill r5-r11 to reserved stack
+ * frame. Don't update sp.
+ */
+ stmea sp, {r5-r11}
+
+ /* align the destination to a cache-line */
+ rsb r3, r0, #0
+ ands r3, r3, #0x1C
+ beq congruent_aligned32
+ cmp r3, r2
+ andhi r3, r2, #0x1C
+
+ /* conditionnaly copies 0 to 7 words (length in r3) */
+ movs r12, r3, lsl #28
+ ldmcs r1!, {r4, r5, r6, r7} /* 16 bytes */
+ ldmmi r1!, {r8, r9} /* 8 bytes */
+ stmcs r0!, {r4, r5, r6, r7}
+ stmmi r0!, {r8, r9}
+ tst r3, #0x4
+ ldrne r10,[r1], #4 /* 4 bytes */
+ strne r10,[r0], #4
+ sub r2, r2, r3
+
+congruent_aligned32:
+ /*
+ * here source is aligned to 32 bytes.
+ */
+
+cached_aligned32:
+ subs r2, r2, #32
+ blo less_than_32_left
+
+ /*
+ * We preload a cache-line up to 64 bytes ahead. On the 926, this will
+ * stall only until the requested world is fetched, but the linefill
+ * continues in the the background.
+ * While the linefill is going, we write our previous cache-line
+ * into the write-buffer (which should have some free space).
+ * When the linefill is done, the writebuffer will
+ * start dumping its content into memory
+ *
+ * While all this is going, we then load a full cache line into
+ * 8 registers, this cache line should be in the cache by now
+ * (or partly in the cache).
+ *
+ * This code should work well regardless of the source/dest alignment.
+ *
+ */
+
+ /* Align the preload register to a cache-line because the cpu does
+ * "critical word first" (the first word requested is loaded first).
+ */
+ @ bic r12, r1, #0x1F
+ @ add r12, r12, #64
+
+1: ldmia r1!, { r4-r11 }
+ subs r2, r2, #32
+
+ /*
+ * NOTE: if r12 is more than 64 ahead of r1, the following ldrhi
+ * for ARM9 preload will not be safely guarded by the preceding subs.
+ * When it is safely guarded the only possibility to have SIGSEGV here
+ * is because the caller overstates the length.
+ */
+ @ ldrhi r3, [r12], #32 /* cheap ARM9 preload */
+ stmia r0!, { r4-r11 }
+ bhs 1b
+
+ add r2, r2, #32
+
+less_than_32_left:
+ /*
+ * less than 32 bytes left at this point (length in r2)
+ */
+
+ /* skip all this if there is nothing to do, which should
+ * be a common case (if not executed the code below takes
+ * about 16 cycles)
+ */
+ tst r2, #0x1F
+ beq 1f
+
+ /* conditionnaly copies 0 to 31 bytes */
+ movs r12, r2, lsl #28
+ ldmcs r1!, {r4, r5, r6, r7} /* 16 bytes */
+ ldmmi r1!, {r8, r9} /* 8 bytes */
+ stmcs r0!, {r4, r5, r6, r7}
+ stmmi r0!, {r8, r9}
+ movs r12, r2, lsl #30
+ ldrcs r3, [r1], #4 /* 4 bytes */
+ ldrhmi r4, [r1], #2 /* 2 bytes */
+ strcs r3, [r0], #4
+ strhmi r4, [r0], #2
+ tst r2, #0x1
+ ldrbne r3, [r1] /* last byte */
+ strbne r3, [r0]
+
+ /* we're done! restore everything and return */
+1: ldmfd sp!, {r5-r11}
+ ldmfd sp!, {r0, r4, lr}
+ bx lr
+
+ /********************************************************************/
+
+non_congruent:
+ /*
+ * here source is aligned to 4 bytes
+ * but destination is not.
+ *
+ * in the code below r2 is the number of bytes read
+ * (the number of bytes written is always smaller, because we have
+ * partial words in the shift queue)
+ */
+ cmp r2, #4
+ blo copy_last_3_and_return
+
+ /* Use post-incriment mode for stm to spill r5-r11 to reserved stack
+ * frame. Don't update sp.
+ */
+ stmea sp, {r5-r11}
+
+ /* compute shifts needed to align src to dest */
+ rsb r5, r0, #0
+ and r5, r5, #3 /* r5 = # bytes in partial words */
+ mov r12, r5, lsl #3 /* r12 = right */
+ rsb lr, r12, #32 /* lr = left */
+
+ /* read the first word */
+ ldr r3, [r1], #4
+ sub r2, r2, #4
+
+ /* write a partial word (0 to 3 bytes), such that destination
+ * becomes aligned to 32 bits (r5 = nb of words to copy for alignment)
+ */
+ movs r5, r5, lsl #31
+
+#if __ARMEB__
+ movmi r3, r3, ror #24
+ strbmi r3, [r0], #1
+ movcs r3, r3, ror #24
+ strbcs r3, [r0], #1
+ movcs r3, r3, ror #24
+ strbcs r3, [r0], #1
+#else
+ strbmi r3, [r0], #1
+ movmi r3, r3, lsr #8
+ strbcs r3, [r0], #1
+ movcs r3, r3, lsr #8
+ strbcs r3, [r0], #1
+ movcs r3, r3, lsr #8
+#endif
+
+ cmp r2, #4
+ blo partial_word_tail
+
+#if __ARMEB__
+ mov r3, r3, lsr r12
+ mov r3, r3, lsl r12
+#endif
+
+ /* Align destination to 32 bytes (cache line boundary) */
+1: tst r0, #0x1c
+ beq 2f
+ ldr r5, [r1], #4
+ sub r2, r2, #4
+#if __ARMEB__
+ mov r4, r5, lsr lr
+ orr r4, r4, r3
+ mov r3, r5, lsl r12
+#else
+ mov r4, r5, lsl lr
+ orr r4, r4, r3
+ mov r3, r5, lsr r12
+#endif
+ str r4, [r0], #4
+ cmp r2, #4
+ bhs 1b
+ blo partial_word_tail
+
+ /* copy 32 bytes at a time */
+2: subs r2, r2, #32
+ blo less_than_thirtytwo
+
+ /* Use immediate mode for the shifts, because there is an extra cycle
+ * for register shifts, which could account for up to 50% of
+ * performance hit.
+ */
+
+ cmp r12, #24
+ beq loop24
+ cmp r12, #8
+ beq loop8
+
+loop16:
+ ldr r12, [r1], #4
+1: mov r4, r12
+ ldmia r1!, { r5,r6,r7, r8,r9,r10,r11}
+ subs r2, r2, #32
+ ldrhs r12, [r1], #4
+#if __ARMEB__
+ orr r3, r3, r4, lsr #16
+ mov r4, r4, lsl #16
+ orr r4, r4, r5, lsr #16
+ mov r5, r5, lsl #16
+ orr r5, r5, r6, lsr #16
+ mov r6, r6, lsl #16
+ orr r6, r6, r7, lsr #16
+ mov r7, r7, lsl #16
+ orr r7, r7, r8, lsr #16
+ mov r8, r8, lsl #16
+ orr r8, r8, r9, lsr #16
+ mov r9, r9, lsl #16
+ orr r9, r9, r10, lsr #16
+ mov r10, r10, lsl #16
+ orr r10, r10, r11, lsr #16
+ stmia r0!, {r3,r4,r5,r6, r7,r8,r9,r10}
+ mov r3, r11, lsl #16
+#else
+ orr r3, r3, r4, lsl #16
+ mov r4, r4, lsr #16
+ orr r4, r4, r5, lsl #16
+ mov r5, r5, lsr #16
+ orr r5, r5, r6, lsl #16
+ mov r6, r6, lsr #16
+ orr r6, r6, r7, lsl #16
+ mov r7, r7, lsr #16
+ orr r7, r7, r8, lsl #16
+ mov r8, r8, lsr #16
+ orr r8, r8, r9, lsl #16
+ mov r9, r9, lsr #16
+ orr r9, r9, r10, lsl #16
+ mov r10, r10, lsr #16
+ orr r10, r10, r11, lsl #16
+ stmia r0!, {r3,r4,r5,r6, r7,r8,r9,r10}
+ mov r3, r11, lsr #16
+#endif
+ bhs 1b
+ b less_than_thirtytwo
+
+loop8:
+ ldr r12, [r1], #4
+1: mov r4, r12
+ ldmia r1!, { r5,r6,r7, r8,r9,r10,r11}
+ subs r2, r2, #32
+ ldrhs r12, [r1], #4
+#if __ARMEB__
+ orr r3, r3, r4, lsr #24
+ mov r4, r4, lsl #8
+ orr r4, r4, r5, lsr #24
+ mov r5, r5, lsl #8
+ orr r5, r5, r6, lsr #24
+ mov r6, r6, lsl #8
+ orr r6, r6, r7, lsr #24
+ mov r7, r7, lsl #8
+ orr r7, r7, r8, lsr #24
+ mov r8, r8, lsl #8
+ orr r8, r8, r9, lsr #24
+ mov r9, r9, lsl #8
+ orr r9, r9, r10, lsr #24
+ mov r10, r10, lsl #8
+ orr r10, r10, r11, lsr #24
+ stmia r0!, {r3,r4,r5,r6, r7,r8,r9,r10}
+ mov r3, r11, lsl #8
+#else
+ orr r3, r3, r4, lsl #24
+ mov r4, r4, lsr #8
+ orr r4, r4, r5, lsl #24
+ mov r5, r5, lsr #8
+ orr r5, r5, r6, lsl #24
+ mov r6, r6, lsr #8
+ orr r6, r6, r7, lsl #24
+ mov r7, r7, lsr #8
+ orr r7, r7, r8, lsl #24
+ mov r8, r8, lsr #8
+ orr r8, r8, r9, lsl #24
+ mov r9, r9, lsr #8
+ orr r9, r9, r10, lsl #24
+ mov r10, r10, lsr #8
+ orr r10, r10, r11, lsl #24
+ stmia r0!, {r3,r4,r5,r6, r7,r8,r9,r10}
+ mov r3, r11, lsr #8
+#endif
+ bhs 1b
+ b less_than_thirtytwo
+
+loop24:
+ ldr r12, [r1], #4
+1: mov r4, r12
+ ldmia r1!, { r5,r6,r7, r8,r9,r10,r11}
+ subs r2, r2, #32
+ ldrhs r12, [r1], #4
+#if __ARMEB__
+ orr r3, r3, r4, lsr #8
+ mov r4, r4, lsl #24
+ orr r4, r4, r5, lsr #8
+ mov r5, r5, lsl #24
+ orr r5, r5, r6, lsr #8
+ mov r6, r6, lsl #24
+ orr r6, r6, r7, lsr #8
+ mov r7, r7, lsl #24
+ orr r7, r7, r8, lsr #8
+ mov r8, r8, lsl #24
+ orr r8, r8, r9, lsr #8
+ mov r9, r9, lsl #24
+ orr r9, r9, r10, lsr #8
+ mov r10, r10, lsl #24
+ orr r10, r10, r11, lsr #8
+ stmia r0!, {r3,r4,r5,r6, r7,r8,r9,r10}
+ mov r3, r11, lsl #24
+#else
+ orr r3, r3, r4, lsl #8
+ mov r4, r4, lsr #24
+ orr r4, r4, r5, lsl #8
+ mov r5, r5, lsr #24
+ orr r5, r5, r6, lsl #8
+ mov r6, r6, lsr #24
+ orr r6, r6, r7, lsl #8
+ mov r7, r7, lsr #24
+ orr r7, r7, r8, lsl #8
+ mov r8, r8, lsr #24
+ orr r8, r8, r9, lsl #8
+ mov r9, r9, lsr #24
+ orr r9, r9, r10, lsl #8
+ mov r10, r10, lsr #24
+ orr r10, r10, r11, lsl #8
+ stmia r0!, {r3,r4,r5,r6, r7,r8,r9,r10}
+ mov r3, r11, lsr #24
+#endif
+ bhs 1b
+
+less_than_thirtytwo:
+ /* copy the last 0 to 31 bytes of the source */
+ rsb r12, lr, #32 /* we corrupted r12, recompute it */
+ add r2, r2, #32
+ cmp r2, #4
+ blo partial_word_tail
+
+1: ldr r5, [r1], #4
+ sub r2, r2, #4
+#if __ARMEB__
+ mov r4, r5, lsr lr
+ orr r4, r4, r3
+ mov r3, r5, lsl r12
+#else
+ mov r4, r5, lsl lr
+ orr r4, r4, r3
+ mov r3, r5, lsr r12
+#endif
+ str r4, [r0], #4
+ cmp r2, #4
+ bhs 1b
+
+partial_word_tail:
+ /* we have a partial word in the input buffer */
+ movs r5, lr, lsl #(31-3)
+#if __ARMEB__
+ movmi r3, r3, ror #24
+ strbmi r3, [r0], #1
+ movcs r3, r3, ror #24
+ strbcs r3, [r0], #1
+ movcs r3, r3, ror #24
+ strbcs r3, [r0], #1
+#else
+ strbmi r3, [r0], #1
+ movmi r3, r3, lsr #8
+ strbcs r3, [r0], #1
+ movcs r3, r3, lsr #8
+ strbcs r3, [r0], #1
+#endif
+
+ /* Refill spilled registers from the stack. Don't update sp. */
+ ldmfd sp, {r5-r11}
+
+copy_last_3_and_return:
+ movs r2, r2, lsl #31 /* copy remaining 0, 1, 2 or 3 bytes */
+ ldrbmi r2, [r1], #1
+ ldrbcs r3, [r1], #1
+ ldrbcs r12,[r1]
+ strbmi r2, [r0], #1
+ strbcs r3, [r0], #1
+ strbcs r12,[r0]
+
+ /* we're done! restore sp and spilled registers and return */
+ add sp, sp, #28
+ ldmfd sp!, {r0, r4, lr}
+ bx lr
+
diff --git a/libc-top-half/musl/src/string/bcmp.c b/libc-top-half/musl/src/string/bcmp.c
new file mode 100644
index 0000000..87c6007
--- /dev/null
+++ b/libc-top-half/musl/src/string/bcmp.c
@@ -0,0 +1,8 @@
+#define _BSD_SOURCE
+#include <string.h>
+#include <strings.h>
+
+int bcmp(const void *s1, const void *s2, size_t n)
+{
+ return memcmp(s1, s2, n);
+}
diff --git a/libc-top-half/musl/src/string/bcopy.c b/libc-top-half/musl/src/string/bcopy.c
new file mode 100644
index 0000000..a07129f
--- /dev/null
+++ b/libc-top-half/musl/src/string/bcopy.c
@@ -0,0 +1,8 @@
+#define _BSD_SOURCE
+#include <string.h>
+#include <strings.h>
+
+void bcopy(const void *s1, void *s2, size_t n)
+{
+ memmove(s2, s1, n);
+}
diff --git a/libc-top-half/musl/src/string/bzero.c b/libc-top-half/musl/src/string/bzero.c
new file mode 100644
index 0000000..ba536b0
--- /dev/null
+++ b/libc-top-half/musl/src/string/bzero.c
@@ -0,0 +1,8 @@
+#define _BSD_SOURCE
+#include <string.h>
+#include <strings.h>
+
+void bzero(void *s, size_t n)
+{
+ memset(s, 0, n);
+}
diff --git a/libc-top-half/musl/src/string/explicit_bzero.c b/libc-top-half/musl/src/string/explicit_bzero.c
new file mode 100644
index 0000000..f2e12f2
--- /dev/null
+++ b/libc-top-half/musl/src/string/explicit_bzero.c
@@ -0,0 +1,8 @@
+#define _BSD_SOURCE
+#include <string.h>
+
+void explicit_bzero(void *d, size_t n)
+{
+ d = memset(d, 0, n);
+ __asm__ __volatile__ ("" : : "r"(d) : "memory");
+}
diff --git a/libc-top-half/musl/src/string/i386/memcpy.s b/libc-top-half/musl/src/string/i386/memcpy.s
new file mode 100644
index 0000000..0608dd8
--- /dev/null
+++ b/libc-top-half/musl/src/string/i386/memcpy.s
@@ -0,0 +1,32 @@
+.global memcpy
+.global __memcpy_fwd
+.hidden __memcpy_fwd
+.type memcpy,@function
+memcpy:
+__memcpy_fwd:
+ push %esi
+ push %edi
+ mov 12(%esp),%edi
+ mov 16(%esp),%esi
+ mov 20(%esp),%ecx
+ mov %edi,%eax
+ cmp $4,%ecx
+ jc 1f
+ test $3,%edi
+ jz 1f
+2: movsb
+ dec %ecx
+ test $3,%edi
+ jnz 2b
+1: mov %ecx,%edx
+ shr $2,%ecx
+ rep
+ movsl
+ and $3,%edx
+ jz 1f
+2: movsb
+ dec %edx
+ jnz 2b
+1: pop %edi
+ pop %esi
+ ret
diff --git a/libc-top-half/musl/src/string/i386/memmove.s b/libc-top-half/musl/src/string/i386/memmove.s
new file mode 100644
index 0000000..2a6a504
--- /dev/null
+++ b/libc-top-half/musl/src/string/i386/memmove.s
@@ -0,0 +1,22 @@
+.global memmove
+.type memmove,@function
+memmove:
+ mov 4(%esp),%eax
+ sub 8(%esp),%eax
+ cmp 12(%esp),%eax
+.hidden __memcpy_fwd
+ jae __memcpy_fwd
+ push %esi
+ push %edi
+ mov 12(%esp),%edi
+ mov 16(%esp),%esi
+ mov 20(%esp),%ecx
+ lea -1(%edi,%ecx),%edi
+ lea -1(%esi,%ecx),%esi
+ std
+ rep movsb
+ cld
+ lea 1(%edi),%eax
+ pop %edi
+ pop %esi
+ ret
diff --git a/libc-top-half/musl/src/string/i386/memset.s b/libc-top-half/musl/src/string/i386/memset.s
new file mode 100644
index 0000000..d00422c
--- /dev/null
+++ b/libc-top-half/musl/src/string/i386/memset.s
@@ -0,0 +1,76 @@
+.global memset
+.type memset,@function
+memset:
+ mov 12(%esp),%ecx
+ cmp $62,%ecx
+ ja 2f
+
+ mov 8(%esp),%dl
+ mov 4(%esp),%eax
+ test %ecx,%ecx
+ jz 1f
+
+ mov %dl,%dh
+
+ mov %dl,(%eax)
+ mov %dl,-1(%eax,%ecx)
+ cmp $2,%ecx
+ jbe 1f
+
+ mov %dx,1(%eax)
+ mov %dx,(-1-2)(%eax,%ecx)
+ cmp $6,%ecx
+ jbe 1f
+
+ shl $16,%edx
+ mov 8(%esp),%dl
+ mov 8(%esp),%dh
+
+ mov %edx,(1+2)(%eax)
+ mov %edx,(-1-2-4)(%eax,%ecx)
+ cmp $14,%ecx
+ jbe 1f
+
+ mov %edx,(1+2+4)(%eax)
+ mov %edx,(1+2+4+4)(%eax)
+ mov %edx,(-1-2-4-8)(%eax,%ecx)
+ mov %edx,(-1-2-4-4)(%eax,%ecx)
+ cmp $30,%ecx
+ jbe 1f
+
+ mov %edx,(1+2+4+8)(%eax)
+ mov %edx,(1+2+4+8+4)(%eax)
+ mov %edx,(1+2+4+8+8)(%eax)
+ mov %edx,(1+2+4+8+12)(%eax)
+ mov %edx,(-1-2-4-8-16)(%eax,%ecx)
+ mov %edx,(-1-2-4-8-12)(%eax,%ecx)
+ mov %edx,(-1-2-4-8-8)(%eax,%ecx)
+ mov %edx,(-1-2-4-8-4)(%eax,%ecx)
+
+1: ret
+
+2: movzbl 8(%esp),%eax
+ mov %edi,12(%esp)
+ imul $0x1010101,%eax
+ mov 4(%esp),%edi
+ test $15,%edi
+ mov %eax,-4(%edi,%ecx)
+ jnz 2f
+
+1: shr $2, %ecx
+ rep
+ stosl
+ mov 4(%esp),%eax
+ mov 12(%esp),%edi
+ ret
+
+2: xor %edx,%edx
+ sub %edi,%edx
+ and $15,%edx
+ mov %eax,(%edi)
+ mov %eax,4(%edi)
+ mov %eax,8(%edi)
+ mov %eax,12(%edi)
+ sub %edx,%ecx
+ add %edx,%edi
+ jmp 1b
diff --git a/libc-top-half/musl/src/string/index.c b/libc-top-half/musl/src/string/index.c
new file mode 100644
index 0000000..252948f
--- /dev/null
+++ b/libc-top-half/musl/src/string/index.c
@@ -0,0 +1,8 @@
+#define _BSD_SOURCE
+#include <string.h>
+#include <strings.h>
+
+char *index(const char *s, int c)
+{
+ return strchr(s, c);
+}
diff --git a/libc-top-half/musl/src/string/memccpy.c b/libc-top-half/musl/src/string/memccpy.c
new file mode 100644
index 0000000..3b0a370
--- /dev/null
+++ b/libc-top-half/musl/src/string/memccpy.c
@@ -0,0 +1,34 @@
+#include <string.h>
+#include <stdint.h>
+#include <limits.h>
+
+#define ALIGN (sizeof(size_t)-1)
+#define ONES ((size_t)-1/UCHAR_MAX)
+#define HIGHS (ONES * (UCHAR_MAX/2+1))
+#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
+
+void *memccpy(void *restrict dest, const void *restrict src, int c, size_t n)
+{
+ unsigned char *d = dest;
+ const unsigned char *s = src;
+
+ c = (unsigned char)c;
+#ifdef __GNUC__
+ typedef size_t __attribute__((__may_alias__)) word;
+ word *wd;
+ const word *ws;
+ if (((uintptr_t)s & ALIGN) == ((uintptr_t)d & ALIGN)) {
+ for (; ((uintptr_t)s & ALIGN) && n && (*d=*s)!=c; n--, s++, d++);
+ if ((uintptr_t)s & ALIGN) goto tail;
+ size_t k = ONES * c;
+ wd=(void *)d; ws=(const void *)s;
+ for (; n>=sizeof(size_t) && !HASZERO(*ws^k);
+ n-=sizeof(size_t), ws++, wd++) *wd = *ws;
+ d=(void *)wd; s=(const void *)ws;
+ }
+#endif
+ for (; n && (*d=*s)!=c; n--, s++, d++);
+tail:
+ if (n) return d+1;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/string/memchr.c b/libc-top-half/musl/src/string/memchr.c
new file mode 100644
index 0000000..65f0d78
--- /dev/null
+++ b/libc-top-half/musl/src/string/memchr.c
@@ -0,0 +1,27 @@
+#include <string.h>
+#include <stdint.h>
+#include <limits.h>
+
+#define SS (sizeof(size_t))
+#define ALIGN (sizeof(size_t)-1)
+#define ONES ((size_t)-1/UCHAR_MAX)
+#define HIGHS (ONES * (UCHAR_MAX/2+1))
+#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
+
+void *memchr(const void *src, int c, size_t n)
+{
+ const unsigned char *s = src;
+ c = (unsigned char)c;
+#ifdef __GNUC__
+ for (; ((uintptr_t)s & ALIGN) && n && *s != c; s++, n--);
+ if (n && *s != c) {
+ typedef size_t __attribute__((__may_alias__)) word;
+ const word *w;
+ size_t k = ONES * c;
+ for (w = (const void *)s; n>=SS && !HASZERO(*w^k); w++, n-=SS);
+ s = (const void *)w;
+ }
+#endif
+ for (; n && *s != c; s++, n--);
+ return n ? (void *)s : 0;
+}
diff --git a/libc-top-half/musl/src/string/memcmp.c b/libc-top-half/musl/src/string/memcmp.c
new file mode 100644
index 0000000..bdbce9f
--- /dev/null
+++ b/libc-top-half/musl/src/string/memcmp.c
@@ -0,0 +1,8 @@
+#include <string.h>
+
+int memcmp(const void *vl, const void *vr, size_t n)
+{
+ const unsigned char *l=vl, *r=vr;
+ for (; n && *l == *r; n--, l++, r++);
+ return n ? *l-*r : 0;
+}
diff --git a/libc-top-half/musl/src/string/memcpy.c b/libc-top-half/musl/src/string/memcpy.c
new file mode 100644
index 0000000..3cc7e28
--- /dev/null
+++ b/libc-top-half/musl/src/string/memcpy.c
@@ -0,0 +1,128 @@
+#include <string.h>
+#include <stdint.h>
+#include <endian.h>
+
+void *memcpy(void *restrict dest, const void *restrict src, size_t n)
+{
+#if defined(__wasm_bulk_memory__)
+ if (n > BULK_MEMORY_THRESHOLD)
+ return __builtin_memcpy(dest, src, n);
+#endif
+ unsigned char *d = dest;
+ const unsigned char *s = src;
+
+#ifdef __GNUC__
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define LS >>
+#define RS <<
+#else
+#define LS <<
+#define RS >>
+#endif
+
+ typedef uint32_t __attribute__((__may_alias__)) u32;
+ uint32_t w, x;
+
+ for (; (uintptr_t)s % 4 && n; n--) *d++ = *s++;
+
+ if ((uintptr_t)d % 4 == 0) {
+ for (; n>=16; s+=16, d+=16, n-=16) {
+ *(u32 *)(d+0) = *(u32 *)(s+0);
+ *(u32 *)(d+4) = *(u32 *)(s+4);
+ *(u32 *)(d+8) = *(u32 *)(s+8);
+ *(u32 *)(d+12) = *(u32 *)(s+12);
+ }
+ if (n&8) {
+ *(u32 *)(d+0) = *(u32 *)(s+0);
+ *(u32 *)(d+4) = *(u32 *)(s+4);
+ d += 8; s += 8;
+ }
+ if (n&4) {
+ *(u32 *)(d+0) = *(u32 *)(s+0);
+ d += 4; s += 4;
+ }
+ if (n&2) {
+ *d++ = *s++; *d++ = *s++;
+ }
+ if (n&1) {
+ *d = *s;
+ }
+ return dest;
+ }
+
+ if (n >= 32) switch ((uintptr_t)d % 4) {
+ case 1:
+ w = *(u32 *)s;
+ *d++ = *s++;
+ *d++ = *s++;
+ *d++ = *s++;
+ n -= 3;
+ for (; n>=17; s+=16, d+=16, n-=16) {
+ x = *(u32 *)(s+1);
+ *(u32 *)(d+0) = (w LS 24) | (x RS 8);
+ w = *(u32 *)(s+5);
+ *(u32 *)(d+4) = (x LS 24) | (w RS 8);
+ x = *(u32 *)(s+9);
+ *(u32 *)(d+8) = (w LS 24) | (x RS 8);
+ w = *(u32 *)(s+13);
+ *(u32 *)(d+12) = (x LS 24) | (w RS 8);
+ }
+ break;
+ case 2:
+ w = *(u32 *)s;
+ *d++ = *s++;
+ *d++ = *s++;
+ n -= 2;
+ for (; n>=18; s+=16, d+=16, n-=16) {
+ x = *(u32 *)(s+2);
+ *(u32 *)(d+0) = (w LS 16) | (x RS 16);
+ w = *(u32 *)(s+6);
+ *(u32 *)(d+4) = (x LS 16) | (w RS 16);
+ x = *(u32 *)(s+10);
+ *(u32 *)(d+8) = (w LS 16) | (x RS 16);
+ w = *(u32 *)(s+14);
+ *(u32 *)(d+12) = (x LS 16) | (w RS 16);
+ }
+ break;
+ case 3:
+ w = *(u32 *)s;
+ *d++ = *s++;
+ n -= 1;
+ for (; n>=19; s+=16, d+=16, n-=16) {
+ x = *(u32 *)(s+3);
+ *(u32 *)(d+0) = (w LS 8) | (x RS 24);
+ w = *(u32 *)(s+7);
+ *(u32 *)(d+4) = (x LS 8) | (w RS 24);
+ x = *(u32 *)(s+11);
+ *(u32 *)(d+8) = (w LS 8) | (x RS 24);
+ w = *(u32 *)(s+15);
+ *(u32 *)(d+12) = (x LS 8) | (w RS 24);
+ }
+ break;
+ }
+ if (n&16) {
+ *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++;
+ *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++;
+ *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++;
+ *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++;
+ }
+ if (n&8) {
+ *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++;
+ *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++;
+ }
+ if (n&4) {
+ *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++;
+ }
+ if (n&2) {
+ *d++ = *s++; *d++ = *s++;
+ }
+ if (n&1) {
+ *d = *s;
+ }
+ return dest;
+#endif
+
+ for (; n; n--) *d++ = *s++;
+ return dest;
+}
diff --git a/libc-top-half/musl/src/string/memmem.c b/libc-top-half/musl/src/string/memmem.c
new file mode 100644
index 0000000..11eff86
--- /dev/null
+++ b/libc-top-half/musl/src/string/memmem.c
@@ -0,0 +1,149 @@
+#define _GNU_SOURCE
+#include <string.h>
+#include <stdint.h>
+
+static char *twobyte_memmem(const unsigned char *h, size_t k, const unsigned char *n)
+{
+ uint16_t nw = n[0]<<8 | n[1], hw = h[0]<<8 | h[1];
+ for (h+=2, k-=2; k; k--, hw = hw<<8 | *h++)
+ if (hw == nw) return (char *)h-2;
+ return hw == nw ? (char *)h-2 : 0;
+}
+
+static char *threebyte_memmem(const unsigned char *h, size_t k, const unsigned char *n)
+{
+ uint32_t nw = (uint32_t)n[0]<<24 | n[1]<<16 | n[2]<<8;
+ uint32_t hw = (uint32_t)h[0]<<24 | h[1]<<16 | h[2]<<8;
+ for (h+=3, k-=3; k; k--, hw = (hw|*h++)<<8)
+ if (hw == nw) return (char *)h-3;
+ return hw == nw ? (char *)h-3 : 0;
+}
+
+static char *fourbyte_memmem(const unsigned char *h, size_t k, const unsigned char *n)
+{
+ uint32_t nw = (uint32_t)n[0]<<24 | n[1]<<16 | n[2]<<8 | n[3];
+ uint32_t hw = (uint32_t)h[0]<<24 | h[1]<<16 | h[2]<<8 | h[3];
+ for (h+=4, k-=4; k; k--, hw = hw<<8 | *h++)
+ if (hw == nw) return (char *)h-4;
+ return hw == nw ? (char *)h-4 : 0;
+}
+
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#define MIN(a,b) ((a)<(b)?(a):(b))
+
+#define BITOP(a,b,op) \
+ ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))
+
+static char *twoway_memmem(const unsigned char *h, const unsigned char *z, const unsigned char *n, size_t l)
+{
+ size_t i, ip, jp, k, p, ms, p0, mem, mem0;
+ size_t byteset[32 / sizeof(size_t)] = { 0 };
+ size_t shift[256];
+
+ /* Computing length of needle and fill shift table */
+ for (i=0; i<l; i++)
+ BITOP(byteset, n[i], |=), shift[n[i]] = i+1;
+
+ /* Compute maximal suffix */
+ ip = -1; jp = 0; k = p = 1;
+ while (jp+k<l) {
+ if (n[ip+k] == n[jp+k]) {
+ if (k == p) {
+ jp += p;
+ k = 1;
+ } else k++;
+ } else if (n[ip+k] > n[jp+k]) {
+ jp += k;
+ k = 1;
+ p = jp - ip;
+ } else {
+ ip = jp++;
+ k = p = 1;
+ }
+ }
+ ms = ip;
+ p0 = p;
+
+ /* And with the opposite comparison */
+ ip = -1; jp = 0; k = p = 1;
+ while (jp+k<l) {
+ if (n[ip+k] == n[jp+k]) {
+ if (k == p) {
+ jp += p;
+ k = 1;
+ } else k++;
+ } else if (n[ip+k] < n[jp+k]) {
+ jp += k;
+ k = 1;
+ p = jp - ip;
+ } else {
+ ip = jp++;
+ k = p = 1;
+ }
+ }
+ if (ip+1 > ms+1) ms = ip;
+ else p = p0;
+
+ /* Periodic needle? */
+ if (memcmp(n, n+p, ms+1)) {
+ mem0 = 0;
+ p = MAX(ms, l-ms-1) + 1;
+ } else mem0 = l-p;
+ mem = 0;
+
+ /* Search loop */
+ for (;;) {
+ /* If remainder of haystack is shorter than needle, done */
+ if (z-h < l) return 0;
+
+ /* Check last byte first; advance by shift on mismatch */
+ if (BITOP(byteset, h[l-1], &)) {
+ k = l-shift[h[l-1]];
+ if (k) {
+ if (k < mem) k = mem;
+ h += k;
+ mem = 0;
+ continue;
+ }
+ } else {
+ h += l;
+ mem = 0;
+ continue;
+ }
+
+ /* Compare right half */
+ for (k=MAX(ms+1,mem); k<l && n[k] == h[k]; k++);
+ if (k < l) {
+ h += k-ms;
+ mem = 0;
+ continue;
+ }
+ /* Compare left half */
+ for (k=ms+1; k>mem && n[k-1] == h[k-1]; k--);
+ if (k <= mem) return (char *)h;
+ h += p;
+ mem = mem0;
+ }
+}
+
+void *memmem(const void *h0, size_t k, const void *n0, size_t l)
+{
+ const unsigned char *h = h0, *n = n0;
+
+ /* Return immediately on empty needle */
+ if (!l) return (void *)h;
+
+ /* Return immediately when needle is longer than haystack */
+ if (k<l) return 0;
+
+ /* Use faster algorithms for short needles */
+ h = memchr(h0, *n, k);
+ if (!h || l==1) return (void *)h;
+ k -= h - (const unsigned char *)h0;
+ if (k<l) return 0;
+ if (l==2) return twobyte_memmem(h, k, n);
+ if (l==3) return threebyte_memmem(h, k, n);
+ if (l==4) return fourbyte_memmem(h, k, n);
+
+ return twoway_memmem(h, h+k, n, l);
+}
diff --git a/libc-top-half/musl/src/string/memmove.c b/libc-top-half/musl/src/string/memmove.c
new file mode 100644
index 0000000..7376a52
--- /dev/null
+++ b/libc-top-half/musl/src/string/memmove.c
@@ -0,0 +1,46 @@
+#include <string.h>
+#include <stdint.h>
+
+#ifdef __GNUC__
+typedef __attribute__((__may_alias__)) size_t WT;
+#define WS (sizeof(WT))
+#endif
+
+void *memmove(void *dest, const void *src, size_t n)
+{
+#if defined(__wasm_bulk_memory__)
+ if (n > BULK_MEMORY_THRESHOLD)
+ return __builtin_memmove(dest, src, n);
+#endif
+ char *d = dest;
+ const char *s = src;
+
+ if (d==s) return d;
+ if ((uintptr_t)s-(uintptr_t)d-n <= -2*n) return memcpy(d, s, n);
+
+ if (d<s) {
+#ifdef __GNUC__
+ if ((uintptr_t)s % WS == (uintptr_t)d % WS) {
+ while ((uintptr_t)d % WS) {
+ if (!n--) return dest;
+ *d++ = *s++;
+ }
+ for (; n>=WS; n-=WS, d+=WS, s+=WS) *(WT *)d = *(WT *)s;
+ }
+#endif
+ for (; n; n--) *d++ = *s++;
+ } else {
+#ifdef __GNUC__
+ if ((uintptr_t)s % WS == (uintptr_t)d % WS) {
+ while ((uintptr_t)(d+n) % WS) {
+ if (!n--) return dest;
+ d[n] = s[n];
+ }
+ while (n>=WS) n-=WS, *(WT *)(d+n) = *(WT *)(s+n);
+ }
+#endif
+ while (n) n--, d[n] = s[n];
+ }
+
+ return dest;
+}
diff --git a/libc-top-half/musl/src/string/mempcpy.c b/libc-top-half/musl/src/string/mempcpy.c
new file mode 100644
index 0000000..a297985
--- /dev/null
+++ b/libc-top-half/musl/src/string/mempcpy.c
@@ -0,0 +1,7 @@
+#define _GNU_SOURCE
+#include <string.h>
+
+void *mempcpy(void *dest, const void *src, size_t n)
+{
+ return (char *)memcpy(dest, src, n) + n;
+}
diff --git a/libc-top-half/musl/src/string/memrchr.c b/libc-top-half/musl/src/string/memrchr.c
new file mode 100644
index 0000000..e51748b
--- /dev/null
+++ b/libc-top-half/musl/src/string/memrchr.c
@@ -0,0 +1,11 @@
+#include <string.h>
+
+void *__memrchr(const void *m, int c, size_t n)
+{
+ const unsigned char *s = m;
+ c = (unsigned char)c;
+ while (n--) if (s[n]==c) return (void *)(s+n);
+ return 0;
+}
+
+weak_alias(__memrchr, memrchr);
diff --git a/libc-top-half/musl/src/string/memset.c b/libc-top-half/musl/src/string/memset.c
new file mode 100644
index 0000000..f64c9cf
--- /dev/null
+++ b/libc-top-half/musl/src/string/memset.c
@@ -0,0 +1,94 @@
+#include <string.h>
+#include <stdint.h>
+
+void *memset(void *dest, int c, size_t n)
+{
+#if defined(__wasm_bulk_memory__)
+ if (n > BULK_MEMORY_THRESHOLD)
+ return __builtin_memset(dest, c, n);
+#endif
+ unsigned char *s = dest;
+ size_t k;
+
+ /* Fill head and tail with minimal branching. Each
+ * conditional ensures that all the subsequently used
+ * offsets are well-defined and in the dest region. */
+
+ if (!n) return dest;
+ s[0] = c;
+ s[n-1] = c;
+ if (n <= 2) return dest;
+ s[1] = c;
+ s[2] = c;
+ s[n-2] = c;
+ s[n-3] = c;
+ if (n <= 6) return dest;
+ s[3] = c;
+ s[n-4] = c;
+ if (n <= 8) return dest;
+
+ /* Advance pointer to align it at a 4-byte boundary,
+ * and truncate n to a multiple of 4. The previous code
+ * already took care of any head/tail that get cut off
+ * by the alignment. */
+
+ k = -(uintptr_t)s & 3;
+ s += k;
+ n -= k;
+ n &= -4;
+
+#ifdef __GNUC__
+ typedef uint32_t __attribute__((__may_alias__)) u32;
+ typedef uint64_t __attribute__((__may_alias__)) u64;
+
+ u32 c32 = ((u32)-1)/255 * (unsigned char)c;
+
+ /* In preparation to copy 32 bytes at a time, aligned on
+ * an 8-byte bounary, fill head/tail up to 28 bytes each.
+ * As in the initial byte-based head/tail fill, each
+ * conditional below ensures that the subsequent offsets
+ * are valid (e.g. !(n<=24) implies n>=28). */
+
+ *(u32 *)(s+0) = c32;
+ *(u32 *)(s+n-4) = c32;
+ if (n <= 8) return dest;
+ *(u32 *)(s+4) = c32;
+ *(u32 *)(s+8) = c32;
+ *(u32 *)(s+n-12) = c32;
+ *(u32 *)(s+n-8) = c32;
+ if (n <= 24) return dest;
+ *(u32 *)(s+12) = c32;
+ *(u32 *)(s+16) = c32;
+ *(u32 *)(s+20) = c32;
+ *(u32 *)(s+24) = c32;
+ *(u32 *)(s+n-28) = c32;
+ *(u32 *)(s+n-24) = c32;
+ *(u32 *)(s+n-20) = c32;
+ *(u32 *)(s+n-16) = c32;
+
+ /* Align to a multiple of 8 so we can fill 64 bits at a time,
+ * and avoid writing the same bytes twice as much as is
+ * practical without introducing additional branching. */
+
+ k = 24 + ((uintptr_t)s & 4);
+ s += k;
+ n -= k;
+
+ /* If this loop is reached, 28 tail bytes have already been
+ * filled, so any remainder when n drops below 32 can be
+ * safely ignored. */
+
+ u64 c64 = c32 | ((u64)c32 << 32);
+ for (; n >= 32; n-=32, s+=32) {
+ *(u64 *)(s+0) = c64;
+ *(u64 *)(s+8) = c64;
+ *(u64 *)(s+16) = c64;
+ *(u64 *)(s+24) = c64;
+ }
+#else
+ /* Pure C fallback with no aliasing violations. */
+ for (; n; n--, s++) *s = c;
+#endif
+
+ return dest;
+}
diff --git a/libc-top-half/musl/src/string/rindex.c b/libc-top-half/musl/src/string/rindex.c
new file mode 100644
index 0000000..693c750
--- /dev/null
+++ b/libc-top-half/musl/src/string/rindex.c
@@ -0,0 +1,8 @@
+#define _BSD_SOURCE
+#include <string.h>
+#include <strings.h>
+
+char *rindex(const char *s, int c)
+{
+ return strrchr(s, c);
+}
diff --git a/libc-top-half/musl/src/string/stpcpy.c b/libc-top-half/musl/src/string/stpcpy.c
new file mode 100644
index 0000000..4db46a9
--- /dev/null
+++ b/libc-top-half/musl/src/string/stpcpy.c
@@ -0,0 +1,29 @@
+#include <string.h>
+#include <stdint.h>
+#include <limits.h>
+
+#define ALIGN (sizeof(size_t))
+#define ONES ((size_t)-1/UCHAR_MAX)
+#define HIGHS (ONES * (UCHAR_MAX/2+1))
+#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
+
+char *__stpcpy(char *restrict d, const char *restrict s)
+{
+#ifdef __GNUC__
+ typedef size_t __attribute__((__may_alias__)) word;
+ word *wd;
+ const word *ws;
+ if ((uintptr_t)s % ALIGN == (uintptr_t)d % ALIGN) {
+ for (; (uintptr_t)s % ALIGN; s++, d++)
+ if (!(*d=*s)) return d;
+ wd=(void *)d; ws=(const void *)s;
+ for (; !HASZERO(*ws); *wd++ = *ws++);
+ d=(void *)wd; s=(const void *)ws;
+ }
+#endif
+ for (; (*d=*s); s++, d++);
+
+ return d;
+}
+
+weak_alias(__stpcpy, stpcpy);
diff --git a/libc-top-half/musl/src/string/stpncpy.c b/libc-top-half/musl/src/string/stpncpy.c
new file mode 100644
index 0000000..f57fa6b
--- /dev/null
+++ b/libc-top-half/musl/src/string/stpncpy.c
@@ -0,0 +1,32 @@
+#include <string.h>
+#include <stdint.h>
+#include <limits.h>
+
+#define ALIGN (sizeof(size_t)-1)
+#define ONES ((size_t)-1/UCHAR_MAX)
+#define HIGHS (ONES * (UCHAR_MAX/2+1))
+#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
+
+char *__stpncpy(char *restrict d, const char *restrict s, size_t n)
+{
+#ifdef __GNUC__
+ typedef size_t __attribute__((__may_alias__)) word;
+ word *wd;
+ const word *ws;
+ if (((uintptr_t)s & ALIGN) == ((uintptr_t)d & ALIGN)) {
+ for (; ((uintptr_t)s & ALIGN) && n && (*d=*s); n--, s++, d++);
+ if (!n || !*s) goto tail;
+ wd=(void *)d; ws=(const void *)s;
+ for (; n>=sizeof(size_t) && !HASZERO(*ws);
+ n-=sizeof(size_t), ws++, wd++) *wd = *ws;
+ d=(void *)wd; s=(const void *)ws;
+ }
+#endif
+ for (; n && (*d=*s); n--, s++, d++);
+tail:
+ memset(d, 0, n);
+ return d;
+}
+
+weak_alias(__stpncpy, stpncpy);
+
diff --git a/libc-top-half/musl/src/string/strcasecmp.c b/libc-top-half/musl/src/string/strcasecmp.c
new file mode 100644
index 0000000..002c6aa
--- /dev/null
+++ b/libc-top-half/musl/src/string/strcasecmp.c
@@ -0,0 +1,16 @@
+#include <strings.h>
+#include <ctype.h>
+
+int strcasecmp(const char *_l, const char *_r)
+{
+ const unsigned char *l=(void *)_l, *r=(void *)_r;
+ for (; *l && *r && (*l == *r || tolower(*l) == tolower(*r)); l++, r++);
+ return tolower(*l) - tolower(*r);
+}
+
+int __strcasecmp_l(const char *l, const char *r, locale_t loc)
+{
+ return strcasecmp(l, r);
+}
+
+weak_alias(__strcasecmp_l, strcasecmp_l);
diff --git a/libc-top-half/musl/src/string/strcasestr.c b/libc-top-half/musl/src/string/strcasestr.c
new file mode 100644
index 0000000..af109f3
--- /dev/null
+++ b/libc-top-half/musl/src/string/strcasestr.c
@@ -0,0 +1,9 @@
+#define _GNU_SOURCE
+#include <string.h>
+
+char *strcasestr(const char *h, const char *n)
+{
+ size_t l = strlen(n);
+ for (; *h; h++) if (!strncasecmp(h, n, l)) return (char *)h;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/string/strcat.c b/libc-top-half/musl/src/string/strcat.c
new file mode 100644
index 0000000..33f749b
--- /dev/null
+++ b/libc-top-half/musl/src/string/strcat.c
@@ -0,0 +1,7 @@
+#include <string.h>
+
+char *strcat(char *restrict dest, const char *restrict src)
+{
+ strcpy(dest + strlen(dest), src);
+ return dest;
+}
diff --git a/libc-top-half/musl/src/string/strchr.c b/libc-top-half/musl/src/string/strchr.c
new file mode 100644
index 0000000..3cbc828
--- /dev/null
+++ b/libc-top-half/musl/src/string/strchr.c
@@ -0,0 +1,7 @@
+#include <string.h>
+
+char *strchr(const char *s, int c)
+{
+ char *r = __strchrnul(s, c);
+ return *(unsigned char *)r == (unsigned char)c ? r : 0;
+}
diff --git a/libc-top-half/musl/src/string/strchrnul.c b/libc-top-half/musl/src/string/strchrnul.c
new file mode 100644
index 0000000..39e2635
--- /dev/null
+++ b/libc-top-half/musl/src/string/strchrnul.c
@@ -0,0 +1,28 @@
+#include <string.h>
+#include <stdint.h>
+#include <limits.h>
+
+#define ALIGN (sizeof(size_t))
+#define ONES ((size_t)-1/UCHAR_MAX)
+#define HIGHS (ONES * (UCHAR_MAX/2+1))
+#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
+
+char *__strchrnul(const char *s, int c)
+{
+ c = (unsigned char)c;
+ if (!c) return (char *)s + strlen(s);
+
+#ifdef __GNUC__
+ typedef size_t __attribute__((__may_alias__)) word;
+ const word *w;
+ for (; (uintptr_t)s % ALIGN; s++)
+ if (!*s || *(unsigned char *)s == c) return (char *)s;
+ size_t k = ONES * c;
+ for (w = (void *)s; !HASZERO(*w) && !HASZERO(*w^k); w++);
+ s = (void *)w;
+#endif
+ for (; *s && *(unsigned char *)s != c; s++);
+ return (char *)s;
+}
+
+weak_alias(__strchrnul, strchrnul);
diff --git a/libc-top-half/musl/src/string/strcmp.c b/libc-top-half/musl/src/string/strcmp.c
new file mode 100644
index 0000000..808bd83
--- /dev/null
+++ b/libc-top-half/musl/src/string/strcmp.c
@@ -0,0 +1,7 @@
+#include <string.h>
+
+int strcmp(const char *l, const char *r)
+{
+ for (; *l==*r && *l; l++, r++);
+ return *(unsigned char *)l - *(unsigned char *)r;
+}
diff --git a/libc-top-half/musl/src/string/strcpy.c b/libc-top-half/musl/src/string/strcpy.c
new file mode 100644
index 0000000..6668a12
--- /dev/null
+++ b/libc-top-half/musl/src/string/strcpy.c
@@ -0,0 +1,7 @@
+#include <string.h>
+
+char *strcpy(char *restrict dest, const char *restrict src)
+{
+ __stpcpy(dest, src);
+ return dest;
+}
diff --git a/libc-top-half/musl/src/string/strcspn.c b/libc-top-half/musl/src/string/strcspn.c
new file mode 100644
index 0000000..a0c617b
--- /dev/null
+++ b/libc-top-half/musl/src/string/strcspn.c
@@ -0,0 +1,17 @@
+#include <string.h>
+
+#define BITOP(a,b,op) \
+ ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))
+
+size_t strcspn(const char *s, const char *c)
+{
+ const char *a = s;
+ size_t byteset[32/sizeof(size_t)];
+
+ if (!c[0] || !c[1]) return __strchrnul(s, *c)-a;
+
+ memset(byteset, 0, sizeof byteset);
+ for (; *c && BITOP(byteset, *(unsigned char *)c, |=); c++);
+ for (; *s && !BITOP(byteset, *(unsigned char *)s, &); s++);
+ return s-a;
+}
diff --git a/libc-top-half/musl/src/string/strdup.c b/libc-top-half/musl/src/string/strdup.c
new file mode 100644
index 0000000..d4c2744
--- /dev/null
+++ b/libc-top-half/musl/src/string/strdup.c
@@ -0,0 +1,10 @@
+#include <stdlib.h>
+#include <string.h>
+
+char *strdup(const char *s)
+{
+ size_t l = strlen(s);
+ char *d = malloc(l+1);
+ if (!d) return NULL;
+ return memcpy(d, s, l+1);
+}
diff --git a/libc-top-half/musl/src/string/strerror_r.c b/libc-top-half/musl/src/string/strerror_r.c
new file mode 100644
index 0000000..1dc88bb
--- /dev/null
+++ b/libc-top-half/musl/src/string/strerror_r.c
@@ -0,0 +1,19 @@
+#include <string.h>
+#include <errno.h>
+
+int strerror_r(int err, char *buf, size_t buflen)
+{
+ char *msg = strerror(err);
+ size_t l = strlen(msg);
+ if (l >= buflen) {
+ if (buflen) {
+ memcpy(buf, msg, buflen-1);
+ buf[buflen-1] = 0;
+ }
+ return ERANGE;
+ }
+ memcpy(buf, msg, l+1);
+ return 0;
+}
+
+weak_alias(strerror_r, __xpg_strerror_r);
diff --git a/libc-top-half/musl/src/string/strlcat.c b/libc-top-half/musl/src/string/strlcat.c
new file mode 100644
index 0000000..ef81209
--- /dev/null
+++ b/libc-top-half/musl/src/string/strlcat.c
@@ -0,0 +1,9 @@
+#define _BSD_SOURCE
+#include <string.h>
+
+size_t strlcat(char *d, const char *s, size_t n)
+{
+ size_t l = strnlen(d, n);
+ if (l == n) return l + strlen(s);
+ return l + strlcpy(d+l, s, n-l);
+}
diff --git a/libc-top-half/musl/src/string/strlcpy.c b/libc-top-half/musl/src/string/strlcpy.c
new file mode 100644
index 0000000..ffa0b0b
--- /dev/null
+++ b/libc-top-half/musl/src/string/strlcpy.c
@@ -0,0 +1,34 @@
+#define _BSD_SOURCE
+#include <string.h>
+#include <stdint.h>
+#include <limits.h>
+
+#define ALIGN (sizeof(size_t)-1)
+#define ONES ((size_t)-1/UCHAR_MAX)
+#define HIGHS (ONES * (UCHAR_MAX/2+1))
+#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
+
+size_t strlcpy(char *d, const char *s, size_t n)
+{
+ char *d0 = d;
+ size_t *wd;
+
+ if (!n--) goto finish;
+#ifdef __GNUC__
+ typedef size_t __attribute__((__may_alias__)) word;
+ const word *ws;
+ if (((uintptr_t)s & ALIGN) == ((uintptr_t)d & ALIGN)) {
+ for (; ((uintptr_t)s & ALIGN) && n && (*d=*s); n--, s++, d++);
+ if (n && *s) {
+ wd=(void *)d; ws=(const void *)s;
+ for (; n>=sizeof(size_t) && !HASZERO(*ws);
+ n-=sizeof(size_t), ws++, wd++) *wd = *ws;
+ d=(void *)wd; s=(const void *)ws;
+ }
+ }
+#endif
+ for (; n && (*d=*s); n--, s++, d++);
+ *d = 0;
+finish:
+ return d-d0 + strlen(s);
+}
diff --git a/libc-top-half/musl/src/string/strlen.c b/libc-top-half/musl/src/string/strlen.c
new file mode 100644
index 0000000..309990f
--- /dev/null
+++ b/libc-top-half/musl/src/string/strlen.c
@@ -0,0 +1,22 @@
+#include <string.h>
+#include <stdint.h>
+#include <limits.h>
+
+#define ALIGN (sizeof(size_t))
+#define ONES ((size_t)-1/UCHAR_MAX)
+#define HIGHS (ONES * (UCHAR_MAX/2+1))
+#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
+
+size_t strlen(const char *s)
+{
+ const char *a = s;
+#ifdef __GNUC__
+ typedef size_t __attribute__((__may_alias__)) word;
+ const word *w;
+ for (; (uintptr_t)s % ALIGN; s++) if (!*s) return s-a;
+ for (w = (const void *)s; !HASZERO(*w); w++);
+ s = (const void *)w;
+#endif
+ for (; *s; s++);
+ return s-a;
+}
diff --git a/libc-top-half/musl/src/string/strncasecmp.c b/libc-top-half/musl/src/string/strncasecmp.c
new file mode 100644
index 0000000..e0ef93c
--- /dev/null
+++ b/libc-top-half/musl/src/string/strncasecmp.c
@@ -0,0 +1,17 @@
+#include <strings.h>
+#include <ctype.h>
+
+int strncasecmp(const char *_l, const char *_r, size_t n)
+{
+ const unsigned char *l=(void *)_l, *r=(void *)_r;
+ if (!n--) return 0;
+ for (; *l && *r && n && (*l == *r || tolower(*l) == tolower(*r)); l++, r++, n--);
+ return tolower(*l) - tolower(*r);
+}
+
+int __strncasecmp_l(const char *l, const char *r, size_t n, locale_t loc)
+{
+ return strncasecmp(l, r, n);
+}
+
+weak_alias(__strncasecmp_l, strncasecmp_l);
diff --git a/libc-top-half/musl/src/string/strncat.c b/libc-top-half/musl/src/string/strncat.c
new file mode 100644
index 0000000..01ca2a2
--- /dev/null
+++ b/libc-top-half/musl/src/string/strncat.c
@@ -0,0 +1,10 @@
+#include <string.h>
+
+char *strncat(char *restrict d, const char *restrict s, size_t n)
+{
+ char *a = d;
+ d += strlen(d);
+ while (n && *s) n--, *d++ = *s++;
+ *d++ = 0;
+ return a;
+}
diff --git a/libc-top-half/musl/src/string/strncmp.c b/libc-top-half/musl/src/string/strncmp.c
new file mode 100644
index 0000000..e228843
--- /dev/null
+++ b/libc-top-half/musl/src/string/strncmp.c
@@ -0,0 +1,9 @@
+#include <string.h>
+
+int strncmp(const char *_l, const char *_r, size_t n)
+{
+ const unsigned char *l=(void *)_l, *r=(void *)_r;
+ if (!n--) return 0;
+ for (; *l && *r && n && *l == *r ; l++, r++, n--);
+ return *l - *r;
+}
diff --git a/libc-top-half/musl/src/string/strncpy.c b/libc-top-half/musl/src/string/strncpy.c
new file mode 100644
index 0000000..545892e
--- /dev/null
+++ b/libc-top-half/musl/src/string/strncpy.c
@@ -0,0 +1,7 @@
+#include <string.h>
+
+char *strncpy(char *restrict d, const char *restrict s, size_t n)
+{
+ __stpncpy(d, s, n);
+ return d;
+}
diff --git a/libc-top-half/musl/src/string/strndup.c b/libc-top-half/musl/src/string/strndup.c
new file mode 100644
index 0000000..617d27b
--- /dev/null
+++ b/libc-top-half/musl/src/string/strndup.c
@@ -0,0 +1,12 @@
+#include <stdlib.h>
+#include <string.h>
+
+char *strndup(const char *s, size_t n)
+{
+ size_t l = strnlen(s, n);
+ char *d = malloc(l+1);
+ if (!d) return NULL;
+ memcpy(d, s, l);
+ d[l] = 0;
+ return d;
+}
diff --git a/libc-top-half/musl/src/string/strnlen.c b/libc-top-half/musl/src/string/strnlen.c
new file mode 100644
index 0000000..6442eb7
--- /dev/null
+++ b/libc-top-half/musl/src/string/strnlen.c
@@ -0,0 +1,7 @@
+#include <string.h>
+
+size_t strnlen(const char *s, size_t n)
+{
+ const char *p = memchr(s, 0, n);
+ return p ? p-s : n;
+}
diff --git a/libc-top-half/musl/src/string/strpbrk.c b/libc-top-half/musl/src/string/strpbrk.c
new file mode 100644
index 0000000..55947c6
--- /dev/null
+++ b/libc-top-half/musl/src/string/strpbrk.c
@@ -0,0 +1,7 @@
+#include <string.h>
+
+char *strpbrk(const char *s, const char *b)
+{
+ s += strcspn(s, b);
+ return *s ? (char *)s : 0;
+}
diff --git a/libc-top-half/musl/src/string/strrchr.c b/libc-top-half/musl/src/string/strrchr.c
new file mode 100644
index 0000000..98ad1b0
--- /dev/null
+++ b/libc-top-half/musl/src/string/strrchr.c
@@ -0,0 +1,6 @@
+#include <string.h>
+
+char *strrchr(const char *s, int c)
+{
+ return __memrchr(s, c, strlen(s) + 1);
+}
diff --git a/libc-top-half/musl/src/string/strsep.c b/libc-top-half/musl/src/string/strsep.c
new file mode 100644
index 0000000..cb37c32
--- /dev/null
+++ b/libc-top-half/musl/src/string/strsep.c
@@ -0,0 +1,13 @@
+#define _GNU_SOURCE
+#include <string.h>
+
+char *strsep(char **str, const char *sep)
+{
+ char *s = *str, *end;
+ if (!s) return NULL;
+ end = s + strcspn(s, sep);
+ if (*end) *end++ = 0;
+ else end = 0;
+ *str = end;
+ return s;
+}
diff --git a/libc-top-half/musl/src/string/strsignal.c b/libc-top-half/musl/src/string/strsignal.c
new file mode 100644
index 0000000..5156366
--- /dev/null
+++ b/libc-top-half/musl/src/string/strsignal.c
@@ -0,0 +1,126 @@
+#include <signal.h>
+#include <string.h>
+#include "locale_impl.h"
+
+#if (SIGHUP == 1) && (SIGINT == 2) && (SIGQUIT == 3) && (SIGILL == 4) \
+ && (SIGTRAP == 5) && (SIGABRT == 6) && (SIGBUS == 7) && (SIGFPE == 8) \
+ && (SIGKILL == 9) && (SIGUSR1 == 10) && (SIGSEGV == 11) && (SIGUSR2 == 12) \
+ && (SIGPIPE == 13) && (SIGALRM == 14) && (SIGTERM == 15) && (SIGSTKFLT == 16) \
+ && (SIGCHLD == 17) && (SIGCONT == 18) && (SIGSTOP == 19) && (SIGTSTP == 20) \
+ && (SIGTTIN == 21) && (SIGTTOU == 22) && (SIGURG == 23) && (SIGXCPU == 24) \
+ && (SIGXFSZ == 25) && (SIGVTALRM == 26) && (SIGPROF == 27) && (SIGWINCH == 28) \
+ && (SIGPOLL == 29) && (SIGPWR == 30) && (SIGSYS == 31)
+
+#define sigmap(x) x
+
+#else
+
+static const char map[] = {
+ [SIGHUP] = 1,
+ [SIGINT] = 2,
+ [SIGQUIT] = 3,
+ [SIGILL] = 4,
+ [SIGTRAP] = 5,
+ [SIGABRT] = 6,
+ [SIGBUS] = 7,
+ [SIGFPE] = 8,
+ [SIGKILL] = 9,
+ [SIGUSR1] = 10,
+ [SIGSEGV] = 11,
+ [SIGUSR2] = 12,
+ [SIGPIPE] = 13,
+ [SIGALRM] = 14,
+ [SIGTERM] = 15,
+#if defined(SIGSTKFLT)
+ [SIGSTKFLT] = 16,
+#elif defined(SIGEMT)
+ [SIGEMT] = 16,
+#endif
+ [SIGCHLD] = 17,
+ [SIGCONT] = 18,
+ [SIGSTOP] = 19,
+ [SIGTSTP] = 20,
+ [SIGTTIN] = 21,
+ [SIGTTOU] = 22,
+ [SIGURG] = 23,
+ [SIGXCPU] = 24,
+ [SIGXFSZ] = 25,
+ [SIGVTALRM] = 26,
+ [SIGPROF] = 27,
+ [SIGWINCH] = 28,
+ [SIGPOLL] = 29,
+ [SIGPWR] = 30,
+ [SIGSYS] = 31
+};
+
+#define sigmap(x) ((x) >= sizeof map ? (x) : map[(x)])
+
+#endif
+
+static const char strings[] =
+ "Unknown signal\0"
+ "Hangup\0"
+ "Interrupt\0"
+ "Quit\0"
+ "Illegal instruction\0"
+ "Trace/breakpoint trap\0"
+ "Aborted\0"
+ "Bus error\0"
+ "Arithmetic exception\0"
+ "Killed\0"
+ "User defined signal 1\0"
+ "Segmentation fault\0"
+ "User defined signal 2\0"
+ "Broken pipe\0"
+ "Alarm clock\0"
+ "Terminated\0"
+#if defined(SIGSTKFLT)
+ "Stack fault\0"
+#elif defined(SIGEMT)
+ "Emulator trap\0"
+#else
+ "Unknown signal\0"
+#endif
+ "Child process status\0"
+ "Continued\0"
+ "Stopped (signal)\0"
+ "Stopped\0"
+ "Stopped (tty input)\0"
+ "Stopped (tty output)\0"
+ "Urgent I/O condition\0"
+ "CPU time limit exceeded\0"
+ "File size limit exceeded\0"
+ "Virtual timer expired\0"
+ "Profiling timer expired\0"
+ "Window changed\0"
+ "I/O possible\0"
+ "Power failure\0"
+ "Bad system call\0"
+ "RT32"
+ "\0RT33\0RT34\0RT35\0RT36\0RT37\0RT38\0RT39\0RT40"
+ "\0RT41\0RT42\0RT43\0RT44\0RT45\0RT46\0RT47\0RT48"
+ "\0RT49\0RT50\0RT51\0RT52\0RT53\0RT54\0RT55\0RT56"
+ "\0RT57\0RT58\0RT59\0RT60\0RT61\0RT62\0RT63\0RT64"
+#if _NSIG > 65
+ "\0RT65\0RT66\0RT67\0RT68\0RT69\0RT70\0RT71\0RT72"
+ "\0RT73\0RT74\0RT75\0RT76\0RT77\0RT78\0RT79\0RT80"
+ "\0RT81\0RT82\0RT83\0RT84\0RT85\0RT86\0RT87\0RT88"
+ "\0RT89\0RT90\0RT91\0RT92\0RT93\0RT94\0RT95\0RT96"
+ "\0RT97\0RT98\0RT99\0RT100\0RT101\0RT102\0RT103\0RT104"
+ "\0RT105\0RT106\0RT107\0RT108\0RT109\0RT110\0RT111\0RT112"
+ "\0RT113\0RT114\0RT115\0RT116\0RT117\0RT118\0RT119\0RT120"
+ "\0RT121\0RT122\0RT123\0RT124\0RT125\0RT126\0RT127\0RT128"
+#endif
+ "";
+
+char *strsignal(int signum)
+{
+ const char *s = strings;
+
+ signum = sigmap(signum);
+ if (signum - 1U >= _NSIG-1) signum = 0;
+
+ for (; signum--; s++) for (; *s; s++);
+
+ return (char *)LCTRANS_CUR(s);
+}
diff --git a/libc-top-half/musl/src/string/strspn.c b/libc-top-half/musl/src/string/strspn.c
new file mode 100644
index 0000000..9543dad
--- /dev/null
+++ b/libc-top-half/musl/src/string/strspn.c
@@ -0,0 +1,20 @@
+#include <string.h>
+
+#define BITOP(a,b,op) \
+ ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))
+
+size_t strspn(const char *s, const char *c)
+{
+ const char *a = s;
+ size_t byteset[32/sizeof(size_t)] = { 0 };
+
+ if (!c[0]) return 0;
+ if (!c[1]) {
+ for (; *s == *c; s++);
+ return s-a;
+ }
+
+ for (; *c && BITOP(byteset, *(unsigned char *)c, |=); c++);
+ for (; *s && BITOP(byteset, *(unsigned char *)s, &); s++);
+ return s-a;
+}
diff --git a/libc-top-half/musl/src/string/strstr.c b/libc-top-half/musl/src/string/strstr.c
new file mode 100644
index 0000000..96657bc
--- /dev/null
+++ b/libc-top-half/musl/src/string/strstr.c
@@ -0,0 +1,154 @@
+#include <string.h>
+#include <stdint.h>
+
+static char *twobyte_strstr(const unsigned char *h, const unsigned char *n)
+{
+ uint16_t nw = n[0]<<8 | n[1], hw = h[0]<<8 | h[1];
+ for (h++; *h && hw != nw; hw = hw<<8 | *++h);
+ return *h ? (char *)h-1 : 0;
+}
+
+static char *threebyte_strstr(const unsigned char *h, const unsigned char *n)
+{
+ uint32_t nw = (uint32_t)n[0]<<24 | n[1]<<16 | n[2]<<8;
+ uint32_t hw = (uint32_t)h[0]<<24 | h[1]<<16 | h[2]<<8;
+ for (h+=2; *h && hw != nw; hw = (hw|*++h)<<8);
+ return *h ? (char *)h-2 : 0;
+}
+
+static char *fourbyte_strstr(const unsigned char *h, const unsigned char *n)
+{
+ uint32_t nw = (uint32_t)n[0]<<24 | n[1]<<16 | n[2]<<8 | n[3];
+ uint32_t hw = (uint32_t)h[0]<<24 | h[1]<<16 | h[2]<<8 | h[3];
+ for (h+=3; *h && hw != nw; hw = hw<<8 | *++h);
+ return *h ? (char *)h-3 : 0;
+}
+
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#define MIN(a,b) ((a)<(b)?(a):(b))
+
+#define BITOP(a,b,op) \
+ ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))
+
+static char *twoway_strstr(const unsigned char *h, const unsigned char *n)
+{
+ const unsigned char *z;
+ size_t l, ip, jp, k, p, ms, p0, mem, mem0;
+ size_t byteset[32 / sizeof(size_t)] = { 0 };
+ size_t shift[256];
+
+ /* Computing length of needle and fill shift table */
+ for (l=0; n[l] && h[l]; l++)
+ BITOP(byteset, n[l], |=), shift[n[l]] = l+1;
+ if (n[l]) return 0; /* hit the end of h */
+
+ /* Compute maximal suffix */
+ ip = -1; jp = 0; k = p = 1;
+ while (jp+k<l) {
+ if (n[ip+k] == n[jp+k]) {
+ if (k == p) {
+ jp += p;
+ k = 1;
+ } else k++;
+ } else if (n[ip+k] > n[jp+k]) {
+ jp += k;
+ k = 1;
+ p = jp - ip;
+ } else {
+ ip = jp++;
+ k = p = 1;
+ }
+ }
+ ms = ip;
+ p0 = p;
+
+ /* And with the opposite comparison */
+ ip = -1; jp = 0; k = p = 1;
+ while (jp+k<l) {
+ if (n[ip+k] == n[jp+k]) {
+ if (k == p) {
+ jp += p;
+ k = 1;
+ } else k++;
+ } else if (n[ip+k] < n[jp+k]) {
+ jp += k;
+ k = 1;
+ p = jp - ip;
+ } else {
+ ip = jp++;
+ k = p = 1;
+ }
+ }
+ if (ip+1 > ms+1) ms = ip;
+ else p = p0;
+
+ /* Periodic needle? */
+ if (memcmp(n, n+p, ms+1)) {
+ mem0 = 0;
+ p = MAX(ms, l-ms-1) + 1;
+ } else mem0 = l-p;
+ mem = 0;
+
+ /* Initialize incremental end-of-haystack pointer */
+ z = h;
+
+ /* Search loop */
+ for (;;) {
+ /* Update incremental end-of-haystack pointer */
+ if (z-h < l) {
+ /* Fast estimate for MAX(l,63) */
+ size_t grow = l | 63;
+ const unsigned char *z2 = memchr(z, 0, grow);
+ if (z2) {
+ z = z2;
+ if (z-h < l) return 0;
+ } else z += grow;
+ }
+
+ /* Check last byte first; advance by shift on mismatch */
+ if (BITOP(byteset, h[l-1], &)) {
+ k = l-shift[h[l-1]];
+ if (k) {
+ if (k < mem) k = mem;
+ h += k;
+ mem = 0;
+ continue;
+ }
+ } else {
+ h += l;
+ mem = 0;
+ continue;
+ }
+
+ /* Compare right half */
+ for (k=MAX(ms+1,mem); n[k] && n[k] == h[k]; k++);
+ if (n[k]) {
+ h += k-ms;
+ mem = 0;
+ continue;
+ }
+ /* Compare left half */
+ for (k=ms+1; k>mem && n[k-1] == h[k-1]; k--);
+ if (k <= mem) return (char *)h;
+ h += p;
+ mem = mem0;
+ }
+}
+
+char *strstr(const char *h, const char *n)
+{
+ /* Return immediately on empty needle */
+ if (!n[0]) return (char *)h;
+
+ /* Use faster algorithms for short needles */
+ h = strchr(h, *n);
+ if (!h || !n[1]) return (char *)h;
+ if (!h[1]) return 0;
+ if (!n[2]) return twobyte_strstr((void *)h, (void *)n);
+ if (!h[2]) return 0;
+ if (!n[3]) return threebyte_strstr((void *)h, (void *)n);
+ if (!h[3]) return 0;
+ if (!n[4]) return fourbyte_strstr((void *)h, (void *)n);
+
+ return twoway_strstr((void *)h, (void *)n);
+}
diff --git a/libc-top-half/musl/src/string/strtok.c b/libc-top-half/musl/src/string/strtok.c
new file mode 100644
index 0000000..3508790
--- /dev/null
+++ b/libc-top-half/musl/src/string/strtok.c
@@ -0,0 +1,13 @@
+#include <string.h>
+
+char *strtok(char *restrict s, const char *restrict sep)
+{
+ static char *p;
+ if (!s && !(s = p)) return NULL;
+ s += strspn(s, sep);
+ if (!*s) return p = 0;
+ p = s + strcspn(s, sep);
+ if (*p) *p++ = 0;
+ else p = 0;
+ return s;
+}
diff --git a/libc-top-half/musl/src/string/strtok_r.c b/libc-top-half/musl/src/string/strtok_r.c
new file mode 100644
index 0000000..862d4fe
--- /dev/null
+++ b/libc-top-half/musl/src/string/strtok_r.c
@@ -0,0 +1,12 @@
+#include <string.h>
+
+char *strtok_r(char *restrict s, const char *restrict sep, char **restrict p)
+{
+ if (!s && !(s = *p)) return NULL;
+ s += strspn(s, sep);
+ if (!*s) return *p = 0;
+ *p = s + strcspn(s, sep);
+ if (**p) *(*p)++ = 0;
+ else *p = 0;
+ return s;
+}
diff --git a/libc-top-half/musl/src/string/strverscmp.c b/libc-top-half/musl/src/string/strverscmp.c
new file mode 100644
index 0000000..4daf276
--- /dev/null
+++ b/libc-top-half/musl/src/string/strverscmp.c
@@ -0,0 +1,34 @@
+#define _GNU_SOURCE
+#include <ctype.h>
+#include <string.h>
+
+int strverscmp(const char *l0, const char *r0)
+{
+ const unsigned char *l = (const void *)l0;
+ const unsigned char *r = (const void *)r0;
+ size_t i, dp, j;
+ int z = 1;
+
+ /* Find maximal matching prefix and track its maximal digit
+ * suffix and whether those digits are all zeros. */
+ for (dp=i=0; l[i]==r[i]; i++) {
+ int c = l[i];
+ if (!c) return 0;
+ if (!isdigit(c)) dp=i+1, z=1;
+ else if (c!='0') z=0;
+ }
+
+ if (l[dp]!='0' && r[dp]!='0') {
+ /* If we're not looking at a digit sequence that began
+ * with a zero, longest digit string is greater. */
+ for (j=i; isdigit(l[j]); j++)
+ if (!isdigit(r[j])) return 1;
+ if (isdigit(r[j])) return -1;
+ } else if (z && dp<i && (isdigit(l[i]) || isdigit(r[i]))) {
+ /* Otherwise, if common prefix of digit sequence is
+ * all zeros, digits order less than non-digits. */
+ return (unsigned char)(l[i]-'0') - (unsigned char)(r[i]-'0');
+ }
+
+ return l[i] - r[i];
+}
diff --git a/libc-top-half/musl/src/string/swab.c b/libc-top-half/musl/src/string/swab.c
new file mode 100644
index 0000000..ace0f46
--- /dev/null
+++ b/libc-top-half/musl/src/string/swab.c
@@ -0,0 +1,13 @@
+#include <unistd.h>
+
+void swab(const void *restrict _src, void *restrict _dest, ssize_t n)
+{
+ const char *src = _src;
+ char *dest = _dest;
+ for (; n>1; n-=2) {
+ dest[0] = src[1];
+ dest[1] = src[0];
+ dest += 2;
+ src += 2;
+ }
+}
diff --git a/libc-top-half/musl/src/string/wcpcpy.c b/libc-top-half/musl/src/string/wcpcpy.c
new file mode 100644
index 0000000..ef40134
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcpcpy.c
@@ -0,0 +1,6 @@
+#include <wchar.h>
+
+wchar_t *wcpcpy(wchar_t *restrict d, const wchar_t *restrict s)
+{
+ return wcscpy(d, s) + wcslen(s);
+}
diff --git a/libc-top-half/musl/src/string/wcpncpy.c b/libc-top-half/musl/src/string/wcpncpy.c
new file mode 100644
index 0000000..b667f6d
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcpncpy.c
@@ -0,0 +1,6 @@
+#include <wchar.h>
+
+wchar_t *wcpncpy(wchar_t *restrict d, const wchar_t *restrict s, size_t n)
+{
+ return wcsncpy(d, s, n) + wcsnlen(s, n);
+}
diff --git a/libc-top-half/musl/src/string/wcscasecmp.c b/libc-top-half/musl/src/string/wcscasecmp.c
new file mode 100644
index 0000000..3edeec7
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcscasecmp.c
@@ -0,0 +1,7 @@
+#include <wchar.h>
+#include <wctype.h>
+
+int wcscasecmp(const wchar_t *l, const wchar_t *r)
+{
+ return wcsncasecmp(l, r, -1);
+}
diff --git a/libc-top-half/musl/src/string/wcscasecmp_l.c b/libc-top-half/musl/src/string/wcscasecmp_l.c
new file mode 100644
index 0000000..065dd0a
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcscasecmp_l.c
@@ -0,0 +1,6 @@
+#include <wchar.h>
+
+int wcscasecmp_l(const wchar_t *l, const wchar_t *r, locale_t locale)
+{
+ return wcscasecmp(l, r);
+}
diff --git a/libc-top-half/musl/src/string/wcscat.c b/libc-top-half/musl/src/string/wcscat.c
new file mode 100644
index 0000000..d4f00eb
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcscat.c
@@ -0,0 +1,7 @@
+#include <wchar.h>
+
+wchar_t *wcscat(wchar_t *restrict dest, const wchar_t *restrict src)
+{
+ wcscpy(dest + wcslen(dest), src);
+ return dest;
+}
diff --git a/libc-top-half/musl/src/string/wcschr.c b/libc-top-half/musl/src/string/wcschr.c
new file mode 100644
index 0000000..8dfc2f3
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcschr.c
@@ -0,0 +1,8 @@
+#include <wchar.h>
+
+wchar_t *wcschr(const wchar_t *s, wchar_t c)
+{
+ if (!c) return (wchar_t *)s + wcslen(s);
+ for (; *s && *s != c; s++);
+ return *s ? (wchar_t *)s : 0;
+}
diff --git a/libc-top-half/musl/src/string/wcscmp.c b/libc-top-half/musl/src/string/wcscmp.c
new file mode 100644
index 0000000..26eeee7
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcscmp.c
@@ -0,0 +1,7 @@
+#include <wchar.h>
+
+int wcscmp(const wchar_t *l, const wchar_t *r)
+{
+ for (; *l==*r && *l && *r; l++, r++);
+ return *l - *r;
+}
diff --git a/libc-top-half/musl/src/string/wcscpy.c b/libc-top-half/musl/src/string/wcscpy.c
new file mode 100644
index 0000000..625bf53
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcscpy.c
@@ -0,0 +1,8 @@
+#include <wchar.h>
+
+wchar_t *wcscpy(wchar_t *restrict d, const wchar_t *restrict s)
+{
+ wchar_t *a = d;
+ while ((*d++ = *s++));
+ return a;
+}
diff --git a/libc-top-half/musl/src/string/wcscspn.c b/libc-top-half/musl/src/string/wcscspn.c
new file mode 100644
index 0000000..c4e5272
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcscspn.c
@@ -0,0 +1,10 @@
+#include <wchar.h>
+
+size_t wcscspn(const wchar_t *s, const wchar_t *c)
+{
+ const wchar_t *a;
+ if (!c[0]) return wcslen(s);
+ if (!c[1]) return (s=wcschr(a=s, *c)) ? s-a : wcslen(a);
+ for (a=s; *s && !wcschr(c, *s); s++);
+ return s-a;
+}
diff --git a/libc-top-half/musl/src/string/wcsdup.c b/libc-top-half/musl/src/string/wcsdup.c
new file mode 100644
index 0000000..f398e80
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcsdup.c
@@ -0,0 +1,10 @@
+#include <stdlib.h>
+#include <wchar.h>
+
+wchar_t *wcsdup(const wchar_t *s)
+{
+ size_t l = wcslen(s);
+ wchar_t *d = malloc((l+1)*sizeof(wchar_t));
+ if (!d) return NULL;
+ return wmemcpy(d, s, l+1);
+}
diff --git a/libc-top-half/musl/src/string/wcslen.c b/libc-top-half/musl/src/string/wcslen.c
new file mode 100644
index 0000000..1b7b665
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcslen.c
@@ -0,0 +1,8 @@
+#include <wchar.h>
+
+size_t wcslen(const wchar_t *s)
+{
+ const wchar_t *a;
+ for (a=s; *s; s++);
+ return s-a;
+}
diff --git a/libc-top-half/musl/src/string/wcsncasecmp.c b/libc-top-half/musl/src/string/wcsncasecmp.c
new file mode 100644
index 0000000..8fefe79
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcsncasecmp.c
@@ -0,0 +1,9 @@
+#include <wchar.h>
+#include <wctype.h>
+
+int wcsncasecmp(const wchar_t *l, const wchar_t *r, size_t n)
+{
+ if (!n--) return 0;
+ for (; *l && *r && n && (*l == *r || towlower(*l) == towlower(*r)); l++, r++, n--);
+ return towlower(*l) - towlower(*r);
+}
diff --git a/libc-top-half/musl/src/string/wcsncasecmp_l.c b/libc-top-half/musl/src/string/wcsncasecmp_l.c
new file mode 100644
index 0000000..6387248
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcsncasecmp_l.c
@@ -0,0 +1,6 @@
+#include <wchar.h>
+
+int wcsncasecmp_l(const wchar_t *l, const wchar_t *r, size_t n, locale_t locale)
+{
+ return wcsncasecmp(l, r, n);
+}
diff --git a/libc-top-half/musl/src/string/wcsncat.c b/libc-top-half/musl/src/string/wcsncat.c
new file mode 100644
index 0000000..8563f1a
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcsncat.c
@@ -0,0 +1,10 @@
+#include <wchar.h>
+
+wchar_t *wcsncat(wchar_t *restrict d, const wchar_t *restrict s, size_t n)
+{
+ wchar_t *a = d;
+ d += wcslen(d);
+ while (n && *s) n--, *d++ = *s++;
+ *d++ = 0;
+ return a;
+}
diff --git a/libc-top-half/musl/src/string/wcsncmp.c b/libc-top-half/musl/src/string/wcsncmp.c
new file mode 100644
index 0000000..4ab32a9
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcsncmp.c
@@ -0,0 +1,7 @@
+#include <wchar.h>
+
+int wcsncmp(const wchar_t *l, const wchar_t *r, size_t n)
+{
+ for (; n && *l==*r && *l && *r; n--, l++, r++);
+ return n ? *l - *r : 0;
+}
diff --git a/libc-top-half/musl/src/string/wcsncpy.c b/libc-top-half/musl/src/string/wcsncpy.c
new file mode 100644
index 0000000..4bede04
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcsncpy.c
@@ -0,0 +1,9 @@
+#include <wchar.h>
+
+wchar_t *wcsncpy(wchar_t *restrict d, const wchar_t *restrict s, size_t n)
+{
+ wchar_t *a = d;
+ while (n && *s) n--, *d++ = *s++;
+ wmemset(d, 0, n);
+ return a;
+}
diff --git a/libc-top-half/musl/src/string/wcsnlen.c b/libc-top-half/musl/src/string/wcsnlen.c
new file mode 100644
index 0000000..a776337
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcsnlen.c
@@ -0,0 +1,8 @@
+#include <wchar.h>
+
+size_t wcsnlen(const wchar_t *s, size_t n)
+{
+ const wchar_t *z = wmemchr(s, 0, n);
+ if (z) n = z-s;
+ return n;
+}
diff --git a/libc-top-half/musl/src/string/wcspbrk.c b/libc-top-half/musl/src/string/wcspbrk.c
new file mode 100644
index 0000000..0c72c19
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcspbrk.c
@@ -0,0 +1,7 @@
+#include <wchar.h>
+
+wchar_t *wcspbrk(const wchar_t *s, const wchar_t *b)
+{
+ s += wcscspn(s, b);
+ return *s ? (wchar_t *)s : NULL;
+}
diff --git a/libc-top-half/musl/src/string/wcsrchr.c b/libc-top-half/musl/src/string/wcsrchr.c
new file mode 100644
index 0000000..8961b9e
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcsrchr.c
@@ -0,0 +1,8 @@
+#include <wchar.h>
+
+wchar_t *wcsrchr(const wchar_t *s, wchar_t c)
+{
+ const wchar_t *p;
+ for (p=s+wcslen(s); p>=s && *p!=c; p--);
+ return p>=s ? (wchar_t *)p : 0;
+}
diff --git a/libc-top-half/musl/src/string/wcsspn.c b/libc-top-half/musl/src/string/wcsspn.c
new file mode 100644
index 0000000..4320d8f
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcsspn.c
@@ -0,0 +1,8 @@
+#include <wchar.h>
+
+size_t wcsspn(const wchar_t *s, const wchar_t *c)
+{
+ const wchar_t *a;
+ for (a=s; *s && wcschr(c, *s); s++);
+ return s-a;
+}
diff --git a/libc-top-half/musl/src/string/wcsstr.c b/libc-top-half/musl/src/string/wcsstr.c
new file mode 100644
index 0000000..4caaef3
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcsstr.c
@@ -0,0 +1,105 @@
+#include <wchar.h>
+
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#define MIN(a,b) ((a)<(b)?(a):(b))
+
+static wchar_t *twoway_wcsstr(const wchar_t *h, const wchar_t *n)
+{
+ const wchar_t *z;
+ size_t l, ip, jp, k, p, ms, p0, mem, mem0;
+
+ /* Computing length of needle */
+ for (l=0; n[l] && h[l]; l++);
+ if (n[l]) return 0; /* hit the end of h */
+
+ /* Compute maximal suffix */
+ ip = -1; jp = 0; k = p = 1;
+ while (jp+k<l) {
+ if (n[ip+k] == n[jp+k]) {
+ if (k == p) {
+ jp += p;
+ k = 1;
+ } else k++;
+ } else if (n[ip+k] > n[jp+k]) {
+ jp += k;
+ k = 1;
+ p = jp - ip;
+ } else {
+ ip = jp++;
+ k = p = 1;
+ }
+ }
+ ms = ip;
+ p0 = p;
+
+ /* And with the opposite comparison */
+ ip = -1; jp = 0; k = p = 1;
+ while (jp+k<l) {
+ if (n[ip+k] == n[jp+k]) {
+ if (k == p) {
+ jp += p;
+ k = 1;
+ } else k++;
+ } else if (n[ip+k] < n[jp+k]) {
+ jp += k;
+ k = 1;
+ p = jp - ip;
+ } else {
+ ip = jp++;
+ k = p = 1;
+ }
+ }
+ if (ip+1 > ms+1) ms = ip;
+ else p = p0;
+
+ /* Periodic needle? */
+ if (wmemcmp(n, n+p, ms+1)) {
+ mem0 = 0;
+ p = MAX(ms, l-ms-1) + 1;
+ } else mem0 = l-p;
+ mem = 0;
+
+ /* Initialize incremental end-of-haystack pointer */
+ z = h;
+
+ /* Search loop */
+ for (;;) {
+ /* Update incremental end-of-haystack pointer */
+ if (z-h < l) {
+ /* Fast estimate for MIN(l,63) */
+ size_t grow = l | 63;
+ const wchar_t *z2 = wmemchr(z, 0, grow);
+ if (z2) {
+ z = z2;
+ if (z-h < l) return 0;
+ } else z += grow;
+ }
+
+ /* Compare right half */
+ for (k=MAX(ms+1,mem); n[k] && n[k] == h[k]; k++);
+ if (n[k]) {
+ h += k-ms;
+ mem = 0;
+ continue;
+ }
+ /* Compare left half */
+ for (k=ms+1; k>mem && n[k-1] == h[k-1]; k--);
+ if (k <= mem) return (wchar_t *)h;
+ h += p;
+ mem = mem0;
+ }
+}
+
+wchar_t *wcsstr(const wchar_t *restrict h, const wchar_t *restrict n)
+{
+ /* Return immediately on empty needle or haystack */
+ if (!n[0]) return (wchar_t *)h;
+ if (!h[0]) return 0;
+
+ /* Use faster algorithms for short needles */
+ h = wcschr(h, *n);
+ if (!h || !n[1]) return (wchar_t *)h;
+ if (!h[1]) return 0;
+
+ return twoway_wcsstr(h, n);
+}
diff --git a/libc-top-half/musl/src/string/wcstok.c b/libc-top-half/musl/src/string/wcstok.c
new file mode 100644
index 0000000..ecc8033
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcstok.c
@@ -0,0 +1,12 @@
+#include <wchar.h>
+
+wchar_t *wcstok(wchar_t *restrict s, const wchar_t *restrict sep, wchar_t **restrict p)
+{
+ if (!s && !(s = *p)) return NULL;
+ s += wcsspn(s, sep);
+ if (!*s) return *p = 0;
+ *p = s + wcscspn(s, sep);
+ if (**p) *(*p)++ = 0;
+ else *p = 0;
+ return s;
+}
diff --git a/libc-top-half/musl/src/string/wcswcs.c b/libc-top-half/musl/src/string/wcswcs.c
new file mode 100644
index 0000000..9cfe4ac
--- /dev/null
+++ b/libc-top-half/musl/src/string/wcswcs.c
@@ -0,0 +1,6 @@
+#include <wchar.h>
+
+wchar_t *wcswcs(const wchar_t *haystack, const wchar_t *needle)
+{
+ return wcsstr(haystack, needle);
+}
diff --git a/libc-top-half/musl/src/string/wmemchr.c b/libc-top-half/musl/src/string/wmemchr.c
new file mode 100644
index 0000000..2bc2c27
--- /dev/null
+++ b/libc-top-half/musl/src/string/wmemchr.c
@@ -0,0 +1,7 @@
+#include <wchar.h>
+
+wchar_t *wmemchr(const wchar_t *s, wchar_t c, size_t n)
+{
+ for (; n && *s != c; n--, s++);
+ return n ? (wchar_t *)s : 0;
+}
diff --git a/libc-top-half/musl/src/string/wmemcmp.c b/libc-top-half/musl/src/string/wmemcmp.c
new file mode 100644
index 0000000..2a19326
--- /dev/null
+++ b/libc-top-half/musl/src/string/wmemcmp.c
@@ -0,0 +1,7 @@
+#include <wchar.h>
+
+int wmemcmp(const wchar_t *l, const wchar_t *r, size_t n)
+{
+ for (; n && *l==*r; n--, l++, r++);
+ return n ? *l-*r : 0;
+}
diff --git a/libc-top-half/musl/src/string/wmemcpy.c b/libc-top-half/musl/src/string/wmemcpy.c
new file mode 100644
index 0000000..52e6e6e
--- /dev/null
+++ b/libc-top-half/musl/src/string/wmemcpy.c
@@ -0,0 +1,8 @@
+#include <wchar.h>
+
+wchar_t *wmemcpy(wchar_t *restrict d, const wchar_t *restrict s, size_t n)
+{
+ wchar_t *a = d;
+ while (n--) *d++ = *s++;
+ return a;
+}
diff --git a/libc-top-half/musl/src/string/wmemmove.c b/libc-top-half/musl/src/string/wmemmove.c
new file mode 100644
index 0000000..964c903
--- /dev/null
+++ b/libc-top-half/musl/src/string/wmemmove.c
@@ -0,0 +1,13 @@
+#include <wchar.h>
+#include <stdint.h>
+
+wchar_t *wmemmove(wchar_t *d, const wchar_t *s, size_t n)
+{
+ wchar_t *d0 = d;
+ if (d == s) return d;
+ if ((uintptr_t)d-(uintptr_t)s < n * sizeof *d)
+ while (n--) d[n] = s[n];
+ else
+ while (n--) *d++ = *s++;
+ return d0;
+}
diff --git a/libc-top-half/musl/src/string/wmemset.c b/libc-top-half/musl/src/string/wmemset.c
new file mode 100644
index 0000000..07a037a
--- /dev/null
+++ b/libc-top-half/musl/src/string/wmemset.c
@@ -0,0 +1,8 @@
+#include <wchar.h>
+
+wchar_t *wmemset(wchar_t *d, wchar_t c, size_t n)
+{
+ wchar_t *ret = d;
+ while (n--) *d++ = c;
+ return ret;
+}
diff --git a/libc-top-half/musl/src/string/x86_64/memcpy.s b/libc-top-half/musl/src/string/x86_64/memcpy.s
new file mode 100644
index 0000000..3d960ef
--- /dev/null
+++ b/libc-top-half/musl/src/string/x86_64/memcpy.s
@@ -0,0 +1,25 @@
+.global memcpy
+.global __memcpy_fwd
+.hidden __memcpy_fwd
+.type memcpy,@function
+memcpy:
+__memcpy_fwd:
+ mov %rdi,%rax
+ cmp $8,%rdx
+ jc 1f
+ test $7,%edi
+ jz 1f
+2: movsb
+ dec %rdx
+ test $7,%edi
+ jnz 2b
+1: mov %rdx,%rcx
+ shr $3,%rcx
+ rep
+ movsq
+ and $7,%edx
+ jz 1f
+2: movsb
+ dec %edx
+ jnz 2b
+1: ret
diff --git a/libc-top-half/musl/src/string/x86_64/memmove.s b/libc-top-half/musl/src/string/x86_64/memmove.s
new file mode 100644
index 0000000..172c025
--- /dev/null
+++ b/libc-top-half/musl/src/string/x86_64/memmove.s
@@ -0,0 +1,16 @@
+.global memmove
+.type memmove,@function
+memmove:
+ mov %rdi,%rax
+ sub %rsi,%rax
+ cmp %rdx,%rax
+.hidden __memcpy_fwd
+ jae __memcpy_fwd
+ mov %rdx,%rcx
+ lea -1(%rdi,%rdx),%rdi
+ lea -1(%rsi,%rdx),%rsi
+ std
+ rep movsb
+ cld
+ lea 1(%rdi),%rax
+ ret
diff --git a/libc-top-half/musl/src/string/x86_64/memset.s b/libc-top-half/musl/src/string/x86_64/memset.s
new file mode 100644
index 0000000..2d3f5e5
--- /dev/null
+++ b/libc-top-half/musl/src/string/x86_64/memset.s
@@ -0,0 +1,72 @@
+.global memset
+.type memset,@function
+memset:
+ movzbq %sil,%rax
+ mov $0x101010101010101,%r8
+ imul %r8,%rax
+
+ cmp $126,%rdx
+ ja 2f
+
+ test %edx,%edx
+ jz 1f
+
+ mov %sil,(%rdi)
+ mov %sil,-1(%rdi,%rdx)
+ cmp $2,%edx
+ jbe 1f
+
+ mov %ax,1(%rdi)
+ mov %ax,(-1-2)(%rdi,%rdx)
+ cmp $6,%edx
+ jbe 1f
+
+ mov %eax,(1+2)(%rdi)
+ mov %eax,(-1-2-4)(%rdi,%rdx)
+ cmp $14,%edx
+ jbe 1f
+
+ mov %rax,(1+2+4)(%rdi)
+ mov %rax,(-1-2-4-8)(%rdi,%rdx)
+ cmp $30,%edx
+ jbe 1f
+
+ mov %rax,(1+2+4+8)(%rdi)
+ mov %rax,(1+2+4+8+8)(%rdi)
+ mov %rax,(-1-2-4-8-16)(%rdi,%rdx)
+ mov %rax,(-1-2-4-8-8)(%rdi,%rdx)
+ cmp $62,%edx
+ jbe 1f
+
+ mov %rax,(1+2+4+8+16)(%rdi)
+ mov %rax,(1+2+4+8+16+8)(%rdi)
+ mov %rax,(1+2+4+8+16+16)(%rdi)
+ mov %rax,(1+2+4+8+16+24)(%rdi)
+ mov %rax,(-1-2-4-8-16-32)(%rdi,%rdx)
+ mov %rax,(-1-2-4-8-16-24)(%rdi,%rdx)
+ mov %rax,(-1-2-4-8-16-16)(%rdi,%rdx)
+ mov %rax,(-1-2-4-8-16-8)(%rdi,%rdx)
+
+1: mov %rdi,%rax
+ ret
+
+2: test $15,%edi
+ mov %rdi,%r8
+ mov %rax,-8(%rdi,%rdx)
+ mov %rdx,%rcx
+ jnz 2f
+
+1: shr $3,%rcx
+ rep
+ stosq
+ mov %r8,%rax
+ ret
+
+2: xor %edx,%edx
+ sub %edi,%edx
+ and $15,%edx
+ mov %rax,(%rdi)
+ mov %rax,8(%rdi)
+ sub %rdx,%rcx
+ add %rdx,%rdi
+ jmp 1b
diff --git a/libc-top-half/musl/src/temp/__randname.c b/libc-top-half/musl/src/temp/__randname.c
new file mode 100644
index 0000000..2bce37a
--- /dev/null
+++ b/libc-top-half/musl/src/temp/__randname.c
@@ -0,0 +1,18 @@
+#include <time.h>
+#include <stdint.h>
+
+/* This assumes that a check for the
+ template size has already been made */
+char *__randname(char *template)
+{
+ int i;
+ struct timespec ts;
+ unsigned long r;
+
+ __clock_gettime(CLOCK_REALTIME, &ts);
+ r = ts.tv_nsec*65537 ^ (uintptr_t)&ts / 16 + (uintptr_t)template;
+ for (i=0; i<6; i++, r>>=5)
+ template[i] = 'A'+(r&15)+(r&16)*2;
+
+ return template;
+}
diff --git a/libc-top-half/musl/src/temp/mkdtemp.c b/libc-top-half/musl/src/temp/mkdtemp.c
new file mode 100644
index 0000000..5708257
--- /dev/null
+++ b/libc-top-half/musl/src/temp/mkdtemp.c
@@ -0,0 +1,23 @@
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/stat.h>
+
+char *mkdtemp(char *template)
+{
+ size_t l = strlen(template);
+ int retries = 100;
+
+ if (l<6 || memcmp(template+l-6, "XXXXXX", 6)) {
+ errno = EINVAL;
+ return 0;
+ }
+
+ do {
+ __randname(template+l-6);
+ if (!mkdir(template, 0700)) return template;
+ } while (--retries && errno == EEXIST);
+
+ memcpy(template+l-6, "XXXXXX", 6);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/temp/mkostemp.c b/libc-top-half/musl/src/temp/mkostemp.c
new file mode 100644
index 0000000..d8dcb80
--- /dev/null
+++ b/libc-top-half/musl/src/temp/mkostemp.c
@@ -0,0 +1,9 @@
+#define _BSD_SOURCE
+#include <stdlib.h>
+
+int mkostemp(char *template, int flags)
+{
+ return __mkostemps(template, 0, flags);
+}
+
+weak_alias(mkostemp, mkostemp64);
diff --git a/libc-top-half/musl/src/temp/mkostemps.c b/libc-top-half/musl/src/temp/mkostemps.c
new file mode 100644
index 0000000..ef24eea
--- /dev/null
+++ b/libc-top-half/musl/src/temp/mkostemps.c
@@ -0,0 +1,29 @@
+#define _BSD_SOURCE
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+int __mkostemps(char *template, int len, int flags)
+{
+ size_t l = strlen(template);
+ if (l<6 || len>l-6 || memcmp(template+l-len-6, "XXXXXX", 6)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ flags -= flags & O_ACCMODE;
+ int fd, retries = 100;
+ do {
+ __randname(template+l-len-6);
+ if ((fd = open(template, flags | O_RDWR | O_CREAT | O_EXCL, 0600))>=0)
+ return fd;
+ } while (--retries && errno == EEXIST);
+
+ memcpy(template+l-len-6, "XXXXXX", 6);
+ return -1;
+}
+
+weak_alias(__mkostemps, mkostemps);
+weak_alias(__mkostemps, mkostemps64);
diff --git a/libc-top-half/musl/src/temp/mkstemp.c b/libc-top-half/musl/src/temp/mkstemp.c
new file mode 100644
index 0000000..166b8af
--- /dev/null
+++ b/libc-top-half/musl/src/temp/mkstemp.c
@@ -0,0 +1,8 @@
+#include <stdlib.h>
+
+int mkstemp(char *template)
+{
+ return __mkostemps(template, 0, 0);
+}
+
+weak_alias(mkstemp, mkstemp64);
diff --git a/libc-top-half/musl/src/temp/mkstemps.c b/libc-top-half/musl/src/temp/mkstemps.c
new file mode 100644
index 0000000..6b7531b
--- /dev/null
+++ b/libc-top-half/musl/src/temp/mkstemps.c
@@ -0,0 +1,9 @@
+#define _BSD_SOURCE
+#include <stdlib.h>
+
+int mkstemps(char *template, int len)
+{
+ return __mkostemps(template, len, 0);
+}
+
+weak_alias(mkstemps, mkstemps64);
diff --git a/libc-top-half/musl/src/temp/mktemp.c b/libc-top-half/musl/src/temp/mktemp.c
new file mode 100644
index 0000000..7b3d264
--- /dev/null
+++ b/libc-top-half/musl/src/temp/mktemp.c
@@ -0,0 +1,30 @@
+#define _GNU_SOURCE
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/stat.h>
+
+char *mktemp(char *template)
+{
+ size_t l = strlen(template);
+ int retries = 100;
+ struct stat st;
+
+ if (l < 6 || memcmp(template+l-6, "XXXXXX", 6)) {
+ errno = EINVAL;
+ *template = 0;
+ return template;
+ }
+
+ do {
+ __randname(template+l-6);
+ if (stat(template, &st)) {
+ if (errno != ENOENT) *template = 0;
+ return template;
+ }
+ } while (--retries);
+
+ *template = 0;
+ errno = EEXIST;
+ return template;
+}
diff --git a/libc-top-half/musl/src/termios/cfgetospeed.c b/libc-top-half/musl/src/termios/cfgetospeed.c
new file mode 100644
index 0000000..55fa6f5
--- /dev/null
+++ b/libc-top-half/musl/src/termios/cfgetospeed.c
@@ -0,0 +1,13 @@
+#define _BSD_SOURCE
+#include <termios.h>
+#include <sys/ioctl.h>
+
+speed_t cfgetospeed(const struct termios *tio)
+{
+ return tio->c_cflag & CBAUD;
+}
+
+speed_t cfgetispeed(const struct termios *tio)
+{
+ return cfgetospeed(tio);
+}
diff --git a/libc-top-half/musl/src/termios/cfmakeraw.c b/libc-top-half/musl/src/termios/cfmakeraw.c
new file mode 100644
index 0000000..c9dddc1
--- /dev/null
+++ b/libc-top-half/musl/src/termios/cfmakeraw.c
@@ -0,0 +1,13 @@
+#define _GNU_SOURCE
+#include <termios.h>
+
+void cfmakeraw(struct termios *t)
+{
+ t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
+ t->c_oflag &= ~OPOST;
+ t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
+ t->c_cflag &= ~(CSIZE|PARENB);
+ t->c_cflag |= CS8;
+ t->c_cc[VMIN] = 1;
+ t->c_cc[VTIME] = 0;
+}
diff --git a/libc-top-half/musl/src/termios/cfsetospeed.c b/libc-top-half/musl/src/termios/cfsetospeed.c
new file mode 100644
index 0000000..c9cbdd9
--- /dev/null
+++ b/libc-top-half/musl/src/termios/cfsetospeed.c
@@ -0,0 +1,22 @@
+#define _BSD_SOURCE
+#include <termios.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+
+int cfsetospeed(struct termios *tio, speed_t speed)
+{
+ if (speed & ~CBAUD) {
+ errno = EINVAL;
+ return -1;
+ }
+ tio->c_cflag &= ~CBAUD;
+ tio->c_cflag |= speed;
+ return 0;
+}
+
+int cfsetispeed(struct termios *tio, speed_t speed)
+{
+ return speed ? cfsetospeed(tio, speed) : 0;
+}
+
+weak_alias(cfsetospeed, cfsetspeed);
diff --git a/libc-top-half/musl/src/termios/tcdrain.c b/libc-top-half/musl/src/termios/tcdrain.c
new file mode 100644
index 0000000..c0e542b
--- /dev/null
+++ b/libc-top-half/musl/src/termios/tcdrain.c
@@ -0,0 +1,8 @@
+#include <termios.h>
+#include <sys/ioctl.h>
+#include "syscall.h"
+
+int tcdrain(int fd)
+{
+ return syscall_cp(SYS_ioctl, fd, TCSBRK, 1);
+}
diff --git a/libc-top-half/musl/src/termios/tcflow.c b/libc-top-half/musl/src/termios/tcflow.c
new file mode 100644
index 0000000..c7fc3fe
--- /dev/null
+++ b/libc-top-half/musl/src/termios/tcflow.c
@@ -0,0 +1,7 @@
+#include <termios.h>
+#include <sys/ioctl.h>
+
+int tcflow(int fd, int action)
+{
+ return ioctl(fd, TCXONC, action);
+}
diff --git a/libc-top-half/musl/src/termios/tcflush.c b/libc-top-half/musl/src/termios/tcflush.c
new file mode 100644
index 0000000..5022266
--- /dev/null
+++ b/libc-top-half/musl/src/termios/tcflush.c
@@ -0,0 +1,7 @@
+#include <termios.h>
+#include <sys/ioctl.h>
+
+int tcflush(int fd, int queue)
+{
+ return ioctl(fd, TCFLSH, queue);
+}
diff --git a/libc-top-half/musl/src/termios/tcgetattr.c b/libc-top-half/musl/src/termios/tcgetattr.c
new file mode 100644
index 0000000..545a0bf
--- /dev/null
+++ b/libc-top-half/musl/src/termios/tcgetattr.c
@@ -0,0 +1,9 @@
+#include <termios.h>
+#include <sys/ioctl.h>
+
+int tcgetattr(int fd, struct termios *tio)
+{
+ if (ioctl(fd, TCGETS, tio))
+ return -1;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/termios/tcgetsid.c b/libc-top-half/musl/src/termios/tcgetsid.c
new file mode 100644
index 0000000..1053fd6
--- /dev/null
+++ b/libc-top-half/musl/src/termios/tcgetsid.c
@@ -0,0 +1,10 @@
+#include <termios.h>
+#include <sys/ioctl.h>
+
+pid_t tcgetsid(int fd)
+{
+ int sid;
+ if (ioctl(fd, TIOCGSID, &sid) < 0)
+ return -1;
+ return sid;
+}
diff --git a/libc-top-half/musl/src/termios/tcgetwinsize.c b/libc-top-half/musl/src/termios/tcgetwinsize.c
new file mode 100644
index 0000000..9b3a65a
--- /dev/null
+++ b/libc-top-half/musl/src/termios/tcgetwinsize.c
@@ -0,0 +1,8 @@
+#include <termios.h>
+#include <sys/ioctl.h>
+#include "syscall.h"
+
+int tcgetwinsize(int fd, struct winsize *wsz)
+{
+ return syscall(SYS_ioctl, fd, TIOCGWINSZ, wsz);
+}
diff --git a/libc-top-half/musl/src/termios/tcsendbreak.c b/libc-top-half/musl/src/termios/tcsendbreak.c
new file mode 100644
index 0000000..b6df0a2
--- /dev/null
+++ b/libc-top-half/musl/src/termios/tcsendbreak.c
@@ -0,0 +1,8 @@
+#include <termios.h>
+#include <sys/ioctl.h>
+
+int tcsendbreak(int fd, int dur)
+{
+ /* nonzero duration is implementation-defined, so ignore it */
+ return ioctl(fd, TCSBRK, 0);
+}
diff --git a/libc-top-half/musl/src/termios/tcsetattr.c b/libc-top-half/musl/src/termios/tcsetattr.c
new file mode 100644
index 0000000..94df18f
--- /dev/null
+++ b/libc-top-half/musl/src/termios/tcsetattr.c
@@ -0,0 +1,12 @@
+#include <termios.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+
+int tcsetattr(int fd, int act, const struct termios *tio)
+{
+ if (act < 0 || act > 2) {
+ errno = EINVAL;
+ return -1;
+ }
+ return ioctl(fd, TCSETS+act, tio);
+}
diff --git a/libc-top-half/musl/src/termios/tcsetwinsize.c b/libc-top-half/musl/src/termios/tcsetwinsize.c
new file mode 100644
index 0000000..e01d0e2
--- /dev/null
+++ b/libc-top-half/musl/src/termios/tcsetwinsize.c
@@ -0,0 +1,8 @@
+#include <termios.h>
+#include <sys/ioctl.h>
+#include "syscall.h"
+
+int tcsetwinsize(int fd, const struct winsize *wsz)
+{
+ return syscall(SYS_ioctl, fd, TIOCSWINSZ, wsz);
+}
diff --git a/libc-top-half/musl/src/thread/__lock.c b/libc-top-half/musl/src/thread/__lock.c
new file mode 100644
index 0000000..60eece4
--- /dev/null
+++ b/libc-top-half/musl/src/thread/__lock.c
@@ -0,0 +1,62 @@
+#include "pthread_impl.h"
+
+/* This lock primitive combines a flag (in the sign bit) and a
+ * congestion count (= threads inside the critical section, CS) in a
+ * single int that is accessed through atomic operations. The states
+ * of the int for value x are:
+ *
+ * x == 0: unlocked and no thread inside the critical section
+ *
+ * x < 0: locked with a congestion of x-INT_MIN, including the thread
+ * that holds the lock
+ *
+ * x > 0: unlocked with a congestion of x
+ *
+ * or in an equivalent formulation x is the congestion count or'ed
+ * with INT_MIN as a lock flag.
+ */
+
+void __lock(volatile int *l)
+{
+ int need_locks = libc.need_locks;
+ if (!need_locks) return;
+ /* fast path: INT_MIN for the lock, +1 for the congestion */
+ int current = a_cas(l, 0, INT_MIN + 1);
+ if (need_locks < 0) libc.need_locks = 0;
+ if (!current) return;
+ /* A first spin loop, for medium congestion. */
+ for (unsigned i = 0; i < 10; ++i) {
+ if (current < 0) current -= INT_MIN + 1;
+ // assertion: current >= 0
+ int val = a_cas(l, current, INT_MIN + (current + 1));
+ if (val == current) return;
+ current = val;
+ }
+ // Spinning failed, so mark ourselves as being inside the CS.
+ current = a_fetch_add(l, 1) + 1;
+ /* The main lock acquisition loop for heavy congestion. The only
+ * change to the value performed inside that loop is a successful
+ * lock via the CAS that acquires the lock. */
+ for (;;) {
+ /* We can only go into wait, if we know that somebody holds the
+ * lock and will eventually wake us up, again. */
+ if (current < 0) {
+ __futexwait(l, current, 1);
+ current -= INT_MIN + 1;
+ }
+ /* assertion: current > 0, the count includes us already. */
+ int val = a_cas(l, current, INT_MIN + current);
+ if (val == current) return;
+ current = val;
+ }
+}
+
+void __unlock(volatile int *l)
+{
+ /* Check l[0] to see if we are multi-threaded. */
+ if (l[0] < 0) {
+ if (a_fetch_add(l, -(INT_MIN + 1)) != (INT_MIN + 1)) {
+ __wake(l, 1, 1);
+ }
+ }
+}
diff --git a/libc-top-half/musl/src/thread/__set_thread_area.c b/libc-top-half/musl/src/thread/__set_thread_area.c
new file mode 100644
index 0000000..152a6a2
--- /dev/null
+++ b/libc-top-half/musl/src/thread/__set_thread_area.c
@@ -0,0 +1,10 @@
+#include "pthread_impl.h"
+
+int __set_thread_area(void *p)
+{
+#ifdef SYS_set_thread_area
+ return __syscall(SYS_set_thread_area, p);
+#else
+ return -ENOSYS;
+#endif
+}
diff --git a/libc-top-half/musl/src/thread/__syscall_cp.c b/libc-top-half/musl/src/thread/__syscall_cp.c
new file mode 100644
index 0000000..42a0167
--- /dev/null
+++ b/libc-top-half/musl/src/thread/__syscall_cp.c
@@ -0,0 +1,20 @@
+#include "pthread_impl.h"
+#include "syscall.h"
+
+hidden long __syscall_cp_c();
+
+static long sccp(syscall_arg_t nr,
+ syscall_arg_t u, syscall_arg_t v, syscall_arg_t w,
+ syscall_arg_t x, syscall_arg_t y, syscall_arg_t z)
+{
+ return __syscall(nr, u, v, w, x, y, z);
+}
+
+weak_alias(sccp, __syscall_cp_c);
+
+long (__syscall_cp)(syscall_arg_t nr,
+ syscall_arg_t u, syscall_arg_t v, syscall_arg_t w,
+ syscall_arg_t x, syscall_arg_t y, syscall_arg_t z)
+{
+ return __syscall_cp_c(nr, u, v, w, x, y, z);
+}
diff --git a/libc-top-half/musl/src/thread/__timedwait.c b/libc-top-half/musl/src/thread/__timedwait.c
new file mode 100644
index 0000000..7d6f6be
--- /dev/null
+++ b/libc-top-half/musl/src/thread/__timedwait.c
@@ -0,0 +1,84 @@
+#include <pthread.h>
+#include <time.h>
+#include <errno.h>
+#include "futex.h"
+#include "syscall.h"
+#include "pthread_impl.h"
+
+#ifdef __wasilibc_unmodified_upstream
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
+
+static int __futex4_cp(volatile void *addr, int op, int val, const struct timespec *to)
+{
+ int r;
+#ifdef SYS_futex_time64
+ time_t s = to ? to->tv_sec : 0;
+ long ns = to ? to->tv_nsec : 0;
+ r = -ENOSYS;
+ if (SYS_futex == SYS_futex_time64 || !IS32BIT(s))
+ r = __syscall_cp(SYS_futex_time64, addr, op, val,
+ to ? ((long long[]){s, ns}) : 0);
+ if (SYS_futex == SYS_futex_time64 || r!=-ENOSYS) return r;
+ to = to ? (void *)(long[]){CLAMP(s), ns} : 0;
+#endif
+ r = __syscall_cp(SYS_futex, addr, op, val, to);
+ if (r != -ENOSYS) return r;
+ return __syscall_cp(SYS_futex, addr, op & ~FUTEX_PRIVATE, val, to);
+}
+
+static volatile int dummy = 0;
+weak_alias(dummy, __eintr_valid_flag);
+#else
+static int __futex4_cp(volatile void *addr, int op, int val, const struct timespec *to)
+{
+ int64_t max_wait_ns = -1;
+ if (to) {
+ max_wait_ns = (int64_t)(to->tv_sec * 1000000000 + to->tv_nsec);
+ }
+ return __wasilibc_futex_wait(addr, op, val, max_wait_ns);
+}
+#endif
+
+int __timedwait_cp(volatile int *addr, int val,
+ clockid_t clk, const struct timespec *at, int priv)
+{
+ int r;
+ struct timespec to, *top=0;
+
+ if (priv) priv = FUTEX_PRIVATE;
+
+ if (at) {
+ if (at->tv_nsec >= 1000000000UL) return EINVAL;
+ if (__clock_gettime(clk, &to)) return EINVAL;
+ to.tv_sec = at->tv_sec - to.tv_sec;
+ if ((to.tv_nsec = at->tv_nsec - to.tv_nsec) < 0) {
+ to.tv_sec--;
+ to.tv_nsec += 1000000000;
+ }
+ if (to.tv_sec < 0) return ETIMEDOUT;
+ top = &to;
+ }
+
+ r = -__futex4_cp(addr, FUTEX_WAIT|priv, val, top);
+ if (r != EINTR && r != ETIMEDOUT && r != ECANCELED) r = 0;
+#ifdef __wasilibc_unmodified_upstream
+ /* Mitigate bug in old kernels wrongly reporting EINTR for non-
+ * interrupting (SA_RESTART) signal handlers. This is only practical
+ * when NO interrupting signal handlers have been installed, and
+ * works by sigaction tracking whether that's the case. */
+ if (r == EINTR && !__eintr_valid_flag) r = 0;
+#endif
+
+ return r;
+}
+
+int __timedwait(volatile int *addr, int val,
+ clockid_t clk, const struct timespec *at, int priv)
+{
+ int cs, r;
+ __pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ r = __timedwait_cp(addr, val, clk, at, priv);
+ __pthread_setcancelstate(cs, 0);
+ return r;
+}
diff --git a/libc-top-half/musl/src/thread/__tls_get_addr.c b/libc-top-half/musl/src/thread/__tls_get_addr.c
new file mode 100644
index 0000000..19524fe
--- /dev/null
+++ b/libc-top-half/musl/src/thread/__tls_get_addr.c
@@ -0,0 +1,7 @@
+#include "pthread_impl.h"
+
+void *__tls_get_addr(tls_mod_off_t *v)
+{
+ pthread_t self = __pthread_self();
+ return (void *)(self->dtv[v[0]] + v[1]);
+}
diff --git a/libc-top-half/musl/src/thread/__unmapself.c b/libc-top-half/musl/src/thread/__unmapself.c
new file mode 100644
index 0000000..31d94e6
--- /dev/null
+++ b/libc-top-half/musl/src/thread/__unmapself.c
@@ -0,0 +1,24 @@
+#include "pthread_impl.h"
+#include "atomic.h"
+#include "syscall.h"
+/* cheat and reuse CRTJMP macro from dynlink code */
+#include "dynlink.h"
+
+static void *unmap_base;
+static size_t unmap_size;
+static char shared_stack[256];
+
+static void do_unmap()
+{
+ __syscall(SYS_munmap, unmap_base, unmap_size);
+ __syscall(SYS_exit);
+}
+
+void __unmapself(void *base, size_t size)
+{
+ char *stack = shared_stack + sizeof shared_stack;
+ stack -= (uintptr_t)stack % 16;
+ unmap_base = base;
+ unmap_size = size;
+ CRTJMP(do_unmap, stack);
+}
diff --git a/libc-top-half/musl/src/thread/__wait.c b/libc-top-half/musl/src/thread/__wait.c
new file mode 100644
index 0000000..c0e4aac
--- /dev/null
+++ b/libc-top-half/musl/src/thread/__wait.c
@@ -0,0 +1,55 @@
+#include "pthread_impl.h"
+#ifndef __wasilibc_unmodified_upstream
+#include "assert.h"
+#endif
+
+#ifndef __wasilibc_unmodified_upstream
+// Use WebAssembly's `wait` instruction to implement a futex. Note that `op` is
+// unused but retained as a parameter to match the original signature of the
+// syscall and that, for `max_wait_ns`, -1 (or any negative number) means wait
+// indefinitely.
+//
+// Adapted from Emscripten: see
+// https://github.com/emscripten-core/emscripten/blob/058a9fff/system/lib/pthread/emscripten_futex_wait.c#L111-L150.
+int __wasilibc_futex_wait(volatile void *addr, int op, int val, int64_t max_wait_ns)
+{
+ if ((((intptr_t)addr) & 3) != 0) {
+ return -EINVAL;
+ }
+
+ int ret = __builtin_wasm_memory_atomic_wait32((int *)addr, val, max_wait_ns);
+
+ // memory.atomic.wait32 returns:
+ // 0 => "ok", woken by another agent.
+ // 1 => "not-equal", loaded value != expected value
+ // 2 => "timed-out", the timeout expired
+ if (ret == 1) {
+ return -EWOULDBLOCK;
+ }
+ if (ret == 2) {
+ return -ETIMEDOUT;
+ }
+ assert(ret == 0);
+ return 0;
+}
+#endif
+
+void __wait(volatile int *addr, volatile int *waiters, int val, int priv)
+{
+ int spins=100;
+ if (priv) priv = FUTEX_PRIVATE;
+ while (spins-- && (!waiters || !*waiters)) {
+ if (*addr==val) a_spin();
+ else return;
+ }
+ if (waiters) a_inc(waiters);
+ while (*addr==val) {
+#ifdef __wasilibc_unmodified_upstream
+ __syscall(SYS_futex, addr, FUTEX_WAIT|priv, val, 0) != -ENOSYS
+ || __syscall(SYS_futex, addr, FUTEX_WAIT, val, 0);
+#else
+ __wasilibc_futex_wait(addr, FUTEX_WAIT, val, 0);
+#endif
+ }
+ if (waiters) a_dec(waiters);
+}
diff --git a/libc-top-half/musl/src/thread/aarch64/__set_thread_area.s b/libc-top-half/musl/src/thread/aarch64/__set_thread_area.s
new file mode 100644
index 0000000..fd0df34
--- /dev/null
+++ b/libc-top-half/musl/src/thread/aarch64/__set_thread_area.s
@@ -0,0 +1,7 @@
+.global __set_thread_area
+.hidden __set_thread_area
+.type __set_thread_area,@function
+__set_thread_area:
+ msr tpidr_el0,x0
+ mov w0,#0
+ ret
diff --git a/libc-top-half/musl/src/thread/aarch64/__unmapself.s b/libc-top-half/musl/src/thread/aarch64/__unmapself.s
new file mode 100644
index 0000000..2c5d254
--- /dev/null
+++ b/libc-top-half/musl/src/thread/aarch64/__unmapself.s
@@ -0,0 +1,7 @@
+.global __unmapself
+.type __unmapself,%function
+__unmapself:
+ mov x8,#215 // SYS_munmap
+ svc 0
+ mov x8,#93 // SYS_exit
+ svc 0
diff --git a/libc-top-half/musl/src/thread/aarch64/clone.s b/libc-top-half/musl/src/thread/aarch64/clone.s
new file mode 100644
index 0000000..e3c8339
--- /dev/null
+++ b/libc-top-half/musl/src/thread/aarch64/clone.s
@@ -0,0 +1,30 @@
+// __clone(func, stack, flags, arg, ptid, tls, ctid)
+// x0, x1, w2, x3, x4, x5, x6
+
+// syscall(SYS_clone, flags, stack, ptid, tls, ctid)
+// x8, x0, x1, x2, x3, x4
+
+.global __clone
+.hidden __clone
+.type __clone,%function
+__clone:
+ // align stack and save func,arg
+ and x1,x1,#-16
+ stp x0,x3,[x1,#-16]!
+
+ // syscall
+ uxtw x0,w2
+ mov x2,x4
+ mov x3,x5
+ mov x4,x6
+ mov x8,#220 // SYS_clone
+ svc #0
+
+ cbz x0,1f
+ // parent
+ ret
+ // child
+1: ldp x1,x0,[sp],#16
+ blr x1
+ mov x8,#93 // SYS_exit
+ svc #0
diff --git a/libc-top-half/musl/src/thread/aarch64/syscall_cp.s b/libc-top-half/musl/src/thread/aarch64/syscall_cp.s
new file mode 100644
index 0000000..41db68a
--- /dev/null
+++ b/libc-top-half/musl/src/thread/aarch64/syscall_cp.s
@@ -0,0 +1,32 @@
+// __syscall_cp_asm(&self->cancel, nr, u, v, w, x, y, z)
+// x0 x1 x2 x3 x4 x5 x6 x7
+
+// syscall(nr, u, v, w, x, y, z)
+// x8 x0 x1 x2 x3 x4 x5
+
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm,%function
+__syscall_cp_asm:
+__cp_begin:
+ ldr w0,[x0]
+ cbnz w0,__cp_cancel
+ mov x8,x1
+ mov x0,x2
+ mov x1,x3
+ mov x2,x4
+ mov x3,x5
+ mov x4,x6
+ mov x5,x7
+ svc 0
+__cp_end:
+ ret
+__cp_cancel:
+ b __cancel
diff --git a/libc-top-half/musl/src/thread/arm/__aeabi_read_tp.s b/libc-top-half/musl/src/thread/arm/__aeabi_read_tp.s
new file mode 100644
index 0000000..2585620
--- /dev/null
+++ b/libc-top-half/musl/src/thread/arm/__aeabi_read_tp.s
@@ -0,0 +1,10 @@
+.syntax unified
+.global __aeabi_read_tp
+.type __aeabi_read_tp,%function
+__aeabi_read_tp:
+ ldr r0,1f
+ add r0,r0,pc
+ ldr r0,[r0]
+2: bx r0
+ .align 2
+1: .word __a_gettp_ptr - 2b
diff --git a/libc-top-half/musl/src/thread/arm/__set_thread_area.c b/libc-top-half/musl/src/thread/arm/__set_thread_area.c
new file mode 100644
index 0000000..09de65a
--- /dev/null
+++ b/libc-top-half/musl/src/thread/arm/__set_thread_area.c
@@ -0,0 +1,52 @@
+#include <stdint.h>
+#include <elf.h>
+#include "pthread_impl.h"
+#include "libc.h"
+
+#define HWCAP_TLS (1 << 15)
+
+extern hidden const unsigned char
+ __a_barrier_oldkuser[], __a_barrier_v6[], __a_barrier_v7[],
+ __a_cas_v6[], __a_cas_v7[],
+ __a_gettp_cp15[];
+
+#define __a_barrier_kuser 0xffff0fa0
+#define __a_barrier_oldkuser (uintptr_t)__a_barrier_oldkuser
+#define __a_barrier_v6 (uintptr_t)__a_barrier_v6
+#define __a_barrier_v7 (uintptr_t)__a_barrier_v7
+
+#define __a_cas_kuser 0xffff0fc0
+#define __a_cas_v6 (uintptr_t)__a_cas_v6
+#define __a_cas_v7 (uintptr_t)__a_cas_v7
+
+#define __a_gettp_kuser 0xffff0fe0
+#define __a_gettp_cp15 (uintptr_t)__a_gettp_cp15
+
+extern hidden uintptr_t __a_barrier_ptr, __a_cas_ptr, __a_gettp_ptr;
+
+int __set_thread_area(void *p)
+{
+#if !__ARM_ARCH_7A__ && !__ARM_ARCH_7R__ && __ARM_ARCH < 7
+ if (__hwcap & HWCAP_TLS) {
+ size_t *aux;
+ __a_cas_ptr = __a_cas_v7;
+ __a_barrier_ptr = __a_barrier_v7;
+ for (aux=libc.auxv; *aux; aux+=2) {
+ if (*aux != AT_PLATFORM) continue;
+ const char *s = (void *)aux[1];
+ if (s[0]!='v' || s[1]!='6' || s[2]-'0'<10u) break;
+ __a_cas_ptr = __a_cas_v6;
+ __a_barrier_ptr = __a_barrier_v6;
+ break;
+ }
+ } else {
+ int ver = *(int *)0xffff0ffc;
+ __a_gettp_ptr = __a_gettp_kuser;
+ __a_cas_ptr = __a_cas_kuser;
+ __a_barrier_ptr = __a_barrier_kuser;
+ if (ver < 2) a_crash();
+ if (ver < 3) __a_barrier_ptr = __a_barrier_oldkuser;
+ }
+#endif
+ return __syscall(0xf0005, p);
+}
diff --git a/libc-top-half/musl/src/thread/arm/__unmapself.s b/libc-top-half/musl/src/thread/arm/__unmapself.s
new file mode 100644
index 0000000..29c2d07
--- /dev/null
+++ b/libc-top-half/musl/src/thread/arm/__unmapself.s
@@ -0,0 +1,9 @@
+.syntax unified
+.text
+.global __unmapself
+.type __unmapself,%function
+__unmapself:
+ mov r7,#91
+ svc 0
+ mov r7,#1
+ svc 0
diff --git a/libc-top-half/musl/src/thread/arm/atomics.s b/libc-top-half/musl/src/thread/arm/atomics.s
new file mode 100644
index 0000000..da50508
--- /dev/null
+++ b/libc-top-half/musl/src/thread/arm/atomics.s
@@ -0,0 +1,106 @@
+.syntax unified
+.text
+
+.global __a_barrier_dummy
+.hidden __a_barrier_dummy
+.type __a_barrier_dummy,%function
+__a_barrier_dummy:
+ bx lr
+
+.global __a_barrier_oldkuser
+.hidden __a_barrier_oldkuser
+.type __a_barrier_oldkuser,%function
+__a_barrier_oldkuser:
+ push {r0,r1,r2,r3,ip,lr}
+ mov r1,r0
+ mov r2,sp
+ ldr ip,=0xffff0fc0
+ bl 1f
+ pop {r0,r1,r2,r3,ip,lr}
+ bx lr
+1: bx ip
+
+.global __a_barrier_v6
+.hidden __a_barrier_v6
+.type __a_barrier_v6,%function
+__a_barrier_v6:
+ .arch armv6t2
+ mcr p15,0,r0,c7,c10,5
+ bx lr
+
+.global __a_barrier_v7
+.hidden __a_barrier_v7
+.type __a_barrier_v7,%function
+__a_barrier_v7:
+ .arch armv7-a
+ dmb ish
+ bx lr
+
+.global __a_cas_dummy
+.hidden __a_cas_dummy
+.type __a_cas_dummy,%function
+__a_cas_dummy:
+ mov r3,r0
+ ldr r0,[r2]
+ subs r0,r3,r0
+ streq r1,[r2]
+ bx lr
+
+.global __a_cas_v6
+.hidden __a_cas_v6
+.type __a_cas_v6,%function
+__a_cas_v6:
+ .arch armv6t2
+ mov r3,r0
+ mcr p15,0,r0,c7,c10,5
+1: ldrex r0,[r2]
+ subs r0,r3,r0
+ strexeq r0,r1,[r2]
+ teqeq r0,#1
+ beq 1b
+ mcr p15,0,r0,c7,c10,5
+ bx lr
+
+.global __a_cas_v7
+.hidden __a_cas_v7
+.type __a_cas_v7,%function
+__a_cas_v7:
+ .arch armv7-a
+ mov r3,r0
+ dmb ish
+1: ldrex r0,[r2]
+ subs r0,r3,r0
+ strexeq r0,r1,[r2]
+ teqeq r0,#1
+ beq 1b
+ dmb ish
+ bx lr
+
+.global __a_gettp_cp15
+.hidden __a_gettp_cp15
+.type __a_gettp_cp15,%function
+__a_gettp_cp15:
+ mrc p15,0,r0,c13,c0,3
+ bx lr
+
+/* Tag this file with minimum ISA level so as not to affect linking. */
+.object_arch armv4t
+.eabi_attribute 6,2
+
+.data
+.align 2
+
+.global __a_barrier_ptr
+.hidden __a_barrier_ptr
+__a_barrier_ptr:
+ .word __a_barrier_dummy
+
+.global __a_cas_ptr
+.hidden __a_cas_ptr
+__a_cas_ptr:
+ .word __a_cas_dummy
+
+.global __a_gettp_ptr
+.hidden __a_gettp_ptr
+__a_gettp_ptr:
+ .word __a_gettp_cp15
diff --git a/libc-top-half/musl/src/thread/arm/clone.s b/libc-top-half/musl/src/thread/arm/clone.s
new file mode 100644
index 0000000..bb0965d
--- /dev/null
+++ b/libc-top-half/musl/src/thread/arm/clone.s
@@ -0,0 +1,28 @@
+.syntax unified
+.text
+.global __clone
+.hidden __clone
+.type __clone,%function
+__clone:
+ stmfd sp!,{r4,r5,r6,r7}
+ mov r7,#120
+ mov r6,r3
+ mov r5,r0
+ mov r0,r2
+ and r1,r1,#-16
+ ldr r2,[sp,#16]
+ ldr r3,[sp,#20]
+ ldr r4,[sp,#24]
+ svc 0
+ tst r0,r0
+ beq 1f
+ ldmfd sp!,{r4,r5,r6,r7}
+ bx lr
+
+1: mov r0,r6
+ bl 3f
+2: mov r7,#1
+ svc 0
+ b 2b
+
+3: bx r5
diff --git a/libc-top-half/musl/src/thread/arm/syscall_cp.s b/libc-top-half/musl/src/thread/arm/syscall_cp.s
new file mode 100644
index 0000000..e607dd4
--- /dev/null
+++ b/libc-top-half/musl/src/thread/arm/syscall_cp.s
@@ -0,0 +1,29 @@
+.syntax unified
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm,%function
+__syscall_cp_asm:
+ mov ip,sp
+ stmfd sp!,{r4,r5,r6,r7}
+__cp_begin:
+ ldr r0,[r0]
+ cmp r0,#0
+ bne __cp_cancel
+ mov r7,r1
+ mov r0,r2
+ mov r1,r3
+ ldmfd ip,{r2,r3,r4,r5,r6}
+ svc 0
+__cp_end:
+ ldmfd sp!,{r4,r5,r6,r7}
+ bx lr
+__cp_cancel:
+ ldmfd sp!,{r4,r5,r6,r7}
+ b __cancel
diff --git a/libc-top-half/musl/src/thread/call_once.c b/libc-top-half/musl/src/thread/call_once.c
new file mode 100644
index 0000000..5ed3018
--- /dev/null
+++ b/libc-top-half/musl/src/thread/call_once.c
@@ -0,0 +1,7 @@
+#include <threads.h>
+#include <pthread.h>
+
+void call_once(once_flag *flag, void (*func)(void))
+{
+ __pthread_once(flag, func);
+}
diff --git a/libc-top-half/musl/src/thread/clone.c b/libc-top-half/musl/src/thread/clone.c
new file mode 100644
index 0000000..be80c8e
--- /dev/null
+++ b/libc-top-half/musl/src/thread/clone.c
@@ -0,0 +1,7 @@
+#include <errno.h>
+#include "pthread_impl.h"
+
+int __clone(int (*func)(void *), void *stack, int flags, void *arg, ...)
+{
+ return -ENOSYS;
+}
diff --git a/libc-top-half/musl/src/thread/cnd_broadcast.c b/libc-top-half/musl/src/thread/cnd_broadcast.c
new file mode 100644
index 0000000..e76b5a8
--- /dev/null
+++ b/libc-top-half/musl/src/thread/cnd_broadcast.c
@@ -0,0 +1,9 @@
+#include <threads.h>
+#include <pthread.h>
+
+int cnd_broadcast(cnd_t *c)
+{
+ /* This internal function never fails, and always returns zero,
+ * which matches the value thrd_success is defined with. */
+ return __private_cond_signal((pthread_cond_t *)c, -1);
+}
diff --git a/libc-top-half/musl/src/thread/cnd_destroy.c b/libc-top-half/musl/src/thread/cnd_destroy.c
new file mode 100644
index 0000000..453c90b
--- /dev/null
+++ b/libc-top-half/musl/src/thread/cnd_destroy.c
@@ -0,0 +1,6 @@
+#include <threads.h>
+
+void cnd_destroy(cnd_t *c)
+{
+ /* For private cv this is a no-op */
+}
diff --git a/libc-top-half/musl/src/thread/cnd_init.c b/libc-top-half/musl/src/thread/cnd_init.c
new file mode 100644
index 0000000..18c5085
--- /dev/null
+++ b/libc-top-half/musl/src/thread/cnd_init.c
@@ -0,0 +1,7 @@
+#include <threads.h>
+
+int cnd_init(cnd_t *c)
+{
+ *c = (cnd_t){ 0 };
+ return thrd_success;
+}
diff --git a/libc-top-half/musl/src/thread/cnd_signal.c b/libc-top-half/musl/src/thread/cnd_signal.c
new file mode 100644
index 0000000..02cdc6c
--- /dev/null
+++ b/libc-top-half/musl/src/thread/cnd_signal.c
@@ -0,0 +1,9 @@
+#include <threads.h>
+#include <pthread.h>
+
+int cnd_signal(cnd_t *c)
+{
+ /* This internal function never fails, and always returns zero,
+ * which matches the value thrd_success is defined with. */
+ return __private_cond_signal((pthread_cond_t *)c, 1);
+}
diff --git a/libc-top-half/musl/src/thread/cnd_timedwait.c b/libc-top-half/musl/src/thread/cnd_timedwait.c
new file mode 100644
index 0000000..2802af5
--- /dev/null
+++ b/libc-top-half/musl/src/thread/cnd_timedwait.c
@@ -0,0 +1,14 @@
+#include <threads.h>
+#include <pthread.h>
+#include <errno.h>
+
+int cnd_timedwait(cnd_t *restrict c, mtx_t *restrict m, const struct timespec *restrict ts)
+{
+ int ret = __pthread_cond_timedwait((pthread_cond_t *)c, (pthread_mutex_t *)m, ts);
+ switch (ret) {
+ /* May also return EINVAL or EPERM. */
+ default: return thrd_error;
+ case 0: return thrd_success;
+ case ETIMEDOUT: return thrd_timedout;
+ }
+}
diff --git a/libc-top-half/musl/src/thread/cnd_wait.c b/libc-top-half/musl/src/thread/cnd_wait.c
new file mode 100644
index 0000000..602796f
--- /dev/null
+++ b/libc-top-half/musl/src/thread/cnd_wait.c
@@ -0,0 +1,9 @@
+#include <threads.h>
+
+int cnd_wait(cnd_t *c, mtx_t *m)
+{
+ /* Calling cnd_timedwait with a null pointer is an extension.
+ * It is convenient here to avoid duplication of the logic
+ * for return values. */
+ return cnd_timedwait(c, m, 0);
+}
diff --git a/libc-top-half/musl/src/thread/default_attr.c b/libc-top-half/musl/src/thread/default_attr.c
new file mode 100644
index 0000000..dce9640
--- /dev/null
+++ b/libc-top-half/musl/src/thread/default_attr.c
@@ -0,0 +1,4 @@
+#include "pthread_impl.h"
+
+unsigned __default_stacksize = DEFAULT_STACK_SIZE;
+unsigned __default_guardsize = DEFAULT_GUARD_SIZE;
diff --git a/libc-top-half/musl/src/thread/i386/__set_thread_area.s b/libc-top-half/musl/src/thread/i386/__set_thread_area.s
new file mode 100644
index 0000000..aa6852b
--- /dev/null
+++ b/libc-top-half/musl/src/thread/i386/__set_thread_area.s
@@ -0,0 +1,47 @@
+.text
+.global __set_thread_area
+.hidden __set_thread_area
+.type __set_thread_area,@function
+__set_thread_area:
+ push %ebx
+ push $0x51
+ push $0xfffff
+ push 16(%esp)
+ call 1f
+1: addl $4f-1b,(%esp)
+ pop %ecx
+ mov (%ecx),%edx
+ push %edx
+ mov %esp,%ebx
+ xor %eax,%eax
+ mov $243,%al
+ int $128
+ testl %eax,%eax
+ jnz 2f
+ movl (%esp),%edx
+ movl %edx,(%ecx)
+ leal 3(,%edx,8),%edx
+3: movw %dx,%gs
+1:
+ addl $16,%esp
+ popl %ebx
+ ret
+2:
+ mov %ebx,%ecx
+ xor %eax,%eax
+ xor %ebx,%ebx
+ xor %edx,%edx
+ mov %ebx,(%esp)
+ mov $1,%bl
+ mov $16,%dl
+ mov $123,%al
+ int $128
+ testl %eax,%eax
+ jnz 1b
+ mov $7,%dl
+ inc %al
+ jmp 3b
+
+.data
+ .align 4
+4: .long -1
diff --git a/libc-top-half/musl/src/thread/i386/__unmapself.s b/libc-top-half/musl/src/thread/i386/__unmapself.s
new file mode 100644
index 0000000..d656959
--- /dev/null
+++ b/libc-top-half/musl/src/thread/i386/__unmapself.s
@@ -0,0 +1,11 @@
+.text
+.global __unmapself
+.type __unmapself,@function
+__unmapself:
+ movl $91,%eax
+ movl 4(%esp),%ebx
+ movl 8(%esp),%ecx
+ int $128
+ xorl %ebx,%ebx
+ movl $1,%eax
+ int $128
diff --git a/libc-top-half/musl/src/thread/i386/clone.s b/libc-top-half/musl/src/thread/i386/clone.s
new file mode 100644
index 0000000..e237d3c
--- /dev/null
+++ b/libc-top-half/musl/src/thread/i386/clone.s
@@ -0,0 +1,49 @@
+.text
+.global __clone
+.hidden __clone
+.type __clone,@function
+__clone:
+ push %ebp
+ mov %esp,%ebp
+ push %ebx
+ push %esi
+ push %edi
+
+ xor %eax,%eax
+ push $0x51
+ mov %gs,%ax
+ push $0xfffff
+ shr $3,%eax
+ push 28(%ebp)
+ push %eax
+ mov $120,%al
+
+ mov 12(%ebp),%ecx
+ mov 16(%ebp),%ebx
+ and $-16,%ecx
+ sub $16,%ecx
+ mov 20(%ebp),%edi
+ mov %edi,(%ecx)
+ mov 24(%ebp),%edx
+ mov %esp,%esi
+ mov 32(%ebp),%edi
+ mov 8(%ebp),%ebp
+ int $128
+ test %eax,%eax
+ jnz 1f
+
+ mov %ebp,%eax
+ xor %ebp,%ebp
+ call *%eax
+ mov %eax,%ebx
+ xor %eax,%eax
+ inc %eax
+ int $128
+ hlt
+
+1: add $16,%esp
+ pop %edi
+ pop %esi
+ pop %ebx
+ pop %ebp
+ ret
diff --git a/libc-top-half/musl/src/thread/i386/syscall_cp.s b/libc-top-half/musl/src/thread/i386/syscall_cp.s
new file mode 100644
index 0000000..7dce1eb
--- /dev/null
+++ b/libc-top-half/musl/src/thread/i386/syscall_cp.s
@@ -0,0 +1,41 @@
+.text
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm,@function
+__syscall_cp_asm:
+ mov 4(%esp),%ecx
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ pushl %ebp
+__cp_begin:
+ movl (%ecx),%eax
+ testl %eax,%eax
+ jnz __cp_cancel
+ movl 24(%esp),%eax
+ movl 28(%esp),%ebx
+ movl 32(%esp),%ecx
+ movl 36(%esp),%edx
+ movl 40(%esp),%esi
+ movl 44(%esp),%edi
+ movl 48(%esp),%ebp
+ int $128
+__cp_end:
+ popl %ebp
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret
+__cp_cancel:
+ popl %ebp
+ popl %edi
+ popl %esi
+ popl %ebx
+ jmp __cancel
diff --git a/libc-top-half/musl/src/thread/i386/tls.s b/libc-top-half/musl/src/thread/i386/tls.s
new file mode 100644
index 0000000..6e4c4cb
--- /dev/null
+++ b/libc-top-half/musl/src/thread/i386/tls.s
@@ -0,0 +1,9 @@
+.text
+.global ___tls_get_addr
+.type ___tls_get_addr,@function
+___tls_get_addr:
+ mov %gs:4,%edx
+ mov (%eax),%ecx
+ mov 4(%eax),%eax
+ add (%edx,%ecx,4),%eax
+ ret
diff --git a/libc-top-half/musl/src/thread/lock_ptc.c b/libc-top-half/musl/src/thread/lock_ptc.c
new file mode 100644
index 0000000..7adedab
--- /dev/null
+++ b/libc-top-half/musl/src/thread/lock_ptc.c
@@ -0,0 +1,18 @@
+#include <pthread.h>
+
+static pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER;
+
+void __inhibit_ptc()
+{
+ pthread_rwlock_wrlock(&lock);
+}
+
+void __acquire_ptc()
+{
+ pthread_rwlock_rdlock(&lock);
+}
+
+void __release_ptc()
+{
+ pthread_rwlock_unlock(&lock);
+}
diff --git a/libc-top-half/musl/src/thread/m68k/__m68k_read_tp.s b/libc-top-half/musl/src/thread/m68k/__m68k_read_tp.s
new file mode 100644
index 0000000..86886da
--- /dev/null
+++ b/libc-top-half/musl/src/thread/m68k/__m68k_read_tp.s
@@ -0,0 +1,8 @@
+.text
+.global __m68k_read_tp
+.type __m68k_read_tp,@function
+__m68k_read_tp:
+ move.l #333,%d0
+ trap #0
+ move.l %d0,%a0
+ rts
diff --git a/libc-top-half/musl/src/thread/m68k/clone.s b/libc-top-half/musl/src/thread/m68k/clone.s
new file mode 100644
index 0000000..f6dfa06
--- /dev/null
+++ b/libc-top-half/musl/src/thread/m68k/clone.s
@@ -0,0 +1,25 @@
+.text
+.global __clone
+.hidden __clone
+.type __clone,@function
+__clone:
+ movem.l %d2-%d5,-(%sp)
+ move.l #120,%d0
+ move.l 28(%sp),%d1
+ move.l 24(%sp),%d2
+ and.l #-16,%d2
+ move.l 36(%sp),%d3
+ move.l 44(%sp),%d4
+ move.l 40(%sp),%d5
+ move.l 20(%sp),%a0
+ move.l 32(%sp),%a1
+ trap #0
+ tst.l %d0
+ beq 1f
+ movem.l (%sp)+,%d2-%d5
+ rts
+1: move.l %a1,-(%sp)
+ jsr (%a0)
+ move.l #1,%d0
+ trap #0
+ clr.b 0
diff --git a/libc-top-half/musl/src/thread/m68k/syscall_cp.s b/libc-top-half/musl/src/thread/m68k/syscall_cp.s
new file mode 100644
index 0000000..5628a89
--- /dev/null
+++ b/libc-top-half/musl/src/thread/m68k/syscall_cp.s
@@ -0,0 +1,26 @@
+.text
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm,@function
+__syscall_cp_asm:
+ movem.l %d2-%d5,-(%sp)
+ movea.l 20(%sp),%a0
+__cp_begin:
+ move.l (%a0),%d0
+ bne __cp_cancel
+ movem.l 24(%sp),%d0-%d5/%a0
+ trap #0
+__cp_end:
+ movem.l (%sp)+,%d2-%d5
+ rts
+__cp_cancel:
+ movem.l (%sp)+,%d2-%d5
+ move.l __cancel-.-8,%a1
+ jmp (%pc,%a1)
diff --git a/libc-top-half/musl/src/thread/microblaze/__set_thread_area.s b/libc-top-half/musl/src/thread/microblaze/__set_thread_area.s
new file mode 100644
index 0000000..9a226a9
--- /dev/null
+++ b/libc-top-half/musl/src/thread/microblaze/__set_thread_area.s
@@ -0,0 +1,7 @@
+.global __set_thread_area
+.hidden __set_thread_area
+.type __set_thread_area,@function
+__set_thread_area:
+ ori r21, r5, 0
+ rtsd r15, 8
+ ori r3, r0, 0
diff --git a/libc-top-half/musl/src/thread/microblaze/__unmapself.s b/libc-top-half/musl/src/thread/microblaze/__unmapself.s
new file mode 100644
index 0000000..b180de6
--- /dev/null
+++ b/libc-top-half/musl/src/thread/microblaze/__unmapself.s
@@ -0,0 +1,8 @@
+.global __unmapself
+.type __unmapself,@function
+__unmapself:
+ ori r12, r0, 91
+ brki r14, 0x8
+ ori r12, r0, 1
+ brki r14, 0x8
+ nop
diff --git a/libc-top-half/musl/src/thread/microblaze/clone.s b/libc-top-half/musl/src/thread/microblaze/clone.s
new file mode 100644
index 0000000..b68cc5f
--- /dev/null
+++ b/libc-top-half/musl/src/thread/microblaze/clone.s
@@ -0,0 +1,30 @@
+.global __clone
+.hidden __clone
+.type __clone,@function
+
+# r5, r6, r7, r8, r9, r10, stack
+# fn, st, fl, ar, pt, tl, ct
+# fl, st, __, pt, ct, tl
+
+__clone:
+ andi r6, r6, -16
+ addi r6, r6, -16
+ swi r5, r6, 0
+ swi r8, r6, 4
+
+ ori r5, r7, 0
+ ori r8, r9, 0
+ lwi r9, r1, 28
+ ori r12, r0, 120
+
+ brki r14, 8
+ beqi r3, 1f
+ rtsd r15, 8
+ nop
+
+1: lwi r3, r1, 0
+ lwi r5, r1, 4
+ brald r15, r3
+ nop
+ ori r12, r0, 1
+ brki r14, 8
diff --git a/libc-top-half/musl/src/thread/microblaze/syscall_cp.s b/libc-top-half/musl/src/thread/microblaze/syscall_cp.s
new file mode 100644
index 0000000..b0df61c
--- /dev/null
+++ b/libc-top-half/musl/src/thread/microblaze/syscall_cp.s
@@ -0,0 +1,27 @@
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm,@function
+__syscall_cp_asm:
+__cp_begin:
+ lwi r5, r5, 0
+ bnei r5, __cp_cancel
+ addi r12, r6, 0
+ add r5, r7, r0
+ add r6, r8, r0
+ add r7, r9, r0
+ add r8, r10, r0
+ lwi r9, r1, 28
+ lwi r10, r1, 32
+ brki r14, 0x8
+__cp_end:
+ rtsd r15, 8
+ nop
+__cp_cancel:
+ bri __cancel
diff --git a/libc-top-half/musl/src/thread/mips/__unmapself.s b/libc-top-half/musl/src/thread/mips/__unmapself.s
new file mode 100644
index 0000000..ba139dc
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mips/__unmapself.s
@@ -0,0 +1,10 @@
+.set noreorder
+.global __unmapself
+.type __unmapself,@function
+__unmapself:
+ move $sp, $25
+ li $2, 4091
+ syscall
+ li $4, 0
+ li $2, 4001
+ syscall
diff --git a/libc-top-half/musl/src/thread/mips/clone.s b/libc-top-half/musl/src/thread/mips/clone.s
new file mode 100644
index 0000000..0446338
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mips/clone.s
@@ -0,0 +1,36 @@
+.set noreorder
+.global __clone
+.hidden __clone
+.type __clone,@function
+__clone:
+ # Save function pointer and argument pointer on new thread stack
+ and $5, $5, -8
+ subu $5, $5, 16
+ sw $4, 0($5)
+ sw $7, 4($5)
+ # Shuffle (fn,sp,fl,arg,ptid,tls,ctid) to (fl,sp,ptid,tls,ctid)
+ move $4, $6
+ lw $6, 16($sp)
+ lw $7, 20($sp)
+ lw $9, 24($sp)
+ subu $sp, $sp, 16
+ sw $9, 16($sp)
+ li $2, 4120
+ syscall
+ beq $7, $0, 1f
+ nop
+ addu $sp, $sp, 16
+ jr $ra
+ subu $2, $0, $2
+1: beq $2, $0, 1f
+ nop
+ addu $sp, $sp, 16
+ jr $ra
+ nop
+1: lw $25, 0($sp)
+ lw $4, 4($sp)
+ jalr $25
+ nop
+ move $4, $2
+ li $2, 4001
+ syscall
diff --git a/libc-top-half/musl/src/thread/mips/syscall_cp.s b/libc-top-half/musl/src/thread/mips/syscall_cp.s
new file mode 100644
index 0000000..d284626
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mips/syscall_cp.s
@@ -0,0 +1,53 @@
+.set noreorder
+
+.global __cp_begin
+.hidden __cp_begin
+.type __cp_begin,@function
+.global __cp_end
+.hidden __cp_end
+.type __cp_end,@function
+.global __cp_cancel
+.hidden __cp_cancel
+.type __cp_cancel,@function
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm,@function
+__syscall_cp_asm:
+ subu $sp, $sp, 32
+__cp_begin:
+ lw $4, 0($4)
+ bne $4, $0, __cp_cancel
+ move $2, $5
+ move $4, $6
+ move $5, $7
+ lw $6, 48($sp)
+ lw $7, 52($sp)
+ lw $8, 56($sp)
+ lw $9, 60($sp)
+ lw $10,64($sp)
+ sw $8, 16($sp)
+ sw $9, 20($sp)
+ sw $10,24($sp)
+ sw $2, 28($sp)
+ lw $2, 28($sp)
+ syscall
+__cp_end:
+ beq $7, $0, 1f
+ addu $sp, $sp, 32
+ subu $2, $0, $2
+1: jr $ra
+ nop
+
+__cp_cancel:
+ move $2, $ra
+ bal 1f
+ addu $sp, $sp, 32
+ .gpword .
+ .gpword __cancel
+1: lw $3, ($ra)
+ subu $3, $ra, $3
+ lw $25, 4($ra)
+ addu $25, $25, $3
+ jr $25
+ move $ra, $2
diff --git a/libc-top-half/musl/src/thread/mips64/__unmapself.s b/libc-top-half/musl/src/thread/mips64/__unmapself.s
new file mode 100644
index 0000000..f6795cd
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mips64/__unmapself.s
@@ -0,0 +1,9 @@
+.set noreorder
+.global __unmapself
+.type __unmapself, @function
+__unmapself:
+ li $2, 5011
+ syscall
+ li $4, 0
+ li $2, 5058
+ syscall
diff --git a/libc-top-half/musl/src/thread/mips64/clone.s b/libc-top-half/musl/src/thread/mips64/clone.s
new file mode 100644
index 0000000..2d86899
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mips64/clone.s
@@ -0,0 +1,34 @@
+.set noreorder
+.global __clone
+.hidden __clone
+.type __clone,@function
+__clone:
+ # Save function pointer and argument pointer on new thread stack
+ and $5, $5, -16 # aligning stack to double word
+ dsubu $5, $5, 16
+ sd $4, 0($5) # save function pointer
+ sd $7, 8($5) # save argument pointer
+
+ # Shuffle (fn,sp,fl,arg,ptid,tls,ctid) to (fl,sp,ptid,tls,ctid)
+ # sys_clone(u64 flags, u64 ustack_base, u64 parent_tidptr, u64 child_tidptr, u64 tls)
+ move $4, $6
+ move $6, $8
+ move $7, $9
+ move $8, $10
+ li $2, 5055
+ syscall
+ beq $7, $0, 1f
+ nop
+ jr $ra
+ dsubu $2, $0, $2
+1: beq $2, $0, 1f
+ nop
+ jr $ra
+ nop
+1: ld $25, 0($sp) # function pointer
+ ld $4, 8($sp) # argument pointer
+ jalr $25 # call the user's function
+ nop
+ move $4, $2
+ li $2, 5058
+ syscall
diff --git a/libc-top-half/musl/src/thread/mips64/syscall_cp.s b/libc-top-half/musl/src/thread/mips64/syscall_cp.s
new file mode 100644
index 0000000..0d4ede7
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mips64/syscall_cp.s
@@ -0,0 +1,52 @@
+.set noreorder
+.global __cp_begin
+.hidden __cp_begin
+.type __cp_begin,@function
+.global __cp_end
+.hidden __cp_end
+.type __cp_end,@function
+.global __cp_cancel
+.hidden __cp_cancel
+.type __cp_cancel,@function
+.global __cp_cancel_data
+.hidden __cp_cancel_data
+.type __cp_cancel_data,@function
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm,@function
+__syscall_cp_asm:
+__cp_begin:
+ lw $4, 0($4)
+ bne $4, $0, __cp_cancel
+ move $2, $5
+ move $4, $6
+ move $5, $7
+ move $6, $8
+ move $7, $9
+ move $8, $10
+ move $9, $11
+ ld $10, 0($sp)
+ syscall
+__cp_end:
+ beq $7, $0, 1f
+ nop
+ dsubu $2, $0, $2
+1: jr $ra
+ nop
+
+ # if cancellation flag is 1 then call __cancel
+__cp_cancel:
+ move $2, $ra
+.align 8
+ bal 1f
+ nop
+__cp_cancel_data:
+ .gpdword __cp_cancel_data
+ .gpdword __cancel
+1: ld $3, ($ra)
+ dsubu $3, $ra, $3
+ ld $25, 8($ra)
+ daddu $25, $25, $3
+ jr $25
+ move $ra, $2
diff --git a/libc-top-half/musl/src/thread/mipsn32/__unmapself.s b/libc-top-half/musl/src/thread/mipsn32/__unmapself.s
new file mode 100644
index 0000000..4b032e5
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mipsn32/__unmapself.s
@@ -0,0 +1,9 @@
+.set noreorder
+.global __unmapself
+.type __unmapself,@function
+__unmapself:
+ li $2, 6011
+ syscall
+ li $4, 0
+ li $2, 6058
+ syscall
diff --git a/libc-top-half/musl/src/thread/mipsn32/clone.s b/libc-top-half/musl/src/thread/mipsn32/clone.s
new file mode 100644
index 0000000..4d3c8c7
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mipsn32/clone.s
@@ -0,0 +1,34 @@
+.set noreorder
+.global __clone
+.hidden __clone
+.type __clone,@function
+__clone:
+ # Save function pointer and argument pointer on new thread stack
+ and $5, $5, -16 # aligning stack to double word
+ subu $5, $5, 16
+ sw $4, 0($5) # save function pointer
+ sw $7, 4($5) # save argument pointer
+
+ # Shuffle (fn,sp,fl,arg,ptid,tls,ctid) to (fl,sp,ptid,tls,ctid)
+ # sys_clone(u64 flags, u64 ustack_base, u64 parent_tidptr, u64 child_tidptr, u64 tls)
+ move $4, $6
+ move $6, $8
+ move $7, $9
+ move $8, $10
+ li $2, 6055
+ syscall
+ beq $7, $0, 1f
+ nop
+ jr $ra
+ subu $2, $0, $2
+1: beq $2, $0, 1f
+ nop
+ jr $ra
+ nop
+1: lw $25, 0($sp) # function pointer
+ lw $4, 4($sp) # argument pointer
+ jalr $25 # call the user's function
+ nop
+ move $4, $2
+ li $2, 6058
+ syscall
diff --git a/libc-top-half/musl/src/thread/mipsn32/syscall_cp.s b/libc-top-half/musl/src/thread/mipsn32/syscall_cp.s
new file mode 100644
index 0000000..e85615b
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mipsn32/syscall_cp.s
@@ -0,0 +1,51 @@
+.set noreorder
+.global __cp_begin
+.hidden __cp_begin
+.type __cp_begin,@function
+.global __cp_end
+.hidden __cp_end
+.type __cp_end,@function
+.global __cp_cancel
+.hidden __cp_cancel
+.type __cp_cancel,@function
+.global __cp_cancel_data
+.hidden __cp_cancel_data
+.type __cp_cancel_data,@function
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm,@function
+__syscall_cp_asm:
+__cp_begin:
+ lw $4, 0($4)
+ bne $4, $0, __cp_cancel
+ move $2, $5
+ move $4, $6
+ move $5, $7
+ move $6, $8
+ move $7, $9
+ move $8, $10
+ move $9, $11
+ lw $10, 0($sp)
+ syscall
+__cp_end:
+ beq $7, $0, 1f
+ nop
+ subu $2, $0, $2
+1: jr $ra
+ nop
+
+ # if cancellation flag is 1 then call __cancel
+__cp_cancel:
+ move $2, $ra
+ bal 1f
+ nop
+__cp_cancel_data:
+ .gpword __cp_cancel_data
+ .gpword __cancel
+1: lw $3, 0($ra)
+ subu $3, $ra, $3
+ lw $25, 4($ra)
+ addu $25, $25, $3
+ jr $25
+ move $ra, $2
diff --git a/libc-top-half/musl/src/thread/mtx_destroy.c b/libc-top-half/musl/src/thread/mtx_destroy.c
new file mode 100644
index 0000000..40a0899
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mtx_destroy.c
@@ -0,0 +1,5 @@
+#include <threads.h>
+
+void mtx_destroy(mtx_t *mtx)
+{
+}
diff --git a/libc-top-half/musl/src/thread/mtx_init.c b/libc-top-half/musl/src/thread/mtx_init.c
new file mode 100644
index 0000000..4826f76
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mtx_init.c
@@ -0,0 +1,10 @@
+#include "pthread_impl.h"
+#include <threads.h>
+
+int mtx_init(mtx_t *m, int type)
+{
+ *m = (mtx_t){
+ ._m_type = ((type&mtx_recursive) ? PTHREAD_MUTEX_RECURSIVE : PTHREAD_MUTEX_NORMAL),
+ };
+ return thrd_success;
+}
diff --git a/libc-top-half/musl/src/thread/mtx_lock.c b/libc-top-half/musl/src/thread/mtx_lock.c
new file mode 100644
index 0000000..5c2415c
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mtx_lock.c
@@ -0,0 +1,12 @@
+#include "pthread_impl.h"
+#include <threads.h>
+
+int mtx_lock(mtx_t *m)
+{
+ if (m->_m_type == PTHREAD_MUTEX_NORMAL && !a_cas(&m->_m_lock, 0, EBUSY))
+ return thrd_success;
+ /* Calling mtx_timedlock with a null pointer is an extension.
+ * It is convenient, here to avoid duplication of the logic
+ * for return values. */
+ return mtx_timedlock(m, 0);
+}
diff --git a/libc-top-half/musl/src/thread/mtx_timedlock.c b/libc-top-half/musl/src/thread/mtx_timedlock.c
new file mode 100644
index 0000000..d22c8cf
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mtx_timedlock.c
@@ -0,0 +1,13 @@
+#include <threads.h>
+#include <pthread.h>
+#include <errno.h>
+
+int mtx_timedlock(mtx_t *restrict m, const struct timespec *restrict ts)
+{
+ int ret = __pthread_mutex_timedlock((pthread_mutex_t *)m, ts);
+ switch (ret) {
+ default: return thrd_error;
+ case 0: return thrd_success;
+ case ETIMEDOUT: return thrd_timedout;
+ }
+}
diff --git a/libc-top-half/musl/src/thread/mtx_trylock.c b/libc-top-half/musl/src/thread/mtx_trylock.c
new file mode 100644
index 0000000..40a8b8c
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mtx_trylock.c
@@ -0,0 +1,15 @@
+#include "pthread_impl.h"
+#include <threads.h>
+
+int mtx_trylock(mtx_t *m)
+{
+ if (m->_m_type == PTHREAD_MUTEX_NORMAL)
+ return (a_cas(&m->_m_lock, 0, EBUSY) & EBUSY) ? thrd_busy : thrd_success;
+
+ int ret = __pthread_mutex_trylock((pthread_mutex_t *)m);
+ switch (ret) {
+ default: return thrd_error;
+ case 0: return thrd_success;
+ case EBUSY: return thrd_busy;
+ }
+}
diff --git a/libc-top-half/musl/src/thread/mtx_unlock.c b/libc-top-half/musl/src/thread/mtx_unlock.c
new file mode 100644
index 0000000..2e5c8cf
--- /dev/null
+++ b/libc-top-half/musl/src/thread/mtx_unlock.c
@@ -0,0 +1,10 @@
+#include <threads.h>
+#include <pthread.h>
+
+int mtx_unlock(mtx_t *mtx)
+{
+ /* The only cases where pthread_mutex_unlock can return an
+ * error are undefined behavior for C11 mtx_unlock, so we can
+ * assume it does not return an error and simply tail call. */
+ return __pthread_mutex_unlock((pthread_mutex_t *)mtx);
+}
diff --git a/libc-top-half/musl/src/thread/or1k/__set_thread_area.s b/libc-top-half/musl/src/thread/or1k/__set_thread_area.s
new file mode 100644
index 0000000..b9ffb93
--- /dev/null
+++ b/libc-top-half/musl/src/thread/or1k/__set_thread_area.s
@@ -0,0 +1,7 @@
+.global __set_thread_area
+.hidden __set_thread_area
+.type __set_thread_area,@function
+__set_thread_area:
+ l.ori r10, r3, 0
+ l.jr r9
+ l.ori r11, r0, 0
diff --git a/libc-top-half/musl/src/thread/or1k/__unmapself.s b/libc-top-half/musl/src/thread/or1k/__unmapself.s
new file mode 100644
index 0000000..6c0fa2a
--- /dev/null
+++ b/libc-top-half/musl/src/thread/or1k/__unmapself.s
@@ -0,0 +1,8 @@
+.global __unmapself
+.type __unmapself,@function
+__unmapself:
+ l.ori r11, r0, 215 /* __NR_munmap */
+ l.sys 1
+ l.ori r3, r0, 0
+ l.ori r11, r0, 93 /* __NR_exit */
+ l.sys 1
diff --git a/libc-top-half/musl/src/thread/or1k/clone.s b/libc-top-half/musl/src/thread/or1k/clone.s
new file mode 100644
index 0000000..2473ac2
--- /dev/null
+++ b/libc-top-half/musl/src/thread/or1k/clone.s
@@ -0,0 +1,31 @@
+/* int clone(fn, stack, flags, arg, ptid, tls, ctid)
+ * r3 r4 r5 r6 sp+0 sp+4 sp+8
+ * sys_clone(flags, stack, ptid, ctid, tls)
+ */
+.global __clone
+.hidden __clone
+.type __clone,@function
+__clone:
+ l.addi r4, r4, -8
+ l.sw 0(r4), r3
+ l.sw 4(r4), r6
+ /* (fn, st, fl, ar, pt, tl, ct) => (fl, st, pt, ct, tl) */
+ l.ori r3, r5, 0
+ l.lwz r5, 0(r1)
+ l.lwz r6, 8(r1)
+ l.lwz r7, 4(r1)
+ l.ori r11, r0, 220 /* __NR_clone */
+ l.sys 1
+
+ l.sfeqi r11, 0
+ l.bf 1f
+ l.nop
+ l.jr r9
+ l.nop
+
+1: l.lwz r11, 0(r1)
+ l.jalr r11
+ l.lwz r3, 4(r1)
+
+ l.ori r11, r0, 93 /* __NR_exit */
+ l.sys 1
diff --git a/libc-top-half/musl/src/thread/or1k/syscall_cp.s b/libc-top-half/musl/src/thread/or1k/syscall_cp.s
new file mode 100644
index 0000000..7951166
--- /dev/null
+++ b/libc-top-half/musl/src/thread/or1k/syscall_cp.s
@@ -0,0 +1,29 @@
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm,@function
+__syscall_cp_asm:
+__cp_begin:
+ l.lwz r3, 0(r3)
+ l.sfeqi r3, 0
+ l.bnf __cp_cancel
+ l.ori r11, r4, 0
+ l.ori r3, r5, 0
+ l.ori r4, r6, 0
+ l.ori r5, r7, 0
+ l.ori r6, r8, 0
+ l.lwz r7, 0(r1)
+ l.lwz r8, 4(r1)
+ l.sys 1
+__cp_end:
+ l.jr r9
+ l.nop
+__cp_cancel:
+ l.j __cancel
+ l.nop
diff --git a/libc-top-half/musl/src/thread/powerpc/__set_thread_area.s b/libc-top-half/musl/src/thread/powerpc/__set_thread_area.s
new file mode 100644
index 0000000..86c498f
--- /dev/null
+++ b/libc-top-half/musl/src/thread/powerpc/__set_thread_area.s
@@ -0,0 +1,12 @@
+.text
+.global __set_thread_area
+.hidden __set_thread_area
+.type __set_thread_area, %function
+__set_thread_area:
+ # mov pointer in reg3 into r2
+ mr 2, 3
+ # put 0 into return reg
+ li 3, 0
+ # return
+ blr
+
diff --git a/libc-top-half/musl/src/thread/powerpc/__unmapself.s b/libc-top-half/musl/src/thread/powerpc/__unmapself.s
new file mode 100644
index 0000000..c9360b4
--- /dev/null
+++ b/libc-top-half/musl/src/thread/powerpc/__unmapself.s
@@ -0,0 +1,9 @@
+ .text
+ .global __unmapself
+ .type __unmapself,%function
+__unmapself:
+ li 0, 91 # __NR_munmap
+ sc
+ li 0, 1 #__NR_exit
+ sc
+ blr
diff --git a/libc-top-half/musl/src/thread/powerpc/clone.s b/libc-top-half/musl/src/thread/powerpc/clone.s
new file mode 100644
index 0000000..da13f44
--- /dev/null
+++ b/libc-top-half/musl/src/thread/powerpc/clone.s
@@ -0,0 +1,73 @@
+.text
+.global __clone
+.hidden __clone
+.type __clone, %function
+__clone:
+# int clone(fn, stack, flags, arg, ptid, tls, ctid)
+# a b c d e f g
+# 3 4 5 6 7 8 9
+# pseudo C code:
+# tid = syscall(SYS_clone,c,b,e,f,g);
+# if (!tid) syscall(SYS_exit, a(d));
+# return tid;
+
+# SYS_clone = 120
+# SYS_exit = 1
+
+# store non-volatile regs r30, r31 on stack in order to put our
+# start func and its arg there
+stwu 30, -16(1)
+stw 31, 4(1)
+
+# save r3 (func) into r30, and r6(arg) into r31
+mr 30, 3
+mr 31, 6
+
+# create initial stack frame for new thread
+clrrwi 4, 4, 4
+li 0, 0
+stwu 0, -16(4)
+
+#move c into first arg
+mr 3, 5
+#mr 4, 4
+mr 5, 7
+mr 6, 8
+mr 7, 9
+
+# move syscall number into r0
+li 0, 120
+
+sc
+
+# check for syscall error
+bns+ 1f # jump to label 1 if no summary overflow.
+#else
+neg 3, 3 #negate the result (errno)
+1:
+# compare sc result with 0
+cmpwi cr7, 3, 0
+
+# if not 0, jump to end
+bne cr7, 2f
+
+#else: we're the child
+#call funcptr: move arg (d) into r3
+mr 3, 31
+#move r30 (funcptr) into CTR reg
+mtctr 30
+# call CTR reg
+bctrl
+# mov SYS_exit into r0 (the exit param is already in r3)
+li 0, 1
+sc
+
+2:
+
+# restore stack
+lwz 30, 0(1)
+lwz 31, 4(1)
+addi 1, 1, 16
+
+blr
+
diff --git a/libc-top-half/musl/src/thread/powerpc/syscall_cp.s b/libc-top-half/musl/src/thread/powerpc/syscall_cp.s
new file mode 100644
index 0000000..77f8938
--- /dev/null
+++ b/libc-top-half/musl/src/thread/powerpc/syscall_cp.s
@@ -0,0 +1,59 @@
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+
+#r0: volatile. may be modified during linkage.
+#r1: stack frame: 16 byte alignment.
+#r2: tls/thread pointer on pp32
+#r3,r4: return values, first args
+#r5-r10: args
+#r11-r12: volatile. may be modified during linkage
+#r13: "small data area" pointer
+#r14 - r30: local vars
+#r31: local or environment pointer
+
+#r1, r14-31: belong to the caller, must be saved and restored
+#r0, r3-r12, ctr, xer: volatile, not preserved
+#r0,r11,r12: may be altered by cross-module call,
+#"a func cannot depend on that these regs have the values placed by the caller"
+
+#the fields CR2,CR2,CR4 of the cond reg must be preserved
+#LR (link reg) shall contain the funcs return address
+ .text
+ .type __syscall_cp_asm,%function
+__syscall_cp_asm:
+ # at enter: r3 = pointer to self->cancel, r4: syscall no, r5: first arg, r6: 2nd, r7: 3rd, r8: 4th, r9: 5th, r10: 6th
+__cp_begin:
+ # r3 holds first argument, its a pointer to self->cancel.
+ # we must compare the dereferenced value with 0 and jump to __cancel if its not
+
+ lwz 0, 0(3) #deref pointer into r0
+
+ cmpwi cr7, 0, 0 #compare r0 with 0, store result in cr7.
+ beq+ cr7, 1f #jump to label 1 if r0 was 0
+
+ b __cp_cancel #else call cancel
+1:
+ #ok, the cancel flag was not set
+ # syscall: number goes to r0, the rest 3-8
+ mr 0, 4 # put the system call number into r0
+ mr 3, 5 # Shift the arguments: arg1
+ mr 4, 6 # arg2
+ mr 5, 7 # arg3
+ mr 6, 8 # arg4
+ mr 7, 9 # arg5
+ mr 8, 10 # arg6
+ sc
+__cp_end:
+ bnslr+ # return if no summary overflow.
+ #else negate result.
+ neg 3, 3
+ blr
+__cp_cancel:
+ b __cancel
diff --git a/libc-top-half/musl/src/thread/powerpc64/__set_thread_area.s b/libc-top-half/musl/src/thread/powerpc64/__set_thread_area.s
new file mode 100644
index 0000000..bb9c55d
--- /dev/null
+++ b/libc-top-half/musl/src/thread/powerpc64/__set_thread_area.s
@@ -0,0 +1,9 @@
+.text
+.global __set_thread_area
+.hidden __set_thread_area
+.type __set_thread_area, %function
+__set_thread_area:
+ mr 13, 3
+ li 3, 0
+ blr
+
diff --git a/libc-top-half/musl/src/thread/powerpc64/__unmapself.s b/libc-top-half/musl/src/thread/powerpc64/__unmapself.s
new file mode 100644
index 0000000..c9360b4
--- /dev/null
+++ b/libc-top-half/musl/src/thread/powerpc64/__unmapself.s
@@ -0,0 +1,9 @@
+ .text
+ .global __unmapself
+ .type __unmapself,%function
+__unmapself:
+ li 0, 91 # __NR_munmap
+ sc
+ li 0, 1 #__NR_exit
+ sc
+ blr
diff --git a/libc-top-half/musl/src/thread/powerpc64/clone.s b/libc-top-half/musl/src/thread/powerpc64/clone.s
new file mode 100644
index 0000000..41cb678
--- /dev/null
+++ b/libc-top-half/musl/src/thread/powerpc64/clone.s
@@ -0,0 +1,48 @@
+.text
+.global __clone
+.hidden __clone
+.type __clone, %function
+__clone:
+ # int clone(fn, stack, flags, arg, ptid, tls, ctid)
+ # a b c d e f g
+ # 3 4 5 6 7 8 9
+ # pseudo C code:
+ # tid = syscall(SYS_clone,c,b,e,f,g);
+ # if (!tid) syscall(SYS_exit, a(d));
+ # return tid;
+
+ # create initial stack frame for new thread
+ clrrdi 4, 4, 4
+ li 0, 0
+ stdu 0,-32(4)
+
+ # save fn and arg to child stack
+ std 3, 8(4)
+ std 6, 16(4)
+
+ # shuffle args into correct registers and call SYS_clone
+ mr 3, 5
+ #mr 4, 4
+ mr 5, 7
+ mr 6, 8
+ mr 7, 9
+ li 0, 120 # SYS_clone = 120
+ sc
+
+ # if error, negate return (errno)
+ bns+ 1f
+ neg 3, 3
+
+1: # if we're the parent, return
+ cmpwi cr7, 3, 0
+ bnelr cr7
+
+ # we're the child. call fn(arg)
+ ld 3, 16(1)
+ ld 12, 8(1)
+ mtctr 12
+ bctrl
+
+ # call SYS_exit. exit code is already in r3 from fn return value
+ li 0, 1 # SYS_exit = 1
+ sc
diff --git a/libc-top-half/musl/src/thread/powerpc64/syscall_cp.s b/libc-top-half/musl/src/thread/powerpc64/syscall_cp.s
new file mode 100644
index 0000000..ef50ed0
--- /dev/null
+++ b/libc-top-half/musl/src/thread/powerpc64/syscall_cp.s
@@ -0,0 +1,44 @@
+ .global __cp_begin
+ .hidden __cp_begin
+ .global __cp_end
+ .hidden __cp_end
+ .global __cp_cancel
+ .hidden __cp_cancel
+ .hidden __cancel
+ .global __syscall_cp_asm
+ .hidden __syscall_cp_asm
+ .text
+ .type __syscall_cp_asm,%function
+__syscall_cp_asm:
+ # at enter: r3 = pointer to self->cancel, r4: syscall no, r5: first arg, r6: 2nd, r7: 3rd, r8: 4th, r9: 5th, r10: 6th
+__cp_begin:
+ # if (self->cancel) goto __cp_cancel
+ lwz 0, 0(3)
+ cmpwi cr7, 0, 0
+ bne- cr7, __cp_cancel
+
+ # make syscall
+ mr 0, 4
+ mr 3, 5
+ mr 4, 6
+ mr 5, 7
+ mr 6, 8
+ mr 7, 9
+ mr 8, 10
+ sc
+
+__cp_end:
+ # return error ? -r3 : r3
+ bnslr+
+ neg 3, 3
+ blr
+
+__cp_cancel:
+ mflr 0
+ bl 1f
+ .long .TOC.-.
+1: mflr 3
+ lwa 2, 0(3)
+ add 2, 2, 3
+ mtlr 0
+ b __cancel
diff --git a/libc-top-half/musl/src/thread/pthread_atfork.c b/libc-top-half/musl/src/thread/pthread_atfork.c
new file mode 100644
index 0000000..7649740
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_atfork.c
@@ -0,0 +1,49 @@
+#include <pthread.h>
+#include "libc.h"
+#include "lock.h"
+
+static struct atfork_funcs {
+ void (*prepare)(void);
+ void (*parent)(void);
+ void (*child)(void);
+ struct atfork_funcs *prev, *next;
+} *funcs;
+
+static volatile int lock[1];
+
+void __fork_handler(int who)
+{
+ struct atfork_funcs *p;
+ if (!funcs) return;
+ if (who < 0) {
+ LOCK(lock);
+ for (p=funcs; p; p = p->next) {
+ if (p->prepare) p->prepare();
+ funcs = p;
+ }
+ } else {
+ for (p=funcs; p; p = p->prev) {
+ if (!who && p->parent) p->parent();
+ else if (who && p->child) p->child();
+ funcs = p;
+ }
+ UNLOCK(lock);
+ }
+}
+
+int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void))
+{
+ struct atfork_funcs *new = malloc(sizeof *new);
+ if (!new) return -1;
+
+ LOCK(lock);
+ new->next = funcs;
+ new->prev = 0;
+ new->prepare = prepare;
+ new->parent = parent;
+ new->child = child;
+ if (funcs) funcs->prev = new;
+ funcs = new;
+ UNLOCK(lock);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_attr_destroy.c b/libc-top-half/musl/src/thread/pthread_attr_destroy.c
new file mode 100644
index 0000000..b5845dd
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_attr_destroy.c
@@ -0,0 +1,6 @@
+#include "pthread_impl.h"
+
+int pthread_attr_destroy(pthread_attr_t *a)
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_attr_get.c b/libc-top-half/musl/src/thread/pthread_attr_get.c
new file mode 100644
index 0000000..f12ff44
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_attr_get.c
@@ -0,0 +1,98 @@
+#include "pthread_impl.h"
+
+int pthread_attr_getdetachstate(const pthread_attr_t *a, int *state)
+{
+ *state = a->_a_detach;
+ return 0;
+}
+int pthread_attr_getguardsize(const pthread_attr_t *restrict a, size_t *restrict size)
+{
+ *size = a->_a_guardsize;
+ return 0;
+}
+
+int pthread_attr_getinheritsched(const pthread_attr_t *restrict a, int *restrict inherit)
+{
+ *inherit = a->_a_sched;
+ return 0;
+}
+
+int pthread_attr_getschedparam(const pthread_attr_t *restrict a, struct sched_param *restrict param)
+{
+ param->sched_priority = a->_a_prio;
+ return 0;
+}
+
+int pthread_attr_getschedpolicy(const pthread_attr_t *restrict a, int *restrict policy)
+{
+ *policy = a->_a_policy;
+ return 0;
+}
+
+int pthread_attr_getscope(const pthread_attr_t *restrict a, int *restrict scope)
+{
+ *scope = PTHREAD_SCOPE_SYSTEM;
+ return 0;
+}
+
+int pthread_attr_getstack(const pthread_attr_t *restrict a, void **restrict addr, size_t *restrict size)
+{
+ if (!a->_a_stackaddr)
+ return EINVAL;
+ *size = a->_a_stacksize;
+ *addr = (void *)(a->_a_stackaddr - *size);
+ return 0;
+}
+
+int pthread_attr_getstacksize(const pthread_attr_t *restrict a, size_t *restrict size)
+{
+ *size = a->_a_stacksize;
+ return 0;
+}
+
+int pthread_barrierattr_getpshared(const pthread_barrierattr_t *restrict a, int *restrict pshared)
+{
+ *pshared = !!a->__attr;
+ return 0;
+}
+
+int pthread_condattr_getclock(const pthread_condattr_t *restrict a, clockid_t *restrict clk)
+{
+ *clk = a->__attr & 0x7fffffff;
+ return 0;
+}
+
+int pthread_condattr_getpshared(const pthread_condattr_t *restrict a, int *restrict pshared)
+{
+ *pshared = a->__attr>>31;
+ return 0;
+}
+
+int pthread_mutexattr_getprotocol(const pthread_mutexattr_t *restrict a, int *restrict protocol)
+{
+ *protocol = a->__attr / 8U % 2;
+ return 0;
+}
+int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict a, int *restrict pshared)
+{
+ *pshared = a->__attr / 128U % 2;
+ return 0;
+}
+
+int pthread_mutexattr_getrobust(const pthread_mutexattr_t *restrict a, int *restrict robust)
+{
+ *robust = a->__attr / 4U % 2;
+ return 0;
+}
+
+int pthread_mutexattr_gettype(const pthread_mutexattr_t *restrict a, int *restrict type)
+{
+ *type = a->__attr & 3;
+ return 0;
+}
+
+int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *restrict a, int *restrict pshared)
+{
+ *pshared = a->__attr[0];
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_attr_init.c b/libc-top-half/musl/src/thread/pthread_attr_init.c
new file mode 100644
index 0000000..463a8d2
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_attr_init.c
@@ -0,0 +1,11 @@
+#include "pthread_impl.h"
+
+int pthread_attr_init(pthread_attr_t *a)
+{
+ *a = (pthread_attr_t){0};
+ __acquire_ptc();
+ a->_a_stacksize = __default_stacksize;
+ a->_a_guardsize = __default_guardsize;
+ __release_ptc();
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_attr_setdetachstate.c b/libc-top-half/musl/src/thread/pthread_attr_setdetachstate.c
new file mode 100644
index 0000000..1b71278
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_attr_setdetachstate.c
@@ -0,0 +1,8 @@
+#include "pthread_impl.h"
+
+int pthread_attr_setdetachstate(pthread_attr_t *a, int state)
+{
+ if (state > 1U) return EINVAL;
+ a->_a_detach = state;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_attr_setguardsize.c b/libc-top-half/musl/src/thread/pthread_attr_setguardsize.c
new file mode 100644
index 0000000..1c5c60a
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_attr_setguardsize.c
@@ -0,0 +1,8 @@
+#include "pthread_impl.h"
+
+int pthread_attr_setguardsize(pthread_attr_t *a, size_t size)
+{
+ if (size > SIZE_MAX/8) return EINVAL;
+ a->_a_guardsize = size;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_attr_setinheritsched.c b/libc-top-half/musl/src/thread/pthread_attr_setinheritsched.c
new file mode 100644
index 0000000..ca264be
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_attr_setinheritsched.c
@@ -0,0 +1,9 @@
+#include "pthread_impl.h"
+#include "syscall.h"
+
+int pthread_attr_setinheritsched(pthread_attr_t *a, int inherit)
+{
+ if (inherit > 1U) return EINVAL;
+ a->_a_sched = inherit;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_attr_setschedparam.c b/libc-top-half/musl/src/thread/pthread_attr_setschedparam.c
new file mode 100644
index 0000000..d4c1204
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_attr_setschedparam.c
@@ -0,0 +1,7 @@
+#include "pthread_impl.h"
+
+int pthread_attr_setschedparam(pthread_attr_t *restrict a, const struct sched_param *restrict param)
+{
+ a->_a_prio = param->sched_priority;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_attr_setschedpolicy.c b/libc-top-half/musl/src/thread/pthread_attr_setschedpolicy.c
new file mode 100644
index 0000000..bb71f39
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_attr_setschedpolicy.c
@@ -0,0 +1,7 @@
+#include "pthread_impl.h"
+
+int pthread_attr_setschedpolicy(pthread_attr_t *a, int policy)
+{
+ a->_a_policy = policy;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_attr_setscope.c b/libc-top-half/musl/src/thread/pthread_attr_setscope.c
new file mode 100644
index 0000000..46b520c
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_attr_setscope.c
@@ -0,0 +1,13 @@
+#include "pthread_impl.h"
+
+int pthread_attr_setscope(pthread_attr_t *a, int scope)
+{
+ switch (scope) {
+ case PTHREAD_SCOPE_SYSTEM:
+ return 0;
+ case PTHREAD_SCOPE_PROCESS:
+ return ENOTSUP;
+ default:
+ return EINVAL;
+ }
+}
diff --git a/libc-top-half/musl/src/thread/pthread_attr_setstack.c b/libc-top-half/musl/src/thread/pthread_attr_setstack.c
new file mode 100644
index 0000000..1eddcbd
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_attr_setstack.c
@@ -0,0 +1,9 @@
+#include "pthread_impl.h"
+
+int pthread_attr_setstack(pthread_attr_t *a, void *addr, size_t size)
+{
+ if (size-PTHREAD_STACK_MIN > SIZE_MAX/4) return EINVAL;
+ a->_a_stackaddr = (size_t)addr + size;
+ a->_a_stacksize = size;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_attr_setstacksize.c b/libc-top-half/musl/src/thread/pthread_attr_setstacksize.c
new file mode 100644
index 0000000..9c6a880
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_attr_setstacksize.c
@@ -0,0 +1,9 @@
+#include "pthread_impl.h"
+
+int pthread_attr_setstacksize(pthread_attr_t *a, size_t size)
+{
+ if (size-PTHREAD_STACK_MIN > SIZE_MAX/4) return EINVAL;
+ a->_a_stackaddr = 0;
+ a->_a_stacksize = size;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_barrier_destroy.c b/libc-top-half/musl/src/thread/pthread_barrier_destroy.c
new file mode 100644
index 0000000..4ce0b2e
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_barrier_destroy.c
@@ -0,0 +1,15 @@
+#include "pthread_impl.h"
+
+int pthread_barrier_destroy(pthread_barrier_t *b)
+{
+ if (b->_b_limit < 0) {
+ if (b->_b_lock) {
+ int v;
+ a_or(&b->_b_lock, INT_MIN);
+ while ((v = b->_b_lock) & INT_MAX)
+ __wait(&b->_b_lock, 0, v, 0);
+ }
+ __vm_wait();
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_barrier_init.c b/libc-top-half/musl/src/thread/pthread_barrier_init.c
new file mode 100644
index 0000000..4c3cb28
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_barrier_init.c
@@ -0,0 +1,8 @@
+#include "pthread_impl.h"
+
+int pthread_barrier_init(pthread_barrier_t *restrict b, const pthread_barrierattr_t *restrict a, unsigned count)
+{
+ if (count-1 > INT_MAX-1) return EINVAL;
+ *b = (pthread_barrier_t){ ._b_limit = count-1 | (a?a->__attr:0) };
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_barrier_wait.c b/libc-top-half/musl/src/thread/pthread_barrier_wait.c
new file mode 100644
index 0000000..cc2a8bb
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_barrier_wait.c
@@ -0,0 +1,111 @@
+#include "pthread_impl.h"
+
+static int pshared_barrier_wait(pthread_barrier_t *b)
+{
+ int limit = (b->_b_limit & INT_MAX) + 1;
+ int ret = 0;
+ int v, w;
+
+ if (limit==1) return PTHREAD_BARRIER_SERIAL_THREAD;
+
+ while ((v=a_cas(&b->_b_lock, 0, limit)))
+ __wait(&b->_b_lock, &b->_b_waiters, v, 0);
+
+ /* Wait for <limit> threads to get to the barrier */
+ if (++b->_b_count == limit) {
+ a_store(&b->_b_count, 0);
+ ret = PTHREAD_BARRIER_SERIAL_THREAD;
+ if (b->_b_waiters2) __wake(&b->_b_count, -1, 0);
+ } else {
+ a_store(&b->_b_lock, 0);
+ if (b->_b_waiters) __wake(&b->_b_lock, 1, 0);
+ while ((v=b->_b_count)>0)
+ __wait(&b->_b_count, &b->_b_waiters2, v, 0);
+ }
+
+ __vm_lock();
+
+ /* Ensure all threads have a vm lock before proceeding */
+ if (a_fetch_add(&b->_b_count, -1)==1-limit) {
+ a_store(&b->_b_count, 0);
+ if (b->_b_waiters2) __wake(&b->_b_count, -1, 0);
+ } else {
+ while ((v=b->_b_count))
+ __wait(&b->_b_count, &b->_b_waiters2, v, 0);
+ }
+
+ /* Perform a recursive unlock suitable for self-sync'd destruction */
+ do {
+ v = b->_b_lock;
+ w = b->_b_waiters;
+ } while (a_cas(&b->_b_lock, v, v==INT_MIN+1 ? 0 : v-1) != v);
+
+ /* Wake a thread waiting to reuse or destroy the barrier */
+ if (v==INT_MIN+1 || (v==1 && w))
+ __wake(&b->_b_lock, 1, 0);
+
+ __vm_unlock();
+
+ return ret;
+}
+
+struct instance
+{
+ volatile int count;
+ volatile int last;
+ volatile int waiters;
+ volatile int finished;
+};
+
+int pthread_barrier_wait(pthread_barrier_t *b)
+{
+ int limit = b->_b_limit;
+ struct instance *inst;
+
+ /* Trivial case: count was set at 1 */
+ if (!limit) return PTHREAD_BARRIER_SERIAL_THREAD;
+
+ /* Process-shared barriers require a separate, inefficient wait */
+ if (limit < 0) return pshared_barrier_wait(b);
+
+ /* Otherwise we need a lock on the barrier object */
+ while (a_swap(&b->_b_lock, 1))
+ __wait(&b->_b_lock, &b->_b_waiters, 1, 1);
+ inst = b->_b_inst;
+
+ /* First thread to enter the barrier becomes the "instance owner" */
+ if (!inst) {
+ struct instance new_inst = { 0 };
+ int spins = 200;
+ b->_b_inst = inst = &new_inst;
+ a_store(&b->_b_lock, 0);
+ if (b->_b_waiters) __wake(&b->_b_lock, 1, 1);
+ while (spins-- && !inst->finished)
+ a_spin();
+ a_inc(&inst->finished);
+ while (inst->finished == 1)
+ __syscall(SYS_futex,&inst->finished,FUTEX_WAIT|FUTEX_PRIVATE,1,0) != -ENOSYS
+ || __syscall(SYS_futex,&inst->finished,FUTEX_WAIT,1,0);
+ return PTHREAD_BARRIER_SERIAL_THREAD;
+ }
+
+ /* Last thread to enter the barrier wakes all non-instance-owners */
+ if (++inst->count == limit) {
+ b->_b_inst = 0;
+ a_store(&b->_b_lock, 0);
+ if (b->_b_waiters) __wake(&b->_b_lock, 1, 1);
+ a_store(&inst->last, 1);
+ if (inst->waiters)
+ __wake(&inst->last, -1, 1);
+ } else {
+ a_store(&b->_b_lock, 0);
+ if (b->_b_waiters) __wake(&b->_b_lock, 1, 1);
+ __wait(&inst->last, &inst->waiters, 0, 1);
+ }
+
+ /* Last thread to exit the barrier wakes the instance owner */
+ if (a_fetch_add(&inst->count,-1)==1 && a_fetch_add(&inst->finished,1))
+ __wake(&inst->finished, 1, 1);
+
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_barrierattr_destroy.c b/libc-top-half/musl/src/thread/pthread_barrierattr_destroy.c
new file mode 100644
index 0000000..adec738
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_barrierattr_destroy.c
@@ -0,0 +1,6 @@
+#include "pthread_impl.h"
+
+int pthread_barrierattr_destroy(pthread_barrierattr_t *a)
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_barrierattr_init.c b/libc-top-half/musl/src/thread/pthread_barrierattr_init.c
new file mode 100644
index 0000000..fa742bb
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_barrierattr_init.c
@@ -0,0 +1,7 @@
+#include "pthread_impl.h"
+
+int pthread_barrierattr_init(pthread_barrierattr_t *a)
+{
+ *a = (pthread_barrierattr_t){0};
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_barrierattr_setpshared.c b/libc-top-half/musl/src/thread/pthread_barrierattr_setpshared.c
new file mode 100644
index 0000000..c2d2929
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_barrierattr_setpshared.c
@@ -0,0 +1,8 @@
+#include "pthread_impl.h"
+
+int pthread_barrierattr_setpshared(pthread_barrierattr_t *a, int pshared)
+{
+ if (pshared > 1U) return EINVAL;
+ a->__attr = pshared ? INT_MIN : 0;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_cancel.c b/libc-top-half/musl/src/thread/pthread_cancel.c
new file mode 100644
index 0000000..2f9d5e9
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_cancel.c
@@ -0,0 +1,101 @@
+#define _GNU_SOURCE
+#include <string.h>
+#include "pthread_impl.h"
+#include "syscall.h"
+
+hidden long __cancel(), __syscall_cp_asm(), __syscall_cp_c();
+
+long __cancel()
+{
+ pthread_t self = __pthread_self();
+ if (self->canceldisable == PTHREAD_CANCEL_ENABLE || self->cancelasync)
+ pthread_exit(PTHREAD_CANCELED);
+ self->canceldisable = PTHREAD_CANCEL_DISABLE;
+ return -ECANCELED;
+}
+
+long __syscall_cp_asm(volatile void *, syscall_arg_t,
+ syscall_arg_t, syscall_arg_t, syscall_arg_t,
+ syscall_arg_t, syscall_arg_t, syscall_arg_t);
+
+long __syscall_cp_c(syscall_arg_t nr,
+ syscall_arg_t u, syscall_arg_t v, syscall_arg_t w,
+ syscall_arg_t x, syscall_arg_t y, syscall_arg_t z)
+{
+ pthread_t self;
+ long r;
+ int st;
+
+ if ((st=(self=__pthread_self())->canceldisable)
+ && (st==PTHREAD_CANCEL_DISABLE || nr==SYS_close))
+ return __syscall(nr, u, v, w, x, y, z);
+
+ r = __syscall_cp_asm(&self->cancel, nr, u, v, w, x, y, z);
+ if (r==-EINTR && nr!=SYS_close && self->cancel &&
+ self->canceldisable != PTHREAD_CANCEL_DISABLE)
+ r = __cancel();
+ return r;
+}
+
+static void _sigaddset(sigset_t *set, int sig)
+{
+ unsigned s = sig-1;
+ set->__bits[s/8/sizeof *set->__bits] |= 1UL<<(s&8*sizeof *set->__bits-1);
+}
+
+extern hidden const char __cp_begin[1], __cp_end[1], __cp_cancel[1];
+
+static void cancel_handler(int sig, siginfo_t *si, void *ctx)
+{
+ pthread_t self = __pthread_self();
+ ucontext_t *uc = ctx;
+ uintptr_t pc = uc->uc_mcontext.MC_PC;
+
+ a_barrier();
+ if (!self->cancel || self->canceldisable == PTHREAD_CANCEL_DISABLE) return;
+
+ _sigaddset(&uc->uc_sigmask, SIGCANCEL);
+
+ if (self->cancelasync || pc >= (uintptr_t)__cp_begin && pc < (uintptr_t)__cp_end) {
+ uc->uc_mcontext.MC_PC = (uintptr_t)__cp_cancel;
+#ifdef CANCEL_GOT
+ uc->uc_mcontext.MC_GOT = CANCEL_GOT;
+#endif
+ return;
+ }
+
+ __syscall(SYS_tkill, self->tid, SIGCANCEL);
+}
+
+void __testcancel()
+{
+ pthread_t self = __pthread_self();
+ if (self->cancel && !self->canceldisable)
+ __cancel();
+}
+
+static void init_cancellation()
+{
+ struct sigaction sa = {
+ .sa_flags = SA_SIGINFO | SA_RESTART,
+ .sa_sigaction = cancel_handler
+ };
+ memset(&sa.sa_mask, -1, _NSIG/8);
+ __libc_sigaction(SIGCANCEL, &sa, 0);
+}
+
+int pthread_cancel(pthread_t t)
+{
+ static int init;
+ if (!init) {
+ init_cancellation();
+ init = 1;
+ }
+ a_store(&t->cancel, 1);
+ if (t == pthread_self()) {
+ if (t->canceldisable == PTHREAD_CANCEL_ENABLE && t->cancelasync)
+ pthread_exit(PTHREAD_CANCELED);
+ return 0;
+ }
+ return pthread_kill(t, SIGCANCEL);
+}
diff --git a/libc-top-half/musl/src/thread/pthread_cleanup_push.c b/libc-top-half/musl/src/thread/pthread_cleanup_push.c
new file mode 100644
index 0000000..9b21764
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_cleanup_push.c
@@ -0,0 +1,20 @@
+#include "pthread_impl.h"
+
+static void dummy(struct __ptcb *cb)
+{
+}
+weak_alias(dummy, __do_cleanup_push);
+weak_alias(dummy, __do_cleanup_pop);
+
+void _pthread_cleanup_push(struct __ptcb *cb, void (*f)(void *), void *x)
+{
+ cb->__f = f;
+ cb->__x = x;
+ __do_cleanup_push(cb);
+}
+
+void _pthread_cleanup_pop(struct __ptcb *cb, int run)
+{
+ __do_cleanup_pop(cb);
+ if (run) cb->__f(cb->__x);
+}
diff --git a/libc-top-half/musl/src/thread/pthread_cond_broadcast.c b/libc-top-half/musl/src/thread/pthread_cond_broadcast.c
new file mode 100644
index 0000000..6bfab78
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_cond_broadcast.c
@@ -0,0 +1,10 @@
+#include "pthread_impl.h"
+
+int pthread_cond_broadcast(pthread_cond_t *c)
+{
+ if (!c->_c_shared) return __private_cond_signal(c, -1);
+ if (!c->_c_waiters) return 0;
+ a_inc(&c->_c_seq);
+ __wake(&c->_c_seq, -1, 0);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_cond_destroy.c b/libc-top-half/musl/src/thread/pthread_cond_destroy.c
new file mode 100644
index 0000000..8c55516
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_cond_destroy.c
@@ -0,0 +1,14 @@
+#include "pthread_impl.h"
+
+int pthread_cond_destroy(pthread_cond_t *c)
+{
+ if (c->_c_shared && c->_c_waiters) {
+ int cnt;
+ a_or(&c->_c_waiters, 0x80000000);
+ a_inc(&c->_c_seq);
+ __wake(&c->_c_seq, -1, 0);
+ while ((cnt = c->_c_waiters) & 0x7fffffff)
+ __wait(&c->_c_waiters, 0, cnt, 0);
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_cond_init.c b/libc-top-half/musl/src/thread/pthread_cond_init.c
new file mode 100644
index 0000000..8c484dd
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_cond_init.c
@@ -0,0 +1,11 @@
+#include "pthread_impl.h"
+
+int pthread_cond_init(pthread_cond_t *restrict c, const pthread_condattr_t *restrict a)
+{
+ *c = (pthread_cond_t){0};
+ if (a) {
+ c->_c_clock = a->__attr & 0x7fffffff;
+ if (a->__attr>>31) c->_c_shared = (void *)-1;
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_cond_signal.c b/libc-top-half/musl/src/thread/pthread_cond_signal.c
new file mode 100644
index 0000000..575ad54
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_cond_signal.c
@@ -0,0 +1,10 @@
+#include "pthread_impl.h"
+
+int pthread_cond_signal(pthread_cond_t *c)
+{
+ if (!c->_c_shared) return __private_cond_signal(c, 1);
+ if (!c->_c_waiters) return 0;
+ a_inc(&c->_c_seq);
+ __wake(&c->_c_seq, 1, 0);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_cond_timedwait.c b/libc-top-half/musl/src/thread/pthread_cond_timedwait.c
new file mode 100644
index 0000000..ba985f9
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_cond_timedwait.c
@@ -0,0 +1,230 @@
+#include "pthread_impl.h"
+
+#ifndef __wasilibc_unmodified_upstream
+#include <common/clock.h>
+#endif
+
+/*
+ * struct waiter
+ *
+ * Waiter objects have automatic storage on the waiting thread, and
+ * are used in building a linked list representing waiters currently
+ * waiting on the condition variable or a group of waiters woken
+ * together by a broadcast or signal; in the case of signal, this is a
+ * degenerate list of one member.
+ *
+ * Waiter lists attached to the condition variable itself are
+ * protected by the lock on the cv. Detached waiter lists are never
+ * modified again, but can only be traversed in reverse order, and are
+ * protected by the "barrier" locks in each node, which are unlocked
+ * in turn to control wake order.
+ *
+ * Since process-shared cond var semantics do not necessarily allow
+ * one thread to see another's automatic storage (they may be in
+ * different processes), the waiter list is not used for the
+ * process-shared case, but the structure is still used to store data
+ * needed by the cancellation cleanup handler.
+ */
+
+struct waiter {
+ struct waiter *prev, *next;
+ volatile int state, barrier;
+ volatile int *notify;
+};
+
+/* Self-synchronized-destruction-safe lock functions */
+
+static inline void lock(volatile int *l)
+{
+ if (a_cas(l, 0, 1)) {
+ a_cas(l, 1, 2);
+ do __wait(l, 0, 2, 1);
+ while (a_cas(l, 0, 2));
+ }
+}
+
+static inline void unlock(volatile int *l)
+{
+ if (a_swap(l, 0)==2)
+ __wake(l, 1, 1);
+}
+
+static inline void unlock_requeue(volatile int *l, volatile int *r, int w)
+{
+ a_store(l, 0);
+#ifdef __wasilibc_unmodified_upstream
+ if (w) __wake(l, 1, 1);
+ else __syscall(SYS_futex, l, FUTEX_REQUEUE|FUTEX_PRIVATE, 0, 1, r) != -ENOSYS
+ || __syscall(SYS_futex, l, FUTEX_REQUEUE, 0, 1, r);
+#else
+ // Always wake due to lack of requeue system call in WASI
+ // This can impact the performance, so we might need to re-visit that decision
+ __wake(l, 1, 1);
+#endif
+}
+
+enum {
+ WAITING,
+ SIGNALED,
+ LEAVING,
+};
+
+int __pthread_cond_timedwait(pthread_cond_t *restrict c, pthread_mutex_t *restrict m, const struct timespec *restrict ts)
+{
+ struct waiter node = { 0 };
+ int e, seq, clock = c->_c_clock, cs, shared=0, oldstate, tmp;
+#ifndef __wasilibc_unmodified_upstream
+ struct __clockid clock_id = { .id = clock };
+#endif
+ volatile int *fut;
+
+ if ((m->_m_type&15) && (m->_m_lock&INT_MAX) != __pthread_self()->tid)
+ return EPERM;
+
+ if (ts && ts->tv_nsec >= 1000000000UL)
+ return EINVAL;
+
+ __pthread_testcancel();
+
+ if (c->_c_shared) {
+ shared = 1;
+ fut = &c->_c_seq;
+ seq = c->_c_seq;
+ a_inc(&c->_c_waiters);
+ } else {
+ lock(&c->_c_lock);
+
+ seq = node.barrier = 2;
+ fut = &node.barrier;
+ node.state = WAITING;
+ node.next = c->_c_head;
+ c->_c_head = &node;
+ if (!c->_c_tail) c->_c_tail = &node;
+ else node.next->prev = &node;
+
+ unlock(&c->_c_lock);
+ }
+
+ __pthread_mutex_unlock(m);
+
+ __pthread_setcancelstate(PTHREAD_CANCEL_MASKED, &cs);
+ if (cs == PTHREAD_CANCEL_DISABLE) __pthread_setcancelstate(cs, 0);
+
+#ifdef __wasilibc_unmodified_upstream
+ do e = __timedwait_cp(fut, seq, clock, ts, !shared);
+#else
+ do e = __timedwait_cp(fut, seq, &clock_id, ts, !shared);
+#endif
+ while (*fut==seq && (!e || e==EINTR));
+ if (e == EINTR) e = 0;
+
+ if (shared) {
+ /* Suppress cancellation if a signal was potentially
+ * consumed; this is a legitimate form of spurious
+ * wake even if not. */
+ if (e == ECANCELED && c->_c_seq != seq) e = 0;
+ if (a_fetch_add(&c->_c_waiters, -1) == -0x7fffffff)
+ __wake(&c->_c_waiters, 1, 0);
+ oldstate = WAITING;
+ goto relock;
+ }
+
+ oldstate = a_cas(&node.state, WAITING, LEAVING);
+
+ if (oldstate == WAITING) {
+ /* Access to cv object is valid because this waiter was not
+ * yet signaled and a new signal/broadcast cannot return
+ * after seeing a LEAVING waiter without getting notified
+ * via the futex notify below. */
+
+ lock(&c->_c_lock);
+
+ if (c->_c_head == &node) c->_c_head = node.next;
+ else if (node.prev) node.prev->next = node.next;
+ if (c->_c_tail == &node) c->_c_tail = node.prev;
+ else if (node.next) node.next->prev = node.prev;
+
+ unlock(&c->_c_lock);
+
+ if (node.notify) {
+ if (a_fetch_add(node.notify, -1)==1)
+ __wake(node.notify, 1, 1);
+ }
+ } else {
+ /* Lock barrier first to control wake order. */
+ lock(&node.barrier);
+ }
+
+relock:
+ /* Errors locking the mutex override any existing error or
+ * cancellation, since the caller must see them to know the
+ * state of the mutex. */
+ if ((tmp = pthread_mutex_lock(m))) e = tmp;
+
+ if (oldstate == WAITING) goto done;
+
+ if (!node.next && !(m->_m_type & 8))
+ a_inc(&m->_m_waiters);
+
+ /* Unlock the barrier that's holding back the next waiter, and
+ * either wake it or requeue it to the mutex. */
+ if (node.prev) {
+ int val = m->_m_lock;
+ if (val>0) a_cas(&m->_m_lock, val, val|0x80000000);
+ unlock_requeue(&node.prev->barrier, &m->_m_lock, m->_m_type & (8|128));
+ } else if (!(m->_m_type & 8)) {
+ a_dec(&m->_m_waiters);
+ }
+
+ /* Since a signal was consumed, cancellation is not permitted. */
+ if (e == ECANCELED) e = 0;
+
+done:
+ __pthread_setcancelstate(cs, 0);
+
+ if (e == ECANCELED) {
+ __pthread_testcancel();
+ __pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, 0);
+ }
+
+ return e;
+}
+
+int __private_cond_signal(pthread_cond_t *c, int n)
+{
+ struct waiter *p, *first=0;
+ volatile int ref = 0;
+ int cur;
+
+ lock(&c->_c_lock);
+ for (p=c->_c_tail; n && p; p=p->prev) {
+ if (a_cas(&p->state, WAITING, SIGNALED) != WAITING) {
+ ref++;
+ p->notify = &ref;
+ } else {
+ n--;
+ if (!first) first=p;
+ }
+ }
+ /* Split the list, leaving any remainder on the cv. */
+ if (p) {
+ if (p->next) p->next->prev = 0;
+ p->next = 0;
+ } else {
+ c->_c_head = 0;
+ }
+ c->_c_tail = p;
+ unlock(&c->_c_lock);
+
+ /* Wait for any waiters in the LEAVING state to remove
+ * themselves from the list before returning or allowing
+ * signaled threads to proceed. */
+ while ((cur = ref)) __wait(&ref, 0, cur, 1);
+
+ /* Allow first signaled waiter, if any, to proceed. */
+ if (first) unlock(&first->barrier);
+
+ return 0;
+}
+
+weak_alias(__pthread_cond_timedwait, pthread_cond_timedwait);
diff --git a/libc-top-half/musl/src/thread/pthread_cond_wait.c b/libc-top-half/musl/src/thread/pthread_cond_wait.c
new file mode 100644
index 0000000..8735bf1
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_cond_wait.c
@@ -0,0 +1,6 @@
+#include "pthread_impl.h"
+
+int pthread_cond_wait(pthread_cond_t *restrict c, pthread_mutex_t *restrict m)
+{
+ return pthread_cond_timedwait(c, m, 0);
+}
diff --git a/libc-top-half/musl/src/thread/pthread_condattr_destroy.c b/libc-top-half/musl/src/thread/pthread_condattr_destroy.c
new file mode 100644
index 0000000..c54ec41
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_condattr_destroy.c
@@ -0,0 +1,6 @@
+#include "pthread_impl.h"
+
+int pthread_condattr_destroy(pthread_condattr_t *a)
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_condattr_init.c b/libc-top-half/musl/src/thread/pthread_condattr_init.c
new file mode 100644
index 0000000..a41741b
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_condattr_init.c
@@ -0,0 +1,7 @@
+#include "pthread_impl.h"
+
+int pthread_condattr_init(pthread_condattr_t *a)
+{
+ *a = (pthread_condattr_t){0};
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_condattr_setclock.c b/libc-top-half/musl/src/thread/pthread_condattr_setclock.c
new file mode 100644
index 0000000..21ca070
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_condattr_setclock.c
@@ -0,0 +1,21 @@
+#include "pthread_impl.h"
+
+#ifndef __wasilibc_unmodified_upstream
+#include <common/clock.h>
+#endif
+
+int pthread_condattr_setclock(pthread_condattr_t *a, clockid_t clk)
+{
+#ifdef __wasilibc_unmodified_upstream
+ if (clk < 0 || clk-2U < 2) return EINVAL;
+#else
+ if (clk->id < 0 || clk->id-2U < 2) return EINVAL;
+#endif
+ a->__attr &= 0x80000000;
+#ifdef __wasilibc_unmodified_upstream
+ a->__attr |= clk;
+#else
+ a->__attr |= clk->id;
+#endif
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_condattr_setpshared.c b/libc-top-half/musl/src/thread/pthread_condattr_setpshared.c
new file mode 100644
index 0000000..51453e0
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_condattr_setpshared.c
@@ -0,0 +1,9 @@
+#include "pthread_impl.h"
+
+int pthread_condattr_setpshared(pthread_condattr_t *a, int pshared)
+{
+ if (pshared > 1U) return EINVAL;
+ a->__attr &= 0x7fffffff;
+ a->__attr |= (unsigned)pshared<<31;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_create.c b/libc-top-half/musl/src/thread/pthread_create.c
new file mode 100644
index 0000000..1aa7be7
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_create.c
@@ -0,0 +1,565 @@
+#define _GNU_SOURCE
+#include "pthread_impl.h"
+#include "stdio_impl.h"
+#include "libc.h"
+#include "lock.h"
+#ifdef __wasilibc_unmodified_upstream
+#include <sys/mman.h>
+#endif
+#include <string.h>
+#include <stddef.h>
+#ifndef __wasilibc_unmodified_upstream
+#include <stdatomic.h>
+#endif
+
+#include <stdalign.h>
+
+static void dummy_0()
+{
+}
+weak_alias(dummy_0, __acquire_ptc);
+weak_alias(dummy_0, __release_ptc);
+weak_alias(dummy_0, __pthread_tsd_run_dtors);
+weak_alias(dummy_0, __do_orphaned_stdio_locks);
+#ifdef __wasilibc_unmodified_upstream
+weak_alias(dummy_0, __dl_thread_cleanup);
+weak_alias(dummy_0, __membarrier_init);
+#endif
+
+static int tl_lock_count;
+static int tl_lock_waiters;
+
+void __tl_lock(void)
+{
+ int tid = __pthread_self()->tid;
+ int val = __thread_list_lock;
+ if (val == tid) {
+ tl_lock_count++;
+ return;
+ }
+ while ((val = a_cas(&__thread_list_lock, 0, tid)))
+ __wait(&__thread_list_lock, &tl_lock_waiters, val, 0);
+}
+
+void __tl_unlock(void)
+{
+ if (tl_lock_count) {
+ tl_lock_count--;
+ return;
+ }
+ a_store(&__thread_list_lock, 0);
+ if (tl_lock_waiters) __wake(&__thread_list_lock, 1, 0);
+}
+
+void __tl_sync(pthread_t td)
+{
+ a_barrier();
+ int val = __thread_list_lock;
+ if (!val) return;
+ __wait(&__thread_list_lock, &tl_lock_waiters, val, 0);
+ if (tl_lock_waiters) __wake(&__thread_list_lock, 1, 0);
+}
+
+_Noreturn void __pthread_exit(void *result)
+{
+ pthread_t self = __pthread_self();
+ sigset_t set;
+
+ self->canceldisable = 1;
+ self->cancelasync = 0;
+ self->result = result;
+
+ while (self->cancelbuf) {
+ void (*f)(void *) = self->cancelbuf->__f;
+ void *x = self->cancelbuf->__x;
+ self->cancelbuf = self->cancelbuf->__next;
+ f(x);
+ }
+
+ __pthread_tsd_run_dtors();
+
+#ifdef __wasilibc_unmodified_upstream
+ __block_app_sigs(&set);
+#endif
+
+ /* This atomic potentially competes with a concurrent pthread_detach
+ * call; the loser is responsible for freeing thread resources. */
+ int state = a_cas(&self->detach_state, DT_JOINABLE, DT_EXITING);
+
+ if (state==DT_DETACHED && self->map_base) {
+ /* Since __unmapself bypasses the normal munmap code path,
+ * explicitly wait for vmlock holders first. This must be
+ * done before any locks are taken, to avoid lock ordering
+ * issues that could lead to deadlock. */
+#ifdef __wasilibc_unmodified_upstream
+ __vm_wait();
+#endif
+ }
+
+ /* Access to target the exiting thread with syscalls that use
+ * its kernel tid is controlled by killlock. For detached threads,
+ * any use past this point would have undefined behavior, but for
+ * joinable threads it's a valid usage that must be handled.
+ * Signals must be blocked since pthread_kill must be AS-safe. */
+ LOCK(self->killlock);
+
+ /* The thread list lock must be AS-safe, and thus depends on
+ * application signals being blocked above. */
+ __tl_lock();
+
+ /* If this is the only thread in the list, don't proceed with
+ * termination of the thread, but restore the previous lock and
+ * signal state to prepare for exit to call atexit handlers. */
+ if (self->next == self) {
+ __tl_unlock();
+ UNLOCK(self->killlock);
+ self->detach_state = state;
+#ifdef __wasilibc_unmodified_upstream
+ __restore_sigs(&set);
+#endif
+ exit(0);
+ }
+
+ /* At this point we are committed to thread termination. */
+
+#ifdef __wasilibc_unmodified_upstream
+ /* Process robust list in userspace to handle non-pshared mutexes
+ * and the detached thread case where the robust list head will
+ * be invalid when the kernel would process it. */
+ __vm_lock();
+#endif
+ volatile void *volatile *rp;
+ while ((rp=self->robust_list.head) && rp != &self->robust_list.head) {
+ pthread_mutex_t *m = (void *)((char *)rp
+ - offsetof(pthread_mutex_t, _m_next));
+ int waiters = m->_m_waiters;
+ int priv = (m->_m_type & 128) ^ 128;
+ self->robust_list.pending = rp;
+ self->robust_list.head = *rp;
+ int cont = a_swap(&m->_m_lock, 0x40000000);
+ self->robust_list.pending = 0;
+ if (cont < 0 || waiters)
+ __wake(&m->_m_lock, 1, priv);
+ }
+#ifdef __wasilibc_unmodified_upstream
+ __vm_unlock();
+#endif
+
+ __do_orphaned_stdio_locks();
+#ifdef __wasilibc_unmodified_upstream
+ __dl_thread_cleanup();
+#endif
+
+ /* Last, unlink thread from the list. This change will not be visible
+ * until the lock is released, which only happens after SYS_exit
+ * has been called, via the exit futex address pointing at the lock.
+ * This needs to happen after any possible calls to LOCK() that might
+ * skip locking if process appears single-threaded. */
+ if (!--libc.threads_minus_1) libc.need_locks = -1;
+ self->next->prev = self->prev;
+ self->prev->next = self->next;
+ self->prev = self->next = self;
+
+#ifndef __wasilibc_unmodified_upstream
+ /* On Linux, the thread is created with CLONE_CHILD_CLEARTID,
+ * and this lock will unlock by kernel when this thread terminates.
+ * So we should unlock it here in WebAssembly.
+ * See also set_tid_address(2) */
+ __tl_unlock();
+#endif
+
+#ifdef __wasilibc_unmodified_upstream
+ if (state==DT_DETACHED && self->map_base) {
+ /* Detached threads must block even implementation-internal
+ * signals, since they will not have a stack in their last
+ * moments of existence. */
+ __block_all_sigs(&set);
+
+ /* Robust list will no longer be valid, and was already
+ * processed above, so unregister it with the kernel. */
+ if (self->robust_list.off)
+ __syscall(SYS_set_robust_list, 0, 3*sizeof(long));
+
+ /* The following call unmaps the thread's stack mapping
+ * and then exits without touching the stack. */
+ __unmapself(self->map_base, self->map_size);
+ }
+#else
+ if (state==DT_DETACHED && self->map_base) {
+ // __syscall(SYS_exit) would unlock the thread, list
+ // do it manually here
+ __tl_unlock();
+ free(self->map_base);
+ // Can't use `exit()` here, because it is too high level
+ for (;;) __wasi_proc_exit(0);
+ }
+#endif
+
+ /* Wake any joiner. */
+ a_store(&self->detach_state, DT_EXITED);
+ __wake(&self->detach_state, 1, 1);
+
+ /* After the kernel thread exits, its tid may be reused. Clear it
+ * to prevent inadvertent use and inform functions that would use
+ * it that it's no longer available. */
+ self->tid = 0;
+ UNLOCK(self->killlock);
+
+#ifdef __wasilibc_unmodified_upstream
+ for (;;) __syscall(SYS_exit, 0);
+#else
+ // __syscall(SYS_exit) would unlock the thread, list
+ // do it manually here
+ __tl_unlock();
+ // Can't use `exit()` here, because it is too high level
+ for (;;) __wasi_proc_exit(0);
+#endif
+}
+
+void __do_cleanup_push(struct __ptcb *cb)
+{
+ struct pthread *self = __pthread_self();
+ cb->__next = self->cancelbuf;
+ self->cancelbuf = cb;
+}
+
+void __do_cleanup_pop(struct __ptcb *cb)
+{
+ __pthread_self()->cancelbuf = cb->__next;
+}
+
+struct start_args {
+#ifdef __wasilibc_unmodified_upstream
+ void *(*start_func)(void *);
+ void *start_arg;
+ volatile int control;
+ unsigned long sig_mask[_NSIG/8/sizeof(long)];
+#else
+ void *(*start_func)(void *);
+ void *start_arg;
+ void *tls_base;
+#endif
+};
+
+#ifdef __wasilibc_unmodified_upstream
+static int start(void *p)
+{
+ struct start_args *args = p;
+ int state = args->control;
+ if (state) {
+ if (a_cas(&args->control, 1, 2)==1)
+ __wait(&args->control, 0, 2, 1);
+ if (args->control) {
+#ifdef __wasilibc_unmodified_upstream
+ __syscall(SYS_set_tid_address, &args->control);
+ for (;;) __syscall(SYS_exit, 0);
+#endif
+ }
+ }
+#ifdef __wasilibc_unmodified_upstream
+ __syscall(SYS_rt_sigprocmask, SIG_SETMASK, &args->sig_mask, 0, _NSIG/8);
+#endif
+ __pthread_exit(args->start_func(args->start_arg));
+ return 0;
+}
+
+static int start_c11(void *p)
+{
+ struct start_args *args = p;
+ int (*start)(void*) = (int(*)(void*)) args->start_func;
+ __pthread_exit((void *)(uintptr_t)start(args->start_arg));
+ return 0;
+}
+#else
+__attribute__((export_name("wasi_thread_start")))
+_Noreturn void wasi_thread_start(int tid, void *p)
+{
+ struct start_args *args = p;
+ __asm__(".globaltype __tls_base, i32\n"
+ "local.get %0\n"
+ "global.set __tls_base\n"
+ :: "r"(args->tls_base));
+ pthread_t self = __pthread_self();
+ // Set the thread ID (TID) on the pthread structure. The TID is stored
+ // atomically since it is also stored by the parent thread; this way,
+ // whichever thread (parent or child) reaches this point first can proceed
+ // without waiting.
+ atomic_store((atomic_int *) &(self->tid), tid);
+ // Set the stack pointer.
+ __asm__(".globaltype __stack_pointer, i32\n"
+ "local.get %0\n"
+ "global.set __stack_pointer\n"
+ :: "r"(self->stack));
+ // Execute the user's start function.
+ int (*start)(void*) = (int(*)(void*)) args->start_func;
+ __pthread_exit((void *)(uintptr_t)start(args->start_arg));
+}
+#endif
+
+#define ROUND(x) (((x)+PAGE_SIZE-1)&-PAGE_SIZE)
+
+/* pthread_key_create.c overrides this */
+static volatile size_t dummy = 0;
+weak_alias(dummy, __pthread_tsd_size);
+static void *dummy_tsd[1] = { 0 };
+weak_alias(dummy_tsd, __pthread_tsd_main);
+
+static FILE *volatile dummy_file = 0;
+weak_alias(dummy_file, __stdin_used);
+weak_alias(dummy_file, __stdout_used);
+weak_alias(dummy_file, __stderr_used);
+
+static void init_file_lock(FILE *f)
+{
+ if (f && f->lock<0) f->lock = 0;
+}
+
+int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp, void *(*entry)(void *), void *restrict arg)
+{
+ int ret, c11 = (attrp == __ATTRP_C11_THREAD);
+ size_t size, guard;
+ struct pthread *self, *new;
+ unsigned char *map = 0, *stack = 0, *tsd = 0, *stack_limit;
+#ifdef __wasilibc_unmodified_upstream
+ unsigned flags = CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND
+ | CLONE_THREAD | CLONE_SYSVSEM | CLONE_SETTLS
+ | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID | CLONE_DETACHED;
+#endif
+ pthread_attr_t attr = { 0 };
+ sigset_t set;
+#ifndef __wasilibc_unmodified_upstream
+ size_t tls_size = __builtin_wasm_tls_size();
+ size_t tls_align = __builtin_wasm_tls_align();
+ void* tls_base = __builtin_wasm_tls_base();
+ void* new_tls_base;
+ size_t tls_offset;
+ tls_size += tls_align;
+#endif
+
+#ifdef __wasilibc_unmodified_upstream
+ if (!libc.can_do_threads) return ENOSYS;
+#endif
+ self = __pthread_self();
+ if (!libc.threaded) {
+ for (FILE *f=*__ofl_lock(); f; f=f->next)
+ init_file_lock(f);
+ __ofl_unlock();
+ init_file_lock(__stdin_used);
+ init_file_lock(__stdout_used);
+ init_file_lock(__stderr_used);
+#ifdef __wasilibc_unmodified_upstream
+ __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK, SIGPT_SET, 0, _NSIG/8);
+#endif
+ self->tsd = (void **)__pthread_tsd_main;
+#ifdef __wasilibc_unmodified_upstream
+ __membarrier_init();
+#endif
+ libc.threaded = 1;
+ }
+ if (attrp && !c11) attr = *attrp;
+
+ __acquire_ptc();
+ if (!attrp || c11) {
+ attr._a_stacksize = __default_stacksize;
+ attr._a_guardsize = __default_guardsize;
+ }
+
+ if (attr._a_stackaddr) {
+#ifdef __wasilibc_unmodified_upstream
+ size_t need = libc.tls_size + __pthread_tsd_size;
+#else
+ size_t need = tls_size + __pthread_tsd_size;
+#endif
+ size = attr._a_stacksize;
+ stack = (void *)(attr._a_stackaddr & -16);
+ stack_limit = (void *)(attr._a_stackaddr - size);
+ /* Use application-provided stack for TLS only when
+ * it does not take more than ~12% or 2k of the
+ * application's stack space. */
+ if (need < size/8 && need < 2048) {
+ tsd = stack - __pthread_tsd_size;
+#ifdef __wasilibc_unmodified_upstream
+ stack = tsd - libc.tls_size;
+#else
+ stack = tsd - tls_size;
+#endif
+ memset(stack, 0, need);
+ } else {
+ size = ROUND(need);
+ }
+ guard = 0;
+ } else {
+ guard = ROUND(attr._a_guardsize);
+ size = guard + ROUND(attr._a_stacksize
+#ifdef __wasilibc_unmodified_upstream
+ + libc.tls_size + __pthread_tsd_size);
+#else
+ + tls_size + __pthread_tsd_size);
+#endif
+ }
+
+ if (!tsd) {
+#ifdef __wasilibc_unmodified_upstream
+ if (guard) {
+ map = __mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANON, -1, 0);
+ if (map == MAP_FAILED) goto fail;
+ if (__mprotect(map+guard, size-guard, PROT_READ|PROT_WRITE)
+ && errno != ENOSYS) {
+ __munmap(map, size);
+ goto fail;
+ }
+ } else {
+ map = __mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
+ if (map == MAP_FAILED) goto fail;
+ }
+#else
+ map = malloc(size);
+ if (!map) goto fail;
+#endif
+ tsd = map + size - __pthread_tsd_size;
+ if (!stack) {
+#ifdef __wasilibc_unmodified_upstream
+ stack = tsd - libc.tls_size;
+#else
+ stack = tsd - tls_size;
+#endif
+ stack_limit = map + guard;
+ }
+ }
+
+#ifdef __wasilibc_unmodified_upstream
+ new = __copy_tls(tsd - libc.tls_size);
+#else
+ new_tls_base = __copy_tls(tsd - tls_size);
+ tls_offset = new_tls_base - tls_base;
+ new = (void*)((uintptr_t)self + tls_offset);
+#endif
+ new->map_base = map;
+ new->map_size = size;
+ new->stack = stack;
+ new->stack_size = stack - stack_limit;
+ new->guard_size = guard;
+ new->self = new;
+ new->tsd = (void *)tsd;
+ new->locale = &libc.global_locale;
+ if (attr._a_detach) {
+ new->detach_state = DT_DETACHED;
+ } else {
+ new->detach_state = DT_JOINABLE;
+ }
+ new->robust_list.head = &new->robust_list.head;
+ new->canary = self->canary;
+ new->sysinfo = self->sysinfo;
+
+ /* Setup argument structure for the new thread on its stack.
+ * It's safe to access from the caller only until the thread
+ * list is unlocked. */
+#ifdef __wasilibc_unmodified_upstream
+ stack -= (uintptr_t)stack % sizeof(uintptr_t);
+ stack -= sizeof(struct start_args);
+ struct start_args *args = (void *)stack;
+ args->start_func = entry;
+ args->start_arg = arg;
+ args->control = attr._a_sched ? 1 : 0;
+
+ /* Application signals (but not the synccall signal) must be
+ * blocked before the thread list lock can be taken, to ensure
+ * that the lock is AS-safe. */
+ __block_app_sigs(&set);
+
+ /* Ensure SIGCANCEL is unblocked in new thread. This requires
+ * working with a copy of the set so we can restore the
+ * original mask in the calling thread. */
+ memcpy(&args->sig_mask, &set, sizeof args->sig_mask);
+ args->sig_mask[(SIGCANCEL-1)/8/sizeof(long)] &=
+ ~(1UL<<((SIGCANCEL-1)%(8*sizeof(long))));
+#else
+ /* Align the stack to struct start_args */
+ stack -= sizeof(struct start_args);
+ stack -= (uintptr_t)stack % alignof(struct start_args);
+ struct start_args *args = (void *)stack;
+
+ /* Align the stack to 16 and store it */
+ new->stack = (void *)((uintptr_t) stack & -16);
+ /* Correct the stack size */
+ new->stack_size = stack - stack_limit;
+
+ args->start_func = entry;
+ args->start_arg = arg;
+ args->tls_base = (void*)new_tls_base;
+#endif
+
+ __tl_lock();
+ if (!libc.threads_minus_1++) libc.need_locks = 1;
+#ifdef __wasilibc_unmodified_upstream
+ ret = __clone((c11 ? start_c11 : start), stack, flags, args, &new->tid, TP_ADJ(new), &__thread_list_lock);
+#else
+ /* Instead of `__clone`, WASI uses a host API to instantiate a new version
+ * of the current module and start executing the entry function. The
+ * wasi-threads specification requires the module to export a
+ * `wasi_thread_start` function, which is invoked with `args`. */
+ ret = __wasi_thread_spawn((void *) args);
+#endif
+
+#ifdef __wasilibc_unmodified_upstream
+ /* All clone failures translate to EAGAIN. If explicit scheduling
+ * was requested, attempt it before unlocking the thread list so
+ * that the failed thread is never exposed and so that we can
+ * clean up all transient resource usage before returning. */
+ if (ret < 0) {
+ ret = -EAGAIN;
+ } else if (attr._a_sched) {
+ ret = __syscall(SYS_sched_setscheduler,
+ new->tid, attr._a_policy, &attr._a_prio);
+ if (a_swap(&args->control, ret ? 3 : 0)==2)
+ __wake(&args->control, 1, 1);
+ if (ret)
+ __wait(&args->control, 0, 3, 0);
+ }
+#else
+ /* `wasi_thread_spawn` will either return a host-provided thread ID (TID)
+ * (`>= 0`) or an error code (`< 0`). As in the unmodified version, all
+ * spawn failures translate to EAGAIN; unlike the modified version, there is
+ * no need to "start up" the child thread--the host does this. If the spawn
+ * did succeed, then we store the TID atomically, since this parent thread
+ * is racing with the child thread to set this field; this way, whichever
+ * thread reaches this point first can continue without waiting. */
+ if (ret < 0) {
+ ret = -EAGAIN;
+ } else {
+ atomic_store((atomic_int *) &(new->tid), ret);
+ }
+#endif
+
+ if (ret >= 0) {
+ new->next = self->next;
+ new->prev = self;
+ new->next->prev = new;
+ new->prev->next = new;
+ } else {
+ if (!--libc.threads_minus_1) libc.need_locks = 0;
+ }
+ __tl_unlock();
+#ifdef __wasilibc_unmodified_upstream
+ __restore_sigs(&set);
+#endif
+ __release_ptc();
+
+ if (ret < 0) {
+#ifdef __wasilibc_unmodified_upstream
+ if (map) __munmap(map, size);
+#else
+ free(map);
+#endif
+ return -ret;
+ }
+
+ *res = new;
+ return 0;
+fail:
+ __release_ptc();
+ return EAGAIN;
+}
+
+weak_alias(__pthread_exit, pthread_exit);
+weak_alias(__pthread_create, pthread_create);
diff --git a/libc-top-half/musl/src/thread/pthread_detach.c b/libc-top-half/musl/src/thread/pthread_detach.c
new file mode 100644
index 0000000..77772af
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_detach.c
@@ -0,0 +1,14 @@
+#include "pthread_impl.h"
+#include <threads.h>
+
+static int __pthread_detach(pthread_t t)
+{
+ /* If the cas fails, detach state is either already-detached
+ * or exiting/exited, and pthread_join will trap or cleanup. */
+ if (a_cas(&t->detach_state, DT_JOINABLE, DT_DETACHED) != DT_JOINABLE)
+ return __pthread_join(t, 0);
+ return 0;
+}
+
+weak_alias(__pthread_detach, pthread_detach);
+weak_alias(__pthread_detach, thrd_detach);
diff --git a/libc-top-half/musl/src/thread/pthread_equal.c b/libc-top-half/musl/src/thread/pthread_equal.c
new file mode 100644
index 0000000..dbb7365
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_equal.c
@@ -0,0 +1,10 @@
+#include <pthread.h>
+#include <threads.h>
+
+static int __pthread_equal(pthread_t a, pthread_t b)
+{
+ return a==b;
+}
+
+weak_alias(__pthread_equal, pthread_equal);
+weak_alias(__pthread_equal, thrd_equal);
diff --git a/libc-top-half/musl/src/thread/pthread_getattr_np.c b/libc-top-half/musl/src/thread/pthread_getattr_np.c
new file mode 100644
index 0000000..2881831
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_getattr_np.c
@@ -0,0 +1,24 @@
+#define _GNU_SOURCE
+#include "pthread_impl.h"
+#include "libc.h"
+#include <sys/mman.h>
+
+int pthread_getattr_np(pthread_t t, pthread_attr_t *a)
+{
+ *a = (pthread_attr_t){0};
+ a->_a_detach = t->detach_state>=DT_DETACHED;
+ a->_a_guardsize = t->guard_size;
+ if (t->stack) {
+ a->_a_stackaddr = (uintptr_t)t->stack;
+ a->_a_stacksize = t->stack_size;
+ } else {
+ char *p = (void *)libc.auxv;
+ size_t l = PAGE_SIZE;
+ p += -(uintptr_t)p & PAGE_SIZE-1;
+ a->_a_stackaddr = (uintptr_t)p;
+ while (mremap(p-l-PAGE_SIZE, PAGE_SIZE, 2*PAGE_SIZE, 0)==MAP_FAILED && errno==ENOMEM)
+ l += PAGE_SIZE;
+ a->_a_stacksize = l;
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_getconcurrency.c b/libc-top-half/musl/src/thread/pthread_getconcurrency.c
new file mode 100644
index 0000000..269429a
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_getconcurrency.c
@@ -0,0 +1,6 @@
+#include <pthread.h>
+
+int pthread_getconcurrency()
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_getcpuclockid.c b/libc-top-half/musl/src/thread/pthread_getcpuclockid.c
new file mode 100644
index 0000000..9df14fb
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_getcpuclockid.c
@@ -0,0 +1,7 @@
+#include "pthread_impl.h"
+
+int pthread_getcpuclockid(pthread_t t, clockid_t *clockid)
+{
+ *clockid = (-t->tid-1)*8U + 6;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_getname_np.c b/libc-top-half/musl/src/thread/pthread_getname_np.c
new file mode 100644
index 0000000..85504e4
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_getname_np.c
@@ -0,0 +1,25 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/prctl.h>
+
+#include "pthread_impl.h"
+
+int pthread_getname_np(pthread_t thread, char *name, size_t len)
+{
+ int fd, cs, status = 0;
+ char f[sizeof "/proc/self/task//comm" + 3*sizeof(int)];
+
+ if (len < 16) return ERANGE;
+
+ if (thread == pthread_self())
+ return prctl(PR_GET_NAME, (unsigned long)name, 0UL, 0UL, 0UL) ? errno : 0;
+
+ snprintf(f, sizeof f, "/proc/self/task/%d/comm", thread->tid);
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ if ((fd = open(f, O_RDONLY|O_CLOEXEC)) < 0 || (len = read(fd, name, len)) == -1) status = errno;
+ else name[len-1] = 0; /* remove trailing new line only if successful */
+ if (fd >= 0) close(fd);
+ pthread_setcancelstate(cs, 0);
+ return status;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_getschedparam.c b/libc-top-half/musl/src/thread/pthread_getschedparam.c
new file mode 100644
index 0000000..c098bef
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_getschedparam.c
@@ -0,0 +1,21 @@
+#include "pthread_impl.h"
+#include "lock.h"
+
+int pthread_getschedparam(pthread_t t, int *restrict policy, struct sched_param *restrict param)
+{
+ int r;
+ sigset_t set;
+ __block_app_sigs(&set);
+ LOCK(t->killlock);
+ if (!t->tid) {
+ r = ESRCH;
+ } else {
+ r = -__syscall(SYS_sched_getparam, t->tid, param);
+ if (!r) {
+ *policy = __syscall(SYS_sched_getscheduler, t->tid);
+ }
+ }
+ UNLOCK(t->killlock);
+ __restore_sigs(&set);
+ return r;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_getspecific.c b/libc-top-half/musl/src/thread/pthread_getspecific.c
new file mode 100644
index 0000000..d9342a5
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_getspecific.c
@@ -0,0 +1,11 @@
+#include "pthread_impl.h"
+#include <threads.h>
+
+static void *__pthread_getspecific(pthread_key_t k)
+{
+ struct pthread *self = __pthread_self();
+ return self->tsd[k];
+}
+
+weak_alias(__pthread_getspecific, pthread_getspecific);
+weak_alias(__pthread_getspecific, tss_get);
diff --git a/libc-top-half/musl/src/thread/pthread_join.c b/libc-top-half/musl/src/thread/pthread_join.c
new file mode 100644
index 0000000..b06e7e7
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_join.c
@@ -0,0 +1,46 @@
+#define _GNU_SOURCE
+#include "pthread_impl.h"
+#ifdef __wasilibc_unmodified_upstream
+#include <sys/mman.h>
+#endif
+
+static void dummy1(pthread_t t)
+{
+}
+weak_alias(dummy1, __tl_sync);
+
+static int __pthread_timedjoin_np(pthread_t t, void **res, const struct timespec *at)
+{
+ int state, cs, r = 0;
+ __pthread_testcancel();
+ __pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ if (cs == PTHREAD_CANCEL_ENABLE) __pthread_setcancelstate(cs, 0);
+ while ((state = t->detach_state) && r != ETIMEDOUT && r != EINVAL) {
+ if (state >= DT_DETACHED) a_crash();
+ r = __timedwait_cp(&t->detach_state, state, CLOCK_REALTIME, at, 1);
+ }
+ __pthread_setcancelstate(cs, 0);
+ if (r == ETIMEDOUT || r == EINVAL) return r;
+ __tl_sync(t);
+ if (res) *res = t->result;
+#ifdef __wasilibc_unmodified_upstream
+ if (t->map_base) __munmap(t->map_base, t->map_size);
+#else
+ if (t->map_base) free(t->map_base);
+#endif
+ return 0;
+}
+
+int __pthread_join(pthread_t t, void **res)
+{
+ return __pthread_timedjoin_np(t, res, 0);
+}
+
+static int __pthread_tryjoin_np(pthread_t t, void **res)
+{
+ return t->detach_state==DT_JOINABLE ? EBUSY : __pthread_join(t, res);
+}
+
+weak_alias(__pthread_tryjoin_np, pthread_tryjoin_np);
+weak_alias(__pthread_timedjoin_np, pthread_timedjoin_np);
+weak_alias(__pthread_join, pthread_join);
diff --git a/libc-top-half/musl/src/thread/pthread_key_create.c b/libc-top-half/musl/src/thread/pthread_key_create.c
new file mode 100644
index 0000000..dd47caa
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_key_create.c
@@ -0,0 +1,95 @@
+#include "pthread_impl.h"
+
+volatile size_t __pthread_tsd_size = sizeof(void *) * PTHREAD_KEYS_MAX;
+void *__pthread_tsd_main[PTHREAD_KEYS_MAX] = { 0 };
+
+static void (*keys[PTHREAD_KEYS_MAX])(void *);
+
+static pthread_rwlock_t key_lock = PTHREAD_RWLOCK_INITIALIZER;
+
+static pthread_key_t next_key;
+
+static void nodtor(void *dummy)
+{
+}
+
+static void dummy_0(void)
+{
+}
+
+weak_alias(dummy_0, __tl_lock);
+weak_alias(dummy_0, __tl_unlock);
+
+int __pthread_key_create(pthread_key_t *k, void (*dtor)(void *))
+{
+ pthread_t self = __pthread_self();
+
+ /* This can only happen in the main thread before
+ * pthread_create has been called. */
+ if (!self->tsd) self->tsd = __pthread_tsd_main;
+
+ /* Purely a sentinel value since null means slot is free. */
+ if (!dtor) dtor = nodtor;
+
+ __pthread_rwlock_wrlock(&key_lock);
+ pthread_key_t j = next_key;
+ do {
+ if (!keys[j]) {
+ keys[next_key = *k = j] = dtor;
+ __pthread_rwlock_unlock(&key_lock);
+ return 0;
+ }
+ } while ((j=(j+1)%PTHREAD_KEYS_MAX) != next_key);
+
+ __pthread_rwlock_unlock(&key_lock);
+ return EAGAIN;
+}
+
+int __pthread_key_delete(pthread_key_t k)
+{
+ sigset_t set;
+ pthread_t self = __pthread_self(), td=self;
+
+#ifdef __wasilibc_unmodified_upstream
+ __block_app_sigs(&set);
+#endif
+ __pthread_rwlock_wrlock(&key_lock);
+
+ __tl_lock();
+ do td->tsd[k] = 0;
+ while ((td=td->next)!=self);
+ __tl_unlock();
+
+ keys[k] = 0;
+
+ __pthread_rwlock_unlock(&key_lock);
+#ifdef __wasilibc_unmodified_upstream
+ __restore_sigs(&set);
+#endif
+
+ return 0;
+}
+
+void __pthread_tsd_run_dtors()
+{
+ pthread_t self = __pthread_self();
+ int i, j;
+ for (j=0; self->tsd_used && j<PTHREAD_DESTRUCTOR_ITERATIONS; j++) {
+ __pthread_rwlock_rdlock(&key_lock);
+ self->tsd_used = 0;
+ for (i=0; i<PTHREAD_KEYS_MAX; i++) {
+ void *val = self->tsd[i];
+ void (*dtor)(void *) = keys[i];
+ self->tsd[i] = 0;
+ if (val && dtor && dtor != nodtor) {
+ __pthread_rwlock_unlock(&key_lock);
+ dtor(val);
+ __pthread_rwlock_rdlock(&key_lock);
+ }
+ }
+ __pthread_rwlock_unlock(&key_lock);
+ }
+}
+
+weak_alias(__pthread_key_create, pthread_key_create);
+weak_alias(__pthread_key_delete, pthread_key_delete);
diff --git a/libc-top-half/musl/src/thread/pthread_kill.c b/libc-top-half/musl/src/thread/pthread_kill.c
new file mode 100644
index 0000000..79ddb20
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_kill.c
@@ -0,0 +1,18 @@
+#include "pthread_impl.h"
+#include "lock.h"
+
+int pthread_kill(pthread_t t, int sig)
+{
+ int r;
+ sigset_t set;
+ /* Block not just app signals, but internal ones too, since
+ * pthread_kill is used to implement pthread_cancel, which
+ * must be async-cancel-safe. */
+ __block_all_sigs(&set);
+ LOCK(t->killlock);
+ r = t->tid ? -__syscall(SYS_tkill, t->tid, sig)
+ : (sig+0U >= _NSIG ? EINVAL : 0);
+ UNLOCK(t->killlock);
+ __restore_sigs(&set);
+ return r;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_mutex_consistent.c b/libc-top-half/musl/src/thread/pthread_mutex_consistent.c
new file mode 100644
index 0000000..27c74e5
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutex_consistent.c
@@ -0,0 +1,14 @@
+#include "pthread_impl.h"
+#include "atomic.h"
+
+int pthread_mutex_consistent(pthread_mutex_t *m)
+{
+ int old = m->_m_lock;
+ int own = old & 0x3fffffff;
+ if (!(m->_m_type & 4) || !own || !(old & 0x40000000))
+ return EINVAL;
+ if (own != __pthread_self()->tid)
+ return EPERM;
+ a_and(&m->_m_lock, ~0x40000000);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_mutex_destroy.c b/libc-top-half/musl/src/thread/pthread_mutex_destroy.c
new file mode 100644
index 0000000..e53c39c
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutex_destroy.c
@@ -0,0 +1,18 @@
+#include "pthread_impl.h"
+
+int pthread_mutex_destroy(pthread_mutex_t *mutex)
+{
+#ifdef __wasilibc_unmodified_upstream
+ /* If the mutex being destroyed is process-shared and has nontrivial
+ * type (tracking ownership), it might be in the pending slot of a
+ * robust_list; wait for quiescence. */
+ if (mutex->_m_type > 128) __vm_wait();
+#else
+ /* For now, wasi-libc chooses to avoid implementing robust mutex support
+ * though this could be added later. The error code indicates that the
+ * mutex was an invalid type, but it would be more accurate as
+ * "unimplemented". */
+ if (mutex->_m_type > 128) return EINVAL;
+#endif
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_mutex_getprioceiling.c b/libc-top-half/musl/src/thread/pthread_mutex_getprioceiling.c
new file mode 100644
index 0000000..8c75a66
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutex_getprioceiling.c
@@ -0,0 +1,6 @@
+#include "pthread_impl.h"
+
+int pthread_mutex_getprioceiling(const pthread_mutex_t *restrict m, int *restrict ceiling)
+{
+ return EINVAL;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_mutex_init.c b/libc-top-half/musl/src/thread/pthread_mutex_init.c
new file mode 100644
index 0000000..acf45a7
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutex_init.c
@@ -0,0 +1,8 @@
+#include "pthread_impl.h"
+
+int pthread_mutex_init(pthread_mutex_t *restrict m, const pthread_mutexattr_t *restrict a)
+{
+ *m = (pthread_mutex_t){0};
+ if (a) m->_m_type = a->__attr;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_mutex_lock.c b/libc-top-half/musl/src/thread/pthread_mutex_lock.c
new file mode 100644
index 0000000..638d4b8
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutex_lock.c
@@ -0,0 +1,12 @@
+#include "pthread_impl.h"
+
+int __pthread_mutex_lock(pthread_mutex_t *m)
+{
+ if ((m->_m_type&15) == PTHREAD_MUTEX_NORMAL
+ && !a_cas(&m->_m_lock, 0, EBUSY))
+ return 0;
+
+ return __pthread_mutex_timedlock(m, 0);
+}
+
+weak_alias(__pthread_mutex_lock, pthread_mutex_lock);
diff --git a/libc-top-half/musl/src/thread/pthread_mutex_setprioceiling.c b/libc-top-half/musl/src/thread/pthread_mutex_setprioceiling.c
new file mode 100644
index 0000000..681f07c
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutex_setprioceiling.c
@@ -0,0 +1,6 @@
+#include "pthread_impl.h"
+
+int pthread_mutex_setprioceiling(pthread_mutex_t *restrict m, int ceiling, int *restrict old)
+{
+ return EINVAL;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_mutex_timedlock.c b/libc-top-half/musl/src/thread/pthread_mutex_timedlock.c
new file mode 100644
index 0000000..d22196a
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutex_timedlock.c
@@ -0,0 +1,96 @@
+#include "pthread_impl.h"
+
+#ifdef __wasilibc_unmodified_upstream
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
+
+static int __futex4(volatile void *addr, int op, int val, const struct timespec *to)
+{
+#ifdef SYS_futex_time64
+ time_t s = to ? to->tv_sec : 0;
+ long ns = to ? to->tv_nsec : 0;
+ int r = -ENOSYS;
+ if (SYS_futex == SYS_futex_time64 || !IS32BIT(s))
+ r = __syscall(SYS_futex_time64, addr, op, val,
+ to ? ((long long[]){s, ns}) : 0);
+ if (SYS_futex == SYS_futex_time64 || r!=-ENOSYS) return r;
+ to = to ? (void *)(long[]){CLAMP(s), ns} : 0;
+#endif
+ return __syscall(SYS_futex, addr, op, val, to);
+}
+
+static int pthread_mutex_timedlock_pi(pthread_mutex_t *restrict m, const struct timespec *restrict at)
+{
+ int type = m->_m_type;
+ int priv = (type & 128) ^ 128;
+ pthread_t self = __pthread_self();
+ int e;
+
+ if (!priv) self->robust_list.pending = &m->_m_next;
+
+ do e = -__futex4(&m->_m_lock, FUTEX_LOCK_PI|priv, 0, at);
+ while (e==EINTR);
+ if (e) self->robust_list.pending = 0;
+
+ switch (e) {
+ case 0:
+ /* Catch spurious success for non-robust mutexes. */
+ if (!(type&4) && ((m->_m_lock & 0x40000000) || m->_m_waiters)) {
+ a_store(&m->_m_waiters, -1);
+ __syscall(SYS_futex, &m->_m_lock, FUTEX_UNLOCK_PI|priv);
+ self->robust_list.pending = 0;
+ break;
+ }
+ /* Signal to trylock that we already have the lock. */
+ m->_m_count = -1;
+ return __pthread_mutex_trylock(m);
+ case ETIMEDOUT:
+ return e;
+ case EDEADLK:
+ if ((type&3) == PTHREAD_MUTEX_ERRORCHECK) return e;
+ }
+ do e = __timedwait(&(int){0}, 0, CLOCK_REALTIME, at, 1);
+ while (e != ETIMEDOUT);
+ return e;
+}
+#endif
+
+int __pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec *restrict at)
+{
+ if ((m->_m_type&15) == PTHREAD_MUTEX_NORMAL
+ && !a_cas(&m->_m_lock, 0, EBUSY))
+ return 0;
+
+ int type = m->_m_type;
+ int r, t, priv = (type & 128) ^ 128;
+
+ r = __pthread_mutex_trylock(m);
+ if (r != EBUSY) return r;
+
+#ifdef __wasilibc_unmodified_upstream
+ if (type&8) return pthread_mutex_timedlock_pi(m, at);
+#endif
+
+ int spins = 100;
+ while (spins-- && m->_m_lock && !m->_m_waiters) a_spin();
+
+ while ((r=__pthread_mutex_trylock(m)) == EBUSY) {
+ r = m->_m_lock;
+ int own = r & 0x3fffffff;
+ if (!own && (!r || (type&4)))
+ continue;
+ if ((type&3) == PTHREAD_MUTEX_ERRORCHECK
+ && own == __pthread_self()->tid)
+ return EDEADLK;
+
+ a_inc(&m->_m_waiters);
+ t = r | 0x80000000;
+ a_cas(&m->_m_lock, r, t);
+ r = __timedwait(&m->_m_lock, t, CLOCK_REALTIME, at, priv);
+ a_dec(&m->_m_waiters);
+ if (r && r != EINTR) break;
+ }
+ return r;
+}
+
+weak_alias(__pthread_mutex_timedlock, pthread_mutex_timedlock);
diff --git a/libc-top-half/musl/src/thread/pthread_mutex_trylock.c b/libc-top-half/musl/src/thread/pthread_mutex_trylock.c
new file mode 100644
index 0000000..c60b45f
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutex_trylock.c
@@ -0,0 +1,78 @@
+#include "pthread_impl.h"
+
+int __pthread_mutex_trylock_owner(pthread_mutex_t *m)
+{
+ int old, own;
+ int type = m->_m_type;
+ pthread_t self = __pthread_self();
+ int tid = self->tid;
+
+ old = m->_m_lock;
+ own = old & 0x3fffffff;
+ if (own == tid) {
+ if ((type&8) && m->_m_count<0) {
+ old &= 0x40000000;
+ m->_m_count = 0;
+ goto success;
+ }
+ if ((type&3) == PTHREAD_MUTEX_RECURSIVE) {
+ if ((unsigned)m->_m_count >= INT_MAX) return EAGAIN;
+ m->_m_count++;
+ return 0;
+ }
+ }
+ if (own == 0x3fffffff) return ENOTRECOVERABLE;
+ if (own || (old && !(type & 4))) return EBUSY;
+
+ if (type & 128) {
+ if (!self->robust_list.off) {
+ self->robust_list.off = (char*)&m->_m_lock-(char *)&m->_m_next;
+#ifdef __wasilibc_unmodified_upstream
+ __syscall(SYS_set_robust_list, &self->robust_list, 3*sizeof(long));
+#endif
+ }
+ if (m->_m_waiters) tid |= 0x80000000;
+ self->robust_list.pending = &m->_m_next;
+ }
+ tid |= old & 0x40000000;
+
+ if (a_cas(&m->_m_lock, old, tid) != old) {
+ self->robust_list.pending = 0;
+ if ((type&12)==12 && m->_m_waiters) return ENOTRECOVERABLE;
+ return EBUSY;
+ }
+
+success:
+ if ((type&8) && m->_m_waiters) {
+ int priv = (type & 128) ^ 128;
+#ifdef __wasilibc_unmodified_upstream
+ __syscall(SYS_futex, &m->_m_lock, FUTEX_UNLOCK_PI|priv);
+#endif
+ self->robust_list.pending = 0;
+ return (type&4) ? ENOTRECOVERABLE : EBUSY;
+ }
+
+ volatile void *next = self->robust_list.head;
+ m->_m_next = next;
+ m->_m_prev = &self->robust_list.head;
+ if (next != &self->robust_list.head) *(volatile void *volatile *)
+ ((char *)next - sizeof(void *)) = &m->_m_next;
+ self->robust_list.head = &m->_m_next;
+ self->robust_list.pending = 0;
+
+ if (old) {
+ m->_m_count = 0;
+ return EOWNERDEAD;
+ }
+
+ return 0;
+}
+
+int __pthread_mutex_trylock(pthread_mutex_t *m)
+{
+ if ((m->_m_type&15) == PTHREAD_MUTEX_NORMAL)
+ return a_cas(&m->_m_lock, 0, EBUSY) & EBUSY;
+ return __pthread_mutex_trylock_owner(m);
+}
+
+weak_alias(__pthread_mutex_trylock, pthread_mutex_trylock);
diff --git a/libc-top-half/musl/src/thread/pthread_mutex_unlock.c b/libc-top-half/musl/src/thread/pthread_mutex_unlock.c
new file mode 100644
index 0000000..6beaacb
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutex_unlock.c
@@ -0,0 +1,60 @@
+#include "pthread_impl.h"
+
+int __pthread_mutex_unlock(pthread_mutex_t *m)
+{
+ pthread_t self;
+ int waiters = m->_m_waiters;
+ int cont;
+ int type = m->_m_type & 15;
+ int priv = (m->_m_type & 128) ^ 128;
+ int new = 0;
+ int old;
+
+ if (type != PTHREAD_MUTEX_NORMAL) {
+ self = __pthread_self();
+ old = m->_m_lock;
+ int own = old & 0x3fffffff;
+ if (own != self->tid)
+ return EPERM;
+ if ((type&3) == PTHREAD_MUTEX_RECURSIVE && m->_m_count)
+ return m->_m_count--, 0;
+ if ((type&4) && (old&0x40000000))
+ new = 0x7fffffff;
+ if (!priv) {
+ self->robust_list.pending = &m->_m_next;
+#ifdef __wasilibc_unmodified_upstream
+ __vm_lock();
+#endif
+ }
+ volatile void *prev = m->_m_prev;
+ volatile void *next = m->_m_next;
+ *(volatile void *volatile *)prev = next;
+ if (next != &self->robust_list.head) *(volatile void *volatile *)
+ ((char *)next - sizeof(void *)) = prev;
+ }
+#ifdef __wasilibc_unmodified_upstream
+ if (type&8) {
+ if (old<0 || a_cas(&m->_m_lock, old, new)!=old) {
+ if (new) a_store(&m->_m_waiters, -1);
+ __syscall(SYS_futex, &m->_m_lock, FUTEX_UNLOCK_PI|priv);
+ }
+ cont = 0;
+ waiters = 0;
+ } else {
+ cont = a_swap(&m->_m_lock, new);
+ }
+#else
+ cont = a_swap(&m->_m_lock, new);
+#endif
+ if (type != PTHREAD_MUTEX_NORMAL && !priv) {
+ self->robust_list.pending = 0;
+#ifdef __wasilibc_unmodified_upstream
+ __vm_unlock();
+#endif
+ }
+ if (waiters || cont<0)
+ __wake(&m->_m_lock, 1, priv);
+ return 0;
+}
+
+weak_alias(__pthread_mutex_unlock, pthread_mutex_unlock);
diff --git a/libc-top-half/musl/src/thread/pthread_mutexattr_destroy.c b/libc-top-half/musl/src/thread/pthread_mutexattr_destroy.c
new file mode 100644
index 0000000..9fd6974
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutexattr_destroy.c
@@ -0,0 +1,6 @@
+#include "pthread_impl.h"
+
+int pthread_mutexattr_destroy(pthread_mutexattr_t *a)
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_mutexattr_init.c b/libc-top-half/musl/src/thread/pthread_mutexattr_init.c
new file mode 100644
index 0000000..0b72c1b
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutexattr_init.c
@@ -0,0 +1,7 @@
+#include "pthread_impl.h"
+
+int pthread_mutexattr_init(pthread_mutexattr_t *a)
+{
+ *a = (pthread_mutexattr_t){0};
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_mutexattr_setprotocol.c b/libc-top-half/musl/src/thread/pthread_mutexattr_setprotocol.c
new file mode 100644
index 0000000..84b02ba
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutexattr_setprotocol.c
@@ -0,0 +1,32 @@
+#include "pthread_impl.h"
+#include "syscall.h"
+
+static volatile int check_pi_result = -1;
+
+int pthread_mutexattr_setprotocol(pthread_mutexattr_t *a, int protocol)
+{
+ int r;
+ switch (protocol) {
+ case PTHREAD_PRIO_NONE:
+ a->__attr &= ~8;
+ return 0;
+ case PTHREAD_PRIO_INHERIT:
+#ifdef __wasilibc_unmodified_upstream
+ r = check_pi_result;
+ if (r < 0) {
+ volatile int lk = 0;
+ r = -__syscall(SYS_futex, &lk, FUTEX_LOCK_PI, 0, 0);
+ a_store(&check_pi_result, r);
+ }
+ if (r) return r;
+ a->__attr |= 8;
+ return 0;
+#else
+ return ENOTSUP;
+#endif
+ case PTHREAD_PRIO_PROTECT:
+ return ENOTSUP;
+ default:
+ return EINVAL;
+ }
+}
diff --git a/libc-top-half/musl/src/thread/pthread_mutexattr_setpshared.c b/libc-top-half/musl/src/thread/pthread_mutexattr_setpshared.c
new file mode 100644
index 0000000..100f6ff
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutexattr_setpshared.c
@@ -0,0 +1,9 @@
+#include "pthread_impl.h"
+
+int pthread_mutexattr_setpshared(pthread_mutexattr_t *a, int pshared)
+{
+ if (pshared > 1U) return EINVAL;
+ a->__attr &= ~128U;
+ a->__attr |= pshared<<7;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_mutexattr_setrobust.c b/libc-top-half/musl/src/thread/pthread_mutexattr_setrobust.c
new file mode 100644
index 0000000..649a891
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutexattr_setrobust.c
@@ -0,0 +1,27 @@
+#include "pthread_impl.h"
+#include "syscall.h"
+
+static volatile int check_robust_result = -1;
+
+int pthread_mutexattr_setrobust(pthread_mutexattr_t *a, int robust)
+{
+#ifdef __wasilibc_unmodified_upstream
+ if (robust > 1U) return EINVAL;
+ if (robust) {
+ int r = check_robust_result;
+ if (r < 0) {
+ void *p;
+ size_t l;
+ r = -__syscall(SYS_get_robust_list, 0, &p, &l);
+ a_store(&check_robust_result, r);
+ }
+ if (r) return r;
+ a->__attr |= 4;
+ return 0;
+ }
+ a->__attr &= ~4;
+ return 0;
+#else
+ return EINVAL;
+#endif
+}
diff --git a/libc-top-half/musl/src/thread/pthread_mutexattr_settype.c b/libc-top-half/musl/src/thread/pthread_mutexattr_settype.c
new file mode 100644
index 0000000..cd7a80e
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_mutexattr_settype.c
@@ -0,0 +1,8 @@
+#include "pthread_impl.h"
+
+int pthread_mutexattr_settype(pthread_mutexattr_t *a, int type)
+{
+ if ((unsigned)type > 2) return EINVAL;
+ a->__attr = (a->__attr & ~3) | type;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_once.c b/libc-top-half/musl/src/thread/pthread_once.c
new file mode 100644
index 0000000..8e8d40a
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_once.c
@@ -0,0 +1,50 @@
+#include "pthread_impl.h"
+
+static void undo(void *control)
+{
+ /* Wake all waiters, since the waiter status is lost when
+ * resetting control to the initial state. */
+ if (a_swap(control, 0) == 3)
+ __wake(control, -1, 1);
+}
+
+hidden int __pthread_once_full(pthread_once_t *control, void (*init)(void))
+{
+ /* Try to enter initializing state. Four possibilities:
+ * 0 - we're the first or the other cancelled; run init
+ * 1 - another thread is running init; wait
+ * 2 - another thread finished running init; just return
+ * 3 - another thread is running init, waiters present; wait */
+
+ for (;;) switch (a_cas(control, 0, 1)) {
+ case 0:
+ pthread_cleanup_push(undo, control);
+ init();
+ pthread_cleanup_pop(0);
+
+ if (a_swap(control, 2) == 3)
+ __wake(control, -1, 1);
+ return 0;
+ case 1:
+ /* If this fails, so will __wait. */
+ a_cas(control, 1, 3);
+ case 3:
+ __wait(control, 0, 3, 1);
+ continue;
+ case 2:
+ return 0;
+ }
+}
+
+int __pthread_once(pthread_once_t *control, void (*init)(void))
+{
+ /* Return immediately if init finished before, but ensure that
+ * effects of the init routine are visible to the caller. */
+ if (*(volatile int *)control == 2) {
+ a_barrier();
+ return 0;
+ }
+ return __pthread_once_full(control, init);
+}
+
+weak_alias(__pthread_once, pthread_once);
diff --git a/libc-top-half/musl/src/thread/pthread_rwlock_destroy.c b/libc-top-half/musl/src/thread/pthread_rwlock_destroy.c
new file mode 100644
index 0000000..49ecfbd
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_rwlock_destroy.c
@@ -0,0 +1,6 @@
+#include "pthread_impl.h"
+
+int pthread_rwlock_destroy(pthread_rwlock_t *rw)
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_rwlock_init.c b/libc-top-half/musl/src/thread/pthread_rwlock_init.c
new file mode 100644
index 0000000..a2c0b47
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_rwlock_init.c
@@ -0,0 +1,8 @@
+#include "pthread_impl.h"
+
+int pthread_rwlock_init(pthread_rwlock_t *restrict rw, const pthread_rwlockattr_t *restrict a)
+{
+ *rw = (pthread_rwlock_t){0};
+ if (a) rw->_rw_shared = a->__attr[0]*128;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_rwlock_rdlock.c b/libc-top-half/musl/src/thread/pthread_rwlock_rdlock.c
new file mode 100644
index 0000000..8546c07
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_rwlock_rdlock.c
@@ -0,0 +1,8 @@
+#include "pthread_impl.h"
+
+int __pthread_rwlock_rdlock(pthread_rwlock_t *rw)
+{
+ return __pthread_rwlock_timedrdlock(rw, 0);
+}
+
+weak_alias(__pthread_rwlock_rdlock, pthread_rwlock_rdlock);
diff --git a/libc-top-half/musl/src/thread/pthread_rwlock_timedrdlock.c b/libc-top-half/musl/src/thread/pthread_rwlock_timedrdlock.c
new file mode 100644
index 0000000..8cdd8ec
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_rwlock_timedrdlock.c
@@ -0,0 +1,25 @@
+#include "pthread_impl.h"
+
+int __pthread_rwlock_timedrdlock(pthread_rwlock_t *restrict rw, const struct timespec *restrict at)
+{
+ int r, t;
+
+ r = pthread_rwlock_tryrdlock(rw);
+ if (r != EBUSY) return r;
+
+ int spins = 100;
+ while (spins-- && rw->_rw_lock && !rw->_rw_waiters) a_spin();
+
+ while ((r=__pthread_rwlock_tryrdlock(rw))==EBUSY) {
+ if (!(r=rw->_rw_lock) || (r&0x7fffffff)!=0x7fffffff) continue;
+ t = r | 0x80000000;
+ a_inc(&rw->_rw_waiters);
+ a_cas(&rw->_rw_lock, r, t);
+ r = __timedwait(&rw->_rw_lock, t, CLOCK_REALTIME, at, rw->_rw_shared^128);
+ a_dec(&rw->_rw_waiters);
+ if (r && r != EINTR) return r;
+ }
+ return r;
+}
+
+weak_alias(__pthread_rwlock_timedrdlock, pthread_rwlock_timedrdlock);
diff --git a/libc-top-half/musl/src/thread/pthread_rwlock_timedwrlock.c b/libc-top-half/musl/src/thread/pthread_rwlock_timedwrlock.c
new file mode 100644
index 0000000..d77706e
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_rwlock_timedwrlock.c
@@ -0,0 +1,25 @@
+#include "pthread_impl.h"
+
+int __pthread_rwlock_timedwrlock(pthread_rwlock_t *restrict rw, const struct timespec *restrict at)
+{
+ int r, t;
+
+ r = pthread_rwlock_trywrlock(rw);
+ if (r != EBUSY) return r;
+
+ int spins = 100;
+ while (spins-- && rw->_rw_lock && !rw->_rw_waiters) a_spin();
+
+ while ((r=__pthread_rwlock_trywrlock(rw))==EBUSY) {
+ if (!(r=rw->_rw_lock)) continue;
+ t = r | 0x80000000;
+ a_inc(&rw->_rw_waiters);
+ a_cas(&rw->_rw_lock, r, t);
+ r = __timedwait(&rw->_rw_lock, t, CLOCK_REALTIME, at, rw->_rw_shared^128);
+ a_dec(&rw->_rw_waiters);
+ if (r && r != EINTR) return r;
+ }
+ return r;
+}
+
+weak_alias(__pthread_rwlock_timedwrlock, pthread_rwlock_timedwrlock);
diff --git a/libc-top-half/musl/src/thread/pthread_rwlock_tryrdlock.c b/libc-top-half/musl/src/thread/pthread_rwlock_tryrdlock.c
new file mode 100644
index 0000000..c13bc9c
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_rwlock_tryrdlock.c
@@ -0,0 +1,15 @@
+#include "pthread_impl.h"
+
+int __pthread_rwlock_tryrdlock(pthread_rwlock_t *rw)
+{
+ int val, cnt;
+ do {
+ val = rw->_rw_lock;
+ cnt = val & 0x7fffffff;
+ if (cnt == 0x7fffffff) return EBUSY;
+ if (cnt == 0x7ffffffe) return EAGAIN;
+ } while (a_cas(&rw->_rw_lock, val, val+1) != val);
+ return 0;
+}
+
+weak_alias(__pthread_rwlock_tryrdlock, pthread_rwlock_tryrdlock);
diff --git a/libc-top-half/musl/src/thread/pthread_rwlock_trywrlock.c b/libc-top-half/musl/src/thread/pthread_rwlock_trywrlock.c
new file mode 100644
index 0000000..64d9d31
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_rwlock_trywrlock.c
@@ -0,0 +1,9 @@
+#include "pthread_impl.h"
+
+int __pthread_rwlock_trywrlock(pthread_rwlock_t *rw)
+{
+ if (a_cas(&rw->_rw_lock, 0, 0x7fffffff)) return EBUSY;
+ return 0;
+}
+
+weak_alias(__pthread_rwlock_trywrlock, pthread_rwlock_trywrlock);
diff --git a/libc-top-half/musl/src/thread/pthread_rwlock_unlock.c b/libc-top-half/musl/src/thread/pthread_rwlock_unlock.c
new file mode 100644
index 0000000..9ae27ad
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_rwlock_unlock.c
@@ -0,0 +1,20 @@
+#include "pthread_impl.h"
+
+int __pthread_rwlock_unlock(pthread_rwlock_t *rw)
+{
+ int val, cnt, waiters, new, priv = rw->_rw_shared^128;
+
+ do {
+ val = rw->_rw_lock;
+ cnt = val & 0x7fffffff;
+ waiters = rw->_rw_waiters;
+ new = (cnt == 0x7fffffff || cnt == 1) ? 0 : val-1;
+ } while (a_cas(&rw->_rw_lock, val, new) != val);
+
+ if (!new && (waiters || val<0))
+ __wake(&rw->_rw_lock, cnt, priv);
+
+ return 0;
+}
+
+weak_alias(__pthread_rwlock_unlock, pthread_rwlock_unlock);
diff --git a/libc-top-half/musl/src/thread/pthread_rwlock_wrlock.c b/libc-top-half/musl/src/thread/pthread_rwlock_wrlock.c
new file mode 100644
index 0000000..46a3b3a
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_rwlock_wrlock.c
@@ -0,0 +1,8 @@
+#include "pthread_impl.h"
+
+int __pthread_rwlock_wrlock(pthread_rwlock_t *rw)
+{
+ return __pthread_rwlock_timedwrlock(rw, 0);
+}
+
+weak_alias(__pthread_rwlock_wrlock, pthread_rwlock_wrlock);
diff --git a/libc-top-half/musl/src/thread/pthread_rwlockattr_destroy.c b/libc-top-half/musl/src/thread/pthread_rwlockattr_destroy.c
new file mode 100644
index 0000000..fc8d611
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_rwlockattr_destroy.c
@@ -0,0 +1,6 @@
+#include "pthread_impl.h"
+
+int pthread_rwlockattr_destroy(pthread_rwlockattr_t *a)
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_rwlockattr_init.c b/libc-top-half/musl/src/thread/pthread_rwlockattr_init.c
new file mode 100644
index 0000000..e742069
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_rwlockattr_init.c
@@ -0,0 +1,7 @@
+#include "pthread_impl.h"
+
+int pthread_rwlockattr_init(pthread_rwlockattr_t *a)
+{
+ *a = (pthread_rwlockattr_t){0};
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_rwlockattr_setpshared.c b/libc-top-half/musl/src/thread/pthread_rwlockattr_setpshared.c
new file mode 100644
index 0000000..e706197
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_rwlockattr_setpshared.c
@@ -0,0 +1,8 @@
+#include "pthread_impl.h"
+
+int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *a, int pshared)
+{
+ if (pshared > 1U) return EINVAL;
+ a->__attr[0] = pshared;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_self.c b/libc-top-half/musl/src/thread/pthread_self.c
new file mode 100644
index 0000000..1f3eee1
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_self.c
@@ -0,0 +1,15 @@
+#include "pthread_impl.h"
+#include <threads.h>
+
+#if !defined(__wasilibc_unmodified_upstream) && defined(__wasm__) && \
+ defined(_REENTRANT)
+_Thread_local struct pthread __wasilibc_pthread_self;
+#endif
+
+static pthread_t __pthread_self_internal()
+{
+ return __pthread_self();
+}
+
+weak_alias(__pthread_self_internal, pthread_self);
+weak_alias(__pthread_self_internal, thrd_current);
diff --git a/libc-top-half/musl/src/thread/pthread_setattr_default_np.c b/libc-top-half/musl/src/thread/pthread_setattr_default_np.c
new file mode 100644
index 0000000..5848622
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_setattr_default_np.c
@@ -0,0 +1,37 @@
+#define _GNU_SOURCE
+#include "pthread_impl.h"
+#include <string.h>
+
+#define MIN(a,b) ((a)<(b) ? (a) : (b))
+#define MAX(a,b) ((a)>(b) ? (a) : (b))
+
+int pthread_setattr_default_np(const pthread_attr_t *attrp)
+{
+ /* Reject anything in the attr object other than stack/guard size. */
+ pthread_attr_t tmp = *attrp, zero = { 0 };
+ tmp._a_stacksize = 0;
+ tmp._a_guardsize = 0;
+ if (memcmp(&tmp, &zero, sizeof tmp))
+ return EINVAL;
+
+ unsigned stack = MIN(attrp->_a_stacksize, DEFAULT_STACK_MAX);
+ unsigned guard = MIN(attrp->_a_guardsize, DEFAULT_GUARD_MAX);
+
+ __inhibit_ptc();
+ __default_stacksize = MAX(__default_stacksize, stack);
+ __default_guardsize = MAX(__default_guardsize, guard);
+ __release_ptc();
+
+ return 0;
+}
+
+int pthread_getattr_default_np(pthread_attr_t *attrp)
+{
+ __acquire_ptc();
+ *attrp = (pthread_attr_t) {
+ ._a_stacksize = __default_stacksize,
+ ._a_guardsize = __default_guardsize,
+ };
+ __release_ptc();
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_setcancelstate.c b/libc-top-half/musl/src/thread/pthread_setcancelstate.c
new file mode 100644
index 0000000..4f7a00e
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_setcancelstate.c
@@ -0,0 +1,14 @@
+#include "pthread_impl.h"
+
+int __pthread_setcancelstate(int new, int *old)
+{
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ if (new > 2U) return EINVAL;
+ struct pthread *self = __pthread_self();
+ if (old) *old = self->canceldisable;
+ self->canceldisable = new;
+#endif
+ return 0;
+}
+
+weak_alias(__pthread_setcancelstate, pthread_setcancelstate);
diff --git a/libc-top-half/musl/src/thread/pthread_setcanceltype.c b/libc-top-half/musl/src/thread/pthread_setcanceltype.c
new file mode 100644
index 0000000..bf0a3f3
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_setcanceltype.c
@@ -0,0 +1,11 @@
+#include "pthread_impl.h"
+
+int pthread_setcanceltype(int new, int *old)
+{
+ struct pthread *self = __pthread_self();
+ if (new > 1U) return EINVAL;
+ if (old) *old = self->cancelasync;
+ self->cancelasync = new;
+ if (new) pthread_testcancel();
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_setconcurrency.c b/libc-top-half/musl/src/thread/pthread_setconcurrency.c
new file mode 100644
index 0000000..091abf9
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_setconcurrency.c
@@ -0,0 +1,9 @@
+#include <pthread.h>
+#include <errno.h>
+
+int pthread_setconcurrency(int val)
+{
+ if (val < 0) return EINVAL;
+ if (val > 0) return EAGAIN;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_setname_np.c b/libc-top-half/musl/src/thread/pthread_setname_np.c
new file mode 100644
index 0000000..fc2d230
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_setname_np.c
@@ -0,0 +1,26 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/prctl.h>
+
+#include "pthread_impl.h"
+
+int pthread_setname_np(pthread_t thread, const char *name)
+{
+ int fd, cs, status = 0;
+ char f[sizeof "/proc/self/task//comm" + 3*sizeof(int)];
+ size_t len;
+
+ if ((len = strnlen(name, 16)) > 15) return ERANGE;
+
+ if (thread == pthread_self())
+ return prctl(PR_SET_NAME, (unsigned long)name, 0UL, 0UL, 0UL) ? errno : 0;
+
+ snprintf(f, sizeof f, "/proc/self/task/%d/comm", thread->tid);
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ if ((fd = open(f, O_WRONLY|O_CLOEXEC)) < 0 || write(fd, name, len) < 0) status = errno;
+ if (fd >= 0) close(fd);
+ pthread_setcancelstate(cs, 0);
+ return status;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_setschedparam.c b/libc-top-half/musl/src/thread/pthread_setschedparam.c
new file mode 100644
index 0000000..76d4d45
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_setschedparam.c
@@ -0,0 +1,14 @@
+#include "pthread_impl.h"
+#include "lock.h"
+
+int pthread_setschedparam(pthread_t t, int policy, const struct sched_param *param)
+{
+ int r;
+ sigset_t set;
+ __block_app_sigs(&set);
+ LOCK(t->killlock);
+ r = !t->tid ? ESRCH : -__syscall(SYS_sched_setscheduler, t->tid, policy, param);
+ UNLOCK(t->killlock);
+ __restore_sigs(&set);
+ return r;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_setschedprio.c b/libc-top-half/musl/src/thread/pthread_setschedprio.c
new file mode 100644
index 0000000..fc2e13d
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_setschedprio.c
@@ -0,0 +1,14 @@
+#include "pthread_impl.h"
+#include "lock.h"
+
+int pthread_setschedprio(pthread_t t, int prio)
+{
+ int r;
+ sigset_t set;
+ __block_app_sigs(&set);
+ LOCK(t->killlock);
+ r = !t->tid ? ESRCH : -__syscall(SYS_sched_setparam, t->tid, &prio);
+ UNLOCK(t->killlock);
+ __restore_sigs(&set);
+ return r;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_setspecific.c b/libc-top-half/musl/src/thread/pthread_setspecific.c
new file mode 100644
index 0000000..55e46a8
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_setspecific.c
@@ -0,0 +1,12 @@
+#include "pthread_impl.h"
+
+int pthread_setspecific(pthread_key_t k, const void *x)
+{
+ struct pthread *self = __pthread_self();
+ /* Avoid unnecessary COW */
+ if (self->tsd[k] != x) {
+ self->tsd[k] = (void *)x;
+ self->tsd_used = 1;
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_sigmask.c b/libc-top-half/musl/src/thread/pthread_sigmask.c
new file mode 100644
index 0000000..f188782
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_sigmask.c
@@ -0,0 +1,19 @@
+#include <signal.h>
+#include <errno.h>
+#include "syscall.h"
+
+int pthread_sigmask(int how, const sigset_t *restrict set, sigset_t *restrict old)
+{
+ int ret;
+ if (set && (unsigned)how - SIG_BLOCK > 2U) return EINVAL;
+ ret = -__syscall(SYS_rt_sigprocmask, how, set, old, _NSIG/8);
+ if (!ret && old) {
+ if (sizeof old->__bits[0] == 8) {
+ old->__bits[0] &= ~0x380000000ULL;
+ } else {
+ old->__bits[0] &= ~0x80000000UL;
+ old->__bits[1] &= ~0x3UL;
+ }
+ }
+ return ret;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_spin_destroy.c b/libc-top-half/musl/src/thread/pthread_spin_destroy.c
new file mode 100644
index 0000000..e65a820
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_spin_destroy.c
@@ -0,0 +1,6 @@
+#include "pthread_impl.h"
+
+int pthread_spin_destroy(pthread_spinlock_t *s)
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_spin_init.c b/libc-top-half/musl/src/thread/pthread_spin_init.c
new file mode 100644
index 0000000..681881c
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_spin_init.c
@@ -0,0 +1,6 @@
+#include "pthread_impl.h"
+
+int pthread_spin_init(pthread_spinlock_t *s, int shared)
+{
+ return *s = 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_spin_lock.c b/libc-top-half/musl/src/thread/pthread_spin_lock.c
new file mode 100644
index 0000000..ded2b65
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_spin_lock.c
@@ -0,0 +1,8 @@
+#include "pthread_impl.h"
+#include <errno.h>
+
+int pthread_spin_lock(pthread_spinlock_t *s)
+{
+ while (*(volatile int *)s || a_cas(s, 0, EBUSY)) a_spin();
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_spin_trylock.c b/libc-top-half/musl/src/thread/pthread_spin_trylock.c
new file mode 100644
index 0000000..5284fda
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_spin_trylock.c
@@ -0,0 +1,7 @@
+#include "pthread_impl.h"
+#include <errno.h>
+
+int pthread_spin_trylock(pthread_spinlock_t *s)
+{
+ return a_cas(s, 0, EBUSY);
+}
diff --git a/libc-top-half/musl/src/thread/pthread_spin_unlock.c b/libc-top-half/musl/src/thread/pthread_spin_unlock.c
new file mode 100644
index 0000000..724d9e0
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_spin_unlock.c
@@ -0,0 +1,7 @@
+#include "pthread_impl.h"
+
+int pthread_spin_unlock(pthread_spinlock_t *s)
+{
+ a_store(s, 0);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/pthread_testcancel.c b/libc-top-half/musl/src/thread/pthread_testcancel.c
new file mode 100644
index 0000000..d772449
--- /dev/null
+++ b/libc-top-half/musl/src/thread/pthread_testcancel.c
@@ -0,0 +1,14 @@
+#include "pthread_impl.h"
+
+static void dummy()
+{
+}
+
+weak_alias(dummy, __testcancel);
+
+void __pthread_testcancel()
+{
+ __testcancel();
+}
+
+weak_alias(__pthread_testcancel, pthread_testcancel);
diff --git a/libc-top-half/musl/src/thread/riscv64/__set_thread_area.s b/libc-top-half/musl/src/thread/riscv64/__set_thread_area.s
new file mode 100644
index 0000000..828154d
--- /dev/null
+++ b/libc-top-half/musl/src/thread/riscv64/__set_thread_area.s
@@ -0,0 +1,6 @@
+.global __set_thread_area
+.type __set_thread_area, %function
+__set_thread_area:
+ mv tp, a0
+ li a0, 0
+ ret
diff --git a/libc-top-half/musl/src/thread/riscv64/__unmapself.s b/libc-top-half/musl/src/thread/riscv64/__unmapself.s
new file mode 100644
index 0000000..2849119
--- /dev/null
+++ b/libc-top-half/musl/src/thread/riscv64/__unmapself.s
@@ -0,0 +1,7 @@
+.global __unmapself
+.type __unmapself, %function
+__unmapself:
+ li a7, 215 # SYS_munmap
+ ecall
+ li a7, 93 # SYS_exit
+ ecall
diff --git a/libc-top-half/musl/src/thread/riscv64/clone.s b/libc-top-half/musl/src/thread/riscv64/clone.s
new file mode 100644
index 0000000..db90824
--- /dev/null
+++ b/libc-top-half/musl/src/thread/riscv64/clone.s
@@ -0,0 +1,34 @@
+# __clone(func, stack, flags, arg, ptid, tls, ctid)
+# a0, a1, a2, a3, a4, a5, a6
+
+# syscall(SYS_clone, flags, stack, ptid, tls, ctid)
+# a7 a0, a1, a2, a3, a4
+
+.global __clone
+.type __clone, %function
+__clone:
+ # Save func and arg to stack
+ addi a1, a1, -16
+ sd a0, 0(a1)
+ sd a3, 8(a1)
+
+ # Call SYS_clone
+ mv a0, a2
+ mv a2, a4
+ mv a3, a5
+ mv a4, a6
+ li a7, 220 # SYS_clone
+ ecall
+
+ beqz a0, 1f
+ # Parent
+ ret
+
+ # Child
+1: ld a1, 0(sp)
+ ld a0, 8(sp)
+ jalr a1
+
+ # Exit
+ li a7, 93 # SYS_exit
+ ecall
diff --git a/libc-top-half/musl/src/thread/riscv64/syscall_cp.s b/libc-top-half/musl/src/thread/riscv64/syscall_cp.s
new file mode 100644
index 0000000..eeef639
--- /dev/null
+++ b/libc-top-half/musl/src/thread/riscv64/syscall_cp.s
@@ -0,0 +1,29 @@
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm, %function
+__syscall_cp_asm:
+__cp_begin:
+ lw t0, 0(a0)
+ bnez t0, __cp_cancel
+
+ mv t0, a1
+ mv a0, a2
+ mv a1, a3
+ mv a2, a4
+ mv a3, a5
+ mv a4, a6
+ mv a5, a7
+ ld a6, 0(sp)
+ mv a7, t0
+ ecall
+__cp_end:
+ ret
+__cp_cancel:
+ tail __cancel
diff --git a/libc-top-half/musl/src/thread/s390x/__set_thread_area.s b/libc-top-half/musl/src/thread/s390x/__set_thread_area.s
new file mode 100644
index 0000000..00a11e2
--- /dev/null
+++ b/libc-top-half/musl/src/thread/s390x/__set_thread_area.s
@@ -0,0 +1,10 @@
+.text
+.global __set_thread_area
+.hidden __set_thread_area
+.type __set_thread_area, %function
+__set_thread_area:
+ sar %a1, %r2
+ srlg %r2, %r2, 32
+ sar %a0, %r2
+ lghi %r2, 0
+ br %r14
diff --git a/libc-top-half/musl/src/thread/s390x/__tls_get_offset.s b/libc-top-half/musl/src/thread/s390x/__tls_get_offset.s
new file mode 100644
index 0000000..8ee92de
--- /dev/null
+++ b/libc-top-half/musl/src/thread/s390x/__tls_get_offset.s
@@ -0,0 +1,17 @@
+ .global __tls_get_offset
+ .type __tls_get_offset,%function
+__tls_get_offset:
+ stmg %r14, %r15, 112(%r15)
+ aghi %r15, -160
+
+ la %r2, 0(%r2, %r12)
+ brasl %r14, __tls_get_addr
+
+ ear %r1, %a0
+ sllg %r1, %r1, 32
+ ear %r1, %a1
+
+ sgr %r2, %r1
+
+ lmg %r14, %r15, 272(%r15)
+ br %r14
diff --git a/libc-top-half/musl/src/thread/s390x/__unmapself.s b/libc-top-half/musl/src/thread/s390x/__unmapself.s
new file mode 100644
index 0000000..48b312c
--- /dev/null
+++ b/libc-top-half/musl/src/thread/s390x/__unmapself.s
@@ -0,0 +1,6 @@
+.text
+.global __unmapself
+.type __unmapself, @function
+__unmapself:
+ svc 91 # SYS_munmap
+ svc 1 # SYS_exit
diff --git a/libc-top-half/musl/src/thread/s390x/clone.s b/libc-top-half/musl/src/thread/s390x/clone.s
new file mode 100644
index 0000000..2125f20
--- /dev/null
+++ b/libc-top-half/musl/src/thread/s390x/clone.s
@@ -0,0 +1,54 @@
+.text
+.global __clone
+.hidden __clone
+.type __clone, %function
+__clone:
+ # int clone(
+ # fn, a = r2
+ # stack, b = r3
+ # flags, c = r4
+ # arg, d = r5
+ # ptid, e = r6
+ # tls, f = *(r15+160)
+ # ctid) g = *(r15+168)
+ #
+ # pseudo C code:
+ # tid = syscall(SYS_clone,b,c,e,g,f);
+ # if (!tid) syscall(SYS_exit, a(d));
+ # return tid;
+
+ # preserve call-saved register used as syscall arg
+ stg %r6, 48(%r15)
+
+ # create initial stack frame for new thread
+ nill %r3, 0xfff8
+ aghi %r3, -160
+ lghi %r0, 0
+ stg %r0, 0(%r3)
+
+ # save fn and arg to child stack
+ stg %r2, 8(%r3)
+ stg %r5, 16(%r3)
+
+ # shuffle args into correct registers and call SYS_clone
+ lgr %r2, %r3
+ lgr %r3, %r4
+ lgr %r4, %r6
+ lg %r5, 168(%r15)
+ lg %r6, 160(%r15)
+ svc 120
+
+ # restore call-saved register
+ lg %r6, 48(%r15)
+
+ # if error or if we're the parent, return
+ ltgr %r2, %r2
+ bnzr %r14
+
+ # we're the child. call fn(arg)
+ lg %r1, 8(%r15)
+ lg %r2, 16(%r15)
+ basr %r14, %r1
+
+ # call SYS_exit. exit code is already in r2 from fn return value
+ svc 1
diff --git a/libc-top-half/musl/src/thread/s390x/syscall_cp.s b/libc-top-half/musl/src/thread/s390x/syscall_cp.s
new file mode 100644
index 0000000..d094cbf
--- /dev/null
+++ b/libc-top-half/musl/src/thread/s390x/syscall_cp.s
@@ -0,0 +1,34 @@
+ .global __cp_begin
+ .hidden __cp_begin
+ .global __cp_end
+ .hidden __cp_end
+ .global __cp_cancel
+ .hidden __cp_cancel
+ .hidden __cancel
+ .global __syscall_cp_asm
+ .hidden __syscall_cp_asm
+ .text
+ .type __syscall_cp_asm,%function
+__syscall_cp_asm:
+__cp_begin:
+ icm %r2, 15, 0(%r2)
+ jne __cp_cancel
+
+ stg %r6, 48(%r15)
+ stg %r7, 56(%r15)
+ lgr %r1, %r3
+ lgr %r2, %r4
+ lgr %r3, %r5
+ lgr %r4, %r6
+ lg %r5, 160(%r15)
+ lg %r6, 168(%r15)
+ lg %r7, 176(%r15)
+ svc 0
+
+__cp_end:
+ lg %r7, 56(%r15)
+ lg %r6, 48(%r15)
+ br %r14
+
+__cp_cancel:
+ jg __cancel
diff --git a/libc-top-half/musl/src/thread/sem_destroy.c b/libc-top-half/musl/src/thread/sem_destroy.c
new file mode 100644
index 0000000..f4aced5
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sem_destroy.c
@@ -0,0 +1,6 @@
+#include <semaphore.h>
+
+int sem_destroy(sem_t *sem)
+{
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/sem_getvalue.c b/libc-top-half/musl/src/thread/sem_getvalue.c
new file mode 100644
index 0000000..d9d8307
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sem_getvalue.c
@@ -0,0 +1,8 @@
+#include <semaphore.h>
+
+int sem_getvalue(sem_t *restrict sem, int *restrict valp)
+{
+ int val = sem->__val[0];
+ *valp = val < 0 ? 0 : val;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/sem_init.c b/libc-top-half/musl/src/thread/sem_init.c
new file mode 100644
index 0000000..5509243
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sem_init.c
@@ -0,0 +1,15 @@
+#include <semaphore.h>
+#include <limits.h>
+#include <errno.h>
+
+int sem_init(sem_t *sem, int pshared, unsigned value)
+{
+ if (value > SEM_VALUE_MAX) {
+ errno = EINVAL;
+ return -1;
+ }
+ sem->__val[0] = value;
+ sem->__val[1] = 0;
+ sem->__val[2] = pshared ? 0 : 128;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/sem_open.c b/libc-top-half/musl/src/thread/sem_open.c
new file mode 100644
index 0000000..0ad29de
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sem_open.c
@@ -0,0 +1,182 @@
+#include <semaphore.h>
+#include <sys/mman.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <time.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include "lock.h"
+#include "fork_impl.h"
+
+#define malloc __libc_malloc
+#define calloc __libc_calloc
+#define realloc undef
+#define free undef
+
+static struct {
+ ino_t ino;
+ sem_t *sem;
+ int refcnt;
+} *semtab;
+static volatile int lock[1];
+volatile int *const __sem_open_lockptr = lock;
+
+#define FLAGS (O_RDWR|O_NOFOLLOW|O_CLOEXEC|O_NONBLOCK)
+
+sem_t *sem_open(const char *name, int flags, ...)
+{
+ va_list ap;
+ mode_t mode;
+ unsigned value;
+ int fd, i, e, slot, first=1, cnt, cs;
+ sem_t newsem;
+ void *map;
+ char tmp[64];
+ struct timespec ts;
+ struct stat st;
+ char buf[NAME_MAX+10];
+
+ if (!(name = __shm_mapname(name, buf)))
+ return SEM_FAILED;
+
+ LOCK(lock);
+ /* Allocate table if we don't have one yet */
+ if (!semtab && !(semtab = calloc(sizeof *semtab, SEM_NSEMS_MAX))) {
+ UNLOCK(lock);
+ return SEM_FAILED;
+ }
+
+ /* Reserve a slot in case this semaphore is not mapped yet;
+ * this is necessary because there is no way to handle
+ * failures after creation of the file. */
+ slot = -1;
+ for (cnt=i=0; i<SEM_NSEMS_MAX; i++) {
+ cnt += semtab[i].refcnt;
+ if (!semtab[i].sem && slot < 0) slot = i;
+ }
+ /* Avoid possibility of overflow later */
+ if (cnt == INT_MAX || slot < 0) {
+ errno = EMFILE;
+ UNLOCK(lock);
+ return SEM_FAILED;
+ }
+ /* Dummy pointer to make a reservation */
+ semtab[slot].sem = (sem_t *)-1;
+ UNLOCK(lock);
+
+ flags &= (O_CREAT|O_EXCL);
+
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
+ /* Early failure check for exclusive open; otherwise the case
+ * where the semaphore already exists is expensive. */
+ if (flags == (O_CREAT|O_EXCL) && access(name, F_OK) == 0) {
+ errno = EEXIST;
+ goto fail;
+ }
+
+ for (;;) {
+ /* If exclusive mode is not requested, try opening an
+ * existing file first and fall back to creation. */
+ if (flags != (O_CREAT|O_EXCL)) {
+ fd = open(name, FLAGS);
+ if (fd >= 0) {
+ if (fstat(fd, &st) < 0 ||
+ (map = mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) {
+ close(fd);
+ goto fail;
+ }
+ close(fd);
+ break;
+ }
+ if (errno != ENOENT)
+ goto fail;
+ }
+ if (!(flags & O_CREAT))
+ goto fail;
+ if (first) {
+ first = 0;
+ va_start(ap, flags);
+ mode = va_arg(ap, mode_t) & 0666;
+ value = va_arg(ap, unsigned);
+ va_end(ap);
+ if (value > SEM_VALUE_MAX) {
+ errno = EINVAL;
+ goto fail;
+ }
+ sem_init(&newsem, 1, value);
+ }
+ /* Create a temp file with the new semaphore contents
+ * and attempt to atomically link it as the new name */
+ clock_gettime(CLOCK_REALTIME, &ts);
+ snprintf(tmp, sizeof(tmp), "/dev/shm/tmp-%d", (int)ts.tv_nsec);
+ fd = open(tmp, O_CREAT|O_EXCL|FLAGS, mode);
+ if (fd < 0) {
+ if (errno == EEXIST) continue;
+ goto fail;
+ }
+ if (write(fd, &newsem, sizeof newsem) != sizeof newsem || fstat(fd, &st) < 0 ||
+ (map = mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) {
+ close(fd);
+ unlink(tmp);
+ goto fail;
+ }
+ close(fd);
+ e = link(tmp, name) ? errno : 0;
+ unlink(tmp);
+ if (!e) break;
+ munmap(map, sizeof(sem_t));
+ /* Failure is only fatal when doing an exclusive open;
+ * otherwise, next iteration will try to open the
+ * existing file. */
+ if (e != EEXIST || flags == (O_CREAT|O_EXCL))
+ goto fail;
+ }
+
+ /* See if the newly mapped semaphore is already mapped. If
+ * so, unmap the new mapping and use the existing one. Otherwise,
+ * add it to the table of mapped semaphores. */
+ LOCK(lock);
+ for (i=0; i<SEM_NSEMS_MAX && semtab[i].ino != st.st_ino; i++);
+ if (i<SEM_NSEMS_MAX) {
+ munmap(map, sizeof(sem_t));
+ semtab[slot].sem = 0;
+ slot = i;
+ map = semtab[i].sem;
+ }
+ semtab[slot].refcnt++;
+ semtab[slot].sem = map;
+ semtab[slot].ino = st.st_ino;
+ UNLOCK(lock);
+ pthread_setcancelstate(cs, 0);
+ return map;
+
+fail:
+ pthread_setcancelstate(cs, 0);
+ LOCK(lock);
+ semtab[slot].sem = 0;
+ UNLOCK(lock);
+ return SEM_FAILED;
+}
+
+int sem_close(sem_t *sem)
+{
+ int i;
+ LOCK(lock);
+ for (i=0; i<SEM_NSEMS_MAX && semtab[i].sem != sem; i++);
+ if (--semtab[i].refcnt) {
+ UNLOCK(lock);
+ return 0;
+ }
+ semtab[i].sem = 0;
+ semtab[i].ino = 0;
+ UNLOCK(lock);
+ munmap(sem, sizeof *sem);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/sem_post.c b/libc-top-half/musl/src/thread/sem_post.c
new file mode 100644
index 0000000..31e3293
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sem_post.c
@@ -0,0 +1,17 @@
+#include <semaphore.h>
+#include "pthread_impl.h"
+
+int sem_post(sem_t *sem)
+{
+ int val, waiters, priv = sem->__val[2];
+ do {
+ val = sem->__val[0];
+ waiters = sem->__val[1];
+ if (val == SEM_VALUE_MAX) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ } while (a_cas(sem->__val, val, val+1+(val<0)) != val);
+ if (val<0 || waiters) __wake(sem->__val, 1, priv);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/sem_timedwait.c b/libc-top-half/musl/src/thread/sem_timedwait.c
new file mode 100644
index 0000000..58d3ebf
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sem_timedwait.c
@@ -0,0 +1,31 @@
+#include <semaphore.h>
+#include "pthread_impl.h"
+
+static void cleanup(void *p)
+{
+ a_dec(p);
+}
+
+int sem_timedwait(sem_t *restrict sem, const struct timespec *restrict at)
+{
+ pthread_testcancel();
+
+ if (!sem_trywait(sem)) return 0;
+
+ int spins = 100;
+ while (spins-- && sem->__val[0] <= 0 && !sem->__val[1]) a_spin();
+
+ while (sem_trywait(sem)) {
+ int r;
+ a_inc(sem->__val+1);
+ a_cas(sem->__val, 0, -1);
+ pthread_cleanup_push(cleanup, (void *)(sem->__val+1));
+ r = __timedwait_cp(sem->__val, -1, CLOCK_REALTIME, at, sem->__val[2]);
+ pthread_cleanup_pop(1);
+ if (r) {
+ errno = r;
+ return -1;
+ }
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/sem_trywait.c b/libc-top-half/musl/src/thread/sem_trywait.c
new file mode 100644
index 0000000..04edf46
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sem_trywait.c
@@ -0,0 +1,13 @@
+#include <semaphore.h>
+#include "pthread_impl.h"
+
+int sem_trywait(sem_t *sem)
+{
+ int val;
+ while ((val=sem->__val[0]) > 0) {
+ int new = val-1-(val==1 && sem->__val[1]);
+ if (a_cas(sem->__val, val, new)==val) return 0;
+ }
+ errno = EAGAIN;
+ return -1;
+}
diff --git a/libc-top-half/musl/src/thread/sem_unlink.c b/libc-top-half/musl/src/thread/sem_unlink.c
new file mode 100644
index 0000000..c06134b
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sem_unlink.c
@@ -0,0 +1,7 @@
+#include <semaphore.h>
+#include <sys/mman.h>
+
+int sem_unlink(const char *name)
+{
+ return shm_unlink(name);
+}
diff --git a/libc-top-half/musl/src/thread/sem_wait.c b/libc-top-half/musl/src/thread/sem_wait.c
new file mode 100644
index 0000000..264194f
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sem_wait.c
@@ -0,0 +1,6 @@
+#include <semaphore.h>
+
+int sem_wait(sem_t *sem)
+{
+ return sem_timedwait(sem, 0);
+}
diff --git a/libc-top-half/musl/src/thread/sh/__set_thread_area.c b/libc-top-half/musl/src/thread/sh/__set_thread_area.c
new file mode 100644
index 0000000..34264bd
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sh/__set_thread_area.c
@@ -0,0 +1,37 @@
+#include "pthread_impl.h"
+#include "libc.h"
+#include <elf.h>
+
+/* Also perform sh-specific init */
+
+#define CPU_HAS_LLSC 0x0040
+#define CPU_HAS_CAS_L 0x0400
+
+extern hidden const char __sh_cas_gusa[], __sh_cas_llsc[], __sh_cas_imask[], __sh_cas_cas_l[];
+
+hidden const void *__sh_cas_ptr;
+
+hidden unsigned __sh_nommu;
+
+int __set_thread_area(void *p)
+{
+ size_t *aux;
+ __asm__ __volatile__ ( "ldc %0, gbr" : : "r"(p) : "memory" );
+#ifndef __SH4A__
+ __sh_cas_ptr = __sh_cas_gusa;
+#if !defined(__SH3__) && !defined(__SH4__)
+ for (aux=libc.auxv; *aux; aux+=2) {
+ if (*aux != AT_PLATFORM) continue;
+ const char *s = (void *)aux[1];
+ if (s[0]!='s' || s[1]!='h' || s[2]!='2' || s[3]-'0'<10u) break;
+ __sh_cas_ptr = __sh_cas_imask;
+ __sh_nommu = 1;
+ }
+#endif
+ if (__hwcap & CPU_HAS_CAS_L)
+ __sh_cas_ptr = __sh_cas_cas_l;
+ else if (__hwcap & CPU_HAS_LLSC)
+ __sh_cas_ptr = __sh_cas_llsc;
+#endif
+ return 0;
+}
diff --git a/libc-top-half/musl/src/thread/sh/__unmapself.c b/libc-top-half/musl/src/thread/sh/__unmapself.c
new file mode 100644
index 0000000..35fb3c9
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sh/__unmapself.c
@@ -0,0 +1,24 @@
+#include "pthread_impl.h"
+
+hidden void __unmapself_sh_mmu(void *, size_t);
+hidden void __unmapself_sh_nommu(void *, size_t);
+
+#if !defined(__SH3__) && !defined(__SH4__)
+#define __unmapself __unmapself_sh_nommu
+#include "dynlink.h"
+#undef CRTJMP
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+ "mov.l @%0+,r0 ; mov.l @%0,r12 ; jmp @r0 ; mov %1,r15" \
+ : : "r"(pc), "r"(sp) : "r0", "memory" )
+#include "../__unmapself.c"
+#undef __unmapself
+extern hidden unsigned __sh_nommu;
+#else
+#define __sh_nommu 0
+#endif
+
+void __unmapself(void *base, size_t size)
+{
+ if (__sh_nommu) __unmapself_sh_nommu(base, size);
+ else __unmapself_sh_mmu(base, size);
+}
diff --git a/libc-top-half/musl/src/thread/sh/__unmapself_mmu.s b/libc-top-half/musl/src/thread/sh/__unmapself_mmu.s
new file mode 100644
index 0000000..688087b
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sh/__unmapself_mmu.s
@@ -0,0 +1,23 @@
+.text
+.global __unmapself_sh_mmu
+.hidden __unmapself_sh_mmu
+.type __unmapself_sh_mmu, @function
+__unmapself_sh_mmu:
+ mov #91, r3 ! SYS_munmap
+ trapa #31
+
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+
+ mov #1, r3 ! SYS_exit
+ mov #0, r4
+ trapa #31
+
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
diff --git a/libc-top-half/musl/src/thread/sh/atomics.s b/libc-top-half/musl/src/thread/sh/atomics.s
new file mode 100644
index 0000000..9d9fcb6
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sh/atomics.s
@@ -0,0 +1,65 @@
+/* Contract for all versions is same as cas.l r2,r3,@r0
+ * pr and r1 are also clobbered (by jsr & r1 as temp).
+ * r0,r2,r4-r15 must be preserved.
+ * r3 contains result (==r2 iff cas succeeded). */
+
+ .align 2
+.global __sh_cas_gusa
+.hidden __sh_cas_gusa
+__sh_cas_gusa:
+ mov.l r5,@-r15
+ mov.l r4,@-r15
+ mov r0,r4
+ mova 1f,r0
+ mov r15,r1
+ mov #(0f-1f),r15
+0: mov.l @r4,r5
+ cmp/eq r5,r2
+ bf 1f
+ mov.l r3,@r4
+1: mov r1,r15
+ mov r5,r3
+ mov r4,r0
+ mov.l @r15+,r4
+ rts
+ mov.l @r15+,r5
+
+.global __sh_cas_llsc
+.hidden __sh_cas_llsc
+__sh_cas_llsc:
+ mov r0,r1
+ .word 0x00ab /* synco */
+0: .word 0x0163 /* movli.l @r1,r0 */
+ cmp/eq r0,r2
+ bf 1f
+ mov r3,r0
+ .word 0x0173 /* movco.l r0,@r1 */
+ bf 0b
+ mov r2,r0
+1: .word 0x00ab /* synco */
+ mov r0,r3
+ rts
+ mov r1,r0
+
+.global __sh_cas_imask
+.hidden __sh_cas_imask
+__sh_cas_imask:
+ mov r0,r1
+ stc sr,r0
+ mov.l r0,@-r15
+ or #0xf0,r0
+ ldc r0,sr
+ mov.l @r1,r0
+ cmp/eq r0,r2
+ bf 1f
+ mov.l r3,@r1
+1: ldc.l @r15+,sr
+ mov r0,r3
+ rts
+ mov r1,r0
+
+.global __sh_cas_cas_l
+.hidden __sh_cas_cas_l
+__sh_cas_cas_l:
+ rts
+ .word 0x2323 /* cas.l r2,r3,@r0 */
diff --git a/libc-top-half/musl/src/thread/sh/clone.s b/libc-top-half/musl/src/thread/sh/clone.s
new file mode 100644
index 0000000..9cfd862
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sh/clone.s
@@ -0,0 +1,54 @@
+.text
+.global __clone
+.hidden __clone
+.type __clone, @function
+__clone:
+! incoming: fn stack flags arg ptid tls ctid
+! r4 r5 r6 r7 @r15 @(4,r15) @(8,r15)
+
+ mov #-16, r0
+ and r0, r5
+
+ mov r4, r1 ! r1 = fn
+ mov r7, r2 ! r2 = arg
+
+ mov #120, r3 ! r3 = __NR_clone
+ mov r6, r4 ! r4 = flags
+ !mov r5, r5 ! r5 = stack
+ mov.l @r15, r6 ! r6 = ptid
+ mov.l @(8,r15), r7 ! r7 = ctid
+ mov.l @(4,r15), r0 ! r0 = tls
+ trapa #31
+
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+
+ cmp/eq #0, r0
+ bt 1f
+
+ ! we are the parent, return
+ rts
+ nop
+
+1: ! we are the child, call fn(arg)
+ mov.l 1f, r0
+ mov r1, r5
+ bsrf r0
+ mov r2, r4
+
+2: mov #1, r3 ! __NR_exit
+ mov r0, r4
+ trapa #31
+
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+
+.align 2
+.hidden __shcall
+1: .long __shcall@PCREL+(.-2b)
diff --git a/libc-top-half/musl/src/thread/sh/syscall_cp.s b/libc-top-half/musl/src/thread/sh/syscall_cp.s
new file mode 100644
index 0000000..bb848ef
--- /dev/null
+++ b/libc-top-half/musl/src/thread/sh/syscall_cp.s
@@ -0,0 +1,45 @@
+.text
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm, @function
+__syscall_cp_asm:
+
+__cp_begin:
+ mov.l @r4, r4
+ tst r4, r4
+ bf __cp_cancel
+ mov r5, r3
+ mov r6, r4
+ mov r7, r5
+ mov.l @r15, r6
+ mov.l @(4,r15), r7
+ mov.l @(8,r15), r0
+ mov.l @(12,r15), r1
+ trapa #31
+
+__cp_end:
+ ! work around hardware bug
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+
+ rts
+ nop
+
+__cp_cancel:
+ mov.l 2f, r0
+ braf r0
+ nop
+1:
+
+.align 2
+2: .long __cancel@PCREL-(1b-.)
diff --git a/libc-top-half/musl/src/thread/synccall.c b/libc-top-half/musl/src/thread/synccall.c
new file mode 100644
index 0000000..d58c851
--- /dev/null
+++ b/libc-top-half/musl/src/thread/synccall.c
@@ -0,0 +1,120 @@
+#include "pthread_impl.h"
+#include <semaphore.h>
+#include <string.h>
+
+static void dummy_0(void)
+{
+}
+
+weak_alias(dummy_0, __tl_lock);
+weak_alias(dummy_0, __tl_unlock);
+
+static int target_tid;
+static void (*callback)(void *), *context;
+static sem_t target_sem, caller_sem;
+
+static void dummy(void *p)
+{
+}
+
+static void handler(int sig)
+{
+ if (__pthread_self()->tid != target_tid) return;
+
+ int old_errno = errno;
+
+ /* Inform caller we have received signal and wait for
+ * the caller to let us make the callback. */
+ sem_post(&caller_sem);
+ sem_wait(&target_sem);
+
+ callback(context);
+
+ /* Inform caller we've complered the callback and wait
+ * for the caller to release us to return. */
+ sem_post(&caller_sem);
+ sem_wait(&target_sem);
+
+ /* Inform caller we are returning and state is destroyable. */
+ sem_post(&caller_sem);
+
+ errno = old_errno;
+}
+
+void __synccall(void (*func)(void *), void *ctx)
+{
+ sigset_t oldmask;
+ int cs, i, r;
+ struct sigaction sa = { .sa_flags = SA_RESTART, .sa_handler = handler };
+ pthread_t self = __pthread_self(), td;
+ int count = 0;
+
+ /* Blocking signals in two steps, first only app-level signals
+ * before taking the lock, then all signals after taking the lock,
+ * is necessary to achieve AS-safety. Blocking them all first would
+ * deadlock if multiple threads called __synccall. Waiting to block
+ * any until after the lock would allow re-entry in the same thread
+ * with the lock already held. */
+ __block_app_sigs(&oldmask);
+ __tl_lock();
+ __block_all_sigs(0);
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
+ sem_init(&target_sem, 0, 0);
+ sem_init(&caller_sem, 0, 0);
+
+ if (!libc.threads_minus_1 || __syscall(SYS_gettid) != self->tid)
+ goto single_threaded;
+
+ callback = func;
+ context = ctx;
+
+ /* Block even implementation-internal signals, so that nothing
+ * interrupts the SIGSYNCCALL handlers. The main possible source
+ * of trouble is asynchronous cancellation. */
+ memset(&sa.sa_mask, -1, sizeof sa.sa_mask);
+ __libc_sigaction(SIGSYNCCALL, &sa, 0);
+
+
+ for (td=self->next; td!=self; td=td->next) {
+ target_tid = td->tid;
+ while ((r = -__syscall(SYS_tkill, td->tid, SIGSYNCCALL)) == EAGAIN);
+ if (r) {
+ /* If we failed to signal any thread, nop out the
+ * callback to abort the synccall and just release
+ * any threads already caught. */
+ callback = func = dummy;
+ break;
+ }
+ sem_wait(&caller_sem);
+ count++;
+ }
+ target_tid = 0;
+
+ /* Serialize execution of callback in caught threads, or just
+ * release them all if synccall is being aborted. */
+ for (i=0; i<count; i++) {
+ sem_post(&target_sem);
+ sem_wait(&caller_sem);
+ }
+
+ sa.sa_handler = SIG_IGN;
+ __libc_sigaction(SIGSYNCCALL, &sa, 0);
+
+single_threaded:
+ func(ctx);
+
+ /* Only release the caught threads once all threads, including the
+ * caller, have returned from the callback function. */
+ for (i=0; i<count; i++)
+ sem_post(&target_sem);
+ for (i=0; i<count; i++)
+ sem_wait(&caller_sem);
+
+ sem_destroy(&caller_sem);
+ sem_destroy(&target_sem);
+
+ pthread_setcancelstate(cs, 0);
+ __tl_unlock();
+ __restore_sigs(&oldmask);
+}
diff --git a/libc-top-half/musl/src/thread/syscall_cp.c b/libc-top-half/musl/src/thread/syscall_cp.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/src/thread/syscall_cp.c
diff --git a/libc-top-half/musl/src/thread/thrd_create.c b/libc-top-half/musl/src/thread/thrd_create.c
new file mode 100644
index 0000000..76a683d
--- /dev/null
+++ b/libc-top-half/musl/src/thread/thrd_create.c
@@ -0,0 +1,12 @@
+#include "pthread_impl.h"
+#include <threads.h>
+
+int thrd_create(thrd_t *thr, thrd_start_t func, void *arg)
+{
+ int ret = __pthread_create(thr, __ATTRP_C11_THREAD, (void *(*)(void *))func, arg);
+ switch (ret) {
+ case 0: return thrd_success;
+ case EAGAIN: return thrd_nomem;
+ default: return thrd_error;
+ }
+}
diff --git a/libc-top-half/musl/src/thread/thrd_exit.c b/libc-top-half/musl/src/thread/thrd_exit.c
new file mode 100644
index 0000000..9b291ae
--- /dev/null
+++ b/libc-top-half/musl/src/thread/thrd_exit.c
@@ -0,0 +1,8 @@
+#include <threads.h>
+#include <pthread.h>
+#include <stdint.h>
+
+_Noreturn void thrd_exit(int result)
+{
+ __pthread_exit((void*)(intptr_t)result);
+}
diff --git a/libc-top-half/musl/src/thread/thrd_join.c b/libc-top-half/musl/src/thread/thrd_join.c
new file mode 100644
index 0000000..0d5fd30
--- /dev/null
+++ b/libc-top-half/musl/src/thread/thrd_join.c
@@ -0,0 +1,11 @@
+#include <stdint.h>
+#include <threads.h>
+#include <pthread.h>
+
+int thrd_join(thrd_t t, int *res)
+{
+ void *pthread_res;
+ __pthread_join(t, &pthread_res);
+ if (res) *res = (int)(intptr_t)pthread_res;
+ return thrd_success;
+}
diff --git a/libc-top-half/musl/src/thread/thrd_sleep.c b/libc-top-half/musl/src/thread/thrd_sleep.c
new file mode 100644
index 0000000..97de534
--- /dev/null
+++ b/libc-top-half/musl/src/thread/thrd_sleep.c
@@ -0,0 +1,14 @@
+#include <threads.h>
+#include <time.h>
+#include <errno.h>
+#include "syscall.h"
+
+int thrd_sleep(const struct timespec *req, struct timespec *rem)
+{
+ int ret = -__clock_nanosleep(CLOCK_REALTIME, 0, req, rem);
+ switch (ret) {
+ case 0: return 0;
+ case -EINTR: return -1; /* value specified by C11 */
+ default: return -2;
+ }
+}
diff --git a/libc-top-half/musl/src/thread/thrd_yield.c b/libc-top-half/musl/src/thread/thrd_yield.c
new file mode 100644
index 0000000..f7ad132
--- /dev/null
+++ b/libc-top-half/musl/src/thread/thrd_yield.c
@@ -0,0 +1,7 @@
+#include <threads.h>
+#include "syscall.h"
+
+void thrd_yield()
+{
+ __syscall(SYS_sched_yield);
+}
diff --git a/libc-top-half/musl/src/thread/tls.c b/libc-top-half/musl/src/thread/tls.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libc-top-half/musl/src/thread/tls.c
diff --git a/libc-top-half/musl/src/thread/tss_create.c b/libc-top-half/musl/src/thread/tss_create.c
new file mode 100644
index 0000000..6d6ef96
--- /dev/null
+++ b/libc-top-half/musl/src/thread/tss_create.c
@@ -0,0 +1,10 @@
+#include <threads.h>
+#include <pthread.h>
+
+int tss_create(tss_t *tss, tss_dtor_t dtor)
+{
+ /* Different error returns are possible. C glues them together into
+ * just failure notification. Can't be optimized to a tail call,
+ * unless thrd_error equals EAGAIN. */
+ return __pthread_key_create(tss, dtor) ? thrd_error : thrd_success;
+}
diff --git a/libc-top-half/musl/src/thread/tss_delete.c b/libc-top-half/musl/src/thread/tss_delete.c
new file mode 100644
index 0000000..6f51b07
--- /dev/null
+++ b/libc-top-half/musl/src/thread/tss_delete.c
@@ -0,0 +1,7 @@
+#include <threads.h>
+#include <pthread.h>
+
+void tss_delete(tss_t key)
+{
+ __pthread_key_delete(key);
+}
diff --git a/libc-top-half/musl/src/thread/tss_set.c b/libc-top-half/musl/src/thread/tss_set.c
new file mode 100644
index 0000000..70c4fb7
--- /dev/null
+++ b/libc-top-half/musl/src/thread/tss_set.c
@@ -0,0 +1,13 @@
+#include "pthread_impl.h"
+#include <threads.h>
+
+int tss_set(tss_t k, void *x)
+{
+ struct pthread *self = __pthread_self();
+ /* Avoid unnecessary COW */
+ if (self->tsd[k] != x) {
+ self->tsd[k] = x;
+ self->tsd_used = 1;
+ }
+ return thrd_success;
+}
diff --git a/libc-top-half/musl/src/thread/vmlock.c b/libc-top-half/musl/src/thread/vmlock.c
new file mode 100644
index 0000000..fa0a8e3
--- /dev/null
+++ b/libc-top-half/musl/src/thread/vmlock.c
@@ -0,0 +1,23 @@
+#include "pthread_impl.h"
+#include "fork_impl.h"
+
+static volatile int vmlock[2];
+volatile int *const __vmlock_lockptr = vmlock;
+
+void __vm_wait()
+{
+ int tmp;
+ while ((tmp=vmlock[0]))
+ __wait(vmlock, vmlock+1, tmp, 1);
+}
+
+void __vm_lock()
+{
+ a_inc(vmlock);
+}
+
+void __vm_unlock()
+{
+ if (a_fetch_add(vmlock, -1)==1 && vmlock[1])
+ __wake(vmlock, -1, 1);
+}
diff --git a/libc-top-half/musl/src/thread/x32/__set_thread_area.s b/libc-top-half/musl/src/thread/x32/__set_thread_area.s
new file mode 100644
index 0000000..c0fee87
--- /dev/null
+++ b/libc-top-half/musl/src/thread/x32/__set_thread_area.s
@@ -0,0 +1,11 @@
+/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
+.text
+.global __set_thread_area
+.hidden __set_thread_area
+.type __set_thread_area,@function
+__set_thread_area:
+ mov %edi,%esi /* shift for syscall */
+ movl $0x1002,%edi /* SET_FS register */
+ movl $0x4000009e,%eax /* set fs segment to */
+ syscall /* arch_prctl(SET_FS, arg)*/
+ ret
diff --git a/libc-top-half/musl/src/thread/x32/__unmapself.s b/libc-top-half/musl/src/thread/x32/__unmapself.s
new file mode 100644
index 0000000..d925460
--- /dev/null
+++ b/libc-top-half/musl/src/thread/x32/__unmapself.s
@@ -0,0 +1,10 @@
+/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
+.text
+.global __unmapself
+.type __unmapself,@function
+__unmapself:
+ movl $0x4000000b,%eax /* SYS_munmap */
+ syscall /* munmap(arg2,arg3) */
+ xor %rdi,%rdi /* exit() args: always return success */
+ movl $0x4000003c,%eax /* SYS_exit */
+ syscall /* exit(0) */
diff --git a/libc-top-half/musl/src/thread/x32/clone.s b/libc-top-half/musl/src/thread/x32/clone.s
new file mode 100644
index 0000000..b870880
--- /dev/null
+++ b/libc-top-half/musl/src/thread/x32/clone.s
@@ -0,0 +1,26 @@
+.text
+.global __clone
+.hidden __clone
+.type __clone,@function
+__clone:
+ movl $0x40000038,%eax /* SYS_clone */
+ mov %rdi,%r11
+ mov %rdx,%rdi
+ mov %r8,%rdx
+ mov %r9,%r8
+ mov 8(%rsp),%r10
+ mov %r11,%r9
+ and $-16,%rsi
+ sub $8,%rsi
+ mov %rcx,(%rsi)
+ syscall
+ test %eax,%eax
+ jnz 1f
+ xor %ebp,%ebp
+ pop %rdi
+ call *%r9
+ mov %eax,%edi
+ movl $0x4000003c,%eax /* SYS_exit */
+ syscall
+ hlt
+1: ret
diff --git a/libc-top-half/musl/src/thread/x32/syscall_cp.s b/libc-top-half/musl/src/thread/x32/syscall_cp.s
new file mode 100644
index 0000000..4f10171
--- /dev/null
+++ b/libc-top-half/musl/src/thread/x32/syscall_cp.s
@@ -0,0 +1,31 @@
+.text
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm,@function
+__syscall_cp_asm:
+
+__cp_begin:
+ mov (%rdi),%eax
+ test %eax,%eax
+ jnz __cp_cancel
+ mov %rdi,%r11
+ mov %rsi,%rax
+ mov %rdx,%rdi
+ mov %rcx,%rsi
+ mov %r8,%rdx
+ mov %r9,%r10
+ mov 8(%rsp),%r8
+ mov 16(%rsp),%r9
+ mov %r11,8(%rsp)
+ syscall
+__cp_end:
+ ret
+__cp_cancel:
+ jmp __cancel
diff --git a/libc-top-half/musl/src/thread/x86_64/__set_thread_area.s b/libc-top-half/musl/src/thread/x86_64/__set_thread_area.s
new file mode 100644
index 0000000..7347ff4
--- /dev/null
+++ b/libc-top-half/musl/src/thread/x86_64/__set_thread_area.s
@@ -0,0 +1,11 @@
+/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
+.text
+.global __set_thread_area
+.hidden __set_thread_area
+.type __set_thread_area,@function
+__set_thread_area:
+ mov %rdi,%rsi /* shift for syscall */
+ movl $0x1002,%edi /* SET_FS register */
+ movl $158,%eax /* set fs segment to */
+ syscall /* arch_prctl(SET_FS, arg)*/
+ ret
diff --git a/libc-top-half/musl/src/thread/x86_64/__unmapself.s b/libc-top-half/musl/src/thread/x86_64/__unmapself.s
new file mode 100644
index 0000000..e2689e6
--- /dev/null
+++ b/libc-top-half/musl/src/thread/x86_64/__unmapself.s
@@ -0,0 +1,10 @@
+/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
+.text
+.global __unmapself
+.type __unmapself,@function
+__unmapself:
+ movl $11,%eax /* SYS_munmap */
+ syscall /* munmap(arg2,arg3) */
+ xor %rdi,%rdi /* exit() args: always return success */
+ movl $60,%eax /* SYS_exit */
+ syscall /* exit(0) */
diff --git a/libc-top-half/musl/src/thread/x86_64/clone.s b/libc-top-half/musl/src/thread/x86_64/clone.s
new file mode 100644
index 0000000..6e47bc0
--- /dev/null
+++ b/libc-top-half/musl/src/thread/x86_64/clone.s
@@ -0,0 +1,28 @@
+.text
+.global __clone
+.hidden __clone
+.type __clone,@function
+__clone:
+ xor %eax,%eax
+ mov $56,%al
+ mov %rdi,%r11
+ mov %rdx,%rdi
+ mov %r8,%rdx
+ mov %r9,%r8
+ mov 8(%rsp),%r10
+ mov %r11,%r9
+ and $-16,%rsi
+ sub $8,%rsi
+ mov %rcx,(%rsi)
+ syscall
+ test %eax,%eax
+ jnz 1f
+ xor %ebp,%ebp
+ pop %rdi
+ call *%r9
+ mov %eax,%edi
+ xor %eax,%eax
+ mov $60,%al
+ syscall
+ hlt
+1: ret
diff --git a/libc-top-half/musl/src/thread/x86_64/syscall_cp.s b/libc-top-half/musl/src/thread/x86_64/syscall_cp.s
new file mode 100644
index 0000000..4f10171
--- /dev/null
+++ b/libc-top-half/musl/src/thread/x86_64/syscall_cp.s
@@ -0,0 +1,31 @@
+.text
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type __syscall_cp_asm,@function
+__syscall_cp_asm:
+
+__cp_begin:
+ mov (%rdi),%eax
+ test %eax,%eax
+ jnz __cp_cancel
+ mov %rdi,%r11
+ mov %rsi,%rax
+ mov %rdx,%rdi
+ mov %rcx,%rsi
+ mov %r8,%rdx
+ mov %r9,%r10
+ mov 8(%rsp),%r8
+ mov 16(%rsp),%r9
+ mov %r11,8(%rsp)
+ syscall
+__cp_end:
+ ret
+__cp_cancel:
+ jmp __cancel
diff --git a/libc-top-half/musl/src/time/__map_file.c b/libc-top-half/musl/src/time/__map_file.c
new file mode 100644
index 0000000..d3cefa8
--- /dev/null
+++ b/libc-top-half/musl/src/time/__map_file.c
@@ -0,0 +1,19 @@
+#include <sys/mman.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include "syscall.h"
+#include "kstat.h"
+
+const char unsigned *__map_file(const char *pathname, size_t *size)
+{
+ struct kstat st;
+ const unsigned char *map = MAP_FAILED;
+ int fd = sys_open(pathname, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
+ if (fd < 0) return 0;
+ if (!syscall(SYS_fstat, fd, &st)) {
+ map = __mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
+ *size = st.st_size;
+ }
+ __syscall(SYS_close, fd);
+ return map == MAP_FAILED ? 0 : map;
+}
diff --git a/libc-top-half/musl/src/time/__month_to_secs.c b/libc-top-half/musl/src/time/__month_to_secs.c
new file mode 100644
index 0000000..43248fb
--- /dev/null
+++ b/libc-top-half/musl/src/time/__month_to_secs.c
@@ -0,0 +1,10 @@
+int __month_to_secs(int month, int is_leap)
+{
+ static const int secs_through_month[] = {
+ 0, 31*86400, 59*86400, 90*86400,
+ 120*86400, 151*86400, 181*86400, 212*86400,
+ 243*86400, 273*86400, 304*86400, 334*86400 };
+ int t = secs_through_month[month];
+ if (is_leap && month >= 2) t+=86400;
+ return t;
+}
diff --git a/libc-top-half/musl/src/time/__secs_to_tm.c b/libc-top-half/musl/src/time/__secs_to_tm.c
new file mode 100644
index 0000000..093d902
--- /dev/null
+++ b/libc-top-half/musl/src/time/__secs_to_tm.c
@@ -0,0 +1,82 @@
+#include "time_impl.h"
+#include <limits.h>
+
+/* 2000-03-01 (mod 400 year, immediately after feb29 */
+#define LEAPOCH (946684800LL + 86400*(31+29))
+
+#define DAYS_PER_400Y (365*400 + 97)
+#define DAYS_PER_100Y (365*100 + 24)
+#define DAYS_PER_4Y (365*4 + 1)
+
+int __secs_to_tm(long long t, struct tm *tm)
+{
+ long long days, secs, years;
+ int remdays, remsecs, remyears;
+ int qc_cycles, c_cycles, q_cycles;
+ int months;
+ int wday, yday, leap;
+ static const char days_in_month[] = {31,30,31,30,31,31,30,31,30,31,31,29};
+
+ /* Reject time_t values whose year would overflow int */
+ if (t < INT_MIN * 31622400LL || t > INT_MAX * 31622400LL)
+ return -1;
+
+ secs = t - LEAPOCH;
+ days = secs / 86400;
+ remsecs = secs % 86400;
+ if (remsecs < 0) {
+ remsecs += 86400;
+ days--;
+ }
+
+ wday = (3+days)%7;
+ if (wday < 0) wday += 7;
+
+ qc_cycles = days / DAYS_PER_400Y;
+ remdays = days % DAYS_PER_400Y;
+ if (remdays < 0) {
+ remdays += DAYS_PER_400Y;
+ qc_cycles--;
+ }
+
+ c_cycles = remdays / DAYS_PER_100Y;
+ if (c_cycles == 4) c_cycles--;
+ remdays -= c_cycles * DAYS_PER_100Y;
+
+ q_cycles = remdays / DAYS_PER_4Y;
+ if (q_cycles == 25) q_cycles--;
+ remdays -= q_cycles * DAYS_PER_4Y;
+
+ remyears = remdays / 365;
+ if (remyears == 4) remyears--;
+ remdays -= remyears * 365;
+
+ leap = !remyears && (q_cycles || !c_cycles);
+ yday = remdays + 31 + 28 + leap;
+ if (yday >= 365+leap) yday -= 365+leap;
+
+ years = remyears + 4*q_cycles + 100*c_cycles + 400LL*qc_cycles;
+
+ for (months=0; days_in_month[months] <= remdays; months++)
+ remdays -= days_in_month[months];
+
+ if (months >= 10) {
+ months -= 12;
+ years++;
+ }
+
+ if (years+100 > INT_MAX || years+100 < INT_MIN)
+ return -1;
+
+ tm->tm_year = years + 100;
+ tm->tm_mon = months + 2;
+ tm->tm_mday = remdays + 1;
+ tm->tm_wday = wday;
+ tm->tm_yday = yday;
+
+ tm->tm_hour = remsecs / 3600;
+ tm->tm_min = remsecs / 60 % 60;
+ tm->tm_sec = remsecs % 60;
+
+ return 0;
+}
diff --git a/libc-top-half/musl/src/time/__tm_to_secs.c b/libc-top-half/musl/src/time/__tm_to_secs.c
new file mode 100644
index 0000000..c29fa98
--- /dev/null
+++ b/libc-top-half/musl/src/time/__tm_to_secs.c
@@ -0,0 +1,24 @@
+#include "time_impl.h"
+
+long long __tm_to_secs(const struct tm *tm)
+{
+ int is_leap;
+ long long year = tm->tm_year;
+ int month = tm->tm_mon;
+ if (month >= 12 || month < 0) {
+ int adj = month / 12;
+ month %= 12;
+ if (month < 0) {
+ adj--;
+ month += 12;
+ }
+ year += adj;
+ }
+ long long t = __year_to_secs(year, &is_leap);
+ t += __month_to_secs(month, is_leap);
+ t += 86400LL * (tm->tm_mday-1);
+ t += 3600LL * tm->tm_hour;
+ t += 60LL * tm->tm_min;
+ t += tm->tm_sec;
+ return t;
+}
diff --git a/libc-top-half/musl/src/time/__tz.c b/libc-top-half/musl/src/time/__tz.c
new file mode 100644
index 0000000..9551503
--- /dev/null
+++ b/libc-top-half/musl/src/time/__tz.c
@@ -0,0 +1,456 @@
+#include "time_impl.h"
+#include <stdint.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef __wasilibc_unmodified_upstream // timezone data
+#include <sys/mman.h>
+#include <ctype.h>
+#endif
+#include "libc.h"
+#include "lock.h"
+#include "fork_impl.h"
+
+#define malloc __libc_malloc
+#define calloc undef
+#define realloc undef
+#define free undef
+
+#ifdef __wasilibc_unmodified_upstream // timezone data
+long __timezone = 0;
+int __daylight = 0;
+char *__tzname[2] = { 0, 0 };
+
+weak_alias(__timezone, timezone);
+weak_alias(__daylight, daylight);
+weak_alias(__tzname, tzname);
+
+static char std_name[TZNAME_MAX+1];
+static char dst_name[TZNAME_MAX+1];
+#endif
+const char __utc[] = "UTC";
+
+#ifdef __wasilibc_unmodified_upstream // timezone data
+static int dst_off;
+static int r0[5], r1[5];
+
+static const unsigned char *zi, *trans, *index, *types, *abbrevs, *abbrevs_end;
+static size_t map_size;
+
+static char old_tz_buf[32];
+static char *old_tz = old_tz_buf;
+static size_t old_tz_size = sizeof old_tz_buf;
+
+static volatile int lock[1];
+volatile int *const __timezone_lockptr = lock;
+
+static int getint(const char **p)
+{
+ unsigned x;
+ for (x=0; **p-'0'<10U; (*p)++) x = **p-'0' + 10*x;
+ return x;
+}
+
+static int getoff(const char **p)
+{
+ int neg = 0;
+ if (**p == '-') {
+ ++*p;
+ neg = 1;
+ } else if (**p == '+') {
+ ++*p;
+ }
+ int off = 3600*getint(p);
+ if (**p == ':') {
+ ++*p;
+ off += 60*getint(p);
+ if (**p == ':') {
+ ++*p;
+ off += getint(p);
+ }
+ }
+ return neg ? -off : off;
+}
+
+static void getrule(const char **p, int rule[5])
+{
+ int r = rule[0] = **p;
+
+ if (r!='M') {
+ if (r=='J') ++*p;
+ else rule[0] = 0;
+ rule[1] = getint(p);
+ } else {
+ ++*p; rule[1] = getint(p);
+ ++*p; rule[2] = getint(p);
+ ++*p; rule[3] = getint(p);
+ }
+
+ if (**p=='/') {
+ ++*p;
+ rule[4] = getoff(p);
+ } else {
+ rule[4] = 7200;
+ }
+}
+
+static void getname(char *d, const char **p)
+{
+ int i;
+ if (**p == '<') {
+ ++*p;
+ for (i=0; (*p)[i] && (*p)[i]!='>'; i++)
+ if (i<TZNAME_MAX) d[i] = (*p)[i];
+ if ((*p)[i]) ++*p;
+ } else {
+ for (i=0; ((*p)[i]|32)-'a'<26U; i++)
+ if (i<TZNAME_MAX) d[i] = (*p)[i];
+ }
+ *p += i;
+ d[i<TZNAME_MAX?i:TZNAME_MAX] = 0;
+}
+
+#define VEC(...) ((const unsigned char[]){__VA_ARGS__})
+
+static uint32_t zi_read32(const unsigned char *z)
+{
+ return (unsigned)z[0]<<24 | z[1]<<16 | z[2]<<8 | z[3];
+}
+
+static size_t zi_dotprod(const unsigned char *z, const unsigned char *v, size_t n)
+{
+ size_t y;
+ uint32_t x;
+ for (y=0; n; n--, z+=4, v++) {
+ x = zi_read32(z);
+ y += x * *v;
+ }
+ return y;
+}
+
+static void do_tzset()
+{
+ char buf[NAME_MAX+25], *pathname=buf+24;
+ const char *try, *s, *p;
+ const unsigned char *map = 0;
+ size_t i;
+ static const char search[] =
+ "/usr/share/zoneinfo/\0/share/zoneinfo/\0/etc/zoneinfo/\0";
+
+ s = getenv("TZ");
+ if (!s) s = "/etc/localtime";
+ if (!*s) s = __utc;
+
+ if (old_tz && !strcmp(s, old_tz)) return;
+
+ for (i=0; i<5; i++) r0[i] = r1[i] = 0;
+
+ if (zi) __munmap((void *)zi, map_size);
+
+ /* Cache the old value of TZ to check if it has changed. Avoid
+ * free so as not to pull it into static programs. Growth
+ * strategy makes it so free would have minimal benefit anyway. */
+ i = strlen(s);
+ if (i > PATH_MAX+1) s = __utc, i = 3;
+ if (i >= old_tz_size) {
+ old_tz_size *= 2;
+ if (i >= old_tz_size) old_tz_size = i+1;
+ if (old_tz_size > PATH_MAX+2) old_tz_size = PATH_MAX+2;
+ old_tz = malloc(old_tz_size);
+ }
+ if (old_tz) memcpy(old_tz, s, i+1);
+
+ int posix_form = 0;
+ if (*s != ':') {
+ p = s;
+ char dummy_name[TZNAME_MAX+1];
+ getname(dummy_name, &p);
+ if (p!=s && (*p == '+' || *p == '-' || isdigit(*p)
+ || !strcmp(dummy_name, "UTC")
+ || !strcmp(dummy_name, "GMT")))
+ posix_form = 1;
+ }
+
+ /* Non-suid can use an absolute tzfile pathname or a relative
+ * pathame beginning with "."; in secure mode, only the
+ * standard path will be searched. */
+ if (!posix_form) {
+ if (*s == ':') s++;
+ if (*s == '/' || *s == '.') {
+ if (!libc.secure || !strcmp(s, "/etc/localtime"))
+ map = __map_file(s, &map_size);
+ } else {
+ size_t l = strlen(s);
+ if (l <= NAME_MAX && !strchr(s, '.')) {
+ memcpy(pathname, s, l+1);
+ pathname[l] = 0;
+ for (try=search; !map && *try; try+=l+1) {
+ l = strlen(try);
+ memcpy(pathname-l, try, l);
+ map = __map_file(pathname-l, &map_size);
+ }
+ }
+ }
+ if (!map) s = __utc;
+ }
+ if (map && (map_size < 44 || memcmp(map, "TZif", 4))) {
+ __munmap((void *)map, map_size);
+ map = 0;
+ s = __utc;
+ }
+
+ zi = map;
+ if (map) {
+ int scale = 2;
+ if (map[4]!='1') {
+ size_t skip = zi_dotprod(zi+20, VEC(1,1,8,5,6,1), 6);
+ trans = zi+skip+44+44;
+ scale++;
+ } else {
+ trans = zi+44;
+ }
+ index = trans + (zi_read32(trans-12) << scale);
+ types = index + zi_read32(trans-12);
+ abbrevs = types + 6*zi_read32(trans-8);
+ abbrevs_end = abbrevs + zi_read32(trans-4);
+ if (zi[map_size-1] == '\n') {
+ for (s = (const char *)zi+map_size-2; *s!='\n'; s--);
+ s++;
+ } else {
+ const unsigned char *p;
+ __tzname[0] = __tzname[1] = 0;
+ __daylight = __timezone = dst_off = 0;
+ for (p=types; p<abbrevs; p+=6) {
+ if (!p[4] && !__tzname[0]) {
+ __tzname[0] = (char *)abbrevs + p[5];
+ __timezone = -zi_read32(p);
+ }
+ if (p[4] && !__tzname[1]) {
+ __tzname[1] = (char *)abbrevs + p[5];
+ dst_off = -zi_read32(p);
+ __daylight = 1;
+ }
+ }
+ if (!__tzname[0]) __tzname[0] = __tzname[1];
+ if (!__tzname[0]) __tzname[0] = (char *)__utc;
+ if (!__daylight) {
+ __tzname[1] = __tzname[0];
+ dst_off = __timezone;
+ }
+ return;
+ }
+ }
+
+ if (!s) s = __utc;
+ getname(std_name, &s);
+ __tzname[0] = std_name;
+ __timezone = getoff(&s);
+ getname(dst_name, &s);
+ __tzname[1] = dst_name;
+ if (dst_name[0]) {
+ __daylight = 1;
+ if (*s == '+' || *s=='-' || *s-'0'<10U)
+ dst_off = getoff(&s);
+ else
+ dst_off = __timezone - 3600;
+ } else {
+ __daylight = 0;
+ dst_off = __timezone;
+ }
+
+ if (*s == ',') s++, getrule(&s, r0);
+ if (*s == ',') s++, getrule(&s, r1);
+}
+
+/* Search zoneinfo rules to find the one that applies to the given time,
+ * and determine alternate opposite-DST-status rule that may be needed. */
+
+static size_t scan_trans(long long t, int local, size_t *alt)
+{
+ int scale = 3 - (trans == zi+44);
+ uint64_t x;
+ int off = 0;
+
+ size_t a = 0, n = (index-trans)>>scale, m;
+
+ if (!n) {
+ if (alt) *alt = 0;
+ return 0;
+ }
+
+ /* Binary search for 'most-recent rule before t'. */
+ while (n > 1) {
+ m = a + n/2;
+ x = zi_read32(trans + (m<<scale));
+ if (scale == 3) x = x<<32 | zi_read32(trans + (m<<scale) + 4);
+ else x = (int32_t)x;
+ if (local) off = (int32_t)zi_read32(types + 6 * index[m-1]);
+ if (t - off < (int64_t)x) {
+ n /= 2;
+ } else {
+ a = m;
+ n -= n/2;
+ }
+ }
+
+ /* First and last entry are special. First means to use lowest-index
+ * non-DST type. Last means to apply POSIX-style rule if available. */
+ n = (index-trans)>>scale;
+ if (a == n-1) return -1;
+ if (a == 0) {
+ x = zi_read32(trans);
+ if (scale == 3) x = x<<32 | zi_read32(trans + 4);
+ else x = (int32_t)x;
+ /* Find the lowest non-DST type, or 0 if none. */
+ size_t j = 0;
+ for (size_t i=abbrevs-types; i; i-=6) {
+ if (!types[i-6+4]) j = i-6;
+ }
+ if (local) off = (int32_t)zi_read32(types + j);
+ /* If t is before first transition, use the above-found type
+ * and the index-zero (after transition) type as the alt. */
+ if (t - off < (int64_t)x) {
+ if (alt) *alt = index[0];
+ return j/6;
+ }
+ }
+
+ /* Try to find a neighboring opposite-DST-status rule. */
+ if (alt) {
+ if (a && types[6*index[a-1]+4] != types[6*index[a]+4])
+ *alt = index[a-1];
+ else if (a+1<n && types[6*index[a+1]+4] != types[6*index[a]+4])
+ *alt = index[a+1];
+ else
+ *alt = index[a];
+ }
+
+ return index[a];
+}
+
+static int days_in_month(int m, int is_leap)
+{
+ if (m==2) return 28+is_leap;
+ else return 30+((0xad5>>(m-1))&1);
+}
+
+/* Convert a POSIX DST rule plus year to seconds since epoch. */
+
+static long long rule_to_secs(const int *rule, int year)
+{
+ int is_leap;
+ long long t = __year_to_secs(year, &is_leap);
+ int x, m, n, d;
+ if (rule[0]!='M') {
+ x = rule[1];
+ if (rule[0]=='J' && (x < 60 || !is_leap)) x--;
+ t += 86400 * x;
+ } else {
+ m = rule[1];
+ n = rule[2];
+ d = rule[3];
+ t += __month_to_secs(m-1, is_leap);
+ int wday = (int)((t + 4*86400) % (7*86400)) / 86400;
+ int days = d - wday;
+ if (days < 0) days += 7;
+ if (n == 5 && days+28 >= days_in_month(m, is_leap)) n = 4;
+ t += 86400 * (days + 7*(n-1));
+ }
+ t += rule[4];
+ return t;
+}
+
+/* Determine the time zone in effect for a given time in seconds since the
+ * epoch. It can be given in local or universal time. The results will
+ * indicate whether DST is in effect at the queried time, and will give both
+ * the GMT offset for the active zone/DST rule and the opposite DST. This
+ * enables a caller to efficiently adjust for the case where an explicit
+ * DST specification mismatches what would be in effect at the time. */
+
+void __secs_to_zone(long long t, int local, int *isdst, long *offset, long *oppoff, const char **zonename)
+{
+ LOCK(lock);
+
+ do_tzset();
+
+ if (zi) {
+ size_t alt, i = scan_trans(t, local, &alt);
+ if (i != -1) {
+ *isdst = types[6*i+4];
+ *offset = (int32_t)zi_read32(types+6*i);
+ *zonename = (const char *)abbrevs + types[6*i+5];
+ if (oppoff) *oppoff = (int32_t)zi_read32(types+6*alt);
+ UNLOCK(lock);
+ return;
+ }
+ }
+
+ if (!__daylight) goto std;
+
+ /* FIXME: may be broken if DST changes right at year boundary?
+ * Also, this could be more efficient.*/
+ long long y = t / 31556952 + 70;
+ while (__year_to_secs(y, 0) > t) y--;
+ while (__year_to_secs(y+1, 0) < t) y++;
+
+ long long t0 = rule_to_secs(r0, y);
+ long long t1 = rule_to_secs(r1, y);
+
+ if (!local) {
+ t0 += __timezone;
+ t1 += dst_off;
+ }
+ if (t0 < t1) {
+ if (t >= t0 && t < t1) goto dst;
+ goto std;
+ } else {
+ if (t >= t1 && t < t0) goto std;
+ goto dst;
+ }
+std:
+ *isdst = 0;
+ *offset = -__timezone;
+ if (oppoff) *oppoff = -dst_off;
+ *zonename = __tzname[0];
+ UNLOCK(lock);
+ return;
+dst:
+ *isdst = 1;
+ *offset = -dst_off;
+ if (oppoff) *oppoff = -__timezone;
+ *zonename = __tzname[1];
+ UNLOCK(lock);
+}
+
+static void __tzset()
+{
+ LOCK(lock);
+ do_tzset();
+ UNLOCK(lock);
+}
+
+weak_alias(__tzset, tzset);
+#else
+void __secs_to_zone(long long t, int local, int *isdst, int *offset, long *oppoff, const char **zonename)
+{
+ // Minimalist implementation for now.
+ *isdst = 0;
+ *offset = 0;
+ *oppoff = 0;
+ *zonename = __utc;
+}
+#endif
+
+const char *__tm_to_tzname(const struct tm *tm)
+{
+ const void *p = tm->__tm_zone;
+#ifdef __wasilibc_unmodified_upstream // timezone data
+ LOCK(lock);
+ do_tzset();
+ if (p != __utc && p != __tzname[0] && p != __tzname[1] &&
+ (!zi || (uintptr_t)p-(uintptr_t)abbrevs >= abbrevs_end - abbrevs))
+ p = "";
+ UNLOCK(lock);
+#endif
+ return p;
+}
diff --git a/libc-top-half/musl/src/time/__year_to_secs.c b/libc-top-half/musl/src/time/__year_to_secs.c
new file mode 100644
index 0000000..2824ec6
--- /dev/null
+++ b/libc-top-half/musl/src/time/__year_to_secs.c
@@ -0,0 +1,47 @@
+long long __year_to_secs(long long year, int *is_leap)
+{
+ if (year-2ULL <= 136) {
+ int y = year;
+ int leaps = (y-68)>>2;
+ if (!((y-68)&3)) {
+ leaps--;
+ if (is_leap) *is_leap = 1;
+ } else if (is_leap) *is_leap = 0;
+ return 31536000*(y-70) + 86400*leaps;
+ }
+
+ int cycles, centuries, leaps, rem;
+
+ if (!is_leap) is_leap = &(int){0};
+ cycles = (year-100) / 400;
+ rem = (year-100) % 400;
+ if (rem < 0) {
+ cycles--;
+ rem += 400;
+ }
+ if (!rem) {
+ *is_leap = 1;
+ centuries = 0;
+ leaps = 0;
+ } else {
+ if (rem >= 200) {
+ if (rem >= 300) centuries = 3, rem -= 300;
+ else centuries = 2, rem -= 200;
+ } else {
+ if (rem >= 100) centuries = 1, rem -= 100;
+ else centuries = 0;
+ }
+ if (!rem) {
+ *is_leap = 0;
+ leaps = 0;
+ } else {
+ leaps = rem / 4U;
+ rem %= 4U;
+ *is_leap = !rem;
+ }
+ }
+
+ leaps += 97*cycles + 24*centuries - *is_leap;
+
+ return (year-100) * 31536000LL + leaps * 86400LL + 946684800 + 86400;
+}
diff --git a/libc-top-half/musl/src/time/asctime.c b/libc-top-half/musl/src/time/asctime.c
new file mode 100644
index 0000000..1febe54
--- /dev/null
+++ b/libc-top-half/musl/src/time/asctime.c
@@ -0,0 +1,7 @@
+#include <time.h>
+
+char *asctime(const struct tm *tm)
+{
+ static char buf[26];
+ return __asctime_r(tm, buf);
+}
diff --git a/libc-top-half/musl/src/time/asctime_r.c b/libc-top-half/musl/src/time/asctime_r.c
new file mode 100644
index 0000000..26809ca
--- /dev/null
+++ b/libc-top-half/musl/src/time/asctime_r.c
@@ -0,0 +1,28 @@
+#include <time.h>
+#include <stdio.h>
+#include <langinfo.h>
+#include "locale_impl.h"
+#include "atomic.h"
+
+char *__asctime_r(const struct tm *restrict tm, char *restrict buf)
+{
+ if (snprintf(buf, 26, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n",
+ __nl_langinfo_l(ABDAY_1+tm->tm_wday, C_LOCALE),
+ __nl_langinfo_l(ABMON_1+tm->tm_mon, C_LOCALE),
+ tm->tm_mday, tm->tm_hour,
+ tm->tm_min, tm->tm_sec,
+ 1900 + tm->tm_year) >= 26)
+ {
+ /* ISO C requires us to use the above format string,
+ * even if it will not fit in the buffer. Thus asctime_r
+ * is _supposed_ to crash if the fields in tm are too large.
+ * We follow this behavior and crash "gracefully" to warn
+ * application developers that they may not be so lucky
+ * on other implementations (e.g. stack smashing..).
+ */
+ a_crash();
+ }
+ return buf;
+}
+
+weak_alias(__asctime_r, asctime_r);
diff --git a/libc-top-half/musl/src/time/clock.c b/libc-top-half/musl/src/time/clock.c
new file mode 100644
index 0000000..6724012
--- /dev/null
+++ b/libc-top-half/musl/src/time/clock.c
@@ -0,0 +1,16 @@
+#include <time.h>
+#include <limits.h>
+
+clock_t clock()
+{
+ struct timespec ts;
+
+ if (__clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts))
+ return -1;
+
+ if (ts.tv_sec > LONG_MAX/1000000
+ || ts.tv_nsec/1000 > LONG_MAX-1000000*ts.tv_sec)
+ return -1;
+
+ return ts.tv_sec*1000000 + ts.tv_nsec/1000;
+}
diff --git a/libc-top-half/musl/src/time/clock_getcpuclockid.c b/libc-top-half/musl/src/time/clock_getcpuclockid.c
new file mode 100644
index 0000000..8a0e2d4
--- /dev/null
+++ b/libc-top-half/musl/src/time/clock_getcpuclockid.c
@@ -0,0 +1,14 @@
+#include <time.h>
+#include <errno.h>
+#include <unistd.h>
+#include "syscall.h"
+
+int clock_getcpuclockid(pid_t pid, clockid_t *clk)
+{
+ struct timespec ts;
+ clockid_t id = (-pid-1)*8U + 2;
+ int ret = __syscall(SYS_clock_getres, id, &ts);
+ if (ret) return -ret;
+ *clk = id;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/time/clock_getres.c b/libc-top-half/musl/src/time/clock_getres.c
new file mode 100644
index 0000000..81c6703
--- /dev/null
+++ b/libc-top-half/musl/src/time/clock_getres.c
@@ -0,0 +1,21 @@
+#include <time.h>
+#include "syscall.h"
+
+int clock_getres(clockid_t clk, struct timespec *ts)
+{
+#ifdef SYS_clock_getres_time64
+ /* On a 32-bit arch, use the old syscall if it exists. */
+ if (SYS_clock_getres != SYS_clock_getres_time64) {
+ long ts32[2];
+ int r = __syscall(SYS_clock_getres, clk, ts32);
+ if (!r && ts) {
+ ts->tv_sec = ts32[0];
+ ts->tv_nsec = ts32[1];
+ }
+ return __syscall_ret(r);
+ }
+#endif
+ /* If reaching this point, it's a 64-bit arch or time64-only
+ * 32-bit arch and we can get result directly into timespec. */
+ return syscall(SYS_clock_getres, clk, ts);
+}
diff --git a/libc-top-half/musl/src/time/clock_gettime.c b/libc-top-half/musl/src/time/clock_gettime.c
new file mode 100644
index 0000000..3e1d097
--- /dev/null
+++ b/libc-top-half/musl/src/time/clock_gettime.c
@@ -0,0 +1,107 @@
+#include <time.h>
+#include <errno.h>
+#include <stdint.h>
+#include "syscall.h"
+#include "atomic.h"
+
+#ifdef VDSO_CGT_SYM
+
+static void *volatile vdso_func;
+
+#ifdef VDSO_CGT32_SYM
+static void *volatile vdso_func_32;
+static int cgt_time32_wrap(clockid_t clk, struct timespec *ts)
+{
+ long ts32[2];
+ int (*f)(clockid_t, long[2]) =
+ (int (*)(clockid_t, long[2]))vdso_func_32;
+ int r = f(clk, ts32);
+ if (!r) {
+ /* Fallback to syscalls if time32 overflowed. Maybe
+ * we lucked out and somehow migrated to a kernel with
+ * time64 syscalls available. */
+ if (ts32[0] < 0) {
+ a_cas_p(&vdso_func, (void *)cgt_time32_wrap, 0);
+ return -ENOSYS;
+ }
+ ts->tv_sec = ts32[0];
+ ts->tv_nsec = ts32[1];
+ }
+ return r;
+}
+#endif
+
+static int cgt_init(clockid_t clk, struct timespec *ts)
+{
+ void *p = __vdsosym(VDSO_CGT_VER, VDSO_CGT_SYM);
+#ifdef VDSO_CGT32_SYM
+ if (!p) {
+ void *q = __vdsosym(VDSO_CGT32_VER, VDSO_CGT32_SYM);
+ if (q) {
+ a_cas_p(&vdso_func_32, 0, q);
+ p = cgt_time32_wrap;
+ }
+ }
+#endif
+ int (*f)(clockid_t, struct timespec *) =
+ (int (*)(clockid_t, struct timespec *))p;
+ a_cas_p(&vdso_func, (void *)cgt_init, p);
+ return f ? f(clk, ts) : -ENOSYS;
+}
+
+static void *volatile vdso_func = (void *)cgt_init;
+
+#endif
+
+int __clock_gettime(clockid_t clk, struct timespec *ts)
+{
+ int r;
+
+#ifdef VDSO_CGT_SYM
+ int (*f)(clockid_t, struct timespec *) =
+ (int (*)(clockid_t, struct timespec *))vdso_func;
+ if (f) {
+ r = f(clk, ts);
+ if (!r) return r;
+ if (r == -EINVAL) return __syscall_ret(r);
+ /* Fall through on errors other than EINVAL. Some buggy
+ * vdso implementations return ENOSYS for clocks they
+ * can't handle, rather than making the syscall. This
+ * also handles the case where cgt_init fails to find
+ * a vdso function to use. */
+ }
+#endif
+
+#ifdef SYS_clock_gettime64
+ r = -ENOSYS;
+ if (sizeof(time_t) > 4)
+ r = __syscall(SYS_clock_gettime64, clk, ts);
+ if (SYS_clock_gettime == SYS_clock_gettime64 || r!=-ENOSYS)
+ return __syscall_ret(r);
+ long ts32[2];
+ r = __syscall(SYS_clock_gettime, clk, ts32);
+ if (r==-ENOSYS && clk==CLOCK_REALTIME) {
+ r = __syscall(SYS_gettimeofday, ts32, 0);
+ ts32[1] *= 1000;
+ }
+ if (!r) {
+ ts->tv_sec = ts32[0];
+ ts->tv_nsec = ts32[1];
+ return r;
+ }
+ return __syscall_ret(r);
+#else
+ r = __syscall(SYS_clock_gettime, clk, ts);
+ if (r == -ENOSYS) {
+ if (clk == CLOCK_REALTIME) {
+ __syscall(SYS_gettimeofday, ts, 0);
+ ts->tv_nsec = (int)ts->tv_nsec * 1000;
+ return 0;
+ }
+ r = -EINVAL;
+ }
+ return __syscall_ret(r);
+#endif
+}
+
+weak_alias(__clock_gettime, clock_gettime);
diff --git a/libc-top-half/musl/src/time/clock_nanosleep.c b/libc-top-half/musl/src/time/clock_nanosleep.c
new file mode 100644
index 0000000..e195499
--- /dev/null
+++ b/libc-top-half/musl/src/time/clock_nanosleep.c
@@ -0,0 +1,38 @@
+#include <time.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
+
+int __clock_nanosleep(clockid_t clk, int flags, const struct timespec *req, struct timespec *rem)
+{
+ if (clk == CLOCK_THREAD_CPUTIME_ID) return EINVAL;
+#ifdef SYS_clock_nanosleep_time64
+ time_t s = req->tv_sec;
+ long ns = req->tv_nsec;
+ int r = -ENOSYS;
+ if (SYS_clock_nanosleep == SYS_clock_nanosleep_time64 || !IS32BIT(s))
+ r = __syscall_cp(SYS_clock_nanosleep_time64, clk, flags,
+ ((long long[]){s, ns}), rem);
+ if (SYS_clock_nanosleep == SYS_clock_nanosleep_time64 || r!=-ENOSYS)
+ return -r;
+ long long extra = s - CLAMP(s);
+ long ts32[2] = { CLAMP(s), ns };
+ if (clk == CLOCK_REALTIME && !flags)
+ r = __syscall_cp(SYS_nanosleep, &ts32, &ts32);
+ else
+ r = __syscall_cp(SYS_clock_nanosleep, clk, flags, &ts32, &ts32);
+ if (r==-EINTR && rem && !(flags & TIMER_ABSTIME)) {
+ rem->tv_sec = ts32[0] + extra;
+ rem->tv_nsec = ts32[1];
+ }
+ return -r;
+#else
+ if (clk == CLOCK_REALTIME && !flags)
+ return -__syscall_cp(SYS_nanosleep, req, rem);
+ return -__syscall_cp(SYS_clock_nanosleep, clk, flags, req, rem);
+#endif
+}
+
+weak_alias(__clock_nanosleep, clock_nanosleep);
diff --git a/libc-top-half/musl/src/time/clock_settime.c b/libc-top-half/musl/src/time/clock_settime.c
new file mode 100644
index 0000000..1004ed1
--- /dev/null
+++ b/libc-top-half/musl/src/time/clock_settime.c
@@ -0,0 +1,24 @@
+#include <time.h>
+#include <errno.h>
+#include "syscall.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+
+int clock_settime(clockid_t clk, const struct timespec *ts)
+{
+#ifdef SYS_clock_settime64
+ time_t s = ts->tv_sec;
+ long ns = ts->tv_nsec;
+ int r = -ENOSYS;
+ if (SYS_clock_settime == SYS_clock_settime64 || !IS32BIT(s))
+ r = __syscall(SYS_clock_settime64, clk,
+ ((long long[]){s, ns}));
+ if (SYS_clock_settime == SYS_clock_settime64 || r!=-ENOSYS)
+ return __syscall_ret(r);
+ if (!IS32BIT(s))
+ return __syscall_ret(-ENOTSUP);
+ return syscall(SYS_clock_settime, clk, ((long[]){s, ns}));
+#else
+ return syscall(SYS_clock_settime, clk, ts);
+#endif
+}
diff --git a/libc-top-half/musl/src/time/ctime.c b/libc-top-half/musl/src/time/ctime.c
new file mode 100644
index 0000000..3602931
--- /dev/null
+++ b/libc-top-half/musl/src/time/ctime.c
@@ -0,0 +1,8 @@
+#include <time.h>
+
+char *ctime(const time_t *t)
+{
+ struct tm *tm = localtime(t);
+ if (!tm) return 0;
+ return asctime(tm);
+}
diff --git a/libc-top-half/musl/src/time/ctime_r.c b/libc-top-half/musl/src/time/ctime_r.c
new file mode 100644
index 0000000..3e24aa6
--- /dev/null
+++ b/libc-top-half/musl/src/time/ctime_r.c
@@ -0,0 +1,7 @@
+#include <time.h>
+
+char *ctime_r(const time_t *t, char *buf)
+{
+ struct tm tm, *tm_p = localtime_r(t, &tm);
+ return tm_p ? asctime_r(tm_p, buf) : 0;
+}
diff --git a/libc-top-half/musl/src/time/difftime.c b/libc-top-half/musl/src/time/difftime.c
new file mode 100644
index 0000000..80a18cc
--- /dev/null
+++ b/libc-top-half/musl/src/time/difftime.c
@@ -0,0 +1,6 @@
+#include <time.h>
+
+double difftime(time_t t1, time_t t0)
+{
+ return t1-t0;
+}
diff --git a/libc-top-half/musl/src/time/ftime.c b/libc-top-half/musl/src/time/ftime.c
new file mode 100644
index 0000000..a1734d0
--- /dev/null
+++ b/libc-top-half/musl/src/time/ftime.c
@@ -0,0 +1,12 @@
+#include <sys/timeb.h>
+#include <time.h>
+
+int ftime(struct timeb *tp)
+{
+ struct timespec ts;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ tp->time = ts.tv_sec;
+ tp->millitm = ts.tv_nsec / 1000000;
+ tp->timezone = tp->dstflag = 0;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/time/getdate.c b/libc-top-half/musl/src/time/getdate.c
new file mode 100644
index 0000000..058c48b
--- /dev/null
+++ b/libc-top-half/musl/src/time/getdate.c
@@ -0,0 +1,52 @@
+#include <time.h>
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+#include <pthread.h>
+#endif
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int getdate_err;
+
+struct tm *getdate(const char *s)
+{
+ static struct tm tmbuf;
+ struct tm *ret = 0;
+ char *datemsk = getenv("DATEMSK");
+ FILE *f = 0;
+ char fmt[100], *p;
+ int cs;
+
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ pthread_setcancelstate(PTHREAD_CANCEL_DEFERRED, &cs);
+#endif
+
+ if (!datemsk) {
+ getdate_err = 1;
+ goto out;
+ }
+
+ f = fopen(datemsk, "rbe");
+ if (!f) {
+ if (errno == ENOMEM) getdate_err = 6;
+ else getdate_err = 2;
+ goto out;
+ }
+
+ while (fgets(fmt, sizeof fmt, f)) {
+ p = strptime(s, fmt, &tmbuf);
+ if (p && !*p) {
+ ret = &tmbuf;
+ goto out;
+ }
+ }
+
+ if (ferror(f)) getdate_err = 5;
+ else getdate_err = 7;
+out:
+ if (f) fclose(f);
+#if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
+ pthread_setcancelstate(cs, 0);
+#endif
+ return ret;
+}
diff --git a/libc-top-half/musl/src/time/gettimeofday.c b/libc-top-half/musl/src/time/gettimeofday.c
new file mode 100644
index 0000000..691f8e9
--- /dev/null
+++ b/libc-top-half/musl/src/time/gettimeofday.c
@@ -0,0 +1,13 @@
+#include <time.h>
+#include <sys/time.h>
+#include "syscall.h"
+
+int gettimeofday(struct timeval *restrict tv, void *restrict tz)
+{
+ struct timespec ts;
+ if (!tv) return 0;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ tv->tv_sec = ts.tv_sec;
+ tv->tv_usec = (int)ts.tv_nsec / 1000;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/time/gmtime.c b/libc-top-half/musl/src/time/gmtime.c
new file mode 100644
index 0000000..6320b63
--- /dev/null
+++ b/libc-top-half/musl/src/time/gmtime.c
@@ -0,0 +1,8 @@
+#include "time_impl.h"
+#include <errno.h>
+
+struct tm *gmtime(const time_t *t)
+{
+ static struct tm tm;
+ return __gmtime_r(t, &tm);
+}
diff --git a/libc-top-half/musl/src/time/gmtime_r.c b/libc-top-half/musl/src/time/gmtime_r.c
new file mode 100644
index 0000000..22aec2c
--- /dev/null
+++ b/libc-top-half/musl/src/time/gmtime_r.c
@@ -0,0 +1,16 @@
+#include "time_impl.h"
+#include <errno.h>
+
+struct tm *__gmtime_r(const time_t *restrict t, struct tm *restrict tm)
+{
+ if (__secs_to_tm(*t, tm) < 0) {
+ errno = EOVERFLOW;
+ return 0;
+ }
+ tm->tm_isdst = 0;
+ tm->__tm_gmtoff = 0;
+ tm->__tm_zone = __utc;
+ return tm;
+}
+
+weak_alias(__gmtime_r, gmtime_r);
diff --git a/libc-top-half/musl/src/time/localtime.c b/libc-top-half/musl/src/time/localtime.c
new file mode 100644
index 0000000..5210423
--- /dev/null
+++ b/libc-top-half/musl/src/time/localtime.c
@@ -0,0 +1,7 @@
+#include "time_impl.h"
+
+struct tm *localtime(const time_t *t)
+{
+ static struct tm tm;
+ return __localtime_r(t, &tm);
+}
diff --git a/libc-top-half/musl/src/time/localtime_r.c b/libc-top-half/musl/src/time/localtime_r.c
new file mode 100644
index 0000000..1a15b31
--- /dev/null
+++ b/libc-top-half/musl/src/time/localtime_r.c
@@ -0,0 +1,21 @@
+#include "time_impl.h"
+#include <errno.h>
+#include <limits.h>
+
+struct tm *__localtime_r(const time_t *restrict t, struct tm *restrict tm)
+{
+ /* Reject time_t values whose year would overflow int because
+ * __secs_to_zone cannot safely handle them. */
+ if (*t < INT_MIN * 31622400LL || *t > INT_MAX * 31622400LL) {
+ errno = EOVERFLOW;
+ return 0;
+ }
+ __secs_to_zone(*t, 0, &tm->tm_isdst, &tm->__tm_gmtoff, 0, &tm->__tm_zone);
+ if (__secs_to_tm((long long)*t + tm->__tm_gmtoff, tm) < 0) {
+ errno = EOVERFLOW;
+ return 0;
+ }
+ return tm;
+}
+
+weak_alias(__localtime_r, localtime_r);
diff --git a/libc-top-half/musl/src/time/mktime.c b/libc-top-half/musl/src/time/mktime.c
new file mode 100644
index 0000000..bad3f07
--- /dev/null
+++ b/libc-top-half/musl/src/time/mktime.c
@@ -0,0 +1,28 @@
+#include "time_impl.h"
+#include <errno.h>
+
+time_t mktime(struct tm *tm)
+{
+ struct tm new;
+ long opp;
+ long long t = __tm_to_secs(tm);
+
+ __secs_to_zone(t, 1, &new.tm_isdst, &new.__tm_gmtoff, &opp, &new.__tm_zone);
+
+ if (tm->tm_isdst>=0 && new.tm_isdst!=tm->tm_isdst)
+ t -= opp - new.__tm_gmtoff;
+
+ t -= new.__tm_gmtoff;
+ if ((time_t)t != t) goto error;
+
+ __secs_to_zone(t, 0, &new.tm_isdst, &new.__tm_gmtoff, &opp, &new.__tm_zone);
+
+ if (__secs_to_tm(t + new.__tm_gmtoff, &new) < 0) goto error;
+
+ *tm = new;
+ return t;
+
+error:
+ errno = EOVERFLOW;
+ return -1;
+}
diff --git a/libc-top-half/musl/src/time/nanosleep.c b/libc-top-half/musl/src/time/nanosleep.c
new file mode 100644
index 0000000..bc9f789
--- /dev/null
+++ b/libc-top-half/musl/src/time/nanosleep.c
@@ -0,0 +1,7 @@
+#include <time.h>
+#include "syscall.h"
+
+int nanosleep(const struct timespec *req, struct timespec *rem)
+{
+ return __syscall_ret(-__clock_nanosleep(CLOCK_REALTIME, 0, req, rem));
+}
diff --git a/libc-top-half/musl/src/time/strftime.c b/libc-top-half/musl/src/time/strftime.c
new file mode 100644
index 0000000..a1db9cb
--- /dev/null
+++ b/libc-top-half/musl/src/time/strftime.c
@@ -0,0 +1,285 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <langinfo.h>
+#include <locale.h>
+#include <time.h>
+#include <limits.h>
+#include "locale_impl.h"
+#include "time_impl.h"
+
+static int is_leap(int y)
+{
+ /* Avoid overflow */
+ if (y>INT_MAX-1900) y -= 2000;
+ y += 1900;
+ return !(y%4) && ((y%100) || !(y%400));
+}
+
+static int week_num(const struct tm *tm)
+{
+ int val = (tm->tm_yday + 7U - (tm->tm_wday+6U)%7) / 7;
+ /* If 1 Jan is just 1-3 days past Monday,
+ * the previous week is also in this year. */
+ if ((tm->tm_wday + 371U - tm->tm_yday - 2) % 7 <= 2)
+ val++;
+ if (!val) {
+ val = 52;
+ /* If 31 December of prev year a Thursday,
+ * or Friday of a leap year, then the
+ * prev year has 53 weeks. */
+ int dec31 = (tm->tm_wday + 7U - tm->tm_yday - 1) % 7;
+ if (dec31 == 4 || (dec31 == 5 && is_leap(tm->tm_year%400-1)))
+ val++;
+ } else if (val == 53) {
+ /* If 1 January is not a Thursday, and not
+ * a Wednesday of a leap year, then this
+ * year has only 52 weeks. */
+ int jan1 = (tm->tm_wday + 371U - tm->tm_yday) % 7;
+ if (jan1 != 4 && (jan1 != 3 || !is_leap(tm->tm_year)))
+ val = 1;
+ }
+ return val;
+}
+
+const char *__strftime_fmt_1(char (*s)[100], size_t *l, int f, const struct tm *tm, locale_t loc, int pad)
+{
+ nl_item item;
+ long long val;
+ const char *fmt = "-";
+ int width = 2, def_pad = '0';
+
+ switch (f) {
+ case 'a':
+ if (tm->tm_wday > 6U) goto string;
+ item = ABDAY_1 + tm->tm_wday;
+ goto nl_strcat;
+ case 'A':
+ if (tm->tm_wday > 6U) goto string;
+ item = DAY_1 + tm->tm_wday;
+ goto nl_strcat;
+ case 'h':
+ case 'b':
+ if (tm->tm_mon > 11U) goto string;
+ item = ABMON_1 + tm->tm_mon;
+ goto nl_strcat;
+ case 'B':
+ if (tm->tm_mon > 11U) goto string;
+ item = MON_1 + tm->tm_mon;
+ goto nl_strcat;
+ case 'c':
+ item = D_T_FMT;
+ goto nl_strftime;
+ case 'C':
+ val = (1900LL+tm->tm_year) / 100;
+ goto number;
+ case 'e':
+ def_pad = '_';
+ case 'd':
+ val = tm->tm_mday;
+ goto number;
+ case 'D':
+ fmt = "%m/%d/%y";
+ goto recu_strftime;
+ case 'F':
+ fmt = "%Y-%m-%d";
+ goto recu_strftime;
+ case 'g':
+ case 'G':
+ val = tm->tm_year + 1900LL;
+ if (tm->tm_yday < 3 && week_num(tm) != 1) val--;
+ else if (tm->tm_yday > 360 && week_num(tm) == 1) val++;
+ if (f=='g') val %= 100;
+ else width = 4;
+ goto number;
+ case 'H':
+ val = tm->tm_hour;
+ goto number;
+ case 'I':
+ val = tm->tm_hour;
+ if (!val) val = 12;
+ else if (val > 12) val -= 12;
+ goto number;
+ case 'j':
+ val = tm->tm_yday+1;
+ width = 3;
+ goto number;
+ case 'm':
+ val = tm->tm_mon+1;
+ goto number;
+ case 'M':
+ val = tm->tm_min;
+ goto number;
+ case 'n':
+ *l = 1;
+ return "\n";
+ case 'p':
+ item = tm->tm_hour >= 12 ? PM_STR : AM_STR;
+ goto nl_strcat;
+ case 'r':
+ item = T_FMT_AMPM;
+ goto nl_strftime;
+ case 'R':
+ fmt = "%H:%M";
+ goto recu_strftime;
+ case 's':
+ val = __tm_to_secs(tm) - tm->__tm_gmtoff;
+ width = 1;
+ goto number;
+ case 'S':
+ val = tm->tm_sec;
+ goto number;
+ case 't':
+ *l = 1;
+ return "\t";
+ case 'T':
+ fmt = "%H:%M:%S";
+ goto recu_strftime;
+ case 'u':
+ val = tm->tm_wday ? tm->tm_wday : 7;
+ width = 1;
+ goto number;
+ case 'U':
+ val = (tm->tm_yday + 7U - tm->tm_wday) / 7;
+ goto number;
+ case 'W':
+ val = (tm->tm_yday + 7U - (tm->tm_wday+6U)%7) / 7;
+ goto number;
+ case 'V':
+ val = week_num(tm);
+ goto number;
+ case 'w':
+ val = tm->tm_wday;
+ width = 1;
+ goto number;
+ case 'x':
+ item = D_FMT;
+ goto nl_strftime;
+ case 'X':
+ item = T_FMT;
+ goto nl_strftime;
+ case 'y':
+ val = (tm->tm_year + 1900LL) % 100;
+ if (val < 0) val = -val;
+ goto number;
+ case 'Y':
+ val = tm->tm_year + 1900LL;
+ if (val >= 10000) {
+ *l = snprintf(*s, sizeof *s, "+%lld", val);
+ return *s;
+ }
+ width = 4;
+ goto number;
+ case 'z':
+ if (tm->tm_isdst < 0) {
+ *l = 0;
+ return "";
+ }
+#ifdef __wasilibc_unmodified_upstream // wasi-libc's __tm_gmtoff is an int
+ *l = snprintf(*s, sizeof *s, "%+.4ld",
+#else
+ *l = snprintf(*s, sizeof *s, "%+.4d",
+#endif
+ tm->__tm_gmtoff/3600*100 + tm->__tm_gmtoff%3600/60);
+ return *s;
+ case 'Z':
+ if (tm->tm_isdst < 0) {
+ *l = 0;
+ return "";
+ }
+ fmt = __tm_to_tzname(tm);
+ goto string;
+ case '%':
+ *l = 1;
+ return "%";
+ default:
+ return 0;
+ }
+number:
+ switch (pad ? pad : def_pad) {
+ case '-': *l = snprintf(*s, sizeof *s, "%lld", val); break;
+ case '_': *l = snprintf(*s, sizeof *s, "%*lld", width, val); break;
+ case '0':
+ default: *l = snprintf(*s, sizeof *s, "%0*lld", width, val); break;
+ }
+ return *s;
+nl_strcat:
+ fmt = __nl_langinfo_l(item, loc);
+string:
+ *l = strlen(fmt);
+ return fmt;
+nl_strftime:
+ fmt = __nl_langinfo_l(item, loc);
+recu_strftime:
+ *l = __strftime_l(*s, sizeof *s, fmt, tm, loc);
+ if (!*l) return 0;
+ return *s;
+}
+
+size_t __strftime_l(char *restrict s, size_t n, const char *restrict f, const struct tm *restrict tm, locale_t loc)
+{
+ size_t l, k;
+ char buf[100];
+ char *p;
+ const char *t;
+ int pad, plus;
+ unsigned long width;
+ for (l=0; l<n; f++) {
+ if (!*f) {
+ s[l] = 0;
+ return l;
+ }
+ if (*f != '%') {
+ s[l++] = *f;
+ continue;
+ }
+ f++;
+ pad = 0;
+ if (*f == '-' || *f == '_' || *f == '0') pad = *f++;
+ if ((plus = (*f == '+'))) f++;
+ width = strtoul(f, &p, 10);
+ if (*p == 'C' || *p == 'F' || *p == 'G' || *p == 'Y') {
+ if (!width && p!=f) width = 1;
+ } else {
+ width = 0;
+ }
+ f = p;
+ if (*f == 'E' || *f == 'O') f++;
+ t = __strftime_fmt_1(&buf, &k, *f, tm, loc, pad);
+ if (!t) break;
+ if (width) {
+ /* Trim off any sign and leading zeros, then
+ * count remaining digits to determine behavior
+ * for the + flag. */
+ if (*t=='+' || *t=='-') t++, k--;
+ for (; *t=='0' && t[1]-'0'<10U; t++, k--);
+ if (width < k) width = k;
+ size_t d;
+ for (d=0; t[d]-'0'<10U; d++);
+ if (tm->tm_year < -1900) {
+ s[l++] = '-';
+ width--;
+ } else if (plus && d+(width-k) >= (*p=='C'?3:5)) {
+ s[l++] = '+';
+ width--;
+ }
+ for (; width > k && l < n; width--)
+ s[l++] = '0';
+ }
+ if (k > n-l) k = n-l;
+ memcpy(s+l, t, k);
+ l += k;
+ }
+ if (n) {
+ if (l==n) l=n-1;
+ s[l] = 0;
+ }
+ return 0;
+}
+
+size_t strftime(char *restrict s, size_t n, const char *restrict f, const struct tm *restrict tm)
+{
+ return __strftime_l(s, n, f, tm, CURRENT_LOCALE);
+}
+
+weak_alias(__strftime_l, strftime_l);
diff --git a/libc-top-half/musl/src/time/strptime.c b/libc-top-half/musl/src/time/strptime.c
new file mode 100644
index 0000000..c54a0d8
--- /dev/null
+++ b/libc-top-half/musl/src/time/strptime.c
@@ -0,0 +1,206 @@
+#include <stdlib.h>
+#include <langinfo.h>
+#include <time.h>
+#include <ctype.h>
+#include <stddef.h>
+#include <string.h>
+#include <strings.h>
+
+char *strptime(const char *restrict s, const char *restrict f, struct tm *restrict tm)
+{
+ int i, w, neg, adj, min, range, *dest, dummy;
+ const char *ex;
+ size_t len;
+ int want_century = 0, century = 0, relyear = 0;
+ while (*f) {
+ if (*f != '%') {
+ if (isspace(*f)) for (; *s && isspace(*s); s++);
+ else if (*s != *f) return 0;
+ else s++;
+ f++;
+ continue;
+ }
+ f++;
+ if (*f == '+') f++;
+ if (isdigit(*f)) {
+ char *new_f;
+ w=strtoul(f, &new_f, 10);
+ f = new_f;
+ } else {
+ w=-1;
+ }
+ adj=0;
+ switch (*f++) {
+ case 'a': case 'A':
+ dest = &tm->tm_wday;
+ min = ABDAY_1;
+ range = 7;
+ goto symbolic_range;
+ case 'b': case 'B': case 'h':
+ dest = &tm->tm_mon;
+ min = ABMON_1;
+ range = 12;
+ goto symbolic_range;
+ case 'c':
+ s = strptime(s, nl_langinfo(D_T_FMT), tm);
+ if (!s) return 0;
+ break;
+ case 'C':
+ dest = &century;
+ if (w<0) w=2;
+ want_century |= 2;
+ goto numeric_digits;
+ case 'd': case 'e':
+ dest = &tm->tm_mday;
+ min = 1;
+ range = 31;
+ goto numeric_range;
+ case 'D':
+ s = strptime(s, "%m/%d/%y", tm);
+ if (!s) return 0;
+ break;
+ case 'H':
+ dest = &tm->tm_hour;
+ min = 0;
+ range = 24;
+ goto numeric_range;
+ case 'I':
+ dest = &tm->tm_hour;
+ min = 1;
+ range = 12;
+ goto numeric_range;
+ case 'j':
+ dest = &tm->tm_yday;
+ min = 1;
+ range = 366;
+ adj = 1;
+ goto numeric_range;
+ case 'm':
+ dest = &tm->tm_mon;
+ min = 1;
+ range = 12;
+ adj = 1;
+ goto numeric_range;
+ case 'M':
+ dest = &tm->tm_min;
+ min = 0;
+ range = 60;
+ goto numeric_range;
+ case 'n': case 't':
+ for (; *s && isspace(*s); s++);
+ break;
+ case 'p':
+ ex = nl_langinfo(AM_STR);
+ len = strlen(ex);
+ if (!strncasecmp(s, ex, len)) {
+ tm->tm_hour %= 12;
+ s += len;
+ break;
+ }
+ ex = nl_langinfo(PM_STR);
+ len = strlen(ex);
+ if (!strncasecmp(s, ex, len)) {
+ tm->tm_hour %= 12;
+ tm->tm_hour += 12;
+ s += len;
+ break;
+ }
+ return 0;
+ case 'r':
+ s = strptime(s, nl_langinfo(T_FMT_AMPM), tm);
+ if (!s) return 0;
+ break;
+ case 'R':
+ s = strptime(s, "%H:%M", tm);
+ if (!s) return 0;
+ break;
+ case 'S':
+ dest = &tm->tm_sec;
+ min = 0;
+ range = 61;
+ goto numeric_range;
+ case 'T':
+ s = strptime(s, "%H:%M:%S", tm);
+ if (!s) return 0;
+ break;
+ case 'U':
+ case 'W':
+ /* Throw away result, for now. (FIXME?) */
+ dest = &dummy;
+ min = 0;
+ range = 54;
+ goto numeric_range;
+ case 'w':
+ dest = &tm->tm_wday;
+ min = 0;
+ range = 7;
+ goto numeric_range;
+ case 'x':
+ s = strptime(s, nl_langinfo(D_FMT), tm);
+ if (!s) return 0;
+ break;
+ case 'X':
+ s = strptime(s, nl_langinfo(T_FMT), tm);
+ if (!s) return 0;
+ break;
+ case 'y':
+ dest = &relyear;
+ w = 2;
+ want_century |= 1;
+ goto numeric_digits;
+ case 'Y':
+ dest = &tm->tm_year;
+ if (w<0) w=4;
+ adj = 1900;
+ want_century = 0;
+ goto numeric_digits;
+ case '%':
+ if (*s++ != '%') return 0;
+ break;
+ default:
+ return 0;
+ numeric_range:
+ if (!isdigit(*s)) return 0;
+ *dest = 0;
+ for (i=1; i<=min+range && isdigit(*s); i*=10)
+ *dest = *dest * 10 + *s++ - '0';
+ if (*dest - min >= (unsigned)range) return 0;
+ *dest -= adj;
+ switch((char *)dest - (char *)tm) {
+ case offsetof(struct tm, tm_yday):
+ ;
+ }
+ goto update;
+ numeric_digits:
+ neg = 0;
+ if (*s == '+') s++;
+ else if (*s == '-') neg=1, s++;
+ if (!isdigit(*s)) return 0;
+ for (*dest=i=0; i<w && isdigit(*s); i++)
+ *dest = *dest * 10 + *s++ - '0';
+ if (neg) *dest = -*dest;
+ *dest -= adj;
+ goto update;
+ symbolic_range:
+ for (i=2*range-1; i>=0; i--) {
+ ex = nl_langinfo(min+i);
+ len = strlen(ex);
+ if (strncasecmp(s, ex, len)) continue;
+ s += len;
+ *dest = i % range;
+ break;
+ }
+ if (i<0) return 0;
+ goto update;
+ update:
+ //FIXME
+ ;
+ }
+ }
+ if (want_century) {
+ tm->tm_year = relyear;
+ if (want_century & 2) tm->tm_year += century * 100 - 1900;
+ else if (tm->tm_year <= 68) tm->tm_year += 100;
+ }
+ return (char *)s;
+}
diff --git a/libc-top-half/musl/src/time/time.c b/libc-top-half/musl/src/time/time.c
new file mode 100644
index 0000000..ad0480f
--- /dev/null
+++ b/libc-top-half/musl/src/time/time.c
@@ -0,0 +1,10 @@
+#include <time.h>
+#include "syscall.h"
+
+time_t time(time_t *t)
+{
+ struct timespec ts;
+ __clock_gettime(CLOCK_REALTIME, &ts);
+ if (t) *t = ts.tv_sec;
+ return ts.tv_sec;
+}
diff --git a/libc-top-half/musl/src/time/time_impl.h b/libc-top-half/musl/src/time/time_impl.h
new file mode 100644
index 0000000..1a378c2
--- /dev/null
+++ b/libc-top-half/musl/src/time/time_impl.h
@@ -0,0 +1,15 @@
+#include <time.h>
+
+hidden int __days_in_month(int, int);
+hidden int __month_to_secs(int, int);
+hidden long long __year_to_secs(long long, int *);
+hidden long long __tm_to_secs(const struct tm *);
+hidden const char *__tm_to_tzname(const struct tm *);
+hidden int __secs_to_tm(long long, struct tm *);
+#ifdef __wasilibc_unmodified_upstream // type of __tm_gmtoff
+hidden void __secs_to_zone(long long, int, int *, long *, long *, const char **);
+#else
+hidden void __secs_to_zone(long long, int, int *, int *, long *, const char **);
+#endif
+hidden const char *__strftime_fmt_1(char (*)[100], size_t *, int, const struct tm *, locale_t, int);
+extern hidden const char __utc[];
diff --git a/libc-top-half/musl/src/time/timegm.c b/libc-top-half/musl/src/time/timegm.c
new file mode 100644
index 0000000..4e5907d
--- /dev/null
+++ b/libc-top-half/musl/src/time/timegm.c
@@ -0,0 +1,18 @@
+#define _GNU_SOURCE
+#include "time_impl.h"
+#include <errno.h>
+
+time_t timegm(struct tm *tm)
+{
+ struct tm new;
+ long long t = __tm_to_secs(tm);
+ if (__secs_to_tm(t, &new) < 0) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ *tm = new;
+ tm->tm_isdst = 0;
+ tm->__tm_gmtoff = 0;
+ tm->__tm_zone = __utc;
+ return t;
+}
diff --git a/libc-top-half/musl/src/time/timer_create.c b/libc-top-half/musl/src/time/timer_create.c
new file mode 100644
index 0000000..4bef239
--- /dev/null
+++ b/libc-top-half/musl/src/time/timer_create.c
@@ -0,0 +1,129 @@
+#include <time.h>
+#include <setjmp.h>
+#include <limits.h>
+#include "pthread_impl.h"
+#include "atomic.h"
+
+struct ksigevent {
+ union sigval sigev_value;
+ int sigev_signo;
+ int sigev_notify;
+ int sigev_tid;
+};
+
+struct start_args {
+ pthread_barrier_t b;
+ struct sigevent *sev;
+};
+
+static void dummy_0()
+{
+}
+weak_alias(dummy_0, __pthread_tsd_run_dtors);
+
+static void cleanup_fromsig(void *p)
+{
+ pthread_t self = __pthread_self();
+ __pthread_tsd_run_dtors();
+ self->cancel = 0;
+ self->cancelbuf = 0;
+ self->canceldisable = 0;
+ self->cancelasync = 0;
+ __reset_tls();
+ longjmp(p, 1);
+}
+
+static void *start(void *arg)
+{
+ pthread_t self = __pthread_self();
+ struct start_args *args = arg;
+ jmp_buf jb;
+
+ void (*notify)(union sigval) = args->sev->sigev_notify_function;
+ union sigval val = args->sev->sigev_value;
+
+ pthread_barrier_wait(&args->b);
+ for (;;) {
+ siginfo_t si;
+ while (sigwaitinfo(SIGTIMER_SET, &si) < 0);
+ if (si.si_code == SI_TIMER && !setjmp(jb)) {
+ pthread_cleanup_push(cleanup_fromsig, jb);
+ notify(val);
+ pthread_cleanup_pop(1);
+ }
+ if (self->timer_id < 0) break;
+ }
+ __syscall(SYS_timer_delete, self->timer_id & INT_MAX);
+ return 0;
+}
+
+int timer_create(clockid_t clk, struct sigevent *restrict evp, timer_t *restrict res)
+{
+ volatile static int init = 0;
+ pthread_t td;
+ pthread_attr_t attr;
+ int r;
+ struct start_args args;
+ struct ksigevent ksev, *ksevp=0;
+ int timerid;
+ sigset_t set;
+
+ switch (evp ? evp->sigev_notify : SIGEV_SIGNAL) {
+ case SIGEV_NONE:
+ case SIGEV_SIGNAL:
+ case SIGEV_THREAD_ID:
+ if (evp) {
+ ksev.sigev_value = evp->sigev_value;
+ ksev.sigev_signo = evp->sigev_signo;
+ ksev.sigev_notify = evp->sigev_notify;
+ if (evp->sigev_notify == SIGEV_THREAD_ID)
+ ksev.sigev_tid = evp->sigev_notify_thread_id;
+ else
+ ksev.sigev_tid = 0;
+ ksevp = &ksev;
+ }
+ if (syscall(SYS_timer_create, clk, ksevp, &timerid) < 0)
+ return -1;
+ *res = (void *)(intptr_t)timerid;
+ break;
+ case SIGEV_THREAD:
+ if (!init) {
+ struct sigaction sa = { .sa_handler = SIG_DFL };
+ __libc_sigaction(SIGTIMER, &sa, 0);
+ a_store(&init, 1);
+ }
+ if (evp->sigev_notify_attributes)
+ attr = *evp->sigev_notify_attributes;
+ else
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ pthread_barrier_init(&args.b, 0, 2);
+ args.sev = evp;
+
+ __block_app_sigs(&set);
+ __syscall(SYS_rt_sigprocmask, SIG_BLOCK, SIGTIMER_SET, 0, _NSIG/8);
+ r = pthread_create(&td, &attr, start, &args);
+ __restore_sigs(&set);
+ if (r) {
+ errno = r;
+ return -1;
+ }
+
+ ksev.sigev_value.sival_ptr = 0;
+ ksev.sigev_signo = SIGTIMER;
+ ksev.sigev_notify = SIGEV_THREAD_ID;
+ ksev.sigev_tid = td->tid;
+ if (syscall(SYS_timer_create, clk, &ksev, &timerid) < 0)
+ timerid = -1;
+ td->timer_id = timerid;
+ pthread_barrier_wait(&args.b);
+ if (timerid < 0) return -1;
+ *res = (void *)(INTPTR_MIN | (uintptr_t)td>>1);
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/libc-top-half/musl/src/time/timer_delete.c b/libc-top-half/musl/src/time/timer_delete.c
new file mode 100644
index 0000000..b0bfac0
--- /dev/null
+++ b/libc-top-half/musl/src/time/timer_delete.c
@@ -0,0 +1,14 @@
+#include <time.h>
+#include <limits.h>
+#include "pthread_impl.h"
+
+int timer_delete(timer_t t)
+{
+ if ((intptr_t)t < 0) {
+ pthread_t td = (void *)((uintptr_t)t << 1);
+ a_store(&td->timer_id, td->timer_id | INT_MIN);
+ __syscall(SYS_tkill, td->tid, SIGTIMER);
+ return 0;
+ }
+ return __syscall(SYS_timer_delete, t);
+}
diff --git a/libc-top-half/musl/src/time/timer_getoverrun.c b/libc-top-half/musl/src/time/timer_getoverrun.c
new file mode 100644
index 0000000..e7f891e
--- /dev/null
+++ b/libc-top-half/musl/src/time/timer_getoverrun.c
@@ -0,0 +1,12 @@
+#include <time.h>
+#include <limits.h>
+#include "pthread_impl.h"
+
+int timer_getoverrun(timer_t t)
+{
+ if ((intptr_t)t < 0) {
+ pthread_t td = (void *)((uintptr_t)t << 1);
+ t = (void *)(uintptr_t)(td->timer_id & INT_MAX);
+ }
+ return syscall(SYS_timer_getoverrun, t);
+}
diff --git a/libc-top-half/musl/src/time/timer_gettime.c b/libc-top-half/musl/src/time/timer_gettime.c
new file mode 100644
index 0000000..21c9d32
--- /dev/null
+++ b/libc-top-half/musl/src/time/timer_gettime.c
@@ -0,0 +1,28 @@
+#include <time.h>
+#include <limits.h>
+#include "pthread_impl.h"
+
+int timer_gettime(timer_t t, struct itimerspec *val)
+{
+ if ((intptr_t)t < 0) {
+ pthread_t td = (void *)((uintptr_t)t << 1);
+ t = (void *)(uintptr_t)(td->timer_id & INT_MAX);
+ }
+#ifdef SYS_timer_gettime64
+ int r = -ENOSYS;
+ if (sizeof(time_t) > 4)
+ r = __syscall(SYS_timer_gettime64, t, val);
+ if (SYS_timer_gettime == SYS_timer_gettime64 || r!=-ENOSYS)
+ return __syscall_ret(r);
+ long val32[4];
+ r = __syscall(SYS_timer_gettime, t, val32);
+ if (!r) {
+ val->it_interval.tv_sec = val32[0];
+ val->it_interval.tv_nsec = val32[1];
+ val->it_value.tv_sec = val32[2];
+ val->it_value.tv_nsec = val32[3];
+ }
+ return __syscall_ret(r);
+#endif
+ return syscall(SYS_timer_gettime, t, val);
+}
diff --git a/libc-top-half/musl/src/time/timer_settime.c b/libc-top-half/musl/src/time/timer_settime.c
new file mode 100644
index 0000000..373f00c
--- /dev/null
+++ b/libc-top-half/musl/src/time/timer_settime.c
@@ -0,0 +1,37 @@
+#include <time.h>
+#include <limits.h>
+#include "pthread_impl.h"
+
+#define IS32BIT(x) !((x)+0x80000000ULL>>32)
+
+int timer_settime(timer_t t, int flags, const struct itimerspec *restrict val, struct itimerspec *restrict old)
+{
+ if ((intptr_t)t < 0) {
+ pthread_t td = (void *)((uintptr_t)t << 1);
+ t = (void *)(uintptr_t)(td->timer_id & INT_MAX);
+ }
+#ifdef SYS_timer_settime64
+ time_t is = val->it_interval.tv_sec, vs = val->it_value.tv_sec;
+ long ins = val->it_interval.tv_nsec, vns = val->it_value.tv_nsec;
+ int r = -ENOSYS;
+ if (SYS_timer_settime == SYS_timer_settime64
+ || !IS32BIT(is) || !IS32BIT(vs) || (sizeof(time_t)>4 && old))
+ r = __syscall(SYS_timer_settime64, t, flags,
+ ((long long[]){is, ins, vs, vns}), old);
+ if (SYS_timer_settime == SYS_timer_settime64 || r!=-ENOSYS)
+ return __syscall_ret(r);
+ if (!IS32BIT(is) || !IS32BIT(vs))
+ return __syscall_ret(-ENOTSUP);
+ long old32[4];
+ r = __syscall(SYS_timer_settime, t, flags,
+ ((long[]){is, ins, vs, vns}), old32);
+ if (!r && old) {
+ old->it_interval.tv_sec = old32[0];
+ old->it_interval.tv_nsec = old32[1];
+ old->it_value.tv_sec = old32[2];
+ old->it_value.tv_nsec = old32[3];
+ }
+ return __syscall_ret(r);
+#endif
+ return syscall(SYS_timer_settime, t, flags, val, old);
+}
diff --git a/libc-top-half/musl/src/time/times.c b/libc-top-half/musl/src/time/times.c
new file mode 100644
index 0000000..c4a100f
--- /dev/null
+++ b/libc-top-half/musl/src/time/times.c
@@ -0,0 +1,7 @@
+#include <sys/times.h>
+#include "syscall.h"
+
+clock_t times(struct tms *tms)
+{
+ return __syscall(SYS_times, tms);
+}
diff --git a/libc-top-half/musl/src/time/timespec_get.c b/libc-top-half/musl/src/time/timespec_get.c
new file mode 100644
index 0000000..40ea9c1
--- /dev/null
+++ b/libc-top-half/musl/src/time/timespec_get.c
@@ -0,0 +1,10 @@
+#include <time.h>
+
+/* There is no other implemented value than TIME_UTC; all other values
+ * are considered erroneous. */
+int timespec_get(struct timespec * ts, int base)
+{
+ if (base != TIME_UTC) return 0;
+ int ret = __clock_gettime(CLOCK_REALTIME, ts);
+ return ret < 0 ? 0 : base;
+}
diff --git a/libc-top-half/musl/src/time/utime.c b/libc-top-half/musl/src/time/utime.c
new file mode 100644
index 0000000..e7592b2
--- /dev/null
+++ b/libc-top-half/musl/src/time/utime.c
@@ -0,0 +1,11 @@
+#include <utime.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <fcntl.h>
+
+int utime(const char *path, const struct utimbuf *times)
+{
+ return utimensat(AT_FDCWD, path, times ? ((struct timespec [2]){
+ { .tv_sec = times->actime }, { .tv_sec = times->modtime }})
+ : 0, 0);
+}
diff --git a/libc-top-half/musl/src/time/wcsftime.c b/libc-top-half/musl/src/time/wcsftime.c
new file mode 100644
index 0000000..8e1437b
--- /dev/null
+++ b/libc-top-half/musl/src/time/wcsftime.c
@@ -0,0 +1,71 @@
+#include <wchar.h>
+#include <time.h>
+#include <locale.h>
+#include "locale_impl.h"
+#include "time_impl.h"
+
+size_t __wcsftime_l(wchar_t *restrict s, size_t n, const wchar_t *restrict f, const struct tm *restrict tm, locale_t loc)
+{
+ size_t l, k;
+ char buf[100];
+ wchar_t wbuf[100];
+ wchar_t *p;
+ const char *t_mb;
+ const wchar_t *t;
+ int pad, plus;
+ unsigned long width;
+ for (l=0; l<n; f++) {
+ if (!*f) {
+ s[l] = 0;
+ return l;
+ }
+ if (*f != '%') {
+ s[l++] = *f;
+ continue;
+ }
+ f++;
+ pad = 0;
+ if (*f == '-' || *f == '_' || *f == '0') pad = *f++;
+ if ((plus = (*f == '+'))) f++;
+ width = wcstoul(f, &p, 10);
+ if (*p == 'C' || *p == 'F' || *p == 'G' || *p == 'Y') {
+ if (!width && p!=f) width = 1;
+ } else {
+ width = 0;
+ }
+ f = p;
+ if (*f == 'E' || *f == 'O') f++;
+ t_mb = __strftime_fmt_1(&buf, &k, *f, tm, loc, pad);
+ if (!t_mb) break;
+ k = mbstowcs(wbuf, t_mb, sizeof wbuf / sizeof *wbuf);
+ if (k == (size_t)-1) return 0;
+ t = wbuf;
+ if (width) {
+ for (; *t=='+' || *t=='-' || (*t=='0'&&t[1]); t++, k--);
+ width--;
+ if (plus && tm->tm_year >= 10000-1900)
+ s[l++] = '+';
+ else if (tm->tm_year < -1900)
+ s[l++] = '-';
+ else
+ width++;
+ for (; width > k && l < n; width--)
+ s[l++] = '0';
+ }
+ if (k >= n-l) k = n-l;
+ wmemcpy(s+l, t, k);
+ l += k;
+ }
+ if (n) {
+ if (l==n) l=n-1;
+ s[l] = 0;
+ }
+ return 0;
+}
+
+size_t wcsftime(wchar_t *restrict wcs, size_t n, const wchar_t *restrict f, const struct tm *restrict tm)
+{
+ return __wcsftime_l(wcs, n, f, tm, CURRENT_LOCALE);
+}
+
+weak_alias(__wcsftime_l, wcsftime_l);
diff --git a/libc-top-half/musl/src/unistd/_exit.c b/libc-top-half/musl/src/unistd/_exit.c
new file mode 100644
index 0000000..7699482
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/_exit.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include <stdlib.h>
+
+_Noreturn void _exit(int status)
+{
+ _Exit(status);
+}
diff --git a/libc-top-half/musl/src/unistd/access.c b/libc-top-half/musl/src/unistd/access.c
new file mode 100644
index 0000000..d6eed68
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/access.c
@@ -0,0 +1,12 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int access(const char *filename, int amode)
+{
+#ifdef SYS_access
+ return syscall(SYS_access, filename, amode);
+#else
+ return syscall(SYS_faccessat, AT_FDCWD, filename, amode, 0);
+#endif
+}
diff --git a/libc-top-half/musl/src/unistd/acct.c b/libc-top-half/musl/src/unistd/acct.c
new file mode 100644
index 0000000..308ffc3
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/acct.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include "syscall.h"
+
+int acct(const char *filename)
+{
+ return syscall(SYS_acct, filename);
+}
diff --git a/libc-top-half/musl/src/unistd/alarm.c b/libc-top-half/musl/src/unistd/alarm.c
new file mode 100644
index 0000000..a5e0c82
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/alarm.c
@@ -0,0 +1,10 @@
+#include <unistd.h>
+#include <sys/time.h>
+#include "syscall.h"
+
+unsigned alarm(unsigned seconds)
+{
+ struct itimerval it = { .it_value.tv_sec = seconds }, old = { 0 };
+ setitimer(ITIMER_REAL, &it, &old);
+ return old.it_value.tv_sec + !!old.it_value.tv_usec;
+}
diff --git a/libc-top-half/musl/src/unistd/chdir.c b/libc-top-half/musl/src/unistd/chdir.c
new file mode 100644
index 0000000..5ba78b6
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/chdir.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int chdir(const char *path)
+{
+ return syscall(SYS_chdir, path);
+}
diff --git a/libc-top-half/musl/src/unistd/chown.c b/libc-top-half/musl/src/unistd/chown.c
new file mode 100644
index 0000000..14b0325
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/chown.c
@@ -0,0 +1,12 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int chown(const char *path, uid_t uid, gid_t gid)
+{
+#ifdef SYS_chown
+ return syscall(SYS_chown, path, uid, gid);
+#else
+ return syscall(SYS_fchownat, AT_FDCWD, path, uid, gid, 0);
+#endif
+}
diff --git a/libc-top-half/musl/src/unistd/close.c b/libc-top-half/musl/src/unistd/close.c
new file mode 100644
index 0000000..a2105f5
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/close.c
@@ -0,0 +1,19 @@
+#include <unistd.h>
+#include <errno.h>
+#include "aio_impl.h"
+#include "syscall.h"
+
+static int dummy(int fd)
+{
+ return fd;
+}
+
+weak_alias(dummy, __aio_close);
+
+int close(int fd)
+{
+ fd = __aio_close(fd);
+ int r = __syscall_cp(SYS_close, fd);
+ if (r == -EINTR) r = 0;
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/unistd/ctermid.c b/libc-top-half/musl/src/unistd/ctermid.c
new file mode 100644
index 0000000..1612770
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/ctermid.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+#include <string.h>
+
+char *ctermid(char *s)
+{
+ return s ? strcpy(s, "/dev/tty") : "/dev/tty";
+}
diff --git a/libc-top-half/musl/src/unistd/dup.c b/libc-top-half/musl/src/unistd/dup.c
new file mode 100644
index 0000000..7fee012
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/dup.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int dup(int fd)
+{
+ return syscall(SYS_dup, fd);
+}
diff --git a/libc-top-half/musl/src/unistd/dup2.c b/libc-top-half/musl/src/unistd/dup2.c
new file mode 100644
index 0000000..8f43c6d
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/dup2.c
@@ -0,0 +1,20 @@
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int dup2(int old, int new)
+{
+ int r;
+#ifdef SYS_dup2
+ while ((r=__syscall(SYS_dup2, old, new))==-EBUSY);
+#else
+ if (old==new) {
+ r = __syscall(SYS_fcntl, old, F_GETFD);
+ if (r >= 0) return old;
+ } else {
+ while ((r=__syscall(SYS_dup3, old, new, 0))==-EBUSY);
+ }
+#endif
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/unistd/dup3.c b/libc-top-half/musl/src/unistd/dup3.c
new file mode 100644
index 0000000..f919f79
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/dup3.c
@@ -0,0 +1,24 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int __dup3(int old, int new, int flags)
+{
+ int r;
+#ifdef SYS_dup2
+ if (old==new) return __syscall_ret(-EINVAL);
+ if (flags & O_CLOEXEC) {
+ while ((r=__syscall(SYS_dup3, old, new, flags))==-EBUSY);
+ if (r!=-ENOSYS) return __syscall_ret(r);
+ }
+ while ((r=__syscall(SYS_dup2, old, new))==-EBUSY);
+ if (flags & O_CLOEXEC) __syscall(SYS_fcntl, new, F_SETFD, FD_CLOEXEC);
+#else
+ while ((r=__syscall(SYS_dup3, old, new, flags))==-EBUSY);
+#endif
+ return __syscall_ret(r);
+}
+
+weak_alias(__dup3, dup3);
diff --git a/libc-top-half/musl/src/unistd/faccessat.c b/libc-top-half/musl/src/unistd/faccessat.c
new file mode 100644
index 0000000..557503e
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/faccessat.c
@@ -0,0 +1,61 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/wait.h>
+#include "syscall.h"
+#include "pthread_impl.h"
+
+struct ctx {
+ int fd;
+ const char *filename;
+ int amode;
+ int p;
+};
+
+static int checker(void *p)
+{
+ struct ctx *c = p;
+ int ret;
+ if (__syscall(SYS_setregid, __syscall(SYS_getegid), -1)
+ || __syscall(SYS_setreuid, __syscall(SYS_geteuid), -1))
+ __syscall(SYS_exit, 1);
+ ret = __syscall(SYS_faccessat, c->fd, c->filename, c->amode, 0);
+ __syscall(SYS_write, c->p, &ret, sizeof ret);
+ return 0;
+}
+
+int faccessat(int fd, const char *filename, int amode, int flag)
+{
+ if (flag) {
+ int ret = __syscall(SYS_faccessat2, fd, filename, amode, flag);
+ if (ret != -ENOSYS) return __syscall_ret(ret);
+ }
+
+ if (flag & ~AT_EACCESS)
+ return __syscall_ret(-EINVAL);
+
+ if (!flag || (getuid()==geteuid() && getgid()==getegid()))
+ return syscall(SYS_faccessat, fd, filename, amode);
+
+ char stack[1024];
+ sigset_t set;
+ pid_t pid;
+ int status;
+ int ret, p[2];
+
+ if (pipe2(p, O_CLOEXEC)) return __syscall_ret(-EBUSY);
+ struct ctx c = { .fd = fd, .filename = filename, .amode = amode, .p = p[1] };
+
+ __block_all_sigs(&set);
+
+ pid = __clone(checker, stack+sizeof stack, 0, &c);
+ __syscall(SYS_close, p[1]);
+
+ if (pid<0 || __syscall(SYS_read, p[0], &ret, sizeof ret) != sizeof(ret))
+ ret = -EBUSY;
+ __syscall(SYS_close, p[0]);
+ __syscall(SYS_wait4, pid, &status, __WCLONE, 0);
+
+ __restore_sigs(&set);
+
+ return __syscall_ret(ret);
+}
diff --git a/libc-top-half/musl/src/unistd/fchdir.c b/libc-top-half/musl/src/unistd/fchdir.c
new file mode 100644
index 0000000..dee45ba
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/fchdir.c
@@ -0,0 +1,15 @@
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int fchdir(int fd)
+{
+ int ret = __syscall(SYS_fchdir, fd);
+ if (ret != -EBADF || __syscall(SYS_fcntl, fd, F_GETFD) < 0)
+ return __syscall_ret(ret);
+
+ char buf[15+3*sizeof(int)];
+ __procfdname(buf, fd);
+ return syscall(SYS_chdir, buf);
+}
diff --git a/libc-top-half/musl/src/unistd/fchown.c b/libc-top-half/musl/src/unistd/fchown.c
new file mode 100644
index 0000000..737b367
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/fchown.c
@@ -0,0 +1,20 @@
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int fchown(int fd, uid_t uid, gid_t gid)
+{
+ int ret = __syscall(SYS_fchown, fd, uid, gid);
+ if (ret != -EBADF || __syscall(SYS_fcntl, fd, F_GETFD) < 0)
+ return __syscall_ret(ret);
+
+ char buf[15+3*sizeof(int)];
+ __procfdname(buf, fd);
+#ifdef SYS_chown
+ return syscall(SYS_chown, buf, uid, gid);
+#else
+ return syscall(SYS_fchownat, AT_FDCWD, buf, uid, gid, 0);
+#endif
+
+}
diff --git a/libc-top-half/musl/src/unistd/fchownat.c b/libc-top-half/musl/src/unistd/fchownat.c
new file mode 100644
index 0000000..62457a3
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/fchownat.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int fchownat(int fd, const char *path, uid_t uid, gid_t gid, int flag)
+{
+ return syscall(SYS_fchownat, fd, path, uid, gid, flag);
+}
diff --git a/libc-top-half/musl/src/unistd/fdatasync.c b/libc-top-half/musl/src/unistd/fdatasync.c
new file mode 100644
index 0000000..3895ae5
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/fdatasync.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int fdatasync(int fd)
+{
+ return syscall_cp(SYS_fdatasync, fd);
+}
diff --git a/libc-top-half/musl/src/unistd/fsync.c b/libc-top-half/musl/src/unistd/fsync.c
new file mode 100644
index 0000000..7a1c80b
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/fsync.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int fsync(int fd)
+{
+ return syscall_cp(SYS_fsync, fd);
+}
diff --git a/libc-top-half/musl/src/unistd/ftruncate.c b/libc-top-half/musl/src/unistd/ftruncate.c
new file mode 100644
index 0000000..b41be0f
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/ftruncate.c
@@ -0,0 +1,9 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int ftruncate(int fd, off_t length)
+{
+ return syscall(SYS_ftruncate, fd, __SYSCALL_LL_O(length));
+}
+
+weak_alias(ftruncate, ftruncate64);
diff --git a/libc-top-half/musl/src/unistd/getcwd.c b/libc-top-half/musl/src/unistd/getcwd.c
new file mode 100644
index 0000000..f407ffe
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/getcwd.c
@@ -0,0 +1,25 @@
+#include <unistd.h>
+#include <errno.h>
+#include <limits.h>
+#include <string.h>
+#include "syscall.h"
+
+char *getcwd(char *buf, size_t size)
+{
+ char tmp[buf ? 1 : PATH_MAX];
+ if (!buf) {
+ buf = tmp;
+ size = sizeof tmp;
+ } else if (!size) {
+ errno = EINVAL;
+ return 0;
+ }
+ long ret = syscall(SYS_getcwd, buf, size);
+ if (ret < 0)
+ return 0;
+ if (ret == 0 || buf[0] != '/') {
+ errno = ENOENT;
+ return 0;
+ }
+ return buf == tmp ? strdup(buf) : buf;
+}
diff --git a/libc-top-half/musl/src/unistd/getegid.c b/libc-top-half/musl/src/unistd/getegid.c
new file mode 100644
index 0000000..6287490
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/getegid.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+gid_t getegid(void)
+{
+ return __syscall(SYS_getegid);
+}
diff --git a/libc-top-half/musl/src/unistd/geteuid.c b/libc-top-half/musl/src/unistd/geteuid.c
new file mode 100644
index 0000000..88f2cd5
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/geteuid.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+uid_t geteuid(void)
+{
+ return __syscall(SYS_geteuid);
+}
diff --git a/libc-top-half/musl/src/unistd/getgid.c b/libc-top-half/musl/src/unistd/getgid.c
new file mode 100644
index 0000000..1c9fe71
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/getgid.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+gid_t getgid(void)
+{
+ return __syscall(SYS_getgid);
+}
diff --git a/libc-top-half/musl/src/unistd/getgroups.c b/libc-top-half/musl/src/unistd/getgroups.c
new file mode 100644
index 0000000..0e6e63a
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/getgroups.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int getgroups(int count, gid_t list[])
+{
+ return syscall(SYS_getgroups, count, list);
+}
diff --git a/libc-top-half/musl/src/unistd/gethostname.c b/libc-top-half/musl/src/unistd/gethostname.c
new file mode 100644
index 0000000..633ef57
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/gethostname.c
@@ -0,0 +1,13 @@
+#include <unistd.h>
+#include <sys/utsname.h>
+
+int gethostname(char *name, size_t len)
+{
+ size_t i;
+ struct utsname uts;
+ if (uname(&uts)) return -1;
+ if (len > sizeof uts.nodename) len = sizeof uts.nodename;
+ for (i=0; i<len && (name[i] = uts.nodename[i]); i++);
+ if (i && i==len) name[i-1] = 0;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/unistd/getlogin.c b/libc-top-half/musl/src/unistd/getlogin.c
new file mode 100644
index 0000000..0601191
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/getlogin.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include <stdlib.h>
+
+char *getlogin(void)
+{
+ return getenv("LOGNAME");
+}
diff --git a/libc-top-half/musl/src/unistd/getlogin_r.c b/libc-top-half/musl/src/unistd/getlogin_r.c
new file mode 100644
index 0000000..53866c6
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/getlogin_r.c
@@ -0,0 +1,12 @@
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+int getlogin_r(char *name, size_t size)
+{
+ char *logname = getlogin();
+ if (!logname) return ENXIO; /* or...? */
+ if (strlen(logname) >= size) return ERANGE;
+ strcpy(name, logname);
+ return 0;
+}
diff --git a/libc-top-half/musl/src/unistd/getpgid.c b/libc-top-half/musl/src/unistd/getpgid.c
new file mode 100644
index 0000000..d295bfd
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/getpgid.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+pid_t getpgid(pid_t pid)
+{
+ return syscall(SYS_getpgid, pid);
+}
diff --git a/libc-top-half/musl/src/unistd/getpgrp.c b/libc-top-half/musl/src/unistd/getpgrp.c
new file mode 100644
index 0000000..90e9bb0
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/getpgrp.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+pid_t getpgrp(void)
+{
+ return __syscall(SYS_getpgid, 0);
+}
diff --git a/libc-top-half/musl/src/unistd/getpid.c b/libc-top-half/musl/src/unistd/getpid.c
new file mode 100644
index 0000000..a6d4e6d
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/getpid.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+pid_t getpid(void)
+{
+ return __syscall(SYS_getpid);
+}
diff --git a/libc-top-half/musl/src/unistd/getppid.c b/libc-top-half/musl/src/unistd/getppid.c
new file mode 100644
index 0000000..05cade5
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/getppid.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+pid_t getppid(void)
+{
+ return __syscall(SYS_getppid);
+}
diff --git a/libc-top-half/musl/src/unistd/getsid.c b/libc-top-half/musl/src/unistd/getsid.c
new file mode 100644
index 0000000..93ba690
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/getsid.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+pid_t getsid(pid_t pid)
+{
+ return syscall(SYS_getsid, pid);
+}
diff --git a/libc-top-half/musl/src/unistd/getuid.c b/libc-top-half/musl/src/unistd/getuid.c
new file mode 100644
index 0000000..61309d1
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/getuid.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+uid_t getuid(void)
+{
+ return __syscall(SYS_getuid);
+}
diff --git a/libc-top-half/musl/src/unistd/isatty.c b/libc-top-half/musl/src/unistd/isatty.c
new file mode 100644
index 0000000..75a9c18
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/isatty.c
@@ -0,0 +1,13 @@
+#include <unistd.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include "syscall.h"
+
+int isatty(int fd)
+{
+ struct winsize wsz;
+ unsigned long r = syscall(SYS_ioctl, fd, TIOCGWINSZ, &wsz);
+ if (r == 0) return 1;
+ if (errno != EBADF) errno = ENOTTY;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/unistd/lchown.c b/libc-top-half/musl/src/unistd/lchown.c
new file mode 100644
index 0000000..ccd5ee0
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/lchown.c
@@ -0,0 +1,12 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int lchown(const char *path, uid_t uid, gid_t gid)
+{
+#ifdef SYS_lchown
+ return syscall(SYS_lchown, path, uid, gid);
+#else
+ return syscall(SYS_fchownat, AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW);
+#endif
+}
diff --git a/libc-top-half/musl/src/unistd/link.c b/libc-top-half/musl/src/unistd/link.c
new file mode 100644
index 0000000..feec18e
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/link.c
@@ -0,0 +1,12 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int link(const char *existing, const char *new)
+{
+#ifdef SYS_link
+ return syscall(SYS_link, existing, new);
+#else
+ return syscall(SYS_linkat, AT_FDCWD, existing, AT_FDCWD, new, 0);
+#endif
+}
diff --git a/libc-top-half/musl/src/unistd/linkat.c b/libc-top-half/musl/src/unistd/linkat.c
new file mode 100644
index 0000000..6a9a0b7
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/linkat.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int linkat(int fd1, const char *existing, int fd2, const char *new, int flag)
+{
+ return syscall(SYS_linkat, fd1, existing, fd2, new, flag);
+}
diff --git a/libc-top-half/musl/src/unistd/lseek.c b/libc-top-half/musl/src/unistd/lseek.c
new file mode 100644
index 0000000..48a638a
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/lseek.c
@@ -0,0 +1,23 @@
+#include <unistd.h>
+#include "syscall.h"
+
+off_t __lseek(int fd, off_t offset, int whence)
+{
+#ifdef SYS__llseek
+ off_t result;
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ return syscall(SYS__llseek, fd, offset>>32, offset, &result, whence) ? -1 : result;
+#else
+ return llseek(fd, offset>>32, offset, &result, whence) ? -1 : result;
+#endif
+#else
+#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
+ return syscall(SYS_lseek, fd, offset, whence);
+#else
+ return lseek(fd, offset, whence);
+#endif
+#endif
+}
+
+weak_alias(__lseek, lseek);
+weak_alias(__lseek, lseek64);
diff --git a/libc-top-half/musl/src/unistd/mips/pipe.s b/libc-top-half/musl/src/unistd/mips/pipe.s
new file mode 100644
index 0000000..ba2c39a
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/mips/pipe.s
@@ -0,0 +1,20 @@
+.set noreorder
+
+.global pipe
+.type pipe,@function
+pipe:
+ lui $gp, %hi(_gp_disp)
+ addiu $gp, %lo(_gp_disp)
+ addu $gp, $gp, $25
+ li $2, 4042
+ syscall
+ beq $7, $0, 1f
+ nop
+ lw $25, %call16(__syscall_ret)($gp)
+ jr $25
+ subu $4, $0, $2
+1: sw $2, 0($4)
+ sw $3, 4($4)
+ move $2, $0
+ jr $ra
+ nop
diff --git a/libc-top-half/musl/src/unistd/mips64/pipe.s b/libc-top-half/musl/src/unistd/mips64/pipe.s
new file mode 100644
index 0000000..f8a27dc
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/mips64/pipe.s
@@ -0,0 +1,19 @@
+.set noreorder
+.global pipe
+.type pipe,@function
+pipe:
+ lui $3, %hi(%neg(%gp_rel(pipe)))
+ daddiu $3, $3, %lo(%neg(%gp_rel(pipe)))
+ daddu $3, $3, $25
+ li $2, 5021
+ syscall
+ beq $7, $0, 1f
+ nop
+ ld $25, %got_disp(__syscall_ret)($3)
+ jr $25
+ dsubu $4, $0, $2
+1: sw $2, 0($4)
+ sw $3, 4($4)
+ move $2, $0
+ jr $ra
+ nop
diff --git a/libc-top-half/musl/src/unistd/mipsn32/lseek.c b/libc-top-half/musl/src/unistd/mipsn32/lseek.c
new file mode 100644
index 0000000..60e74a5
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/mipsn32/lseek.c
@@ -0,0 +1,20 @@
+#include <unistd.h>
+#include "syscall.h"
+
+off_t __lseek(int fd, off_t offset, int whence)
+{
+ register long long r4 __asm__("$4") = fd;
+ register long long r5 __asm__("$5") = offset;
+ register long long r6 __asm__("$6") = whence;
+ register long long r7 __asm__("$7");
+ register long long r2 __asm__("$2") = SYS_lseek;
+ __asm__ __volatile__ (
+ "syscall"
+ : "+&r"(r2), "=r"(r7)
+ : "r"(r4), "r"(r5), "r"(r6)
+ : SYSCALL_CLOBBERLIST);
+ return r7 ? __syscall_ret(-r2) : r2;
+}
+
+weak_alias(__lseek, lseek);
+weak_alias(__lseek, lseek64);
diff --git a/libc-top-half/musl/src/unistd/mipsn32/pipe.s b/libc-top-half/musl/src/unistd/mipsn32/pipe.s
new file mode 100644
index 0000000..80f882e
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/mipsn32/pipe.s
@@ -0,0 +1,19 @@
+.set noreorder
+.global pipe
+.type pipe,@function
+pipe:
+ lui $3, %hi(%neg(%gp_rel(pipe)))
+ addiu $3, $3, %lo(%neg(%gp_rel(pipe)))
+ addu $3, $3, $25
+ li $2, 6021
+ syscall
+ beq $7, $0, 1f
+ nop
+ lw $25, %got_disp(__syscall_ret)($3)
+ jr $25
+ subu $4, $0, $2
+1: sw $2, 0($4)
+ sw $3, 4($4)
+ move $2, $0
+ jr $ra
+ nop
diff --git a/libc-top-half/musl/src/unistd/nice.c b/libc-top-half/musl/src/unistd/nice.c
new file mode 100644
index 0000000..1c2295f
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/nice.c
@@ -0,0 +1,23 @@
+#include <unistd.h>
+#include <errno.h>
+#include <sys/resource.h>
+#include <limits.h>
+#include "syscall.h"
+
+int nice(int inc)
+{
+ int prio = inc;
+ // Only query old priority if it can affect the result.
+ // This also avoids issues with integer overflow.
+ if (inc > -2*NZERO && inc < 2*NZERO)
+ prio += getpriority(PRIO_PROCESS, 0);
+ if (prio > NZERO-1) prio = NZERO-1;
+ if (prio < -NZERO) prio = -NZERO;
+ if (setpriority(PRIO_PROCESS, 0, prio)) {
+ if (errno == EACCES)
+ errno = EPERM;
+ return -1;
+ } else {
+ return prio;
+ }
+}
diff --git a/libc-top-half/musl/src/unistd/pause.c b/libc-top-half/musl/src/unistd/pause.c
new file mode 100644
index 0000000..90bbf4c
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/pause.c
@@ -0,0 +1,11 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int pause(void)
+{
+#ifdef SYS_pause
+ return syscall_cp(SYS_pause);
+#else
+ return syscall_cp(SYS_ppoll, 0, 0, 0, 0);
+#endif
+}
diff --git a/libc-top-half/musl/src/unistd/pipe.c b/libc-top-half/musl/src/unistd/pipe.c
new file mode 100644
index 0000000..d07b8d2
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/pipe.c
@@ -0,0 +1,11 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int pipe(int fd[2])
+{
+#ifdef SYS_pipe
+ return syscall(SYS_pipe, fd);
+#else
+ return syscall(SYS_pipe2, fd, 0);
+#endif
+}
diff --git a/libc-top-half/musl/src/unistd/pipe2.c b/libc-top-half/musl/src/unistd/pipe2.c
new file mode 100644
index 0000000..f24f74f
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/pipe2.c
@@ -0,0 +1,22 @@
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int pipe2(int fd[2], int flag)
+{
+ if (!flag) return pipe(fd);
+ int ret = __syscall(SYS_pipe2, fd, flag);
+ if (ret != -ENOSYS) return __syscall_ret(ret);
+ ret = pipe(fd);
+ if (ret) return ret;
+ if (flag & O_CLOEXEC) {
+ __syscall(SYS_fcntl, fd[0], F_SETFD, FD_CLOEXEC);
+ __syscall(SYS_fcntl, fd[1], F_SETFD, FD_CLOEXEC);
+ }
+ if (flag & O_NONBLOCK) {
+ __syscall(SYS_fcntl, fd[0], F_SETFL, O_NONBLOCK);
+ __syscall(SYS_fcntl, fd[1], F_SETFL, O_NONBLOCK);
+ }
+ return 0;
+}
diff --git a/libc-top-half/musl/src/unistd/posix_close.c b/libc-top-half/musl/src/unistd/posix_close.c
new file mode 100644
index 0000000..90f51a8
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/posix_close.c
@@ -0,0 +1,6 @@
+#include <unistd.h>
+
+int posix_close(int fd, int flags)
+{
+ return close(fd);
+}
diff --git a/libc-top-half/musl/src/unistd/pread.c b/libc-top-half/musl/src/unistd/pread.c
new file mode 100644
index 0000000..5681b04
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/pread.c
@@ -0,0 +1,9 @@
+#include <unistd.h>
+#include "syscall.h"
+
+ssize_t pread(int fd, void *buf, size_t size, off_t ofs)
+{
+ return syscall_cp(SYS_pread, fd, buf, size, __SYSCALL_LL_PRW(ofs));
+}
+
+weak_alias(pread, pread64);
diff --git a/libc-top-half/musl/src/unistd/preadv.c b/libc-top-half/musl/src/unistd/preadv.c
new file mode 100644
index 0000000..8376d60
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/preadv.c
@@ -0,0 +1,12 @@
+#define _BSD_SOURCE
+#include <sys/uio.h>
+#include <unistd.h>
+#include "syscall.h"
+
+ssize_t preadv(int fd, const struct iovec *iov, int count, off_t ofs)
+{
+ return syscall_cp(SYS_preadv, fd, iov, count,
+ (long)(ofs), (long)(ofs>>32));
+}
+
+weak_alias(preadv, preadv64);
diff --git a/libc-top-half/musl/src/unistd/pwrite.c b/libc-top-half/musl/src/unistd/pwrite.c
new file mode 100644
index 0000000..ca37657
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/pwrite.c
@@ -0,0 +1,9 @@
+#include <unistd.h>
+#include "syscall.h"
+
+ssize_t pwrite(int fd, const void *buf, size_t size, off_t ofs)
+{
+ return syscall_cp(SYS_pwrite, fd, buf, size, __SYSCALL_LL_PRW(ofs));
+}
+
+weak_alias(pwrite, pwrite64);
diff --git a/libc-top-half/musl/src/unistd/pwritev.c b/libc-top-half/musl/src/unistd/pwritev.c
new file mode 100644
index 0000000..f5a612c
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/pwritev.c
@@ -0,0 +1,12 @@
+#define _BSD_SOURCE
+#include <sys/uio.h>
+#include <unistd.h>
+#include "syscall.h"
+
+ssize_t pwritev(int fd, const struct iovec *iov, int count, off_t ofs)
+{
+ return syscall_cp(SYS_pwritev, fd, iov, count,
+ (long)(ofs), (long)(ofs>>32));
+}
+
+weak_alias(pwritev, pwritev64);
diff --git a/libc-top-half/musl/src/unistd/read.c b/libc-top-half/musl/src/unistd/read.c
new file mode 100644
index 0000000..f3589c0
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/read.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+ssize_t read(int fd, void *buf, size_t count)
+{
+ return syscall_cp(SYS_read, fd, buf, count);
+}
diff --git a/libc-top-half/musl/src/unistd/readlink.c b/libc-top-half/musl/src/unistd/readlink.c
new file mode 100644
index 0000000..32f4537
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/readlink.c
@@ -0,0 +1,19 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize)
+{
+ char dummy[1];
+ if (!bufsize) {
+ buf = dummy;
+ bufsize = 1;
+ }
+#ifdef SYS_readlink
+ int r = __syscall(SYS_readlink, path, buf, bufsize);
+#else
+ int r = __syscall(SYS_readlinkat, AT_FDCWD, path, buf, bufsize);
+#endif
+ if (buf == dummy && r > 0) r = 0;
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/unistd/readlinkat.c b/libc-top-half/musl/src/unistd/readlinkat.c
new file mode 100644
index 0000000..f79d3d1
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/readlinkat.c
@@ -0,0 +1,14 @@
+#include <unistd.h>
+#include "syscall.h"
+
+ssize_t readlinkat(int fd, const char *restrict path, char *restrict buf, size_t bufsize)
+{
+ char dummy[1];
+ if (!bufsize) {
+ buf = dummy;
+ bufsize = 1;
+ }
+ int r = __syscall(SYS_readlinkat, fd, path, buf, bufsize);
+ if (buf == dummy && r > 0) r = 0;
+ return __syscall_ret(r);
+}
diff --git a/libc-top-half/musl/src/unistd/readv.c b/libc-top-half/musl/src/unistd/readv.c
new file mode 100644
index 0000000..91e6de8
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/readv.c
@@ -0,0 +1,7 @@
+#include <sys/uio.h>
+#include "syscall.h"
+
+ssize_t readv(int fd, const struct iovec *iov, int count)
+{
+ return syscall_cp(SYS_readv, fd, iov, count);
+}
diff --git a/libc-top-half/musl/src/unistd/renameat.c b/libc-top-half/musl/src/unistd/renameat.c
new file mode 100644
index 0000000..c3b40a2
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/renameat.c
@@ -0,0 +1,11 @@
+#include <stdio.h>
+#include "syscall.h"
+
+int renameat(int oldfd, const char *old, int newfd, const char *new)
+{
+#ifdef SYS_renameat
+ return syscall(SYS_renameat, oldfd, old, newfd, new);
+#else
+ return syscall(SYS_renameat2, oldfd, old, newfd, new, 0);
+#endif
+}
diff --git a/libc-top-half/musl/src/unistd/rmdir.c b/libc-top-half/musl/src/unistd/rmdir.c
new file mode 100644
index 0000000..6825ffc
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/rmdir.c
@@ -0,0 +1,12 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int rmdir(const char *path)
+{
+#ifdef SYS_rmdir
+ return syscall(SYS_rmdir, path);
+#else
+ return syscall(SYS_unlinkat, AT_FDCWD, path, AT_REMOVEDIR);
+#endif
+}
diff --git a/libc-top-half/musl/src/unistd/setegid.c b/libc-top-half/musl/src/unistd/setegid.c
new file mode 100644
index 0000000..e6da257
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/setegid.c
@@ -0,0 +1,8 @@
+#include <unistd.h>
+#include "libc.h"
+#include "syscall.h"
+
+int setegid(gid_t egid)
+{
+ return __setxid(SYS_setresgid, -1, egid, -1);
+}
diff --git a/libc-top-half/musl/src/unistd/seteuid.c b/libc-top-half/musl/src/unistd/seteuid.c
new file mode 100644
index 0000000..ef8b9df
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/seteuid.c
@@ -0,0 +1,8 @@
+#include <unistd.h>
+#include "syscall.h"
+#include "libc.h"
+
+int seteuid(uid_t euid)
+{
+ return __setxid(SYS_setresuid, -1, euid, -1);
+}
diff --git a/libc-top-half/musl/src/unistd/setgid.c b/libc-top-half/musl/src/unistd/setgid.c
new file mode 100644
index 0000000..bae4616
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/setgid.c
@@ -0,0 +1,8 @@
+#include <unistd.h>
+#include "syscall.h"
+#include "libc.h"
+
+int setgid(gid_t gid)
+{
+ return __setxid(SYS_setgid, gid, 0, 0);
+}
diff --git a/libc-top-half/musl/src/unistd/setpgid.c b/libc-top-half/musl/src/unistd/setpgid.c
new file mode 100644
index 0000000..0616069
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/setpgid.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int setpgid(pid_t pid, pid_t pgid)
+{
+ return syscall(SYS_setpgid, pid, pgid);
+}
diff --git a/libc-top-half/musl/src/unistd/setpgrp.c b/libc-top-half/musl/src/unistd/setpgrp.c
new file mode 100644
index 0000000..a2a37f6
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/setpgrp.c
@@ -0,0 +1,6 @@
+#include <unistd.h>
+
+pid_t setpgrp(void)
+{
+ return setpgid(0, 0);
+}
diff --git a/libc-top-half/musl/src/unistd/setregid.c b/libc-top-half/musl/src/unistd/setregid.c
new file mode 100644
index 0000000..f5a8972
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/setregid.c
@@ -0,0 +1,8 @@
+#include <unistd.h>
+#include "syscall.h"
+#include "libc.h"
+
+int setregid(gid_t rgid, gid_t egid)
+{
+ return __setxid(SYS_setregid, rgid, egid, 0);
+}
diff --git a/libc-top-half/musl/src/unistd/setresgid.c b/libc-top-half/musl/src/unistd/setresgid.c
new file mode 100644
index 0000000..b9af540
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/setresgid.c
@@ -0,0 +1,9 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include "syscall.h"
+#include "libc.h"
+
+int setresgid(gid_t rgid, gid_t egid, gid_t sgid)
+{
+ return __setxid(SYS_setresgid, rgid, egid, sgid);
+}
diff --git a/libc-top-half/musl/src/unistd/setresuid.c b/libc-top-half/musl/src/unistd/setresuid.c
new file mode 100644
index 0000000..83692b4
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/setresuid.c
@@ -0,0 +1,9 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include "syscall.h"
+#include "libc.h"
+
+int setresuid(uid_t ruid, uid_t euid, uid_t suid)
+{
+ return __setxid(SYS_setresuid, ruid, euid, suid);
+}
diff --git a/libc-top-half/musl/src/unistd/setreuid.c b/libc-top-half/musl/src/unistd/setreuid.c
new file mode 100644
index 0000000..3fcc59e
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/setreuid.c
@@ -0,0 +1,8 @@
+#include <unistd.h>
+#include "syscall.h"
+#include "libc.h"
+
+int setreuid(uid_t ruid, uid_t euid)
+{
+ return __setxid(SYS_setreuid, ruid, euid, 0);
+}
diff --git a/libc-top-half/musl/src/unistd/setsid.c b/libc-top-half/musl/src/unistd/setsid.c
new file mode 100644
index 0000000..609bbe4
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/setsid.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+pid_t setsid(void)
+{
+ return syscall(SYS_setsid);
+}
diff --git a/libc-top-half/musl/src/unistd/setuid.c b/libc-top-half/musl/src/unistd/setuid.c
new file mode 100644
index 0000000..602ecbb
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/setuid.c
@@ -0,0 +1,8 @@
+#include <unistd.h>
+#include "syscall.h"
+#include "libc.h"
+
+int setuid(uid_t uid)
+{
+ return __setxid(SYS_setuid, uid, 0, 0);
+}
diff --git a/libc-top-half/musl/src/unistd/setxid.c b/libc-top-half/musl/src/unistd/setxid.c
new file mode 100644
index 0000000..487c1a1
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/setxid.c
@@ -0,0 +1,34 @@
+#include <unistd.h>
+#include <signal.h>
+#include "syscall.h"
+#include "libc.h"
+
+struct ctx {
+ int id, eid, sid;
+ int nr, ret;
+};
+
+static void do_setxid(void *p)
+{
+ struct ctx *c = p;
+ if (c->ret<0) return;
+ int ret = __syscall(c->nr, c->id, c->eid, c->sid);
+ if (ret && !c->ret) {
+ /* If one thread fails to set ids after another has already
+ * succeeded, forcibly killing the process is the only safe
+ * thing to do. State is inconsistent and dangerous. Use
+ * SIGKILL because it is uncatchable. */
+ __block_all_sigs(0);
+ __syscall(SYS_kill, __syscall(SYS_getpid), SIGKILL);
+ }
+ c->ret = ret;
+}
+
+int __setxid(int nr, int id, int eid, int sid)
+{
+ /* ret is initially nonzero so that failure of the first thread does not
+ * trigger the safety kill above. */
+ struct ctx c = { .nr = nr, .id = id, .eid = eid, .sid = sid, .ret = 1 };
+ __synccall(do_setxid, &c);
+ return __syscall_ret(c.ret);
+}
diff --git a/libc-top-half/musl/src/unistd/sh/pipe.s b/libc-top-half/musl/src/unistd/sh/pipe.s
new file mode 100644
index 0000000..46c4908
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/sh/pipe.s
@@ -0,0 +1,27 @@
+.global pipe
+.type pipe, @function
+pipe:
+ mov #42, r3
+ trapa #31
+
+ ! work around hardware bug
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+
+ cmp/pz r0
+ bt 1f
+
+ mov.l L1, r1
+ braf r1
+ mov r0, r4
+
+1: mov.l r0, @(0,r4)
+ mov.l r1, @(4,r4)
+ rts
+ mov #0, r0
+
+.align 2
+L1: .long __syscall_ret@PLT-(1b-.)
diff --git a/libc-top-half/musl/src/unistd/sleep.c b/libc-top-half/musl/src/unistd/sleep.c
new file mode 100644
index 0000000..d645094
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/sleep.c
@@ -0,0 +1,10 @@
+#include <unistd.h>
+#include <time.h>
+
+unsigned sleep(unsigned seconds)
+{
+ struct timespec tv = { .tv_sec = seconds, .tv_nsec = 0 };
+ if (nanosleep(&tv, &tv))
+ return tv.tv_sec;
+ return 0;
+}
diff --git a/libc-top-half/musl/src/unistd/symlink.c b/libc-top-half/musl/src/unistd/symlink.c
new file mode 100644
index 0000000..0973d78
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/symlink.c
@@ -0,0 +1,12 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int symlink(const char *existing, const char *new)
+{
+#ifdef SYS_symlink
+ return syscall(SYS_symlink, existing, new);
+#else
+ return syscall(SYS_symlinkat, existing, AT_FDCWD, new);
+#endif
+}
diff --git a/libc-top-half/musl/src/unistd/symlinkat.c b/libc-top-half/musl/src/unistd/symlinkat.c
new file mode 100644
index 0000000..d1c59b4
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/symlinkat.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int symlinkat(const char *existing, int fd, const char *new)
+{
+ return syscall(SYS_symlinkat, existing, fd, new);
+}
diff --git a/libc-top-half/musl/src/unistd/sync.c b/libc-top-half/musl/src/unistd/sync.c
new file mode 100644
index 0000000..f18765a
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/sync.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+void sync(void)
+{
+ __syscall(SYS_sync);
+}
diff --git a/libc-top-half/musl/src/unistd/tcgetpgrp.c b/libc-top-half/musl/src/unistd/tcgetpgrp.c
new file mode 100644
index 0000000..50080c7
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/tcgetpgrp.c
@@ -0,0 +1,11 @@
+#include <unistd.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+
+pid_t tcgetpgrp(int fd)
+{
+ int pgrp;
+ if (ioctl(fd, TIOCGPGRP, &pgrp) < 0)
+ return -1;
+ return pgrp;
+}
diff --git a/libc-top-half/musl/src/unistd/tcsetpgrp.c b/libc-top-half/musl/src/unistd/tcsetpgrp.c
new file mode 100644
index 0000000..67c38cb
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/tcsetpgrp.c
@@ -0,0 +1,9 @@
+#include <unistd.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+
+int tcsetpgrp(int fd, pid_t pgrp)
+{
+ int pgrp_int = pgrp;
+ return ioctl(fd, TIOCSPGRP, &pgrp_int);
+}
diff --git a/libc-top-half/musl/src/unistd/truncate.c b/libc-top-half/musl/src/unistd/truncate.c
new file mode 100644
index 0000000..9729680
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/truncate.c
@@ -0,0 +1,9 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int truncate(const char *path, off_t length)
+{
+ return syscall(SYS_truncate, path, __SYSCALL_LL_O(length));
+}
+
+weak_alias(truncate, truncate64);
diff --git a/libc-top-half/musl/src/unistd/ttyname.c b/libc-top-half/musl/src/unistd/ttyname.c
new file mode 100644
index 0000000..0f3e114
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/ttyname.c
@@ -0,0 +1,14 @@
+#include <unistd.h>
+#include <errno.h>
+#include <limits.h>
+
+char *ttyname(int fd)
+{
+ static char buf[TTY_NAME_MAX];
+ int result;
+ if ((result = ttyname_r(fd, buf, sizeof buf))) {
+ errno = result;
+ return NULL;
+ }
+ return buf;
+}
diff --git a/libc-top-half/musl/src/unistd/ttyname_r.c b/libc-top-half/musl/src/unistd/ttyname_r.c
new file mode 100644
index 0000000..82acb75
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/ttyname_r.c
@@ -0,0 +1,28 @@
+#include <unistd.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include "syscall.h"
+
+int ttyname_r(int fd, char *name, size_t size)
+{
+ struct stat st1, st2;
+ char procname[sizeof "/proc/self/fd/" + 3*sizeof(int) + 2];
+ ssize_t l;
+
+ if (!isatty(fd)) return errno;
+
+ __procfdname(procname, fd);
+ l = readlink(procname, name, size);
+
+ if (l < 0) return errno;
+ else if (l == size) return ERANGE;
+
+ name[l] = 0;
+
+ if (stat(name, &st1) || fstat(fd, &st2))
+ return errno;
+ if (st1.st_dev != st2.st_dev || st1.st_ino != st2.st_ino)
+ return ENODEV;
+
+ return 0;
+}
diff --git a/libc-top-half/musl/src/unistd/ualarm.c b/libc-top-half/musl/src/unistd/ualarm.c
new file mode 100644
index 0000000..2985855
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/ualarm.c
@@ -0,0 +1,13 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <sys/time.h>
+
+unsigned ualarm(unsigned value, unsigned interval)
+{
+ struct itimerval it = {
+ .it_interval.tv_usec = interval,
+ .it_value.tv_usec = value
+ }, it_old;
+ setitimer(ITIMER_REAL, &it, &it_old);
+ return it_old.it_value.tv_sec*1000000 + it_old.it_value.tv_usec;
+}
diff --git a/libc-top-half/musl/src/unistd/unlink.c b/libc-top-half/musl/src/unistd/unlink.c
new file mode 100644
index 0000000..c40c28d
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/unlink.c
@@ -0,0 +1,12 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include "syscall.h"
+
+int unlink(const char *path)
+{
+#ifdef SYS_unlink
+ return syscall(SYS_unlink, path);
+#else
+ return syscall(SYS_unlinkat, AT_FDCWD, path, 0);
+#endif
+}
diff --git a/libc-top-half/musl/src/unistd/unlinkat.c b/libc-top-half/musl/src/unistd/unlinkat.c
new file mode 100644
index 0000000..e0e25d2
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/unlinkat.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+int unlinkat(int fd, const char *path, int flag)
+{
+ return syscall(SYS_unlinkat, fd, path, flag);
+}
diff --git a/libc-top-half/musl/src/unistd/usleep.c b/libc-top-half/musl/src/unistd/usleep.c
new file mode 100644
index 0000000..6c96652
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/usleep.c
@@ -0,0 +1,12 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <time.h>
+
+int usleep(unsigned useconds)
+{
+ struct timespec tv = {
+ .tv_sec = useconds/1000000,
+ .tv_nsec = (useconds%1000000)*1000
+ };
+ return nanosleep(&tv, &tv);
+}
diff --git a/libc-top-half/musl/src/unistd/write.c b/libc-top-half/musl/src/unistd/write.c
new file mode 100644
index 0000000..8fd5bc5
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/write.c
@@ -0,0 +1,7 @@
+#include <unistd.h>
+#include "syscall.h"
+
+ssize_t write(int fd, const void *buf, size_t count)
+{
+ return syscall_cp(SYS_write, fd, buf, count);
+}
diff --git a/libc-top-half/musl/src/unistd/writev.c b/libc-top-half/musl/src/unistd/writev.c
new file mode 100644
index 0000000..5a46c95
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/writev.c
@@ -0,0 +1,7 @@
+#include <sys/uio.h>
+#include "syscall.h"
+
+ssize_t writev(int fd, const struct iovec *iov, int count)
+{
+ return syscall_cp(SYS_writev, fd, iov, count);
+}
diff --git a/libc-top-half/musl/src/unistd/x32/lseek.c b/libc-top-half/musl/src/unistd/x32/lseek.c
new file mode 100644
index 0000000..3263642
--- /dev/null
+++ b/libc-top-half/musl/src/unistd/x32/lseek.c
@@ -0,0 +1,15 @@
+#include <unistd.h>
+#include "syscall.h"
+
+off_t __lseek(int fd, off_t offset, int whence)
+{
+ off_t ret;
+ __asm__ __volatile__ ("syscall"
+ : "=a"(ret)
+ : "a"(SYS_lseek), "D"(fd), "S"(offset), "d"(whence)
+ : "rcx", "r11", "memory");
+ return ret < 0 ? __syscall_ret(ret) : ret;
+}
+
+weak_alias(__lseek, lseek);
+weak_alias(__lseek, lseek64);
diff --git a/libc-top-half/musl/tools/add-cfi.common.awk b/libc-top-half/musl/tools/add-cfi.common.awk
new file mode 100644
index 0000000..04482d4
--- /dev/null
+++ b/libc-top-half/musl/tools/add-cfi.common.awk
@@ -0,0 +1,26 @@
+function hex2int(str, i) {
+ str = tolower(str)
+
+ for (i = 1; i <= 16; i++) {
+ char = substr("0123456789abcdef", i, 1)
+ lookup[char] = i-1
+ }
+
+ result = 0
+ for (i = 1; i <= length(str); i++) {
+ result = result * 16
+ char = substr(str, i, 1)
+ result = result + lookup[char]
+ }
+ return result
+}
+
+function parse_const(str) {
+ sign = sub(/^-/, "", str)
+ hex = sub(/^0x/, "", str)
+ if (hex)
+ n = hex2int(str)
+ else
+ n = str+0
+ return sign ? -n : n
+}
diff --git a/libc-top-half/musl/tools/add-cfi.i386.awk b/libc-top-half/musl/tools/add-cfi.i386.awk
new file mode 100644
index 0000000..d05037d
--- /dev/null
+++ b/libc-top-half/musl/tools/add-cfi.i386.awk
@@ -0,0 +1,209 @@
+# Insert GAS CFI directives ("control frame information") into x86-32 asm input
+#
+# CFI directives tell the assembler how to generate "stack frame" debug info
+# This information can tell a debugger (like gdb) how to find the current stack
+# frame at any point in the program code, and how to find the values which
+# various registers had at higher points in the call stack
+# With this information, the debugger can show a backtrace, and you can move up
+# and down the call stack and examine the values of local variables
+
+BEGIN {
+ # don't put CFI data in the .eh_frame ELF section (which we don't keep)
+ print ".cfi_sections .debug_frame"
+
+ # only emit CFI directives inside a function
+ in_function = 0
+
+ # emit .loc directives with line numbers from original source
+ printf ".file 1 \"%s\"\n", ARGV[1]
+ line_number = 0
+
+ # used to detect "call label; label:" trick
+ called = ""
+}
+
+function get_const1() {
+ # for instructions with 2 operands, get 1st operand (assuming it is constant)
+ match($0, /-?(0x[0-9a-fA-F]+|[0-9]+),/)
+ return parse_const(substr($0, RSTART, RLENGTH-1))
+}
+
+function canonicalize_reg(register) {
+ if (match(register, /^e/))
+ return register
+ else if (match(register, /[hl]$/)) # AH, AL, BH, BL, etc
+ return "e" substr(register, 1, 1) "x"
+ else # AX, BX, CX, etc
+ return "e" register
+}
+function get_reg() {
+ # only use if you already know there is 1 and only 1 register
+ match($0, /%e?([abcd][hlx]|si|di|bp)/)
+ return canonicalize_reg(substr($0, RSTART+1, RLENGTH-1))
+}
+function get_reg1() {
+ # for instructions with 2 operands, get 1st operand (assuming it is register)
+ match($0, /%e?([abcd][hlx]|si|di|bp),/)
+ return canonicalize_reg(substr($0, RSTART+1, RLENGTH-2))
+}
+function get_reg2() {
+ # for instructions with 2 operands, get 2nd operand (assuming it is register)
+ match($0, /,%e?([abcd][hlx]|si|di|bp)/)
+ return canonicalize_reg(substr($0, RSTART+2, RLENGTH-2))
+}
+
+function adjust_sp_offset(delta) {
+ if (in_function)
+ printf ".cfi_adjust_cfa_offset %d\n", delta
+}
+
+{
+ line_number = line_number + 1
+
+ # clean the input up before doing anything else
+ # delete comments
+ gsub(/(#|\/\/).*/, "")
+
+ # canonicalize whitespace
+ gsub(/[ \t]+/, " ") # mawk doesn't understand \s
+ gsub(/ *, */, ",")
+ gsub(/ *: */, ": ")
+ gsub(/ $/, "")
+ gsub(/^ /, "")
+}
+
+# check for assembler directives which we care about
+/^\.(section|data|text)/ {
+ # a .cfi_startproc/.cfi_endproc pair should be within the same section
+ # otherwise, clang will choke when generating ELF output
+ if (in_function) {
+ print ".cfi_endproc"
+ in_function = 0
+ }
+}
+/^\.type [a-zA-Z0-9_]+,@function/ {
+ functions[substr($2, 1, length($2)-10)] = 1
+}
+# not interested in assembler directives beyond this, just pass them through
+/^\./ {
+ print
+ next
+}
+
+/^[a-zA-Z0-9_]+:/ {
+ label = substr($1, 1, length($1)-1) # drop trailing :
+
+ if (called == label) {
+ # note adjustment of stack pointer from "call label; label:"
+ adjust_sp_offset(4)
+ }
+
+ if (functions[label]) {
+ if (in_function)
+ print ".cfi_endproc"
+
+ in_function = 1
+ print ".cfi_startproc"
+
+ for (register in saved)
+ delete saved[register]
+ for (register in dirty)
+ delete dirty[register]
+ }
+
+ # an instruction may follow on the same line, so continue processing
+}
+
+/^$/ { next }
+
+{
+ called = ""
+ printf ".loc 1 %d\n", line_number
+ print
+}
+
+# KEEPING UP WITH THE STACK POINTER
+# We do NOT attempt to understand foolish and ridiculous tricks like stashing
+# the stack pointer and then using %esp as a scratch register, or bitshifting
+# it or taking its square root or anything stupid like that.
+# %esp should only be adjusted by pushing/popping or adding/subtracting constants
+#
+/pushl?/ {
+ if (match($0, / %(ax|bx|cx|dx|di|si|bp|sp)/))
+ adjust_sp_offset(2)
+ else
+ adjust_sp_offset(4)
+}
+/popl?/ {
+ if (match($0, / %(ax|bx|cx|dx|di|si|bp|sp)/))
+ adjust_sp_offset(-2)
+ else
+ adjust_sp_offset(-4)
+}
+/addl? \$-?(0x[0-9a-fA-F]+|[0-9]+),%esp/ { adjust_sp_offset(-get_const1()) }
+/subl? \$-?(0x[0-9a-fA-F]+|[0-9]+),%esp/ { adjust_sp_offset(get_const1()) }
+
+/call/ {
+ if (match($0, /call [0-9]+f/)) # "forward" label
+ called = substr($0, RSTART+5, RLENGTH-6)
+ else if (match($0, /call [0-9a-zA-Z_]+/))
+ called = substr($0, RSTART+5, RLENGTH-5)
+}
+
+# TRACKING REGISTER VALUES FROM THE PREVIOUS STACK FRAME
+#
+/pushl? %e(ax|bx|cx|dx|si|di|bp)/ { # don't match "push (%reg)"
+ # if a register is being pushed, and its value has not changed since the
+ # beginning of this function, the pushed value can be used when printing
+ # local variables at the next level up the stack
+ # emit '.cfi_rel_offset' for that
+
+ if (in_function) {
+ register = get_reg()
+ if (!saved[register] && !dirty[register]) {
+ printf ".cfi_rel_offset %s,0\n", register
+ saved[register] = 1
+ }
+ }
+}
+
+/movl? %e(ax|bx|cx|dx|si|di|bp),-?(0x[0-9a-fA-F]+|[0-9]+)?\(%esp\)/ {
+ if (in_function) {
+ register = get_reg()
+ if (match($0, /-?(0x[0-9a-fA-F]+|[0-9]+)\(%esp\)/)) {
+ offset = parse_const(substr($0, RSTART, RLENGTH-6))
+ } else {
+ offset = 0
+ }
+ if (!saved[register] && !dirty[register]) {
+ printf ".cfi_rel_offset %s,%d\n", register, offset
+ saved[register] = 1
+ }
+ }
+}
+
+# IF REGISTER VALUES ARE UNCEREMONIOUSLY TRASHED
+# ...then we want to know about it.
+#
+function trashed(register) {
+ if (in_function && !saved[register] && !dirty[register]) {
+ printf ".cfi_undefined %s\n", register
+ }
+ dirty[register] = 1
+}
+# this does NOT exhaustively check for all possible instructions which could
+# overwrite a register value inherited from the caller (just the common ones)
+/mov.*,%e?([abcd][hlx]|si|di|bp)$/ { trashed(get_reg2()) }
+/(add|addl|sub|subl|and|or|xor|lea|sal|sar|shl|shr).*,%e?([abcd][hlx]|si|di|bp)$/ {
+ trashed(get_reg2())
+}
+/^i?mul [^,]*$/ { trashed("eax"); trashed("edx") }
+/^i?mul.*,%e?([abcd][hlx]|si|di|bp)$/ { trashed(get_reg2()) }
+/^i?div/ { trashed("eax"); trashed("edx") }
+/(dec|inc|not|neg|pop) %e?([abcd][hlx]|si|di|bp)/ { trashed(get_reg()) }
+/cpuid/ { trashed("eax"); trashed("ebx"); trashed("ecx"); trashed("edx") }
+
+END {
+ if (in_function)
+ print ".cfi_endproc"
+}
diff --git a/libc-top-half/musl/tools/add-cfi.x86_64.awk b/libc-top-half/musl/tools/add-cfi.x86_64.awk
new file mode 100644
index 0000000..7e1513d
--- /dev/null
+++ b/libc-top-half/musl/tools/add-cfi.x86_64.awk
@@ -0,0 +1,196 @@
+# Insert GAS CFI directives ("control frame information") into x86-64 asm input
+
+BEGIN {
+ # don't put CFI data in the .eh_frame ELF section (which we don't keep)
+ print ".cfi_sections .debug_frame"
+
+ # only emit CFI directives inside a function
+ in_function = 0
+
+ # emit .loc directives with line numbers from original source
+ printf ".file 1 \"%s\"\n", ARGV[1]
+ line_number = 0
+
+ # used to detect "call label; label:" trick
+ called = ""
+}
+
+function get_const1() {
+ # for instructions with 2 operands, get 1st operand (assuming it is constant)
+ match($0, /-?(0x[0-9a-fA-F]+|[0-9]+),/)
+ return parse_const(substr($0, RSTART, RLENGTH-1))
+}
+
+function canonicalize_reg(register) {
+ if (match(register, /^r/))
+ return register
+ else if (match(register, /^e/))
+ return "r" substr(register, 2, length(register)-1)
+ else if (match(register, /[hl]$/)) # AH, AL, BH, BL, etc
+ return "r" substr(register, 1, 1) "x"
+ else # AX, BX, CX, etc
+ return "r" register
+}
+function get_reg() {
+ # only use if you already know there is 1 and only 1 register
+ match($0, /%[er]?([abcd][xlh]|si|di|bp|8|9|10|11|12|13|14|15)/)
+ return canonicalize_reg(substr($0, RSTART+1, RLENGTH-1))
+}
+function get_reg1() {
+ # for instructions with 2 operands, get 1st operand (assuming it is register)
+ match($0, /%[er]?([abcd][xlh]|si|di|bp|8|9|10|11|12|13|14|15),/)
+ return canonicalize_reg(substr($0, RSTART+1, RLENGTH-2))
+}
+function get_reg2() {
+ # for instructions with 2 operands, get 2nd operand (assuming it is register)
+ match($0, /,%[er]?([abcd][xlh]|si|di|bp|8|9|10|11|12|13|14|15)/)
+ return canonicalize_reg(substr($0, RSTART+2, RLENGTH-2))
+}
+
+function adjust_sp_offset(delta) {
+ if (in_function)
+ printf ".cfi_adjust_cfa_offset %d\n", delta
+}
+
+{
+ line_number = line_number + 1
+
+ # clean the input up before doing anything else
+ # delete comments
+ gsub(/(#|\/\/).*/, "")
+
+ # canonicalize whitespace
+ gsub(/[ \t]+/, " ") # mawk doesn't understand \s
+ gsub(/ *, */, ",")
+ gsub(/ *: */, ": ")
+ gsub(/ $/, "")
+ gsub(/^ /, "")
+}
+
+# check for assembler directives which we care about
+/^\.(section|data|text)/ {
+ # a .cfi_startproc/.cfi_endproc pair should be within the same section
+ # otherwise, clang will choke when generating ELF output
+ if (in_function) {
+ print ".cfi_endproc"
+ in_function = 0
+ }
+}
+/^\.type [a-zA-Z0-9_]+,@function/ {
+ functions[substr($2, 1, length($2)-10)] = 1
+}
+# not interested in assembler directives beyond this, just pass them through
+/^\./ {
+ print
+ next
+}
+
+/^[a-zA-Z0-9_]+:/ {
+ label = substr($1, 1, length($1)-1) # drop trailing :
+
+ if (called == label) {
+ # note adjustment of stack pointer from "call label; label:"
+ adjust_sp_offset(8)
+ }
+
+ if (functions[label]) {
+ if (in_function)
+ print ".cfi_endproc"
+
+ in_function = 1
+ print ".cfi_startproc"
+
+ for (register in saved)
+ delete saved[register]
+ for (register in dirty)
+ delete dirty[register]
+ }
+
+ # an instruction may follow on the same line, so continue processing
+}
+
+/^$/ { next }
+
+{
+ called = ""
+ printf ".loc 1 %d\n", line_number
+ print
+}
+
+# KEEPING UP WITH THE STACK POINTER
+# %rsp should only be adjusted by pushing/popping or adding/subtracting constants
+#
+/pushl?/ {
+ adjust_sp_offset(8)
+}
+/popl?/ {
+ adjust_sp_offset(-8)
+}
+/addl? \$-?(0x[0-9a-fA-F]+|[0-9]+),%rsp/ { adjust_sp_offset(-get_const1()) }
+/subl? \$-?(0x[0-9a-fA-F]+|[0-9]+),%rsp/ { adjust_sp_offset(get_const1()) }
+
+/call/ {
+ if (match($0, /call [0-9]+f/)) # "forward" label
+ called = substr($0, RSTART+5, RLENGTH-6)
+ else if (match($0, /call [0-9a-zA-Z_]+/))
+ called = substr($0, RSTART+5, RLENGTH-5)
+}
+
+# TRACKING REGISTER VALUES FROM THE PREVIOUS STACK FRAME
+#
+/pushl? %r(ax|bx|cx|dx|si|di|bp|8|9|10|11|12|13|14|15)/ { # don't match "push (%reg)"
+ # if a register is being pushed, and its value has not changed since the
+ # beginning of this function, the pushed value can be used when printing
+ # local variables at the next level up the stack
+ # emit '.cfi_rel_offset' for that
+
+ if (in_function) {
+ register = get_reg()
+ if (!saved[register] && !dirty[register]) {
+ printf ".cfi_rel_offset %s,0\n", register
+ saved[register] = 1
+ }
+ }
+}
+
+/movl? %r(ax|bx|cx|dx|si|di|bp|8|9|10|11|12|13|14|15),-?(0x[0-9a-fA-F]+|[0-9]+)?\(%rsp\)/ {
+ if (in_function) {
+ register = get_reg()
+ if (match($0, /-?(0x[0-9a-fA-F]+|[0-9]+)\(%rsp\)/)) {
+ offset = parse_const(substr($0, RSTART, RLENGTH-6))
+ } else {
+ offset = 0
+ }
+ if (!saved[register] && !dirty[register]) {
+ printf ".cfi_rel_offset %s,%d\n", register, offset
+ saved[register] = 1
+ }
+ }
+}
+
+# IF REGISTER VALUES ARE UNCEREMONIOUSLY TRASHED
+# ...then we want to know about it.
+#
+function trashed(register) {
+ if (in_function && !saved[register] && !dirty[register]) {
+ printf ".cfi_undefined %s\n", register
+ }
+ dirty[register] = 1
+}
+# this does NOT exhaustively check for all possible instructions which could
+# overwrite a register value inherited from the caller (just the common ones)
+/mov.*,%[er]?([abcd][xlh]|si|di|bp|8|9|10|11|12|13|14|15)$/ { trashed(get_reg2()) }
+/(add|addl|sub|subl|and|or|xor|lea|sal|sar|shl|shr).*,%[er]?([abcd][xlh]|si|di|bp|8|9|10|11|12|13|14|15)$/ {
+ trashed(get_reg2())
+}
+/^i?mul [^,]*$/ { trashed("rax"); trashed("rdx") }
+/^i?mul.*,%[er]?([abcd][xlh]|si|di|bp|8|9|10|11|12|13|14|15)$/ { trashed(get_reg2()) }
+/^i?div/ { trashed("rax"); trashed("rdx") }
+
+/(dec|inc|not|neg|pop) %[er]?([abcd][xlh]|si|di|bp|8|9|10|11|12|13|14|15)/ { trashed(get_reg()) }
+/cpuid/ { trashed("rax"); trashed("rbx"); trashed("rcx"); trashed("rdx") }
+
+END {
+ if (in_function)
+ print ".cfi_endproc"
+}
diff --git a/libc-top-half/musl/tools/install.sh b/libc-top-half/musl/tools/install.sh
new file mode 100755
index 0000000..d913b60
--- /dev/null
+++ b/libc-top-half/musl/tools/install.sh
@@ -0,0 +1,64 @@
+#!/bin/sh
+#
+# This is an actually-safe install command which installs the new
+# file atomically in the new location, rather than overwriting
+# existing files.
+#
+
+usage() {
+printf "usage: %s [-D] [-l] [-m mode] src dest\n" "$0" 1>&2
+exit 1
+}
+
+mkdirp=
+symlink=
+mode=755
+
+while getopts Dlm: name ; do
+case "$name" in
+D) mkdirp=yes ;;
+l) symlink=yes ;;
+m) mode=$OPTARG ;;
+?) usage ;;
+esac
+done
+shift $(($OPTIND - 1))
+
+test "$#" -eq 2 || usage
+src=$1
+dst=$2
+tmp="$dst.tmp.$$"
+
+case "$dst" in
+*/) printf "%s: %s ends in /\n", "$0" "$dst" 1>&2 ; exit 1 ;;
+esac
+
+set -C
+set -e
+
+if test "$mkdirp" ; then
+umask 022
+case "$2" in
+*/*) mkdir -p "${dst%/*}" ;;
+esac
+fi
+
+trap 'rm -f "$tmp"' EXIT INT QUIT TERM HUP
+
+umask 077
+
+if test "$symlink" ; then
+ln -s "$1" "$tmp"
+else
+cat < "$1" > "$tmp"
+chmod "$mode" "$tmp"
+fi
+
+mv -f "$tmp" "$2"
+test -d "$2" && {
+rm -f "$2/$tmp"
+printf "%s: %s is a directory\n" "$0" "$dst" 1>&2
+exit 1
+}
+
+exit 0
diff --git a/libc-top-half/musl/tools/ld.musl-clang.in b/libc-top-half/musl/tools/ld.musl-clang.in
new file mode 100644
index 0000000..93763d6
--- /dev/null
+++ b/libc-top-half/musl/tools/ld.musl-clang.in
@@ -0,0 +1,51 @@
+#!/bin/sh
+cc="@CC@"
+libc_lib="@LIBDIR@"
+ldso="@LDSO@"
+cleared=
+shared=
+userlinkdir=
+userlink=
+
+for x ; do
+ test "$cleared" || set -- ; cleared=1
+
+ case "$x" in
+ -L-user-start)
+ userlinkdir=1
+ ;;
+ -L-user-end)
+ userlinkdir=
+ ;;
+ -L*)
+ test "$userlinkdir" && set -- "$@" "$x"
+ ;;
+ -l-user-start)
+ userlink=1
+ ;;
+ -l-user-end)
+ userlink=
+ ;;
+ crtbegin*.o|crtend*.o)
+ set -- "$@" $($cc -print-file-name=$x)
+ ;;
+ -lgcc|-lgcc_eh)
+ file=lib${x#-l}.a
+ set -- "$@" $($cc -print-file-name=$file)
+ ;;
+ -l*)
+ test "$userlink" && set -- "$@" "$x"
+ ;;
+ -shared)
+ shared=1
+ set -- "$@" -shared
+ ;;
+ -sysroot=*|--sysroot=*)
+ ;;
+ *)
+ set -- "$@" "$x"
+ ;;
+ esac
+done
+
+exec $($cc -print-prog-name=ld) -nostdlib "$@" -lc -dynamic-linker "$ldso"
diff --git a/libc-top-half/musl/tools/mkalltypes.sed b/libc-top-half/musl/tools/mkalltypes.sed
new file mode 100644
index 0000000..fa15efc
--- /dev/null
+++ b/libc-top-half/musl/tools/mkalltypes.sed
@@ -0,0 +1,15 @@
+/^TYPEDEF/s/TYPEDEF \(.*\) \([^ ]*\);$/#if defined(__NEED_\2) \&\& !defined(__DEFINED_\2)\
+typedef \1 \2;\
+#define __DEFINED_\2\
+#endif\
+/
+/^STRUCT/s/STRUCT * \([^ ]*\) \(.*\);$/#if defined(__NEED_struct_\1) \&\& !defined(__DEFINED_struct_\1)\
+struct \1 \2;\
+#define __DEFINED_struct_\1\
+#endif\
+/
+/^UNION/s/UNION * \([^ ]*\) \(.*\);$/#if defined(__NEED_union_\1) \&\& !defined(__DEFINED_union_\1)\
+union \1 \2;\
+#define __DEFINED_union_\1\
+#endif\
+/
diff --git a/libc-top-half/musl/tools/musl-clang.in b/libc-top-half/musl/tools/musl-clang.in
new file mode 100644
index 0000000..623de6f
--- /dev/null
+++ b/libc-top-half/musl/tools/musl-clang.in
@@ -0,0 +1,35 @@
+#!/bin/sh
+cc="@CC@"
+libc="@PREFIX@"
+libc_inc="@INCDIR@"
+libc_lib="@LIBDIR@"
+thisdir="`cd "$(dirname "$0")"; pwd`"
+
+# prevent clang from running the linker (and erroring) on no input.
+sflags=
+eflags=
+for x ; do
+ case "$x" in
+ -l*) input=1 ;;
+ *) input= ;;
+ esac
+ if test "$input" ; then
+ sflags="-l-user-start"
+ eflags="-l-user-end"
+ break
+ fi
+done
+
+exec $cc \
+ -B"$thisdir" \
+ -fuse-ld=musl-clang \
+ -static-libgcc \
+ -nostdinc \
+ --sysroot "$libc" \
+ -isystem "$libc_inc" \
+ -L-user-start \
+ $sflags \
+ "$@" \
+ $eflags \
+ -L"$libc_lib" \
+ -L-user-end
diff --git a/libc-top-half/musl/tools/musl-gcc.specs.sh b/libc-top-half/musl/tools/musl-gcc.specs.sh
new file mode 100644
index 0000000..3049257
--- /dev/null
+++ b/libc-top-half/musl/tools/musl-gcc.specs.sh
@@ -0,0 +1,37 @@
+incdir=$1
+libdir=$2
+ldso=$3
+cat <<EOF
+%rename cpp_options old_cpp_options
+
+*cpp_options:
+-nostdinc -isystem $incdir -isystem include%s %(old_cpp_options)
+
+*cc1:
+%(cc1_cpu) -nostdinc -isystem $incdir -isystem include%s
+
+*link_libgcc:
+-L$libdir -L .%s
+
+*libgcc:
+libgcc.a%s %:if-exists(libgcc_eh.a%s)
+
+*startfile:
+%{!shared: $libdir/Scrt1.o} $libdir/crti.o crtbeginS.o%s
+
+*endfile:
+crtendS.o%s $libdir/crtn.o
+
+*link:
+-dynamic-linker $ldso -nostdlib %{shared:-shared} %{static:-static} %{rdynamic:-export-dynamic}
+
+*esp_link:
+
+
+*esp_options:
+
+
+*esp_cpp_options:
+
+
+EOF
diff --git a/libc-top-half/musl/tools/version.sh b/libc-top-half/musl/tools/version.sh
new file mode 100644
index 0000000..f1cc594
--- /dev/null
+++ b/libc-top-half/musl/tools/version.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+if test -d .git ; then
+if type git >/dev/null 2>&1 ; then
+git describe --tags --match 'v[0-9]*' 2>/dev/null \
+| sed -e 's/^v//' -e 's/-/-git-/'
+else
+sed 's/$/-git/' < VERSION
+fi
+else
+cat VERSION
+fi
diff --git a/libc-top-half/sources/arc4random.c b/libc-top-half/sources/arc4random.c
new file mode 100644
index 0000000..9898206
--- /dev/null
+++ b/libc-top-half/sources/arc4random.c
@@ -0,0 +1,160 @@
+#include <assert.h>
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#define RNG_RESERVE_LEN 512
+
+#define CHACHA20_KEYBYTES 32
+#define CHACHA20_BLOCKBYTES 64
+
+#define ROTL32(x, b) (uint32_t)(((x) << (b)) | ((x) >> (32 - (b))))
+
+#define CHACHA20_QUARTERROUND(A, B, C, D) \
+ A += B; \
+ D = ROTL32(D ^ A, 16); \
+ C += D; \
+ B = ROTL32(B ^ C, 12); \
+ A += B; \
+ D = ROTL32(D ^ A, 8); \
+ C += D; \
+ B = ROTL32(B ^ C, 7)
+
+static void CHACHA20_ROUNDS(uint32_t st[16])
+{
+ int i;
+
+ for (i = 0; i < 20; i += 2) {
+ CHACHA20_QUARTERROUND(st[0], st[4], st[8], st[12]);
+ CHACHA20_QUARTERROUND(st[1], st[5], st[9], st[13]);
+ CHACHA20_QUARTERROUND(st[2], st[6], st[10], st[14]);
+ CHACHA20_QUARTERROUND(st[3], st[7], st[11], st[15]);
+ CHACHA20_QUARTERROUND(st[0], st[5], st[10], st[15]);
+ CHACHA20_QUARTERROUND(st[1], st[6], st[11], st[12]);
+ CHACHA20_QUARTERROUND(st[2], st[7], st[8], st[13]);
+ CHACHA20_QUARTERROUND(st[3], st[4], st[9], st[14]);
+ }
+}
+
+static void chacha20_update(uint8_t out[CHACHA20_BLOCKBYTES], uint32_t st[16])
+{
+ uint32_t ks[16];
+ int i;
+
+ memcpy(ks, st, 4 * 16);
+ CHACHA20_ROUNDS(st);
+ for (i = 0; i < 16; i++) {
+ ks[i] += st[i];
+ }
+ memcpy(out, ks, CHACHA20_BLOCKBYTES);
+ st[12]++;
+}
+
+static void chacha20_init(uint32_t st[16], const uint8_t key[CHACHA20_KEYBYTES])
+{
+ static const uint32_t constants[4] = { 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574 };
+ memcpy(&st[0], constants, 4 * 4);
+ memcpy(&st[4], key, CHACHA20_KEYBYTES);
+ memset(&st[12], 0, 4 * 4);
+}
+
+static int chacha20_rng(uint8_t* out, size_t len, uint8_t key[CHACHA20_KEYBYTES])
+{
+ uint32_t st[16];
+ size_t off;
+
+ chacha20_init(st, key);
+ chacha20_update(&out[0], st);
+ memcpy(key, out, CHACHA20_KEYBYTES);
+ off = 0;
+ while (len >= CHACHA20_BLOCKBYTES) {
+ chacha20_update(&out[off], st);
+ len -= CHACHA20_BLOCKBYTES;
+ off += CHACHA20_BLOCKBYTES;
+ }
+ if (len > 0) {
+ uint8_t tmp[CHACHA20_BLOCKBYTES];
+ chacha20_update(tmp, st);
+ memcpy(&out[off], tmp, len);
+ }
+ return 0;
+}
+
+struct rng_state {
+ int initialized;
+ size_t off;
+ uint8_t key[CHACHA20_KEYBYTES];
+ uint8_t reserve[RNG_RESERVE_LEN];
+};
+
+void arc4random_buf(void* buffer, size_t len)
+{
+ static _Thread_local struct rng_state rng_state;
+
+ unsigned char* buffer_ = (unsigned char*)buffer;
+ size_t off;
+ size_t remaining;
+ size_t partial;
+
+ if (!rng_state.initialized) {
+ if (getentropy(rng_state.key, sizeof rng_state.key) != 0) {
+ assert(0);
+ }
+ rng_state.off = RNG_RESERVE_LEN;
+ rng_state.initialized = 1;
+ }
+ off = 0;
+ remaining = len;
+ while (remaining > 0) {
+ if (rng_state.off == RNG_RESERVE_LEN) {
+ while (remaining >= RNG_RESERVE_LEN) {
+ chacha20_rng(&buffer_[off], RNG_RESERVE_LEN, rng_state.key);
+ off += RNG_RESERVE_LEN;
+ remaining -= RNG_RESERVE_LEN;
+ }
+ if (remaining == 0) {
+ break;
+ }
+ chacha20_rng(&rng_state.reserve[0], RNG_RESERVE_LEN, rng_state.key);
+ rng_state.off = 0;
+ }
+ partial = RNG_RESERVE_LEN - rng_state.off;
+ if (remaining < partial) {
+ partial = remaining;
+ }
+ memcpy(&buffer_[off], &rng_state.reserve[rng_state.off], partial);
+ memset(&rng_state.reserve[rng_state.off], 0, partial);
+ rng_state.off += partial;
+ remaining -= partial;
+ off += partial;
+ }
+}
+
+uint32_t arc4random(void)
+{
+ uint32_t v;
+
+ arc4random_buf(&v, sizeof v);
+
+ return v;
+}
+
+uint32_t arc4random_uniform(const uint32_t upper_bound)
+{
+ uint32_t min;
+ uint32_t r;
+
+ if (upper_bound < 2U) {
+ return 0;
+ }
+ min = (1U + ~upper_bound) % upper_bound; // = 2**32 mod upper_bound
+ do {
+ r = arc4random();
+ } while (r < min);
+
+ // r is now clamped to a set whose size mod upper_bound == 0.
+ // The worst case (2**31+1) requires 2 attempts on average.
+
+ return r % upper_bound;
+}
diff --git a/test/.gitignore b/test/.gitignore
new file mode 100644
index 0000000..f5fa56e
--- /dev/null
+++ b/test/.gitignore
@@ -0,0 +1,3 @@
+build
+download
+run
diff --git a/test/Makefile b/test/Makefile
new file mode 100644
index 0000000..61e1756
--- /dev/null
+++ b/test/Makefile
@@ -0,0 +1,175 @@
+# Build the `libc-test` tests as Wasm programs and run them with the selected
+# engine. Contributors beware! This Makefile follows the style of the
+# `libc-test` Makefile and uses some more exotic features of `make`.
+#
+# The top-level `test` target is composed of a chain of several phony
+# sub-targets:
+# - `download`: retrieve the `libc-test` source from a Git `$(MIRROR)`
+# - `build`: construct Wasm modules for a subset of the `libc-test` tests
+# - `run`: execute the benchmarks with a Wasm `$(ENGINE)` of choice (e.g.,
+# Wasmtime)
+
+test: run
+
+# Unlike the `libc-test` directory, we will output all artifacts to the `build`
+# directory (keeping with the `wasi-libc` conventions).
+OBJDIR ?= $(CURDIR)/build
+DOWNDIR ?= $(CURDIR)/download
+
+##### DOWNLOAD #################################################################
+
+LIBC_TEST_URL ?= https://github.com/bytecodealliance/libc-test
+LIBC_TEST = $(DOWNDIR)/libc-test
+LIBRT_URL ?= https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-16/libclang_rt.builtins-wasm32-wasi-16.0.tar.gz
+LIBRT = $(DOWNDIR)/lib/wasi/libclang_rt.builtins-wasm32.a
+WASMTIME_URL ?= https://github.com/bytecodealliance/wasmtime/releases/download/v3.0.0/wasmtime-v3.0.0-x86_64-linux.tar.xz
+WASMTIME = $(DOWNDIR)/$(shell basename $(WASMTIME_URL) .tar.xz)/wasmtime
+
+download: $(LIBC_TEST) $(LIBRT) $(WASMTIME)
+
+$(DOWNDIR):
+ mkdir -p download
+
+$(LIBC_TEST): | $(DOWNDIR)
+ git clone --depth 1 $(LIBC_TEST_URL) $@
+
+# TODO install target to place into...
+$(LIBRT): | $(DOWNDIR)
+ wget --no-clobber --directory-prefix=$(DOWNDIR) $(LIBRT_URL)
+ tar --extract --file=$(DOWNDIR)/$(shell basename $(LIBRT_URL)) --directory=$(DOWNDIR)/
+
+$(WASMTIME): | $(DOWNDIR)
+ wget --no-clobber --directory-prefix=$(DOWNDIR) $(WASMTIME_URL)
+ tar --extract --file=$(DOWNDIR)/$(shell basename $(WASMTIME_URL)) --directory=$(DOWNDIR)/
+
+clean::
+ rm -rf download
+
+##### BUILD ####################################################################
+
+# For now, we list out the tests that we can currently build and run. This is
+# heavily focused on the functional tests; in the future it would be good to
+# fill out the missing tests and also include some `src/api` and `src/math`
+# tests (TODO).
+TESTS := \
+ $(LIBC_TEST)/src/functional/argv.c \
+ $(LIBC_TEST)/src/functional/basename.c \
+ $(LIBC_TEST)/src/functional/clocale_mbfuncs.c \
+ $(LIBC_TEST)/src/functional/clock_gettime.c \
+ $(LIBC_TEST)/src/functional/crypt.c \
+ $(LIBC_TEST)/src/functional/dirname.c \
+ $(LIBC_TEST)/src/functional/env.c \
+ $(LIBC_TEST)/src/functional/fnmatch.c \
+ $(LIBC_TEST)/src/functional/iconv_open.c \
+ $(LIBC_TEST)/src/functional/mbc.c \
+ $(LIBC_TEST)/src/functional/memstream.c \
+ $(LIBC_TEST)/src/functional/qsort.c \
+ $(LIBC_TEST)/src/functional/random.c \
+ $(LIBC_TEST)/src/functional/search_hsearch.c \
+ $(LIBC_TEST)/src/functional/search_insque.c \
+ $(LIBC_TEST)/src/functional/search_lsearch.c \
+ $(LIBC_TEST)/src/functional/search_tsearch.c \
+ $(LIBC_TEST)/src/functional/snprintf.c \
+ $(LIBC_TEST)/src/functional/sscanf.c \
+ $(LIBC_TEST)/src/functional/strftime.c \
+ $(LIBC_TEST)/src/functional/string.c \
+ $(LIBC_TEST)/src/functional/string_memcpy.c \
+ $(LIBC_TEST)/src/functional/string_memmem.c \
+ $(LIBC_TEST)/src/functional/string_memset.c \
+ $(LIBC_TEST)/src/functional/string_strchr.c \
+ $(LIBC_TEST)/src/functional/string_strcspn.c \
+ $(LIBC_TEST)/src/functional/string_strstr.c \
+ $(LIBC_TEST)/src/functional/strtod.c \
+ $(LIBC_TEST)/src/functional/strtod_long.c \
+ $(LIBC_TEST)/src/functional/strtod_simple.c \
+ $(LIBC_TEST)/src/functional/strtof.c \
+ $(LIBC_TEST)/src/functional/strtol.c \
+ $(LIBC_TEST)/src/functional/swprintf.c \
+ $(LIBC_TEST)/src/functional/tgmath.c \
+ $(LIBC_TEST)/src/functional/udiv.c \
+ $(LIBC_TEST)/src/functional/wcsstr.c \
+ $(LIBC_TEST)/src/functional/wcstol.c
+
+# Part of the problem including more tests is that the `libc-test`
+# infrastructure code is not all Wasm-compilable. As we include more tests
+# above, this list will also likely need to grow.
+COMMON_TEST_INFRA = \
+ $(LIBC_TEST)/src/common/path.c \
+ $(LIBC_TEST)/src/common/print.c \
+ $(LIBC_TEST)/src/common/rand.c \
+ $(LIBC_TEST)/src/common/utf8.c
+
+# Create various lists containing the various artifacts to be built: mainly,
+# $(WASM_OBJS) are compiled in the $(OBJDIRS) and then linked together to form
+# the $(WASMS) tests.
+NAMES := $(TESTS:$(LIBC_TEST)/src/%.c=%)
+WASMS := $(TESTS:$(LIBC_TEST)/src/%.c=$(OBJDIR)/%.wasm)
+WASM_OBJS := $(TESTS:$(LIBC_TEST)/src/%.c=$(OBJDIR)/%.wasm.o)
+INFRA_WASM_OBJS := $(COMMON_TEST_INFRA:$(LIBC_TEST)/src/%.c=$(OBJDIR)/%.wasm.o)
+WASM_OBJS += $(INFRA_WASM_OBJS)
+DIRS := $(patsubst $(OBJDIR)/%/,%,$(sort $(dir $(WASM_OBJS))))
+OBJDIRS := $(DIRS:%=$(OBJDIR)/%)
+
+# Allow $(CC) to be set from the command line; ?= doesn't work for CC because
+# make has a default value for it.
+ifeq ($(origin CC), default)
+CC := clang
+endif
+LDFLAGS ?=
+CFLAGS ?= --target=wasm32-wasi --sysroot=../sysroot
+# Always include the `libc-test` infrastructure headers.
+CFLAGS += -I$(LIBC_TEST)/src/common
+
+# Compile each selected test using Clang. Note that failures here are likely
+# due to a missing `libclang_rt.builtins-wasm32.a` in the Clang lib directory.
+# This location is system-dependent, but could be fixed by something like:
+# $ sudo mkdir /usr/lib64/clang/14.0.5/lib/wasi
+# $ sudo cp download/lib/wasi/libclang_rt.builtins-wasm32.a /usr/lib64/clang/14.0.5/lib/wasi/
+build: download $(WASMS)
+
+$(WASMS): | $(OBJDIRS)
+$(OBJDIR)/%.wasm: $(OBJDIR)/%.wasm.o $(INFRA_WASM_OBJS)
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^
+
+$(WASM_OBJS): $(LIBC_TEST)/src/common/test.h | $(OBJDIRS)
+$(OBJDIR)/%.wasm.o: $(LIBC_TEST)/src/%.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+$(OBJDIRS):
+ mkdir -p $@
+
+clean::
+ rm -rf $(OBJDIR)
+
+##### RUN ######################################################################
+
+ENGINE ?= $(WASMTIME) run
+ERRS:=$(WASMS:%.wasm=%.wasm.err)
+
+# Use the provided Wasm engine to execute each test, emitting its output into
+# a `.err` file.
+run: build $(ERRS)
+ @echo "Tests passed"
+
+$(ERRS): | $(OBJDIRS)
+
+%.wasm.err: %.wasm
+ $(ENGINE) $< >$@
+
+clean::
+ rm -rf $(OBJDIR)/*/*.err
+
+##### MISC #####################################################################
+
+# Note: the `clean` target has been built up by all of the previous sections.
+
+debug:
+ @echo NAMES $(NAMES)
+ @echo TESTS $(TESTS)
+ @echo WASMS $(WASMS)
+ @echo WASM_OBJS $(WASM_OBJS)
+ @echo ERRS $(ERRS)
+ @echo DIRS $(DIRS)
+ @echo OBJDIRS $(OBJDIRS)
+
+.PHONY: test download build run clean
diff --git a/test/README.md b/test/README.md
new file mode 100644
index 0000000..590c2d4
--- /dev/null
+++ b/test/README.md
@@ -0,0 +1,6 @@
+# Test
+
+This directory runs a subset of libc-test using the sysroot produced by
+`wasi-libc`.
+
+[libc-test]: https://wiki.musl-libc.org/libc-test.html
diff --git a/tools/wasi-headers/.gitignore b/tools/wasi-headers/.gitignore
new file mode 100644
index 0000000..a9d37c5
--- /dev/null
+++ b/tools/wasi-headers/.gitignore
@@ -0,0 +1,2 @@
+target
+Cargo.lock
diff --git a/tools/wasi-headers/Cargo.toml b/tools/wasi-headers/Cargo.toml
new file mode 100644
index 0000000..018ca46
--- /dev/null
+++ b/tools/wasi-headers/Cargo.toml
@@ -0,0 +1,16 @@
+[package]
+name = "wasi-headers"
+version = "0.0.1"
+authors = ["Dan Gohman <sunfish@mozilla.com>", "Pat Hickey <phickey@fastly.com>"]
+license = "Apache-2.0"
+edition = "2018"
+publish = false
+
+[dependencies]
+heck = "0.3.1"
+witx = { path = "WASI/tools/witx" }
+anyhow = "1.0.22"
+clap = "2.23"
+
+[dev-dependencies]
+diff = "0.1.11"
diff --git a/tools/wasi-headers/LICENSE b/tools/wasi-headers/LICENSE
new file mode 100644
index 0000000..f9d8195
--- /dev/null
+++ b/tools/wasi-headers/LICENSE
@@ -0,0 +1,220 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+--- LLVM Exceptions to the Apache 2.0 License ----
+
+As an exception, if, as a result of your compiling your source code, portions
+of this Software are embedded into an Object form of such source code, you
+may redistribute such embedded portions in such Object form without complying
+with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
+
+In addition, if you combine or link compiled forms of this Software with
+software that is licensed under the GPLv2 ("Combined Software") and if a
+court of competent jurisdiction determines that the patent provision (Section
+3), the indemnity provision (Section 9) or other Section of the License
+conflicts with the conditions of the GPLv2, you may retroactively and
+prospectively choose to deem waived or otherwise exclude such Section(s) of
+the License, but only in their entirety and only with respect to the Combined
+Software.
+
diff --git a/tools/wasi-headers/src/c_header.rs b/tools/wasi-headers/src/c_header.rs
new file mode 100644
index 0000000..15b64ee
--- /dev/null
+++ b/tools/wasi-headers/src/c_header.rs
@@ -0,0 +1,874 @@
+use heck::ShoutySnakeCase;
+use std::collections::HashMap;
+use std::mem;
+use witx::*;
+
+pub struct Generated {
+ pub header: String,
+ pub source: String,
+}
+
+pub fn to_c(doc: &Document, inputs_str: &str) -> Generated {
+ let mut header = String::new();
+
+ header.push_str(&format!(
+ r#"/**
+ * THIS FILE IS AUTO-GENERATED from the following files:
+ * {}
+ *
+ * To regenerate this file execute:
+ *
+ * cargo run --manifest-path tools/wasi-headers/Cargo.toml generate-libc
+ *
+ * Modifications to this file will cause CI to fail, the code generator tool
+ * must be modified to change this file.
+ *
+ * @file
+ * This file describes the [WASI] interface, consisting of functions, types,
+ * and defined values (macros).
+ *
+ * The interface described here is greatly inspired by [CloudABI]'s clean,
+ * thoughtfully-designed, capability-oriented, POSIX-style API.
+ *
+ * [CloudABI]: https://github.com/NuxiNL/cloudlibc
+ * [WASI]: https://github.com/WebAssembly/WASI/
+ */
+
+#ifndef __wasi_api_h
+#define __wasi_api_h
+
+#ifndef __wasi__
+#error <wasi/api.h> is only supported on WASI platforms.
+#endif
+
+#ifndef __wasm32__
+#error <wasi/api.h> only supports wasm32; doesn't yet support wasm64
+#endif
+
+#include <stddef.h>
+#include <stdint.h>
+
+_Static_assert(_Alignof(int8_t) == 1, "non-wasi data layout");
+_Static_assert(_Alignof(uint8_t) == 1, "non-wasi data layout");
+_Static_assert(_Alignof(int16_t) == 2, "non-wasi data layout");
+_Static_assert(_Alignof(uint16_t) == 2, "non-wasi data layout");
+_Static_assert(_Alignof(int32_t) == 4, "non-wasi data layout");
+_Static_assert(_Alignof(uint32_t) == 4, "non-wasi data layout");
+_Static_assert(_Alignof(int64_t) == 8, "non-wasi data layout");
+_Static_assert(_Alignof(uint64_t) == 8, "non-wasi data layout");
+_Static_assert(_Alignof(void*) == 4, "non-wasi data layout");
+
+#ifdef __cplusplus
+extern "C" {{
+#endif
+
+// TODO: Encoding this in witx.
+#define __WASI_DIRCOOKIE_START (UINT64_C(0))
+"#,
+ inputs_str,
+ ));
+
+ let mut source = String::new();
+ source.push_str(&format!(
+ r#"/**
+ * THIS FILE IS AUTO-GENERATED from the following files:
+ * {}
+ *
+ * To regenerate this file execute:
+ *
+ * cargo run --manifest-path tools/wasi-headers/Cargo.toml generate-libc
+ *
+ * Modifications to this file will cause CI to fail, the code generator tool
+ * must be modified to change this file.
+ */
+
+#include <wasi/api.h>
+#include <string.h>
+
+"#,
+ inputs_str,
+ ));
+
+ let mut type_constants = HashMap::new();
+ for c in doc.constants() {
+ type_constants.entry(&c.ty).or_insert(Vec::new()).push(c);
+ }
+
+ for nt in doc.typenames() {
+ print_datatype(&mut header, &*nt);
+
+ if let Some(constants) = type_constants.remove(&nt.name) {
+ for constant in constants {
+ print_constant(&mut header, &constant);
+ }
+ }
+ }
+
+ for m in doc.modules() {
+ print_module(&mut header, &mut source, &m);
+ }
+
+ header.push_str(
+ r#"#ifdef __cplusplus
+}
+#endif
+
+#endif
+"#,
+ );
+
+ Generated { header, source }
+}
+
+fn print_datatype(ret: &mut String, nt: &NamedType) {
+ if !nt.docs.is_empty() {
+ ret.push_str("/**\n");
+ for line in nt.docs.lines() {
+ ret.push_str(&format!(" * {}\n", line));
+ }
+ ret.push_str(" */\n");
+ }
+
+ match &nt.tref {
+ TypeRef::Value(v) => match &**v {
+ Type::Record(s) => print_record(ret, &nt.name, s),
+ Type::Variant(v) => print_variant(ret, &nt.name, v),
+ Type::Handle(h) => print_handle(ret, &nt.name, h),
+ Type::Builtin { .. }
+ | Type::List { .. }
+ | Type::Pointer { .. }
+ | Type::ConstPointer { .. } => print_alias(ret, &nt.name, &nt.tref),
+ },
+ TypeRef::Name(_) => print_alias(ret, &nt.name, &nt.tref),
+ }
+}
+
+fn print_alias(ret: &mut String, name: &Id, dest: &TypeRef) {
+ match &**dest.type_() {
+ Type::List(_) => {
+ // Don't emit arrays as top-level types; instead we special-case
+ // them in places like parameter lists so that we can pass them
+ // as pointer and length pairs.
+ }
+ _ => {
+ if name.as_str() == "size" {
+ // Special-case "size" as "__SIZE_TYPE__" -- TODO: Encode this in witx.
+ ret.push_str(&format!(
+ "typedef __SIZE_TYPE__ __wasi_{}_t;\n",
+ ident_name(name)
+ ));
+ } else {
+ ret.push_str(&format!(
+ "typedef {} __wasi_{}_t;\n",
+ typeref_name(dest),
+ ident_name(name)
+ ));
+ }
+ ret.push_str("\n");
+
+ ret.push_str(&format!(
+ "_Static_assert(sizeof(__wasi_{}_t) == {}, \"witx calculated size\");\n",
+ ident_name(name),
+ dest.mem_size_align().size
+ ));
+ ret.push_str(&format!(
+ "_Static_assert(_Alignof(__wasi_{}_t) == {}, \"witx calculated align\");\n",
+ ident_name(name),
+ dest.mem_size_align().align
+ ));
+
+ ret.push_str("\n");
+ }
+ }
+}
+
+fn print_enum(ret: &mut String, name: &Id, v: &Variant) {
+ ret.push_str(&format!(
+ "typedef {} __wasi_{}_t;\n",
+ intrepr_name(v.tag_repr),
+ ident_name(name)
+ ));
+ ret.push_str("\n");
+
+ for (index, case) in v.cases.iter().enumerate() {
+ if !case.docs.is_empty() {
+ ret.push_str("/**\n");
+ for line in case.docs.lines() {
+ ret.push_str(&format!(" * {}\n", line));
+ }
+ ret.push_str(" */\n");
+ }
+ ret.push_str(&format!(
+ "#define __WASI_{}_{} ({}({}))\n",
+ ident_name(&name).to_shouty_snake_case(),
+ ident_name(&case.name).to_shouty_snake_case(),
+ intrepr_const(v.tag_repr),
+ index
+ ));
+ ret.push_str("\n");
+ }
+
+ ret.push_str(&format!(
+ "_Static_assert(sizeof(__wasi_{}_t) == {}, \"witx calculated size\");\n",
+ ident_name(name),
+ v.tag_repr.mem_size()
+ ));
+ ret.push_str(&format!(
+ "_Static_assert(_Alignof(__wasi_{}_t) == {}, \"witx calculated align\");\n",
+ ident_name(name),
+ v.tag_repr.mem_align()
+ ));
+
+ ret.push_str("\n");
+}
+
+fn print_constant(ret: &mut String, const_: &Constant) {
+ if !const_.docs.is_empty() {
+ ret.push_str("/**\n");
+ for line in const_.docs.lines() {
+ ret.push_str(&format!(" * {}\n", line));
+ }
+ ret.push_str(" */\n");
+ }
+ ret.push_str(&format!(
+ "#define __WASI_{}_{} ((__wasi_{}_t){})\n",
+ ident_name(&const_.ty).to_shouty_snake_case(),
+ ident_name(&const_.name).to_shouty_snake_case(),
+ ident_name(&const_.ty),
+ const_.value,
+ ));
+ ret.push_str("\n");
+}
+
+fn print_record(ret: &mut String, name: &Id, s: &RecordDatatype) {
+ if let Some(repr) = s.bitflags_repr() {
+ ret.push_str(&format!(
+ "typedef {} __wasi_{}_t;\n\n",
+ intrepr_name(repr),
+ ident_name(name)
+ ));
+ for (i, member) in s.members.iter().enumerate() {
+ if !member.docs.is_empty() {
+ ret.push_str("/**\n");
+ for line in member.docs.lines() {
+ ret.push_str(&format!(" * {}\n", line));
+ }
+ ret.push_str(" */\n");
+ }
+ ret.push_str(&format!(
+ "#define __WASI_{}_{} ((__wasi_{}_t)(1 << {}))\n",
+ ident_name(name).to_shouty_snake_case(),
+ ident_name(&member.name).to_shouty_snake_case(),
+ ident_name(name),
+ i,
+ ));
+ ret.push_str("\n");
+ }
+ return;
+ }
+ ret.push_str(&format!(
+ "typedef struct __wasi_{}_t {{\n",
+ ident_name(name)
+ ));
+
+ for member in &s.members {
+ if !member.docs.is_empty() {
+ ret.push_str(" /**\n");
+ for line in member.docs.lines() {
+ ret.push_str(&format!(" * {}\n", line));
+ }
+ ret.push_str(" */\n");
+ }
+ ret.push_str(&format!(
+ " {} {};\n",
+ typeref_name(&member.tref),
+ ident_name(&member.name)
+ ));
+ ret.push_str("\n");
+ }
+
+ ret.push_str(&format!("}} __wasi_{}_t;\n", ident_name(name)));
+ ret.push_str("\n");
+
+ ret.push_str(&format!(
+ "_Static_assert(sizeof(__wasi_{}_t) == {}, \"witx calculated size\");\n",
+ ident_name(name),
+ s.mem_size()
+ ));
+ ret.push_str(&format!(
+ "_Static_assert(_Alignof(__wasi_{}_t) == {}, \"witx calculated align\");\n",
+ ident_name(name),
+ s.mem_align()
+ ));
+
+ for layout in s.member_layout() {
+ ret.push_str(&format!(
+ "_Static_assert(offsetof(__wasi_{}_t, {}) == {}, \"witx calculated offset\");\n",
+ ident_name(name),
+ ident_name(&layout.member.name),
+ layout.offset
+ ));
+ }
+
+ ret.push_str("\n");
+}
+
+fn print_variant(ret: &mut String, name: &Id, v: &Variant) {
+ if v.cases.iter().all(|v| v.tref.is_none()) {
+ return print_enum(ret, name, v);
+ }
+ ret.push_str(&format!(
+ "typedef union __wasi_{}_u_t {{\n",
+ ident_name(name)
+ ));
+
+ for case in &v.cases {
+ if let Some(tref) = &case.tref {
+ if !case.docs.is_empty() {
+ ret.push_str(" /**\n");
+ for line in case.docs.lines() {
+ ret.push_str(&format!(" * {}\n", line));
+ }
+ ret.push_str(" */\n");
+ }
+ ret.push_str(&format!(
+ " {} {};\n",
+ typeref_name(tref),
+ ident_name(&case.name)
+ ));
+ }
+ }
+ ret.push_str(&format!("}} __wasi_{}_u_t;\n", ident_name(name)));
+
+ ret.push_str(&format!(
+ "typedef struct __wasi_{}_t {{\n",
+ ident_name(name)
+ ));
+
+ ret.push_str(&format!(" {} tag;\n", intrepr_name(v.tag_repr)));
+ ret.push_str(&format!(" __wasi_{}_u_t u;\n", ident_name(name)));
+
+ ret.push_str(&format!("}} __wasi_{}_t;\n", ident_name(name)));
+ ret.push_str("\n");
+
+ ret.push_str(&format!(
+ "_Static_assert(sizeof(__wasi_{}_t) == {}, \"witx calculated size\");\n",
+ ident_name(name),
+ v.mem_size()
+ ));
+ ret.push_str(&format!(
+ "_Static_assert(_Alignof(__wasi_{}_t) == {}, \"witx calculated align\");\n",
+ ident_name(name),
+ v.mem_align()
+ ));
+
+ ret.push_str("\n");
+}
+
+fn print_handle(ret: &mut String, name: &Id, h: &HandleDatatype) {
+ ret.push_str(&format!("typedef int __wasi_{}_t;\n\n", ident_name(name)));
+
+ ret.push_str(&format!(
+ "_Static_assert(sizeof(__wasi_{}_t) == {}, \"witx calculated size\");\n",
+ ident_name(name),
+ h.mem_size()
+ ));
+ ret.push_str(&format!(
+ "_Static_assert(_Alignof(__wasi_{}_t) == {}, \"witx calculated align\");\n",
+ ident_name(name),
+ h.mem_align()
+ ));
+
+ ret.push_str("\n");
+}
+
+fn print_module(header: &mut String, source: &mut String, m: &Module) {
+ header.push_str("/**\n");
+ header.push_str(&format!(" * @defgroup {}\n", ident_name(&m.name),));
+ for line in m.docs.lines() {
+ header.push_str(&format!(" * {}\n", line));
+ }
+ header.push_str(" * @{\n");
+ header.push_str(" */\n");
+ header.push_str("\n");
+
+ for func in m.funcs() {
+ print_func_header(header, &func);
+ print_func_source(source, &func, &m.name);
+ }
+
+ header.push_str("/** @} */\n");
+ header.push_str("\n");
+}
+
+fn print_func_header(ret: &mut String, func: &InterfaceFunc) {
+ if !func.docs.is_empty() {
+ ret.push_str("/**\n");
+ for line in func.docs.lines() {
+ ret.push_str(&format!(" * {}\n", line));
+ }
+ if !func.results.is_empty() {
+ let first_result = &func.results[0];
+ if !first_result.docs.is_empty() {
+ ret.push_str(" * @return\n");
+ for line in first_result.docs.lines() {
+ ret.push_str(&format!(" * {}\n", line));
+ }
+ }
+ }
+ ret.push_str(" */\n");
+ }
+
+ print_func_signature(ret, func, true);
+
+ if func.results.len() > 0 {
+ ret.push_str(" __attribute__((__warn_unused_result__))");
+ }
+
+ ret.push_str(";\n");
+}
+
+fn print_func_signature(ret: &mut String, func: &InterfaceFunc, header: bool) {
+ let mut params = Vec::new();
+ for param in func.params.iter() {
+ add_params(
+ &mut params,
+ &ident_name(&param.name),
+ &param.tref,
+ &param.docs,
+ );
+ }
+ match func.results.len() {
+ 0 => {
+ if func.noreturn {
+ ret.push_str("_Noreturn ");
+ }
+ ret.push_str("void ");
+ }
+ 1 => {
+ assert!(!func.noreturn);
+ push_return_type(ret, &mut params, &func.results[0].tref);
+ }
+ _ => panic!("unsupported number of return values"),
+ }
+
+ ret.push_str(&format!("__wasi_{}(\n", ident_name(&func.name)));
+ if params.len() == 0 {
+ ret.push_str(" void\n");
+ } else {
+ for (i, (docs, param)) in params.iter().enumerate() {
+ if header {
+ if let Some(docs) = docs {
+ ret.push_str(" /**\n");
+ for line in docs.lines() {
+ ret.push_str(&format!(" * {}\n", line));
+ }
+ ret.push_str(" */\n");
+ }
+ }
+ ret.push_str(" ");
+ ret.push_str(&param);
+ if i != params.len() - 1 {
+ ret.push_str(",");
+ }
+ ret.push_str("\n");
+ }
+ }
+ ret.push_str(")");
+}
+
+fn print_func_source(ret: &mut String, func: &InterfaceFunc, module_name: &Id) {
+ let (params, results) = func.wasm_signature();
+
+ if func.noreturn {
+ ret.push_str("_Noreturn ");
+ }
+ match results.len() {
+ 0 => ret.push_str("void "),
+ 1 => {
+ ret.push_str(wasm_type(&results[0]));
+ ret.push_str(" ");
+ }
+ _ => unimplemented!(),
+ }
+
+ ret.push_str("__imported_");
+ ret.push_str(&ident_name(module_name));
+ ret.push_str("_");
+ ret.push_str(&ident_name(&func.name));
+ ret.push_str("(");
+ for (i, param) in params.iter().enumerate() {
+ if i > 0 {
+ ret.push_str(", ");
+ }
+ ret.push_str(wasm_type(param));
+ ret.push_str(&format!(" arg{}", i));
+ }
+ ret.push_str(") __attribute__((\n");
+ ret.push_str(&format!(
+ " __import_module__(\"{}\"),\n",
+ ident_name(module_name)
+ ));
+ ret.push_str(&format!(
+ " __import_name__(\"{}\")\n",
+ ident_name(&func.name)
+ ));
+ ret.push_str("));\n\n");
+ print_func_signature(ret, func, false);
+ ret.push_str("{\n");
+
+ // Any string arguments will have their length passed to the raw wasi API,
+ // but we only took a `char*` as a parameter. Get the length of all string
+ // arguments here for it to get passed along later.
+ for param in func.params.iter() {
+ if let Type::List(ty) = &**param.tref.type_() {
+ if let Type::Builtin(BuiltinType::Char) = &**ty.type_() {
+ ret.push_str(&format!(
+ " size_t {}_len = strlen({0});\n",
+ ident_name(&param.name)
+ ));
+ }
+ }
+ }
+
+ func.call_wasm(
+ module_name,
+ &mut C {
+ src: ret,
+ params: &func.params,
+ block_storage: Vec::new(),
+ blocks: Vec::new(),
+ },
+ );
+
+ ret.push_str("}\n\n");
+
+ /// This is a structure which implements the glue necessary to translate
+ /// between the C API of a function and the desired WASI ABI we're being
+ /// told it has.
+ ///
+ /// It's worth nothing that this will, in the long run, get much fancier.
+ /// For now this is extremely simple and entirely assumes that the WASI ABI
+ /// matches our C ABI. This means it will only really generate valid code
+ /// as-is *today* and won't work for any updates to the WASI ABI in the
+ /// future.
+ ///
+ /// It's hoped that this situation will improve as interface types and witx
+ /// continue to evolve and there's a more clear path forward for how to
+ /// translate an interface types signature to a C API.
+ struct C<'a> {
+ src: &'a mut String,
+ params: &'a [InterfaceFuncParam],
+ block_storage: Vec<String>,
+ blocks: Vec<String>,
+ }
+
+ impl Bindgen for C<'_> {
+ type Operand = String;
+
+ fn push_block(&mut self) {
+ let prev = mem::replace(self.src, String::new());
+ self.block_storage.push(prev);
+ }
+
+ fn finish_block(&mut self, operand: Option<String>) {
+ let to_restore = self.block_storage.pop().unwrap();
+ let src = mem::replace(self.src, to_restore);
+ assert!(src.is_empty());
+ match operand {
+ None => self.blocks.push(String::new()),
+ Some(s) => self.blocks.push(s),
+ }
+ }
+
+ fn allocate_space(&mut self, _: usize, _: &NamedType) {
+ // not necessary due to us taking parameters as pointers
+ }
+
+ fn emit(
+ &mut self,
+ inst: &Instruction<'_>,
+ operands: &mut Vec<String>,
+ results: &mut Vec<String>,
+ ) {
+ let mut top_as = |cvt: &str| {
+ let s = operands.pop().unwrap();
+ results.push(format!("({}) {}", cvt, s));
+ };
+
+ match inst {
+ Instruction::GetArg { nth } => {
+ results.push(ident_name(&self.params[*nth].name));
+ }
+ // For the C bindings right now any parameter which needs its
+ // address taken is already taken as a pointer, so we can just
+ // forward the operand to the result.
+ Instruction::AddrOf => results.push(operands.pop().unwrap()),
+
+ Instruction::I64FromU64 => top_as("int64_t"),
+ Instruction::I32FromPointer
+ | Instruction::I32FromConstPointer
+ | Instruction::I32FromHandle { .. }
+ | Instruction::I32FromUsize
+ | Instruction::I32FromChar
+ | Instruction::I32FromU8
+ | Instruction::I32FromS8
+ | Instruction::I32FromChar8
+ | Instruction::I32FromU16
+ | Instruction::I32FromS16
+ | Instruction::I32FromU32 => top_as("int32_t"),
+
+ Instruction::I32FromBitflags { .. } | Instruction::I64FromBitflags { .. } => {
+ // Rely on C's casting for this
+ results.push(operands.pop().unwrap());
+ }
+
+ // No conversion necessary
+ Instruction::F32FromIf32
+ | Instruction::F64FromIf64
+ | Instruction::If32FromF32
+ | Instruction::If64FromF64
+ | Instruction::I64FromS64
+ | Instruction::I32FromS32 => results.push(operands.pop().unwrap()),
+
+ Instruction::ListPointerLength => {
+ let list = operands.pop().unwrap();
+ results.push(format!("(int32_t) {}", list));
+ results.push(format!("(int32_t) {}_len", list));
+ }
+ Instruction::ReturnPointerGet { n } => {
+ // We currently match the wasi ABI with the actual
+ // function's API signature in C, this means when a return
+ // pointer is asked for we can simply forward our parameter
+ // that's a return pointer.
+ results.push(format!("(int32_t) retptr{}", n));
+ }
+
+ Instruction::Load { .. } => {
+ // this is currently skipped because return pointers are
+ // already evident in parameters and so we don't need to
+ // load/store from them again
+ results.push("dummy".to_string());
+ }
+
+ Instruction::ReuseReturn => {
+ results.push("ret".to_string());
+ }
+
+ Instruction::TupleLift { .. } => {
+ // this is currently skipped because tuples are only used
+ // as return values and those are always returned through
+ // out-ptrs, so the values have already been passed through
+ // at this point.
+ results.push("dummy".to_string());
+ }
+
+ Instruction::ResultLift => {
+ let err = self.blocks.pop().unwrap();
+
+ // Our ok block should either have done nothing (meaning
+ // there's no "ok" payload) or it loaded a return pointer
+ // and/or tuple some values. In all these cases we discard
+ // the results since out pointers have already been written
+ // to and we only return the discriminant from the
+ // function.
+ let ok = self.blocks.pop().unwrap();
+ assert!(ok == "dummy" || ok == "");
+
+ // Note that we just push the result of the error block.
+ // Our block management asserts that it's an expression,
+ // which in this case will basically always be casting the
+ // error code to an error code variant, which we return.
+ results.push(err);
+ }
+
+ // Enums are represented in C simply as the integral tag type
+ Instruction::EnumLift { ty } => match &**ty.type_() {
+ Type::Variant(v) => top_as(intrepr_name(v.tag_repr)),
+ _ => unreachable!(),
+ },
+ Instruction::EnumLower { .. } => top_as("int32_t"),
+
+ Instruction::CallWasm {
+ module,
+ name,
+ params: _,
+ results: func_results,
+ } => {
+ assert!(func_results.len() < 2);
+ self.src.push_str(" ");
+ if func_results.len() > 0 {
+ self.src.push_str(wasm_type(&func_results[0]));
+ self.src.push_str(" ret = ");
+ results.push("ret".to_string());
+ }
+ self.src.push_str("__imported_");
+ self.src.push_str(module);
+ self.src.push_str("_");
+ self.src.push_str(name);
+ self.src.push_str("(");
+ self.src.push_str(&operands.join(", "));
+ self.src.push_str(");\n");
+ }
+
+ Instruction::Return { amt: 0 } => {}
+ Instruction::Return { amt: 1 } => {
+ self.src.push_str(" return ");
+ self.src.push_str(&operands[0]);
+ self.src.push_str(";\n");
+ }
+
+ other => panic!("unimplemented instruction {:?}", other),
+ }
+ }
+ }
+}
+
+fn push_return_type(ret: &mut String, params: &mut Vec<(Option<String>, String)>, tref: &TypeRef) {
+ match &**tref.type_() {
+ Type::Variant(v) => {
+ assert_eq!(v.cases.len(), 2, "unsupported type as a return value");
+ assert!(
+ v.cases[0].name == "ok",
+ "unsupported type as a return value"
+ );
+ assert!(
+ v.cases[1].name == "err",
+ "unsupported type as a return value"
+ );
+ let err = match &v.cases[1].tref {
+ Some(ty) => ty,
+ None => panic!("unsupported type as a return value"),
+ };
+ ret.push_str(&typeref_name(&err));
+ ret.push_str(" ");
+
+ let ok = match &v.cases[0].tref {
+ Some(ty) => ty,
+ None => return,
+ };
+ match &**ok.type_() {
+ Type::Record(r) if r.is_tuple() => {
+ for (i, member) in r.members.iter().enumerate() {
+ params.push((None, format!("{} *retptr{}", typeref_name(&member.tref), i)));
+ }
+ }
+ _ => {
+ params.push((None, format!("{} *retptr0", typeref_name(ok))));
+ }
+ }
+ }
+ _ => panic!("unsupported type as a return value"),
+ }
+}
+
+fn add_params(params: &mut Vec<(Option<String>, String)>, name: &str, tref: &TypeRef, docs: &str) {
+ let docs = if docs.is_empty() {
+ None
+ } else {
+ Some(docs.to_string())
+ };
+ match &**tref.type_() {
+ Type::List(element) => match &**element.type_() {
+ Type::Builtin(BuiltinType::Char) => {
+ params.push((docs, format!("const char *{}", name)));
+ }
+ _ => {
+ params.push((docs, format!("const {} *{}", typeref_name(&element), name)));
+ params.push((
+ Some(format!("The length of the array pointed to by `{}`.", name,)),
+ format!("size_t {}_len", name),
+ ));
+ }
+ },
+ _ => {
+ params.push((docs, format!("{} {}", typeref_name(tref), name)));
+ }
+ }
+}
+
+fn ident_name(i: &Id) -> String {
+ i.as_str().to_string()
+}
+
+fn builtin_type_name(b: BuiltinType) -> &'static str {
+ match b {
+ BuiltinType::U8 { lang_c_char: true } => {
+ panic!("no type name for string or char8 builtins")
+ }
+ BuiltinType::U8 { lang_c_char: false } => "uint8_t",
+ BuiltinType::U16 => "uint16_t",
+ BuiltinType::U32 {
+ lang_ptr_size: true,
+ } => "size_t",
+ BuiltinType::U32 {
+ lang_ptr_size: false,
+ } => "uint32_t",
+ BuiltinType::U64 => "uint64_t",
+ BuiltinType::S8 => "int8_t",
+ BuiltinType::S16 => "int16_t",
+ BuiltinType::S32 => "int32_t",
+ BuiltinType::S64 => "int64_t",
+ BuiltinType::F32 => "float",
+ BuiltinType::F64 => "double",
+ BuiltinType::Char => "char32_t",
+ }
+}
+
+fn typeref_name(tref: &TypeRef) -> String {
+ match &**tref.type_() {
+ Type::Builtin(BuiltinType::U8 { lang_c_char: true }) | Type::List(_) => {
+ panic!("unsupported grammar: cannot construct name of string or array",)
+ }
+ _ => {}
+ }
+
+ match tref {
+ TypeRef::Name(named_type) => namedtype_name(&named_type),
+ TypeRef::Value(anon_type) => match &**anon_type {
+ Type::List(_) => unreachable!("arrays excluded above"),
+ Type::Builtin(b) => builtin_type_name(*b).to_string(),
+ Type::Pointer(p) => format!("{} *", typeref_name(&*p)),
+ Type::ConstPointer(p) => format!("const {} *", typeref_name(&*p)),
+ Type::Record { .. } | Type::Variant { .. } | Type::Handle { .. } => unreachable!(
+ "wasi should not have anonymous structs, unions, enums, flags, handles"
+ ),
+ },
+ }
+}
+
+fn namedtype_name(named_type: &NamedType) -> String {
+ match &**named_type.type_() {
+ Type::Pointer(p) => format!("{} *", typeref_name(&*p)),
+ Type::ConstPointer(p) => format!("const {} *", typeref_name(&*p)),
+ Type::List(_) => unreachable!("arrays excluded above"),
+ _ => format!("__wasi_{}_t", named_type.name.as_str()),
+ }
+}
+
+fn intrepr_name(i: IntRepr) -> &'static str {
+ match i {
+ IntRepr::U8 => "uint8_t",
+ IntRepr::U16 => "uint16_t",
+ IntRepr::U32 => "uint32_t",
+ IntRepr::U64 => "uint64_t",
+ }
+}
+
+fn intrepr_const(i: IntRepr) -> &'static str {
+ match i {
+ IntRepr::U8 => "UINT8_C",
+ IntRepr::U16 => "UINT16_C",
+ IntRepr::U32 => "UINT32_C",
+ IntRepr::U64 => "UINT64_C",
+ }
+}
+
+fn wasm_type(wasm: &WasmType) -> &'static str {
+ match wasm {
+ WasmType::I32 => "int32_t",
+ WasmType::I64 => "int64_t",
+ WasmType::F32 => "float",
+ WasmType::F64 => "double",
+ }
+}
diff --git a/tools/wasi-headers/src/lib.rs b/tools/wasi-headers/src/lib.rs
new file mode 100644
index 0000000..8844c49
--- /dev/null
+++ b/tools/wasi-headers/src/lib.rs
@@ -0,0 +1,39 @@
+mod c_header;
+
+use anyhow::Result;
+pub use c_header::{to_c, Generated};
+use std::path::{Path, PathBuf};
+use witx::load;
+
+pub fn generate<P: AsRef<Path>>(inputs: &[P]) -> Result<Generated> {
+ let doc = load(&inputs)?;
+
+ let inputs_str = &inputs
+ .iter()
+ .map(|p| {
+ p.as_ref()
+ .file_name()
+ .unwrap()
+ .to_str()
+ .unwrap()
+ .to_string()
+ })
+ .collect::<Vec<_>>()
+ .join(", ");
+
+ Ok(to_c(&doc, &inputs_str))
+}
+
+pub fn snapshot_witx_files() -> Result<Vec<PathBuf>> {
+ witx::phases::snapshot()
+}
+
+pub fn libc_wasi_api_header() -> PathBuf {
+ PathBuf::from(env!("CARGO_MANIFEST_DIR"))
+ .join("../../libc-bottom-half/headers/public/wasi/api.h")
+}
+
+pub fn libc_wasi_api_source() -> PathBuf {
+ PathBuf::from(env!("CARGO_MANIFEST_DIR"))
+ .join("../../libc-bottom-half/sources/__wasilibc_real.c")
+}
diff --git a/tools/wasi-headers/src/main.rs b/tools/wasi-headers/src/main.rs
new file mode 100644
index 0000000..867c31d
--- /dev/null
+++ b/tools/wasi-headers/src/main.rs
@@ -0,0 +1,61 @@
+#[macro_use]
+extern crate clap;
+
+use anyhow::Result;
+use clap::{Arg, SubCommand};
+use std::fs;
+use std::path::Path;
+use wasi_headers::{generate, libc_wasi_api_header, libc_wasi_api_source, snapshot_witx_files};
+
+pub fn run(
+ inputs: &[impl AsRef<Path>],
+ header_output: impl AsRef<Path>,
+ source_output: impl AsRef<Path>,
+) -> Result<()> {
+ let c_header = generate(inputs)?;
+ fs::write(header_output, c_header.header)?;
+ fs::write(source_output, c_header.source)?;
+ Ok(())
+}
+
+fn main() -> Result<()> {
+ let matches = app_from_crate!()
+ .setting(clap::AppSettings::SubcommandRequiredElseHelp)
+ .subcommand(
+ SubCommand::with_name("generate")
+ .arg(Arg::with_name("inputs").required(true).multiple(true))
+ .arg(
+ Arg::with_name("output")
+ .short("o")
+ .long("output")
+ .takes_value(true)
+ .required(true),
+ ),
+ )
+ .subcommand(
+ SubCommand::with_name("generate-libc")
+ .about("generate libc api.h from current snapshot"),
+ )
+ .get_matches();
+
+ if matches.subcommand_matches("generate-libc").is_some() {
+ let inputs = snapshot_witx_files()?;
+ run(&inputs, libc_wasi_api_header(), libc_wasi_api_source())?;
+ } else if let Some(generate) = matches.subcommand_matches("generate") {
+ let inputs = generate
+ .values_of("inputs")
+ .expect("required inputs arg")
+ .collect::<Vec<_>>();
+ let output = generate.value_of("output").expect("required output arg");
+ let output = Path::new(&output);
+ run(
+ &inputs,
+ output.with_extension("h"),
+ output.with_extension("c"),
+ )?;
+ } else {
+ unreachable!("a subcommand must be provided")
+ };
+
+ Ok(())
+}
diff --git a/tools/wasi-headers/tests/verify.rs b/tools/wasi-headers/tests/verify.rs
new file mode 100644
index 0000000..faae763
--- /dev/null
+++ b/tools/wasi-headers/tests/verify.rs
@@ -0,0 +1,95 @@
+use std::fs;
+use std::path::Path;
+
+#[test]
+fn assert_same_as_src() {
+ let actual_header =
+ fs::read_to_string(wasi_headers::libc_wasi_api_header()).expect("read libc wasi/api.h");
+ let actual_source =
+ fs::read_to_string(wasi_headers::libc_wasi_api_source()).expect("read libc wasi/api.h");
+ let witx_files = wasi_headers::snapshot_witx_files().expect("parse snapshot witx files");
+ let expected = wasi_headers::generate(&witx_files).expect("header generation");
+ if actual_header == expected.header && actual_source == expected.source {
+ return;
+ }
+
+ if actual_header != expected.header {
+ diff(
+ &wasi_headers::libc_wasi_api_header(),
+ &actual_header,
+ &expected.header,
+ );
+ }
+ if actual_header != expected.header {
+ diff(
+ &wasi_headers::libc_wasi_api_source(),
+ &actual_header,
+ &expected.header,
+ );
+ }
+}
+
+fn diff(path: &Path, actual: &str, expected: &str) {
+ eprintln!("The following diff was found between the generated copy and the");
+ eprintln!("source copy of {:?} in the tree:", path);
+ eprintln!();
+
+ let mut expected_line = 1;
+ let mut actual_line = 1;
+ let mut separated = false;
+ let mut any_lines = false;
+ for diff in diff::lines(&expected, &actual) {
+ match diff {
+ diff::Result::Left(l) => {
+ eprintln!("line {}: -{}", expected_line, l);
+ expected_line += 1;
+ separated = false;
+ any_lines = true;
+ }
+ diff::Result::Both(_, _) => {
+ expected_line += 1;
+ actual_line += 1;
+ if !separated {
+ eprintln!("...");
+ separated = true;
+ }
+ }
+ diff::Result::Right(r) => {
+ eprintln!("line {}: +{}", actual_line, r);
+ actual_line += 1;
+ separated = false;
+ any_lines = true;
+ }
+ }
+ }
+
+ if !any_lines {
+ eprintln!();
+ eprintln!(
+ "Somehow there was a diff with no lines differing. Lengths: {} and {}.",
+ expected.len(),
+ actual.len()
+ );
+ for (index, (a, b)) in actual.chars().zip(expected.chars()).enumerate() {
+ if a != b {
+ eprintln!("char difference at index {}: '{}' != '{}'", index, a, b);
+ }
+ }
+ for (index, (a, b)) in actual.bytes().zip(expected.bytes()).enumerate() {
+ if a != b {
+ eprintln!("byte difference at index {}: b'{}' != b'{}'", index, a, b);
+ }
+ }
+ eprintln!();
+ eprintln!("actual: {}", actual);
+ eprintln!();
+ eprintln!("expected: {}", expected);
+ }
+
+ eprintln!();
+ eprintln!(
+ "To regenerate the files, run `cd tools/wasi-headers && cargo run -- generate-libc`."
+ );
+ eprintln!();
+ panic!();
+}