From b45d50b6902fe695fd6607cd9fa0b2187ceaf666 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Wed, 16 Mar 2022 13:33:13 -0700 Subject: [PATCH] Make improvements - Fix build flakes - Polyfill SIGWINCH on Windows - Fix an execve issue on Windows - Make strerror show more information - Improve cmd.exe setup/teardown on Windows - Support bracketed paste mode in Blinkenlights - Show keyboard shortcuts in Blinkenlights status bar - Fixed copy_file_range() and copyfile() w/ zip filesystem - Size optimize GetDosArgv() to keep life.com 12kb in size - Improve Blinkenlights ability to load weird ELF executables - Fix program_executable_name and add GetInterpreterExecutableName - Make Python in tiny mode fail better if docstrings are requested - Update Python test exclusions in tiny* modes such as tinylinux - Add bulletproof unbreakable kprintf() troubleshooting function - Remove "oldskool" keyword from ape.S for virus scanners - Fix issue that caused backtraces to not print sometimes - Improve Blinkenlights serial uart character i/o - Make clock_gettime() not clobber errno on xnu - Improve sha256 cpuid check for old computers - Integrate some bestline linenoise fixes - Show runit process names better in htop - Remove SIGPIPE from ShowCrashReports() - Make realpath() not clobber errno - Avoid attaching GDB on non-Linux - Improve img.com example --- Makefile | 4 +- ape/ape.S | 22 +- build/bootstrap/ar.com | Bin 65536 -> 61440 bytes build/bootstrap/compile.com | Bin 86016 -> 86016 bytes build/bootstrap/mkdeps.com | Bin 73728 -> 69632 bytes build/bootstrap/package.com | Bin 437768 -> 112372 bytes build/definitions.mk | 3 + dsp/mpeg/mpeg1.c | 3 +- dsp/scale/gyarados.c | 2 +- examples/auto-launch-gdb-on-crash.c | 9 +- examples/curl.c | 34 +- examples/datauri.c | 63 + examples/forkexec.c | 23 + examples/forkexecwait.c | 25 + examples/img.c | 100 +- examples/nesemu1.cc | 2 +- examples/printargs.c | 103 +- examples/rusage.c | 2 +- examples/ttyinfo.c | 9 +- libc/alg/bisect.internal.h | 2 +- libc/calls/addtimespec.c | 2 +- libc/calls/clock_gettime.c | 22 +- libc/calls/commandv.c | 142 +- libc/calls/copyfile.c | 15 +- libc/calls/execve.c | 15 +- libc/calls/getpid.c | 35 +- libc/calls/internal.h | 2 + libc/calls/ioctl_tcsets.c | 24 +- libc/calls/ioctl_tiocgwinsz-nt.c | 13 +- libc/calls/ioctl_tiocgwinsz.c | 4 +- libc/calls/mprotect.greg.c | 2 - libc/calls/nanosleep-nt.c | 30 +- libc/calls/ntspawn.c | 2 +- libc/calls/preadv.c | 2 +- .../program_executable_name.c | 68 +- libc/calls/read-nt.c | 2 + libc/calls/readv-serial.c | 19 +- libc/calls/realpath.c | 29 +- libc/calls/sigwinch-nt.c | 58 + libc/calls/splice.c | 5 +- libc/calls/struct/sigaction.h | 5 + libc/calls/sysdebug.internal.h | 2 +- libc/crt/crt.S | 9 + libc/elf/def.h | 2 + libc/elf/getelfstringtable.c | 16 +- libc/elf/getelfsymboltable.c | 14 +- libc/fmt/divmod10.internal.h | 26 + libc/fmt/fmt.h | 2 + libc/fmt/kerrornames.S | 2 +- libc/fmt/kerrornameslong.S | 235 +-- libc/fmt/strerror_long.greg.c | 40 + libc/fmt/{strerror_r.c => strerror_r.greg.c} | 115 +- libc/fmt/strerror_short.greg.c | 38 + libc/intrin/asan.c | 225 +-- libc/intrin/asan.internal.h | 29 +- libc/intrin/asancodes.h | 28 + libc/{runtime => intrin}/assertfail.c | 6 +- libc/intrin/{exit.c => exit.greg.c} | 4 +- libc/intrin/intrin.mk | 6 + libc/intrin/kprintf.greg.c | 798 +++++++++ libc/intrin/kprintf.h | 14 + .../kstarttsc.S => intrin/kstarttsc.c} | 33 +- libc/intrin/nomultics.c | 30 + libc/intrin/ntconsolemode.c | 21 + libc/intrin/printf.c | 242 --- libc/{runtime => intrin}/quick_exit.c | 17 +- libc/intrin/ubsan.c | 5 +- libc/{calls => intrin}/vforked.c | 0 libc/log/addr2linepath.c | 2 +- libc/log/attachdebugger.c | 11 +- libc/log/backtrace2.c | 84 +- libc/log/backtrace3.c | 12 +- libc/log/checkfail_ndebug.c | 8 +- libc/log/gdb.h | 32 +- libc/log/internal.h | 4 +- libc/log/libfatal.internal.h | 3 - libc/log/oncrash.c | 151 +- libc/log/oncrashthunks.S | 9 - libc/log/printgarbage.c | 30 +- libc/log/showcrashreports.c | 1 - libc/macros.internal.inc | 4 +- libc/nt/synchronization.h | 4 + libc/nt/thunk/memory.inc | 2 + libc/nt/thunk/process.inc | 3 + libc/nt/thunk/runtime.inc | 3 + libc/nt/thunk/synchronization.inc | 1 + libc/nt/version.h | 14 + libc/runtime/exit.c | 18 +- libc/runtime/fork.c | 21 +- libc/runtime/ftracer.c | 11 +- libc/runtime/getdosargv.c | 97 +- libc/runtime/getdosenviron.c | 1 - libc/runtime/getinterpreterexecutablename.c | 83 + libc/runtime/internal.h | 2 +- libc/runtime/memtrack.internal.h | 31 +- libc/runtime/printmemoryintervals.c | 16 +- libc/runtime/runtime.h | 1 + libc/runtime/stack.h | 29 +- libc/runtime/winmain.greg.c | 42 +- libc/sock/poll-nt.c | 5 + libc/str/utf16.h | 17 +- libc/sysv/calls/__syscall.s | 2 - libc/sysv/consts.sh | 71 +- libc/sysv/consts/AT_CANARY.S | 2 + libc/sysv/consts/AT_CANARYLEN.S | 2 + libc/sysv/consts/AT_EHDRFLAGS.S | 2 + libc/sysv/consts/AT_EXECFN.S | 2 +- libc/sysv/consts/AT_EXECPATH.S | 2 + libc/sysv/consts/AT_FLAGS.S | 2 +- libc/sysv/consts/AT_NCPUS.S | 2 + libc/sysv/consts/AT_PAGESIZES.S | 2 + libc/sysv/consts/AT_PAGESIZESLEN.S | 2 + libc/sysv/consts/AT_RANDOM.S | 2 +- libc/sysv/consts/AT_STACKBASE.S | 2 + libc/sysv/consts/AT_STACKPROT.S | 2 + libc/sysv/consts/AT_TIMEKEEP.S | 2 + libc/sysv/consts/MADV_DODUMP.S | 2 +- libc/sysv/consts/MADV_DOFORK.S | 2 +- libc/sysv/consts/MADV_DONTDUMP.S | 2 +- libc/sysv/consts/MADV_DONTFORK.S | 2 +- libc/sysv/consts/MADV_DONTNEED.S | 2 +- libc/sysv/consts/MADV_HUGEPAGE.S | 2 +- libc/sysv/consts/MADV_HWPOISON.S | 2 +- libc/sysv/consts/MADV_MERGEABLE.S | 2 +- libc/sysv/consts/MADV_NOHUGEPAGE.S | 2 +- libc/sysv/consts/MADV_REMOVE.S | 2 +- libc/sysv/consts/MADV_UNMERGEABLE.S | 2 +- libc/sysv/consts/MAP_ANON.S | 2 +- libc/sysv/consts/MAP_ANONYMOUS.S | 2 +- libc/sysv/consts/MAP_FIXED.S | 2 +- libc/sysv/consts/MAP_FIXED_NOREPLACE.S | 2 + libc/sysv/consts/MAP_GROWSDOWN.S | 2 +- libc/sysv/consts/MAP_NOCORE.S | 2 +- libc/sysv/consts/MAP_STACK.S | 2 +- libc/sysv/consts/POSIX_FADV_DONTNEED.S | 2 +- libc/sysv/consts/POSIX_FADV_NOREUSE.S | 2 +- libc/sysv/consts/POSIX_FADV_RANDOM.S | 2 +- libc/sysv/consts/POSIX_FADV_SEQUENTIAL.S | 2 +- libc/sysv/consts/POSIX_FADV_WILLNEED.S | 2 +- libc/sysv/consts/POSIX_MADV_DONTNEED.S | 2 +- libc/sysv/consts/auxv.h | 20 + libc/sysv/consts/madv.h | 62 +- libc/sysv/consts/nr.h | 1544 ++++++++--------- libc/sysv/consts/o.h | 66 +- libc/sysv/syscalls.sh | 1 - libc/sysv/systemfive.S | 14 + libc/testlib/leaks.c | 40 +- libc/testlib/quota.c | 32 +- libc/testlib/showerror.c | 51 +- libc/zipos/zipos.internal.h | 2 +- test/libc/fmt/strerror_r_test.c | 42 +- test/libc/intrin/kprintf_test.c | 372 ++++ test/libc/intrin/test.mk | 4 +- test/libc/nexgen32e/gclongjmp_test.c | 2 +- test/libc/stdio/getdelim_test.c | 2 +- third_party/linenoise/linenoise.c | 124 +- third_party/mbedtls/sha256.c | 13 +- third_party/python/Include/ezprint.h | 12 +- .../python/Lib/test/support/__init__.py | 8 +- third_party/python/Lib/test/test_bz2.py | 2 +- third_party/python/Lib/test/test_class.py | 3 +- .../python/Lib/test/test_exceptions.py | 4 +- third_party/python/Lib/test/test_fileio.py | 2 +- third_party/python/Lib/test/test_functools.py | 6 +- third_party/python/Lib/test/test_plistlib.py | 3 +- .../python/Lib/test/test_unicodedata.py | 2 +- third_party/python/Modules/tlsmodule.c | 2 +- third_party/python/launch.c | 5 +- third_party/python/python.mk | 749 ++++---- third_party/quickjs/quickjs.mk | 2 +- third_party/sqlite3/README.cosmo | 12 + tool/build/blinkenlights.c | 279 ++- tool/build/compile.c | 163 +- tool/build/lib/diself.c | 4 +- tool/build/lib/disspec.c | 2 + tool/build/lib/eztls.c | 19 + tool/build/lib/eztls.h | 1 + tool/build/lib/fds.h | 8 +- tool/build/lib/ioports.c | 28 +- tool/build/lib/loader.c | 2 +- tool/build/lib/machine.c | 8 +- tool/build/lib/machine.h | 1 + tool/build/lib/memory.c | 3 +- tool/build/lib/pty.c | 41 +- tool/build/lib/syscall.c | 1 + tool/build/lib/time.c | 16 +- tool/build/package.c | 62 +- tool/build/runit.c | 88 +- tool/build/runitd.c | 4 +- tool/emacs/cosmo-c-builtins.el | 1 + tool/emacs/cosmo-c-keywords.el | 114 +- tool/emacs/cosmo-format.el | 19 +- tool/emacs/cosmo-stuff.el | 14 +- tool/viz/printpeb.c | 6 +- 194 files changed, 4881 insertions(+), 2966 deletions(-) create mode 100644 examples/datauri.c create mode 100644 examples/forkexec.c create mode 100644 examples/forkexecwait.c rename libc/{runtime => calls}/program_executable_name.c (78%) create mode 100644 libc/calls/sigwinch-nt.c create mode 100644 libc/fmt/divmod10.internal.h create mode 100644 libc/fmt/strerror_long.greg.c rename libc/fmt/{strerror_r.c => strerror_r.greg.c} (53%) create mode 100644 libc/fmt/strerror_short.greg.c create mode 100644 libc/intrin/asancodes.h rename libc/{runtime => intrin}/assertfail.c (93%) rename libc/intrin/{exit.c => exit.greg.c} (97%) create mode 100644 libc/intrin/kprintf.greg.c create mode 100644 libc/intrin/kprintf.h rename libc/{nexgen32e/kstarttsc.S => intrin/kstarttsc.c} (72%) create mode 100644 libc/intrin/nomultics.c create mode 100644 libc/intrin/ntconsolemode.c delete mode 100644 libc/intrin/printf.c rename libc/{runtime => intrin}/quick_exit.c (85%) rename libc/{calls => intrin}/vforked.c (100%) create mode 100644 libc/nt/thunk/synchronization.inc create mode 100644 libc/runtime/getinterpreterexecutablename.c delete mode 100644 libc/sysv/calls/__syscall.s create mode 100644 libc/sysv/consts/AT_CANARY.S create mode 100644 libc/sysv/consts/AT_CANARYLEN.S create mode 100644 libc/sysv/consts/AT_EHDRFLAGS.S create mode 100644 libc/sysv/consts/AT_EXECPATH.S create mode 100644 libc/sysv/consts/AT_NCPUS.S create mode 100644 libc/sysv/consts/AT_PAGESIZES.S create mode 100644 libc/sysv/consts/AT_PAGESIZESLEN.S create mode 100644 libc/sysv/consts/AT_STACKBASE.S create mode 100644 libc/sysv/consts/AT_STACKPROT.S create mode 100644 libc/sysv/consts/AT_TIMEKEEP.S create mode 100644 libc/sysv/consts/MAP_FIXED_NOREPLACE.S create mode 100644 test/libc/intrin/kprintf_test.c create mode 100644 third_party/sqlite3/README.cosmo diff --git a/Makefile b/Makefile index 1e9d4180c..1e50651fc 100644 --- a/Makefile +++ b/Makefile @@ -60,7 +60,7 @@ # build/config.mk SHELL = /bin/sh -HOSTS ?= freebsd openbsd netbsd rhel7 rhel5 xnu win7 win10 +HOSTS ?= freebsd openbsd netbsd rhel7 rhel5 xnu #win7 win10 SANITY := $(shell build/sanitycheck $$PPID) .SUFFIXES: @@ -210,7 +210,7 @@ CHECKS = $(foreach x,$(PKGS),$($(x)_CHECKS)) bins: $(BINS) check: $(CHECKS) -test: $(TESTS) all +test: $(TESTS) depend: o/$(MODE)/depend tags: TAGS HTAGS diff --git a/ape/ape.S b/ape/ape.S index f816582d0..83dd7c7dd 100644 --- a/ape/ape.S +++ b/ape/ape.S @@ -1070,18 +1070,12 @@ str.error: str.crlf: .asciz "\r\n" .endobj str.crlf -str.cpuid: - .asciz "cpuid" - .endobj str.cpuid -str.oldskool: - .asciz "oldskool" - .endobj str.oldskool str.e820: .asciz "e820" .endobj str.e820 -str.long: - .asciz "nolong" - .endobj str.long +str.oldcpu: + .asciz "oldcpu" + .endobj str.oldcpu // Serial Line Configuration (8250 UART 16550) // If it's hacked, it'll at least get hacked very slowly. @@ -1264,7 +1258,7 @@ longmodeloader: lcheck: pushf # check for i8086 / i8088 / i80186 pop %ax test $0x80,%ah # see intel manual volume 1 20.1.2 - jnz 9f # we now assume 32bit is supported + jnz 10f # we now assume 32bit is supported pushfl # now check for i386 or early i486 pop %eax # test ability to change cpuid bit mov %eax,%ecx @@ -1275,7 +1269,7 @@ lcheck: pushf # check for i8086 / i8088 / i80186 pushfl pop %eax cmp %eax,%ecx - je 12f # we assume cpuid inst is available + je 10f # we assume cpuid inst is available or %ebx,%eax # puts cpuid bit in the on position push %eax popfl @@ -1293,11 +1287,7 @@ lcheck: pushf # check for i8086 / i8088 / i80186 jne 10f xor %ax,%ax 1: ret -9: mov $REAL(str.oldskool),%di - jmp 20f -10: mov $REAL(str.long),%di - jmp 20f -12: mov $REAL(str.cpuid),%di +10: mov $REAL(str.oldcpu),%di 20: call rldie .endfn lcheck diff --git a/build/bootstrap/ar.com b/build/bootstrap/ar.com index 7e77313557e32f89d8cbbe3034defc50547c543b..90bd84a8f14f37a3005302dfce24311dad064f29 100755 GIT binary patch literal 61440 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 literal 65536 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 z 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

9mjYp+KIC3+d(0sFk8b2flw8ZJ;h6rl|XWT5% zt8vD>&DDb}TJ77XS>({AEgHXpQqJ5xp7VKd`WlJN=-oW^4_^2B=Ff&|H5x73_-Lu7 zjLjICsFx&})APfz7>>dUA`0FRczz*9gjJ79|w`+>}dbHyr12NcB?a+gKMN(fVKvcKY8kDRaM^BS)22S4HPfX20IQB$+x+uq zseM({-u@=Xee8^|d?PT}2D}iy`2nXY=KQNU31_q9Y=CsdzoF?a@<=V%5Z(S*^m6e@ z0I8QPPUH5=?92##oD&5JqBxa!llK^PJPssn$m{3yWQ|A0*7zBJ|99?v;*YRv9lO4 zs&&&rxC}CJ5>7^`yR3_bpl8{tQOzU603SO>0C6sIRB?vy?ZHY%^=vb76HWZ!Dhr`GT8j0w|#rin+-gE3Zw1u!}4W@G#x z`O-%sHW+ku-@j=$qyH84J}vB~q1#*KX2TpDw#KEEdk-V_t>=#)!w_1kIGzob5dT2r z-0a;);qt4VJmi9N=}nZWa89a%6=zc_+E#JSt3!~C7Q-}HSkbsg%$jO5#*{U{tf^A6 z0_KL9y>RX;Bl0ru*{Ut-4Nt6Tv{JGpcpOSjNIPsApH}NT>v3O2e~UvFmM|t(`z2$& z$F$I{VQl=Ew%RW@vZ68ZngaI0m|U%SBfBytS=;vu7B#k){UZ|`??%`;xSykLa~eN4 zVi>|&MesWG9Ab*E0YHCw#kJNbU6TAJ@+Mv52D+s1cYVo05pXrEW<*V&20$0lGz|gY za?>`x76H1w+h^a*#ua{;FkP~KvLF~2p-YaNiX>-;$EItGZn5BTh1$8W#!{+1gu3XZ8(- zBw2lc3@)bM=N|N8ifX7YI*esAcoP6SMW-cqK*jW zTL_}&Vz)2?FDZ;)*BR426G0radQzEn0{;2p=wRNl0Tq)I(l+;<)KH^6`WqWOxhL(; zoRgo_|M#pA;IFYR^LGDb_R){B$&c;S4r$9;J>E=v>lEw$cwcRHCR_Y?3vHWB_S)k; zBI0}wJ|_5drA^$9tL)t410tvVijASVo90?)@?C>@?T4Ft=Wo(vn|{XN=>rQv2XDGo zIYK5nD{*)K7qA@xTmB2!oTW{T)P%EsQ@h!({Uk|y#R1+!K34#7e}N7E-DKmx2(7Ep4WuHdCkN*XnNx+x?1)T5`D=TOgJ>mcGoki3mS?>b<%+db`If#(S z|6*k#Al+~OyCmrZq(ivB13MA$@;`vW6=_9njEMsFpLz)=`VAV=TK3)J|HP_yd~QsW zf0Yspso+0Zg|Zvdn)j{y7Zayk3y2$sX8(}WO+Xw=`~!HBfWJ#5%(%V(;`30LpZ*1R z%Ezb_){TF#`j&v?ssCL$I|*1M_z(N||L|E)*m3_V@&*C>{R{X!0n`2kTy~tbnK8uP z=3Scj2Nd;3i@M9A?)4soxi93y0e*Ahq;Y#I_j%5l*A# z5|;GI`FKZT^)S#B8utJt*>o-m7n#K+1ov{dyg+>6N67Vv8HBJG8ej2a!s{_Z2s6ah z7L>l54XFUQ;_C6OkmV!#_^(T;)%*$A^uKPcJiITni+`;LJRTzY*aSww zJp z&yhBX#m;JxgBAPFGAf6`7@+`1VF!tiCnj*Iv34||fZEGA=f<^6K8pBJ0HU5BKRl5= zF)K46VqB$Zq|1oH@CSFI1_}GaomjcOR0SWuhE>f<3MyaHL9Q_071LVDHN1dt70L;dzlgPf9lucx7|2#X}n@n>mrGk;yW-<3={lyMlZ*MZ8`oVZRX$FbSB;Vk{hcyT``6cnrCQsD98 z2%}k{u_aQHExgbeMG0L|8GhktGjPC)x&{yNo*UNLgLT}C(MvnC*Foeu>(|093>4f@ zXzRM*2mIm#=v~|oI0C?fJ+{zks4|~~`n-&tellLS@-FxwFg@JrDKsv<%fg>(Yo3AO z(6NcHNe3yTMFtU_YvampOoM{m2Do=lIq9qNGSb^L(ryRr< zKNUToU^Cq}n^;kxOWK1=hc!2KV=8zgHkR0*^gK_sT)e64SgxK?@;T1f*D5OBwidgF zU5|-gY7Gj!_Aq!XJN;BM`#J#O%S2;SL^1cJqiW?oRHV<6!#QH! z3(PL62w%`XWRj0#tN`&VV~9WQmiP!_4ZQc?nG+XL9AQ?fDXLaJeg@4Avo&%Wrwis6 zc_V*`%EI1~*gh)TfAe~K<8FCxYX{v{o#L%=-05k@;ao@i4IB`?TwdvL8y$Cy3lLwe zR*qa$ihr~n+o(Z!8uJ|2Qp6k;*HXmw)RJCrD2|!{Zf%C{)?k+_RZHyC0n*j4;(dC}CsAqAeVH#f6W2Oma1FCRlbc32}?DCD<=v@5qeiKCZgyOaqf6W9 zA+M*1mzH=%qb^L?jY!G)@Dz?Q}IwFyg1M(o>j9>}kn5(IQebh&FQSuD|Ny zr^0}87=uZA-SdfrcN)LLPJ{0yDKq8kNb4M7K)7OjwQj*2;rX=yOa`Eg3j=l&qVi<~ z46m2B0x)n}O57HMo9}WmmfKYbjsGRXU(4-K2;+*bFTYHb&v+8$eR_KIf0ncF;xSY( zA)cfm<5WPxoW#p9W(1NvPh-fPXoo#emiz<48oDAA1`B^5Xjh;5x|&g4`5Bu*=d0_; zivKO+=h%z#LMq(TUmso?uci8R&;~kX?P%(b6EuL@nQ549E5|US^*RjLA2Hexg(`jz z#E>h;Czla&*?KyRTTn`~bRQ2U{?qD(TLktzoM0ioI?_=G-a{d3n*W|R_%WCl*UR-K z%qW58T*S>xUvnD#f0}cST#?OG_+fJ-o{Yk9M5xcbPUF}UXxn<4DenF>(8EzHl(>N! z;FPCaMg9Iu)hU*%(%&ytSK*rZohyD&auuj=Bj>+VU8O9$PZzM~_jm1hC^mH$e*p@n zl~dedo`PlLe~pw55Zm>GubdsCjYA=a(fT{7uc_lF9JlPf@6=x@gZCAq?C$7|>NT~WG+)AS%@ zt8c&uh!Xs-20VeDbS2c6Sx4=maUurr_G3|K(`p$ozvDKKJWxn z%ARZKXVR_NjWKG&hJe=7hXGaC!xs@ghNplfU4D^dJ&yFTuEd0oL0;z?pi#r~k#gKgv9&H-q?K$_z2&Mr93X_4((u6dNWvDhw1p6Pfn)u>&-|tA^1o;XcxNLU_4;)nXwBjNS4w}yJsXjio z1XJN7lC6PPt^tL^xEsHc)n1s@v+OGLXSI2rEL^DR8HC$jHS&wC*~SG?(-(urGt4O$ z;Yrd`9xaVf)|#ETJ%i{Sn)Mj5i!(k(-CTc_38&0tm?F5?8$}Ajr%cIvF$+|7Z;On z^LJrAOll1!7r?lhyfxNVYTSbaXhXdwd~@NJ(?xK1yJ4(qVJq#e!p#>Kw$k+K7$$U! zQ?~9~5H+kE!a10Y#eT>g?vSLR{04p6`X&s_+4<$9BKV8hgS}y6Lebc}mUDB~>@!!zj z-vjy!1AB3aA%3U7JpPaBP4Fh{*X~^EdMzBNnmfE+A*>Cm_^=n``|3-k_!gaog zeOlOAV`ircx5c!PE5DbdEcsXb;^Kl+zOo;ECO?Q~UoLw>>n&!jmd7M_ecaCk<2@Oc zWok4HcKt+z1I7x+VM)+zVGZWURPD>?FGR@aIs6 zJyNm_c8&^6yV^$YM9o?H&%R|Ri<_GkP}qem96Io`NE|rz4W`p5yaHY2*~ZyIK)hFCJy-SC zq_9P+GBpuw%c|L$cQ?0oE(z4~JM5ho5@MWax3dqHwK)+==1p6;Nw;}V4&F$=!%n=A zr2WqwCa>;^hGegf(Wc&E<5o{it*L{!PW@SWRJa3jN&-VnM=lI139RB^mRtO@O_v+; zvqi6aMC9KDbUxb#JBpdF2MPA+DWH(8@q#Uuu!`1GW+tRsSmeMjnL(8`dOh zU4O6xYh2m~zq4g)+lA?hu3^3mat7|ND`C4{9%5etpAYXB&Yg;@_~`EED4YC~;<(dl zep?DumZW3L9zKe|jssYjGp0~dU5azZun6}iNQ2cb9WeSM9yRhK4|9&a_`rsO>))1$ zV2%5EqQwy~mCrmrKU7IRuBet>?m>Xp$`jCDjjretamk7+y$K(AIova!k8p?*@Kyjt zcXa?ME@uQhqTD{NB;Xd^VY)XI9$3pxy)s%m^Cs*5YI5h^L>rK@5St$*E9Dt_s3|k? z&^`A8G=R)hWZVu)JLSEG)IlMQ%1E_1yPnM^D-m)(z2k*ti?$j*ZA6DH`#Zu=k>8)qx$u$#UtZsdN{tvFr6FhK8AT?$&zOS zrYrssiz(iTRD9%P#N#(q*!>zC`$o3*>Q%Px4OPsYu82_4?Crd+oi_a{8?){hY)0Cf z`bV}wHgip%;I7cCxuj174oUk&;H}Ru0Y`d3JlMTV@~bJY;87#5!>{NMRW7;CiryUD zVv7fZDKG>fD!+*-hM5Yv3FG2n*WMhjHF=ojt&VZ%TZces?~xFuJi{x3!PwxYSAWE#6(X7k@p)n0J358wWeuU!Mw^rP#Y z%(%Xtww;?5tk2c{!r5o*+uM(GEaPKv8Q^Oq6xFy#Ja%F1d`Kzk`Ap*{0yrudpQWjh zUq^=ikX-OEnI*49Quo~N=rCONp4&{En>OG2Fd;yD=Y1Ca@i_Z0gT&e$R5}I9z&(~6 zL#!tZQ()iw@E+F0iZI;;+-s$&?AYC-QqUn-hk=0uo?1M}33rdgEU3gzt<)BbQI9=9 zAZ`pCgzKuY=L7XpAnZKB;}*WlwtteM+0XbVj~ROBiPrR|n@WM6?6Pj;rrp{G zAGS9+Bsj~FwzJuvw$!FDR`TgfT4g0m_^f~Paid}OaA|s@CQn@=c^dJWW#Y1qw45#f zEV1!x??Cj53$09!UjnU7`J%0?^s~-dWh=YNY7XEo#ZOXeWQdD8k#76B7V{$b z0N4xM^$6l$6ZAy~V$@!2JY(M8oV+n!)9%tHuUEWiSV~dC9Ni#}{djW(o^U}_SLA>~ zP-pX#Y|fXRH1pZ|FRj|xO|03bB&~J{%ia{#oUg;HTDC^D@);xottPkc+XLZu-ega2 zdb=U)ovCEF?B%mr^UbZbD@U+LHWz9W7qjxsu?Fk2uwHPaDr@D@Z{Vs0#*DcyrhJbE zqI%pUxd578zG9tDYr+=LaFeQCOZAZ#%-CSl^3!7TcWjNUuT!Lv}s(m zBU@4*C>56@#4CF4KUj;eTAG4hN2H^HHD!a=D!Waz4?wlJJL9!B$;&U#!#zMtfP5LO z&Ccv#vs&&>UO}Q=i2&9#ly5Y#MPH3eF{^*#qII>B|Fh;t6Yj$}?Ged0g)1?uHd@@S z&>${U!;3KR&8)%J_AQ&fMoMYQ?|oLUW$BOJ7Tut;&hY5h*`Te4gevrp8Q1qPt{d{I zg=pz>Lh17&oVdS#hX2mk)(pHWw0CQ7&63R_Ux#V5sjsrA(l&;WSBZHL-!vZ`YxGum zzf+S;nJ4GB@}%OiAh}k)^a`6;nxGlU3QHOM&B$#z4VPfW@XS{-znjM%-?k}oGAdJ? zxUqptANU$#d@yhSF-zKR(tbaX&D#D8!>W=u5aS2XP9?; zbmS6b%_V`cO6EaD*N5!htTU{`4(z!Guz@?`v4&MBw%47E@Rsl5@yl~z z8*q0Ief%*cu_3>O``xv&=OwZRk2vET82Ef-7R^3ucY5m^n+`Q@HbL=;+XvsYvFx|4hWcwO8rVW$rw$+_;u)M)UU*JxQ>YkT;PRrFu^Wmx*{eG{+P_BixWQHM zH13dH$H`F`Kie2My3FX<9fAFTX%xMWgm;K*{Fk!m=tf-8MXb(3XH7RhA5fChP%Az& zGQ&&Gl>fdkIYwr+7I(NT>UZ#=tXX|l;Vl`w9@3@Pcx&p$PPMXq$%`}wV)4$5xb#V3 zm4(@8Chj7}lsnEIag>iYtqg35&y}E;@aD$@yn<=bT!7uOXnv=c^607^K9+`<)9>#) zGe&_O@o0cSiTh<6HMn7lcdqlpw~|G0>Q?}-;MJVWL)H*;ejct;W`1i8G~xaaok`JI zTm4)7xP_)3FpbPpzo)xsN9#{VhgmS#5qiPf%X#7hrF;+V*f9L{_@;@!6_@yCAJCdy zolDKxon%(=Ih)^bgX}V*s0i6iz{PNr-T%!1_gV<-l;^HScb*L-t=d|YO^k=B{sKde z;stbM^cEEA-ie>wBCmCtYyA*1;MX~Yw|v}*c{2C$H>(xAk53KaxGtAYv;Rb4*I9qL zqTUE{|L=kgQ4pWda_<9uK~1id`WGF&9Y9K?Ht_QZ#}HpwKgn%@*&y>QnKt#rhh;GI z#riVOrwNnp}NYZ*I*ivhnIoz64MXVt@PgU{PxbAsC&lL+|jwd`*6n8sSBrC zml{*^pPFr5U`*{hIL|uA?6?=SU}TPNtJ_pc-)FO^=Sd#KmvOrg!3w&v9?Z8vIGkr= zlwznxU`&!&(GPpXZtG|&-2`o*5X$rafEs$o`}y0clGL0&{RcR6+SS24*&5YLPh+$a z6p$u$%Hz|3)D_#He9tN2A<*3iG$opX2MzH}U09IE&}TGp)5^txE8e5SMM)s-w+P#Z zu*>e$LGAM!^1}q`L?Ea9`SY}`O|jFWrT$L#p;kUrf+?#jDg?Eq1Q0PEAUqAlO&B-m zL|u-WGEkH`<)*FUzvxaA=?WsXm)nk}?X}=Vv@lcYaU2f_J_3)|Uckz>^>0W}QZ)iS zh1P**1@dnK_?YniqO7hM3yb%E)g30p)D@2;7w`X5f1sa7*M~g*Ui&`(xNim|8B0~3 zcpNLlRk9(9%GpyBn%VEeQQL#Y*UGE^Lq@KR>ud78e#N{%yYwPQw(17~&=rM3MHYZb1yOz@{`4p}KKRjWGC_$G{ zlVPv&)EnZZL6{l!BHj4SZ3QZFLu7MuwdXj!wdUz;a{L--ZO?wIXlrj3k2k&OnZ z$JVS`wgQT;KtD+jH7*|ykD*$gL|L&a!1pdR4n|h8(YhEt4zD(3biqoVja?@JaOyD* zE97`L9nYf^B0%fLM;SsZ+dg$+2DxJ59*6(^X)|JTjvjPl8DHVbitB>x++RFxo!NoK z@)Ag9y@Wd=^rE7oA~O=U35*xMK2^Qu2*}@kMWAg09C9&eB&A z(_l5uhB^RPwwr3EyZ-3IdpJOeEzZz3S;Y?Rj z!F7Wh9PECq(CdZ6)wcmZLa4&dim#g9i=uzB;w+v;&3c^ctX5+uHgKOJfxBRdzCv1brSBWX@wvv5c9Yy=SOVzy^Wx^vQKlzCqoEbmI(rTu+br|;@ zf+)5ir`!WxHjb+@JK?+rUauWqZ`D+&$=$sZYqY1meJFKQmVB}bT83+S5I&~<7&4BY za83EIAoX;umA@$_l{SS+u|-=8y}$_lmP!IEv+Bq#eIG^m65mEM8-*~uNBb1F?8;e) zg8uB|8xnItIlr5KNX+g+RbfoD730Afck3YOd?6Hg(R&y=$Wi0Y14P$aj(`n5yjjf7 z?TK%&2|#|71?`=XH5f@xKVJp(Qs&#c(G*l52F&ZoIC^8vn}{)vkzWW`SJ++m%Aci(0P?iq3)7TQfbeKU?2wPbD0aU+< z_5AjUF;>`7ED8o#C@r9vGi^X?4HeU;2a>iByjpwdd;k2o0jAizbua1Y*wJR`9+jw;=-xo4s2jY}RS3unS8cSyRye`VDJs3#gc@@mcJ0wM;DD8!U z_=oLL-7t{M4dQbrqt5==6OnaAROoIwtKpqOimU)P;4>$)&%d8&|8^28$5)^#GIuSF z#5}^D+FWrqaDZcRgF4B|JpuGxrThwSh4{Bt6z8a5^^jwid}V{i7Wn&W&o%YiD}vq` z*L&80AfhZIzkgP5Sbj^m#u9z9vv*im1e@7I7n;w*c_Gn`=VApvXnZY z35*kB5B4Nfp#JEtX@}mpir(;9gUOf~mF~Iyfu(Jte}9OO)R1J-I$mTk{lq=iG4nYqOy*+KX(6w1sU8 zh9Gb%o`}Mt7J+ZRV10-$gA&O%Jj_P`OukoRyzxYv*gykr`35?>dCrL&jeh?q$r<+x zR(uQel#P*><}=l4pJC)B`VDADWXOK%)kovDffiFSDMvj|Ud}PNg9t<}jKzE5u<(C= z`ZsG(iwufcG5alsSQMae0Bjq*orb9eCoJ0JJMgveHGG(22UBOCk%+PAsnZB8ywY=*9>*`mt7h ztsFCpygbXjnLdusH3G-u;8-iW{h+%zkZ>==-VnZr___k-LYSxzn+WXXDg<2+9{|G- zJN(@OX5_8)FMJGv{%KK*J{A^rFz9_2bv8IZw5b0z|I?zTeM}a$2Vqk2{uLtf z?Wl&gJVIhKj*9Y=M|J@xqb8 z4Zyu-^$*wF4!DIa9A&)2Ad}OiMJcB~2igqPr{b6IfFe|UU_-nF`~~WUJP_yN0~UC# zQ)n87H})Y@oW{4=BiEW~k2GW>uce#Ant~1rZ^WnPh|a6%i=F=ol$&t~Vqk?_wwvk` z!ax&s&@1@zl_Ri3ZPb7xUU0a?XD?zcuCLO*GmL$7y`^PRK2Fw(o`(pz#a9>h#Au9r z4+=>0Dn+QMMGlvxK_d^?7peg=LFNmCUIUBu$89oG1UUi*0;mULra zr)-QBdf%JxY9hkNL3~ml2(6>gA6ju0ft!f{z<7BE^5_ff-5cGtZQf-kZZsc6flBC) z?or15{ut`NpuxK~kxu<1kkwRt)EZJ~T>cr@Sn*{O+P7Zzt@G~hLvS>0ED)$Zw-4te zT;@AMSp2@0_O5{Oen8U&-?b>J#>E5VE_&o7Sv41M!F)PX&JB1EvYM}X=P z0^@*U9mcVb+S=5ah0gir7=k*_1|qcyDfmKX{l1WRS6?aKi^G(t+z>3(!cSle=(D2q#Q>ia(?LrsW^}1^!)sTT-4zdA|AV#ix=B>A;s3RF{=rQg zR~)}R=`0y+4H>UoC-{7ozSwH*WH;<^689fNGga5-0}ArXG~<8fhr z9|{aE9dmKqPj~9_Qg{bg>9FNwa?Ro*7*+GV##i?Gy&XkzNb$FIWXaiM{oNhLu@m`R zF1uz^8DxZ6LVW)T7}sH?s>k{D2*0vnyEztp;x?g!UMxp>41AD)1I4Rq2z7vukY9|! zfk{PhGlF4v@L*iFmTP!#R)-=KO*)!-D6ZqDxdo;E63xR6*hI9#Xz__JWEP`tK;8fS zatD3U{qp&>)wqdz3OB4YRCP!b z{qUZ0Wj1Q&j^*j=z3{uyj1ND;Va^=fT7Ej)-}Oz32aP5?4Di(XU94WcUxjL*_2R{o zdv#JQKUhWhn~C*Ne|75|C(-)QAwP7;ik79r4W^g4M)EmAnOGJTUg}B>TU5+cZ=ZIXcA`%kwn#!|w^DOW`T2<7HH&AM6qGNg>)w{bmP@q|*`t&PQ9q}UW7Cb>(roQW-7aLCS;~-PGxoO%xzraU zr=9YldS)SqKl11=$COqh!#JUs+7+%!u-3<;zCzA);X|awL4wfF31-A^7IK_RvrzN23kT$YkjFdaGI_ld?G+TV?D@bbo5r6* ziG4!xgfIG_@%^@5XaOO|2cu6Ie|-sZwU8yNlq+ehsF6#^`X`KKrU`Fjf2WYMtV*s@ z%vD z{g5B=nY;x$gZe%C5<4=uBxGin3M8!^1!@y=f={r8G|WION(!uwsR_X->p!L?yKW-4ef zZEBl?H9H2kI=o#C%~rg*v%sc8MEFzbj$ZSJg4RL{e~WO#J!j&U!W?{3gkSsg{I!F= zWXrgrVsPQ7o~gv^`A$9F3y&`ce<`$>AI)DAG_){vKhzY{&12qIcS6I>c}!WfU0Cx0 z&PU9rrqMd$ioM}FU(vWOr8O$YasMKg|1s5wc0^3fe{5zgs)3{y!?9$(gz+c?%@r2N;yt?lo&IKu+$Q#K4z_7tAX**5H_tbH!4Y}BF0y* z@&+!6jz;Z2y1B{kRek~yQ*9fS8=261l}(UCKCHV4clVvL)FOSmG*9}%-R|u^uJ&%| z9`Mt?EIaxD{9-$7f2!U0n?g24j^3CqzGPsj2<(Ilbp$4a>JV!)?F(J_?^8gU-~e6S3uUXVbSeAlt!ms&JH}IWp;U|FR)I_ zW@hx<|G+6TzP9-!kF*VgQ0I1G5WlLN_XoPPY@bIw+rj118M41(=N5HjQWV}1UfCwh zV0S)xi5V+i^G4&?G+GWngTkCVeh4#=LBXQ7y1jVcR{+iecUuUj8_XujN|(ERyneEWfxsytP=rHEQJf z<#GAtjmj424RBb*!wm|o&nWctMx|1SYAJ+!ikTe^E7Ia9*$sIbDGXL`;J}SAh@j!D#ecl^|lJxA7%GIj}*5~cQ?`4%s zCag}b&-3DU)vA?M{EY=Z*u+bMg-Tj(e_uD-4TsN$6Xj7ni;vCR8Sn!GOU*R&?)=sl zsME0tG3Rh7A|A?h#Z6~*Ox4RHpALlLShj4lHeHTm&+DR=RMwhvmNnT@SSvHETJ*w_ z#j9UjlC!LGRpqMOroZ=NBjot$Gs^NO6iG9R%1WgfrOv{MW&V6aqQ_v8-b=9aI!ixF zjIiS|xksN&;XU&I;#o@PsmJ!4_K56xG~>q;Jp5QeB-*j^kp%wR{yph={&V~+zW={! zKAAFXeJtZQ0}G7IRQ{orI8^q|eNJc&ENAi5vjZ^d$%!uJzA~B0NikMHFOmq^{NfZDQpt&~9cKfvj{kB!0eBEKQZlq{#@JUp%#Ja$aC+IvW%m`A1QCD8pQ4@gCsaF>e*ab_-$vB^$}eamVa3744*$w^t26) z#Ql=kMbr+9=#z*&=~+phLYzx{fw+OVgZOh|h}cTJ5Fyq9lS0agWY~vjCgu|D#1i5> zVh!;%;y&V0;%CI`L@j?ji!DVE$9*^{3W@WGYl-4}QP|-OGMly;gW)jB{ClO~8D~TJ3uM&5FqTlZ)#ZlsU z;#b56#9rLvIJQjUXksz3oVbu!OT>B}vELqIhzO-k1neGa7u-wSofDDUM?~n8*v~MM zi;dOA)oCSzHsBe_k^(ENEH<#t%9aK$S=oX>!ARx`yfc!m3#8?;`lfesnLhgaF8+NN Tm;R4kyvbX@*2MaQtj|9I{o`CT delta 33046 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

5vGK}&N>vpt-1V6)||gb(`9E?IWf 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

3B;n>~nEaFY#(g%F=D8dgVo(=PKHR?r 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 indices = res->indices; diff --git a/examples/auto-launch-gdb-on-crash.c b/examples/auto-launch-gdb-on-crash.c index 734b870ef..24b18c57e 100644 --- a/examples/auto-launch-gdb-on-crash.c +++ b/examples/auto-launch-gdb-on-crash.c @@ -18,9 +18,12 @@ * make -j12 o//examples/auto-launch-gdb-on-crash.com * o//examples/auto-launch-gdb-on-crash.com * - * Backtrace is logged instead if run outside interactive terminal. - * Environmental factors such as GDB, MAKEFLAGS, ADDR2LINE, TERM, and - * isatty(STDERR_FILENO) should also be taken into consideration: + * Backtrace is logged instead if run outside interactive terminal. We + * also don't auto-launch GDB on non-Linux since the development tools + * on other platforms generally can't be relied upon to correctly debug + * binaries built with a Linux toolchain. Environmental factors such as + * GDB, MAKEFLAGS, ADDR2LINE, TERM, and isatty(STDERR_FILENO) should + * also be taken into consideration: * * $ export GDB=eoatuhshtuone * $ o//examples/auto-launch-gdb-on-crash.com diff --git a/examples/curl.c b/examples/curl.c index 1fb7e8e69..82d2f5ab8 100644 --- a/examples/curl.c +++ b/examples/curl.c @@ -65,11 +65,26 @@ #define HeaderEqualCase(H, S) \ SlicesEqualCase(S, strlen(S), HeaderData(H), HeaderLength(H)) +int sock; + static bool TuneSocket(int fd, int a, int b, int x) { if (!b) return false; return setsockopt(fd, a, b, &x, sizeof(x)) != -1; } +static void Write(const void *p, size_t n) { + ssize_t rc; + rc = write(1, p, n); + if (rc == -1 && errno == EPIPE) { + close(sock); + exit(128 + SIGPIPE); + } + if (rc != n) { + fprintf(stderr, "write failed: %m\n"); + exit(1); + } +} + static int TlsSend(void *c, const unsigned char *p, size_t n) { int rc; NOISEF("begin send %zu", n); @@ -107,7 +122,6 @@ static wontreturn void PrintUsage(FILE *f, int rc) { int main(int argc, char *argv[]) { if (!NoDebug()) showcrashreports(); - xsigaction(SIGPIPE, SIG_IGN, 0, 0, 0); /* * Read flags. @@ -258,7 +272,7 @@ int main(int argc, char *argv[]) { /* * Connect to server. */ - int ret, sock; + int ret; CHECK_NE(-1, (sock = GoodSocket(addr->ai_family, addr->ai_socktype, addr->ai_protocol, false, &(struct timeval){-60}))); @@ -283,6 +297,8 @@ int main(int argc, char *argv[]) { CHECK_EQ(n, write(sock, request, n)); } + xsigaction(SIGPIPE, SIG_IGN, 0, 0, 0); + /* * Handle response. */ @@ -330,7 +346,7 @@ int main(int argc, char *argv[]) { break; } if (method == kHttpHead) { - CHECK_EQ(hdrlen, write(1, p, hdrlen)); + Write(p, hdrlen); goto Finished; } else if (msg.status == 204 || msg.status == 304) { goto Finished; @@ -348,32 +364,32 @@ int main(int argc, char *argv[]) { t = kHttpClientStateBodyLengthed; paylen = rc; if (paylen > i - hdrlen) { - CHECK_EQ(i - hdrlen, write(1, p + hdrlen, i - hdrlen)); + Write(p + hdrlen, i - hdrlen); } else { - CHECK_EQ(paylen, write(1, p + hdrlen, paylen)); + Write(p + hdrlen, paylen); goto Finished; } } else { t = kHttpClientStateBody; - CHECK_EQ(i - hdrlen, write(1, p + hdrlen, i - hdrlen)); + Write(p + hdrlen, i - hdrlen); } } break; case kHttpClientStateBody: if (!g) goto Finished; - CHECK_EQ(g, write(1, p + i - g, g)); + Write(p + i - g, g); break; case kHttpClientStateBodyLengthed: CHECK(g); if (i - hdrlen > paylen) g = hdrlen + paylen - (i - g); - CHECK_EQ(g, write(1, p + i - g, g)); + Write(p + i - g, g); if (i - hdrlen >= paylen) goto Finished; break; case kHttpClientStateBodyChunked: Chunked: CHECK_NE(-1, (rc = Unchunk(&u, p + hdrlen, i - hdrlen, &paylen))); if (rc) { - CHECK_EQ(paylen, write(1, p + hdrlen, paylen)); + Write(p + hdrlen, paylen); goto Finished; } break; diff --git a/examples/datauri.c b/examples/datauri.c new file mode 100644 index 000000000..6758d063f --- /dev/null +++ b/examples/datauri.c @@ -0,0 +1,63 @@ +#if 0 +/*─────────────────────────────────────────────────────────────────╗ +│ To the extent possible under law, Justine Tunney has waived │ +│ all copyright and related or neighboring rights to this file, │ +│ as it is written in the following disclaimers: │ +│ • http://unlicense.org/ │ +│ • http://creativecommons.org/publicdomain/zero/1.0/ │ +╚─────────────────────────────────────────────────────────────────*/ +#endif +#include "libc/log/log.h" +#include "libc/runtime/gc.internal.h" +#include "libc/stdio/stdio.h" +#include "libc/x/x.h" +#include "net/http/escape.h" +#include "net/http/http.h" +#include "third_party/getopt/getopt.h" +#include "third_party/stb/stb_image.h" + +#define USAGE \ + " [FLAGS] FILE...\n\ +Utility for printing data:base64 URIs.\n\ +\n\ +FLAGS\n\ +\n\ + -h Help\n" + +void PrintUsage(int rc, FILE *f) { + fputs("Usage: ", f); + fputs(program_invocation_name, f); + fputs(USAGE, f); + exit(rc); +} + +void PrintUri(const char *path) { + size_t n; + void *img, *src, *mime; + int opt, i; + if (!(img = gc(xslurp(path, &n)))) exit(2); + fputs("data:", stdout); + fputs(FindContentType(path, -1), stdout); + fputs(";base64,", stdout); + fputs(gc(EncodeBase64(img, n, 0)), stdout); +} + +int main(int argc, char *argv[]) { + showcrashreports(); + int i; + while ((i = getopt(argc, argv, "?h")) != -1) { + switch (i) { + case '?': + case 'h': + PrintUsage(0, stdout); + default: + PrintUsage(1, stderr); + } + } + if (optind == argc) { + PrintUsage(1, stderr); + } + for (i = optind; i < argc; ++i) { + PrintUri(argv[i]); + } +} diff --git a/examples/forkexec.c b/examples/forkexec.c new file mode 100644 index 000000000..418e16485 --- /dev/null +++ b/examples/forkexec.c @@ -0,0 +1,23 @@ +#if 0 +/*─────────────────────────────────────────────────────────────────╗ +│ To the extent possible under law, Justine Tunney has waived │ +│ all copyright and related or neighboring rights to this file, │ +│ as it is written in the following disclaimers: │ +│ • http://unlicense.org/ │ +│ • http://creativecommons.org/publicdomain/zero/1.0/ │ +╚─────────────────────────────────────────────────────────────────*/ +#endif +#include "libc/calls/calls.h" +#include "libc/stdio/stdio.h" + +int main(int argc, char *argv[]) { + int pid; + if (argc < 3) { + fputs("USAGE: FORKEXEC.COM PROG ARGV₀ [ARGV₁...]\n", stderr); + return 1; + } + if (!fork()) { + execv(argv[1], argv + 2); + return 127; + } +} diff --git a/examples/forkexecwait.c b/examples/forkexecwait.c new file mode 100644 index 000000000..eca2b20cd --- /dev/null +++ b/examples/forkexecwait.c @@ -0,0 +1,25 @@ +#if 0 +/*─────────────────────────────────────────────────────────────────╗ +│ To the extent possible under law, Justine Tunney has waived │ +│ all copyright and related or neighboring rights to this file, │ +│ as it is written in the following disclaimers: │ +│ • http://unlicense.org/ │ +│ • http://creativecommons.org/publicdomain/zero/1.0/ │ +╚─────────────────────────────────────────────────────────────────*/ +#endif +#include "libc/calls/calls.h" +#include "libc/stdio/stdio.h" + +int main(int argc, char *argv[]) { + int pid; + volatile void *p; + if (argc < 3) { + fputs("USAGE: FORKEXECWAIT.COM PROG ARGV₀ [ARGV₁...]\n", stderr); + return 1; + } + if (!fork()) { + execv(argv[1], argv + 2); + return 127; + } + wait(0); +} diff --git a/examples/img.c b/examples/img.c index bfb21a4d7..34d4a840f 100644 --- a/examples/img.c +++ b/examples/img.c @@ -7,23 +7,97 @@ │ • http://creativecommons.org/publicdomain/zero/1.0/ │ ╚─────────────────────────────────────────────────────────────────*/ #endif +#include "libc/log/log.h" +#include "libc/runtime/gc.internal.h" #include "libc/stdio/stdio.h" #include "libc/x/x.h" +#include "net/http/escape.h" +#include "net/http/http.h" +#include "third_party/getopt/getopt.h" #include "third_party/stb/stb_image.h" -/** - * @fileoverview Utility for printing HTML tags. - */ +#define USAGE \ + " [FLAGS] IMG...\n\ +Utility for printing HTML tags.\n\ +\n\ +FLAGS\n\ +\n\ + -h Help\n\ + -a Wrap with tag\n\ + -u Embed data:base64 URI\n" + +int scale; +bool linktag; +bool datauri; +bool sizeonly; + +void PrintUsage(int rc, FILE *f) { + fputs("Usage: ", f); + fputs(program_invocation_name, f); + fputs(USAGE, f); + exit(rc); +} + +void PrintImg(const char *path) { + size_t n; + int opt, i, yn, xn, cn, w, h; + void *img, *pix, *src, *mime; + if (!(img = gc(xslurp(path, &n)))) exit(2); + if (!(pix = gc(stbi_load_from_memory(img, n, &xn, &yn, &cn, 0)))) exit(3); + if (linktag) { + printf("", path); + } + src = path; + if (datauri) { + src = xasprintf("data:%s;base64,%s", FindContentType(path, -1), + gc(EncodeBase64(img, n, &n))); + } + w = (xn + (1 << scale) / 2) >> scale; + h = (yn + (1 << scale) / 2) >> scale; + if (sizeonly) { + printf("width=\"%d\" height=\"%d\"", w, h); + } else { + printf("\"[%s]\"\n", w, + h, path, src); + } + if (linktag) { + printf(""); + } + printf("\n"); +} int main(int argc, char *argv[]) { - void *p; - size_t n; - int yn, xn, cn; - if (argc != 2) return 1; - if (!(p = xslurp(argv[1], &n))) return 2; - if (!(p = stbi_load_from_memory(p, n, &xn, &yn, &cn, 0))) return 3; - printf("\"[%s]\"\n", - argv[1], (xn + 1) >> 1, (yn + 1) >> 1, argv[1]); - return 0; + showcrashreports(); + int i; + while ((i = getopt(argc, argv, "?huas01234")) != -1) { + switch (i) { + case '0': + case '1': + case '2': + case '3': + case '4': + scale = i - '0'; + break; + case 's': + sizeonly = true; + break; + case 'a': + linktag = true; + break; + case 'u': + datauri = true; + break; + case '?': + case 'h': + PrintUsage(0, stdout); + default: + PrintUsage(1, stderr); + } + } + if (optind == argc) { + PrintUsage(1, stderr); + } + for (i = optind; i < argc; ++i) { + PrintImg(argv[i]); + } } diff --git a/examples/nesemu1.cc b/examples/nesemu1.cc index 274973066..e0dc738dc 100644 --- a/examples/nesemu1.cc +++ b/examples/nesemu1.cc @@ -1703,7 +1703,7 @@ int PlayGame(const char* romfile, const char* opt_tasfile) { if ((ffplay = commandvenv("FFPLAY", "ffplay"))) { devnull = open("/dev/null", O_WRONLY | O_CLOEXEC); pipe2(pipefds, O_CLOEXEC); - if (!(playpid_ = vfork())) { + if (!(playpid_ = fork())) { const char* const args[] = { "ffplay", "-nodisp", "-loglevel", "quiet", "-fflags", "nobuffer", "-ac", "1", "-ar", "1789773", diff --git a/examples/printargs.c b/examples/printargs.c index 7c9a13ffc..b81f8efc7 100644 --- a/examples/printargs.c +++ b/examples/printargs.c @@ -8,10 +8,14 @@ ╚─────────────────────────────────────────────────────────────────*/ #endif #include "libc/calls/calls.h" +#include "libc/intrin/kprintf.h" #include "libc/log/log.h" #include "libc/macros.internal.h" +#include "libc/mem/mem.h" #include "libc/nt/process.h" +#include "libc/runtime/gc.h" #include "libc/runtime/runtime.h" +#include "libc/runtime/stack.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/sysv/consts/auxv.h" @@ -22,44 +26,53 @@ const struct AuxiliaryValue { const char *name; const char *description; } kAuxiliaryValues[] = { - {"%012lx", &AT_EXECFD, "AT_EXECFD", "file descriptor of program"}, - {"%012lx", &AT_PHDR, "AT_PHDR", "address of elf program headers"}, - {"%012lx", &AT_PHENT, "AT_PHENT", "size of program header entry"}, - {"%012lx", &AT_PHNUM, "AT_PHNUM", "number of program headers"}, - {"%012lx", &AT_PAGESZ, "AT_PAGESZ", "system page size"}, - {"%012lx", &AT_BASE, "AT_BASE", "base address of the program interpreter"}, - {"%012lx", &AT_ENTRY, "AT_ENTRY", "entry address of executable"}, - {"%012lx", &AT_NOTELF, "AT_NOTELF", "set if not an elf"}, - {"%-12d", &AT_UID, "AT_UID", "real user id of thread"}, - {"%-12d", &AT_EUID, "AT_EUID", "effective user id of thread"}, - {"%-12d", &AT_GID, "AT_GID", "real group id of thread"}, - {"%-12d", &AT_EGID, "AT_EGID", "effective group id of thread"}, - {"%-12d", &AT_CLKTCK, "AT_CLKTCK", "frequency of times() counts"}, - {"%012lx", &AT_OSRELDATE, "AT_OSRELDATE", + {"%-14p", &AT_EXECFD, "AT_EXECFD", "file descriptor of program"}, + {"%-14p", &AT_PHDR, "AT_PHDR", "address of elf program headers"}, + {"%-14p", &AT_PHENT, "AT_PHENT", "size of program header entry"}, + {"%-14p", &AT_PHNUM, "AT_PHNUM", "number of program headers"}, + {"%-14p", &AT_PAGESZ, "AT_PAGESZ", "system page size"}, + {"%-14p", &AT_BASE, "AT_BASE", "base address of the program interpreter"}, + {"%-14p", &AT_ENTRY, "AT_ENTRY", "entry address of executable"}, + {"%-14p", &AT_NOTELF, "AT_NOTELF", "set if not an elf"}, + {"%-14d", &AT_UID, "AT_UID", "real user id of thread"}, + {"%-14d", &AT_EUID, "AT_EUID", "effective user id of thread"}, + {"%-14d", &AT_GID, "AT_GID", "real group id of thread"}, + {"%-14d", &AT_EGID, "AT_EGID", "effective group id of thread"}, + {"%-14d", &AT_CLKTCK, "AT_CLKTCK", "frequency of times() counts"}, + {"%-14d", &AT_OSRELDATE, "AT_OSRELDATE", "freebsd release number, e.g. 1200086"}, - {"%012lx", &AT_PLATFORM, "AT_PLATFORM", + {"%-14p", &AT_PLATFORM, "AT_PLATFORM", "string identifying hardware platform"}, - {"%012lx", &AT_DCACHEBSIZE, "AT_DCACHEBSIZE", "data cache block size"}, - {"%012lx", &AT_ICACHEBSIZE, "AT_ICACHEBSIZE", + {"%-14p", &AT_DCACHEBSIZE, "AT_DCACHEBSIZE", "data cache block size"}, + {"%-14p", &AT_ICACHEBSIZE, "AT_ICACHEBSIZE", "instruction cache block size"}, - {"%012lx", &AT_UCACHEBSIZE, "AT_UCACHEBSIZE", "unified cache block size"}, - {"%012lx", &AT_SECURE, "AT_SECURE", + {"%-14p", &AT_UCACHEBSIZE, "AT_UCACHEBSIZE", "unified cache block size"}, + {"%-14p", &AT_SECURE, "AT_SECURE", "for set{u,g}id binz & security blankets"}, - {"%-12s", &AT_BASE_PLATFORM, "AT_BASE_PLATFORM", + {"%-14s", &AT_BASE_PLATFORM, "AT_BASE_PLATFORM", "string identifying real platform"}, - {"%012lx", &AT_RANDOM, "AT_RANDOM", "address of sixteen random bytes"}, - {"%-12s", &AT_EXECFN, "AT_EXECFN", "pathname used to execute program"}, - {"%012lx", &AT_SYSINFO_EHDR, "AT_SYSINFO_EHDR", + {"%-14p", &AT_RANDOM, "AT_RANDOM", "address of sixteen random bytes"}, + {"%-14s (%p)", &AT_EXECFN, "AT_EXECFN", "pathname used to execute program"}, + {"%-14p", &AT_SYSINFO_EHDR, "AT_SYSINFO_EHDR", "linux virtual dso page address"}, - {"%012lx", &AT_FLAGS, "AT_FLAGS", "unused?"}, - {"%012lx", &AT_HWCAP, "AT_HWCAP", "cpu stuff"}, - {"%012lx", &AT_HWCAP2, "AT_HWCAP2", "more cpu stuff"}, + {"%-14p", &AT_FLAGS, "AT_FLAGS", "unused?"}, + {"%-14p", &AT_HWCAP, "AT_HWCAP", "cpu stuff"}, + {"%-14p", &AT_HWCAP2, "AT_HWCAP2", "more cpu stuff"}, + {"%-14p", &AT_STACKBASE, "AT_STACKBASE", "NetBSD stack base"}, + {"%-14p", &AT_CANARY, "AT_CANARY", "FreeBSD AT_CANARY"}, + {"%-14p", &AT_CANARYLEN, "AT_CANARYLEN", "FreeBSD AT_CANARYLEN"}, + {"%-14ld", &AT_NCPUS, "AT_NCPUS", "FreeBSD AT_NCPUS"}, + {"%-14p", &AT_PAGESIZES, "AT_PAGESIZES", "FreeBSD AT_PAGESIZES"}, + {"%-14d", &AT_PAGESIZESLEN, "AT_PAGESIZESLEN", "FreeBSD AT_PAGESIZESLEN"}, + {"%-14p", &AT_TIMEKEEP, "AT_TIMEKEEP", "FreeBSD AT_TIMEKEEP"}, + {"%-14p", &AT_STACKPROT, "AT_STACKPROT", "FreeBSD AT_STACKPROT"}, + {"%-14p", &AT_EHDRFLAGS, "AT_EHDRFLAGS", "FreeBSD AT_EHDRFLAGS"}, }; const struct AuxiliaryValue *DescribeAuxv(unsigned long x) { int i; for (i = 0; i < ARRAYLEN(kAuxiliaryValues); ++i) { - if (x == *kAuxiliaryValues[i].id) { + if (*kAuxiliaryValues[i].id && x == *kAuxiliaryValues[i].id) { return kAuxiliaryValues + i; } } @@ -68,33 +81,41 @@ const struct AuxiliaryValue *DescribeAuxv(unsigned long x) { int main(int argc, char *argv[], char **envp) { long key; + char **env; unsigned i; unsigned long *auxp; - char fmt[64], **env; struct AuxiliaryValue *auxinfo; uint32_t varlen; char16_t var[PATH_MAX]; - printf("\nArguments:\n"); + kprintf("%nArguments:%n"); for (i = 0; i < __argc; ++i) { - printf(" ☼ %s\n", argv[i]); + kprintf(" ☼ %s%n", argv[i]); } - printf("\nEnvironment:\n"); + kprintf("%nEnvironment:%n"); for (env = envp; *env; ++env) { - printf(" ☼ %s\n", *env); + kprintf(" ☼ %s%n", *env); } - printf("\nAuxiliary Values:\n"); + kprintf("%nAuxiliary Values:%n"); for (auxp = __auxv; *auxp; auxp += 2) { if ((auxinfo = DescribeAuxv(auxp[0]))) { - stpcpy(stpcpy(stpcpy(fmt, "%16s[%4ld] = "), auxinfo->fmt), " # %s\n"); - printf(fmt, auxinfo->name, auxp[0], auxp[1], auxinfo->description); + kprintf(" ☼ %16s[%4ld] = ", auxinfo->name, auxp[0]); + kprintf(auxinfo->fmt, auxp[1], auxp[1]); + kprintf(" # %s%n", auxinfo->description); } else { - printf("%16s[%4ld] = %012lx\n", "unknown", auxp[0], auxp[1]); + kprintf(" ☼ %16s[%4ld] = %014p%n", "unknown", auxp[0], auxp[1]); } } - printf("\nSpecial Directories:\n"); - printf(" ☼ kTmpPath = %`'s\n", kTmpPath); - printf(" ☼ kNtSystemDirectory = %`'s\n", kNtSystemDirectory); - printf(" ☼ kNtWindowsDirectory = %`'s\n", kNtWindowsDirectory); - printf(" ☼ program_executable_name = %`'s\n", program_executable_name); + kprintf("%nSpecial Parameters:%n"); + kprintf(" ☼ kTmpPath = %#s%n", kTmpPath); + kprintf(" ☼ kNtSystemDirectory = %#s%n", kNtSystemDirectory); + kprintf(" ☼ kNtWindowsDirectory = %#s%n", kNtWindowsDirectory); + kprintf(" ☼ program_executable_name = %#s (%p)%n", program_executable_name, + program_executable_name); + kprintf(" ☼ GetInterpreterExecutableName() → %#s%n", + GetInterpreterExecutableName(_gc(malloc(1024)), 1024)); + kprintf(" ☼ RSP → %p%n", __builtin_frame_address(0)); + kprintf(" ☼ GetStackAddr() → %p%n", GetStackAddr(0)); + kprintf(" ☼ GetStaticStackAddr() → %p%n", GetStaticStackAddr(0)); + kprintf(" ☼ GetStackSize() → %p%n", GetStackSize()); return 0; } diff --git a/examples/rusage.c b/examples/rusage.c index 2112c184a..969bba592 100644 --- a/examples/rusage.c +++ b/examples/rusage.c @@ -101,7 +101,7 @@ int main(int argc, char *argv[]) { sigaddset(&chldmask, SIGCHLD); sigprocmask(SIG_BLOCK, &chldmask, &savemask); ts1 = nowl(); - CHECK_NE(-1, (pid = vfork())); + CHECK_NE(-1, (pid = fork())); if (!pid) { sigaction(SIGINT, &dflt, 0); sigaction(SIGQUIT, &dflt, 0); diff --git a/examples/ttyinfo.c b/examples/ttyinfo.c index f6a2e3341..575e964dc 100644 --- a/examples/ttyinfo.c +++ b/examples/ttyinfo.c @@ -27,6 +27,7 @@ #include "libc/x/x.h" #define CTRL(C) ((C) ^ 0b01000000) +#define WRITE(FD, SLIT) write(FD, SLIT, strlen(SLIT)) #define ENABLE_SAFE_PASTE "\e[?2004h" #define ENABLE_MOUSE_TRACKING "\e[?1000;1002;1015;1006h" #define DISABLE_MOUSE_TRACKING "\e[?1000;1002;1015;1006l" @@ -46,7 +47,7 @@ void onkilled(int sig) { } void restoretty(void) { - write(1, DISABLE_MOUSE_TRACKING, strlen(DISABLE_MOUSE_TRACKING)); + WRITE(1, DISABLE_MOUSE_TRACKING); ioctl(1, TCSETS, &oldterm); } @@ -72,9 +73,9 @@ int rawmode(void) { t.c_cflag |= CS8; t.c_iflag |= IUTF8; ioctl(1, TCSETS, &t); - write(1, ENABLE_SAFE_PASTE, strlen(ENABLE_SAFE_PASTE)); - write(1, ENABLE_MOUSE_TRACKING, strlen(ENABLE_MOUSE_TRACKING)); - write(1, PROBE_DISPLAY_SIZE, strlen(PROBE_DISPLAY_SIZE)); + WRITE(1, ENABLE_SAFE_PASTE); + WRITE(1, ENABLE_MOUSE_TRACKING); + WRITE(1, PROBE_DISPLAY_SIZE); return 0; } diff --git a/libc/alg/bisect.internal.h b/libc/alg/bisect.internal.h index 0616a859d..1d97a9a62 100644 --- a/libc/alg/bisect.internal.h +++ b/libc/alg/bisect.internal.h @@ -14,7 +14,7 @@ forceinline void *bisect(const void *k, const void *data, size_t n, size_t size, r = n - 1; p = data; while (l <= r) { - m = (l + r) >> 1; + m = (l & r) + ((l ^ r) >> 1); c = cmp(k, p + m * size, arg); if (c > 0) { l = m + 1; diff --git a/libc/calls/addtimespec.c b/libc/calls/addtimespec.c index 94b8e1bfe..889a64484 100644 --- a/libc/calls/addtimespec.c +++ b/libc/calls/addtimespec.c @@ -19,7 +19,7 @@ #include "libc/calls/math.h" /** - * Adds two microsecond timestamps. + * Adds two nanosecond timestamps. */ struct timespec AddTimespec(struct timespec x, struct timespec y) { x.tv_sec += y.tv_sec; diff --git a/libc/calls/clock_gettime.c b/libc/calls/clock_gettime.c index 7b5ef8e39..e6936c511 100644 --- a/libc/calls/clock_gettime.c +++ b/libc/calls/clock_gettime.c @@ -40,13 +40,18 @@ * @asyncsignalsafe */ int clock_gettime(int clockid, struct timespec *ts) { - int rc; + int rc, e; axdx_t ad; - if (!ts) return efault(); - if (IsAsan() && !__asan_is_valid(ts, sizeof(*ts))) return efault(); - if (clockid == -1) return einval(); - if (!IsWindows()) { - if ((rc = sys_clock_gettime(clockid, ts)) == -1 && errno == ENOSYS) { + if (!ts) { + rc = efault(); + } else if (IsAsan() && !__asan_is_valid(ts, sizeof(*ts))) { + rc = efault(); + } else if (clockid == -1) { + rc = einval(); + } else if (!IsWindows()) { + e = errno; + if ((rc = sys_clock_gettime(clockid, ts))) { + errno = e; ad = sys_gettimeofday((struct timeval *)ts, NULL, NULL); assert(ad.ax != -1); if (SupportsXnu() && ad.ax) { @@ -56,8 +61,9 @@ int clock_gettime(int clockid, struct timespec *ts) { ts->tv_nsec *= 1000; rc = 0; } - return rc; } else { - return sys_clock_gettime_nt(clockid, ts); + rc = sys_clock_gettime_nt(clockid, ts); } + /* TODO(jart): Add get_clock_gettime() so we can STRACE() */ + return rc; } diff --git a/libc/calls/commandv.c b/libc/calls/commandv.c index ced97a9b1..fde8e689a 100644 --- a/libc/calls/commandv.c +++ b/libc/calls/commandv.c @@ -16,60 +16,69 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/bits/bits.h" #include "libc/bits/safemacros.internal.h" #include "libc/calls/calls.h" +#include "libc/calls/sysdebug.internal.h" +#include "libc/dce.h" +#include "libc/errno.h" #include "libc/log/libfatal.internal.h" #include "libc/runtime/runtime.h" #include "libc/str/str.h" +#include "libc/sysv/consts/ok.h" #include "libc/sysv/errfuns.h" -static noasan bool EndsWithIgnoreCase(const char *p, size_t n, const char *s) { - size_t i, m; - m = __strlen(s); - if (n >= m) { - for (i = n - m; i < n; ++i) { - if (kToLower[p[i] & 255] != (*s++ & 255)) { - return false; - } - } - return true; - } else { - return false; - } +static noasan bool IsExePath(const char *s, size_t n) { + return n >= 4 && (READ32LE(s + n - 4) == READ32LE(".exe") || + READ32LE(s + n - 4) == READ32LE(".EXE")); +} + +static noasan bool IsComPath(const char *s, size_t n) { + return n >= 4 && (READ32LE(s + n - 4) == READ32LE(".com") || + READ32LE(s + n - 4) == READ32LE(".COM")); +} + +static noasan bool IsComDbgPath(const char *s, size_t n) { + return n >= 8 && (READ64LE(s + n - 8) == READ64LE(".com.dbg") || + READ64LE(s + n - 8) == READ64LE(".COM.DBG")); } static noasan bool AccessCommand(const char *name, char path[hasatleast PATH_MAX], size_t namelen, - const char *suffix, size_t pathlen) { + int *err, const char *suffix, size_t pathlen) { size_t suffixlen; - suffixlen = __strlen(suffix); - if (pathlen + 1 + namelen + suffixlen + 1 > PATH_MAX) return -1; + suffixlen = strlen(suffix); + if (pathlen + 1 + namelen + suffixlen + 1 > PATH_MAX) return false; if (pathlen && (path[pathlen - 1] != '/' && path[pathlen - 1] != '\\')) { - path[pathlen] = !IsWindows() ? '/' - : __memchr(path, '\\', pathlen) ? '\\' - : '/'; + path[pathlen] = !IsWindows() ? '/' + : memchr(path, '\\', pathlen) ? '\\' + : '/'; pathlen++; } - __repmovsb(path + pathlen, name, namelen); - __repmovsb(path + pathlen + namelen, suffix, suffixlen + 1); - return isexecutable(path); + memcpy(path + pathlen, name, namelen); + memcpy(path + pathlen + namelen, suffix, suffixlen + 1); + if (!access(path, X_OK)) return true; + if (errno == EACCES || *err != EACCES) *err = errno; + return false; } static noasan bool SearchPath(const char *name, char path[hasatleast PATH_MAX], - size_t namelen, const char *suffix) { + size_t namelen, int *err, const char *suffix) { + char sep; size_t i; const char *p; - p = firstnonnull(emptytonull(getenv("PATH")), "/bin:/usr/local/bin:/usr/bin"); + if (!(p = getenv("PATH"))) p = "/bin:/usr/local/bin:/usr/bin"; + sep = IsWindows() && strchr(p, ';') ? ';' : ':'; for (;;) { - for (i = 0; p[i] && p[i] != ':' && p[i] != ';'; ++i) { + for (i = 0; p[i] && p[i] != sep; ++i) { if (i < PATH_MAX) { path[i] = p[i]; } } - if (AccessCommand(name, path, namelen, suffix, i)) { + if (AccessCommand(name, path, namelen, err, suffix, i)) { return true; } - if (p[i] == ':' || p[i] == ';') { + if (p[i] == sep) { p += i + 1; } else { break; @@ -80,19 +89,37 @@ static noasan bool SearchPath(const char *name, char path[hasatleast PATH_MAX], static noasan bool FindCommand(const char *name, char pathbuf[hasatleast PATH_MAX], - size_t namelen, const char *suffix) { - if (memchr(name, '/', namelen) || memchr(name, '\\', namelen)) { + size_t namelen, bool priorityonly, + const char *suffix, int *err) { + if (priorityonly && + (memchr(name, '/', namelen) || memchr(name, '\\', namelen))) { pathbuf[0] = 0; - return AccessCommand(name, pathbuf, namelen, suffix, 0); + return AccessCommand(name, pathbuf, namelen, err, suffix, 0); } - return ((IsWindows() && - (AccessCommand(name, pathbuf, namelen, suffix, - stpcpy(pathbuf, kNtSystemDirectory) - pathbuf) || - AccessCommand(name, pathbuf, namelen, suffix, - stpcpy(pathbuf, kNtWindowsDirectory) - pathbuf) || - AccessCommand(name, pathbuf, namelen, suffix, - stpcpy(pathbuf, ".") - pathbuf))) || - SearchPath(name, pathbuf, namelen, suffix)); + if (IsWindows() && priorityonly) { + return AccessCommand(name, pathbuf, namelen, err, suffix, + stpcpy(pathbuf, kNtSystemDirectory) - pathbuf) || + AccessCommand(name, pathbuf, namelen, err, suffix, + stpcpy(pathbuf, kNtWindowsDirectory) - pathbuf); + } + return (IsWindows() && AccessCommand(name, pathbuf, namelen, err, suffix, + stpcpy(pathbuf, ".") - pathbuf)) || + SearchPath(name, pathbuf, namelen, err, suffix); +} + +static noasan bool FindVerbatim(const char *name, + char pathbuf[hasatleast PATH_MAX], + size_t namelen, bool priorityonly, int *err) { + return FindCommand(name, pathbuf, namelen, priorityonly, "", err); +} + +static noasan bool FindSuffixed(const char *name, + char pathbuf[hasatleast PATH_MAX], + size_t namelen, bool priorityonly, int *err) { + return !IsExePath(name, namelen) && !IsComPath(name, namelen) && + !IsComDbgPath(name, namelen) && + (FindCommand(name, pathbuf, namelen, priorityonly, ".com", err) || + FindCommand(name, pathbuf, namelen, priorityonly, ".exe", err)); } /** @@ -105,28 +132,33 @@ static noasan bool FindCommand(const char *name, * @vforksafe */ noasan char *commandv(const char *name, char pathbuf[hasatleast PATH_MAX]) { - int olderr; + int e, f; + char *res; size_t namelen; + res = 0; if (!name) { efault(); - return 0; - } - if (!(namelen = __strlen(name))) { + } else if (!(namelen = strlen(name))) { enoent(); - return 0; - } - if (namelen + 1 > PATH_MAX) { + } else if (namelen + 1 > PATH_MAX) { enametoolong(); - return 0; - } - if (FindCommand(name, pathbuf, namelen, "") || - (!EndsWithIgnoreCase(name, namelen, ".exe") && - !EndsWithIgnoreCase(name, namelen, ".com") && - !EndsWithIgnoreCase(name, namelen, ".com.dbg") && - (FindCommand(name, pathbuf, namelen, ".com") || - FindCommand(name, pathbuf, namelen, ".exe")))) { - return pathbuf; } else { - return 0; + e = errno; + f = ENOENT; + if ((IsWindows() && (FindSuffixed(name, pathbuf, namelen, true, &f) || + FindSuffixed(name, pathbuf, namelen, true, &f) || + FindVerbatim(name, pathbuf, namelen, false, &f) || + FindVerbatim(name, pathbuf, namelen, false, &f))) || + (!IsWindows() && (FindVerbatim(name, pathbuf, namelen, true, &f) || + FindSuffixed(name, pathbuf, namelen, true, &f) || + FindVerbatim(name, pathbuf, namelen, false, &f) || + FindSuffixed(name, pathbuf, namelen, false, &f)))) { + errno = e; + res = pathbuf; + } else { + errno = f; + } } + SYSDEBUG("commandv(%#s, %p) → %#s% m", name, pathbuf, res); + return res; } diff --git a/libc/calls/copyfile.c b/libc/calls/copyfile.c index 5c4c91196..c9e9cc93a 100644 --- a/libc/calls/copyfile.c +++ b/libc/calls/copyfile.c @@ -20,6 +20,7 @@ #include "libc/calls/internal.h" #include "libc/calls/struct/stat.h" #include "libc/dce.h" +#include "libc/intrin/kprintf.h" #include "libc/nt/createfile.h" #include "libc/nt/enum/accessmask.h" #include "libc/nt/enum/creationdisposition.h" @@ -66,12 +67,12 @@ static int sys_copyfile(const char *src, const char *dst, int flags) { int64_t inoffset, outoffset; int rc, srcfd, dstfd, oflags, omode; rc = -1; - if ((srcfd = sys_openat(AT_FDCWD, src, O_RDONLY, 0)) != -1) { - if (sys_fstat(srcfd, &st) != -1) { + if ((srcfd = openat(AT_FDCWD, src, O_RDONLY, 0)) != -1) { + if (fstat(srcfd, &st) != -1) { omode = st.st_mode & 0777; oflags = O_WRONLY | O_CREAT; if (flags & COPYFILE_NOCLOBBER) oflags |= O_EXCL; - if ((dstfd = sys_openat(AT_FDCWD, dst, oflags, omode)) != -1) { + if ((dstfd = openat(AT_FDCWD, dst, oflags, omode)) != -1) { remaining = st.st_size; ftruncate(dstfd, remaining); inoffset = 0; @@ -86,13 +87,13 @@ static int sys_copyfile(const char *src, const char *dst, int flags) { if (flags & COPYFILE_PRESERVE_TIMESTAMPS) { amtime[0] = st.st_atim; amtime[1] = st.st_mtim; - sys_utimensat(dstfd, NULL, amtime, 0); + utimensat(dstfd, NULL, amtime, 0); } } - rc |= sys_close(dstfd); + rc |= close(dstfd); } } - rc |= sys_close(srcfd); + rc |= close(srcfd); } return rc; } @@ -108,7 +109,7 @@ static int sys_copyfile(const char *src, const char *dst, int flags) { * @return 0 on success, or -1 w/ errno */ int copyfile(const char *src, const char *dst, int flags) { - if (!IsWindows()) { + if (!IsWindows() || startswith(src, "/zip/") || startswith(dst, "/zip/")) { return sys_copyfile(src, dst, flags); } else { return sys_copyfile_nt(src, dst, flags); diff --git a/libc/calls/execve.c b/libc/calls/execve.c index a02843476..8e9fa67ae 100644 --- a/libc/calls/execve.c +++ b/libc/calls/execve.c @@ -21,6 +21,7 @@ #include "libc/calls/sysdebug.internal.h" #include "libc/dce.h" #include "libc/intrin/asan.internal.h" +#include "libc/intrin/kprintf.h" #include "libc/log/libfatal.internal.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/errfuns.h" @@ -47,17 +48,17 @@ int execve(const char *program, char *const argv[], char *const envp[]) { return efault(); } if (DEBUGSYS) { - __printf("SYS: execve(%s, {", program); + kprintf("SYS: execve(%s, {", program); for (i = 0; argv[i]; ++i) { - if (i) __printf(", "); - __printf("%s", argv[i]); + if (i) kprintf(", "); + kprintf("%s", argv[i]); } - __printf("}, {"); + kprintf("}, {"); for (i = 0; envp[i]; ++i) { - if (i) __printf(", "); - __printf("%s", envp[i]); + if (i) kprintf(", "); + kprintf("%s", envp[i]); } - __printf("})\n"); + kprintf("})\n"); } for (i = 3; i < g_fds.n; ++i) { if (g_fds.p[i].kind != kFdEmpty && (g_fds.p[i].flags & O_CLOEXEC)) { diff --git a/libc/calls/getpid.c b/libc/calls/getpid.c index 5db92d62d..d13708d33 100644 --- a/libc/calls/getpid.c +++ b/libc/calls/getpid.c @@ -16,27 +16,10 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/assert.h" -#include "libc/bits/bits.h" #include "libc/calls/calls.h" #include "libc/calls/internal.h" -#include "libc/dce.h" -#include "libc/nt/process.h" -#include "libc/runtime/runtime.h" -static int __pid; - -static int __getpid(void) { - if (!IsWindows()) { - return sys_getpid().ax; - } else { - return GetCurrentProcessId(); - } -} - -static void __updatepid(void) { - __pid = __getpid(); -} +extern int __pid; /** * Returns process id. @@ -44,15 +27,11 @@ static void __updatepid(void) { * @vforksafe */ int getpid(void) { - static bool once; - if (__vforked) { - return sys_getpid().ax; + int rc; + if (!__vforked) { + rc = __pid; + } else { + rc = sys_getpid().ax; } - if (!once) { - __updatepid(); - if (cmpxchg(&once, false, true)) { - atfork(__updatepid, NULL); - } - } - return __pid; + return rc; } diff --git a/libc/calls/internal.h b/libc/calls/internal.h index c5de5d92d..becf6f1b6 100644 --- a/libc/calls/internal.h +++ b/libc/calls/internal.h @@ -12,6 +12,7 @@ #include "libc/calls/struct/stat.h" #include "libc/calls/struct/timespec.h" #include "libc/calls/struct/timeval.h" +#include "libc/calls/struct/winsize.h" #include "libc/calls/ucontext.h" #include "libc/dce.h" #include "libc/limits.h" @@ -299,6 +300,7 @@ ssize_t sys_open_nt(int, const char *, u32, i32) nodiscard hidden; ssize_t sys_read_nt(struct Fd *, const struct iovec *, size_t, ssize_t) hidden; ssize_t sys_readlinkat_nt(int, const char *, char *, size_t) hidden; ssize_t sys_write_nt(struct Fd *, const struct iovec *, size_t, ssize_t) hidden; +int ioctl_tiocgwinsz_nt(struct Fd *, struct winsize *) hidden; /*───────────────────────────────────────────────────────────────────────────│─╗ │ cosmopolitan § syscalls » windows nt » support ─╬─│┼ diff --git a/libc/calls/ioctl_tcsets.c b/libc/calls/ioctl_tcsets.c index 8986bfebd..a89abb0b8 100644 --- a/libc/calls/ioctl_tcsets.c +++ b/libc/calls/ioctl_tcsets.c @@ -25,6 +25,8 @@ #include "libc/sysv/consts/termios.h" #include "libc/sysv/errfuns.h" +extern bool __nomultics; + int ioctl_tcsets_nt(int, uint64_t, const struct termios *); static int ioctl_tcsets_metal(int fd, uint64_t request, @@ -35,7 +37,7 @@ static int ioctl_tcsets_metal(int fd, uint64_t request, static inline void *__termios2host(union metatermios *mt, const struct termios *lt) { if (!IsXnu() && !IsFreebsd() && !IsOpenbsd() && !IsNetbsd()) { - return lt; + return (/*unconst*/ void *)lt; } else if (IsXnu()) { COPY_TERMIOS(&mt->xnu, lt); return &mt->xnu; @@ -60,23 +62,29 @@ static int ioctl_tcsets_sysv(int fd, uint64_t request, * @see ioctl(fd, TIOCGETA{,W,F}, tio) dispatches here */ int ioctl_tcsets(int fd, uint64_t request, ...) { + int rc; va_list va; const struct termios *tio; va_start(va, request); tio = va_arg(va, const struct termios *); va_end(va); - if (!tio) return efault(); - if (fd >= 0) { + if (!tio) { + rc = efault(); + } else if (fd >= 0) { if (fd < g_fds.n && g_fds.p[fd].kind == kFdZip) { - return enotty(); + rc = enotty(); } else if (IsMetal()) { - return ioctl_tcsets_metal(fd, request, tio); + rc = ioctl_tcsets_metal(fd, request, tio); } else if (!IsWindows()) { - return ioctl_tcsets_sysv(fd, request, tio); + rc = ioctl_tcsets_sysv(fd, request, tio); } else { - return ioctl_tcsets_nt(fd, request, tio); + rc = ioctl_tcsets_nt(fd, request, tio); } } else { - return einval(); + rc = einval(); } + if (rc != -1) { + __nomultics = !(tio->c_oflag & OPOST); + } + return rc; } diff --git a/libc/calls/ioctl_tiocgwinsz-nt.c b/libc/calls/ioctl_tiocgwinsz-nt.c index 1a061683e..7933dbf14 100644 --- a/libc/calls/ioctl_tiocgwinsz-nt.c +++ b/libc/calls/ioctl_tiocgwinsz-nt.c @@ -27,20 +27,21 @@ #include "libc/str/str.h" #include "libc/sysv/errfuns.h" -textwindows int ioctl_tiocgwinsz_nt(int fd, struct winsize *ws) { - int i, fds[3]; +textwindows int ioctl_tiocgwinsz_nt(struct Fd *fd, struct winsize *ws) { + int i; uint32_t mode; + struct Fd *fds[3]; struct NtStartupInfo startinfo; struct NtConsoleScreenBufferInfoEx sbinfo; if (!ws) return efault(); - fds[0] = fd, fds[1] = 1, fds[2] = 0; + fds[0] = fd, fds[1] = g_fds.p + 1, fds[2] = g_fds.p + 0; GetStartupInfo(&startinfo); for (i = 0; i < ARRAYLEN(fds); ++i) { - if (__isfdkind(fds[i], kFdFile) || __isfdkind(fds[i], kFdConsole)) { - if (GetConsoleMode(g_fds.p[fds[i]].handle, &mode)) { + if (fds[i]->kind == kFdFile || fds[i]->kind == kFdConsole) { + if (GetConsoleMode(fds[i]->handle, &mode)) { bzero(&sbinfo, sizeof(sbinfo)); sbinfo.cbSize = sizeof(sbinfo); - if (GetConsoleScreenBufferInfoEx(g_fds.p[fds[i]].handle, &sbinfo)) { + if (GetConsoleScreenBufferInfoEx(fds[i]->handle, &sbinfo)) { ws->ws_col = sbinfo.srWindow.Right - sbinfo.srWindow.Left + 1; ws->ws_row = sbinfo.srWindow.Bottom - sbinfo.srWindow.Top + 1; ws->ws_xpixel = 0; diff --git a/libc/calls/ioctl_tiocgwinsz.c b/libc/calls/ioctl_tiocgwinsz.c index 7a2caa4f3..4a46c1021 100644 --- a/libc/calls/ioctl_tiocgwinsz.c +++ b/libc/calls/ioctl_tiocgwinsz.c @@ -24,8 +24,6 @@ #include "libc/sysv/consts/termios.h" #include "libc/sysv/errfuns.h" -int ioctl_tiocgwinsz_nt(int, struct winsize *); - /** * Returns width and height of terminal. * @@ -44,7 +42,7 @@ int ioctl_tiocgwinsz(int fd, ...) { } else if (!IsWindows()) { return sys_ioctl(fd, TIOCGWINSZ, ws); } else { - return ioctl_tiocgwinsz_nt(fd, ws); + return ioctl_tiocgwinsz_nt(g_fds.p + fd, ws); } } else { return einval(); diff --git a/libc/calls/mprotect.greg.c b/libc/calls/mprotect.greg.c index 00d7dfaa9..37ddfd915 100644 --- a/libc/calls/mprotect.greg.c +++ b/libc/calls/mprotect.greg.c @@ -25,8 +25,6 @@ #include "libc/nt/thunk/msabi.h" #include "libc/sysv/consts/nr.h" -extern __msabi typeof(VirtualProtect) *const __imp_VirtualProtect; - /** * Modifies restrictions on virtual memory address range. * diff --git a/libc/calls/nanosleep-nt.c b/libc/calls/nanosleep-nt.c index 9c8a6438a..57e3b875c 100644 --- a/libc/calls/nanosleep-nt.c +++ b/libc/calls/nanosleep-nt.c @@ -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│ ╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ 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 │ @@ -16,29 +16,33 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#define ShouldUseMsabiAttribute() 1 #include "libc/calls/internal.h" -#include "libc/nexgen32e/nexgen32e.h" -#include "libc/nt/enum/status.h" +#include "libc/errno.h" +#include "libc/macros.internal.h" #include "libc/nt/errors.h" #include "libc/nt/nt/time.h" #include "libc/nt/synchronization.h" -#include "libc/str/str.h" -#include "libc/sysv/errfuns.h" -textwindows int sys_nanosleep_nt(const struct timespec *req, - struct timespec *rem) { +textwindows noinstrument int sys_nanosleep_nt(const struct timespec *req, + struct timespec *rem) { + /* no function tracing because timing sensitive */ int64_t millis, hectonanos, relasleep; if (rem) memcpy(rem, req, sizeof(*rem)); - hectonanos = req->tv_sec * 10000000ull + div100int64(req->tv_nsec); + hectonanos = req->tv_sec * 10000000 + req->tv_nsec / 100; hectonanos = MAX(1, hectonanos); relasleep = -hectonanos; - if (NtError(NtDelayExecution(true, &relasleep))) { - millis = div10000int64(hectonanos); + if (NtError(__imp_NtDelayExecution(true, &relasleep))) { + millis = hectonanos / 10000; millis = MAX(1, millis); - if (SleepEx(millis, true) == kNtWaitIoCompletion) { - return eintr(); + if (__imp_SleepEx(millis, true) == kNtWaitIoCompletion) { + errno = EINTR; + return -1; } } - if (rem) bzero(rem, sizeof(*rem)); + if (rem) { + rem->tv_sec = 0; + rem->tv_nsec = 0; + } return 0; } diff --git a/libc/calls/ntspawn.c b/libc/calls/ntspawn.c index b42505089..a9f30a27a 100644 --- a/libc/calls/ntspawn.c +++ b/libc/calls/ntspawn.c @@ -84,7 +84,7 @@ textwindows int ntspawn( (block = MapViewOfFileExNuma(handle, kNtFileMapRead | kNtFileMapWrite, 0, 0, blocksize, NULL, kNtNumaNoPreferredNode))) { - if (mkntcmdline(block->cmdline, prog, argv) != -1 && + if (mkntcmdline(block->cmdline, prog, argv + 1) != -1 && mkntenvblock(block->envvars, envp, extravar) != -1) { if (CreateProcess(prog16, block->cmdline, opt_lpProcessAttributes, opt_lpThreadAttributes, bInheritHandles, diff --git a/libc/calls/preadv.c b/libc/calls/preadv.c index 3ad2b28f2..92e302f4b 100644 --- a/libc/calls/preadv.c +++ b/libc/calls/preadv.c @@ -63,7 +63,7 @@ ssize_t preadv(int fd, struct iovec *iov, int iovlen, int64_t off) { /* * NT, XNU, and 2007-era Linux don't support this system call. */ - if (!once) { + if (!__vforked && !once) { err = errno; rc = sys_preadv(fd, iov, iovlen, off, off); if (rc == -1 && errno == ENOSYS) { diff --git a/libc/runtime/program_executable_name.c b/libc/calls/program_executable_name.c similarity index 78% rename from libc/runtime/program_executable_name.c rename to libc/calls/program_executable_name.c index 6069e327e..38845cf97 100644 --- a/libc/runtime/program_executable_name.c +++ b/libc/calls/program_executable_name.c @@ -22,6 +22,7 @@ #include "libc/calls/internal.h" #include "libc/calls/sysdebug.internal.h" #include "libc/dce.h" +#include "libc/errno.h" #include "libc/log/libfatal.internal.h" #include "libc/macros.internal.h" #include "libc/mem/alloca.h" @@ -45,8 +46,17 @@ * Absolute path of executable. * * This variable is initialized automatically at startup. The path is - * guaranteed to exist, except on XNU and OpenBSD. It may be a symlink. - * It may be spoofed. + * basically `argv[0]` except some extra vetting is done to provide + * stronger assurance that the path can be counted upon to exist. + * + * For example, if your program is executed as a relative path and then + * your program calls `chdir()`, then `argv[0]` will be incorrect; but + * `program_executable_name` will work, because it prefixed `getcwd()` + * early in the initialization phase. + * + * @see GetInterpreterExecutableName() + * @see program_invocation_short_name + * @see program_invocation_name */ char program_executable_name[SIZE]; @@ -75,45 +85,31 @@ static textwindows bool GetNtExePath(char executable[SIZE]) { } static textstartup void GetProgramExecutableName(char executable[SIZE], - char *p) { - char *t; + char *argv0, intptr_t *auxv) { size_t m; + ssize_t n; int cmd[4]; - ssize_t n = 0; + char *p, *t; if (IsWindows() && GetNtExePath(executable)) return; - if (fileexists(p)) { + for (p = 0; *auxv; auxv += 2) { + if (*auxv == AT_EXECFN) { + p = (char *)auxv[1]; + break; + } + } + n = 0; + if (!p) p = argv0; + if (p) { if (!_isabspath(p)) { if (getcwd(executable, SIZE - 1)) { n = strlen(executable); executable[n++] = '/'; } } - } else if ((n = sys_readlinkat(AT_FDCWD, "/proc/self/exe", executable, - SIZE - 1)) > 0) { - executable[n] = 0; - return; - } else if ((n = sys_readlinkat(AT_FDCWD, "/proc/curproc/file", executable, - SIZE - 1)) > 0) { - executable[n] = 0; - return; - } else if (IsFreebsd() || IsNetbsd()) { - cmd[0] = CTL_KERN; - cmd[1] = KERN_PROC; - if (IsFreebsd()) { - cmd[2] = KERN_PROC_PATHNAME_FREEBSD; - } else { - cmd[2] = KERN_PROC_PATHNAME_NETBSD; - } - cmd[3] = -1; - m = SIZE; - if (sysctl(cmd, ARRAYLEN(cmd), executable, &m, 0, 0) != -1) { - return; - } - } - if (n < 0) n = 0; - for (; *p; ++p) { - if (n + 1 < SIZE) { - executable[n++] = *p; + for (; *p; ++p) { + if (n + 1 < SIZE) { + executable[n++] = *p; + } } } executable[n] = 0; @@ -121,13 +117,15 @@ static textstartup void GetProgramExecutableName(char executable[SIZE], textstartup void program_executable_name_init(int argc, char **argv, char **envp, intptr_t *auxv) { + int e; static bool once; char executable[SIZE]; if (!cmpxchg(&once, 0, 1)) return; - __stpcpy(program_executable_name, argv[0]); - GetProgramExecutableName(executable, argv[0]); + e = errno; + GetProgramExecutableName(executable, argv[0], auxv); + errno = e; __stpcpy(program_executable_name, executable); - SYSDEBUG("GetProgramExecutableName() -> %s", program_executable_name); + SYSDEBUG("program_executable_name → %#s", program_executable_name); } const void *const program_executable_name_init_ctor[] initarray = { diff --git a/libc/calls/read-nt.c b/libc/calls/read-nt.c index 024acb67b..374f273de 100644 --- a/libc/calls/read-nt.c +++ b/libc/calls/read-nt.c @@ -17,6 +17,7 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/assert.h" +#include "libc/bits/weaken.h" #include "libc/calls/internal.h" #include "libc/calls/struct/iovec.h" #include "libc/errno.h" @@ -45,6 +46,7 @@ textwindows ssize_t sys_read_nt(struct Fd *fd, const struct iovec *iov, ssize_t rc; uint32_t size; size_t i, total; + if (weaken(_check_sigwinch) && weaken(_check_sigwinch)(fd)) return eintr(); while (iovlen && !iov[0].iov_len) iov++, iovlen--; if (iovlen) { for (total = i = 0; i < iovlen; ++i) { diff --git a/libc/calls/readv-serial.c b/libc/calls/readv-serial.c index f60993f18..f9b1d120b 100644 --- a/libc/calls/readv-serial.c +++ b/libc/calls/readv-serial.c @@ -35,21 +35,12 @@ static int GetFirstIov(struct iovec *iov, int iovlen) { } ssize_t sys_readv_serial(struct Fd *fd, const struct iovec *iov, int iovlen) { - size_t i, j, got = 0; + size_t i; if ((i = GetFirstIov(iov, iovlen)) != -1) { while (!IsDataAvailable(fd)) asm("pause"); - i = 0; - j = 0; - do { - ++got; - ((char *)iov[i].iov_base)[j] = inb(fd->handle); - if (++j == iov[i].iov_len) { - j = 0; - if (++i == iovlen) { - break; - } - } - } while (IsDataAvailable(fd)); + ((char *)iov[i].iov_base)[0] = inb(fd->handle); + return 1; + } else { + return 0; } - return got; } diff --git a/libc/calls/realpath.c b/libc/calls/realpath.c index fafa4dcdf..4f0a5aed6 100644 --- a/libc/calls/realpath.c +++ b/libc/calls/realpath.c @@ -25,13 +25,14 @@ │ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ │ │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/assert.h" #include "libc/bits/bits.h" #include "libc/bits/safemacros.internal.h" #include "libc/bits/weaken.h" #include "libc/calls/calls.h" -#include "libc/calls/sysdebug.internal.h" #include "libc/errno.h" #include "libc/limits.h" +#include "libc/log/backtrace.internal.h" #include "libc/mem/mem.h" #include "libc/str/str.h" #include "libc/sysv/errfuns.h" @@ -73,12 +74,13 @@ static char *ResolvePath(char *d, const char *s, size_t n) * symbolic link then it's resolved. * * @param resolved needs PATH_MAX bytes or NULL to use malloc() + * @return resolved or NULL w/ errno */ char *realpath(const char *filename, char *resolved) { - ssize_t k; - int up, check_dir=0; - size_t p, q, l, l0, cnt=0, nup=0; + ssize_t rc; + int e, up, check_dir=0; + size_t k, p, q, l, l0, cnt=0, nup=0; char output[PATH_MAX], stack[PATH_MAX+1], *z; if (!filename) { @@ -160,15 +162,10 @@ restart: * directories, processing .. can skip readlink. */ if (!check_dir) goto skip_readlink; } - k = readlink(output, stack, p); - if (k<0) SYSDEBUG("realpath readlink failed %d", (long)errno); - if (k==p) goto toolong; - if (!k) { - errno = ENOENT; - return 0; - } - if (k<0) { + e = errno; + if ((rc = readlink(output, stack, p)) == -1) { if (errno != EINVAL) return 0; + errno = e; /* [jart] undirty errno if not a symlink */ skip_readlink: check_dir = 0; if (up) { @@ -180,6 +177,14 @@ skip_readlink: check_dir = stack[p]; continue; } + k = rc; + assert(k <= p); + if (k==p) + goto toolong; + if (!k) { + errno = ENOENT; + return 0; + } if (++cnt == SYMLOOP_MAX) { errno = ELOOP; return 0; diff --git a/libc/calls/sigwinch-nt.c b/libc/calls/sigwinch-nt.c new file mode 100644 index 000000000..a9bb56e03 --- /dev/null +++ b/libc/calls/sigwinch-nt.c @@ -0,0 +1,58 @@ +/*-*- 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/calls/internal.h" +#include "libc/calls/struct/winsize.h" +#include "libc/calls/sysdebug.internal.h" +#include "libc/errno.h" +#include "libc/nt/struct/consolescreenbufferinfoex.h" +#include "libc/str/str.h" + +static struct winsize __ws; + +textwindows bool _check_sigwinch(struct Fd *fd) { + int e; + siginfo_t si; + struct winsize ws, old; + struct NtConsoleScreenBufferInfoEx sbinfo; + old = __ws; + if (old.ws_row != 0xffff) { + e = errno; + if (ioctl_tiocgwinsz_nt(fd, &ws) != -1) { + if (old.ws_col != ws.ws_col || old.ws_row != ws.ws_row) { + __ws = ws; + if (old.ws_col | old.ws_row) { + SYSDEBUG("SIGWINCH %hhu×%hhu → %hhu×%hhu", old.ws_col, old.ws_row, + ws.ws_col, ws.ws_row); + if (__sighandrvas[SIGWINCH] >= kSigactionMinRva) { + bzero(&si, sizeof(si)); + ((sigaction_f)(_base + __sighandrvas[SIGWINCH]))(SIGWINCH, &si, 0); + return true; + } + } + } + } else { + errno = e; + if (!old.ws_row && !old.ws_col) { + __ws.ws_row = 0xffff; + } + } + } + return false; +} diff --git a/libc/calls/splice.c b/libc/calls/splice.c index bfe272af7..08cf2d8fc 100644 --- a/libc/calls/splice.c +++ b/libc/calls/splice.c @@ -32,9 +32,10 @@ static ssize_t splicer(int infd, int64_t *inoffset, int outfd, if (!uptobytes || flags == -1) return einval(); if (IsModeDbg() && uptobytes > 1) uptobytes >>= 1; olderr = errno; - if ((transferred = + if (__isfdkind(infd, kFdZip) || __isfdkind(outfd, kFdZip) || + (transferred = impl(infd, inoffset, outfd, outoffset, uptobytes, flags)) == -1 && - errno == ENOSYS) { + errno == ENOSYS) { errno = olderr; transferred = copyfd(infd, inoffset, outfd, outoffset, uptobytes, flags); } diff --git a/libc/calls/struct/sigaction.h b/libc/calls/struct/sigaction.h index 1fcfb06af..b14078d80 100644 --- a/libc/calls/struct/sigaction.h +++ b/libc/calls/struct/sigaction.h @@ -24,6 +24,7 @@ COSMOPOLITAN_C_START_ void _init_onntconsoleevent(void); void _init_wincrash(void); +bool _check_sigwinch(); #ifndef __SIGACTION_YOINK #define __SIGACTION_YOINK(SIG) \ @@ -44,12 +45,16 @@ void _init_wincrash(void); 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) diff --git a/libc/calls/sysdebug.internal.h b/libc/calls/sysdebug.internal.h index 614f66ec1..bc9efeb3c 100644 --- a/libc/calls/sysdebug.internal.h +++ b/libc/calls/sysdebug.internal.h @@ -7,7 +7,7 @@ #endif #if DEBUGSYS -#define SYSDEBUG(FMT, ...) __printf("SYS: " FMT "\n", ##__VA_ARGS__) +#define SYSDEBUG(FMT, ...) kprintf("SYS: " FMT "\n", ##__VA_ARGS__) #else #define SYSDEBUG(FMT, ...) (void)0 #endif diff --git a/libc/crt/crt.S b/libc/crt/crt.S index 4d0f82a63..8ef3cce6c 100644 --- a/libc/crt/crt.S +++ b/libc/crt/crt.S @@ -28,12 +28,21 @@ // @note FreeBSD is special (see freebsd/lib/csu/amd64/...) // @noreturn _start: + +// Get startup timestamp as early as possible. +// Used by --strace flag and kprintf() %T. + rdtsc + ezlea kStartTsc,bx + mov %eax,(%rbx) + mov %edx,4(%rbx) + #if SupportsFreebsd() test %rdi,%rdi cmovnz %rdi,%rsp jz 0f movb $FREEBSD,__hostos(%rip) #endif + 0: mov (%rsp),%ebx # argc lea 8(%rsp),%rsi # argv lea 16(%rsp,%rbx,8),%rdx # envp diff --git a/libc/elf/def.h b/libc/elf/def.h index b282babcb..0578d108b 100644 --- a/libc/elf/def.h +++ b/libc/elf/def.h @@ -5,6 +5,8 @@ * @fileoverview Executable and Linkable Format Definitions. */ +#define EI_NIDENT 16 + #define EI_MAG0 0 #define EI_MAG1 1 #define EI_MAG2 2 diff --git a/libc/elf/getelfstringtable.c b/libc/elf/getelfstringtable.c index e12f4da72..83106a156 100644 --- a/libc/elf/getelfstringtable.c +++ b/libc/elf/getelfstringtable.c @@ -24,13 +24,15 @@ char *GetElfStringTable(const Elf64_Ehdr *elf, size_t mapsize) { char *name; Elf64_Half i; Elf64_Shdr *shdr; - for (i = 0; i < elf->e_shnum; ++i) { - shdr = GetElfSectionHeaderAddress(elf, mapsize, i); - if (shdr->sh_type == SHT_STRTAB) { - name = GetElfSectionName(elf, mapsize, - GetElfSectionHeaderAddress(elf, mapsize, i)); - if (name && !strcmp(name, ".strtab")) { - return GetElfSectionAddress(elf, mapsize, shdr); + if (elf->e_shentsize) { + for (i = 0; i < elf->e_shnum; ++i) { + shdr = GetElfSectionHeaderAddress(elf, mapsize, i); + if (shdr->sh_type == SHT_STRTAB) { + name = GetElfSectionName(elf, mapsize, + GetElfSectionHeaderAddress(elf, mapsize, i)); + if (name && !strcmp(name, ".strtab")) { + return GetElfSectionAddress(elf, mapsize, shdr); + } } } } diff --git a/libc/elf/getelfsymboltable.c b/libc/elf/getelfsymboltable.c index 5e0244793..76384bf41 100644 --- a/libc/elf/getelfsymboltable.c +++ b/libc/elf/getelfsymboltable.c @@ -23,12 +23,14 @@ Elf64_Sym *GetElfSymbolTable(const Elf64_Ehdr *elf, size_t mapsize, Elf64_Xword *out_count) { Elf64_Half i; Elf64_Shdr *shdr; - for (i = elf->e_shnum; i > 0; --i) { - shdr = GetElfSectionHeaderAddress(elf, mapsize, i - 1); - if (shdr->sh_type == SHT_SYMTAB) { - if (shdr->sh_entsize != sizeof(Elf64_Sym)) continue; - if (out_count) *out_count = shdr->sh_size / shdr->sh_entsize; - return GetElfSectionAddress(elf, mapsize, shdr); + if (elf->e_shentsize) { + for (i = elf->e_shnum; i > 0; --i) { + shdr = GetElfSectionHeaderAddress(elf, mapsize, i - 1); + if (shdr->sh_type == SHT_SYMTAB) { + if (shdr->sh_entsize != sizeof(Elf64_Sym)) continue; + if (out_count) *out_count = shdr->sh_size / shdr->sh_entsize; + return GetElfSectionAddress(elf, mapsize, shdr); + } } } return NULL; diff --git a/libc/fmt/divmod10.internal.h b/libc/fmt/divmod10.internal.h new file mode 100644 index 000000000..048cbdc60 --- /dev/null +++ b/libc/fmt/divmod10.internal.h @@ -0,0 +1,26 @@ +#ifndef COSMOPOLITAN_LIBC_FMT_DIVMOD10_H_ +#define COSMOPOLITAN_LIBC_FMT_DIVMOD10_H_ +#if !(__ASSEMBLER__ + __LINKER__ + 0) + +forceinline uint64_t DivMod10(uint64_t x, unsigned *r) { +#if defined(__STRICT_ANSI__) || !defined(__GNUC__) || \ + (defined(__OPTIMIZE__) && !defined(__OPTIMIZE_SIZE__)) + *r = x % 10; + return x / 10; +#else + uint128_t dw; + unsigned long long hi, rm; + dw = x; + dw *= 0xcccccccccccccccdull; + hi = dw >> 64; + hi >>= 3; + rm = hi; + rm += rm << 2; + rm += rm; + *r = x - rm; + return hi; +#endif +} + +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_LIBC_FMT_DIVMOD10_H_ */ diff --git a/libc/fmt/fmt.h b/libc/fmt/fmt.h index 6ecc118a2..e87589837 100644 --- a/libc/fmt/fmt.h +++ b/libc/fmt/fmt.h @@ -27,6 +27,8 @@ int vsscanf(const char *, const char *, va_list); int vcscanf(int (*)(void *), int (*)(int, void *), void *, const char *, va_list); int strerror_r(int, char *, size_t) nothrow nocallback; +const char *strerror_short(int) nosideeffect; +const char *strerror_long(int) nosideeffect; int __fmt(void *, void *, const char *, va_list) hidden; char *itoa(int, char *, int) compatfn; char *fcvt(double, int, int *, int *); diff --git a/libc/fmt/kerrornames.S b/libc/fmt/kerrornames.S index fa3072923..6badb85b5 100644 --- a/libc/fmt/kerrornames.S +++ b/libc/fmt/kerrornames.S @@ -29,6 +29,7 @@ .section .rodata .align 4 kErrorNames: + .e EINVAL .e ENOSYS .e EPERM .e ENOENT @@ -51,7 +52,6 @@ kErrorNames: .e ENODEV .e ENOTDIR .e EISDIR - .e EINVAL .e ENFILE .e EMFILE .e ENOTTY diff --git a/libc/fmt/kerrornameslong.S b/libc/fmt/kerrornameslong.S index c5baeb694..ac897dd21 100644 --- a/libc/fmt/kerrornameslong.S +++ b/libc/fmt/kerrornameslong.S @@ -29,155 +29,90 @@ .section .rodata .align 4 kErrorNamesLong: - .e EPIPE,"EPIPE[Broken pipe]" - .e ENODEV,"ENODEV[No such device]" - .e EINVAL,"EINVAL[Invalid argument]" - .e EINTR,"EINTR[Interrupted system call]" - .e ENOTBLK,"ENOTBLK[Block device required]" - .e ENOSYS,"ENOSYS[Function not implemented]" - .e EHOSTUNREACH,"EHOSTUNREACH[No route to host]" - .e ESRCH,"ESRCH[No such process]" - .e EUSERS,"EUSERS[Too many users]" - .e EXDEV,"EXDEV[Cross-device link]" - .e E2BIG,"E2BIG[Arg list too long]" - .e EREMOTE,"EREMOTE[Object is remote]" - .e ECHILD,"ECHILD[No child processes]" - .e EMSGSIZE,"EMSGSIZE[Message too long]" - .e ENOTEMPTY,"ENOTEMPTY[Directory not empty]" - .e ENOBUFS,"ENOBUFS[No buffer space available]" - .e ELOOP,"ELOOP[Too many symbolic links encountered]" - .e EAFNOSUPPORT,"EAFNOSUPPORT[Address family not supported by protocol]" - .e EHOSTDOWN,"EHOSTDOWN[Host is down]" - .e EPFNOSUPPORT,"EPFNOSUPPORT[Protocol family not supported]" - .e ENOPROTOOPT,"ENOPROTOOPT[Protocol not available]" - .e EBUSY,"EBUSY[Device or resource busy]" - .e EWOULDBLOCK,"EWOULDBLOCK[Operation would block]" - .e EBADFD,"EBADFD[File descriptor in bad state]" - .e EISCONN,"EISCONN[Transport endpoint is already connected]" - .e ESHUTDOWN,"ESHUTDOWN[Cannot send after transport endpoint shutdown]" - .e ENONET,"ENONET[Machine is not on the network]" - .e EBADE,"EBADE[Invalid exchange]" - .e EBADF,"EBADF[Bad file number]" - .e EMULTIHOP,"EMULTIHOP[Multihop attempted]" - .e EIO,"EIO[I/O error]" - .e EUNATCH,"EUNATCH[Protocol driver not attached]" - .e EPROTOTYPE,"EPROTOTYPE[Protocol wrong type for socket]" - .e ENOSPC,"ENOSPC[No space left on device]" - .e ENOEXEC,"ENOEXEC[Exec format error]" - .e EALREADY,"EALREADY[Operation already in progress]" - .e ENETDOWN,"ENETDOWN[Network is down]" - .e ENOTNAM,"ENOTNAM[Not a XENIX named type file]" - .e EACCES,"EACCES[Permission denied]" - .e ELNRNG,"ELNRNG[Link number out of range]" - .e EILSEQ,"EILSEQ[Illegal byte sequence]" - .e ENOTDIR,"ENOTDIR[Not a directory]" - .e ENOTUNIQ,"ENOTUNIQ[Name not unique on network]" - .e EPERM,"EPERM[Operation not permitted]" - .e EDOM,"EDOM[Math argument out of domain of func]" - .e EXFULL,"EXFULL[Exchange full]" - .e ECONNREFUSED,"ECONNREFUSED[Connection refused]" - .e EISDIR,"EISDIR[Is a directory]" - .e EPROTONOSUPPORT,"EPROTONOSUPPORT[Protocol not supported]" - .e EROFS,"EROFS[Read-only file system]" - .e EADDRNOTAVAIL,"EADDRNOTAVAIL[Cannot assign requested address]" - .e EIDRM,"EIDRM[Identifier removed]" - .e ECOMM,"ECOMM[Communication error on send]" - .e ESRMNT,"ESRMNT[Srmount error]" - .e EREMOTEIO,"EREMOTEIO[Remote I/O error]" - .e EL3RST,"EL3RST[Level 3 reset]" - .e EBADMSG,"EBADMSG[Not a data message]" - .e ENFILE,"ENFILE[File table overflow]" - .e ELIBMAX,"ELIBMAX[Attempting to link in too many shared libraries]" - .e ESPIPE,"ESPIPE[Illegal seek]" - .e ENOLINK,"ENOLINK[Link has been severed]" - .e ENETRESET,"ENETRESET[Network dropped connection because of reset]" - .e ETIMEDOUT,"ETIMEDOUT[Connection timed out]" - .e ENOENT,"ENOENT[No such file or directory]" - .e EEXIST,"EEXIST[File exists]" - .e EDQUOT,"EDQUOT[Quota exceeded]" - .e ENOSTR,"ENOSTR[Device not a stream]" - .e EBADSLT,"EBADSLT[Invalid slot]" - .e EBADRQC,"EBADRQC[Invalid request code]" - .e ELIBACC,"ELIBACC[Can not access a needed shared library]" - .e EFAULT,"EFAULT[Bad address]" - .e EFBIG,"EFBIG[File too large]" - .e EDEADLK,"EDEADLK[Resource deadlock would occur]" - .e ENOTCONN,"ENOTCONN[Transport endpoint is not connected]" - .e EDESTADDRREQ,"EDESTADDRREQ[Destination address required]" - .e ELIBSCN,"ELIBSCN[.lib section in a.out corrupted]" - .e ENOLCK,"ENOLCK[No record locks available]" - .e EISNAM,"EISNAM[Is a named type file]" - .e ECONNABORTED,"ECONNABORTED[Software caused connection abort]" - .e ENETUNREACH,"ENETUNREACH[Network is unreachable]" - .e ESTALE,"ESTALE[Stale NFS file handle]" - .e ENOSR,"ENOSR[Out of streams resources]" - .e ENOMEM,"ENOMEM[Out of memory]" - .e ENOTSOCK,"ENOTSOCK[Socket operation on non-socket]" - .e ESTRPIPE,"ESTRPIPE[Streams pipe error]" - .e EMLINK,"EMLINK[Too many links]" - .e ERANGE,"ERANGE[Math result not representable]" - .e ELIBEXEC,"ELIBEXEC[Cannot exec a shared library directly]" - .e EL3HLT,"EL3HLT[Level 3 halted]" - .e ECONNRESET,"ECONNRESET[Connection reset by peer]" - .e EADDRINUSE,"EADDRINUSE[Address already in use]" - .e EOPNOTSUPP,"EOPNOTSUPP[Operation not supported on transport endpoint]" - .e EREMCHG,"EREMCHG[Remote address changed]" - .e EAGAIN,"EAGAIN[Try again]" - .e ENAMETOOLONG,"ENAMETOOLONG[File name too long]" - .e ENOTTY,"ENOTTY[Not a typewriter]" - .e ERESTART,"ERESTART[Interrupted system call should be restarted]" - .e ESOCKTNOSUPPORT,"ESOCKTNOSUPPORT[Socket type not supported]" - .e ETIME,"ETIME[Timer expired]" - .e ETOOMANYREFS,"ETOOMANYREFS[Too many references: cannot splice]" - .e EMFILE,"EMFILE[Too many open files]" - .e ETXTBSY,"ETXTBSY[Text file busy]" - .e EINPROGRESS,"EINPROGRESS[Operation now in progress]" - .e ENXIO,"ENXIO[No such device or address]" - .e ENOTSUP,"ENOTSUP[Operation not supported]" - .e EPROTO,"EPROTO[Protocol error]" - .e ENOMSG,"ENOMSG[No message of desired type]" - .e ENODATA,"ENODATA[No data available]" - .e EOVERFLOW,"EOVERFLOW[Value too large for defined data type]" - .e ENOMEDIUM,"ENOMEDIUM[No medium found]" - .e EMEDIUMTYPE,"EMEDIUMTYPE[Wrong medium type]" - .e ECANCELED,"ECANCELED[Operation Canceled]" - .e EOWNERDEAD,"EOWNERDEAD[Owner died]" - .e ENOTRECOVERABLE,"ENOTRECOVERABLE[State not recoverable]" - .e EOWNERDEAD,"EOWNERDEAD[Process died with the lock]" - .e ENOTRECOVERABLE,"ENOTRECOVERABLE[Lock is not recoverable]" - .e EFTYPE,"EFTYPE[Inappropriate file type or format]" - .e EAUTH,"EAUTH[Authentication error]" - .e EBADRPC,"EBADRPC[RPC struct is bad]" - .e ENEEDAUTH,"ENEEDAUTH[Need authenticator]" - .e ENOATTR,"ENOATTR[Attribute not found]" - .e EPROCUNAVAIL,"EPROCUNAVAIL[Bad procedure for program]" - .e EPROGMISMATCH,"EPROGMISMATCH[Program version wrong]" - .e EPROGUNAVAIL,"EPROGUNAVAIL[RPC prog. not avail]" - .e ERPCMISMATCH,"ERPCMISMATCH[RPC version wrong]" - .e EPROCLIM,"EPROCLIM[Too many processes]" - .e EBADARCH,"EBADARCH[Bad CPU type in executable]" - .e EBADEXEC,"EBADEXEC[Bad executable (or shared library)]" - .e EBADMACHO,"EBADMACHO[Malformed Mach-o file]" - .e EDEVERR,"EDEVERR[Device error]" - .e ENOPOLICY,"ENOPOLICY[Policy not found]" - .e EPWROFF,"EPWROFF[Device power is off]" - .e ESHLIBVERS,"ESHLIBVERS[Shared library version mismatch]" - .e ENOANO,"ENOANO[No anode]" - .e EADV,"EADV[Advertise error]" - .e EL2HLT,"EL2HLT[Level 2 halted]" - .e EDOTDOT,"EDOTDOT[RFS specific error]" - .e ENOPKG,"ENOPKG[Package not installed]" - .e EBADR,"EBADR[Invalid request descriptor]" - .e ENOCSI,"ENOCSI[No CSI structure available]" - .e ENOKEY,"ENOKEY[Required key not available]" - .e EUCLEAN,"EUCLEAN[Structure needs cleaning]" - .e ECHRNG,"ECHRNG[Channel number out of range]" - .e EL2NSYNC,"EL2NSYNC[Level 2 not synchronized]" - .e EKEYEXPIRED,"EKEYEXPIRED[Key has expired]" - .e ENAVAIL,"ENAVAIL[No XENIX semaphores available]" - .e EKEYREVOKED,"EKEYREVOKED[Key has been revoked]" - .e ELIBBAD,"ELIBBAD[Accessing a corrupted shared library]" - .e EKEYREJECTED,"EKEYREJECTED[Key was rejected by service]" - .e ERFKILL,"ERFKILL[Operation not possible due to RF-kill]" + .e EINVAL,"Invalid argument" + .e ENOSYS,"Function not implemented" + .e EPERM,"Operation not permitted" + .e ENOENT,"No such file or directory" + .e ESRCH,"No such process" + .e EINTR,"Interrupted system call" + .e EIO,"I/O error" + .e ENXIO,"No such device or address" + .e E2BIG,"Arg list too long" + .e ENOEXEC,"Exec format error" + .e EBADF,"Bad file number" + .e ECHILD,"No child processes" + .e EAGAIN,"Try again" + .e ENOMEM,"Out of memory" + .e EACCES,"Permission denied" + .e EFAULT,"Bad address" + .e ENOTBLK,"Block device required" + .e EBUSY,"Device or resource busy" + .e EEXIST,"File exists" + .e EXDEV,"Cross-device link" + .e ENODEV,"No such device" + .e ENOTDIR,"Not a directory" + .e EISDIR,"Is a directory" + .e ENFILE,"File table overflow" + .e EMFILE,"Too many open files" + .e ENOTTY,"Not a typewriter" + .e ETXTBSY,"Text file busy" + .e EFBIG,"File too large" + .e ENOSPC,"No space left on device" + .e EDQUOT,"Quota exceeded" + .e ESPIPE,"Illegal seek" + .e EROFS,"Read-only file system" + .e EMLINK,"Too many links" + .e EPIPE,"Broken pipe" + .e EDOM,"Math argument out of domain of func" + .e ERANGE,"Math result not representable" + .e EDEADLK,"Resource deadlock would occur" + .e ENAMETOOLONG,"File name too long" + .e ENOLCK,"No record locks available" + .e ENOTEMPTY,"Directory not empty" + .e ELOOP,"Too many symbolic links encountered" + .e ENOMSG,"No message of desired type" + .e EIDRM,"Identifier removed" + .e ETIME,"Timer expired" + .e EPROTO,"Protocol error" + .e EOVERFLOW,"Value too large for defined data type" + .e EILSEQ,"Illegal byte sequence" + .e EUSERS,"Too many users" + .e ENOTSOCK,"Socket operation on non-socket" + .e EDESTADDRREQ,"Destination address required" + .e EMSGSIZE,"Message too long" + .e EPROTOTYPE,"Protocol wrong type for socket" + .e ENOPROTOOPT,"Protocol not available" + .e EPROTONOSUPPORT,"Protocol not supported" + .e ESOCKTNOSUPPORT,"Socket type not supported" + .e ENOTSUP,"Operation not supported" + .e EOPNOTSUPP,"Operation not supported on transport endpoint" + .e EPFNOSUPPORT,"Protocol family not supported" + .e EAFNOSUPPORT,"Address family not supported by protocol" + .e EADDRINUSE,"Address already in use" + .e EADDRNOTAVAIL,"Cannot assign requested address" + .e ENETDOWN,"Network is down" + .e ENETUNREACH,"Network is unreachable" + .e ENETRESET,"Network dropped connection because of reset" + .e ECONNABORTED,"Software caused connection abort" + .e ECONNRESET,"Connection reset by peer" + .e ENOBUFS,"No buffer space available" + .e EISCONN,"Transport endpoint is already connected" + .e ENOTCONN,"Transport endpoint is not connected" + .e ESHUTDOWN,"Cannot send after transport endpoint shutdown" + .e ETOOMANYREFS,"Too many references: cannot splice" + .e ETIMEDOUT,"Connection timed out" + .e ECONNREFUSED,"Connection refused" + .e EHOSTDOWN,"Host is down" + .e EHOSTUNREACH,"No route to host" + .e EALREADY,"Operation already in progress" + .e EINPROGRESS,"Operation now in progress" + .e ESTALE,"Stale NFS file handle" + .e EREMOTE,"Object is remote" + .e EBADMSG,"Not a data message" + .e ECANCELED,"Operation Canceled" + .e EOWNERDEAD,"Owner died" + .e ENOTRECOVERABLE,"State not recoverable" + .e ENONET,"Machine is not on the network" + .e ERESTART,"Interrupted system call should be restarted" .long 0 .endobj kErrorNamesLong,globl,hidden diff --git a/libc/fmt/strerror_long.greg.c b/libc/fmt/strerror_long.greg.c new file mode 100644 index 000000000..844a1569b --- /dev/null +++ b/libc/fmt/strerror_long.greg.c @@ -0,0 +1,40 @@ +/*-*- 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/fmt/fmt.h" + +extern const struct { int x, s; } kErrorNamesLong[]; + +/** + * Converts errno value to descriptive sentence. + * @return non-null rodata string or null if not found + */ +privileged const char *strerror_long(int x) { + /* kprintf() weakly depends on this function */ + int i; + if (x) { + for (i = 0; kErrorNamesLong[i].x; ++i) { + if (x == + *(const long *)((uintptr_t)kErrorNamesLong + kErrorNamesLong[i].x)) { + return (const char *)((uintptr_t)kErrorNamesLong + + kErrorNamesLong[i].s); + } + } + } + return 0; +} diff --git a/libc/fmt/strerror_r.c b/libc/fmt/strerror_r.greg.c similarity index 53% rename from libc/fmt/strerror_r.c rename to libc/fmt/strerror_r.greg.c index dc024cb6a..961698ace 100644 --- a/libc/fmt/strerror_r.c +++ b/libc/fmt/strerror_r.greg.c @@ -16,11 +16,13 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#define ShouldUseMsabiAttribute() 1 #include "libc/bits/safemacros.internal.h" #include "libc/dce.h" #include "libc/errno.h" #include "libc/fmt/fmt.h" #include "libc/fmt/itoa.h" +#include "libc/intrin/kprintf.h" #include "libc/log/libfatal.internal.h" #include "libc/macros.internal.h" #include "libc/nexgen32e/bsr.h" @@ -32,93 +34,48 @@ #include "libc/str/str.h" #include "libc/str/tpenc.h" -#if !IsTiny() +#if !IsTiny() && SupportsWindows() +/* + * If we're paying the code size costs for all the system five magnums + * that this module pulls in then we might as well pull in support for + * the improved accuracy windows errno conversions used by __winerr() + */ STATIC_YOINK("__dos2errno"); #endif -struct Error { - int x; - int s; -}; - -extern const struct Error kErrorNames[]; -extern const struct Error kErrorNamesLong[]; - -noasan static inline const char *GetErrorName(long x) { - int i; - if (x) { - for (i = 0; kErrorNames[i].x; ++i) { - if (x == *(const long *)((uintptr_t)kErrorNames + kErrorNames[i].x)) { - return (const char *)((uintptr_t)kErrorNames + kErrorNames[i].s); - } - } - } - return "EUNKNOWN"; -} - -noasan static inline const char *GetErrorNameLong(long x) { - int i; - if (x) { - for (i = 0; kErrorNamesLong[i].x; ++i) { - if (x == - *(const long *)((uintptr_t)kErrorNamesLong + kErrorNamesLong[i].x)) { - return (const char *)((uintptr_t)kErrorNamesLong + - kErrorNamesLong[i].s); - } - } - } - return "EUNKNOWN[No error information]"; -} - /** * Converts errno value to string. + * + * @param err is error number or zero if unknown * @return 0 on success, or error code */ -noasan int strerror_r(int err, char *buf, size_t size) { - uint64_t w; - int c, i, n; - char *p, *e; - const char *s; - char16_t *ws = 0; - p = buf; - e = p + size; - err &= 0xFFFF; - s = IsTiny() ? GetErrorName(err) : GetErrorNameLong(err); - while ((c = *s++)) { - if (p + 1 + 1 <= e) *p++ = c; - } - if (!IsTiny()) { - if (p + 1 + 5 + 1 + 1 <= e) { - *p++ = '['; - p = __intcpy(p, err); - *p++ = ']'; - } - if (IsWindows()) { - err = GetLastError() & 0xffff; - if ((n = FormatMessage( - kNtFormatMessageAllocateBuffer | kNtFormatMessageFromSystem | - kNtFormatMessageIgnoreInserts, - 0, err, MAKELANGID(kNtLangNeutral, kNtSublangDefault), - (char16_t *)&ws, 0, 0))) { - while (n && ws[n - 1] <= L' ' || ws[n - 1] == L'.') --n; - if (p + 1 + 1 <= e) *p++ = '['; - for (i = 0; i < n; ++i) { - w = tpenc(ws[i] & 0xffff); - if (p + (bsrll(w) >> 3) + 1 + 1 <= e) { - do *p++ = w; - while ((w >>= 8)); - } - } - if (p + 1 + 1 <= e) *p++ = ']'; - LocalFree(ws); - } - if (p + 1 + 5 + 1 + 1 <= e) { - *p++ = '['; - p = __intcpy(p, err); - *p++ = ']'; - } +privileged int strerror_r(int err, char *buf, size_t size) { + /* kprintf() weakly depends on this function */ + int c, n, winerr; + char16_t winmsg[256]; + const char *sym, *msg; + sym = firstnonnull(strerror_short(err), "EUNKNOWN"); + msg = firstnonnull(strerror_long(err), "No error information"); + if (IsTiny()) { + if (!sym) sym = "EUNKNOWN"; + for (; (c = *sym++); --size) + if (size > 1) *buf++ = c; + if (size) *buf = 0; + } else if (!IsWindows()) { + ksnprintf(buf, size, "%s[%d][%s]", sym, err, msg); + } else { + winerr = __imp_GetLastError(); + if ((n = __imp_FormatMessageW( + kNtFormatMessageFromSystem | kNtFormatMessageIgnoreInserts, 0, + winerr, MAKELANGID(kNtLangNeutral, kNtSublangDefault), winmsg, + ARRAYLEN(winmsg), 0))) { + while ((n && winmsg[n - 1] <= ' ') || winmsg[n - 1] == '.') --n; + ksnprintf(buf, size, "%s[%d][%s][%.*hs][%d]", sym, err, msg, n, winmsg, + winerr); + } else { + ksnprintf(buf, size, "%s[%d][%s][%d]", sym, err, msg, winerr); } + __imp_SetLastError(winerr); } - if (p + 1 <= e) *p = 0; return 0; } diff --git a/libc/fmt/strerror_short.greg.c b/libc/fmt/strerror_short.greg.c new file mode 100644 index 000000000..1166fbfb3 --- /dev/null +++ b/libc/fmt/strerror_short.greg.c @@ -0,0 +1,38 @@ +/*-*- 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/fmt/fmt.h" + +extern const struct { int x, s; } kErrorNames[]; + +/** + * Converts errno value to symbolic name. + * @return non-null rodata string or null if not found + */ +privileged const char *strerror_short(int x) { + /* kprintf() weakly depends on this function */ + int i; + if (x) { + for (i = 0; kErrorNames[i].x; ++i) { + if (x == *(const *)((uintptr_t)kErrorNames + kErrorNames[i].x)) { + return (const char *)((uintptr_t)kErrorNames + kErrorNames[i].s); + } + } + } + return 0; +} diff --git a/libc/intrin/asan.c b/libc/intrin/asan.c index c5befbf12..da393332b 100644 --- a/libc/intrin/asan.c +++ b/libc/intrin/asan.c @@ -22,10 +22,11 @@ #include "libc/bits/likely.h" #include "libc/bits/weaken.h" #include "libc/calls/calls.h" +#include "libc/calls/internal.h" #include "libc/calls/struct/iovec.h" -#include "libc/calls/sysdebug.internal.h" #include "libc/dce.h" #include "libc/intrin/asan.internal.h" +#include "libc/intrin/kprintf.h" #include "libc/log/backtrace.internal.h" #include "libc/log/internal.h" #include "libc/log/libfatal.internal.h" @@ -89,12 +90,13 @@ STATIC_YOINK("_init_asan"); } \ } while (0) -#define REQUIRE(FUNC) \ - do { \ - if (!weaken(FUNC)) { \ - __asan_die("error: asan needs " #FUNC "\n")(); \ - __asan_unreachable(); \ - } \ +#define REQUIRE(FUNC) \ + do { \ + if (!weaken(FUNC)) { \ + kprintf("error: asan needs %s%n", #FUNC); \ + __asan_die()(); \ + __asan_unreachable(); \ + } \ } while (0) typedef char xmm_t __attribute__((__vector_size__(16), __aligned__(1))); @@ -139,6 +141,7 @@ struct AsanMorgue { }; bool __asan_noreentry; +extern bool __nomultics; static struct AsanMorgue __asan_morgue; static wontreturn void __asan_unreachable(void) { @@ -227,7 +230,8 @@ static void *__asan_memset(void *p, char c, size_t n) { static void *__asan_mempcpy(void *dst, const void *src, size_t n) { size_t i; - char *d, *s; + char *d; + const char *s; uint64_t a, b; d = dst; s = src; @@ -303,14 +307,13 @@ static char *__asan_hexcpy(char *p, uint64_t x, uint8_t k) { } static void __asan_exit(void) { - __printf("your asan runtime needs\n" - "\tSTATIC_YOINK(\"__die\");\n" - "in order to show you backtraces\n"); + kprintf("your asan runtime needs%n" + "\tSTATIC_YOINK(\"__die\");%n" + "in order to show you backtraces%n"); _Exit(99); } -nodiscard static __asan_die_f *__asan_die(const char *msg) { - __printf("%s", msg); +nodiscard static __asan_die_f *__asan_die(void) { if (weaken(__die)) { return weaken(__die); } else { @@ -358,7 +361,7 @@ static bool __asan_is_mapped(int x) { struct MemoryIntervals *m; m = weaken(_mmi); i = FindMemoryInterval(m, x); - return i < m->i && m->p[i].x <= x && x <= m->p[i].y; + return i < m->i && x >= m->p[i].x; } static bool __asan_is_image(const unsigned char *p) { @@ -366,7 +369,7 @@ static bool __asan_is_image(const unsigned char *p) { } static bool __asan_exists(const void *x) { - return __asan_is_image(x) || __asan_is_mapped((intptr_t)x >> 16); + return !kisdangerous(x); } static struct AsanFault __asan_fault(const signed char *s, signed char dflt) { @@ -385,13 +388,13 @@ static struct AsanFault __asan_fault(const signed char *s, signed char dflt) { static struct AsanFault __asan_checka(const signed char *s, long ndiv8) { intptr_t a; uint64_t w; - signed char c, *e = s + ndiv8; + const signed char *e = s + ndiv8; for (; ((intptr_t)s & 7) && s < e; ++s) { if (*s) return __asan_fault(s - 1, kAsanHeapOverrun); } for (; s + 8 <= e; s += 8) { if (UNLIKELY(!((a = (intptr_t)s) & 0xffff))) { - if (!__asan_is_mapped(a >> 16)) { + if (kisdangerous((void *)a)) { return (struct AsanFault){kAsanUnmapped, s}; } } @@ -422,7 +425,6 @@ static struct AsanFault __asan_checka(const signed char *s, long ndiv8) { */ struct AsanFault __asan_check(const void *p, long n) { intptr_t a; - uint64_t w; struct AsanFault f; signed char c, k, *s; if (n > 0) { @@ -431,7 +433,7 @@ struct AsanFault __asan_check(const void *p, long n) { s = (signed char *)a; if (OverlapsShadowSpace(p, n)) { return (struct AsanFault){kAsanProtected, s}; - } else if (IsLegalPointer(a) && !__asan_is_mapped(a >> 16)) { + } else if (kisdangerous((void *)a)) { return (struct AsanFault){kAsanUnmapped, s}; } if (UNLIKELY(k)) { @@ -491,19 +493,6 @@ bool __asan_is_valid_strlist(char *const *p) { } } -static const char *__asan_dscribe_heap_poison(signed char c) { - switch (c) { - case kAsanHeapFree: - return "heap double free"; - case kAsanStackFree: - return "free stack after return"; - case kAsanHeapRelocated: - return "free after relocate"; - default: - return "this corruption"; - } -} - wint_t __asan_symbolize_access_poison(signed char kind) { switch (kind) { case kAsanNullPage: @@ -544,6 +533,10 @@ wint_t __asan_symbolize_access_poison(signed char kind) { return L'G'; case kAsanGlobalGone: return L'𝐺'; + case kAsanGlobalUnderrun: + return L'μ'; + case kAsanGlobalOverrun: + return L'Ω'; default: return L'?'; } @@ -589,16 +582,19 @@ const char *__asan_describe_access_poison(signed char kind) { return "global redzone"; case kAsanGlobalGone: return "global gone"; + case kAsanGlobalUnderrun: + return "global underrun"; + case kAsanGlobalOverrun: + return "global overrun"; default: return "poisoned"; } } -nodiscard static __asan_die_f *__asan_report_invalid_pointer(void *addr) { - __printf("\r\n%sasan error%s: this corruption at 0x%p shadow 0x%p\r\n", - !g_isterminalinarticulate ? "\e[J\e[1;91m" : "", - !g_isterminalinarticulate ? "\e[0m" : "", addr, SHADOW(addr)); - return __asan_die(""); +nodiscard static __asan_die_f *__asan_report_invalid_pointer(const void *addr) { + kprintf("%n\e[J\e[1;31masan error\e[0m: this corruption at %p shadow %p%n", + addr, SHADOW(addr)); + return __asan_die(); } static char *__asan_format_interval(char *p, intptr_t a, intptr_t b) { @@ -607,8 +603,8 @@ static char *__asan_format_interval(char *p, intptr_t a, intptr_t b) { return p; } -static char *__asan_format_section(char *p, void *p1, void *p2, - const char *name, void *addr) { +static char *__asan_format_section(char *p, const void *p1, const void *p2, + const char *name, const void *addr) { intptr_t a, b; if ((a = (intptr_t)p1) < (b = (intptr_t)p2)) { p = __asan_format_interval(p, a, b), *p++ = ' '; @@ -616,26 +612,25 @@ static char *__asan_format_section(char *p, void *p1, void *p2, if (a <= (intptr_t)addr && (intptr_t)addr <= b) { p = __stpcpy(p, " ←address"); } - *p++ = '\r', *p++ = '\n'; + if (__nomultics) *p++ = '\r'; + *p++ = '\n'; } return p; } -nodiscard static __asan_die_f *__asan_report(void *addr, int size, +nodiscard static __asan_die_f *__asan_report(const void *addr, int size, const char *message, signed char kind) { + int i; wint_t c; - int i, cc; signed char t; uint64_t x, y, z; char *p, *q, *base; struct MemoryIntervals *m; p = __fatalbuf; - __printf("\r\n%sasan error%s: %s %d-byte %s at 0x%p shadow 0x%p\r\n", - !g_isterminalinarticulate ? "\e[J\e[1;91m" : "", - !g_isterminalinarticulate ? "\e[0m" : "", - __asan_describe_access_poison(kind), size, message, addr, - SHADOW(addr)); + kprintf("%n\e[J\e[1;31masan error\e[0m: %s %d-byte %s at %p shadow %p%n%s%n", + __asan_describe_access_poison(kind), size, message, addr, + SHADOW(addr), __argv[0]); if (0 < size && size < 80) { base = (char *)addr - ((80 >> 1) - (size >> 1)); for (i = 0; i < 80; ++i) { @@ -649,30 +644,32 @@ nodiscard static __asan_die_f *__asan_report(void *addr, int size, *p++ = ' '; } } - *p++ = '\r', *p++ = '\n'; + if (__nomultics) *p++ = '\r'; + *p++ = '\n'; for (c = i = 0; i < 80; ++i) { if (!(t = __asan_check(base + i, 1).kind)) { - if (!g_isterminalinarticulate && c != 32) { + if (c != 32) { p = __stpcpy(p, "\e[32m"); c = 32; } *p++ = '.'; } else { - if (!g_isterminalinarticulate && c != 31) { + if (c != 31) { p = __stpcpy(p, "\e[31m"); c = 31; } p = __asan_utf8cpy(p, __asan_symbolize_access_poison(t)); } } - if (!g_isterminalinarticulate) p = __stpcpy(p, "\e[39m"); - *p++ = '\r', *p++ = '\n'; + p = __stpcpy(p, "\e[39m"); + if (__nomultics) *p++ = '\r'; + *p++ = '\n'; for (i = 0; (intptr_t)(base + i) & 7; ++i) *p++ = ' '; for (; i + 8 <= 80; i += 8) { q = p + 8; *p++ = '|'; z = ((intptr_t)(base + i) >> 3) + 0x7fff8000; - if (__asan_is_mapped(z >> 16)) { + if (!kisdangerous((void *)z)) { p = __intcpy(p, *(signed char *)z); } else { *p++ = '!'; @@ -682,13 +679,15 @@ nodiscard static __asan_die_f *__asan_report(void *addr, int size, } } for (; i < 80; ++i) *p++ = ' '; - *p++ = '\r', *p++ = '\n'; + if (__nomultics) *p++ = '\r'; + *p++ = '\n'; for (i = 0; i < 80; ++i) { p = __asan_utf8cpy(p, __asan_exists(base + i) ? kCp437[((unsigned char *)base)[i]] : L'⋅'); } - *p++ = '\r', *p++ = '\n'; + if (__nomultics) *p++ = '\r'; + *p++ = '\n'; } p = __asan_format_section(p, _base, _etext, ".text", addr); p = __asan_format_section(p, _etext, _edata, ".data", addr); @@ -701,10 +700,12 @@ nodiscard static __asan_die_f *__asan_report(void *addr, int size, if (x <= z && z <= y) p = __stpcpy(p, " ←address"); z = (((intptr_t)addr >> 3) + 0x7fff8000) >> 16; if (x <= z && z <= y) p = __stpcpy(p, " ←shadow"); - *p++ = '\r', *p++ = '\n'; + if (__nomultics) *p++ = '\r'; + *p++ = '\n'; } *p = 0; - return __asan_die(__fatalbuf); + kprintf("%s", __fatalbuf); + return __asan_die(); } void __asan_verify(const void *p, size_t n) { @@ -726,7 +727,7 @@ nodiscard __asan_die_f *__asan_report_memory_fault(void *addr, int size, __asan_fault(SHADOW(addr), -128).kind); } -const void *__asan_morgue_add(void *p) { +void *__asan_morgue_add(void *p) { void *r; int i, j; for (;;) { @@ -785,6 +786,17 @@ static bool __asan_read48(uint64_t value, uint64_t *x) { return cookie == ('J' | 'T' << 8); } +static void __asan_rawtrace(struct AsanTrace *bt, const struct StackFrame *bp) { + size_t i; + for (i = 0; bp && i < ARRAYLEN(bt->p); ++i, bp = bp->next) { + if (kisdangerous(bp)) break; + bt->p[i] = bp->addr; + } + for (; i < ARRAYLEN(bt->p); ++i) { + bt->p[i] = 0; + } +} + static void __asan_trace(struct AsanTrace *bt, const struct StackFrame *bp) { int f1, f2; size_t i, gi; @@ -792,10 +804,9 @@ static void __asan_trace(struct AsanTrace *bt, const struct StackFrame *bp) { struct Garbages *garbage; garbage = weaken(__garbage); gi = garbage ? garbage->i : 0; - __asan_memset(bt, 0, sizeof(*bt)); for (f1 = -1, i = 0; bp && i < ARRAYLEN(bt->p); ++i, bp = bp->next) { if (f1 != (f2 = ((intptr_t)bp >> 16))) { - if (!__asan_is_mapped(f2)) break; + if (kisdangerous(bp)) break; f1 = f2; } if (!__asan_checka(SHADOW(bp), sizeof(*bp) >> 3).kind) { @@ -809,8 +820,13 @@ static void __asan_trace(struct AsanTrace *bt, const struct StackFrame *bp) { break; } } + for (; i < ARRAYLEN(bt->p); ++i) { + bt->p[i] = 0; + } } +#define __asan_trace __asan_rawtrace + static void *__asan_allocate(size_t a, size_t n, int underrun, int overrun, struct AsanTrace *bt) { char *p; @@ -830,17 +846,14 @@ static void *__asan_allocate(size_t a, size_t n, int underrun, int overrun, return p; } -static struct AsanExtra *__asan_get_extra(void *p, size_t *c) { +static struct AsanExtra *__asan_get_extra(const void *p, size_t *c) { int f; long x, n; struct AsanExtra *e; - if ((0 < (intptr_t)p && (intptr_t)p < 0x800000000000) && - __asan_is_mapped((f = (intptr_t)p >> 16)) && - (LIKELY(f == (int)(((intptr_t)p - 16) >> 16)) || - __asan_is_mapped(((intptr_t)p - 16) >> 16)) && - (n = weaken(dlmalloc_usable_size)(p)) > sizeof(*e) && + f = (intptr_t)p >> 16; + if (!kisdangerous(p) && (n = weaken(dlmalloc_usable_size)(p)) > sizeof(*e) && !__builtin_add_overflow((intptr_t)p, n, &x) && x <= 0x800000000000 && - (LIKELY(f == (int)((x - 1) >> 16)) || __asan_is_mapped((x - 1) >> 16)) && + (LIKELY(f == (int)((x - 1) >> 16)) || !kisdangerous((void *)(x - 1))) && (LIKELY(f == (int)((x = x - sizeof(*e)) >> 16)) || __asan_is_mapped(x >> 16)) && !(x & (alignof(struct AsanExtra) - 1))) { @@ -882,27 +895,25 @@ static size_t __asan_malloc_usable_size(const void *p) { } int __asan_print_trace(void *p) { - intptr_t x; size_t c, i, n; - const char *name; struct AsanExtra *e; if (!(e = __asan_get_extra(p, &c))) { - __printf(" bad pointer"); + kprintf(" bad pointer"); return einval(); } if (!__asan_read48(e->size, &n)) { - __printf(" bad cookie"); + kprintf(" bad cookie"); return -1; } - __printf(" %,d used", n); + kprintf(" %'zu used", n); if (!__asan_is_mapped((((intptr_t)p >> 3) + 0x7fff8000) >> 16)) { - __printf(" (shadow not mapped?!)"); + kprintf(" (shadow not mapped?!)"); } for (i = 0; i < ARRAYLEN(e->bt.p) && e->bt.p[i]; ++i) { - __printf("\n%*x %s", 12, e->bt.p[i], - weaken(__get_symbol_by_addr) - ? weaken(__get_symbol_by_addr)(e->bt.p[i]) - : "please STATIC_YOINK(\"__get_symbol_by_addr\")"); + kprintf("%n%*lx %s", 12, e->bt.p[i], + weaken(__get_symbol_by_addr) + ? weaken(__get_symbol_by_addr)(e->bt.p[i]) + : "please STATIC_YOINK(\"__get_symbol_by_addr\")"); } return 0; } @@ -1078,21 +1089,36 @@ void __asan_unregister_globals(struct AsanGlobal g[], int n) { } } +void __asan_evil(uint8_t *addr, int size, const char *s1, const char *s2) { + struct AsanTrace tr; + __asan_rawtrace(&tr, __builtin_frame_address(0)); + kprintf("WARNING: ASAN error during %s bad %d byte %s at %p bt %p %p %p %p%n", + s1, size, s2, addr, tr.p[0], tr.p[1], tr.p[2], tr.p[3]); +} + void __asan_report_load(uint8_t *addr, int size) { if (cmpxchg(&__asan_noreentry, false, true)) { - __asan_report_memory_fault(addr, size, "load")(); - __asan_unreachable(); + if (!__vforked) { + __asan_report_memory_fault(addr, size, "load")(); + __asan_unreachable(); + } else { + __asan_evil(addr, size, "vfork()", "load"); + } } else { - __printf("WARNING: ASAN error reporting had an ASAN error\r\n"); + __asan_evil(addr, size, "ASAN Reporting", "load"); } } void __asan_report_store(uint8_t *addr, int size) { if (cmpxchg(&__asan_noreentry, false, true)) { - __asan_report_memory_fault(addr, size, "store")(); - __asan_unreachable(); + if (!__vforked) { + __asan_report_memory_fault(addr, size, "store")(); + __asan_unreachable(); + } else { + __asan_evil(addr, size, "vfork()", "store"); + } } else { - __printf("WARNING: ASAN error reporting had an ASAN error\r\n"); + __asan_evil(addr, size, "ASAN reporting", "store"); } } @@ -1138,12 +1164,11 @@ void __asan_install_malloc_hooks(void) { void __asan_map_shadow(uintptr_t p, size_t n) { void *addr; + int i, a, b; size_t size; int prot, flag; - int i, x, a, b; struct DirectMap sm; struct MemoryIntervals *m; - SYSDEBUG("__asan_map_shadow(0x%p, 0x%x)", p, n); assert(!OverlapsShadowSpace((void *)p, n)); m = weaken(_mmi); a = (0x7fff8000 + (p >> 3)) >> 16; @@ -1167,7 +1192,8 @@ void __asan_map_shadow(uintptr_t p, size_t n) { weaken(TrackMemoryInterval)( m, a, a + i - 1, sm.maphandle, PROT_READ | PROT_WRITE, MAP_PRIVATE | *weaken(MAP_ANONYMOUS) | MAP_FIXED) == -1) { - __asan_die("error: could not map asan shadow memory\n")(); + kprintf("error: could not map asan shadow memory%n"); + __asan_die()(); __asan_unreachable(); } __repstosb((void *)(intptr_t)((int64_t)((uint64_t)a << 32) >> 16), @@ -1202,20 +1228,21 @@ static textstartup void __asan_shadow_string_list(char **list) { __asan_map_shadow((uintptr_t)list, (i + 1) * sizeof(char *)); } -static textstartup void __asan_shadow_existing_mappings(void) { - size_t i; - struct MemoryIntervals m; - __asan_memcpy(&m, weaken(_mmi), sizeof(m)); - for (i = 0; i < m.i; ++i) { - __asan_map_shadow((uintptr_t)m.p[i].x << 16, - (uintptr_t)(m.p[i].y - m.p[i].x + 1) << 16); +static textstartup void __asan_shadow_mapping(struct MemoryIntervals *m, + size_t i) { + uintptr_t x, y; + if (i < m->i) { + x = m->p[i].x; + y = m->p[i].y; + __asan_shadow_mapping(m, i + 1); + __asan_map_shadow(x << 16, (y - x + 1) << 16); } - __asan_poison(GetStackAddr(0), PAGESIZE, kAsanStackOverflow); } -static textstartup bool IsMemoryManagementRuntimeLinked(void) { - return weaken(_mmi) && weaken(sys_mmap) && weaken(MAP_ANONYMOUS) && - weaken(TrackMemoryInterval); +static textstartup void __asan_shadow_existing_mappings(void) { + __asan_shadow_mapping(&_mmi, 0); + __asan_map_shadow(GetStackAddr(0), GetStackSize()); + __asan_poison(GetStackAddr(0), PAGESIZE, kAsanStackOverflow); } textstartup void __asan_init(int argc, char **argv, char **envp, @@ -1223,7 +1250,7 @@ textstartup void __asan_init(int argc, char **argv, char **envp, static bool once; if (!cmpxchg(&once, false, true)) return; if (IsWindows() && NtGetVersion() < kNtVersionWindows10) { - __write_str("error: asan binaries require windows10\n"); + __write_str("error: asan binaries require windows10\r\n"); _Exit(0); /* So `make MODE=dbg test` passes w/ Windows7 */ } REQUIRE(_mmi); @@ -1241,7 +1268,7 @@ textstartup void __asan_init(int argc, char **argv, char **envp, __asan_map_shadow(0, 4096); __asan_poison(0, PAGESIZE, kAsanNullPage); if (!IsWindows()) { - __sysv_mprotect((void *)0x00007fff8000, 0x10000, PROT_READ); + __sysv_mprotect((void *)0x7fff8000, 0x10000, PROT_READ); } __asan_shadow_string_list(argv); __asan_shadow_string_list(envp); diff --git a/libc/intrin/asan.internal.h b/libc/intrin/asan.internal.h index 393c7205a..6bcbb2700 100644 --- a/libc/intrin/asan.internal.h +++ b/libc/intrin/asan.internal.h @@ -1,29 +1,10 @@ #ifndef COSMOPOLITAN_LIBC_INTRIN_ASAN_H_ #define COSMOPOLITAN_LIBC_INTRIN_ASAN_H_ #include "libc/calls/struct/iovec.h" +#include "libc/intrin/asancodes.h" #include "libc/macros.internal.h" - -#define kAsanScale 3 -#define kAsanMagic 0x7fff8000 -#define kAsanNullPage -1 /* ∅ 0xff */ -#define kAsanProtected -2 /* P 0xfe */ -#define kAsanHeapFree -3 /* F 0xfd */ -#define kAsanHeapRelocated -4 /* R 0xfc */ -#define kAsanAllocaOverrun -5 /* 𝑂 0xfb */ -#define kAsanHeapUnderrun -6 /* U 0xfa */ -#define kAsanHeapOverrun -7 /* O 0xf9 */ -#define kAsanStackUnscoped -8 /* s 0xf8 */ -#define kAsanStackOverflow -9 /* ! 0xf7 */ -#define kAsanGlobalOrder -10 /* I 0xf6 */ -#define kAsanStackFree -11 /* r 0xf5 */ -#define kAsanStackPartial -12 /* p 0xf4 */ -#define kAsanStackOverrun -13 /* o 0xf3 */ -#define kAsanStackMiddle -14 /* m 0xf2 */ -#define kAsanStackUnderrun -15 /* u 0xf1 */ -#define kAsanAllocaUnderrun -16 /* 𝑈 0xf0 */ -#define kAsanUnmapped -17 /* M 0xef */ -#define kAsanGlobalRedzone -18 /* G 0xee */ -#define kAsanGlobalGone -19 /* 𝐺 0xed */ +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ #define SHADOW(x) ((signed char *)(((intptr_t)(x) >> kAsanScale) + kAsanMagic)) #define UNSHADOW(x) ((void *)(MAX(0, (intptr_t)(x)-kAsanMagic) << kAsanScale)) @@ -32,7 +13,7 @@ typedef void __asan_die_f(void); struct AsanFault { signed char kind; - signed char *shadow; + const signed char *shadow; }; extern bool __asan_noreentry; @@ -58,4 +39,6 @@ void *__asan_memalign(size_t, size_t); size_t __asan_get_heap_size(const void *); void *__asan_realloc_in_place(void *, size_t); +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_INTRIN_ASAN_H_ */ diff --git a/libc/intrin/asancodes.h b/libc/intrin/asancodes.h new file mode 100644 index 000000000..d2320950c --- /dev/null +++ b/libc/intrin/asancodes.h @@ -0,0 +1,28 @@ +#ifndef COSMOPOLITAN_LIBC_INTRIN_ASANCODES_H_ +#define COSMOPOLITAN_LIBC_INTRIN_ASANCODES_H_ + +#define kAsanScale 3 +#define kAsanMagic 0x7fff8000 +#define kAsanNullPage -1 /* ∅ 0xff */ +#define kAsanProtected -2 /* P 0xfe */ +#define kAsanHeapFree -3 /* F 0xfd */ +#define kAsanHeapRelocated -4 /* R 0xfc */ +#define kAsanAllocaOverrun -5 /* 𝑂 0xfb */ +#define kAsanHeapUnderrun -6 /* U 0xfa */ +#define kAsanHeapOverrun -7 /* O 0xf9 */ +#define kAsanStackUnscoped -8 /* s 0xf8 */ +#define kAsanStackOverflow -9 /* ! 0xf7 */ +#define kAsanGlobalOrder -10 /* I 0xf6 */ +#define kAsanStackFree -11 /* r 0xf5 */ +#define kAsanStackPartial -12 /* p 0xf4 */ +#define kAsanStackOverrun -13 /* o 0xf3 */ +#define kAsanStackMiddle -14 /* m 0xf2 */ +#define kAsanStackUnderrun -15 /* u 0xf1 */ +#define kAsanAllocaUnderrun -16 /* 𝑈 0xf0 */ +#define kAsanUnmapped -17 /* M 0xef */ +#define kAsanGlobalRedzone -18 /* G 0xee */ +#define kAsanGlobalGone -19 /* 𝐺 0xed */ +#define kAsanGlobalUnderrun -20 /* μ 0xec */ +#define kAsanGlobalOverrun -21 /* Ω 0xeb */ + +#endif /* COSMOPOLITAN_LIBC_INTRIN_ASANCODES_H_ */ diff --git a/libc/runtime/assertfail.c b/libc/intrin/assertfail.c similarity index 93% rename from libc/runtime/assertfail.c rename to libc/intrin/assertfail.c index ab06ff276..0f912db6d 100644 --- a/libc/runtime/assertfail.c +++ b/libc/intrin/assertfail.c @@ -19,7 +19,7 @@ #include "libc/assert.h" #include "libc/bits/bits.h" #include "libc/bits/weaken.h" -#include "libc/log/libfatal.internal.h" +#include "libc/intrin/kprintf.h" #include "libc/log/log.h" #include "libc/runtime/runtime.h" @@ -29,12 +29,12 @@ relegated wontreturn void __assert_fail(const char *expr, const char *file, int line) { static bool noreentry; - __printf("%s:%d: assert(%s) failed\r\n", file, line, expr); + kprintf("%s:%d: assert(%s) failed%n", file, line, expr); if (cmpxchg(&noreentry, false, true)) { if (weaken(__die)) { weaken(__die)(); } else { - __printf("can't backtrace b/c `__die` not linked\r\n"); + kprintf("can't backtrace b/c `__die` not linked%n"); } quick_exit(23); } diff --git a/libc/intrin/exit.c b/libc/intrin/exit.greg.c similarity index 97% rename from libc/intrin/exit.c rename to libc/intrin/exit.greg.c index 9183d7487..a0a770238 100644 --- a/libc/intrin/exit.c +++ b/libc/intrin/exit.greg.c @@ -16,15 +16,15 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#define ShouldUseMsabiAttribute() 1 #include "libc/calls/internal.h" #include "libc/dce.h" +#include "libc/intrin/kprintf.h" #include "libc/nexgen32e/vendor.internal.h" #include "libc/nt/runtime.h" #include "libc/nt/thunk/msabi.h" #include "libc/sysv/consts/nr.h" -extern void(__msabi* __imp_ExitProcess)(uint32_t); - /** * Terminates process, ignoring destructors and atexit() handlers. * diff --git a/libc/intrin/intrin.mk b/libc/intrin/intrin.mk index 2686b4db4..fb75552bc 100644 --- a/libc/intrin/intrin.mk +++ b/libc/intrin/intrin.mk @@ -57,6 +57,12 @@ o/$(MODE)/libc/intrin/asan.o: \ -finline \ -finline-functions +o/$(MODE)/libc/intrin/kstarttsc.o \ +o/$(MODE)/libc/intrin/nomultics.o \ +o/$(MODE)/libc/intrin/ntconsolemode.o: \ + OVERRIDE_CFLAGS += \ + -fno-sanitize=all + o/$(MODE)/libc/intrin/asan.o \ o/$(MODE)/libc/intrin/ubsan.o: \ OVERRIDE_CFLAGS += \ diff --git a/libc/intrin/kprintf.greg.c b/libc/intrin/kprintf.greg.c new file mode 100644 index 000000000..bf483fa9c --- /dev/null +++ b/libc/intrin/kprintf.greg.c @@ -0,0 +1,798 @@ +/*-*- 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. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#define ShouldUseMsabiAttribute() 1 +#include "libc/bits/bits.h" +#include "libc/bits/likely.h" +#include "libc/bits/safemacros.internal.h" +#include "libc/bits/weaken.h" +#include "libc/calls/calls.h" +#include "libc/calls/internal.h" +#include "libc/dce.h" +#include "libc/errno.h" +#include "libc/fmt/divmod10.internal.h" +#include "libc/fmt/fmt.h" +#include "libc/intrin/kprintf.h" +#include "libc/limits.h" +#include "libc/macros.internal.h" +#include "libc/nexgen32e/rdtsc.h" +#include "libc/nexgen32e/uart.internal.h" +#include "libc/nt/process.h" +#include "libc/nt/runtime.h" +#include "libc/nt/thunk/msabi.h" +#include "libc/runtime/memtrack.internal.h" +#include "libc/runtime/runtime.h" +#include "libc/str/str.h" +#include "libc/str/tpenc.h" +#include "libc/str/utf16.h" +#include "libc/sysv/consts/nr.h" +#include "libc/sysv/consts/prot.h" + +#define MAXT (24 * 60 * 60 * 1000000000ull) +#define WRAP ((MAXT + 1) / 10 * 33) + +struct Timestamps { + unsigned long long birth; + unsigned long long start; +}; + +extern int __pid; +extern bool __replmode; +extern bool __nomultics; +static volatile unsigned long long kbirth; + +privileged static struct Timestamps kenter(void) { + struct Timestamps ts; + ts.start = rdtsc(); + ts.birth = kbirth; + if (!ts.birth) { + ts.birth = kStartTsc; + if (!ts.birth) ts.birth = 1; + cmpxchg(&kbirth, 0, ts.birth); + } + return ts; +} + +privileged static void kleave(struct Timestamps ts) { + uint64_t finish, elapse, adjust; + finish = rdtsc(); + elapse = unsignedsubtract(finish, ts.start); + adjust = ts.birth + elapse; + if (!adjust) adjust = 1; + cmpxchg(&kbirth, ts.birth, adjust); /* ignore overlapping time intervals */ +} + +privileged static inline char *kadvance(char *p, char *e, long n) { + intptr_t t = (intptr_t)p; + if (__builtin_add_overflow(t, n, &t)) t = (intptr_t)e; + return (char *)t; +} + +privileged static char *kemitquote(char *p, char *e, signed char t, + unsigned c) { + if (t) { + if (p < e) { + *p = t < 0 ? 'u' : 'L'; + } + ++p; + } + if (p < e) { + *p = c; + } + ++p; + return p; +} + +privileged static unsigned long long kgetint(va_list va, signed char t, + bool s) { +#ifdef __LP64__ + int bits; + unsigned long long x; + x = va_arg(va, unsigned long); + if (t <= 0) { + bits = 64 - (32 >> MIN(5, -t)); + x <<= bits; + if (s) { + x = (signed long)x >> bits; + } else { + x >>= bits; + } + } + return x; +#else + if (s) { + switch (t) { + case -2: + return (signed char)va_arg(va, int); + case -1: + return (signed short)va_arg(va, int); + default: + return va_arg(va, signed int); + case 1: + return va_arg(va, signed long); + case 2: + return va_arg(va, signed long long); + } + } else { + switch (t) { + case -2: + return (unsigned char)va_arg(va, int); + case -1: + return (unsigned short)va_arg(va, int); + default: + return va_arg(va, unsigned int); + case 1: + return va_arg(va, unsigned long); + case 2: + return va_arg(va, unsigned long long); + } + } +#endif +} + +privileged static inline bool kiskernelpointer(const void *p) { + return 0x7f0000000000 <= (intptr_t)p && (intptr_t)p < 0x800000000000; +} + +privileged static inline bool kistextpointer(const void *p) { + return _base <= (const unsigned char *)p && (const unsigned char *)p < _etext; +} + +privileged static inline bool kisimagepointer(const void *p) { + return _base <= (const unsigned char *)p && (const unsigned char *)p < _end; +} + +privileged static inline bool kischarmisaligned(const char *p, signed char t) { + if (t == -1) return (intptr_t)p & 1; + if (t >= 1) return !!((intptr_t)p & 3); + return false; +} + +privileged static inline bool kismemtrackhosed(void) { + return !((weaken(_mmi)->i <= weaken(_mmi)->n) && + (weaken(_mmi)->p == weaken(_mmi)->s || + weaken(_mmi)->p == (struct MemoryInterval *)kMemtrackStart)); +} + +privileged static bool kismapped(int x) { + size_t m, r, l = 0; + if (!weaken(_mmi)) return true; + if (kismemtrackhosed()) return false; + r = weaken(_mmi)->i; + while (l < r) { + m = (l + r) >> 1; + if (weaken(_mmi)->p[m].y < x) { + l = m + 1; + } else { + r = m; + } + } + if (l < weaken(_mmi)->i && x >= weaken(_mmi)->p[l].x) { + return !!(weaken(_mmi)->p[l].prot & PROT_READ); + } else { + return false; + } +} + +privileged bool kisdangerous(const void *p) { + int frame; + if (kisimagepointer(p)) return false; + if (kiskernelpointer(p)) return false; + if (IsLegalPointer(p)) { + frame = (intptr_t)p >> 16; + if (IsStackFrame(frame)) return false; + if (IsOldStackFrame(frame)) return false; + if (kismapped(frame)) return false; + } + return true; +} + +privileged static void klog(const char *b, size_t n) { + int e; + size_t i; + uint16_t dx; + uint32_t wrote; + unsigned char al; + long rax, rdi, rsi, rdx; + if (IsWindows()) { + e = __imp_GetLastError(); + __imp_WriteFile(__imp_GetStdHandle(kNtStdErrorHandle), b, n, &wrote, 0); + __imp_SetLastError(e); + } else if (IsMetal()) { + for (i = 0; i < n; ++i) { + for (;;) { + dx = 0x3F8 + UART_LSR; + asm("inb\t%1,%0" : "=a"(al) : "dN"(dx)); + if (al & UART_TTYTXR) break; + asm("pause"); + } + dx = 0x3F8; + asm volatile("outb\t%0,%1" + : /* no inputs */ + : "a"(b[i]), "dN"(dx)); + } + } else { + asm volatile("syscall" + : "=a"(rax), "=D"(rdi), "=S"(rsi), "=d"(rdx) + : "0"(__NR_write), "1"(2), "2"(b), "3"(n) + : "rcx", "r8", "r9", "r10", "r11", "memory", "cc"); + } +} + +privileged static size_t kformat(char *b, size_t n, const char *fmt, va_list va, + struct Timestamps ts) { + int si; + wint_t t, u; + const char *abet; + signed char type; + const char *s, *f; + unsigned long long x; + unsigned i, j, m, rem, sign, hash, cols, prec; + char c, *p, *e, pdot, zero, flip, dang, base, quot, z[128]; + if (kistextpointer(b) || kisdangerous(b)) n = 0; + if (!kistextpointer(fmt)) fmt = "!!WONTFMT"; + p = b; + f = fmt; + e = p + n; + for (;;) { + for (;;) { + if (!(c = *f++) || c == '%') break; + EmitFormatByte: + if (p < e) *p = c; + ++p; + } + if (!c) break; + pdot = 0; + flip = 0; + dang = 0; + hash = 0; + sign = 0; + prec = 0; + quot = 0; + type = 0; + cols = 0; + zero = 0; + abet = "0123456789abcdef"; + for (;;) { + switch ((c = *f++)) { + default: + goto EmitFormatByte; + case '\0': + break; + case '.': + pdot = 1; + continue; + case '-': + flip = 1; + continue; + case '#': + hash = '0'; + continue; + case '_': + case ',': + case '\'': + quot = c; + continue; + case ' ': + case '+': + sign = c; + continue; + case 'h': + --type; + continue; + case 'j': + case 'l': + case 'z': + ++type; + continue; + case '!': + dang = 1; + continue; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + si = pdot ? prec : cols; + si *= 10; + si += c - '0'; + goto UpdateCols; + case '*': + si = va_arg(va, int); + UpdateCols: + if (pdot) { + if (si >= 0) { + prec = si; + } + } else { + if (si < 0) { + flip = 1; + si = -si; + } + cols = si; + if (!cols) { + zero = 1; + } + } + continue; + case 'T': + x = unsignedsubtract(ts.start, ts.birth) % WRAP * 10 / 33; + goto FormatUnsigned; + case 'P': + if (!__vforked) { + x = __pid; + } else { + asm volatile("syscall" + : "=a"(x) + : "0"(__NR_getpid) + : "rcx", "rdx", "r11", "memory", "cc"); + } + goto FormatUnsigned; + case 'u': + case 'd': + if (UNLIKELY(type <= -3)) { + s = va_arg(va, int) ? "true" : "false"; + goto FormatString; + } + x = kgetint(va, type, c == 'd'); + FormatDecimal: + if ((long long)x < 0 && c != 'u') { + x = -x; + sign = '-'; + } + FormatUnsigned: + if (x && hash) sign = hash; + for (i = j = 0;;) { + x = DivMod10(x, &rem); + z[i++ & 127] = '0' + rem; + if (pdot ? i >= prec : !x) break; + if (quot && ++j == 3) { + z[i++ & 127] = quot; + j = 0; + } + } + EmitNumber: + if (flip || pdot) zero = 0; + while (zero && sign) { + if (p < e) *p = sign; + if (cols) --cols; + sign >>= 8; + ++p; + } + t = !!sign + !!(sign >> 8); + if (!flip && cols >= t) { + for (j = i; j < cols - t; ++j) { + if (p < e) { + *p++ = zero ? '0' : ' '; + } else { + p = kadvance(p, e, cols - t - j); + break; + } + } + } + while (sign) { + if (p < e) *p = sign; + sign >>= 8; + ++p; + } + for (j = i; j; ++p) { + --j; + if (p < e) { + *p = z[j & 127]; + } + } + if (flip && cols >= t) { + for (j = i; j < cols - t; ++j) { + if (p < e) { + *p++ = ' '; + } else { + p = kadvance(p, e, cols - t - j); + break; + } + } + } + break; + case 'b': + base = 1; + if (hash) hash = '0' | 'b' << 8; + BinaryNumber: + x = kgetint(va, type, false); + FormatNumber: + i = 0; + m = (1 << base) - 1; + if (hash && x) sign = hash; + do z[i++ & 127] = abet[x & m]; + while ((x >>= base) || (pdot && i < prec)); + goto EmitNumber; + case 'X': + abet = "0123456789ABCDEF"; + /* fallthrough */ + case 'x': + base = 4; + if (hash) hash = '0' | 'x' << 8; + goto BinaryNumber; + case 'o': + base = 3; + goto BinaryNumber; + case 'p': + x = va_arg(va, intptr_t); + if (!x && pdot) pdot = 0; + if ((long)x == -1) { + pdot = 0; + goto FormatDecimal; + } + hash = '0' | 'x' << 8; + base = 4; + goto FormatNumber; + case 'C': + c = 'c'; + type = 1; + /* fallthrough */ + case 'c': + i = 1; + j = 0; + x = 0; + s = (const char *)&x; + t = va_arg(va, int); + if (!type) t &= 255; + if (hash) { + quot = 1; + hash = '\''; + p = kemitquote(p, e, type, hash); + if (cols && type) --cols; /* u/L */ + if (cols) --cols; /* start quote */ + if (cols) --cols; /* end quote */ + } + goto EmitChar; + case 'm': + if (!(x = errno) && sign == ' ') { + break; + } else if (weaken(strerror_r) && + !weaken(strerror_r)(x, z, sizeof(z))) { + s = z; + goto FormatString; + } else { + goto FormatDecimal; + } + case 'n': + if (__nomultics) { + if (p < e) *p = '\r'; + ++p; + } + if (p < e) *p = '\n'; + ++p; + break; + case 'r': + if (!__replmode) { + break; + } else { + s = "\r\033[K"; + goto FormatString; + } + case 'S': + c = 's'; + type = 1; + /* fallthrough */ + case 's': + if (!(s = va_arg(va, const void *))) { + s = sign != ' ' ? "NULL" : ""; + FormatString: + type = 0; + hash = 0; + } else if (!dang && (kisdangerous(s) || kischarmisaligned(s, type))) { + if (sign == ' ') { + if (p < e) *p = ' '; + ++p; + } + x = (intptr_t)s; + base = 4; + hash = '!' | '!' << 8; + goto FormatNumber; + } else if (hash) { + quot = 1; + hash = '"'; + if (cols && type) --cols; /* u/L */ + if (cols) --cols; /* start quote */ + if (cols) --cols; /* end quote */ + p = kemitquote(p, e, type, hash); + } + if (sign == ' ' && (!pdot || prec) && *s) { + if (p < e) *p = ' '; + ++p; + } + for (i = j = 0; !pdot || j < prec; ++j) { + if (UNLIKELY(!((intptr_t)s & (PAGESIZE - 1)))) { + if (!dang && kisdangerous(s)) break; + } + if (!type) { + if (!(t = *s++ & 255)) break; + if ((t & 0300) == 0200) goto ActuallyEmitByte; + ++i; + EmitByte: + if (UNLIKELY(quot) && (t == '\\' || ((t == '"' && c == 's') || + (t == '\'' && c == 'c')))) { + if (p + 2 <= e) { + p[0] = '\\'; + p[1] = t; + } + p += 2; + i += 1; + continue; + } + if (pdot || + (t != 0x7F && (t >= 0x20 || (t == '\n' || t == '\t' || + t == '\r' || t == '\e')))) { + ActuallyEmitByte: + if (p < e) *p = t; + p += 1; + continue; + } else if (quot) { + if (p + 4 <= e) { + p[0] = '\\'; + p[1] = '0' + ((t & 0300) >> 6); + p[2] = '0' + ((t & 0070) >> 3); + p[3] = '0' + ((t & 0007) >> 0); + } + p += 4; + i += 3; + continue; + } else { + /* Control Pictures + ═══════════════════════════════════════════════════════ + 2400 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f + ─────────────────────────────────────────────────────── + 2400 │ ␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ + 2410 │ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ + 2420 │ ␠ ␡ ␢ ␣ ␤ ␥ ␦ */ + if (t != 0x7F) { + t += 0x2400; + } else { + t = 0x2421; + } + goto EmitChar; + } + } else if (type < -1) { + if ((t = *s++ & 255)) { + t = kCp437[t]; + } + } else if (type < 0) { + t = *(const char16_t *)s; + s += sizeof(char16_t); + if (IsHighSurrogate(t)) { + if (!pdot || j + 1 < prec) { + if (UNLIKELY(!((intptr_t)s & (PAGESIZE - 1)))) { + if (!dang && kisdangerous(s)) break; + } + u = *(const char16_t *)s; + if (IsLowSurrogate(u)) { + t = MergeUtf16(t, u); + s += sizeof(char16_t); + j += 1; + } + } else { + break; + } + } else if (!t) { + break; + } + } else { + t = *(const wchar_t *)s; + s += sizeof(wchar_t); + } + if (!t) break; + ++i; + EmitChar: + if (t <= 0x7f) { + goto EmitByte; + } else if (t <= 0x7ff) { + if (p + 2 <= e) { + p[0] = 0300 | (t >> 6); + p[1] = 0200 | (t & 077); + } + p += 2; + } else if (t <= 0xffff) { + if (UNLIKELY(IsSurrogate(t))) { + EncodeReplacementCharacter: + t = 0xfffd; + } + if (p + 3 <= e) { + p[0] = 0340 | (t >> 12); + p[1] = 0200 | ((t >> 6) & 077); + p[2] = 0200 | (t & 077); + } + p += 3; + } else if (~(t >> 18) & 007) { + if (p + 4 <= e) { + p[0] = 0360 | (t >> 18); + p[1] = 0200 | ((t >> 12) & 077); + p[2] = 0200 | ((t >> 6) & 077); + p[3] = 0200 | (t & 077); + } + p += 4; + } else { + goto EncodeReplacementCharacter; + } + } + if (hash) { + if (p < e) *p = hash; + ++p; + } + for (; cols > i; --cols) { + if (p < e) { + *p++ = ' '; + } else { + p = kadvance(p, e, cols - i); + break; + } + } + break; + } + break; + } + } + if (p < e) { + *p = 0; + } else if (e > b) { + u = 0; + *--e = 0; + s = "\n..."; + if (!(((f - fmt) >= 2 && f[-2] == '\n') || + ((f - fmt) >= 3 && f[-3] == '%' && f[-2] == 'n'))) { + ++s; + } + while ((t = *s++) && e > b) { + u = *--e; + *e = t; + } + if ((u & 0300) == 0200) { + while (e > b) { + u = *--e; + *e = '.'; + if ((u & 0300) != 0200) { + break; + } + } + } + } + return p - b; +} + +/** + * Privileged snprintf(). + * + * @param b is buffer, and guaranteed a NUL-terminator if `n>0` + * @param n is number of bytes available in buffer + * @return length of output excluding NUL, which may exceed `n` + * @see kprintf() for documentation + * @asyncsignalsafe + * @vforksafe + */ +privileged size_t ksnprintf(char *b, size_t n, const char *fmt, ...) { + size_t m; + va_list v; + struct Timestamps t = {0}; + va_start(v, fmt); + m = kformat(b, n, fmt, v, t); + va_end(v); + return m; +} + +/** + * Privileged vsnprintf(). + * + * @param b is buffer, and guaranteed a NUL-terminator if `n>0` + * @param n is number of bytes available in buffer + * @return length of output excluding NUL, which may exceed `n` + * @see kprintf() for documentation + * @asyncsignalsafe + * @vforksafe + */ +privileged size_t kvsnprintf(char *b, size_t n, const char *fmt, va_list v) { + struct Timestamps t = {0}; + return kformat(b, n, fmt, v, t); +} + +/** + * Privileged vprintf. + * + * @see kprintf() for documentation + * @asyncsignalsafe + * @vforksafe + */ +privileged void kvprintf(const char *fmt, va_list v) { + size_t n; + char b[2048]; + struct Timestamps t; + if (!v) return; + t = kenter(); + n = kformat(b, sizeof(b), fmt, v, t); + klog(b, MIN(n, sizeof(b))); + kleave(t); +} + +/** + * Privileged printf(). + * + * This function is intended for crash reporting. It's designed to be as + * unbreakable as possible, so that error messages can always be printed + * even when the rest of the runtime is broken. As such, it has continue + * on error semantics, doesn't support buffering between invocations and + * floating point is not supported. Output is also truncated if the line + * gets too long, but care is taken to preserve your newline characters. + * Your errno and GetLastError() state will not be clobbered, and ftrace + * and other runtime magic won't be invoked, since all the runtime magic + * depends on this function. + * + * Directives: + * + * %[FLAGS][WIDTH|*][.[PRECISION|*]][TYPE]SPECIFIER + * + * Specifiers: + * + * - `P` pid + * - `c` char + * - `o` octal + * - `b` binary + * - `s` string + * - `p` pointer + * - `d` decimal + * - `n` newline + * - `u` unsigned + * - `r` carriage + * - `m` strerror + * - `X` uppercase + * - `T` timestamp + * - `x` hexadecimal + * + * Types: + * + * - `hhh` bool + * - `hh` char or cp437 + * - `h` short or char16_t + * - `l` long or wchar_t + * - `ll` long long + * + * Flags: + * + * - `0` zero padding + * - `-` flip alignment + * - `!` bypass memory safety + * - `,` thousands grouping w/ comma + * - `'` thousands grouping w/ apostrophe + * - `_` thousands grouping w/ underscore + * - `+` plus leftpad if positive (aligns w/ negatives) + * - ` ` space leftpad if positive (aligns w/ negatives) + * - `#` represent value with literal syntax, e.g. 0x, 0b, quotes + * + * @asyncsignalsafe + * @vforksafe + */ +privileged void kprintf(const char *fmt, ...) { + /* system call support runtime depends on this function */ + /* function tracing runtime depends on this function */ + /* asan runtime depends on this function */ + va_list v; + va_start(v, fmt); + kvprintf(fmt, v); + va_end(v); +} diff --git a/libc/intrin/kprintf.h b/libc/intrin/kprintf.h new file mode 100644 index 000000000..5bc910675 --- /dev/null +++ b/libc/intrin/kprintf.h @@ -0,0 +1,14 @@ +#ifndef COSMOPOLITAN_LIBC_INTRIN_KPRINTF_H_ +#define COSMOPOLITAN_LIBC_INTRIN_KPRINTF_H_ +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ + +void kprintf(const char *, ...); +size_t ksnprintf(char *, size_t, const char *, ...); +void kvprintf(const char *, va_list); +size_t kvsnprintf(char *, size_t, const char *, va_list); +bool kisdangerous(const void *); + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_LIBC_INTRIN_KPRINTF_H_ */ diff --git a/libc/nexgen32e/kstarttsc.S b/libc/intrin/kstarttsc.c similarity index 72% rename from libc/nexgen32e/kstarttsc.S rename to libc/intrin/kstarttsc.c index 8822ae9cb..598fd54db 100644 --- a/libc/nexgen32e/kstarttsc.S +++ b/libc/intrin/kstarttsc.c @@ -1,7 +1,7 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 sw=8 fenc=utf-8 :vi│ +/*-*- 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 2020 Justine Alexandra Roberts Tunney │ +│ 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 │ @@ -16,24 +16,11 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" -// Stores CPU Timestamp Counter at startup. -// -// It can be useful as an added source of seeding information. -// -// @note rdtsc is a 25 cycle instruction - .initbss 200,_init_kStartTsc -kStartTsc: - .quad 0 - .endobj kStartTsc,globl - .previous - - .init.start 200,_init_kStartTsc - rdtsc - stosl - xchg %edx,%eax - stosl - .init.end 200,_init_kStartTsc - - .source __FILE__ +/** + * Timestamp of process start. + * + * @see libc/runtime/winmain.greg.h + * @see libc/crt/crt.S + */ +uint64_t kStartTsc; diff --git a/libc/intrin/nomultics.c b/libc/intrin/nomultics.c new file mode 100644 index 000000000..036f89f49 --- /dev/null +++ b/libc/intrin/nomultics.c @@ -0,0 +1,30 @@ +/*-*- 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. │ +╚─────────────────────────────────────────────────────────────────────────────*/ + +/** + * Controls disablement of MULTICS newlines. + * + * Normally we use `\n` for newlines. If this is `true` then we'll try + * our best to use `\r\n`. This is toggled automatically on Windows or + * when `ioctl(TCSETS)` disables `OPOST`. + * + * @see kprintf() + */ +bool __nomultics; +bool __replmode; diff --git a/libc/intrin/ntconsolemode.c b/libc/intrin/ntconsolemode.c new file mode 100644 index 000000000..f25cb4a99 --- /dev/null +++ b/libc/intrin/ntconsolemode.c @@ -0,0 +1,21 @@ +/*-*- 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/runtime/internal.h" + +uint32_t __ntconsolemode[2]; diff --git a/libc/intrin/printf.c b/libc/intrin/printf.c deleted file mode 100644 index 1ad0b9a2b..000000000 --- a/libc/intrin/printf.c +++ /dev/null @@ -1,242 +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/limits.h" -#include "libc/log/libfatal.internal.h" -#include "libc/nexgen32e/uart.internal.h" -#include "libc/nt/runtime.h" -#include "libc/runtime/runtime.h" -#include "libc/str/tpenc.h" -#include "libc/sysv/consts/nr.h" - -/** - * Privileged vprintf. - * - * This will work without any cosmopolitan runtime support once the - * executable has been loaded into memory. - */ -privileged noasan noubsan noinstrument void __vprintf(const char *fmt, - va_list va) { - short w[2]; - uint16_t dx; - const void *s; - uint32_t wrote; - unsigned long x; - unsigned char al; - int i, j, t, cstr; - long d, rax, rdi, rsi, rdx, dot; - char c, *p, *e, pad, bits, base, sign, thou, z[28], b[2048]; - p = b; - e = p + sizeof(b); - do { - switch ((c = *fmt++)) { - default: - if (p < e) { - *p++ = c; - } - break; - case '\0': - break; - case '%': - dot = 0; - pad = ' '; - sign = 0; - bits = 0; - thou = 0; - w[0] = 0; - w[1] = SHRT_MAX; - NeedMoar: - switch ((c = *fmt++)) { - case '\0': - break; - case 'l': - case 'z': - goto NeedMoar; - case ' ': - case '+': - sign = c; - goto NeedMoar; - case 'e': - dot = 1; - goto NeedMoar; - case ',': - thou = c; - goto NeedMoar; - case 'h': - bits = 16; - goto NeedMoar; - case '0': - pad = c; - /* fallthrough */ - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - w[dot] *= 10; - w[dot] += c - '0'; - goto NeedMoar; - case '*': - w[dot] = va_arg(va, int); - goto NeedMoar; - case 'd': - d = va_arg(va, long); - ApiAbuse: - x = d; - if (d < 0) { - x = -x; - sign = '-'; - } - for (i = j = 0;;) { - z[i++] = x % 10 + '0'; - if (!(x /= 10)) break; - if (thou && !(++j % 3)) { - z[i++] = thou; - } - } - if (sign) { - z[i++] = sign; - } - EmitNumber: - while (w[0]-- > i) { - if (p < e) *p++ = pad; - } - do { - if (p < e) *p++ = z[--i]; - } while (i); - break; - case 'b': - base = 1; - BinaryNumber: - i = 0; - x = va_arg(va, unsigned long); - do z[i++] = "0123456789abcdef"[x & ((1 << base) - 1)]; - while ((x >>= base) && i < w[1]); - goto EmitNumber; - case 'p': - pad = '0'; - w[0] = 12; - w[1] = 12; - /* fallthrough */ - case 'x': - base = 4; - goto BinaryNumber; - case 'o': - base = 3; - goto BinaryNumber; - case 'c': - cstr = va_arg(va, int); - s = &cstr; - goto EmitString; - case 's': - s = va_arg(va, const void *); - EmitString: - if (!s) { - s = "NULL"; - bits = 0; - } else if ((uintptr_t)s < PAGESIZE) { - d = (intptr_t)s; - goto ApiAbuse; - } - for (i = 0; i < w[1]; ++i) { - if (!bits) { - t = ((const char *)s)[i]; - EmitByte: - if (t) { - if (p < e) { - *p++ = t; - } - } else { - break; - } - } else { - t = ((const char16_t *)s)[i]; - if (t <= 0x7f) { - goto EmitByte; - } else if (t <= 0x7ff) { - if (p + 1 < e) { - p[0] = 0300 | t >> 6; - p[1] = 0200 | x << 8 | t & 077; - p += 2; - } - } else if (p + 2 < e) { - p[0] = 0340 | t >> 12; - p[1] = 0200 | x << 8 | (t >> 6) & 077; - p[2] = 0200 | x << 8 | t & 077; - p += 3; - } - } - } - while (w[0]-- > i) { - if (p < e) *p++ = pad; - } - break; - default: - break; - } - break; - } - } while (c); - if (p == e) { - e[-4] = '.'; - e[-3] = '.'; - e[-2] = '.'; - e[-1] = '\n'; - } - if (IsWindows()) { - WriteFile(GetStdHandle(kNtStdErrorHandle), b, p - b, &wrote, 0); - } else if (IsMetal()) { - for (e = p, p = b; p < e; ++p) { - for (;;) { - dx = 0x3F8 + UART_LSR; - asm("inb\t%1,%0" : "=a"(al) : "dN"(dx)); - if (al & UART_TTYTXR) break; - asm("pause"); - } - dx = 0x3F8; - asm volatile("outb\t%0,%1" - : /* no inputs */ - : "a"(*p), "dN"(dx)); - } - } else { - asm volatile("syscall" - : "=a"(rax), "=D"(rdi), "=S"(rsi), "=d"(rdx) - : "0"(__NR_write), "1"(2L), "2"(b), "3"(p - b) - : "rcx", "r8", "r9", "r10", "r11", "memory", "cc"); - } -} - -/** - * Privileged printf. - * - * This will work without any cosmopolitan runtime support once the - * executable has been loaded into memory. - */ -privileged noasan noubsan noinstrument void __printf(const char *fmt, ...) { - /* system call support runtime depends on this function */ - /* function tracing runtime depends on this function */ - /* asan runtime depends on this function */ - va_list va; - va_start(va, fmt); - __vprintf(fmt, va); - va_end(va); -} diff --git a/libc/runtime/quick_exit.c b/libc/intrin/quick_exit.c similarity index 85% rename from libc/runtime/quick_exit.c rename to libc/intrin/quick_exit.c index aea08672c..54e37e172 100644 --- a/libc/runtime/quick_exit.c +++ b/libc/intrin/quick_exit.c @@ -16,15 +16,16 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/bits/pushpop.h" #include "libc/bits/weaken.h" +#include "libc/dce.h" #include "libc/nt/console.h" -#include "libc/nt/enum/consolemodeflags.h" #include "libc/nt/runtime.h" #include "libc/runtime/internal.h" #include "libc/runtime/runtime.h" #include "libc/stdio/stdio.h" +const char kConsoleHandles[2] = {kNtStdInputHandle, kNtStdOutputHandle}; + /** * Exits process faster. * @@ -32,18 +33,18 @@ * @noreturn */ wontreturn void quick_exit(int exitcode) { + int i; const uintptr_t *p; if (weaken(fflush)) { weaken(fflush)(0); } + if (SupportsWindows() && __ntconsolemode[0]) { + for (i = 0; i < 2; ++i) { + SetConsoleMode(GetStdHandle(kConsoleHandles[i]), __ntconsolemode[i]); + } + } for (p = __fini_array_end; p > __fini_array_start;) { ((void (*)(void))(*--p))(); } - if (SupportsWindows() && __ntconsolemode) { - SetConsoleMode(GetStdHandle(pushpop(kNtStdInputHandle)), __ntconsolemode); - SetConsoleMode(GetStdHandle(pushpop(kNtStdOutputHandle)), - kNtEnableProcessedOutput | kNtEnableWrapAtEolOutput | - kNtEnableVirtualTerminalProcessing); - } _Exit(exitcode); } diff --git a/libc/intrin/ubsan.c b/libc/intrin/ubsan.c index ae95fede5..2b0458ff1 100644 --- a/libc/intrin/ubsan.c +++ b/libc/intrin/ubsan.c @@ -21,6 +21,7 @@ #include "libc/bits/weaken.h" #include "libc/calls/calls.h" #include "libc/fmt/fmt.h" +#include "libc/intrin/kprintf.h" #include "libc/log/internal.h" #include "libc/log/libfatal.internal.h" #include "libc/log/log.h" @@ -189,7 +190,7 @@ static uintptr_t __ubsan_extend(struct UbsanTypeDescriptor *t, uintptr_t x) { void __ubsan_abort(const struct UbsanSourceLocation *loc, const char *description) { - __printf("\r\n%s:%d: ubsan error: %s\r\n", loc->file, loc->line, description); + kprintf("%n%s:%d: ubsan error: %s%n", loc->file, loc->line, description); if (weaken(__die)) weaken(__die)(); _Exit(134); } @@ -258,7 +259,7 @@ void __ubsan_handle_type_mismatch(struct UbsanTypeMismatchInfo *info, p = __stpcpy(p, " align "); p = __intcpy(p, info->alignment); } else { - p = __stpcpy(p, "insufficient size\r\n\t"); + p = __stpcpy(p, "insufficient size%n\t"); p = __stpcpy(p, kind); p = __stpcpy(p, " address 0x"); p = __fixcpy(p, pointer, sizeof(pointer) * CHAR_BIT); diff --git a/libc/calls/vforked.c b/libc/intrin/vforked.c similarity index 100% rename from libc/calls/vforked.c rename to libc/intrin/vforked.c diff --git a/libc/log/addr2linepath.c b/libc/log/addr2linepath.c index b2af0c798..44b51de5a 100644 --- a/libc/log/addr2linepath.c +++ b/libc/log/addr2linepath.c @@ -18,6 +18,6 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/log/log.h" -noasan const char *GetAddr2linePath(void) { +const char *GetAddr2linePath(void) { return commandvenv("ADDR2LINE", "addr2line"); } diff --git a/libc/log/attachdebugger.c b/libc/log/attachdebugger.c index 7dacf176a..e1d731268 100644 --- a/libc/log/attachdebugger.c +++ b/libc/log/attachdebugger.c @@ -19,6 +19,7 @@ #include "libc/bits/safemacros.internal.h" #include "libc/calls/calls.h" #include "libc/fmt/fmt.h" +#include "libc/intrin/kprintf.h" #include "libc/log/color.internal.h" #include "libc/log/gdb.h" #include "libc/log/internal.h" @@ -50,17 +51,17 @@ * @return gdb pid if continuing, 0 if detached, or -1 w/ errno * @note this is called via eponymous spinlock macro wrapper */ -relegated int(attachdebugger)(intptr_t continuetoaddr) { +relegated int(AttachDebugger)(intptr_t continuetoaddr) { int pid, ttyfd; struct StackFrame *bp; char pidstr[11], breakcmd[40]; const char *se, *elf, *gdb, *rewind, *layout; - if (IsGenuineCosmo() || !(gdb = GetGdbPath()) || + if (IsGenuineCosmo() || !(gdb = GetGdbPath()) || !isatty(0) || !isatty(1) || (ttyfd = open(_PATH_TTY, O_RDWR | O_CLOEXEC)) == -1) { return -1; } __restore_tty(ttyfd); - snprintf(pidstr, sizeof(pidstr), "%u", getpid()); + ksnprintf(pidstr, sizeof(pidstr), "%u", getpid()); layout = "layout asm"; if ((elf = FindDebugBinary())) { se = "-se"; @@ -75,12 +76,12 @@ relegated int(attachdebugger)(intptr_t continuetoaddr) { continuetoaddr = bp->addr; } rewind = "-ex"; - snprintf(breakcmd, sizeof(breakcmd), "%s *%#p", "break", continuetoaddr); + ksnprintf(breakcmd, sizeof(breakcmd), "%s *%#p", "break", continuetoaddr); } else { rewind = NULL; breakcmd[0] = '\0'; } - if (!(pid = vfork())) { + if (!(pid = fork())) { dup2(ttyfd, 0); dup2(ttyfd, 1); execv(gdb, (char *const[]){ diff --git a/libc/log/backtrace2.c b/libc/log/backtrace2.c index e5bb6b764..74872127f 100644 --- a/libc/log/backtrace2.c +++ b/libc/log/backtrace2.c @@ -27,6 +27,7 @@ #include "libc/fmt/conv.h" #include "libc/fmt/fmt.h" #include "libc/fmt/itoa.h" +#include "libc/intrin/kprintf.h" #include "libc/log/backtrace.internal.h" #include "libc/log/libfatal.internal.h" #include "libc/log/log.h" @@ -46,8 +47,7 @@ #define kBacktraceMaxFrames 128 #define kBacktraceBufSize ((kBacktraceMaxFrames - 1) * (18 + 1)) -static noasan int PrintBacktraceUsingAddr2line(int fd, - const struct StackFrame *bp) { +static int PrintBacktraceUsingAddr2line(int fd, const struct StackFrame *bp) { ssize_t got; intptr_t addr; size_t i, j, gi; @@ -57,10 +57,32 @@ static noasan int PrintBacktraceUsingAddr2line(int fd, const struct StackFrame *frame; char *debugbin, *p1, *p2, *p3, *addr2line; char buf[kBacktraceBufSize], *argv[kBacktraceMaxFrames]; - if (IsOpenbsd()) return -1; - if (IsWindows()) return -1; - if (!(debugbin = FindDebugBinary())) return -1; - if (!(addr2line = GetAddr2linePath())) return -1; + + if (!(debugbin = FindDebugBinary())) { + if (IsLinux()) { + kprintf("warning: can't find debug binary try setting COMDBG%n"); + } + return -1; + } + + if (!(addr2line = GetAddr2linePath())) { + if (IsLinux()) { + kprintf("warning: can't find addr2line try setting ADDR2LINE%n"); + } + return -1; + } + + /* + * DWARF is a weak standard. If we build on Linux then only the + * precice same version of the same tools on Linux can be counted upon + * to work reliably. So if it's not Linux, we fall back to our builtin + * tooling which can be counted upon. + */ + if (!IsLinux()) { + kprintf("note: won't print addr2line backtrace on non-linux%n"); + return -1; + } + i = 0; j = 0; argv[i++] = "addr2line"; @@ -92,8 +114,8 @@ static noasan int PrintBacktraceUsingAddr2line(int fd, if (!(pid = vfork())) { sigprocmask(SIG_SETMASK, &savemask, NULL); dup2(pipefds[1], 1); - close(pipefds[0]); - close(pipefds[1]); + if (pipefds[0] != 1) close(pipefds[0]); + if (pipefds[1] != 1) close(pipefds[1]); execvp(addr2line, argv); _exit(127); } @@ -101,36 +123,6 @@ static noasan int PrintBacktraceUsingAddr2line(int fd, while ((got = read(pipefds[0], buf, kBacktraceBufSize)) > 0) { p1 = buf; p3 = p1 + got; - - /* - * Remove deep libc error reporting facilities from backtraces. - * - * For example, if the following shows up in Emacs: - * - * 40d097: __die at libc/log/die.c:33 - * 434daa: __asan_die at libc/intrin/asan.c:483 - * 435146: __asan_report_memory_fault at libc/intrin/asan.c:524 - * 435b32: __asan_report_store at libc/intrin/asan.c:719 - * 43472e: __asan_report_store1 at libc/intrin/somanyasan.S:118 - * 40c3a9: GetCipherSuite at net/https/getciphersuite.c:80 - * 4383a5: GetCipherSuite_test at test/net/https/getciphersuite.c:23 - * ... - * - * Then it's unpleasant to need to press C-x C-n six times. - */ -#if 0 - while ((p2 = memchr(p1, '\n', p3 - p1))) { - if (memmem(p1, p2 - p1, ": __asan_", 9) || - memmem(p1, p2 - p1, ": __die", 7)) { - memmove(p1, p2 + 1, p3 - (p2 + 1)); - p3 -= p2 + 1 - p1; - } else { - p1 = p2 + 1; - break; - } - } -#endif - /* * remove racist output from gnu tooling, that can't be disabled * otherwise, since it breaks other tools like emacs that aren't @@ -165,7 +157,7 @@ static noasan int PrintBacktraceUsingAddr2line(int fd, } } -static noasan int PrintBacktrace(int fd, const struct StackFrame *bp) { +static int PrintBacktrace(int fd, const struct StackFrame *bp) { if (!IsTiny()) { if (PrintBacktraceUsingAddr2line(fd, bp) != -1) { return 0; @@ -174,21 +166,23 @@ static noasan int PrintBacktrace(int fd, const struct StackFrame *bp) { return PrintBacktraceUsingSymbols(fd, bp, GetSymbolTable()); } -noasan void ShowBacktrace(int fd, const struct StackFrame *bp) { +void ShowBacktrace(int fd, const struct StackFrame *bp) { #ifdef __FNO_OMIT_FRAME_POINTER__ /* asan runtime depends on this function */ static bool noreentry; - ++g_ftrace; + --g_ftrace; if (!bp) bp = __builtin_frame_address(0); if (!noreentry) { noreentry = true; PrintBacktrace(fd, bp); noreentry = false; + } else { + kprintf("warning: re-entered ShowBackTrace()%n"); } - --g_ftrace; + ++g_ftrace; #else - __printf("ShowBacktrace() needs these flags to show C backtrace:\n" - "\t-D__FNO_OMIT_FRAME_POINTER__\n" - "\t-fno-omit-frame-pointer\n"); + kprintf("ShowBacktrace() needs these flags to show C backtrace:%n" + "\t-D__FNO_OMIT_FRAME_POINTER__%n" + "\t-fno-omit-frame-pointer%n"); #endif } diff --git a/libc/log/backtrace3.c b/libc/log/backtrace3.c index ed2fc87d4..24f8d15d1 100644 --- a/libc/log/backtrace3.c +++ b/libc/log/backtrace3.c @@ -22,8 +22,8 @@ #include "libc/calls/calls.h" #include "libc/fmt/fmt.h" #include "libc/fmt/itoa.h" +#include "libc/intrin/kprintf.h" #include "libc/log/backtrace.internal.h" -#include "libc/log/libfatal.internal.h" #include "libc/macros.internal.h" #include "libc/nexgen32e/gc.internal.h" #include "libc/nexgen32e/stackframe.h" @@ -51,17 +51,16 @@ noinstrument noasan int PrintBacktraceUsingSymbols(int fd, int i, symbol, addend; struct Garbages *garbage; const struct StackFrame *frame; - ++g_ftrace; if (!bp) bp = __builtin_frame_address(0); garbage = weaken(__garbage); gi = garbage ? garbage->i : 0; for (i = 0, frame = bp; frame; frame = frame->next) { if (!IsValidStackFramePointer(frame)) { - __printf("%p corrupt frame pointer\n", frame); + kprintf("%p corrupt frame pointer%n", frame); break; } if (++i == LIMIT) { - __printf("\n"); + kprintf("%n"); break; } addr = frame->addr; @@ -85,9 +84,8 @@ noinstrument noasan int PrintBacktraceUsingSymbols(int fd, } else { addend = 0; } - __printf("%p %p %s%+d\r\n", frame, addr, __get_symbol_name(st, symbol), - addend); + kprintf("%012lx %012lx %s%+d\r%n", frame, addr, + __get_symbol_name(st, symbol), addend); } - --g_ftrace; return 0; } diff --git a/libc/log/checkfail_ndebug.c b/libc/log/checkfail_ndebug.c index 7217e487d..e1f655883 100644 --- a/libc/log/checkfail_ndebug.c +++ b/libc/log/checkfail_ndebug.c @@ -17,8 +17,8 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/errno.h" +#include "libc/intrin/kprintf.h" #include "libc/log/internal.h" -#include "libc/log/libfatal.internal.h" #include "libc/runtime/runtime.h" #include "libc/str/str.h" @@ -35,8 +35,8 @@ relegated void ___check_fail_ndebug(uint64_t want, uint64_t got, const char *opchar) { __restore_tty(1); - __printf("\n%serror: %s: check failed: 0x%x %s 0x%x (%s)\n", - !g_isterminalinarticulate ? "\e[J" : "", program_invocation_name, - want, opchar, got, strerror(errno)); + kprintf("%n%serror: %s: check failed: 0x%x %s 0x%x (%s)%n", + !g_isterminalinarticulate ? "\e[J" : "", program_invocation_name, + want, opchar, got, strerror(errno)); exit(1); } diff --git a/libc/log/gdb.h b/libc/log/gdb.h index 0eccb440e..0444a8f45 100644 --- a/libc/log/gdb.h +++ b/libc/log/gdb.h @@ -18,10 +18,10 @@ COSMOPOLITAN_C_START_ extern volatile int g_gdbsync; int gdbexec(const char *); -int attachdebugger(intptr_t); +int AttachDebugger(intptr_t); -#define attachdebugger(CONTINUE_TO_ADDR) /* shorten backtraces */ \ - SYNCHRONIZE_DEBUGGER((attachdebugger)(CONTINUE_TO_ADDR)) +#define AttachDebugger(CONTINUE_TO_ADDR) /* shorten backtraces */ \ + SYNCHRONIZE_DEBUGGER((AttachDebugger)(CONTINUE_TO_ADDR)) #define SYNCHRONIZE_DEBUGGER(PID) \ ({ \ @@ -40,20 +40,20 @@ int attachdebugger(intptr_t); Pid; \ }) -#define __inline_wait4(PID, OPT_OUT_WSTATUS, OPTIONS, OPT_OUT_RUSAGE) \ - ({ \ - int64_t WaAx; \ - if (!IsWindows()) { \ - asm volatile("mov\t%5,%%r10\n\t" \ - "syscall" \ - : "=a"(WaAx) \ - : "0"(__NR_wait4), "D"(PID), "S"(OPT_OUT_WSTATUS), \ - "d"(OPTIONS), "g"(OPT_OUT_RUSAGE) \ - : "rcx", "r10", "r11", "cc", "memory"); \ - } else { \ +#define __inline_wait4(PID, OPT_OUT_WSTATUS, OPTIONS, OPT_OUT_RUSAGE) \ + ({ \ + int64_t WaAx; \ + if (!IsWindows()) { \ + asm volatile("mov\t%5,%%r10\n\t" \ + "syscall" \ + : "=a"(WaAx) \ + : "0"(__NR_wait4), "D"(PID), "S"(OPT_OUT_WSTATUS), \ + "d"(OPTIONS), "g"(OPT_OUT_RUSAGE) \ + : "rcx", "r8", "r9", "r10", "r11", "memory", "cc"); \ + } else { \ WaAx = sys_wait4_nt(PID, OPT_OUT_WSTATUS, OPTIONS, OPT_OUT_RUSAGE); \ - } \ - WaAx; \ + } \ + WaAx; \ }) COSMOPOLITAN_C_END_ diff --git a/libc/log/internal.h b/libc/log/internal.h index 298911be3..866579a1d 100644 --- a/libc/log/internal.h +++ b/libc/log/internal.h @@ -7,11 +7,11 @@ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ -extern hidden int kCrashSigs[8]; +extern hidden int kCrashSigs[7]; extern hidden bool g_isrunningundermake; extern hidden bool g_isterminalinarticulate; extern hidden struct termios g_oldtermios; -extern hidden struct sigaction g_oldcrashacts[8]; +extern hidden struct sigaction g_oldcrashacts[7]; void __start_fatal(const char *, int) hidden; void __oncrash(int, struct siginfo *, struct ucontext *) relegated; diff --git a/libc/log/libfatal.internal.h b/libc/log/libfatal.internal.h index 264c43a8f..63dd53c0f 100644 --- a/libc/log/libfatal.internal.h +++ b/libc/log/libfatal.internal.h @@ -13,9 +13,6 @@ COSMOPOLITAN_C_START_ extern char __fatalbuf[]; -void __printf(const char *, ...); -void __vprintf(const char *, va_list); - forceinline long __sysv_exit(long rc) { long ax; #if defined(__MNO_RED_ZONE__) && defined(__GNUC__) && !defined(__STRICT_ANSI__) diff --git a/libc/log/oncrash.c b/libc/log/oncrash.c index 81b32fec7..aa166d28a 100644 --- a/libc/log/oncrash.c +++ b/libc/log/oncrash.c @@ -19,6 +19,7 @@ #include "libc/bits/bits.h" #include "libc/bits/weaken.h" #include "libc/calls/calls.h" +#include "libc/calls/internal.h" #include "libc/calls/sigbits.h" #include "libc/calls/struct/sigaction.h" #include "libc/calls/struct/siginfo.h" @@ -30,6 +31,7 @@ #include "libc/errno.h" #include "libc/fmt/fmt.h" #include "libc/intrin/asan.internal.h" +#include "libc/intrin/kprintf.h" #include "libc/log/backtrace.internal.h" #include "libc/log/color.internal.h" #include "libc/log/gdb.h" @@ -59,6 +61,8 @@ * @see libc/onkill.c */ +STATIC_YOINK("strerror_r"); + static const char kGregOrder[17] forcealign(1) = { 13, 11, 8, 14, 12, 9, 10, 15, 16, 0, 1, 2, 3, 4, 5, 6, 7, }; @@ -72,9 +76,9 @@ static const char kCpuFlags[12] forcealign(1) = "CVPRAKZSTIDO"; static const char kFpuExceptions[6] forcealign(1) = "IDZOUP"; /* : showcrashreports.c, oncrashthunks.S, oncrash.c */ -int kCrashSigs[8]; -struct sigaction g_oldcrashacts[8]; -static const char kCrashSigNames[8][5] forcealign(1) = { +int kCrashSigs[7]; +struct sigaction g_oldcrashacts[7]; +static const char kCrashSigNames[7][5] forcealign(1) = { "QUIT", // "FPE", // "ILL", // @@ -82,11 +86,10 @@ static const char kCrashSigNames[8][5] forcealign(1) = { "TRAP", // "ABRT", // "BUS", // - "PIPE", // }; /* : showcrashreports.c, oncrashthunks.S, oncrash.c */ -relegated static const char *TinyStrSignal(int sig) { +static relegated noasan noinstrument const char *TinyStrSignal(int sig) { size_t i; for (i = 0; i < ARRAYLEN(kCrashSigs); ++i) { if (kCrashSigs[i] && sig == kCrashSigs[i]) { @@ -100,14 +103,15 @@ relegated static void ShowFunctionCalls(ucontext_t *ctx) { struct StackFrame *bp; struct StackFrame goodframe; if (!ctx->uc_mcontext.rip) { - __printf("%s is NULL can't show backtrace\n", "RIP"); + kprintf("%s is NULL can't show backtrace%n", "RIP"); } else if (!ctx->uc_mcontext.rbp) { - __printf("%s is NULL can't show backtrace\n", "RBP"); + kprintf("%s is NULL can't show backtrace%n", "RBP"); } else { goodframe.next = (struct StackFrame *)ctx->uc_mcontext.rbp; goodframe.addr = ctx->uc_mcontext.rip; bp = &goodframe; ShowBacktrace(2, bp); + kprintf("%n"); } } @@ -153,7 +157,7 @@ relegated static void ShowGeneralRegisters(ucontext_t *ctx) { long double st; char *p, buf[128]; p = buf; - *p++ = '\n'; + printf("%n"); for (i = 0, j = 0, k = 0; i < ARRAYLEN(kGregNames); ++i) { if (j > 0) *p++ = ' '; if (!(s = kGregNames[(unsigned)kGregOrder[i]])[2]) *p++ = ' '; @@ -172,9 +176,9 @@ relegated static void ShowGeneralRegisters(ucontext_t *ctx) { x = st * 1000; if (x < 0) x = -x, *p++ = '-'; p = __uintcpy(p, x / 1000), *p++ = '.'; - p = __uintcpy(p, x % 1000), *p++ = '\n'; + p = __uintcpy(p, x % 1000); *p = 0; - __printf("%s", buf); + kprintf("%s%n", buf); p = buf; } } @@ -182,14 +186,14 @@ relegated static void ShowGeneralRegisters(ucontext_t *ctx) { p, ctx->uc_mcontext.gregs[REG_EFL], ctx->uc_mcontext.fpregs ? ctx->uc_mcontext.fpregs->swd : 0, ctx->uc_mcontext.fpregs ? ctx->uc_mcontext.fpregs->mxcsr : 0); - __printf("%s\n", buf); + kprintf("%s%n", buf); } relegated static void ShowSseRegisters(ucontext_t *ctx) { size_t i; char *p, buf[128]; if (ctx->uc_mcontext.fpregs) { - __printf("\n"); + kprintf("%n"); for (i = 0; i < 8; ++i) { p = buf; if (i >= 10) { @@ -214,7 +218,7 @@ relegated static void ShowSseRegisters(ucontext_t *ctx) { p = __fixcpy(p, ctx->uc_mcontext.fpregs->xmm[i + 8].u64[1], 64); p = __fixcpy(p, ctx->uc_mcontext.fpregs->xmm[i + 8].u64[0], 64); *p = 0; - __printf("XMM%s\n", buf); + kprintf("XMM%s%n", buf); } } } @@ -226,48 +230,49 @@ relegated void ShowCrashReport(int err, int sig, struct siginfo *si, int i; char *p; char host[64]; - intptr_t stackaddr; struct utsname names; static char buf[4096]; if (weaken(ShowCrashReportHook)) { ShowCrashReportHook(2, err, sig, si, ctx); } + names.sysname[0] = 0; + names.release[0] = 0; + names.version[0] = 0; + names.nodename[0] = 0; __stpcpy(host, "unknown"); gethostname(host, sizeof(host)); + uname(&names); p = buf; - __printf("\n%serror%s: Uncaught SIG%s", - !g_isterminalinarticulate ? "\e[30;101m" : "", - !g_isterminalinarticulate ? "\e[0m" : "", TinyStrSignal(sig)); - stackaddr = GetStackAddr(0); - if (ctx && (ctx->uc_mcontext.rsp >= GetStaticStackAddr(0) && - ctx->uc_mcontext.rsp <= GetStaticStackAddr(0) + PAGESIZE)) { - __printf(" (Stack Overflow)"); - } else if (si) { - __printf(" (%s)", GetSiCodeName(sig, si->si_code)); - } - __printf(" on %s pid %d\n %s\n %s\n", host, __getpid(), - program_invocation_name, strerror(err)); - if (uname(&names) != -1) { - __printf(" %s %s %s %s\n", names.sysname, names.nodename, names.release, - names.version); - } + errno = err; + kprintf("%n%serror%s: Uncaught SIG%s (%s) on %s pid %d%n" + " %s%n" + " %m%n" + " %s %s %s %s%n", + !g_isterminalinarticulate ? "\e[30;101m" : "", + !g_isterminalinarticulate ? "\e[0m" : "", TinyStrSignal(sig), + (ctx && (ctx->uc_mcontext.rsp >= GetStaticStackAddr(0) && + ctx->uc_mcontext.rsp <= GetStaticStackAddr(0) + PAGESIZE)) + ? "Stack Overflow" + : GetSiCodeName(sig, si->si_code), + host, __getpid(), program_invocation_name, names.sysname, + names.nodename, names.release, names.version); if (ctx) { - __printf("\n"); + kprintf("%n"); ShowFunctionCalls(ctx); ShowGeneralRegisters(ctx); ShowSseRegisters(ctx); } - __printf("\n"); + kprintf("%n"); PrintMemoryIntervals(2, &_mmi); /* PrintSystemMappings(2); */ if (__argv) { for (i = 0; i < __argc; ++i) { if (!__argv[i]) continue; if (IsAsan() && !__asan_is_valid(__argv[i], 1)) continue; - __printf("%s ", __argv[i]); + kprintf("%s ", __argv[i]); } } - __printf("\n"); + kprintf("%n"); } relegated static void RestoreDefaultCrashSignalHandlers(void) { @@ -280,6 +285,21 @@ relegated static void RestoreDefaultCrashSignalHandlers(void) { } } +static wontreturn noasan relegated noinstrument void __minicrash( + int sig, struct siginfo *si, ucontext_t *ctx, const char *kind) { + kprintf("%n" + "%n" + "CRASHED %s WITH SIG%s%n" + "%s%n" + "RIP %x%n" + "RSP %x%n" + "RBP %x%n" + "%n", + kind, TinyStrSignal(sig), __argv[0], ctx ? ctx->uc_mcontext.rip : 0, + ctx ? ctx->uc_mcontext.rsp : 0, ctx ? ctx->uc_mcontext.rbp : 0); + quick_exit(119); +} + /** * Crashes in a developer-friendly human-centric way. * @@ -293,48 +313,47 @@ relegated static void RestoreDefaultCrashSignalHandlers(void) { * * This function never returns, except for traps w/ human supervision. */ -noasan relegated void __oncrash(int sig, struct siginfo *si, ucontext_t *ctx) { +noasan relegated noinstrument void __oncrash(int sig, struct siginfo *si, + ucontext_t *ctx) { intptr_t rip; int gdbpid, err; static bool noreentry, notpossible; - ++g_ftrace; - rip = ctx ? ctx->uc_mcontext.rip : 0; + --g_ftrace; if (cmpxchg(&noreentry, false, true)) { - err = errno; - if ((gdbpid = IsDebuggerPresent(true))) { - DebugBreak(); - } else if (g_isterminalinarticulate || g_isrunningundermake) { - gdbpid = -1; - } else if (FindDebugBinary()) { - RestoreDefaultCrashSignalHandlers(); - gdbpid = - attachdebugger(((sig == SIGTRAP || sig == SIGQUIT) && - (rip >= (intptr_t)&_base && rip < (intptr_t)&_etext)) - ? rip - : 0); - } - if (!(gdbpid > 0 && (sig == SIGTRAP || sig == SIGQUIT))) { - __restore_tty(1); - ShowCrashReport(err, sig, si, ctx); - _Exit(128 + sig); + if (!__vforked) { + rip = ctx ? ctx->uc_mcontext.rip : 0; + err = errno; + if ((gdbpid = IsDebuggerPresent(true))) { + DebugBreak(); + } else if (g_isterminalinarticulate || g_isrunningundermake) { + gdbpid = -1; + } else if (IsLinux() && FindDebugBinary()) { + RestoreDefaultCrashSignalHandlers(); + gdbpid = AttachDebugger( + ((sig == SIGTRAP || sig == SIGQUIT) && + (rip >= (intptr_t)&_base && rip < (intptr_t)&_etext)) + ? rip + : 0); + } + if (!(gdbpid > 0 && (sig == SIGTRAP || sig == SIGQUIT))) { + __restore_tty(1); + ShowCrashReport(err, sig, si, ctx); + quick_exit(128 + sig); + } + } else { + __minicrash(sig, si, ctx, "WHILE VFORKED"); } + } else if (sig == SIGTRAP) { + /* chances are IsDebuggerPresent() confused strace w/ gdb */ + ++g_ftrace; + return; } else if (cmpxchg(¬possible, false, true)) { - __printf("\n" - "\n" - "CRASHED WHILE CRASHING WITH SIG%s\n" - "%s\n" - "RIP %x\n" - "RSP %x\n" - "RBP %x\n" - "\n", - TinyStrSignal(sig), __argv[0], rip, ctx ? ctx->uc_mcontext.rsp : 0, - ctx ? ctx->uc_mcontext.rbp : 0); - _Exit(119); + __minicrash(sig, si, ctx, "WHILE CRASHING"); } else { for (;;) { asm("ud2"); } } noreentry = false; - --g_ftrace; + ++g_ftrace; } diff --git a/libc/log/oncrashthunks.S b/libc/log/oncrashthunks.S index ef70cb9e8..c3ed2d2b9 100644 --- a/libc/log/oncrashthunks.S +++ b/libc/log/oncrashthunks.S @@ -90,15 +90,6 @@ __oncrash_sigbus: ret .endfn __oncrash_sigbus,globl - .org 11*7 -__oncrash_sigpipe: - push %rbp - mov %rsp,%rbp - call __oncrash - pop %rbp - ret - .endfn __oncrash_sigpipe,globl - // : showcrashreports.c, oncrashthunks.S, oncrash.c .endobj __oncrash_thunks,globl diff --git a/libc/log/printgarbage.c b/libc/log/printgarbage.c index 7c8d8bd49..ac0afdb00 100644 --- a/libc/log/printgarbage.c +++ b/libc/log/printgarbage.c @@ -17,7 +17,7 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/fmt/fmt.h" -#include "libc/log/libfatal.internal.h" +#include "libc/intrin/kprintf.h" #include "libc/log/log.h" #include "libc/nexgen32e/gc.internal.h" #include "libc/stdio/stdio.h" @@ -30,27 +30,27 @@ void PrintGarbage(void) { size_t i; char name[19]; const char *symbol; - __printf("\n"); - __printf(" SHADOW STACK @ 0x%p\n", __builtin_frame_address(0)); - __printf("garbage entry parent frame original ret callback arg \n"); - __printf("-------------- -------------- ------------------ ------------------ ------------------\n"); + kprintf("%n"); + kprintf(" SHADOW STACK @ %p%n", __builtin_frame_address(0)); + kprintf("garbage ent. parent frame original ret callback arg %n"); + kprintf("------------ ------------ ------------------ ------------------ ------------------%n"); if (__garbage.i) { for (i = __garbage.i; i--;) { symbol = __get_symbol_by_addr(__garbage.p[i].ret); if (symbol) { - snprintf(name, sizeof(name), "%s", symbol); + ksnprintf(name, sizeof(name), "%s", symbol); } else { - snprintf(name, sizeof(name), "0x%012lx", __garbage.p[i].ret); + ksnprintf(name, sizeof(name), "%#014lx", __garbage.p[i].ret); } - __printf("0x%p 0x%p %18s %18s 0x%016lx\n", - __garbage.p + i, - __garbage.p[i].frame, - name, - __get_symbol_by_addr(__garbage.p[i].fn), - __garbage.p[i].arg); + kprintf("%12lx %12lx %18s %18s %#18lx%n", + __garbage.p + i, + __garbage.p[i].frame, + name, + __get_symbol_by_addr(__garbage.p[i].fn), + __garbage.p[i].arg); } } else { - __printf("%14s %14s %18s %18s %18s\n","empty","-","-","-","-"); + kprintf("%12s %12s %18s %18s %18s%n","empty","-","-","-","-"); } - __printf("\n"); + kprintf("%n"); } diff --git a/libc/log/showcrashreports.c b/libc/log/showcrashreports.c index cfca95610..6eec13085 100644 --- a/libc/log/showcrashreports.c +++ b/libc/log/showcrashreports.c @@ -59,7 +59,6 @@ void ShowCrashReports(void) { kCrashSigs[4] = SIGTRAP; /* bad system call */ kCrashSigs[5] = SIGABRT; /* abort() called */ kCrashSigs[6] = SIGBUS; /* misaligned, noncanonical ptr, etc. */ - kCrashSigs[7] = SIGPIPE; /* write to closed thing */ /* : showcrashreports.c, oncrashthunks.S, oncrash.c */ bzero(&sa, sizeof(sa)); ss.ss_flags = 0; diff --git a/libc/macros.internal.inc b/libc/macros.internal.inc index e7f5201cb..8fe4feb43 100644 --- a/libc/macros.internal.inc +++ b/libc/macros.internal.inc @@ -189,10 +189,8 @@ .endm // LOOP Instruction Replacement. -// With its mop-Fusion Mexican equivalent. -// Thus avoiding 3x legacy pipeline slowdown. .macro .loop label:req - .byte 0x83,0xe9,0x01 # sub $1,%ecx + .byte 0x83,0xe9,0x01 # sub §1,%ecx jnz \label .endm diff --git a/libc/nt/synchronization.h b/libc/nt/synchronization.h index ef11d095e..cdf052d95 100644 --- a/libc/nt/synchronization.h +++ b/libc/nt/synchronization.h @@ -5,6 +5,7 @@ #include "libc/nt/struct/linkedlist.h" #include "libc/nt/struct/securityattributes.h" #include "libc/nt/struct/systemtime.h" +#include "libc/nt/thunk/msabi.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ /* ░░░░ @@ -115,6 +116,9 @@ bool32 GetSystemTimeAdjustment(uint32_t *lpTimeAdjustment, uint32_t *lpTimeIncrement, bool32 *lpTimeAdjustmentDisabled); +#if ShouldUseMsabiAttribute() +#include "libc/nt/thunk/synchronization.inc" +#endif /* ShouldUseMsabiAttribute() */ COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_NT_SYNCHRONIZATION_H_ */ diff --git a/libc/nt/thunk/memory.inc b/libc/nt/thunk/memory.inc index fe36ff37b..cf2941299 100644 --- a/libc/nt/thunk/memory.inc +++ b/libc/nt/thunk/memory.inc @@ -3,6 +3,8 @@ #define FlushViewOfFile(...) __imp_FlushViewOfFile(__VA_ARGS__) #define UnmapViewOfFile(...) __imp_UnmapViewOfFile(__VA_ARGS__) +extern typeof(LocalFree) *const __imp_LocalFree __msabi; +extern typeof(VirtualProtect) *const __imp_VirtualProtect __msabi; extern typeof(UnmapViewOfFile) *const __imp_UnmapViewOfFile __msabi; extern typeof(FlushViewOfFile) *const __imp_FlushViewOfFile __msabi; extern typeof(MapViewOfFileExNuma) *const __imp_MapViewOfFileExNuma __msabi; diff --git a/libc/nt/thunk/process.inc b/libc/nt/thunk/process.inc index e483b043e..63cdb8e9f 100644 --- a/libc/nt/thunk/process.inc +++ b/libc/nt/thunk/process.inc @@ -17,3 +17,6 @@ extern typeof(GetCurrentProcessId) *const __imp_GetCurrentProcessId __msabi; #define CreateProcess(...) __imp_CreateProcessW(__VA_ARGS__) extern typeof(CreateProcess) *const __imp_CreateProcessW __msabi; + +extern typeof(FormatMessage) *const __imp_FormatMessageW __msabi; +extern typeof(SetLastError) *const __imp_SetLastError __msabi; diff --git a/libc/nt/thunk/runtime.inc b/libc/nt/thunk/runtime.inc index dae9cc513..a389fa8d2 100644 --- a/libc/nt/thunk/runtime.inc +++ b/libc/nt/thunk/runtime.inc @@ -31,3 +31,6 @@ extern typeof(GetCurrentProcess) *const __imp_GetCurrentProcess __msabi; #define GetModuleFileName(...) __imp_GetModuleFileNameW(__VA_ARGS__) extern typeof(GetModuleFileName) *const __imp_GetModuleFileNameW __msabi; + +extern typeof(GetLastError) *const __imp_GetLastError __msabi; +extern typeof(ExitProcess) *const __imp_ExitProcess __msabi; diff --git a/libc/nt/thunk/synchronization.inc b/libc/nt/thunk/synchronization.inc new file mode 100644 index 000000000..fa73a16cd --- /dev/null +++ b/libc/nt/thunk/synchronization.inc @@ -0,0 +1 @@ +extern typeof(SleepEx) *const __imp_SleepEx __msabi; diff --git a/libc/nt/version.h b/libc/nt/version.h index 7acf9f290..f7ade11de 100644 --- a/libc/nt/version.h +++ b/libc/nt/version.h @@ -4,8 +4,22 @@ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ +bool IsAtLeastWindows10(void) pureconst; bool32 GetVersionEx(struct NtOsVersionInfo *lpVersionInformation); +#if defined(__GCC_ASM_FLAG_OUTPUTS__) && !defined(__STRICT_ANSI__) +#define IsAtLeastWindows10() \ + ({ \ + long ReG; \ + bool NoTbelow; \ + asm("mov\t%%gs:96,%1\r\n" \ + "cmpb\t%2,280(%1)" \ + : "=@ccnb"(NoTbelow), "=l"(ReG) \ + : "i"(10)); \ + NoTbelow; \ + }) +#endif + COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_NT_VERSION_H_ */ diff --git a/libc/runtime/exit.c b/libc/runtime/exit.c index e2a177998..6818ff1fc 100644 --- a/libc/runtime/exit.c +++ b/libc/runtime/exit.c @@ -16,13 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/bits/pushpop.h" #include "libc/bits/weaken.h" -#include "libc/dce.h" -#include "libc/nt/console.h" -#include "libc/nt/enum/consolemodeflags.h" -#include "libc/nt/pedef.internal.h" -#include "libc/nt/runtime.h" #include "libc/runtime/internal.h" #include "libc/runtime/runtime.h" @@ -38,18 +32,8 @@ * @noreturn */ wontreturn void exit(int exitcode) { - const uintptr_t *p; if (weaken(__cxa_finalize)) { weaken(__cxa_finalize)(NULL); } - for (p = __fini_array_end; p > __fini_array_start;) { - ((void (*)(void))(*--p))(); - } - if (SupportsWindows() && __ntconsolemode) { - SetConsoleMode(GetStdHandle(pushpop(kNtStdInputHandle)), __ntconsolemode); - SetConsoleMode(GetStdHandle(pushpop(kNtStdOutputHandle)), - kNtEnableProcessedOutput | kNtEnableWrapAtEolOutput | - kNtEnableVirtualTerminalProcessing); - } - _Exit(exitcode); + quick_exit(exitcode); } diff --git a/libc/runtime/fork.c b/libc/runtime/fork.c index 2c86fd8d6..5d47e474a 100644 --- a/libc/runtime/fork.c +++ b/libc/runtime/fork.c @@ -17,9 +17,14 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/bits/bits.h" +#include "libc/bits/weaken.h" #include "libc/calls/calls.h" #include "libc/calls/internal.h" +#include "libc/calls/sysdebug.internal.h" #include "libc/dce.h" +#include "libc/nt/process.h" + +extern int __pid; /** * Creates new process. @@ -29,7 +34,7 @@ */ int fork(void) { axdx_t ad; - int ax, dx; + int ax, dx, parent; if (!IsWindows()) { ad = sys_fork(); ax = ad.ax; @@ -43,7 +48,19 @@ int fork(void) { ax = sys_fork_nt(); } if (!ax) { - __onfork(); + if (!IsWindows()) { + dx = sys_getpid().ax; + } else { + dx = GetCurrentProcessId(); + } + parent = __pid; + __pid = dx; + SYSDEBUG("fork() → 0 (child of %d)", parent); + if (weaken(__onfork)) { + weaken(__onfork)(); + } + } else { + SYSDEBUG("fork() → %d% m", ax); } return ax; } diff --git a/libc/runtime/ftracer.c b/libc/runtime/ftracer.c index 013b724b2..b78567eeb 100644 --- a/libc/runtime/ftracer.c +++ b/libc/runtime/ftracer.c @@ -18,6 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/bits/bits.h" #include "libc/bits/safemacros.internal.h" +#include "libc/intrin/kprintf.h" #include "libc/log/libfatal.internal.h" #include "libc/macros.internal.h" #include "libc/nexgen32e/rdtsc.h" @@ -91,9 +92,9 @@ privileged noinstrument noasan noubsan void ftracer(void) { if ((symbol = __get_symbol(g_symbols, frame->addr)) != -1 && symbol != g_lastsymbol) { g_lastsymbol = symbol; - __printf("+ %*s%s %d\r\n", GetNestingLevel(frame) * 2, "", - __get_symbol_name(g_symbols, symbol), - (long)(unsignedsubtract(stamp, laststamp) / 3.3)); + kprintf("+ %*s%s %d\r\n", GetNestingLevel(frame) * 2, "", + __get_symbol_name(g_symbols, symbol), + (long)(unsignedsubtract(stamp, laststamp) / 3.3)); laststamp = X86_HAVE(RDTSCP) ? rdtscp(0) : rdtsc(); } } @@ -110,9 +111,9 @@ textstartup void ftrace_install(void) { ftrace_enabled = 1; __hook(ftrace_hook, g_symbols); } else { - __printf("error: --ftrace failed to open symbol table\r\n"); + kprintf("error: --ftrace failed to open symbol table\r\n"); } } else { - __printf("error: --ftrace needs concomitant .com.dbg binary\r\n"); + kprintf("error: --ftrace needs concomitant .com.dbg binary\r\n"); } } diff --git a/libc/runtime/getdosargv.c b/libc/runtime/getdosargv.c index d21113715..2c747a5ed 100644 --- a/libc/runtime/getdosargv.c +++ b/libc/runtime/getdosargv.c @@ -16,9 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/assert.h" #include "libc/bits/bits.h" -#include "libc/bits/pushpop.h" #include "libc/bits/safemacros.internal.h" #include "libc/runtime/internal.h" #include "libc/str/str.h" @@ -32,25 +30,23 @@ struct DosArgv { wint_t wc; }; -static textwindows noasan wint_t DecodeDosArgv(const char16_t **s) { +textwindows noasan void DecodeDosArgv(int ignore, struct DosArgv *st) { wint_t x, y; for (;;) { - if (!(x = *(*s)++)) break; - if (IsUtf16Cont(x)) continue; - if (IsUcs2(x)) { - return x; - } else { - if ((y = *(*s)++)) { - return MergeUtf16(x, y); + if (!(x = *st->s++)) break; + if (!IsUcs2(x)) { + if ((y = *st->s++)) { + x = MergeUtf16(x, y); } else { - return 0; + x = 0; } } + break; } - return x; + st->wc = x; } -static textwindows noasan void AppendDosArgv(struct DosArgv *st, wint_t wc) { +static textwindows noasan void AppendDosArgv(wint_t wc, struct DosArgv *st) { uint64_t w; w = tpenc(wc); do { @@ -59,6 +55,16 @@ static textwindows noasan void AppendDosArgv(struct DosArgv *st, wint_t wc) { } while (w >>= 8); } +static textwindows noasan int Count(int c, struct DosArgv *st) { + int ignore, n = 0; + asm("" : "=g"(ignore)); + while (st->wc == c) { + DecodeDosArgv(ignore, st); + n++; + } + return n; +} + /** * Tokenizes and transcodes Windows NT CLI args, thus avoiding * CommandLineToArgv() schlepping in forty megs of dependencies. @@ -81,49 +87,60 @@ static textwindows noasan void AppendDosArgv(struct DosArgv *st, wint_t wc) { textwindows noasan int GetDosArgv(const char16_t *cmdline, char *buf, size_t size, char **argv, size_t max) { bool inquote; - size_t i, argc, slashes, quotes; - struct DosArgv st; - st.s = cmdline; - st.p = buf; - st.pe = buf + size; + int i, argc, slashes, quotes, ignore; + static struct DosArgv st_; + struct DosArgv *st = &st_; + asm("" : "=g"(ignore)); + asm("" : "+r"(st)); + st->s = cmdline; + st->p = buf; + st->pe = buf + size; argc = 0; - st.wc = DecodeDosArgv(&st.s); - while (st.wc) { - while (st.wc && (st.wc == ' ' || st.wc == '\t')) { - st.wc = DecodeDosArgv(&st.s); + DecodeDosArgv(ignore, st); + while (st->wc) { + while (st->wc && (st->wc == ' ' || st->wc == '\t')) { + DecodeDosArgv(ignore, st); } - if (!st.wc) break; + if (!st->wc) break; if (++argc < max) { - argv[argc - 1] = st.p < st.pe ? st.p : NULL; + argv[argc - 1] = st->p < st->pe ? st->p : NULL; } inquote = false; - while (st.wc) { - if (!inquote && (st.wc == ' ' || st.wc == '\t')) break; - if (st.wc == '"' || st.wc == '\\') { - slashes = 0; - quotes = 0; - while (st.wc == '\\') st.wc = DecodeDosArgv(&st.s), slashes++; - while (st.wc == '"') st.wc = DecodeDosArgv(&st.s), quotes++; + while (st->wc) { + if (!inquote && (st->wc == ' ' || st->wc == '\t')) break; + if (st->wc == '"' || st->wc == '\\') { + slashes = Count('\\', st); + quotes = Count('"', st); if (!quotes) { - while (slashes--) AppendDosArgv(&st, '\\'); + while (slashes--) { + AppendDosArgv('\\', st); + } } else { - while (slashes >= 2) AppendDosArgv(&st, '\\'), slashes -= 2; - if (slashes) AppendDosArgv(&st, '"'), quotes--; + while (slashes >= 2) { + AppendDosArgv('\\', st); + slashes -= 2; + } + if (slashes) { + AppendDosArgv('"', st); + quotes--; + } if (quotes > 0) { if (!inquote) quotes--; - for (i = 3; i <= quotes + 1; i += 3) AppendDosArgv(&st, '"'); + for (i = 3; i <= quotes + 1; i += 3) { + AppendDosArgv('"', st); + } inquote = (quotes % 3 == 0); } } } else { - AppendDosArgv(&st, st.wc); - st.wc = DecodeDosArgv(&st.s); + AppendDosArgv(st->wc, st); + DecodeDosArgv(ignore, st); } } - AppendDosArgv(&st, '\0'); + AppendDosArgv('\0', st); } - AppendDosArgv(&st, '\0'); - if (size) buf[min(st.p - buf, size - 1)] = '\0'; + AppendDosArgv('\0', st); + if (size) buf[min(st->p - buf, size - 1)] = '\0'; if (max) argv[min(argc, max - 1)] = NULL; return argc; } diff --git a/libc/runtime/getdosenviron.c b/libc/runtime/getdosenviron.c index f1a4117d9..58f3e3bf1 100644 --- a/libc/runtime/getdosenviron.c +++ b/libc/runtime/getdosenviron.c @@ -32,7 +32,6 @@ static textwindows noasan noinstrument axdx_t Recode16to8(char *dst, wint_t x, y; for (v = r.ax = 0, r.dx = 0;;) { if (!(x = src[r.dx++])) break; - if (IsUtf16Cont(x)) continue; if (!IsUcs2(x)) { y = src[r.dx++]; x = MergeUtf16(x, y); diff --git a/libc/runtime/getinterpreterexecutablename.c b/libc/runtime/getinterpreterexecutablename.c new file mode 100644 index 000000000..d75fb29b7 --- /dev/null +++ b/libc/runtime/getinterpreterexecutablename.c @@ -0,0 +1,83 @@ +/*-*- 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/calls/internal.h" +#include "libc/dce.h" +#include "libc/intrin/kprintf.h" +#include "libc/macros.internal.h" +#include "libc/runtime/runtime.h" +#include "libc/sysv/consts/at.h" +#include "libc/sysv/errfuns.h" + +/** + * Returns path of executable interperter. + * + * Unlike `program_executable_name` which is designed to figure out the + * absolute path of the first argument passed to `execve()`, what we do + * here is probe things like `/proc` and `sysctl()` to figure out if we + * were launched by something like `ape-loader`, and then we return its + * path. If we can't determine that path, possibly because we're on XNU + * or OpenBSD, then we return -1 with an error code. + * + * @param p receives utf8 output + * @param n is byte size of res buffer + * @return p on success or null w/ errno if out of buf or error + * @see program_invocation_short_name + * @see program_invocation_name + * @see program_executable_name + */ +char *GetInterpreterExecutableName(char *p, size_t n) { + int e; + size_t m; + int cmd[4]; + ssize_t rc; + char *r, *t; + e = errno; + if (n < 2) { + errno = ENAMETOOLONG; + } else if (IsWindows()) { + if (strlen(program_executable_name) < n) { + strcpy(p, program_executable_name); + return p; + } + errno = ENAMETOOLONG; + } else if ((rc = sys_readlinkat(AT_FDCWD, "/proc/self/exe", p, n - 1)) > 0) { + p[rc] = 0; + return p; + } else if ((rc = sys_readlinkat(AT_FDCWD, "/proc/curproc/file", p, n - 1)) > + 0) { + errno = e; + p[n] = 0; + return p; + } else if (IsFreebsd() || IsNetbsd()) { + cmd[0] = 1 /* CTL_KERN */; + cmd[1] = 14 /* KERN_PROC */; + if (IsFreebsd()) { + cmd[2] = 12 /* KERN_PROC_PATHNAME */; + } else { + cmd[2] = 5 /* KERN_PROC_PATHNAME */; + } + cmd[3] = -1; /* current process */ + if (sysctl(cmd, ARRAYLEN(cmd), p, &n, 0, 0) != -1) { + errno = e; + return p; + } + } + return 0; +} diff --git a/libc/runtime/internal.h b/libc/runtime/internal.h index 32aaa564e..3b0e05e97 100644 --- a/libc/runtime/internal.h +++ b/libc/runtime/internal.h @@ -12,7 +12,7 @@ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ -extern uint32_t __ntconsolemode; +extern uint32_t __ntconsolemode[2]; extern const char v_ntsubsystem[] __attribute__((__weak__)); extern const uintptr_t __fini_array_end[] __attribute__((__weak__)); extern const uintptr_t __fini_array_start[] __attribute__((__weak__)); diff --git a/libc/runtime/memtrack.internal.h b/libc/runtime/memtrack.internal.h index ae844bda0..1fb01f238 100644 --- a/libc/runtime/memtrack.internal.h +++ b/libc/runtime/memtrack.internal.h @@ -21,8 +21,9 @@ COSMOPOLITAN_C_START_ #define kFixedmapStart _kMem(0x300000000000, 0x000040000000) #define kFixedmapSize \ _kMem(0x400000000000 - 0x300000000000, 0x000070000000 - 0x000040000000) -#define _kMmi(VSPACE) \ - ROUNDUP(VSPACE / FRAMESIZE * sizeof(struct MemoryInterval), FRAMESIZE) +#define _kMmi(VSPACE) \ + ROUNDUP(VSPACE / FRAMESIZE * (intptr_t)sizeof(struct MemoryInterval), \ + FRAMESIZE) #define _kMem(NORMAL, WIN7) \ (!(IsWindows() && NtGetVersion() < kNtVersionWindows10) ? NORMAL : WIN7) @@ -35,7 +36,7 @@ struct MemoryInterval { }; struct MemoryIntervals { - long i, n; + size_t i, n; struct MemoryInterval *p; struct MemoryInterval s[OPEN_MAX]; }; @@ -57,6 +58,10 @@ int UntrackMemoryIntervals(void *, size_t) hidden; #define IsLegalPointer(p) \ (-0x800000000000 <= (intptr_t)(p) && (intptr_t)(p) <= 0x7fffffffffff) +forceinline pureconst bool IsLegalSize(size_t n) { + return n <= 0xffffffffffff; +} + forceinline pureconst bool IsAutoFrame(int x) { return (kAutomapStart >> 16) <= x && x <= ((kAutomapStart + (kAutomapSize - 1)) >> 16); @@ -75,14 +80,26 @@ forceinline pureconst bool IsShadowFrame(int x) { return 0x7fff <= x && x < 0x10008000; } +forceinline pureconst bool IsKernelFrame(int x) { + return (int)(GetStaticStackAddr(0) >> 16) <= x && + x <= (int)((GetStaticStackAddr(0) + (GetStackSize() - FRAMESIZE)) >> + 16); +} + forceinline pureconst bool IsStaticStackFrame(int x) { - return (GetStaticStackAddr(0) >> 16) <= x && - x <= ((GetStaticStackAddr(0) + (GetStackSize() - FRAMESIZE)) >> 16); + return (int)(GetStaticStackAddr(0) >> 16) <= x && + x <= (int)((GetStaticStackAddr(0) + (GetStackSize() - FRAMESIZE)) >> + 16); +} + +forceinline pureconst bool IsStackFrame(int x) { + return (int)(GetStackAddr(0) >> 16) <= x && + x <= (int)((GetStackAddr(0) + (GetStackSize() - FRAMESIZE)) >> 16); } forceinline pureconst bool IsSigAltStackFrame(int x) { - return (GetStackAddr(0) >> 16) <= x && - x <= ((GetStackAddr(0) + (SIGSTKSZ - FRAMESIZE)) >> 16); + return (int)(GetStackAddr(0) >> 16) <= x && + x <= (int)((GetStackAddr(0) + (SIGSTKSZ - FRAMESIZE)) >> 16); } forceinline pureconst bool IsOldStackFrame(int x) { diff --git a/libc/runtime/printmemoryintervals.c b/libc/runtime/printmemoryintervals.c index 3569334b9..d3b5ae1db 100644 --- a/libc/runtime/printmemoryintervals.c +++ b/libc/runtime/printmemoryintervals.c @@ -17,7 +17,7 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/fmt/itoa.h" -#include "libc/log/libfatal.internal.h" +#include "libc/intrin/kprintf.h" #include "libc/macros.internal.h" #include "libc/runtime/memtrack.internal.h" @@ -41,20 +41,20 @@ void PrintMemoryIntervals(int fd, const struct MemoryIntervals *mm) { for (i = 0; i < mm->i; ++i) { frames = mm->p[i].y + 1 - mm->p[i].x; maptally += frames; - __printf("%012x-%012x %s %,*dx%s", ADDR(mm->p[i].x), ADDR(mm->p[i].y + 1), - DescribeMapping(mm->p[i].prot, mm->p[i].flags, mode), w, frames, - DescribeFrame(mm->p[i].x)); + kprintf("%012lx-%012lx %s %'*ldx%s", ADDR(mm->p[i].x), ADDR(mm->p[i].y + 1), + DescribeMapping(mm->p[i].prot, mm->p[i].flags, mode), w, frames, + DescribeFrame(mm->p[i].x)); if (i + 1 < _mmi.i) { frames = mm->p[i + 1].x - mm->p[i].y - 1; if (frames && IsNoteworthyHole(i, mm)) { gaptally += frames; - __printf(" w/ %,d frame hole", frames); + kprintf(" w/ %'ld frame hole", frames); } } if (mm->p[i].h != -1) { - __printf(" h=%d", mm->p[i].h); + kprintf(" h=%ld", mm->p[i].h); } - __printf("\r\n"); + kprintf("%n"); } - __printf("# %d frames mapped w/ %,d frames gapped\r\n", maptally, gaptally); + kprintf("# %ld frames mapped w/ %'ld frames gapped%n", maptally, gaptally); } diff --git a/libc/runtime/runtime.h b/libc/runtime/runtime.h index c46add19e..d1ad71ead 100644 --- a/libc/runtime/runtime.h +++ b/libc/runtime/runtime.h @@ -97,6 +97,7 @@ int OpenExecutable(void); void ftrace_install(void); long GetResourceLimit(int); long GetMaxFd(void); +char *GetInterpreterExecutableName(char *, size_t); COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/runtime/stack.h b/libc/runtime/stack.h index a5d580fcf..60b5bf157 100644 --- a/libc/runtime/stack.h +++ b/libc/runtime/stack.h @@ -2,6 +2,7 @@ #define COSMOPOLITAN_LIBC_RUNTIME_STACK_H_ #include "ape/config.h" #include "libc/dce.h" +#include "libc/nt/version.h" #include "libc/runtime/runtime.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) @@ -27,7 +28,7 @@ /** * Tunes APE stack virtual address. * - * This defaults to `0x700000000000 - STACKSIZE`. The value defined by + * This defaults to `0x7e0000000000 - STACKSIZE`. The value defined by * this macro will be respected, with two exceptions: (1) in MODE=tiny * the operating system provided stack is used instead and (2) Windows * Seven doesn't support 64-bit addresses so 0x10000000 - GetStackSize @@ -48,7 +49,7 @@ #define _STACK_EXTRA "" #endif -#if defined(__GNUC__) && defined(__ELF__) +#if defined(__GNUC__) && defined(__ELF__) && !defined(__STRICT_ANSI__) COSMOPOLITAN_C_START_ extern char ape_stack_memsz[] __attribute__((__weak__)); @@ -64,18 +65,18 @@ extern char ape_stack_memsz[] __attribute__((__weak__)); /** * Returns preferred bottom address of stack. */ -#define GetStaticStackAddr(ADDEND) \ - ({ \ - intptr_t vAddr; \ - if (!IsWindows() || NtGetVersion() >= kNtVersionWindows10) { \ - asm(".weak\tape_stack_vaddr\n\t" \ - "movabs\t%1+ape_stack_vaddr,%0" \ - : "=r"(vAddr) \ - : "i"(ADDEND)); \ - } else { \ - vAddr = 0x10000000; \ - } \ - vAddr; \ +#define GetStaticStackAddr(ADDEND) \ + ({ \ + intptr_t vAddr; \ + if (!IsWindows() || IsAtLeastWindows10()) { \ + __asm__(".weak\tape_stack_vaddr\n\t" \ + "movabs\t%1+ape_stack_vaddr,%0" \ + : "=r"(vAddr) \ + : "i"(ADDEND)); \ + } else { \ + vAddr = 0x10000000; \ + } \ + vAddr; \ }) COSMOPOLITAN_C_END_ diff --git a/libc/runtime/winmain.greg.c b/libc/runtime/winmain.greg.c index 8f0498b4c..35ffb0810 100644 --- a/libc/runtime/winmain.greg.c +++ b/libc/runtime/winmain.greg.c @@ -22,9 +22,11 @@ #include "libc/calls/internal.h" #include "libc/dce.h" #include "libc/fmt/fmt.h" +#include "libc/intrin/kprintf.h" #include "libc/log/libfatal.internal.h" #include "libc/macros.internal.h" #include "libc/nexgen32e/bsr.h" +#include "libc/nexgen32e/rdtsc.h" #include "libc/nt/console.h" #include "libc/nt/enum/consolemodeflags.h" #include "libc/nt/enum/filemapflags.h" @@ -66,9 +68,20 @@ struct WinArgs { char envblock[ARG_MAX]; }; -uint32_t __ntconsolemode; +extern int __pid; +extern bool __nomultics; +extern const char kConsoleHandles[2]; -static noasan textwindows noinstrument void MakeLongDoubleLongAgain(void) { +static const short kConsoleModes[2] = { + kNtEnableProcessedInput | kNtEnableLineInput | kNtEnableEchoInput | + kNtEnableMouseInput | kNtEnableQuickEditMode | kNtEnableExtendedFlags | + kNtEnableAutoPosition | kNtEnableInsertMode | + kNtEnableVirtualTerminalInput, + kNtEnableProcessedOutput | kNtEnableWrapAtEolOutput | + kNtEnableVirtualTerminalProcessing, +}; + +forceinline void MakeLongDoubleLongAgain(void) { /* 8087 FPU Control Word IM: Invalid Operation ───────────────┐ DM: Denormal Operand ───────────────┐│ @@ -90,29 +103,22 @@ static noasan textwindows wontreturn noinstrument void WinMainNew(void) { int64_t h; int version; int i, count; - int64_t inhand; + int64_t hand; struct WinArgs *wa; const char16_t *env16; intptr_t stackaddr, allocaddr; size_t allocsize, argsize, stacksize; - extern char os asm("__hostos"); - os = WINDOWS; /* madness https://news.ycombinator.com/item?id=21019722 */ version = NtGetPeb()->OSMajorVersion; __oldstack = (intptr_t)__builtin_frame_address(0); if ((intptr_t)v_ntsubsystem == kNtImageSubsystemWindowsCui && version >= 10) { SetConsoleCP(kNtCpUtf8); SetConsoleOutputCP(kNtCpUtf8); - inhand = GetStdHandle(pushpop(kNtStdInputHandle)); SetEnvironmentVariable(u"TERM", u"xterm-truecolor"); - GetConsoleMode(inhand, &__ntconsolemode); - SetConsoleMode(inhand, kNtEnableProcessedInput | kNtEnableLineInput | - kNtEnableEchoInput | kNtEnableMouseInput | - kNtEnableQuickEditMode | kNtEnableExtendedFlags | - kNtEnableAutoPosition | - kNtEnableVirtualTerminalInput); - SetConsoleMode(GetStdHandle(pushpop(kNtStdOutputHandle)), - kNtEnableProcessedOutput | kNtEnableWrapAtEolOutput | - kNtEnableVirtualTerminalProcessing); + for (i = 0; i < 2; ++i) { + hand = GetStdHandle(kConsoleHandles[i]); + GetConsoleMode(hand, __ntconsolemode + i); + SetConsoleMode(hand, kConsoleModes[i]); + } } _mmi.p = _mmi.s; _mmi.n = ARRAYLEN(_mmi.s); @@ -186,6 +192,12 @@ noasan textwindows noinstrument int64_t WinMain(int64_t hInstance, int64_t hPrevInstance, const char *lpCmdLine, int nCmdShow) { + extern char os asm("__hostos"); + extern uint64_t ts asm("kStartTsc"); + os = WINDOWS; /* madness https://news.ycombinator.com/item?id=21019722 */ + ts = rdtsc(); + __nomultics = true; + __pid = GetCurrentProcessId(); MakeLongDoubleLongAgain(); if (weaken(WinSockInit)) weaken(WinSockInit)(); if (weaken(WinMainForked)) weaken(WinMainForked)(); diff --git a/libc/sock/poll-nt.c b/libc/sock/poll-nt.c index 94f73e197..47ebdb80d 100644 --- a/libc/sock/poll-nt.c +++ b/libc/sock/poll-nt.c @@ -17,7 +17,9 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/bits/bits.h" +#include "libc/bits/weaken.h" #include "libc/calls/internal.h" +#include "libc/calls/struct/sigaction.h" #include "libc/macros.internal.h" #include "libc/nt/struct/pollfd.h" #include "libc/nt/winsock.h" @@ -42,6 +44,9 @@ textwindows int sys_poll_nt(struct pollfd *fds, uint64_t nfds, uint64_t ms) { } for (;;) { if (cmpxchg(&__interrupted, true, false)) return eintr(); + if (weaken(_check_sigwinch) && weaken(_check_sigwinch)(g_fds.p + 0)) { + return eintr(); + } waitfor = MIN(1000, ms); /* for ctrl+c */ if ((got = WSAPoll(ntfds, nfds, waitfor)) != -1) { if (!got && (ms -= waitfor) > 0) continue; diff --git a/libc/str/utf16.h b/libc/str/utf16.h index 0e8e391d7..a0a87854e 100644 --- a/libc/str/utf16.h +++ b/libc/str/utf16.h @@ -1,20 +1,23 @@ #ifndef COSMOPOLITAN_LIBC_STR_UTF16_H_ #define COSMOPOLITAN_LIBC_STR_UTF16_H_ +#include "libc/bits/likely.h" #define UTF16_MASK 0xfc00 #define UTF16_MOAR 0xd800 /* 0xD800..0xDBFF */ -#define UTF16_CONT 0xdc00 /* 0xDC00..0xDBFF */ +#define UTF16_CONT 0xdc00 /* 0xDC00..0xDFFF */ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ -#define IsUcs2(wc) (((wc)&UTF16_MASK) != UTF16_MOAR) -#define IsUtf16Cont(wc) (((wc)&UTF16_MASK) == UTF16_CONT) -#define MergeUtf16(lo, hi) ((((lo)-0xD800) << 10) + ((hi)-0xDC00) + 0x10000) +#define IsSurrogate(wc) ((0xf800 & (wc)) == 0xd800) +#define IsHighSurrogate(wc) ((UTF16_MASK & (wc)) == UTF16_MOAR) +#define IsLowSurrogate(wc) ((UTF16_MASK & (wc)) == UTF16_CONT) +#define IsUcs2(wc) (((65535 & (wc)) >> 11) != 27) +#define IsUtf16Cont(wc) IsLowSurrogate(wc) /* TODO: DELETE */ +#define MergeUtf16(hi, lo) ((((hi)-0xD800) << 10) + ((lo)-0xDC00) + 0x10000) #define EncodeUtf16(wc) \ - (__builtin_expect(((0x0000 <= (wc) && (wc) <= 0xFFFF) || \ - (0xE000 <= (wc) && (wc) <= 0xFFFF)), \ - 1) \ + (LIKELY((0x0000 <= (wc) && (wc) <= 0xFFFF) || \ + (0xE000 <= (wc) && (wc) <= 0xFFFF)) \ ? (wc) \ : 0x10000 <= (wc) && (wc) <= 0x10FFFF \ ? (((((wc)-0x10000) >> 10) + 0xD800) | \ diff --git a/libc/sysv/calls/__syscall.s b/libc/sysv/calls/__syscall.s deleted file mode 100644 index afb98875d..000000000 --- a/libc/sysv/calls/__syscall.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/sysv/macros.internal.inc" -.scall __syscall,0xfff0c6ffffffffff,globl diff --git a/libc/sysv/consts.sh b/libc/sysv/consts.sh index 1855299a7..f9782ce88 100755 --- a/libc/sysv/consts.sh +++ b/libc/sysv/consts.sh @@ -224,11 +224,11 @@ syscon compat MAP_FILE 0 0 0 0 0 0 # consensus syscon mmap MAP_SHARED 1 1 1 1 1 1 # forced consensus & faked nt syscon mmap MAP_PRIVATE 2 2 2 2 2 2 # forced consensus & faked nt syscon mmap MAP_TYPE 15 15 15 15 15 15 # mask for type of mapping -syscon mmap MAP_FIXED 0x10 0x10 0x10 0x10 0x10 0x10 # unix consensus; openbsd appears to forbid; faked nt +syscon mmap MAP_FIXED 0x0000010 0x0000010 0x0000010 0x0000010 0x0000010 0x0000010 # unix consensus; openbsd appears to forbid; faked nt syscon mmap MAP_FIXED_NOREPLACE 0x8000000 0x8000000 0x8000000 0x8000000 0x8000000 0x8000000 # handled and defined by cosmo runtime; 0x100000 on linux 4.7+ -syscon mmap MAP_ANONYMOUS 0x20 0x1000 0x1000 0x1000 0x1000 0x20 # bsd consensus; faked nt -syscon mmap MAP_GROWSDOWN 0x0100 0 0x0400 0x4000 0x4000 0x100000 # mandatory for OpenBSD stacks; MAP_STACK on Free/OpenBSD; MEM_TOP_DOWN on NT -syscon mmap MAP_CONCEAL 0 0 0x20000 0x8000 0x8000 0 # omit from core dumps; MAP_NOCORE on FreeBSD +syscon mmap MAP_ANONYMOUS 0x20 0x1000 0x0001000 0x1000 0x1000 0x20 # bsd consensus; faked nt +syscon mmap MAP_GROWSDOWN 0x0100 0 0x0000400 0x4000 0x4000 0x100000 # mandatory for OpenBSD stacks; MAP_STACK on Free/OpenBSD; MEM_TOP_DOWN on NT +syscon mmap MAP_CONCEAL 0 0 0x0020000 0x8000 0x8000 0 # omit from core dumps; MAP_NOCORE on FreeBSD syscon mmap MAP_NORESERVE 0x4000 0x40 0 0 64 0 # Linux calls it "reserve"; NT calls it "commit"? which is default? syscon mmap MAP_HUGETLB 0x040000 0 0 0 0 0x80000000 # kNtSecLargePages syscon mmap MAP_HUGE_MASK 63 0 0 0 0 0 @@ -237,44 +237,43 @@ syscon mmap MAP_LOCKED 0x2000 0 0 0 0 0 syscon mmap MAP_NONBLOCK 0x10000 0 0 0 0 0 syscon mmap MAP_POPULATE 0x8000 0 0 0 0 0 # can avoid madvise(MADV_WILLNEED) on private file mapping syscon mmap MAP_CONCEAL 0 0 0 0x8000 0 0 # omit from dumps -syscon compat MAP_STACK 0x0100 0 0x0400 0x4000 0x2000 0x100000 # use MAP_GROWSDOWN -syscon compat MAP_NOCORE 0 0 0x20000 0x8000 0x8000 0 # use MAP_CONCEAL -syscon compat MAP_ANON 0x20 0x1000 0x1000 0x1000 0x1000 0x20 # bsd consensus; faked nt +syscon mmap MAP_STACK 0x0100 0 0x0000400 0x4000 0x2000 0x100000 # use MAP_GROWSDOWN +syscon compat MAP_NOCORE 0 0 0x0020000 0x8000 0x8000 0 # use MAP_CONCEAL +syscon compat MAP_ANON 0x20 0x1000 0x0001000 0x1000 0x1000 0x20 # bsd consensus; faked nt syscon compat MAP_EXECUTABLE 0x1000 0 0 0 0 0 # ignored syscon compat MAP_DENYWRITE 0x0800 0 0 0 0 0 syscon compat MAP_32BIT 0x40 0 0x080000 0 0 0 # iffy # madvise() flags -# beneath the iceberg memory management # # group name GNU/Systemd XNU's Not UNIX! FreeBSD OpenBSD NetBSD The New Technology Commentary syscon madv MADV_NORMAL 0 0 0 0 0 0x00000080 # consensus & kNtFileAttributeNormal syscon compat POSIX_FADV_NORMAL 0 0 0 0 0 0x00000080 # consensus & kNtFileAttributeNormal syscon compat POSIX_MADV_NORMAL 0 0 0 0 0 0x00000080 # consensus & kNtFileAttributeNormal -syscon madv MADV_DONTNEED 4 4 4 4 4 0 # TODO(jart): weird nt decommit thing? -syscon compat POSIX_MADV_DONTNEED 4 4 4 4 4 0 # unix consensus -syscon compat POSIX_FADV_DONTNEED 4 0 4 4 4 0 # unix consensus +syscon madv MADV_DONTNEED 4 4 4 4 4 127 # TODO(jart): weird nt decommit thing? +syscon compat POSIX_MADV_DONTNEED 4 4 4 4 4 127 # unix consensus +syscon compat POSIX_FADV_DONTNEED 4 127 4 4 4 127 # unix consensus syscon madv MADV_RANDOM 1 1 1 1 1 0x10000000 # unix consensus & kNtFileFlagRandomAccess syscon compat POSIX_MADV_RANDOM 1 1 1 1 1 0x10000000 # unix consensus & kNtFileFlagRandomAccess -syscon compat POSIX_FADV_RANDOM 1 0 1 1 1 0x10000000 # unix consensus & kNtFileFlagRandomAccess +syscon compat POSIX_FADV_RANDOM 1 127 1 1 1 0x10000000 # unix consensus & kNtFileFlagRandomAccess syscon madv MADV_SEQUENTIAL 2 2 2 2 2 0x8000000 # unix consensus & kNtFileFlagSequentialScan syscon compat POSIX_MADV_SEQUENTIAL 2 2 2 2 2 0x8000000 # unix consensus -syscon compat POSIX_FADV_SEQUENTIAL 2 0 2 2 2 0x8000000 # TODO(jart): double check xnu +syscon compat POSIX_FADV_SEQUENTIAL 2 127 2 2 2 0x8000000 # TODO(jart): double check xnu syscon madv MADV_WILLNEED 3 3 3 3 3 3 # unix consensus (faked on NT) syscon compat POSIX_MADV_WILLNEED 3 3 3 3 3 3 # unix consensus -syscon compat POSIX_FADV_WILLNEED 3 0 3 3 3 3 # TODO(jart): double check xnu -syscon madv MADV_MERGEABLE 12 0 0 0 0 0 # turns on (private anon range) page scanning and merging service (linux only) -syscon madv MADV_UNMERGEABLE 13 0 0 0 0 0 # turns off mergeable (linux only) +syscon compat POSIX_FADV_WILLNEED 3 127 3 3 3 3 # TODO(jart): double check xnu +syscon madv MADV_MERGEABLE 12 127 127 127 127 127 # turns on (private anon range) page scanning and merging service (linux only) +syscon madv MADV_UNMERGEABLE 13 127 127 127 127 127 # turns off mergeable (linux only) syscon madv MADV_FREE 8 5 5 6 6 8 # Linux 4.5+ (c. 2016) / NT Faked → VMOfferPriorityNormal (Win8+) -syscon madv MADV_HUGEPAGE 14 0 0 0 0 0 # TODO(jart): why would we need it? -syscon madv MADV_NOHUGEPAGE 15 0 0 0 0 0 # TODO(jart): why would we need it? -syscon madv MADV_DODUMP 17 0 0 0 0 0 # TODO(jart): what is it? -syscon madv MADV_DOFORK 11 0 0 0 0 0 # TODO(jart): what is it? -syscon madv MADV_DONTDUMP 16 0 0 0 0 0 # see MAP_CONCEAL in OpenBSD; TODO(jart): what is it? -syscon madv MADV_DONTFORK 10 0 0 0 0 0 # TODO(jart): what is it? -syscon madv MADV_HWPOISON 100 0 0 0 0 0 # TODO(jart): what is it? -syscon madv MADV_REMOVE 9 0 0 0 0 0 # TODO(jart): what is it? -syscon fadv POSIX_FADV_NOREUSE 5 0 5 0 5 0 # wut +syscon madv MADV_HUGEPAGE 14 127 127 127 127 127 # TODO(jart): why would we need it? +syscon madv MADV_NOHUGEPAGE 15 127 127 127 127 127 # TODO(jart): why would we need it? +syscon madv MADV_DODUMP 17 127 127 127 127 127 # TODO(jart): what is it? +syscon madv MADV_DOFORK 11 127 127 127 127 127 # TODO(jart): what is it? +syscon madv MADV_DONTDUMP 16 127 127 127 127 127 # see MAP_CONCEAL in OpenBSD; TODO(jart): what is it? +syscon madv MADV_DONTFORK 10 127 127 127 127 127 # TODO(jart): what is it? +syscon madv MADV_HWPOISON 100 127 127 127 127 127 # TODO(jart): what is it? +syscon madv MADV_REMOVE 9 127 127 127 127 127 # TODO(jart): what is it? +syscon fadv POSIX_FADV_NOREUSE 5 127 5 127 5 127 # wut # mmap(), mprotect(), etc. # digital restrictions management for the people @@ -471,7 +470,7 @@ syscon auxv AT_PHENT 4 0 4 0 4 0 syscon auxv AT_PHNUM 5 0 5 0 5 0 syscon auxv AT_PAGESZ 6 0 6 0 6 0 syscon auxv AT_BASE 7 0 7 0 7 0 # address of program interpreter -syscon auxv AT_FLAGS 8 0 0 0 0 0 +syscon auxv AT_FLAGS 8 0 8 0 8 0 syscon auxv AT_ENTRY 9 0 9 0 9 0 # entry address of executable syscon auxv AT_NOTELF 10 0 10 0 0 0 syscon auxv AT_OSRELDATE 0 0 18 0 0 0 @@ -487,10 +486,20 @@ syscon auxv AT_ICACHEBSIZE 20 0 0 0 0 0 syscon auxv AT_UCACHEBSIZE 21 0 0 0 0 0 syscon auxv AT_SECURE 23 0 0 0 0 0 syscon auxv AT_BASE_PLATFORM 24 0 0 0 0 0 -syscon auxv AT_RANDOM 25 0 0 0 0 0 # address of sixteen bytes of random data +syscon auxv AT_RANDOM 25 0 16 0 0 0 # address of sixteen bytes of random data; AT_CANARY on FreeBSD whose AT_CANARYLEN should be 64 syscon auxv AT_HWCAP2 26 0 0 0 0 0 -syscon auxv AT_EXECFN 31 31 999 999 2014 31 # address of string containing first argument passed to execve() used when running program [faked on non-linux] +syscon auxv AT_EXECFN 31 31 15 999 2014 31 # address of string containing first argument passed to execve() used when running program; AT_EXECPATH on FreeBSD syscon auxv AT_SYSINFO_EHDR 33 0 0 0 0 0 +syscon auxv AT_STACKBASE 0 0 0 0 13 0 +syscon auxv AT_EXECPATH 31 31 15 999 2014 31 # FreeBSD name for AT_EXECFN +syscon auxv AT_CANARY 0 0 16 0 0 0 +syscon auxv AT_CANARYLEN 0 0 17 0 0 0 +syscon auxv AT_NCPUS 0 0 19 0 0 0 +syscon auxv AT_PAGESIZES 0 0 20 0 0 0 +syscon auxv AT_PAGESIZESLEN 0 0 21 0 0 0 +syscon auxv AT_TIMEKEEP 0 0 22 0 0 0 +syscon auxv AT_STACKPROT 0 0 23 0 0 0 +syscon auxv AT_EHDRFLAGS 0 0 24 0 0 0 syscon auxv AT_NO_AUTOMOUNT 0x0800 0 0 0 0 0 # getrlimit() / setrlimit() resource parameter @@ -1477,13 +1486,13 @@ syscon termios IGNCR 0b0000000010000000 0b0000000010000000 0b000000001000000 syscon termios ICRNL 0b0000000100000000 0b0000000100000000 0b0000000100000000 0b0000000100000000 0b0000000100000000 0b0000000100000000 # termios.c_iflag|=ICRNL maps \r → \n input UNIXCONSENSUS syscon termios IUCLC 0b0000001000000000 0 0 0b0001000000000000 0 0b0000001000000000 # termios.c_iflag|=IUCLC maps A-Z → a-z input syscon termios IXON 0b0000010000000000 0b0000001000000000 0b0000001000000000 0b0000001000000000 0b0000001000000000 0b0000010000000000 # termios.c_iflag|=IXON enables flow rida -syscon termios IXANY 0b0000100000000000 0b0000100000000000 0b0000100000000000 0b0000100000000000 0b0000100000000000 0b0000100000000000 # termios.c_iflag|=IXANY tying will un-stuck teletype UNIXCONSENSUS +syscon termios IXANY 0b0000100000000000 0b0000100000000000 0b0000100000000000 0b0000100000000000 0b0000100000000000 0b0000100000000000 # termios.c_iflag|=IXANY typing will un-stuck teletype UNIXCONSENSUS syscon termios IXOFF 0b0001000000000000 0b0000010000000000 0b0000010000000000 0b0000010000000000 0b0000010000000000 0b0001000000000000 # termios.c_iflag|=IXOFF disables annoying display freeze keys syscon termios IMAXBEL 0b0010000000000000 0b0010000000000000 0b0010000000000000 0b0010000000000000 0b0010000000000000 0b0010000000000000 # termios.c_iflag|=IMAXBEL rings when queue full UNIXCONSENSUS syscon termios IUTF8 0b0100000000000000 0b0100000000000000 0 0 0 0b0100000000000000 # termios.c_iflag|=IUTF8 helps w/ rubout on UTF-8 input -syscon termios OPOST 0b0000000000000001 0b000000000000000001 0b000000000000000001 0b0000000000000001 0b0000000000000001 0b0000000000000001 # termios.c_oflag&=~OPOST disables output processing magic +syscon termios OPOST 0b0000000000000001 0b000000000000000001 0b000000000000000001 0b0000000000000001 0b0000000000000001 0b0000000000000001 # termios.c_oflag&=~OPOST disables output processing magic, e.g. MULTICS newlines syscon termios OLCUC 0b0000000000000010 0 0 0b0000000000100000 0 0b0000000000000010 # termios.c_oflag|=OLCUC maps a-z → A-Z output -syscon termios ONLCR 0b0000000000000100 0b000000000000000010 0b000000000000000010 0b0000000000000010 0b0000000000000010 0b0000000000000100 # termios.c_oflag|=ONLCR maps \n → \r\n output +syscon termios ONLCR 0b0000000000000100 0b000000000000000010 0b000000000000000010 0b0000000000000010 0b0000000000000010 0b0000000000000100 # termios.c_oflag|=ONLCR claims to map \n → \r\n output syscon termios OCRNL 0b0000000000001000 0b000000000000010000 0b000000000000010000 0b0000000000010000 0b0000000000010000 0b0000000000001000 # termios.c_oflag|=OCRNL maps \r → \n output syscon termios ONOCR 0b0000000000010000 0b000000000000100000 0b000000000000100000 0b0000000001000000 0b0000000001000000 0b0000000000010000 # termios.c_oflag|=ONOCR maps \r → ∅ output iff column 0 syscon termios ONLRET 0b0000000000100000 0b000000000001000000 0b000000000001000000 0b0000000010000000 0b0000000010000000 0b0000000000100000 # termios.c_oflag|=ONLRET maps \r → ∅ output diff --git a/libc/sysv/consts/AT_CANARY.S b/libc/sysv/consts/AT_CANARY.S new file mode 100644 index 000000000..9a0fda0b6 --- /dev/null +++ b/libc/sysv/consts/AT_CANARY.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon auxv,AT_CANARY,0,0,16,0,0,0 diff --git a/libc/sysv/consts/AT_CANARYLEN.S b/libc/sysv/consts/AT_CANARYLEN.S new file mode 100644 index 000000000..ee5e819d9 --- /dev/null +++ b/libc/sysv/consts/AT_CANARYLEN.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon auxv,AT_CANARYLEN,0,0,17,0,0,0 diff --git a/libc/sysv/consts/AT_EHDRFLAGS.S b/libc/sysv/consts/AT_EHDRFLAGS.S new file mode 100644 index 000000000..47b678e3b --- /dev/null +++ b/libc/sysv/consts/AT_EHDRFLAGS.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon auxv,AT_EHDRFLAGS,0,0,24,0,0,0 diff --git a/libc/sysv/consts/AT_EXECFN.S b/libc/sysv/consts/AT_EXECFN.S index ec03740c2..0fa809424 100644 --- a/libc/sysv/consts/AT_EXECFN.S +++ b/libc/sysv/consts/AT_EXECFN.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon auxv,AT_EXECFN,31,31,999,999,2014,31 +.syscon auxv,AT_EXECFN,31,31,15,999,2014,31 diff --git a/libc/sysv/consts/AT_EXECPATH.S b/libc/sysv/consts/AT_EXECPATH.S new file mode 100644 index 000000000..119cf8b4f --- /dev/null +++ b/libc/sysv/consts/AT_EXECPATH.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon auxv,AT_EXECPATH,31,31,15,999,2014,31 diff --git a/libc/sysv/consts/AT_FLAGS.S b/libc/sysv/consts/AT_FLAGS.S index 79b4bc1e7..b5bf0d555 100644 --- a/libc/sysv/consts/AT_FLAGS.S +++ b/libc/sysv/consts/AT_FLAGS.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon auxv,AT_FLAGS,8,0,0,0,0,0 +.syscon auxv,AT_FLAGS,8,0,8,0,8,0 diff --git a/libc/sysv/consts/AT_NCPUS.S b/libc/sysv/consts/AT_NCPUS.S new file mode 100644 index 000000000..a79325514 --- /dev/null +++ b/libc/sysv/consts/AT_NCPUS.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon auxv,AT_NCPUS,0,0,19,0,0,0 diff --git a/libc/sysv/consts/AT_PAGESIZES.S b/libc/sysv/consts/AT_PAGESIZES.S new file mode 100644 index 000000000..7ecb5f2cd --- /dev/null +++ b/libc/sysv/consts/AT_PAGESIZES.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon auxv,AT_PAGESIZES,0,0,20,0,0,0 diff --git a/libc/sysv/consts/AT_PAGESIZESLEN.S b/libc/sysv/consts/AT_PAGESIZESLEN.S new file mode 100644 index 000000000..1c2509346 --- /dev/null +++ b/libc/sysv/consts/AT_PAGESIZESLEN.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon auxv,AT_PAGESIZESLEN,0,0,21,0,0,0 diff --git a/libc/sysv/consts/AT_RANDOM.S b/libc/sysv/consts/AT_RANDOM.S index 28cce6500..9badd07c8 100644 --- a/libc/sysv/consts/AT_RANDOM.S +++ b/libc/sysv/consts/AT_RANDOM.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon auxv,AT_RANDOM,25,0,0,0,0,0 +.syscon auxv,AT_RANDOM,25,0,16,0,0,0 diff --git a/libc/sysv/consts/AT_STACKBASE.S b/libc/sysv/consts/AT_STACKBASE.S new file mode 100644 index 000000000..a7689a9b0 --- /dev/null +++ b/libc/sysv/consts/AT_STACKBASE.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon auxv,AT_STACKBASE,0,0,0,0,13,0 diff --git a/libc/sysv/consts/AT_STACKPROT.S b/libc/sysv/consts/AT_STACKPROT.S new file mode 100644 index 000000000..3e45d2737 --- /dev/null +++ b/libc/sysv/consts/AT_STACKPROT.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon auxv,AT_STACKPROT,0,0,23,0,0,0 diff --git a/libc/sysv/consts/AT_TIMEKEEP.S b/libc/sysv/consts/AT_TIMEKEEP.S new file mode 100644 index 000000000..f90ab4b4c --- /dev/null +++ b/libc/sysv/consts/AT_TIMEKEEP.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon auxv,AT_TIMEKEEP,0,0,22,0,0,0 diff --git a/libc/sysv/consts/MADV_DODUMP.S b/libc/sysv/consts/MADV_DODUMP.S index 646221a86..f8e709e27 100644 --- a/libc/sysv/consts/MADV_DODUMP.S +++ b/libc/sysv/consts/MADV_DODUMP.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon madv,MADV_DODUMP,17,0,0,0,0,0 +.syscon madv,MADV_DODUMP,17,127,127,127,127,127 diff --git a/libc/sysv/consts/MADV_DOFORK.S b/libc/sysv/consts/MADV_DOFORK.S index ed787cfc2..07615b18c 100644 --- a/libc/sysv/consts/MADV_DOFORK.S +++ b/libc/sysv/consts/MADV_DOFORK.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon madv,MADV_DOFORK,11,0,0,0,0,0 +.syscon madv,MADV_DOFORK,11,127,127,127,127,127 diff --git a/libc/sysv/consts/MADV_DONTDUMP.S b/libc/sysv/consts/MADV_DONTDUMP.S index feba10977..28fcf75b1 100644 --- a/libc/sysv/consts/MADV_DONTDUMP.S +++ b/libc/sysv/consts/MADV_DONTDUMP.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon madv,MADV_DONTDUMP,16,0,0,0,0,0 +.syscon madv,MADV_DONTDUMP,16,127,127,127,127,127 diff --git a/libc/sysv/consts/MADV_DONTFORK.S b/libc/sysv/consts/MADV_DONTFORK.S index ee1535ff6..28eded7f4 100644 --- a/libc/sysv/consts/MADV_DONTFORK.S +++ b/libc/sysv/consts/MADV_DONTFORK.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon madv,MADV_DONTFORK,10,0,0,0,0,0 +.syscon madv,MADV_DONTFORK,10,127,127,127,127,127 diff --git a/libc/sysv/consts/MADV_DONTNEED.S b/libc/sysv/consts/MADV_DONTNEED.S index 72ce36e4d..6567e21f8 100644 --- a/libc/sysv/consts/MADV_DONTNEED.S +++ b/libc/sysv/consts/MADV_DONTNEED.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon madv,MADV_DONTNEED,4,4,4,4,4,0 +.syscon madv,MADV_DONTNEED,4,4,4,4,4,127 diff --git a/libc/sysv/consts/MADV_HUGEPAGE.S b/libc/sysv/consts/MADV_HUGEPAGE.S index 7d42c5da0..0afab715f 100644 --- a/libc/sysv/consts/MADV_HUGEPAGE.S +++ b/libc/sysv/consts/MADV_HUGEPAGE.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon madv,MADV_HUGEPAGE,14,0,0,0,0,0 +.syscon madv,MADV_HUGEPAGE,14,127,127,127,127,127 diff --git a/libc/sysv/consts/MADV_HWPOISON.S b/libc/sysv/consts/MADV_HWPOISON.S index 85ed35846..c8f76111a 100644 --- a/libc/sysv/consts/MADV_HWPOISON.S +++ b/libc/sysv/consts/MADV_HWPOISON.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon madv,MADV_HWPOISON,100,0,0,0,0,0 +.syscon madv,MADV_HWPOISON,100,127,127,127,127,127 diff --git a/libc/sysv/consts/MADV_MERGEABLE.S b/libc/sysv/consts/MADV_MERGEABLE.S index 65bf29223..172668fcc 100644 --- a/libc/sysv/consts/MADV_MERGEABLE.S +++ b/libc/sysv/consts/MADV_MERGEABLE.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon madv,MADV_MERGEABLE,12,0,0,0,0,0 +.syscon madv,MADV_MERGEABLE,12,127,127,127,127,127 diff --git a/libc/sysv/consts/MADV_NOHUGEPAGE.S b/libc/sysv/consts/MADV_NOHUGEPAGE.S index d56f15745..9458ebc54 100644 --- a/libc/sysv/consts/MADV_NOHUGEPAGE.S +++ b/libc/sysv/consts/MADV_NOHUGEPAGE.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon madv,MADV_NOHUGEPAGE,15,0,0,0,0,0 +.syscon madv,MADV_NOHUGEPAGE,15,127,127,127,127,127 diff --git a/libc/sysv/consts/MADV_REMOVE.S b/libc/sysv/consts/MADV_REMOVE.S index ea2398627..cc77e67fc 100644 --- a/libc/sysv/consts/MADV_REMOVE.S +++ b/libc/sysv/consts/MADV_REMOVE.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon madv,MADV_REMOVE,9,0,0,0,0,0 +.syscon madv,MADV_REMOVE,9,127,127,127,127,127 diff --git a/libc/sysv/consts/MADV_UNMERGEABLE.S b/libc/sysv/consts/MADV_UNMERGEABLE.S index 2704aabe7..d0335eb72 100644 --- a/libc/sysv/consts/MADV_UNMERGEABLE.S +++ b/libc/sysv/consts/MADV_UNMERGEABLE.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon madv,MADV_UNMERGEABLE,13,0,0,0,0,0 +.syscon madv,MADV_UNMERGEABLE,13,127,127,127,127,127 diff --git a/libc/sysv/consts/MAP_ANON.S b/libc/sysv/consts/MAP_ANON.S index 9b6ef77dd..a1eb02bfe 100644 --- a/libc/sysv/consts/MAP_ANON.S +++ b/libc/sysv/consts/MAP_ANON.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon compat,MAP_ANON,0x20,0x1000,0x1000,0x1000,0x1000,0x20 +.syscon compat,MAP_ANON,0x20,0x1000,0x0001000,0x1000,0x1000,0x20 diff --git a/libc/sysv/consts/MAP_ANONYMOUS.S b/libc/sysv/consts/MAP_ANONYMOUS.S index 6872f306a..9aa3781ea 100644 --- a/libc/sysv/consts/MAP_ANONYMOUS.S +++ b/libc/sysv/consts/MAP_ANONYMOUS.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon mmap,MAP_ANONYMOUS,0x20,0x1000,0x1000,0x1000,0x1000,0x20 +.syscon mmap,MAP_ANONYMOUS,0x20,0x1000,0x0001000,0x1000,0x1000,0x20 diff --git a/libc/sysv/consts/MAP_FIXED.S b/libc/sysv/consts/MAP_FIXED.S index e47ad4a5d..e9dbc0e9e 100644 --- a/libc/sysv/consts/MAP_FIXED.S +++ b/libc/sysv/consts/MAP_FIXED.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon mmap,MAP_FIXED,0x10,0x10,0x10,0x10,0x10,0x10 +.syscon mmap,MAP_FIXED,0x0000010,0x0000010,0x0000010,0x0000010,0x0000010,0x0000010 diff --git a/libc/sysv/consts/MAP_FIXED_NOREPLACE.S b/libc/sysv/consts/MAP_FIXED_NOREPLACE.S new file mode 100644 index 000000000..2bcb31adf --- /dev/null +++ b/libc/sysv/consts/MAP_FIXED_NOREPLACE.S @@ -0,0 +1,2 @@ +#include "libc/sysv/consts/syscon.internal.h" +.syscon mmap,MAP_FIXED_NOREPLACE,0x8000000,0x8000000,0x8000000,0x8000000,0x8000000,0x8000000 diff --git a/libc/sysv/consts/MAP_GROWSDOWN.S b/libc/sysv/consts/MAP_GROWSDOWN.S index e7fc93583..ec4438b6a 100644 --- a/libc/sysv/consts/MAP_GROWSDOWN.S +++ b/libc/sysv/consts/MAP_GROWSDOWN.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon mmap,MAP_GROWSDOWN,0x0100,0,0x0400,0x4000,0x4000,0x100000 +.syscon mmap,MAP_GROWSDOWN,0x0100,0,0x0000400,0x4000,0x4000,0x100000 diff --git a/libc/sysv/consts/MAP_NOCORE.S b/libc/sysv/consts/MAP_NOCORE.S index 90c2c1f44..c0e6b263f 100644 --- a/libc/sysv/consts/MAP_NOCORE.S +++ b/libc/sysv/consts/MAP_NOCORE.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon compat,MAP_NOCORE,0,0,0x20000,0x8000,0x8000,0 +.syscon compat,MAP_NOCORE,0,0,0x0020000,0x8000,0x8000,0 diff --git a/libc/sysv/consts/MAP_STACK.S b/libc/sysv/consts/MAP_STACK.S index 1eff99c73..ed26f8ecf 100644 --- a/libc/sysv/consts/MAP_STACK.S +++ b/libc/sysv/consts/MAP_STACK.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon compat,MAP_STACK,0x0100,0,0x0400,0x4000,0x2000,0x100000 +.syscon mmap,MAP_STACK,0x0100,0,0x0000400,0x4000,0x2000,0x100000 diff --git a/libc/sysv/consts/POSIX_FADV_DONTNEED.S b/libc/sysv/consts/POSIX_FADV_DONTNEED.S index b17a2a8dc..710c85ef1 100644 --- a/libc/sysv/consts/POSIX_FADV_DONTNEED.S +++ b/libc/sysv/consts/POSIX_FADV_DONTNEED.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon compat,POSIX_FADV_DONTNEED,4,0,4,4,4,0 +.syscon compat,POSIX_FADV_DONTNEED,4,127,4,4,4,127 diff --git a/libc/sysv/consts/POSIX_FADV_NOREUSE.S b/libc/sysv/consts/POSIX_FADV_NOREUSE.S index 7b1286148..ff5f39d9c 100644 --- a/libc/sysv/consts/POSIX_FADV_NOREUSE.S +++ b/libc/sysv/consts/POSIX_FADV_NOREUSE.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon fadv,POSIX_FADV_NOREUSE,5,0,5,0,5,0 +.syscon fadv,POSIX_FADV_NOREUSE,5,127,5,127,5,127 diff --git a/libc/sysv/consts/POSIX_FADV_RANDOM.S b/libc/sysv/consts/POSIX_FADV_RANDOM.S index 1666daa39..978a1cf76 100644 --- a/libc/sysv/consts/POSIX_FADV_RANDOM.S +++ b/libc/sysv/consts/POSIX_FADV_RANDOM.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon compat,POSIX_FADV_RANDOM,1,0,1,1,1,0x10000000 +.syscon compat,POSIX_FADV_RANDOM,1,127,1,1,1,0x10000000 diff --git a/libc/sysv/consts/POSIX_FADV_SEQUENTIAL.S b/libc/sysv/consts/POSIX_FADV_SEQUENTIAL.S index 1f6b11052..5f743db4d 100644 --- a/libc/sysv/consts/POSIX_FADV_SEQUENTIAL.S +++ b/libc/sysv/consts/POSIX_FADV_SEQUENTIAL.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon compat,POSIX_FADV_SEQUENTIAL,2,0,2,2,2,0x8000000 +.syscon compat,POSIX_FADV_SEQUENTIAL,2,127,2,2,2,0x8000000 diff --git a/libc/sysv/consts/POSIX_FADV_WILLNEED.S b/libc/sysv/consts/POSIX_FADV_WILLNEED.S index e8f60969d..7ae0fe7da 100644 --- a/libc/sysv/consts/POSIX_FADV_WILLNEED.S +++ b/libc/sysv/consts/POSIX_FADV_WILLNEED.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon compat,POSIX_FADV_WILLNEED,3,0,3,3,3,3 +.syscon compat,POSIX_FADV_WILLNEED,3,127,3,3,3,3 diff --git a/libc/sysv/consts/POSIX_MADV_DONTNEED.S b/libc/sysv/consts/POSIX_MADV_DONTNEED.S index 52f0f9ab6..77d260f6b 100644 --- a/libc/sysv/consts/POSIX_MADV_DONTNEED.S +++ b/libc/sysv/consts/POSIX_MADV_DONTNEED.S @@ -1,2 +1,2 @@ #include "libc/sysv/consts/syscon.internal.h" -.syscon compat,POSIX_MADV_DONTNEED,4,4,4,4,4,0 +.syscon compat,POSIX_MADV_DONTNEED,4,4,4,4,4,127 diff --git a/libc/sysv/consts/auxv.h b/libc/sysv/consts/auxv.h index 69bf377f9..fb18fb88c 100644 --- a/libc/sysv/consts/auxv.h +++ b/libc/sysv/consts/auxv.h @@ -31,6 +31,16 @@ extern const long AT_SECURE; extern const long AT_SYSINFO_EHDR; extern const long AT_UCACHEBSIZE; extern const long AT_UID; +extern const long AT_STACKBASE; +extern const long AT_EXECPATH; +extern const long AT_CANARY; +extern const long AT_CANARYLEN; +extern const long AT_NCPUS; +extern const long AT_PAGESIZES; +extern const long AT_PAGESIZESLEN; +extern const long AT_TIMEKEEP; +extern const long AT_STACKPROT; +extern const long AT_EHDRFLAGS; COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ @@ -62,5 +72,15 @@ COSMOPOLITAN_C_END_ #define AT_SYSINFO_EHDR SYMBOLIC(AT_SYSINFO_EHDR) #define AT_UCACHEBSIZE SYMBOLIC(AT_UCACHEBSIZE) #define AT_UID SYMBOLIC(AT_UID) +#define AT_STACKBASE SYMBOLIC(AT_STACKBASE) +#define AT_EXECPATH SYMBOLIC(AT_EXECPATH) +#define AT_CANARY SYMBOLIC(AT_CANARY) +#define AT_CANARYLEN SYMBOLIC(AT_CANARYLEN) +#define AT_NCPUS SYMBOLIC(AT_NCPUS) +#define AT_PAGESIZES SYMBOLIC(AT_PAGESIZES) +#define AT_PAGESIZESLEN SYMBOLIC(AT_PAGESIZESLEN) +#define AT_TIMEKEEP SYMBOLIC(AT_TIMEKEEP) +#define AT_STACKPROT SYMBOLIC(AT_STACKPROT) +#define AT_EHDRFLAGS SYMBOLIC(AT_EHDRFLAGS) #endif /* COSMOPOLITAN_LIBC_CALLS_AUXV_H_ */ diff --git a/libc/sysv/consts/madv.h b/libc/sysv/consts/madv.h index 1c828ad15..cb81cb926 100644 --- a/libc/sysv/consts/madv.h +++ b/libc/sysv/consts/madv.h @@ -2,42 +2,42 @@ #define COSMOPOLITAN_LIBC_SYSV_CONSTS_MADV_H_ #include "libc/runtime/symbolic.h" -#define MADV_DODUMP SYMBOLIC(MADV_DODUMP) -#define MADV_DOFORK SYMBOLIC(MADV_DOFORK) -#define MADV_DONTDUMP SYMBOLIC(MADV_DONTDUMP) -#define MADV_DONTFORK SYMBOLIC(MADV_DONTFORK) -#define MADV_DONTNEED SYMBOLIC(MADV_DONTNEED) -#define MADV_FREE SYMBOLIC(MADV_FREE) -#define MADV_HUGEPAGE SYMBOLIC(MADV_HUGEPAGE) -#define MADV_HWPOISON SYMBOLIC(MADV_HWPOISON) -#define MADV_MERGEABLE SYMBOLIC(MADV_MERGEABLE) -#define MADV_NOHUGEPAGE SYMBOLIC(MADV_NOHUGEPAGE) -#define MADV_NORMAL SYMBOLIC(MADV_NORMAL) -#define MADV_RANDOM SYMBOLIC(MADV_RANDOM) -#define MADV_REMOVE SYMBOLIC(MADV_REMOVE) -#define MADV_SEQUENTIAL SYMBOLIC(MADV_SEQUENTIAL) +#define MADV_DODUMP SYMBOLIC(MADV_DODUMP) +#define MADV_DOFORK SYMBOLIC(MADV_DOFORK) +#define MADV_DONTDUMP SYMBOLIC(MADV_DONTDUMP) +#define MADV_DONTFORK SYMBOLIC(MADV_DONTFORK) +#define MADV_DONTNEED SYMBOLIC(MADV_DONTNEED) +#define MADV_FREE SYMBOLIC(MADV_FREE) +#define MADV_HUGEPAGE SYMBOLIC(MADV_HUGEPAGE) +#define MADV_HWPOISON SYMBOLIC(MADV_HWPOISON) +#define MADV_MERGEABLE SYMBOLIC(MADV_MERGEABLE) +#define MADV_NOHUGEPAGE SYMBOLIC(MADV_NOHUGEPAGE) +#define MADV_NORMAL SYMBOLIC(MADV_NORMAL) +#define MADV_RANDOM SYMBOLIC(MADV_RANDOM) +#define MADV_REMOVE SYMBOLIC(MADV_REMOVE) +#define MADV_SEQUENTIAL SYMBOLIC(MADV_SEQUENTIAL) #define MADV_UNMERGEABLE SYMBOLIC(MADV_UNMERGEABLE) -#define MADV_WILLNEED SYMBOLIC(MADV_WILLNEED) +#define MADV_WILLNEED SYMBOLIC(MADV_WILLNEED) #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ -extern const long MADV_DODUMP; -extern const long MADV_DOFORK; -extern const long MADV_DONTDUMP; -extern const long MADV_DONTFORK; -extern const long MADV_DONTNEED; -extern const long MADV_FREE; -extern const long MADV_HUGEPAGE; -extern const long MADV_HWPOISON; -extern const long MADV_MERGEABLE; -extern const long MADV_NOHUGEPAGE; -extern const long MADV_NORMAL; -extern const long MADV_RANDOM; -extern const long MADV_REMOVE; -extern const long MADV_SEQUENTIAL; -extern const long MADV_UNMERGEABLE; -extern const long MADV_WILLNEED; +extern const unsigned MADV_DODUMP; +extern const unsigned MADV_DOFORK; +extern const unsigned MADV_DONTDUMP; +extern const unsigned MADV_DONTFORK; +extern const unsigned MADV_DONTNEED; +extern const unsigned MADV_FREE; +extern const unsigned MADV_HUGEPAGE; +extern const unsigned MADV_HWPOISON; +extern const unsigned MADV_MERGEABLE; +extern const unsigned MADV_NOHUGEPAGE; +extern const unsigned MADV_NORMAL; +extern const unsigned MADV_RANDOM; +extern const unsigned MADV_REMOVE; +extern const unsigned MADV_SEQUENTIAL; +extern const unsigned MADV_UNMERGEABLE; +extern const unsigned MADV_WILLNEED; COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/sysv/consts/nr.h b/libc/sysv/consts/nr.h index 810a90746..4828240be 100644 --- a/libc/sysv/consts/nr.h +++ b/libc/sysv/consts/nr.h @@ -1,778 +1,6 @@ #ifndef COSMOPOLITAN_LIBC_SYSV_CONSTS_NR_H_ #define COSMOPOLITAN_LIBC_SYSV_CONSTS_NR_H_ #include "libc/runtime/symbolic.h" - -#define __NR_exit SYMBOLIC(__NR_exit) -#define __NR_exit_group SYMBOLIC(__NR_exit_group) -#define __NR_read SYMBOLIC(__NR_read) -#define __NR_write SYMBOLIC(__NR_write) -#define __NR_open SYMBOLIC(__NR_open) -#define __NR_close SYMBOLIC(__NR_close) -#define __NR_stat SYMBOLIC(__NR_stat) -#define __NR_fstat SYMBOLIC(__NR_fstat) -#define __NR_lstat SYMBOLIC(__NR_lstat) -#define __NR_poll SYMBOLIC(__NR_poll) -#define __NR_ppoll SYMBOLIC(__NR_ppoll) -#define __NR_lseek SYMBOLIC(__NR_lseek) -#define __NR_mmap SYMBOLIC(__NR_mmap) -#define __NR_msync SYMBOLIC(__NR_msync) -#define __NR_mprotect SYMBOLIC(__NR_mprotect) -#define __NR_munmap SYMBOLIC(__NR_munmap) -#define __NR_sigaction SYMBOLIC(__NR_sigaction) -#define __NR_sigprocmask SYMBOLIC(__NR_sigprocmask) -#define __NR_ioctl SYMBOLIC(__NR_ioctl) -#define __NR_pread SYMBOLIC(__NR_pread) -#define __NR_pwrite SYMBOLIC(__NR_pwrite) -#define __NR_readv SYMBOLIC(__NR_readv) -#define __NR_writev SYMBOLIC(__NR_writev) -#define __NR_access SYMBOLIC(__NR_access) -#define __NR_pipe SYMBOLIC(__NR_pipe) -#define __NR_select SYMBOLIC(__NR_select) -#define __NR_pselect SYMBOLIC(__NR_pselect) -#define __NR_pselect6 SYMBOLIC(__NR_pselect6) -#define __NR_sched_yield SYMBOLIC(__NR_sched_yield) -#define __NR_mremap SYMBOLIC(__NR_mremap) -#define __NR_mincore SYMBOLIC(__NR_mincore) -#define __NR_madvise SYMBOLIC(__NR_madvise) -#define __NR_shmget SYMBOLIC(__NR_shmget) -#define __NR_shmat SYMBOLIC(__NR_shmat) -#define __NR_shmctl SYMBOLIC(__NR_shmctl) -#define __NR_dup SYMBOLIC(__NR_dup) -#define __NR_dup2 SYMBOLIC(__NR_dup2) -#define __NR_pause SYMBOLIC(__NR_pause) -#define __NR_nanosleep SYMBOLIC(__NR_nanosleep) -#define __NR_getitimer SYMBOLIC(__NR_getitimer) -#define __NR_setitimer SYMBOLIC(__NR_setitimer) -#define __NR_alarm SYMBOLIC(__NR_alarm) -#define __NR_getpid SYMBOLIC(__NR_getpid) -#define __NR_sendfile SYMBOLIC(__NR_sendfile) -#define __NR_socket SYMBOLIC(__NR_socket) -#define __NR_connect SYMBOLIC(__NR_connect) -#define __NR_accept SYMBOLIC(__NR_accept) -#define __NR_sendto SYMBOLIC(__NR_sendto) -#define __NR_recvfrom SYMBOLIC(__NR_recvfrom) -#define __NR_sendmsg SYMBOLIC(__NR_sendmsg) -#define __NR_recvmsg SYMBOLIC(__NR_recvmsg) -#define __NR_shutdown SYMBOLIC(__NR_shutdown) -#define __NR_bind SYMBOLIC(__NR_bind) -#define __NR_listen SYMBOLIC(__NR_listen) -#define __NR_getsockname SYMBOLIC(__NR_getsockname) -#define __NR_getpeername SYMBOLIC(__NR_getpeername) -#define __NR_socketpair SYMBOLIC(__NR_socketpair) -#define __NR_setsockopt SYMBOLIC(__NR_setsockopt) -#define __NR_getsockopt SYMBOLIC(__NR_getsockopt) -#define __NR_fork SYMBOLIC(__NR_fork) -#define __NR_vfork SYMBOLIC(__NR_vfork) -#define __NR_posix_spawn SYMBOLIC(__NR_posix_spawn) -#define __NR_execve SYMBOLIC(__NR_execve) -#define __NR_wait4 SYMBOLIC(__NR_wait4) -#define __NR_kill SYMBOLIC(__NR_kill) -#define __NR_killpg SYMBOLIC(__NR_killpg) -#define __NR_clone SYMBOLIC(__NR_clone) -#define __NR_tkill SYMBOLIC(__NR_tkill) -#define __NR_futex SYMBOLIC(__NR_futex) -#define __NR_set_robust_list SYMBOLIC(__NR_set_robust_list) -#define __NR_get_robust_list SYMBOLIC(__NR_get_robust_list) -#define __NR_uname SYMBOLIC(__NR_uname) -#define __NR_semget SYMBOLIC(__NR_semget) -#define __NR_semop SYMBOLIC(__NR_semop) -#define __NR_semctl SYMBOLIC(__NR_semctl) -#define __NR_shmdt SYMBOLIC(__NR_shmdt) -#define __NR_msgget SYMBOLIC(__NR_msgget) -#define __NR_msgsnd SYMBOLIC(__NR_msgsnd) -#define __NR_msgrcv SYMBOLIC(__NR_msgrcv) -#define __NR_msgctl SYMBOLIC(__NR_msgctl) -#define __NR_fcntl SYMBOLIC(__NR_fcntl) -#define __NR_flock SYMBOLIC(__NR_flock) -#define __NR_fsync SYMBOLIC(__NR_fsync) -#define __NR_fdatasync SYMBOLIC(__NR_fdatasync) -#define __NR_truncate SYMBOLIC(__NR_truncate) -#define __NR_ftruncate SYMBOLIC(__NR_ftruncate) -#define __NR_getcwd SYMBOLIC(__NR_getcwd) -#define __NR_chdir SYMBOLIC(__NR_chdir) -#define __NR_fchdir SYMBOLIC(__NR_fchdir) -#define __NR_rename SYMBOLIC(__NR_rename) -#define __NR_mkdir SYMBOLIC(__NR_mkdir) -#define __NR_rmdir SYMBOLIC(__NR_rmdir) -#define __NR_creat SYMBOLIC(__NR_creat) -#define __NR_link SYMBOLIC(__NR_link) -#define __NR_unlink SYMBOLIC(__NR_unlink) -#define __NR_symlink SYMBOLIC(__NR_symlink) -#define __NR_readlink SYMBOLIC(__NR_readlink) -#define __NR_chmod SYMBOLIC(__NR_chmod) -#define __NR_fchmod SYMBOLIC(__NR_fchmod) -#define __NR_chown SYMBOLIC(__NR_chown) -#define __NR_fchown SYMBOLIC(__NR_fchown) -#define __NR_lchown SYMBOLIC(__NR_lchown) -#define __NR_umask SYMBOLIC(__NR_umask) -#define __NR_gettimeofday SYMBOLIC(__NR_gettimeofday) -#define __NR_getrlimit SYMBOLIC(__NR_getrlimit) -#define __NR_getrusage SYMBOLIC(__NR_getrusage) -#define __NR_sysinfo SYMBOLIC(__NR_sysinfo) -#define __NR_times SYMBOLIC(__NR_times) -#define __NR_ptrace SYMBOLIC(__NR_ptrace) -#define __NR_syslog SYMBOLIC(__NR_syslog) -#define __NR_getuid SYMBOLIC(__NR_getuid) -#define __NR_getgid SYMBOLIC(__NR_getgid) -#define __NR_getppid SYMBOLIC(__NR_getppid) -#define __NR_getpgrp SYMBOLIC(__NR_getpgrp) -#define __NR_setsid SYMBOLIC(__NR_setsid) -#define __NR_getsid SYMBOLIC(__NR_getsid) -#define __NR_getpgid SYMBOLIC(__NR_getpgid) -#define __NR_setpgid SYMBOLIC(__NR_setpgid) -#define __NR_geteuid SYMBOLIC(__NR_geteuid) -#define __NR_getegid SYMBOLIC(__NR_getegid) -#define __NR_getgroups SYMBOLIC(__NR_getgroups) -#define __NR_setgroups SYMBOLIC(__NR_setgroups) -#define __NR_setreuid SYMBOLIC(__NR_setreuid) -#define __NR_setregid SYMBOLIC(__NR_setregid) -#define __NR_setuid SYMBOLIC(__NR_setuid) -#define __NR_setgid SYMBOLIC(__NR_setgid) -#define __NR_setresuid SYMBOLIC(__NR_setresuid) -#define __NR_setresgid SYMBOLIC(__NR_setresgid) -#define __NR_getresuid SYMBOLIC(__NR_getresuid) -#define __NR_getresgid SYMBOLIC(__NR_getresgid) -#define __NR_sigpending SYMBOLIC(__NR_sigpending) -#define __NR_sigsuspend SYMBOLIC(__NR_sigsuspend) -#define __NR_sigaltstack SYMBOLIC(__NR_sigaltstack) -#define __NR_mknod SYMBOLIC(__NR_mknod) -#define __NR_mknodat SYMBOLIC(__NR_mknodat) -#define __NR_mkfifo SYMBOLIC(__NR_mkfifo) -#define __NR_mkfifoat SYMBOLIC(__NR_mkfifoat) -#define __NR_statfs SYMBOLIC(__NR_statfs) -#define __NR_fstatfs SYMBOLIC(__NR_fstatfs) -#define __NR_getpriority SYMBOLIC(__NR_getpriority) -#define __NR_setpriority SYMBOLIC(__NR_setpriority) -#define __NR_mlock SYMBOLIC(__NR_mlock) -#define __NR_munlock SYMBOLIC(__NR_munlock) -#define __NR_mlockall SYMBOLIC(__NR_mlockall) -#define __NR_munlockall SYMBOLIC(__NR_munlockall) -#define __NR_setrlimit SYMBOLIC(__NR_setrlimit) -#define __NR_chroot SYMBOLIC(__NR_chroot) -#define __NR_sync SYMBOLIC(__NR_sync) -#define __NR_acct SYMBOLIC(__NR_acct) -#define __NR_settimeofday SYMBOLIC(__NR_settimeofday) -#define __NR_mount SYMBOLIC(__NR_mount) -#define __NR_reboot SYMBOLIC(__NR_reboot) -#define __NR_quotactl SYMBOLIC(__NR_quotactl) -#define __NR_setfsuid SYMBOLIC(__NR_setfsuid) -#define __NR_setfsgid SYMBOLIC(__NR_setfsgid) -#define __NR_capget SYMBOLIC(__NR_capget) -#define __NR_capset SYMBOLIC(__NR_capset) -#define __NR_sigtimedwait SYMBOLIC(__NR_sigtimedwait) -#define __NR_rt_sigqueueinfo SYMBOLIC(__NR_rt_sigqueueinfo) -#define __NR_personality SYMBOLIC(__NR_personality) -#define __NR_ustat SYMBOLIC(__NR_ustat) -#define __NR_sysfs SYMBOLIC(__NR_sysfs) -#define __NR_sched_setparam SYMBOLIC(__NR_sched_setparam) -#define __NR_sched_getparam SYMBOLIC(__NR_sched_getparam) -#define __NR_sched_setscheduler SYMBOLIC(__NR_sched_setscheduler) -#define __NR_sched_getscheduler SYMBOLIC(__NR_sched_getscheduler) -#define __NR_sched_get_priority_max SYMBOLIC(__NR_sched_get_priority_max) -#define __NR_sched_get_priority_min SYMBOLIC(__NR_sched_get_priority_min) -#define __NR_sched_rr_get_interval SYMBOLIC(__NR_sched_rr_get_interval) -#define __NR_vhangup SYMBOLIC(__NR_vhangup) -#define __NR_modify_ldt SYMBOLIC(__NR_modify_ldt) -#define __NR_pivot_root SYMBOLIC(__NR_pivot_root) -#define __NR__sysctl SYMBOLIC(__NR__sysctl) -#define __NR_prctl SYMBOLIC(__NR_prctl) -#define __NR_arch_prctl SYMBOLIC(__NR_arch_prctl) -#define __NR_adjtimex SYMBOLIC(__NR_adjtimex) -#define __NR_umount2 SYMBOLIC(__NR_umount2) -#define __NR_swapon SYMBOLIC(__NR_swapon) -#define __NR_swapoff SYMBOLIC(__NR_swapoff) -#define __NR_sethostname SYMBOLIC(__NR_sethostname) -#define __NR_setdomainname SYMBOLIC(__NR_setdomainname) -#define __NR_iopl SYMBOLIC(__NR_iopl) -#define __NR_ioperm SYMBOLIC(__NR_ioperm) -#define __NR_init_module SYMBOLIC(__NR_init_module) -#define __NR_delete_module SYMBOLIC(__NR_delete_module) -#define __NR_gettid SYMBOLIC(__NR_gettid) -#define __NR_readahead SYMBOLIC(__NR_readahead) -#define __NR_setxattr SYMBOLIC(__NR_setxattr) -#define __NR_fsetxattr SYMBOLIC(__NR_fsetxattr) -#define __NR_getxattr SYMBOLIC(__NR_getxattr) -#define __NR_fgetxattr SYMBOLIC(__NR_fgetxattr) -#define __NR_listxattr SYMBOLIC(__NR_listxattr) -#define __NR_flistxattr SYMBOLIC(__NR_flistxattr) -#define __NR_removexattr SYMBOLIC(__NR_removexattr) -#define __NR_fremovexattr SYMBOLIC(__NR_fremovexattr) -#define __NR_lsetxattr SYMBOLIC(__NR_lsetxattr) -#define __NR_lgetxattr SYMBOLIC(__NR_lgetxattr) -#define __NR_llistxattr SYMBOLIC(__NR_llistxattr) -#define __NR_lremovexattr SYMBOLIC(__NR_lremovexattr) -#define __NR_sched_setaffinity SYMBOLIC(__NR_sched_setaffinity) -#define __NR_sched_getaffinity SYMBOLIC(__NR_sched_getaffinity) -#define __NR_cpuset_getaffinity SYMBOLIC(__NR_cpuset_getaffinity) -#define __NR_cpuset_setaffinity SYMBOLIC(__NR_cpuset_setaffinity) -#define __NR_io_setup SYMBOLIC(__NR_io_setup) -#define __NR_io_destroy SYMBOLIC(__NR_io_destroy) -#define __NR_io_getevents SYMBOLIC(__NR_io_getevents) -#define __NR_io_submit SYMBOLIC(__NR_io_submit) -#define __NR_io_cancel SYMBOLIC(__NR_io_cancel) -#define __NR_lookup_dcookie SYMBOLIC(__NR_lookup_dcookie) -#define __NR_epoll_create SYMBOLIC(__NR_epoll_create) -#define __NR_epoll_wait SYMBOLIC(__NR_epoll_wait) -#define __NR_epoll_ctl SYMBOLIC(__NR_epoll_ctl) -#define __NR_getdents SYMBOLIC(__NR_getdents) -#define __NR_set_tid_address SYMBOLIC(__NR_set_tid_address) -#define __NR_restart_syscall SYMBOLIC(__NR_restart_syscall) -#define __NR_semtimedop SYMBOLIC(__NR_semtimedop) -#define __NR_fadvise SYMBOLIC(__NR_fadvise) -#define __NR_timer_create SYMBOLIC(__NR_timer_create) -#define __NR_timer_settime SYMBOLIC(__NR_timer_settime) -#define __NR_timer_gettime SYMBOLIC(__NR_timer_gettime) -#define __NR_timer_getoverrun SYMBOLIC(__NR_timer_getoverrun) -#define __NR_timer_delete SYMBOLIC(__NR_timer_delete) -#define __NR_clock_settime SYMBOLIC(__NR_clock_settime) -#define __NR_clock_gettime SYMBOLIC(__NR_clock_gettime) -#define __NR_clock_getres SYMBOLIC(__NR_clock_getres) -#define __NR_clock_nanosleep SYMBOLIC(__NR_clock_nanosleep) -#define __NR_tgkill SYMBOLIC(__NR_tgkill) -#define __NR_mbind SYMBOLIC(__NR_mbind) -#define __NR_set_mempolicy SYMBOLIC(__NR_set_mempolicy) -#define __NR_get_mempolicy SYMBOLIC(__NR_get_mempolicy) -#define __NR_mq_open SYMBOLIC(__NR_mq_open) -#define __NR_mq_unlink SYMBOLIC(__NR_mq_unlink) -#define __NR_mq_timedsend SYMBOLIC(__NR_mq_timedsend) -#define __NR_mq_timedreceive SYMBOLIC(__NR_mq_timedreceive) -#define __NR_mq_notify SYMBOLIC(__NR_mq_notify) -#define __NR_mq_getsetattr SYMBOLIC(__NR_mq_getsetattr) -#define __NR_kexec_load SYMBOLIC(__NR_kexec_load) -#define __NR_waitid SYMBOLIC(__NR_waitid) -#define __NR_add_key SYMBOLIC(__NR_add_key) -#define __NR_request_key SYMBOLIC(__NR_request_key) -#define __NR_keyctl SYMBOLIC(__NR_keyctl) -#define __NR_ioprio_set SYMBOLIC(__NR_ioprio_set) -#define __NR_ioprio_get SYMBOLIC(__NR_ioprio_get) -#define __NR_inotify_init SYMBOLIC(__NR_inotify_init) -#define __NR_inotify_add_watch SYMBOLIC(__NR_inotify_add_watch) -#define __NR_inotify_rm_watch SYMBOLIC(__NR_inotify_rm_watch) -#define __NR_openat SYMBOLIC(__NR_openat) -#define __NR_mkdirat SYMBOLIC(__NR_mkdirat) -#define __NR_fchownat SYMBOLIC(__NR_fchownat) -#define __NR_utime SYMBOLIC(__NR_utime) -#define __NR_utimes SYMBOLIC(__NR_utimes) -#define __NR_futimesat SYMBOLIC(__NR_futimesat) -#define __NR_futimes SYMBOLIC(__NR_futimes) -#define __NR_futimens SYMBOLIC(__NR_futimens) -#define __NR_fstatat SYMBOLIC(__NR_fstatat) -#define __NR_unlinkat SYMBOLIC(__NR_unlinkat) -#define __NR_renameat SYMBOLIC(__NR_renameat) -#define __NR_linkat SYMBOLIC(__NR_linkat) -#define __NR_symlinkat SYMBOLIC(__NR_symlinkat) -#define __NR_readlinkat SYMBOLIC(__NR_readlinkat) -#define __NR_fchmodat SYMBOLIC(__NR_fchmodat) -#define __NR_faccessat SYMBOLIC(__NR_faccessat) -#define __NR_unshare SYMBOLIC(__NR_unshare) -#define __NR_splice SYMBOLIC(__NR_splice) -#define __NR_tee SYMBOLIC(__NR_tee) -#define __NR_sync_file_range SYMBOLIC(__NR_sync_file_range) -#define __NR_vmsplice SYMBOLIC(__NR_vmsplice) -#define __NR_migrate_pages SYMBOLIC(__NR_migrate_pages) -#define __NR_move_pages SYMBOLIC(__NR_move_pages) -#define __NR_preadv SYMBOLIC(__NR_preadv) -#define __NR_pwritev SYMBOLIC(__NR_pwritev) -#define __NR_utimensat SYMBOLIC(__NR_utimensat) -#define __NR_fallocate SYMBOLIC(__NR_fallocate) -#define __NR_posix_fallocate SYMBOLIC(__NR_posix_fallocate) -#define __NR_accept4 SYMBOLIC(__NR_accept4) -#define __NR_dup3 SYMBOLIC(__NR_dup3) -#define __NR_pipe2 SYMBOLIC(__NR_pipe2) -#define __NR_epoll_pwait SYMBOLIC(__NR_epoll_pwait) -#define __NR_epoll_create1 SYMBOLIC(__NR_epoll_create1) -#define __NR_perf_event_open SYMBOLIC(__NR_perf_event_open) -#define __NR_inotify_init1 SYMBOLIC(__NR_inotify_init1) -#define __NR_rt_tgsigqueueinfo SYMBOLIC(__NR_rt_tgsigqueueinfo) -#define __NR_signalfd SYMBOLIC(__NR_signalfd) -#define __NR_signalfd4 SYMBOLIC(__NR_signalfd4) -#define __NR_eventfd SYMBOLIC(__NR_eventfd) -#define __NR_eventfd2 SYMBOLIC(__NR_eventfd2) -#define __NR_timerfd_create SYMBOLIC(__NR_timerfd_create) -#define __NR_timerfd_settime SYMBOLIC(__NR_timerfd_settime) -#define __NR_timerfd_gettime SYMBOLIC(__NR_timerfd_gettime) -#define __NR_recvmmsg SYMBOLIC(__NR_recvmmsg) -#define __NR_fanotify_init SYMBOLIC(__NR_fanotify_init) -#define __NR_fanotify_mark SYMBOLIC(__NR_fanotify_mark) -#define __NR_prlimit SYMBOLIC(__NR_prlimit) -#define __NR_name_to_handle_at SYMBOLIC(__NR_name_to_handle_at) -#define __NR_open_by_handle_at SYMBOLIC(__NR_open_by_handle_at) -#define __NR_clock_adjtime SYMBOLIC(__NR_clock_adjtime) -#define __NR_syncfs SYMBOLIC(__NR_syncfs) -#define __NR_sendmmsg SYMBOLIC(__NR_sendmmsg) -#define __NR_setns SYMBOLIC(__NR_setns) -#define __NR_getcpu SYMBOLIC(__NR_getcpu) -#define __NR_process_vm_readv SYMBOLIC(__NR_process_vm_readv) -#define __NR_process_vm_writev SYMBOLIC(__NR_process_vm_writev) -#define __NR_kcmp SYMBOLIC(__NR_kcmp) -#define __NR_finit_module SYMBOLIC(__NR_finit_module) -#define __NR_sched_setattr SYMBOLIC(__NR_sched_setattr) -#define __NR_sched_getattr SYMBOLIC(__NR_sched_getattr) -#define __NR_renameat2 SYMBOLIC(__NR_renameat2) -#define __NR_seccomp SYMBOLIC(__NR_seccomp) -#define __NR_getrandom SYMBOLIC(__NR_getrandom) -#define __NR_memfd_create SYMBOLIC(__NR_memfd_create) -#define __NR_kexec_file_load SYMBOLIC(__NR_kexec_file_load) -#define __NR_bpf SYMBOLIC(__NR_bpf) -#define __NR_execveat SYMBOLIC(__NR_execveat) -#define __NR_userfaultfd SYMBOLIC(__NR_userfaultfd) -#define __NR_membarrier SYMBOLIC(__NR_membarrier) -#define __NR_mlock2 SYMBOLIC(__NR_mlock2) -#define __NR_copy_file_range SYMBOLIC(__NR_copy_file_range) -#define __NR_preadv2 SYMBOLIC(__NR_preadv2) -#define __NR_pwritev2 SYMBOLIC(__NR_pwritev2) -#define __NR_pkey_mprotect SYMBOLIC(__NR_pkey_mprotect) -#define __NR_pkey_alloc SYMBOLIC(__NR_pkey_alloc) -#define __NR_pkey_free SYMBOLIC(__NR_pkey_free) -#define __NR_statx SYMBOLIC(__NR_statx) -#define __NR_io_pgetevents SYMBOLIC(__NR_io_pgetevents) -#define __NR_rseq SYMBOLIC(__NR_rseq) -#define __NR_pidfd_send_signal SYMBOLIC(__NR_pidfd_send_signal) -#define __NR_io_uring_setup SYMBOLIC(__NR_io_uring_setup) -#define __NR_io_uring_enter SYMBOLIC(__NR_io_uring_enter) -#define __NR_io_uring_register SYMBOLIC(__NR_io_uring_register) -#define __NR_pledge SYMBOLIC(__NR_pledge) -#define __NR_msyscall SYMBOLIC(__NR_msyscall) -#define __NR_ktrace SYMBOLIC(__NR_ktrace) -#define __NR_kqueue SYMBOLIC(__NR_kqueue) -#define __NR_kevent SYMBOLIC(__NR_kevent) -#define __NR_revoke SYMBOLIC(__NR_revoke) -#define __NR_setlogin SYMBOLIC(__NR_setlogin) -#define __NR_getfh SYMBOLIC(__NR_getfh) -#define __NR_chflags SYMBOLIC(__NR_chflags) -#define __NR_getfsstat SYMBOLIC(__NR_getfsstat) -#define __NR_nfssvc SYMBOLIC(__NR_nfssvc) -#define __NR_adjtime SYMBOLIC(__NR_adjtime) -#define __NR_fchflags SYMBOLIC(__NR_fchflags) -#define __NR_seteuid SYMBOLIC(__NR_seteuid) -#define __NR_setegid SYMBOLIC(__NR_setegid) -#define __NR_fpathconf SYMBOLIC(__NR_fpathconf) -#define __NR_fhopen SYMBOLIC(__NR_fhopen) -#define __NR_unmount SYMBOLIC(__NR_unmount) -#define __NR_issetugid SYMBOLIC(__NR_issetugid) -#define __NR_minherit SYMBOLIC(__NR_minherit) -#define __NR_pathconf SYMBOLIC(__NR_pathconf) -#define __NR_sysctl SYMBOLIC(__NR_sysctl) -#define __NR_ntp_adjtime SYMBOLIC(__NR_ntp_adjtime) -#define __NR_ntp_gettime SYMBOLIC(__NR_ntp_gettime) -#define __NR_shm_unlink SYMBOLIC(__NR_shm_unlink) -#define __NR_shm_open SYMBOLIC(__NR_shm_open) -#define __NR_aio_read SYMBOLIC(__NR_aio_read) -#define __NR_aio_suspend SYMBOLIC(__NR_aio_suspend) -#define __NR_aio_cancel SYMBOLIC(__NR_aio_cancel) -#define __NR_aio_fsync SYMBOLIC(__NR_aio_fsync) -#define __NR_aio_error SYMBOLIC(__NR_aio_error) -#define __NR_aio_return SYMBOLIC(__NR_aio_return) -#define __NR_aio_write SYMBOLIC(__NR_aio_write) -#define __NR_aio_waitcomplete SYMBOLIC(__NR_aio_waitcomplete) -#define __NR_aio_suspend_nocancel SYMBOLIC(__NR_aio_suspend_nocancel) -#define __NR_aio_mlock SYMBOLIC(__NR_aio_mlock) -#define __NR_sigwait SYMBOLIC(__NR_sigwait) -#define __NR_undelete SYMBOLIC(__NR_undelete) -#define __NR_getlogin SYMBOLIC(__NR_getlogin) -#define __NR_getdtablesize SYMBOLIC(__NR_getdtablesize) -#define __NR_setauid SYMBOLIC(__NR_setauid) -#define __NR_audit SYMBOLIC(__NR_audit) -#define __NR_auditctl SYMBOLIC(__NR_auditctl) -#define __NR_getaudit_addr SYMBOLIC(__NR_getaudit_addr) -#define __NR_getdirentries SYMBOLIC(__NR_getdirentries) -#define __NR_lio_listio SYMBOLIC(__NR_lio_listio) -#define __NR_setaudit_addr SYMBOLIC(__NR_setaudit_addr) -#define __NR_getauid SYMBOLIC(__NR_getauid) -#define __NR_semsys SYMBOLIC(__NR_semsys) -#define __NR_auditon SYMBOLIC(__NR_auditon) -#define __NR_msgsys SYMBOLIC(__NR_msgsys) -#define __NR_shmsys SYMBOLIC(__NR_shmsys) -#define __NR_fhstat SYMBOLIC(__NR_fhstat) -#define __NR_chflagsat SYMBOLIC(__NR_chflagsat) -#define __NR_profil SYMBOLIC(__NR_profil) -#define __NR_fhstatfs SYMBOLIC(__NR_fhstatfs) -#define __NR_utrace SYMBOLIC(__NR_utrace) -#define __NR_closefrom SYMBOLIC(__NR_closefrom) -#define __NR_pthread_markcancel SYMBOLIC(__NR_pthread_markcancel) -#define __NR_pthread_kill SYMBOLIC(__NR_pthread_kill) -#define __NR_pthread_fchdir SYMBOLIC(__NR_pthread_fchdir) -#define __NR_pthread_sigmask SYMBOLIC(__NR_pthread_sigmask) -#define __NR_pthread_chdir SYMBOLIC(__NR_pthread_chdir) -#define __NR_pthread_canceled SYMBOLIC(__NR_pthread_canceled) -#define __NR_disable_threadsignal SYMBOLIC(__NR_disable_threadsignal) -#define __NR_abort_with_payload SYMBOLIC(__NR_abort_with_payload) -#define __NR_accept_nocancel SYMBOLIC(__NR_accept_nocancel) -#define __NR_access_extended SYMBOLIC(__NR_access_extended) -#define __NR_audit_session_join SYMBOLIC(__NR_audit_session_join) -#define __NR_audit_session_port SYMBOLIC(__NR_audit_session_port) -#define __NR_audit_session_self SYMBOLIC(__NR_audit_session_self) -#define __NR_bsdthread_create SYMBOLIC(__NR_bsdthread_create) -#define __NR_bsdthread_ctl SYMBOLIC(__NR_bsdthread_ctl) -#define __NR_bsdthread_register SYMBOLIC(__NR_bsdthread_register) -#define __NR_bsdthread_terminate SYMBOLIC(__NR_bsdthread_terminate) -#define __NR_change_fdguard_np SYMBOLIC(__NR_change_fdguard_np) -#define __NR_chmod_extended SYMBOLIC(__NR_chmod_extended) -#define __NR_clonefileat SYMBOLIC(__NR_clonefileat) -#define __NR_close_nocancel SYMBOLIC(__NR_close_nocancel) -#define __NR_coalition SYMBOLIC(__NR_coalition) -#define __NR_coalition_info SYMBOLIC(__NR_coalition_info) -#define __NR_connect_nocancel SYMBOLIC(__NR_connect_nocancel) -#define __NR_connectx SYMBOLIC(__NR_connectx) -#define __NR_copyfile SYMBOLIC(__NR_copyfile) -#define __NR_csops SYMBOLIC(__NR_csops) -#define __NR_csops_audittoken SYMBOLIC(__NR_csops_audittoken) -#define __NR_csrctl SYMBOLIC(__NR_csrctl) -#define __NR_delete SYMBOLIC(__NR_delete) -#define __NR_disconnectx SYMBOLIC(__NR_disconnectx) -#define __NR_exchangedata SYMBOLIC(__NR_exchangedata) -#define __NR_fchmod_extended SYMBOLIC(__NR_fchmod_extended) -#define __NR_fclonefileat SYMBOLIC(__NR_fclonefileat) -#define __NR_fcntl_nocancel SYMBOLIC(__NR_fcntl_nocancel) -#define __NR_ffsctl SYMBOLIC(__NR_ffsctl) -#define __NR_fgetattrlist SYMBOLIC(__NR_fgetattrlist) -#define __NR_fileport_makefd SYMBOLIC(__NR_fileport_makefd) -#define __NR_fileport_makeport SYMBOLIC(__NR_fileport_makeport) -#define __NR_fmount SYMBOLIC(__NR_fmount) -#define __NR_fs_snapshot SYMBOLIC(__NR_fs_snapshot) -#define __NR_fsctl SYMBOLIC(__NR_fsctl) -#define __NR_fsetattrlist SYMBOLIC(__NR_fsetattrlist) -#define __NR_fstat_extended SYMBOLIC(__NR_fstat_extended) -#define __NR_fsync_nocancel SYMBOLIC(__NR_fsync_nocancel) -#define __NR_getattrlist SYMBOLIC(__NR_getattrlist) -#define __NR_getattrlistat SYMBOLIC(__NR_getattrlistat) -#define __NR_getattrlistbulk SYMBOLIC(__NR_getattrlistbulk) -#define __NR_getdirentriesattr SYMBOLIC(__NR_getdirentriesattr) -#define __NR_gethostuuid SYMBOLIC(__NR_gethostuuid) -#define __NR_getsgroups SYMBOLIC(__NR_getsgroups) -#define __NR_getwgroups SYMBOLIC(__NR_getwgroups) -#define __NR_grab_pgo_data SYMBOLIC(__NR_grab_pgo_data) -#define __NR_guarded_close_np SYMBOLIC(__NR_guarded_close_np) -#define __NR_guarded_kqueue_np SYMBOLIC(__NR_guarded_kqueue_np) -#define __NR_guarded_open_np SYMBOLIC(__NR_guarded_open_np) -#define __NR_guarded_pwrite_np SYMBOLIC(__NR_guarded_pwrite_np) -#define __NR_guarded_write_np SYMBOLIC(__NR_guarded_write_np) -#define __NR_guarded_writev_np SYMBOLIC(__NR_guarded_writev_np) -#define __NR_identitysvc SYMBOLIC(__NR_identitysvc) -#define __NR_initgroups SYMBOLIC(__NR_initgroups) -#define __NR_iopolicysys SYMBOLIC(__NR_iopolicysys) -#define __NR_kas_info SYMBOLIC(__NR_kas_info) -#define __NR_kdebug_trace SYMBOLIC(__NR_kdebug_trace) -#define __NR_kdebug_trace_string SYMBOLIC(__NR_kdebug_trace_string) -#define __NR_kdebug_typefilter SYMBOLIC(__NR_kdebug_typefilter) -#define __NR_kevent_id SYMBOLIC(__NR_kevent_id) -#define __NR_kevent_qos SYMBOLIC(__NR_kevent_qos) -#define __NR_ledger SYMBOLIC(__NR_ledger) -#define __NR_lstat_extended SYMBOLIC(__NR_lstat_extended) -#define __NR_memorystatus_control SYMBOLIC(__NR_memorystatus_control) -#define __NR_memorystatus_get_level SYMBOLIC(__NR_memorystatus_get_level) -#define __NR_microstackshot SYMBOLIC(__NR_microstackshot) -#define __NR_mkdir_extended SYMBOLIC(__NR_mkdir_extended) -#define __NR_mkfifo_extended SYMBOLIC(__NR_mkfifo_extended) -#define __NR_modwatch SYMBOLIC(__NR_modwatch) -#define __NR_mremap_encrypted SYMBOLIC(__NR_mremap_encrypted) -#define __NR_msgrcv_nocancel SYMBOLIC(__NR_msgrcv_nocancel) -#define __NR_msgsnd_nocancel SYMBOLIC(__NR_msgsnd_nocancel) -#define __NR_msync_nocancel SYMBOLIC(__NR_msync_nocancel) -#define __NR_necp_client_action SYMBOLIC(__NR_necp_client_action) -#define __NR_necp_match_policy SYMBOLIC(__NR_necp_match_policy) -#define __NR_necp_open SYMBOLIC(__NR_necp_open) -#define __NR_necp_session_action SYMBOLIC(__NR_necp_session_action) -#define __NR_necp_session_open SYMBOLIC(__NR_necp_session_open) -#define __NR_net_qos_guideline SYMBOLIC(__NR_net_qos_guideline) -#define __NR_netagent_trigger SYMBOLIC(__NR_netagent_trigger) -#define __NR_nfsclnt SYMBOLIC(__NR_nfsclnt) -#define __NR_open_dprotected_np SYMBOLIC(__NR_open_dprotected_np) -#define __NR_open_extended SYMBOLIC(__NR_open_extended) -#define __NR_open_nocancel SYMBOLIC(__NR_open_nocancel) -#define __NR_openat_nocancel SYMBOLIC(__NR_openat_nocancel) -#define __NR_openbyid_np SYMBOLIC(__NR_openbyid_np) -#define __NR_os_fault_with_payload SYMBOLIC(__NR_os_fault_with_payload) -#define __NR_peeloff SYMBOLIC(__NR_peeloff) -#define __NR_persona SYMBOLIC(__NR_persona) -#define __NR_pid_hibernate SYMBOLIC(__NR_pid_hibernate) -#define __NR_pid_resume SYMBOLIC(__NR_pid_resume) -#define __NR_pid_shutdown_sockets SYMBOLIC(__NR_pid_shutdown_sockets) -#define __NR_pid_suspend SYMBOLIC(__NR_pid_suspend) -#define __NR_poll_nocancel SYMBOLIC(__NR_poll_nocancel) -#define __NR_pread_nocancel SYMBOLIC(__NR_pread_nocancel) -#define __NR_proc_info SYMBOLIC(__NR_proc_info) -#define __NR_proc_rlimit_control SYMBOLIC(__NR_proc_rlimit_control) -#define __NR_proc_trace_log SYMBOLIC(__NR_proc_trace_log) -#define __NR_proc_uuid_policy SYMBOLIC(__NR_proc_uuid_policy) -#define __NR_process_policy SYMBOLIC(__NR_process_policy) -#define __NR_pselect_nocancel SYMBOLIC(__NR_pselect_nocancel) -#define __NR_psynch_cvbroad SYMBOLIC(__NR_psynch_cvbroad) -#define __NR_psynch_cvclrprepost SYMBOLIC(__NR_psynch_cvclrprepost) -#define __NR_psynch_cvsignal SYMBOLIC(__NR_psynch_cvsignal) -#define __NR_psynch_mutexdrop SYMBOLIC(__NR_psynch_mutexdrop) -#define __NR_psynch_mutexwait SYMBOLIC(__NR_psynch_mutexwait) -#define __NR_psynch_rw_downgrade SYMBOLIC(__NR_psynch_rw_downgrade) -#define __NR_psynch_rw_longrdlock SYMBOLIC(__NR_psynch_rw_longrdlock) -#define __NR_psynch_rw_rdlock SYMBOLIC(__NR_psynch_rw_rdlock) -#define __NR_psynch_rw_unlock SYMBOLIC(__NR_psynch_rw_unlock) -#define __NR_psynch_rw_unlock2 SYMBOLIC(__NR_psynch_rw_unlock2) -#define __NR_psynch_rw_upgrade SYMBOLIC(__NR_psynch_rw_upgrade) -#define __NR_psynch_rw_wrlock SYMBOLIC(__NR_psynch_rw_wrlock) -#define __NR_psynch_rw_yieldwrlock SYMBOLIC(__NR_psynch_rw_yieldwrlock) -#define __NR_pwrite_nocancel SYMBOLIC(__NR_pwrite_nocancel) -#define __NR_read_nocancel SYMBOLIC(__NR_read_nocancel) -#define __NR_readv_nocancel SYMBOLIC(__NR_readv_nocancel) -#define __NR_recvfrom_nocancel SYMBOLIC(__NR_recvfrom_nocancel) -#define __NR_recvmsg_nocancel SYMBOLIC(__NR_recvmsg_nocancel) -#define __NR_recvmsg_x SYMBOLIC(__NR_recvmsg_x) -#define __NR_renameatx_np SYMBOLIC(__NR_renameatx_np) -#define __NR_searchfs SYMBOLIC(__NR_searchfs) -#define __NR_select_nocancel SYMBOLIC(__NR_select_nocancel) -#define __NR_sem_close SYMBOLIC(__NR_sem_close) -#define __NR_sem_open SYMBOLIC(__NR_sem_open) -#define __NR_sem_post SYMBOLIC(__NR_sem_post) -#define __NR_sem_trywait SYMBOLIC(__NR_sem_trywait) -#define __NR_sem_unlink SYMBOLIC(__NR_sem_unlink) -#define __NR_sem_wait SYMBOLIC(__NR_sem_wait) -#define __NR_sem_wait_nocancel SYMBOLIC(__NR_sem_wait_nocancel) -#define __NR_sendmsg_nocancel SYMBOLIC(__NR_sendmsg_nocancel) -#define __NR_sendmsg_x SYMBOLIC(__NR_sendmsg_x) -#define __NR_sendto_nocancel SYMBOLIC(__NR_sendto_nocancel) -#define __NR_setattrlist SYMBOLIC(__NR_setattrlist) -#define __NR_setattrlistat SYMBOLIC(__NR_setattrlistat) -#define __NR_setprivexec SYMBOLIC(__NR_setprivexec) -#define __NR_setsgroups SYMBOLIC(__NR_setsgroups) -#define __NR_settid SYMBOLIC(__NR_settid) -#define __NR_settid_with_pid SYMBOLIC(__NR_settid_with_pid) -#define __NR_setwgroups SYMBOLIC(__NR_setwgroups) -#define __NR_sfi_ctl SYMBOLIC(__NR_sfi_ctl) -#define __NR_sfi_pidctl SYMBOLIC(__NR_sfi_pidctl) -#define __NR_shared_region_check_np SYMBOLIC(__NR_shared_region_check_np) -#define __NR_sigsuspend_nocancel SYMBOLIC(__NR_sigsuspend_nocancel) -#define __NR_socket_delegate SYMBOLIC(__NR_socket_delegate) -#define __NR_stat_extended SYMBOLIC(__NR_stat_extended) -#define __NR_sysctlbyname SYMBOLIC(__NR_sysctlbyname) -#define __NR_system_override SYMBOLIC(__NR_system_override) -#define __NR_telemetry SYMBOLIC(__NR_telemetry) -#define __NR_terminate_with_payload SYMBOLIC(__NR_terminate_with_payload) -#define __NR_thread_selfcounts SYMBOLIC(__NR_thread_selfcounts) -#define __NR_thread_selfid SYMBOLIC(__NR_thread_selfid) -#define __NR_thread_selfusage SYMBOLIC(__NR_thread_selfusage) -#define __NR_ulock_wait SYMBOLIC(__NR_ulock_wait) -#define __NR_ulock_wake SYMBOLIC(__NR_ulock_wake) -#define __NR_umask_extended SYMBOLIC(__NR_umask_extended) -#define __NR_usrctl SYMBOLIC(__NR_usrctl) -#define __NR_vfs_purge SYMBOLIC(__NR_vfs_purge) -#define __NR_vm_pressure_monitor SYMBOLIC(__NR_vm_pressure_monitor) -#define __NR_wait4_nocancel SYMBOLIC(__NR_wait4_nocancel) -#define __NR_waitevent SYMBOLIC(__NR_waitevent) -#define __NR_waitid_nocancel SYMBOLIC(__NR_waitid_nocancel) -#define __NR_watchevent SYMBOLIC(__NR_watchevent) -#define __NR_work_interval_ctl SYMBOLIC(__NR_work_interval_ctl) -#define __NR_workq_kernreturn SYMBOLIC(__NR_workq_kernreturn) -#define __NR_workq_open SYMBOLIC(__NR_workq_open) -#define __NR_write_nocancel SYMBOLIC(__NR_write_nocancel) -#define __NR_writev_nocancel SYMBOLIC(__NR_writev_nocancel) -#define __NR_abort2 SYMBOLIC(__NR_abort2) -#define __NR_afs3_syscall SYMBOLIC(__NR_afs3_syscall) -#define __NR_bindat SYMBOLIC(__NR_bindat) -#define __NR_break SYMBOLIC(__NR_break) -#define __NR_cap_enter SYMBOLIC(__NR_cap_enter) -#define __NR_cap_fcntls_get SYMBOLIC(__NR_cap_fcntls_get) -#define __NR_cap_fcntls_limit SYMBOLIC(__NR_cap_fcntls_limit) -#define __NR_cap_getmode SYMBOLIC(__NR_cap_getmode) -#define __NR_cap_ioctls_get SYMBOLIC(__NR_cap_ioctls_get) -#define __NR_cap_ioctls_limit SYMBOLIC(__NR_cap_ioctls_limit) -#define __NR_cap_rights_limit SYMBOLIC(__NR_cap_rights_limit) -#define __NR_clock_getcpuclockid2 SYMBOLIC(__NR_clock_getcpuclockid2) -#define __NR_connectat SYMBOLIC(__NR_connectat) -#define __NR_cpuset SYMBOLIC(__NR_cpuset) -#define __NR_cpuset_getdomain SYMBOLIC(__NR_cpuset_getdomain) -#define __NR_cpuset_getid SYMBOLIC(__NR_cpuset_getid) -#define __NR_cpuset_setdomain SYMBOLIC(__NR_cpuset_setdomain) -#define __NR_cpuset_setid SYMBOLIC(__NR_cpuset_setid) -#define __NR_eaccess SYMBOLIC(__NR_eaccess) -#define __NR_extattr_delete_fd SYMBOLIC(__NR_extattr_delete_fd) -#define __NR_extattr_delete_file SYMBOLIC(__NR_extattr_delete_file) -#define __NR_extattr_delete_link SYMBOLIC(__NR_extattr_delete_link) -#define __NR_extattr_get_fd SYMBOLIC(__NR_extattr_get_fd) -#define __NR_extattr_get_file SYMBOLIC(__NR_extattr_get_file) -#define __NR_extattr_get_link SYMBOLIC(__NR_extattr_get_link) -#define __NR_extattr_list_fd SYMBOLIC(__NR_extattr_list_fd) -#define __NR_extattr_list_file SYMBOLIC(__NR_extattr_list_file) -#define __NR_extattr_list_link SYMBOLIC(__NR_extattr_list_link) -#define __NR_extattr_set_fd SYMBOLIC(__NR_extattr_set_fd) -#define __NR_extattr_set_file SYMBOLIC(__NR_extattr_set_file) -#define __NR_extattr_set_link SYMBOLIC(__NR_extattr_set_link) -#define __NR_extattrctl SYMBOLIC(__NR_extattrctl) -#define __NR_fexecve SYMBOLIC(__NR_fexecve) -#define __NR_ffclock_getcounter SYMBOLIC(__NR_ffclock_getcounter) -#define __NR_ffclock_getestimate SYMBOLIC(__NR_ffclock_getestimate) -#define __NR_ffclock_setestimate SYMBOLIC(__NR_ffclock_setestimate) -#define __NR_fhlink SYMBOLIC(__NR_fhlink) -#define __NR_fhlinkat SYMBOLIC(__NR_fhlinkat) -#define __NR_fhreadlink SYMBOLIC(__NR_fhreadlink) -#define __NR_getaudit SYMBOLIC(__NR_getaudit) -#define __NR_getcontext SYMBOLIC(__NR_getcontext) -#define __NR_getfhat SYMBOLIC(__NR_getfhat) -#define __NR_gethostid SYMBOLIC(__NR_gethostid) -#define __NR_getkerninfo SYMBOLIC(__NR_getkerninfo) -#define __NR_getloginclass SYMBOLIC(__NR_getloginclass) -#define __NR_getpagesize SYMBOLIC(__NR_getpagesize) -#define __NR_gssd_syscall SYMBOLIC(__NR_gssd_syscall) -#define __NR_jail SYMBOLIC(__NR_jail) -#define __NR_jail_attach SYMBOLIC(__NR_jail_attach) -#define __NR_jail_get SYMBOLIC(__NR_jail_get) -#define __NR_jail_remove SYMBOLIC(__NR_jail_remove) -#define __NR_jail_set SYMBOLIC(__NR_jail_set) -#define __NR_kenv SYMBOLIC(__NR_kenv) -#define __NR_kldfind SYMBOLIC(__NR_kldfind) -#define __NR_kldfirstmod SYMBOLIC(__NR_kldfirstmod) -#define __NR_kldload SYMBOLIC(__NR_kldload) -#define __NR_kldnext SYMBOLIC(__NR_kldnext) -#define __NR_kldstat SYMBOLIC(__NR_kldstat) -#define __NR_kldsym SYMBOLIC(__NR_kldsym) -#define __NR_kldunload SYMBOLIC(__NR_kldunload) -#define __NR_kldunloadf SYMBOLIC(__NR_kldunloadf) -#define __NR_kmq_notify SYMBOLIC(__NR_kmq_notify) -#define __NR_kmq_setattr SYMBOLIC(__NR_kmq_setattr) -#define __NR_kmq_timedreceive SYMBOLIC(__NR_kmq_timedreceive) -#define __NR_kmq_timedsend SYMBOLIC(__NR_kmq_timedsend) -#define __NR_kmq_unlink SYMBOLIC(__NR_kmq_unlink) -#define __NR_ksem_close SYMBOLIC(__NR_ksem_close) -#define __NR_ksem_destroy SYMBOLIC(__NR_ksem_destroy) -#define __NR_ksem_getvalue SYMBOLIC(__NR_ksem_getvalue) -#define __NR_ksem_init SYMBOLIC(__NR_ksem_init) -#define __NR_ksem_open SYMBOLIC(__NR_ksem_open) -#define __NR_ksem_post SYMBOLIC(__NR_ksem_post) -#define __NR_ksem_timedwait SYMBOLIC(__NR_ksem_timedwait) -#define __NR_ksem_trywait SYMBOLIC(__NR_ksem_trywait) -#define __NR_ksem_unlink SYMBOLIC(__NR_ksem_unlink) -#define __NR_ksem_wait SYMBOLIC(__NR_ksem_wait) -#define __NR_ktimer_create SYMBOLIC(__NR_ktimer_create) -#define __NR_ktimer_delete SYMBOLIC(__NR_ktimer_delete) -#define __NR_ktimer_getoverrun SYMBOLIC(__NR_ktimer_getoverrun) -#define __NR_ktimer_gettime SYMBOLIC(__NR_ktimer_gettime) -#define __NR_ktimer_settime SYMBOLIC(__NR_ktimer_settime) -#define __NR_lchflags SYMBOLIC(__NR_lchflags) -#define __NR_lchmod SYMBOLIC(__NR_lchmod) -#define __NR_lgetfh SYMBOLIC(__NR_lgetfh) -#define __NR_lpathconf SYMBOLIC(__NR_lpathconf) -#define __NR_lutimes SYMBOLIC(__NR_lutimes) -#define __NR_mac_syscall SYMBOLIC(__NR_mac_syscall) -#define __NR_modfind SYMBOLIC(__NR_modfind) -#define __NR_modfnext SYMBOLIC(__NR_modfnext) -#define __NR_modnext SYMBOLIC(__NR_modnext) -#define __NR_modstat SYMBOLIC(__NR_modstat) -#define __NR_nfstat SYMBOLIC(__NR_nfstat) -#define __NR_nlm_syscall SYMBOLIC(__NR_nlm_syscall) -#define __NR_nlstat SYMBOLIC(__NR_nlstat) -#define __NR_nmount SYMBOLIC(__NR_nmount) -#define __NR_nnpfs_syscall SYMBOLIC(__NR_nnpfs_syscall) -#define __NR_nstat SYMBOLIC(__NR_nstat) -#define __NR_pdfork SYMBOLIC(__NR_pdfork) -#define __NR_pdgetpid SYMBOLIC(__NR_pdgetpid) -#define __NR_pdkill SYMBOLIC(__NR_pdkill) -#define __NR_posix_openpt SYMBOLIC(__NR_posix_openpt) -#define __NR_procctl SYMBOLIC(__NR_procctl) -#define __NR_psynch_cvwait SYMBOLIC(__NR_psynch_cvwait) -#define __NR_quota SYMBOLIC(__NR_quota) -#define __NR_rctl_add_rule SYMBOLIC(__NR_rctl_add_rule) -#define __NR_rctl_get_limits SYMBOLIC(__NR_rctl_get_limits) -#define __NR_rctl_get_racct SYMBOLIC(__NR_rctl_get_racct) -#define __NR_rctl_get_rules SYMBOLIC(__NR_rctl_get_rules) -#define __NR_rctl_remove_rule SYMBOLIC(__NR_rctl_remove_rule) -#define __NR_recv SYMBOLIC(__NR_recv) -#define __NR_rfork SYMBOLIC(__NR_rfork) -#define __NR_rtprio SYMBOLIC(__NR_rtprio) -#define __NR_rtprio_thread SYMBOLIC(__NR_rtprio_thread) -#define __NR_send SYMBOLIC(__NR_send) -#define __NR_setaudit SYMBOLIC(__NR_setaudit) -#define __NR_setcontext SYMBOLIC(__NR_setcontext) -#define __NR_setfib SYMBOLIC(__NR_setfib) -#define __NR_sethostid SYMBOLIC(__NR_sethostid) -#define __NR_setloginclass SYMBOLIC(__NR_setloginclass) -#define __NR_sigblock SYMBOLIC(__NR_sigblock) -#define __NR_sigqueue SYMBOLIC(__NR_sigqueue) -#define __NR_sigsetmask SYMBOLIC(__NR_sigsetmask) -#define __NR_sigstack SYMBOLIC(__NR_sigstack) -#define __NR_sigvec SYMBOLIC(__NR_sigvec) -#define __NR_sigwaitinfo SYMBOLIC(__NR_sigwaitinfo) -#define __NR_sstk SYMBOLIC(__NR_sstk) -#define __NR_swapcontext SYMBOLIC(__NR_swapcontext) -#define __NR_thr_create SYMBOLIC(__NR_thr_create) -#define __NR_thr_exit SYMBOLIC(__NR_thr_exit) -#define __NR_thr_kill SYMBOLIC(__NR_thr_kill) -#define __NR_thr_kill2 SYMBOLIC(__NR_thr_kill2) -#define __NR_thr_new SYMBOLIC(__NR_thr_new) -#define __NR_thr_self SYMBOLIC(__NR_thr_self) -#define __NR_thr_set_name SYMBOLIC(__NR_thr_set_name) -#define __NR_thr_suspend SYMBOLIC(__NR_thr_suspend) -#define __NR_thr_wake SYMBOLIC(__NR_thr_wake) -#define __NR_uuidgen SYMBOLIC(__NR_uuidgen) -#define __NR_vadvise SYMBOLIC(__NR_vadvise) -#define __NR_wait SYMBOLIC(__NR_wait) -#define __NR_wait6 SYMBOLIC(__NR_wait6) -#define __NR_yield SYMBOLIC(__NR_yield) -#define __NR_tfork SYMBOLIC(__NR_tfork) -#define __NR_thrsleep SYMBOLIC(__NR_thrsleep) -#define __NR_thrwakeup SYMBOLIC(__NR_thrwakeup) -#define __NR_threxit SYMBOLIC(__NR_threxit) -#define __NR_thrsigdivert SYMBOLIC(__NR_thrsigdivert) -#define __NR_set_tcb SYMBOLIC(__NR_set_tcb) -#define __NR_get_tcb SYMBOLIC(__NR_get_tcb) -#define __NR_adjfreq SYMBOLIC(__NR_adjfreq) -#define __NR_getdtablecount SYMBOLIC(__NR_getdtablecount) -#define __NR_getlogin_r SYMBOLIC(__NR_getlogin_r) -#define __NR_getrtable SYMBOLIC(__NR_getrtable) -#define __NR_getthrid SYMBOLIC(__NR_getthrid) -#define __NR_kbind SYMBOLIC(__NR_kbind) -#define __NR_mquery SYMBOLIC(__NR_mquery) -#define __NR_obreak SYMBOLIC(__NR_obreak) -#define __NR_sendsyslog SYMBOLIC(__NR_sendsyslog) -#define __NR_setrtable SYMBOLIC(__NR_setrtable) -#define __NR_swapctl SYMBOLIC(__NR_swapctl) -#define __NR_thrkill SYMBOLIC(__NR_thrkill) -#define __NR_unveil SYMBOLIC(__NR_unveil) -#define __NR_mac_get_link SYMBOLIC(__NR_mac_get_link) -#define __NR_mac_set_link SYMBOLIC(__NR_mac_set_link) -#define __NR_mac_get_fd SYMBOLIC(__NR_mac_get_fd) -#define __NR_mac_get_file SYMBOLIC(__NR_mac_get_file) -#define __NR_mac_get_proc SYMBOLIC(__NR_mac_get_proc) -#define __NR_mac_set_fd SYMBOLIC(__NR_mac_set_fd) -#define __NR_mac_get_pid SYMBOLIC(__NR_mac_get_pid) -#define __NR_mac_set_proc SYMBOLIC(__NR_mac_set_proc) -#define __NR_mac_set_file SYMBOLIC(__NR_mac_set_file) -#define __NR_mac_execve SYMBOLIC(__NR_mac_execve) -#define __NR_acl_get_link SYMBOLIC(__NR_acl_get_link) -#define __NR_sigwait_nocancel SYMBOLIC(__NR_sigwait_nocancel) -#define __NR_cap_rights_get SYMBOLIC(__NR_cap_rights_get) -#define __NR_semwait_signal SYMBOLIC(__NR_semwait_signal) -#define __NR_acl_set_link SYMBOLIC(__NR_acl_set_link) -#define __NR_acl_set_fd SYMBOLIC(__NR_acl_set_fd) -#define __NR_old_semwait_signal SYMBOLIC(__NR_old_semwait_signal) -#define __NR_setugid SYMBOLIC(__NR_setugid) -#define __NR_acl_aclcheck_fd SYMBOLIC(__NR_acl_aclcheck_fd) -#define __NR_acl_get_fd SYMBOLIC(__NR_acl_get_fd) -#define __NR___sysctl SYMBOLIC(__NR___sysctl) -#define __NR_mac_getfsstat SYMBOLIC(__NR_mac_getfsstat) -#define __NR_mac_get_mount SYMBOLIC(__NR_mac_get_mount) -#define __NR_acl_delete_link SYMBOLIC(__NR_acl_delete_link) -#define __NR_mac_mount SYMBOLIC(__NR_mac_mount) -#define __NR_acl_get_file SYMBOLIC(__NR_acl_get_file) -#define __NR_acl_aclcheck_file SYMBOLIC(__NR_acl_aclcheck_file) -#define __NR_acl_delete_fd SYMBOLIC(__NR_acl_delete_fd) -#define __NR_acl_aclcheck_link SYMBOLIC(__NR_acl_aclcheck_link) -#define __NR___mac_syscall SYMBOLIC(__NR___mac_syscall) -#define __NR_acl_set_file SYMBOLIC(__NR_acl_set_file) -#define __NR_acl_delete_file SYMBOLIC(__NR_acl_delete_file) -#define __NR_syscall SYMBOLIC(__NR_syscall) -#define __NR__umtx_op SYMBOLIC(__NR__umtx_op) -#define __NR_semwait_signal_nocancel SYMBOLIC(__NR_semwait_signal_nocancel) -#define __NR_old_semwait_signal_nocancel \ - SYMBOLIC(__NR_old_semwait_signal_nocancel) -#define __NR_sctp_peeloff SYMBOLIC(__NR_sctp_peeloff) -#define __NR_sctp_generic_recvmsg SYMBOLIC(__NR_sctp_generic_recvmsg) -#define __NR_sctp_generic_sendmsg SYMBOLIC(__NR_sctp_generic_sendmsg) -#define __NR_sctp_generic_sendmsg_iov SYMBOLIC(__NR_sctp_generic_sendmsg_iov) -#define __NR_shared_region_map_and_slide_np \ - SYMBOLIC(__NR_shared_region_map_and_slide_np) -#define __NR_guarded_open_dprotected_np \ - SYMBOLIC(__NR_guarded_open_dprotected_np) -#define __NR_stack_snapshot_with_config \ - SYMBOLIC(__NR_stack_snapshot_with_config) - #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ @@ -1545,4 +773,776 @@ extern const long __NR_stack_snapshot_with_config; COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ + +#define __NR_exit SYMBOLIC(__NR_exit) +#define __NR_exit_group SYMBOLIC(__NR_exit_group) +#define __NR_read SYMBOLIC(__NR_read) +#define __NR_write SYMBOLIC(__NR_write) +#define __NR_open SYMBOLIC(__NR_open) +#define __NR_close SYMBOLIC(__NR_close) +#define __NR_stat SYMBOLIC(__NR_stat) +#define __NR_fstat SYMBOLIC(__NR_fstat) +#define __NR_lstat SYMBOLIC(__NR_lstat) +#define __NR_poll SYMBOLIC(__NR_poll) +#define __NR_ppoll SYMBOLIC(__NR_ppoll) +#define __NR_lseek SYMBOLIC(__NR_lseek) +#define __NR_mmap SYMBOLIC(__NR_mmap) +#define __NR_msync SYMBOLIC(__NR_msync) +#define __NR_mprotect SYMBOLIC(__NR_mprotect) +#define __NR_munmap SYMBOLIC(__NR_munmap) +#define __NR_sigaction SYMBOLIC(__NR_sigaction) +#define __NR_sigprocmask SYMBOLIC(__NR_sigprocmask) +#define __NR_ioctl SYMBOLIC(__NR_ioctl) +#define __NR_pread SYMBOLIC(__NR_pread) +#define __NR_pwrite SYMBOLIC(__NR_pwrite) +#define __NR_readv SYMBOLIC(__NR_readv) +#define __NR_writev SYMBOLIC(__NR_writev) +#define __NR_access SYMBOLIC(__NR_access) +#define __NR_pipe SYMBOLIC(__NR_pipe) +#define __NR_select SYMBOLIC(__NR_select) +#define __NR_pselect SYMBOLIC(__NR_pselect) +#define __NR_pselect6 SYMBOLIC(__NR_pselect6) +#define __NR_sched_yield SYMBOLIC(__NR_sched_yield) +#define __NR_mremap SYMBOLIC(__NR_mremap) +#define __NR_mincore SYMBOLIC(__NR_mincore) +#define __NR_madvise SYMBOLIC(__NR_madvise) +#define __NR_shmget SYMBOLIC(__NR_shmget) +#define __NR_shmat SYMBOLIC(__NR_shmat) +#define __NR_shmctl SYMBOLIC(__NR_shmctl) +#define __NR_dup SYMBOLIC(__NR_dup) +#define __NR_dup2 SYMBOLIC(__NR_dup2) +#define __NR_pause SYMBOLIC(__NR_pause) +#define __NR_nanosleep SYMBOLIC(__NR_nanosleep) +#define __NR_getitimer SYMBOLIC(__NR_getitimer) +#define __NR_setitimer SYMBOLIC(__NR_setitimer) +#define __NR_alarm SYMBOLIC(__NR_alarm) +#define __NR_getpid SYMBOLIC(__NR_getpid) +#define __NR_sendfile SYMBOLIC(__NR_sendfile) +#define __NR_socket SYMBOLIC(__NR_socket) +#define __NR_connect SYMBOLIC(__NR_connect) +#define __NR_accept SYMBOLIC(__NR_accept) +#define __NR_sendto SYMBOLIC(__NR_sendto) +#define __NR_recvfrom SYMBOLIC(__NR_recvfrom) +#define __NR_sendmsg SYMBOLIC(__NR_sendmsg) +#define __NR_recvmsg SYMBOLIC(__NR_recvmsg) +#define __NR_shutdown SYMBOLIC(__NR_shutdown) +#define __NR_bind SYMBOLIC(__NR_bind) +#define __NR_listen SYMBOLIC(__NR_listen) +#define __NR_getsockname SYMBOLIC(__NR_getsockname) +#define __NR_getpeername SYMBOLIC(__NR_getpeername) +#define __NR_socketpair SYMBOLIC(__NR_socketpair) +#define __NR_setsockopt SYMBOLIC(__NR_setsockopt) +#define __NR_getsockopt SYMBOLIC(__NR_getsockopt) +#define __NR_fork SYMBOLIC(__NR_fork) +#define __NR_vfork SYMBOLIC(__NR_vfork) +#define __NR_posix_spawn SYMBOLIC(__NR_posix_spawn) +#define __NR_execve LITERALLY(0x003b) +#define __NR_wait4 SYMBOLIC(__NR_wait4) +#define __NR_kill SYMBOLIC(__NR_kill) +#define __NR_killpg SYMBOLIC(__NR_killpg) +#define __NR_clone SYMBOLIC(__NR_clone) +#define __NR_tkill SYMBOLIC(__NR_tkill) +#define __NR_futex SYMBOLIC(__NR_futex) +#define __NR_set_robust_list SYMBOLIC(__NR_set_robust_list) +#define __NR_get_robust_list SYMBOLIC(__NR_get_robust_list) +#define __NR_uname SYMBOLIC(__NR_uname) +#define __NR_semget SYMBOLIC(__NR_semget) +#define __NR_semop SYMBOLIC(__NR_semop) +#define __NR_semctl SYMBOLIC(__NR_semctl) +#define __NR_shmdt SYMBOLIC(__NR_shmdt) +#define __NR_msgget SYMBOLIC(__NR_msgget) +#define __NR_msgsnd SYMBOLIC(__NR_msgsnd) +#define __NR_msgrcv SYMBOLIC(__NR_msgrcv) +#define __NR_msgctl SYMBOLIC(__NR_msgctl) +#define __NR_fcntl SYMBOLIC(__NR_fcntl) +#define __NR_flock SYMBOLIC(__NR_flock) +#define __NR_fsync SYMBOLIC(__NR_fsync) +#define __NR_fdatasync SYMBOLIC(__NR_fdatasync) +#define __NR_truncate SYMBOLIC(__NR_truncate) +#define __NR_ftruncate SYMBOLIC(__NR_ftruncate) +#define __NR_getcwd SYMBOLIC(__NR_getcwd) +#define __NR_chdir SYMBOLIC(__NR_chdir) +#define __NR_fchdir SYMBOLIC(__NR_fchdir) +#define __NR_rename SYMBOLIC(__NR_rename) +#define __NR_mkdir SYMBOLIC(__NR_mkdir) +#define __NR_rmdir SYMBOLIC(__NR_rmdir) +#define __NR_creat SYMBOLIC(__NR_creat) +#define __NR_link SYMBOLIC(__NR_link) +#define __NR_unlink SYMBOLIC(__NR_unlink) +#define __NR_symlink SYMBOLIC(__NR_symlink) +#define __NR_readlink SYMBOLIC(__NR_readlink) +#define __NR_chmod SYMBOLIC(__NR_chmod) +#define __NR_fchmod SYMBOLIC(__NR_fchmod) +#define __NR_chown SYMBOLIC(__NR_chown) +#define __NR_fchown SYMBOLIC(__NR_fchown) +#define __NR_lchown SYMBOLIC(__NR_lchown) +#define __NR_umask SYMBOLIC(__NR_umask) +#define __NR_gettimeofday SYMBOLIC(__NR_gettimeofday) +#define __NR_getrlimit SYMBOLIC(__NR_getrlimit) +#define __NR_getrusage SYMBOLIC(__NR_getrusage) +#define __NR_sysinfo SYMBOLIC(__NR_sysinfo) +#define __NR_times SYMBOLIC(__NR_times) +#define __NR_ptrace SYMBOLIC(__NR_ptrace) +#define __NR_syslog SYMBOLIC(__NR_syslog) +#define __NR_getuid SYMBOLIC(__NR_getuid) +#define __NR_getgid SYMBOLIC(__NR_getgid) +#define __NR_getppid SYMBOLIC(__NR_getppid) +#define __NR_getpgrp SYMBOLIC(__NR_getpgrp) +#define __NR_setsid SYMBOLIC(__NR_setsid) +#define __NR_getsid SYMBOLIC(__NR_getsid) +#define __NR_getpgid SYMBOLIC(__NR_getpgid) +#define __NR_setpgid SYMBOLIC(__NR_setpgid) +#define __NR_geteuid SYMBOLIC(__NR_geteuid) +#define __NR_getegid SYMBOLIC(__NR_getegid) +#define __NR_getgroups SYMBOLIC(__NR_getgroups) +#define __NR_setgroups SYMBOLIC(__NR_setgroups) +#define __NR_setreuid SYMBOLIC(__NR_setreuid) +#define __NR_setregid SYMBOLIC(__NR_setregid) +#define __NR_setuid SYMBOLIC(__NR_setuid) +#define __NR_setgid SYMBOLIC(__NR_setgid) +#define __NR_setresuid SYMBOLIC(__NR_setresuid) +#define __NR_setresgid SYMBOLIC(__NR_setresgid) +#define __NR_getresuid SYMBOLIC(__NR_getresuid) +#define __NR_getresgid SYMBOLIC(__NR_getresgid) +#define __NR_sigpending SYMBOLIC(__NR_sigpending) +#define __NR_sigsuspend SYMBOLIC(__NR_sigsuspend) +#define __NR_sigaltstack SYMBOLIC(__NR_sigaltstack) +#define __NR_mknod SYMBOLIC(__NR_mknod) +#define __NR_mknodat SYMBOLIC(__NR_mknodat) +#define __NR_mkfifo SYMBOLIC(__NR_mkfifo) +#define __NR_mkfifoat SYMBOLIC(__NR_mkfifoat) +#define __NR_statfs SYMBOLIC(__NR_statfs) +#define __NR_fstatfs SYMBOLIC(__NR_fstatfs) +#define __NR_getpriority SYMBOLIC(__NR_getpriority) +#define __NR_setpriority SYMBOLIC(__NR_setpriority) +#define __NR_mlock SYMBOLIC(__NR_mlock) +#define __NR_munlock SYMBOLIC(__NR_munlock) +#define __NR_mlockall SYMBOLIC(__NR_mlockall) +#define __NR_munlockall SYMBOLIC(__NR_munlockall) +#define __NR_setrlimit SYMBOLIC(__NR_setrlimit) +#define __NR_chroot SYMBOLIC(__NR_chroot) +#define __NR_sync SYMBOLIC(__NR_sync) +#define __NR_acct SYMBOLIC(__NR_acct) +#define __NR_settimeofday SYMBOLIC(__NR_settimeofday) +#define __NR_mount SYMBOLIC(__NR_mount) +#define __NR_reboot SYMBOLIC(__NR_reboot) +#define __NR_quotactl SYMBOLIC(__NR_quotactl) +#define __NR_setfsuid SYMBOLIC(__NR_setfsuid) +#define __NR_setfsgid SYMBOLIC(__NR_setfsgid) +#define __NR_capget SYMBOLIC(__NR_capget) +#define __NR_capset SYMBOLIC(__NR_capset) +#define __NR_sigtimedwait SYMBOLIC(__NR_sigtimedwait) +#define __NR_rt_sigqueueinfo SYMBOLIC(__NR_rt_sigqueueinfo) +#define __NR_personality SYMBOLIC(__NR_personality) +#define __NR_ustat SYMBOLIC(__NR_ustat) +#define __NR_sysfs SYMBOLIC(__NR_sysfs) +#define __NR_sched_setparam SYMBOLIC(__NR_sched_setparam) +#define __NR_sched_getparam SYMBOLIC(__NR_sched_getparam) +#define __NR_sched_setscheduler SYMBOLIC(__NR_sched_setscheduler) +#define __NR_sched_getscheduler SYMBOLIC(__NR_sched_getscheduler) +#define __NR_sched_get_priority_max SYMBOLIC(__NR_sched_get_priority_max) +#define __NR_sched_get_priority_min SYMBOLIC(__NR_sched_get_priority_min) +#define __NR_sched_rr_get_interval SYMBOLIC(__NR_sched_rr_get_interval) +#define __NR_vhangup SYMBOLIC(__NR_vhangup) +#define __NR_modify_ldt SYMBOLIC(__NR_modify_ldt) +#define __NR_pivot_root SYMBOLIC(__NR_pivot_root) +#define __NR__sysctl SYMBOLIC(__NR__sysctl) +#define __NR_prctl SYMBOLIC(__NR_prctl) +#define __NR_arch_prctl SYMBOLIC(__NR_arch_prctl) +#define __NR_adjtimex SYMBOLIC(__NR_adjtimex) +#define __NR_umount2 SYMBOLIC(__NR_umount2) +#define __NR_swapon SYMBOLIC(__NR_swapon) +#define __NR_swapoff SYMBOLIC(__NR_swapoff) +#define __NR_sethostname SYMBOLIC(__NR_sethostname) +#define __NR_setdomainname SYMBOLIC(__NR_setdomainname) +#define __NR_iopl SYMBOLIC(__NR_iopl) +#define __NR_ioperm SYMBOLIC(__NR_ioperm) +#define __NR_init_module SYMBOLIC(__NR_init_module) +#define __NR_delete_module SYMBOLIC(__NR_delete_module) +#define __NR_gettid SYMBOLIC(__NR_gettid) +#define __NR_readahead SYMBOLIC(__NR_readahead) +#define __NR_setxattr SYMBOLIC(__NR_setxattr) +#define __NR_fsetxattr SYMBOLIC(__NR_fsetxattr) +#define __NR_getxattr SYMBOLIC(__NR_getxattr) +#define __NR_fgetxattr SYMBOLIC(__NR_fgetxattr) +#define __NR_listxattr SYMBOLIC(__NR_listxattr) +#define __NR_flistxattr SYMBOLIC(__NR_flistxattr) +#define __NR_removexattr SYMBOLIC(__NR_removexattr) +#define __NR_fremovexattr SYMBOLIC(__NR_fremovexattr) +#define __NR_lsetxattr SYMBOLIC(__NR_lsetxattr) +#define __NR_lgetxattr SYMBOLIC(__NR_lgetxattr) +#define __NR_llistxattr SYMBOLIC(__NR_llistxattr) +#define __NR_lremovexattr SYMBOLIC(__NR_lremovexattr) +#define __NR_sched_setaffinity SYMBOLIC(__NR_sched_setaffinity) +#define __NR_sched_getaffinity SYMBOLIC(__NR_sched_getaffinity) +#define __NR_cpuset_getaffinity SYMBOLIC(__NR_cpuset_getaffinity) +#define __NR_cpuset_setaffinity SYMBOLIC(__NR_cpuset_setaffinity) +#define __NR_io_setup SYMBOLIC(__NR_io_setup) +#define __NR_io_destroy SYMBOLIC(__NR_io_destroy) +#define __NR_io_getevents SYMBOLIC(__NR_io_getevents) +#define __NR_io_submit SYMBOLIC(__NR_io_submit) +#define __NR_io_cancel SYMBOLIC(__NR_io_cancel) +#define __NR_lookup_dcookie SYMBOLIC(__NR_lookup_dcookie) +#define __NR_epoll_create SYMBOLIC(__NR_epoll_create) +#define __NR_epoll_wait SYMBOLIC(__NR_epoll_wait) +#define __NR_epoll_ctl SYMBOLIC(__NR_epoll_ctl) +#define __NR_getdents SYMBOLIC(__NR_getdents) +#define __NR_set_tid_address SYMBOLIC(__NR_set_tid_address) +#define __NR_restart_syscall SYMBOLIC(__NR_restart_syscall) +#define __NR_semtimedop SYMBOLIC(__NR_semtimedop) +#define __NR_fadvise SYMBOLIC(__NR_fadvise) +#define __NR_timer_create SYMBOLIC(__NR_timer_create) +#define __NR_timer_settime SYMBOLIC(__NR_timer_settime) +#define __NR_timer_gettime SYMBOLIC(__NR_timer_gettime) +#define __NR_timer_getoverrun SYMBOLIC(__NR_timer_getoverrun) +#define __NR_timer_delete SYMBOLIC(__NR_timer_delete) +#define __NR_clock_settime SYMBOLIC(__NR_clock_settime) +#define __NR_clock_gettime SYMBOLIC(__NR_clock_gettime) +#define __NR_clock_getres SYMBOLIC(__NR_clock_getres) +#define __NR_clock_nanosleep SYMBOLIC(__NR_clock_nanosleep) +#define __NR_tgkill SYMBOLIC(__NR_tgkill) +#define __NR_mbind SYMBOLIC(__NR_mbind) +#define __NR_set_mempolicy SYMBOLIC(__NR_set_mempolicy) +#define __NR_get_mempolicy SYMBOLIC(__NR_get_mempolicy) +#define __NR_mq_open SYMBOLIC(__NR_mq_open) +#define __NR_mq_unlink SYMBOLIC(__NR_mq_unlink) +#define __NR_mq_timedsend SYMBOLIC(__NR_mq_timedsend) +#define __NR_mq_timedreceive SYMBOLIC(__NR_mq_timedreceive) +#define __NR_mq_notify SYMBOLIC(__NR_mq_notify) +#define __NR_mq_getsetattr SYMBOLIC(__NR_mq_getsetattr) +#define __NR_kexec_load SYMBOLIC(__NR_kexec_load) +#define __NR_waitid SYMBOLIC(__NR_waitid) +#define __NR_add_key SYMBOLIC(__NR_add_key) +#define __NR_request_key SYMBOLIC(__NR_request_key) +#define __NR_keyctl SYMBOLIC(__NR_keyctl) +#define __NR_ioprio_set SYMBOLIC(__NR_ioprio_set) +#define __NR_ioprio_get SYMBOLIC(__NR_ioprio_get) +#define __NR_inotify_init SYMBOLIC(__NR_inotify_init) +#define __NR_inotify_add_watch SYMBOLIC(__NR_inotify_add_watch) +#define __NR_inotify_rm_watch SYMBOLIC(__NR_inotify_rm_watch) +#define __NR_openat SYMBOLIC(__NR_openat) +#define __NR_mkdirat SYMBOLIC(__NR_mkdirat) +#define __NR_fchownat SYMBOLIC(__NR_fchownat) +#define __NR_utime SYMBOLIC(__NR_utime) +#define __NR_utimes SYMBOLIC(__NR_utimes) +#define __NR_futimesat SYMBOLIC(__NR_futimesat) +#define __NR_futimes SYMBOLIC(__NR_futimes) +#define __NR_futimens SYMBOLIC(__NR_futimens) +#define __NR_fstatat SYMBOLIC(__NR_fstatat) +#define __NR_unlinkat SYMBOLIC(__NR_unlinkat) +#define __NR_renameat SYMBOLIC(__NR_renameat) +#define __NR_linkat SYMBOLIC(__NR_linkat) +#define __NR_symlinkat SYMBOLIC(__NR_symlinkat) +#define __NR_readlinkat SYMBOLIC(__NR_readlinkat) +#define __NR_fchmodat SYMBOLIC(__NR_fchmodat) +#define __NR_faccessat SYMBOLIC(__NR_faccessat) +#define __NR_unshare SYMBOLIC(__NR_unshare) +#define __NR_splice SYMBOLIC(__NR_splice) +#define __NR_tee SYMBOLIC(__NR_tee) +#define __NR_sync_file_range SYMBOLIC(__NR_sync_file_range) +#define __NR_vmsplice SYMBOLIC(__NR_vmsplice) +#define __NR_migrate_pages SYMBOLIC(__NR_migrate_pages) +#define __NR_move_pages SYMBOLIC(__NR_move_pages) +#define __NR_preadv SYMBOLIC(__NR_preadv) +#define __NR_pwritev SYMBOLIC(__NR_pwritev) +#define __NR_utimensat SYMBOLIC(__NR_utimensat) +#define __NR_fallocate SYMBOLIC(__NR_fallocate) +#define __NR_posix_fallocate SYMBOLIC(__NR_posix_fallocate) +#define __NR_accept4 SYMBOLIC(__NR_accept4) +#define __NR_dup3 SYMBOLIC(__NR_dup3) +#define __NR_pipe2 SYMBOLIC(__NR_pipe2) +#define __NR_epoll_pwait SYMBOLIC(__NR_epoll_pwait) +#define __NR_epoll_create1 SYMBOLIC(__NR_epoll_create1) +#define __NR_perf_event_open SYMBOLIC(__NR_perf_event_open) +#define __NR_inotify_init1 SYMBOLIC(__NR_inotify_init1) +#define __NR_rt_tgsigqueueinfo SYMBOLIC(__NR_rt_tgsigqueueinfo) +#define __NR_signalfd SYMBOLIC(__NR_signalfd) +#define __NR_signalfd4 SYMBOLIC(__NR_signalfd4) +#define __NR_eventfd SYMBOLIC(__NR_eventfd) +#define __NR_eventfd2 SYMBOLIC(__NR_eventfd2) +#define __NR_timerfd_create SYMBOLIC(__NR_timerfd_create) +#define __NR_timerfd_settime SYMBOLIC(__NR_timerfd_settime) +#define __NR_timerfd_gettime SYMBOLIC(__NR_timerfd_gettime) +#define __NR_recvmmsg SYMBOLIC(__NR_recvmmsg) +#define __NR_fanotify_init SYMBOLIC(__NR_fanotify_init) +#define __NR_fanotify_mark SYMBOLIC(__NR_fanotify_mark) +#define __NR_prlimit SYMBOLIC(__NR_prlimit) +#define __NR_name_to_handle_at SYMBOLIC(__NR_name_to_handle_at) +#define __NR_open_by_handle_at SYMBOLIC(__NR_open_by_handle_at) +#define __NR_clock_adjtime SYMBOLIC(__NR_clock_adjtime) +#define __NR_syncfs SYMBOLIC(__NR_syncfs) +#define __NR_sendmmsg SYMBOLIC(__NR_sendmmsg) +#define __NR_setns SYMBOLIC(__NR_setns) +#define __NR_getcpu SYMBOLIC(__NR_getcpu) +#define __NR_process_vm_readv SYMBOLIC(__NR_process_vm_readv) +#define __NR_process_vm_writev SYMBOLIC(__NR_process_vm_writev) +#define __NR_kcmp SYMBOLIC(__NR_kcmp) +#define __NR_finit_module SYMBOLIC(__NR_finit_module) +#define __NR_sched_setattr SYMBOLIC(__NR_sched_setattr) +#define __NR_sched_getattr SYMBOLIC(__NR_sched_getattr) +#define __NR_renameat2 SYMBOLIC(__NR_renameat2) +#define __NR_seccomp SYMBOLIC(__NR_seccomp) +#define __NR_getrandom SYMBOLIC(__NR_getrandom) +#define __NR_memfd_create SYMBOLIC(__NR_memfd_create) +#define __NR_kexec_file_load SYMBOLIC(__NR_kexec_file_load) +#define __NR_bpf SYMBOLIC(__NR_bpf) +#define __NR_execveat SYMBOLIC(__NR_execveat) +#define __NR_userfaultfd SYMBOLIC(__NR_userfaultfd) +#define __NR_membarrier SYMBOLIC(__NR_membarrier) +#define __NR_mlock2 SYMBOLIC(__NR_mlock2) +#define __NR_copy_file_range SYMBOLIC(__NR_copy_file_range) +#define __NR_preadv2 SYMBOLIC(__NR_preadv2) +#define __NR_pwritev2 SYMBOLIC(__NR_pwritev2) +#define __NR_pkey_mprotect SYMBOLIC(__NR_pkey_mprotect) +#define __NR_pkey_alloc SYMBOLIC(__NR_pkey_alloc) +#define __NR_pkey_free SYMBOLIC(__NR_pkey_free) +#define __NR_statx SYMBOLIC(__NR_statx) +#define __NR_io_pgetevents SYMBOLIC(__NR_io_pgetevents) +#define __NR_rseq SYMBOLIC(__NR_rseq) +#define __NR_pidfd_send_signal SYMBOLIC(__NR_pidfd_send_signal) +#define __NR_io_uring_setup SYMBOLIC(__NR_io_uring_setup) +#define __NR_io_uring_enter SYMBOLIC(__NR_io_uring_enter) +#define __NR_io_uring_register SYMBOLIC(__NR_io_uring_register) +#define __NR_pledge SYMBOLIC(__NR_pledge) +#define __NR_msyscall SYMBOLIC(__NR_msyscall) +#define __NR_ktrace SYMBOLIC(__NR_ktrace) +#define __NR_kqueue SYMBOLIC(__NR_kqueue) +#define __NR_kevent SYMBOLIC(__NR_kevent) +#define __NR_revoke SYMBOLIC(__NR_revoke) +#define __NR_setlogin SYMBOLIC(__NR_setlogin) +#define __NR_getfh SYMBOLIC(__NR_getfh) +#define __NR_chflags SYMBOLIC(__NR_chflags) +#define __NR_getfsstat SYMBOLIC(__NR_getfsstat) +#define __NR_nfssvc SYMBOLIC(__NR_nfssvc) +#define __NR_adjtime SYMBOLIC(__NR_adjtime) +#define __NR_fchflags SYMBOLIC(__NR_fchflags) +#define __NR_seteuid SYMBOLIC(__NR_seteuid) +#define __NR_setegid SYMBOLIC(__NR_setegid) +#define __NR_fpathconf SYMBOLIC(__NR_fpathconf) +#define __NR_fhopen SYMBOLIC(__NR_fhopen) +#define __NR_unmount SYMBOLIC(__NR_unmount) +#define __NR_issetugid SYMBOLIC(__NR_issetugid) +#define __NR_minherit SYMBOLIC(__NR_minherit) +#define __NR_pathconf SYMBOLIC(__NR_pathconf) +#define __NR_sysctl SYMBOLIC(__NR_sysctl) +#define __NR_ntp_adjtime SYMBOLIC(__NR_ntp_adjtime) +#define __NR_ntp_gettime SYMBOLIC(__NR_ntp_gettime) +#define __NR_shm_unlink SYMBOLIC(__NR_shm_unlink) +#define __NR_shm_open SYMBOLIC(__NR_shm_open) +#define __NR_aio_read SYMBOLIC(__NR_aio_read) +#define __NR_aio_suspend SYMBOLIC(__NR_aio_suspend) +#define __NR_aio_cancel SYMBOLIC(__NR_aio_cancel) +#define __NR_aio_fsync SYMBOLIC(__NR_aio_fsync) +#define __NR_aio_error SYMBOLIC(__NR_aio_error) +#define __NR_aio_return SYMBOLIC(__NR_aio_return) +#define __NR_aio_write SYMBOLIC(__NR_aio_write) +#define __NR_aio_waitcomplete SYMBOLIC(__NR_aio_waitcomplete) +#define __NR_aio_suspend_nocancel SYMBOLIC(__NR_aio_suspend_nocancel) +#define __NR_aio_mlock SYMBOLIC(__NR_aio_mlock) +#define __NR_sigwait SYMBOLIC(__NR_sigwait) +#define __NR_undelete SYMBOLIC(__NR_undelete) +#define __NR_getlogin SYMBOLIC(__NR_getlogin) +#define __NR_getdtablesize SYMBOLIC(__NR_getdtablesize) +#define __NR_setauid SYMBOLIC(__NR_setauid) +#define __NR_audit SYMBOLIC(__NR_audit) +#define __NR_auditctl SYMBOLIC(__NR_auditctl) +#define __NR_getaudit_addr SYMBOLIC(__NR_getaudit_addr) +#define __NR_getdirentries SYMBOLIC(__NR_getdirentries) +#define __NR_lio_listio SYMBOLIC(__NR_lio_listio) +#define __NR_setaudit_addr SYMBOLIC(__NR_setaudit_addr) +#define __NR_getauid SYMBOLIC(__NR_getauid) +#define __NR_semsys SYMBOLIC(__NR_semsys) +#define __NR_auditon SYMBOLIC(__NR_auditon) +#define __NR_msgsys SYMBOLIC(__NR_msgsys) +#define __NR_shmsys SYMBOLIC(__NR_shmsys) +#define __NR_fhstat SYMBOLIC(__NR_fhstat) +#define __NR_chflagsat SYMBOLIC(__NR_chflagsat) +#define __NR_profil SYMBOLIC(__NR_profil) +#define __NR_fhstatfs SYMBOLIC(__NR_fhstatfs) +#define __NR_utrace SYMBOLIC(__NR_utrace) +#define __NR_closefrom SYMBOLIC(__NR_closefrom) +#define __NR_pthread_markcancel SYMBOLIC(__NR_pthread_markcancel) +#define __NR_pthread_kill SYMBOLIC(__NR_pthread_kill) +#define __NR_pthread_fchdir SYMBOLIC(__NR_pthread_fchdir) +#define __NR_pthread_sigmask SYMBOLIC(__NR_pthread_sigmask) +#define __NR_pthread_chdir SYMBOLIC(__NR_pthread_chdir) +#define __NR_pthread_canceled SYMBOLIC(__NR_pthread_canceled) +#define __NR_disable_threadsignal SYMBOLIC(__NR_disable_threadsignal) +#define __NR_abort_with_payload SYMBOLIC(__NR_abort_with_payload) +#define __NR_accept_nocancel SYMBOLIC(__NR_accept_nocancel) +#define __NR_access_extended SYMBOLIC(__NR_access_extended) +#define __NR_audit_session_join SYMBOLIC(__NR_audit_session_join) +#define __NR_audit_session_port SYMBOLIC(__NR_audit_session_port) +#define __NR_audit_session_self SYMBOLIC(__NR_audit_session_self) +#define __NR_bsdthread_create SYMBOLIC(__NR_bsdthread_create) +#define __NR_bsdthread_ctl SYMBOLIC(__NR_bsdthread_ctl) +#define __NR_bsdthread_register SYMBOLIC(__NR_bsdthread_register) +#define __NR_bsdthread_terminate SYMBOLIC(__NR_bsdthread_terminate) +#define __NR_change_fdguard_np SYMBOLIC(__NR_change_fdguard_np) +#define __NR_chmod_extended SYMBOLIC(__NR_chmod_extended) +#define __NR_clonefileat SYMBOLIC(__NR_clonefileat) +#define __NR_close_nocancel SYMBOLIC(__NR_close_nocancel) +#define __NR_coalition SYMBOLIC(__NR_coalition) +#define __NR_coalition_info SYMBOLIC(__NR_coalition_info) +#define __NR_connect_nocancel SYMBOLIC(__NR_connect_nocancel) +#define __NR_connectx SYMBOLIC(__NR_connectx) +#define __NR_copyfile SYMBOLIC(__NR_copyfile) +#define __NR_csops SYMBOLIC(__NR_csops) +#define __NR_csops_audittoken SYMBOLIC(__NR_csops_audittoken) +#define __NR_csrctl SYMBOLIC(__NR_csrctl) +#define __NR_delete SYMBOLIC(__NR_delete) +#define __NR_disconnectx SYMBOLIC(__NR_disconnectx) +#define __NR_exchangedata SYMBOLIC(__NR_exchangedata) +#define __NR_fchmod_extended SYMBOLIC(__NR_fchmod_extended) +#define __NR_fclonefileat SYMBOLIC(__NR_fclonefileat) +#define __NR_fcntl_nocancel SYMBOLIC(__NR_fcntl_nocancel) +#define __NR_ffsctl SYMBOLIC(__NR_ffsctl) +#define __NR_fgetattrlist SYMBOLIC(__NR_fgetattrlist) +#define __NR_fileport_makefd SYMBOLIC(__NR_fileport_makefd) +#define __NR_fileport_makeport SYMBOLIC(__NR_fileport_makeport) +#define __NR_fmount SYMBOLIC(__NR_fmount) +#define __NR_fs_snapshot SYMBOLIC(__NR_fs_snapshot) +#define __NR_fsctl SYMBOLIC(__NR_fsctl) +#define __NR_fsetattrlist SYMBOLIC(__NR_fsetattrlist) +#define __NR_fstat_extended SYMBOLIC(__NR_fstat_extended) +#define __NR_fsync_nocancel SYMBOLIC(__NR_fsync_nocancel) +#define __NR_getattrlist SYMBOLIC(__NR_getattrlist) +#define __NR_getattrlistat SYMBOLIC(__NR_getattrlistat) +#define __NR_getattrlistbulk SYMBOLIC(__NR_getattrlistbulk) +#define __NR_getdirentriesattr SYMBOLIC(__NR_getdirentriesattr) +#define __NR_gethostuuid SYMBOLIC(__NR_gethostuuid) +#define __NR_getsgroups SYMBOLIC(__NR_getsgroups) +#define __NR_getwgroups SYMBOLIC(__NR_getwgroups) +#define __NR_grab_pgo_data SYMBOLIC(__NR_grab_pgo_data) +#define __NR_guarded_close_np SYMBOLIC(__NR_guarded_close_np) +#define __NR_guarded_kqueue_np SYMBOLIC(__NR_guarded_kqueue_np) +#define __NR_guarded_open_np SYMBOLIC(__NR_guarded_open_np) +#define __NR_guarded_pwrite_np SYMBOLIC(__NR_guarded_pwrite_np) +#define __NR_guarded_write_np SYMBOLIC(__NR_guarded_write_np) +#define __NR_guarded_writev_np SYMBOLIC(__NR_guarded_writev_np) +#define __NR_identitysvc SYMBOLIC(__NR_identitysvc) +#define __NR_initgroups SYMBOLIC(__NR_initgroups) +#define __NR_iopolicysys SYMBOLIC(__NR_iopolicysys) +#define __NR_kas_info SYMBOLIC(__NR_kas_info) +#define __NR_kdebug_trace SYMBOLIC(__NR_kdebug_trace) +#define __NR_kdebug_trace_string SYMBOLIC(__NR_kdebug_trace_string) +#define __NR_kdebug_typefilter SYMBOLIC(__NR_kdebug_typefilter) +#define __NR_kevent_id SYMBOLIC(__NR_kevent_id) +#define __NR_kevent_qos SYMBOLIC(__NR_kevent_qos) +#define __NR_ledger SYMBOLIC(__NR_ledger) +#define __NR_lstat_extended SYMBOLIC(__NR_lstat_extended) +#define __NR_memorystatus_control SYMBOLIC(__NR_memorystatus_control) +#define __NR_memorystatus_get_level SYMBOLIC(__NR_memorystatus_get_level) +#define __NR_microstackshot SYMBOLIC(__NR_microstackshot) +#define __NR_mkdir_extended SYMBOLIC(__NR_mkdir_extended) +#define __NR_mkfifo_extended SYMBOLIC(__NR_mkfifo_extended) +#define __NR_modwatch SYMBOLIC(__NR_modwatch) +#define __NR_mremap_encrypted SYMBOLIC(__NR_mremap_encrypted) +#define __NR_msgrcv_nocancel SYMBOLIC(__NR_msgrcv_nocancel) +#define __NR_msgsnd_nocancel SYMBOLIC(__NR_msgsnd_nocancel) +#define __NR_msync_nocancel SYMBOLIC(__NR_msync_nocancel) +#define __NR_necp_client_action SYMBOLIC(__NR_necp_client_action) +#define __NR_necp_match_policy SYMBOLIC(__NR_necp_match_policy) +#define __NR_necp_open SYMBOLIC(__NR_necp_open) +#define __NR_necp_session_action SYMBOLIC(__NR_necp_session_action) +#define __NR_necp_session_open SYMBOLIC(__NR_necp_session_open) +#define __NR_net_qos_guideline SYMBOLIC(__NR_net_qos_guideline) +#define __NR_netagent_trigger SYMBOLIC(__NR_netagent_trigger) +#define __NR_nfsclnt SYMBOLIC(__NR_nfsclnt) +#define __NR_open_dprotected_np SYMBOLIC(__NR_open_dprotected_np) +#define __NR_open_extended SYMBOLIC(__NR_open_extended) +#define __NR_open_nocancel SYMBOLIC(__NR_open_nocancel) +#define __NR_openat_nocancel SYMBOLIC(__NR_openat_nocancel) +#define __NR_openbyid_np SYMBOLIC(__NR_openbyid_np) +#define __NR_os_fault_with_payload SYMBOLIC(__NR_os_fault_with_payload) +#define __NR_peeloff SYMBOLIC(__NR_peeloff) +#define __NR_persona SYMBOLIC(__NR_persona) +#define __NR_pid_hibernate SYMBOLIC(__NR_pid_hibernate) +#define __NR_pid_resume SYMBOLIC(__NR_pid_resume) +#define __NR_pid_shutdown_sockets SYMBOLIC(__NR_pid_shutdown_sockets) +#define __NR_pid_suspend SYMBOLIC(__NR_pid_suspend) +#define __NR_poll_nocancel SYMBOLIC(__NR_poll_nocancel) +#define __NR_pread_nocancel SYMBOLIC(__NR_pread_nocancel) +#define __NR_proc_info SYMBOLIC(__NR_proc_info) +#define __NR_proc_rlimit_control SYMBOLIC(__NR_proc_rlimit_control) +#define __NR_proc_trace_log SYMBOLIC(__NR_proc_trace_log) +#define __NR_proc_uuid_policy SYMBOLIC(__NR_proc_uuid_policy) +#define __NR_process_policy SYMBOLIC(__NR_process_policy) +#define __NR_pselect_nocancel SYMBOLIC(__NR_pselect_nocancel) +#define __NR_psynch_cvbroad SYMBOLIC(__NR_psynch_cvbroad) +#define __NR_psynch_cvclrprepost SYMBOLIC(__NR_psynch_cvclrprepost) +#define __NR_psynch_cvsignal SYMBOLIC(__NR_psynch_cvsignal) +#define __NR_psynch_mutexdrop SYMBOLIC(__NR_psynch_mutexdrop) +#define __NR_psynch_mutexwait SYMBOLIC(__NR_psynch_mutexwait) +#define __NR_psynch_rw_downgrade SYMBOLIC(__NR_psynch_rw_downgrade) +#define __NR_psynch_rw_longrdlock SYMBOLIC(__NR_psynch_rw_longrdlock) +#define __NR_psynch_rw_rdlock SYMBOLIC(__NR_psynch_rw_rdlock) +#define __NR_psynch_rw_unlock SYMBOLIC(__NR_psynch_rw_unlock) +#define __NR_psynch_rw_unlock2 SYMBOLIC(__NR_psynch_rw_unlock2) +#define __NR_psynch_rw_upgrade SYMBOLIC(__NR_psynch_rw_upgrade) +#define __NR_psynch_rw_wrlock SYMBOLIC(__NR_psynch_rw_wrlock) +#define __NR_psynch_rw_yieldwrlock SYMBOLIC(__NR_psynch_rw_yieldwrlock) +#define __NR_pwrite_nocancel SYMBOLIC(__NR_pwrite_nocancel) +#define __NR_read_nocancel SYMBOLIC(__NR_read_nocancel) +#define __NR_readv_nocancel SYMBOLIC(__NR_readv_nocancel) +#define __NR_recvfrom_nocancel SYMBOLIC(__NR_recvfrom_nocancel) +#define __NR_recvmsg_nocancel SYMBOLIC(__NR_recvmsg_nocancel) +#define __NR_recvmsg_x SYMBOLIC(__NR_recvmsg_x) +#define __NR_renameatx_np SYMBOLIC(__NR_renameatx_np) +#define __NR_searchfs SYMBOLIC(__NR_searchfs) +#define __NR_select_nocancel SYMBOLIC(__NR_select_nocancel) +#define __NR_sem_close SYMBOLIC(__NR_sem_close) +#define __NR_sem_open SYMBOLIC(__NR_sem_open) +#define __NR_sem_post SYMBOLIC(__NR_sem_post) +#define __NR_sem_trywait SYMBOLIC(__NR_sem_trywait) +#define __NR_sem_unlink SYMBOLIC(__NR_sem_unlink) +#define __NR_sem_wait SYMBOLIC(__NR_sem_wait) +#define __NR_sem_wait_nocancel SYMBOLIC(__NR_sem_wait_nocancel) +#define __NR_sendmsg_nocancel SYMBOLIC(__NR_sendmsg_nocancel) +#define __NR_sendmsg_x SYMBOLIC(__NR_sendmsg_x) +#define __NR_sendto_nocancel SYMBOLIC(__NR_sendto_nocancel) +#define __NR_setattrlist SYMBOLIC(__NR_setattrlist) +#define __NR_setattrlistat SYMBOLIC(__NR_setattrlistat) +#define __NR_setprivexec SYMBOLIC(__NR_setprivexec) +#define __NR_setsgroups SYMBOLIC(__NR_setsgroups) +#define __NR_settid SYMBOLIC(__NR_settid) +#define __NR_settid_with_pid SYMBOLIC(__NR_settid_with_pid) +#define __NR_setwgroups SYMBOLIC(__NR_setwgroups) +#define __NR_sfi_ctl SYMBOLIC(__NR_sfi_ctl) +#define __NR_sfi_pidctl SYMBOLIC(__NR_sfi_pidctl) +#define __NR_shared_region_check_np SYMBOLIC(__NR_shared_region_check_np) +#define __NR_sigsuspend_nocancel SYMBOLIC(__NR_sigsuspend_nocancel) +#define __NR_socket_delegate SYMBOLIC(__NR_socket_delegate) +#define __NR_stat_extended SYMBOLIC(__NR_stat_extended) +#define __NR_sysctlbyname SYMBOLIC(__NR_sysctlbyname) +#define __NR_system_override SYMBOLIC(__NR_system_override) +#define __NR_telemetry SYMBOLIC(__NR_telemetry) +#define __NR_terminate_with_payload SYMBOLIC(__NR_terminate_with_payload) +#define __NR_thread_selfcounts SYMBOLIC(__NR_thread_selfcounts) +#define __NR_thread_selfid SYMBOLIC(__NR_thread_selfid) +#define __NR_thread_selfusage SYMBOLIC(__NR_thread_selfusage) +#define __NR_ulock_wait SYMBOLIC(__NR_ulock_wait) +#define __NR_ulock_wake SYMBOLIC(__NR_ulock_wake) +#define __NR_umask_extended SYMBOLIC(__NR_umask_extended) +#define __NR_usrctl SYMBOLIC(__NR_usrctl) +#define __NR_vfs_purge SYMBOLIC(__NR_vfs_purge) +#define __NR_vm_pressure_monitor SYMBOLIC(__NR_vm_pressure_monitor) +#define __NR_wait4_nocancel SYMBOLIC(__NR_wait4_nocancel) +#define __NR_waitevent SYMBOLIC(__NR_waitevent) +#define __NR_waitid_nocancel SYMBOLIC(__NR_waitid_nocancel) +#define __NR_watchevent SYMBOLIC(__NR_watchevent) +#define __NR_work_interval_ctl SYMBOLIC(__NR_work_interval_ctl) +#define __NR_workq_kernreturn SYMBOLIC(__NR_workq_kernreturn) +#define __NR_workq_open SYMBOLIC(__NR_workq_open) +#define __NR_write_nocancel SYMBOLIC(__NR_write_nocancel) +#define __NR_writev_nocancel SYMBOLIC(__NR_writev_nocancel) +#define __NR_abort2 SYMBOLIC(__NR_abort2) +#define __NR_afs3_syscall SYMBOLIC(__NR_afs3_syscall) +#define __NR_bindat SYMBOLIC(__NR_bindat) +#define __NR_break SYMBOLIC(__NR_break) +#define __NR_cap_enter SYMBOLIC(__NR_cap_enter) +#define __NR_cap_fcntls_get SYMBOLIC(__NR_cap_fcntls_get) +#define __NR_cap_fcntls_limit SYMBOLIC(__NR_cap_fcntls_limit) +#define __NR_cap_getmode SYMBOLIC(__NR_cap_getmode) +#define __NR_cap_ioctls_get SYMBOLIC(__NR_cap_ioctls_get) +#define __NR_cap_ioctls_limit SYMBOLIC(__NR_cap_ioctls_limit) +#define __NR_cap_rights_limit SYMBOLIC(__NR_cap_rights_limit) +#define __NR_clock_getcpuclockid2 SYMBOLIC(__NR_clock_getcpuclockid2) +#define __NR_connectat SYMBOLIC(__NR_connectat) +#define __NR_cpuset SYMBOLIC(__NR_cpuset) +#define __NR_cpuset_getdomain SYMBOLIC(__NR_cpuset_getdomain) +#define __NR_cpuset_getid SYMBOLIC(__NR_cpuset_getid) +#define __NR_cpuset_setdomain SYMBOLIC(__NR_cpuset_setdomain) +#define __NR_cpuset_setid SYMBOLIC(__NR_cpuset_setid) +#define __NR_eaccess SYMBOLIC(__NR_eaccess) +#define __NR_extattr_delete_fd SYMBOLIC(__NR_extattr_delete_fd) +#define __NR_extattr_delete_file SYMBOLIC(__NR_extattr_delete_file) +#define __NR_extattr_delete_link SYMBOLIC(__NR_extattr_delete_link) +#define __NR_extattr_get_fd SYMBOLIC(__NR_extattr_get_fd) +#define __NR_extattr_get_file SYMBOLIC(__NR_extattr_get_file) +#define __NR_extattr_get_link SYMBOLIC(__NR_extattr_get_link) +#define __NR_extattr_list_fd SYMBOLIC(__NR_extattr_list_fd) +#define __NR_extattr_list_file SYMBOLIC(__NR_extattr_list_file) +#define __NR_extattr_list_link SYMBOLIC(__NR_extattr_list_link) +#define __NR_extattr_set_fd SYMBOLIC(__NR_extattr_set_fd) +#define __NR_extattr_set_file SYMBOLIC(__NR_extattr_set_file) +#define __NR_extattr_set_link SYMBOLIC(__NR_extattr_set_link) +#define __NR_extattrctl SYMBOLIC(__NR_extattrctl) +#define __NR_fexecve SYMBOLIC(__NR_fexecve) +#define __NR_ffclock_getcounter SYMBOLIC(__NR_ffclock_getcounter) +#define __NR_ffclock_getestimate SYMBOLIC(__NR_ffclock_getestimate) +#define __NR_ffclock_setestimate SYMBOLIC(__NR_ffclock_setestimate) +#define __NR_fhlink SYMBOLIC(__NR_fhlink) +#define __NR_fhlinkat SYMBOLIC(__NR_fhlinkat) +#define __NR_fhreadlink SYMBOLIC(__NR_fhreadlink) +#define __NR_getaudit SYMBOLIC(__NR_getaudit) +#define __NR_getcontext SYMBOLIC(__NR_getcontext) +#define __NR_getfhat SYMBOLIC(__NR_getfhat) +#define __NR_gethostid SYMBOLIC(__NR_gethostid) +#define __NR_getkerninfo SYMBOLIC(__NR_getkerninfo) +#define __NR_getloginclass SYMBOLIC(__NR_getloginclass) +#define __NR_getpagesize SYMBOLIC(__NR_getpagesize) +#define __NR_gssd_syscall SYMBOLIC(__NR_gssd_syscall) +#define __NR_jail SYMBOLIC(__NR_jail) +#define __NR_jail_attach SYMBOLIC(__NR_jail_attach) +#define __NR_jail_get SYMBOLIC(__NR_jail_get) +#define __NR_jail_remove SYMBOLIC(__NR_jail_remove) +#define __NR_jail_set SYMBOLIC(__NR_jail_set) +#define __NR_kenv SYMBOLIC(__NR_kenv) +#define __NR_kldfind SYMBOLIC(__NR_kldfind) +#define __NR_kldfirstmod SYMBOLIC(__NR_kldfirstmod) +#define __NR_kldload SYMBOLIC(__NR_kldload) +#define __NR_kldnext SYMBOLIC(__NR_kldnext) +#define __NR_kldstat SYMBOLIC(__NR_kldstat) +#define __NR_kldsym SYMBOLIC(__NR_kldsym) +#define __NR_kldunload SYMBOLIC(__NR_kldunload) +#define __NR_kldunloadf SYMBOLIC(__NR_kldunloadf) +#define __NR_kmq_notify SYMBOLIC(__NR_kmq_notify) +#define __NR_kmq_setattr SYMBOLIC(__NR_kmq_setattr) +#define __NR_kmq_timedreceive SYMBOLIC(__NR_kmq_timedreceive) +#define __NR_kmq_timedsend SYMBOLIC(__NR_kmq_timedsend) +#define __NR_kmq_unlink SYMBOLIC(__NR_kmq_unlink) +#define __NR_ksem_close SYMBOLIC(__NR_ksem_close) +#define __NR_ksem_destroy SYMBOLIC(__NR_ksem_destroy) +#define __NR_ksem_getvalue SYMBOLIC(__NR_ksem_getvalue) +#define __NR_ksem_init SYMBOLIC(__NR_ksem_init) +#define __NR_ksem_open SYMBOLIC(__NR_ksem_open) +#define __NR_ksem_post SYMBOLIC(__NR_ksem_post) +#define __NR_ksem_timedwait SYMBOLIC(__NR_ksem_timedwait) +#define __NR_ksem_trywait SYMBOLIC(__NR_ksem_trywait) +#define __NR_ksem_unlink SYMBOLIC(__NR_ksem_unlink) +#define __NR_ksem_wait SYMBOLIC(__NR_ksem_wait) +#define __NR_ktimer_create SYMBOLIC(__NR_ktimer_create) +#define __NR_ktimer_delete SYMBOLIC(__NR_ktimer_delete) +#define __NR_ktimer_getoverrun SYMBOLIC(__NR_ktimer_getoverrun) +#define __NR_ktimer_gettime SYMBOLIC(__NR_ktimer_gettime) +#define __NR_ktimer_settime SYMBOLIC(__NR_ktimer_settime) +#define __NR_lchflags SYMBOLIC(__NR_lchflags) +#define __NR_lchmod SYMBOLIC(__NR_lchmod) +#define __NR_lgetfh SYMBOLIC(__NR_lgetfh) +#define __NR_lpathconf SYMBOLIC(__NR_lpathconf) +#define __NR_lutimes SYMBOLIC(__NR_lutimes) +#define __NR_mac_syscall SYMBOLIC(__NR_mac_syscall) +#define __NR_modfind SYMBOLIC(__NR_modfind) +#define __NR_modfnext SYMBOLIC(__NR_modfnext) +#define __NR_modnext SYMBOLIC(__NR_modnext) +#define __NR_modstat SYMBOLIC(__NR_modstat) +#define __NR_nfstat SYMBOLIC(__NR_nfstat) +#define __NR_nlm_syscall SYMBOLIC(__NR_nlm_syscall) +#define __NR_nlstat SYMBOLIC(__NR_nlstat) +#define __NR_nmount SYMBOLIC(__NR_nmount) +#define __NR_nnpfs_syscall SYMBOLIC(__NR_nnpfs_syscall) +#define __NR_nstat SYMBOLIC(__NR_nstat) +#define __NR_pdfork SYMBOLIC(__NR_pdfork) +#define __NR_pdgetpid SYMBOLIC(__NR_pdgetpid) +#define __NR_pdkill SYMBOLIC(__NR_pdkill) +#define __NR_posix_openpt SYMBOLIC(__NR_posix_openpt) +#define __NR_procctl SYMBOLIC(__NR_procctl) +#define __NR_psynch_cvwait SYMBOLIC(__NR_psynch_cvwait) +#define __NR_quota SYMBOLIC(__NR_quota) +#define __NR_rctl_add_rule SYMBOLIC(__NR_rctl_add_rule) +#define __NR_rctl_get_limits SYMBOLIC(__NR_rctl_get_limits) +#define __NR_rctl_get_racct SYMBOLIC(__NR_rctl_get_racct) +#define __NR_rctl_get_rules SYMBOLIC(__NR_rctl_get_rules) +#define __NR_rctl_remove_rule SYMBOLIC(__NR_rctl_remove_rule) +#define __NR_recv SYMBOLIC(__NR_recv) +#define __NR_rfork SYMBOLIC(__NR_rfork) +#define __NR_rtprio SYMBOLIC(__NR_rtprio) +#define __NR_rtprio_thread SYMBOLIC(__NR_rtprio_thread) +#define __NR_send SYMBOLIC(__NR_send) +#define __NR_setaudit SYMBOLIC(__NR_setaudit) +#define __NR_setcontext SYMBOLIC(__NR_setcontext) +#define __NR_setfib SYMBOLIC(__NR_setfib) +#define __NR_sethostid SYMBOLIC(__NR_sethostid) +#define __NR_setloginclass SYMBOLIC(__NR_setloginclass) +#define __NR_sigblock SYMBOLIC(__NR_sigblock) +#define __NR_sigqueue SYMBOLIC(__NR_sigqueue) +#define __NR_sigsetmask SYMBOLIC(__NR_sigsetmask) +#define __NR_sigstack SYMBOLIC(__NR_sigstack) +#define __NR_sigvec SYMBOLIC(__NR_sigvec) +#define __NR_sigwaitinfo SYMBOLIC(__NR_sigwaitinfo) +#define __NR_sstk SYMBOLIC(__NR_sstk) +#define __NR_swapcontext SYMBOLIC(__NR_swapcontext) +#define __NR_thr_create SYMBOLIC(__NR_thr_create) +#define __NR_thr_exit SYMBOLIC(__NR_thr_exit) +#define __NR_thr_kill SYMBOLIC(__NR_thr_kill) +#define __NR_thr_kill2 SYMBOLIC(__NR_thr_kill2) +#define __NR_thr_new SYMBOLIC(__NR_thr_new) +#define __NR_thr_self SYMBOLIC(__NR_thr_self) +#define __NR_thr_set_name SYMBOLIC(__NR_thr_set_name) +#define __NR_thr_suspend SYMBOLIC(__NR_thr_suspend) +#define __NR_thr_wake SYMBOLIC(__NR_thr_wake) +#define __NR_uuidgen SYMBOLIC(__NR_uuidgen) +#define __NR_vadvise SYMBOLIC(__NR_vadvise) +#define __NR_wait SYMBOLIC(__NR_wait) +#define __NR_wait6 SYMBOLIC(__NR_wait6) +#define __NR_yield SYMBOLIC(__NR_yield) +#define __NR_tfork SYMBOLIC(__NR_tfork) +#define __NR_thrsleep SYMBOLIC(__NR_thrsleep) +#define __NR_thrwakeup SYMBOLIC(__NR_thrwakeup) +#define __NR_threxit SYMBOLIC(__NR_threxit) +#define __NR_thrsigdivert SYMBOLIC(__NR_thrsigdivert) +#define __NR_set_tcb SYMBOLIC(__NR_set_tcb) +#define __NR_get_tcb SYMBOLIC(__NR_get_tcb) +#define __NR_adjfreq SYMBOLIC(__NR_adjfreq) +#define __NR_getdtablecount SYMBOLIC(__NR_getdtablecount) +#define __NR_getlogin_r SYMBOLIC(__NR_getlogin_r) +#define __NR_getrtable SYMBOLIC(__NR_getrtable) +#define __NR_getthrid SYMBOLIC(__NR_getthrid) +#define __NR_kbind SYMBOLIC(__NR_kbind) +#define __NR_mquery SYMBOLIC(__NR_mquery) +#define __NR_obreak SYMBOLIC(__NR_obreak) +#define __NR_sendsyslog SYMBOLIC(__NR_sendsyslog) +#define __NR_setrtable SYMBOLIC(__NR_setrtable) +#define __NR_swapctl SYMBOLIC(__NR_swapctl) +#define __NR_thrkill SYMBOLIC(__NR_thrkill) +#define __NR_unveil SYMBOLIC(__NR_unveil) +#define __NR_mac_get_link SYMBOLIC(__NR_mac_get_link) +#define __NR_mac_set_link SYMBOLIC(__NR_mac_set_link) +#define __NR_mac_get_fd SYMBOLIC(__NR_mac_get_fd) +#define __NR_mac_get_file SYMBOLIC(__NR_mac_get_file) +#define __NR_mac_get_proc SYMBOLIC(__NR_mac_get_proc) +#define __NR_mac_set_fd SYMBOLIC(__NR_mac_set_fd) +#define __NR_mac_get_pid SYMBOLIC(__NR_mac_get_pid) +#define __NR_mac_set_proc SYMBOLIC(__NR_mac_set_proc) +#define __NR_mac_set_file SYMBOLIC(__NR_mac_set_file) +#define __NR_mac_execve SYMBOLIC(__NR_mac_execve) +#define __NR_acl_get_link SYMBOLIC(__NR_acl_get_link) +#define __NR_sigwait_nocancel SYMBOLIC(__NR_sigwait_nocancel) +#define __NR_cap_rights_get SYMBOLIC(__NR_cap_rights_get) +#define __NR_semwait_signal SYMBOLIC(__NR_semwait_signal) +#define __NR_acl_set_link SYMBOLIC(__NR_acl_set_link) +#define __NR_acl_set_fd SYMBOLIC(__NR_acl_set_fd) +#define __NR_old_semwait_signal SYMBOLIC(__NR_old_semwait_signal) +#define __NR_setugid SYMBOLIC(__NR_setugid) +#define __NR_acl_aclcheck_fd SYMBOLIC(__NR_acl_aclcheck_fd) +#define __NR_acl_get_fd SYMBOLIC(__NR_acl_get_fd) +#define __NR___sysctl SYMBOLIC(__NR___sysctl) +#define __NR_mac_getfsstat SYMBOLIC(__NR_mac_getfsstat) +#define __NR_mac_get_mount SYMBOLIC(__NR_mac_get_mount) +#define __NR_acl_delete_link SYMBOLIC(__NR_acl_delete_link) +#define __NR_mac_mount SYMBOLIC(__NR_mac_mount) +#define __NR_acl_get_file SYMBOLIC(__NR_acl_get_file) +#define __NR_acl_aclcheck_file SYMBOLIC(__NR_acl_aclcheck_file) +#define __NR_acl_delete_fd SYMBOLIC(__NR_acl_delete_fd) +#define __NR_acl_aclcheck_link SYMBOLIC(__NR_acl_aclcheck_link) +#define __NR___mac_syscall SYMBOLIC(__NR___mac_syscall) +#define __NR_acl_set_file SYMBOLIC(__NR_acl_set_file) +#define __NR_acl_delete_file SYMBOLIC(__NR_acl_delete_file) +#define __NR_syscall SYMBOLIC(__NR_syscall) +#define __NR__umtx_op SYMBOLIC(__NR__umtx_op) +#define __NR_semwait_signal_nocancel SYMBOLIC(__NR_semwait_signal_nocancel) +#define __NR_old_semwait_signal_nocancel \ + SYMBOLIC(__NR_old_semwait_signal_nocancel) +#define __NR_sctp_peeloff SYMBOLIC(__NR_sctp_peeloff) +#define __NR_sctp_generic_recvmsg SYMBOLIC(__NR_sctp_generic_recvmsg) +#define __NR_sctp_generic_sendmsg SYMBOLIC(__NR_sctp_generic_sendmsg) +#define __NR_sctp_generic_sendmsg_iov SYMBOLIC(__NR_sctp_generic_sendmsg_iov) +#define __NR_shared_region_map_and_slide_np \ + SYMBOLIC(__NR_shared_region_map_and_slide_np) +#define __NR_guarded_open_dprotected_np \ + SYMBOLIC(__NR_guarded_open_dprotected_np) +#define __NR_stack_snapshot_with_config \ + SYMBOLIC(__NR_stack_snapshot_with_config) + #endif /* COSMOPOLITAN_LIBC_SYSV_CONSTS_NR_H_ */ diff --git a/libc/sysv/consts/o.h b/libc/sysv/consts/o.h index fb996275f..6d5d61ebf 100644 --- a/libc/sysv/consts/o.h +++ b/libc/sysv/consts/o.h @@ -4,39 +4,39 @@ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ -extern const long O_ACCMODE; -extern const long O_APPEND; -extern const long O_ASYNC; -extern const long O_CLOEXEC; -extern const long O_CREAT; -extern const long O_DIRECT; -extern const long O_DIRECTORY; -extern const long O_DSYNC; -extern const long O_EXCL; -extern const long O_EXEC; -extern const long O_EXLOCK; -extern const long O_LARGEFILE; -extern const long O_NDELAY; -extern const long O_NOATIME; -extern const long O_NOCTTY; -extern const long O_NOFOLLOW; -extern const long O_NOFOLLOW_ANY; -extern const long O_NONBLOCK; -extern const long O_PATH; -extern const long O_RANDOM; -extern const long O_RDONLY; -extern const long O_RDWR; -extern const long O_RSYNC; -extern const long O_SEARCH; -extern const long O_SEQUENTIAL; -extern const long O_SHLOCK; -extern const long O_SPARSE; -extern const long O_SYNC; -extern const long O_TMPFILE; -extern const long O_TRUNC; -extern const long O_TTY_INIT; -extern const long O_VERIFY; -extern const long O_WRONLY; +extern const unsigned O_ACCMODE; +extern const unsigned O_APPEND; +extern const unsigned O_ASYNC; +extern const unsigned O_CLOEXEC; +extern const unsigned O_CREAT; +extern const unsigned O_DIRECT; +extern const unsigned O_DIRECTORY; +extern const unsigned O_DSYNC; +extern const unsigned O_EXCL; +extern const unsigned O_EXEC; +extern const unsigned O_EXLOCK; +extern const unsigned O_LARGEFILE; +extern const unsigned O_NDELAY; +extern const unsigned O_NOATIME; +extern const unsigned O_NOCTTY; +extern const unsigned O_NOFOLLOW; +extern const unsigned O_NOFOLLOW_ANY; +extern const unsigned O_NONBLOCK; +extern const unsigned O_PATH; +extern const unsigned O_RANDOM; +extern const unsigned O_RDONLY; +extern const unsigned O_RDWR; +extern const unsigned O_RSYNC; +extern const unsigned O_SEARCH; +extern const unsigned O_SEQUENTIAL; +extern const unsigned O_SHLOCK; +extern const unsigned O_SPARSE; +extern const unsigned O_SYNC; +extern const unsigned O_TMPFILE; +extern const unsigned O_TRUNC; +extern const unsigned O_TTY_INIT; +extern const unsigned O_VERIFY; +extern const unsigned O_WRONLY; COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/sysv/syscalls.sh b/libc/sysv/syscalls.sh index 0b1b75675..3f637cf67 100755 --- a/libc/sysv/syscalls.sh +++ b/libc/sysv/syscalls.sh @@ -817,7 +817,6 @@ scall __acl_aclcheck_link 0xffffff1acfffffff globl scall __mac_syscall 0xfffffffff217dfff globl scall __acl_set_file 0xffffff15cfffffff globl scall __acl_delete_file 0xffffff15ffffffff globl -scall __syscall 0xfff0c6ffffffffff globl scall _umtx_op 0xffffff1c6fffffff globl scall __semwait_signal_nocancel 0xfffffffff21a7fff globl scall __old_semwait_signal_nocancel 0xfffffffff2173fff globl diff --git a/libc/sysv/systemfive.S b/libc/sysv/systemfive.S index f1ddd4f68..f2b5f9bca 100644 --- a/libc/sysv/systemfive.S +++ b/libc/sysv/systemfive.S @@ -102,6 +102,8 @@ __hostos: __systemfive: .quad 0 .endobj __systemfive,globl,hidden +__pid: .quad 0 + .endobj __pid,globl,hidden .previous .privileged @@ -310,6 +312,18 @@ _init_systemfive_magnums: pop %rbx // 𝑠𝑙𝑖𝑑𝑒 .endfn _init_systemfive_magnums +#if SupportsSystemv() +_init_systemfive_pid: + ezlea __hostos,cx + mov (%rcx),%al + mov (%rdi),%eax + testb $WINDOWS|METAL,(%rcx) + jnz 1f + mov __NR_getpid,%eax + syscall +1: stosq + .endfn _init_systemfive_pid +#endif #if SupportsSystemv() && !defined(TINY) _init_systemfive_stack: # determinism ftw! #if SupportsWindows() || SupportsMetal() diff --git a/libc/testlib/leaks.c b/libc/testlib/leaks.c index 78f51b2ed..f6c87aca3 100644 --- a/libc/testlib/leaks.c +++ b/libc/testlib/leaks.c @@ -18,12 +18,14 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/bits/bits.h" #include "libc/intrin/asan.internal.h" -#include "libc/log/libfatal.internal.h" +#include "libc/intrin/kprintf.h" #include "libc/runtime/internal.h" #include "libc/runtime/memtrack.internal.h" #include "libc/runtime/runtime.h" #include "libc/testlib/testlib.h" +STATIC_YOINK("__get_symbol_by_addr"); + static bool once; static bool hasleaks; @@ -43,14 +45,14 @@ static noasan void OnMemory(void *x, void *y, size_t n, void *a) { static int i; if (n) { if (++i < 20) { - __printf("%p %,d bytes", x, n); + kprintf("%p %,d bytes", x, n); if (IsAsan()) { __asan_print_trace(x); } - __printf("\n"); + kprintf("\n"); } if (i == 20) { - __printf("etc. etc.\n"); + kprintf("etc. etc.\n"); } } } @@ -70,7 +72,7 @@ static noasan bool HasLeaks(void) { noasan void testlib_checkformemoryleaks(void) { struct mallinfo mi; if (!cmpxchg(&once, false, true)) { - __printf("testlib_checkformemoryleaks() may only be called once\n"); + kprintf("testlib_checkformemoryleaks() may only be called once\n"); exit(1); } __cxa_finalize(0); @@ -81,23 +83,23 @@ noasan void testlib_checkformemoryleaks(void) { malloc_trim(0); if (HasLeaks()) { mi = mallinfo(); - __printf("\n" - "UNFREED MEMORY\n" - "%s\n" - "max allocated space %,*d\n" - "total allocated space %,*d\n" - "total free space %,*d\n" - "releasable space %,*d\n" - "mmaped space %,*d\n" - "non-mmapped space %,*d\n" - "\n", - __argv[0], 16l, mi.usmblks, 16l, mi.uordblks, 16l, mi.fordblks, - 16l, mi.hblkhd, 16l, mi.keepcost, 16l, mi.arena); + kprintf("\n" + "UNFREED MEMORY\n" + "%s\n" + "max allocated space %,*d\n" + "total allocated space %,*d\n" + "total free space %,*d\n" + "releasable space %,*d\n" + "mmaped space %,*d\n" + "non-mmapped space %,*d\n" + "\n", + __argv[0], 16l, mi.usmblks, 16l, mi.uordblks, 16l, mi.fordblks, 16l, + mi.hblkhd, 16l, mi.keepcost, 16l, mi.arena); if (!IsAsan()) { - __printf("# NOTE: Use `make -j8 MODE=dbg` for malloc() backtraces\n"); + kprintf("# NOTE: Use `make -j8 MODE=dbg` for malloc() backtraces\n"); } malloc_inspect_all(OnMemory, 0); - __printf("\n"); + kprintf("\n"); PrintMemoryIntervals(2, &_mmi); /* PrintSystemMappings(2); */ /* PrintGarbage(); */ diff --git a/libc/testlib/quota.c b/libc/testlib/quota.c index a9ff4bcbe..3386fcdd7 100644 --- a/libc/testlib/quota.c +++ b/libc/testlib/quota.c @@ -20,6 +20,7 @@ #include "libc/calls/calls.h" #include "libc/calls/sigbits.h" #include "libc/errno.h" +#include "libc/intrin/kprintf.h" #include "libc/log/internal.h" #include "libc/log/libfatal.internal.h" #include "libc/log/log.h" @@ -45,7 +46,7 @@ static relegated void DieBecauseOfQuota(int rc, const char *message) { char hostname[32]; __stpcpy(hostname, "unknown"); gethostname(hostname, sizeof(hostname)); - __printf("%s on %s pid %d\n", message, hostname, (long)__getpid()); + kprintf("%s on %s pid %d\n", message, hostname, (long)__getpid()); PrintBacktraceUsingSymbols(2, 0, GetSymbolTable()); exit(rc); } @@ -68,32 +69,34 @@ relegated void __oom_hook(size_t request) { e = errno; toto = CountMappedBytes(); stats = dlmalloc_stats(g_dlmalloc); - __printf("\n\nWE REQUIRE MORE VESPENE GAS"); - if (e != ENOMEM) __printf(" (%s)", strerror(e)); - __printf("\n" - "mmap last request = %d\n" - "mmapped system bytes = %d\n" - "malloc max system bytes = %d\n" - "malloc system bytes = %d\n" - "malloc in use bytes = %d\n" - "\n", - request, toto, stats.maxfp, stats.fp, stats.used); + kprintf("\n\nWE REQUIRE MORE VESPENE GAS"); + if (e != ENOMEM) kprintf(" (%s)", strerror(e)); + kprintf("\n" + "mmap last request = %'ld\n" + "mmapped system bytes = %'ld\n" + "malloc max system bytes = %'ld\n" + "malloc system bytes = %'ld\n" + "malloc in use bytes = %'ld\n" + "\n", + request, toto, stats.maxfp, stats.fp, stats.used); if (IsRunningUnderMake()) { newlim = toto + request; newlim += newlim >> 1; newlim = roundup2pow(newlim); - __printf("FIX CODE OR TUNE QUOTA += -M%dm\n", newlim / (1024 * 1024)); + kprintf("FIX CODE OR TUNE QUOTA += -M%dm\n", newlim / (1024 * 1024)); } - __printf("\n"); + kprintf("\n"); PrintMemoryIntervals(2, &_mmi); - __printf("\nTHE STRAW THAT BROKE THE CAMEL'S BACK\n"); + kprintf("\nTHE STRAW THAT BROKE THE CAMEL'S BACK\n"); PrintBacktraceUsingSymbols(2, 0, GetSymbolTable()); PrintSystemMappings(2); exit(42); } static textstartup void InstallQuotaHandlers(void) { + int e; struct sigaction sa; + e = errno; sa.sa_flags = 0; sa.sa_handler = OnXcpu; sigemptyset(&sa.sa_mask); @@ -101,6 +104,7 @@ static textstartup void InstallQuotaHandlers(void) { sa.sa_handler = OnXfsz; sigaction(SIGXFSZ, &sa, 0); GetSymbolTable(); /* for effect in case we oom */ + errno = e; } const void *const testlib_quota_handlers[] initarray = { diff --git a/libc/testlib/showerror.c b/libc/testlib/showerror.c index 51897d05f..485da8ac6 100644 --- a/libc/testlib/showerror.c +++ b/libc/testlib/showerror.c @@ -18,6 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/bits/safemacros.internal.h" #include "libc/fmt/fmt.h" +#include "libc/intrin/kprintf.h" #include "libc/log/color.internal.h" #include "libc/log/internal.h" #include "libc/log/libfatal.internal.h" @@ -37,15 +38,15 @@ testonly void testlib_showerror(const char *file, int line, const char *func, /* TODO(jart): Pay off tech debt re duplication */ __getpid(); /* make strace easier to read */ __getpid(); - __printf("%serror%s%s:%s:%d%s: %s() in %s(%s)\n" - "\t%s\n" - "\t\tneed %s %s\n" - "\t\t got %s\n" - "\t%s%s\n" - "\t%s%s\n", - RED2, UNBOLD, BLUE1, file, (long)line, RESET, method, func, - g_fixturename, code, v1, symbol, v2, SUBTLE, strerror(errno), - program_executable_name, RESET); + kprintf("%serror%s%s:%s:%d%s: %s() in %s(%s)\n" + "\t%s\n" + "\t\tneed %s %s\n" + "\t\t got %s\n" + "\t%s%s\n" + "\t%s%s\n", + RED2, UNBOLD, BLUE1, file, (long)line, RESET, method, func, + g_fixturename, code, v1, symbol, v2, SUBTLE, strerror(errno), + program_executable_name, RESET); free_s(&v1); free_s(&v2); } @@ -60,31 +61,31 @@ testonly void testlib_showerror_(int line, const char *wantcode, e = errno; __getpid(); __getpid(); - __printf("%serror%s:%s%s:%d%s: %s(%s)\n" - "\t%s(%s, %s)\n", - RED2, UNBOLD, BLUE1, testlib_showerror_file, line, RESET, - testlib_showerror_func, g_fixturename, testlib_showerror_macro, - wantcode, gotcode); + kprintf("%serror%s:%s%s:%d%s: %s(%s)\n" + "\t%s(%s, %s)\n", + RED2, UNBOLD, BLUE1, testlib_showerror_file, line, RESET, + testlib_showerror_func, g_fixturename, testlib_showerror_macro, + wantcode, gotcode); if (wantcode) { - __printf("\t\tneed %s %s\n" - "\t\t got %s\n", - FREED_want, testlib_showerror_symbol, FREED_got); + kprintf("\t\tneed %s %s\n" + "\t\t got %s\n", + FREED_want, testlib_showerror_symbol, FREED_got); } else { - __printf("\t\t→ %s%s\n", testlib_showerror_symbol, FREED_want); + kprintf("\t\t→ %s%s\n", testlib_showerror_symbol, FREED_want); } if (!isempty(fmt)) { - __printf("\t"); + kprintf("\t"); va_start(va, fmt); - __vprintf(fmt, va); + kvprintf(fmt, va); va_end(va); - __printf("\n"); + kprintf("\n"); } __stpcpy(hostname, "unknown"); gethostname(hostname, sizeof(hostname)); - __printf("\t%s%s%s\n" - "\t%s%s @ %s%s\n", - SUBTLE, strerror(e), RESET, SUBTLE, program_invocation_name, - hostname, RESET); + kprintf("\t%s%s%s\n" + "\t%s%s @ %s%s\n", + SUBTLE, strerror(e), RESET, SUBTLE, program_invocation_name, hostname, + RESET); free_s(&FREED_want); free_s(&FREED_got); ++g_testlib_failed; diff --git a/libc/zipos/zipos.internal.h b/libc/zipos/zipos.internal.h index 89c8c8f26..e659160ba 100644 --- a/libc/zipos/zipos.internal.h +++ b/libc/zipos/zipos.internal.h @@ -6,7 +6,7 @@ COSMOPOLITAN_C_START_ #if DEBUGSYS -#define ZTRACE(FMT, ...) __printf("ZIP: " FMT "\n", ##__VA_ARGS__) +#define ZTRACE(FMT, ...) kprintf("ZIP: " FMT "\n", ##__VA_ARGS__) #else #define ZTRACE(FMT, ...) (void)0 #endif diff --git a/test/libc/fmt/strerror_r_test.c b/test/libc/fmt/strerror_r_test.c index 98e78a8d2..1f8552188 100644 --- a/test/libc/fmt/strerror_r_test.c +++ b/test/libc/fmt/strerror_r_test.c @@ -30,55 +30,25 @@ */ TEST(strerror, e2big) { - if (IsTiny()) { - EXPECT_STARTSWITH("E2BIG", strerror(E2BIG)); - } else { - EXPECT_STARTSWITH("E2BIG[Arg list too long]", strerror(E2BIG)); - } + EXPECT_STARTSWITH("E2BIG", strerror(E2BIG)); } TEST(strerror, enosys) { - if (IsTiny()) { - EXPECT_STARTSWITH("ENOSYS", strerror(ENOSYS)); - } else { - EXPECT_STARTSWITH("ENOSYS[Function not implemented]", strerror(ENOSYS)); - } + EXPECT_STARTSWITH("ENOSYS", strerror(ENOSYS)); } TEST(strerror, einval) { - if (IsTiny()) { - EXPECT_STARTSWITH("EINVAL", strerror(EINVAL)); - } else { - EXPECT_STARTSWITH("EINVAL[Invalid argument]", strerror(EINVAL)); - } + EXPECT_STARTSWITH("EINVAL", strerror(EINVAL)); } TEST(strerror, symbolizingTheseNumbersAsErrorsIsHeresyInUnixStyle) { - if (IsTiny()) { - EXPECT_STARTSWITH("EUNKNOWN", strerror(0)); - } else { - EXPECT_STARTSWITH("EUNKNOWN[No error information]", strerror(0)); - } - if (IsTiny()) { - EXPECT_STARTSWITH("EUNKNOWN", strerror(-1)); - } else { - EXPECT_STARTSWITH("EUNKNOWN[No error information]", strerror(-1)); - } + EXPECT_STARTSWITH("EUNKNOWN", strerror(0)); } TEST(strerror, enotconn_orLinkerIsntUsingLocaleC_orCodeIsOutOfSync) { - if (IsTiny()) { - EXPECT_STARTSWITH("ENOTCONN", strerror(ENOTCONN)); - } else { - EXPECT_STARTSWITH("ENOTCONN[Transport endpoint is not connected]", - strerror(ENOTCONN)); - } + EXPECT_STARTSWITH("ENOTCONN", strerror(ENOTCONN)); } TEST(strerror, exfull_orLinkerIsntUsingLocaleC_orCodeIsOutOfSync) { - if (IsTiny()) { - EXPECT_STARTSWITH("ETXTBSY", strerror(ETXTBSY)); - } else { - EXPECT_STARTSWITH("ETXTBSY[Text file busy]", strerror(ETXTBSY)); - } + EXPECT_STARTSWITH("ETXTBSY", strerror(ETXTBSY)); } diff --git a/test/libc/intrin/kprintf_test.c b/test/libc/intrin/kprintf_test.c new file mode 100644 index 000000000..389d0afb4 --- /dev/null +++ b/test/libc/intrin/kprintf_test.c @@ -0,0 +1,372 @@ +/*-*- 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/bits/bits.h" +#include "libc/calls/calls.h" +#include "libc/errno.h" +#include "libc/fmt/fmt.h" +#include "libc/intrin/kprintf.h" +#include "libc/limits.h" +#include "libc/log/libfatal.internal.h" +#include "libc/macros.internal.h" +#include "libc/rand/rand.h" +#include "libc/runtime/memtrack.internal.h" +#include "libc/runtime/runtime.h" +#include "libc/str/str.h" +#include "libc/sysv/consts/map.h" +#include "libc/sysv/consts/prot.h" +#include "libc/testlib/ezbench.h" +#include "libc/testlib/testlib.h" + +#define S(x) ((uintptr_t)(x)) + +/** + * returns random bytes that don't have exclamation mark + * since that would disable memory safety in the fuzzing + */ +static uint64_t Rando(void) { + uint64_t x; + do x = vigna(); + while (((x ^ READ64LE("!!!!!!!!")) - 0x0101010101010101) & + ~(x ^ READ64LE("!!!!!!!!")) & 0x8080808080808080); + return x; +} + +static const struct { + const char *want; + const char *fmt; + uintptr_t arg1; + uintptr_t arg2; +} V[] = { + {"!!WONTFMT", (const char *)31337, 123}, // + {"!!31337", "%s", 0x31337}, // + {"!!1", "%#s", 1}, // + {"!!feff800000031337", "%s", 0xfeff800000031337ull}, // + {"!!ffff800000031337", "%s", 0xffff800000031337ull}, // + {"123", "%d", 123}, // + {"2147483647", "%d", INT_MAX}, // + {"-2147483648", "%d", INT_MIN}, // + {"9223372036854775807", "%ld", LONG_MAX}, // + {"-9223372036854775808", "%ld", LONG_MIN}, // + {"9'223'372'036'854'775'807", "%'ld", LONG_MAX}, // + {"-9'223'372'036'854'775'808", "%'ld", LONG_MIN}, // + {"9,223,372,036,854,775,807", "%,ld", LONG_MAX}, // + {"-9,223,372,036,854,775,808", "%,ld", LONG_MIN}, // + {"9_223_372_036_854_775_807", "%_ld", LONG_MAX}, // + {"-9_223_372_036_854_775_808", "%_ld", LONG_MIN}, // + {"true", "%hhhd", 0xffff}, // + {"true", "%hhhd", 0xff00}, // + {"false", "%hhhd"}, // + {"fa", "%hhh.2d"}, // + {" 0x001337", "%#010.6x", 0x1337}, // + {"0x001337 ", "%#-010.6x", 0x1337}, // + {"0x1337 ", "%#-010.2x", 0x1337}, // + {" 0x1337", "%#010.2x", 0x1337}, // + {"0000001337", "%010d", 1337}, // + {"+000001337", "%+010d", 1337}, // + {" 001337", "%010.6d", 1337}, // + {" +001337", "%+010.6d", 1337}, // + {" 001337", "%010.6x", 0x1337}, // + {" 1337", "%010.2x", 0x1337}, // + {"1337 ", "%-010d", 1337}, // + {"001337 ", "%-010.6d", 1337}, // + {"+1337 ", "%+-010d", 1337}, // + {"+001337 ", "%+-010.6d", 1337}, // + {"001337 ", "%-010.6x", 0x1337}, // + {"1337 ", "%-010.2x", 0x1337}, // + {"000001'337", "%'010d", 1337}, // + {" 1337", "%*d", 10, 1337}, // + {"1337 ", "%*d", -10, 1337}, // + {"0", "%#x"}, // + {"0", "%#o"}, // + {"0", "%#b"}, // + {"0", "%#d"}, // + {"0", "%p"}, // + {"-1", "%p", S(MAP_FAILED)}, // + {"00000000", "%#.8x"}, // + {"00000000", "%#.8b"}, // + {"00000000", "%#.8o"}, // + {" 123", "%5d", 123}, // + {" -123", "%5d", -123}, // + {" 123", "%*d", 5, 123}, // + {" -123", "%*d", 5, -123}, // + {"123 ", "%-5d", 123}, // + {"-123 ", "%-5d", -123}, // + {" +123", "%+5d", 123}, // + {"00123", "%05d", 123}, // + {"-0123", "%05d", -123}, // + {" 0", "%5d"}, // + {" +0", "%+5d"}, // + {"00000", "%05d"}, // + {" deadbeef", "%20x", 0xdeadbeef}, // + {" 0xdeadbeef", "%20p", 0xdeadbeef}, // + {"101", "%b", 0b101}, // + {"123", "%x", 0x123}, // + {"deadbeef", "%x", 0xdeadbeef}, // + {"DEADBEEF", "%X", 0xdeadbeef}, // + {"0", "%hd", INT_MIN}, // + {"123", "%o", 0123}, // + {"+0", "%+d"}, // + {"+123", "%+d", 123}, // + {"-123", "%+d", -123}, // + {" 0", "% d"}, // + {" 123", "% d", 123}, // + {"-123", "% d", -123}, // + {"x", "%c", 'x'}, // + {"☺", "%hc", u'☺'}, // + {"☺", "%lc", L'☺'}, // + {"☺", "%C", L'☺'}, // + {"0x31337", "%p", 0x31337}, // + {"0xffff800000031337", "%p", 0xffff800000031337ull}, // + {"0xfeff800000031337", "%p", 0xfeff800000031337ull}, // + {"65535", "%hu", 0xffffffffu}, // + {"0", "%hu", 0x80000000u}, // + {"123", "%hd", 123}, // + {"32767", "%hd", SHRT_MAX}, // + {"-32768", "%hd", SHRT_MIN}, // + {"-1", "%hhd", 0xffff}, // + {"-128", "%hhd", 0xff80}, // + {"255", "%hhu", 0xffffffffu}, // + {"'x'", "%#c", 'x'}, // + {"u'☺'", "%#hc", u'☺'}, // + {"L'☺'", "%#lc", L'☺'}, // + {"L'☺'", "%#C", L'☺'}, // + {"L'\\''", "%#C", L'\''}, // + {"hello world\n", "%s", S("hello world\n")}, // + {"☺☻♥♦♣♠!\n", "%s", S("☺☻♥♦♣♠!\n")}, // + {"␁", "%s", S("\1")}, // + {"\1", "%.*s", 1, S("\1")}, // + {"\\001", "%'s", S("\1")}, // + {"\"\\001\"", "%#s", S("\1")}, // + {"", "%.*s", 0}, // + {"☺☻♥♦♣♠!", "%hhs", S("\1\2\3\4\5\6!")}, // + {"", "% s", S("")}, // + {" a", "% s", S("a")}, // + {"", "% .*s", 0, S("a")}, // + {"", "% s"}, // + {"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷", "%hs", S(u"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷")}, // + {"☺☻♥♦♣♠!", "%ls", S(L"☺☻♥♦♣♠!")}, // + {"☺☻♥♦♣♠!\n", "%S", S(L"☺☻♥♦♣♠!\n")}, // + {"eeeeeee ", "%10s", S("eeeeeee")}, // + {"hello", "%.*s", 5, S("hello world")}, // + {"þell", "%.*s", 5, S("þello world")}, // + {"þello", "%.*hs", 5, S(u"þello world")}, // + {"þeeeeee ", "%10s", S("þeeeeee")}, // + {"☺☻♥♦♣♠! ", "%10s", S("☺☻♥♦♣♠!")}, // + {"☺☻♥♦♣♠ ", "%10hs", S(u"☺☻♥♦♣♠")}, // + {"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷 ", "%10hs", S(u"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷")}, // + {"☺☻♥♦♣♠! ", "%10ls", S(L"☺☻♥♦♣♠!")}, // + {"\"xx\"", "%#s", S("xx")}, // + {"u\"☺☺\"", "%#hs", S(u"☺☺")}, // + {"L\"☺☺\"", "%#ls", S(L"☺☺")}, // + {"L\"☺☺\"", "%#S", S(L"☺☺")}, // + {"\"\\\\\\\"\\177\"", "%#s", S("\\\"\177")}, // + {"%%", "%%%%"}, // + {"%", "%.%"}, // + {"=", "%="}, // +}; + +TEST(ksnprintf, test) { + char b[48], g[48]; + size_t i, j, n, rc; + rngset(g, sizeof(g), 0, 0); + for (i = 0; i < ARRAYLEN(V); ++i) { + bzero(b, 48); + n = strlen(V[i].want); + rc = ksnprintf(b, 48, V[i].fmt, V[i].arg1, V[i].arg2); + EXPECT_EQ(n, rc, "ksnprintf(\"%s\", %#lx, %#lx) → %zu ≠ %zu", V[i].fmt, + V[i].arg1, V[i].arg2, rc, n); + EXPECT_STREQ(V[i].want, b); + memcpy(b, g, 48); + for (j = 0; j < 40; ++j) { + rc = ksnprintf(b, 0, V[i].fmt, V[i].arg1, V[i].arg2); + ASSERT_EQ(n, rc, "ksnprintf(b, %zu, \"%s\", %#lx, %#lx) → %zu ≠ %zu", j, + V[i].fmt, V[i].arg1, V[i].arg2, rc, n); + ASSERT_EQ(READ64LE(g + j), READ64LE(b + j), + "ksnprintf(b, %zu, \"%s\", %#lx, %#lx) → buffer overrun", j, + V[i].fmt, V[i].arg1, V[i].arg2); + } + } +} + +TEST(ksnprintf, fuzzTheUnbreakable) { + int e; + size_t i; + uint64_t x; + char *f, b[32]; + _Alignas(PAGESIZE) static const char weasel[PAGESIZE]; + asm("mov\t%1,%0" : "=r"(f) : "g"(weasel)); + EXPECT_SYS(0, 0, mprotect(f, PAGESIZE, PROT_READ | PROT_WRITE)); + strcpy(f, "hello %s\n"); + EXPECT_EQ(12, ksnprintf(b, sizeof(b), f, "world")); + EXPECT_STREQ("hello world\n", b); + for (i = 0; i < 30000; ++i) { + x = Rando(); + memcpy(f, &x, sizeof(x)); + x = Rando(); + memcpy(f + 8, &x, sizeof(x)); + f[Rando() & 15] = '%'; + ksnprintf(b, sizeof(b), f, vigna(), vigna(), vigna()); + } + EXPECT_SYS(0, 0, mprotect(f, PAGESIZE, PROT_READ)); +} + +TEST(kprintf, testFailure_wontClobberErrnoAndBypassesSystemCallSupport) { + int n; +#if 0 + ASSERT_EQ(0, errno); /* xxx: todo(jart) */ +#else + errno = 0; +#endif + EXPECT_SYS(0, 3, dup(2)); + EXPECT_SYS(0, 0, close(2)); + n = g_syscount; + kprintf("hello%n"); + EXPECT_EQ(n, g_syscount); + EXPECT_EQ(0, errno); + EXPECT_SYS(0, 2, dup2(3, 2)); + EXPECT_SYS(0, 0, close(3)); +} + +TEST(ksnprintf, testy) { + char b[32]; + EXPECT_EQ(3, ksnprintf(b, 32, "%#s", 1)); + EXPECT_STREQ("!!1", b); +} + +TEST(ksnprintf, testNonTextFmt_wontFormat) { + char b[32]; + char variable_format_string[16] = "%s"; + EXPECT_EQ(9, ksnprintf(b, 32, variable_format_string, NULL)); + EXPECT_STREQ("!!WONTFMT", b); +} + +TEST(ksnprintf, testMisalignedPointer_wontFormat) { + char b[32]; + const char16_t *s = u"hello"; + ksnprintf(b, 32, "%hs", (char *)s + 1); + EXPECT_STARTSWITH("!!", b); +} + +TEST(ksnprintf, testUnterminatedOverrun_truncatesAtPageBoundary) { + char *m; + char b[32]; + m = memset(mapanon(FRAMESIZE * 2), 1, FRAMESIZE); + EXPECT_SYS(0, 0, munmap(m + FRAMESIZE, FRAMESIZE)); + EXPECT_EQ(12, ksnprintf(b, 32, "%'s", m + FRAMESIZE - 3)); + EXPECT_STREQ("\\001\\001\\001", b); + EXPECT_SYS(0, 0, munmap(m, FRAMESIZE)); +} + +TEST(ksnprintf, testEmptyBuffer_determinesTrueLength) { + EXPECT_EQ(5, ksnprintf(0, 0, "hello")); +} + +TEST(ksnprintf, testFormatOnly_copiesString) { + char b[6]; + EXPECT_EQ(5, ksnprintf(b, 6, "hello")); + EXPECT_STREQ("hello", b); +} + +TEST(ksnprintf, testOneChar_justNulTerminates) { + char b[2] = {1, 2}; + EXPECT_EQ(3, ksnprintf(b, 1, "%d", 123)); + EXPECT_EQ(0, b[0]); + EXPECT_EQ(2, b[1]); +} + +TEST(kprintf, testStringUcs2) { + char b[32]; + EXPECT_EQ(21, ksnprintf(b, 32, "%hs", u"þ☺☻♥♦♣♠!")); + EXPECT_EQ(0xc3, b[0] & 255); + EXPECT_EQ(0xbe, b[1] & 255); + EXPECT_EQ(0xe2, b[2] & 255); + EXPECT_EQ(0x98, b[3] & 255); + EXPECT_EQ(0xba, b[4] & 255); + EXPECT_STREQ("þ☺☻♥♦♣♠!", b); +} + +TEST(kprintf, testTruncate_addsDotsAndReturnsTrueLength) { + char b[15]; + EXPECT_EQ(10, ksnprintf(b, 15, "%p", 0xdeadbeef)); + EXPECT_STREQ("0xdeadbeef", b); + EXPECT_EQ(10, ksnprintf(b, 10, "%p", 0xdeadbeef)); + EXPECT_STREQ("0xdead...", b); +} + +TEST(kprintf, testTruncate_preservesNewlineFromEndOfFormatString) { + char b[14]; + EXPECT_EQ(11, ksnprintf(b, 10, "%p\n", 0xdeadbeef)); + EXPECT_STREQ("0xdea...\n", b); +} + +TEST(ksnprintf, testTruncate_doesntBreakApartCharacters) { + char b[5]; + ASSERT_EQ(6, ksnprintf(b, 5, "☻☻")); + ASSERT_STREQ("....", b); +} + +TEST(ksnprintf, badUtf16) { + size_t i; + char b[16]; + static const struct { + const char *want; + const char *fmt; + char16_t arg[16]; + } V[] = { + {"� ", "%10hs", {0xd800}}, + {"� ", "%10hs", {0xdc00}}, + {"�� ", "%10hs", {0xd800, 0xd800}}, + {"�� ", "%10hs", {0xdc00, 0xdc00}}, + }; + for (i = 0; i < ARRAYLEN(V); ++i) { + EXPECT_EQ(strlen(V[i].want), ksnprintf(b, 16, V[i].fmt, V[i].arg)); + EXPECT_STREQ(V[i].want, b); + } +} + +BENCH(printf, bench) { + char b[128]; + int snprintf_(char *, size_t, const char *, ...) asm("snprintf"); + EZBENCH2("ksnprintf fmt", donothing, + ksnprintf(b, 128, + "hello world\nhello world\nhello world\nhello world\n")); + EZBENCH2("snprintf fmt", donothing, + snprintf_(b, 128, + "hello world\nhello world\nhello world\nhello world\n")); + EZBENCH2("ksnprintf str", donothing, + ksnprintf(b, 128, "%s\n", "hello world")); + EZBENCH2("snprintf str", donothing, + snprintf_(b, 128, "%s\n", "hello world")); + EZBENCH2("ksnprintf utf8", donothing, + ksnprintf(b, 128, "%s\n", "天地玄黄宇宙洪荒天地玄黄宇宙洪荒")); + EZBENCH2("snprintf utf8", donothing, + snprintf_(b, 128, "%s\n", "天地玄黄宇宙洪荒天地玄黄宇宙洪荒")); + EZBENCH2("ksnprintf chinese", donothing, + ksnprintf(b, 128, "%hs\n", u"天地玄黄宇宙洪荒")); + EZBENCH2("snprintf chinese", donothing, + snprintf_(b, 128, "%hs\n", u"天地玄黄宇宙洪荒")); + EZBENCH2("ksnprintf astral", donothing, + ksnprintf(b, 128, "%hs\n", u"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷")); + EZBENCH2("snprintf astral", donothing, + snprintf_(b, 128, "%hs\n", u"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷")); + EZBENCH2("ksnprintf long", donothing, ksnprintf(b, 128, "%ld", LONG_MAX)); + EZBENCH2("snprintf long", donothing, snprintf_(b, 128, "%ld", LONG_MAX)); + EZBENCH2("ksnprintf thou", donothing, ksnprintf(b, 128, "%'ld", LONG_MAX)); + EZBENCH2("snprintf thou", donothing, snprintf_(b, 128, "%'ld", LONG_MAX)); +} diff --git a/test/libc/intrin/test.mk b/test/libc/intrin/test.mk index b8c23624a..c29c57784 100644 --- a/test/libc/intrin/test.mk +++ b/test/libc/intrin/test.mk @@ -24,7 +24,6 @@ TEST_LIBC_INTRIN_CHECKS = \ TEST_LIBC_INTRIN_DIRECTDEPS = \ LIBC_CALLS \ - LIBC_STDIO \ LIBC_FMT \ LIBC_INTRIN \ LIBC_LOG \ @@ -32,10 +31,13 @@ TEST_LIBC_INTRIN_DIRECTDEPS = \ LIBC_NEXGEN32E \ LIBC_RAND \ LIBC_RUNTIME \ + LIBC_STDIO \ LIBC_STR \ LIBC_STUBS \ + LIBC_SYSV \ LIBC_TESTLIB \ LIBC_TINYMATH \ + LIBC_UNICODE \ LIBC_X \ TOOL_VIZ_LIB diff --git a/test/libc/nexgen32e/gclongjmp_test.c b/test/libc/nexgen32e/gclongjmp_test.c index a39227ef2..e74f05d66 100644 --- a/test/libc/nexgen32e/gclongjmp_test.c +++ b/test/libc/nexgen32e/gclongjmp_test.c @@ -62,7 +62,7 @@ void (*Bp)(void(void)) = B; void (*Cp)(void) = C; TEST(gclongjmp, test) { - PrintGarbage(); + if (0) PrintGarbage(); if (!setjmp(jb)) { Ap(Cp, Bp); abort(); diff --git a/test/libc/stdio/getdelim_test.c b/test/libc/stdio/getdelim_test.c index 9f37d5cd1..60700469c 100644 --- a/test/libc/stdio/getdelim_test.c +++ b/test/libc/stdio/getdelim_test.c @@ -18,6 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/assert.h" #include "libc/bits/bits.h" +#include "libc/intrin/kprintf.h" #include "libc/log/libfatal.internal.h" #include "libc/mem/mem.h" #include "libc/runtime/symbols.internal.h" @@ -98,7 +99,6 @@ void ReadHyperionLines(void) { ASSERT_NE(NULL, (f = fopen("hyperion.txt", "r"))); int i = 0; for (;;) { - __printf("i=%d\n", i++); rc = getline(&line, &linesize, f); if (rc == -1) break; data = xrealloc(data, size + rc); diff --git a/third_party/linenoise/linenoise.c b/third_party/linenoise/linenoise.c index 2d0092d5f..cdfb4789d 100644 --- a/third_party/linenoise/linenoise.c +++ b/third_party/linenoise/linenoise.c @@ -131,7 +131,6 @@ #include "libc/errno.h" #include "libc/fmt/conv.h" #include "libc/intrin/asan.internal.h" -#include "libc/log/libfatal.internal.h" #include "libc/log/log.h" #include "libc/macros.internal.h" #include "libc/mem/mem.h" @@ -250,6 +249,7 @@ static char maskmode; static char ispaused; static char iscapital; static int historylen; +extern bool __replmode; static struct linenoiseRing ring; static struct sigaction orig_int; static struct sigaction orig_quit; @@ -349,6 +349,51 @@ static size_t GetFdSize(int fd) { return st.st_size; } +static char IsCharDev(int fd) { + struct stat st; + st.st_mode = 0; + fstat(fd, &st); + return (st.st_mode & S_IFMT) == S_IFCHR; +} + +static int linenoiseIsUnsupportedTerm(void) { + int i; + char *term; + static char once, res; + if (!once) { + if ((term = getenv("TERM"))) { + for (i = 0; i < sizeof(kUnsupported) / sizeof(*kUnsupported); i++) { + if (!strcasecmp(term, kUnsupported[i])) { + res = 1; + break; + } + } + } + once = 1; + } + return res; +} + +static int linenoiseIsTerminal(void) { + static int once, res; + if (!once) { + res = isatty(fileno(stdin)) && isatty(fileno(stdout)) && + !linenoiseIsUnsupportedTerm(); + once = 1; + } + return res; +} + +static int linenoiseIsTeletype(void) { + static int once, res; + if (!once) { + res = linenoiseIsTerminal() || + (IsCharDev(fileno(stdin)) && IsCharDev(fileno(stdout))); + once = 1; + } + return res; +} + static char *GetLine(FILE *f) { ssize_t rc; char *p = 0; @@ -420,6 +465,7 @@ static char *FormatUnsigned(char *p, unsigned x) { } static char HasPendingInput(int fd) { + if (IsWindows()) return 0; return poll((struct pollfd[]){{fd, POLLIN}}, 1, 0) == 1; } @@ -557,24 +603,6 @@ static void abFree(struct abuf *a) { free(a->b); } -static int linenoiseIsUnsupportedTerm(void) { - int i; - char *term; - static char once, res; - if (!once) { - if ((term = getenv("TERM"))) { - for (i = 0; i < sizeof(kUnsupported) / sizeof(*kUnsupported); i++) { - if (!strcasecmp(term, kUnsupported[i])) { - res = 1; - break; - } - } - } - once = 1; - } - return res; -} - static void linenoiseUnpause(int fd) { if (ispaused) { tcflow(fd, TCOON); @@ -1162,9 +1190,11 @@ StartOver: rune = GetUtf8(buf + i, len - i); if (x && x + rune.n > xn) { if (cy >= 0) ++cy; - abAppends(&ab, "\033[K" /* clear line forward */ - "\r" /* start of line */ - "\n"); /* cursor down unclamped */ + if (x < xn) { + abAppends(&ab, "\033[K"); /* clear line forward */ + } + abAppends(&ab, "\r" /* start of line */ + "\n"); /* cursor down unclamped */ ++rows; x = 0; } @@ -2010,6 +2040,26 @@ char *linenoiseRaw(const char *prompt, int infd, int outfd) { } } +static int linenoiseFallback(const char *prompt, char **res) { + if (prompt && *prompt && + (strchr(prompt, '\n') || strchr(prompt, '\t') || + strchr(prompt + 1, '\r'))) { + errno = EINVAL; + *res = 0; + return 1; + } + if (!linenoiseIsTerminal()) { + if (prompt && *prompt && linenoiseIsTeletype()) { + fputs(prompt, stdout); + fflush(stdout); + } + *res = GetLine(stdin); + return 1; + } else { + return 0; + } +} + /** * Reads line intelligently. * @@ -2025,24 +2075,14 @@ char *linenoiseRaw(const char *prompt, int infd, int outfd) { * @return chomped allocated string of read line or null on eof/error */ char *linenoise(const char *prompt) { - if (prompt && *prompt && - (strchr(prompt, '\n') || strchr(prompt, '\t') || - strchr(prompt + 1, '\r'))) { - errno = EINVAL; - return 0; - } - if ((!isatty(fileno(stdin)) || !isatty(fileno(stdout)))) { - return GetLine(stdin); - } else if (linenoiseIsUnsupportedTerm()) { - if (prompt && *prompt) { - fputs(prompt, stdout); - fflush(stdout); - } - return GetLine(stdin); - } else { - fflush(stdout); - return linenoiseRaw(prompt, fileno(stdin), fileno(stdout)); - } + char *res; + if (linenoiseFallback(prompt, &res)) return res; + fflush(stdout); + fflush(stdout); + __replmode = true; + res = linenoiseRaw(prompt, fileno(stdin), fileno(stdout)); + __replmode = false; + return res; } /** @@ -2066,9 +2106,11 @@ char *linenoise(const char *prompt) { * @return chomped allocated string of read line or null on eof/error */ char *linenoiseWithHistory(const char *prompt, const char *prog) { - char *line; + char *line, *res; struct abuf path; const char *a, *b; + if (linenoiseFallback(prompt, &res)) return res; + fflush(stdout); abInit(&path); if (prog) { if (strchr(prog, '/') || strchr(prog, '.')) { diff --git a/third_party/mbedtls/sha256.c b/third_party/mbedtls/sha256.c index ef1e3f2f9..a623517e1 100644 --- a/third_party/mbedtls/sha256.c +++ b/third_party/mbedtls/sha256.c @@ -175,15 +175,17 @@ int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx, if( !IsTiny() || X86_NEED( SHA ) ) { - if( X86_HAVE( SHA ) ) + if( X86_HAVE( SHA ) && + X86_HAVE( SSE2 ) && + X86_HAVE( SSSE3 ) ) { if( IsAsan() ) __asan_verify( data, 64 ); sha256_transform_ni( ctx->state, data, 1 ); return( 0 ); } - if( X86_HAVE( BMI ) && - X86_HAVE( BMI2 ) && + if( X86_HAVE( BMI2 ) && + X86_HAVE( AVX ) && X86_HAVE( AVX2 ) ) { if( IsAsan() ) @@ -310,7 +312,10 @@ int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx, if( ilen >= 64 ) { - if( ( !IsTiny() || X86_NEED( SHA ) ) && X86_HAVE( SHA ) ) + if( !IsTiny() && + X86_HAVE( SHA ) && + X86_HAVE( SSE2 ) && + X86_HAVE( SSSE3 ) ) { if( IsAsan() ) __asan_verify( input, ilen ); diff --git a/third_party/python/Include/ezprint.h b/third_party/python/Include/ezprint.h index deb349781..ca8b3e841 100644 --- a/third_party/python/Include/ezprint.h +++ b/third_party/python/Include/ezprint.h @@ -1,7 +1,7 @@ #ifndef COSMOPOLITAN_THIRD_PARTY_PYTHON_INCLUDE_EZPRINT_H_ #define COSMOPOLITAN_THIRD_PARTY_PYTHON_INCLUDE_EZPRINT_H_ #include "libc/calls/calls.h" -#include "libc/log/libfatal.internal.h" +#include "libc/intrin/kprintf.h" #include "third_party/python/Include/abstract.h" #include "third_party/python/Include/bytesobject.h" #include "third_party/python/Include/pyerrors.h" @@ -11,24 +11,24 @@ COSMOPOLITAN_C_START_ static void EzPrint(PyObject *x, const char *s) { PyObject *u, *r, *t; - __printf("%s = ", s); + kprintf("%s = ", s); if (!s) { - __printf("NULL"); + kprintf("NULL"); } else { t = PyObject_Type(x); r = PyObject_Repr(t); u = PyUnicode_AsUTF8String(r); - __printf("%.*s ", PyBytes_GET_SIZE(u), PyBytes_AS_STRING(u)); + kprintf("%.*s ", PyBytes_GET_SIZE(u), PyBytes_AS_STRING(u)); Py_DECREF(u); Py_DECREF(r); Py_DECREF(t); r = PyObject_Repr(x); u = PyUnicode_AsUTF8String(r); - __printf("%.*s", PyBytes_GET_SIZE(u), PyBytes_AS_STRING(u)); + kprintf("%.*s", PyBytes_GET_SIZE(u), PyBytes_AS_STRING(u)); Py_DECREF(u); Py_DECREF(r); } - __printf("\n"); + kprintf("\n"); } #define EZPRINT(x) EzPrint(x, #x) diff --git a/third_party/python/Lib/test/support/__init__.py b/third_party/python/Lib/test/support/__init__.py index da08e991d..4a2c857f3 100644 --- a/third_party/python/Lib/test/support/__init__.py +++ b/third_party/python/Lib/test/support/__init__.py @@ -3,6 +3,7 @@ if __name__ != 'test.support': raise ImportError('support must be imported from the test package') +import cosmo import collections.abc import contextlib import datetime @@ -2043,9 +2044,10 @@ def run_unittest(*classes): def _check_docstrings(): """Just used to check if docstrings are enabled""" -MISSING_C_DOCSTRINGS = (check_impl_detail() and - sys.platform != 'win32' and - not sysconfig.get_config_var('WITH_DOC_STRINGS')) +MISSING_C_DOCSTRINGS = (cosmo.MODE.startswith('tiny') or + (check_impl_detail() and + sys.platform != 'win32' and + not sysconfig.get_config_var('WITH_DOC_STRINGS'))) HAVE_DOCSTRINGS = (_check_docstrings.__doc__ is not None and not MISSING_C_DOCSTRINGS) diff --git a/third_party/python/Lib/test/test_bz2.py b/third_party/python/Lib/test/test_bz2.py index 58d908499..7316317de 100644 --- a/third_party/python/Lib/test/test_bz2.py +++ b/third_party/python/Lib/test/test_bz2.py @@ -734,7 +734,7 @@ class BZ2DecompressorTest(BaseTest): with self.assertRaises(TypeError): pickle.dumps(BZ2Decompressor(), proto) - @unittest.skipIf(cosmo.MODE == 'tiny', + @unittest.skipIf(cosmo.MODE.startswith("tiny"), "TODO(jart): what's going on here?") def testDecompressorChunksMaxsize(self): bzd = BZ2Decompressor() diff --git a/third_party/python/Lib/test/test_class.py b/third_party/python/Lib/test/test_class.py index b6a3eb4bf..b8faffd34 100644 --- a/third_party/python/Lib/test/test_class.py +++ b/third_party/python/Lib/test/test_class.py @@ -490,7 +490,8 @@ class ClassTests(unittest.TestCase): self.assertRaises(TypeError, hash, C2()) - @unittest.skipIf(cosmo.MODE == 'tiny', "no stack awareness in tiny mode") + @unittest.skipIf(cosmo.MODE.startswith("tiny"), + "no stack awareness in tiny mode") def testSFBug532646(self): # Test for SF bug 532646 diff --git a/third_party/python/Lib/test/test_exceptions.py b/third_party/python/Lib/test/test_exceptions.py index d345ced3c..d8a42e644 100644 --- a/third_party/python/Lib/test/test_exceptions.py +++ b/third_party/python/Lib/test/test_exceptions.py @@ -1152,7 +1152,7 @@ class ExceptionTests(unittest.TestCase): os.listdir(__file__) self.assertEqual(cm.exception.errno, errno.ENOTDIR, cm.exception) - @unittest.skipIf(cosmo.MODE == 'tiny', + @unittest.skipIf(cosmo.MODE.startswith("tiny"), "todo(jart): why is it broken") def test_unraisable(self): # Issue #22836: PyErr_WriteUnraisable() should give sensible reports @@ -1186,7 +1186,7 @@ class ExceptionTests(unittest.TestCase): self.assertIn("del is broken", report) self.assertTrue(report.endswith("\n")) - @unittest.skipIf(cosmo.MODE == 'tiny', + @unittest.skipIf(cosmo.MODE.startswith("tiny"), "todo(jart): why is it broken") def test_unhandled(self): # Check for sensible reporting of unhandled exceptions diff --git a/third_party/python/Lib/test/test_fileio.py b/third_party/python/Lib/test/test_fileio.py index 788cc8723..9f014b5c8 100644 --- a/third_party/python/Lib/test/test_fileio.py +++ b/third_party/python/Lib/test/test_fileio.py @@ -177,7 +177,7 @@ class AutoFileTests: finally: os.close(fd) - @unittest.skipIf(cosmo.MODE == 'tiny', "no stack awareness in tiny mode") + @unittest.skipIf(cosmo.MODE.startswith("tiny"), "no stack awareness in tiny mode") def testRecursiveRepr(self): # Issue #25455 with swap_attr(self.f, 'name', self.f): diff --git a/third_party/python/Lib/test/test_functools.py b/third_party/python/Lib/test/test_functools.py index eef6c72f0..3e3627402 100644 --- a/third_party/python/Lib/test/test_functools.py +++ b/third_party/python/Lib/test/test_functools.py @@ -619,7 +619,7 @@ class TestUpdateWrapper(unittest.TestCase): @unittest.skipIf(sys.flags.optimize >= 2, "Docstrings are omitted with -O2 and above") - @unittest.skipIf(cosmo.MODE == 'tiny', + @unittest.skipIf(cosmo.MODE.startswith("tiny"), "No .py files available in Cosmo MODE=tiny") def test_default_update_doc(self): wrapper, f = self._default_update() @@ -681,7 +681,7 @@ class TestUpdateWrapper(unittest.TestCase): @support.requires_docstrings @unittest.skipIf(sys.flags.optimize >= 2, "Docstrings are omitted with -O2 and above") - @unittest.skipIf(cosmo.MODE == 'tiny', + @unittest.skipIf(cosmo.MODE .startswith("tiny"), "No .py files available in Cosmo MODE=tiny") def test_builtin_update(self): # Test for bug #1576241 @@ -715,7 +715,7 @@ class TestWraps(TestUpdateWrapper): @unittest.skipIf(sys.flags.optimize >= 2, "Docstrings are omitted with -O2 and above") - @unittest.skipIf(cosmo.MODE == 'tiny', + @unittest.skipIf(cosmo.MODE .startswith("tiny"), "No .py files available in Cosmo MODE=tiny") def test_default_update_doc(self): wrapper, _ = self._default_update() diff --git a/third_party/python/Lib/test/test_plistlib.py b/third_party/python/Lib/test/test_plistlib.py index 9655615fa..d4c1a5d30 100644 --- a/third_party/python/Lib/test/test_plistlib.py +++ b/third_party/python/Lib/test/test_plistlib.py @@ -814,7 +814,8 @@ class TestBinaryPlistlib(unittest.TestCase): b = plistlib.loads(plistlib.dumps(a, fmt=plistlib.FMT_BINARY)) self.assertIs(b['x'], b) - @unittest.skipIf(cosmo.MODE == 'tiny', "no stack awareness in tiny mode") + @unittest.skipIf(cosmo.MODE.startswith("tiny"), + "no stack awareness in tiny mode") def test_deep_nesting(self): for N in [300, 100000]: chunks = [b'\xa1' + (i + 1).to_bytes(4, 'big') for i in range(N)] diff --git a/third_party/python/Lib/test/test_unicodedata.py b/third_party/python/Lib/test/test_unicodedata.py index 07b84ac16..9d94ba2af 100644 --- a/third_party/python/Lib/test/test_unicodedata.py +++ b/third_party/python/Lib/test/test_unicodedata.py @@ -131,7 +131,7 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest): self.assertRaises(TypeError, self.db.numeric, 'xx') self.assertRaises(ValueError, self.db.numeric, 'x') - @unittest.skipIf(cosmo.MODE == 'tiny', 'astral planes arent tiny') + @unittest.skipIf(cosmo.MODE.startswith('tiny'), 'astral planes arent tiny') def test_numeric_astral(self): self.assertEqual(self.db.numeric('\U00020000', None), None) self.assertEqual(self.db.numeric('\U0001012A'), 9000) diff --git a/third_party/python/Modules/tlsmodule.c b/third_party/python/Modules/tlsmodule.c index 58afc1c87..b1aa81821 100644 --- a/third_party/python/Modules/tlsmodule.c +++ b/third_party/python/Modules/tlsmodule.c @@ -46,7 +46,7 @@ PYTHON_PROVIDE("tls"); #if 0 -#define LOG(...) __printf(__VA_ARGS__) +#define LOG(...) kprintf(__VA_ARGS__) #else #define LOG(...) (void)0 #endif diff --git a/third_party/python/launch.c b/third_party/python/launch.c index 3035b47b3..093d4dc94 100644 --- a/third_party/python/launch.c +++ b/third_party/python/launch.c @@ -6,6 +6,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" #include "libc/dce.h" +#include "libc/intrin/kprintf.h" #include "libc/log/libfatal.internal.h" #include "libc/log/log.h" #include "libc/runtime/runtime.h" @@ -94,10 +95,10 @@ ShowCrashReportHook(int err, int fd, int sig, { PyObject *str; PyFrameObject *frame; - __printf("\nCalamity Occurred w/ Python\n"); + kprintf("\nCalamity Occurred w/ Python\n"); for (frame = PyEval_GetFrame(); frame; frame = frame->f_back) { str = PyUnicode_AsUTF8String(frame->f_code->co_filename); - __printf("%s:%d\n", PyBytes_AS_STRING(str), frame->f_code->co_firstlineno/* frame->f_lineno */); + kprintf("%s:%d\n", PyBytes_AS_STRING(str), frame->f_code->co_firstlineno/* frame->f_lineno */); Py_DECREF(str); } } diff --git a/third_party/python/python.mk b/third_party/python/python.mk index b0036d69c..f18c15060 100644 --- a/third_party/python/python.mk +++ b/third_party/python/python.mk @@ -2116,1483 +2116,1483 @@ o/$(MODE)/third_party/python/pythontester.com.dbg: \ $(THIRD_PARTY_PYTHON_PYTEST_TODOS:%.py=o/$(MODE)/%.o) \ o/$(MODE)/third_party/python/repl.o \ $(CRT) \ - $(APE_NO_MODIFY_SELF) + $(APE) @$(APELINK) o/$(MODE)/third_party/python/Lib/test/test_genexps.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_genexps $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_sqlite.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_sqlite $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_bz2.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_bz2 $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_zlib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_zlib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_opcodes.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_opcodes $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_marshal.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_marshal $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pow.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pow $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_binascii.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_binascii $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_binhex.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_binhex $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_capi.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_capi $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test__locale.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test__locale $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_binop.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_binop $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test___future__.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test___future__ $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test__opcode.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test__opcode $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_abc.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_abc $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_bytes.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_bytes $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_setcomps.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_setcomps $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_itertools.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_itertools $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_listcomps.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_listcomps $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_aifc.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_aifc $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_audioop.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_audioop $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_bool.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_bool $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_base64.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_base64 $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_baseexception.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_baseexception $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_array.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_array $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_builtin.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_builtin $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_charmapcodec.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_charmapcodec $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codecs.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codecs $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codeop.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codeop $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_cgi.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_cgi $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_abstract_numbers.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_abstract_numbers $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_augassign.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_augassign $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_bigaddrspace.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_bigaddrspace $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_class.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_class $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_call.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_call $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_buffer.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_buffer $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_bufio.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_bufio $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_enum.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_enum $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_code.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_code $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_cmd.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_cmd $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pwd.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pwd $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_cmath.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_cmath $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_defaultdict.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_defaultdict $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_decorators.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_decorators $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_copy.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_copy $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_csv.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_csv $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_difflib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_difflib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_colorsys.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_colorsys $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_compare.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_compare $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_copyreg.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_copyreg $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_collections.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_collections $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_format.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_format $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_fractions.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_fractions $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_eof.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_eof $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_fnmatch.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_fnmatch $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_frame.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_frame $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_dummy_threading.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_dummy_threading $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_dynamic.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_dynamic $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_dict.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_dict $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_wsgiref.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_wsgiref $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_wave.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_wave $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_urlparse.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_urlparse $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_userdict.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_userdict $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_userlist.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_userlist $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_userstring.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_userstring $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_utf8source.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_utf8source $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_uu.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_uu $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test__encoded_words.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test__encoded_words $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test__header_value_parser.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test__header_value_parser $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test_asian_codecs.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test_asian_codecs $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test_contentmanager.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test_contentmanager $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test_defect_handling.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test_defect_handling $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test_email.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test_email $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test_generator.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test_generator $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test_headerregistry.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test_headerregistry $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test_inversion.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test_inversion $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test_message.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test_message $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test_parser.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test_parser $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test_pickleable.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test_pickleable $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test_policy.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test_policy $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_email/test_utils.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_email.test_utils $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_strtod.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_strtod $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_struct.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_struct $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_structmembers.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_structmembers $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_hash.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_hash $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_heapq.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_heapq $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_operator.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_operator $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_optparse.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_optparse $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_finalization.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_finalization $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_enumerate.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_enumerate $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_errno.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_errno $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_html.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_html $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_htmlparser.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_htmlparser $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_http_cookiejar.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_http_cookiejar $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_http_cookies.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_http_cookies $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_list.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_list $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_long.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_long $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_longexp.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_longexp $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_glob.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_glob $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_global.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_global $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_ipaddress.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_ipaddress $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_isinstance.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_isinstance $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_iter.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_iter $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_tarfile.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_tarfile $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_iterlen.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_iterlen $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_stat.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_stat $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_memoryio.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_memoryio $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_memoryview.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_memoryview $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_metaclass.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_metaclass $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_mimetypes.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_mimetypes $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_kdf.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_kdf $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_cosmo.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_cosmo $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_scratch.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_scratch $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_hashlib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_hashlib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_complex.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_complex $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_funcattrs.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_funcattrs $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_functools.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_functools $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_int.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_int $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_int_literal.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_int_literal $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_bisect.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_bisect $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pyexpat.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pyexpat $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_ioctl.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_ioctl $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_getopt.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_getopt $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_sort.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_sort $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_slice.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_slice $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_decimal.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_decimal $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_deque.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_deque $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_mmap.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_mmap $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_poll.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_poll $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_robotparser.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_robotparser $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_re.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_re $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_range.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_range $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_sax.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_sax $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_scope.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_scope $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_stringprep.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_stringprep $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_syntax.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_syntax $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_unicodedata.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_unicodedata $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_unpack.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_unpack $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_unpack_ex.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_unpack_ex $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_file.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_file $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_uuid.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_uuid $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_filecmp.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_filecmp $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_fileinput.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_fileinput $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_fileio.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_fileio $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_float.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_float $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pickle.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pickle $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pickletools.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pickletools $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_tuple.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_tuple $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_reprlib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_reprlib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_strftime.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_strftime $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_quopri.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_quopri $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_with.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_with $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_raise.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_raise $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_yield_from.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_yield_from $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_typechecks.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_typechecks $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_types.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_types $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_random.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_random $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_typing.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_typing $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_unary.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_unary $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_print.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_print $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pprint.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pprint $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_secrets.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_secrets $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_select.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_select $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_selectors.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_selectors $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_contains.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_contains $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_super.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_super $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_unicode.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_unicode $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_unicode_file.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_unicode_file $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_unicode_identifiers.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_unicode_identifiers $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_unicode_file_functions.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_unicode_file_functions $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_textwrap.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_textwrap $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pulldom.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pulldom $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_minidom.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_minidom $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_xml_dom_minicompat.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_xml_dom_minicompat $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_xml_etree_c.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_xml_etree_c $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_coroutines.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_coroutines $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_tempfile.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_tempfile $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_normalization.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_normalization $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_os.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_os $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_logging.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_logging $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_io.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_io $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_gzip.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_gzip $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_tracemalloc.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_tracemalloc $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_configparser.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_configparser $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_flufl.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_flufl $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_keyword.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_keyword $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_keywordonlyarg.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_keywordonlyarg $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_sys.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_sys $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_cgitb.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_cgitb $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_asyncgen.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_asyncgen $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_runpy.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_runpy $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_doctest.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_doctest $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_doctest2.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_doctest2 $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_calendar.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_calendar $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_asynchat.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_asynchat $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_asdl_parser.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_asdl_parser $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_atexit.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_atexit $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_dis.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_dis $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_asyncore.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_asyncore $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_epoll.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_epoll $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_cmd_line.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_cmd_line $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_cmd_line_script.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_cmd_line_script $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_code_module.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_code_module $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codeccallbacks.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codeccallbacks $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codecmaps_cn.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codecmaps_cn $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codecmaps_jp.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codecmaps_jp $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codecencodings_cn.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codecencodings_cn $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codecencodings_hk.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codecencodings_hk $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codecmaps_hk.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codecmaps_hk $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codecmaps_kr.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codecmaps_kr $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codecmaps_tw.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codecmaps_tw $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codecencodings_iso2022.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codecencodings_iso2022 $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codecencodings_jp.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codecencodings_jp $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codecencodings_kr.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codecencodings_kr $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_codecencodings_tw.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_codecencodings_tw $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_compile.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_compile $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_contextlib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_contextlib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_cprofile.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_cprofile $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_crashers.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_crashers $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_crypt.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_crypt $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_datetime.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_datetime $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_descrtut.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_descrtut $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_devpoll.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_devpoll $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_dict_version.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_dict_version $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_dictcomps.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_dictcomps $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_dictviews.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_dictviews $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_dtrace.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_dtrace $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_dynamicclassattribute.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_dynamicclassattribute $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_eintr.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_eintr $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_exception_hierarchy.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_exception_hierarchy $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_xmlrpc_net.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_xmlrpc_net $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_bigmem.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_bigmem $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_exception_variations.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_exception_variations $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_exceptions.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_exceptions $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_time.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_time $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_docxmlrpc.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_docxmlrpc $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_extcall.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_extcall $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_faulthandler.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_faulthandler $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_fcntl.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_fcntl $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_file_eintr.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_file_eintr $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_fork1.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_fork1 $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_fstring.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_fstring $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_ftplib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_ftplib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_future.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_future $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_future3.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_future3 $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_future4.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_future4 $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_future5.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_future5 $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_gc.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_gc $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_gdb.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_gdb $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_generator_stop.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_generator_stop $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_generators.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_generators $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_genericpath.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_genericpath $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_getargs2.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_getargs2 $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_getpass.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_getpass $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_gettext.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_gettext $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_grp.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_grp $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_imaplib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_imaplib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_imghdr.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_imghdr $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_imp.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_imp $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_index.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_index $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_kqueue.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_kqueue $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_largefile.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_largefile $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_linecache.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_linecache $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_locale.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_locale $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_macpath.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_macpath $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_macurl2path.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_macurl2path $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_mailbox.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_mailbox $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_mailcap.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_mailcap $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_module.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_module $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_modulefinder.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_modulefinder $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_multibytecodec.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_multibytecodec $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_multiprocessing_fork.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_multiprocessing_fork $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_multiprocessing_forkserver.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_multiprocessing_forkserver $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_multiprocessing_main_handling.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_multiprocessing_main_handling $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_multiprocessing_spawn.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_multiprocessing_spawn $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_netrc.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_netrc $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_nis.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_nis $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_nntplib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_nntplib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_ntpath.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_ntpath $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_numeric_tower.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_numeric_tower $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_ossaudiodev.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_ossaudiodev $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_parser.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_parser $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pathlib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pathlib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pdb.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pdb $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_peepholer.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_peepholer $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pipes.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pipes $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pkgimport.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pkgimport $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_platform.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_platform $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_plistlib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_plistlib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_httplib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_httplib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_popen.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_popen $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_poplib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_poplib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_posix.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_posix $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_posixpath.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_posixpath $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_profile.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_profile $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_property.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_property $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pstats.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pstats $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pty.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pty $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_py_compile.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_py_compile $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pyclbr.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pyclbr $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_pydoc.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_pydoc $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_readline.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_readline $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_regrtest.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_regrtest $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_repl.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_repl $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_resource.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_resource $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_richcmp.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_richcmp $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_sched.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_sched $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_script_helper.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_script_helper $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_shlex.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_shlex $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_shutil.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_shutil $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_signal.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_signal $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_site.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_site $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_smtpd.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_smtpd $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_smtplib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_smtplib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_smtpnet.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_smtpnet $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_sndhdr.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_sndhdr $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_socket.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_socket $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_socketserver.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_socketserver $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_spwd.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_spwd $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_startfile.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_startfile $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_statistics.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_statistics $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_string.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_string $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_string_literals.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_string_literals $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_strptime.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_strptime $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_structseq.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_structseq $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_subclassinit.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_subclassinit $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_subprocess.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_subprocess $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_sunau.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_sunau $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_support.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_support $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_symbol.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_symbol $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_symtable.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_symtable $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_sys_setprofile.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_sys_setprofile $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_syslog.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_syslog $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_telnetlib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_telnetlib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_threadedtempfile.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_threadedtempfile $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_timeit.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_timeit $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_timeout.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_timeout $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_tokenize.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_tokenize $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_trace.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_trace $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_traceback.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_traceback $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_turtle.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_turtle $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_unittest.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_unittest $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_univnewlines.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_univnewlines $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_urllib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_urllib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_urllib2.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_urllib2 $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_urllib2_localnet.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_urllib2_localnet $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_urllib2net.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_urllib2net $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_urllib_response.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_urllib_response $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_urllibnet.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_urllibnet $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_wait3.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_wait3 $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_wait4.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_wait4 $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_webbrowser.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_webbrowser $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_xdrlib.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_xdrlib $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_weakref.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_weakref $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_weakset.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_weakset $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_zipapp.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_zipapp $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_zipimport.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_zipimport $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_zipfile.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_zipfile $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_zipfile64.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_zipfile64 $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/mp_preload.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.mp_preload $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/bisect.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.bisect $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/signalinterproctester.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.signalinterproctester $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/pythoninfo.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.pythoninfo $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/datetimetester.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.datetimetester $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/outstanding_bugs.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.outstanding_bugs $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/sortperf.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.sortperf $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_openpty.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_openpty $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_queue.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_queue $(PYTESTARGS) o/$(MODE)/third_party/python/Lib/test/test_ordered_dict.py.runs: \ - o/$(MODE)/third_party/python/pythontester.com + o/$(MODE)/third_party/python/pythontester.com.dbg @$(COMPILE) -ACHECK -tT$@ $(PYHARNESSARGS) $< -m test.test_ordered_dict $(PYTESTARGS) ################################################################################ @@ -4113,21 +4113,20 @@ $(THIRD_PARTY_PYTHON_STAGE2_A_DATA_OBJS): ZIPOBJ_FLAGS += -P.python -C3 $(THIRD_PARTY_PYTHON_PYTEST_A_PYS_OBJS): PYFLAGS += -P.python -C3 $(THIRD_PARTY_PYTHON_PYTEST_A_DATA_OBJS): ZIPOBJ_FLAGS += -P.python -C3 -o/$(MODE)/third_party/python/Python/ceval.o: QUOTA = -M512m -o/$(MODE)/third_party/python/Objects/unicodeobject.o: QUOTA += -C16 -M512m +o/$(MODE)/third_party/python/Python/ceval.o: QUOTA = -C32 -M1024m +o/$(MODE)/third_party/python/Objects/unicodeobject.o: QUOTA += -C32 -M1024m o/$(MODE)/third_party/python/Parser/asdl_c.o: PYFLAGS += -m $(THIRD_PARTY_PYTHON_PYTEST_PYMAINS_OBJS): PYFLAGS += -t -P.python -C3 $(THIRD_PARTY_PYTHON_PYTEST_TODOS:%.py=o/$(MODE)/%.o): PYFLAGS += -t -P.python -C3 o/$(MODE)/third_party/python/Lib/test/pystone.o: PYFLAGS += -m -O2 -P.python -C4 -o/$(MODE)/third_party/python/Lib/test/test_bz2.py.runs: QUOTA = -C16 o/$(MODE)/third_party/python/Lib/test/test_long.py.runs: QUOTA = -C32 o/$(MODE)/third_party/python/Lib/test/test_hash.py.runs: QUOTA = -C32 o/$(MODE)/third_party/python/Lib/test/test_exceptions.py.runs: QUOTA = -C32 o/$(MODE)/third_party/python/Lib/test/test_tuple.py.runs: QUOTA = -M512m o/$(MODE)/third_party/python/Lib/test/test_decimal.py.runs: QUOTA = -M512m -C64 -o/$(MODE)/third_party/python/Lib/test/test_longexp.py.runs: QUOTA = -M512m +o/$(MODE)/third_party/python/Lib/test/test_longexp.py.runs: QUOTA = -M1024m o/$(MODE)/third_party/python/Lib/test/test_unicode.py.runs: QUOTA = -M1400m o/$(MODE)/third_party/python/Lib/test/test_unicodedata.py.runs: QUOTA = -C32 o/$(MODE)/third_party/python/Lib/test/test_logging.py.runs: QUOTA = -M512m @@ -4135,7 +4134,7 @@ o/$(MODE)/third_party/python/Lib/test/test_itertools.py.runs: QUOTA = -M1024m o/$(MODE)/third_party/python/Lib/test/test_tarfile.py.runs: QUOTA = -L120 -C64 o/$(MODE)/third_party/python/Lib/test/test_sqlite.py.runs: QUOTA = -L120 o/$(MODE)/third_party/python/Lib/test/test_gzip.py.runs: QUOTA = -L120 -o/$(MODE)/third_party/python/Lib/test/test_email/test_email.py.runs: QUOTA = -M1024m +o/$(MODE)/third_party/python/Lib/test/test_email/test_email.py.runs: QUOTA = -C16 -M1024m THIRD_PARTY_PYTHON_LIBS = \ $(foreach x,$(THIRD_PARTY_PYTHON_ARTIFACTS),$($(x))) diff --git a/third_party/quickjs/quickjs.mk b/third_party/quickjs/quickjs.mk index 3347384bf..4e2f3906d 100644 --- a/third_party/quickjs/quickjs.mk +++ b/third_party/quickjs/quickjs.mk @@ -151,7 +151,7 @@ o/$(MODE)/third_party/quickjs/qjsc.com.dbg: \ $(THIRD_PARTY_QUICKJS) \ o/$(MODE)/third_party/quickjs/qjsc.o \ $(CRT) \ - $(APE) + $(APE_NO_MODIFY_SELF) @$(APELINK) # git clone git@github.com:tc39/test262 /opt/test262 diff --git a/third_party/sqlite3/README.cosmo b/third_party/sqlite3/README.cosmo new file mode 100644 index 000000000..37e08f697 --- /dev/null +++ b/third_party/sqlite3/README.cosmo @@ -0,0 +1,12 @@ +DESCRIPTION + + SQLite is an embeddable SQL relational database with a ~1mb + footprint and a wide variety of features. + +ORIGIN + + https://www.sqlite.org/2021/sqlite-preprocessed-3350500.zip + +LICENSE + + Public Domain or MIT diff --git a/tool/build/blinkenlights.c b/tool/build/blinkenlights.c index a063fb48d..6c4d92d30 100644 --- a/tool/build/blinkenlights.c +++ b/tool/build/blinkenlights.c @@ -30,6 +30,7 @@ #include "libc/calls/struct/termios.h" #include "libc/calls/struct/winsize.h" #include "libc/calls/termios.h" +#include "libc/dce.h" #include "libc/fmt/bing.internal.h" #include "libc/fmt/conv.h" #include "libc/fmt/fmt.h" @@ -37,15 +38,18 @@ #include "libc/intrin/asan.internal.h" #include "libc/intrin/pcmpeqb.h" #include "libc/intrin/pmovmskb.h" +#include "libc/limits.h" #include "libc/log/check.h" #include "libc/log/color.internal.h" #include "libc/log/log.h" #include "libc/macros.internal.h" #include "libc/math.h" #include "libc/mem/mem.h" +#include "libc/rand/rand.h" #include "libc/runtime/gc.internal.h" #include "libc/runtime/runtime.h" #include "libc/sock/sock.h" +#include "libc/stdio/append.internal.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/str/thompike.h" @@ -198,6 +202,12 @@ struct MemoryView { int zoom; }; +struct Keystrokes { + unsigned i; + char p[4][32]; + long double s[4]; +}; + struct MachineState { uint64_t ip; uint8_t cs[8]; @@ -296,6 +306,7 @@ static struct Pty *pty; static struct Machine *m; static struct Panels pan; +static struct Keystrokes keystrokes; static struct Breakpoints breakpoints; static struct MemoryView codeview; static struct MemoryView readview; @@ -545,6 +556,10 @@ static void ShowCursor(void) { TtyWriteString("\e[?25h"); } +static void EnableSafePaste(void) { + TtyWriteString("\e[?2004h"); +} + static void DisableSafePaste(void) { TtyWriteString("\e[?2004l"); } @@ -596,7 +611,7 @@ static void TuiRejuvinate(void) { CHECK_NE(-1, ioctl(ttyout, TCSETS, &term)); xsigaction(SIGBUS, OnSigBusted, SA_NODEFER, 0, NULL); EnableMouseTracking(); - DisableSafePaste(); + EnableSafePaste(); } static void OnQ(void) { @@ -639,12 +654,14 @@ static void TtyRestore2(void) { DEBUGF("TtyRestore2"); ioctl(ttyout, TCSETS, &oldterm); DisableMouseTracking(); + DisableSafePaste(); } static void TuiCleanup(void) { sigaction(SIGCONT, oldsig + 2, NULL); TtyRestore1(); DisableMouseTracking(); + DisableSafePaste(); tuimode = false; LeaveScreen(); } @@ -682,12 +699,14 @@ static void LoadSyms(void) { static int DrainInput(int fd) { char buf[32]; struct pollfd fds[1]; - for (;;) { - fds[0].fd = fd; - fds[0].events = POLLIN; - if (poll(fds, ARRAYLEN(fds), 0) == -1) return -1; - if (!(fds[0].revents & POLLIN)) break; - if (read(fd, buf, sizeof(buf)) == -1) return -1; + if (!IsWindows()) { + for (;;) { + fds[0].fd = fd; + fds[0].events = POLLIN; + if (poll(fds, ARRAYLEN(fds), 0) == -1) return -1; + if (!(fds[0].revents & POLLIN)) break; + if (read(fd, buf, sizeof(buf)) == -1) return -1; + } } return 0; } @@ -1602,6 +1621,34 @@ static int AppendStat(struct Buffer *b, const char *name, int64_t value, return 1 + width; } +static char *GetStatus(int m) { + bool first; + char *b = 0; + unsigned i, n; + long double t; + if (statusmessage && nowl() < statusexpires) { + appends(&b, statusmessage); + } else { + appends(&b, "das blinkenlights"); + } + n = ARRAYLEN(keystrokes.p); + for (first = true, t = nowl(), i = 1; i <= n; --i) { + if (!keystrokes.p[(keystrokes.i - i) % n][0]) continue; + if (t - keystrokes.s[(keystrokes.i - i) % n] > 1) continue; + if (first) { + first = false; + appends(&b, " (keystroke: "); + } else { + appendw(&b, ' '); + } + appends(&b, keystrokes.p[(keystrokes.i - i) % n]); + } + if (!first) { + appendw(&b, ')'); + } + return b; +} + static void DrawStatus(struct Panel *p) { int yn, xn, rw; struct Buffer *s; @@ -1621,9 +1668,7 @@ static void DrawStatus(struct Panel *p) { rw += AppendStat(s, "freed", a->freed, a->freed != b->freed); rw += AppendStat(s, "tables", a->pagetables, a->pagetables != b->pagetables); rw += AppendStat(s, "fds", m->fds.i, false); - AppendFmt(&p->lines[0], "\e[7m%-*s%s\e[0m", xn - rw, - statusmessage && nowl() < statusexpires ? statusmessage - : "das blinkenlights", + AppendFmt(&p->lines[0], "\e[7m%-*s%s\e[0m", xn - rw, gc(GetStatus(xn - rw)), s->p); free(s->p); free(s); @@ -1700,6 +1745,29 @@ static void ReactiveDraw(void) { } } +static void DescribeKeystroke(char *b, const char *p) { + int c; + do { + c = *p++ & 255; + if (c == '\e') { + b = stpcpy(b, "ALT-"); + c = *p++ & 255; + } + if (c <= 32) { + b = stpcpy(b, "CTRL-"); + c = CTRL(c); + } + *b++ = c; + *b = 0; + } while (*p); +} + +static void RecordKeystroke(const char *k) { + keystrokes.s[keystrokes.i] = nowl(); + DescribeKeystroke(keystrokes.p[keystrokes.i], k); + keystrokes.i = (keystrokes.i + 1) % ARRAYLEN(keystrokes.p); +} + static void HandleAlarm(void) { alarmed = false; action &= ~ALARM; @@ -1719,6 +1787,8 @@ static void HandleAppReadInterrupt(void) { } if (action & INT) { action &= ~INT; + RecordKeystroke("\3"); + ReactiveDraw(); if (action & CONTINUE) { action &= ~CONTINUE; } else { @@ -1770,33 +1840,47 @@ static struct Mouse ParseMouse(char *p) { return m; } -static ssize_t ReadPtyFdDirect(int fd, void *data, size_t size) { +static ssize_t ReadAnsi(int fd, char *p, size_t n) { ssize_t rc; - char buf[32]; struct Mouse m; - DEBUGF("ReadPtyFdDirect"); - pty->conf |= kPtyBlinkcursor; for (;;) { ReactiveDraw(); - if ((rc = readansi(fd, buf, sizeof(buf))) != -1) { - if (tuimode && rc > 3 && - (buf[0] == '\e' && buf[1] == '[' && buf[2] == '<')) { - m = ParseMouse(buf + 3); - if (LocatePanel(m.y, m.x) != &pan.display) { - HandleKeyboard(buf); + if ((rc = readansi(fd, p, n)) != -1) { + if (tuimode && rc > 3 && p[0] == '\e' && p[1] == '[') { + if (p[2] == '2' && p[3] == '0' && p[4] == '0' && p[5] == '~') { + belay = true; continue; } + if (p[2] == '2' && p[3] == '0' && p[4] == '1' && p[5] == '~') { + belay = false; + continue; + } + if (p[2] == '<') { + m = ParseMouse(p + 3); + if (LocatePanel(m.y, m.x) != &pan.display) { + HandleKeyboard(p); + continue; + } + } } - break; + return rc; + } else { + CHECK_EQ(EINTR, errno); + HandleAppReadInterrupt(); } - CHECK_EQ(EINTR, errno); - HandleAppReadInterrupt(); } +} + +static ssize_t ReadPtyFdDirect(int fd) { + ssize_t rc; + char buf[32]; + pty->conf |= kPtyBlinkcursor; + rc = ReadAnsi(fd, buf, sizeof(buf)); pty->conf &= ~kPtyBlinkcursor; if (rc > 0) { PtyWriteInput(pty, buf, rc); ReactiveDraw(); - rc = PtyRead(pty, data, size); + rc = 0; } return rc; } @@ -1814,15 +1898,62 @@ static ssize_t OnPtyFdReadv(int fd, const struct iovec *iov, int iovlen) { } } if (size) { - if (!(rc = PtyRead(pty, data, size))) { - rc = ReadPtyFdDirect(fd, data, size); + for (;;) { + if ((rc = PtyRead(pty, data, size))) { + return rc; + } + if (ReadPtyFdDirect(fd) == -1) { + return -1; + } } - return rc; } else { return 0; } } +static int OnPtyFdPoll(struct pollfd *fds, size_t nfds, int ms) { + bool once, rem; + int i, t, re, rc; + struct pollfd p2; + ms &= INT_MAX; + for (once = t = i = 0; i < nfds; ++i) { + re = 0; + if (fds[i].fd >= 0) { + if (pty->input.i) { + re = POLLIN | POLLOUT; + ++t; + } else { + if (!once) { + ReactiveDraw(); + once = true; + } + if (!IsWindows()) { + p2.fd = fds[i].fd; + p2.events = fds[i].events; + switch (poll(&p2, 1, ms)) { + case -1: + re = POLLERR; + ++t; + break; + case 0: + break; + case 1: + re = p2.revents; + ++t; + break; + default: + unreachable; + } + } else { + re = POLLIN | POLLOUT; /* xxx */ + } + } + } + fds[i].revents = re; + } + return t; +} + static void DrawDisplayOnly(struct Panel *p) { struct Buffer b; int i, y, yn, xn, tly, tlx, conf; @@ -1910,6 +2041,7 @@ static const struct MachineFdCb kMachineFdCbPty = { .readv = OnPtyFdReadv, .writev = OnPtyFdWritev, .ioctl = OnPtyFdIoctl, + .poll = OnPtyFdPoll, }; static void LaunchDebuggerReactively(void) { @@ -2137,11 +2269,10 @@ static void OnVidyaServiceTeletypeOutput(void) { int n; uint64_t w; char buf[12]; - n = FormatCga(m->bx[0], buf); + n = 0 /* FormatCga(m->bx[0], buf) */; w = tpenc(VidyaServiceXlatTeletype(m->ax[0])); - do { - buf[n++] = w; - } while ((w >>= 8)); + do buf[n++] = w; + while ((w >>= 8)); PtyWrite(pty, buf, n); } @@ -2173,64 +2304,19 @@ static void OnVidyaService(void) { static void OnKeyboardServiceReadKeyPress(void) { wint_t x; uint8_t b; - ssize_t rc; size_t i, n; struct Mouse mo; static char buf[32]; static size_t pending; - static const char *fun; - static const char *prog /* = "(CONS (QUOTE A) (QUOTE B))" */; pty->conf |= kPtyBlinkcursor; - if (!fun && prog) { - fun = prog; - belay = 1; - } - if (fun && *fun) { - b = *fun++; - if (!*fun) { - ReactiveDraw(); - belay = 0; - } - } else { - if (!pending) { - for (;;) { - ReactiveDraw(); - if ((rc = readansi(0, buf, sizeof(buf))) != -1) { - if (!rc) { - exitcode = 0; - action |= EXIT; - return; - } - if (!memcmp(buf, "\e[200~", 6) || !memcmp(buf, "\e[201~", 6)) { - continue; - } - if ((x = buf[0] & 0377) >= 0300) { - n = ThomPikeLen(x); - x = ThomPikeByte(x); - for (i = 1; i < n; ++i) { - x = ThomPikeMerge(x, buf[i] & 0377); - } - buf[0] = unbing(x); - rc = 1; - } else if (tuimode && rc > 3 && - (buf[0] == '\e' && buf[1] == '[' && buf[2] == '<')) { - mo = ParseMouse(buf + 3); - if (LocatePanel(mo.y, mo.x) != &pan.display) { - HandleKeyboard(buf); - continue; - } - } - pending = rc; - break; - } - CHECK_EQ(EINTR, errno); - HandleAppReadInterrupt(); - } - } - b = buf[0]; - memmove(buf, buf + 1, pending - 1); - --pending; + if (!pending && !(pending = ReadAnsi(0, buf, sizeof(buf)))) { + exitcode = 0; + action |= EXIT; + return; } + b = buf[0]; + memmove(buf, buf + 1, pending - 1); + --pending; pty->conf &= ~kPtyBlinkcursor; ReactiveDraw(); if (b == 0x7F) b = '\b'; @@ -2521,7 +2607,11 @@ static bool HasPendingKeyboard(void) { } static void Sleep(int ms) { - poll((struct pollfd[]){{ttyin, POLLIN}}, 1, ms); + if (IsWindows()) { + usleep(ms * 1000L); + } else { + poll((struct pollfd[]){{ttyin, POLLIN}}, 1, ms); + } } static void OnMouseWheelUp(struct Panel *p, int y, int x) { @@ -2596,7 +2686,8 @@ static void OnHelp(void) { dialog = HELP; } -static void HandleKeyboard(const char *p) { +static void HandleKeyboard(const char *k) { + const char *p = k; switch (*p++) { CASE('q', OnQ()); CASE('v', OnV()); @@ -2634,9 +2725,9 @@ static void HandleKeyboard(const char *p) { switch (*p++) { CASE('P', OnHelp()); /* \eOP is F1 */ default: - break; + return; } - break; + return; case '[': switch (*p++) { CASE('<', OnMouse(p)); @@ -2649,16 +2740,17 @@ static void HandleKeyboard(const char *p) { CASE('5', OnPageUp()); /* \e[1~ is pgup */ CASE('6', OnPageDown()); /* \e[1~ is pgdn */ default: - break; + return; } - break; + return; default: - break; + return; } break; default: - break; + return; } + RecordKeystroke(k); } static void ReadKeyboard(void) { @@ -2824,6 +2916,8 @@ static void Tui(void) { if (action & INT) { INFOF("TUI INT"); action &= ~INT; + RecordKeystroke("\3"); + ReactiveDraw(); if (action & (CONTINUE | NEXT | FINISH)) { action &= ~(CONTINUE | NEXT | FINISH); } else { @@ -3012,11 +3106,12 @@ static void OnlyRunOnFirstCpu(void) { int main(int argc, char *argv[]) { if (!NoDebug()) showcrashreports(); pty = NewPty(); + pty->conf |= kPtyNocanon; m = NewMachine(); m->mode = XED_MACHINE_MODE_LONG_64; m->onbinbase = OnBinbase; m->onlongbranch = OnLongBranch; - speed = 16; + speed = 32; SetXmmSize(2); SetXmmDisp(kXmmHex); if ((colorize = cancolor())) { diff --git a/tool/build/compile.c b/tool/build/compile.c index 84ba6e745..e2522a2b5 100644 --- a/tool/build/compile.c +++ b/tool/build/compile.c @@ -28,9 +28,11 @@ #include "libc/calls/struct/sigset.h" #include "libc/calls/struct/stat.h" #include "libc/calls/struct/timeval.h" +#include "libc/dce.h" #include "libc/errno.h" #include "libc/fmt/conv.h" #include "libc/fmt/itoa.h" +#include "libc/intrin/kprintf.h" #include "libc/limits.h" #include "libc/log/color.internal.h" #include "libc/log/log.h" @@ -43,6 +45,7 @@ #include "libc/stdio/append.internal.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" +#include "libc/sysv/consts/auxv.h" #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/itimer.h" #include "libc/sysv/consts/o.h" @@ -95,8 +98,8 @@ FLAGS\n\ -T TARGET specifies target name for V=0 logging\n\ -A ACTION specifies short command name for V=0 logging\n\ -V NUMBER specifies compiler version\n\ - -C SECS set cpu limit [default 8]\n\ - -L SECS set lat limit [default 64]\n\ + -C SECS set cpu limit [default 16]\n\ + -L SECS set lat limit [default 90]\n\ -M BYTES set mem limit [default 512m]\n\ -F BYTES set fsz limit [default 100m]\n\ -O BYTES set out limit [default 1m]\n\ @@ -194,6 +197,7 @@ const char *const kSafeEnv[] = { "MODE", // needed by test scripts "PATH", // needed by clang "PWD", // just seems plain needed + "STRACE", // useful for troubleshooting "TERM", // needed by IsTerminalInarticulate "TMPDIR", // needed by compiler }; @@ -223,6 +227,7 @@ const char *const kGccOnlyFlags[] = { "-fno-gnu-unique", "-fno-gnu-unique", "-fno-instrument-functions", + "-fno-schedule-insns2", "-fno-whole-program", "-fopt-info-vec", "-fopt-info-vec-missed", @@ -324,10 +329,14 @@ int GetTerminalWidth(void) { } } -int GetLineWidth(void) { +int GetLineWidth(bool *isineditor) { char *s; struct winsize ws = {0}; - if ((s = getenv("COLUMNS"))) { + s = getenv("COLUMNS"); + if (isineditor) { + *isineditor = !!s; + } + if (s) { return atoi(s); } else if (ioctl(2, TIOCGWINSZ, &ws) != -1) { if (ws.ws_col && ws.ws_row) { @@ -398,11 +407,20 @@ bool FileExistsAndIsNewerThan(const char *filepath, const char *thanpath) { return st1.st_mtim.tv_nsec >= st2.st_mtim.tv_nsec; } +static size_t TallyArgs(char **p) { + size_t n; + for (n = 0; *p; ++p) { + n += sizeof(*p); + n += strlen(*p) + 1; + } + return n; +} + void AddStr(struct Strings *l, char *s) { l->p = realloc(l->p, (++l->n + 1) * sizeof(*l->p)); l->p[l->n - 1] = s; l->p[l->n - 0] = 0; -}; +} void AddEnv(char *s) { AddStr(&env, s); @@ -433,7 +451,15 @@ void AddArg(char *s) { } else { appends(&shortened, s); } - } else if (s[0] == '-' && (!s[1] || s[1] == 'o' || (s[1] == '-' && !s[2]) || + } else if (/* + * a in ('-', '--') or + * a.startswith('-o') or + * c == 'ld' and a == '-T' or + * c == 'cc' and a.startswith('-O') or + * c == 'cc' and a.startswith('-x') or + * c == 'cc' and a in ('-c', '-E', '-S') + */ + s[0] == '-' && (!s[1] || s[1] == 'o' || (s[1] == '-' && !s[2]) || (isbfd && (s[1] == 'T' && !s[2])) || (iscc && (s[1] == 'O' || s[1] == 'x' || (!s[2] && (s[1] == 'c' || s[1] == 'E' || @@ -486,6 +512,56 @@ void SetMemLimit(long n) { setrlimit(RLIMIT_AS, &rlim); } +bool ArgNeedsShellQuotes(const char *s) { + if (*s) { + for (;;) { + switch (*s++ & 255) { + case 0: + return false; + case '-': + case '.': + case '/': + case '_': + case '=': + case ':': + case '0' ... '9': + case 'A' ... 'Z': + case 'a' ... 'z': + break; + default: + return true; + } + } + } else { + return true; + } +} + +char *AddShellQuotes(const char *s) { + char *p, *q; + size_t i, j, n; + n = strlen(s); + p = malloc(1 + n * 5 + 1 + 1); + j = 0; + p[j++] = '\''; + for (i = 0; i < n; ++i) { + if (s[i] != '\'') { + p[j++] = s[i]; + } else { + p[j + 0] = '\''; + p[j + 1] = '"'; + p[j + 2] = '\''; + p[j + 3] = '"'; + p[j + 4] = '\''; + j += 5; + } + } + p[j++] = '\''; + p[j] = 0; + if ((q = realloc(p, j + 1))) p = q; + return p; +} + int Launch(void) { size_t got; ssize_t rc; @@ -499,7 +575,19 @@ int Launch(void) { timer.it_interval.tv_sec = timeout; setitimer(ITIMER_REAL, &timer, 0); } - if ((pid = vfork()) == -1) exit(errno); + pid = fork(); + +#if 0 + int fd; + size_t n; + char b[1024], *p; + size_t t = strlen(cmd) + 1 + TallyArgs(args.p) + 9 + TallyArgs(env.p) + 9; + n = ksnprintf(b, sizeof(b), "%ld %s %s\n", t, cmd, outpath); + fd = open("o/argmax.txt", O_APPEND | O_CREAT | O_WRONLY, 0644); + write(fd, b, n); + close(fd); +#endif + if (!pid) { SetCpuLimit(cpuquota); SetFszLimit(fszquota); @@ -508,7 +596,7 @@ int Launch(void) { dup2(pipefds[1], 2); sigprocmask(SIG_SETMASK, &savemask, 0); execve(cmd, args.p, env.p); - _exit(127); + _Exit(127); } close(pipefds[1]); for (;;) { @@ -609,21 +697,42 @@ void ReportResources(void) { appendw(&output, '\n'); } +bool IsNativeExecutable(const char *path) { + bool res; + char buf[4]; + int got, fd; + res = false; + if ((fd = open(path, O_RDONLY)) != -1) { + if ((got = read(fd, buf, 4)) == 4) { + if (IsWindows()) { + res = READ16LE(buf) == READ16LE("MZ"); + } else if (IsXnu()) { + res = READ32LE(buf) == 0xFEEDFACEu + 1; + } else { + res = READ32LE(buf) == READ32LE("\177ELF"); + } + } + close(fd); + } + return res; +} + int main(int argc, char *argv[]) { int columns; uint64_t us; + bool isineditor; size_t i, j, n, m; bool isproblematic; - char *s, *p, **envp; int ws, opt, exitcode; + char *s, *p, *q, **envp; /* * parse prefix arguments */ mode = MODE; verbose = 4; - timeout = 64; /* secs */ - cpuquota = 8; /* secs */ + timeout = 90; /* secs */ + cpuquota = 16; /* secs */ fszquota = 100 * 1000 * 1000; /* bytes */ memquota = 512 * 1024 * 1024; /* bytes */ if ((s = getenv("V"))) verbose = atoi(s); @@ -876,6 +985,8 @@ int main(int argc, char *argv[]) { if (wantframe) { AddArg("-fno-omit-frame-pointer"); AddArg("-D__FNO_OMIT_FRAME_POINTER__"); + } else { + AddArg("-fomit-frame-pointer"); } } @@ -938,6 +1049,7 @@ int main(int argc, char *argv[]) { exit(97); } } + args.p[0] = cmd; } /* @@ -991,7 +1103,8 @@ int main(int argc, char *argv[]) { * cleanup temporary copy of ape executable */ if (originalcmd) { - if (cachedcmd && WIFEXITED(ws) && !WEXITSTATUS(ws)) { + if (cachedcmd && WIFEXITED(ws) && !WEXITSTATUS(ws) && + IsNativeExecutable(cmd)) { makedirs(xdirname(cachedcmd), 0755); rename(cmd, cachedcmd); } else { @@ -1036,6 +1149,17 @@ int main(int argc, char *argv[]) { appends(&output, strsignal(WTERMSIG(ws))); PrintReset(); appendw(&output, READ16LE(":\n")); + appends(&output, "env -i "); + for (i = 0; i < env.n; ++i) { + if (ArgNeedsShellQuotes(env.p[i])) { + q = AddShellQuotes(env.p[i]); + appends(&output, q); + free(q); + } else { + appends(&output, env.p[i]); + } + appendw(&output, ' '); + } } } else { exitcode = 89; @@ -1170,10 +1294,19 @@ int main(int argc, char *argv[]) { if (verbose < 2 || verbose == 3) { command = shortened; } - m = GetLineWidth(); + m = GetLineWidth(&isineditor); if (m > n + 3 && appendz(command).i > m - n) { - appendd(&output, command, m - n - 3); - appendw(&output, READ32LE("...")); + if (isineditor) { + if (m > n + 3 && appendz(shortened).i > m - n) { + appendd(&output, shortened, m - n - 3); + appendw(&output, READ32LE("...")); + } else { + appendd(&output, shortened, appendz(shortened).i); + } + } else { + appendd(&output, command, m - n - 3); + appendw(&output, READ32LE("...")); + } } else { appendd(&output, command, appendz(command).i); } diff --git a/tool/build/lib/diself.c b/tool/build/lib/diself.c index 27a65a4a7..87b78868e 100644 --- a/tool/build/lib/diself.c +++ b/tool/build/lib/diself.c @@ -23,6 +23,7 @@ #include "libc/log/log.h" #include "libc/macros.internal.h" #include "libc/mem/mem.h" +#include "libc/runtime/memtrack.internal.h" #include "libc/str/str.h" #include "tool/build/lib/dis.h" @@ -86,8 +87,7 @@ static void DisLoadElfSyms(struct Dis *d, struct Elf *elf) { ELF64_ST_TYPE(st[i].st_info) == STT_FILE || !st[i].st_name || startswith(d->syms.stab + st[i].st_name, "v_") || !(0 <= st[i].st_name && st[i].st_name < stablen) || !st[i].st_value || - !(-0x800000000000 <= (int64_t)st[i].st_value && - (int64_t)st[i].st_value < 0x800000000000)) { + !IsLegalPointer(st[i].st_value)) { continue; } isabs = st[i].st_shndx == SHN_ABS; diff --git a/tool/build/lib/disspec.c b/tool/build/lib/disspec.c index a097cb264..1a9baca15 100644 --- a/tool/build/lib/disspec.c +++ b/tool/build/lib/disspec.c @@ -237,6 +237,8 @@ const char *DisSpecMap0(struct XedDecodedInst *x, char *p) { RCASE(0xCB, "lret"); RCASE(0xCC, "int3"); RCASE(0xCD, "int Ib"); + RCASE(0xCE, "into"); + RCASE(0xCF, "iret"); RCASE(0xD0, "BIT Eb"); RCASE(0xD1, "BIT Evqp"); RCASE(0xD2, "BIT Evqp %cl"); diff --git a/tool/build/lib/eztls.c b/tool/build/lib/eztls.c index 8815a18a1..dc6b6a35a 100644 --- a/tool/build/lib/eztls.c +++ b/tool/build/lib/eztls.c @@ -159,6 +159,25 @@ void EzHandshake(void) { } } +int EzHandshake2(void) { + int rc; + while ((rc = mbedtls_ssl_handshake(&ezssl))) { + if (rc == MBEDTLS_ERR_NET_CONN_RESET) { + return rc; + } else if (rc != MBEDTLS_ERR_SSL_WANT_READ) { + TlsDie("handshake failed", rc); + } + } + while ((rc = EzTlsFlush(&ezbio, 0, 0))) { + if (rc == MBEDTLS_ERR_NET_CONN_RESET) { + return rc; + } else if (rc != MBEDTLS_ERR_SSL_WANT_READ) { + TlsDie("handshake flush failed", rc); + } + } + return 0; +} + void EzInitialize(void) { xsigaction(SIGPIPE, SIG_IGN, 0, 0, 0); ezconf.disable_compression = 1; /* TODO(jart): Why does it behave weirdly? */ diff --git a/tool/build/lib/eztls.h b/tool/build/lib/eztls.h index 5c659f227..612acb9ad 100644 --- a/tool/build/lib/eztls.h +++ b/tool/build/lib/eztls.h @@ -20,6 +20,7 @@ extern mbedtls_ctr_drbg_context ezrng; void EzFd(int); void EzHandshake(void); +int EzHandshake2(void); void EzSetup(char[32]); void EzInitialize(void); int EzTlsFlush(struct EzTlsBio *, const unsigned char *, size_t); diff --git a/tool/build/lib/fds.h b/tool/build/lib/fds.h index 8899893c9..ca038e6c5 100644 --- a/tool/build/lib/fds.h +++ b/tool/build/lib/fds.h @@ -1,6 +1,7 @@ #ifndef COSMOPOLITAN_TOOL_BUILD_LIB_FDS_H_ #define COSMOPOLITAN_TOOL_BUILD_LIB_FDS_H_ #include "libc/calls/struct/iovec.h" +#include "libc/sock/sock.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ @@ -14,17 +15,18 @@ struct MachineFdCb { ssize_t (*readv)(int, const struct iovec *, int); ssize_t (*writev)(int, const struct iovec *, int); int (*ioctl)(int, uint64_t, void *); + int (*poll)(struct pollfd *, uint64_t, int32_t); }; struct MachineFd { int fd; - struct MachineFdCb * cb; + struct MachineFdCb *cb; }; struct MachineFds { size_t i, n; - struct MachineFd * p; - struct MachineFdClosed * closed; + struct MachineFd *p; + struct MachineFdClosed *closed; }; int MachineFdAdd(struct MachineFds *); diff --git a/tool/build/lib/ioports.c b/tool/build/lib/ioports.c index 03f5fb6f8..adc231b9a 100644 --- a/tool/build/lib/ioports.c +++ b/tool/build/lib/ioports.c @@ -17,8 +17,12 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/struct/iovec.h" +#include "libc/dce.h" +#include "libc/log/log.h" #include "libc/nexgen32e/uart.internal.h" +#include "libc/sock/sock.h" #include "libc/sysv/consts/fileno.h" +#include "libc/sysv/consts/poll.h" #include "tool/build/lib/ioports.h" static int OpE9Read(struct Machine *m) { @@ -42,7 +46,21 @@ static void OpE9Write(struct Machine *m, uint8_t b) { m->fds.p[fd].cb->writev(m->fds.p[fd].fd, &(struct iovec){&b, 1}, 1); } +static int OpE9Poll(struct Machine *m) { + int fd, rc; + struct pollfd pf; + fd = STDIN_FILENO; + if (fd >= m->fds.i) return -1; + if (!m->fds.p[fd].cb) return -1; + pf.fd = m->fds.p[fd].fd; + pf.events = POLLIN | POLLOUT; + rc = m->fds.p[fd].cb->poll(&pf, 1, 20); + if (rc <= 0) return rc; + return pf.revents; +} + static int OpSerialIn(struct Machine *m, int r) { + int p, s; switch (r) { case UART_DLL: if (!m->dlab) { @@ -51,7 +69,15 @@ static int OpSerialIn(struct Machine *m, int r) { return 0x01; } case UART_LSR: - return UART_TTYDA | UART_TTYTXR | UART_TTYIDL; + if (IsWindows()) { + p = POLLIN | POLLOUT; /* XXX */ + } else { + if ((p = OpE9Poll(m)) == -1) return -1; + } + s = UART_TTYIDL; + if (p & POLLIN) s |= UART_TTYDA; + if (p & POLLOUT) s |= UART_TTYTXR; + return s; default: return 0; } diff --git a/tool/build/lib/loader.c b/tool/build/lib/loader.c index 0b3a31a66..78e622030 100644 --- a/tool/build/lib/loader.c +++ b/tool/build/lib/loader.c @@ -43,7 +43,7 @@ static void LoadElfLoadSegment(struct Machine *m, void *code, size_t codesize, int64_t align, bsssize; int64_t felf, fstart, fend, vstart, vbss, vend; align = MAX(phdr->p_align, PAGESIZE); - CHECK_EQ(1, popcnt(align)); + if (popcnt(align) != 1) align = 8; CHECK_EQ(0, (phdr->p_vaddr - phdr->p_offset) % align); felf = (int64_t)(intptr_t)code; vstart = ROUNDDOWN(phdr->p_vaddr, align); diff --git a/tool/build/lib/machine.c b/tool/build/lib/machine.c index 8a2f28496..d3d220e96 100644 --- a/tool/build/lib/machine.c +++ b/tool/build/lib/machine.c @@ -288,6 +288,12 @@ static void OpJmpf(struct Machine *m, uint32_t rde) { } } +static void OpInto(struct Machine *m, uint32_t rde) { + if (GetFlag(m->flags, FLAGS_OF)) { + HaltMachine(m, kMachineOverflow); + } +} + static relegated void OpXlatAlBbb(struct Machine *m, uint32_t rde) { uint64_t v; v = MaskAddress(Eamode(rde), Read64(m->bx) + Read8(m->ax)); @@ -1888,7 +1894,7 @@ static const nexgen32e_f kNexgen32e[] = { [0x0CB] = OpRetf, [0x0CC] = OpInterrupt3, [0x0CD] = OpInterruptImm, - [0x0CE] = OpUd, + [0x0CE] = OpInto, [0x0CF] = OpUd, [0x0D0] = OpBsubi1, [0x0D1] = OpBsuwi1, diff --git a/tool/build/lib/machine.h b/tool/build/lib/machine.h index edbd0141f..cdc63280a 100644 --- a/tool/build/lib/machine.h +++ b/tool/build/lib/machine.h @@ -13,6 +13,7 @@ #define kMachineFpuException -7 #define kMachineProtectionFault -8 #define kMachineSimdException -9 +#define kMachineOverflow -10 #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ diff --git a/tool/build/lib/memory.c b/tool/build/lib/memory.c index 4513356f7..f1c645519 100644 --- a/tool/build/lib/memory.c +++ b/tool/build/lib/memory.c @@ -21,6 +21,7 @@ #include "libc/log/log.h" #include "libc/macros.internal.h" #include "libc/mem/mem.h" +#include "libc/runtime/memtrack.internal.h" #include "libc/runtime/pc.internal.h" #include "libc/str/str.h" #include "libc/x/x.h" @@ -90,7 +91,7 @@ void *FindReal(struct Machine *m, int64_t virt) { uint64_t table, entry, page; unsigned skew, level, index, i; if ((m->mode & 3) != XED_MODE_REAL) { - if (-0x800000000000 <= virt && virt < 0x800000000000) { + if (IsLegalPointer(virt)) { if (!(entry = FindPage(m, virt))) return NULL; return m->real.p + (entry & PAGE_TA) + (virt & 0xfff); } else { diff --git a/tool/build/lib/pty.c b/tool/build/lib/pty.c index 906344cce..30f4448fb 100644 --- a/tool/build/lib/pty.c +++ b/tool/build/lib/pty.c @@ -1167,10 +1167,45 @@ ssize_t PtyWrite(struct Pty *pty, const void *data, size_t n) { } ssize_t PtyWriteInput(struct Pty *pty, const void *data, size_t n) { - PtyConcatInput(pty, data, n); - if (!(pty->conf & kPtyNoecho)) { - PtyWrite(pty, data, n); + int c; + bool cr; + char *p; + const char *q; + size_t i, j, m; + q = data; + p = pty->input.p; + i = pty->input.i; + m = pty->input.n; + if (i + n * 2 + 1 > m) { + m = MAX(m, 8); + do m += m >> 1; + while (i + n * 2 + 1 > m); + if (!(p = realloc(p, m))) { + return -1; + } + pty->input.p = p; + pty->input.n = m; } + cr = i && p[i - 1] == '\r'; + for (j = 0; j < n; ++j) { + c = q[j] & 255; + if (c == '\r') { + cr = true; + } else if (cr) { + if (c != '\n') { + p[i++] = '\n'; + } + cr = false; + } + p[i++] = c; + } + if (cr) { + p[i++] = '\n'; + } + if (!(pty->conf & kPtyNoecho)) { + PtyWrite(pty, p + pty->input.i, i - pty->input.i); + } + pty->input.i = i; return n; } diff --git a/tool/build/lib/syscall.c b/tool/build/lib/syscall.c index 76d9c87c7..f8e4976c6 100644 --- a/tool/build/lib/syscall.c +++ b/tool/build/lib/syscall.c @@ -102,6 +102,7 @@ const struct MachineFdCb kMachineFdCbHost = { .close = close, .readv = readv, + .poll = poll, .writev = writev, .ioctl = (void *)ioctl, }; diff --git a/tool/build/lib/time.c b/tool/build/lib/time.c index 30a77c834..f134ce478 100644 --- a/tool/build/lib/time.c +++ b/tool/build/lib/time.c @@ -18,7 +18,9 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" #include "libc/nexgen32e/rdtsc.h" +#include "libc/sock/sock.h" #include "libc/sysv/consts/clock.h" +#include "libc/sysv/consts/poll.h" #include "libc/time/time.h" #include "tool/build/lib/endian.h" #include "tool/build/lib/modrm.h" @@ -29,7 +31,19 @@ */ void OpPause(struct Machine *m, uint32_t rde) { - sched_yield(); + struct pollfd pf; + static bool once, interactive; + if (!once) { + interactive = isatty(0); + once = true; + } + if (!IsWindows() && interactive) { + pf.fd = 0; + pf.events = POLLIN; + poll(&pf, 1, 20); /* make spin loops less brutal */ + } else { + sched_yield(); + } } void OpRdtsc(struct Machine *m, uint32_t rde) { diff --git a/tool/build/package.c b/tool/build/package.c index 41e0c65a6..6e1ee212e 100644 --- a/tool/build/package.c +++ b/tool/build/package.c @@ -53,6 +53,7 @@ #include "third_party/xed/x86.h" #include "third_party/zlib/zlib.h" #include "tool/build/lib/elfwriter.h" +#include "tool/build/lib/getargs.h" #include "tool/build/lib/persist.h" /** @@ -62,14 +63,14 @@ * * This script verifies the well-formedness of dependencies, e.g. * - * o/tool/build/package.com \ - * -o o/libc/stubs/stubs.pkg \ - * o/libc/stubs/{a,b,...}.o + * o/tool/build/package.com \ + * -o o/libc/stubs/stubs.pkg \ + * o/libc/stubs/{a,b,...}.o * - * o/tool/build/package.com \ - * -o o/libc/nexgen32e/nexgen32e.pkg \ - * -d o/libc/stubs/stubs.pkg \ - * o/libc/nexgen32e/{a,b,...}.o + * o/tool/build/package.com \ + * -o o/libc/nexgen32e/nexgen32e.pkg \ + * -d o/libc/stubs/stubs.pkg \ + * o/libc/nexgen32e/{a,b,...}.o * * We want the following: * @@ -84,21 +85,30 @@ * * SECOND PURPOSE * - * We want all storage to be thread-local storage. So we change - * RIP-relative instructions to be RBX-relative, only when they - * reference sections in the binary mutable after initialization. - * - * This is basically what the Go language does to implement its fiber - * multiprocessing model. We can have this in C by appropriating all the - * work folks put into enriching GNU C with WIN32 and ASLR lool. - * - * THIRD PURPOSE - * * Compress read-only data sections of particularly low entropy, using * the most appropriate directly-linked algorithm and then inject code * into _init() that calls it. If the data is extremely low energy, we * will inject code for merging page table entries too. The overcommit * here is limitless. + * + * POSSIBLE PURPOSE + * + * It might be nice to have all storage to be thread-local storage. So + * we change RIP-relative instructions to be RBX-relative, only when + * they reference sections in the binary mutable after initialization. + * + * This is basically what the Go language does to implement its fiber + * multiprocessing model. We can have this in C by appropriating all the + * work folks put into enriching GNU C with WIN32 and ASLR lool. + * + * CAVEATS + * + * This tool monkey patches `.o` files as a side-effect since we're not + * able to modify the GCC source code. Therefore it's VERY IMPORTANT to + * have Makefile rules which build `.a` or `.com.dbg` *depend* upon the + * `.pkg` rule. That way they happen in the right order. Otherwise they + * might build binaries with compromised profiling nops at the start of + * functions, which will almost certainly result in SIGILL. */ #define PACKAGE_MAGIC bswap_32(0xBEEFBEEFu) @@ -226,6 +236,8 @@ void WritePackage(struct Package *pkg) { void GetOpts(struct Package *pkg, struct Packages *deps, int argc, char *argv[]) { long i, si, opt; + const char *arg; + struct GetArgs ga; pkg->path = -1; while ((opt = getopt(argc, argv, "vho:d:")) != -1) { switch (opt) { @@ -251,10 +263,12 @@ void GetOpts(struct Package *pkg, struct Packages *deps, int argc, CHECK_LT(optind, argc, "no objects passed to package.com; " "is your foo.mk $(FOO_OBJS) glob broken?"); - for (i = optind; i < argc; ++i) { - CHECK_NE(-1, (si = concat(&pkg->strings, argv[i], strlen(argv[i]) + 1))); + getargs_init(&ga, argv + optind); + while ((arg = getargs_next(&ga))) { + CHECK_NE(-1, (si = concat(&pkg->strings, arg, strlen(arg) + 1))); CHECK_NE(-1, append(&pkg->objects, (&(struct Object){si}))); } + getargs_destroy(&ga); } void IndexSections(struct Object *obj) { @@ -671,17 +685,17 @@ void Package(int argc, char *argv[], struct Package *pkg, } free(pkg->objects.p[i].sections.p); } - free_s(&pkg->strings.p); - free_s(&pkg->objects.p); - free_s(&pkg->symbols.p); - free_s(&deps->p); + free(pkg->strings.p); + free(pkg->objects.p); + free(pkg->symbols.p); + free(deps->p); } int main(int argc, char *argv[]) { struct Package pkg; struct Packages deps; if (argc == 2 && !strcmp(argv[1], "-n")) exit(0); - showcrashreports(); + if (IsModeDbg()) ShowCrashReports(); bzero(&pkg, sizeof(pkg)); bzero(&deps, sizeof(deps)); Package(argc, argv, &pkg, &deps); diff --git a/tool/build/runit.c b/tool/build/runit.c index ff461e03b..5cb2b5198 100644 --- a/tool/build/runit.c +++ b/tool/build/runit.c @@ -22,18 +22,22 @@ #include "libc/calls/calls.h" #include "libc/calls/sigbits.h" #include "libc/calls/struct/flock.h" +#include "libc/dce.h" #include "libc/dns/dns.h" #include "libc/fmt/conv.h" +#include "libc/intrin/kprintf.h" #include "libc/limits.h" #include "libc/log/check.h" #include "libc/log/log.h" #include "libc/macros.internal.h" #include "libc/nexgen32e/crc32.h" #include "libc/runtime/gc.internal.h" +#include "libc/runtime/runtime.h" #include "libc/sock/ipclassify.internal.h" #include "libc/stdio/stdio.h" #include "libc/sysv/consts/af.h" #include "libc/sysv/consts/ex.h" +#include "libc/sysv/consts/f.h" #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/ipproto.h" #include "libc/sysv/consts/itimer.h" @@ -110,6 +114,8 @@ char g_hostname[128]; uint16_t g_runitdport; volatile bool alarmed; +int __sys_execve(const char *, char *const[], char *const[]) hidden; + static void OnAlarm(int sig) { alarmed = true; } @@ -166,7 +172,7 @@ void DeployEphemeralRunItDaemonRemotelyViaSsh(struct addrinfo *ai) { mkdir("o", 0755); CHECK_NE(-1, (lock = open(gc(xasprintf("o/lock.%s", g_hostname)), O_RDWR | O_CREAT, 0644))); - CHECK_NE(-1, flock(lock, LOCK_EX)); + CHECK_NE(-1, fcntl(lock, F_SETLKW, &(struct flock){F_WRLCK})); CHECK_NE(-1, gettimeofday(&now, 0)); if (!read(lock, &then, 16) || ((now.tv_sec * 1000 + now.tv_usec / 1000) - (then.tv_sec * 1000 + then.tv_usec / 1000)) >= @@ -232,6 +238,7 @@ void DeployEphemeralRunItDaemonRemotelyViaSsh(struct addrinfo *ai) { } else { DEBUGF("nospawn %s on %s:%hu", g_runitd, g_hostname, g_runitdport); } + CHECK_NE(-1, fcntl(lock, F_SETLK, &(struct flock){F_UNLCK})); LOGIFNEG1(close(lock)); } @@ -376,6 +383,14 @@ drop: return res; } +static inline bool IsElf(const char *p, size_t n) { + return n >= 4 && READ32LE(p) == READ32LE("\177ELF"); +} + +static inline bool IsMachO(const char *p, size_t n) { + return n >= 4 && READ32LE(p) == 0xFEEDFACEu + 1; +} + int RunOnHost(char *spec) { int rc; char *p; @@ -386,9 +401,13 @@ int RunOnHost(char *spec) { 1); if (!strchr(g_hostname, '.')) strcat(g_hostname, ".test."); do { - Connect(); - EzFd(g_sock); - EzHandshake(); /* TODO(jart): Backoff on MBEDTLS_ERR_NET_CONN_RESET */ + for (;;) { + Connect(); + EzFd(g_sock); + if (!EzHandshake2()) break; + WARNF("warning: got connection reset in handshake"); + close(g_sock); + } SendRequest(); } while ((rc = ReadResponse()) == -1); return rc; @@ -403,11 +422,14 @@ bool ShouldRunInParralel(void) { return !IsWindows() && IsParallelBuild(); } -int RunRemoteTestsInParallel(char *hosts[], int count) { +int SpawnSubprocesses(int argc, char *argv[]) { sigset_t chldmask, savemask; int i, rc, ws, pid, *pids, exitcode; struct sigaction ignore, saveint, savequit; - pids = calloc(count, sizeof(char *)); + char *args[5] = {argv[0], argv[1], argv[2]}; + argc -= 3; + argv += 3; + pids = calloc(argc, sizeof(int)); ignore.sa_flags = 0; ignore.sa_handler = SIG_IGN; LOGIFNEG1(sigemptyset(&ignore.sa_mask)); @@ -416,13 +438,17 @@ int RunRemoteTestsInParallel(char *hosts[], int count) { LOGIFNEG1(sigemptyset(&chldmask)); LOGIFNEG1(sigaddset(&chldmask, SIGCHLD)); LOGIFNEG1(sigprocmask(SIG_BLOCK, &chldmask, &savemask)); - for (i = 0; i < count; ++i) { - CHECK_NE(-1, (pids[i] = fork())); + for (i = 0; i < argc; ++i) { + args[3] = argv[i]; + fprintf(stderr, "spawning %s %s %s %s\n", args[0], args[1], args[2], + args[3]); + CHECK_NE(-1, (pids[i] = vfork())); if (!pids[i]) { - sigaction(SIGINT, &saveint, NULL); - sigaction(SIGQUIT, &savequit, NULL); - sigprocmask(SIG_SETMASK, &savemask, NULL); - _exit(RunOnHost(hosts[i])); + xsigaction(SIGINT, SIG_DFL, 0, 0, 0); + xsigaction(SIGQUIT, SIG_DFL, 0, 0, 0); + sigprocmask(SIG_SETMASK, &savemask, 0); + execve(args[0], args, environ); /* for htop */ + _exit(127); } } for (exitcode = 0;;) { @@ -431,13 +457,17 @@ int RunRemoteTestsInParallel(char *hosts[], int count) { if (errno == ECHILD) break; FATALF("wait failed"); } - for (i = 0; i < count; ++i) { + for (i = 0; i < argc; ++i) { if (pids[i] != pid) continue; if (WIFEXITED(ws)) { - DEBUGF("%s exited with %d", hosts[i], WEXITSTATUS(ws)); + if (WEXITSTATUS(ws)) { + INFOF("%s exited with %d", argv[i], WEXITSTATUS(ws)); + } else { + DEBUGF("%s exited with %d", argv[i], WEXITSTATUS(ws)); + } if (!exitcode) exitcode = WEXITSTATUS(ws); } else { - DEBUGF("%s terminated with %s", hosts[i], strsignal(WTERMSIG(ws))); + INFOF("%s terminated with %s", argv[i], strsignal(WTERMSIG(ws))); if (!exitcode) exitcode = 128 + WTERMSIG(ws); } break; @@ -447,24 +477,36 @@ int RunRemoteTestsInParallel(char *hosts[], int count) { LOGIFNEG1(sigaction(SIGQUIT, &savequit, NULL)); LOGIFNEG1(sigprocmask(SIG_SETMASK, &savemask, NULL)); free(pids); + kprintf("nocommit%n"); return exitcode; } int main(int argc, char *argv[]) { ShowCrashReports(); - SetupPresharedKeySsl(MBEDTLS_SSL_IS_CLIENT, GetRunitPsk()); - /* __log_level = kLogDebug; */ + __log_level = kLogDebug; if (argc > 1 && (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0)) { ShowUsage(stdout, 0); unreachable; } - if (argc < 1 + 2) ShowUsage(stderr, EX_USAGE); - CHECK_NOTNULL(commandv(firstnonnull(getenv("SSH"), "ssh"), g_ssh)); + if (argc < 3) { + ShowUsage(stderr, EX_USAGE); + unreachable; + } CheckExists((g_runitd = argv[1])); CheckExists((g_prog = argv[2])); - if (argc == 1 + 2) return 0; /* hosts list empty */ - g_sshport = 22; - g_runitdport = RUNITD_PORT; - return RunRemoteTestsInParallel(&argv[3], argc - 3); + CHECK_NOTNULL(commandv(firstnonnull(getenv("SSH"), "ssh"), g_ssh)); + if (argc == 3) { + /* hosts list empty */ + return 0; + } else if (argc == 4) { + /* single host */ + SetupPresharedKeySsl(MBEDTLS_SSL_IS_CLIENT, GetRunitPsk()); + g_sshport = 22; + g_runitdport = RUNITD_PORT; + return RunOnHost(argv[3]); + } else { + /* multiple hosts */ + return SpawnSubprocesses(argc, argv); + } } diff --git a/tool/build/runitd.c b/tool/build/runitd.c index 6e60a1797..2d2225a8b 100644 --- a/tool/build/runitd.c +++ b/tool/build/runitd.c @@ -87,7 +87,7 @@ * - 1 byte exit status */ -#define DEATH_CLOCK_SECONDS 5 +#define DEATH_CLOCK_SECONDS 16 #define kLogFile "o/runitd.log" #define kLogMaxBytes (2 * 1000 * 1000) @@ -339,6 +339,8 @@ void HandleClient(void) { dup2(g_devnullfd, 0); dup2(pipefds[1], 1); dup2(pipefds[1], 2); + if (pipefds[0] > 2) close(pipefds[1]); + if (g_devnullfd > 2) close(g_devnullfd); execv(g_exepath, (char *const[]){g_exepath, NULL}); _exit(127); } diff --git a/tool/emacs/cosmo-c-builtins.el b/tool/emacs/cosmo-c-builtins.el index 862b8d7ba..bda245d50 100644 --- a/tool/emacs/cosmo-c-builtins.el +++ b/tool/emacs/cosmo-c-builtins.el @@ -134,6 +134,7 @@ "__builtin_expect" "__builtin_trap" "__builtin_unreachable" + "__builtin_assume" "__builtin_assume_aligned" "__builtin_LINE" "__builtin_FUNCTION" diff --git a/tool/emacs/cosmo-c-keywords.el b/tool/emacs/cosmo-c-keywords.el index 85b91f18e..3323464c9 100644 --- a/tool/emacs/cosmo-c-keywords.el +++ b/tool/emacs/cosmo-c-keywords.el @@ -1,50 +1,6 @@ (defconst cosmo-c-keywords-regex (let ( - ;; (kar - ;; '("case" - ;; "do" - ;; "return" - ;; "struct" - ;; "for" - ;; "default" - ;; "auto" - ;; "while" - ;; "else" - ;; "break" - ;; "union" - ;; "switch" - ;; "continue" - ;; "extern" - ;; "sizeof" - ;; "if" - ;; "goto")) - - ;; (ansi - ;; '("static" - ;; "sizeof" - ;; "if" - ;; "typedef" - ;; "const" - ;; "struct" - ;; "for" - ;; "union" - ;; "switch" - ;; "volatile" - ;; "do" - ;; "return" - ;; "goto" - ;; "auto" - ;; "enum" - ;; "else" - ;; "break" - ;; "extern" - ;; "case" - ;; "default" - ;; "register" - ;; "while" - ;; "continue")) - (c99 '("inline" "restrict" @@ -64,67 +20,10 @@ "_Complex_I" "_Imaginary_I")) - ;; (cxx17 - ;; '("this" - ;; "thread_local" - ;; "private" - ;; "catch" - ;; "export" - ;; "operator" - ;; "sizeof" - ;; "dynamic_cast" - ;; "static_assert" - ;; "const_cast" - ;; "const" - ;; "for" - ;; "static_cast" - ;; "union" - ;; "namespace" - ;; "switch" - ;; "virtual" - ;; "class" - ;; "alignas" - ;; "continue" - ;; "volatile" - ;; "template" - ;; "mutable" - ;; "if" - ;; "public" - ;; "friend" - ;; "do" - ;; "inline" - ;; "return" - ;; "goto" - ;; "alignof" - ;; "auto" - ;; "enum" - ;; "typedef" - ;; "else" - ;; "break" - ;; "constexpr" - ;; "new" - ;; "extern" - ;; "using" - ;; "throw" - ;; "asm" - ;; "case" - ;; "typeid" - ;; "decltype" - ;; "reinterpret_cast" - ;; "default" - ;; "noexcept" - ;; "register" - ;; "nullptr" - ;; "try" - ;; "typename" - ;; "while" - ;; "protected" - ;; "static" - ;; "explicit" - ;; "delete")) - (cosmo '("__msabi" + "var" + "function" "offsetof" "microarchitecture" "targetclones" @@ -298,7 +197,9 @@ "__weak__" "__vector_size__" "__ms_abi__" - "__mode__")) + "__mode__" + "__seg_fs" + "__seg_gs")) (clang '("__optnone__" @@ -306,11 +207,8 @@ ) (concat "\\_<" - (regexp-opt (append ;; kar - ;; ansi - ;; c99 + (regexp-opt (append c11 - ;; cxx17 gnu clang cosmo)) diff --git a/tool/emacs/cosmo-format.el b/tool/emacs/cosmo-format.el index 446fa5a28..6135a12e6 100644 --- a/tool/emacs/cosmo-format.el +++ b/tool/emacs/cosmo-format.el @@ -97,19 +97,22 @@ "Beautifies source code in current buffer." (interactive) (when (and (memq major-mode cosmo-format-modes) - (member (file-name-extension (buffer-file-name)) - cosmo-format-exts) - (not (member (file-name-nondirectory (buffer-name)) - cosmo-format-blacklist))) + (member (file-name-extension (buffer-file-name)) + cosmo-format-exts) + (not (member (file-name-nondirectory (buffer-name)) + cosmo-format-blacklist)) + (not (save-excursion + (beginning-of-buffer) + (looking-at "/\\* clang-format off \\*/")))) (let ((bin (cosmo--find-clang-format-bin))) (when bin (let ((p (point)) (tmp (make-temp-file "cosmo-format")) (arg (or cosmo-format-arg - (and (locate-dominating-file - (buffer-file-name) - ".clang-format") - "-style=file")))) + (and (locate-dominating-file + (buffer-file-name) + ".clang-format") + "-style=file")))) (when arg (message arg) (write-region nil nil tmp) diff --git a/tool/emacs/cosmo-stuff.el b/tool/emacs/cosmo-stuff.el index eca89f3c7..becba0ff2 100644 --- a/tool/emacs/cosmo-stuff.el +++ b/tool/emacs/cosmo-stuff.el @@ -187,8 +187,9 @@ (format "m=%s; make -j8 -O MODE=$m o/$m/%s" mode (directory-file-name - (file-name-directory - (file-relative-name this root))))) + (or (file-name-directory + (file-relative-name this root)) + "")))) ((and (equal suffix "") (cosmo-contains "_test." (buffer-file-name))) (format "m=%s; make -j8 -O MODE=$m %s" @@ -468,11 +469,11 @@ ;; -ffast-math -funsafe-math-optimizations -fsched2-use-superblocks -fjump-tables (cond ((eq arg 9) (cosmo--assembly 1 - "V=1 OVERRIDE_COPTS='-fverbose-asm -fsanitize=undefined -fno-sanitize=null -fno-sanitize=alignment -fno-sanitize=pointer-overflow'")) + "V=1 OVERRIDE_COPTS='-w -fverbose-asm -fsanitize=undefined -fno-sanitize=null -fno-sanitize=alignment -fno-sanitize=pointer-overflow'")) ((not (eq 0 (logand 8 arg))) (cosmo--assembly (setq arg (logand (lognot 8))) - "V=1 OVERRIDE_COPTS='-fverbose-asm -fsanitize=address'")) - (t (cosmo--assembly arg "V=1 OVERRIDE_COPTS='' CPPFLAGS=''")))) + "V=1 OVERRIDE_COPTS='-w -fverbose-asm -fsanitize=address'")) + (t (cosmo--assembly arg "V=1 OVERRIDE_COPTS='-w ' CPPFLAGS=''")))) (defun cosmo-assembly-native (arg) (interactive "P") @@ -607,7 +608,7 @@ (compile (format "make -j8 MODE=%s PYHARNESSARGS=-vv PYTESTARGS=-v o/%s/%s.py.runs" mode mode (file-name-sans-extension file))))) ((eq major-mode 'python-mode) - (compile (format "python3 %s" file))) + (compile (format "python.com %s" file))) ('t (error "cosmo-run: unknown major mode"))))))) @@ -710,6 +711,7 @@ (concat dots notest ".c") (concat dots notest ".cc") (concat dots notest ".rl") + (concat dots notest ".greg.c") (concat dots notest ".ncabi.c") (concat dots notest ".hookabi.c") (concat dots notest ".h")))) diff --git a/tool/viz/printpeb.c b/tool/viz/printpeb.c index 8c6151d02..1a31a9399 100644 --- a/tool/viz/printpeb.c +++ b/tool/viz/printpeb.c @@ -382,8 +382,8 @@ void PrintModulesLoadOrder(void) { /* struct NtLinkedList InLoadOrderLinks; /\* msdn:reserved *\/ */ /* struct NtLinkedList InMemoryOrderLinks; */ /* struct NtLinkedList InInitOrderLinks; /\* msdn:reserved *\/ */ - printf("0x%p\n", ldr); - printf("0x%p vs. 0x%p\n", dll, GetModuleHandleW(dll->FullDllName.Data)); + printf("%p\n", ldr); + printf("%p vs. %p\n", dll, GetModuleHandleW(dll->FullDllName.Data)); printf("0x%04x: %-40s = 0x%lx\n", offsetof(struct NtLdrDataTableEntry, DllBase), "DllBase", dll->DllBase); @@ -456,7 +456,7 @@ void PrintModulesMemoryOrder(void) { /* struct NtLinkedList InLoadOrderLinks; /\* msdn:reserved *\/ */ /* struct NtLinkedList InMemoryOrderLinks; */ /* struct NtLinkedList InInitOrderLinks; /\* msdn:reserved *\/ */ - printf("0x%p\n", dll); + printf("%p\n", dll); printf("0x%04x: %-40s = 0x%lx\n", offsetof(struct NtLdrDataTableEntry, DllBase), "DllBase", dll->DllBase);

dDv1AFXBgfDtFY!O4<_QOgL18$ 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 diff --git a/build/bootstrap/package.com b/build/bootstrap/package.com index 4266ab544f1bcaca4143c1082dee4b8a5eadfbb8..cdf356dd02d3f98d36222ae568b3eaed6cbeae67 100755 GIT binary patch literal 112372 zcmdqKdw5jU^*4S_GD9XIa0W;;%5A_=6S-v&G(!@YLng2XCK@h5R1j<+0`Y=m22d_Z zI*D>P4q{8ISZ!^q{o3M%wpJ6=WRgIJphy4(1ciVCCk!`1lW>vqe%3w{1lvB}-yiSu z{_%?sbM|HJ+uCcdz1G@mZ}T2_a@<09_U#FRU==z9<4+VUu4s@x6Q*7hxh81sDhU5@ zMTAJw+O?4`EO64|*!8g>M9i&!v!l?NaT`TPQ+iu% zm7p={daTGWk8r_Fjtyui8;|d`#KlP;*^#-80+!b?NVDThmx$O@6lh4f=b% z|F1W^u;Eu5rvL3%4>mkdcCO43LaFvhUH+tJwl_C5H(BZ&2R4fD#cc0&|MW$DpKA;> z+SW8)361K~CwXzVjpCKYQFqyr7ssZz$qo5bc6wxsa^w@#1sJaw_*8ub1@2p0V9_Jmt*ADHk&_CR}T;S-NN_VD9#Y(o~? z2HMjHrVUK+J+*MI?cs%Uhdlbk!*k{?vW*@#XYS%*kNY2e)HZzdZ4TRQx7p?{om+S< z$UyrO15w;HFkya??Lpg+IksW)!iA5{FMQZH|B1&-Y%?=$zIk&WPna{uHopk10{V&Q z_ZKDE8Mcz*`3tiL+UW02=iLKsg-`e&_eB$I89d?f#o3QP;alW?yb!&(+M|TIkD^81 zox8I}qYF;@EH#Lm+rv7pZzzS;&B19_&M92z7ZL>_ zCqwwk{_};S>qvQ768QI5(eKMUqVeeWckdeUU%xBFY<#=7Ac(@1dnbLHWTx7{&KCB- zx2G@y@dd)G|8PmRP@v_CG%!?j;sKi=Xzz5@x?k4b=n4*}B?{VGf;LOgdWqUX@s;Uq zo6G#(qF0Kh7b$f`9}0p^D01v8$}f7Ar#b62kIZmL!^w^LQ zaK&yk0_m}@839}DS|ebk0QQTbs#pxt(N?6Gip(@Kfkw-bb467`OPnAL+}FS1q9pbk zm@L^^in_fPBOtA%sJcuLLelV}ZlZ{UbVV~SyiUKW{Fpnps+f#)F>C@Nj zThqKIw5DZ^_K_f1gj~nBxsFr0j<#Hf?l|B$Rlvew0Yo6#4sOCk3fhMjL6}#HioP6d zXH^fxxzIa7&|4UaU(xj^1c8-r7K9ifYy!gKcrJFlv;763YThPUVAvmG8-XSzXsl1;MNAb1OU9?v7h^Ak!O6Y?K2R6Mas( zO%(mTT@|PNW^^l(racCD8r*j*ur=1Bh#u8ZrK5}-I1$h4T86O!2btIydDp9KeQ;)j zd>^_kPm>GesUGF~0v3G2I>n>3GUd|bJoQOSUS*rFz^#O;yP!8-XUEZrh-^!fJds$2RP6&?Z#oP7-PNcBlN-GPTww!;XGUWdv z5~FP8-3j`7SvicX*Reo7z}&IuUHJSPkvCZRGGNvM!3RG~%E__1m7K(I4v0q(JhZ++ ziRiEr%L;Q6JUQuI;$?geO66at}lYQ~jV!PwCGy(z2WQGNM}2d6xrI@<=o%4tPol8= zgQbhV&T32u)4vu7s`S^A;4;2<@Q;vge6D^uUXey$Do3r|yKwH~W2d+g5(HX@o$2?? z_3>oap!Y`R=L*7{XJUlno^xh!K>VB)Zi(p{(;cMs)8B8ge2qVs@u805A0HcnonKn` zor8!KZ0JUGM4{`dGwO)`Mj?2t!y^i**X91-iBP@yom221svPQ@yVOVN1VkO`{9Xe) z8@uArIS>0DrnJ}aZ*~-xzSsPPz8z69-sR_ z?&NzBx$e()UF^R_sGgVbZ`Q1-xzn%HTU_}}z@)%yK!>cx1v*4u*KFeFQYB$XR>zwHEip)DH$h(d zmIaPp!HyG`=X@k}aS?uPi<6l;!*21!&cdGdjmLS=D~&xLxzVef(d2d=wgAv9wo9fo zI6~+D=27pnGIfMKy33vMibp&UqyVG+0?@3wQy^gjK4I|@rldsHc>>{#)+vxX@|=Dl zPx&rS%E`kwPhf$~)@$}Xh|mpdCC7&y$7Ml@Ri>C&rOu?>MtdJlxMz_(`|r>fep@@oYw+v@y>A-$ztsB4Wq&o($hfhKIR^1j4BpZ}hJj(_YDs?Xu4&1`x@6hxr2j%@(1 zEAR$~Ot}>^8#rmJ-Z4TJ^yD%3h=NDi%-$x6r8f(%B`)Aq4(rK7kb^{z-euf6PX!qsddAwc{X=f|$z_$l4)1675Y!ulB>EqCcy?eO?>3vgd z&=jk;#940|IA}!n0-x?jr;=}~ zwl$)Q3QGyQY{n8akFJN7w-EKBl?5Q7hh{Z37;?GtBP&1oCUOFLjQ=L4uC&zj9wtKz zIw}ajBusi*+Zs%EaH>7U5%MT4)dK;Hbpbi`{06TQ<^uBh4aym>Ql~At8+qlMsXj*t z^V|Uar@l@^vrI9^?-tQ;LrocQR!jSgBh)(ab*MS!Tl#}a!sb4Ev3^dX?_u*z(V$|! z6QKq}i@01cWfBWyYZ#{B9{{DPt@iGxKu2NoE+p+kwF@lIo9hwQW_^c_s6*aC7+v^) zKEatf3tZBDH?UyRKBj-d0?YSV1b@V<41|7_;|)G0dNYSq0JP*rlnGE71-W+3s|=Zo zSfnp!U7IZEdd*fEL^FQ0GeJSXlzgh}d%)mG7KMi%>w+nTK z&6_Df;K9FBkl19{{60@LVO_O!Ao?zkzJ};lOW6EZ#AwS6n{VH2gn-b6NNgZ(BP*9Z z$`2l8k4M>|t+=G?RSUs+s)_wDSR;DmPttBiVcmNFbQTC%A}2IhdIjy`kGlS%b|d=l zR*rj>(_ZDASGmwoFy%wrS11|GNtw))9II-UUKfQ0*5`99Z^rm;Szw;NAolrKB_~D6 zNmp`MRR`o5z}fIG1OM_Pqu(_7MiG0!42+n7qT=)gZTDX-K&ACBsKkOF?&pDw1>aKu z%z?^7p}~gn4^i5fJaju&N#%0jh$sNNnDPn8)dFE$9rD>u@CJ2gn|a}%!C$3{KVwML zs9bdcAx9ID>`*=VcOD=bHCKkDiZaS*bA*(7chDtDA1t5Ry;Ap0Q7+b<=o+}#+uvub z^ubhj_wqBsKHwziim5xE5d7#y!48EhA)wFjn`?)m3hjl{f}ot!8&_2%k?>o7g~TA= zt*lP7_>a4lP~`WG6(hJ<+`10%%xV7mucF}V&H@eC0%O4t{gFt#S1p7Z{H;I1(Uezt z$~QMpIq6l7YnQ)724hBtr8VlZ|V_iv7%_!i>XAbDY z{FuzoDDy6<#+#1Zm3rX9Fu$28S0Y;A!VF&<7#q_+lWLOE0~d#(%*7dg6BD;KppgHY z2ADJ&FyXt~%+LQ36YNXYzUe0j**Xj(rSXmCFEIULwD}WITUkc7zgwh-Yt#q}+ScnLhoH(^B0C(rR(q|YYxO^-5OBtK{`iU}8hw4_ zxGUo`X`R`R1|Dp1G`;mq-CN&S{uXEz{TFdEkYDx4%`QFzX045g;aLGDkf{Ze-RiBG zJ3woosDWi;1YcjKj%@r0yr}G9;7J|13E|pbIlwWV;0Z(iiUce?tz{SC5n|G5t-t_% zoBm)}ylpVN>F8S!n$r8zG58Z&RoTh5k&TUKCo75Ha=3oVj8tK+qwPM@h14 z&mm9E{@rKj&XZ_vQyvCga|23YmoCdznn60XHzSH&{@i4yCMUlJb<(SPiRpV)x815O z?TJ1COwf+4g8hgVC^dma>Ormk!A71P?O@CJ9(x#OL;SQBw1p+7!MY*T=27XcXOM7! z=?!HcPDF!(|NA!cJAc3g`+I{!9>qGrl-5udFRPJ>FEWxAHVfB%500uQx8(9Aogypy zHW46M+F+nLY4ZlX_AEU)V;s*Z>U053Fs}j3ZH2F_9#*AXY2_kG`t4ElSF1l8Y5UK7ytnfU~ zd|Jc;c&caPSaApoJ{`l_52979%Fi54@+P7Rrkr)`@+ez9?dMp~BL?czS51{5tDa*D zY(f{~m%t8p!4YZ%e{_aQZd{!dH+J=iIJ6UoYR0Zgiu34OBi}ZPqr9qlFl0MN2lPC(ujIv=d#dw2r?D1Hs-n4Jp%tv0Oxr8KP zz6n^yT=Hpzw4mkaV54_lH_NyAsyTwaNHOpH z1lx)}9q}9tKrz={jTiIy->=3CdHj!8;}7!q3qOmO|1AFG)wogq;j3|#m!EVs9^i5L zXK}~X`0sfBfUEIOc)Z8Y;^NhK1JD0%Tj%)B^Z4Ot{8JDwmLI09+QumX#=`dV8(5+F z02W}_WCzz40v&NHB?fW9B{+7~Qi|SO`wTwX&?{gO_dzpM8nK}&U+{GS3E~IR4^zDA za{Fw>Yd3lEWAOxM>8$P>GOqf%!rW}Pz&4x`iG?v3d?6p~$`j1$lMCrQ?VwvZq5TGO z1n7tsAfLPsWYpl;c z9Y8N~Am3A1We z6_g@>WxS{SvaVk#UD*qGz^=_J)te(GPvBF?e4A6eO3O9+DHqa!camZV)ftWEO)rzw z;$U@0Y>nmwOuxwD>zR^#=T;FK)f+C%X6~nS4564`1L&8JeQI=^ge0)mm}>@t@FoBX zbD3(obvBJo8FD!+3TjyjmJK*UtW^0cBnLX;r8NrWgI89!{)oXOe~N~p!JP=*zFn#^@RrB2qr*woIYlfz8y8vwYzn+lxh z#|vyST?a`9Fj5V7b8#A( zM6Jy7$7F%Zm#bWWBq?Qqo~N{KDntLh!9Nq!0>M+)YLg3S$a?az(VX98@N<^X0`Sbb zO#@Ms)LKv7DX?;LCOTmNug5UK#%@Lem=o`A4fUQ1u)2#@#VQA?CCs!K3AZ|W#TD@xd-Y|);Kp$4%HDy@3*oyJgY zc}fQwT+n~IN2##4fCYP0lijVHtNAY31p)^uV}!imb4C_GG=Mll+B={V?XTaULUo#j zWlpn};5cRiHivsGt75pIdklIGbg8j1Oz9$h5CfUkgpDs%sjF-48o1Eg-w*I6>4VA0 z?+*8fZ-$UiUDuKjtgw31#95uK!;6Q*Fa>wE@Wx&$5<))kFqoJ+p(+M-LaKHIXjH(2=w`_Ogu0l=<6=B_GXW`pNU&q$77Tj z**-op7)R9P9{<9cQ!ZmnkKV0AfameL%ho9joWgOyxqor*py}qF8f4GnrWAMPobINT zW(+8DRH=^~W`ze>X5a1a!JLr6iW^c`thpHx)#`R0DedBR&Ni)xcb+Ki9UCj-Jj!GQj>Mp2RuqtxJyL}UG+TB! zMyj|3)O!LQpikIAzzS8`+vI%C7!78br+l_RC)P+@vj~>r1uz&>H}pN=SuUn*!7d|J zfSC(8$i=C2h%-vgGQlm$w#=cEON`#S$o@wqy3mqx9xR#Rh4Nv8U^g+CGy)tc?6&iB zhTOEX3}NE);Q4NQN@pOI0#GE8luuPhh51{I`qQ!AdqSj0^x%m357=F$iWjK{&hB7n z91%rYE6F*Yz>oSSstyz&SMz}6-VF+{QO+c{^{V6GiA;2Kf;uQWEe<=;s!38 zq9%u55rqLKGLw(v>l>Px+)m#t7A%P;IKhDH;tdww5xE1Yy(sm>PF|W)henc++K*B{ zH&RVV9Z4pFtQlx>n17C3w%jiI{4?kq^O%1sePb8;z4B_e9RSk0x~v(}x_Zk_zX?_a zuAbqHx>^IS_2m2vgMg`!N$@?WG<-}Mp1@{kPo~~1?Q4&?B@)LIp$d`!bp)0Srf=5< zeNK~B4~@k6g}=A90t#QGH~7i&Tw$2sQY44nxxx%CX2KQbxOmm%2JE)J1>Qu*7%{%& zK!?d^(zjv{D%?c`-dY2z0m23)JDLn}twnqLJdpq2%G?ek*?%bW6qO-U)TK#*F`_?} zrk|asSV7`u>VzER>NYJ*OL#aBHk^`4@{|(xLKOm@V26OPsGKAIEH<3qXh^;E-F64{k z6`n+e-~L?`@`_KTj16R^3O)+~+_@S}tLAOU85=gGTBs+)Fp|%X#0b^ozas-Ao&sJ$ z0!iU!!wJJ%tf7a#n=K1sCIr2AfGc0rmUI(@`yawe>4yrRqHpIkb#6qN;oIw^#R!WTfxF8+ymjS5vG$P z=tRf0Vdyqh1`(aq8xw#YLr}@FzbX3T5Icp~n^s?Z`NR~#g(`25Hnk*_@aSuZ#!-41 zVR1PuDk9_|3Z=m4$(S-FUpuqcNCA#=rXyvx_BB$}N9}eNh9?|&2{Pv4-%_-m%Ic2V z0JM^h>II z4+WtONtLG&z)nzY0Yd0ZqvlN^9((F>V#}6%FMb((;y|2ON%v#^{6(tIJ`S6--CeZv zv^O}_*}8%v|teFk(_M8rr%Z#%wU$L+B0g1Dru_Lqm!Hy1A7^)d<%CZ zs=~1+{z@UfpNeM#wg68q$gF0q{S?ZVZ+2nSL|&jM?z5!)SPMxJIVV$)Lk%PnEm-+p zhK_1q!5o8Dz)q*yt=x0xjHZ1?M21TLWK>E;jXDkb44g~{(O0}f%GIrJ3=R2V?J5&4mC!qKy(c6)ReNv#+okrUhnF)ttxyNP;(O_no103*&&5%joTf z<_hWj3$DEae)HSB|3@9s{(IGV7VM^1hd?JkuW^`#Hm~wsbQEAb@HUIb=6wuJS00cm zD)IF?vtRu!Y>24fjP@irH4REFNTh=hWv7A&t4y8<2wz-aYYfH94qIR^hLOUAW}L`j zUCpEDQ`u~!i`x631Uj8Yrg%~Gv7%afSdh+sUwGoSE zISpAI(h*qWRrbZbwZJGV^`+xkVHhU_#czqi;!N&$7Hcj-B#>e9-5SUc{kNfRP9J*m z`{^Pyi4gWU87dEIOvQR=kolsaP{9;sH>kA(6N{s1&H8)dntxd%z>zo>BnCJh+VlhWWB=3r z1GSz&CE(6^p?^iI%UC zWINdxy1|mU`HUM1JeYB&{7AdKJjsyriLp6C`YxF8leP9%5Y0*!Scc)Tkyp~SY?^9ixNG0 zm=5sroR|HLa7u{uk*BlZ3d@5iITN;=8Su8@UYMIymCUFbw1ap~%9GGCv0@c_=(2M(crth0ggnS0O4`nfIYeTUgVMUX70Lp4(jw88z zGu2634Db$)_CkPT)|L$cDCAG9qRsLATG%iBI23r`>fZM6leL^Sx&Js>#|Hmwvdr3M zaPWVdoGVbEI3Lox7zKfF} zW`G4QUyGJ#zNH;^MxwjcDC}FZ$*E8q-k~n!)RuZ`}*PXHWBhDX| z{Kn(lR}z=gXfg>AN&DeAXM_1isUP2B#%Tai6Eh~1%x1&_t#sVlMY6_8J-RS;yrpIi z4P?Gl_S=^P8E1-!tY__4a4HI$CL-jRa}PEq@G_-=weKUwlgh;rJvpb`prSghU!Wt_ zp9598#(F!odYD&YkY;6wN%wB08uaA9-Vvp{5bA~oq?!+@;7I0Mp_>qu-w4qggaJ!w zE&$McI2Sx0-%e2jnt=z$2?1UA^{l2WlGW*SLz!l!bB7Rlu}>lGhg(0aP=a1vjm-)6 zqUGRWM`?{fp0;TJ^C?0~Z0mZeJu`bAfPCE$cmx5dQbnrP4B#5R7CA@*fmyyqEgSwFH-8t1Xg~60(3;En$N$B(L1*;?~1c8XYwh; zR=}Lx?JG)FlE20$0y!)Ba~`i_3LMv`Sh%<~{b*F&YN(=i(yg=63H6sL=w)4t zMfxDr^_P7R=H4Dse>V;9f`Rp}siM$yO}c81M@lOetN^k&Y5=R|%eN!(#-Amgp+qu8 z{{-1t?YGFfzS?sHd!X zQJM(9I8ddEnwuIvRqs;AFmVqP_qP5q1QrZ?4Y^f>A=t39TKwbLkt{q`vB^65~huuE2BT?_m$2Nu`dM`1J} z!4cb02)n{Rp62lXlGPFR@+&oGYR>o)YU!hWeF%F#YRSkG=h*YnHht&GBu9J2V;)%I zGH^9RJ621~&KD0K7`?TG*d(=_r_8aZ@Z}7}iC}G-rG;9OD#$1bZbM@Pw~3lYA#)KQ z#YW#gSv!Zl&a2)6dtqMiQ9C@SiY+Br`Z?AK%HS6Gop_Z&{yQS@2`qu{eqhkp7J2 zzm#~F4SuE@m^wC9ecD2{MGMgt1u{V6xJUAI20=kI8OsCMWyZQFJD>3yq1+-XpJ1jV zYdU4kvqZCIBWoVED%QsV3p)JX{a00j6&OM(a${0s@yanjg zHys*65+`l*dv2gZIS8shqHLh!3152YO@WR%QUxL0p$9tVNflos$i0XH9g7X#6*f0O zJ%At}ME(iJ^D^XGvT=FU;#8)X>`cvq2Lg8rx+j>G=FMD|UV<}_DH-H^>lIJX^_thc z%Cgi5Tw+UrjAa=HFXw{bfJZPGlK)`V+vW*u$1y;$rIisKs3V7=DKCx%F3?fH2&Co1 z)$Pc7@*t3_U&65Fh4CX-{TaWT{(>K9rJt-2g?T#>u6YYT^S;85R*{WHAW`GU8jI(* zMHu`ti(W(6kt*tt#tO4{|4kH}KbBfp;SXBRuR-3y5tnJAQy4m>orWR-=O~r*cS>c| zJyGoZ1~HI^_bK)Zmacnf2(Ir$!a3x~wsizzt&hF2+Z`R?KMYCBM8 zrxp7dl%d_H6-&aamZV0}IoJULPcONH(24S15iS=To5iUf97{`;3kXr21U>gFM6O41 zqFt+I(dGggQpSaO*d*V(uT z0D;&bG%qe0!R+G7@;J9hfgJ2-UdTGB@EPF5tomW9XvbkW_utf>@^uc|Z!m^s;6Z_< zCPAvm#QZRTGj#>1zFsTgpkXp`e^GOc<`-P-B}m{9yK(XzHrJd&B5700ajpocJ8L?k z35z(Ce_)Mir~&bS0nwwTM>HYdsHYniT`FzCty}O@(?6O!s1y8-Xu^PNz@cOat-mGk zyP~<5k&E_w)VQJv=b-zdmkCrmUpfnF?9r^|PS|15gvM)Ni62Ks*JMVsUhjm>jV8Q& z4Qv;J?MW>VT}LbwLO_t)z=}+M_*cwL&jYc7E>~nozkC`{tq)v-VrWQO^CFrJLa|iw zICv{=*nx=1fH$Ba(jP(?)~1P0G9>tmZml+Q4o^9>%@9&D`e6J-WqoI6X_>5%T>{AxRtaPa5Ve+i7|cWhjT{5JRvNM0OJOXHih2LK6$V?N{E z!C|&8y+0M)azKOheuW)J#jvOyvBB*bJxwJ~3jEQL_ki8#6;+IJGYs2n&%kLI;;sow zpO8lnk*7(zR7r=9SC`GuFA*^s;&n7IX;Z`&srqT}AkiJ`52r{pE*E!K(H{8)=$tqg z_gBN}dNJ}A3;Hvlqq&TtHuO_-0Stujf-G6PU{6Db%`7(8g{?~JAt3P{tJH%5K`YXw ziuvdkI7aIR_l*t0x2H# zUK^`L?{uARMRLxmO9&14(JOwpS~e*SN_{9|3LKFF-$<)qoP;M&DvSRbay}B+fFBSa z%x_ujW6IZ{r_?tksbUryQ0fCm&X!%YxukWCWf${t$m6o?@mt<(kt*ph(4#J~del-2 zZgZrl@!ElfSacJy7C<=Qom#~QL?}{4G6x+GDuuZe41pYL)4OO*plH5VDaZ5Ff+(dB zIl&VG1Z~hc(M)s$n-Cn_!;|?~dP%ZJEigFlF3xd1%44aKp`M^W-4k44>|fri)UC~! z9VKip5jIGn&VvIYPL^)C^bx6Y%ETEwM(>Z~_=`N47o58=x1!BwLST9xcFVlrG%+s| zTYgEB2h#wVrq5a2yUbIP?EbqVw|hW_aFc>a@)K!NFRa>uSwxEnp>5csq5@9A9*kbc zbhh5k@vu4dT3!yh0s48=GYjqz5Pg48_C#5_QeaY72%gxdGPGGwbD;rN+i1O!`?xp> z6QlMDWaeunN{61Sw78Y;!0eggw`%7f24a+4ZsrNm;mRz`9}2wJ$>p_vNI<9gPN2R1 z1v(t%|61GQyle^)I2?VVyF#!aRa^7~&#_SsOe8CCV1%vnj5hNEiW`Cvm+It)8m8b< z5k$vZ%qBRpWSVcoukUs>`7fm+IMEU?qEZXUT-%E+5XO<8gyx%hPvC<>hiHd*uJ6c$ zr20BeaS_W|>{^_uCVzp7yv0YEH?|OR+#zF0^4Y<5t-S=aE2ohTLzd>lqNbAqTI7*h z*dZYEEt^+;pVK990oAMK@YCAXS^oqJho=fmj<8>lXoso!5myn^@h|{Q*KyiidM7US z&dUqhaj1I5v-9#j!NDyuCXB_d$j}zzbfq%%R9qg&MU3q9C3u1}?0RG?_U#9}igqmx zaOrVRRJ*_t1bn5zAmE$71%t$m1sFLOp}Rn|f1F3{Lbd?n{1n3gAd zorMdT`e7OPll07f{9?4n<<+_7K#P8a0A(!EcGR*F%TU{S!%) z>FmF8_<@Tg)PzMVy|(^AM*Z*+zrKDwERcz#5!KUm_|{m|+PR_{z)^_^mAyoRxZCns z>&sa5ovU{ij+GAh%^z}Op!0kQEHeApP7O!Vk+YC^AzO^-tqmFhJi~fLhz3Be)dL`9 zrUffEME6vhNY3)W&8P~K4msP@-ILbj!KIs|+|_-A+>8{wPyn-DwvJpsREfBIgNcGS z_FmXTL-H!oy*jBoted&3Cczga4$?lJa=<;wqOfT!&_&*~ab(;1fdv#;u*@YE zuu9Izv}JtmVk61M#ZDWKl9EbBhXck^hR6}6Uyrg^p0?>PwBicnkLeNsm|3)52ujed z$l7*@JE&EJs@?^lS8{8PQ?%t5IiJXqp1Fzd>`ScD2VZET=MfP$0yk2{MOq%^OKmhz z>6w%Gg$^M~l}9MO-DPn=pphy+N32tXAdTWMshcn&5*L#y-oGXnmyxts)L-+lL183a z40(rEHbBYNLQZYTPs?joXPcpNyI=!-(H(oeZaE=cdvaFq^54rdm==e@fc6>NwBC)a3q8 zflYBj;y!tpV(lnhja5#7t<$_HxZ6cL>%VZ29r^GlMns#E!K1h1HUeiy%4y{y6B~G6)OIIzctHfJ*^)OH;HbANtu|ykzz2aG~b9OpPx)$F6`5J&+{#BR9rD(g-!DheIKEVfKb)+8L zE<^hmF$D6p_l&?iZ37RixO&02^<_$c6(|wd=O!Lyk(KTSU4py-se`+Nm!xXpnFMy| zD%gXDn@*=0Nd@yFmrbHgu$)vn+GEb|O5$-t6wWfXl{b3Ab@V8THz-@B`@pTU(4o`sEzhL4r3?zpo>(mwNBhcT8w$XX=%>ZF4DB57|Zo1E=@yGPQ8 zNgsvqU<-`KK@%Lp>PfGH2ZZF7-cOA4;u4x1xL_-dqf@9mBWCcF$bQQ2+h~eIAJIP* z>@YaB2OMvw;6!n2>sEALyK4vRFB>TIIW{XY)Zw5PY&XY-4}DXkU#vMAYcDd$G1b(} zS864tk>uN}EW_o0ngy4N>d03X^Lrr5vJ~wK#5r!X^tlW><+%A&iD9F3KvciRN~!(v zKID;svKx*MZM4{670XEljhc!mXPFJFzML-&RQ>rjT{m{wKTbuiAsd2?g2f#r(;3k* zr(XCr;^5Q@KT>}evQ|dW{hSn!qO-z`O1(4=SBlP~E)Na@R9F_(uFQFEQ4c2KZJK&g zeHWRT^K6M>&)A5?i))Wau3K~(NVVY{CpSdQwYV8t@6;Y=^D1}wPpY}08qUL&Ltdre zO|LSuD(Dtsl-$i)(2Pk|HrJfm;1aOO(h3|tjI=Yz!I@qqZ>zR~Lu`pcK-@W_SpmTc zS8T4a0^iz%f3M=qP^1qBZmZM5Yalq*j=-0k-?UZOEWuc#)xpSgMymrfQ)9jA%qsGg z!>GM#-d3Di+!J)C!1!12CRz2qgl{sKfBTnt%3!-^0P^#;;$m(dDg7+1&J)Z5&Ty*> zJK09Jvmhj`xu5tsJslJ~1=BYcc!pw;AxITuGi7ikt{6rEvZ$&cK``4iTr-97*I$ME zeR zoDEXoeh!uI0tlt-mIC7qxRmSR9F&Slj`uqEOV8ZGVG6454feq_z*pQ;en~&0m#*wq zgJ%RvyBp9SIf)yKsi(<$ju&@m(AdD!-On8GJFW6^XslSECp1g zctj|P^{ua>i|WY1CA6+K;nEUjxV`I0FXCNC-iBYVlDk#=6-@jv*KNfLg6G0D3Qrn( zuNJ_3j)MXYnGVAcL1G5rtL}qv7S@i1$xZu=w*D8y1$_0OAu`W)#R5k3pL`GMd>e=s znL2W01@NruZ{fz^b+xLuw(@0RW z2mc0Dj5kugB9H`7`pnjmNC{;3L?&E{qZ?lVKd#^HPY9da;MsvJfE-6iAU)Fj8A4?s zx=PN+3X}IBj(gISk3U?)gJtUr!Ktl)kV2Oby1hyTMh$`YWpDy67<3CFF4asBm2NL0 z6u2z zm7GMv=4_-BBzex}qXWt0pCZ-Zbn|uuaP`xM4=&4?@qwe|C?8xG`8!VQje7h8UatP8Y>!*KN^L~e1iko0VE30I{xawOp-gl{LvU> z!BaVGX3+w=`2mEkaq(}!_PGyGbeA-hgiP>vs1sy;bCKbV!I*Zpl!ikTDa~u2Eu~Gh zFOC<5j#Im zNx>s^2$gT9zBEkI%8Bf_4@B{1cv~Q4+0~T$c?xOEB;zSpNIbM?FQjof#;lD(Hn*x_ zeWY{_@Bh|N$ZMSs1-<#NLy5m;DE!FCaAh*?<9(0Ka66guR{@F}YN>BH+HazzGNj=J z5HnmgD_+86>dEUKMpRACMe3KKuM_Qu@Ms-9b^;Ty?O^M^Zr>je1SDhgx06}fx!WJ- z9hBXVDuFoyM-R*GHo76ql)fS*D&`n`w8q}(y_#gNdJ#IpRmfD7|8NVa2iJu6Y0#bl zk9*4pwSw0PJo``~iteZbQS?6Gp?60xfY&GZW>_p0%+!LjM9#>c>-)HptFh)#7-@$qJ!-bEdk z*f>66YGlj0sP%J1HVllEU{*w)iTlxfx4%g?7 z)z-3$&c*!Z^!H5q^Ug()}H(7AVctTGzrY4Wv#E#RDESM~n@m9#_>wbx0T z0#hP4+UfJ*LTc>}Hm>w6%NXTnvIhBM5%*$6&g?7&lV7ad-upp9 zEBc!?!9M^Gbm9+yEV$TIO?0@4YS4~CVrl&)LRoqK+2JlRSAi0_N@W0rNbaHia$WjdnH(Jpv28{130@xb`FmVf-W0$rPxsiSWEgcv4mQ;u7!jQmwLES+SeYVA@2?X=cY>Wj z;h4XRLx_7L-vo2wCWsau#JTD~)ie78}>gRVHe)y+dp)-f~4e%kQeLZ@*Hx>#5j4eVnYyrnF`R zLveYUdv~(2z`QbIdrL$XB40UnIj5Lb4#z=c zua|BmvaaWLM7$+hxQd!!g=JIe6Re0e3Yv_9O>VU?5l83FlPm2~&3l6=v(}1EXh(ks zaFDpAv4W@0!f`=lFRUHpdH_3z+gWT`ISwubkS|(UVMQ#}?+w1k>xYXsWN_{;!1N~g zFIpGhP*Z?vNiv`N3g`4@xpAD8n?T;{+#(vtP)XK_)imrqO0$&L=p1iZxsny)j_@u% zB+}Bv4klh?>S{(qa;~C}{{eM14b;hp>-Qpex{*sCe^w^~3V&tb;k_F<9)cgm(HE~f zB*m>x?2@q!FQ7!*d9+wIQkO8yYS3zYq1b z{X%EgahDp=&Yrtt`|zGeLf6!!Y@vFN{%=JyjiSr%BFE}e|4TcA3}AFmeDe3LEb2n zJ*oM6wN6W={73ra1?LQbk}~>@?gCKM~9shsgSUggSF)trnU{TvaE!`5W0jB zq-%dB`WUZeNfjdip2geWoTnU}6s zmX(P!8os^a-kt>lX#JuasXuPb740k5chA;ts0&6@*ASuuOraZ{_b297>QzsogV3`& za1VH}&ytlXRh|H5yf`~%Q5o+Js)#zY6&Yn2gGp49Dv2ACax#M{d$hPtkT*C8EG)Px zObxn85pr=j2adsK;1D@DG1VIkyo^0mt|cah-lW1O{3TNQf#v}1HNjj_3D7nIKZ^E! zcG?M599qVO(w%OyRz*z->7*ax zW+I*A*r?BRFA^Fc?l)Z_c(e~X)6B^7;#QZ9=hF}dbMGQp63O)^V`Y*@k+ogj2R zfksDd=WDb-qC4d$VeS+_V|H!)4T#gK*$g!ZXC<8bk^eF-0LrM$*ypJu zkIo=N@^RQ6*fh`%zt;_)VKc@W-o!_aGsOFGMgwObxC>wrS+!y>&F(2_&HDfYB38YF zFAL_T5G$wkEPqH$kX9VbtGP)ONJpR#1z>>9wNU`PBNtX9?lYYWdkc9{2XnE6Vb(E@ zK}V2l8rE?-l9IIBqOlC{TkWQ3#D&LtVdT@|qj4M^VGpa*F3_PRiss`=8m>EOt%!RI zTc8E${3PA26edb9h60d!hD$Hj$2ZI67dV4?vEI@wRep{B!wNfGdUiKLfJzd4UEP`J zhE!RHlw4q z7Uo{~@<6W~3tZ(|vP9|GleCW^!R!gtcR^yJ?A$Cpw}(=7++y33lIuKMS__Wn+`Q5% zuTF|twa!q6&;l-IjWgwmN5G55Hdfq1i;>U$bZXg+6{vjfcEV_}5;ouC(GlLyyMYlF zBS5{G5X`#GXv(T((OGir9Qe>vM>`^QtPps^Junl7eHPE>i0Al}_7cN8D61pO;g> zgvEDbu6O`rv5CHJw0MZ~wdxSKImSBDi5d9L)vOVfL`$Ed0|Cb3=a|0?LP|OmUtWGg` z)a9STkG4+VM(S_o^4%#bE0J7&@m;Kp(sKATZBAi@7wH_^dnrX;{hZ0r{zI`7Evuf( zqzIfP!@6HIxcwB{|~0e0%&5u_m|dp;_=fA(48fMcT{htOPf3&cUFMsmafQpQ(j@y zIO+Y@yHXqYzmvq|74A3Ah0wsd-ju4DjH**m^(U4IgWLyDw?=g*@w(%qPeJ)Nldbv% ziRKE2;RshEOxNmS$vdfhGwpBJ2;Zde+@cw&Vf z8ZqQ_x<{z&o)pObC$4P>{#-m?yq-c~^B?e`9{FvxM3h=0b!As=$qE-{w-M(CivXY< ze-TrvW)~q$ei>%XN4QsSEkJ^Y93pZ1oSu8pPJ=bVEinNbaQav1UL?g6TxTaj!#-Ti zZ9$TIC%higJ6~0%E`Gt?mFQqc?VErqz3T1c!rOR&l`*mVuYpAg}}4 zwe_vl{|vR5VJL{>suno_1n1#B^mn(zn}bT5;9Hl-{jZpFZ|M}&!7Ff1ZAe+3OaJQ@ z?Cp5^1zn^I8I{|q^+J|Jom`Q~=AT+f8oan2_XFpjBK-_uR``W7FNrx%7_J?#@B^{X z1ASe&jLM5Tu#bR&vO+EJQ7-!=TTnERPS$qO-pA zM8t$Au-d4D()(|5X^`QW7k>MBKNbmOFZExvq%|+`_`=^%#j;XhV}(J(eDqvb&KZ=% zFUbDpQS#un-gz6mp`i9nqP1s0A;hU331mOM3?q_OmC(2X*;6SNHc!I`=+OPQ8pKo! zLnuh-ZX^>iflP0Y(w6ocJpY2@k3Pt9=$vr1q$sER9w?dFx++4)DRERWQ?{&3Mg_Gk zC(wxw9Kn#BM>3WniDB8Cdj~-%oG{ImUx0&-ApI66soTJmm%xMNv{CXIg?ILUkScU` zv5(Qkbx4bLv7)n!=OB}Uw+nERRI^I}P-ECKp+ljb@-X2m{A}oBatJ~~_*p@_8ni@% zT2HjuIutm;V27cOO=ue}ozZTCUP;5~i9ED23j3a#-3<_03U->-OGG^C$jfjYBgGbc zfio2U{?^0D!ODg>{5>63kaA_w9^~K%VbZK5Qyjqy!+%6Yc!i>XGvipZHXmcedme4( zWJZs<#%X`S!BzxsZmzItPj4Y~d*Lo5P)}B*YL^p?j((3X9xUU}H+Ru~@i+c54;lwY zxs370JqEfnPDOJRyD#)12a*Yj>r=3FU^!O8emyp|u+(ulo zY#C0yhm$@PZA2bqZFErk?kP&gVBl*3Ilz;)If7Fqya&&Z^>2BaDmOeIpFts%z@>IA zV;Pl)^T=jxG!Md8$Yl3Av+O=63ub}$LiN=~B8w}*9_MB}I@lt8;Oo^-`oP_*51tqh z&r;MDbf*sm6B6qoJ}C!T+G*V5WaYEU?x71uDo++v|415 zTgWe6guCJSoHBqoJT#gGI8j@dM;$PyB0}RcSLMT100hDP-J_T0k#C9Scj5UB(TP>w z#KdBPQgBxr*5F%=*Qnllguk25orJUh2a&*-E+Cxc0FLy88yUH)><8+>p!}`08jYj( zH=zW1@C>+0ul2$4vNRR{ivbutwdJcRBLpv5)H050fx?b$jtWFAOSBhEQq7z0#k(YD zGtK+)#d}u?fNgz!i8Z!|iNWlh-72Jlgw(Qd*Q&k$Vs3+BPB#r+RV zoyz8)9^>Md5$RQuvN6Npr|JJiS*iH6e@0np%zXc}vQj)8m+xLZ-js{8ZRpS)!~Ak5 zKi&(?nBlH*FVll4^nbI%YXRSR zluy84a5dtB?uWU57TDZA7!mM#9Q5%9|45HA)*2a>r;f!wA6k6UlNR!*!}FZ7B~KbB zLke}`YzLAV4z=*6M;#pG&%cfpm$vWf<7<=nsm!m?FLLsygFjmD^a$wXYCBKeOFq*- zRJ~qKgpp-0TYk4W)^EmS-<^v8=K%wexR)4Nm5?u-W~&ZA=> zGq;2Wr@%X-WI7z=<534-U0N3Ek*qoM@WfV+oTZqFzHeN8X(YNjBRGTZl;*&D3$&NH zvoF6WFo=5*hqXbx+jv_8l!6N*n(_OzQ&C#oKZk8u~flPyzqSX9KEQ|Y3P zHeoR*6;M)xb}xnT{xqrvqR280a}*rolI&8&b4a8A`CZ=sVeW0X`BbS=X{i;p6lM~vND?Qp9HvukZ+q`;Z~I((Yj3Id zd9K(GnGKKpyGz4lsb zuMfCoF--N37!LH0xRGoK7n*|J*2oB%kC1+jEubU_#=B2S-Kc=Df36OSn>=q@WaQ_$ zjAk-GVPsFLExlbu6*ypCuj;q9;WN~wHJ9lo05;-08*U&rj$9(RX z&lA+1dkr&`K<5+pPWISz4;~Vkq@%9)eux>K&M-a6q1U#vfanosR#**>0b5 zVD+hFEkUR+OnV@V!&x$MUeklwy|JarJUD9?a3c{WCD4{?$A5Z`eAb`L)(#}O8jD|psg9GTr% zStS{Q9VdeJmjZQ3i6R!x-&pflx$FY1{#Vp2q+io9XOcw_nl<82{D9Prk63xaj|pqn z^udMi;RjI~>{4|8xKr}OdNv((8ovY{wl`47c$4zbm#^_Lq>tXAvgU43Kb2s70%N2M zo1M?A@+=gp-unFn`t22fxccf#Q_@{TRX_kb)gIY!a@H;?vz2O#&ry zJ8*zUoX>C^WI(0_^chTPV@N!?Mca_@`8Y|OznUkr>L22o$?695DMc4(VfGEZQf8?? zSOaxSCoo`VyZK}H=lQyKAcMS{H!j0nTEi^Cy0P)lYJvE@Zmh)VLeC+w3`gD-A3l`I z@Or@{oQ@tvqinaSYH#nq<0^S1zK@u#ZPXtDAiU-GB&LsnOhrsLr@_A(PZY0G6K}?JjfwcHk z=#4wbvX{Vcv6(P|0kZ9lbOu|c35MDoUMdbw;2`4Yi3hyDSU{&D(4vpagH%aKFYFui zWkmvlV`!U~iACns8-?E9*Ep)eVWQo7k0%0*P4=*!`efCoHngK-v!!ieyJi+hDfXIi zccCIb28RlNyMWma>04#e6C!J1)&fn(U3xoZuHOhe*y^Ccplh$xw(i|@jmpszJw39p z1C+TB%I<9Rh&?X%90h{5^WD|m)lI>CwniIsBf!JiFK(V*CI$MPxz=X=X ze>u-Js6rb>fX;lj($1M!kyOj~ z-O|_i@1&W^SPooz`|^R6kese*@$7zLK5GF{1q`hd`iD0!k5CXK+h>fJZjG!40-od|02bZ-@q7w?^vb&GW31%E;%#{-{w9C zEMpu2B4kpo5$kMkuyCQ!&U2Yu4)b3LY+-9(5GZ`p*n{yOVp7F892UM|KP4GhYvLv~ zhbN6LF%Pu2L~!?0!Dg#)YfpSEc(1jhh#V+g(8OJL!$?_#J(|;wA&SHd#HPEto1im9 zidK6hJrKJ+a&4dx&G`q1vQc^j6@EvxhFcoMHi5$bke($<)iVy|&IPJ1eb8ArCNO8Gw=wY zHbWta8dMXevkS$MR&2G0hwzQ0(6_Uds7UFrhT=hx1pm0UW~FC%LUCMV@B)%xtB6<` zeE3Tq{ITidL;5aa$LtAupSKW2P~T)BiliWl=^i=-qSz&ff?D)PKoosFf7D^#8T2j# zQP6u31%Fk)+RTZRl=czzfV)+xoABW4qIb~`(s65-9vK;k9ziTGc2tty0aXfSpU$H@ zAr}vrO}fgvTe-Ord04Ai7p45dQUThELLK!EJpMLRt`I` zOEbwLs;N7tp#4@QGl~t4JF@nP(`+c7bCIm9bNXP8GfowWYA?ZJ^ySRrJbowVSuWk7 zk8%B|_X60dGlLClof%1WW)LYQ+B357Y+-M3A5zGJ7tV}F9hS+kK6$(k4BtArK<3Wh z(CP=-w@&uR8>|cm$E#E0^)2e)c+@df|C4&82Sw%`Q)4fxH^Px{bYyiHo8;s`+QMK{ zr^Xa@YGBy+#Zw~`bF?Z#8lFH-jj>QXtC`CxMp&gz4Ja6W8E;~=4ldAFb81Xhrv?_x z*yzpzS9H>z_JfJ6`xXz6?3RI5E{GF$%)4EF{7qL1k$O<(8jfP0u`WGa*+V>AyS<6I zCYHz!;|(ACM+_L5UzTowPy1t=Uw5vhq{*_)qX)~~O-Iu8-O=6Y$a3@r3@PMt*%Jfd zszR{=_meZ|J*Y*KPV44CeBUYtbYG|b#=c|m(y!^~dk$xvAJwHd^&A}4q`kOHH9j`g zxF9+qgw99Y`;PYP^^Iz${eG$Tt7(6=+aGtl%=kDYkvCxuOi0}GBdc>R^k`}{WTQu` zvSh0fm;_1dZsg7)uEQIl?EcxVsrp#Z*{(1yb$9u;&_{4u?r)TwBKJl4kx8OszJ2db zk2_S~DjMF5Xcbx9@Zdo`x0*~~E;eisA}pZKqH9x;1PM_#?mnqOAF+a;#3$gCSXqci zQB5|$_Ihv6fl<9!HN)1$vUl_zkV*d@y=x0V8OnHKv)Jo<2?H!XkfTRPJ1ADx&{eM} zG}K|@uwoWFZ*PQ$nIMpvAdu!h1Y-5Y#G}Vd5Xb_R51bFZMx{5A!j^UZ#O?9H-rQ)T7UO$2OM7H!Cq#YL2oYD~DvoWkese%N}jbPH^ZjZI3i;7&^=&4i!f!1xl_ z!p{iU3S8_JQpEyWNEJEvIuxk_*g~d!PO1plTJ86dDni|;bFVT!OQ7~;1+~Rf^_Z*#*A?l0| zkn$Hc`30y^Al!S_0HmskfQ9 zFW6`P>S%Rd(f1bJ1yYx8h1|^Yk0fu**(DM>?}4iR${eyeF`eXYrJLDnetdf$k+)TB_A56bpd^wLo=D$}0tPJQB@QwQiProfK1xihN#V7k8W%Rtz&6gj|nGhY4~YJ)&d-V2LIkVHo;}Jfjd)?xN<&(r$cp zry`76{Y5ISH1dg}E~=!55>eN?dqpPlpkb0Veasx`OUanI@}rNL%#ZfOlT17>K3)FhW z;Y$!A8>||I%}KKC%M?VM3Pu;X&Rg{OSHX7mWQ)p*mEA_y;$uP8oj|}Rf~ujlFr&zV z?m4BG4db(5YT;jmz_ZRXA@~x%qX(Dl4y|E`9H|2FhX20_@sV-9tTrSt3MqgR)GsH* z@2G%nS%fx{p3}xzUKG&p06_0>CvKwMzAd6~bjL~GW=k}Hix@nCc6?!%G;Cx}gglV$ zTO>k?JZPP$=r)TL;7k#Sw;O>HXT3b>&ImtMEVnbv10>ZrdL^5y;V%LYF=wvyQUG_o zynA5R^l>v)U1MhP)9RehU)e(Jo{z~>E04PK6CO9p+y`{n6ulhI zs1d@eIdU=(pSynh(|j@hh1d~nieHcwyX6(*1cS$%zmZoxw_bkaWG1Gm_zzI2v)GUv z*orW0bSHXQ9OJsR!Z;^RC`34JF8LCb!fwaPes68MXVo5X3}rNtu`%a=@QQrkI^+Y_ z;6-cssF3%Ss^I}U>dkDL+*MW~r?h83o)8P0K*_lC6S+NS+Qxmt16{gtW8RxSdi|=_ zFcXN44VX(YpH5J~qe$<{NUA*oP7w11YN6Z+)d?Z4bFYv`5!_iD7ono;X*hkPeWCai zOWGIgIRN=d9z0fImXHG*j$;r0haRa6IMLHrbxP){RalyT0LtOAV>9{MrtOC+eoT@-QPA^GOkB}^-De4hv0WCv4 z&QRwtJ1!+HxaLCV-E`h8s4Vd*0`d_>Kt94roQ&)+2T_(1{;S#izXYU@vNb~JbPE!AC>NSW(zk#0jP zM(=Z-56SV}I>rl?vb%6D54&Y~qg4Gk15H*(j)C4d!jQBC2UvWVVaD`c?;eYtR z*erfLq>H=Pso=R;utUDQM4Ot#zbC^5aelQ7H+KZJ`*h!UB?^H2X!R-DrQsYw%36IM zdWd>bQ~P_dOK5~`{2j}u^g55Wsdv{a$L|(xcG~5+*0JYXkW79 zO=OJO(ATqY^B%;XLeQNsL?Zx3nSryNrploC2cmEFS;)PW401nA9hf=83jC`4j-*tiv)FK~UsR>7TxBkq)a z{JeT5@Jv_0Tc$Bwt$qj<$YQdPeJhAn4?=@jHJG3)a@jT|G~79A-1ahRxSZ@kgWeha+#>vGyi#juhf5(Fx;r$GiHp8Q^sdCi6Xr_+CP zVbHr$A%kTK87xzs+aV0E^m7++9CgHqQV@Lv!I`f_kHJKq$9&V09y%LK1$^aGlSQ!1 z;4v*RPf?M}5g_hFfcT2cj5qgB*KyTR(RN{OWg5y?a z6)*B1kF)z8OPpaIwI|MS;Bbd21HL;EH3XC7PUTC`yO*oxbmuiZ2lTRA)sHliD^H36 zo=+bgnThA+$P!5b3l0oeYp$e@Hw0qKS#xL>?;DZJHmfyn9+kU?EA_+?=}$_6lXy*D zV#`@`XdLewvgRmJT(suPS@WrVYred1%?0&)TVvOK^ieRWE&6rZ%L{S0c%=>J0>VPDGN&EuOAJ?zi{7 zE22ONOfBLBm~c4Y-RdIiI4oVW1Cit#DUsw(5lNQ5f$)*}tpP36D3PR4N-KF=EyLy? z!nxKd3i}0;1D>KYk^U(t|K(8}ingT8^JR-q0d_eSsi_x#IyLrq3j=c)}cPju&r(aNvO~$g*8&;_ndVw8VuTg_J(2 zKFNIrpGb&?hPdp;miOf(ndCwkTfw9Rxj6S&OVY7oEV5Z{v!}+#0>mdnS)G-Iot)Pc zpTxa#BaaZ;Tt!4fgIyT+H5(60WpUI-T*ijgLUXtDY5uF@JnZ%xVY0`H!Agg64V5_)%sx(xqe$ zsy?G!b^}6;4B;-!yM;$yCImZ4(}S@}<^^9XAF11YCF#UfLBN~9Zuw>L#dp%!g49FZ z_?sh*=Xf@q#-Yb#Xr@wHf`lMMRbqrxi8=|-E$RwWuJL^{x#wbbSS@ak83b3BjS0mp zLHfkO0$vPb$36Bn6xXpqJ_{ZHwP0ZfRJ-;>9oa)M4@dFMNCFOvO5vz8)8h|b>%qoB zAVGB-t?4Dmy;(QK@c)`EH8t)a3nIwxk!_iTP;vEf^sX){Y;D(#B5`qQbNZoNR=E;={UKNQ$PgTM|&&dIXSrWTRtvSi16tg z^3%uo7(E6aY@ZQ#3=d_&k^n2wSJEUl4Rl^PN(fVtnv{?)Ug|YVZq(OxFb8&tEyX6h1phj zQe8oIY4JiL|Aqq<0fIu_Gdu~on^uE39e~gyqGS;DC)P8-j%uCaQj?j&f{7oJH^{a8 zI*x6OT0r!IRI<|`&9%oLB!PQluzY19j`{`BTbFb}{9{szSp)Tpr zedW^lj-pDgZeWyz?kk7bEr&d+jFlGzIV!=GkpblM2-3u>zMN`}D7>L1g{}p{N_9~d z!3%J?C#aM!8ii3(N2Q2jmil6l?VLk#M{CIYlyylL(re{Gs)S3L=s}JEVbmBNL)+9} zev$IU6fWsP-a9xYky}6&@mKW;89OC8$+@JX6#6jbMa1MA$;xI|Uv5or=!?^9mh*v& z^$Wnm{mJLRGZW-ra87K3A$kSuIh37|EmmOng^qSGc0<1SkNzmo@exXz z#6sJ6BJx216 z+022)mD+#rDKd^22fU!!E3T&*08^b8ESu*z(`}n4iHvPC1<+xI%wO=;g z#Q|dV0~;2JjwO1T_`_Gxu|Sc<$yu=hUmuC3!LBsp3fV$Rxg?@VKh%=J|D3!?sRW!q zkDEp`No~t7Q@SJSZ6fm2{Zb-6=T;2q&SCv$TQMy4owstE7JWg!Tc0j2%BROgr2s+K zdt-%jJ2xBc$fk3Uu>;;E!LRSD(A#jURCT2(tEWF&Y+KJYtd6cVJ zOe^*F;zn?HI7BRvyy@}b_Q~EHd(G_?C9@qhSi<<}SyQhYe1nC4EL`mHcCF5fe;*uq z4p|BDhq1dz?(~lJhTk$XRoBH_LME_<0K|~I}XryrpT5hyc5nGrVIXZE~ zTCM63ce_oUH;K<7Z+rFPB?v9%riz@esnOK@)X3HWyVqQq>eg+a$$Ug`zR$WO z-9G)ZgczX8KJ;yso#vNFZfwcTPhQxPRN>dA8;}YUZ)V%dibn;QV*}(}@4@o7wQ4xb ze8+KsP@r#e$%A$Q&WU#OJ$=8~iJPLp;&#Z5s<8rQXiE9*$4hd&t8PzX%Bwzgg)di@ zh{;9_n+KhUu2G--g@)IWUvq~KtBdXQL!pNlzL8#(EHYrf z-C&{f#QVr_aK*_V;f;}uDO^D=4P0@af1P;aF2y;L+lxoX)%}b*OidHtVTvmC<3U2a z$Udyp_jfyIqH5%h4D5DJ;lUC1C2o|JjtwXr#)M#+j^wK?e8exBnb<5idOCvo!K-lv zpk{r)A(XqI7A_GYTN0xvi;kFEWhWzw<(Psu3UiB1Jp_N*WpriqW}zSua-Vq7>P zxZGMzQHORJ!=;SqoPo28nFp!XQ6T|aKH9$MO&?0EbDT-#f0{FJRABMg{DA(Bv4xB956OSYRg%?vD7q}M@W$uQJ;eD=+ys|7Qq!v)MhzVQqJ1vxu7=NbG( zdfUo4$T+iHzP2S>x}A-h7!^7b&m(C}{KNMNZQ=Z1B&CrwP?9P#m=gpx8OH4t!l@&R z&VRx_$x#bs?0u#BS_?r#$_s`9ez|9=#($*Xa68c2R_z2|h5H%jz6V&WXTm};=LBv- zWaqH>ejf1ypnqDSH{pOm5cF7k$45T>G~V&p0}BVq9+<2U^eOXgak|_UCOmgHE*r9o zy`{x9H~LB*anuwD1i~=);pNk-N8p7A^()7JInHcYykj=L3LB z7?bS^6n~g(*ZRktGiYF4MtBT?;++Yf2=rJ9pR|7&u3u!+hti#=nGpy)2(8A%S||b0 zZ|19SmT~{pQewAaQfQ`Eg0y;js&QDhi_3j;WO6t50kFo4Pg_A!#EVS46w{`iXMSrQ zZSi^cK9+}r2=pq)x>OG0E}i);7yWtWySS42l#s6YxO>z7hEF`z*SO(b*w<(QZ6L8sAkiY=5d**pOZ~9vE)IwY?^!3rs-wVyrV?2KJQy7 zdvJ7kZy3LNLUNDa`)*`>g*WloEH9n7ML#T_5wBrf0Hjv`&oar24@nPjkdb8ghlp4H zV4j12dFG>1?s7i`R}JoVR`r*SGn#z9l9fGXHwF03?nHgth{+X!`0fvun7_QmJgOWcv6A@538WRTxm?vC{LdjmNUr(Z8Jr%=j|+pcVjgv3zB zcz`-mhNlQ|G5O(4aH)0UWXleu-wR=K3vom_B_DP9Q5^T{({f}G(U*9%cr7cQr8SdE zJcfaf-)q*~5?cIjK!Q6-BwmQ;_wuGL&i3Gp!JW)42d!J*Uh+(ht@5~xx1V4%ZDq;~E|{)f^-*F0|r>fR*~0kHtE!#a^yd&JFg zpB-5O(F6LG4vCTK+bc>%8T=?hBq1Q~PBndHx6K~DJmeky4sNbO+N9C@`K^pUbA$AP za&NnvXBz%Avbs1*;Iq=qe-c_pct^NrIV}42 ziZ}wC6N=pjYdqDX%$AQD1^`GlH2t*~X52=kM9J~(0$gfzkRxb+jX5z|E@YCstgnfj zp;&~eC!oEq6L0jewgBG<1{%OK4Y(7VEd@~t1^_odfiKEYa}5FMZe9|txy=^7URFbU zVLk*-Uj-a>Y`)Jc$fI;3NFrr*%p=-cR8g&d4fR@Kqkv5 z*LP3iMS;T>^B?ZUyMh2V2#CH}1A17wMG@SS7rVD~2_^)0B)Q^XINA&Q)CB#U(rRvG zjPwghRAU6e)kn8PACCx4V(RR2dZBTtd_Ye+uQ&$#b?PE>{L zW4YhGRw!}8d+c8^G_bT)tkl0rQgl2n1U7n?m)p!+V*}PY?Y8cwj7Szjm?6X1jx(?e zKav&+NU_`Hd92@a5dfIi;O;q+rQUhN-P31S4p!l$1=j+%z%?M2 zedgQvvposVk!{4dd=>x~So;5mjqG#TviGdW2i?v(ha7sp=a;Xn+?#2Z3+$I6PY zK_^BG50jlDpb9PS5yVs}(y3XYSXn}DgNJwN6@N5h(r zL3{XDJY1koCk5+18~>IMzn0s3|BPv24F${_5sK9lWB-x&r&Xe&xVd+?z z2l)B2vjKHPYEIwD| zqbM~j<&vSA7XkMEV*jx@3cx3i#+*M-6RMq+{@DN<9fNegh6kz`Zn@m>QfdV>g97}q zQpE&&IKw#jO<|g_&rci_o-5`&D_jo~^B`(w71SAo^NgE6~&!DXbjEk~>0 z8_BLMb(P^VI_`JbTjIE*l5`v24#z6#+*@dwahfe4z=0t;-u+|fsKuv z3N<3A@P6xt2IyXdhXRqkO9E&}TeFT@z~<70e#Uc)K}r8YiY!ry^Was??-i*fdW{!Z zqJD;#-X$XBijC-jfbVX>lDm#Ng90kV*~?V*;}jz1d=4-ea21wxT0TsavyNxA6x8rJQJCh1sg+;yY^lk_&vxRP{5b^n%cwePyZb47y8T_91F zIW7VsnwTk`Rf{B=Ev8(`_3FZW4)Zzr3o1l}p$mG0te;7mtp8#8rdHeZT(sK9c(GP{ z8f_*-kR5YoC1o3G4I5N_Z?0pu1;W>@)apejxDE;g)=gqpPAUjbi!F8dW4HKYlOTuh zc8L`|uID@<8LUt444DxObmX1Hg-i;=EfS$nxlq>u$uLuTy@0C`7*2@=M-tDN$Vyff z?pTcIDbAAduUxGus~yMzS7jR$tyw#}$nsXZ5iQUEcg6pLRxhPMIB)(TWcdBZo49EaXHj5+vuW0ro4A zbROw+m^0A=O~D-bx(Y_2$_8!%Y?5_qB!xz-{z`y1!%9T{aa=aiN9g zoz6nu5eVg8C+TIS{Dra@pJGwCH~LgaqS~@FKG+cCC4}ArAYAV}C=&WZk7OKhPN5Hn z#@MZ*?z<1~YKfKohSMtXiHORCzbI=F!6e0>rMNXEfh^d8_Q3Vd=lP^Igw!b2^+u$+ zKahNQ*P$`zc$43sNHz$)!%Zzzxqu@ef02ST{j?weYX>2LlE_T4G6&5|5_F+BNRT~d z2xmhL3s~0Fa;}tJ`LrYhs0*lOfs`qdI?82*I8;?F`%7SQnot$qhp4;hi;}ZoEt53D93K5@k5Rb_EUoh z@SKMJbruNU!>JV%Eb@$WoMk}7_{?zTWihv)jVo>zZ>E9t0Y4`x>dlB;70?mi#vWlK zA48FXRc50oUVLK$iUnfmTd@JpaN{IYZl>`E=G2@`Mawe{CvBQjpmwb)$|g%IQXD+b zyr@c~R^(*J>TnwM#nktpw#^LV!-YZ{u*fY!B-_LNqP@;YFfo-fq1b#xf2W||ix2s{ z`yLw~M5{{tCWX9BD@F$k+k&y6_)EflQqbFm+p;F{1CQsVP@mhRT`k7frGCOIHhG&@ zj|!KmFz|sI+QN9EDV=JDjkZ9>ULgn)&`k<1KgNI zPgih}V!jdusQ4uJiODwZig3Cj&yknSysye@0}0;^vD3%6bvv7SrDA8|v`{ot`Am?} zM)ByB3C;6cK8i5mwRJg>>`g+dAPqLixz3IFA1cMOoymYOB~DHU$sFF{LE^a@_W_Q4 z6iXbjubD^WaFlqk>bg%D=WhiT4-{=7yj;d7v026r5=~3)@2f8h+S^3oOKj?JKw}?l zV!aHORRMBgLZK3r&z2C?%O-XiqakHwZw-j0TN(g%Y;5tVs<{6GOP(XtUjb-Zj7ap; z)Hhr_)g@@5*K1rEKY_g_o{M;Uzms zG9B>$;3S;vvN<=Z2|z|ZyxSVSGw}P-{pye9puIdhKM1O8RAIjC~;w4(@c1FC=!FrE!U}JwHPa;ZjmPf>7Ar>I};xx&yQeiag6YMY90fczsu+kyD{gzbVZ!!!#$O8f(=Jtx*qqD{&2H>^Dk!WxDn&L+B zHv~ML{!e+pyPy6Fa)gG)kXF%YW=ifh^99z5)1y-k(w4aZJ!1#@0~=+AnKc{4(HZe^ zAUr;>%IHx|o0HEiA4&)oYJi_RPX@zj%`y%a7U%w12$_=HbDZd+8kYNO9`xLQCDlaz z1r5nCRWPt9c~qU{o>J1%N22)xw~#^%Aruc?ca^xU^l zwrGWLVhZna;QR*py|rMelT%Ucd9e{EPB9hl+M&mCV!1c{mDUo#)fV;1por}G|_Wq4g#B@eKJgfQCa3`$}mO@tgN5qN5jQu>^} z7v&rmHwUpXkD*{4So}7IoR9M4(?47>n#&vg0N$uXes&LuK+IB{jHl;*gBQQ{{8f=w zQv+NJFlS>|wo8BzTyGjF`V*|7)l00tnDhQFK!u@b?iu%MgJ!I30f4Fki!(I$JdftS zr$}=zDG%s~U?#gX_ro)_LGuG>KO-ofoS_Z67t(x+n`ehM=-c;;mk(~>v_aopN%HX6 zA;14xWmZ$7?b-RreFyjnS5ai2HmSVpoaNv)jpjaG$qw~4z)4vZ(8GKhpT28 zff~1rU&bxP7&pUL<2F~VD-W+ygMOH{su=X@)S%ro&7i-VYLjtRTWzu!gKF+i4VmhO z$Nmq7d&y|&{7Q@P+w=t6X)a)>_)7#Nykbt9&+&5d%(H_0o=Ksu2a5NCd4pWopbfD_ zih&<x^oSb zug90S|GeNupF5`MtRl5uoZ98Z7jTZXkK!llWMa6TlJ!UOy8o$AtlivRoeJ zh(#H?+qw2bA)9ZHjd%m9-f%*@g7a=I-V5iC;C@7-q)s4J)okHM*vRpps-O_tz|bOoILT~5zJ3$> z>5LHZ@?C^4a&ibVG-|92lLE1N>jTPCxU1mppCub%C|nUDgyN#UuZXAv{Ux7ooXi7_ zmuGMSIE@T`iVx9X?J*H19AKtpWNMlPZ-2(xaw0=}5NenctxMW|2U>%MfjyV|Hw;pygf21sJ|~_?BZQ2VhxuC z##IPORQH|=32$oLihSS9t%y4uJ_172o$IB}Do#_9>4147qGBuwkeQ$=yLU;e!@m&W zs=p!)3y%sk7Py8u^NheJcWH7HQTLMcACOW!R*M38A*aMe?dlSyCWeB1ClhpmkwDY5 zSy-sz?qa5gNi{^CE9A)C0&uTipy_gv6DpeS=tVSLyD^0hUrf`jMD0%<^qqY8`b7Z~ zmpm2N7-)1hI~O)OlcU=?W&<0YMY+qb8dp0kIl583XMAJC<5ykh8Ic^lUcG0{%-%a< z$IR^H=%>|t|EC;3aRi@oBu77`-tDJ`-#pUiBY&-Wf3GX~FH-NGr_z3sR`^s}a`a5~KBFu7-JGJj%aWtZ)%&&O_KEhKa(i-gk$PWLo;fjd zl85>{>fOC4{l4_CElN+0cB}U*+>Xl}wpoLcqiyQ_>aL`w-Q7w4F8J!eMq82XW?Om@ z?RTno*Ps!1jGXlA;f!Cs=QXB3pL5-jT*j~7hqgQSI;XfPzh1o$w53nXEt*OHo>uP@ zx{@>cvC$a6dbgKDvN+1AzgE5HJeB#A%txNeWc<9deD9+@`CRtDW$%7ETZN)b=FaEC z*Db(^O%O7ButlGPD$<~$EjAX-BIw;-6sR_LyUQ=R>3vxk>HA|N?iR%%;0O+OCMzxB z+1e4+-4N9Gug$Dy<1`H-Ufk%gSCO#9)x?(~L3bOWrd2@h+H<4B4sKcASNd7Ue98Sn z%{)#aSm4AH{1Vv>wGuG$TCB3C*lW+-5S~+WeeJnx!}Dtf*Pio)Z>v3bb!3(=y4%e* zFb~$AyFN0BH-~Q%6sOHRUVE-6OyJ{1;j3%UjfvpJdv}`oI)ClvtNeBOHhCmli?4Qf zt+`bdB-Q+*wrw{tjtOyGeS?Ve$U}7d%=paq+H+aeIsT>a84_vO7x!nh%Z4$JFjZ!# z_S|)m(paS}diJJjBx~IK1k&fa^-9ELff(pFE=G!#uGnotk-?J<>siQ+0e$jq8YBJa z-`5zm6(5pl!4GKL0(NqEP@%PB`e=3P^5R398wFf1r8t@l>pHXgvZtluRV8Hcy8^v`@?tFo(n}*uv)%tBkA5B?B>I@ z=N=4`VQF|_?YVIHrrLAg4_{}_R9R|d1k=_A>(@~hLJ^LWsU$e?L zLGoQ)yV8C?3V~8L;v=HcVN;amQ$c!(8m8JS-m7gx*&E-rax1`;IrQH0TI56ZdC+&- zlaEu5_XSq$;hIT2`|z%vMLe7wo=0m9S5oy(e}2j6L>^D1P1fq)0=4lpMXS%{B;=_= zt1pA5O`Jmf!s}wK9;U-qGmPhNX!QZA^R2gUJ_vh3%6*ActKZZbGAU&~M&kFhdXdT1 zl=1wKRu9=}tI6g0+giQYck=X|@Z7|Yt@^(k{ssxlw1zs~Sy{Jly~DR*f;pYkNciTO z%lTc--J>lH4( z_i(?NiFd4H`20n&#&<^u^;M5=o-s(a7&@wndQ_HTbEP|;=sAJi_GmM(TjAE{D%h<6 zcJWpO2@$ix%Z8wyN`d^+jn~pW^V=K$=|s7rHD*ZULI;e-4Fu3iwo6Pxd;;#+c$H+M zuWU_r7;XKXc0#d&!~;yKDo9nntx1M9Gq`xS=z}cgwkt$@GGyFnrzMSTmvP;BXJRXa ziLblavyqjtY5oJ;)8Y%6&PN-uFzdunOx%0TbsZ{rdttsi6yt`&EQrmOC`uHthV8b7 z?T{_|`LO9uAC8RlxB8M;M;RGy-jbm9@Qx5dd?nNoRcX%aa^cPW+kr78XmzXd{Tegn zhwY*V;7gep%#MhEGh5DDHvR%~N^rJvTR0P-T`yJm8Okq}6n86x{09D%yO7hbz$d|ItglOVBG{^bHA3=C{>o)a>*n zUonYU_feWTEL8GfejwsvRs5`u&3}D3-_LlYfU4nfsX^}hR{3g=+QWB!3L%)Y44st4t7?$Eq>1KXE^W z{!XhEWKqM@p8Oy5SIU2N2ZobTZjL0!jbG8lNMYhEXz*`WaEPx-<|?^IwYTzhGq|yc zCf88mSJbD~KT83Y)}L%+FZdf8R}Uo2okX(@w-VddY^65>_9Zu(ImtaMXY_p>#mB!< zCsQ()N>#JwAt~$m%9e}B#4JDZw%QR!PdE43Zt2Z`6AL6RL-jTKV7?>G+oH`lkld3H z)N$#K`M-#CzOb(z2f?XLrS?*MgeC=dxPG?S<{p-o>k3KW83$&YEZbpX`X=XZ~046yxiq zJHln{2h%`$G|J)O`vk?X@P55bd#}vk)Wc_Cnxe^!i0PN+gt2qzN#&jc!4K5WAYSPlBFJnkov!R zE{m>Rli|^u>yFxNT{U8s*j1y|SM~~*{YdU;Sf!c@{X>hyMnBmT%-SK_=Vfhv;}Y%0 zw(nT74JyV06bl6=?0>&k1RvTmMaCx91Gimb2*V`eKplGFRz^LY6*6ZdiB0+FbjLha4 z5#Kg$lPtcb_j8+$_a~5nhhr(XPf24`7bEEFq~aOef^3CIg7zUY8b{W)0i;Af9iRsK z2fN&8r4T;fDosoe|h^EJ-PR#CJg{0G%lfH(2C|k)a|2a|hxoJ?U*G7FR*wF)u)V1_ zE!yZbuS)d{NYTX3&Jn&+d$E0E&PCZI)f95TAydF_fsh3tzOV<4W`!M_&W+UD{l#5^ z9J5wu{Tx(K0Cq&(S%D{@IKB@QS&Kj5sOfV^lx68#l1P7$m~Ru+6S&a=S~g|@s%9=a zTiDWY$imRkeS*dv_SCN}oFmH1=!cSimT*@IT6F^|w*BJF(a6RdgrX6EO6w1!tCD`nWLbv| zciFITp2WD1lq4_u(*4%;ie;99T&OLGF%@P7m_FjL_B{SSeRC`Hm(}%c-3hh1v)W_- zGryNH_+!uHqite~3`Qs!?L3KnG1`nTX$=SXh@^*b3@F(YAKKU1)2=%>l{y=ZOgfgy zmW?PGRMfCVxPa(V8x1)n0n$#PrD3A7f~ODG8v*WSIq`5RSiDOJB+PNxFvbawG|!W8 z7{nyqPbuLw%;B*d8Y1%EsM7)Mf1M}pMD3As#beI^&7|{`e}N^z0*J3a|8Ym zEzi;>TtW*Hh^V@3ETD{;^rIMh4Jwmj0%6X{9M9XBVg3muyLO$a|sRse}SiicS?A zW9F@M^u1hf_UGO$^#z+H@7q4@pLVPxBwR)PhlH2X55RlfXy%D%;yjjSM0V(4X1UsX zPZVM9RkA_U>;Ok!@(q%&F+V_=gZpJ{b-m3i-dP*U@szI(J3QrU!Z{u!VQWGTk9nk` z{=Kk=Cc?ums#%Z-GRD5ZWMUv+_mV*CCE#sYwWO|cVYQWW37_7)&Vyc2^yqoN{(5=s z`{faNIa7OfLM*MSDB62%^+2w4@Qf2mpXkN{CF)B4j zM|%;osQj)}{%jn0xyXl@Mdd@LgDycu@rT__%1Q)B9SV+W3+V@#HOiMW{5ygK|3e~Vuk^kZCj2g?Pw)wUxWQ4c z1+z|sM`EEYQI^)@TH~!?^mSWk)VskR9Eu+Zjly(jw`Ic}8g(W#>a1Lz=({Vl4SSQ} z{6&bB>^@xch4L58QmReOJ{)3zU5tY;83>kAYMmC=m=_e=KowV+am_9Mkjr}S+u@-p z^wYilpNoCA7;s<}q*`^e^w9<2>? zzjY-Cg?RZ`l{$+=!kwjUO*WlOkIxsoQE2{DSq74-d*f3Rd^YWc(wRofhzkKxq2`fq zOX0>QBOP((C56?^3Md6rJX($nR@x}WmQiv}!Bwe{_f=FT@}AT&@}uq7X^XiIrEl*!d9vXVPLi4pvEgicY8v2lVhs~@y_Pa{1Kmrn*Vrqt)N#< zj4McSf&~1&BFYfs42p!hI0DE(g_hu2CzMGD+c$; z*X0Im4*RBWon#JfQt6SGRe-lrE%L7VxcvtDVg3d5d4+}t4EdeFUUN0GaKpl`ZU;2N zRP!c&-Qla%gv;z+E^L8oq*0E}Wq$r2?ZKuKPG9sryIH0R6spe)Q=f|uUHE*Z`ta@t zgun(d*v!R>7E=}Y_1^HHzSm*s7prGwC@Z&+QhTxkYrztZm=)VNLEVL| zfT2752YQnhxm*Qw6i-+uVHH4SF1hD8!ray$3eOJOPx_)C+k@VdVYjwnE_WY0Sma#6 zV{WJlx6Kk2CS)xX(}}jFG8&?y-R7T{jJExCNtx}fNNFhkSXu~I9{M}M_`L*mONJYz z_gaLYsdH@-he>end*NsGj;2Ka=-FZ67AcZA$Y@bT3jZYjxDBH{3ZD<^C!0F^#eeFy zai^LPL}^XhCf`NU0MQC0q4Ky+g@wYfmNd0$13k?@aL-$u=Bcnfi&WB@#2qI@8C@FzPe&iDCP+y7If@!Xo=ct9{wA1oV%@6i=z0%vfIVN_Z~JS4{` z*0NKeS?A=tc0%-%0R!Wg3Q$`;Z>yzu@+YvV@~-bqUgj^mHn^##A~ZS8ZqK4r7q~^P z1_&Z`MIe@w8Hzi^_XL4d`O`n(gp0J9Z*$;?0_K-Or^fI3tKeU)V8GRtGVz}dsJc#b z`$wGC3JxyOA_taeD-PIsXj-D}-^ahktma5oAZiXsyud<*h?;8i)!jaGT1IAsfYOuj zoYtxR;Fs#tgClTl#f`^Ftq?OB;MMrL14t{#&c}yNb|wCxg7%LRvfio&XGY}PXv2M8 z#CRPLOJ%PN#g}r4V6L24w`xqUYVJDZNZB-3Jqjop1K}x6O^>e{V>3RXAZ>8g-%1l^ zJ}$ak;VXm5mxJE7BU@R+_#{lK4~bevOTqa&aej#h(!PwL6?4!h%5=V(*;EBaVuB{xIyao+~&erM>FD_JB+* z0cShJW5VPA!h|k~mh{saqU!0)IM|Uu2^ZPT=Uv?|9jq&vJ4btA8g@+o!7G;n+K>K?hqbfOAaD2S zdwqIG-^z zxHvO$uQLtyc)fPGKmdd9_S4+!UIFU*t`c01UTvK%W6lPO)9mRa?_TFk)WnOw#V zQC$rzh78S>M~bDo`V=Q&s;hmF2#{UY2V_?OWN5DYGq3zIkZB6YvcC*uu_;6TJLNM~ zdB>N_qc;5~yO3J5v~3f(8@(x9zocpDRhPoy2BNYem)-9y9x2t-J zs*(MR#;t#-LwxXvqd=*%ZdGQsLLpZ}CuHVCFir^#_1q}=3OK)r@0ac$TErgqQ7779 z7?22=>TL@T@oO6#8Te20uK~%%%k7Z_&dB)Q62$_YErpW?sK2#M)?VXoa%NL`n0Nq6XpYM|L#>M43Q{|6~{vsY8 zTd*G|LdN3VU=Z-y`$b&PL%9H{jj>)$}?~2 zt4O%eZY#^n9JEA_l#`iLmUE+Tv-$2#JP&z64SCb`KYeD6yE~X{rEQ0bv%m?uT`-QY zs6mmph^dZ@G6Z6ap1?{8ZHXK%qOnQ~#(b=9YT$?vMVd<>6h6@|>@@oW4_sP3js#G` zh0B1i48;CyO%!_Jp&ho+^~GZ4!qLxC-l+Hnxkc@XA z2Te9KuDpTSf|nLoUnh;9KuZaWxhyC=ZUTxU-#U7YvwSh9i`Xj9s!o;G)+_}(nlJi^ zHUZz_VJ`6iVDu+5MA1qHfQL1zQ!b`tRtgx`Ng)jL|K>O9wsb-S_xUCbUTrEaJOoxu(kx= zOl*-#LnYtjYAM8R^ib>5=Pw`oT(Um)MvBRcJt*jJBj1JunrPeE=hM8`tt` zeji$cW;iO^)wF`$gI@pZw&k7&*ix8(AxY>3yHd@`5Lyc!;}=ZLo%fhSzuboLkHWR= zi40Z><1(FYlnLq}jLpFSGlvc-s^i9kivLH~!5*}qNQ|Y}15C(qtJA=$blGa|dYW5s z7kBGg{X2}arc{koh|&vyqbb0_PelrFQfuipDrf~yPW@$oiJ!?VNe|Q%7{|GEQLphy z=T(0t6Rtp_;e2!p$m4=XCcqkhFb2dwz*%EY5Yb0wM@@*%sHG;4s>b*+6oNlD6HUctzZUBL#taWAUV88<+XB{oooeG6Xa>{Ew6{DtQ~KQAbb1&q(OW? zWHLBBv}yI?Axhhjscjg7G^w!NqWL81b20H@&`j(Idy01{zh;v-Xh^Srd2m5NiRNS(`S(HuTd5WwS2LZu8v>*>OzKY@Pzj zQa+%N;e!J98PCfWLRL!L6=+6o-aHXvVTB#jX6mBEtg4L3y9`;j#hg#lSxAW@Xgv% z%@&?7CV(FVH}@@5a8utZq3Ruo2Vq&;s;T}86vST5A}3t8+IXg+4nA24!elUHmb?D zRU|G}Cb!;Fp}*dxfT(E0ApQ$5$jPyq`pN1sA^rBcZo3y!m=lnfSD<8Xx~>MD)o`pYb9`i)O1H zJz7k2n?CL5v~klGkJ%3J*6Ge_GW#!?sE4MUZ%Vks0|7baJLKJ2eOy$G_16=kC5@ZP z6`4yWwmPODm1`T|y!S#=Klzjo+3$wGY8$r8ldtKB%a?VQAGfb=m-H$~ z(6&4%l74}XlYVdZ=IV?Pl4O(P`mFix#8~Jje?{l@h}Lx6A)(;*8Hl{lH}&BJT|eD2 zTXw-&WxNc9wn*-)%Eh?&KZLH&MoQJVB!+L_Uo2F9 zeo1VV|GfRxCFvpmmG>T+(M$bQ0bSsZya@rkg))pK`*t}#xB$8Z=nDA}T`%$L zIUziA%?WvY@w@Cx^o1ert`8D%kZ7)Fn~pe$qvp?QoTNK`%w7u+ZDW)6fzLor26_n%oh&&ONS^3>z0o6?Oe=MdRCUk2 zr0%15t}x%ljgR(1Bh};SHi2?vX?no>P8b*N?}Z0g?Yj8jGBZWrNA$?j0Y&o=eNTLg zwzmDT1Q~jK>mp!Xxe@VgS0*U^FPEq;obpP#?4fsw|H<;ul>vWqm})ofhRCBg1KFxh zG%EV}q92Tmc8(-~RIskqE>$!oKr4;J=TL+oP|`PbkxPbmESPo5d{^7B=4pB;v=4p+ zn6~J#OqokAy(Exfb2X;Uy@PQ^wBaeqN2Z;A%#O@NC?3h#j0ghy>mwN$o>h8``ymTt zRIt)$*B@fxJhZO;%@N52fbWHH1AI$E`e{Eh{Q~39&^SyyR8J{J`qAD&;k;swRI zYIks7B0gtG8v4z8vn77DzZvxI3l9h;TPCmh>4v)`iNIwBd|ZgW1PUpqUHt8H?y*#>w-S0c?DL-A$ZaSg=WXJ5BRzrbJB#h^_a?H z;*O@nWb*>6Y_5uM4sOHnzVn}(q>*lt!!`F%y%(F#aEopo#&NQwxs65=I>RI;mh0$S zP<-~K-*?V-EUK`1&<(FnZf}ElU1#-5eOUO-%opcnRF%E##p8&P+d4uz+-j<6D953D zxZdz8>x?RE%_1R%BWj8kd{*#rniHVO!e{Z1qmSXLzh(xuMJu1+Y~FcIO`(++4_^w+ zC7$|zH}!pg^`pVqeC}K*4Cm1~ldGLa%{!<$UU?ixuX>J}XONX$C~Q?29#&arAWS~r zZ4R_@F~Ls0ZV7$+!n`SHF?EHxFu9tCd z=2hq6g2n^_;ULnRRw9k1=opti5QEfpKcN(;8yzM0^@TDLi#oguWo@{|Xs+g#F+}II+MQTNKvUx&jZ>(G9jcjNN=*F21TAe45>_@f zU@>*`j4U>5-p&ly3w?PrCYMMl88Jh5Ywcvzg#p!PBX%W3-}e% z1Hbk(F3pPZ1tzEg>Kpi6?yau5r>U+#Z;x7^5$oKqaC=JX0Jid`Fs0hg-d4zH#MR_5 z#Bg450!A@l`cS(ADPfz`RN0YySS`NTK7b;Bh=#Kf9HyO*)34fvq)#8>&TdwYpXrwk z73pAUx>CuW=_iLfIb9m4w3_Lc2zQ1&Ekg;@*%fskX+(|w*h+|2p>PvomkSe^9vPDwe~dEr+-^)j$k2k7pFT+wdeQ+M%l;;**xrAONF?&aV!eN z?2c&X0k4-SwfA}7SRSgDhu z!9Pb^;Wb(NZIDv^#9fV(WEWs-+#IGxM2xfAM?}<1NDU$IXGM29~_kD37p0|!H9o7FCc=LPkL}FP6dL|uG|JuG{m>Q@ zVfmT*$os2*#jz_HI%g4XSW8Fegi)IDG-#a(kmCl!Pex%dc7sb@VP`4_s#uwJ=+U?n z?WtvWL=tO;;3cp5ToNlo@N(pc>O*faY!No7W60WY2P$l_h(E5x7P2Ahkg)uE|FX-o zZgmQzKOvwHM!$x3MD9`9r+x~y)P=TwxDQUwnVroG?sF(V z*cMxHcNk}%fT&#T1i~VSF(d@}F)onk;sQJ(#8HLyw#-*Gxbvty?Aqp=3=Hm-#bTAg z%4&X;EhEn)FUIOn?R=Dch*f5bcA!Ip1qj9pEkD>L&o)1%Cs_>{pgJWBR<2sV*thr)-J4{ajz5+A3;2X!+wQf49GKJ9cY-kiOo_I-SGDZEpe@A zfic)#6O4=bf`A1szAfaN;mlb`8*Js!_qN>;7KpG?7uMDtpfi~g#Rp@O1^u8P#26!J z2&18n?D~@9cGf76L?PxQ>~%6e*5x6FNcB~K`Nny{3>^GYWNFSOA<5??lIF8^yymQ^ z(1Jnk@GQu=Bh=)g)*RHD3nk(l4A8j<=VCVorM`0qM6A>_fQ-U|KE~L1 zGB$-pQDdA-j54+pY5L%PwowdN0UgD#4An$2?7Yv&&O!Cgl9w0Wi>Dzos%KD}#hHD9 z<`Oy|y>oVv@B9kK&`bmaFSF*-tIWjXy!;STm{&c?tDqIDOo9p=SF6g=A~jG0e*nQd zQT$OgCMjaFy;O}}iuCM`szxWpcvYh-YtCZC>6++1?5=9Xs>ZsaN|p*gtV+mYoTg-+eMH+)&-&^CJ=#Y6?s4P zgO~7dl@>&c5OSqDVmvaRP$RD=FKS{~A**SzmyhL<6P1SeU2r#SSKFsnK*%Z2g70I69YO0*9Z7pBX%&9 zVnGYMgLU0~lt_>Y)FY*Z|8Gbc5TuSH6x&$jmL;GYWl4|@p%^I71*)H9%!Kk)`JcuNY)y{1s$8G6m^TXCX7|RP=LYuLFh_`bmb0%ED!&6PA7~@!T z$aVy(V&Ni>h#uB$mF$g`~N-GF8_s@(x2IQj-ng*Zyzptnh%dC%?Bz?yS` zIO*PbP}e(I3M&vo(0q`m8f*O$rCQakA{`)raG-$a!|laV|BL`IH7{R5F)(O^8OoCCgQWL@0}%j*({@r4#WI0wMFw0hb}L>cwPu;%8^^WMwm}`dyi6;7uhr$!(t}S0rr!h`tj=*j#+O0M z5yP$ECd+JY{&s`k@x8&l-AL5C&}s+XhEm^oV|EtR_r|i0HTxt&c=?t*pK!eGPWo*@ z9@4$@!ucRgo~5Qra~vHS-SM6Yx8eoZ30<3Mc9vM1s6a`o96z)(*IC(>p57=dzcA77 z4M!H4B;rN0>j%QlnoVcs|Z%vLYp69692`K((Fu4^1m;|jt!ED+FAOJmtoLorCA=s1EX@8|MW}JJ zY|49MVc|j>GMu3k84S-?y(Gotaoy_jQ8EVBIkQOn(D+S3p&(tj3l8a!q3;eTW{81m zwgCl-<*VKzs}|L9oz*V~t{tcxs!N~gLeHK-veCbS0(JtCY9s(NeiD^ z!rw<5j@eJR8xLO?1zcozG`trdmm8hM8)U8-QocTg(6`>Jcv!a&i zXrl1&HBoe@XPEjh@D%87sqOZyKg%3MbjKx%C}qDF=%pn+t+yo!HLaUTLfavf4Dvs| zL0^=S2up1W9j}$3D3D&LC*|G$N=i~B*)z^peblv}yVgxtM0+rqE!1=fV;U+t(gotd zWqdQ*(o_aj2NF8>A}P6w4*Y?a<<4l|V=#9^W)r-;foKdXZ5k40x>r7DDiTR7<0T(A z=9v@Bx4s7EVzdai&~N}IMFG4#a^lyKRaONl#x*|UD$o1))Qc!3ka3WVYI$gAx@0ch zj!@AiZD@!#tQ`v~kPC7NG7M!G6l%Q-A4dw?D5@q4MO#p$4;lca;Mg^qkk&Vp zEiH92&I=`n8=wH7g&nc;3d5rUv>UNx3pp%KEA)aUp)k?#)IgL0DL^OhUBm@bvIz4f z;`YFvP~vr)>G$hWy==4lOuwJu zre&M9GyQ&mo0e_j5)-3GYY10qZEz|Mc8;F1(P7RsTjvE5Iv$25)r+%j=A++~d)?D1O+Y*hObdNwZ z?yM!zStgqqbyi4$Hia?Q$`6)ATM~Qn_E@PN#9oFa44uQEfzj#XC?&B*2&VW9K~kl# zvXSVxPPftafJQ&|b0C6WktBs$3YX){5L+|~)MVa+D%YGFYp)Ggez zRl>q>h?v7I75#Kqk&(*@Lkcp{JIj|5u4`Z0rsF>@D69?je$JW`2$@MaU1kBKPlTtu zk7i+)*UDIU?ujs^2?j!Qai`pP+$jewTn4Ub)m+kE*X8gwV9iCR*O_F-E#ZSY8?b(S zjiupxz5$f6W(MyVS&Ny>KTspSLuPcrfD}9l{#ay7L0lj zstv-LCbX_ZNQ|Trq_hKg1-3Ae#roknK6hA!9MlsJ90pcI3c7Rg5s9t-t@y45!wDuJ z#2|6Gkghc;u}M{bWuFV`(&a%@BeGgSE-q3sd74_<Kw(l5)kI?|fBV=^l_5Vl|eul^L!Wwqq@>)EW~c7FN!#Ryt#AHv|_DVX(j@$$w#o z<1x$-J@h%q@wb#dB1Og_8V#tjK#PFq ze3D+@{7l^57g%$DBB}+X2Y1DCA4oJGJQ~={*52PrUR`01el`v)YOs~LYaG~1+isT} zV5=dCG)80&Mu7rf(is>=ya=0rQdX2)GN5UHDtt!B59nh+{k`78Cs0j)_bUicz`|-7ajDrkoBQRu~uXzM3 zCBVgqNdE}~2{b3bbXa~vT7dIIg~PD2o*}gV#Le&1lbe@nF&1J;qLP5`x*-m*-5{)! zh2w|Um9NOyHv+{|bUU0q!}^laVW0ISalInVe-awshII(RRPINg6 zusf%0!z!xhVg1v#V!N;MLG6{;!^m`D*iGy1k133YWI<8;m;1#&E?I2ZSvl6E(YOy5Lf`rpu zc<+xeNpG%DIG_S$%iFNY+h}00ZmS`0mpw-7x?(gkK?IC7jx<0w3;-s)=97w!Rhk>3|PM2m{riP#$g9PHT?0Bv$gq z!bBc$@h0OKIkR9#DIACiJxbxE&rHzMb|BgcJo^YceJ zhVmdH=h?JM=X!CJ>zwYFXPJG82%_68cA-XIDTC zM@K}$7D7T>F)2HYHRl01m{j)$4MN*NgN3|@nA@S{s}aSifD<}C^f_9^R7{FHa#RS? z9A(XE1ctn=iL{yvZ6Od18iKn&)t^QwY}B6|l*af*$Q7;BpL$?vrD{sVy+DP51|c}V zWO9@_ikp{$r9oX7YQYOD+3HU-6n)g6x@FrG3hHrPPF5TBr`8IvekazP>0mpWL%Dgq zQ3j)~19H*Tv1U&I8VEBa<@VIPK*>x|qJijWuT*UKnb$X(Y@*Q>)jqy~3LF2O>yI zw}x1B5M~xEH94a!}Q6M<@n~aCVeh3$#I2?~}NbN)j3TPEFGzw`c zM547|vk<9CYoVb~0&C77lnf*U20YE7B;L&XIF8Mm`2h#A*)yLJl~v$o*nG6|p?Tp3 zBXXP?YHS5G#)jlr<0oL+d=N)PKxNk4NK7DSerm=iBHK^jB&;9EkU;3=Psn#lr9M+Z zT8NuBsBQydbi|&sfaE+v$|rq*LLuOlY#U82hiV|YXFy~Z(XGY2McWRiyI-`^G}NDk zMtlE#Bp8)3Njr@uQ5NbmcToJdbw2h-od)VND$;n`0WHnysy>5{I8u^KkNx%W|0N?+ z7hwQpY8-tn!$>y>XOvm9h#Dd3{2nw5;e$`Qpd-&27vH`VF>Yisq3TU?41+9(Bzbt0 zNqQ+p2)_3{*|R!teYojSCRK;!8CVf>XqI{boWjCfhOjs0-n^qh&1i(6=JG`t;)Ku= zo8F6?KdBi4L32eX_ze^tRk@!zN*Is*oW6S@NyOrx(;Af%CpMq*`$FA>%q`jp!AquD z&|Rov?KkD-xohvwyjy{~W;Uwu#H|~2yd9ZhBh69Db>=-fx`{+HEUdy8`t9rcu+ItCS{O|}3N`E6f-s6zlx1GE0Afoo!qvh)uWJU8Hv2?Ge zOQ_p{Sgbu;E;1vl7lt<5wQfS8%2(QVVXduvXYA;u>XNdxT&(z=%RgZ>^LYOhTZ82da6)y``>le5@sZrv^)a8{ zpZy#PK3W`2GwSgRK@z5R4`49Fasvb*l+bi`BzNuM>J{fF(EFpC2b@Mv{4sZfKB}<5 z(2=~j>mC%Kfg5)^;e~aKf>R)0n^A$~9DT(9OS6$BsyjKfH;`^xx?M?AB0o(;yILW* zgKkO=83z5xgBXD!r#Bz6j7AIn7?57c8Hb4YDhC)$Y#xEDSne$X>psVdpue^?o;`6A zqOumpz$@rdl2DA|8VZ5@tNIW|Kr#U0ogx0OthM5sUD4hwBKjYpf+${yp9d8d9Tm@K4nK~3^cTpHn^R!{Lj-|QuCA^WUl9H!qlC(ukl`co zp+%#cVab{xFy5RrJOfIpf7zBFnaImzh5mZeJ5 zNwS{KC?g}Cl$0#TBU6@)?lf_*=sN6MSo<%cr*0!OwdCX}v#E z4|DXe*iM%&UJvDZsMfqo*p(%|v#Kd8Sq zak!^ZkrOhq1JEHAvV=tRYIeF*Dv`4l6Qpt}J1I3`Jlq*%t%gGNM(45gmH-& zt;SDCo|uxFmY$J0NhVh)v$At?C-VXV`GTNep=ij^kWg`0_^^n`sOaG_BVtFod-Uzs z-_vWrKyS8BZx`2iDm5b!4W~#>ld>mgq)XXpO1XkPPRf=`6;z+l{;nRb?tMZ%++96g z-6^p&J3cl;mO=$bMp15)lQZ3va+#ZaLV`@{MlvU-CuLA>RMbd}HhhXo12d=N$Lcnl za5L4dbGNSer+aky>W+>Iq%d^RX(;NBe-5Rfq?C+Gqg>#UQA+p{sSGL=KeCY$MG2?~ zDikhPxk84qk|H*2s3Odp@uR*rimpjBbG`}EwPpAS%AflBax{HK z;vj5MBvE3Xm`YDbCs>D2J;{4HgJyzg@lbJCjF>9oLcwkW29yTCZGdAjp&}Pw?t;Gp zunPWTfCJ$_1t3D1 z4ibe3C_$(WAbS+@MU99GAo+vzNJNGM2mY{V%mW3H;i7P4hzJWpt)XNdi1(p`_+daN zf+xm=S-=B1I!xa!17yH1U-n zMTLa}bJ~R#hz<`Aiy&`;BBH+WlTxFBPguCl1!p+EU|-Vn{^migA~Enm3&4pS*b)_y zCKg2T$@oMZ(c%cS4_X)Q2mz+#Xu~kEm=}Qh1!zg)(T9t}0-^~;MUf!YAdE(dz0ZB*b#K#ccQb-U`L5ae!NPTMJ`cgkH1c>lKagi8Q2u7VK0;D5NA0Y@u zgU~!iw?iOL94H7Oh2b>>5u_z)bRvK*+Jmeqh##*+@}dyX^6LMYW~cQ?^tmsvFfElc#>vAS#fG#P?86si{@eA?iLwUtx*9!=MZ> zcO+$)Ab)G*>_FL59u$vCpk`8)6oWAn^Ew8TVaPCMm@+IFmJB-vo8ivjGRBg=*Ybzi zADQ|YF!5)IKO_8ojU(YC%-Gn(#MIQx%-pHWJwKB9|wl-+P zU=^8Wn%N;4TUS6gU_X+|p?;=zP#35-R9jRo#%Ht}rgCvqF7*plMqQ-dQtcQXj4%eH zLif+$PRl>$%a(tJ4K4qSK7Rd&u@ZbC5cAQkgDE$xr4rrb($pk3xgtTKlv7b;ZYB#) zmiU-am|ulb5@p&r%HBREOdJ&y8uiUrSN9?QCP4QYrdoH38;bd9s$5DbWJ)PzPS&xk zZYn~bm~K3pOj13p>8kS!|KV>5Z-L?eA%3PlyrtZhbUb~y??3XT>iz#$um!*WEj-d) zM~DAyIsa3BCi~y(dFQALzxEG${jKTz^!1egqx@_7_>*T<`!a2dY$_a4dI!$y+aq@L4=N#rNviD_|QER9ToVE7F_6zLi z+ZWk)b69AO6)%8MF6 z4Wzs&AB-Tr5Pc7(g4tY*YylVzG3ru5R4^r^MAQ&!C>4UWftU)T!l_|cCq!bs5KRrI zVyF>REJmL=Y7{k^8bifXV=*p{!$>N@`XY%MPfehbp}muWbw(P6MJ$y`O~QIZjx~sq z%A&F{Zsk&wsVUS{Y8o}2GU$Gc`bgDL_oxTd9qJ+V7*_^rsaom<^_+T29j1;@)zl;E zC`PmQ)NASk)rd=VFTv==9~iY)QybXx8F#5?7z3NASJXLb9aT;ppe(y@fRVMm)JkeS zwTCL^%;zlN7;qdp37m19;hbo!oQH8@IHNhEIB^_Hjuodrrw^wyhvN8h#&F^}BRNr= zWKI%iEGL|k${Ej@z>#pIoLJ5XP6Q{Clfs$EvEx{9@;I|OKXQsVD$W+>ZE69tg1L%$ zh`E<}nE5C37iKAQJF~09QRWV&vqOTz7E0CdD`Hj9T}@+!-E-{vRrY1fVE&%6FM=GNf-(?2t2@+$3DCfsdXJnWpumPxP7 zG@@$f(&V}hOJc8j@6K&Bnj<*ESuK5Ny(s#k=MLq&)`g*`T>eUX)@AwVn|}MIePXHu z4|QLac)$IE$eMoJsj-{ z&bV#Lc+qV|{B8dOGn&lF{Lc%96)VP_X;D_jP9v!8#g(L^dx~nv;+& zktMJrGR8?|3OPGUnVv4qH8&5J%F>eMatKU_WI!pG_F*TYj6UqN3`uelAhNk-$RLKq zDmQtYQXz#jAz99rXCx`IvE*haWys7E(sS9FN?B%xT*}T)R!m?c1A$n@vXi7z$Q0QV zq%tX_nd4;%kQ+$)5D8;evIHVd#e@U}5m1;XjLXQ9(v|C80CLdeL@B9XS7YW^Ok1Kd zGo=YKb}|Gzsi`DqvQ+MBZXP8Rup`5QqGEUv0=6iUjVaV{5nsS(JMbdmcVP3xd^SnM zi;fb8ML_Nn85qJ7g+{V@AtC0-g-LOgND#@65k(2v5rSY|1k#5g3kv&MusARznlBOu zlU!_3Xm|+3H{a$C3u1=~uvkE0yZ}*%C@Pk&I7k#F#(d6|EfPag%N7jBs)8LUB!vJc zb3IN00?2I1+>IRs3^9#lM}`XmMZAzcKo?WHs6NQw;z9~cJ~88tMp;N>&gX?f4j#$Y zXKnGu2zi)@qs9olRU{T51pAhAnE=Jy!L z7J<`J*?}40OIZSue*8Uw_y62GLP;M;PNXwKq8BAgPD?|j5{L&$Z|RpZjvd$6-NW0( zy`M|pzU+w!GR0`he7sZv*(1AWKqTL#-?vzKcn=)Vhwb6*-H(3uXGa0^23(&f@`YXCAH?BNNJ z>Z9AU!xAUR&H2glM06|}@J9a=NaW+CGBzL5I`roRET1VVFctk)h<=tT#mq5KCQVRC zgCMmGO~}klP9HB;rX}EH^tUm@%a>-Meo;nXM!G_lkxD|8nW=N8;Q{;eY~91 z94u7?W~8M7;Sh{%Uqeu$R3?UWQjkOAOQ)l2LpzdJqjM@{G8D(BcU3ZExnEN1!oOlm za{nz%B+-@d??{od$s6z#`eBkrwIx&pnWQX@=A(ezFQoo&Vg)&Rd`X#6xtRogx`y9=rrH2iAXdJ8yx6{L3dN@!IBlIvy4^?_NUk}&nVYwcj*TYA8_)!mSgt~hA=;07O zoT!I6dbm&zVd|Ymzg!Pb>){fiz#yeLP;)5 zU_ti7m{b>(0}!~O7E3@Q+6{>gpcV49q5Yz*24)OX5X%gBwLoq|x&&EE}1KidKA4NOBVBB@@T#Vl{DfOsdD4#qA~V;QdOQN5iVf?JAhW_0!G(}fx2 z>pQ3;za4|AVyjFIj2Tv(Ax6v#UqF<;4K#N zeI@D$%b33tHTu6N>Nuz2gs2H1>R3Wls37V7^h6!?m8dF43sqOsR0a7!RuJ(23tbt*}@B>o#KFY%ov~@|3C18ieU(5m<(ocC%j-tkp6$q3)ELi z6IOU^VN@Zm6dw?86YmfkQ#jtOVjK~l5+4<7O?QgzFN$|E9y4z<&Wg{8DQdfTp*ZHI zX_dIZU?%IVf#ELk8Sz2!VeujH34>$e&1MFb45|$_?ZiD89jnF6Vg^+v-Y33gdc|}f za$D>dr%`*vyTuNd#Z;r~aq(Vphcd%UV(O&$gm@w2g19YVAQhKt?)J}rXcbi(9XEl0 z!0IZMxh{+}n97jSaTeH2$5>PgTS4te-}*Yf*LBn}ma%_poRKh>{4b3Y*U~r>NJmYI zN=D;I{;hGOUwDc#n5$A*&ctsaeyj02j^7;o)c9@2Z#I5tHMAH|=l*xBwsID_@XA>& zUHBW3{MXIn@2+pRD!xyE31+U!8pF z&fgTcRdjOq*wD_)vUtzHg!7^^@`xUZoqaXZ7GsSk;lec4BB=c4sxwm@c(znaszSaz>?=4Q+zP9gQ%lZ{HyldyJeLb4D z(5~I9fDXN%?V0cP%ZIat2d=s_d#5x_xisbDy_#iXT~-K^93uZpa_xI{Vp8{-;zpr? zBXhn%^-M?J))Ao{KmY10bZ~4x-@JN`W8hZ%x}vGW7g$zL@N|B-!ezmuNm9Q?qrVe1 zoPR1+V2Bf3xCpSreg8Z^DcU6$c7u)Srz>6Qhzi|iy>29exI z*X|38xMv-Htg%}-*IK^OqyCb|FM%Je6E8h|!rJb6A?ZL+E4ND5KzZ73hxOiG@`%EV zj~lxTkDKu}zWMFGJumL>&#pi7?D;#z&l&4NcYeBWx@2*N z>gP?~v8H}k*PNJlW8;2qGq?Yfvm=U^O}n{re|Oi$)QmruP4VW<^(*c>^^Y2_h^)!S zs_ri8D|42AoT^+neT>zn&&%!(oN@D)rg`aGrWIdsvt1^CaH2@uq4mI3t73lT+_>yH zc)g_bM)9llL5G{y7H``h5qu|BIm-X9ZJYM4&i>86L_YY+s$o6CL~lJd9e(QHQ+_>q z+|GTDliqdRoicjIjnPjRH{6)I``8i}vvV3*#+6i&MON~?!jR?lX|tRfyDL8j*Sy{T z*-ZI<%tfOvww}A6MTTCT91)pv>%#W@VWRrCLxXOqBpaVE-0(}+YH`Nmr`5w_?Jllt zbKewD4ifm<0|mIz{-t{cZ8n^q;Mdwb34*Yn)s1$$Ip= zE9=Y4r>hs=ir@77Ucj^qTLLZ*T%b60D$1pxXVKPHcbggtb0enT8$VjhTBQ6TX^5aX z>@{DjEPeX2x@pLPsI+F@icuebii)vF4t+ZKYSH71*XoY#a1Gk={DbSwfpzCX)hzu9qE&)E2oU%cUuw-Co}a`L+LQ{)C!_ z0q1@1|LL{jL-@#zg-_mO)K|CK&$wCkV%p8;&(7J#P2Qo*UT=JbX`ueR*XX)>*WOd< zqm4s;{e1g&YT4$|A5W~h|CHx--Qw=1&-IVrL_XVj+o$>6l0)eO zvOipy_%tiK@qjqx#b3#xA^TqL@%HLgx|I88Qu3p@A#Ij)>FXz%US(L^!6B0WC@-Yl z5>DUHq5Z-ne=JV=b8*tTs!_$&4%>G0ui4T6jlk*0lXgq`_8mX8U-JI$+k*ZqJlSc< zz`k-Q-s%w_S$O#`~FbUrn<{~ zU&kqnou&yt_X#y9ws3If%kmuCRy)iOa-1i0C=PKb<;ygV?W>*Uiyc=ic3LS6DqiT| zEtsD#u@?27ALF=1m{fehVYgs@fy7qiHa~vog0YT=7CRjg{#5MPJvQk4j}JPC`p-|k z-n_PE<)eK@$y1NV&M#iJXxWoKqM=6?{&?1(`uo_UN_#eAKE|F!7<>NHfS#d*IUd=~ zmcfUWXJG3;c#)mK(qxV0fklRWyQ@uK&3ZX|f$1u4*2tOu<=ZX&jj9_~y^8fnT4Fk6 zWQx=05!<$`+<5oe@kf~{BU?Soj`eEVA~MLH_S=fJGn!V-hr2P@mH!_2v1{F>%K>}uU8{|hJsq^u&OhF@$E`DM_us#IzBy=_<)B0< zcYT=QU_bjcsd>YA7yG@tFn^M#OLmCKn%3*@*!EMd^(_rxbzS^Z@xCYJL;ZZ79yDt^ zeQRv+-s{~RZa-c8dQsA(Y1iMpp8MC1dqH7^%l4OZ`PR33jFca73VcSkG}VQ<}{zWQR*SjC-c^Hc8M+xRr)-8DCo6s zqaZ1D=}H@$4T}nf1V<-*{Pg;#AHy!(yTe~%JtbN)t&`KXW3GA2YW%AQ`9HHA+SIve zl0VFAdOrHPApKKt({GDMPmG0SZ8 zcTX)2>)NsHJL#6KE2jxltCkgY($3R_4zqpu=$?4X)d7F*iw$0w-Oz6zr#vvN!@!k0 zf0}%;-)O(4t8daTUb(PgXO}a>LZf#~{&0GrwViw8(spm_@6UMru>Qq!%Y!dwtRKX# z@=a+wZpEReYewBwn2rA}cT@itvNx`it`0N0!iqU^U}MIacx|WU9}i}1?A3DvE4KSq zp=422-(sahE5Y!Io zy|~b-wDh8tb?Lf`3$06g2PYICmo2m@bqStS{6x0Uw$v?RYzfS_6?cpaEiUdA7rLa_ zCoXhl@sRGTgC?FDmRfSH^TVJgr-o&g-0RE7LTyC+VJZf_u$d*tOIz zVrof~u(7zQpgH4nmq*$ok8X=j&vEYHoGd#1_U*#A3;Q4I_VtKzR0VU7> zFp>pMzyY7}8P6_FQLrSKM!mT4$V(ABJ1A;sl2^w={4LwcPF9`tl%))x$V%$C^jLDS zI3lX&skD-UxephgbeC1Nt=TF$l{Wj;u9DqvKfK%9&1a3gsr#A(O{klm1Q1xkY z-DZbv8)Ay5KJ^cF$=Ek+@f6v~HQCb~SJ)gFKX_07*uiJIWDK{mD0b`nVad~Fu3P)= zQ^$JF*gR(Wm6(SilSj?yaB<9E9j-)eYMr|Fk|64mc74u;xyC)-%{||4#}*mq>aN7~ zO-(tasmEQtb~g@^zB%c;;PQd+vJF3m$Mw6lFl|x?rx^`Hx9)o=PYQn8sp;2iVM~|0 z1l28n*!_a*f#;JiSN7cTK{@Z%?YCR6`Ijtpw#yc^Q4CJp|Kig=E3aFL(@o=gm~gIJ zHJ(}U$NcP*^M3Pe3coetP2{W2(;61+jGmOf^mA^LUG#i!ZZ}bWOmNMhCyD3MF1+Fu zzSRtF`)B`N0phaO?rRK~4}LBmC%)diqbBC3rTtb1KTJ*7?|i-3?Xg$4VUM>B-5$F+ zbo4K~qvMzDjT$}V^!cAn!XghG4ZRrS!zsNz@}~$^mapeOvJ1k zH{EVD1pjct@7a@I%TGNSy3Z-?;=bq%;V1L@bxpR~I^*Dt>*s#hSofi<^Ki!c>E{b= z(uNmCrkwZ`X;bR7&rMkKc)${qgXRw^e=&Mw-|X40p~|X#?bS8EMt4hEYW=u2SRB0c z(e4*@zt38^PVgwF%d(p29U(8)1Sa{H1hkJ_eeue=b;_vt+_!Z#z4~n4w>|mYUlX<0 z!w+^^*7xq}uF2Wceoj8Hitp38=>}hN`)rp1`=wofjomP4+S-uE4}3r69JP4IzcKEn zG-vCRYkdQQv!0bYxc#+Yt&Q8#wX<^DJ+mGEhumpMNbK6&iJv>){A=@`{N)S(+_S0m zut`jl+O98dmrf2+TnL-DXTxOA)ROyCY}Yk(8th}Ax^Kw9w(M!lHoxq@E@;ZVwDfaq zu$231R6qCb@xN6sA8Xt?-bvlhWa;?Colop*&R;ld6FYgtJ<9V&#=5R;FAgj0*{QTW zvs39|KM$Yk%fXz#OwXVBxof1`-fk|d-cLSNPZjeEyeq>loJ>nnT*>XQVDE(= z-`(!vJgFume@)1mx#LSO+}qdmaB}3u6T8eOl0b&uvro5k}ih*@uR#7&7L?_*ScX#SaawU+(k#&CLM^ zZo7DmDOc?1w(lP2{B%WKqW|Q>w{Q5Y@YlR(p0{Vj`^T<}Z#T`oyq{<7*Q$6qzpUNW zp^|>ZH~D4luZBqii@ONQtgc3`xfvyiS)LVFJWb$bb2V0yQoK*#WqWnBWJ>WTftTIY z1W7@$UyxUatI{<$lO!vaXRRt;9#q!xYKmlA@y(#JPFFJ|hl;xdmvz1>m(&!G&c2ow z{QhS0fUZ|_CEDd#FN#kEXLY+eUD8}^%gKm3@%#C_Tw$Rw|zA4+N`%m$rk53lz0j=iXO3V@~)}hnj~AEw=WS0=M_2G zkCt8YvY!^vagM@#^!l8)`Qv|mIQ?Mi&Z4YWwYKNoOA>`AZm@oPwxq_Zb=}gMvcllo zMMv$I2af#VZJXq-^Pby3yMNBVWTvlA-u9wkR^$!`htP-TqSvJLJ|D9ttoqMQ}V#`lS&>6&lLaJ9fT@-Q@f|e z>$l*?%gf&RPM+7lTixLE(@UDGTB~j_s$5hzm{p;w8%E+Oo!Ip=Yi^nPJ~w=vRUen_ z#vZ_&w}-L2OU?~eRqM+8KXKE|9{k2lH-E5^o8Icd{>*Egn7jKedw+@hy!D!W-bH(u zyZv%*bgOE8@O~R!dfTq`rm_VucMUDNKKt0Tdv9-i%zY@HbS=(kcg(W)NxbJa53+dA zZ6D0#J-2(XnD@LxWApEg^(LXp569A;#<$8(>vE&lK*ye5{reB>Kd_|fA78k#CBErA zBZ?wdU)cP+oB&4U9$t(KkB;tqY*M%t@7y9yyOn=kz*VH-R<k5u_<*_sYx+S!E! z&IvzJBEQR~8FABZyx)HzX4B#om-hB-ZJqmCeruff zFyCR*MZY;6ND`c=&a0Fi@5fvI+$Y*|ZgA<*N4zIL&KR%!(`&?XKjpCH*K?yipKXeM zd}7|(R*N1#yf?oW*22H{-*m0_&u{z}_TF}T{_TkP#kYg~y2qHmq%c}IQr!UQzx~ODiea`m!o5F|NoC7`#zAV}idu!Ov(dXkoKAQV$RwQ%v zr&{WMw<+R}mw)nPJc%>A@_Bcgy}JT^yrPzhgWIhAeW|Rb@&1sD((5K8_eE?>kLzBp z%{Nd^xfOBKMP6<$7GJ*kL+fZihq<*yw~}SS+`Kkv3)m}9sZTBMFNksnYC(N#zCWLXJ&^*AGq^EnIoBFo{`qK?MzOuKRyp? zpPTes$MAhM{EOB@6-Rv9Z%g^fqR;e`hc|ZWK54gGUBj&XeXAnZnylIJ^X!)vevbQx z&28%Oa?GiC??D-*)S@@ zX-0oh#CVr}kzR+ZE)*|G8d*Gl`{uSz(?UE_OSPu(caT@(gd9?LpX2`H{g;p0=c%BF>t9t!}nIsrm>N{pw@^1r|b?;qp;?#mE^GgP< zuh?+S$~kT7vo(LMxPRc?tH~!mG&bby%gEcb;&R;Zdo`7Q*|Ka;XU@&>#|KVXeO1et z5-Q4e+qG%W>N6iNw~P8Tde-8&_?&0euUq}aJFdFGa5juEE3p!~EGx4UdKSsp@3`i( zq70qQBHEYq6h;?qWh;5+>L_F9))Adb1`3tS%6x^>mX&dZbBfy8dj{msjxuv@AJL;E zT)4U@!hT0U{+y^*&bAS5C1b^L9widtsiHqtuJ8E6)=8;1Z*-g3>W8Q{&Rrq~)gQZd z&;DZI@yFZW1)A4xx8@JYyI|?;5Fse}QP`z8z+n-8h~`2&XQznJl4U}_;#m&Xf+0_~ zdkXUNqpY2KN5qtD7D|iHJM0kT7ev`QyG6v8REXmeN)C(T5=*Lti;DYpR|c6EMs;-d zj7TZDBHU3d>;5jt{HLhS&bw%PlUTN7P7z0T%`?EJIyuHH)@jY?9+H(sivkv#$M%+N zDY_W2xK*s1q_W65aPi5yPugkHbIYvLZ=k2oa7cm0clYlq8jTql7Z2fs$dVWOkP9LuG86LP(QcA+|9? zbJ#MJF+_KLcE8T=)al&k-uvI}-n}2aWT>Z4%lq}-Ykk*Ri@X+d)o$0u=Y0vm-|ALt zA-tXv@to=cTTUl0xT;&v(WE1N+6gOIeyz`44yUBC3jMIZ=c@I-G#g@n&!T_c*S!6h zr=2|+cK2A=6EBju>=rg88{|98Z&T!b@PtE-B;~wjKD*}y5wnGxwjIczA6ndWCV)y^ zSeH}S`nlAeY^7#Sc9o;5q`0w5+b4uijj`R{d89^azWa{ez^kpT;!5S5C$HcX6TodRw)t@`We1wmHfLns_YLE-cL2 zIa6g^mbUw|)js(kmpY{&qtV2wfwGll(gq6tF7on-xq7rh-PXz|JZ&9^hj(Uol$ z{Yj>;Hw+0J3oz54WL$qS9^aJf)i)E(HS=1-Kayd1v?tK1UD6{w#&Jgrmehr5!rohBZI@yTs) z2+rT-FrY#H?epVpYMJhNspYE;wO)669PaTD81-E6?(>-ziFH1A90-r5eXY+Id6TFUv03FW~HK~pl`HH@Z7?w zEzRy0$w$K0S61rEhDVhMddpc{n9;YEk{xZnSg-Z|QFrJXH%9*Bex`S*qddEXN96u!tZL52A&aZ4v!3|bk<+eu^FQjy+J11boyXH{=ETjR z{@#%XyQUvZPgGEcDo7T=AMB@02R&TwSua&wbE4Tc4>PI$ayAaRloIUQhR2y$=bQyY!q&i z5T=3#>IjE;-EDN|pz~0clT1YOPz^oPPs{PRNH%D>`Hnm>9|_Qd#A~`^y(;|FtxoA zWAW*aNO3VLl7ZWVW#{r@qVly<63D?R#@OqLvWoMMoVhu+uQ-0AQ{bb<_Yo^z9dhh4 z5v^K8#KQG~e{vLZhusl7_iy>Sp2*i^W0hTO*e&-O^CPovZ^J~igO+yv<~sXIMdMyr zr>nhom+wU1z3$X6;_=H9P%I=ZVL7GTkyX<8ST{Q--+aa!k-IP7&AVT{5_R5&@ST_F zn=cnH8KlE8$EMq#CdGjYzg?ri>$U70ryAdu)1vdQ>PE3Q>4cqf!Vc*w)2bI9E{*4* zH5R>{$4u9MA5U%0zJ0@y*#87?|8OMFz{CBphr9V+X9q>%pZdcC?nwY|@E9fD;Qd7> ziC>ad=io`L9BA@W1w4gv4^K@_!GDhv#__XdXqwMw{HlF2n(j}-DMq*OKeT7i45K#wfCR!8!S!ujh3Zo7UKh&T|-859?{X$W6wsR&8*u6o1H8bK ziWeHo;YHi`qQwdbUZUuO-{K#^OBY+=rNhm58G{8aZ~uti?zBWJZZ)BmH|OxG_#*U9 zk_cLTA`ZRlH;dl0@5vTGy!|EGvSKCPvUwJ3dGQiyHOfX?=h*Oe zxhS-KDi-bFJA!t+A3!_b3E^E&>e24|Q~2}3e*8tQAo}uhE&j@rguiz6Lf@FK#owA^ z_&ddgc#mcd+AAW1_AN2T`(}7h#_UnFzhe-6-))8tls!cU3#Rd*#GB}Fh$H^t_dxWc z-FAE=*cKh#;ed|W>Z0Q-dGQHtNpzBB82=>Bfqr_~h)>P+qSJQ@@R>d~{Ih=+K3h|M zgzd;flwHOOPw(LzFw)|5#CVVdj6M2=1 zh-T*^V%6u76%iOBp5}_6WKU#eh#?|jV2()I$s?=Qs~}Q4c4Dg+E<>c(%3{*v%9zXo zeoUrC5L?Umh^;I9gsp$ngvnm+z~rtMVe($LF@^JSm_qL=mJK$~5Jk^IL`kz8Q8vAT zY!pjDR1{AjDzm}JCXvh7rfxe#ZN>*vuh2s@I<2tZGHfx;a&=5AR2S1u62){JBr)AH zYRKko9GKo=5oC*0FSb>07TLz}2-BB*f#?tQAluohk?r*~WXGFyWM}RT#GtkcGmMHr zjIz_PUGDCPal~oN#4;Q+CEH_Ws$|UEKp(RZGQxJRm%(;VDqvPiw;@(-i?Kc9YmmLg zW0-Zz0%RY)2(c*~K=ucZBDR<7kps3Zh+SYmc2K(nIb>6d9TrbO>@{;ShxtXAqZo!c z_QhdNv!0kU%@=d&Hpg7AS!3jfM-jJknwWcr8RFq2jvWczh#WQf4e@jkLXK@%fp~45 zLcABTAU^U-F`o~wkrRBA*olVwi0{xd%r8F!@vkq(0ut_Gfw?JIkS_%bjta(zORW4i zpKQdnLB2lWJK-89|J5gPA%?$wDF^3&_T>7{KKVcW9C3*Q=Kan2hzrILNyZE{QIvHd z3kx5@LVV<}ABWEx5Z931Ok7A>AGn2hhqy)xTqlM3y}Sqp@`1w!TmA$Nh0y+FucAY?F;L=FQX ziCp+y+8+10lbGkl{ecaUf(llSG~a zA=817>p;kMAmlp`G9Cyy4}`1-Lf!)*^MR22K*)X|ZUKT{ zm?Rtn1kV7$H9+tU5S#-9?*PF)K=2O`90UXp0l`H;@DUK41OzVu!A(pOegcA{fZ!=0 zxC#iq0)n%E;4L7y3kd!Kg2RB|F(9}M2tEUX(}3VLAh-<(eq)kw91uJQ1lIwF;6f$|9|FONOcGuMf*XP0M<6&72%ZFjD}mrkAUG2U-UNa> zf#6RdI1~sT1%gX~;8P$tl}W;@KyWJ%{0aoe0>QIDa4isg3k2r^!Mi|kFA)3-1P24b z!$5E`5PS>-Co@TS83=A>lJGMS91R3d1Hsim@HG&e4Fqok!QD&}{)PuQ90(o;nX2;Bn+{R0Rc1PDC@2wemSeFO-d1PHwZ2;Bq- z{R9Xd1qeNbNusL&p|1d;vjCyD0HM18p}zp3!vLYj0HMnOq0a!J(*U8@0HNCeq2B8Wah&iljujn$Yl+ zW+gSTpJSS<`VIdH-_L$jwanHckK$sVn%RzFf7{u>2Xh6P;bdI0J2+Psug+NZWlL}w zhhbvw%g@Vr=49(OU-Yn|SvCp^2Q_Zi{?vU}Zn7h%=Bihx>I+xXH{OO?vp4Um?r#{B z9ZbB~n64o_@xH$OP2yhDoa?~@W?S|~Nyv#6&=M>JpH1H0>Q9v|OQ#&4@TY5v#ln5tZUcB;(W`j*#u*}d9zrjGYJUSBq`4$!+I zD3De-s%_<0bFTZv>~&2AWr~z^XwjHKi6URXRjz2!7HXYzVZe*!)-f%V*w~ya31gx5 zIpo5Dmo0lYmUr#8akH%d!!mYeJV>*-#4Kx1_Y<&tb1BK zJ~g?gntEc?H$7WHt~UH`o^@lLZT6=Tj&-Fc>UVJYXJ_|PG(D$puLyM25!tIne<-A0 zbUn@Roi%^|&5IQ`XxzlQ=p7ax&vu9=nj`%fD!hdhnRIF*dfmi&}$eQN*}sJC?WP*rW|Rwe^{_L@Q^#vThoB z>M}kSw$v}=l%-uB%)43l)s&(I|(OErEQ&h0BHcG+z?f`dz zOyva|yW)3q`33TA^$!&^jt!D|3sl?cdlbs=k@?%j^K}n|-4P7YoR`Gz!%Y@w&vbQ6 zzhh*hVf|pBrKn&}t-Fmz=Ys*E0=wF%4b~3_mbWWAwB0EV31k!D^5G+kwU@g(j@}s} zzKCmrUzw$e)qqDq^NuoW-@FXoc&!7%Aq@76rSbc3`6PxgLR~Y(;)4zdpJL2!Sd2^S zn4QceZtgXG%6VbKasyX|ifU!9zNq(EhbCj^Sa|2Dvlq_qThy=$->H*yQp-;GEMrNA zMf`rd#IuYmu9-IRL3YBSjAa@2@u{qaY-OB#}+%SZZO1CbhK@vqq;5C7Zfh(lW8!=v*L>n zPKP_M&nTGIKBE#rtlhnRJ1#!%wc(EKBddF4H$URJH^=^csCb;Pii{wZT|FaiUh)se zN50+iY_N5Yaf|)3nvdzPLl-9=Ox%{S^x!(1%QrkZj;Y4GH6 z3>Oy5_EI>eXLj`7DxNmlO&OuuLJnKQN09-sJLu|}lQRyMHs;4|#cES6NCr81Bi~Z@r;5dz~odf@-&0Ywxx`-V33R zA4Y_@G&QfFs#RWCyIerR`mVe2@MNikwa7Ayj*0loyTwd9=LIQtK32`*-xcVrwN?v% zGI2R^a7tu6%ATjLK6}cqtyZXR=svkZ+AVu(lgnkfNu$_Zrw)xhKWF~TTEldZC;U>N zzJJy(+YO%A-b8znY?_u{+Ldtc=!<^&i%;reCOXIC8n^abb3CslsMsdjq%>w(89Oo_ zuMFH!hW$jM!|J_Fh|5n!IB9^{m&DwUe4j3?;kj z9&*-`>3yen_H;cB8=tzd;MgmgppDJ`gF)^4)8quj7Z=>xV)OXL`nXJ4yPR-APl*?6!(v!^(&=Q`gbX~UYM#KD6;&7PuRlo*-?4%u8U7i_n$EosJ+u4 z<=1faH{VaB+R-~XhypfR??Ji|CfAFc3lJU*kQMOxB@~UOlqRi8E z*BU%EU7kuQby!l&u2{tDukG#MptQ3#-Cn@UrDL8_@sa%9&+A6olRx%CgN>e zpX1dcUlrGo)MeBs20N0kN>4@Y^vRnSYg20GxwrRPGW8F|KUB7A+HTspf0J-lMvnvS zg0-H7yUQs9|EBc*)~UEWKh`hPwsY&`tG=Ax99=W~<*Gc`%M84`H zCA=z-zhpROLUYw4Lu;|gn9Cz2B384#oUQx6oPD8neZ2NPZM8)CIkF@*nzl_s<2+f4 z8b@=GC_himY#NfLrWuu|)2>MPhm+S*vuMQ)Q zQY3odH|jX;xnxrGKxLD=HuVc}fR_)I)$u#2%*vQY=cMqHBrzj2N5?NjnT^3o=c9-l zbs`i=(oQTDHPkITRmj2Mp)aE-kzBFoXq|4^=|V0BKOM~+MCcL}ebS`{@AF|QAKSG` z<>TFmLpl@-QeKx(oeB>_kS>=wNUXZb99%|Mq&SkAu-uhydefoGd<;>#I^{TN6eCt# z=}m_zBMg+jIdgC&eGBCRNhC%~B65rR`NG8vDY^kAiKGz|B*E+55hWq(-9aq3+FBM~ zxRkMuZbc~|xyC$~sM}h0p-_k+Pd`ApN4k(wTtm7PBPZ#$Z8}0(n4wH}p|p_-V%#MM zw@pVXcR6cB6?QrMM=5tZmq!(fF*N8WD5IqJG0!FI^vj|P#TnY3Y?}tfPIk>R^5;iY zi6vGXG`EvoT(roOUEH*slU+Qtx|3bJw84|G&MKs95l!}0;Uv4K*``68kS;+Ze_K?Q z)6)?x;q>%CRk=Kmqa|FP!Kmtd&oH#)T+?LDWNgxX=i$X~RgQMdu$P)(8XTn-m_JA9 z9;}?B)aJJ@;__bxPH-1iMHL4Ry&hcjOq1#=e!fvpIM=vjx>j=#$ER55$+G?X2o=2W`t}fDS;bQQuip&n zvK(Rk*(-ttEGY9!SmDszNv)RWH&a;u#&3V(|5kpT(m$Q%xQe*1(ANhgWW&#=^skd1 zf9+xYIHm8;TU$Wt{=jT)UdcM`K zJ*FSGrSH$)`0JEv{eC*7f1S(me``wLuK-@fQu*gkTyDrur$np={c=U4zY_4T={@rEDScfR_)E{|@7vP%Ym-(H_Z9s5poD}* z{B&Dlu2lNPhxE5r`Te@5zivy$kw2Z%*Huuz_?UkDiTi&4`zn@Oe{M@dNk5&^pL^qf z{(SxVE04)|CkL@Bnpi48 PJco!im>-B)u(13G2YfR# literal 437768 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