From f7ae50462ad280f07944111fc4c876ae976d4be1 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Mon, 10 Jul 2023 04:29:46 -0700 Subject: [PATCH] Make improvements - Fix unused local variable errors - Remove yoinks from sigaction() header - Add nox87 and aarch64 to github actions - Fix cosmocc -fportcosmo in linking mode - It's now possible to build `make m=llvm o/llvm/libc` --- .github/workflows/build.yml | 2 +- ape/ape.mk | 1 + build/bootstrap/compile.com | Bin 131888 -> 131888 bytes build/config.mk | 9 +- dsp/core/alaw.c | 3 +- libc/calls/calls.mk | 3 +- libc/calls/interrupts-nt.c | 1 + libc/calls/ioctl_siocgifconf.c | 2 - libc/calls/pause-nt.c | 6 +- libc/calls/pledge-linux.c | 1 + libc/calls/sigaction.c | 7 ++ libc/calls/sigenter-netbsd.c | 6 +- libc/calls/sigenter-openbsd.c | 6 +- libc/calls/sigignore.c | 2 +- libc/calls/siginfo2cosmo.c | 2 + libc/calls/signal.c | 4 +- libc/calls/sigsuspend.c | 9 +- libc/calls/sigwinch-nt.c | 1 - libc/calls/statfs2cosmo.c | 1 + libc/calls/struct/sigaction.h | 60 +---------- libc/calls/struct/sigaction.internal.h | 4 + libc/calls/tcsetattr-nt.c | 2 + libc/dns/resolvedns.c | 3 +- libc/integral/c.inc | 4 + .../{x/xreadlink.c => intrin/getcpuidbrand.S} | 31 +++--- libc/intrin/getcpuidbrand.c | 37 ------- libc/intrin/memset.c | 2 +- libc/{runtime => intrin}/stackchkfail.c | 4 +- libc/{runtime => intrin}/stackchkfaillocal.c | 0 .../compiler_rt => libc/intrin}/udivti3.c | 0 libc/isystem/signal.h | 1 + libc/libc.mk | 7 +- libc/log/checkfail.c | 2 - libc/log/gdbexec.c | 2 - libc/log/memlog.c | 3 +- libc/log/oncrash_amd64.c | 8 +- libc/runtime/clone.c | 2 +- libc/runtime/enable_tls.c | 2 +- libc/runtime/ftrace-hook.S | 2 +- libc/runtime/inflate.c | 2 - libc/runtime/memtracknt.c | 8 +- libc/runtime/runtime.mk | 3 +- libc/runtime/winmain.greg.c | 1 + libc/sock/kntwsadata.c | 1 + libc/stdio/fmt.c | 19 +--- libc/stdio/posix_spawn.internal.h | 6 +- libc/stdio/posix_spawn_file_actions.c | 1 + libc/str/getzipeocd.c | 3 +- libc/sysv/errno_location.greg.c | 3 +- libc/sysv/systemfive.S | 4 +- libc/testlib/ezbench.h | 90 ++++++++--------- libc/testlib/memoryexists.c | 1 + libc/testlib/testlib.h | 2 - libc/testlib/testlib.mk | 3 - libc/testlib/thrashcodecache.S | 49 --------- libc/thread/makecontext.c | 2 +- libc/thread/pthread_getaffinity_np.c | 3 +- libc/thread/sem_open.c | 4 +- libc/thread/spawn.c | 2 +- libc/tinymath/ceil.c | 4 +- libc/tinymath/ceilf.c | 4 +- libc/tinymath/floor.c | 4 +- libc/tinymath/floorf.c | 4 +- libc/tinymath/internal.h | 3 + libc/tinymath/trunc.c | 4 +- libc/tinymath/truncf.c | 4 +- libc/vga/rlinit-vesa.S | 2 +- libc/vga/tty-klog.greg.c | 2 + libc/x/utf8to16.c | 3 +- libc/x/x.h | 9 -- libc/x/x.mk | 3 +- libc/x/xreadlinkat.c | 47 --------- libc/x/xsigaction.c | 4 +- libc/x/xsigaction.h | 8 -- test/libc/calls/signal_test.c | 1 + test/libc/calls/tkill_test.c | 1 + test/libc/mem/qsort_test.c | 94 ++++++++++++++++-- test/libc/runtime/mprotect_test.c | 2 + test/libc/stdio/fmt_test.c | 7 ++ third_party/awk/main.c | 1 + third_party/lua/lrepl.c | 1 + third_party/make/commands.c | 1 + third_party/make/job.c | 1 + third_party/musl/strfmon.c | 12 +-- .../python/Modules/cjkcodecs/__big5_decmap.c | 1 + .../Modules/cjkcodecs/__cp932ext_decmap.c | 1 + .../python/Modules/cjkcodecs/__cp949_encmap.c | 1 + .../Modules/cjkcodecs/__cp949ext_decmap.c | 1 + .../Modules/cjkcodecs/__cp950ext_decmap.c | 1 + .../Modules/cjkcodecs/__gb18030ext_decmap.c | 1 + .../Modules/cjkcodecs/__gb18030ext_encmap.c | 1 + .../Modules/cjkcodecs/__gb2312_decmap.c | 1 + .../Modules/cjkcodecs/__gbcommon_encmap.c | 1 + .../Modules/cjkcodecs/__gbkext_decmap.c | 1 + .../Modules/cjkcodecs/__jisx0208_decmap.c | 1 + .../Modules/cjkcodecs/__jisx0212_decmap.c | 1 + .../cjkcodecs/__jisx0213_1_bmp_decmap.c | 1 + .../cjkcodecs/__jisx0213_2_bmp_decmap.c | 1 + .../cjkcodecs/__jisx0213_pair_decmap.c | 1 + .../Modules/cjkcodecs/__ksx1001_decmap.c | 1 + .../python/Modules/cjkcodecs}/xloadzd.c | 0 .../python/Modules/cjkcodecs/xloadzd.h | 11 ++ third_party/python/Modules/faulthandler.c | 1 + third_party/python/python.mk | 2 + third_party/quickjs/quickjs-libc.c | 1 + third_party/radpajama/main-redpajama-chat.cc | 1 + third_party/radpajama/main-redpajama.cc | 1 + third_party/sqlite3/shell.c | 1 + third_party/zip/zip.c | 1 + third_party/zip/zip.mk | 3 +- third_party/zip/zipnote.c | 1 + third_party/zip/zipsplit.c | 1 + third_party/zstd/programs/fileio.c | 1 + tool/build/compile.c | 10 +- tool/emacs/cosmo-c-builtins.el | 3 +- tool/scripts/cosmoc++ | 2 +- tool/scripts/cosmocc | 2 +- tool/viz/memzoom.c | 1 + 118 files changed, 342 insertions(+), 392 deletions(-) rename libc/{x/xreadlink.c => intrin/getcpuidbrand.S} (78%) delete mode 100644 libc/intrin/getcpuidbrand.c rename libc/{runtime => intrin}/stackchkfail.c (95%) rename libc/{runtime => intrin}/stackchkfaillocal.c (100%) rename {third_party/compiler_rt => libc/intrin}/udivti3.c (100%) delete mode 100644 libc/testlib/thrashcodecache.S delete mode 100644 libc/x/xreadlinkat.c rename {libc/x => third_party/python/Modules/cjkcodecs}/xloadzd.c (100%) create mode 100644 third_party/python/Modules/cjkcodecs/xloadzd.h diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c558453d5..4b0798a0b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - mode: ["", tiny, rel, tinylinux, optlinux] + mode: ["", tiny, rel, nox87, aarch64, tinylinux, optlinux] steps: - uses: actions/checkout@v3 diff --git a/ape/ape.mk b/ape/ape.mk index 5d575aa38..8e8b2d1d0 100644 --- a/ape/ape.mk +++ b/ape/ape.mk @@ -86,6 +86,7 @@ APE_LOADER_FLAGS = \ -Os \ -ffreestanding \ -mgeneral-regs-only \ + -fno-stack-protector \ -fno-ident \ -fno-gnu-unique \ -c \ diff --git a/build/bootstrap/compile.com b/build/bootstrap/compile.com index 701b7570f01a728373f48c85ee577641e05444b3..4bf5e30aa66a4989f35bdbe13372a541f0bbf3e9 100755 GIT binary patch delta 35695 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 4; if (a > 15) { @@ -36,7 +36,6 @@ int alaw(int x) { a -= 16; a += (b + 1) << 4; } else { - e = 1; a -= 16; a += 16; } diff --git a/libc/calls/calls.mk b/libc/calls/calls.mk index d640c0be9..aa55d3b34 100644 --- a/libc/calls/calls.mk +++ b/libc/calls/calls.mk @@ -191,7 +191,8 @@ o/$(MODE)/libc/calls/pledge-linux.o \ o/$(MODE)/libc/calls/siginfo2cosmo.o: private \ CFLAGS += \ -ffreestanding \ - -fno-sanitize=all + -fno-sanitize=all \ + -fno-stack-protector o/$(MODE)/libc/calls/pledge-linux.o \ o/$(MODE)/libc/calls/unveil.o: private \ diff --git a/libc/calls/interrupts-nt.c b/libc/calls/interrupts-nt.c index e1a276168..147c089e6 100644 --- a/libc/calls/interrupts-nt.c +++ b/libc/calls/interrupts-nt.c @@ -23,6 +23,7 @@ #include "libc/calls/state.internal.h" #include "libc/calls/struct/fd.internal.h" #include "libc/calls/struct/sigaction.h" +#include "libc/calls/struct/sigaction.internal.h" #include "libc/calls/syscall_support-nt.internal.h" #include "libc/dce.h" #include "libc/errno.h" diff --git a/libc/calls/ioctl_siocgifconf.c b/libc/calls/ioctl_siocgifconf.c index d54acd1ba..cfa89e6a3 100644 --- a/libc/calls/ioctl_siocgifconf.c +++ b/libc/calls/ioctl_siocgifconf.c @@ -59,7 +59,6 @@ static int ioctl_siocgifconf_sysv(int fd, struct ifconf *ifc) { char *b, *p, *e; char ifcBsd[16]; struct ifreq *req; - struct ifreq *end; uint32_t bufLen, ip; size_t numReq, bufMax; if (IsLinux()) return sys_ioctl(fd, SIOCGIFCONF, ifc); @@ -77,7 +76,6 @@ static int ioctl_siocgifconf_sysv(int fd, struct ifconf *ifc) { */ memcpy(&bufLen, b, 4); req = ifc->ifc_req; - end = req + ifc->ifc_len / sizeof(*req); for (p = b, e = p + MIN(bufMax, READ32LE(ifcBsd)); p + 16 + 16 <= e; p += IsBsd() ? 16 + MAX(16, p[16] & 255) : 40) { fam = p[IsBsd() ? 17 : 16] & 255; diff --git a/libc/calls/pause-nt.c b/libc/calls/pause-nt.c index b30d032fe..b1b7d2300 100644 --- a/libc/calls/pause-nt.c +++ b/libc/calls/pause-nt.c @@ -26,9 +26,6 @@ #include "libc/sysv/errfuns.h" textwindows int sys_pause_nt(void) { - long ms, totoms; - ms = 0; - totoms = 0; for (;;) { if (_check_interrupts(false, g_fds.p)) { @@ -40,7 +37,8 @@ textwindows int sys_pause_nt(void) { continue; } -#if defined(SYSDEBUG) && defined(_POLLTRACE) +#if defined(SYSDEBUG) && _POLLTRACE + long ms = 0, totoms = 0; ms += __SIG_POLLING_INTERVAL_MS; if (ms >= __SIG_LOGGING_INTERVAL_MS) { totoms += ms, ms = 0; diff --git a/libc/calls/pledge-linux.c b/libc/calls/pledge-linux.c index a7dc77bf6..eaa98abcf 100644 --- a/libc/calls/pledge-linux.c +++ b/libc/calls/pledge-linux.c @@ -25,6 +25,7 @@ #include "libc/calls/struct/seccomp.internal.h" #include "libc/calls/struct/sigaction.h" #include "libc/calls/syscall_support-sysv.internal.h" +#include "libc/calls/ucontext.h" #include "libc/intrin/bsr.h" #include "libc/intrin/likely.h" #include "libc/intrin/promises.internal.h" diff --git a/libc/calls/sigaction.c b/libc/calls/sigaction.c index 30f0025a7..35920dc58 100644 --- a/libc/calls/sigaction.c +++ b/libc/calls/sigaction.c @@ -24,6 +24,7 @@ #include "libc/calls/internal.h" #include "libc/calls/sig.internal.h" #include "libc/calls/state.internal.h" +#include "libc/calls/struct/sigaction.h" #include "libc/calls/struct/sigaction.internal.h" #include "libc/calls/struct/siginfo.internal.h" #include "libc/calls/struct/sigset.h" @@ -53,6 +54,12 @@ STATIC_YOINK("strsignal"); // for kprintf() #endif +#if SupportsWindows() +STATIC_YOINK("_init_onntconsoleevent"); +STATIC_YOINK("_check_sigwinch"); +STATIC_YOINK("_init_wincrash"); +#endif + #define SA_RESTORER 0x04000000 static void sigaction_cosmo2native(union metasigaction *sa) { diff --git a/libc/calls/sigenter-netbsd.c b/libc/calls/sigenter-netbsd.c index 17c3e003a..b52f19e95 100644 --- a/libc/calls/sigenter-netbsd.c +++ b/libc/calls/sigenter-netbsd.c @@ -74,7 +74,8 @@ privileged void __sigenter_netbsd(int sig, struct siginfo_netbsd *si, uc.uc_mcontext.err = ctx->uc_mcontext.err; uc.uc_mcontext.rip = ctx->uc_mcontext.rip; uc.uc_mcontext.rsp = ctx->uc_mcontext.rsp; - *uc.uc_mcontext.fpregs = ctx->uc_mcontext.__fpregs; + __repmovsb(uc.uc_mcontext.fpregs, &ctx->uc_mcontext.__fpregs, + sizeof(ctx->uc_mcontext.__fpregs)); ((sigaction_f)(__executable_start + rva))(sig, &si2, &uc); ctx->uc_stack.ss_sp = uc.uc_stack.ss_sp; ctx->uc_stack.ss_size = uc.uc_stack.ss_size; @@ -102,7 +103,8 @@ privileged void __sigenter_netbsd(int sig, struct siginfo_netbsd *si, ctx->uc_mcontext.err = uc.uc_mcontext.err; ctx->uc_mcontext.rip = uc.uc_mcontext.rip; ctx->uc_mcontext.rsp = uc.uc_mcontext.rsp; - ctx->uc_mcontext.__fpregs = *uc.uc_mcontext.fpregs; + __repmovsb(&ctx->uc_mcontext.__fpregs, uc.uc_mcontext.fpregs, + sizeof(ctx->uc_mcontext.__fpregs)); } } /* diff --git a/libc/calls/sigenter-openbsd.c b/libc/calls/sigenter-openbsd.c index 27c758670..6e0318919 100644 --- a/libc/calls/sigenter-openbsd.c +++ b/libc/calls/sigenter-openbsd.c @@ -74,7 +74,8 @@ privileged void __sigenter_openbsd(int sig, struct siginfo_openbsd *openbsdinfo, g.uc.uc_mcontext.rip = ctx->sc_rip; g.uc.uc_mcontext.rsp = ctx->sc_rsp; if (ctx->sc_fpstate) { - *g.uc.uc_mcontext.fpregs = *ctx->sc_fpstate; + __repmovsb(g.uc.uc_mcontext.fpregs, ctx->sc_fpstate, + sizeof(*ctx->sc_fpstate)); } ((sigaction_f)(__executable_start + rva))(sig, &g.si, &g.uc); ctx->sc_mask = g.uc.uc_sigmask.__bits[0]; @@ -100,7 +101,8 @@ privileged void __sigenter_openbsd(int sig, struct siginfo_openbsd *openbsdinfo, ctx->sc_rip = g.uc.uc_mcontext.rip; ctx->sc_rsp = g.uc.uc_mcontext.rsp; if (ctx->sc_fpstate) { - *ctx->sc_fpstate = *g.uc.uc_mcontext.fpregs; + __repmovsb(ctx->sc_fpstate, g.uc.uc_mcontext.fpregs, + sizeof(*ctx->sc_fpstate)); } } } diff --git a/libc/calls/sigignore.c b/libc/calls/sigignore.c index 2bfba2902..c8a7b3ee4 100644 --- a/libc/calls/sigignore.c +++ b/libc/calls/sigignore.c @@ -27,5 +27,5 @@ int sigignore(int sig) { struct sigaction sa; bzero(&sa, sizeof(sa)); sa.sa_handler = SIG_IGN; - return (sigaction)(sig, &sa, 0); + return sigaction(sig, &sa, 0); } diff --git a/libc/calls/siginfo2cosmo.c b/libc/calls/siginfo2cosmo.c index 30e621918..e3aa6ab9a 100644 --- a/libc/calls/siginfo2cosmo.c +++ b/libc/calls/siginfo2cosmo.c @@ -96,6 +96,8 @@ privileged void __siginfo2cosmo(struct siginfo *si, si_signo == SIGBUS || // si_signo == SIGTRAP) { si->si_addr = si_addr; + } else if (si_signo == SIGCHLD) { + si->si_status = si_status; } else if (si_signo == SIGALRM) { si->si_timerid = si_timerid; si->si_overrun = si_overrun; diff --git a/libc/calls/signal.c b/libc/calls/signal.c index a006e109d..b2785bc6e 100644 --- a/libc/calls/signal.c +++ b/libc/calls/signal.c @@ -30,9 +30,9 @@ * @note this function has BSD semantics, i.e. SA_RESTART * @see sigaction() which has more features and docs */ -sighandler_t(signal)(int sig, sighandler_t func) { +sighandler_t signal(int sig, sighandler_t func) { struct sigaction old, sa = {.sa_handler = func, .sa_flags = SA_RESTART}; - if ((sigaction)(sig, &sa, &old) != -1) { + if (sigaction(sig, &sa, &old) != -1) { return old.sa_handler; } else { return SIG_ERR; diff --git a/libc/calls/sigsuspend.c b/libc/calls/sigsuspend.c index 872b6d267..82457d0a5 100644 --- a/libc/calls/sigsuspend.c +++ b/libc/calls/sigsuspend.c @@ -47,7 +47,6 @@ */ int sigsuspend(const sigset_t *ignore) { int rc; - long ms, totoms; sigset_t save, *arg, mask = {0}; STRACE("sigsuspend(%s) → ...", DescribeSigset(0, ignore)); BEGIN_CANCELLATION_POINT; @@ -73,8 +72,10 @@ int sigsuspend(const sigset_t *ignore) { rc = sys_sigsuspend(arg, 8); } else { __sig_mask(SIG_SETMASK, arg, &save); - ms = 0; - totoms = 0; +#if defined(SYSDEBUG) && _POLLTRACE + long ms = 0; + long totoms = 0; +#endif do { if ((rc = _check_interrupts(false, g_fds.p))) { break; @@ -83,7 +84,7 @@ int sigsuspend(const sigset_t *ignore) { POLLTRACE("IOCP EINTR"); continue; } -#if defined(SYSDEBUG) && defined(_POLLTRACE) +#if defined(SYSDEBUG) && _POLLTRACE ms += __SIG_POLLING_INTERVAL_MS; if (ms >= __SIG_LOGGING_INTERVAL_MS) { totoms += ms, ms = 0; diff --git a/libc/calls/sigwinch-nt.c b/libc/calls/sigwinch-nt.c index b1d6ec731..5361e1b89 100644 --- a/libc/calls/sigwinch-nt.c +++ b/libc/calls/sigwinch-nt.c @@ -31,7 +31,6 @@ #include "libc/sysv/consts/sicode.h" #include "libc/sysv/consts/sig.h" #include "libc/thread/tls.h" - #ifdef __x86_64__ static struct winsize __ws; diff --git a/libc/calls/statfs2cosmo.c b/libc/calls/statfs2cosmo.c index 729fd7fc7..084417657 100644 --- a/libc/calls/statfs2cosmo.c +++ b/libc/calls/statfs2cosmo.c @@ -299,5 +299,6 @@ void statfs2cosmo(struct statfs *f, const union statfs_meta *m) { f->f_namelen = f_namelen; f->f_frsize = f_frsize; f->f_flags = f_flags; + f->f_owner = f_owner; memcpy(f->f_fstypename, f_fstypename, 16); } diff --git a/libc/calls/struct/sigaction.h b/libc/calls/struct/sigaction.h index b3105782d..552e21b47 100644 --- a/libc/calls/struct/sigaction.h +++ b/libc/calls/struct/sigaction.h @@ -2,15 +2,11 @@ #define COSMOPOLITAN_LIBC_CALLS_STRUCT_SIGACTION_H_ #include "libc/calls/struct/siginfo.h" #include "libc/calls/struct/sigset.h" -#include "libc/calls/ucontext.h" -#include "libc/dce.h" -#include "libc/sysv/consts/sig.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ typedef void (*sighandler_t)(int); -typedef void (*sigaction_f)(int, struct siginfo *, - void * /*struct ucontext **/); +typedef void (*sigaction_f)(int, struct siginfo *, void *); struct sigaction { /* cosmo abi */ union { @@ -25,60 +21,6 @@ struct sigaction { /* cosmo abi */ sighandler_t signal(int, sighandler_t); int sigaction(int, const struct sigaction *, struct sigaction *); -#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && defined(COSMO) - -void _init_onntconsoleevent(void); -void _init_wincrash(void); -void _check_sigwinch(); - -#ifndef __SIGACTION_YOINK -#define __SIGACTION_YOINK(SIG) \ - do { \ - if (SupportsWindows()) { \ - if (__builtin_constant_p(SIG)) { \ - switch (SIG) { \ - case SIGINT: \ - case SIGQUIT: \ - case SIGHUP: \ - case SIGTERM: \ - YOINK(_init_onntconsoleevent); \ - break; \ - case SIGTRAP: \ - case SIGILL: \ - case SIGSEGV: \ - case SIGABRT: \ - case SIGFPE: \ - YOINK(_init_wincrash); \ - break; \ - case SIGWINCH: \ - YOINK(_check_sigwinch); \ - break; \ - default: \ - break; \ - } \ - } else { \ - YOINK(_init_onntconsoleevent); \ - YOINK(_init_wincrash); \ - YOINK(_check_sigwinch); \ - } \ - } \ - } while (0) -#endif - -#define sigaction(SIG, ACT, OLD) \ - ({ \ - __SIGACTION_YOINK(SIG); \ - sigaction(SIG, (ACT), OLD); \ - }) - -#define signal(SIG, HAND) \ - ({ \ - __SIGACTION_YOINK(SIG); \ - signal(SIG, HAND); \ - }) - -#endif /* GNU && !ANSI */ - COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_CALLS_STRUCT_SIGACTION_H_ */ diff --git a/libc/calls/struct/sigaction.internal.h b/libc/calls/struct/sigaction.internal.h index fbb10c14e..509769d8f 100644 --- a/libc/calls/struct/sigaction.internal.h +++ b/libc/calls/struct/sigaction.internal.h @@ -63,6 +63,10 @@ void __sigenter_openbsd(int, struct siginfo *, void *) _Hide; const char *DescribeSigaction(char[256], int, const struct sigaction *); #define DescribeSigaction(rc, sa) DescribeSigaction(alloca(256), rc, sa) +void _init_onntconsoleevent(void); +void _init_wincrash(void); +void _check_sigwinch(); + COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_CALLS_STRUCT_SIGACTION_INTERNAL_H_ */ diff --git a/libc/calls/tcsetattr-nt.c b/libc/calls/tcsetattr-nt.c index d52c24949..a1bd813d7 100644 --- a/libc/calls/tcsetattr-nt.c +++ b/libc/calls/tcsetattr-nt.c @@ -61,6 +61,7 @@ textwindows int tcsetattr_nt(int ignored, int opt, const struct termios *tio) { inmode |= kNtEnableVirtualTerminalInput; } ok = SetConsoleMode(in, inmode); + (void)ok; NTTRACE("SetConsoleMode(%p, %s) → %hhhd", in, DescribeNtConsoleInFlags(inmode), ok); } @@ -75,6 +76,7 @@ textwindows int tcsetattr_nt(int ignored, int opt, const struct termios *tio) { outmode |= kNtEnableVirtualTerminalProcessing; } ok = SetConsoleMode(out, outmode); + (void)ok; NTTRACE("SetConsoleMode(%p, %s) → %hhhd", out, DescribeNtConsoleOutFlags(outmode), ok); } diff --git a/libc/dns/resolvedns.c b/libc/dns/resolvedns.c index 66ecf6159..9c5c10181 100644 --- a/libc/dns/resolvedns.c +++ b/libc/dns/resolvedns.c @@ -52,7 +52,6 @@ */ int ResolveDns(const struct ResolvConf *resolvconf, int af, const char *name, struct sockaddr *addr, uint32_t addrsize) { - int32_t ttl; int rc, fd, n; struct DnsQuestion q; struct DnsHeader h, h2; @@ -94,7 +93,7 @@ int ResolveDns(const struct ResolvConf *resolvconf, int af, const char *name, if (p + 10 <= pe) { rtype = READ16BE(p); rclass = READ16BE(p + 2); - ttl = READ32BE(p + 4); + // ttl = READ32BE(p + 4); rdlength = READ16BE(p + 8); if (p + 10 + rdlength <= pe && rdlength == 4 && rclass == DNS_CLASS_IN && rtype == DNS_TYPE_A) { diff --git a/libc/integral/c.inc b/libc/integral/c.inc index 1901a009d..7be14c688 100644 --- a/libc/integral/c.inc +++ b/libc/integral/c.inc @@ -89,8 +89,10 @@ #endif #ifndef __cplusplus +#if defined(__GNUC__) && !defined(__llvm__) #pragma GCC push_options #pragma GCC diagnostic ignored "-Wc++-compat" +#endif #define HAVE_STDBOOL_H 1 #if __STDC_VERSION__ + 0 >= 201112 typedef _Bool bool; @@ -102,7 +104,9 @@ typedef _Bool bool; typedef __WCHAR_TYPE__ wchar_t; typedef __CHAR16_TYPE__ char16_t; typedef __CHAR32_TYPE__ char32_t; +#if defined(__GNUC__) && !defined(__llvm__) #pragma GCC pop_options +#endif #endif /* __cplusplus */ #define _LIBCPP_STDINT_H diff --git a/libc/x/xreadlink.c b/libc/intrin/getcpuidbrand.S similarity index 78% rename from libc/x/xreadlink.c rename to libc/intrin/getcpuidbrand.S index e63cd0c63..153ea7f22 100644 --- a/libc/x/xreadlink.c +++ b/libc/intrin/getcpuidbrand.S @@ -1,7 +1,7 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ +│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ ╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ Copyright 2023 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,15 +16,18 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/sysv/consts/at.h" -#include "libc/x/x.h" +#include "libc/macros.internal.h" -/** - * Reads symbolic link. - * - * @return nul-terminated string, or null w/ errno - * @see readlink() - */ -char *xreadlink(const char *path) { - return xreadlinkat(AT_FDCWD, path); -} +GetCpuidBrand: + mov %esi,%eax + xor %ecx,%ecx + push %rbx + cpuid + mov %ebx,0(%rdi) + mov %ecx,4(%rdi) + mov %edx,8(%rdi) + movb $0,12(%rdi) + pop %rbx + movb $0,12(%rdi) + ret + .endfn GetCpuidBrand,globl diff --git a/libc/intrin/getcpuidbrand.c b/libc/intrin/getcpuidbrand.c deleted file mode 100644 index d2e2ccc16..000000000 --- a/libc/intrin/getcpuidbrand.c +++ /dev/null @@ -1,37 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2023 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or 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. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/runtime/runtime.h" -#ifdef __x86_64__ - -void GetCpuidBrand(char s[13], uint32_t leaf) { - int ax, cx; - asm("push\t%%rbx\r\n" - "cpuid\r\n" - "mov\t%%ebx,0+%2\r\n" - "mov\t%%ecx,4+%2\r\n" - "mov\t%%edx,8+%2\r\n" - "movb\t$0,12+%2\r\n" - "pop\t%%rbx" - : "=a"(ax), "=c"(cx), "=o"(*(char(*)[13])s) - : "0"(leaf), "1"(0) - : "rdx"); - s[12] = 0; -} - -#endif /* __x86_64__ */ diff --git a/libc/intrin/memset.c b/libc/intrin/memset.c index c83141edd..f34aec2da 100644 --- a/libc/intrin/memset.c +++ b/libc/intrin/memset.c @@ -160,7 +160,7 @@ void *memset(void *p, int c, size_t n) { return b; #ifdef __x86__ } else if (IsTiny()) { - asm("rep stosb" : "+D"(b), "+c"(n), "=m"(*(char(*)[n])b) : "0"(p), "a"(c)); + asm("rep stosb" : "+D"(b), "+c"(n), "=m"(*(char(*)[n])b) : "a"(c)); return p; } else if (X86_HAVE(AVX)) { return memset_avx(b, c, n); diff --git a/libc/runtime/stackchkfail.c b/libc/intrin/stackchkfail.c similarity index 95% rename from libc/runtime/stackchkfail.c rename to libc/intrin/stackchkfail.c index 75a9fad59..5d485fd49 100644 --- a/libc/runtime/stackchkfail.c +++ b/libc/intrin/stackchkfail.c @@ -16,11 +16,11 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/calls/calls.h" +#include "libc/intrin/kprintf.h" #include "libc/runtime/internal.h" #include "libc/runtime/runtime.h" __attribute__((__weak__)) void __stack_chk_fail(void) { - tinyprint(2, program_invocation_name, ": stack smashed\n", NULL); + kprintf("%s: stack smashed\n", program_invocation_name); __builtin_trap(); } diff --git a/libc/runtime/stackchkfaillocal.c b/libc/intrin/stackchkfaillocal.c similarity index 100% rename from libc/runtime/stackchkfaillocal.c rename to libc/intrin/stackchkfaillocal.c diff --git a/third_party/compiler_rt/udivti3.c b/libc/intrin/udivti3.c similarity index 100% rename from third_party/compiler_rt/udivti3.c rename to libc/intrin/udivti3.c diff --git a/libc/isystem/signal.h b/libc/isystem/signal.h index 0342af9c6..db7928914 100644 --- a/libc/isystem/signal.h +++ b/libc/isystem/signal.h @@ -6,5 +6,6 @@ #include "libc/calls/struct/siginfo.h" #include "libc/sysv/consts/sa.h" #include "libc/sysv/consts/sicode.h" +#include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/ss.h" #endif /* _SIGNAL_H */ diff --git a/libc/libc.mk b/libc/libc.mk index 1c6dbc7b8..ffa06e2a8 100644 --- a/libc/libc.mk +++ b/libc/libc.mk @@ -5,9 +5,14 @@ PKGS += LIBC LIBC_HDRS = $(filter %.h,$(LIBC_FILES)) LIBC_INCS = $(filter %.inc,$(LIBC_FILES)) -LIBC_FILES := $(wildcard libc/*) $(wildcard libc/isystem/*) LIBC_CHECKS = $(LIBC_HDRS:%=o/$(MODE)/%.ok) +ifneq ($(MODE), llvm) +LIBC_FILES := $(wildcard libc/*) $(wildcard libc/isystem/*) +else +LIBC_FILES := $(wildcard libc/*) +endif + .PHONY: o/$(MODE)/libc o/$(MODE)/libc: o/$(MODE)/libc/calls \ o/$(MODE)/libc/crt \ diff --git a/libc/log/checkfail.c b/libc/log/checkfail.c index 0a5b837f6..c2d04900b 100644 --- a/libc/log/checkfail.c +++ b/libc/log/checkfail.c @@ -46,14 +46,12 @@ relegated void __check_fail(const char *suffix, // int line, // const char *fmt, // ...) { - int e; char *p; size_t i; va_list va; char hostname[32]; strace_enabled(-1); ftrace_enabled(-1); - e = errno; __start_fatal(file, line); __stpcpy(hostname, "unknown"); gethostname(hostname, sizeof(hostname)); diff --git a/libc/log/gdbexec.c b/libc/log/gdbexec.c index c0f2673db..a7d25dc19 100644 --- a/libc/log/gdbexec.c +++ b/libc/log/gdbexec.c @@ -31,7 +31,6 @@ relegated int(gdbexec)(const char *cmd) { struct StackFrame *bp; int pid, ttyin, ttyout; - intptr_t continuetoaddr; const char *se, *elf, *gdb; char pidstr[11], breakcmd[40]; if (!(gdb = GetGdbPath())) return -1; @@ -43,7 +42,6 @@ relegated int(gdbexec)(const char *cmd) { elf = "-q"; } bp = __builtin_frame_address(0); - continuetoaddr = bp->addr; sprintf(breakcmd, "%s *%#p", "break", bp->addr); if (!(pid = vfork())) { execv(gdb, (char *const[]){ diff --git a/libc/log/memlog.c b/libc/log/memlog.c index 0acd37eed..fc0de9cbe 100644 --- a/libc/log/memlog.c +++ b/libc/log/memlog.c @@ -17,6 +17,7 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/assert.h" +#include "libc/atomic.h" #include "libc/intrin/atomic.h" #include "libc/intrin/kprintf.h" #include "libc/log/backtrace.internal.h" @@ -67,7 +68,7 @@ static struct Memlog { long size; } * p; } allocs; - long usage; + atomic_long usage; } __memlog; static pthread_mutex_t __memlog_lock_obj; diff --git a/libc/log/oncrash_amd64.c b/libc/log/oncrash_amd64.c index bbea0034b..803f7f46c 100644 --- a/libc/log/oncrash_amd64.c +++ b/libc/log/oncrash_amd64.c @@ -23,6 +23,7 @@ #include "libc/calls/struct/sigaction.h" #include "libc/calls/struct/utsname.h" #include "libc/calls/syscall-sysv.internal.h" +#include "libc/calls/ucontext.h" #include "libc/dce.h" #include "libc/errno.h" #include "libc/fmt/itoa.h" @@ -44,6 +45,7 @@ #include "libc/runtime/runtime.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" +#include "libc/sysv/consts/sig.h" #include "libc/thread/thread.h" #include "libc/thread/tls.h" #ifdef __x86_64__ @@ -292,7 +294,9 @@ static wontreturn relegated dontinstrument void __minicrash(int sig, */ relegated void __oncrash_amd64(int sig, struct siginfo *si, void *arg) { int bZero; +#ifdef ATTACH_GDB_ON_CRASH intptr_t rip; +#endif int me, owner; int gdbpid, err; ucontext_t *ctx = arg; @@ -307,13 +311,15 @@ relegated void __oncrash_amd64(int sig, struct siginfo *si, void *arg) { if (atomic_compare_exchange_strong_explicit( &once, &owner, me, memory_order_relaxed, memory_order_relaxed)) { if (!__vforked) { +#ifdef ATTACH_GDB_ON_CRASH rip = ctx ? ctx->uc_mcontext.rip : 0; +#endif err = errno; if ((gdbpid = IsDebuggerPresent(true))) { DebugBreak(); } else if (__nocolor || g_isrunningundermake) { gdbpid = -1; -#if 0 +#if ATTACH_GDB_ON_CRASH } else if (!IsTiny() && IsLinux() && FindDebugBinary() && !__isworker) { // RestoreDefaultCrashSignalHandlers(); gdbpid = AttachDebugger( diff --git a/libc/runtime/clone.c b/libc/runtime/clone.c index 05663adc4..03e01040c 100644 --- a/libc/runtime/clone.c +++ b/libc/runtime/clone.c @@ -169,7 +169,7 @@ asm("XnuThreadThunk:\n\t" "push\t%rax\n\t" "jmp\tXnuThreadMain\n\t" ".size\tXnuThreadThunk,.-XnuThreadThunk"); -__attribute__((__used__, __no_reorder__)) +__attribute__((__used__)) static wontreturn void XnuThreadMain(void *pthread, // rdi diff --git a/libc/runtime/enable_tls.c b/libc/runtime/enable_tls.c index d54c6ba0c..fd6f91157 100644 --- a/libc/runtime/enable_tls.c +++ b/libc/runtime/enable_tls.c @@ -121,7 +121,7 @@ textstartup void __enable_tls(void) { #ifdef __x86_64__ - siz = ROUNDUP(I(_tls_size) + sizeof(*tib), _Alignof(__static_tls)); + siz = ROUNDUP(I(_tls_size) + sizeof(*tib), TLS_ALIGNMENT); if (siz <= sizeof(__static_tls)) { // if tls requirement is small then use the static tls block // which helps avoid a system call for appes with little tls diff --git a/libc/runtime/ftrace-hook.S b/libc/runtime/ftrace-hook.S index d572254e4..af12bcc67 100644 --- a/libc/runtime/ftrace-hook.S +++ b/libc/runtime/ftrace-hook.S @@ -26,7 +26,7 @@ ftrace_hook: // like __errno_location which can be called from an inline asm() // statement. It's nice to have the flexibility anyway. - cmp $0,__ftrace(%rip) + cmpl $0,__ftrace(%rip) jle 1f push %rbp mov %rsp,%rbp diff --git a/libc/runtime/inflate.c b/libc/runtime/inflate.c index 7f887fcee..591c09e5c 100644 --- a/libc/runtime/inflate.c +++ b/libc/runtime/inflate.c @@ -54,8 +54,6 @@ int __inflate(void *out, size_t outsize, const void *in, size_t insize) { rc = 0; } else if (rc == Z_OK) { rc = Z_STREAM_END; // coerce to nonzero - } else { - rc = rc; } } else { rc = _puff(out, &outsize, in, &insize); diff --git a/libc/runtime/memtracknt.c b/libc/runtime/memtracknt.c index 80c0d6175..75c5a6ff3 100644 --- a/libc/runtime/memtracknt.c +++ b/libc/runtime/memtracknt.c @@ -31,13 +31,9 @@ static inline noasan void *GetFrameAddr(int f) { } noasan void ReleaseMemoryNt(struct MemoryIntervals *mm, int l, int r) { - int i, ok; - size_t size; - char *addr, *last; + int i; for (i = l; i <= r; ++i) { - addr = GetFrameAddr(mm->p[i].x); - last = GetFrameAddr(mm->p[i].y); - UnmapViewOfFile(addr); + UnmapViewOfFile(GetFrameAddr(mm->p[i].x)); CloseHandle(mm->p[i].h); } } diff --git a/libc/runtime/runtime.mk b/libc/runtime/runtime.mk index 1de311028..78fcef9e2 100644 --- a/libc/runtime/runtime.mk +++ b/libc/runtime/runtime.mk @@ -128,7 +128,8 @@ o/$(MODE)/libc/runtime/enable_threads.o \ o/$(MODE)/libc/runtime/morph_tls.o: private \ CFLAGS += \ -ffreestanding \ - -fno-sanitize=all + -fno-sanitize=all \ + -fno-stack-protector # TODO(jart): We need a way to avoid WinThreadEntry() being hooked. o/$(MODE)/libc/runtime/clone.o: private \ diff --git a/libc/runtime/winmain.greg.c b/libc/runtime/winmain.greg.c index fd24f698d..3ac00dff6 100644 --- a/libc/runtime/winmain.greg.c +++ b/libc/runtime/winmain.greg.c @@ -154,6 +154,7 @@ __msabi static textwindows wontreturn void WinMainNew(const char16_t *cmdline) { : (DescribeNtConsoleInFlags)(inflagsbuf, kConsoleModes[i]), rc); } + (void)rc; } _Static_assert(sizeof(struct WinArgs) % FRAMESIZE == 0, ""); _mmi.p = _mmi.s; diff --git a/libc/sock/kntwsadata.c b/libc/sock/kntwsadata.c index 9674e75c1..048d896ec 100644 --- a/libc/sock/kntwsadata.c +++ b/libc/sock/kntwsadata.c @@ -38,6 +38,7 @@ _Hide struct NtWsaData kNtWsaData; static textwindows void WinSockCleanup(void) { int i, rc; + (void)rc; rc = WSACleanup(); NTTRACE("WSACleanup() → %d% lm", rc); } diff --git a/libc/stdio/fmt.c b/libc/stdio/fmt.c index 7b62d1d98..f55619772 100644 --- a/libc/stdio/fmt.c +++ b/libc/stdio/fmt.c @@ -67,9 +67,6 @@ #define PRINTF_NTOA_BUFFER_SIZE 144 -#define __FMT_CONSUMED_DOUBLE 1 -#define __FMT_CONSUMED_LONG_DOUBLE 2 - #define FLAGS_ZEROPAD 0x01 #define FLAGS_LEFT 0x02 #define FLAGS_PLUS 0x04 @@ -423,7 +420,7 @@ static int __fmt_stoa(int out(const char *, void *, size_t), void *arg, } else { emit = __fmt_stoa_wide; } - } else if ((flags & FLAGS_HASH) && kCp437) { + } else if (flags & FLAGS_HASH) { justdobytes = true; emit = __fmt_stoa_bing; ignorenul = flags & FLAGS_PRECISION; @@ -796,7 +793,7 @@ _Hide int __fmt(void *fn, void *arg, const char *format, va_list va) { int (*out)(const char *, void *, size_t); char *se, *s0, *s, *q, qchar, special[8]; int d, w, n, sign, prec, flags, width, lasterr; - int c, k, i1, ui, bw, rc, bex, sgn, prec1, decpt, consumed; + int c, k, i1, ui, bw, rc, bex, sgn, prec1, decpt; x = 0; lasterr = errno; @@ -1069,7 +1066,6 @@ _Hide int __fmt(void *fn, void *arg, const char *format, va_list va) { if (!(flags & FLAGS_PRECISION)) prec = 6; if (!longdouble) { x = va_arg(va, double); - consumed = __FMT_CONSUMED_DOUBLE; s = s0 = dtoa(x, 3, prec, &decpt, &fpb.sign, &se); if (decpt == 9999) { if (s && s[0] == 'N') { @@ -1080,7 +1076,6 @@ _Hide int __fmt(void *fn, void *arg, const char *format, va_list va) { } } else { un.ld = va_arg(va, long double); - consumed = __FMT_CONSUMED_LONG_DOUBLE; __fmt_ldfpbits(&un, &fpb); s = s0 = gdtoa(fpb.fpi, fpb.ex, fpb.bits, &fpb.kind, 3, prec, &decpt, &se); @@ -1102,7 +1097,7 @@ _Hide int __fmt(void *fn, void *arg, const char *format, va_list va) { prec = 0; rc = __fmt_stoa(out, arg, s, flags, prec, width, signbit, qchar); if (rc == -1) return -1; - return consumed; + break; } FormatReal: if (fpb.sign /* && (x || sign) */) sign = '-'; @@ -1166,7 +1161,6 @@ _Hide int __fmt(void *fn, void *arg, const char *format, va_list va) { if (prec < 1) prec = 1; if (!longdouble) { x = va_arg(va, double); - consumed = __FMT_CONSUMED_DOUBLE; s = s0 = dtoa(x, 2, prec, &decpt, &fpb.sign, &se); if (decpt == 9999) { if (s && s[0] == 'N') { @@ -1177,7 +1171,6 @@ _Hide int __fmt(void *fn, void *arg, const char *format, va_list va) { } } else { un.ld = va_arg(va, long double); - consumed = __FMT_CONSUMED_LONG_DOUBLE; __fmt_ldfpbits(&un, &fpb); s = s0 = gdtoa(fpb.fpi, fpb.ex, fpb.bits, &fpb.kind, prec ? 2 : 0, prec, &decpt, &se); @@ -1209,7 +1202,6 @@ _Hide int __fmt(void *fn, void *arg, const char *format, va_list va) { if (prec < 0) prec = 0; if (!longdouble) { x = va_arg(va, double); - consumed = __FMT_CONSUMED_DOUBLE; s = s0 = dtoa(x, 2, prec + 1, &decpt, &fpb.sign, &se); if (decpt == 9999) { if (s && s[0] == 'N') { @@ -1220,7 +1212,6 @@ _Hide int __fmt(void *fn, void *arg, const char *format, va_list va) { } } else { un.ld = va_arg(va, long double); - consumed = __FMT_CONSUMED_LONG_DOUBLE; __fmt_ldfpbits(&un, &fpb); s = s0 = gdtoa(fpb.fpi, fpb.ex, fpb.bits, &fpb.kind, prec ? 2 : 0, prec, &decpt, &se); @@ -1289,11 +1280,9 @@ _Hide int __fmt(void *fn, void *arg, const char *format, va_list va) { FormatBinary: if (longdouble) { un.ld = va_arg(va, long double); - consumed = __FMT_CONSUMED_LONG_DOUBLE; __fmt_ldfpbits(&un, &fpb); } else { un.d = va_arg(va, double); - consumed = __FMT_CONSUMED_DOUBLE; __fmt_dfpbits(&un, &fpb); } if (fpb.kind == STRTOG_Infinite || fpb.kind == STRTOG_NaN) { @@ -1320,7 +1309,7 @@ _Hide int __fmt(void *fn, void *arg, const char *format, va_list va) { if (sign) --width; if (prec1 || (flags & FLAGS_HASH)) --width; } - if ((width -= prec1) > 0 && !(flags & FLAGS_LEFT) && + if ((width -= MAX(prec, prec1)) > 0 && !(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { do __FMT_PUT(' '); while (--width > 0); diff --git a/libc/stdio/posix_spawn.internal.h b/libc/stdio/posix_spawn.internal.h index dc274275a..103823917 100644 --- a/libc/stdio/posix_spawn.internal.h +++ b/libc/stdio/posix_spawn.internal.h @@ -25,10 +25,8 @@ struct _posix_spawna { struct _posix_faction { struct _posix_faction *next; int action; - union { - int fildes; - int oflag; - }; + int fildes; + int oflag; union { int newfildes; unsigned mode; diff --git a/libc/stdio/posix_spawn_file_actions.c b/libc/stdio/posix_spawn_file_actions.c index 914a0a12c..2efe41dad 100644 --- a/libc/stdio/posix_spawn_file_actions.c +++ b/libc/stdio/posix_spawn_file_actions.c @@ -105,6 +105,7 @@ int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *file_actions, int posix_spawn_file_actions_addopen(posix_spawn_file_actions_t *file_actions, int fildes, const char *path, int oflag, unsigned mode) { + if (fildes < 0) return EBADF; if (!(path = strdup(path))) return ENOMEM; return AddFileAction(file_actions, (struct _posix_faction){ .action = _POSIX_SPAWN_OPEN, diff --git a/libc/str/getzipeocd.c b/libc/str/getzipeocd.c index 052c6f28f..a6ae6069b 100644 --- a/libc/str/getzipeocd.c +++ b/libc/str/getzipeocd.c @@ -47,7 +47,8 @@ void *GetZipEocd(const void *f, size_t n, int *e) { i = n - 4; err = kZipErrorEocdNotFound; do { -#ifdef __x86_64__ +#if defined(__x86_64__) && defined(__GNUC__) && !defined(__llvm__) && \ + !defined(__chibicc__) v8hi pk = {READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK")}; asm("" : "+x"(pk)); diff --git a/libc/sysv/errno_location.greg.c b/libc/sysv/errno_location.greg.c index e0dc52218..93246f2e5 100644 --- a/libc/sysv/errno_location.greg.c +++ b/libc/sysv/errno_location.greg.c @@ -16,9 +16,10 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/errno.h" #include "libc/thread/tls2.h" +extern errno_t __errno; + /** * Returns address of errno variable. */ diff --git a/libc/sysv/systemfive.S b/libc/sysv/systemfive.S index dad20dd1f..69bfa487e 100644 --- a/libc/sysv/systemfive.S +++ b/libc/sysv/systemfive.S @@ -121,7 +121,7 @@ systemfive_cancellable: // our pthread_cancel() miracle code testb $PT_INCANCEL,0x00(%r10) jz 5f #endif - cmp $0,0x04(%r10) // PosixThread::cancelled + cmpl $0,0x04(%r10) // PosixThread::cancelled jne systemfive_cancel // we will tail call below 1: mov %rcx,%r10 // move the fourth argument clc // no cancellable system calls exist @@ -144,7 +144,7 @@ systemfive_cancellable_end: // i/o calls park here for long time jz systemfive_errno // it's spawn() probably testb $PT_NOCANCEL,0x00(%rcx) // PosixThread::flags jnz systemfive_errno // cancellation is disabled - cmp $0,0x04(%rcx) // PosixThread::cancelled + cmpl $0,0x04(%rcx) // PosixThread::cancelled je systemfive_errno // we aren't actually cancelled jmp 4f // now we are in fact cancelled systemfive_cancel: // SIGTHR will jump here too diff --git a/libc/testlib/ezbench.h b/libc/testlib/ezbench.h index 9b444a752..1e60fdb1d 100644 --- a/libc/testlib/ezbench.h +++ b/libc/testlib/ezbench.h @@ -46,7 +46,6 @@ COSMOPOLITAN_C_START_ EXPR; \ MemoryStrict = BENCHLOOP(__startbench_m, __endbench_m, 32, ({ \ INIT; \ - thrashcodecache(); \ __polluteregisters(); \ }), \ (EXPR)); \ @@ -88,7 +87,6 @@ COSMOPOLITAN_C_START_ EXPR; \ MemoryStrict = BENCHLOOP(__startbench_m, __endbench_m, NUM, ({ \ INIT; \ - thrashcodecache(); \ __polluteregisters(); \ }), \ (EXPR)); \ @@ -101,53 +99,47 @@ COSMOPOLITAN_C_START_ MAX(.001, MemoryStrict - __testlib_ezbenchcontrol())); \ } while (0) -#define EZBENCH_C(NAME, CONTROL, EXPR) \ - do { \ - int Core, Tries, Interrupts; \ - double Control, Speculative, MemoryStrict; \ - Tries = 0; \ - do { \ - __testlib_yield(); \ - Core = __testlib_getcore(); \ - Interrupts = __testlib_getinterrupts(); \ - Control = BENCHLOOP(__startbench_m, __endbench_m, EZBENCH_COUNT, ({ \ - thrashcodecache(); \ - __polluteregisters(); \ - }), \ - (CONTROL)); \ - } while (++Tries < EZBENCH_TRIES && \ - (__testlib_getcore() != Core && \ - __testlib_getinterrupts() > Interrupts)); \ - if (Tries == EZBENCH_TRIES) __testlib_ezbenchwarn(" control"); \ - Tries = 0; \ - do { \ - __testlib_yield(); \ - Core = __testlib_getcore(); \ - Interrupts = __testlib_getinterrupts(); \ - EXPR; \ - Speculative = BENCHLOOP(__startbench, __endbench, EZBENCH_COUNT, \ - __polluteregisters(), (EXPR)); \ - } while (++Tries < EZBENCH_TRIES && \ - (__testlib_getcore() != Core && \ - __testlib_getinterrupts() > Interrupts)); \ - if (Tries == EZBENCH_TRIES) __testlib_ezbenchwarn(" speculative"); \ - Tries = 0; \ - do { \ - __testlib_yield(); \ - Core = __testlib_getcore(); \ - Interrupts = __testlib_getinterrupts(); \ - EXPR; \ - MemoryStrict = BENCHLOOP(__startbench_m, __endbench_m, 8, ({ \ - thrashcodecache(); \ - __polluteregisters(); \ - }), \ - (EXPR)); \ - } while (++Tries < EZBENCH_TRIES && \ - (__testlib_getcore() != Core && \ - __testlib_getinterrupts() > Interrupts)); \ - if (Tries == EZBENCH_TRIES) __testlib_ezbenchwarn(" memory strict"); \ - __testlib_ezbenchreport(NAME, MAX(.001, Speculative - Control), \ - MAX(.001, MemoryStrict - Control)); \ +#define EZBENCH_C(NAME, CONTROL, EXPR) \ + do { \ + int Core, Tries, Interrupts; \ + double Control, Speculative, MemoryStrict; \ + Tries = 0; \ + do { \ + __testlib_yield(); \ + Core = __testlib_getcore(); \ + Interrupts = __testlib_getinterrupts(); \ + Control = BENCHLOOP(__startbench_m, __endbench_m, EZBENCH_COUNT, \ + ({ __polluteregisters(); }), (CONTROL)); \ + } while (++Tries < EZBENCH_TRIES && \ + (__testlib_getcore() != Core && \ + __testlib_getinterrupts() > Interrupts)); \ + if (Tries == EZBENCH_TRIES) __testlib_ezbenchwarn(" control"); \ + Tries = 0; \ + do { \ + __testlib_yield(); \ + Core = __testlib_getcore(); \ + Interrupts = __testlib_getinterrupts(); \ + EXPR; \ + Speculative = BENCHLOOP(__startbench, __endbench, EZBENCH_COUNT, \ + __polluteregisters(), (EXPR)); \ + } while (++Tries < EZBENCH_TRIES && \ + (__testlib_getcore() != Core && \ + __testlib_getinterrupts() > Interrupts)); \ + if (Tries == EZBENCH_TRIES) __testlib_ezbenchwarn(" speculative"); \ + Tries = 0; \ + do { \ + __testlib_yield(); \ + Core = __testlib_getcore(); \ + Interrupts = __testlib_getinterrupts(); \ + EXPR; \ + MemoryStrict = BENCHLOOP(__startbench_m, __endbench_m, 8, \ + ({ __polluteregisters(); }), (EXPR)); \ + } while (++Tries < EZBENCH_TRIES && \ + (__testlib_getcore() != Core && \ + __testlib_getinterrupts() > Interrupts)); \ + if (Tries == EZBENCH_TRIES) __testlib_ezbenchwarn(" memory strict"); \ + __testlib_ezbenchreport(NAME, MAX(.001, Speculative - Control), \ + MAX(.001, MemoryStrict - Control)); \ } while (0) #define EZBENCH_N(NAME, N, EXPR) \ diff --git a/libc/testlib/memoryexists.c b/libc/testlib/memoryexists.c index a5c87833e..0db928464 100644 --- a/libc/testlib/memoryexists.c +++ b/libc/testlib/memoryexists.c @@ -63,6 +63,7 @@ noasan bool testlib_memoryexists(const void *p) { _npassert(!sigaction(SIGSEGV, &sa, old + 0)); _npassert(!sigaction(SIGBUS, &sa, old + 1)); c = atomic_load(mem); + (void)c; _npassert(!sigaction(SIGBUS, old + 1, 0)); _npassert(!sigaction(SIGSEGV, old + 0, 0)); return !gotsignal; diff --git a/libc/testlib/testlib.h b/libc/testlib/testlib.h index c474340da..371383704 100644 --- a/libc/testlib/testlib.h +++ b/libc/testlib/testlib.h @@ -382,8 +382,6 @@ void testlib_error_enter(const char *, const char *); void testlib_showerror(const char *, int, const char *, const char *, const char *, const char *, char *, char *); -void thrashcodecache(void); - void testlib_finish(void); int testlib_geterrno(void); void testlib_seterrno(int); diff --git a/libc/testlib/testlib.mk b/libc/testlib/testlib.mk index 562e14f41..2c35faf6a 100644 --- a/libc/testlib/testlib.mk +++ b/libc/testlib/testlib.mk @@ -38,7 +38,6 @@ LIBC_TESTLIB_A_SRCS_S = \ libc/testlib/moby.S \ libc/testlib/polluteregisters.S \ libc/testlib/testcase.S \ - libc/testlib/thrashcodecache.S \ libc/testlib/viewables.S LIBC_TESTLIB_A_SRCS_C = \ @@ -147,8 +146,6 @@ o/$(MODE)/libc/testlib/polluteregisters.o: libc/testlib/polluteregisters.S @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< o/$(MODE)/libc/testlib/testcase.o: libc/testlib/testcase.S @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< -o/$(MODE)/libc/testlib/thrashcodecache.o: libc/testlib/thrashcodecache.S - @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< o/$(MODE)/libc/testlib/viewables.o: libc/testlib/viewables.S @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< diff --git a/libc/testlib/thrashcodecache.S b/libc/testlib/thrashcodecache.S deleted file mode 100644 index 5fa61cc6f..000000000 --- a/libc/testlib/thrashcodecache.S +++ /dev/null @@ -1,49 +0,0 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or 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. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" -.testonly - -// Empties L1 instruction cache. -thrashcodecache: -#ifdef __x86_64__ - .leafprologue - push %rbx - xor %eax,%eax - xor %ecx,%ecx - cpuid - add %r9,%r8 -// Generate 32kb of junk code clobbering r8,r9,r10,r11 - i = 0xdeadbeef -0: .rept 32768/(3+7) - rex.wrb - .byte 0001|(i&030) // ADD/OR/... Evqp Gvqp - .byte 0300|(i&033) // %r8-%r11 to %r8-%r11 - .byte 0x49,0x81,0360|(i&003) // XOR immed32,%r8-%r11 - .long i - i = ((i * 1103515245 + 12345) >> 16) & 0xffffffff - .endr - xor %eax,%eax - xor %ecx,%ecx - cpuid - pop %rbx - .leafepilogue -#else - ret -#endif - .endfn thrashcodecache,globl diff --git a/libc/thread/makecontext.c b/libc/thread/makecontext.c index ddb285df6..bd75b2418 100644 --- a/libc/thread/makecontext.c +++ b/libc/thread/makecontext.c @@ -101,7 +101,7 @@ void makecontext(ucontext_t *uc, void func(), int argc, ...) { sp += uc->uc_stack.ss_size; sp -= 16; // openbsd:stackbound sp -= sizeof(*call); - sp &= -alignof(*call); + sp &= -alignof(struct Gadget); call = (struct Gadget *)sp; // get arguments diff --git a/libc/thread/pthread_getaffinity_np.c b/libc/thread/pthread_getaffinity_np.c index 762907e66..1e5bda165 100644 --- a/libc/thread/pthread_getaffinity_np.c +++ b/libc/thread/pthread_getaffinity_np.c @@ -38,10 +38,9 @@ */ errno_t pthread_getaffinity_np(pthread_t thread, size_t size, cpu_set_t *bitset) { - int e, rc, tid; + int rc, tid; if (!(rc = pthread_getunique_np(thread, &tid))) { - e = errno; if (size != sizeof(cpu_set_t)) { rc = einval(); } else if (IsWindows() || IsMetal() || IsOpenbsd()) { diff --git a/libc/thread/sem_open.c b/libc/thread/sem_open.c index 1f90d4af2..efd32c5f0 100644 --- a/libc/thread/sem_open.c +++ b/libc/thread/sem_open.c @@ -253,7 +253,7 @@ sem_t *sem_open(const char *name, int oflag, ...) { * @return 0 on success, or -1 w/ errno */ int sem_close(sem_t *sem) { - int rc, prefs; + int prefs; bool unmap, delete; struct Semaphore *s, **p; _npassert(sem->sem_magic == SEM_MAGIC_NAMED); @@ -275,7 +275,7 @@ int sem_close(sem_t *sem) { _npassert(!munmap(sem, PAGESIZE)); } if (delete) { - rc = unlink(s->path); + unlink(s->path); } if (unmap) { free(s->path); diff --git a/libc/thread/spawn.c b/libc/thread/spawn.c index 97d463065..dc813776d 100644 --- a/libc/thread/spawn.c +++ b/libc/thread/spawn.c @@ -69,7 +69,7 @@ static int Spawner(void *arg, int tid) { rc = spawner->fun(spawner->arg, tid); _pthread_ungarbage(); free(spawner); - return 0; + return rc; } /** diff --git a/libc/tinymath/ceil.c b/libc/tinymath/ceil.c index d2cd35611..66dee5e66 100644 --- a/libc/tinymath/ceil.c +++ b/libc/tinymath/ceil.c @@ -28,7 +28,9 @@ #include "libc/math.h" #include "libc/runtime/fenv.h" #include "libc/tinymath/internal.h" +#ifndef __llvm__ #include "third_party/intel/smmintrin.internal.h" +#endif asm(".ident\t\"\\n\\n\ Musl libc (MIT License)\\n\ @@ -63,7 +65,7 @@ double ceil(double x) asm("fidbra\t%0,6,%1,4" : "=f"(x) : "f"(x)); return x; -#elif defined(__x86_64__) && defined(__SSE4_1__) +#elif defined(__x86_64__) && defined(__SSE4_1__) && !defined(__llvm__) && !defined(__chibicc__) asm("roundsd\t%2,%1,%0" : "=x"(x) diff --git a/libc/tinymath/ceilf.c b/libc/tinymath/ceilf.c index d8ae80b52..470bdca8e 100644 --- a/libc/tinymath/ceilf.c +++ b/libc/tinymath/ceilf.c @@ -27,7 +27,9 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/math.h" #include "libc/tinymath/internal.h" +#ifndef __llvm__ #include "third_party/intel/smmintrin.internal.h" +#endif asm(".ident\t\"\\n\\n\ Musl libc (MIT License)\\n\ @@ -55,7 +57,7 @@ float ceilf(float x) asm("fiebra\t%0,6,%1,4" : "=f"(x) : "f"(x)); return x; -#elif defined(__x86_64__) && defined(__SSE4_1__) +#elif defined(__x86_64__) && defined(__SSE4_1__) && !defined(__llvm__) && !defined(__chibicc__) asm("roundss\t%2,%1,%0" : "=x"(x) diff --git a/libc/tinymath/floor.c b/libc/tinymath/floor.c index ff1e1050c..48768bb92 100644 --- a/libc/tinymath/floor.c +++ b/libc/tinymath/floor.c @@ -28,7 +28,9 @@ #include "libc/math.h" #include "libc/runtime/fenv.h" #include "libc/tinymath/internal.h" +#ifndef __llvm__ #include "third_party/intel/smmintrin.internal.h" +#endif asm(".ident\t\"\\n\\n\ Musl libc (MIT License)\\n\ @@ -63,7 +65,7 @@ double floor(double x) asm("fidbra\t%0,7,%1,4" : "=f"(x) : "f"(x)); return x; -#elif defined(__x86_64__) && defined(__SSE4_1__) +#elif defined(__x86_64__) && defined(__SSE4_1__) && !defined(__llvm__) && !defined(__chibicc__) asm("roundsd\t%2,%1,%0" : "=x"(x) diff --git a/libc/tinymath/floorf.c b/libc/tinymath/floorf.c index 0d470bed9..892354dbe 100644 --- a/libc/tinymath/floorf.c +++ b/libc/tinymath/floorf.c @@ -27,7 +27,9 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/math.h" #include "libc/tinymath/internal.h" +#ifndef __llvm__ #include "third_party/intel/smmintrin.internal.h" +#endif asm(".ident\t\"\\n\\n\ Musl libc (MIT License)\\n\ @@ -55,7 +57,7 @@ float floorf(float x) asm("fiebra\t%0,7,%1,4" : "=f"(x) : "f"(x)); return x; -#elif defined(__x86_64__) && defined(__SSE4_1__) +#elif defined(__x86_64__) && defined(__SSE4_1__) && !defined(__llvm__) && !defined(__chibicc__) asm("roundss\t%2,%1,%0" : "=x"(x) diff --git a/libc/tinymath/internal.h b/libc/tinymath/internal.h index 0506c7a52..47a4b3bf8 100644 --- a/libc/tinymath/internal.h +++ b/libc/tinymath/internal.h @@ -29,16 +29,19 @@ static inline double eval_as_double(double x) { static inline void fp_force_evall(long double x) { volatile long double y; y = x; + (void)y; } static inline void fp_force_evalf(float x) { volatile float y; y = x; + (void)y; } static inline void fp_force_eval(double x) { volatile double y; y = x; + (void)y; } static inline double fp_barrier(double x) { diff --git a/libc/tinymath/trunc.c b/libc/tinymath/trunc.c index dcc7ac665..6103ddbea 100644 --- a/libc/tinymath/trunc.c +++ b/libc/tinymath/trunc.c @@ -27,7 +27,9 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/math.h" #include "libc/tinymath/internal.h" +#ifndef __llvm__ #include "third_party/intel/smmintrin.internal.h" +#endif asm(".ident\t\"\\n\\n\ Musl libc (MIT License)\\n\ @@ -55,7 +57,7 @@ double trunc(double x) asm("fidbra\t%0,5,%1,4" : "=f"(x) : "f"(x)); return x; -#elif defined(__x86_64__) && defined(__SSE4_1__) +#elif defined(__x86_64__) && defined(__SSE4_1__) && !defined(__llvm__) && !defined(__chibicc__) asm("roundsd\t%2,%1,%0" : "=x"(x) diff --git a/libc/tinymath/truncf.c b/libc/tinymath/truncf.c index 1568798dd..b66f8f3e5 100644 --- a/libc/tinymath/truncf.c +++ b/libc/tinymath/truncf.c @@ -27,7 +27,9 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/math.h" #include "libc/tinymath/internal.h" +#ifndef __llvm__ #include "third_party/intel/smmintrin.internal.h" +#endif asm(".ident\t\"\\n\\n\ Musl libc (MIT License)\\n\ @@ -55,7 +57,7 @@ float truncf(float x) asm("fiebra\t%0,5,%1,4" : "=f"(x) : "f"(x)); return x; -#elif defined(__x86_64__) && defined(__SSE4_1__) +#elif defined(__x86_64__) && defined(__SSE4_1__) && !defined(__llvm__) && !defined(__chibicc__) asm("roundss\t%2,%1,%0" : "=x"(x) diff --git a/libc/vga/rlinit-vesa.S b/libc/vga/rlinit-vesa.S index fbaf33860..8fe3a14de 100644 --- a/libc/vga/rlinit-vesa.S +++ b/libc/vga/rlinit-vesa.S @@ -435,7 +435,7 @@ _rlinit_vesa: mov $PC_VIDEO_TEXT,%al # if text mode, simply say so test $0b00010000,%cl jz .ok4 - cmp $6,%es:0x1b(%di) # if graphics mode, check if direct + cmpl $6,%es:0x1b(%di) # if graphics mode, check if direct jnz .fail4 # color; bail out if not mov %es:0x19(%di),%cl # check actual color fields & bits mov %es:0x1f(%di),%ax # per pixel, against a list diff --git a/libc/vga/tty-klog.greg.c b/libc/vga/tty-klog.greg.c index 01c60e156..5eafd84b1 100644 --- a/libc/vga/tty-klog.greg.c +++ b/libc/vga/tty-klog.greg.c @@ -39,7 +39,9 @@ * @see libc/vga/tty-graph.inc */ +#ifndef __llvm__ #pragma GCC optimize("s") +#endif #define KLOGTTY #define MAYUNROLLLOOPS /* do not unroll loops; keep the code small! */ diff --git a/libc/x/utf8to16.c b/libc/x/utf8to16.c index 98ab7fa98..81bf1809f 100644 --- a/libc/x/utf8to16.c +++ b/libc/x/utf8to16.c @@ -38,7 +38,8 @@ char16_t *utf8to16(const char *p, size_t n, size_t *z) { if (n == -1) n = p ? strlen(p) : 0; if ((q = r = malloc((n + 16) * sizeof(char16_t) * 2 + sizeof(char16_t)))) { for (i = 0; i < n;) { -#if defined(__SSE2__) && defined(__GNUC__) && !defined(__STRICT_ANSI__) +#if defined(__SSE2__) && defined(__GNUC__) && !defined(__STRICT_ANSI__) && \ + !defined(__llvm__) && !defined(__chibicc__) if (i + 16 < n) { typedef char xmm_t __attribute__((__vector_size__(16), __aligned__(1))); xmm_t vi, vz = {0}; diff --git a/libc/x/x.h b/libc/x/x.h index 66dae189e..587f6c991 100644 --- a/libc/x/x.h +++ b/libc/x/x.h @@ -27,13 +27,10 @@ COSMOPOLITAN_C_START_ #define xstripext __xstripext #define xstripexts __xstripexts #define xload __xload -#define xloadzd __xloadzd #define rmrf __rmrf #define xbasename __xbasename #define xdirname __xdirname #define xjoinpaths __xjoinpaths -#define xreadlink __xreadlink -#define xreadlinkat __xreadlinkat #define xfixpath __xfixpath #define xslurp __xslurp #define xbarf __xbarf @@ -84,8 +81,6 @@ char *xhomedir(void) dontdiscard; char *xstripext(const char *) dontdiscard; char *xstripexts(const char *) dontdiscard; void *xload(_Atomic(void *) *, const void *, size_t, size_t); -void *xloadzd(_Atomic(void *) *, const void *, size_t, size_t, size_t, size_t, - uint32_t); int rmrf(const char *); char *xbasename(const char *) paramsnonnull() returnspointerwithnoaliases dontthrow nocallback dontdiscard returnsnonnull; @@ -93,10 +88,6 @@ char *xdirname(const char *) paramsnonnull() returnspointerwithnoaliases dontthrow nocallback dontdiscard returnsnonnull; char *xjoinpaths(const char *, const char *) paramsnonnull() returnspointerwithnoaliases dontthrow nocallback dontdiscard returnsnonnull; -char *xreadlink(const char *) paramsnonnull() - returnspointerwithnoaliases dontthrow nocallback dontdiscard returnsnonnull; -char *xreadlinkat(int, const char *) paramsnonnull() - returnspointerwithnoaliases dontthrow nocallback dontdiscard returnsnonnull; void xfixpath(void); void *xslurp(const char *, size_t *) paramsnonnull((1)) returnspointerwithnoaliases diff --git a/libc/x/x.mk b/libc/x/x.mk index e1e814269..22f61df36 100644 --- a/libc/x/x.mk +++ b/libc/x/x.mk @@ -35,8 +35,7 @@ LIBC_X_A_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ THIRD_PARTY_GDTOA \ - THIRD_PARTY_MUSL \ - THIRD_PARTY_ZLIB + THIRD_PARTY_MUSL LIBC_X_A_DEPS := \ $(call uniq,$(foreach x,$(LIBC_X_A_DIRECTDEPS),$($(x)))) diff --git a/libc/x/xreadlinkat.c b/libc/x/xreadlinkat.c deleted file mode 100644 index e4005602e..000000000 --- a/libc/x/xreadlinkat.c +++ /dev/null @@ -1,47 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2021 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or 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. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/calls/calls.h" -#include "libc/mem/mem.h" -#include "libc/sysv/errfuns.h" -#include "libc/x/x.h" - -/** - * Reads symbolic link. - * - * @return nul-terminated string, or null w/ errno - * @see readlinkat() - */ -char *xreadlinkat(int dirfd, const char *path) { - ssize_t rc; - size_t n, c; - char *p, *q; - c = PAGESIZE; - p = xmalloc(c); - if ((rc = readlinkat(dirfd, path, p, c)) != -1) { - if ((n = rc) < c) { - p[n] = 0; - if ((q = realloc(p, n + 1))) p = q; - return p; - } else { - enametoolong(); - } - } - free(p); - return 0; -} diff --git a/libc/x/xsigaction.c b/libc/x/xsigaction.c index dfd4a3596..7a424492f 100644 --- a/libc/x/xsigaction.c +++ b/libc/x/xsigaction.c @@ -39,8 +39,8 @@ * @asyncsignalsafe * @vforksafe */ -int(xsigaction)(int sig, void *handler, uint64_t flags, uint64_t mask, - struct sigaction *old) { +int xsigaction(int sig, void *handler, uint64_t flags, uint64_t mask, + struct sigaction *old) { /* This API is superior to sigaction() because (1) it offers feature parity; (2) compiler emits 1/3rd as much binary code at call-site; and (3) it removes typing that just whines without added safety. */ diff --git a/libc/x/xsigaction.h b/libc/x/xsigaction.h index 806b99313..9b428bd38 100644 --- a/libc/x/xsigaction.h +++ b/libc/x/xsigaction.h @@ -6,14 +6,6 @@ COSMOPOLITAN_C_START_ int xsigaction(int, void *, uint64_t, uint64_t, struct sigaction *); -#if defined(__GNUC__) && !defined(__STRICT_ANSI__) -#define xsigaction(SIG, HANDLER, FLAGS, MASK, OLD) \ - ({ \ - __SIGACTION_YOINK(SIG); \ - xsigaction(SIG, HANDLER, FLAGS, MASK, OLD); \ - }) -#endif - COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_X_XSIGACTION_H_ */ diff --git a/test/libc/calls/signal_test.c b/test/libc/calls/signal_test.c index baeabc184..9b011849a 100644 --- a/test/libc/calls/signal_test.c +++ b/test/libc/calls/signal_test.c @@ -18,6 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" #include "libc/calls/struct/sigaction.h" +#include "libc/calls/ucontext.h" #include "libc/dce.h" #include "libc/log/check.h" #include "libc/log/log.h" diff --git a/test/libc/calls/tkill_test.c b/test/libc/calls/tkill_test.c index b7f0be24d..58cd62781 100644 --- a/test/libc/calls/tkill_test.c +++ b/test/libc/calls/tkill_test.c @@ -19,6 +19,7 @@ #include "libc/calls/calls.h" #include "libc/calls/struct/sigaction.h" #include "libc/calls/struct/sigset.h" +#include "libc/dce.h" #include "libc/errno.h" #include "libc/sysv/consts/sig.h" #include "libc/testlib/testlib.h" diff --git a/test/libc/mem/qsort_test.c b/test/libc/mem/qsort_test.c index 6b451c639..24fc96e06 100644 --- a/test/libc/mem/qsort_test.c +++ b/test/libc/mem/qsort_test.c @@ -20,6 +20,7 @@ #include "libc/macros.internal.h" #include "libc/mem/alg.h" #include "libc/mem/gc.h" +#include "libc/mem/gc.internal.h" #include "libc/mem/mem.h" #include "libc/runtime/runtime.h" #include "libc/stdio/rand.h" @@ -28,6 +29,47 @@ #include "libc/testlib/ezbench.h" #include "libc/testlib/testlib.h" +int CompareLow(const void *a, const void *b) { + const int *x = a; + const int *y = b; + if ((char)*x < (char)*y) return -1; + if ((char)*x > (char)*y) return +1; + return 0; +} + +void InsertionSortLow(int *A, int n) { + int i, j, t; + for (i = 1; i < n; i++) { + t = A[i]; + j = i - 1; + while (j >= 0 && (char)A[j] > (char)t) { + A[j + 1] = A[j]; + j = j - 1; + } + A[j + 1] = t; + } +} + +bool IsStableSort(void sort(void *, size_t, size_t, + int (*)(const void *, const void *))) { + int n = 256; + int *A = gc(malloc(n * sizeof(int))); + int *B = gc(malloc(n * sizeof(int))); + rngset(A, n * sizeof(int), 0, 0); + memcpy(B, A, n * sizeof(int)); + InsertionSortLow(A, n); + sort(B, n, sizeof(int), CompareLow); + return !memcmp(A, B, n * sizeof(int)); +} + +TEST(sort, stability) { + ASSERT_FALSE(IsStableSort(qsort)); + ASSERT_FALSE(IsStableSort(smoothsort)); + ASSERT_FALSE(IsStableSort((void *)qsort_r)); + ASSERT_FALSE(IsStableSort((void *)heapsort)); + ASSERT_TRUE(IsStableSort((void *)mergesort)); +} + int CompareInt(const void *a, const void *b) { const int *x = a; const int *y = b; @@ -44,7 +86,7 @@ int CompareLong(const void *a, const void *b) { return 0; } -TEST(qsort, test) { +TEST(qsort, words) { const int32_t A[][2] = {{4, 'a'}, {65, 'b'}, {2, 'c'}, {-31, 'd'}, {0, 'e'}, {99, 'f'}, {2, 'g'}, {83, 'h'}, {782, 'i'}, {1, 'j'}}; @@ -58,12 +100,38 @@ TEST(qsort, test) { free(M); } +struct Record { + int x; + int y; + int z; + int a[2]; + int b; +}; + +int CompareRecord(const void *a, const void *b) { + const struct Record *x = a; + const struct Record *y = b; + if (x->z > y->z) return -1; + if (x->z < y->z) return +1; + return 0; +} + +TEST(qsort, records) { + int i, n = 256; + struct Record *A = gc(calloc(n, sizeof(struct Record))); + struct Record *B = gc(calloc(n, sizeof(struct Record))); + for (i = 0; i < n; ++i) A[i].z = B[i].z = lemur64(); + qsort(A, n, sizeof(struct Record), CompareRecord); + mergesort(B, n, sizeof(struct Record), CompareRecord); + ASSERT_EQ(0, memcmp(A, B, n * sizeof(struct Record))); +} + TEST(qsort, equivalence_random) { size_t i; size_t n = 1000; - long *a = _gc(malloc(n * sizeof(long))); - long *b = _gc(malloc(n * sizeof(long))); - long *c = _gc(malloc(n * sizeof(long))); + long *a = gc(malloc(n * sizeof(long))); + long *b = gc(malloc(n * sizeof(long))); + long *c = gc(malloc(n * sizeof(long))); for (i = 0; i < n; ++i) a[i] = lemur64(); memcpy(b, a, n * sizeof(long)); memcpy(c, a, n * sizeof(long)); @@ -84,9 +152,9 @@ TEST(qsort, equivalence_random) { TEST(qsort, equivalence_reverse) { size_t i; size_t n = 1000; - long *a = _gc(malloc(n * sizeof(long))); - long *b = _gc(malloc(n * sizeof(long))); - long *c = _gc(malloc(n * sizeof(long))); + long *a = gc(malloc(n * sizeof(long))); + long *b = gc(malloc(n * sizeof(long))); + long *c = gc(malloc(n * sizeof(long))); for (i = 0; i < n; ++i) a[n - i - 1] = i; memcpy(b, a, n * sizeof(long)); memcpy(c, a, n * sizeof(long)); @@ -107,13 +175,15 @@ TEST(qsort, equivalence_reverse) { BENCH(qsort, bench) { size_t i; size_t n = 1000; - long *p1 = _gc(malloc(n * sizeof(long))); - long *p2 = _gc(malloc(n * sizeof(long))); + long *p1 = gc(malloc(n * sizeof(long))); + long *p2 = gc(malloc(n * sizeof(long))); printf("\n"); for (i = 0; i < n; ++i) p1[i] = i + ((lemur64() % 3) - 1); EZBENCH2("qsort nearly", memcpy(p2, p1, n * sizeof(long)), qsort(p2, n, sizeof(long), CompareLong)); + EZBENCH2("qsort_r nearly", memcpy(p2, p1, n * sizeof(long)), + qsort_r(p2, n, sizeof(long), (void *)CompareLong, 0)); EZBENCH2("heapsort nearly", memcpy(p2, p1, n * sizeof(long)), heapsort(p2, n, sizeof(long), CompareLong)); EZBENCH2("mergesort nearly", memcpy(p2, p1, n * sizeof(long)), @@ -127,6 +197,8 @@ BENCH(qsort, bench) { for (i = 0; i < n; ++i) p1[i] = n - i; EZBENCH2("qsort reverse", memcpy(p2, p1, n * sizeof(long)), qsort(p2, n, sizeof(long), CompareLong)); + EZBENCH2("qsort_r reverse", memcpy(p2, p1, n * sizeof(long)), + qsort_r(p2, n, sizeof(long), (void *)CompareLong, 0)); EZBENCH2("heapsort reverse", memcpy(p2, p1, n * sizeof(long)), heapsort(p2, n, sizeof(long), CompareLong)); EZBENCH2("mergesort reverse", memcpy(p2, p1, n * sizeof(long)), @@ -140,6 +212,8 @@ BENCH(qsort, bench) { rngset(p1, n * sizeof(long), 0, 0); EZBENCH2("qsort random", memcpy(p2, p1, n * sizeof(long)), qsort(p2, n, sizeof(long), CompareLong)); + EZBENCH2("qsort_r random", memcpy(p2, p1, n * sizeof(long)), + qsort_r(p2, n, sizeof(long), (void *)CompareLong, 0)); EZBENCH2("heapsort random", memcpy(p2, p1, n * sizeof(long)), heapsort(p2, n, sizeof(long), CompareLong)); EZBENCH2("mergesort random", memcpy(p2, p1, n * sizeof(long)), @@ -156,6 +230,8 @@ BENCH(qsort, bench) { } EZBENCH2("qsort 2n", memcpy(p2, p1, n * sizeof(long)), qsort(p2, n, sizeof(long), CompareLong)); + EZBENCH2("qsort_r 2n", memcpy(p2, p1, n * sizeof(long)), + qsort_r(p2, n, sizeof(long), (void *)CompareLong, 0)); EZBENCH2("heapsort 2n", memcpy(p2, p1, n * sizeof(long)), heapsort(p2, n, sizeof(long), CompareLong)); EZBENCH2("mergesort 2n", memcpy(p2, p1, n * sizeof(long)), diff --git a/test/libc/runtime/mprotect_test.c b/test/libc/runtime/mprotect_test.c index 69914f1c1..7a662097a 100644 --- a/test/libc/runtime/mprotect_test.c +++ b/test/libc/runtime/mprotect_test.c @@ -18,6 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" #include "libc/calls/struct/sigaction.h" +#include "libc/calls/ucontext.h" #include "libc/dce.h" #include "libc/errno.h" #include "libc/fmt/fmt.h" @@ -31,6 +32,7 @@ #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/prot.h" #include "libc/sysv/consts/sa.h" +#include "libc/sysv/consts/sig.h" #include "libc/testlib/testlib.h" #include "libc/x/x.h" #include "third_party/xed/x86.h" diff --git a/test/libc/stdio/fmt_test.c b/test/libc/stdio/fmt_test.c index 04e9c5824..2077056df 100644 --- a/test/libc/stdio/fmt_test.c +++ b/test/libc/stdio/fmt_test.c @@ -310,7 +310,14 @@ TEST(fmt, e) { TEST(fmt, a) { EXPECT_STREQ("0x0p+0", _gc(xasprintf("%a", 0.))); EXPECT_STREQ("0x0p+0", _gc(xasprintf("%.a", 0.))); + EXPECT_STREQ(" 0x0p+0", _gc(xasprintf("%7.a", 0.))); EXPECT_STREQ("0x0.000p+0", _gc(xasprintf("%.3a", 0.))); + // EXPECT_STREQ(" 0x0.000p+0\n", _gc(xasprintf("%11.3a\n", 0.))); // TODO + EXPECT_STREQ("inf\n", _gc(xasprintf("%g\n", INFINITY))); + EXPECT_STREQ(" inf\n", _gc(xasprintf("%5g\n", INFINITY))); + EXPECT_STREQ(" +inf\n", _gc(xasprintf("%+5g\n", INFINITY))); + EXPECT_STREQ(" inf\n", _gc(xasprintf("% g\n", INFINITY))); + EXPECT_STREQ("-inf\n", _gc(xasprintf("% g\n", -INFINITY))); EXPECT_STREQ("0x1.921fb54442d18p+1", _gc(xasprintf("%a", 0x1.921fb54442d1846ap+1))); EXPECT_STREQ("0X1.921FB54442D18P+1", diff --git a/third_party/awk/main.c b/third_party/awk/main.c index 0fa88c8cc..1ac4b710d 100644 --- a/third_party/awk/main.c +++ b/third_party/awk/main.c @@ -36,6 +36,7 @@ #include "libc/str/str.h" #include "libc/sysv/consts/sa.h" #include "libc/sysv/consts/sicode.h" +#include "libc/sysv/consts/sig.h" #include "third_party/awk/awk.h" // clang-format off diff --git a/third_party/lua/lrepl.c b/third_party/lua/lrepl.c index ecbc4f796..f7e63121b 100644 --- a/third_party/lua/lrepl.c +++ b/third_party/lua/lrepl.c @@ -40,6 +40,7 @@ #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/sysv/consts/sa.h" +#include "libc/sysv/consts/sig.h" #include "libc/thread/thread.h" #include "third_party/linenoise/linenoise.h" #include "third_party/lua/cosmo.h" diff --git a/third_party/make/commands.c b/third_party/make/commands.c index 33667bde1..595002b63 100644 --- a/third_party/make/commands.c +++ b/third_party/make/commands.c @@ -22,6 +22,7 @@ this program. If not, see . */ #include "third_party/make/variable.h" /**/ #include "libc/runtime/runtime.h" +#include "libc/sysv/consts/sig.h" #include "third_party/make/commands.h" /* clang-format off */ diff --git a/third_party/make/job.c b/third_party/make/job.c index b782890e1..34df3bf9e 100644 --- a/third_party/make/job.c +++ b/third_party/make/job.c @@ -57,6 +57,7 @@ this program. If not, see . */ #include "libc/sysv/consts/pr.h" #include "libc/sysv/consts/prot.h" #include "libc/sysv/consts/rlimit.h" +#include "libc/sysv/consts/sig.h" #include "libc/sysv/errfuns.h" #include "libc/time/time.h" #include "libc/x/x.h" diff --git a/third_party/musl/strfmon.c b/third_party/musl/strfmon.c index 6471dc632..e11e6c265 100644 --- a/third_party/musl/strfmon.c +++ b/third_party/musl/strfmon.c @@ -41,7 +41,7 @@ static ssize_t vstrfmon_l(char *s, size_t n, locale_t loc, const char *fmt, va_l { size_t l; double x; - int fill, nogrp, negpar, nosym, left, intl; + int left; int lp, rp, w, fw; char *s0=s; for (; n && *fmt; ) { @@ -54,25 +54,17 @@ static ssize_t vstrfmon_l(char *s, size_t n, locale_t loc, const char *fmt, va_l 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; @@ -90,8 +82,6 @@ static ssize_t vstrfmon_l(char *s, size_t n, locale_t loc, const char *fmt, va_l 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; diff --git a/third_party/python/Modules/cjkcodecs/__big5_decmap.c b/third_party/python/Modules/cjkcodecs/__big5_decmap.c index 3e379aba9..7d95bfb05 100644 --- a/third_party/python/Modules/cjkcodecs/__big5_decmap.c +++ b/third_party/python/Modules/cjkcodecs/__big5_decmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __big5_decmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__cp932ext_decmap.c b/third_party/python/Modules/cjkcodecs/__cp932ext_decmap.c index 04e9a9aee..5277cf29f 100644 --- a/third_party/python/Modules/cjkcodecs/__cp932ext_decmap.c +++ b/third_party/python/Modules/cjkcodecs/__cp932ext_decmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __cp932ext_decmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__cp949_encmap.c b/third_party/python/Modules/cjkcodecs/__cp949_encmap.c index 19533147c..1c5aca0f7 100644 --- a/third_party/python/Modules/cjkcodecs/__cp949_encmap.c +++ b/third_party/python/Modules/cjkcodecs/__cp949_encmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __cp949_encmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__cp949ext_decmap.c b/third_party/python/Modules/cjkcodecs/__cp949ext_decmap.c index 210167e54..9736b3a42 100644 --- a/third_party/python/Modules/cjkcodecs/__cp949ext_decmap.c +++ b/third_party/python/Modules/cjkcodecs/__cp949ext_decmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __cp949ext_decmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__cp950ext_decmap.c b/third_party/python/Modules/cjkcodecs/__cp950ext_decmap.c index 35810103e..0856106ce 100644 --- a/third_party/python/Modules/cjkcodecs/__cp950ext_decmap.c +++ b/third_party/python/Modules/cjkcodecs/__cp950ext_decmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __cp950ext_decmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__gb18030ext_decmap.c b/third_party/python/Modules/cjkcodecs/__gb18030ext_decmap.c index 288124f0a..d68c33e52 100644 --- a/third_party/python/Modules/cjkcodecs/__gb18030ext_decmap.c +++ b/third_party/python/Modules/cjkcodecs/__gb18030ext_decmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __gb18030ext_decmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__gb18030ext_encmap.c b/third_party/python/Modules/cjkcodecs/__gb18030ext_encmap.c index 29d4cef51..16fbefe2a 100644 --- a/third_party/python/Modules/cjkcodecs/__gb18030ext_encmap.c +++ b/third_party/python/Modules/cjkcodecs/__gb18030ext_encmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __gb18030ext_encmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__gb2312_decmap.c b/third_party/python/Modules/cjkcodecs/__gb2312_decmap.c index 0edab61e1..f1c87b138 100644 --- a/third_party/python/Modules/cjkcodecs/__gb2312_decmap.c +++ b/third_party/python/Modules/cjkcodecs/__gb2312_decmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __gb2312_decmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__gbcommon_encmap.c b/third_party/python/Modules/cjkcodecs/__gbcommon_encmap.c index 00aa441f7..9340d9b96 100644 --- a/third_party/python/Modules/cjkcodecs/__gbcommon_encmap.c +++ b/third_party/python/Modules/cjkcodecs/__gbcommon_encmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __gbcommon_encmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__gbkext_decmap.c b/third_party/python/Modules/cjkcodecs/__gbkext_decmap.c index 6e94a8dab..7c5042258 100644 --- a/third_party/python/Modules/cjkcodecs/__gbkext_decmap.c +++ b/third_party/python/Modules/cjkcodecs/__gbkext_decmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __gbkext_decmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__jisx0208_decmap.c b/third_party/python/Modules/cjkcodecs/__jisx0208_decmap.c index f14fa11c0..7ca761283 100644 --- a/third_party/python/Modules/cjkcodecs/__jisx0208_decmap.c +++ b/third_party/python/Modules/cjkcodecs/__jisx0208_decmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __jisx0208_decmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__jisx0212_decmap.c b/third_party/python/Modules/cjkcodecs/__jisx0212_decmap.c index b5a728644..5af83f027 100644 --- a/third_party/python/Modules/cjkcodecs/__jisx0212_decmap.c +++ b/third_party/python/Modules/cjkcodecs/__jisx0212_decmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __jisx0212_decmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__jisx0213_1_bmp_decmap.c b/third_party/python/Modules/cjkcodecs/__jisx0213_1_bmp_decmap.c index 60a711c59..fe62ff18a 100644 --- a/third_party/python/Modules/cjkcodecs/__jisx0213_1_bmp_decmap.c +++ b/third_party/python/Modules/cjkcodecs/__jisx0213_1_bmp_decmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __jisx0213_1_bmp_decmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__jisx0213_2_bmp_decmap.c b/third_party/python/Modules/cjkcodecs/__jisx0213_2_bmp_decmap.c index d924b316d..cf94cd71e 100644 --- a/third_party/python/Modules/cjkcodecs/__jisx0213_2_bmp_decmap.c +++ b/third_party/python/Modules/cjkcodecs/__jisx0213_2_bmp_decmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __jisx0213_2_bmp_decmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__jisx0213_pair_decmap.c b/third_party/python/Modules/cjkcodecs/__jisx0213_pair_decmap.c index 97fbad946..b0e6028c8 100644 --- a/third_party/python/Modules/cjkcodecs/__jisx0213_pair_decmap.c +++ b/third_party/python/Modules/cjkcodecs/__jisx0213_pair_decmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __jisx0213_pair_decmap_ptr; diff --git a/third_party/python/Modules/cjkcodecs/__ksx1001_decmap.c b/third_party/python/Modules/cjkcodecs/__ksx1001_decmap.c index d0171c528..20cfe276a 100644 --- a/third_party/python/Modules/cjkcodecs/__ksx1001_decmap.c +++ b/third_party/python/Modules/cjkcodecs/__ksx1001_decmap.c @@ -1,4 +1,5 @@ #include "libc/x/x.h" +#include "third_party/python/Modules/cjkcodecs/xloadzd.h" /* clang-format off */ static _Atomic(void *) __ksx1001_decmap_ptr; diff --git a/libc/x/xloadzd.c b/third_party/python/Modules/cjkcodecs/xloadzd.c similarity index 100% rename from libc/x/xloadzd.c rename to third_party/python/Modules/cjkcodecs/xloadzd.c diff --git a/third_party/python/Modules/cjkcodecs/xloadzd.h b/third_party/python/Modules/cjkcodecs/xloadzd.h new file mode 100644 index 000000000..333382094 --- /dev/null +++ b/third_party/python/Modules/cjkcodecs/xloadzd.h @@ -0,0 +1,11 @@ +#ifndef COSMOPOLITAN_THIRD_PARTY_PYTHON_MODULES_CJKCODECS_XLOADZD_H_ +#define COSMOPOLITAN_THIRD_PARTY_PYTHON_MODULES_CJKCODECS_XLOADZD_H_ +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ + +void *xloadzd(_Atomic(void *) *, const void *, size_t, size_t, size_t, size_t, + uint32_t); + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_THIRD_PARTY_PYTHON_MODULES_CJKCODECS_XLOADZD_H_ */ diff --git a/third_party/python/Modules/faulthandler.c b/third_party/python/Modules/faulthandler.c index 3f566b2ed..427da6f97 100644 --- a/third_party/python/Modules/faulthandler.c +++ b/third_party/python/Modules/faulthandler.c @@ -6,6 +6,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" #include "libc/calls/struct/sigaction.h" +#include "libc/calls/struct/sigaltstack.h" #include "libc/errno.h" #include "libc/sysv/consts/rlimit.h" #include "libc/sysv/consts/sa.h" diff --git a/third_party/python/python.mk b/third_party/python/python.mk index 216996f33..ffc9497f3 100644 --- a/third_party/python/python.mk +++ b/third_party/python/python.mk @@ -188,6 +188,7 @@ THIRD_PARTY_PYTHON_HDRS = \ third_party/python/Modules/_sqlite/row.h \ third_party/python/Modules/_sqlite/statement.h \ third_party/python/Modules/_sqlite/util.h \ + third_party/python/Modules/cjkcodecs/xloadzd.h \ third_party/python/Modules/cjkcodecs/cjkcodecs.h \ third_party/python/Modules/cjkcodecs/multibytecodec.h \ third_party/python/Modules/cjkcodecs/somanyencodings.h \ @@ -586,6 +587,7 @@ THIRD_PARTY_PYTHON_STAGE2_A_SRCS = \ third_party/python/Modules/atexitmodule.c \ third_party/python/Modules/audioop.c \ third_party/python/Modules/binascii.c \ + third_party/python/Modules/cjkcodecs/xloadzd.c \ third_party/python/Modules/cjkcodecs/_codecs_cn.c \ third_party/python/Modules/cjkcodecs/_codecs_hk.c \ third_party/python/Modules/cjkcodecs/_codecs_iso2022.c \ diff --git a/third_party/quickjs/quickjs-libc.c b/third_party/quickjs/quickjs-libc.c index 970cf507a..ecfa0245d 100644 --- a/third_party/quickjs/quickjs-libc.c +++ b/third_party/quickjs/quickjs-libc.c @@ -47,6 +47,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/s.h" +#include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/termios.h" #include "libc/sysv/consts/w.h" #include "libc/time/time.h" diff --git a/third_party/radpajama/main-redpajama-chat.cc b/third_party/radpajama/main-redpajama-chat.cc index 10e27e1a4..b56a183bb 100644 --- a/third_party/radpajama/main-redpajama-chat.cc +++ b/third_party/radpajama/main-redpajama-chat.cc @@ -41,6 +41,7 @@ #include "libc/sysv/consts/ok.h" #include "libc/sysv/consts/sa.h" #include "libc/sysv/consts/sicode.h" +#include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/ss.h" #include "libc/time/time.h" #include "third_party/libcxx/algorithm" diff --git a/third_party/radpajama/main-redpajama.cc b/third_party/radpajama/main-redpajama.cc index 0e4a654c3..1cd9c82a4 100644 --- a/third_party/radpajama/main-redpajama.cc +++ b/third_party/radpajama/main-redpajama.cc @@ -41,6 +41,7 @@ #include "libc/sysv/consts/ok.h" #include "libc/sysv/consts/sa.h" #include "libc/sysv/consts/sicode.h" +#include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/ss.h" #include "libc/time/time.h" #include "third_party/libcxx/cassert" diff --git a/third_party/sqlite3/shell.c b/third_party/sqlite3/shell.c index c1b8f2fc1..ce01c2686 100644 --- a/third_party/sqlite3/shell.c +++ b/third_party/sqlite3/shell.c @@ -31,6 +31,7 @@ ** This file contains code to implement the "sqlite" command line ** utility for accessing SQLite databases. */ +#include "libc/dce.h" #if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS) /* This needs to come before any includes for MSVC compiler */ #define _CRT_SECURE_NO_WARNINGS diff --git a/third_party/zip/zip.c b/third_party/zip/zip.c index 4b2b33ee1..1216e3d29 100644 --- a/third_party/zip/zip.c +++ b/third_party/zip/zip.c @@ -56,6 +56,7 @@ #include "third_party/zip/ttyio.h" #include "libc/str/str.h" #include "libc/errno.h" +#include "libc/sysv/consts/sig.h" #include "third_party/bzip2/bzlib.h" #ifdef VMS diff --git a/third_party/zip/zip.mk b/third_party/zip/zip.mk index bc92a2532..048d4c28c 100644 --- a/third_party/zip/zip.mk +++ b/third_party/zip/zip.mk @@ -91,7 +91,8 @@ THIRD_PARTY_ZIP_DIRECTDEPS = \ LIBC_SYSV \ LIBC_TIME \ LIBC_X \ - THIRD_PARTY_BZIP2 + THIRD_PARTY_BZIP2 \ + THIRD_PARTY_ZLIB THIRD_PARTY_ZIP_DEPS := \ $(call uniq,$(foreach x,$(THIRD_PARTY_ZIP_DIRECTDEPS),$($(x)))) diff --git a/third_party/zip/zipnote.c b/third_party/zip/zipnote.c index a3a339036..19ed23dcd 100644 --- a/third_party/zip/zipnote.c +++ b/third_party/zip/zipnote.c @@ -26,6 +26,7 @@ #include "libc/calls/struct/siginfo.h" #include "libc/sysv/consts/sa.h" #include "libc/sysv/consts/sicode.h" +#include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/ss.h" /* Calculate size of static line buffer used in write (-w) mode. */ diff --git a/third_party/zip/zipsplit.c b/third_party/zip/zipsplit.c index 725407be9..399bf7f9f 100644 --- a/third_party/zip/zipsplit.c +++ b/third_party/zip/zipsplit.c @@ -26,6 +26,7 @@ #include "libc/calls/struct/siginfo.h" #include "libc/sysv/consts/sa.h" #include "libc/sysv/consts/sicode.h" +#include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/ss.h" #define DEFSIZ 36000L /* Default split size (change in help() too) */ diff --git a/third_party/zstd/programs/fileio.c b/third_party/zstd/programs/fileio.c index 5182836d9..4c0312b38 100644 --- a/third_party/zstd/programs/fileio.c +++ b/third_party/zstd/programs/fileio.c @@ -85,6 +85,7 @@ #include "libc/sysv/consts/sa.h" #include "libc/sysv/consts/sicode.h" #include "libc/sysv/consts/ss.h" +#include "libc/sysv/consts/sig.h" #include "third_party/zstd/programs/timefn.h" /* UTIL_getTime, UTIL_clockSpanMicro */ #if defined (_MSC_VER) diff --git a/tool/build/compile.c b/tool/build/compile.c index e4f47f8fd..29eeaf6c1 100644 --- a/tool/build/compile.c +++ b/tool/build/compile.c @@ -227,6 +227,7 @@ const char *const kGccOnlyFlags[] = { "-fcx-limited-range", "-fdelete-dead-exceptions", "-femit-struct-debug-baseonly", + "-ffp-int-builtin-inexact", "-fipa-pta", "-fivopts", "-flimit-function-alignment", @@ -236,6 +237,7 @@ const char *const kGccOnlyFlags[] = { "-fno-align-jumps", "-fno-align-labels", "-fno-align-loops", + "-fno-cx-limited-range", "-fno-fp-int-builtin-inexact", "-fno-gnu-unique", "-fno-gnu-unique", @@ -1155,11 +1157,13 @@ int main(int argc, char *argv[]) { } else if (_startswith(argv[i], "-fsanitize=implicit") && strstr(argv[i], "integer")) { if (isgcc) AddArg(argv[i]); + } else if (strstr(argv[i], "stack-protector")) { + if (isclang || (isgcc && ccversion >= 6)) { + AddArg(argv[i]); + } } else if (_startswith(argv[i], "-fvect-cost") || _startswith(argv[i], "-mstringop") || - _startswith(argv[i], "-gz") || - strstr(argv[i], "stack-protector") || - strstr(argv[i], "sanitize") || + _startswith(argv[i], "-gz") || strstr(argv[i], "sanitize") || _startswith(argv[i], "-fvect-cost") || _startswith(argv[i], "-fvect-cost")) { if (isgcc && ccversion >= 6) { diff --git a/tool/emacs/cosmo-c-builtins.el b/tool/emacs/cosmo-c-builtins.el index d70bed890..14c9dbfc0 100644 --- a/tool/emacs/cosmo-c-builtins.el +++ b/tool/emacs/cosmo-c-builtins.el @@ -163,7 +163,8 @@ "__sync_lock_release")) (gcc-builtin-functions-ia32 - '("__builtin_ia32_pmovmskb128")) + '("__builtin_ia32_pmovmskb128" + "__builtin_ia32_pmovmskb256")) (gxx-builtin-type-traits '("__has_nothrow_assign" diff --git a/tool/scripts/cosmoc++ b/tool/scripts/cosmoc++ index b3d8e49c2..1dabd19ba 100755 --- a/tool/scripts/cosmoc++ +++ b/tool/scripts/cosmoc++ @@ -183,7 +183,7 @@ if [ $INTENT = cpp ]; then elif [ $INTENT = cc ]; then set -- $PLATFORM $PREDEF $CCFLAGS $CXXFLAGS $CPPFLAGS "$@" $FRAME else - set -- $PLATFORM $PREDEF $LDFLAGS $APEFLAGS $CXXFLAGS $CPPFLAGS "$@" \ + set -- $PLATFORM $PREDEF $CCFLAGS $CXXFLAGS $CPPFLAGS $LDFLAGS $APEFLAGS $CXXFLAGS $CPPFLAGS "$@" \ $LDLIBS -Wl,-z,common-page-size=4096 -Wl,-z,max-page-size=4096 $FRAME fi diff --git a/tool/scripts/cosmocc b/tool/scripts/cosmocc index 8a625add8..4315525d9 100755 --- a/tool/scripts/cosmocc +++ b/tool/scripts/cosmocc @@ -181,7 +181,7 @@ if [ $INTENT = cpp ]; then elif [ $INTENT = cc ]; then set -- $PLATFORM $PREDEF $CCFLAGS $CFLAGS $CPPFLAGS "$@" $FRAME else - set -- $PLATFORM $PREDEF $LDFLAGS $APEFLAGS $CFLAGS $CPPFLAGS "$@" \ + set -- $PLATFORM $PREDEF $CCFLAGS $CFLAGS $CPPFLAGS $LDFLAGS $APEFLAGS $CFLAGS $CPPFLAGS "$@" \ $LDLIBS -Wl,-z,common-page-size=4096 -Wl,-z,max-page-size=4096 $FRAME fi diff --git a/tool/viz/memzoom.c b/tool/viz/memzoom.c index 691ed5eb7..8210595ce 100644 --- a/tool/viz/memzoom.c +++ b/tool/viz/memzoom.c @@ -26,6 +26,7 @@ #include "libc/calls/struct/winsize.h" #include "libc/calls/termios.h" #include "libc/calls/ucontext.h" +#include "libc/dce.h" #include "libc/errno.h" #include "libc/fmt/conv.h" #include "libc/fmt/itoa.h"