@zigc/lib 0.17.0-dev.44 → 0.17.0-dev.607
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/c/fcntl.zig +5 -0
- package/c/inttypes.zig +0 -10
- package/c/math.zig +52 -112
- package/c/pthread.zig +57 -0
- package/c/search.zig +1 -27
- package/c/stdlib/drand48.zig +0 -57
- package/c/stdlib.zig +31 -121
- package/c/string.zig +20 -7
- package/c/strings.zig +0 -38
- package/c/unistd.zig +28 -26
- package/c/wchar.zig +10 -0
- package/c.zig +2 -2
- package/{std/Build → compiler/Maker}/Fuzz.zig +177 -89
- package/compiler/Maker/Graph.zig +85 -0
- package/compiler/Maker/PkgConfig.zig +114 -0
- package/compiler/Maker/ScannedConfig.zig +370 -0
- package/compiler/Maker/Step/CheckFile.zig +63 -0
- package/compiler/Maker/Step/Compile.zig +1390 -0
- package/compiler/Maker/Step/ConfigHeader.zig +610 -0
- package/compiler/Maker/Step/FindProgram.zig +120 -0
- package/compiler/Maker/Step/Fmt.zig +65 -0
- package/compiler/Maker/Step/InstallArtifact.zig +141 -0
- package/compiler/Maker/Step/InstallDir.zig +99 -0
- package/compiler/Maker/Step/InstallFile.zig +26 -0
- package/compiler/Maker/Step/ObjCopy.zig +173 -0
- package/compiler/Maker/Step/Options.zig +104 -0
- package/compiler/Maker/Step/Run.zig +2372 -0
- package/compiler/Maker/Step/TranslateC.zig +152 -0
- package/compiler/Maker/Step/UpdateSourceFiles.zig +89 -0
- package/compiler/Maker/Step/WriteFile.zig +294 -0
- package/compiler/Maker/Step.zig +863 -0
- package/{std/Build → compiler/Maker}/Watch/FsEvents.zig +33 -24
- package/{std/Build → compiler/Maker}/Watch.zig +89 -68
- package/{std/Build → compiler/Maker}/WebServer.zig +145 -118
- package/compiler/Maker.zig +2051 -0
- package/compiler/aro/aro/CodeGen.zig +7 -8
- package/compiler/aro/aro/Compilation.zig +17 -17
- package/compiler/aro/aro/Driver.zig +18 -16
- package/compiler/aro/aro/Parser.zig +20 -15
- package/compiler/aro/aro/Pragma.zig +3 -2
- package/compiler/aro/aro/Preprocessor.zig +11 -8
- package/compiler/aro/aro/pragmas/message.zig +3 -2
- package/compiler/aro/aro/text_literal.zig +3 -2
- package/compiler/aro/assembly_backend/x86_64.zig +4 -4
- package/compiler/aro/backend/Ir/x86/Renderer.zig +3 -3
- package/compiler/configurer.zig +1402 -0
- package/compiler/reduce/Walk.zig +8 -13
- package/compiler/resinator/compile.zig +1 -1
- package/compiler/resinator/cvtres.zig +4 -4
- package/compiler/resinator/errors.zig +7 -7
- package/compiler/resinator/ico.zig +4 -4
- package/compiler/resinator/parse.zig +2 -2
- package/compiler/resinator/res.zig +1 -1
- package/compiler/std-docs.zig +17 -38
- package/compiler/test_runner.zig +25 -15
- package/compiler/translate-c/MacroTranslator.zig +1 -1
- package/compiler/translate-c/Translator.zig +2 -2
- package/compiler/translate-c/ast.zig +16 -23
- package/compiler/translate-c/main.zig +1 -1
- package/compiler_rt/addf3.zig +1 -1
- package/compiler_rt/arm.zig +3 -3
- package/compiler_rt/atomics.zig +1 -1
- package/compiler_rt/comparef.zig +3 -3
- package/compiler_rt/cos.zig +1 -3
- package/compiler_rt/count0bits.zig +1 -1
- package/compiler_rt/divdf3.zig +2 -2
- package/compiler_rt/divsf3.zig +1 -1
- package/compiler_rt/divtf3.zig +1 -1
- package/compiler_rt/divxf3.zig +1 -1
- package/compiler_rt/exp.zig +0 -2
- package/compiler_rt/exp2.zig +0 -2
- package/compiler_rt/extendf.zig +5 -5
- package/compiler_rt/fabs.zig +1 -3
- package/compiler_rt/float_from_int.zig +4 -5
- package/compiler_rt/fma.zig +0 -2
- package/compiler_rt/fmax.zig +1 -3
- package/compiler_rt/fmin.zig +1 -3
- package/compiler_rt/fmod.zig +2 -4
- package/compiler_rt/int_from_float.zig +1 -1
- package/compiler_rt/limb64.zig +3 -2
- package/compiler_rt/log.zig +0 -2
- package/compiler_rt/log10.zig +0 -2
- package/compiler_rt/log2.zig +0 -2
- package/compiler_rt/mulf3.zig +2 -2
- package/compiler_rt/rem_pio2l.zig +1 -1
- package/compiler_rt/round.zig +0 -2
- package/compiler_rt/sin.zig +1 -3
- package/compiler_rt/sincos.zig +1 -3
- package/compiler_rt/sqrt.zig +0 -2
- package/compiler_rt/ssp.zig +2 -2
- package/compiler_rt/tan.zig +1 -3
- package/compiler_rt/trunc.zig +0 -2
- package/compiler_rt/truncf.zig +3 -3
- package/compiler_rt/trunctfhf2.zig +3 -0
- package/compiler_rt.zig +5 -26
- package/docs/main.js +8 -8
- package/docs/wasm/Walk.zig +1 -3
- package/docs/wasm/html_render.zig +1 -2
- package/docs/wasm/markdown/Parser.zig +16 -20
- package/fuzzer.zig +5 -3
- package/include/__clang_spirv_builtins.h +12 -12
- package/include/__float_float.h +176 -0
- package/include/__float_header_macro.h +12 -0
- package/include/__float_infinity_nan.h +20 -0
- package/include/amo.h +131 -0
- package/include/amxavx512intrin.h +215 -1
- package/include/amxintrin.h +0 -2
- package/include/arm_acle.h +37 -27
- package/include/arm_neon.h +218 -82
- package/include/arm_sme.h +8 -8
- package/include/arm_sve.h +4162 -3782
- package/include/avx10_2_512bf16intrin.h +19 -12
- package/include/avx10_2_512convertintrin.h +1 -1
- package/include/avx10_2_512niintrin.h +31 -31
- package/include/avx10_2_512satcvtdsintrin.h +1 -1
- package/include/avx10_2bf16intrin.h +54 -45
- package/include/avx10_2convertintrin.h +2 -2
- package/include/avx10_2copyintrin.h +1 -1
- package/include/avx10_2niintrin.h +14 -14
- package/include/avx10_2satcvtdsintrin.h +2 -2
- package/include/avx2intrin.h +275 -377
- package/include/avx512bf16intrin.h +25 -16
- package/include/avx512bitalgintrin.h +19 -30
- package/include/avx512bwintrin.h +386 -505
- package/include/avx512cdintrin.h +42 -55
- package/include/avx512dqintrin.h +132 -161
- package/include/avx512fintrin.h +1015 -1424
- package/include/avx512fp16intrin.h +112 -110
- package/include/avx512ifmaintrin.h +32 -34
- package/include/avx512ifmavlintrin.h +73 -46
- package/include/avx512vbmi2intrin.h +43 -32
- package/include/avx512vbmiintrin.h +19 -27
- package/include/avx512vbmivlintrin.h +35 -49
- package/include/avx512vlbf16intrin.h +32 -22
- package/include/avx512vlbitalgintrin.h +37 -53
- package/include/avx512vlbwintrin.h +470 -573
- package/include/avx512vlcdintrin.h +74 -102
- package/include/avx512vldqintrin.h +110 -127
- package/include/avx512vlfp16intrin.h +130 -111
- package/include/avx512vlintrin.h +945 -1299
- package/include/avx512vlvbmi2intrin.h +78 -63
- package/include/avx512vlvnniintrin.h +21 -18
- package/include/avx512vlvp2intersectintrin.h +2 -2
- package/include/avx512vnniintrin.h +10 -10
- package/include/avx512vp2intersectintrin.h +1 -2
- package/include/avx512vpopcntdqintrin.h +8 -10
- package/include/avx512vpopcntdqvlintrin.h +17 -15
- package/include/avxifmaintrin.h +16 -0
- package/include/avxintrin.h +165 -241
- package/include/avxvnniint16intrin.h +118 -99
- package/include/avxvnniint8intrin.h +56 -32
- package/include/avxvnniintrin.h +16 -8
- package/include/cpuid.h +101 -4
- package/include/emmintrin.h +168 -168
- package/include/f16cintrin.h +23 -9
- package/include/float.h +16 -155
- package/include/fma4intrin.h +98 -96
- package/include/fmaintrin.h +96 -66
- package/include/gfniintrin.h +21 -16
- package/include/hexagon_types.h +23 -20
- package/include/hvx_hexagon_protos.h +649 -860
- package/include/immintrin.h +0 -12
- package/include/intrin.h +4 -0
- package/include/lasxintrin.h +113 -0
- package/include/llvm_libc_wrappers/assert.h +3 -5
- package/include/llvm_libc_wrappers/ctype.h +3 -115
- package/include/llvm_libc_wrappers/inttypes.h +3 -5
- package/include/llvm_libc_wrappers/stdio.h +10 -38
- package/include/llvm_libc_wrappers/stdlib.h +3 -24
- package/include/llvm_libc_wrappers/string.h +2 -70
- package/include/llvm_libc_wrappers/time.h +4 -10
- package/include/mmintrin.h +188 -257
- package/include/module.modulemap +23 -4
- package/include/movrs_avx10_2_512intrin.h +2 -2
- package/include/movrs_avx10_2intrin.h +4 -4
- package/include/pmmintrin.h +12 -24
- package/include/ptrauth.h +16 -2
- package/include/riscv_mips.h +34 -0
- package/include/riscv_nds.h +89 -0
- package/include/sifive_vector.h +58 -2
- package/include/sm4evexintrin.h +2 -2
- package/include/smmintrin.h +77 -59
- package/include/spirvintrin.h +194 -0
- package/include/stddefer.h +19 -0
- package/include/tmmintrin.h +116 -147
- package/include/vaesintrin.h +1 -2
- package/include/xmmintrin.h +44 -70
- package/include/xopintrin.h +20 -10
- package/init/build.zig +1 -3
- package/libc/darwin/SDKSettings.json +1 -1
- package/libc/darwin/libSystem.tbd +88 -87
- package/libc/include/aarch64-linux-any/asm/hwcap.h +1 -0
- package/libc/include/aarch64-linux-any/asm/unistd_64.h +1 -0
- package/libc/include/aarch64-openbsd-none/arm64/cpu.h +7 -1
- package/libc/include/aarch64-openbsd-none/arm64/intr.h +9 -1
- package/libc/include/aarch64-openbsd-none/machine/cpu.h +7 -1
- package/libc/include/aarch64-openbsd-none/machine/intr.h +9 -1
- package/libc/include/any-darwin-any/AvailabilityInternal.h +10 -10
- package/libc/include/any-darwin-any/AvailabilityVersions.h +8 -0
- package/libc/include/any-darwin-any/mach/host_info.h +3 -1
- package/libc/include/any-darwin-any/mach/mach_voucher_types.h +2 -0
- package/libc/include/any-darwin-any/mach/vm_statistics.h +33 -2
- package/libc/include/any-darwin-any/spawn.h +3 -1
- package/libc/include/any-darwin-any/sys/_symbol_aliasing.h +12 -0
- package/libc/include/any-linux-any/asm-generic/errno.h +2 -0
- package/libc/include/any-linux-any/asm-generic/unistd.h +4 -1
- package/libc/include/any-linux-any/drm/amdgpu_drm.h +20 -6
- package/libc/include/any-linux-any/drm/amdxdna_accel.h +8 -0
- package/libc/include/any-linux-any/drm/drm_fourcc.h +6 -6
- package/libc/include/any-linux-any/drm/panfrost_drm.h +75 -1
- package/libc/include/any-linux-any/drm/panthor_drm.h +154 -3
- package/libc/include/any-linux-any/drm/rocket_accel.h +74 -24
- package/libc/include/any-linux-any/drm/xe_drm.h +89 -6
- package/libc/include/any-linux-any/linux/android/binder.h +1 -1
- package/libc/include/any-linux-any/linux/bpf.h +28 -0
- package/libc/include/any-linux-any/linux/btrfs.h +1 -0
- package/libc/include/any-linux-any/linux/btrfs_tree.h +32 -2
- package/libc/include/any-linux-any/linux/dma-buf.h +1 -0
- package/libc/include/any-linux-any/linux/dpll.h +1 -0
- package/libc/include/any-linux-any/linux/elf.h +2 -0
- package/libc/include/any-linux-any/linux/ethtool.h +21 -5
- package/libc/include/any-linux-any/linux/fs.h +1 -0
- package/libc/include/any-linux-any/linux/hyperv.h +1 -1
- package/libc/include/any-linux-any/linux/idxd.h +134 -134
- package/libc/include/any-linux-any/linux/if_alg.h +1 -1
- package/libc/include/any-linux-any/linux/if_link.h +1 -0
- package/libc/include/any-linux-any/linux/input-event-codes.h +4 -0
- package/libc/include/any-linux-any/linux/io_uring/bpf_filter.h +68 -0
- package/libc/include/any-linux-any/linux/io_uring/query.h +5 -1
- package/libc/include/any-linux-any/linux/io_uring.h +33 -2
- package/libc/include/any-linux-any/linux/iommufd.h +39 -0
- package/libc/include/any-linux-any/linux/kfd_ioctl.h +13 -3
- package/libc/include/any-linux-any/linux/kfd_sysfs.h +2 -1
- package/libc/include/any-linux-any/linux/kvm.h +30 -6
- package/libc/include/any-linux-any/linux/landlock.h +22 -8
- package/libc/include/any-linux-any/linux/magic.h +1 -0
- package/libc/include/any-linux-any/linux/mempolicy.h +3 -0
- package/libc/include/any-linux-any/linux/mount.h +11 -2
- package/libc/include/any-linux-any/linux/mptcp_pm.h +1 -1
- package/libc/include/any-linux-any/linux/mshv.h +2 -0
- package/libc/include/any-linux-any/linux/netfilter_bridge.h +5 -4
- package/libc/include/any-linux-any/linux/netfilter_ipv4.h +4 -5
- package/libc/include/any-linux-any/linux/netfilter_ipv6.h +3 -4
- package/libc/include/any-linux-any/linux/nfs.h +1 -1
- package/libc/include/any-linux-any/linux/nfsd_netlink.h +1 -0
- package/libc/include/any-linux-any/linux/nilfs2_api.h +2 -2
- package/libc/include/any-linux-any/linux/nilfs2_ondisk.h +97 -66
- package/libc/include/any-linux-any/linux/nl80211.h +104 -3
- package/libc/include/any-linux-any/linux/pci.h +7 -0
- package/libc/include/any-linux-any/linux/pci_regs.h +65 -6
- package/libc/include/any-linux-any/linux/pcitest.h +1 -0
- package/libc/include/any-linux-any/linux/perf_event.h +24 -3
- package/libc/include/any-linux-any/linux/pkt_sched.h +1 -0
- package/libc/include/any-linux-any/linux/prctl.h +30 -0
- package/libc/include/any-linux-any/linux/rseq.h +62 -5
- package/libc/include/any-linux-any/linux/shm.h +0 -1
- package/libc/include/any-linux-any/linux/stddef.h +4 -0
- package/libc/include/any-linux-any/linux/sysctl.h +1 -2
- package/libc/include/any-linux-any/linux/taskstats.h +12 -1
- package/libc/include/any-linux-any/linux/tcp.h +23 -3
- package/libc/include/any-linux-any/linux/typelimits.h +8 -0
- package/libc/include/any-linux-any/linux/ublk_cmd.h +120 -1
- package/libc/include/any-linux-any/linux/v4l2-controls.h +63 -0
- package/libc/include/any-linux-any/linux/vbox_vmmdev_types.h +2 -2
- package/libc/include/any-linux-any/linux/vduse.h +80 -5
- package/libc/include/any-linux-any/linux/version.h +3 -3
- package/libc/include/any-linux-any/linux/vfio.h +4 -0
- package/libc/include/any-linux-any/linux/videodev2.h +3 -0
- package/libc/include/any-linux-any/linux/virtio_ring.h +1 -2
- package/libc/include/any-linux-any/linux/vmclock-abi.h +20 -0
- package/libc/include/any-linux-any/rdma/bnxt_re-abi.h +16 -0
- package/libc/include/any-linux-any/rdma/ib_user_ioctl_cmds.h +16 -0
- package/libc/include/any-linux-any/rdma/mana-abi.h +3 -0
- package/libc/include/any-linux-any/scsi/scsi_bsg_ufs.h +8 -9
- package/libc/include/any-linux-any/sound/sof/tokens.h +6 -0
- package/libc/include/arc-linux-any/asm/swab.h +0 -63
- package/libc/include/arc-linux-any/asm/unistd_32.h +1 -0
- package/libc/include/arm-linux-any/asm/ptrace.h +0 -9
- package/libc/include/arm-linux-any/asm/unistd-eabi.h +1 -0
- package/libc/include/arm-linux-any/asm/unistd-oabi.h +1 -0
- package/libc/include/csky-linux-any/asm/unistd_32.h +1 -0
- package/libc/include/generic-openbsd/db.h +1 -7
- package/libc/include/generic-openbsd/ddb/db_interface.h +2 -1
- package/libc/include/generic-openbsd/fnmatch.h +6 -2
- package/libc/include/generic-openbsd/login_cap.h +3 -1
- package/libc/include/generic-openbsd/miscfs/fuse/fusefs_node.h +2 -1
- package/libc/include/generic-openbsd/net/bpf.h +3 -1
- package/libc/include/generic-openbsd/net/hfsc.h +4 -4
- package/libc/include/generic-openbsd/net/if.h +5 -1
- package/libc/include/generic-openbsd/net/if_bridge.h +48 -1
- package/libc/include/generic-openbsd/net/if_etherbridge.h +20 -7
- package/libc/include/generic-openbsd/net/if_media.h +26 -1
- package/libc/include/generic-openbsd/net/if_pflow.h +71 -20
- package/libc/include/generic-openbsd/net/if_pfsync.h +2 -2
- package/libc/include/generic-openbsd/net/if_sppp.h +2 -1
- package/libc/include/generic-openbsd/net/if_trunk.h +3 -2
- package/libc/include/generic-openbsd/net/if_types.h +2 -2
- package/libc/include/generic-openbsd/net/if_var.h +34 -12
- package/libc/include/generic-openbsd/net/netisr.h +1 -3
- package/libc/include/generic-openbsd/net/pfvar.h +154 -1
- package/libc/include/generic-openbsd/net/pfvar_priv.h +256 -1
- package/libc/include/generic-openbsd/net80211/ieee80211.h +76 -4
- package/libc/include/generic-openbsd/net80211/ieee80211_ioctl.h +3 -2
- package/libc/include/generic-openbsd/net80211/ieee80211_node.h +48 -2
- package/libc/include/generic-openbsd/net80211/ieee80211_proto.h +4 -1
- package/libc/include/generic-openbsd/net80211/ieee80211_var.h +18 -2
- package/libc/include/generic-openbsd/netinet/if_ether.h +12 -11
- package/libc/include/generic-openbsd/netinet/igmp_var.h +17 -3
- package/libc/include/generic-openbsd/netinet/in_pcb.h +2 -1
- package/libc/include/generic-openbsd/netinet/in_var.h +17 -59
- package/libc/include/generic-openbsd/netinet/ip.h +3 -2
- package/libc/include/generic-openbsd/netinet/tcp_timer.h +1 -2
- package/libc/include/generic-openbsd/netinet6/in6_var.h +15 -29
- package/libc/include/generic-openbsd/netinet6/ip6_var.h +1 -2
- package/libc/include/generic-openbsd/netinet6/mld6_var.h +17 -4
- package/libc/include/generic-openbsd/netinet6/nd6.h +2 -2
- package/libc/include/generic-openbsd/pthread.h +2 -2
- package/libc/include/generic-openbsd/signal.h +2 -2
- package/libc/include/generic-openbsd/sndio.h +6 -12
- package/libc/include/generic-openbsd/strings.h +5 -1
- package/libc/include/generic-openbsd/sys/device.h +4 -3
- package/libc/include/generic-openbsd/sys/disklabel.h +17 -5
- package/libc/include/generic-openbsd/sys/dkio.h +3 -5
- package/libc/include/generic-openbsd/sys/filedesc.h +3 -2
- package/libc/include/generic-openbsd/sys/mbuf.h +1 -1
- package/libc/include/generic-openbsd/sys/mman.h +7 -2
- package/libc/include/generic-openbsd/sys/mutex.h +10 -7
- package/libc/include/generic-openbsd/sys/namei.h +8 -7
- package/libc/include/generic-openbsd/sys/param.h +1 -1
- package/libc/include/generic-openbsd/sys/pledge.h +1 -3
- package/libc/include/generic-openbsd/sys/protosw.h +8 -1
- package/libc/include/generic-openbsd/sys/ptrace.h +4 -1
- package/libc/include/generic-openbsd/sys/sched.h +8 -1
- package/libc/include/generic-openbsd/sys/signal.h +4 -2
- package/libc/include/generic-openbsd/sys/socketvar.h +2 -1
- package/libc/include/generic-openbsd/sys/sockio.h +11 -1
- package/libc/include/generic-openbsd/sys/syscall.h +5 -3
- package/libc/include/generic-openbsd/sys/syscallargs.h +9 -2
- package/libc/include/generic-openbsd/sys/sysctl.h +7 -4
- package/libc/include/generic-openbsd/sys/types.h +6 -2
- package/libc/include/generic-openbsd/sys/videoio.h +143 -68
- package/libc/include/generic-openbsd/sys/xcall.h +2 -2
- package/libc/include/generic-openbsd/time.h +2 -2
- package/libc/include/generic-openbsd/unistd.h +2 -2
- package/libc/include/generic-openbsd/uvm/uvm_anon.h +2 -3
- package/libc/include/generic-openbsd/uvm/uvm_extern.h +1 -19
- package/libc/include/generic-openbsd/uvm/uvm_pager.h +3 -4
- package/libc/include/generic-openbsd/uvm/uvm_pmemrange.h +1 -2
- package/libc/include/generic-openbsd/uvm/uvm_swap.h +4 -1
- package/libc/include/generic-openbsd/uvm/uvm_vnode.h +3 -4
- package/libc/include/generic-openbsd/uvm/uvmexp.h +41 -35
- package/libc/include/hexagon-linux-any/asm/unistd_32.h +1 -0
- package/libc/include/loongarch-linux-any/asm/hwcap.h +1 -0
- package/libc/include/loongarch-linux-any/asm/kvm.h +1 -0
- package/libc/include/loongarch-linux-any/asm/kvm_para.h +1 -0
- package/libc/include/loongarch-linux-any/asm/unistd_32.h +2 -0
- package/libc/include/loongarch-linux-any/asm/unistd_64.h +2 -0
- package/libc/include/m68k-linux-any/asm/unistd_32.h +1 -0
- package/libc/include/mips-linux-any/asm/errno.h +2 -0
- package/libc/include/mips-linux-any/asm/unistd_n32.h +1 -0
- package/libc/include/mips-linux-any/asm/unistd_n64.h +1 -0
- package/libc/include/mips-linux-any/asm/unistd_o32.h +1 -0
- package/libc/include/mips64-openbsd-none/machine/octeonvar.h +1 -27
- package/libc/include/mips64-openbsd-none/octeon/octeonvar.h +1 -27
- package/libc/include/mips64el-openbsd-none/loongson/apmvar.h +1 -1
- package/libc/include/mips64el-openbsd-none/loongson/param.h +1 -5
- package/libc/include/mips64el-openbsd-none/machine/apmvar.h +1 -1
- package/libc/include/mips64el-openbsd-none/machine/param.h +1 -5
- package/libc/include/powerpc-linux-any/asm/unistd_32.h +1 -0
- package/libc/include/powerpc-linux-any/asm/unistd_64.h +1 -0
- package/libc/include/powerpc-openbsd-eabihf/powerpc/intr.h +1 -4
- package/libc/include/powerpc64-openbsd-none/machine/atomic.h +3 -3
- package/libc/include/powerpc64-openbsd-none/powerpc64/atomic.h +3 -3
- package/libc/include/riscv-linux-any/asm/hwprobe.h +4 -0
- package/libc/include/riscv-linux-any/asm/kvm.h +3 -0
- package/libc/include/riscv-linux-any/asm/ptrace.h +37 -0
- package/libc/include/riscv-linux-any/asm/sigcontext.h +1 -0
- package/libc/include/riscv-linux-any/asm/unistd_32.h +1 -0
- package/libc/include/riscv-linux-any/asm/unistd_64.h +1 -0
- package/libc/include/riscv64-openbsd-none/machine/cpu.h +4 -8
- package/libc/include/riscv64-openbsd-none/machine/cpufunc.h +4 -4
- package/libc/include/riscv64-openbsd-none/machine/pmap.h +5 -1
- package/libc/include/riscv64-openbsd-none/machine/pte.h +9 -1
- package/libc/include/riscv64-openbsd-none/riscv64/cpu.h +4 -8
- package/libc/include/riscv64-openbsd-none/riscv64/cpufunc.h +4 -4
- package/libc/include/riscv64-openbsd-none/riscv64/pmap.h +5 -1
- package/libc/include/riscv64-openbsd-none/riscv64/pte.h +9 -1
- package/libc/include/s390x-linux-any/asm/unistd_64.h +1 -0
- package/libc/include/sparc-linux-any/asm/errno.h +2 -0
- package/libc/include/sparc-linux-any/asm/ioctls.h +4 -4
- package/libc/include/sparc-linux-any/asm/unistd_32.h +2 -0
- package/libc/include/sparc-linux-any/asm/unistd_64.h +2 -0
- package/libc/include/x86-linux-any/asm/auxvec.h +0 -4
- package/libc/include/x86-linux-any/asm/kvm.h +13 -8
- package/libc/include/x86-linux-any/asm/svm.h +16 -16
- package/libc/include/x86-linux-any/asm/unistd_32.h +1 -0
- package/libc/include/x86-linux-any/asm/unistd_64.h +1 -0
- package/libc/include/x86-linux-any/asm/unistd_x32.h +1 -0
- package/libc/include/x86-openbsd-none/i386/specialreg.h +3 -1
- package/libc/include/x86-openbsd-none/machine/specialreg.h +3 -1
- package/libc/include/x86_64-openbsd-none/amd64/conf.h +11 -2
- package/libc/include/x86_64-openbsd-none/amd64/cpu.h +14 -4
- package/libc/include/x86_64-openbsd-none/amd64/cpufunc.h +2 -3
- package/libc/include/x86_64-openbsd-none/amd64/ghcb.h +2 -1
- package/libc/include/x86_64-openbsd-none/amd64/i82489var.h +2 -4
- package/libc/include/x86_64-openbsd-none/amd64/i8259.h +1 -53
- package/libc/include/x86_64-openbsd-none/amd64/intr.h +5 -2
- package/libc/include/x86_64-openbsd-none/amd64/intrdefs.h +9 -7
- package/libc/include/x86_64-openbsd-none/amd64/kexec.h +48 -0
- package/libc/include/x86_64-openbsd-none/amd64/specialreg.h +4 -1
- package/libc/include/x86_64-openbsd-none/machine/conf.h +11 -2
- package/libc/include/x86_64-openbsd-none/machine/cpu.h +14 -4
- package/libc/include/x86_64-openbsd-none/machine/cpufunc.h +2 -3
- package/libc/include/x86_64-openbsd-none/machine/ghcb.h +2 -1
- package/libc/include/x86_64-openbsd-none/machine/i82489var.h +2 -4
- package/libc/include/x86_64-openbsd-none/machine/i8259.h +1 -53
- package/libc/include/x86_64-openbsd-none/machine/intr.h +5 -2
- package/libc/include/x86_64-openbsd-none/machine/intrdefs.h +9 -7
- package/libc/include/x86_64-openbsd-none/machine/kexec.h +48 -0
- package/libc/include/x86_64-openbsd-none/machine/specialreg.h +4 -1
- package/libc/include/xtensa-linux-any/asm/unistd_32.h +1 -0
- package/libc/openbsd/abilists +0 -0
- package/libcxx/include/__algorithm/all_of.h +11 -5
- package/libcxx/include/__algorithm/comp.h +4 -0
- package/libcxx/include/__algorithm/copy.h +28 -147
- package/libcxx/include/__algorithm/copy_backward.h +9 -24
- package/libcxx/include/__algorithm/copy_n.h +50 -16
- package/libcxx/include/__algorithm/count.h +2 -2
- package/libcxx/include/__algorithm/equal.h +43 -55
- package/libcxx/include/__algorithm/fill.h +26 -8
- package/libcxx/include/__algorithm/fill_n.h +32 -46
- package/libcxx/include/__algorithm/find.h +96 -39
- package/libcxx/include/__algorithm/find_end.h +105 -0
- package/libcxx/include/__algorithm/for_each.h +18 -24
- package/libcxx/include/__algorithm/for_each_n.h +20 -47
- package/libcxx/include/__algorithm/for_each_n_segment.h +1 -1
- package/libcxx/include/__algorithm/for_each_segment.h +26 -0
- package/libcxx/include/__algorithm/generate.h +4 -2
- package/libcxx/include/__algorithm/generate_n.h +19 -6
- package/libcxx/include/__algorithm/is_permutation.h +4 -4
- package/libcxx/include/__algorithm/iterator_operations.h +3 -0
- package/libcxx/include/__algorithm/lexicographical_compare.h +2 -2
- package/libcxx/include/__algorithm/lexicographical_compare_three_way.h +6 -6
- package/libcxx/include/__algorithm/make_heap.h +16 -4
- package/libcxx/include/__algorithm/mismatch.h +2 -2
- package/libcxx/include/__algorithm/move.h +8 -19
- package/libcxx/include/__algorithm/move_backward.h +9 -24
- package/libcxx/include/__algorithm/none_of.h +4 -4
- package/libcxx/include/__algorithm/partial_sort.h +1 -1
- package/libcxx/include/__algorithm/partial_sort_copy.h +1 -1
- package/libcxx/include/__algorithm/pstl.h +9 -9
- package/libcxx/include/__algorithm/radix_sort.h +27 -25
- package/libcxx/include/__algorithm/ranges_copy_n.h +3 -26
- package/libcxx/include/__algorithm/ranges_equal.h +17 -26
- package/libcxx/include/__algorithm/ranges_fill.h +7 -6
- package/libcxx/include/__algorithm/ranges_for_each.h +9 -1
- package/libcxx/include/__algorithm/ranges_generate_n.h +2 -6
- package/libcxx/include/__algorithm/ranges_search_n.h +2 -2
- package/libcxx/include/__algorithm/rotate.h +27 -44
- package/libcxx/include/__algorithm/search_n.h +49 -37
- package/libcxx/include/__algorithm/sift_down.h +19 -18
- package/libcxx/include/__algorithm/simd_utils.h +33 -4
- package/libcxx/include/__algorithm/specialized_algorithms.h +54 -0
- package/libcxx/include/__algorithm/stable_sort.h +1 -1
- package/libcxx/include/__assertion_handler +31 -4
- package/libcxx/include/__atomic/atomic.h +36 -60
- package/libcxx/include/__atomic/atomic_flag.h +19 -37
- package/libcxx/include/__atomic/atomic_ref.h +29 -12
- package/libcxx/include/__atomic/atomic_sync.h +127 -55
- package/libcxx/include/__atomic/atomic_sync_timed.h +144 -0
- package/libcxx/include/__atomic/atomic_waitable_traits.h +103 -0
- package/libcxx/include/__atomic/contention_t.h +27 -3
- package/libcxx/include/__atomic/floating_point_helper.h +55 -0
- package/libcxx/include/__bit/countl.h +1 -2
- package/libcxx/include/__bit/countr.h +1 -2
- package/libcxx/include/__bit/has_single_bit.h +1 -1
- package/libcxx/include/__bit/popcount.h +0 -1
- package/libcxx/include/__bit/rotate.h +15 -26
- package/libcxx/include/__bit_reference +207 -18
- package/libcxx/include/__charconv/from_chars_integral.h +1 -1
- package/libcxx/include/__charconv/from_chars_result.h +1 -1
- package/libcxx/include/__charconv/to_chars_integral.h +1 -0
- package/libcxx/include/__charconv/to_chars_result.h +1 -1
- package/libcxx/include/__charconv/traits.h +3 -24
- package/libcxx/include/__chrono/day.h +11 -0
- package/libcxx/include/__chrono/duration.h +58 -33
- package/libcxx/include/__chrono/file_clock.h +4 -2
- package/libcxx/include/__chrono/is_clock.h +72 -0
- package/libcxx/include/__chrono/leap_second.h +13 -0
- package/libcxx/include/__chrono/month.h +13 -0
- package/libcxx/include/__chrono/month_weekday.h +22 -0
- package/libcxx/include/__chrono/monthday.h +20 -0
- package/libcxx/include/__chrono/steady_clock.h +1 -1
- package/libcxx/include/__chrono/system_clock.h +3 -3
- package/libcxx/include/__chrono/time_point.h +37 -13
- package/libcxx/include/__chrono/weekday.h +25 -0
- package/libcxx/include/__chrono/year.h +11 -0
- package/libcxx/include/__chrono/year_month.h +13 -0
- package/libcxx/include/__chrono/year_month_day.h +23 -0
- package/libcxx/include/__chrono/year_month_weekday.h +26 -0
- package/libcxx/include/__chrono/zoned_time.h +16 -0
- package/libcxx/include/__compare/is_eq.h +6 -6
- package/libcxx/include/__compare/strong_order.h +12 -30
- package/libcxx/include/__compare/three_way_comparable.h +2 -2
- package/libcxx/include/__concepts/comparison_common_type.h +40 -0
- package/libcxx/include/__concepts/equality_comparable.h +2 -1
- package/libcxx/include/__condition_variable/condition_variable.h +1 -1
- package/libcxx/include/__config +63 -280
- package/libcxx/include/__configuration/abi.h +14 -24
- package/libcxx/include/__configuration/availability.h +65 -118
- package/libcxx/include/__configuration/compiler.h +6 -6
- package/libcxx/include/__configuration/experimental.h +38 -0
- package/libcxx/include/__configuration/hardening.h +215 -0
- package/libcxx/include/__configuration/language.h +3 -0
- package/libcxx/include/__configuration/platform.h +9 -16
- package/libcxx/include/__coroutine/coroutine_handle.h +9 -9
- package/libcxx/include/__coroutine/noop_coroutine_handle.h +11 -13
- package/libcxx/include/__debug_utils/strict_weak_ordering_check.h +1 -1
- package/libcxx/include/__exception/exception.h +6 -4
- package/libcxx/include/__exception/exception_ptr.h +27 -5
- package/libcxx/include/__exception/nested_exception.h +2 -2
- package/libcxx/include/__exception/operations.h +5 -5
- package/libcxx/include/__expected/bad_expected_access.h +8 -6
- package/libcxx/include/__expected/expected.h +62 -64
- package/libcxx/include/__expected/unexpected.h +4 -4
- package/libcxx/include/__filesystem/copy_options.h +4 -4
- package/libcxx/include/__filesystem/directory_entry.h +37 -33
- package/libcxx/include/__filesystem/directory_iterator.h +9 -11
- package/libcxx/include/__filesystem/directory_options.h +7 -4
- package/libcxx/include/__filesystem/file_status.h +3 -3
- package/libcxx/include/__filesystem/filesystem_error.h +9 -10
- package/libcxx/include/__filesystem/operations.h +97 -66
- package/libcxx/include/__filesystem/path.h +68 -64
- package/libcxx/include/__filesystem/path_iterator.h +1 -3
- package/libcxx/include/__filesystem/perm_options.h +4 -4
- package/libcxx/include/__filesystem/perms.h +4 -4
- package/libcxx/include/__filesystem/recursive_directory_iterator.h +9 -14
- package/libcxx/include/__filesystem/space_info.h +1 -1
- package/libcxx/include/__filesystem/u8path.h +12 -14
- package/libcxx/include/__flat_map/flat_map.h +88 -71
- package/libcxx/include/__flat_map/flat_multimap.h +251 -172
- package/libcxx/include/__flat_map/key_value_iterator.h +0 -1
- package/libcxx/include/__flat_map/utils.h +1 -0
- package/libcxx/include/__flat_set/flat_multiset.h +211 -143
- package/libcxx/include/__flat_set/flat_set.h +86 -68
- package/libcxx/include/__format/concepts.h +0 -14
- package/libcxx/include/__format/extended_grapheme_cluster_table.h +3 -2
- package/libcxx/include/__format/fmt_pair_like.h +42 -0
- package/libcxx/include/__format/format_arg.h +7 -10
- package/libcxx/include/__format/format_args.h +1 -1
- package/libcxx/include/__format/format_context.h +5 -5
- package/libcxx/include/__format/format_parse_context.h +2 -2
- package/libcxx/include/__format/formatter_output.h +30 -34
- package/libcxx/include/__format/indic_conjunct_break_table.h +3 -2
- package/libcxx/include/__format/range_default_formatter.h +2 -41
- package/libcxx/include/__format/range_format.h +71 -0
- package/libcxx/include/__format/range_formatter.h +1 -0
- package/libcxx/include/__format/width_estimation_table.h +4 -2
- package/libcxx/include/__functional/bind.h +10 -15
- package/libcxx/include/__functional/bind_back.h +1 -1
- package/libcxx/include/__functional/bind_front.h +1 -1
- package/libcxx/include/__functional/function.h +57 -75
- package/libcxx/include/__functional/hash.h +1 -10
- package/libcxx/include/__functional/identity.h +1 -1
- package/libcxx/include/__functional/is_transparent.h +8 -0
- package/libcxx/include/__functional/mem_fn.h +2 -1
- package/libcxx/include/__functional/operations.h +18 -0
- package/libcxx/include/__functional/ranges_operations.h +7 -0
- package/libcxx/include/__functional/reference_wrapper.h +7 -5
- package/libcxx/include/__functional/weak_result_type.h +14 -28
- package/libcxx/include/__fwd/ios.h +1 -1
- package/libcxx/include/__fwd/tuple.h +14 -0
- package/libcxx/include/__hash_table +371 -357
- package/libcxx/include/__ios/fpos.h +4 -4
- package/libcxx/include/__iterator/back_insert_iterator.h +1 -7
- package/libcxx/include/__iterator/bounded_iter.h +7 -8
- package/libcxx/include/__iterator/concepts.h +6 -9
- package/libcxx/include/__iterator/cpp17_iterator_concepts.h +13 -12
- package/libcxx/include/__iterator/distance.h +40 -18
- package/libcxx/include/__iterator/front_insert_iterator.h +1 -7
- package/libcxx/include/__iterator/insert_iterator.h +1 -7
- package/libcxx/include/__iterator/istream_iterator.h +6 -7
- package/libcxx/include/__iterator/istreambuf_iterator.h +6 -7
- package/libcxx/include/__iterator/iter_move.h +1 -1
- package/libcxx/include/__iterator/iterator.h +13 -0
- package/libcxx/include/__iterator/iterator_traits.h +13 -14
- package/libcxx/include/__iterator/ostream_iterator.h +1 -7
- package/libcxx/include/__iterator/ostreambuf_iterator.h +1 -7
- package/libcxx/include/__iterator/reverse_iterator.h +8 -13
- package/libcxx/include/__iterator/segmented_iterator.h +3 -8
- package/libcxx/include/__iterator/static_bounded_iter.h +3 -3
- package/libcxx/include/__iterator/wrap_iter.h +8 -6
- package/libcxx/include/__locale +3 -10
- package/libcxx/include/__locale_dir/locale_base_api/bsd_locale_fallbacks.h +0 -10
- package/libcxx/include/__locale_dir/locale_base_api.h +5 -28
- package/libcxx/include/__locale_dir/messages.h +1 -1
- package/libcxx/include/__locale_dir/money.h +2 -2
- package/libcxx/include/__locale_dir/num.h +190 -243
- package/libcxx/include/__locale_dir/pad_and_output.h +5 -6
- package/libcxx/include/__locale_dir/support/bsd_like.h +0 -20
- package/libcxx/include/__locale_dir/support/fuchsia.h +0 -7
- package/libcxx/include/__locale_dir/support/linux.h +0 -37
- package/libcxx/include/__locale_dir/support/netbsd.h +0 -2
- package/libcxx/include/__locale_dir/support/newlib.h +243 -0
- package/libcxx/include/__locale_dir/support/no_locale/characters.h +0 -4
- package/libcxx/include/__locale_dir/support/no_locale/strtonum.h +0 -9
- package/libcxx/include/__locale_dir/support/windows.h +0 -29
- package/libcxx/include/__locale_dir/time.h +3 -7
- package/libcxx/include/__math/hypot.h +1 -1
- package/libcxx/include/__math/logarithms.h +1 -1
- package/libcxx/include/__math/traits.h +80 -11
- package/libcxx/include/__mdspan/extents.h +7 -4
- package/libcxx/include/__mdspan/layout_stride.h +4 -5
- package/libcxx/include/__mdspan/mdspan.h +29 -23
- package/libcxx/include/__memory/addressof.h +7 -5
- package/libcxx/include/__memory/align.h +18 -1
- package/libcxx/include/__memory/allocate_at_least.h +15 -10
- package/libcxx/include/__memory/allocator.h +14 -26
- package/libcxx/include/__memory/allocator_traits.h +6 -4
- package/libcxx/include/__memory/compressed_pair.h +15 -9
- package/libcxx/include/__memory/construct_at.h +12 -23
- package/libcxx/include/__memory/inout_ptr.h +1 -1
- package/libcxx/include/__memory/is_sufficiently_aligned.h +1 -1
- package/libcxx/include/__memory/out_ptr.h +1 -1
- package/libcxx/include/__memory/pointer_traits.h +1 -1
- package/libcxx/include/__memory/raw_storage_iterator.h +3 -9
- package/libcxx/include/__memory/shared_count.h +9 -30
- package/libcxx/include/__memory/shared_ptr.h +100 -145
- package/libcxx/include/__memory/temp_value.h +1 -2
- package/libcxx/include/__memory/uninitialized_algorithms.h +44 -115
- package/libcxx/include/__memory/unique_ptr.h +14 -16
- package/libcxx/include/__memory/uses_allocator_construction.h +1 -0
- package/libcxx/include/__memory_resource/memory_resource.h +4 -2
- package/libcxx/include/__memory_resource/monotonic_buffer_resource.h +1 -1
- package/libcxx/include/__memory_resource/polymorphic_allocator.h +13 -8
- package/libcxx/include/__memory_resource/pool_options.h +1 -1
- package/libcxx/include/__memory_resource/synchronized_pool_resource.h +4 -2
- package/libcxx/include/__memory_resource/unsynchronized_pool_resource.h +1 -1
- package/libcxx/include/__mutex/mutex.h +2 -2
- package/libcxx/include/__mutex/once_flag.h +14 -11
- package/libcxx/include/__mutex/tag_types.h +3 -3
- package/libcxx/include/__mutex/unique_lock.h +8 -7
- package/libcxx/include/__new/align_val_t.h +6 -0
- package/libcxx/include/__new/allocate.h +1 -2
- package/libcxx/include/__new/exceptions.h +8 -2
- package/libcxx/include/__new/global_new_delete.h +4 -11
- package/libcxx/include/__new/interference_size.h +0 -4
- package/libcxx/include/__new/launder.h +3 -5
- package/libcxx/include/__new/nothrow_t.h +1 -1
- package/libcxx/include/__numeric/gcd_lcm.h +24 -34
- package/libcxx/include/__numeric/midpoint.h +9 -14
- package/libcxx/include/__numeric/pstl.h +2 -2
- package/libcxx/include/__numeric/saturation_arithmetic.h +13 -5
- package/libcxx/include/__ostream/basic_ostream.h +8 -8
- package/libcxx/include/__pstl/backends/default.h +14 -14
- package/libcxx/include/__pstl/backends/libdispatch.h +2 -2
- package/libcxx/include/__pstl/cpu_algos/find_if.h +1 -1
- package/libcxx/include/__pstl/cpu_algos/transform.h +5 -6
- package/libcxx/include/__pstl/cpu_algos/transform_reduce.h +5 -4
- package/libcxx/include/__random/binomial_distribution.h +10 -4
- package/libcxx/include/__random/mersenne_twister_engine.h +50 -154
- package/libcxx/include/__random/piecewise_constant_distribution.h +3 -2
- package/libcxx/include/__random/piecewise_linear_distribution.h +3 -2
- package/libcxx/include/__ranges/adjacent_transform_view.h +406 -0
- package/libcxx/include/__ranges/adjacent_view.h +419 -0
- package/libcxx/include/__ranges/as_rvalue_view.h +9 -9
- package/libcxx/include/__ranges/chunk_by_view.h +6 -6
- package/libcxx/include/__ranges/common_view.h +7 -7
- package/libcxx/include/__ranges/drop_view.h +8 -8
- package/libcxx/include/__ranges/drop_while_view.h +5 -5
- package/libcxx/include/__ranges/elements_of.h +49 -0
- package/libcxx/include/__ranges/empty_view.h +5 -5
- package/libcxx/include/__ranges/filter_view.h +10 -10
- package/libcxx/include/__ranges/iota_view.h +41 -22
- package/libcxx/include/__ranges/owning_view.h +15 -15
- package/libcxx/include/__ranges/ref_view.h +6 -6
- package/libcxx/include/__ranges/repeat_view.h +17 -10
- package/libcxx/include/__ranges/single_view.h +8 -8
- package/libcxx/include/__ranges/take_view.h +9 -9
- package/libcxx/include/__ranges/transform_view.h +1 -2
- package/libcxx/include/__ranges/view_interface.h +10 -10
- package/libcxx/include/__ranges/zip_transform_view.h +357 -0
- package/libcxx/include/__ranges/zip_view.h +20 -20
- package/libcxx/include/__split_buffer +612 -240
- package/libcxx/include/__stop_token/atomic_unique_lock.h +1 -1
- package/libcxx/include/__stop_token/stop_callback.h +2 -2
- package/libcxx/include/__stop_token/stop_source.h +1 -1
- package/libcxx/include/__stop_token/stop_state.h +4 -4
- package/libcxx/include/__stop_token/stop_token.h +1 -1
- package/libcxx/include/__string/char_traits.h +51 -31
- package/libcxx/include/__string/constexpr_c_functions.h +5 -5
- package/libcxx/include/__support/xlocale/__strtonum_fallback.h +0 -8
- package/libcxx/include/__system_error/error_category.h +8 -8
- package/libcxx/include/__system_error/error_code.h +5 -5
- package/libcxx/include/__system_error/error_condition.h +4 -4
- package/libcxx/include/__system_error/system_error.h +1 -1
- package/libcxx/include/__thread/id.h +1 -1
- package/libcxx/include/__thread/jthread.h +1 -1
- package/libcxx/include/__thread/poll_with_backoff.h +27 -8
- package/libcxx/include/__thread/support/c11.h +8 -8
- package/libcxx/include/__thread/support/pthread.h +8 -8
- package/libcxx/include/__thread/support/windows.h +8 -8
- package/libcxx/include/__thread/thread.h +13 -8
- package/libcxx/include/__thread/timed_backoff_policy.h +3 -2
- package/libcxx/include/__tree +849 -701
- package/libcxx/include/__tuple/sfinae_helpers.h +1 -44
- package/libcxx/include/__tuple/tuple_element.h +0 -12
- package/libcxx/include/__tuple/tuple_size.h +0 -4
- package/libcxx/include/__tuple/tuple_transform.h +45 -0
- package/libcxx/include/__type_traits/aligned_storage.h +13 -40
- package/libcxx/include/__type_traits/desugars_to.h +4 -0
- package/libcxx/include/__type_traits/invoke.h +8 -0
- package/libcxx/include/__type_traits/is_allocator.h +6 -7
- package/libcxx/include/__type_traits/is_array.h +26 -0
- package/libcxx/include/__type_traits/is_equality_comparable.h +16 -21
- package/libcxx/include/__type_traits/is_final.h +1 -1
- package/libcxx/include/__type_traits/is_floating_point.h +7 -6
- package/libcxx/include/__type_traits/is_generic_transparent_comparator.h +30 -0
- package/libcxx/include/__type_traits/is_specialization.h +2 -6
- package/libcxx/include/__type_traits/is_within_lifetime.h +29 -0
- package/libcxx/include/__type_traits/make_transparent.h +52 -0
- package/libcxx/include/__type_traits/reference_constructs_from_temporary.h +1 -7
- package/libcxx/include/__type_traits/reference_converts_from_temporary.h +1 -1
- package/libcxx/include/__utility/cmp.h +19 -7
- package/libcxx/include/__utility/default_three_way_comparator.h +70 -0
- package/libcxx/include/__utility/in_place.h +1 -1
- package/libcxx/include/__utility/integer_sequence.h +56 -41
- package/libcxx/include/__utility/lazy_synth_three_way_comparator.h +120 -0
- package/libcxx/include/__utility/pair.h +22 -25
- package/libcxx/include/__utility/scope_guard.h +2 -0
- package/libcxx/include/__utility/try_key_extraction.h +114 -0
- package/libcxx/include/__vector/vector.h +187 -160
- package/libcxx/include/__vector/vector_bool.h +76 -83
- package/libcxx/include/any +118 -155
- package/libcxx/include/array +88 -56
- package/libcxx/include/atomic +2 -0
- package/libcxx/include/barrier +20 -24
- package/libcxx/include/bitset +49 -30
- package/libcxx/include/ccomplex +3 -11
- package/libcxx/include/chrono +47 -0
- package/libcxx/include/ciso646 +3 -6
- package/libcxx/include/complex +77 -65
- package/libcxx/include/complex.h +10 -10
- package/libcxx/include/condition_variable +3 -3
- package/libcxx/include/cstdalign +3 -10
- package/libcxx/include/cstdbool +3 -10
- package/libcxx/include/ctgmath +2 -11
- package/libcxx/include/ctype.h +24 -24
- package/libcxx/include/cwchar +2 -2
- package/libcxx/include/deque +109 -225
- package/libcxx/include/errno.h +269 -269
- package/libcxx/include/exception +4 -1
- package/libcxx/include/ext/hash_map +7 -48
- package/libcxx/include/ext/hash_set +2 -8
- package/libcxx/include/fenv.h +43 -43
- package/libcxx/include/flat_map +663 -11
- package/libcxx/include/flat_set +543 -8
- package/libcxx/include/float.h +16 -16
- package/libcxx/include/forward_list +33 -53
- package/libcxx/include/fstream +57 -42
- package/libcxx/include/future +41 -51
- package/libcxx/include/initializer_list +9 -3
- package/libcxx/include/inttypes.h +16 -16
- package/libcxx/include/ios +28 -28
- package/libcxx/include/istream +19 -13
- package/libcxx/include/iterator +10 -0
- package/libcxx/include/latch +7 -5
- package/libcxx/include/limits +4 -4
- package/libcxx/include/list +61 -79
- package/libcxx/include/map +386 -274
- package/libcxx/include/math.h +19 -0
- package/libcxx/include/mdspan +1 -5
- package/libcxx/include/mutex +29 -19
- package/libcxx/include/optional +644 -149
- package/libcxx/include/print +9 -5
- package/libcxx/include/queue +39 -37
- package/libcxx/include/ranges +48 -0
- package/libcxx/include/regex +33 -31
- package/libcxx/include/scoped_allocator +16 -11
- package/libcxx/include/semaphore +15 -18
- package/libcxx/include/set +220 -192
- package/libcxx/include/shared_mutex +3 -8
- package/libcxx/include/span +53 -37
- package/libcxx/include/sstream +34 -28
- package/libcxx/include/stack +13 -15
- package/libcxx/include/stddef.h +10 -10
- package/libcxx/include/stdexcept +2 -2
- package/libcxx/include/stdio.h +20 -21
- package/libcxx/include/streambuf +59 -19
- package/libcxx/include/string +574 -573
- package/libcxx/include/string_view +113 -89
- package/libcxx/include/strstream +10 -10
- package/libcxx/include/syncstream +4 -4
- package/libcxx/include/tgmath.h +12 -12
- package/libcxx/include/tuple +242 -212
- package/libcxx/include/type_traits +8 -2
- package/libcxx/include/typeindex +5 -3
- package/libcxx/include/typeinfo +92 -89
- package/libcxx/include/unordered_map +179 -304
- package/libcxx/include/unordered_set +168 -195
- package/libcxx/include/utility +12 -0
- package/libcxx/include/valarray +106 -161
- package/libcxx/include/variant +25 -33
- package/libcxx/include/version +41 -24
- package/libcxx/include/wctype.h +29 -29
- package/libcxx/libc/hdr/errno_macros.h +3 -1
- package/libcxx/libc/hdr/stdint_proxy.h +18 -0
- package/libcxx/libc/hdr/types/wchar_t.h +23 -0
- package/libcxx/libc/hdr/wchar_overlay.h +69 -0
- package/libcxx/libc/include/llvm-libc-macros/cfloat128-macros.h +41 -0
- package/libcxx/libc/include/llvm-libc-macros/cfloat16-macros.h +20 -0
- package/libcxx/libc/include/llvm-libc-macros/wchar-macros.h +18 -0
- package/libcxx/libc/include/llvm-libc-types/cfloat128.h +11 -28
- package/libcxx/libc/include/llvm-libc-types/cfloat16.h +4 -7
- package/libcxx/libc/include/llvm-libc-types/wint_t.h +14 -0
- package/libcxx/libc/shared/libc_common.h +5 -0
- package/libcxx/libc/src/__support/CPP/bit.h +50 -12
- package/libcxx/libc/src/__support/CPP/type_traits/is_complex.h +7 -0
- package/libcxx/libc/src/__support/CPP/type_traits/is_destructible.h +2 -1
- package/libcxx/libc/src/__support/CPP/type_traits/is_unsigned.h +6 -0
- package/libcxx/libc/src/__support/CPP/utility/integer_sequence.h +10 -0
- package/libcxx/libc/src/__support/FPUtil/FPBits.h +6 -7
- package/libcxx/libc/src/__support/FPUtil/rounding_mode.h +50 -4
- package/libcxx/libc/src/__support/big_int.h +14 -14
- package/libcxx/libc/src/__support/common.h +3 -2
- package/libcxx/libc/src/__support/ctype_utils.h +19 -12
- package/libcxx/libc/src/__support/detailed_powers_of_ten.h +1 -2
- package/libcxx/libc/src/__support/high_precision_decimal.h +33 -14
- package/libcxx/libc/src/__support/libc_assert.h +2 -0
- package/libcxx/libc/src/__support/macros/attributes.h +44 -1
- package/libcxx/libc/src/__support/macros/config.h +23 -0
- package/libcxx/libc/src/__support/macros/null_check.h +1 -2
- package/libcxx/libc/src/__support/macros/optimization.h +3 -0
- package/libcxx/libc/src/__support/macros/properties/architectures.h +5 -1
- package/libcxx/libc/src/__support/macros/properties/compiler.h +8 -3
- package/libcxx/libc/src/__support/macros/properties/cpu_features.h +17 -1
- package/libcxx/libc/src/__support/macros/properties/types.h +2 -3
- package/libcxx/libc/src/__support/macros/sanitizer.h +0 -10
- package/libcxx/libc/src/__support/math_extras.h +20 -4
- package/libcxx/libc/src/__support/str_to_float.h +98 -125
- package/libcxx/libc/src/__support/str_to_integer.h +39 -27
- package/libcxx/libc/src/__support/wctype_utils.h +588 -0
- package/libcxx/src/any.cpp +4 -0
- package/libcxx/src/atomic.cpp +365 -80
- package/libcxx/src/barrier.cpp +4 -3
- package/libcxx/src/charconv.cpp +6 -3
- package/libcxx/src/condition_variable_destructor.cpp +1 -1
- package/libcxx/src/error_category.cpp +3 -1
- package/libcxx/src/exception.cpp +2 -10
- package/libcxx/src/experimental/time_zone.cpp +1 -1
- package/libcxx/src/experimental/tzdb.cpp +4 -1
- package/libcxx/src/filesystem/error.h +4 -22
- package/libcxx/src/filesystem/format_string.h +9 -18
- package/libcxx/src/filesystem/int128_builtins.cpp +2 -0
- package/libcxx/src/filesystem/operations.cpp +2 -9
- package/libcxx/src/filesystem/path.cpp +3 -1
- package/libcxx/src/include/aligned_alloc.h +65 -0
- package/libcxx/src/include/config_elast.h +1 -1
- package/libcxx/src/include/from_chars_floating_point.h +11 -7
- package/libcxx/src/include/overridable_function.h +8 -10
- package/libcxx/src/iostream.cpp +56 -37
- package/libcxx/src/locale.cpp +213 -196
- package/libcxx/src/memory.cpp +12 -14
- package/libcxx/src/mutex_destructor.cpp +1 -1
- package/libcxx/src/new.cpp +5 -5
- package/libcxx/src/optional.cpp +4 -0
- package/libcxx/src/print.cpp +9 -1
- package/libcxx/src/random.cpp +0 -26
- package/libcxx/src/string.cpp +10 -25
- package/libcxx/src/support/runtime/exception_fallback.ipp +2 -0
- package/libcxx/src/support/runtime/exception_glibcxx.ipp +3 -0
- package/libcxx/src/support/runtime/exception_libcxxabi.ipp +6 -2
- package/libcxx/src/support/runtime/exception_libcxxrt.ipp +2 -0
- package/libcxx/src/support/runtime/exception_msvc.ipp +2 -0
- package/libcxx/src/support/runtime/exception_pointer_cxxabi.ipp +9 -10
- package/libcxx/src/support/runtime/exception_pointer_glibcxx.ipp +2 -0
- package/libcxx/src/support/runtime/exception_pointer_msvc.ipp +1 -0
- package/libcxx/src/support/runtime/exception_pointer_unimplemented.ipp +1 -0
- package/libcxx/src/support/win32/locale_win32.cpp +1 -1
- package/libcxx/src/system_error.cpp +2 -0
- package/libcxx/src/thread.cpp +1 -3
- package/libcxx/src/valarray.cpp +1 -2
- package/libcxx/src/vector.cpp +2 -2
- package/libcxxabi/include/__cxxabi_config.h +42 -23
- package/libcxxabi/src/cxa_exception.cpp +4 -2
- package/libcxxabi/src/cxa_exception.h +16 -14
- package/libcxxabi/src/cxa_personality.cpp +126 -9
- package/libcxxabi/src/cxa_thread_atexit.cpp +2 -1
- package/libcxxabi/src/demangle/DemangleConfig.h +4 -0
- package/libcxxabi/src/demangle/ItaniumDemangle.h +9 -6
- package/libcxxabi/src/demangle/Utility.h +21 -7
- package/libcxxabi/src/fallback_malloc.cpp +1 -1
- package/libcxxabi/src/private_typeinfo.cpp +6 -0
- package/libcxxabi/src/stdlib_new_delete.cpp +5 -5
- package/libtsan/LICENSE.TXT +311 -0
- package/libtsan/builtins/assembly.h +41 -8
- package/libtsan/interception/interception_win.cpp +4 -0
- package/libtsan/sanitizer_common/sanitizer_allocator_primary32.h +1 -0
- package/libtsan/sanitizer_common/sanitizer_allocator_primary64.h +18 -0
- package/libtsan/sanitizer_common/sanitizer_common.h +15 -2
- package/libtsan/sanitizer_common/sanitizer_common_interceptors.inc +30 -4
- package/libtsan/sanitizer_common/sanitizer_common_interceptors_ioctl.inc +4 -0
- package/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_aarch64.inc.S +2 -1
- package/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_i386.inc.S +2 -0
- package/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_x86_64.inc.S +2 -0
- package/libtsan/sanitizer_common/sanitizer_common_syscalls.inc +18 -0
- package/libtsan/sanitizer_common/sanitizer_file.cpp +40 -12
- package/libtsan/sanitizer_common/sanitizer_file.h +3 -0
- package/libtsan/sanitizer_common/sanitizer_flags.inc +7 -0
- package/libtsan/sanitizer_common/sanitizer_fuchsia.cpp +30 -3
- package/libtsan/sanitizer_common/sanitizer_haiku.cpp +2 -2
- package/libtsan/sanitizer_common/sanitizer_internal_defs.h +1 -1
- package/libtsan/sanitizer_common/sanitizer_libc.cpp +8 -0
- package/libtsan/sanitizer_common/sanitizer_libc.h +1 -0
- package/libtsan/sanitizer_common/sanitizer_linux.cpp +15 -7
- package/libtsan/sanitizer_common/sanitizer_linux.h +3 -3
- package/libtsan/sanitizer_common/sanitizer_linux_libcdep.cpp +1 -0
- package/libtsan/sanitizer_common/sanitizer_mac.cpp +255 -104
- package/libtsan/sanitizer_common/sanitizer_mac.h +5 -0
- package/libtsan/sanitizer_common/sanitizer_netbsd.cpp +2 -2
- package/libtsan/sanitizer_common/sanitizer_platform.h +27 -1
- package/libtsan/sanitizer_common/sanitizer_platform_interceptors.h +5 -4
- package/libtsan/sanitizer_common/sanitizer_platform_limits_posix.cpp +15 -17
- package/libtsan/sanitizer_common/sanitizer_platform_limits_posix.h +32 -6
- package/libtsan/sanitizer_common/sanitizer_posix.cpp +3 -12
- package/libtsan/sanitizer_common/sanitizer_posix.h +2 -1
- package/libtsan/sanitizer_common/sanitizer_posix_libcdep.cpp +19 -0
- package/libtsan/sanitizer_common/sanitizer_procmaps_mac.cpp +102 -37
- package/libtsan/sanitizer_common/sanitizer_redefine_builtins.h +1 -1
- package/libtsan/sanitizer_common/sanitizer_signal_interceptors.inc +40 -2
- package/libtsan/sanitizer_common/sanitizer_stoptheworld.h +1 -1
- package/libtsan/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp +83 -12
- package/libtsan/sanitizer_common/sanitizer_stoptheworld_mac.cpp +3 -3
- package/libtsan/sanitizer_common/sanitizer_stoptheworld_netbsd_libcdep.cpp +7 -7
- package/libtsan/sanitizer_common/sanitizer_stoptheworld_win.cpp +2 -2
- package/libtsan/sanitizer_common/sanitizer_symbolizer_internal.h +5 -1
- package/libtsan/sanitizer_common/sanitizer_symbolizer_libcdep.cpp +11 -1
- package/libtsan/sanitizer_common/sanitizer_symbolizer_mac.cpp +86 -29
- package/libtsan/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp +27 -16
- package/libtsan/sanitizer_common/sanitizer_thread_registry.cpp +5 -4
- package/libtsan/sanitizer_common/sanitizer_thread_registry.h +4 -4
- package/libtsan/sanitizer_common/sanitizer_win.cpp +1 -3
- package/libtsan/tsan_debugging.cpp +2 -2
- package/libtsan/tsan_flags.cpp +37 -0
- package/libtsan/tsan_flags.h +8 -0
- package/libtsan/tsan_flags.inc +12 -0
- package/libtsan/tsan_interceptors.h +9 -1
- package/libtsan/tsan_interceptors_mac.cpp +19 -0
- package/libtsan/tsan_interceptors_posix.cpp +78 -32
- package/libtsan/tsan_interface.h +3 -3
- package/libtsan/tsan_interface_ann.cpp +23 -9
- package/libtsan/tsan_mman.cpp +18 -4
- package/libtsan/tsan_platform.h +44 -7
- package/libtsan/tsan_platform_linux.cpp +42 -14
- package/libtsan/tsan_platform_mac.cpp +16 -3
- package/libtsan/tsan_report.h +14 -1
- package/libtsan/tsan_rtl.cpp +14 -0
- package/libtsan/tsan_rtl.h +7 -2
- package/libtsan/tsan_rtl_aarch64.S +3 -5
- package/libtsan/tsan_rtl_access.cpp +8 -3
- package/libtsan/tsan_rtl_amd64.S +2 -0
- package/libtsan/tsan_rtl_mutex.cpp +94 -49
- package/libtsan/tsan_rtl_report.cpp +132 -65
- package/libtsan/tsan_rtl_thread.cpp +31 -9
- package/libtsan/tsan_symbolize.cpp +1 -1
- package/libtsan/tsan_symbolize.h +1 -1
- package/libtsan/tsan_trace.h +1 -1
- package/libunwind/include/__libunwind_config.h +11 -2
- package/libunwind/include/libunwind.h +117 -11
- package/libunwind/include/unwind_arm_ehabi.h +4 -1
- package/libunwind/src/AddressSpace.hpp +42 -20
- package/libunwind/src/CompactUnwinder.hpp +16 -5
- package/libunwind/src/DwarfInstructions.hpp +24 -13
- package/libunwind/src/DwarfParser.hpp +62 -23
- package/libunwind/src/EHHeaderParser.hpp +7 -4
- package/libunwind/src/Registers.hpp +226 -22
- package/libunwind/src/Unwind-seh.cpp +6 -7
- package/libunwind/src/Unwind-wasm.c +7 -7
- package/libunwind/src/UnwindCursor.hpp +167 -49
- package/libunwind/src/UnwindLevel1.c +46 -17
- package/libunwind/src/UnwindRegistersRestore.S +46 -5
- package/libunwind/src/UnwindRegistersSave.S +86 -2
- package/libunwind/src/assembly.h +5 -1
- package/libunwind/src/config.h +9 -0
- package/libunwind/src/gcc_personality_v0.c +79 -6
- package/libunwind/src/libunwind.cpp +104 -4
- package/libunwind/src/libunwind_ext.h +7 -1
- package/libunwind/src/shadow_stack_unwind.h +2 -2
- package/lldb/pretty_printers.py +948 -0
- package/package.json +1 -1
- package/std/Build/Cache/Path.zig +9 -2
- package/std/Build/Cache.zig +16 -7
- package/std/Build/Configuration.zig +3436 -0
- package/std/Build/Module.zig +99 -225
- package/std/Build/Step/CheckFile.zig +17 -63
- package/std/Build/Step/Compile.zig +97 -1420
- package/std/Build/Step/ConfigHeader.zig +55 -944
- package/std/Build/Step/Fail.zig +10 -20
- package/std/Build/Step/FindProgram.zig +31 -0
- package/std/Build/Step/Fmt.zig +22 -57
- package/std/Build/Step/InstallArtifact.zig +26 -141
- package/std/Build/Step/InstallDir.zig +14 -67
- package/std/Build/Step/InstallFile.zig +12 -21
- package/std/Build/Step/ObjCopy.zig +82 -199
- package/std/Build/Step/Options.zig +26 -261
- package/std/Build/Step/Run.zig +139 -2214
- package/std/Build/Step/TranslateC.zig +55 -164
- package/std/Build/Step/UpdateSourceFiles.zig +38 -91
- package/std/Build/Step/WriteFile.zig +113 -328
- package/std/Build/Step.zig +45 -916
- package/std/Build/abi.zig +1 -1
- package/std/Build.zig +644 -718
- package/std/Io/Dir.zig +12 -7
- package/std/Io/Dispatch.zig +8 -18
- package/std/Io/File/Writer.zig +8 -6
- package/std/Io/File.zig +6 -9
- package/std/Io/Kqueue.zig +3 -3
- package/std/Io/Reader.zig +8 -14
- package/std/Io/RwLock.zig +2 -0
- package/std/Io/Semaphore.zig +112 -17
- package/std/Io/Terminal.zig +1 -1
- package/std/Io/Threaded.zig +176 -39
- package/std/Io/Uring.zig +18 -20
- package/std/Io/Writer.zig +75 -10
- package/std/Io/net/HostName.zig +11 -6
- package/std/Io/net.zig +11 -11
- package/std/Io.zig +111 -38
- package/std/Random/ChaCha.zig +2 -2
- package/std/Random/benchmark.zig +2 -2
- package/std/Random.zig +6 -6
- package/std/SemanticVersion.zig +1 -1
- package/std/Target/Query.zig +4 -5
- package/std/Target/aarch64.zig +620 -77
- package/std/Target/amdgcn.zig +421 -21
- package/std/Target/arm.zig +40 -6
- package/std/Target/bpf.zig +6 -0
- package/std/Target/hexagon.zig +41 -6
- package/std/Target/loongarch.zig +18 -0
- package/std/Target/mips.zig +6 -0
- package/std/Target/nvptx.zig +58 -35
- package/std/Target/powerpc.zig +27 -19
- package/std/Target/riscv.zig +512 -177
- package/std/Target/sparc.zig +17 -0
- package/std/Target/spirv.zig +1 -1
- package/std/Target/wasm.zig +7 -0
- package/std/Target/x86.zig +200 -31
- package/std/Target/xtensa.zig +65 -0
- package/std/Target.zig +94 -59
- package/std/Thread.zig +17 -4
- package/std/array_hash_map.zig +103 -57
- package/std/array_list.zig +20 -35
- package/std/ascii.zig +0 -9
- package/std/atomic.zig +2 -0
- package/std/base64.zig +5 -5
- package/std/bit_set.zig +85 -93
- package/std/c/haiku.zig +3 -0
- package/std/c/serenity.zig +1 -6
- package/std/c.zig +123 -32
- package/std/compress/flate/Decompress.zig +3 -4
- package/std/compress/zstd/Decompress.zig +7 -9
- package/std/crypto/25519/curve25519.zig +2 -2
- package/std/crypto/25519/edwards25519.zig +3 -3
- package/std/crypto/25519/ristretto255.zig +2 -2
- package/std/crypto/25519/scalar.zig +6 -6
- package/std/crypto/25519/x25519.zig +1 -1
- package/std/crypto/Certificate.zig +14 -2
- package/std/crypto/Sha1.zig +1 -1
- package/std/crypto/aegis.zig +45 -39
- package/std/crypto/aes_ccm.zig +22 -22
- package/std/crypto/aes_gcm.zig +10 -12
- package/std/crypto/aes_ocb.zig +9 -9
- package/std/crypto/argon2.zig +15 -15
- package/std/crypto/ascon.zig +75 -35
- package/std/crypto/bcrypt.zig +20 -10
- package/std/crypto/benchmark.zig +7 -7
- package/std/crypto/blake2.zig +100 -64
- package/std/crypto/cbc_mac.zig +1 -1
- package/std/crypto/chacha20.zig +10 -10
- package/std/crypto/cmac.zig +3 -3
- package/std/crypto/codecs/asn1/Oid.zig +12 -1
- package/std/crypto/codecs/asn1/der/Encoder.zig +1 -1
- package/std/crypto/codecs/asn1.zig +1 -1
- package/std/crypto/codecs/base64_hex_ct.zig +3 -5
- package/std/crypto/ecdsa.zig +9 -9
- package/std/crypto/ff.zig +4 -5
- package/std/crypto/ghash_polyval.zig +4 -4
- package/std/crypto/hkdf.zig +1 -1
- package/std/crypto/isap.zig +3 -3
- package/std/crypto/kangarootwelve.zig +1 -1
- package/std/crypto/keccak_p.zig +8 -8
- package/std/crypto/md5.zig +1 -1
- package/std/crypto/ml_dsa.zig +39 -39
- package/std/crypto/ml_kem.zig +12 -34
- package/std/crypto/modes.zig +2 -2
- package/std/crypto/pbkdf2.zig +1 -1
- package/std/crypto/pcurves/common.zig +4 -5
- package/std/crypto/pcurves/p256/scalar.zig +3 -3
- package/std/crypto/pcurves/p384/scalar.zig +2 -2
- package/std/crypto/pcurves/secp256k1/scalar.zig +3 -3
- package/std/crypto/pcurves/tests/p256.zig +5 -5
- package/std/crypto/pcurves/tests/p384.zig +5 -5
- package/std/crypto/pcurves/tests/secp256k1.zig +3 -3
- package/std/crypto/salsa20.zig +8 -14
- package/std/crypto/sha2.zig +2 -2
- package/std/crypto/sha3.zig +2 -4
- package/std/crypto/siphash.zig +1 -1
- package/std/crypto/timing_safe.zig +10 -9
- package/std/crypto/tls/Client.zig +89 -13
- package/std/crypto/tls.zig +1 -1
- package/std/crypto.zig +4 -3
- package/std/debug/Dwarf.zig +21 -12
- package/std/debug/Pdb.zig +25 -17
- package/std/debug/SelfInfo/Elf.zig +1 -0
- package/std/debug/cpu_context.zig +168 -24
- package/std/debug.zig +17 -9
- package/std/deque.zig +1 -1
- package/std/elf.zig +22 -5
- package/std/enums.zig +8 -20
- package/std/fmt/float.zig +2 -0
- package/std/fmt/parse_float/decimal.zig +1 -1
- package/std/fmt/parse_float.zig +1 -1
- package/std/fmt.zig +7 -8
- package/std/fs/path.zig +7 -5
- package/std/hash/Adler32.zig +3 -3
- package/std/hash/benchmark.zig +2 -2
- package/std/hash/wyhash.zig +2 -2
- package/std/hash/xxhash.zig +0 -6
- package/std/hash_map.zig +22 -2
- package/std/heap/ArenaAllocator.zig +3 -5
- package/std/heap/BufferFirstAllocator.zig +165 -0
- package/std/heap/SafeAllocator.zig +2180 -0
- package/std/heap/debug_allocator.zig +2 -2
- package/std/heap/memory_pool.zig +34 -197
- package/std/heap.zig +20 -133
- package/std/http.zig +4 -5
- package/std/json/Scanner.zig +2 -2
- package/std/json/static.zig +2 -2
- package/std/json.zig +1 -1
- package/std/{builtin → lang}/assembly.zig +71 -0
- package/std/{builtin.zig → lang.zig} +5 -3
- package/std/leb128.zig +2 -2
- package/std/math/acos.zig +6 -0
- package/std/math/asin.zig +6 -0
- package/std/math/atan.zig +5 -0
- package/std/math/big/int.zig +5 -5
- package/std/math/big.zig +4 -4
- package/std/math/copysign.zig +1 -1
- package/std/math/float.zig +62 -0
- package/std/math/frexp.zig +4 -4
- package/std/math/hypot.zig +4 -0
- package/std/math/ilogb.zig +1 -1
- package/std/math/isfinite.zig +1 -1
- package/std/math/isinf.zig +1 -1
- package/std/math/isnan.zig +1 -2
- package/std/math/isnormal.zig +2 -2
- package/std/math/iszero.zig +2 -2
- package/std/math/ldexp.zig +2 -2
- package/std/math/log10.zig +0 -2
- package/std/math/modf.zig +1 -2
- package/std/math/nextafter.zig +3 -4
- package/std/math/pow.zig +1 -1
- package/std/math/powi.zig +2 -3
- package/std/math/signbit.zig +0 -1
- package/std/math.zig +21 -26
- package/std/mem/Allocator.zig +5 -9
- package/std/mem.zig +52 -75
- package/std/meta/trailer_flags.zig +1 -1
- package/std/meta.zig +4 -36
- package/std/multi_array_list.zig +24 -0
- package/std/os/emscripten.zig +7 -6
- package/std/os/linux/IoUring.zig +2 -0
- package/std/os/linux/alpha.zig +358 -0
- package/std/os/linux/arm.zig +0 -26
- package/std/os/linux/bpf.zig +6 -0
- package/std/os/linux/ioctl.zig +3 -2
- package/std/os/linux/syscalls.zig +528 -1
- package/std/os/linux/tls.zig +12 -1
- package/std/os/linux/x86.zig +2 -2
- package/std/os/linux/xtensa.zig +171 -0
- package/std/os/linux.zig +794 -52
- package/std/os/plan9.zig +1 -1
- package/std/os/uefi/hii.zig +1 -1
- package/std/os/uefi/tables/boot_services.zig +9 -8
- package/std/os/uefi/tables/runtime_services.zig +1 -1
- package/std/os/windows.zig +130 -1
- package/std/os.zig +36 -0
- package/std/pie.zig +21 -0
- package/std/posix.zig +2 -2
- package/std/process/Child.zig +20 -0
- package/std/process/Environ.zig +28 -4
- package/std/process.zig +13 -5
- package/std/simd.zig +4 -21
- package/std/start.zig +45 -12
- package/std/std.zig +8 -1
- package/std/tar/Writer.zig +39 -33
- package/std/tar.zig +8 -4
- package/std/testing.zig +68 -15
- package/std/unicode.zig +13 -8
- package/std/zig/Ast/Render.zig +6 -30
- package/std/zig/Ast.zig +12 -37
- package/std/zig/AstGen.zig +174 -258
- package/std/zig/AstRlAnnotate.zig +1 -11
- package/std/zig/AstSmith.zig +5 -11
- package/std/zig/ErrorBundle.zig +6 -2
- package/std/zig/LibCDirs.zig +14 -7
- package/std/zig/LibCInstallation.zig +50 -14
- package/std/zig/Parse.zig +11 -76
- package/std/zig/PkgConfig.zig +146 -0
- package/std/zig/TokenSmith.zig +0 -6
- package/std/zig/WindowsSdk.zig +18 -18
- package/std/zig/Zir.zig +15 -69
- package/std/zig/ZonGen.zig +19 -27
- package/std/zig/llvm/Builder.zig +39 -33
- package/std/zig/llvm/bitcode_writer.zig +3 -3
- package/std/zig/llvm/ir.zig +8 -8
- package/std/zig/system/arm.zig +56 -2
- package/std/zig/system/linux.zig +4 -0
- package/std/zig/system/loongarch.zig +25 -9
- package/std/zig/system/windows.zig +34 -1
- package/std/zig/system/x86.zig +60 -16
- package/std/zig/system.zig +18 -25
- package/std/zig/target.zig +1 -4
- package/std/zig/tokenizer.zig +4 -43
- package/std/zig.zig +98 -22
- package/std/zip.zig +5 -5
- package/std/zon/Serializer.zig +6 -2
- package/std/zon/parse.zig +1 -1
- package/zig.h +24 -2
- package/compiler/build_runner.zig +0 -1857
- package/compiler_rt/long_double.zig +0 -37
- package/include/amxbf16transposeintrin.h +0 -94
- package/include/amxcomplextransposeintrin.h +0 -303
- package/include/amxfp16transposeintrin.h +0 -94
- package/include/amxmovrstransposeintrin.h +0 -200
- package/include/amxtf32transposeintrin.h +0 -105
- package/include/amxtransposeintrin.h +0 -248
- package/libc/include/hexagon-linux-any/asm/signal.h +0 -29
- package/libc/include/mips64el-openbsd-none/loongson/hibernate.h +0 -33
- package/libc/include/mips64el-openbsd-none/loongson/hibernate_var.h +0 -39
- package/libc/include/mips64el-openbsd-none/machine/hibernate.h +0 -33
- package/libc/include/mips64el-openbsd-none/machine/hibernate_var.h +0 -39
- package/libc/include/s390x-linux-any/asm/tape390.h +0 -103
- package/libc/mingw/math/lrintl.c +0 -18
- package/libc/mingw/math/rintl.c +0 -16
- package/libc/mingw/winpthreads/spinlock.c +0 -82
- package/libc/musl/src/linux/tee.c +0 -8
- package/libc/musl/src/math/i386/lrintl.c +0 -8
- package/libc/musl/src/math/i386/rintl.c +0 -7
- package/libc/musl/src/math/lrintl.c +0 -36
- package/libc/musl/src/math/rintl.c +0 -29
- package/libc/musl/src/math/s390x/rintl.c +0 -15
- package/libc/musl/src/math/x32/lrintl.s +0 -7
- package/libc/musl/src/math/x32/rintl.s +0 -6
- package/libc/musl/src/math/x86_64/lrintl.c +0 -8
- package/libc/musl/src/math/x86_64/rintl.c +0 -7
- package/libc/musl/src/string/strdup.c +0 -10
- package/libc/musl/src/string/strndup.c +0 -12
- package/libc/musl/src/string/wcsdup.c +0 -10
- package/libc/musl/src/thread/pthread_spin_destroy.c +0 -6
- package/libc/musl/src/thread/pthread_spin_init.c +0 -6
- package/libc/musl/src/thread/pthread_spin_lock.c +0 -8
- package/libc/musl/src/thread/pthread_spin_trylock.c +0 -7
- package/libc/musl/src/thread/pthread_spin_unlock.c +0 -7
- package/libc/musl/src/unistd/dup2.c +0 -20
- package/libc/musl/src/unistd/dup3.c +0 -26
- package/libc/wasi/thread-stub/pthread_spin_lock.c +0 -8
- package/libc/wasi/thread-stub/pthread_spin_trylock.c +0 -8
- package/libc/wasi/thread-stub/pthread_spin_unlock.c +0 -7
- package/libtsan/sanitizer_common/sanitizer_coverage_interface.inc +0 -43
- package/std/Build/Step/CheckObject.zig +0 -2764
|
@@ -0,0 +1,2372 @@
|
|
|
1
|
+
const Run = @This();
|
|
2
|
+
|
|
3
|
+
const builtin = @import("builtin");
|
|
4
|
+
|
|
5
|
+
const std = @import("std");
|
|
6
|
+
const Cache = std.Build.Cache;
|
|
7
|
+
const Configuration = std.Build.Configuration;
|
|
8
|
+
const Dir = std.Io.Dir;
|
|
9
|
+
const EnvMap = std.process.Environ.Map;
|
|
10
|
+
const Io = std.Io;
|
|
11
|
+
const Path = std.Build.Cache.Path;
|
|
12
|
+
const assert = std.debug.assert;
|
|
13
|
+
const mem = std.mem;
|
|
14
|
+
const process = std.process;
|
|
15
|
+
const allocPrint = std.fmt.allocPrint;
|
|
16
|
+
const Allocator = std.mem.Allocator;
|
|
17
|
+
|
|
18
|
+
const Step = @import("../Step.zig");
|
|
19
|
+
const Maker = @import("../../Maker.zig");
|
|
20
|
+
const Fuzz = @import("../../Maker/Fuzz.zig");
|
|
21
|
+
|
|
22
|
+
/// If this is a Zig unit test binary, this tracks the names of the unit
|
|
23
|
+
/// tests that are also fuzz tests. Indexes cannot be used as they may
|
|
24
|
+
/// change between reruns.
|
|
25
|
+
fuzz_tests: std.ArrayList([]const u8) = .empty,
|
|
26
|
+
cached_test_metadata: ?CachedTestMetadata = null,
|
|
27
|
+
|
|
28
|
+
/// Populated during the fuzz phase if this run step corresponds to a unit test
|
|
29
|
+
/// executable that contains fuzz tests.
|
|
30
|
+
rebuilt_executable: ?Path = null,
|
|
31
|
+
|
|
32
|
+
pub fn make(
|
|
33
|
+
run: *Run,
|
|
34
|
+
run_index: Configuration.Step.Index,
|
|
35
|
+
maker: *Maker,
|
|
36
|
+
progress_node: std.Progress.Node,
|
|
37
|
+
) Step.ExtendedMakeError!void {
|
|
38
|
+
const graph = maker.graph;
|
|
39
|
+
const gpa = maker.gpa;
|
|
40
|
+
const step = maker.stepByIndex(run_index);
|
|
41
|
+
const io = graph.io;
|
|
42
|
+
const conf = &maker.scanned_config.configuration;
|
|
43
|
+
const conf_step = run_index.ptr(conf);
|
|
44
|
+
const conf_run = conf_step.extended.get(conf.extra).run;
|
|
45
|
+
const cache_root = graph.local_cache_root;
|
|
46
|
+
|
|
47
|
+
var arena_allocator: std.heap.ArenaAllocator = .init(gpa);
|
|
48
|
+
defer arena_allocator.deinit();
|
|
49
|
+
const arena = arena_allocator.allocator();
|
|
50
|
+
|
|
51
|
+
var argv_list: std.ArrayList([]const u8) = .empty;
|
|
52
|
+
defer argv_list.deinit(gpa);
|
|
53
|
+
|
|
54
|
+
var output_placeholders: std.ArrayList(IndexedOutput) = .empty;
|
|
55
|
+
defer output_placeholders.deinit(gpa);
|
|
56
|
+
|
|
57
|
+
var man = graph.cache.obtain();
|
|
58
|
+
defer man.deinit();
|
|
59
|
+
|
|
60
|
+
if (conf_run.environ_map.value) |environ_map_index| {
|
|
61
|
+
const environ_map = environ_map_index.get(conf);
|
|
62
|
+
for (environ_map.keys.slice(conf), environ_map.values.slice(conf)) |key, value| {
|
|
63
|
+
man.hash.addBytesZ(key.slice(conf));
|
|
64
|
+
man.hash.addBytesZ(value.slice(conf));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
man.hash.add(graph.fuzzing);
|
|
69
|
+
man.hash.add(conf_run.flags.color);
|
|
70
|
+
man.hash.add(conf_run.flags.disable_zig_progress);
|
|
71
|
+
|
|
72
|
+
var any_dep_files = false;
|
|
73
|
+
var any_output_args = false;
|
|
74
|
+
var any_cli_positionals = false;
|
|
75
|
+
|
|
76
|
+
for (conf_run.args.slice) |arg_index| {
|
|
77
|
+
const arg = arg_index.get(conf);
|
|
78
|
+
try argv_list.ensureUnusedCapacity(gpa, 1);
|
|
79
|
+
switch (arg.flags.tag) {
|
|
80
|
+
.string => {
|
|
81
|
+
const prefix = arg.prefix.value.?.slice(conf);
|
|
82
|
+
argv_list.appendAssumeCapacity(prefix);
|
|
83
|
+
man.hash.addBytesZ(prefix);
|
|
84
|
+
},
|
|
85
|
+
.path_file => {
|
|
86
|
+
const prefix = if (arg.prefix.value) |p| p.slice(conf) else "";
|
|
87
|
+
const suffix = if (arg.suffix.value) |p| p.slice(conf) else "";
|
|
88
|
+
const file_path = try maker.resolveLazyPathIndex(arena, arg.path.value.?, run_index);
|
|
89
|
+
argv_list.appendAssumeCapacity(try mem.concat(arena, u8, &.{
|
|
90
|
+
prefix, try convertPathArg(arena, run_index, maker, file_path), suffix,
|
|
91
|
+
}));
|
|
92
|
+
man.hash.addBytesZ(prefix);
|
|
93
|
+
man.hash.addBytesZ(suffix);
|
|
94
|
+
_ = try man.addFilePath(file_path, null);
|
|
95
|
+
},
|
|
96
|
+
.path_directory => {
|
|
97
|
+
const prefix = if (arg.prefix.value) |p| p.slice(conf) else "";
|
|
98
|
+
const suffix = if (arg.suffix.value) |p| p.slice(conf) else "";
|
|
99
|
+
const file_path = try maker.resolveLazyPathIndex(arena, arg.path.value.?, run_index);
|
|
100
|
+
const resolved_arg = try mem.concat(arena, u8, &.{
|
|
101
|
+
prefix, try convertPathArg(arena, run_index, maker, file_path), suffix,
|
|
102
|
+
});
|
|
103
|
+
argv_list.appendAssumeCapacity(resolved_arg);
|
|
104
|
+
man.hash.addBytes(resolved_arg);
|
|
105
|
+
},
|
|
106
|
+
.file_content => {
|
|
107
|
+
const prefix = if (arg.prefix.value) |p| p.slice(conf) else "";
|
|
108
|
+
const suffix = if (arg.suffix.value) |p| p.slice(conf) else "";
|
|
109
|
+
const file_path = try maker.resolveLazyPathIndex(arena, arg.path.value.?, run_index);
|
|
110
|
+
|
|
111
|
+
var result: std.Io.Writer.Allocating = .init(arena);
|
|
112
|
+
result.writer.writeAll(prefix) catch return error.OutOfMemory;
|
|
113
|
+
|
|
114
|
+
const file = file_path.root_dir.handle.openFile(io, file_path.sub_path, .{}) catch |err|
|
|
115
|
+
return step.fail(maker, "unable to open input file {f}: {t}", .{ file_path, err });
|
|
116
|
+
defer file.close(io);
|
|
117
|
+
|
|
118
|
+
var file_reader = file.reader(io, &.{});
|
|
119
|
+
_ = file_reader.interface.streamRemaining(&result.writer) catch |err| switch (err) {
|
|
120
|
+
error.ReadFailed => switch (file_reader.err.?) {
|
|
121
|
+
error.Canceled => |e| return e,
|
|
122
|
+
else => |e| return step.fail(maker, "failed to read from {f}: {t}", .{ file_path, e }),
|
|
123
|
+
},
|
|
124
|
+
error.WriteFailed => return error.OutOfMemory,
|
|
125
|
+
};
|
|
126
|
+
result.writer.writeAll(suffix) catch return error.OutOfMemory;
|
|
127
|
+
|
|
128
|
+
argv_list.appendAssumeCapacity(result.written());
|
|
129
|
+
man.hash.addBytesZ(prefix);
|
|
130
|
+
man.hash.addBytesZ(suffix);
|
|
131
|
+
_ = try man.addFilePath(file_path, null);
|
|
132
|
+
},
|
|
133
|
+
.artifact => {
|
|
134
|
+
const prefix = if (arg.prefix.value) |p| p.slice(conf) else "";
|
|
135
|
+
const suffix = if (arg.suffix.value) |p| p.slice(conf) else "";
|
|
136
|
+
const producer_index = arg.producer.value.?;
|
|
137
|
+
const producer_step = producer_index.ptr(conf);
|
|
138
|
+
const producer = producer_step.extended.get(conf.extra).compile;
|
|
139
|
+
const producer_make_comp_step = maker.stepByIndex(producer_index);
|
|
140
|
+
const producer_make_comp = &producer_make_comp_step.extended.compile;
|
|
141
|
+
|
|
142
|
+
const file_path = producer_make_comp.installed_path orelse maker.generatedPath(producer.generated_bin.value.?).*;
|
|
143
|
+
|
|
144
|
+
argv_list.appendAssumeCapacity(try mem.concat(arena, u8, &.{
|
|
145
|
+
prefix, try convertPathArg(arena, run_index, maker, file_path), suffix,
|
|
146
|
+
}));
|
|
147
|
+
|
|
148
|
+
_ = try man.addFilePath(file_path, null);
|
|
149
|
+
},
|
|
150
|
+
.output_file, .output_directory => {
|
|
151
|
+
const prefix = if (arg.prefix.value) |p| p.slice(conf) else "";
|
|
152
|
+
const suffix = if (arg.suffix.value) |p| p.slice(conf) else "";
|
|
153
|
+
const basename = arg.basename.value.?.slice(conf);
|
|
154
|
+
|
|
155
|
+
man.hash.addBytesZ(prefix);
|
|
156
|
+
man.hash.addBytesZ(basename);
|
|
157
|
+
man.hash.addBytesZ(suffix);
|
|
158
|
+
man.hash.add(arg.flags.dep_file);
|
|
159
|
+
|
|
160
|
+
any_dep_files = any_dep_files or arg.flags.dep_file;
|
|
161
|
+
any_output_args = true;
|
|
162
|
+
|
|
163
|
+
// Add a placeholder into the argument list because we need the
|
|
164
|
+
// manifest hash to be updated with all arguments before the
|
|
165
|
+
// object directory is computed.
|
|
166
|
+
try output_placeholders.append(gpa, .{
|
|
167
|
+
.index = @intCast(argv_list.items.len),
|
|
168
|
+
.arg_index = arg_index,
|
|
169
|
+
});
|
|
170
|
+
argv_list.items.len += 1;
|
|
171
|
+
},
|
|
172
|
+
.passthru => {
|
|
173
|
+
any_cli_positionals = true;
|
|
174
|
+
if (maker.run_args) |run_args| {
|
|
175
|
+
try argv_list.appendSlice(gpa, run_args);
|
|
176
|
+
man.hash.addListOfBytes(run_args);
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
man.hash.add(conf_run.flags.test_runner_mode);
|
|
183
|
+
if (conf_run.flags.test_runner_mode) {
|
|
184
|
+
const cache_dir_string = try convertPathArg(arena, run_index, maker, .{ .root_dir = cache_root });
|
|
185
|
+
|
|
186
|
+
try argv_list.ensureUnusedCapacity(gpa, 3);
|
|
187
|
+
argv_list.appendAssumeCapacity(try allocPrint(arena, "--cache-dir={s}", .{cache_dir_string}));
|
|
188
|
+
argv_list.appendAssumeCapacity(try allocPrint(arena, "--seed=0x{x}", .{graph.random_seed}));
|
|
189
|
+
argv_list.appendAssumeCapacity("--listen=-");
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
switch (conf_run.stdin.u) {
|
|
193
|
+
.bytes => |bytes| {
|
|
194
|
+
man.hash.addBytes(bytes.slice(conf));
|
|
195
|
+
},
|
|
196
|
+
.lazy_path => |lazy_path| {
|
|
197
|
+
const file_path = try maker.resolveLazyPathIndex(arena, lazy_path, run_index);
|
|
198
|
+
_ = try man.addFilePath(file_path, null);
|
|
199
|
+
},
|
|
200
|
+
.none => {},
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (conf_run.captured_stdout.value) |captured| {
|
|
204
|
+
man.hash.addBytes(captured.basename.slice(conf));
|
|
205
|
+
man.hash.add(conf_run.flags.stdout_trim_whitespace);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (conf_run.captured_stderr.value) |captured| {
|
|
209
|
+
man.hash.addBytes(captured.basename.slice(conf));
|
|
210
|
+
man.hash.add(conf_run.flags.stderr_trim_whitespace);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
switch (conf_run.flags.stdio) {
|
|
214
|
+
.infer_from_args, .inherit, .zig_test => {},
|
|
215
|
+
.check => {
|
|
216
|
+
man.hash.addBytes(if (conf_run.expect_stderr_exact.value) |bytes| bytes.slice(conf) else "");
|
|
217
|
+
man.hash.addBytes(if (conf_run.expect_stdout_exact.value) |bytes| bytes.slice(conf) else "");
|
|
218
|
+
for (conf_run.expect_stderr_match.slice) |bytes| man.hash.addBytes(bytes.slice(conf));
|
|
219
|
+
for (conf_run.expect_stdout_match.slice) |bytes| man.hash.addBytes(bytes.slice(conf));
|
|
220
|
+
man.hash.add(conf_run.flags2.expect_term_status);
|
|
221
|
+
man.hash.addOptional(conf_run.expect_term_value.value);
|
|
222
|
+
},
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
for (conf_run.file_inputs.slice) |lazy_path| {
|
|
226
|
+
const file_path = try maker.resolveLazyPathIndex(arena, lazy_path, run_index);
|
|
227
|
+
_ = try man.addFilePath(file_path, null);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (conf_run.cwd.value) |lazy_path| {
|
|
231
|
+
const cwd_path = try maker.resolveLazyPathIndex(arena, lazy_path, run_index);
|
|
232
|
+
_ = man.hash.addBytes(try cwd_path.toString(arena));
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Whether the Run step has side effects *other than* updating the output arguments.
|
|
236
|
+
// When fuzzing we need to always run the test runner to populate fuzz_tests.
|
|
237
|
+
const has_side_effects = graph.fuzzing or conf_run.flags.has_side_effects or any_cli_positionals or
|
|
238
|
+
switch (conf_run.flags.stdio) {
|
|
239
|
+
.infer_from_args => !any_output_args and
|
|
240
|
+
conf_run.captured_stdout.value == null and
|
|
241
|
+
conf_run.captured_stderr.value == null,
|
|
242
|
+
.inherit => true,
|
|
243
|
+
.check, .zig_test => false,
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
if (!has_side_effects and try step.cacheHitAndWatch(maker, &man)) {
|
|
247
|
+
// Cache hit; skip running command.
|
|
248
|
+
const digest = man.final();
|
|
249
|
+
try populateGeneratedStdIo(maker, &conf_run, cache_root, &digest);
|
|
250
|
+
try populateGeneratedPaths(maker, output_placeholders.items, cache_root, &digest);
|
|
251
|
+
step.result_cached = true;
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if (!any_dep_files) {
|
|
256
|
+
// We already know the final output paths; use them directly.
|
|
257
|
+
const digest = if (has_side_effects) man.hash.final() else man.final();
|
|
258
|
+
const output_dir_path = "o" ++ Dir.path.sep_str ++ &digest;
|
|
259
|
+
try populateGeneratedStdIo(maker, &conf_run, cache_root, &digest);
|
|
260
|
+
try populateGeneratedPathsCreateDirs(arena, run_index, maker, output_dir_path, output_placeholders.items, argv_list.items);
|
|
261
|
+
try runCommand(arena, run, run_index, maker, progress_node, argv_list.items, has_side_effects, output_dir_path, null);
|
|
262
|
+
if (!has_side_effects) try step.writeManifestAndWatch(maker, &man);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// We do not know the final output paths yet; use temporary directory to run the command.
|
|
267
|
+
var rand_int: u64 = undefined;
|
|
268
|
+
io.random(@ptrCast(&rand_int));
|
|
269
|
+
const tmp_dir_path = "tmp" ++ Dir.path.sep_str ++ std.fmt.hex(rand_int);
|
|
270
|
+
|
|
271
|
+
try populateGeneratedPathsCreateDirs(arena, run_index, maker, tmp_dir_path, output_placeholders.items, argv_list.items);
|
|
272
|
+
try runCommand(arena, run, run_index, maker, progress_node, argv_list.items, has_side_effects, tmp_dir_path, null);
|
|
273
|
+
|
|
274
|
+
for (output_placeholders.items) |placeholder| {
|
|
275
|
+
const arg = placeholder.arg_index.get(conf);
|
|
276
|
+
switch (arg.flags.tag) {
|
|
277
|
+
.output_file => if (arg.flags.dep_file) {
|
|
278
|
+
const generated_path = maker.generatedPath(arg.generated.value.?).*;
|
|
279
|
+
const result = if (has_side_effects)
|
|
280
|
+
man.addDepFile(generated_path.root_dir.handle, generated_path.sub_path)
|
|
281
|
+
else
|
|
282
|
+
man.addDepFilePost(generated_path.root_dir.handle, generated_path.sub_path);
|
|
283
|
+
result catch |err| switch (err) {
|
|
284
|
+
error.OutOfMemory, error.Canceled => |e| return e,
|
|
285
|
+
else => |e| return step.fail(maker, "failed adding to cache the file {f}: {t}", .{
|
|
286
|
+
generated_path, e,
|
|
287
|
+
}),
|
|
288
|
+
};
|
|
289
|
+
},
|
|
290
|
+
.output_directory => continue,
|
|
291
|
+
else => unreachable,
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
const digest = if (has_side_effects) man.hash.final() else man.final();
|
|
296
|
+
|
|
297
|
+
const any_output = output_placeholders.items.len > 0 or
|
|
298
|
+
conf_run.captured_stdout.value != null or conf_run.captured_stderr.value != null;
|
|
299
|
+
|
|
300
|
+
if (any_output) {
|
|
301
|
+
// Rename into place.
|
|
302
|
+
const tmp_path: Path = .{ .root_dir = cache_root, .sub_path = tmp_dir_path };
|
|
303
|
+
const dst_path: Path = .{ .root_dir = cache_root, .sub_path = "o" ++ Dir.path.sep_str ++ &digest };
|
|
304
|
+
Dir.rename(
|
|
305
|
+
tmp_path.root_dir.handle,
|
|
306
|
+
tmp_path.sub_path,
|
|
307
|
+
dst_path.root_dir.handle,
|
|
308
|
+
dst_path.sub_path,
|
|
309
|
+
io,
|
|
310
|
+
) catch |err| switch (err) {
|
|
311
|
+
error.DirNotEmpty => {
|
|
312
|
+
dst_path.root_dir.handle.deleteTree(io, dst_path.sub_path) catch |del_err|
|
|
313
|
+
return step.fail(maker, "failed to remove tree {f}: {t}", .{ dst_path, del_err });
|
|
314
|
+
|
|
315
|
+
Dir.rename(
|
|
316
|
+
tmp_path.root_dir.handle,
|
|
317
|
+
tmp_path.sub_path,
|
|
318
|
+
dst_path.root_dir.handle,
|
|
319
|
+
dst_path.sub_path,
|
|
320
|
+
io,
|
|
321
|
+
) catch |retry_err| return step.fail(maker, "failed to rename directory {f} to {f}: {t}", .{
|
|
322
|
+
tmp_path, dst_path, retry_err,
|
|
323
|
+
});
|
|
324
|
+
},
|
|
325
|
+
else => return step.fail(maker, "failed to rename directory {f} to {f}: {t}", .{
|
|
326
|
+
tmp_path, dst_path, err,
|
|
327
|
+
}),
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (!has_side_effects) try step.writeManifestAndWatch(maker, &man);
|
|
332
|
+
|
|
333
|
+
try populateGeneratedStdIo(maker, &conf_run, cache_root, &digest);
|
|
334
|
+
try populateGeneratedPaths(maker, output_placeholders.items, cache_root, &digest);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/// Reads stdout of a Zig test process until a termination condition is reached:
|
|
338
|
+
/// * A write fails, indicating the child unexpectedly closed stdin
|
|
339
|
+
/// * A test (or a response from the test runner) times out
|
|
340
|
+
/// * The wait fails, indicating the child closed stdout and stderr
|
|
341
|
+
fn waitZigTest(
|
|
342
|
+
arena: Allocator,
|
|
343
|
+
run: *Run,
|
|
344
|
+
run_index: Configuration.Step.Index,
|
|
345
|
+
maker: *Maker,
|
|
346
|
+
child: *process.Child,
|
|
347
|
+
progress_node: std.Progress.Node,
|
|
348
|
+
multi_reader: *Io.File.MultiReader,
|
|
349
|
+
opt_metadata: *?TestMetadata,
|
|
350
|
+
results: *Step.TestResults,
|
|
351
|
+
) !union(enum) {
|
|
352
|
+
write_failed: anyerror,
|
|
353
|
+
no_poll: struct {
|
|
354
|
+
active_test_index: ?u32,
|
|
355
|
+
ns_elapsed: u64,
|
|
356
|
+
},
|
|
357
|
+
timeout: struct {
|
|
358
|
+
active_test_index: ?u32,
|
|
359
|
+
ns_elapsed: u64,
|
|
360
|
+
},
|
|
361
|
+
} {
|
|
362
|
+
const graph = maker.graph;
|
|
363
|
+
const gpa = maker.gpa;
|
|
364
|
+
const io = graph.io;
|
|
365
|
+
const step = maker.stepByIndex(run_index);
|
|
366
|
+
|
|
367
|
+
var sub_prog_node: ?std.Progress.Node = null;
|
|
368
|
+
defer if (sub_prog_node) |n| n.end();
|
|
369
|
+
|
|
370
|
+
if (opt_metadata.*) |*md| {
|
|
371
|
+
// Previous unit test process died or was killed; we're continuing where it left off
|
|
372
|
+
requestNextTest(io, child.stdin.?, md, &sub_prog_node) catch |err| return .{ .write_failed = err };
|
|
373
|
+
} else {
|
|
374
|
+
// Running unit tests normally
|
|
375
|
+
run.fuzz_tests.clearRetainingCapacity();
|
|
376
|
+
sendMessage(io, child.stdin.?, .query_test_metadata) catch |err| return .{ .write_failed = err };
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
var active_test_index: ?u32 = null;
|
|
380
|
+
|
|
381
|
+
var last_update: Io.Clock.Timestamp = .now(io, .awake);
|
|
382
|
+
|
|
383
|
+
// This timeout is used when we're waiting on the test runner itself rather than a user-specified
|
|
384
|
+
// test. For instance, if the test runner leaves this much time between us requesting a test to
|
|
385
|
+
// start and it acknowledging the test starting, we terminate the child and raise an error. This
|
|
386
|
+
// *should* never happen, but could in theory be caused by some very unlucky IB in a test.
|
|
387
|
+
const response_timeout: Io.Clock.Duration = t: {
|
|
388
|
+
const ns = @max(maker.unit_test_timeout_ns orelse 0, 60 * std.time.ns_per_s);
|
|
389
|
+
break :t .{ .clock = .awake, .raw = .fromNanoseconds(ns) };
|
|
390
|
+
};
|
|
391
|
+
const test_timeout: ?Io.Clock.Duration = if (maker.unit_test_timeout_ns) |ns| .{
|
|
392
|
+
.clock = .awake,
|
|
393
|
+
.raw = .fromNanoseconds(ns),
|
|
394
|
+
} else null;
|
|
395
|
+
|
|
396
|
+
const stdout = multi_reader.reader(0);
|
|
397
|
+
const stderr = multi_reader.reader(1);
|
|
398
|
+
const Header = std.zig.Server.Message.Header;
|
|
399
|
+
|
|
400
|
+
while (true) {
|
|
401
|
+
const timeout: Io.Timeout = t: {
|
|
402
|
+
const opt_duration = if (active_test_index == null) response_timeout else test_timeout;
|
|
403
|
+
const duration = opt_duration orelse break :t .none;
|
|
404
|
+
break :t .{ .deadline = last_update.addDuration(duration) };
|
|
405
|
+
};
|
|
406
|
+
|
|
407
|
+
// This block is exited when `stdout` contains enough bytes for a `Header`.
|
|
408
|
+
header_ready: {
|
|
409
|
+
if (stdout.buffered().len >= @sizeOf(Header)) {
|
|
410
|
+
// We already have one, no need to poll!
|
|
411
|
+
break :header_ready;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
multi_reader.fill(64, timeout) catch |err| switch (err) {
|
|
415
|
+
error.Timeout => return .{ .timeout = .{
|
|
416
|
+
.active_test_index = active_test_index,
|
|
417
|
+
.ns_elapsed = @intCast(last_update.untilNow(io).raw.nanoseconds),
|
|
418
|
+
} },
|
|
419
|
+
error.EndOfStream => return .{ .no_poll = .{
|
|
420
|
+
.active_test_index = active_test_index,
|
|
421
|
+
.ns_elapsed = @intCast(last_update.untilNow(io).raw.nanoseconds),
|
|
422
|
+
} },
|
|
423
|
+
else => |e| return e,
|
|
424
|
+
};
|
|
425
|
+
|
|
426
|
+
continue;
|
|
427
|
+
}
|
|
428
|
+
// There is definitely a header available now -- read it.
|
|
429
|
+
const header = stdout.takeStruct(Header, .little) catch unreachable;
|
|
430
|
+
|
|
431
|
+
while (stdout.buffered().len < header.bytes_len) {
|
|
432
|
+
multi_reader.fill(64, timeout) catch |err| switch (err) {
|
|
433
|
+
error.Timeout => return .{ .timeout = .{
|
|
434
|
+
.active_test_index = active_test_index,
|
|
435
|
+
.ns_elapsed = @intCast(last_update.untilNow(io).raw.nanoseconds),
|
|
436
|
+
} },
|
|
437
|
+
error.EndOfStream => return .{ .no_poll = .{
|
|
438
|
+
.active_test_index = active_test_index,
|
|
439
|
+
.ns_elapsed = @intCast(last_update.untilNow(io).raw.nanoseconds),
|
|
440
|
+
} },
|
|
441
|
+
else => |e| return e,
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
const body = stdout.take(header.bytes_len) catch unreachable;
|
|
446
|
+
var body_r: std.Io.Reader = .fixed(body);
|
|
447
|
+
switch (header.tag) {
|
|
448
|
+
.zig_version => {
|
|
449
|
+
if (!std.mem.eql(u8, builtin.zig_version_string, body)) return step.fail(
|
|
450
|
+
maker,
|
|
451
|
+
"zig version mismatch build runner vs compiler: '{s}' vs '{s}'",
|
|
452
|
+
.{ builtin.zig_version_string, body },
|
|
453
|
+
);
|
|
454
|
+
},
|
|
455
|
+
.test_metadata => {
|
|
456
|
+
// `metadata` would only be populated if we'd already seen a `test_metadata`, but we
|
|
457
|
+
// only request it once (and importantly, we don't re-request it if we kill and
|
|
458
|
+
// restart the test runner).
|
|
459
|
+
assert(opt_metadata.* == null);
|
|
460
|
+
|
|
461
|
+
const tm_hdr = body_r.takeStruct(std.zig.Server.Message.TestMetadata, .little) catch unreachable;
|
|
462
|
+
results.test_count = tm_hdr.tests_len;
|
|
463
|
+
|
|
464
|
+
const names = try arena.alloc(u32, results.test_count);
|
|
465
|
+
for (names) |*dest| dest.* = body_r.takeInt(u32, .little) catch unreachable;
|
|
466
|
+
|
|
467
|
+
const expected_panic_msgs = try arena.alloc(u32, results.test_count);
|
|
468
|
+
for (expected_panic_msgs) |*dest| dest.* = body_r.takeInt(u32, .little) catch unreachable;
|
|
469
|
+
|
|
470
|
+
const string_bytes = body_r.take(tm_hdr.string_bytes_len) catch unreachable;
|
|
471
|
+
|
|
472
|
+
progress_node.setEstimatedTotalItems(names.len);
|
|
473
|
+
opt_metadata.* = .{
|
|
474
|
+
.string_bytes = try arena.dupe(u8, string_bytes),
|
|
475
|
+
.ns_per_test = try arena.alloc(u64, results.test_count),
|
|
476
|
+
.names = names,
|
|
477
|
+
.expected_panic_msgs = expected_panic_msgs,
|
|
478
|
+
.next_index = 0,
|
|
479
|
+
.prog_node = progress_node,
|
|
480
|
+
};
|
|
481
|
+
@memset(opt_metadata.*.?.ns_per_test, std.math.maxInt(u64));
|
|
482
|
+
|
|
483
|
+
active_test_index = null;
|
|
484
|
+
last_update = .now(io, .awake);
|
|
485
|
+
|
|
486
|
+
requestNextTest(io, child.stdin.?, &opt_metadata.*.?, &sub_prog_node) catch |err| return .{ .write_failed = err };
|
|
487
|
+
},
|
|
488
|
+
.test_started => {
|
|
489
|
+
active_test_index = opt_metadata.*.?.next_index - 1;
|
|
490
|
+
last_update = .now(io, .awake);
|
|
491
|
+
},
|
|
492
|
+
.test_results => {
|
|
493
|
+
const md = &opt_metadata.*.?;
|
|
494
|
+
|
|
495
|
+
const tr_hdr = body_r.takeStruct(std.zig.Server.Message.TestResults, .little) catch unreachable;
|
|
496
|
+
assert(tr_hdr.index == active_test_index);
|
|
497
|
+
|
|
498
|
+
switch (tr_hdr.flags.status) {
|
|
499
|
+
.pass => {},
|
|
500
|
+
.skip => results.skip_count +|= 1,
|
|
501
|
+
.fail => results.fail_count +|= 1,
|
|
502
|
+
}
|
|
503
|
+
const leak_count = tr_hdr.flags.leak_count;
|
|
504
|
+
const log_err_count = tr_hdr.flags.log_err_count;
|
|
505
|
+
results.leak_count +|= leak_count;
|
|
506
|
+
results.log_err_count +|= log_err_count;
|
|
507
|
+
|
|
508
|
+
if (tr_hdr.flags.fuzz) try run.fuzz_tests.append(gpa, md.testName(tr_hdr.index));
|
|
509
|
+
|
|
510
|
+
if (tr_hdr.flags.status == .fail) {
|
|
511
|
+
const name = md.testName(tr_hdr.index);
|
|
512
|
+
const stderr_bytes = std.mem.trim(u8, stderr.buffered(), "\n");
|
|
513
|
+
stderr.tossBuffered();
|
|
514
|
+
if (stderr_bytes.len == 0) {
|
|
515
|
+
try step.addError(maker, "'{s}' failed without output", .{name});
|
|
516
|
+
} else {
|
|
517
|
+
try step.addError(maker, "'{s}' failed:\n{s}", .{ name, stderr_bytes });
|
|
518
|
+
}
|
|
519
|
+
} else if (leak_count > 0) {
|
|
520
|
+
const name = md.testName(tr_hdr.index);
|
|
521
|
+
const stderr_bytes = std.mem.trim(u8, stderr.buffered(), "\n");
|
|
522
|
+
stderr.tossBuffered();
|
|
523
|
+
try step.addError(maker, "'{s}' leaked {d} allocations:\n{s}", .{ name, leak_count, stderr_bytes });
|
|
524
|
+
} else if (log_err_count > 0) {
|
|
525
|
+
const name = md.testName(tr_hdr.index);
|
|
526
|
+
const stderr_bytes = std.mem.trim(u8, stderr.buffered(), "\n");
|
|
527
|
+
stderr.tossBuffered();
|
|
528
|
+
try step.addError(maker, "'{s}' logged {d} errors:\n{s}", .{ name, log_err_count, stderr_bytes });
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
active_test_index = null;
|
|
532
|
+
|
|
533
|
+
const now: Io.Clock.Timestamp = .now(io, .awake);
|
|
534
|
+
md.ns_per_test[tr_hdr.index] = @intCast(last_update.durationTo(now).raw.nanoseconds);
|
|
535
|
+
last_update = now;
|
|
536
|
+
|
|
537
|
+
requestNextTest(io, child.stdin.?, md, &sub_prog_node) catch |err| return .{ .write_failed = err };
|
|
538
|
+
},
|
|
539
|
+
else => {}, // ignore other messages
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
const FuzzTestRunner = struct {
|
|
545
|
+
run: *Run,
|
|
546
|
+
run_index: Configuration.Step.Index,
|
|
547
|
+
ctx: FuzzContext,
|
|
548
|
+
coverage_id: ?u64,
|
|
549
|
+
|
|
550
|
+
instances: []Instance,
|
|
551
|
+
/// The indexes of this are layed out such that it is effectively an array
|
|
552
|
+
/// of `[instances.len][3]Io.Operation.Storage` of stdin, stdout, stderr.
|
|
553
|
+
batch: Io.Batch,
|
|
554
|
+
/// LIFO. Stream of message bodies trailed by PendingBroadcastFooter.
|
|
555
|
+
pending_broadcasts: std.ArrayList(u8),
|
|
556
|
+
broadcast: std.ArrayList(u8),
|
|
557
|
+
broadcast_undelivered: u32,
|
|
558
|
+
|
|
559
|
+
const Instance = struct {
|
|
560
|
+
child: process.Child,
|
|
561
|
+
message: std.ArrayListAligned(u8, .@"4"),
|
|
562
|
+
broadcast_written: usize,
|
|
563
|
+
stderr: std.ArrayList(u8),
|
|
564
|
+
stdin_vec: [1][]u8,
|
|
565
|
+
stdout_vec: [1][]u8,
|
|
566
|
+
stderr_vec: [1][]u8,
|
|
567
|
+
progress_node: std.Progress.Node,
|
|
568
|
+
|
|
569
|
+
fn messageHeader(instance: *Instance) InHeader {
|
|
570
|
+
assert(instance.message.items.len >= @sizeOf(InHeader));
|
|
571
|
+
const header_ptr: *InHeader = @ptrCast(instance.message.items);
|
|
572
|
+
var header = header_ptr.*;
|
|
573
|
+
if (std.builtin.Endian.native != .little) {
|
|
574
|
+
std.mem.byteSwapAllFields(InHeader, &header);
|
|
575
|
+
}
|
|
576
|
+
return header;
|
|
577
|
+
}
|
|
578
|
+
};
|
|
579
|
+
|
|
580
|
+
const PendingBroadcastFooter = struct {
|
|
581
|
+
from_id: u32,
|
|
582
|
+
body_len: u32,
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
const InHeader = std.zig.Server.Message.Header;
|
|
586
|
+
const OutHeader = std.zig.Client.Message.Header;
|
|
587
|
+
|
|
588
|
+
const stdin_i = 0;
|
|
589
|
+
const stdout_i = 1;
|
|
590
|
+
const stderr_i = 2;
|
|
591
|
+
|
|
592
|
+
fn init(
|
|
593
|
+
run: *Run,
|
|
594
|
+
run_index: Configuration.Step.Index,
|
|
595
|
+
ctx: FuzzContext,
|
|
596
|
+
progress_node: std.Progress.Node,
|
|
597
|
+
spawn_options: process.SpawnOptions,
|
|
598
|
+
) !FuzzTestRunner {
|
|
599
|
+
const maker = ctx.fuzz.maker;
|
|
600
|
+
const graph = maker.graph;
|
|
601
|
+
const gpa = maker.gpa;
|
|
602
|
+
const io = graph.io;
|
|
603
|
+
|
|
604
|
+
const n_instances = switch (ctx.fuzz.mode) {
|
|
605
|
+
.forever => graph.max_jobs orelse @min(
|
|
606
|
+
std.Thread.getCpuCount() catch 1,
|
|
607
|
+
(std.math.maxInt(u32) - 2) / 3,
|
|
608
|
+
),
|
|
609
|
+
.limit => 1,
|
|
610
|
+
};
|
|
611
|
+
const instances = try gpa.alloc(Instance, n_instances);
|
|
612
|
+
errdefer gpa.free(instances);
|
|
613
|
+
const batch_storage = try gpa.alloc(Io.Operation.Storage, instances.len * 3);
|
|
614
|
+
errdefer gpa.free(batch_storage);
|
|
615
|
+
|
|
616
|
+
@memset(instances, .{
|
|
617
|
+
.child = undefined,
|
|
618
|
+
.message = .empty,
|
|
619
|
+
.broadcast_written = undefined,
|
|
620
|
+
.stderr = .empty,
|
|
621
|
+
.stdin_vec = undefined,
|
|
622
|
+
.stdout_vec = undefined,
|
|
623
|
+
.stderr_vec = undefined,
|
|
624
|
+
.progress_node = undefined,
|
|
625
|
+
});
|
|
626
|
+
for (0.., instances) |id, *instance| {
|
|
627
|
+
errdefer for (instances[0..id]) |*spawned| {
|
|
628
|
+
spawned.child.kill(io);
|
|
629
|
+
spawned.progress_node.end();
|
|
630
|
+
};
|
|
631
|
+
instance.child = try process.spawn(io, spawn_options);
|
|
632
|
+
instance.progress_node = progress_node.start("starting fuzzer", 0);
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
return .{
|
|
636
|
+
.run = run,
|
|
637
|
+
.run_index = run_index,
|
|
638
|
+
.ctx = ctx,
|
|
639
|
+
.coverage_id = null,
|
|
640
|
+
|
|
641
|
+
.instances = instances,
|
|
642
|
+
.batch = .init(batch_storage),
|
|
643
|
+
.pending_broadcasts = .empty,
|
|
644
|
+
.broadcast = .empty,
|
|
645
|
+
.broadcast_undelivered = 0,
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
fn deinit(f: *FuzzTestRunner) void {
|
|
650
|
+
const maker = f.ctx.fuzz.maker;
|
|
651
|
+
const run_index = f.run_index;
|
|
652
|
+
|
|
653
|
+
const graph = maker.graph;
|
|
654
|
+
const gpa = maker.gpa;
|
|
655
|
+
const io = graph.io;
|
|
656
|
+
const step = maker.stepByIndex(run_index);
|
|
657
|
+
|
|
658
|
+
f.batch.cancel(io);
|
|
659
|
+
gpa.free(f.batch.storage);
|
|
660
|
+
var total_rss: usize = 0;
|
|
661
|
+
for (f.instances) |*instance| {
|
|
662
|
+
instance.child.kill(io);
|
|
663
|
+
instance.message.deinit(gpa);
|
|
664
|
+
instance.stderr.deinit(gpa);
|
|
665
|
+
instance.progress_node.end();
|
|
666
|
+
total_rss += instance.child.resource_usage_statistics.getMaxRss() orelse 0;
|
|
667
|
+
}
|
|
668
|
+
step.result_peak_rss = @max(step.result_peak_rss, total_rss);
|
|
669
|
+
gpa.free(f.instances);
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
fn startInstances(f: *FuzzTestRunner) !void {
|
|
673
|
+
const maker = f.ctx.fuzz.maker;
|
|
674
|
+
const run_index = f.run_index;
|
|
675
|
+
const run = f.run;
|
|
676
|
+
|
|
677
|
+
const graph = maker.graph;
|
|
678
|
+
const io = graph.io;
|
|
679
|
+
const step = maker.stepByIndex(run_index);
|
|
680
|
+
|
|
681
|
+
for (0.., f.instances) |id, *instance| {
|
|
682
|
+
const id32: u32 = @intCast(id);
|
|
683
|
+
(switch (f.ctx.fuzz.mode) {
|
|
684
|
+
.forever => sendRunFuzzTestMessage(
|
|
685
|
+
io,
|
|
686
|
+
instance.child.stdin.?,
|
|
687
|
+
run.fuzz_tests.items,
|
|
688
|
+
.forever,
|
|
689
|
+
id32,
|
|
690
|
+
),
|
|
691
|
+
.limit => |limit| sendRunFuzzTestMessage(
|
|
692
|
+
io,
|
|
693
|
+
instance.child.stdin.?,
|
|
694
|
+
run.fuzz_tests.items,
|
|
695
|
+
.iterations,
|
|
696
|
+
limit.amount,
|
|
697
|
+
),
|
|
698
|
+
}) catch |write_err| {
|
|
699
|
+
// The runner unexpectedly closed stdin, which means it crashed during initialization.
|
|
700
|
+
// Clean up everything and wait for the child to exit.
|
|
701
|
+
instance.child.stdin.?.close(io);
|
|
702
|
+
instance.child.stdin = null;
|
|
703
|
+
const term = try instance.child.wait(io);
|
|
704
|
+
return step.fail(
|
|
705
|
+
maker,
|
|
706
|
+
"unable to write stdin ({t}); test process unexpectedly {f}",
|
|
707
|
+
.{ write_err, fmtTerm(term) },
|
|
708
|
+
);
|
|
709
|
+
};
|
|
710
|
+
|
|
711
|
+
try f.addStdoutRead(id32, @sizeOf(InHeader));
|
|
712
|
+
try f.addStderrRead(id32);
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
fn listen(f: *FuzzTestRunner, arena: Allocator) !void {
|
|
717
|
+
const maker = f.ctx.fuzz.maker;
|
|
718
|
+
const graph = maker.graph;
|
|
719
|
+
const io = graph.io;
|
|
720
|
+
|
|
721
|
+
while (true) {
|
|
722
|
+
try f.batch.awaitConcurrent(io, .none);
|
|
723
|
+
while (f.batch.next()) |completion| {
|
|
724
|
+
const id = completion.index / 3;
|
|
725
|
+
const result = completion.result;
|
|
726
|
+
switch (completion.index % 3) {
|
|
727
|
+
0 => try f.completeStdinWrite(id, result.file_write_streaming catch |e| switch (e) {
|
|
728
|
+
// Avoid calling `instanceEos` until EndOfStream is seen with stderr so
|
|
729
|
+
// that all stderr is collected.
|
|
730
|
+
error.BrokenPipe => continue,
|
|
731
|
+
else => |write_e| return write_e,
|
|
732
|
+
}),
|
|
733
|
+
1 => try f.completeStdoutRead(id, result.file_read_streaming catch |e| switch (e) {
|
|
734
|
+
// Avoid calling `instanceEos` until EndOfStream is seen with stderr so
|
|
735
|
+
// that all stderr is collected.
|
|
736
|
+
error.EndOfStream => continue,
|
|
737
|
+
else => |read_e| return read_e,
|
|
738
|
+
}),
|
|
739
|
+
2 => try f.completeStderrRead(id, result.file_read_streaming catch |e| switch (e) {
|
|
740
|
+
error.EndOfStream => return f.instanceEos(arena, id),
|
|
741
|
+
else => |read_e| return read_e,
|
|
742
|
+
}),
|
|
743
|
+
else => unreachable,
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
fn completeStdoutRead(f: *FuzzTestRunner, id: u32, n: usize) !void {
|
|
750
|
+
const maker = f.ctx.fuzz.maker;
|
|
751
|
+
const instance = &f.instances[id];
|
|
752
|
+
const run_index = f.run_index;
|
|
753
|
+
const run = f.run;
|
|
754
|
+
|
|
755
|
+
const graph = maker.graph;
|
|
756
|
+
const gpa = maker.gpa;
|
|
757
|
+
const io = graph.io;
|
|
758
|
+
const step = maker.stepByIndex(run_index);
|
|
759
|
+
|
|
760
|
+
instance.message.items.len += n;
|
|
761
|
+
const total_read = instance.message.items.len;
|
|
762
|
+
if (total_read < @sizeOf(InHeader)) {
|
|
763
|
+
try f.addStdoutRead(id, @sizeOf(InHeader));
|
|
764
|
+
return;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
const header = instance.messageHeader();
|
|
768
|
+
const body = instance.message.items[@sizeOf(InHeader)..];
|
|
769
|
+
if (body.len != header.bytes_len) {
|
|
770
|
+
try f.addStdoutRead(id, @sizeOf(InHeader) + header.bytes_len);
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
switch (header.tag) {
|
|
775
|
+
.zig_version => {
|
|
776
|
+
if (!std.mem.eql(u8, builtin.zig_version_string, body)) return step.fail(
|
|
777
|
+
maker,
|
|
778
|
+
"zig version mismatch build runner vs compiler: '{s}' vs '{s}'",
|
|
779
|
+
.{ builtin.zig_version_string, body },
|
|
780
|
+
);
|
|
781
|
+
},
|
|
782
|
+
.coverage_id => {
|
|
783
|
+
var body_r: Io.Reader = .fixed(body);
|
|
784
|
+
f.coverage_id = body_r.takeInt(u64, .little) catch unreachable;
|
|
785
|
+
const cumulative_runs = body_r.takeInt(u64, .little) catch unreachable;
|
|
786
|
+
const cumulative_unique = body_r.takeInt(u64, .little) catch unreachable;
|
|
787
|
+
const cumulative_coverage = body_r.takeInt(u64, .little) catch unreachable;
|
|
788
|
+
|
|
789
|
+
const fuzz = f.ctx.fuzz;
|
|
790
|
+
fuzz.queue_mutex.lockUncancelable(io);
|
|
791
|
+
defer fuzz.queue_mutex.unlock(io);
|
|
792
|
+
try fuzz.msg_queue.append(gpa, .{ .coverage = .{
|
|
793
|
+
.id = f.coverage_id.?,
|
|
794
|
+
.cumulative = .{
|
|
795
|
+
.runs = cumulative_runs,
|
|
796
|
+
.unique = cumulative_unique,
|
|
797
|
+
.coverage = cumulative_coverage,
|
|
798
|
+
},
|
|
799
|
+
.run = run_index,
|
|
800
|
+
} });
|
|
801
|
+
fuzz.queue_cond.signal(io);
|
|
802
|
+
},
|
|
803
|
+
.fuzz_start_addr => {
|
|
804
|
+
var body_r: Io.Reader = .fixed(body);
|
|
805
|
+
const fuzz = f.ctx.fuzz;
|
|
806
|
+
const addr = body_r.takeInt(u64, .little) catch unreachable;
|
|
807
|
+
|
|
808
|
+
fuzz.queue_mutex.lockUncancelable(io);
|
|
809
|
+
defer fuzz.queue_mutex.unlock(io);
|
|
810
|
+
try fuzz.msg_queue.append(gpa, .{ .entry_point = .{
|
|
811
|
+
.addr = addr,
|
|
812
|
+
.coverage_id = f.coverage_id.?,
|
|
813
|
+
} });
|
|
814
|
+
fuzz.queue_cond.signal(io);
|
|
815
|
+
},
|
|
816
|
+
.fuzz_test_change => {
|
|
817
|
+
const test_i = std.mem.readInt(u32, body[0..4], .little);
|
|
818
|
+
instance.progress_node.setName(run.fuzz_tests.items[test_i]);
|
|
819
|
+
},
|
|
820
|
+
.broadcast_fuzz_input => {
|
|
821
|
+
if (f.instances.len == 1) {
|
|
822
|
+
// No other processes to broadcast to.
|
|
823
|
+
} else if (f.broadcast_undelivered == 0) {
|
|
824
|
+
try f.instanceBroadcast(id, body);
|
|
825
|
+
} else {
|
|
826
|
+
const footer: PendingBroadcastFooter = .{
|
|
827
|
+
.from_id = id,
|
|
828
|
+
.body_len = @intCast(body.len),
|
|
829
|
+
};
|
|
830
|
+
// There is another broadcast in progress so add this one to the queue.
|
|
831
|
+
const size = @sizeOf(PendingBroadcastFooter) + body.len;
|
|
832
|
+
try f.pending_broadcasts.ensureUnusedCapacity(gpa, size);
|
|
833
|
+
f.pending_broadcasts.appendSliceAssumeCapacity(body);
|
|
834
|
+
f.pending_broadcasts.appendSliceAssumeCapacity(@ptrCast(&footer));
|
|
835
|
+
}
|
|
836
|
+
},
|
|
837
|
+
else => {}, // ignore other messages
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
instance.message.clearRetainingCapacity();
|
|
841
|
+
try f.addStdoutRead(id, @sizeOf(InHeader));
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
fn completeStderrRead(f: *FuzzTestRunner, id: u32, n: usize) !void {
|
|
845
|
+
const instance = &f.instances[id];
|
|
846
|
+
instance.stderr.items.len += n;
|
|
847
|
+
try f.addStderrRead(id);
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
fn completeStdinWrite(f: *FuzzTestRunner, id: u32, n: usize) !void {
|
|
851
|
+
const instance = &f.instances[id];
|
|
852
|
+
|
|
853
|
+
instance.broadcast_written += n;
|
|
854
|
+
if (instance.broadcast_written == f.broadcast.items.len) {
|
|
855
|
+
f.broadcast_undelivered -= 1;
|
|
856
|
+
if (f.broadcast_undelivered == 0) {
|
|
857
|
+
try f.broadcastComplete();
|
|
858
|
+
}
|
|
859
|
+
} else {
|
|
860
|
+
f.addStdinWrite(id);
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
fn addStdoutRead(f: *FuzzTestRunner, id: u32, end: usize) !void {
|
|
865
|
+
const maker = f.ctx.fuzz.maker;
|
|
866
|
+
const gpa = maker.gpa;
|
|
867
|
+
const instance = &f.instances[id];
|
|
868
|
+
|
|
869
|
+
try instance.message.ensureTotalCapacity(gpa, end);
|
|
870
|
+
const start = instance.message.items.len;
|
|
871
|
+
instance.stdout_vec = .{instance.message.allocatedSlice()[start..end]};
|
|
872
|
+
f.batch.addAt(id * 3 + stdout_i, .{ .file_read_streaming = .{
|
|
873
|
+
.file = instance.child.stdout.?,
|
|
874
|
+
.data = &instance.stdout_vec,
|
|
875
|
+
} });
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
fn addStderrRead(f: *FuzzTestRunner, id: u32) !void {
|
|
879
|
+
const maker = f.ctx.fuzz.maker;
|
|
880
|
+
const gpa = maker.gpa;
|
|
881
|
+
const instance = &f.instances[id];
|
|
882
|
+
|
|
883
|
+
try instance.stderr.ensureUnusedCapacity(gpa, 1);
|
|
884
|
+
instance.stderr_vec = .{instance.stderr.unusedCapacitySlice()};
|
|
885
|
+
f.batch.addAt(id * 3 + stderr_i, .{ .file_read_streaming = .{
|
|
886
|
+
.file = instance.child.stderr.?,
|
|
887
|
+
.data = &instance.stderr_vec,
|
|
888
|
+
} });
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
fn addStdinWrite(f: *FuzzTestRunner, id: u32) void {
|
|
892
|
+
const instance = &f.instances[id];
|
|
893
|
+
|
|
894
|
+
assert(f.broadcast.items.len != instance.broadcast_written);
|
|
895
|
+
instance.stdin_vec = .{f.broadcast.items[instance.broadcast_written..]};
|
|
896
|
+
f.batch.addAt(id * 3 + stdin_i, .{ .file_write_streaming = .{
|
|
897
|
+
.file = instance.child.stdin.?,
|
|
898
|
+
.data = &instance.stdin_vec,
|
|
899
|
+
} });
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
fn instanceEos(f: *FuzzTestRunner, arena: Allocator, id: u32) !void {
|
|
903
|
+
const maker = f.ctx.fuzz.maker;
|
|
904
|
+
const instance = &f.instances[id];
|
|
905
|
+
const run_index = f.run_index;
|
|
906
|
+
|
|
907
|
+
const graph = maker.graph;
|
|
908
|
+
const io = graph.io;
|
|
909
|
+
const step = maker.stepByIndex(run_index);
|
|
910
|
+
|
|
911
|
+
instance.child.stdin.?.close(io);
|
|
912
|
+
instance.child.stdin = null;
|
|
913
|
+
const term = try instance.child.wait(io);
|
|
914
|
+
if (!termMatches(.{ .exited = 0 }, term)) {
|
|
915
|
+
step.result_stderr = try f.mergedStderr(arena);
|
|
916
|
+
try f.saveCrash(id, term);
|
|
917
|
+
return step.fail(maker, "test process unexpectedly {f}", .{fmtTerm(term)});
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
fn saveCrash(f: *FuzzTestRunner, id: u32, term: process.Child.Term) !void {
|
|
922
|
+
const fuzz = f.ctx.fuzz;
|
|
923
|
+
const run_index = f.run_index;
|
|
924
|
+
const run = f.run;
|
|
925
|
+
|
|
926
|
+
const maker = fuzz.maker;
|
|
927
|
+
const step = maker.stepByIndex(run_index);
|
|
928
|
+
const graph = maker.graph;
|
|
929
|
+
const io = graph.io;
|
|
930
|
+
const cache_root = graph.local_cache_root;
|
|
931
|
+
|
|
932
|
+
if (f.coverage_id == null) return;
|
|
933
|
+
|
|
934
|
+
// Search for the input file corresponding to the instance
|
|
935
|
+
const InputHeader = std.Build.abi.fuzz.MmapInputHeader;
|
|
936
|
+
var in_r_buf: [@sizeOf(InputHeader)]u8 = undefined;
|
|
937
|
+
var in_r: Io.File.Reader = undefined;
|
|
938
|
+
var in_f: Io.File = undefined;
|
|
939
|
+
var in_name_buf: [12]u8 = undefined;
|
|
940
|
+
var in_name: []const u8 = undefined;
|
|
941
|
+
var i: u32 = 0;
|
|
942
|
+
const header: InputHeader = while (true) : ({
|
|
943
|
+
if (i == std.math.maxInt(u32)) return;
|
|
944
|
+
i += 1;
|
|
945
|
+
}) {
|
|
946
|
+
const name_prefix = "f" ++ Dir.path.sep_str ++ "in";
|
|
947
|
+
in_name = std.fmt.bufPrint(&in_name_buf, name_prefix ++ "{x}", .{i}) catch unreachable;
|
|
948
|
+
in_f = cache_root.handle.openFile(io, in_name, .{
|
|
949
|
+
.lock = .exclusive,
|
|
950
|
+
.lock_nonblocking = true,
|
|
951
|
+
}) catch |e| switch (e) {
|
|
952
|
+
error.FileNotFound => return,
|
|
953
|
+
error.WouldBlock => continue, // Can not be from
|
|
954
|
+
// the crashed instance since it is still locked.
|
|
955
|
+
else => return step.fail(maker, "failed to open file '{f}{s}': {t}", .{
|
|
956
|
+
cache_root, in_name, e,
|
|
957
|
+
}),
|
|
958
|
+
};
|
|
959
|
+
|
|
960
|
+
in_r = in_f.readerStreaming(io, &in_r_buf);
|
|
961
|
+
const header = in_r.interface.takeStruct(InputHeader, .little) catch |e| {
|
|
962
|
+
in_f.close(io);
|
|
963
|
+
switch (e) {
|
|
964
|
+
error.ReadFailed => return step.fail(maker, "failed to read file '{f}{s}': {t}", .{
|
|
965
|
+
cache_root, in_name, in_r.err.?,
|
|
966
|
+
}),
|
|
967
|
+
error.EndOfStream => continue,
|
|
968
|
+
}
|
|
969
|
+
};
|
|
970
|
+
|
|
971
|
+
if (header.pc_digest == f.coverage_id.? and
|
|
972
|
+
header.instance_id == id and
|
|
973
|
+
header.test_i < run.fuzz_tests.items.len)
|
|
974
|
+
{
|
|
975
|
+
break header;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
in_f.close(io);
|
|
979
|
+
};
|
|
980
|
+
defer in_f.close(io);
|
|
981
|
+
|
|
982
|
+
// Save it to a seperate file
|
|
983
|
+
const crash_name = "f" ++ Dir.path.sep_str ++ "crash";
|
|
984
|
+
const out = cache_root.handle.createFile(io, crash_name, .{
|
|
985
|
+
.lock = .exclusive, // Multiple run steps could have found a crash at the same time
|
|
986
|
+
}) catch |e| return step.fail(maker, "failed to create file '{f}{s}': {t}", .{
|
|
987
|
+
cache_root, crash_name, e,
|
|
988
|
+
});
|
|
989
|
+
defer out.close(io);
|
|
990
|
+
|
|
991
|
+
var out_w_buf: [512]u8 = undefined;
|
|
992
|
+
var out_w = out.writerStreaming(io, &out_w_buf);
|
|
993
|
+
_ = out_w.interface.sendFileAll(&in_r, .limited(header.len)) catch |e| switch (e) {
|
|
994
|
+
error.ReadFailed => return step.fail(maker, "failed to read file '{f}{s}': {t}", .{
|
|
995
|
+
cache_root, in_name, in_r.err.?,
|
|
996
|
+
}),
|
|
997
|
+
error.WriteFailed => return step.fail(maker, "failed to write file '{f}{s}': {t}", .{
|
|
998
|
+
cache_root, crash_name, out_w.err.?,
|
|
999
|
+
}),
|
|
1000
|
+
};
|
|
1001
|
+
|
|
1002
|
+
return step.fail(maker, "test '{s}' {f}; input saved to '{f}{s}'", .{
|
|
1003
|
+
run.fuzz_tests.items[header.test_i],
|
|
1004
|
+
fmtTerm(term),
|
|
1005
|
+
cache_root,
|
|
1006
|
+
crash_name,
|
|
1007
|
+
});
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
fn instanceBroadcast(f: *FuzzTestRunner, from_id: u32, bytes: []const u8) !void {
|
|
1011
|
+
assert(f.instances.len > 1);
|
|
1012
|
+
assert(f.broadcast_undelivered == 0); // no other broadcast is progress
|
|
1013
|
+
assert(f.broadcast.items.len == 0);
|
|
1014
|
+
assert(from_id < f.instances.len);
|
|
1015
|
+
|
|
1016
|
+
const maker = f.ctx.fuzz.maker;
|
|
1017
|
+
const gpa = maker.gpa;
|
|
1018
|
+
|
|
1019
|
+
var out_header: OutHeader = .{
|
|
1020
|
+
.tag = .new_fuzz_input,
|
|
1021
|
+
.bytes_len = @intCast(bytes.len),
|
|
1022
|
+
};
|
|
1023
|
+
if (std.builtin.Endian.native != .little) {
|
|
1024
|
+
std.mem.byteSwapAllFields(OutHeader, &out_header);
|
|
1025
|
+
}
|
|
1026
|
+
try f.broadcast.ensureTotalCapacity(gpa, @sizeOf(OutHeader) + bytes.len);
|
|
1027
|
+
f.broadcast.appendSliceAssumeCapacity(@ptrCast(&out_header));
|
|
1028
|
+
f.broadcast.appendSliceAssumeCapacity(bytes);
|
|
1029
|
+
|
|
1030
|
+
f.broadcast_undelivered = @intCast(f.instances.len - 1);
|
|
1031
|
+
for (0.., f.instances) |to_id, *instance| {
|
|
1032
|
+
if (to_id == from_id) continue;
|
|
1033
|
+
instance.broadcast_written = 0;
|
|
1034
|
+
f.addStdinWrite(@intCast(to_id));
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
fn broadcastComplete(f: *FuzzTestRunner) !void {
|
|
1039
|
+
assert(f.instances.len > 1);
|
|
1040
|
+
assert(f.broadcast_undelivered == 0);
|
|
1041
|
+
f.broadcast.clearRetainingCapacity();
|
|
1042
|
+
|
|
1043
|
+
const pending = &f.pending_broadcasts;
|
|
1044
|
+
if (pending.items.len != 0) {
|
|
1045
|
+
// Another broadcast is pending; copy it over to `broadcast`
|
|
1046
|
+
|
|
1047
|
+
const footer_len = @sizeOf(PendingBroadcastFooter);
|
|
1048
|
+
const footer_bytes = pending.items[pending.items.len - footer_len ..];
|
|
1049
|
+
const footer: *align(1) PendingBroadcastFooter = @ptrCast(footer_bytes);
|
|
1050
|
+
pending.items.len -= footer_len;
|
|
1051
|
+
|
|
1052
|
+
const body = pending.items[pending.items.len - footer.body_len ..];
|
|
1053
|
+
try f.instanceBroadcast(footer.from_id, body);
|
|
1054
|
+
pending.items.len -= body.len;
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
fn mergedStderr(f: *FuzzTestRunner, arena: Allocator) Allocator.Error![]const u8 {
|
|
1059
|
+
// Collect any available stderr
|
|
1060
|
+
while (f.batch.next()) |completion| {
|
|
1061
|
+
if (completion.index % 3 != 2) continue;
|
|
1062
|
+
const len = completion.result.file_read_streaming catch continue;
|
|
1063
|
+
f.instances[completion.index / 3].stderr.items.len += len;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
var stderr_len: usize = 0;
|
|
1067
|
+
for (f.instances) |*instance| stderr_len += instance.stderr.items.len;
|
|
1068
|
+
const stderr = try arena.alloc(u8, stderr_len);
|
|
1069
|
+
|
|
1070
|
+
stderr_len = 0;
|
|
1071
|
+
for (f.instances) |*instance| {
|
|
1072
|
+
@memcpy(stderr[stderr_len..][0..instance.stderr.items.len], instance.stderr.items);
|
|
1073
|
+
stderr_len += instance.stderr.items.len;
|
|
1074
|
+
}
|
|
1075
|
+
return stderr;
|
|
1076
|
+
}
|
|
1077
|
+
};
|
|
1078
|
+
|
|
1079
|
+
fn evalFuzzTest(
|
|
1080
|
+
run: *Run,
|
|
1081
|
+
run_index: Configuration.Step.Index,
|
|
1082
|
+
progress_node: std.Progress.Node,
|
|
1083
|
+
spawn_options: process.SpawnOptions,
|
|
1084
|
+
fuzz_context: FuzzContext,
|
|
1085
|
+
) !void {
|
|
1086
|
+
var f: FuzzTestRunner = try .init(run, run_index, fuzz_context, progress_node, spawn_options);
|
|
1087
|
+
defer f.deinit();
|
|
1088
|
+
try f.startInstances();
|
|
1089
|
+
try f.listen(fuzz_context.fuzz.maker.graph.arena);
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
const StdioPollEnum = enum { stdout, stderr };
|
|
1093
|
+
|
|
1094
|
+
fn evalZigTest(
|
|
1095
|
+
arena: Allocator,
|
|
1096
|
+
run: *Run,
|
|
1097
|
+
run_index: Configuration.Step.Index,
|
|
1098
|
+
maker: *Maker,
|
|
1099
|
+
progress_node: std.Progress.Node,
|
|
1100
|
+
spawn_options: process.SpawnOptions,
|
|
1101
|
+
fuzz_context: ?FuzzContext,
|
|
1102
|
+
) !void {
|
|
1103
|
+
if (fuzz_context != null) {
|
|
1104
|
+
try evalFuzzTest(run, run_index, progress_node, spawn_options, fuzz_context.?);
|
|
1105
|
+
return;
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
const graph = maker.graph;
|
|
1109
|
+
const gpa = maker.gpa;
|
|
1110
|
+
const io = graph.io;
|
|
1111
|
+
const step = maker.stepByIndex(run_index);
|
|
1112
|
+
|
|
1113
|
+
// We will update this every time a child runs.
|
|
1114
|
+
step.result_peak_rss = 0;
|
|
1115
|
+
|
|
1116
|
+
var test_results: Step.TestResults = .{
|
|
1117
|
+
.test_count = 0,
|
|
1118
|
+
.skip_count = 0,
|
|
1119
|
+
.fail_count = 0,
|
|
1120
|
+
.crash_count = 0,
|
|
1121
|
+
.timeout_count = 0,
|
|
1122
|
+
.leak_count = 0,
|
|
1123
|
+
.log_err_count = 0,
|
|
1124
|
+
};
|
|
1125
|
+
var test_metadata: ?TestMetadata = null;
|
|
1126
|
+
|
|
1127
|
+
while (true) {
|
|
1128
|
+
var child = try process.spawn(io, spawn_options);
|
|
1129
|
+
var multi_reader_buffer: Io.File.MultiReader.Buffer(2) = undefined;
|
|
1130
|
+
var multi_reader: Io.File.MultiReader = undefined;
|
|
1131
|
+
multi_reader.init(gpa, io, multi_reader_buffer.toStreams(), &.{ child.stdout.?, child.stderr.? });
|
|
1132
|
+
var child_killed = false;
|
|
1133
|
+
defer if (!child_killed) {
|
|
1134
|
+
child.kill(io);
|
|
1135
|
+
multi_reader.deinit();
|
|
1136
|
+
step.result_peak_rss = @max(
|
|
1137
|
+
step.result_peak_rss,
|
|
1138
|
+
child.resource_usage_statistics.getMaxRss() orelse 0,
|
|
1139
|
+
);
|
|
1140
|
+
};
|
|
1141
|
+
|
|
1142
|
+
switch (try waitZigTest(
|
|
1143
|
+
arena,
|
|
1144
|
+
run,
|
|
1145
|
+
run_index,
|
|
1146
|
+
maker,
|
|
1147
|
+
&child,
|
|
1148
|
+
progress_node,
|
|
1149
|
+
&multi_reader,
|
|
1150
|
+
&test_metadata,
|
|
1151
|
+
&test_results,
|
|
1152
|
+
)) {
|
|
1153
|
+
.write_failed => |err| {
|
|
1154
|
+
// The runner unexpectedly closed a stdio pipe, which means a crash. Make sure we've captured
|
|
1155
|
+
// all available stderr to make our error output as useful as possible.
|
|
1156
|
+
const stderr_fr = multi_reader.fileReader(1);
|
|
1157
|
+
while (stderr_fr.interface.fillMore()) |_| {} else |e| switch (e) {
|
|
1158
|
+
error.ReadFailed => return stderr_fr.err.?,
|
|
1159
|
+
error.EndOfStream => {},
|
|
1160
|
+
}
|
|
1161
|
+
step.result_stderr = try arena.dupe(u8, stderr_fr.interface.buffered());
|
|
1162
|
+
|
|
1163
|
+
// Clean up everything and wait for the child to exit.
|
|
1164
|
+
child.stdin.?.close(io);
|
|
1165
|
+
child.stdin = null;
|
|
1166
|
+
multi_reader.deinit();
|
|
1167
|
+
child_killed = true;
|
|
1168
|
+
const term = try child.wait(io);
|
|
1169
|
+
step.result_peak_rss = @max(
|
|
1170
|
+
step.result_peak_rss,
|
|
1171
|
+
child.resource_usage_statistics.getMaxRss() orelse 0,
|
|
1172
|
+
);
|
|
1173
|
+
|
|
1174
|
+
// The individual unit test results are irrelevant: the test runner itself broke!
|
|
1175
|
+
// Fail immediately without populating `s.test_results`.
|
|
1176
|
+
return step.fail(maker, "unable to write stdin ({t}); test process unexpectedly {f}", .{
|
|
1177
|
+
err, fmtTerm(term),
|
|
1178
|
+
});
|
|
1179
|
+
},
|
|
1180
|
+
.no_poll => |no_poll| {
|
|
1181
|
+
// This might be a success (we requested exit and the child dutifully closed stdout) or
|
|
1182
|
+
// a crash of some kind. Either way, the child will terminate by itself -- wait for it.
|
|
1183
|
+
const stderr_reader = multi_reader.reader(1);
|
|
1184
|
+
const stderr_owned = try arena.dupe(u8, stderr_reader.buffered());
|
|
1185
|
+
|
|
1186
|
+
// Clean up everything and wait for the child to exit.
|
|
1187
|
+
child.stdin.?.close(io);
|
|
1188
|
+
child.stdin = null;
|
|
1189
|
+
multi_reader.deinit();
|
|
1190
|
+
child_killed = true;
|
|
1191
|
+
const term = try child.wait(io);
|
|
1192
|
+
step.result_peak_rss = @max(
|
|
1193
|
+
step.result_peak_rss,
|
|
1194
|
+
child.resource_usage_statistics.getMaxRss() orelse 0,
|
|
1195
|
+
);
|
|
1196
|
+
|
|
1197
|
+
if (no_poll.active_test_index) |test_index| {
|
|
1198
|
+
// A test was running, so this is definitely a crash. Report it against that
|
|
1199
|
+
// test, and continue to the next test.
|
|
1200
|
+
test_metadata.?.ns_per_test[test_index] = no_poll.ns_elapsed;
|
|
1201
|
+
test_results.crash_count += 1;
|
|
1202
|
+
try step.addError(maker, "'{s}' {f}{s}{s}", .{
|
|
1203
|
+
test_metadata.?.testName(test_index),
|
|
1204
|
+
fmtTerm(term),
|
|
1205
|
+
if (stderr_owned.len != 0) " with stderr:\n" else "",
|
|
1206
|
+
std.mem.trim(u8, stderr_owned, "\n"),
|
|
1207
|
+
});
|
|
1208
|
+
continue;
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
// Report an error if the child terminated uncleanly or if we were still trying to run more tests.
|
|
1212
|
+
step.result_stderr = stderr_owned;
|
|
1213
|
+
const tests_done = test_metadata != null and test_metadata.?.next_index == std.math.maxInt(u32);
|
|
1214
|
+
if (!tests_done or !termMatches(.{ .exited = 0 }, term)) {
|
|
1215
|
+
// The individual unit test results are irrelevant: the test runner itself broke!
|
|
1216
|
+
// Fail immediately without populating `s.test_results`.
|
|
1217
|
+
return step.fail(maker, "test process unexpectedly {f}", .{fmtTerm(term)});
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
// We're done with all of the tests! Commit the test results and return.
|
|
1221
|
+
step.test_results = test_results;
|
|
1222
|
+
if (test_metadata) |tm| {
|
|
1223
|
+
run.cached_test_metadata = tm.toCachedTestMetadata();
|
|
1224
|
+
if (maker.web_server) |*ws| {
|
|
1225
|
+
if (graph.time_report) {
|
|
1226
|
+
ws.updateTimeReportRunTest(
|
|
1227
|
+
run_index,
|
|
1228
|
+
&run.cached_test_metadata.?,
|
|
1229
|
+
tm.ns_per_test,
|
|
1230
|
+
);
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
return;
|
|
1235
|
+
},
|
|
1236
|
+
.timeout => |timeout| {
|
|
1237
|
+
const stderr_reader = multi_reader.reader(1);
|
|
1238
|
+
const stderr = stderr_reader.buffered();
|
|
1239
|
+
stderr_reader.tossBuffered();
|
|
1240
|
+
if (timeout.active_test_index) |test_index| {
|
|
1241
|
+
// A test was running. Report the timeout against that test, and continue on to
|
|
1242
|
+
// the next test.
|
|
1243
|
+
test_metadata.?.ns_per_test[test_index] = timeout.ns_elapsed;
|
|
1244
|
+
test_results.timeout_count += 1;
|
|
1245
|
+
try step.addError(maker, "'{s}' timed out after {f}{s}{s}", .{
|
|
1246
|
+
test_metadata.?.testName(test_index),
|
|
1247
|
+
Io.Duration{ .nanoseconds = timeout.ns_elapsed },
|
|
1248
|
+
if (stderr.len != 0) " with stderr:\n" else "",
|
|
1249
|
+
std.mem.trim(u8, stderr, "\n"),
|
|
1250
|
+
});
|
|
1251
|
+
continue;
|
|
1252
|
+
}
|
|
1253
|
+
// Just log an error and let the child be killed.
|
|
1254
|
+
step.result_stderr = try arena.dupe(u8, stderr);
|
|
1255
|
+
// The individual unit test results in `results` are irrelevant: the test runner
|
|
1256
|
+
// is broken! Fail immediately without populating `s.test_results`.
|
|
1257
|
+
return step.fail(maker, "test runner failed to respond for {f}", .{Io.Duration{ .nanoseconds = timeout.ns_elapsed }});
|
|
1258
|
+
},
|
|
1259
|
+
}
|
|
1260
|
+
comptime unreachable;
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
const TestMetadata = struct {
|
|
1265
|
+
names: []const u32,
|
|
1266
|
+
ns_per_test: []u64,
|
|
1267
|
+
expected_panic_msgs: []const u32,
|
|
1268
|
+
string_bytes: []const u8,
|
|
1269
|
+
next_index: u32,
|
|
1270
|
+
prog_node: std.Progress.Node,
|
|
1271
|
+
|
|
1272
|
+
fn toCachedTestMetadata(tm: TestMetadata) CachedTestMetadata {
|
|
1273
|
+
return .{
|
|
1274
|
+
.names = tm.names,
|
|
1275
|
+
.string_bytes = tm.string_bytes,
|
|
1276
|
+
};
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
fn testName(tm: TestMetadata, index: u32) []const u8 {
|
|
1280
|
+
return tm.toCachedTestMetadata().testName(index);
|
|
1281
|
+
}
|
|
1282
|
+
};
|
|
1283
|
+
|
|
1284
|
+
pub const CachedTestMetadata = struct {
|
|
1285
|
+
names: []const u32,
|
|
1286
|
+
string_bytes: []const u8,
|
|
1287
|
+
|
|
1288
|
+
pub fn testName(tm: CachedTestMetadata, index: u32) []const u8 {
|
|
1289
|
+
return std.mem.sliceTo(tm.string_bytes[tm.names[index]..], 0);
|
|
1290
|
+
}
|
|
1291
|
+
};
|
|
1292
|
+
|
|
1293
|
+
fn requestNextTest(io: Io, in: Io.File, metadata: *TestMetadata, sub_prog_node: *?std.Progress.Node) !void {
|
|
1294
|
+
while (metadata.next_index < metadata.names.len) {
|
|
1295
|
+
const i = metadata.next_index;
|
|
1296
|
+
metadata.next_index += 1;
|
|
1297
|
+
|
|
1298
|
+
if (metadata.expected_panic_msgs[i] != 0) continue;
|
|
1299
|
+
|
|
1300
|
+
const name = metadata.testName(i);
|
|
1301
|
+
if (sub_prog_node.*) |n| n.end();
|
|
1302
|
+
sub_prog_node.* = metadata.prog_node.start(name, 0);
|
|
1303
|
+
|
|
1304
|
+
try sendRunTestMessage(io, in, .run_test, i);
|
|
1305
|
+
return;
|
|
1306
|
+
} else {
|
|
1307
|
+
metadata.next_index = std.math.maxInt(u32); // indicate that all tests are done
|
|
1308
|
+
try sendMessage(io, in, .exit);
|
|
1309
|
+
}
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
fn sendMessage(io: Io, file: Io.File, tag: std.zig.Client.Message.Tag) !void {
|
|
1313
|
+
const header: std.zig.Client.Message.Header = .{
|
|
1314
|
+
.tag = tag,
|
|
1315
|
+
.bytes_len = 0,
|
|
1316
|
+
};
|
|
1317
|
+
var w = file.writerStreaming(io, &.{});
|
|
1318
|
+
w.interface.writeStruct(header, .little) catch |err| switch (err) {
|
|
1319
|
+
error.WriteFailed => return w.err.?,
|
|
1320
|
+
};
|
|
1321
|
+
}
|
|
1322
|
+
|
|
1323
|
+
fn sendRunTestMessage(io: Io, file: Io.File, tag: std.zig.Client.Message.Tag, index: u32) !void {
|
|
1324
|
+
const header: std.zig.Client.Message.Header = .{
|
|
1325
|
+
.tag = tag,
|
|
1326
|
+
.bytes_len = 4,
|
|
1327
|
+
};
|
|
1328
|
+
var w = file.writerStreaming(io, &.{});
|
|
1329
|
+
w.interface.writeStruct(header, .little) catch |err| switch (err) {
|
|
1330
|
+
error.WriteFailed => return w.err.?,
|
|
1331
|
+
};
|
|
1332
|
+
w.interface.writeInt(u32, index, .little) catch |err| switch (err) {
|
|
1333
|
+
error.WriteFailed => return w.err.?,
|
|
1334
|
+
};
|
|
1335
|
+
}
|
|
1336
|
+
|
|
1337
|
+
fn sendRunFuzzTestMessage(
|
|
1338
|
+
io: Io,
|
|
1339
|
+
file: Io.File,
|
|
1340
|
+
test_names: []const []const u8,
|
|
1341
|
+
kind: std.Build.abi.fuzz.LimitKind,
|
|
1342
|
+
amount_or_instance: u64,
|
|
1343
|
+
) !void {
|
|
1344
|
+
const header: std.zig.Client.Message.Header = .{
|
|
1345
|
+
.tag = .start_fuzzing,
|
|
1346
|
+
.bytes_len = 1 + 8 + 4 + count: {
|
|
1347
|
+
var c: u32 = @intCast(test_names.len * 4);
|
|
1348
|
+
for (test_names) |name| {
|
|
1349
|
+
c += @intCast(name.len);
|
|
1350
|
+
}
|
|
1351
|
+
break :count c;
|
|
1352
|
+
},
|
|
1353
|
+
};
|
|
1354
|
+
var w = file.writerStreaming(io, &.{});
|
|
1355
|
+
w.interface.writeStruct(header, .little) catch |err| switch (err) {
|
|
1356
|
+
error.WriteFailed => return w.err.?,
|
|
1357
|
+
};
|
|
1358
|
+
w.interface.writeByte(@intFromEnum(kind)) catch |err| switch (err) {
|
|
1359
|
+
error.WriteFailed => return w.err.?,
|
|
1360
|
+
};
|
|
1361
|
+
w.interface.writeInt(u64, amount_or_instance, .little) catch |err| switch (err) {
|
|
1362
|
+
error.WriteFailed => return w.err.?,
|
|
1363
|
+
};
|
|
1364
|
+
w.interface.writeInt(u32, @intCast(test_names.len), .little) catch |err| switch (err) {
|
|
1365
|
+
error.WriteFailed => return w.err.?,
|
|
1366
|
+
};
|
|
1367
|
+
for (test_names) |test_name| {
|
|
1368
|
+
w.interface.writeInt(u32, @intCast(test_name.len), .little) catch |err| switch (err) {
|
|
1369
|
+
error.WriteFailed => return w.err.?,
|
|
1370
|
+
};
|
|
1371
|
+
w.interface.writeAll(test_name) catch |err| switch (err) {
|
|
1372
|
+
error.WriteFailed => return w.err.?,
|
|
1373
|
+
};
|
|
1374
|
+
}
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1377
|
+
/// Uses `arena` to allocate the result.
|
|
1378
|
+
fn evalGeneric(
|
|
1379
|
+
arena: Allocator,
|
|
1380
|
+
run_index: Configuration.Step.Index,
|
|
1381
|
+
maker: *Maker,
|
|
1382
|
+
spawn_options: process.SpawnOptions,
|
|
1383
|
+
) !EvalGenericResult {
|
|
1384
|
+
const graph = maker.graph;
|
|
1385
|
+
const io = graph.io;
|
|
1386
|
+
const conf = &maker.scanned_config.configuration;
|
|
1387
|
+
const conf_step = run_index.ptr(conf);
|
|
1388
|
+
const conf_run = conf_step.extended.get(conf.extra).run;
|
|
1389
|
+
const step = maker.stepByIndex(run_index);
|
|
1390
|
+
|
|
1391
|
+
var child = try process.spawn(io, spawn_options);
|
|
1392
|
+
defer child.kill(io);
|
|
1393
|
+
|
|
1394
|
+
switch (conf_run.stdin.u) {
|
|
1395
|
+
.bytes => |bytes| {
|
|
1396
|
+
child.stdin.?.writeStreamingAll(io, bytes.slice(conf)) catch |err| {
|
|
1397
|
+
return step.fail(maker, "failed to write stdin: {t}", .{err});
|
|
1398
|
+
};
|
|
1399
|
+
child.stdin.?.close(io);
|
|
1400
|
+
child.stdin = null;
|
|
1401
|
+
},
|
|
1402
|
+
.lazy_path => |lazy_path| {
|
|
1403
|
+
const path = try maker.resolveLazyPathIndex(arena, lazy_path, run_index);
|
|
1404
|
+
const file = path.root_dir.handle.openFile(io, path.subPathOrDot(), .{}) catch |err| {
|
|
1405
|
+
return step.fail(maker, "failed to open stdin file: {t}", .{err});
|
|
1406
|
+
};
|
|
1407
|
+
defer file.close(io);
|
|
1408
|
+
// TODO https://github.com/ziglang/zig/issues/23955
|
|
1409
|
+
var read_buffer: [1024]u8 = undefined;
|
|
1410
|
+
var file_reader = file.reader(io, &read_buffer);
|
|
1411
|
+
var write_buffer: [1024]u8 = undefined;
|
|
1412
|
+
var stdin_writer = child.stdin.?.writerStreaming(io, &write_buffer);
|
|
1413
|
+
_ = stdin_writer.interface.sendFileAll(&file_reader, .unlimited) catch |err| switch (err) {
|
|
1414
|
+
error.ReadFailed => return step.fail(maker, "failed to read from {f}: {t}", .{
|
|
1415
|
+
path, file_reader.err.?,
|
|
1416
|
+
}),
|
|
1417
|
+
error.WriteFailed => return step.fail(maker, "failed to write to stdin: {t}", .{
|
|
1418
|
+
stdin_writer.err.?,
|
|
1419
|
+
}),
|
|
1420
|
+
};
|
|
1421
|
+
stdin_writer.interface.flush() catch |err| switch (err) {
|
|
1422
|
+
error.WriteFailed => return step.fail(maker, "failed to write to stdin: {t}", .{
|
|
1423
|
+
stdin_writer.err.?,
|
|
1424
|
+
}),
|
|
1425
|
+
};
|
|
1426
|
+
child.stdin.?.close(io);
|
|
1427
|
+
child.stdin = null;
|
|
1428
|
+
},
|
|
1429
|
+
.none => {},
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
var stdout_bytes: ?[]const u8 = null;
|
|
1433
|
+
var stderr_bytes: ?[]const u8 = null;
|
|
1434
|
+
|
|
1435
|
+
if (child.stdout) |stdout| {
|
|
1436
|
+
if (child.stderr) |stderr| {
|
|
1437
|
+
var multi_reader_buffer: Io.File.MultiReader.Buffer(2) = undefined;
|
|
1438
|
+
var multi_reader: Io.File.MultiReader = undefined;
|
|
1439
|
+
multi_reader.init(arena, io, multi_reader_buffer.toStreams(), &.{ stdout, stderr });
|
|
1440
|
+
|
|
1441
|
+
const stdout_reader = multi_reader.reader(0);
|
|
1442
|
+
const stderr_reader = multi_reader.reader(1);
|
|
1443
|
+
|
|
1444
|
+
while (multi_reader.fill(64, .none)) |_| {
|
|
1445
|
+
if (conf_run.stdio_limit.value) |limit| {
|
|
1446
|
+
if (stdout_reader.buffered().len > limit)
|
|
1447
|
+
return error.StdoutStreamTooLong;
|
|
1448
|
+
if (stderr_reader.buffered().len > limit)
|
|
1449
|
+
return error.StderrStreamTooLong;
|
|
1450
|
+
}
|
|
1451
|
+
} else |err| switch (err) {
|
|
1452
|
+
error.Timeout => unreachable,
|
|
1453
|
+
error.EndOfStream => {},
|
|
1454
|
+
else => |e| return e,
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1457
|
+
try multi_reader.checkAnyError();
|
|
1458
|
+
|
|
1459
|
+
stdout_bytes = try multi_reader.toOwnedSlice(0);
|
|
1460
|
+
stderr_bytes = try multi_reader.toOwnedSlice(1);
|
|
1461
|
+
} else {
|
|
1462
|
+
var stdout_reader = stdout.readerStreaming(io, &.{});
|
|
1463
|
+
const stdio_limit: Io.Limit = if (conf_run.stdio_limit.value) |x| .limited64(x) else .unlimited;
|
|
1464
|
+
stdout_bytes = stdout_reader.interface.allocRemaining(arena, stdio_limit) catch |err| switch (err) {
|
|
1465
|
+
error.OutOfMemory => |e| return e,
|
|
1466
|
+
error.ReadFailed => return stdout_reader.err.?,
|
|
1467
|
+
error.StreamTooLong => return error.StdoutStreamTooLong,
|
|
1468
|
+
};
|
|
1469
|
+
}
|
|
1470
|
+
} else if (child.stderr) |stderr| {
|
|
1471
|
+
var stderr_reader = stderr.readerStreaming(io, &.{});
|
|
1472
|
+
const stdio_limit: Io.Limit = if (conf_run.stdio_limit.value) |x| .limited64(x) else .unlimited;
|
|
1473
|
+
stderr_bytes = stderr_reader.interface.allocRemaining(arena, stdio_limit) catch |err| switch (err) {
|
|
1474
|
+
error.OutOfMemory => |e| return e,
|
|
1475
|
+
error.ReadFailed => return stderr_reader.err.?,
|
|
1476
|
+
error.StreamTooLong => return error.StderrStreamTooLong,
|
|
1477
|
+
};
|
|
1478
|
+
}
|
|
1479
|
+
|
|
1480
|
+
if (stderr_bytes) |bytes| if (bytes.len > 0) {
|
|
1481
|
+
// Treat stderr as an error message.
|
|
1482
|
+
const stderr_is_diagnostic = conf_run.captured_stderr.value == null and switch (conf_run.flags.stdio) {
|
|
1483
|
+
.check => !checksContainStderr(&conf_run),
|
|
1484
|
+
else => true,
|
|
1485
|
+
};
|
|
1486
|
+
if (stderr_is_diagnostic) {
|
|
1487
|
+
step.result_stderr = bytes;
|
|
1488
|
+
}
|
|
1489
|
+
};
|
|
1490
|
+
|
|
1491
|
+
step.result_peak_rss = child.resource_usage_statistics.getMaxRss() orelse 0;
|
|
1492
|
+
|
|
1493
|
+
return .{
|
|
1494
|
+
.term = try child.wait(io),
|
|
1495
|
+
.stdout = stdout_bytes,
|
|
1496
|
+
.stderr = stderr_bytes,
|
|
1497
|
+
};
|
|
1498
|
+
}
|
|
1499
|
+
|
|
1500
|
+
const IndexedOutput = struct {
|
|
1501
|
+
index: u32,
|
|
1502
|
+
arg_index: Configuration.Step.Run.Arg.Index,
|
|
1503
|
+
};
|
|
1504
|
+
|
|
1505
|
+
pub fn rerunInFuzzMode(
|
|
1506
|
+
run: *Run,
|
|
1507
|
+
run_index: Configuration.Step.Index,
|
|
1508
|
+
fuzz: *Fuzz,
|
|
1509
|
+
prog_node: std.Progress.Node,
|
|
1510
|
+
) !void {
|
|
1511
|
+
const maker = fuzz.maker;
|
|
1512
|
+
const graph = maker.graph;
|
|
1513
|
+
const step = maker.stepByIndex(run_index);
|
|
1514
|
+
const io = graph.io;
|
|
1515
|
+
const gpa = maker.gpa;
|
|
1516
|
+
const conf = &maker.scanned_config.configuration;
|
|
1517
|
+
const conf_step = run_index.ptr(conf);
|
|
1518
|
+
const conf_run = conf_step.extended.get(conf.extra).run;
|
|
1519
|
+
const cache_root = graph.local_cache_root;
|
|
1520
|
+
|
|
1521
|
+
var arena_allocator: std.heap.ArenaAllocator = .init(gpa);
|
|
1522
|
+
defer arena_allocator.deinit();
|
|
1523
|
+
const arena = arena_allocator.allocator();
|
|
1524
|
+
|
|
1525
|
+
var argv_list: std.ArrayList([]const u8) = .empty;
|
|
1526
|
+
defer argv_list.deinit(gpa);
|
|
1527
|
+
|
|
1528
|
+
for (conf_run.args.slice) |arg_index| {
|
|
1529
|
+
const arg = arg_index.get(conf);
|
|
1530
|
+
try argv_list.ensureUnusedCapacity(gpa, 1);
|
|
1531
|
+
switch (arg.flags.tag) {
|
|
1532
|
+
.string => {
|
|
1533
|
+
const prefix = arg.prefix.value.?.slice(conf);
|
|
1534
|
+
argv_list.appendAssumeCapacity(prefix);
|
|
1535
|
+
},
|
|
1536
|
+
.path_file => {
|
|
1537
|
+
const prefix = if (arg.prefix.value) |p| p.slice(conf) else "";
|
|
1538
|
+
const suffix = if (arg.suffix.value) |p| p.slice(conf) else "";
|
|
1539
|
+
const file_path = try maker.resolveLazyPathIndex(arena, arg.path.value.?, run_index);
|
|
1540
|
+
argv_list.appendAssumeCapacity(try mem.concat(arena, u8, &.{
|
|
1541
|
+
prefix, try convertPathArg(arena, run_index, maker, file_path), suffix,
|
|
1542
|
+
}));
|
|
1543
|
+
},
|
|
1544
|
+
.path_directory => {
|
|
1545
|
+
const prefix = if (arg.prefix.value) |p| p.slice(conf) else "";
|
|
1546
|
+
const suffix = if (arg.suffix.value) |p| p.slice(conf) else "";
|
|
1547
|
+
const file_path = try maker.resolveLazyPathIndex(arena, arg.path.value.?, run_index);
|
|
1548
|
+
const resolved_arg = try mem.concat(arena, u8, &.{
|
|
1549
|
+
prefix, try convertPathArg(arena, run_index, maker, file_path), suffix,
|
|
1550
|
+
});
|
|
1551
|
+
argv_list.appendAssumeCapacity(resolved_arg);
|
|
1552
|
+
},
|
|
1553
|
+
.file_content => {
|
|
1554
|
+
const prefix = if (arg.prefix.value) |p| p.slice(conf) else "";
|
|
1555
|
+
const suffix = if (arg.suffix.value) |p| p.slice(conf) else "";
|
|
1556
|
+
const file_path = try maker.resolveLazyPathIndex(arena, arg.path.value.?, run_index);
|
|
1557
|
+
|
|
1558
|
+
var result: std.Io.Writer.Allocating = .init(arena);
|
|
1559
|
+
result.writer.writeAll(prefix) catch return error.OutOfMemory;
|
|
1560
|
+
|
|
1561
|
+
const file = file_path.root_dir.handle.openFile(io, file_path.sub_path, .{}) catch |err|
|
|
1562
|
+
return step.fail(maker, "unable to open input file {f}: {t}", .{ file_path, err });
|
|
1563
|
+
defer file.close(io);
|
|
1564
|
+
|
|
1565
|
+
var file_reader = file.reader(io, &.{});
|
|
1566
|
+
_ = file_reader.interface.streamRemaining(&result.writer) catch |err| switch (err) {
|
|
1567
|
+
error.ReadFailed => switch (file_reader.err.?) {
|
|
1568
|
+
error.Canceled => |e| return e,
|
|
1569
|
+
else => |e| return step.fail(maker, "failed to read from {f}: {t}", .{ file_path, e }),
|
|
1570
|
+
},
|
|
1571
|
+
error.WriteFailed => return error.OutOfMemory,
|
|
1572
|
+
};
|
|
1573
|
+
result.writer.writeAll(suffix) catch return error.OutOfMemory;
|
|
1574
|
+
|
|
1575
|
+
argv_list.appendAssumeCapacity(result.written());
|
|
1576
|
+
},
|
|
1577
|
+
.artifact => {
|
|
1578
|
+
const prefix = if (arg.prefix.value) |p| p.slice(conf) else "";
|
|
1579
|
+
const suffix = if (arg.suffix.value) |p| p.slice(conf) else "";
|
|
1580
|
+
const producer_index = arg.producer.value.?;
|
|
1581
|
+
const producer_step = producer_index.ptr(conf);
|
|
1582
|
+
const producer = producer_step.extended.get(conf.extra).compile;
|
|
1583
|
+
const producer_make_comp_step = maker.stepByIndex(producer_index);
|
|
1584
|
+
const producer_make_comp = &producer_make_comp_step.extended.compile;
|
|
1585
|
+
const file_path: Path = if (producer_index == conf_run.producer.value.?)
|
|
1586
|
+
run.rebuilt_executable.?
|
|
1587
|
+
else
|
|
1588
|
+
producer_make_comp.installed_path orelse
|
|
1589
|
+
maker.generatedPath(producer.generated_bin.value.?).*;
|
|
1590
|
+
argv_list.appendAssumeCapacity(try mem.concat(arena, u8, &.{
|
|
1591
|
+
prefix, try convertPathArg(arena, run_index, maker, file_path), suffix,
|
|
1592
|
+
}));
|
|
1593
|
+
},
|
|
1594
|
+
.output_file => unreachable,
|
|
1595
|
+
.output_directory => unreachable,
|
|
1596
|
+
.passthru => unreachable,
|
|
1597
|
+
}
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
if (conf_run.flags.test_runner_mode) {
|
|
1601
|
+
const cache_dir_string = try convertPathArg(arena, run_index, maker, .{ .root_dir = cache_root });
|
|
1602
|
+
|
|
1603
|
+
try argv_list.ensureUnusedCapacity(gpa, 3);
|
|
1604
|
+
argv_list.appendAssumeCapacity(try allocPrint(arena, "--cache-dir={s}", .{cache_dir_string}));
|
|
1605
|
+
argv_list.appendAssumeCapacity(try allocPrint(arena, "--seed=0x{x}", .{graph.random_seed}));
|
|
1606
|
+
argv_list.appendAssumeCapacity("--listen=-");
|
|
1607
|
+
}
|
|
1608
|
+
|
|
1609
|
+
step.clearFailedCommand(gpa);
|
|
1610
|
+
|
|
1611
|
+
const has_side_effects = false;
|
|
1612
|
+
var rand_int: u64 = undefined;
|
|
1613
|
+
io.random(@ptrCast(&rand_int));
|
|
1614
|
+
const tmp_dir_path = "tmp" ++ Dir.path.sep_str ++ std.fmt.hex(rand_int);
|
|
1615
|
+
try runCommand(arena, run, run_index, maker, prog_node, argv_list.items, has_side_effects, tmp_dir_path, .{
|
|
1616
|
+
.fuzz = fuzz,
|
|
1617
|
+
});
|
|
1618
|
+
}
|
|
1619
|
+
|
|
1620
|
+
fn populateGeneratedPaths(
|
|
1621
|
+
maker: *Maker,
|
|
1622
|
+
output_placeholders: []const IndexedOutput,
|
|
1623
|
+
cache_root: Cache.Directory,
|
|
1624
|
+
digest: *const Cache.HexDigest,
|
|
1625
|
+
) !void {
|
|
1626
|
+
const conf = &maker.scanned_config.configuration;
|
|
1627
|
+
const graph = maker.graph;
|
|
1628
|
+
|
|
1629
|
+
for (output_placeholders) |placeholder| {
|
|
1630
|
+
const arg = placeholder.arg_index.get(conf);
|
|
1631
|
+
maker.generatedPath(arg.generated.value.?).* = .{
|
|
1632
|
+
.root_dir = cache_root,
|
|
1633
|
+
.sub_path = try Dir.path.join(graph.arena, &.{
|
|
1634
|
+
"o", digest, arg.basename.value.?.slice(conf),
|
|
1635
|
+
}),
|
|
1636
|
+
};
|
|
1637
|
+
}
|
|
1638
|
+
}
|
|
1639
|
+
|
|
1640
|
+
fn populateGeneratedPathsCreateDirs(
|
|
1641
|
+
arena: Allocator,
|
|
1642
|
+
run_index: Configuration.Step.Index,
|
|
1643
|
+
maker: *Maker,
|
|
1644
|
+
output_dir_path: []const u8,
|
|
1645
|
+
output_placeholders: []const IndexedOutput,
|
|
1646
|
+
argv: [][]const u8,
|
|
1647
|
+
) !void {
|
|
1648
|
+
const step = maker.stepByIndex(run_index);
|
|
1649
|
+
const conf = &maker.scanned_config.configuration;
|
|
1650
|
+
const graph = maker.graph;
|
|
1651
|
+
const io = graph.io;
|
|
1652
|
+
const cache_root = graph.local_cache_root;
|
|
1653
|
+
|
|
1654
|
+
for (output_placeholders) |placeholder| {
|
|
1655
|
+
const arg = placeholder.arg_index.get(conf);
|
|
1656
|
+
const prefix = if (arg.prefix.value) |p| p.slice(conf) else "";
|
|
1657
|
+
const suffix = if (arg.suffix.value) |p| p.slice(conf) else "";
|
|
1658
|
+
const basename = arg.basename.value.?.slice(conf);
|
|
1659
|
+
|
|
1660
|
+
const generated_path: Path = .{
|
|
1661
|
+
.root_dir = cache_root,
|
|
1662
|
+
.sub_path = try Dir.path.join(graph.arena, &.{ output_dir_path, basename }),
|
|
1663
|
+
};
|
|
1664
|
+
const create_path: Path = .{
|
|
1665
|
+
.root_dir = cache_root,
|
|
1666
|
+
.sub_path = switch (arg.flags.tag) {
|
|
1667
|
+
.output_file => Dir.path.dirname(generated_path.sub_path).?,
|
|
1668
|
+
.output_directory => generated_path.sub_path,
|
|
1669
|
+
else => unreachable,
|
|
1670
|
+
},
|
|
1671
|
+
};
|
|
1672
|
+
create_path.root_dir.handle.createDirPath(io, create_path.sub_path) catch |err|
|
|
1673
|
+
return step.fail(maker, "unable to make path {f}: {t}", .{ create_path, err });
|
|
1674
|
+
|
|
1675
|
+
maker.generatedPath(arg.generated.value.?).* = generated_path;
|
|
1676
|
+
|
|
1677
|
+
const arg_output_path = try convertPathArg(arena, run_index, maker, generated_path);
|
|
1678
|
+
argv[placeholder.index] = try mem.concat(arena, u8, &.{ prefix, arg_output_path, suffix });
|
|
1679
|
+
}
|
|
1680
|
+
}
|
|
1681
|
+
|
|
1682
|
+
fn populateGeneratedStdIo(
|
|
1683
|
+
maker: *Maker,
|
|
1684
|
+
conf_run: *const Configuration.Step.Run,
|
|
1685
|
+
cache_root: Cache.Directory,
|
|
1686
|
+
digest: *const Cache.HexDigest,
|
|
1687
|
+
) !void {
|
|
1688
|
+
const conf = &maker.scanned_config.configuration;
|
|
1689
|
+
const graph = maker.graph;
|
|
1690
|
+
|
|
1691
|
+
if (conf_run.captured_stdout.value) |captured| {
|
|
1692
|
+
maker.generatedPath(captured.generated_file).* = .{
|
|
1693
|
+
.root_dir = cache_root,
|
|
1694
|
+
.sub_path = try Dir.path.join(graph.arena, &.{
|
|
1695
|
+
"o", digest, captured.basename.slice(conf),
|
|
1696
|
+
}),
|
|
1697
|
+
};
|
|
1698
|
+
}
|
|
1699
|
+
|
|
1700
|
+
if (conf_run.captured_stderr.value) |captured| {
|
|
1701
|
+
maker.generatedPath(captured.generated_file).* = .{
|
|
1702
|
+
.root_dir = cache_root,
|
|
1703
|
+
.sub_path = try Dir.path.join(graph.arena, &.{
|
|
1704
|
+
"o", digest, captured.basename.slice(conf),
|
|
1705
|
+
}),
|
|
1706
|
+
};
|
|
1707
|
+
}
|
|
1708
|
+
}
|
|
1709
|
+
|
|
1710
|
+
fn formatTerm(term: ?process.Child.Term, w: *std.Io.Writer) std.Io.Writer.Error!void {
|
|
1711
|
+
if (term) |t| switch (t) {
|
|
1712
|
+
.exited => |code| try w.print("exited with code {d}", .{code}),
|
|
1713
|
+
.signal => |sig| try w.print("terminated with signal {t}", .{sig}),
|
|
1714
|
+
.stopped => |sig| try w.print("stopped with signal {t}", .{sig}),
|
|
1715
|
+
.unknown => |code| try w.print("terminated for unknown reason with code {d}", .{code}),
|
|
1716
|
+
} else {
|
|
1717
|
+
try w.writeAll("exited with any code");
|
|
1718
|
+
}
|
|
1719
|
+
}
|
|
1720
|
+
fn fmtTerm(term: ?process.Child.Term) std.fmt.Alt(?process.Child.Term, formatTerm) {
|
|
1721
|
+
return .{ .data = term };
|
|
1722
|
+
}
|
|
1723
|
+
|
|
1724
|
+
const FuzzContext = struct {
|
|
1725
|
+
fuzz: *Fuzz,
|
|
1726
|
+
};
|
|
1727
|
+
|
|
1728
|
+
fn runCommand(
|
|
1729
|
+
arena: Allocator,
|
|
1730
|
+
run: *Run,
|
|
1731
|
+
run_index: Configuration.Step.Index,
|
|
1732
|
+
maker: *Maker,
|
|
1733
|
+
progress_node: std.Progress.Node,
|
|
1734
|
+
argv: []const []const u8,
|
|
1735
|
+
has_side_effects: bool,
|
|
1736
|
+
output_dir_path: []const u8,
|
|
1737
|
+
fuzz_context: ?FuzzContext,
|
|
1738
|
+
) Step.ExtendedMakeError!void {
|
|
1739
|
+
const graph = maker.graph;
|
|
1740
|
+
const gpa = maker.gpa;
|
|
1741
|
+
const step = maker.stepByIndex(run_index);
|
|
1742
|
+
const io = graph.io;
|
|
1743
|
+
const cache_root = graph.local_cache_root;
|
|
1744
|
+
const conf = &maker.scanned_config.configuration;
|
|
1745
|
+
const conf_step = run_index.ptr(conf);
|
|
1746
|
+
const conf_run = conf_step.extended.get(conf.extra).run;
|
|
1747
|
+
|
|
1748
|
+
const cwd: process.Child.Cwd = if (conf_run.cwd.value) |lazy_cwd|
|
|
1749
|
+
.{ .path = try maker.resolveLazyPathIndexAbs(arena, lazy_cwd, run_index) }
|
|
1750
|
+
else
|
|
1751
|
+
.inherit;
|
|
1752
|
+
|
|
1753
|
+
const allow_skip = switch (conf_run.flags.stdio) {
|
|
1754
|
+
.check, .zig_test => conf_run.flags.skip_foreign_checks,
|
|
1755
|
+
else => false,
|
|
1756
|
+
};
|
|
1757
|
+
|
|
1758
|
+
var interp_argv: std.ArrayList([]const u8) = .empty;
|
|
1759
|
+
|
|
1760
|
+
var environ_map: std.process.Environ.Map = .init(gpa);
|
|
1761
|
+
defer environ_map.deinit();
|
|
1762
|
+
|
|
1763
|
+
// In either case we add to this mutatable data structure so that we can
|
|
1764
|
+
// tweak the environment below.
|
|
1765
|
+
if (conf_run.environ_map.value) |env_map_index| {
|
|
1766
|
+
const conf_env_map = env_map_index.get(conf);
|
|
1767
|
+
for (conf_env_map.keys.slice(conf), conf_env_map.values.slice(conf)) |k, v| {
|
|
1768
|
+
try environ_map.put(k.slice(conf), v.slice(conf));
|
|
1769
|
+
}
|
|
1770
|
+
} else {
|
|
1771
|
+
try environ_map.putAll(&graph.environ_map);
|
|
1772
|
+
}
|
|
1773
|
+
|
|
1774
|
+
// Now that we have the environ map, we might need to mutate it to insert
|
|
1775
|
+
// .dll search paths because Windows doesn't have rpaths.
|
|
1776
|
+
const arg0 = conf_run.args.slice[0].get(conf);
|
|
1777
|
+
if (arg0.producer.value) |producer_index| {
|
|
1778
|
+
const producer_step = producer_index.ptr(conf);
|
|
1779
|
+
const producer = producer_step.extended.get(conf.extra).compile;
|
|
1780
|
+
const root_module = producer.root_module.get(conf);
|
|
1781
|
+
const root_module_target = root_module.resolved_target.get(conf).?.result.get(conf);
|
|
1782
|
+
if (root_module_target.flags.os_tag == .windows) {
|
|
1783
|
+
try addPathForDynLibs(maker, arena, producer_index, &environ_map, argv[0]);
|
|
1784
|
+
}
|
|
1785
|
+
}
|
|
1786
|
+
|
|
1787
|
+
const cwd_string = switch (cwd) {
|
|
1788
|
+
.path => |p| p,
|
|
1789
|
+
.dir => unreachable,
|
|
1790
|
+
.inherit => null,
|
|
1791
|
+
};
|
|
1792
|
+
try graph.handleVerbose(cwd_string, &environ_map, argv);
|
|
1793
|
+
|
|
1794
|
+
const opt_generic_result = spawnChildAndCollect(
|
|
1795
|
+
arena,
|
|
1796
|
+
run_index,
|
|
1797
|
+
run,
|
|
1798
|
+
maker,
|
|
1799
|
+
progress_node,
|
|
1800
|
+
argv,
|
|
1801
|
+
&environ_map,
|
|
1802
|
+
has_side_effects,
|
|
1803
|
+
fuzz_context,
|
|
1804
|
+
) catch |err| term: {
|
|
1805
|
+
switch (err) {
|
|
1806
|
+
error.InvalidExe, // cpu arch mismatch
|
|
1807
|
+
error.FileNotFound, // can happen with a wrong dynamic linker path
|
|
1808
|
+
=> interpret: {
|
|
1809
|
+
const producer_index = arg0.producer.value orelse break :interpret;
|
|
1810
|
+
const producer_step = producer_index.ptr(conf);
|
|
1811
|
+
const producer = producer_step.extended.get(conf.extra).compile;
|
|
1812
|
+
switch (producer.flags3.kind) {
|
|
1813
|
+
.exe, .@"test" => {},
|
|
1814
|
+
else => break :interpret,
|
|
1815
|
+
}
|
|
1816
|
+
const root_module = producer.root_module.get(conf);
|
|
1817
|
+
const root_module_target = root_module.resolved_target.get(conf).?.result.get(conf);
|
|
1818
|
+
const other_target_query = root_module_target.unwrap(conf);
|
|
1819
|
+
const root_target = std.zig.system.resolveTargetQuery(io, other_target_query) catch unreachable;
|
|
1820
|
+
const link_libc = maker.stepByIndex(producer_index).extended.compile.is_linking_libc;
|
|
1821
|
+
|
|
1822
|
+
const host: std.Target = std.zig.system.resolveTargetQuery(io, .{}) catch |he| switch (he) {
|
|
1823
|
+
error.Canceled => |e| return e,
|
|
1824
|
+
else => builtin.target,
|
|
1825
|
+
};
|
|
1826
|
+
|
|
1827
|
+
const need_cross_libc = link_libc and root_target.os.tag == .linux and
|
|
1828
|
+
switch (producer.flags2.linkage) {
|
|
1829
|
+
.static => false,
|
|
1830
|
+
.dynamic => true,
|
|
1831
|
+
.default => root_target.isGnuLibC(),
|
|
1832
|
+
};
|
|
1833
|
+
switch (std.zig.system.getExternalExecutor(io, &root_target, .{
|
|
1834
|
+
.host_cpu_arch = host.cpu.arch,
|
|
1835
|
+
.host_os_tag = host.os.tag,
|
|
1836
|
+
.qemu_fixes_dl = need_cross_libc and graph.libc_runtimes_dir != null,
|
|
1837
|
+
.link_libc = link_libc,
|
|
1838
|
+
})) {
|
|
1839
|
+
.native, .rosetta => {
|
|
1840
|
+
if (allow_skip) return error.MakeSkipped;
|
|
1841
|
+
break :interpret;
|
|
1842
|
+
},
|
|
1843
|
+
.wine => |bin_name| {
|
|
1844
|
+
if (graph.enable_wine) {
|
|
1845
|
+
try interp_argv.ensureUnusedCapacity(arena, 1 + argv.len);
|
|
1846
|
+
interp_argv.appendAssumeCapacity(bin_name);
|
|
1847
|
+
interp_argv.appendSliceAssumeCapacity(argv);
|
|
1848
|
+
|
|
1849
|
+
// Wine's excessive stderr logging is only situationally helpful. Disable it by default, but
|
|
1850
|
+
// allow the user to override it (e.g. with `WINEDEBUG=err+all`) if desired.
|
|
1851
|
+
if (environ_map.get("WINEDEBUG") == null) {
|
|
1852
|
+
try environ_map.put("WINEDEBUG", "-all");
|
|
1853
|
+
}
|
|
1854
|
+
} else {
|
|
1855
|
+
return failForeign(arena, &conf_run, maker, run_index, "-fwine", argv[0], &root_target, &host);
|
|
1856
|
+
}
|
|
1857
|
+
},
|
|
1858
|
+
.qemu => |bin_name| {
|
|
1859
|
+
if (graph.enable_qemu) {
|
|
1860
|
+
try interp_argv.ensureUnusedCapacity(arena, 3 + argv.len);
|
|
1861
|
+
interp_argv.appendAssumeCapacity(bin_name);
|
|
1862
|
+
|
|
1863
|
+
if (need_cross_libc) {
|
|
1864
|
+
if (graph.libc_runtimes_dir) |dir| {
|
|
1865
|
+
interp_argv.appendAssumeCapacity("-L");
|
|
1866
|
+
interp_argv.appendAssumeCapacity(try Dir.path.join(arena, &.{
|
|
1867
|
+
dir,
|
|
1868
|
+
try if (root_target.isGnuLibC()) std.zig.target.glibcRuntimeTriple(
|
|
1869
|
+
arena,
|
|
1870
|
+
root_target.cpu.arch,
|
|
1871
|
+
root_target.os.tag,
|
|
1872
|
+
root_target.abi,
|
|
1873
|
+
) else if (root_target.isMuslLibC()) std.zig.target.muslRuntimeTriple(
|
|
1874
|
+
arena,
|
|
1875
|
+
root_target.cpu.arch,
|
|
1876
|
+
root_target.abi,
|
|
1877
|
+
) else unreachable,
|
|
1878
|
+
}));
|
|
1879
|
+
} else return failForeign(arena, &conf_run, maker, run_index, "--libc-runtimes", argv[0], &root_target, &host);
|
|
1880
|
+
}
|
|
1881
|
+
|
|
1882
|
+
interp_argv.appendSliceAssumeCapacity(argv);
|
|
1883
|
+
} else return failForeign(arena, &conf_run, maker, run_index, "-fqemu", argv[0], &root_target, &host);
|
|
1884
|
+
},
|
|
1885
|
+
.darling => |bin_name| {
|
|
1886
|
+
if (graph.enable_darling) {
|
|
1887
|
+
try interp_argv.ensureUnusedCapacity(arena, 1 + argv.len);
|
|
1888
|
+
interp_argv.appendAssumeCapacity(bin_name);
|
|
1889
|
+
interp_argv.appendSliceAssumeCapacity(argv);
|
|
1890
|
+
} else {
|
|
1891
|
+
return failForeign(arena, &conf_run, maker, run_index, "-fdarling", argv[0], &root_target, &host);
|
|
1892
|
+
}
|
|
1893
|
+
},
|
|
1894
|
+
.wasmtime => |bin_name| {
|
|
1895
|
+
if (graph.enable_wasmtime) {
|
|
1896
|
+
try interp_argv.ensureUnusedCapacity(arena, 3 + argv.len);
|
|
1897
|
+
interp_argv.appendAssumeCapacity(bin_name);
|
|
1898
|
+
interp_argv.appendAssumeCapacity("--dir=.");
|
|
1899
|
+
// Wasmtime doeesn't inherit environment variables from the parent process
|
|
1900
|
+
// by default. '-S inherit-env' was added in Wasmtime version 20.
|
|
1901
|
+
interp_argv.appendAssumeCapacity("-Sinherit-env");
|
|
1902
|
+
interp_argv.appendSliceAssumeCapacity(argv);
|
|
1903
|
+
} else {
|
|
1904
|
+
return failForeign(arena, &conf_run, maker, run_index, "-fwasmtime", argv[0], &root_target, &host);
|
|
1905
|
+
}
|
|
1906
|
+
},
|
|
1907
|
+
.bad_dl => |foreign_dl| {
|
|
1908
|
+
if (allow_skip) return error.MakeSkipped;
|
|
1909
|
+
|
|
1910
|
+
const host_dl = host.dynamic_linker.get() orelse "(none)";
|
|
1911
|
+
|
|
1912
|
+
return step.fail(maker,
|
|
1913
|
+
\\the host system is unable to execute binaries from the target
|
|
1914
|
+
\\ because the host dynamic linker is '{s}',
|
|
1915
|
+
\\ while the target dynamic linker is '{s}'.
|
|
1916
|
+
\\ consider setting the dynamic linker or enabling skip_foreign_checks in the Run step
|
|
1917
|
+
, .{ host_dl, foreign_dl });
|
|
1918
|
+
},
|
|
1919
|
+
.bad_os_or_cpu => {
|
|
1920
|
+
if (allow_skip) return error.MakeSkipped;
|
|
1921
|
+
|
|
1922
|
+
const host_name = try host.zigTriple(arena);
|
|
1923
|
+
const foreign_name = try root_target.zigTriple(arena);
|
|
1924
|
+
|
|
1925
|
+
return step.fail(maker, "the host system ({s}) is unable to execute binaries from the target ({s})", .{
|
|
1926
|
+
host_name, foreign_name,
|
|
1927
|
+
});
|
|
1928
|
+
},
|
|
1929
|
+
}
|
|
1930
|
+
|
|
1931
|
+
step.clearFailedCommand(gpa);
|
|
1932
|
+
try graph.handleVerbose(cwd_string, &environ_map, interp_argv.items);
|
|
1933
|
+
|
|
1934
|
+
break :term spawnChildAndCollect(
|
|
1935
|
+
arena,
|
|
1936
|
+
run_index,
|
|
1937
|
+
run,
|
|
1938
|
+
maker,
|
|
1939
|
+
progress_node,
|
|
1940
|
+
interp_argv.items,
|
|
1941
|
+
&environ_map,
|
|
1942
|
+
has_side_effects,
|
|
1943
|
+
fuzz_context,
|
|
1944
|
+
) catch |e| {
|
|
1945
|
+
if (!conf_run.flags.failing_to_execute_foreign_is_an_error) return error.MakeSkipped;
|
|
1946
|
+
if (e == error.MakeFailed) return error.MakeFailed; // error already reported
|
|
1947
|
+
return step.fail(maker, "unable to spawn interpreter {s}: {t}", .{ interp_argv.items[0], e });
|
|
1948
|
+
};
|
|
1949
|
+
},
|
|
1950
|
+
error.MakeFailed, error.OutOfMemory, error.Canceled => |e| return e,
|
|
1951
|
+
else => {},
|
|
1952
|
+
}
|
|
1953
|
+
return step.fail(maker, "failed to spawn and capture stdio from {s}: {t}", .{ argv[0], err });
|
|
1954
|
+
};
|
|
1955
|
+
|
|
1956
|
+
const generic_result = opt_generic_result orelse {
|
|
1957
|
+
assert(conf_run.flags.stdio == .zig_test);
|
|
1958
|
+
// Specific errors have already been reported, and test results are populated. All we need
|
|
1959
|
+
// to do is report step failure if any test failed.
|
|
1960
|
+
if (!step.test_results.isSuccess()) return error.MakeFailed;
|
|
1961
|
+
return;
|
|
1962
|
+
};
|
|
1963
|
+
|
|
1964
|
+
assert(fuzz_context == null);
|
|
1965
|
+
assert(conf_run.flags.stdio != .zig_test);
|
|
1966
|
+
|
|
1967
|
+
// Capture stdout and stderr to GeneratedFile objects.
|
|
1968
|
+
const Stream = struct {
|
|
1969
|
+
captured: ?Configuration.Step.Run.CapturedStream,
|
|
1970
|
+
bytes: ?[]const u8,
|
|
1971
|
+
trim_whitespace: Configuration.Step.Run.TrimWhitespace,
|
|
1972
|
+
};
|
|
1973
|
+
for (&[_]Stream{
|
|
1974
|
+
.{
|
|
1975
|
+
.captured = conf_run.captured_stdout.value,
|
|
1976
|
+
.bytes = generic_result.stdout,
|
|
1977
|
+
.trim_whitespace = conf_run.flags.stdout_trim_whitespace,
|
|
1978
|
+
},
|
|
1979
|
+
.{
|
|
1980
|
+
.captured = conf_run.captured_stderr.value,
|
|
1981
|
+
.bytes = generic_result.stderr,
|
|
1982
|
+
.trim_whitespace = conf_run.flags.stderr_trim_whitespace,
|
|
1983
|
+
},
|
|
1984
|
+
}) |*stream| {
|
|
1985
|
+
if (stream.captured) |captured| {
|
|
1986
|
+
const output_path: Path = .{
|
|
1987
|
+
.root_dir = cache_root,
|
|
1988
|
+
.sub_path = try Dir.path.join(graph.arena, &.{
|
|
1989
|
+
output_dir_path, captured.basename.slice(conf),
|
|
1990
|
+
}),
|
|
1991
|
+
};
|
|
1992
|
+
maker.generatedPath(captured.generated_file).* = output_path;
|
|
1993
|
+
|
|
1994
|
+
const sub_path_parent = output_path.dirname().?;
|
|
1995
|
+
sub_path_parent.root_dir.handle.createDirPath(io, sub_path_parent.sub_path) catch |err|
|
|
1996
|
+
return step.fail(maker, "unable to make path {f}: {t}", .{ sub_path_parent, err });
|
|
1997
|
+
|
|
1998
|
+
const data = switch (stream.trim_whitespace) {
|
|
1999
|
+
.none => stream.bytes.?,
|
|
2000
|
+
.all => mem.trim(u8, stream.bytes.?, &std.ascii.whitespace),
|
|
2001
|
+
.leading => mem.trimStart(u8, stream.bytes.?, &std.ascii.whitespace),
|
|
2002
|
+
.trailing => mem.trimEnd(u8, stream.bytes.?, &std.ascii.whitespace),
|
|
2003
|
+
};
|
|
2004
|
+
output_path.root_dir.handle.writeFile(io, .{
|
|
2005
|
+
.sub_path = output_path.sub_path,
|
|
2006
|
+
.data = data,
|
|
2007
|
+
}) catch |err| return step.fail(maker, "unable to write file {f}: {t}", .{ output_path, err });
|
|
2008
|
+
}
|
|
2009
|
+
}
|
|
2010
|
+
|
|
2011
|
+
switch (conf_run.flags.stdio) {
|
|
2012
|
+
.zig_test => unreachable,
|
|
2013
|
+
.check => {
|
|
2014
|
+
if (conf_run.expect_stderr_exact.value) |bytes| {
|
|
2015
|
+
const expected_bytes = bytes.slice(conf);
|
|
2016
|
+
if (!mem.eql(u8, expected_bytes, generic_result.stderr.?)) {
|
|
2017
|
+
return step.fail(maker,
|
|
2018
|
+
\\========= expected this stderr: =========
|
|
2019
|
+
\\{s}
|
|
2020
|
+
\\========= but found: ====================
|
|
2021
|
+
\\{s}
|
|
2022
|
+
, .{
|
|
2023
|
+
expected_bytes,
|
|
2024
|
+
generic_result.stderr.?,
|
|
2025
|
+
});
|
|
2026
|
+
}
|
|
2027
|
+
}
|
|
2028
|
+
if (conf_run.expect_stdout_exact.value) |bytes| {
|
|
2029
|
+
const expected_bytes = bytes.slice(conf);
|
|
2030
|
+
if (!mem.eql(u8, expected_bytes, generic_result.stdout.?)) {
|
|
2031
|
+
return step.fail(maker,
|
|
2032
|
+
\\========= expected this stdout: =========
|
|
2033
|
+
\\{s}
|
|
2034
|
+
\\========= but found: ====================
|
|
2035
|
+
\\{s}
|
|
2036
|
+
, .{
|
|
2037
|
+
expected_bytes,
|
|
2038
|
+
generic_result.stdout.?,
|
|
2039
|
+
});
|
|
2040
|
+
}
|
|
2041
|
+
}
|
|
2042
|
+
for (conf_run.expect_stderr_match.slice) |bytes| {
|
|
2043
|
+
const match = bytes.slice(conf);
|
|
2044
|
+
if (mem.find(u8, generic_result.stderr.?, match) == null) {
|
|
2045
|
+
return step.fail(maker,
|
|
2046
|
+
\\========= expected to find in stderr: =========
|
|
2047
|
+
\\{s}
|
|
2048
|
+
\\========= but stderr does not contain it: =====
|
|
2049
|
+
\\{s}
|
|
2050
|
+
, .{
|
|
2051
|
+
match,
|
|
2052
|
+
generic_result.stderr.?,
|
|
2053
|
+
});
|
|
2054
|
+
}
|
|
2055
|
+
}
|
|
2056
|
+
for (conf_run.expect_stdout_match.slice) |bytes| {
|
|
2057
|
+
const match = bytes.slice(conf);
|
|
2058
|
+
if (mem.find(u8, generic_result.stdout.?, match) == null) {
|
|
2059
|
+
return step.fail(maker,
|
|
2060
|
+
\\========= expected to find in stdout: =========
|
|
2061
|
+
\\{s}
|
|
2062
|
+
\\========= but stdout does not contain it: =====
|
|
2063
|
+
\\{s}
|
|
2064
|
+
, .{
|
|
2065
|
+
match,
|
|
2066
|
+
generic_result.stdout.?,
|
|
2067
|
+
});
|
|
2068
|
+
}
|
|
2069
|
+
}
|
|
2070
|
+
if (conf_run.expect_term_value.value) |expected_term_value| {
|
|
2071
|
+
const expected_term: process.Child.Term = switch (conf_run.flags2.expect_term_status) {
|
|
2072
|
+
.exited => .{ .exited = @intCast(expected_term_value) },
|
|
2073
|
+
.signal => .{ .signal = @enumFromInt(expected_term_value) },
|
|
2074
|
+
.stopped => .{ .stopped = @enumFromInt(expected_term_value) },
|
|
2075
|
+
.unknown => .{ .unknown = expected_term_value },
|
|
2076
|
+
};
|
|
2077
|
+
if (!termMatches(expected_term, generic_result.term)) {
|
|
2078
|
+
return step.fail(maker, "process {f} (expected {f})", .{
|
|
2079
|
+
fmtTerm(generic_result.term),
|
|
2080
|
+
fmtTerm(expected_term),
|
|
2081
|
+
});
|
|
2082
|
+
}
|
|
2083
|
+
}
|
|
2084
|
+
},
|
|
2085
|
+
else => {
|
|
2086
|
+
// On failure, report captured stderr like normal standard error output.
|
|
2087
|
+
const bad_exit = switch (generic_result.term) {
|
|
2088
|
+
.exited => |code| code != 0,
|
|
2089
|
+
.signal, .stopped, .unknown => true,
|
|
2090
|
+
};
|
|
2091
|
+
if (bad_exit) {
|
|
2092
|
+
if (generic_result.stderr) |bytes| {
|
|
2093
|
+
step.result_stderr = bytes;
|
|
2094
|
+
}
|
|
2095
|
+
}
|
|
2096
|
+
|
|
2097
|
+
try step.handleChildProcessTerm(maker, generic_result.term);
|
|
2098
|
+
},
|
|
2099
|
+
}
|
|
2100
|
+
}
|
|
2101
|
+
|
|
2102
|
+
const EvalGenericResult = struct {
|
|
2103
|
+
term: process.Child.Term,
|
|
2104
|
+
stdout: ?[]const u8,
|
|
2105
|
+
stderr: ?[]const u8,
|
|
2106
|
+
};
|
|
2107
|
+
|
|
2108
|
+
fn spawnChildAndCollect(
|
|
2109
|
+
arena: Allocator,
|
|
2110
|
+
run_index: Configuration.Step.Index,
|
|
2111
|
+
run: *Run,
|
|
2112
|
+
maker: *Maker,
|
|
2113
|
+
progress_node: std.Progress.Node,
|
|
2114
|
+
argv: []const []const u8,
|
|
2115
|
+
environ_map: *EnvMap,
|
|
2116
|
+
has_side_effects: bool,
|
|
2117
|
+
fuzz_context: ?FuzzContext,
|
|
2118
|
+
) !?EvalGenericResult {
|
|
2119
|
+
const step = maker.stepByIndex(run_index);
|
|
2120
|
+
const graph = maker.graph;
|
|
2121
|
+
const io = graph.io;
|
|
2122
|
+
const gpa = maker.gpa;
|
|
2123
|
+
const conf = &maker.scanned_config.configuration;
|
|
2124
|
+
const conf_step = run_index.ptr(conf);
|
|
2125
|
+
const conf_run = conf_step.extended.get(conf.extra).run;
|
|
2126
|
+
|
|
2127
|
+
if (fuzz_context != null) {
|
|
2128
|
+
assert(!has_side_effects);
|
|
2129
|
+
assert(conf_run.flags.stdio == .zig_test);
|
|
2130
|
+
}
|
|
2131
|
+
|
|
2132
|
+
const child_cwd: process.Child.Cwd = if (conf_run.cwd.value) |lazy_cwd|
|
|
2133
|
+
.{ .path = try maker.resolveLazyPathIndexAbs(arena, lazy_cwd, run_index) }
|
|
2134
|
+
else
|
|
2135
|
+
.inherit;
|
|
2136
|
+
|
|
2137
|
+
// If an error occurs, it's caused by this command:
|
|
2138
|
+
step.clearFailedCommand(gpa);
|
|
2139
|
+
step.result_failed_command = try std.zig.allocPrintCmd(gpa, argv, .{
|
|
2140
|
+
.cwd = switch (child_cwd) {
|
|
2141
|
+
.path => |p| p,
|
|
2142
|
+
.dir => unreachable,
|
|
2143
|
+
.inherit => null,
|
|
2144
|
+
},
|
|
2145
|
+
.child_env = environ_map,
|
|
2146
|
+
.parent_env = &graph.environ_map,
|
|
2147
|
+
});
|
|
2148
|
+
|
|
2149
|
+
try step.handleChildProcUnsupported(maker);
|
|
2150
|
+
|
|
2151
|
+
var spawn_options: process.SpawnOptions = .{
|
|
2152
|
+
.argv = argv,
|
|
2153
|
+
.cwd = child_cwd,
|
|
2154
|
+
.environ_map = environ_map,
|
|
2155
|
+
.request_resource_usage_statistics = true,
|
|
2156
|
+
.stdin = if (conf_run.stdin.u != .none) s: {
|
|
2157
|
+
assert(conf_run.flags.stdio != .inherit);
|
|
2158
|
+
break :s .pipe;
|
|
2159
|
+
} else switch (conf_run.flags.stdio) {
|
|
2160
|
+
.infer_from_args => if (has_side_effects) .inherit else .ignore,
|
|
2161
|
+
.inherit => .inherit,
|
|
2162
|
+
.check => .ignore,
|
|
2163
|
+
.zig_test => .pipe,
|
|
2164
|
+
},
|
|
2165
|
+
.stdout = if (conf_run.captured_stdout.value != null) .pipe else switch (conf_run.flags.stdio) {
|
|
2166
|
+
.infer_from_args => if (has_side_effects) .inherit else .ignore,
|
|
2167
|
+
.inherit => .inherit,
|
|
2168
|
+
.check => if (checksContainStdout(&conf_run)) .pipe else .ignore,
|
|
2169
|
+
.zig_test => .pipe,
|
|
2170
|
+
},
|
|
2171
|
+
.stderr = if (conf_run.captured_stderr.value != null) .pipe else switch (conf_run.flags.stdio) {
|
|
2172
|
+
.infer_from_args => if (has_side_effects) .inherit else .pipe,
|
|
2173
|
+
.inherit => .inherit,
|
|
2174
|
+
.check => .pipe,
|
|
2175
|
+
.zig_test => .pipe,
|
|
2176
|
+
},
|
|
2177
|
+
};
|
|
2178
|
+
|
|
2179
|
+
if (conf_run.flags.stdio == .zig_test) {
|
|
2180
|
+
const started: Io.Clock.Timestamp = .now(io, .awake);
|
|
2181
|
+
const result = evalZigTest(graph.arena, run, run_index, maker, progress_node, spawn_options, fuzz_context) catch |err| switch (err) {
|
|
2182
|
+
error.Canceled => |e| return e,
|
|
2183
|
+
else => |e| e,
|
|
2184
|
+
};
|
|
2185
|
+
step.result_duration_ns = @intCast(started.untilNow(io).raw.nanoseconds);
|
|
2186
|
+
try result;
|
|
2187
|
+
return null;
|
|
2188
|
+
} else {
|
|
2189
|
+
const inherit = spawn_options.stdout == .inherit or spawn_options.stderr == .inherit;
|
|
2190
|
+
if (!conf_run.flags.disable_zig_progress and !inherit) {
|
|
2191
|
+
spawn_options.progress_node = progress_node;
|
|
2192
|
+
}
|
|
2193
|
+
const terminal_mode: Io.Terminal.Mode = if (inherit) m: {
|
|
2194
|
+
const stderr = try io.lockStderr(&.{}, graph.stderr_mode);
|
|
2195
|
+
break :m stderr.terminal_mode;
|
|
2196
|
+
} else .no_color;
|
|
2197
|
+
defer if (inherit) io.unlockStderr();
|
|
2198
|
+
try setColorEnvironmentVariables(&conf_run, environ_map, terminal_mode);
|
|
2199
|
+
|
|
2200
|
+
const started: Io.Clock.Timestamp = .now(io, .awake);
|
|
2201
|
+
const result = evalGeneric(graph.arena, run_index, maker, spawn_options) catch |err| switch (err) {
|
|
2202
|
+
error.Canceled => |e| return e,
|
|
2203
|
+
else => |e| e,
|
|
2204
|
+
};
|
|
2205
|
+
step.result_duration_ns = @intCast(started.untilNow(io).raw.nanoseconds);
|
|
2206
|
+
return try result;
|
|
2207
|
+
}
|
|
2208
|
+
}
|
|
2209
|
+
|
|
2210
|
+
fn termMatches(expected: ?process.Child.Term, actual: process.Child.Term) bool {
|
|
2211
|
+
return if (expected) |e| switch (e) {
|
|
2212
|
+
.exited => |expected_code| switch (actual) {
|
|
2213
|
+
.exited => |actual_code| expected_code == actual_code,
|
|
2214
|
+
else => false,
|
|
2215
|
+
},
|
|
2216
|
+
.signal => |expected_sig| switch (actual) {
|
|
2217
|
+
.signal => |actual_sig| expected_sig == actual_sig,
|
|
2218
|
+
else => false,
|
|
2219
|
+
},
|
|
2220
|
+
.stopped => |expected_sig| switch (actual) {
|
|
2221
|
+
.stopped => |actual_sig| expected_sig == actual_sig,
|
|
2222
|
+
else => false,
|
|
2223
|
+
},
|
|
2224
|
+
.unknown => |expected_code| switch (actual) {
|
|
2225
|
+
.unknown => |actual_code| expected_code == actual_code,
|
|
2226
|
+
else => false,
|
|
2227
|
+
},
|
|
2228
|
+
} else switch (actual) {
|
|
2229
|
+
.exited => true,
|
|
2230
|
+
else => false,
|
|
2231
|
+
};
|
|
2232
|
+
}
|
|
2233
|
+
|
|
2234
|
+
fn setColorEnvironmentVariables(
|
|
2235
|
+
conf_run: *const Configuration.Step.Run,
|
|
2236
|
+
environ_map: *EnvMap,
|
|
2237
|
+
terminal_mode: Io.Terminal.Mode,
|
|
2238
|
+
) !void {
|
|
2239
|
+
color: switch (conf_run.flags.color) {
|
|
2240
|
+
.manual => {},
|
|
2241
|
+
.enable => {
|
|
2242
|
+
try environ_map.put("CLICOLOR_FORCE", "1");
|
|
2243
|
+
_ = environ_map.swapRemove("NO_COLOR");
|
|
2244
|
+
},
|
|
2245
|
+
.disable => {
|
|
2246
|
+
try environ_map.put("NO_COLOR", "1");
|
|
2247
|
+
_ = environ_map.swapRemove("CLICOLOR_FORCE");
|
|
2248
|
+
},
|
|
2249
|
+
.inherit => switch (terminal_mode) {
|
|
2250
|
+
.no_color, .windows_api => continue :color .disable,
|
|
2251
|
+
.escape_codes => continue :color .enable,
|
|
2252
|
+
},
|
|
2253
|
+
.auto => {
|
|
2254
|
+
const capture_stderr = conf_run.captured_stderr.value != null or switch (conf_run.flags.stdio) {
|
|
2255
|
+
.check => checksContainStderr(conf_run),
|
|
2256
|
+
.infer_from_args, .inherit, .zig_test => false,
|
|
2257
|
+
};
|
|
2258
|
+
if (capture_stderr) {
|
|
2259
|
+
continue :color .disable;
|
|
2260
|
+
} else {
|
|
2261
|
+
continue :color .inherit;
|
|
2262
|
+
}
|
|
2263
|
+
},
|
|
2264
|
+
}
|
|
2265
|
+
}
|
|
2266
|
+
|
|
2267
|
+
fn checksContainStdout(conf_run: *const Configuration.Step.Run) bool {
|
|
2268
|
+
return conf_run.expect_stdout_exact.value != null or conf_run.expect_stdout_match.slice.len != 0;
|
|
2269
|
+
}
|
|
2270
|
+
|
|
2271
|
+
fn checksContainStderr(conf_run: *const Configuration.Step.Run) bool {
|
|
2272
|
+
return conf_run.expect_stderr_exact.value != null or conf_run.expect_stderr_match.slice.len != 0;
|
|
2273
|
+
}
|
|
2274
|
+
|
|
2275
|
+
/// If `path` is cwd-relative, make it relative to the cwd of the child instead.
|
|
2276
|
+
///
|
|
2277
|
+
/// Whenever a path is included in the argv of a child, it should be put through this function first
|
|
2278
|
+
/// to make sure the child doesn't see paths relative to a cwd other than its own.
|
|
2279
|
+
fn convertPathArg(arena: Allocator, run_index: Configuration.Step.Index, maker: *Maker, path: Path) ![]const u8 {
|
|
2280
|
+
const conf = &maker.scanned_config.configuration;
|
|
2281
|
+
const conf_step = run_index.ptr(conf);
|
|
2282
|
+
const conf_run = conf_step.extended.get(conf.extra).run;
|
|
2283
|
+
const graph = maker.graph;
|
|
2284
|
+
|
|
2285
|
+
const path_str = try path.toString(arena);
|
|
2286
|
+
if (Dir.path.isAbsolute(path_str)) {
|
|
2287
|
+
// Absolute paths don't need changing.
|
|
2288
|
+
return path_str;
|
|
2289
|
+
}
|
|
2290
|
+
const child_cwd_rel: []const u8 = rel: {
|
|
2291
|
+
const child_lazy_cwd = conf_run.cwd.value orelse break :rel path_str;
|
|
2292
|
+
const child_cwd = try maker.resolveLazyPathIndexAbs(arena, child_lazy_cwd, run_index);
|
|
2293
|
+
// Convert it from relative to *our* cwd, to relative to the *child's* cwd.
|
|
2294
|
+
break :rel try Dir.path.relative(arena, graph.cache.cwd, &graph.environ_map, child_cwd, path_str);
|
|
2295
|
+
};
|
|
2296
|
+
// Not every path can be made relative, e.g. if the path and the child cwd are on different
|
|
2297
|
+
// disk designators on Windows. In that case, `relative` will return an absolute path which we can
|
|
2298
|
+
// just return.
|
|
2299
|
+
if (Dir.path.isAbsolute(child_cwd_rel)) return child_cwd_rel;
|
|
2300
|
+
|
|
2301
|
+
// We're not done yet. In some cases this path must be prefixed with './':
|
|
2302
|
+
// * On POSIX, the executable name cannot be a single component like 'foo'
|
|
2303
|
+
// * Some executables might treat a leading '-' like a flag, which we must avoid
|
|
2304
|
+
// There's no harm in it, so just *always* apply this prefix.
|
|
2305
|
+
return Dir.path.join(arena, &.{ ".", child_cwd_rel });
|
|
2306
|
+
}
|
|
2307
|
+
|
|
2308
|
+
fn addPathForDynLibs(
|
|
2309
|
+
maker: *Maker,
|
|
2310
|
+
arena: Allocator,
|
|
2311
|
+
artifact: Configuration.Step.Index,
|
|
2312
|
+
environ_map: *process.Environ.Map,
|
|
2313
|
+
argv0: []const u8,
|
|
2314
|
+
) !void {
|
|
2315
|
+
const conf = &maker.scanned_config.configuration;
|
|
2316
|
+
const graph = maker.graph;
|
|
2317
|
+
const use_wine = graph.enable_wine and builtin.os.tag != .windows and std.ascii.endsWithIgnoreCase(argv0, ".exe");
|
|
2318
|
+
const path_key = if (use_wine) "WINEPATH" else "PATH";
|
|
2319
|
+
const path_delimiter: u8 = if (builtin.os.tag == .windows or use_wine)
|
|
2320
|
+
Dir.path.delimiter_windows
|
|
2321
|
+
else
|
|
2322
|
+
Dir.path.delimiter;
|
|
2323
|
+
|
|
2324
|
+
var module_graph: Step.Compile.ModuleGraph = .empty;
|
|
2325
|
+
const compile_deps = try Step.Compile.getCompileDependencies(arena, &module_graph, conf, artifact, true);
|
|
2326
|
+
|
|
2327
|
+
for (compile_deps) |dep_index| {
|
|
2328
|
+
const conf_comp_step = dep_index.ptr(conf);
|
|
2329
|
+
const conf_comp = conf_comp_step.extended.get(conf.extra).compile;
|
|
2330
|
+
const root_module = conf_comp.root_module.get(conf);
|
|
2331
|
+
const target = root_module.resolved_target.get(conf).?.result.get(conf);
|
|
2332
|
+
if (target.flags.os_tag == .windows and conf_comp.isDynamicLibrary()) {
|
|
2333
|
+
const dll_path = try maker.generatedPath(conf_comp.generated_bin.value.?).toString(arena);
|
|
2334
|
+
const search_path = Dir.path.dirname(dll_path).?;
|
|
2335
|
+
if (environ_map.get(path_key)) |prev_path| {
|
|
2336
|
+
const new_path = try allocPrint(arena, "{s}{c}{s}", .{ prev_path, path_delimiter, search_path });
|
|
2337
|
+
try environ_map.put(path_key, new_path);
|
|
2338
|
+
} else {
|
|
2339
|
+
try environ_map.put(path_key, search_path);
|
|
2340
|
+
}
|
|
2341
|
+
}
|
|
2342
|
+
}
|
|
2343
|
+
}
|
|
2344
|
+
|
|
2345
|
+
fn failForeign(
|
|
2346
|
+
arena: Allocator,
|
|
2347
|
+
conf_run: *const Configuration.Step.Run,
|
|
2348
|
+
maker: *Maker,
|
|
2349
|
+
step_index: Configuration.Step.Index,
|
|
2350
|
+
suggested_flag: []const u8,
|
|
2351
|
+
argv0: []const u8,
|
|
2352
|
+
artifact_target: *const std.Target,
|
|
2353
|
+
host_target: *const std.Target,
|
|
2354
|
+
) Step.ExtendedMakeError {
|
|
2355
|
+
const step = maker.stepByIndex(step_index);
|
|
2356
|
+
switch (conf_run.flags.stdio) {
|
|
2357
|
+
.check, .zig_test => {
|
|
2358
|
+
if (conf_run.flags.skip_foreign_checks) return error.MakeSkipped;
|
|
2359
|
+
|
|
2360
|
+
const host_name = try host_target.zigTriple(arena);
|
|
2361
|
+
const foreign_name = try artifact_target.zigTriple(arena);
|
|
2362
|
+
|
|
2363
|
+
return step.fail(maker,
|
|
2364
|
+
\\unable to spawn foreign binary '{s}' ({s}) on host system ({s})
|
|
2365
|
+
\\ consider using {s} or enabling skip_foreign_checks in the Run step
|
|
2366
|
+
, .{ argv0, foreign_name, host_name, suggested_flag });
|
|
2367
|
+
},
|
|
2368
|
+
else => {
|
|
2369
|
+
return step.fail(maker, "unable to spawn foreign binary '{s}'", .{argv0});
|
|
2370
|
+
},
|
|
2371
|
+
}
|
|
2372
|
+
}
|