@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
package/std/Build/Step/Run.zig
CHANGED
|
@@ -11,8 +11,9 @@ const process = std.process;
|
|
|
11
11
|
const EnvMap = std.process.Environ.Map;
|
|
12
12
|
const assert = std.debug.assert;
|
|
13
13
|
const Path = std.Build.Cache.Path;
|
|
14
|
+
const Configuration = std.Build.Configuration;
|
|
14
15
|
|
|
15
|
-
pub const
|
|
16
|
+
pub const base_tag: Step.Tag = .run;
|
|
16
17
|
|
|
17
18
|
step: Step,
|
|
18
19
|
|
|
@@ -84,36 +85,13 @@ stdio_limit: std.Io.Limit,
|
|
|
84
85
|
captured_stdout: ?*CapturedStdIo,
|
|
85
86
|
captured_stderr: ?*CapturedStdIo,
|
|
86
87
|
|
|
87
|
-
dep_output_file: ?*Output,
|
|
88
|
-
|
|
89
88
|
has_side_effects: bool,
|
|
90
|
-
|
|
91
|
-
/// If this is a Zig unit test binary, this tracks the names of the unit
|
|
92
|
-
/// tests that are also fuzz tests. Indexes cannot be used as they may
|
|
93
|
-
/// change between reruns.
|
|
94
|
-
fuzz_tests: std.ArrayList([]const u8),
|
|
95
|
-
cached_test_metadata: ?CachedTestMetadata = null,
|
|
96
|
-
|
|
97
|
-
/// Populated during the fuzz phase if this run step corresponds to a unit test
|
|
98
|
-
/// executable that contains fuzz tests.
|
|
99
|
-
rebuilt_executable: ?Path,
|
|
89
|
+
test_runner_mode: bool = false,
|
|
100
90
|
|
|
101
91
|
/// If this Run step was produced by a Compile step, it is tracked here.
|
|
102
92
|
producer: ?*Step.Compile,
|
|
103
93
|
|
|
104
|
-
pub const Color =
|
|
105
|
-
/// `CLICOLOR_FORCE` is set, and `NO_COLOR` is unset.
|
|
106
|
-
enable,
|
|
107
|
-
/// `NO_COLOR` is set, and `CLICOLOR_FORCE` is unset.
|
|
108
|
-
disable,
|
|
109
|
-
/// If the build runner is using color, equivalent to `.enable`. Otherwise, equivalent to `.disable`.
|
|
110
|
-
inherit,
|
|
111
|
-
/// If stderr is captured or checked, equivalent to `.disable`. Otherwise, equivalent to `.inherit`.
|
|
112
|
-
auto,
|
|
113
|
-
/// The build runner does not modify the `CLICOLOR_FORCE` or `NO_COLOR` environment variables.
|
|
114
|
-
/// They are treated like normal variables, so can be controlled through `setEnvironmentVariable`.
|
|
115
|
-
manual,
|
|
116
|
-
};
|
|
94
|
+
pub const Color = std.Build.Configuration.Step.Run.Color;
|
|
117
95
|
|
|
118
96
|
pub const StdIn = union(enum) {
|
|
119
97
|
none,
|
|
@@ -159,9 +137,12 @@ pub const Arg = union(enum) {
|
|
|
159
137
|
lazy_path: PrefixedLazyPath,
|
|
160
138
|
decorated_directory: DecoratedLazyPath,
|
|
161
139
|
file_content: PrefixedLazyPath,
|
|
162
|
-
bytes: []u8,
|
|
140
|
+
bytes: []const u8,
|
|
163
141
|
output_file: *Output,
|
|
142
|
+
output_file_dep: *Output,
|
|
164
143
|
output_directory: *Output,
|
|
144
|
+
/// The arguments passed after "--" on the "zig build" CLI.
|
|
145
|
+
passthru,
|
|
165
146
|
};
|
|
166
147
|
|
|
167
148
|
pub const PrefixedArtifact = struct {
|
|
@@ -181,7 +162,7 @@ pub const DecoratedLazyPath = struct {
|
|
|
181
162
|
};
|
|
182
163
|
|
|
183
164
|
pub const Output = struct {
|
|
184
|
-
generated_file:
|
|
165
|
+
generated_file: Configuration.GeneratedFileIndex,
|
|
185
166
|
prefix: []const u8,
|
|
186
167
|
basename: []const u8,
|
|
187
168
|
};
|
|
@@ -197,22 +178,16 @@ pub const CapturedStdIo = struct {
|
|
|
197
178
|
trim_whitespace: TrimWhitespace = .none,
|
|
198
179
|
};
|
|
199
180
|
|
|
200
|
-
pub const TrimWhitespace =
|
|
201
|
-
none,
|
|
202
|
-
all,
|
|
203
|
-
leading,
|
|
204
|
-
trailing,
|
|
205
|
-
};
|
|
181
|
+
pub const TrimWhitespace = std.Build.Configuration.Step.Run.TrimWhitespace;
|
|
206
182
|
};
|
|
207
183
|
|
|
208
184
|
pub fn create(owner: *std.Build, name: []const u8) *Run {
|
|
209
185
|
const run = owner.allocator.create(Run) catch @panic("OOM");
|
|
210
186
|
run.* = .{
|
|
211
187
|
.step = .init(.{
|
|
212
|
-
.
|
|
188
|
+
.tag = base_tag,
|
|
213
189
|
.name = name,
|
|
214
190
|
.owner = owner,
|
|
215
|
-
.makeFn = make,
|
|
216
191
|
}),
|
|
217
192
|
.argv = .empty,
|
|
218
193
|
.cwd = null,
|
|
@@ -227,10 +202,7 @@ pub fn create(owner: *std.Build, name: []const u8) *Run {
|
|
|
227
202
|
.stdio_limit = .unlimited,
|
|
228
203
|
.captured_stdout = null,
|
|
229
204
|
.captured_stderr = null,
|
|
230
|
-
.dep_output_file = null,
|
|
231
205
|
.has_side_effects = false,
|
|
232
|
-
.fuzz_tests = .empty,
|
|
233
|
-
.rebuilt_executable = null,
|
|
234
206
|
.producer = null,
|
|
235
207
|
};
|
|
236
208
|
return run;
|
|
@@ -242,13 +214,9 @@ pub fn setName(run: *Run, name: []const u8) void {
|
|
|
242
214
|
}
|
|
243
215
|
|
|
244
216
|
pub fn enableTestRunnerMode(run: *Run) void {
|
|
245
|
-
|
|
217
|
+
if (run.test_runner_mode) return;
|
|
246
218
|
run.stdio = .zig_test;
|
|
247
|
-
run.
|
|
248
|
-
run.addArgs(&.{
|
|
249
|
-
b.fmt("--seed=0x{x}", .{b.graph.random_seed}),
|
|
250
|
-
"--listen=-",
|
|
251
|
-
});
|
|
219
|
+
run.test_runner_mode = true;
|
|
252
220
|
}
|
|
253
221
|
|
|
254
222
|
pub fn addArtifactArg(run: *Run, artifact: *Step.Compile) void {
|
|
@@ -256,13 +224,14 @@ pub fn addArtifactArg(run: *Run, artifact: *Step.Compile) void {
|
|
|
256
224
|
}
|
|
257
225
|
|
|
258
226
|
pub fn addPrefixedArtifactArg(run: *Run, prefix: []const u8, artifact: *Step.Compile) void {
|
|
259
|
-
const
|
|
227
|
+
const graph = run.step.owner.graph;
|
|
228
|
+
const arena = graph.arena;
|
|
260
229
|
|
|
261
230
|
const prefixed_artifact: PrefixedArtifact = .{
|
|
262
|
-
.prefix =
|
|
231
|
+
.prefix = graph.dupeString(prefix),
|
|
263
232
|
.artifact = artifact,
|
|
264
233
|
};
|
|
265
|
-
run.argv.append(
|
|
234
|
+
run.argv.append(arena, .{ .artifact = prefixed_artifact }) catch @panic("OOM");
|
|
266
235
|
|
|
267
236
|
const bin_file = artifact.getEmittedBin();
|
|
268
237
|
bin_file.addStepDependencies(&run.step);
|
|
@@ -273,21 +242,23 @@ pub fn addPrefixedArtifactArg(run: *Run, prefix: []const u8, artifact: *Step.Com
|
|
|
273
242
|
/// Returns a `std.Build.LazyPath` which can be used as inputs to other APIs
|
|
274
243
|
/// throughout the build system.
|
|
275
244
|
///
|
|
245
|
+
/// `sub_path` is the name of the generated output file which may have zero or
|
|
246
|
+
/// more path components.
|
|
247
|
+
///
|
|
276
248
|
/// Related:
|
|
277
249
|
/// * `addPrefixedOutputFileArg` - same thing but prepends a string to the argument
|
|
278
250
|
/// * `addFileArg` - for input files given to the child process
|
|
279
|
-
pub fn addOutputFileArg(run: *Run,
|
|
280
|
-
return run.addPrefixedOutputFileArg("",
|
|
251
|
+
pub fn addOutputFileArg(run: *Run, sub_path: []const u8) std.Build.LazyPath {
|
|
252
|
+
return run.addPrefixedOutputFileArg("", sub_path);
|
|
281
253
|
}
|
|
282
254
|
|
|
283
255
|
/// Provides a file path as a command line argument to the command being run.
|
|
284
|
-
/// Asserts `basename` is not empty.
|
|
285
256
|
///
|
|
286
|
-
/// For example, a prefix of "-o" and
|
|
257
|
+
/// For example, a prefix of "-o" and `sub_path` of "output.txt" will result in
|
|
287
258
|
/// the child process seeing something like this: "-ozig-cache/.../output.txt"
|
|
288
259
|
///
|
|
289
260
|
/// The child process will see a single argument, regardless of whether the
|
|
290
|
-
/// prefix or
|
|
261
|
+
/// prefix or `sub_path` have spaces.
|
|
291
262
|
///
|
|
292
263
|
/// The returned `std.Build.LazyPath` can be used as inputs to other APIs
|
|
293
264
|
/// throughout the build system.
|
|
@@ -298,24 +269,30 @@ pub fn addOutputFileArg(run: *Run, basename: []const u8) std.Build.LazyPath {
|
|
|
298
269
|
pub fn addPrefixedOutputFileArg(
|
|
299
270
|
run: *Run,
|
|
300
271
|
prefix: []const u8,
|
|
301
|
-
|
|
272
|
+
/// The name of the generated output file which may have zero or more path
|
|
273
|
+
/// components.
|
|
274
|
+
///
|
|
275
|
+
/// Asserted to be non-empty.
|
|
276
|
+
sub_path: []const u8,
|
|
302
277
|
) std.Build.LazyPath {
|
|
303
278
|
const b = run.step.owner;
|
|
304
|
-
|
|
279
|
+
const graph = b.graph;
|
|
280
|
+
const arena = graph.arena;
|
|
281
|
+
assert(sub_path.len != 0);
|
|
305
282
|
|
|
306
|
-
const output =
|
|
283
|
+
const output = graph.create(Output);
|
|
307
284
|
output.* = .{
|
|
308
|
-
.prefix =
|
|
309
|
-
.basename =
|
|
310
|
-
.generated_file = .
|
|
285
|
+
.prefix = graph.dupeString(prefix),
|
|
286
|
+
.basename = graph.dupeString(sub_path),
|
|
287
|
+
.generated_file = graph.addGeneratedFile(&run.step),
|
|
311
288
|
};
|
|
312
|
-
run.argv.append(
|
|
289
|
+
run.argv.append(arena, .{ .output_file = output }) catch @panic("OOM");
|
|
313
290
|
|
|
314
291
|
if (run.rename_step_with_output_arg) {
|
|
315
|
-
run.setName(b.fmt("{s} ({s})", .{ run.step.name,
|
|
292
|
+
run.setName(b.fmt("{s} ({s})", .{ run.step.name, sub_path }));
|
|
316
293
|
}
|
|
317
294
|
|
|
318
|
-
return .{ .generated = .{ .
|
|
295
|
+
return .{ .generated = .{ .index = output.generated_file } };
|
|
319
296
|
}
|
|
320
297
|
|
|
321
298
|
/// Appends an input file to the command line arguments.
|
|
@@ -344,13 +321,14 @@ pub fn addFileArg(run: *Run, lp: std.Build.LazyPath) void {
|
|
|
344
321
|
/// * `addFileArg` - same thing but without the prefix
|
|
345
322
|
/// * `addOutputFileArg` - for files generated by the child process
|
|
346
323
|
pub fn addPrefixedFileArg(run: *Run, prefix: []const u8, lp: std.Build.LazyPath) void {
|
|
347
|
-
const
|
|
324
|
+
const graph = run.step.owner.graph;
|
|
325
|
+
const arena = graph.arena;
|
|
348
326
|
|
|
349
327
|
const prefixed_file_source: PrefixedLazyPath = .{
|
|
350
|
-
.prefix =
|
|
351
|
-
.lazy_path = lp.dupe(
|
|
328
|
+
.prefix = graph.dupeString(prefix),
|
|
329
|
+
.lazy_path = lp.dupe(graph),
|
|
352
330
|
};
|
|
353
|
-
run.argv.append(
|
|
331
|
+
run.argv.append(arena, .{ .lazy_path = prefixed_file_source }) catch @panic("OOM");
|
|
354
332
|
lp.addStepDependencies(&run.step);
|
|
355
333
|
}
|
|
356
334
|
|
|
@@ -391,7 +369,8 @@ pub fn addFileContentArg(run: *Run, lp: std.Build.LazyPath) void {
|
|
|
391
369
|
/// Related:
|
|
392
370
|
/// * `addFileContentArg` - same thing but without the prefix
|
|
393
371
|
pub fn addPrefixedFileContentArg(run: *Run, prefix: []const u8, lp: std.Build.LazyPath) void {
|
|
394
|
-
const
|
|
372
|
+
const graph = run.step.owner.graph;
|
|
373
|
+
const arena = graph.arena;
|
|
395
374
|
|
|
396
375
|
// Some parts of this step's configure phase API rely on the first argument being somewhat
|
|
397
376
|
// transparent/readable, but the content of the file specified by `lp` remains completely
|
|
@@ -401,10 +380,10 @@ pub fn addPrefixedFileContentArg(run: *Run, prefix: []const u8, lp: std.Build.La
|
|
|
401
380
|
}
|
|
402
381
|
|
|
403
382
|
const prefixed_file_source: PrefixedLazyPath = .{
|
|
404
|
-
.prefix =
|
|
405
|
-
.lazy_path = lp.dupe(
|
|
383
|
+
.prefix = graph.dupeString(prefix),
|
|
384
|
+
.lazy_path = lp.dupe(graph),
|
|
406
385
|
};
|
|
407
|
-
run.argv.append(
|
|
386
|
+
run.argv.append(arena, .{ .file_content = prefixed_file_source }) catch @panic("OOM");
|
|
408
387
|
lp.addStepDependencies(&run.step);
|
|
409
388
|
}
|
|
410
389
|
|
|
@@ -441,21 +420,22 @@ pub fn addPrefixedOutputDirectoryArg(
|
|
|
441
420
|
basename: []const u8,
|
|
442
421
|
) std.Build.LazyPath {
|
|
443
422
|
if (basename.len == 0) @panic("basename must not be empty");
|
|
444
|
-
const
|
|
423
|
+
const graph = run.step.owner.graph;
|
|
424
|
+
const arena = graph.arena;
|
|
445
425
|
|
|
446
|
-
const output =
|
|
426
|
+
const output = arena.create(Output) catch @panic("OOM");
|
|
447
427
|
output.* = .{
|
|
448
|
-
.prefix =
|
|
449
|
-
.basename =
|
|
450
|
-
.generated_file = .
|
|
428
|
+
.prefix = graph.dupeString(prefix),
|
|
429
|
+
.basename = graph.dupeString(basename),
|
|
430
|
+
.generated_file = graph.addGeneratedFile(&run.step),
|
|
451
431
|
};
|
|
452
|
-
run.argv.append(
|
|
432
|
+
run.argv.append(arena, .{ .output_directory = output }) catch @panic("OOM");
|
|
453
433
|
|
|
454
434
|
if (run.rename_step_with_output_arg) {
|
|
455
|
-
run.setName(
|
|
435
|
+
run.setName(std.fmt.allocPrint(arena, "{s} ({s})", .{ run.step.name, basename }) catch @panic("OOM"));
|
|
456
436
|
}
|
|
457
437
|
|
|
458
|
-
return .{ .generated = .{ .
|
|
438
|
+
return .{ .generated = .{ .index = output.generated_file } };
|
|
459
439
|
}
|
|
460
440
|
|
|
461
441
|
pub fn addDirectoryArg(run: *Run, lazy_directory: std.Build.LazyPath) void {
|
|
@@ -463,10 +443,11 @@ pub fn addDirectoryArg(run: *Run, lazy_directory: std.Build.LazyPath) void {
|
|
|
463
443
|
}
|
|
464
444
|
|
|
465
445
|
pub fn addPrefixedDirectoryArg(run: *Run, prefix: []const u8, lazy_directory: std.Build.LazyPath) void {
|
|
466
|
-
const
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
.
|
|
446
|
+
const graph = run.step.owner.graph;
|
|
447
|
+
const arena = graph.arena;
|
|
448
|
+
run.argv.append(arena, .{ .decorated_directory = .{
|
|
449
|
+
.prefix = graph.dupeString(prefix),
|
|
450
|
+
.lazy_path = lazy_directory.dupe(graph),
|
|
470
451
|
.suffix = "",
|
|
471
452
|
} }) catch @panic("OOM");
|
|
472
453
|
lazy_directory.addStepDependencies(&run.step);
|
|
@@ -478,11 +459,12 @@ pub fn addDecoratedDirectoryArg(
|
|
|
478
459
|
lazy_directory: std.Build.LazyPath,
|
|
479
460
|
suffix: []const u8,
|
|
480
461
|
) void {
|
|
481
|
-
const
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
.
|
|
485
|
-
.
|
|
462
|
+
const graph = run.step.owner.graph;
|
|
463
|
+
const arena = graph.arena;
|
|
464
|
+
run.argv.append(arena, .{ .decorated_directory = .{
|
|
465
|
+
.prefix = graph.dupeString(prefix),
|
|
466
|
+
.lazy_path = lazy_directory.dupe(graph),
|
|
467
|
+
.suffix = graph.dupeString(suffix),
|
|
486
468
|
} }) catch @panic("OOM");
|
|
487
469
|
lazy_directory.addStepDependencies(&run.step);
|
|
488
470
|
}
|
|
@@ -496,34 +478,63 @@ pub fn addDepFileOutputArg(run: *Run, basename: []const u8) std.Build.LazyPath {
|
|
|
496
478
|
|
|
497
479
|
/// Add a prefixed path argument to a dep file (.d) for the child process to
|
|
498
480
|
/// write its discovered additional dependencies.
|
|
499
|
-
/// Only one dep file argument is allowed by instance.
|
|
500
481
|
pub fn addPrefixedDepFileOutputArg(run: *Run, prefix: []const u8, basename: []const u8) std.Build.LazyPath {
|
|
501
482
|
const b = run.step.owner;
|
|
502
|
-
|
|
483
|
+
const graph = b.graph;
|
|
484
|
+
const arena = graph.arena;
|
|
503
485
|
|
|
504
|
-
const dep_file =
|
|
486
|
+
const dep_file = arena.create(Output) catch @panic("OOM");
|
|
505
487
|
dep_file.* = .{
|
|
506
|
-
.prefix =
|
|
507
|
-
.basename =
|
|
508
|
-
.generated_file = .
|
|
488
|
+
.prefix = graph.dupeString(prefix),
|
|
489
|
+
.basename = graph.dupeString(basename),
|
|
490
|
+
.generated_file = graph.addGeneratedFile(&run.step),
|
|
509
491
|
};
|
|
510
492
|
|
|
511
|
-
run.
|
|
493
|
+
run.argv.append(arena, .{ .output_file_dep = dep_file }) catch @panic("OOM");
|
|
512
494
|
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
return .{ .generated = .{ .file = &dep_file.generated_file } };
|
|
495
|
+
return .{ .generated = .{ .index = dep_file.generated_file } };
|
|
516
496
|
}
|
|
517
497
|
|
|
498
|
+
/// Appends the contents of `arg`, verbatim, to the command line that will be
|
|
499
|
+
/// passed to the process being run.
|
|
500
|
+
///
|
|
501
|
+
/// If `arg` is an input file, `addFileInput` (or related function) must be
|
|
502
|
+
/// used instead to ensure correct cache behavior.
|
|
503
|
+
///
|
|
504
|
+
/// If `arg` is an output file, `addOutputFileArg` (or related function) must
|
|
505
|
+
/// be used instead to ensure correct cache behavior.
|
|
518
506
|
pub fn addArg(run: *Run, arg: []const u8) void {
|
|
519
|
-
const
|
|
520
|
-
|
|
507
|
+
const graph = run.step.owner.graph;
|
|
508
|
+
const arena = graph.arena;
|
|
509
|
+
run.argv.append(arena, .{ .bytes = graph.dupeString(arg) }) catch @panic("OOM");
|
|
521
510
|
}
|
|
522
511
|
|
|
512
|
+
/// Appends each of `args`, verbatim, to the command line that will be passed
|
|
513
|
+
/// to the process being run.
|
|
514
|
+
///
|
|
515
|
+
/// If any element of `args` is an input file, `addFileInput` must be used
|
|
516
|
+
/// instead to ensure correct cache behavior.
|
|
517
|
+
///
|
|
518
|
+
/// If any element of `args` is an output file, `addOutputFileArg` (or related
|
|
519
|
+
/// function) must be used instead to ensure correct cache behavior.
|
|
523
520
|
pub fn addArgs(run: *Run, args: []const []const u8) void {
|
|
524
521
|
for (args) |arg| run.addArg(arg);
|
|
525
522
|
}
|
|
526
523
|
|
|
524
|
+
/// Appends the extra arguments provided to `zig build` to the command line
|
|
525
|
+
/// that will be passed to the process being run.
|
|
526
|
+
///
|
|
527
|
+
/// This causes the step to be considered to have side effects, disabling
|
|
528
|
+
/// caching.
|
|
529
|
+
///
|
|
530
|
+
/// In the example command `zig build run -- arg1 arg2`, "arg1" and "arg2" will
|
|
531
|
+
/// be passed to the process being run.
|
|
532
|
+
pub fn addPassthruArgs(run: *Run) void {
|
|
533
|
+
const graph = run.step.owner.graph;
|
|
534
|
+
const arena = graph.arena;
|
|
535
|
+
run.argv.append(arena, .passthru) catch @panic("OOM");
|
|
536
|
+
}
|
|
537
|
+
|
|
527
538
|
pub fn setStdIn(run: *Run, stdin: StdIn) void {
|
|
528
539
|
switch (stdin) {
|
|
529
540
|
.lazy_path => |lazy_path| lazy_path.addStepDependencies(&run.step),
|
|
@@ -533,8 +544,9 @@ pub fn setStdIn(run: *Run, stdin: StdIn) void {
|
|
|
533
544
|
}
|
|
534
545
|
|
|
535
546
|
pub fn setCwd(run: *Run, cwd: Build.LazyPath) void {
|
|
547
|
+
const graph = run.step.owner.graph;
|
|
536
548
|
cwd.addStepDependencies(&run.step);
|
|
537
|
-
run.cwd = cwd.dupe(
|
|
549
|
+
run.cwd = cwd.dupe(graph);
|
|
538
550
|
}
|
|
539
551
|
|
|
540
552
|
pub fn clearEnvironment(run: *Run) void {
|
|
@@ -560,7 +572,7 @@ pub fn addPathDir(run: *Run, search_path: []const u8) void {
|
|
|
560
572
|
.decorated_directory => false,
|
|
561
573
|
.file_content => unreachable, // not allowed as first arg
|
|
562
574
|
.bytes => |bytes| std.mem.endsWith(u8, bytes, ".exe"),
|
|
563
|
-
.output_file, .output_directory => false,
|
|
575
|
+
.output_file, .output_file_dep, .output_directory => false,
|
|
564
576
|
};
|
|
565
577
|
const key = if (use_wine) "WINEPATH" else "PATH";
|
|
566
578
|
const prev_path = environ_map.get(key);
|
|
@@ -604,24 +616,28 @@ pub fn removeEnvironmentVariable(run: *Run, key: []const u8) void {
|
|
|
604
616
|
|
|
605
617
|
/// Adds a check for exact stderr match. Does not add any other checks.
|
|
606
618
|
pub fn expectStdErrEqual(run: *Run, bytes: []const u8) void {
|
|
607
|
-
|
|
619
|
+
const graph = run.step.owner.graph;
|
|
620
|
+
run.addCheck(.{ .expect_stderr_exact = graph.dupeString(bytes) });
|
|
608
621
|
}
|
|
609
622
|
|
|
610
623
|
pub fn expectStdErrMatch(run: *Run, bytes: []const u8) void {
|
|
611
|
-
|
|
624
|
+
const graph = run.step.owner.graph;
|
|
625
|
+
run.addCheck(.{ .expect_stderr_match = graph.dupeString(bytes) });
|
|
612
626
|
}
|
|
613
627
|
|
|
614
628
|
/// Adds a check for exact stdout match as well as a check for exit code 0, if
|
|
615
629
|
/// there is not already an expected termination check.
|
|
616
630
|
pub fn expectStdOutEqual(run: *Run, bytes: []const u8) void {
|
|
617
|
-
|
|
631
|
+
const graph = run.step.owner.graph;
|
|
632
|
+
run.addCheck(.{ .expect_stdout_exact = graph.dupeString(bytes) });
|
|
618
633
|
if (!run.hasTermCheck()) run.expectExitCode(0);
|
|
619
634
|
}
|
|
620
635
|
|
|
621
636
|
/// Adds a check for stdout match as well as a check for exit code 0, if there
|
|
622
637
|
/// is not already an expected termination check.
|
|
623
638
|
pub fn expectStdOutMatch(run: *Run, bytes: []const u8) void {
|
|
624
|
-
|
|
639
|
+
const graph = run.step.owner.graph;
|
|
640
|
+
run.addCheck(.{ .expect_stdout_match = graph.dupeString(bytes) });
|
|
625
641
|
if (!run.hasTermCheck()) run.expectExitCode(0);
|
|
626
642
|
}
|
|
627
643
|
|
|
@@ -656,20 +672,22 @@ pub fn captureStdErr(run: *Run, options: CapturedStdIo.Options) std.Build.LazyPa
|
|
|
656
672
|
assert(run.stdio != .zig_test);
|
|
657
673
|
|
|
658
674
|
const b = run.step.owner;
|
|
675
|
+
const graph = b.graph;
|
|
676
|
+
const arena = graph.arena;
|
|
659
677
|
|
|
660
|
-
if (run.captured_stderr) |captured| return .{ .generated = .{ .
|
|
678
|
+
if (run.captured_stderr) |captured| return .{ .generated = .{ .index = captured.output.generated_file } };
|
|
661
679
|
|
|
662
|
-
const captured =
|
|
680
|
+
const captured = arena.create(CapturedStdIo) catch @panic("OOM");
|
|
663
681
|
captured.* = .{
|
|
664
682
|
.output = .{
|
|
665
683
|
.prefix = "",
|
|
666
|
-
.basename = if (options.basename) |basename|
|
|
667
|
-
.generated_file = .
|
|
684
|
+
.basename = if (options.basename) |basename| graph.dupeString(basename) else "stderr",
|
|
685
|
+
.generated_file = graph.addGeneratedFile(&run.step),
|
|
668
686
|
},
|
|
669
687
|
.trim_whitespace = options.trim_whitespace,
|
|
670
688
|
};
|
|
671
689
|
run.captured_stderr = captured;
|
|
672
|
-
return .{ .generated = .{ .
|
|
690
|
+
return .{ .generated = .{ .index = captured.output.generated_file } };
|
|
673
691
|
}
|
|
674
692
|
|
|
675
693
|
pub fn captureStdOut(run: *Run, options: CapturedStdIo.Options) std.Build.LazyPath {
|
|
@@ -677,20 +695,22 @@ pub fn captureStdOut(run: *Run, options: CapturedStdIo.Options) std.Build.LazyPa
|
|
|
677
695
|
assert(run.stdio != .zig_test);
|
|
678
696
|
|
|
679
697
|
const b = run.step.owner;
|
|
698
|
+
const graph = b.graph;
|
|
699
|
+
const arena = graph.arena;
|
|
680
700
|
|
|
681
|
-
if (run.captured_stdout) |captured| return .{ .generated = .{ .
|
|
701
|
+
if (run.captured_stdout) |captured| return .{ .generated = .{ .index = captured.output.generated_file } };
|
|
682
702
|
|
|
683
|
-
const captured =
|
|
703
|
+
const captured = arena.create(CapturedStdIo) catch @panic("OOM");
|
|
684
704
|
captured.* = .{
|
|
685
705
|
.output = .{
|
|
686
706
|
.prefix = "",
|
|
687
|
-
.basename = if (options.basename) |basename|
|
|
688
|
-
.generated_file = .
|
|
707
|
+
.basename = if (options.basename) |basename| graph.dupeString(basename) else "stdout",
|
|
708
|
+
.generated_file = graph.addGeneratedFile(&run.step),
|
|
689
709
|
},
|
|
690
710
|
.trim_whitespace = options.trim_whitespace,
|
|
691
711
|
};
|
|
692
712
|
run.captured_stdout = captured;
|
|
693
|
-
return .{ .generated = .{ .
|
|
713
|
+
return .{ .generated = .{ .index = captured.output.generated_file } };
|
|
694
714
|
}
|
|
695
715
|
|
|
696
716
|
/// Adds an additional input files that, when modified, indicates that this Run
|
|
@@ -698,2104 +718,9 @@ pub fn captureStdOut(run: *Run, options: CapturedStdIo.Options) std.Build.LazyPa
|
|
|
698
718
|
/// If the Run step is determined to have side-effects, the Run step is always
|
|
699
719
|
/// executed when it appears in the build graph, regardless of whether this
|
|
700
720
|
/// file has been modified.
|
|
701
|
-
pub fn addFileInput(
|
|
702
|
-
|
|
703
|
-
self.file_inputs.append(self.step.owner.allocator, file_input.dupe(self.step.owner)) catch @panic("OOM");
|
|
704
|
-
}
|
|
705
|
-
|
|
706
|
-
/// Returns whether the Run step has side effects *other than* updating the output arguments.
|
|
707
|
-
fn hasSideEffects(run: Run) bool {
|
|
708
|
-
if (run.has_side_effects) return true;
|
|
709
|
-
return switch (run.stdio) {
|
|
710
|
-
.infer_from_args => !run.hasAnyOutputArgs(),
|
|
711
|
-
.inherit => true,
|
|
712
|
-
.check => false,
|
|
713
|
-
.zig_test => false,
|
|
714
|
-
};
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
fn hasAnyOutputArgs(run: Run) bool {
|
|
718
|
-
if (run.captured_stdout != null) return true;
|
|
719
|
-
if (run.captured_stderr != null) return true;
|
|
720
|
-
for (run.argv.items) |arg| switch (arg) {
|
|
721
|
-
.output_file, .output_directory => return true,
|
|
722
|
-
else => continue,
|
|
723
|
-
};
|
|
724
|
-
return false;
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
fn checksContainStdout(checks: []const StdIo.Check) bool {
|
|
728
|
-
for (checks) |check| switch (check) {
|
|
729
|
-
.expect_stderr_exact,
|
|
730
|
-
.expect_stderr_match,
|
|
731
|
-
.expect_term,
|
|
732
|
-
=> continue,
|
|
733
|
-
|
|
734
|
-
.expect_stdout_exact,
|
|
735
|
-
.expect_stdout_match,
|
|
736
|
-
=> return true,
|
|
737
|
-
};
|
|
738
|
-
return false;
|
|
739
|
-
}
|
|
740
|
-
|
|
741
|
-
fn checksContainStderr(checks: []const StdIo.Check) bool {
|
|
742
|
-
for (checks) |check| switch (check) {
|
|
743
|
-
.expect_stdout_exact,
|
|
744
|
-
.expect_stdout_match,
|
|
745
|
-
.expect_term,
|
|
746
|
-
=> continue,
|
|
747
|
-
|
|
748
|
-
.expect_stderr_exact,
|
|
749
|
-
.expect_stderr_match,
|
|
750
|
-
=> return true,
|
|
751
|
-
};
|
|
752
|
-
return false;
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
/// If `path` is cwd-relative, make it relative to the cwd of the child instead.
|
|
756
|
-
///
|
|
757
|
-
/// Whenever a path is included in the argv of a child, it should be put through this function first
|
|
758
|
-
/// to make sure the child doesn't see paths relative to a cwd other than its own.
|
|
759
|
-
fn convertPathArg(run: *Run, path: Build.Cache.Path) []const u8 {
|
|
760
|
-
const b = run.step.owner;
|
|
761
|
-
const graph = b.graph;
|
|
721
|
+
pub fn addFileInput(run: *Run, file_input: std.Build.LazyPath) void {
|
|
722
|
+
const graph = run.step.owner.graph;
|
|
762
723
|
const arena = graph.arena;
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
if (Dir.path.isAbsolute(path_str)) {
|
|
766
|
-
// Absolute paths don't need changing.
|
|
767
|
-
return path_str;
|
|
768
|
-
}
|
|
769
|
-
const child_cwd_rel: []const u8 = rel: {
|
|
770
|
-
const child_lazy_cwd = run.cwd orelse break :rel path_str;
|
|
771
|
-
const child_cwd = child_lazy_cwd.getPath3(b, &run.step).toString(arena) catch @panic("OOM");
|
|
772
|
-
// Convert it from relative to *our* cwd, to relative to the *child's* cwd.
|
|
773
|
-
break :rel Dir.path.relative(arena, graph.cache.cwd, &graph.environ_map, child_cwd, path_str) catch @panic("OOM");
|
|
774
|
-
};
|
|
775
|
-
// Not every path can be made relative, e.g. if the path and the child cwd are on different
|
|
776
|
-
// disk designators on Windows. In that case, `relative` will return an absolute path which we can
|
|
777
|
-
// just return.
|
|
778
|
-
if (Dir.path.isAbsolute(child_cwd_rel)) return child_cwd_rel;
|
|
779
|
-
|
|
780
|
-
// We're not done yet. In some cases this path must be prefixed with './':
|
|
781
|
-
// * On POSIX, the executable name cannot be a single component like 'foo'
|
|
782
|
-
// * Some executables might treat a leading '-' like a flag, which we must avoid
|
|
783
|
-
// There's no harm in it, so just *always* apply this prefix.
|
|
784
|
-
return Dir.path.join(arena, &.{ ".", child_cwd_rel }) catch @panic("OOM");
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
const IndexedOutput = struct {
|
|
788
|
-
index: usize,
|
|
789
|
-
tag: @typeInfo(Arg).@"union".tag_type.?,
|
|
790
|
-
output: *Output,
|
|
791
|
-
};
|
|
792
|
-
fn make(step: *Step, options: Step.MakeOptions) !void {
|
|
793
|
-
const b = step.owner;
|
|
794
|
-
const io = b.graph.io;
|
|
795
|
-
const arena = b.allocator;
|
|
796
|
-
const run: *Run = @fieldParentPtr("step", step);
|
|
797
|
-
const has_side_effects = run.hasSideEffects();
|
|
798
|
-
|
|
799
|
-
var argv_list = std.array_list.Managed([]const u8).init(arena);
|
|
800
|
-
var output_placeholders = std.array_list.Managed(IndexedOutput).init(arena);
|
|
801
|
-
|
|
802
|
-
var man = b.graph.cache.obtain();
|
|
803
|
-
defer man.deinit();
|
|
804
|
-
|
|
805
|
-
if (run.environ_map) |environ_map| {
|
|
806
|
-
for (environ_map.keys(), environ_map.values()) |key, value| {
|
|
807
|
-
man.hash.addBytes(key);
|
|
808
|
-
man.hash.addBytes(value);
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
man.hash.add(run.color);
|
|
813
|
-
man.hash.add(run.disable_zig_progress);
|
|
814
|
-
|
|
815
|
-
for (run.argv.items) |arg| {
|
|
816
|
-
switch (arg) {
|
|
817
|
-
.bytes => |bytes| {
|
|
818
|
-
try argv_list.append(bytes);
|
|
819
|
-
man.hash.addBytes(bytes);
|
|
820
|
-
},
|
|
821
|
-
.lazy_path => |file| {
|
|
822
|
-
const file_path = file.lazy_path.getPath3(b, step);
|
|
823
|
-
try argv_list.append(b.fmt("{s}{s}", .{ file.prefix, run.convertPathArg(file_path) }));
|
|
824
|
-
man.hash.addBytes(file.prefix);
|
|
825
|
-
_ = try man.addFilePath(file_path, null);
|
|
826
|
-
},
|
|
827
|
-
.decorated_directory => |dd| {
|
|
828
|
-
const file_path = dd.lazy_path.getPath3(b, step);
|
|
829
|
-
const resolved_arg = b.fmt("{s}{s}{s}", .{ dd.prefix, run.convertPathArg(file_path), dd.suffix });
|
|
830
|
-
try argv_list.append(resolved_arg);
|
|
831
|
-
man.hash.addBytes(resolved_arg);
|
|
832
|
-
},
|
|
833
|
-
.file_content => |file_plp| {
|
|
834
|
-
const file_path = file_plp.lazy_path.getPath3(b, step);
|
|
835
|
-
|
|
836
|
-
var result: std.Io.Writer.Allocating = .init(arena);
|
|
837
|
-
errdefer result.deinit();
|
|
838
|
-
result.writer.writeAll(file_plp.prefix) catch return error.OutOfMemory;
|
|
839
|
-
|
|
840
|
-
const file = file_path.root_dir.handle.openFile(io, file_path.subPathOrDot(), .{}) catch |err| {
|
|
841
|
-
return step.fail(
|
|
842
|
-
"unable to open input file '{f}': {t}",
|
|
843
|
-
.{ file_path, err },
|
|
844
|
-
);
|
|
845
|
-
};
|
|
846
|
-
defer file.close(io);
|
|
847
|
-
|
|
848
|
-
var buf: [1024]u8 = undefined;
|
|
849
|
-
var file_reader = file.reader(io, &buf);
|
|
850
|
-
_ = file_reader.interface.streamRemaining(&result.writer) catch |err| switch (err) {
|
|
851
|
-
error.ReadFailed => return step.fail(
|
|
852
|
-
"failed to read from '{f}': {t}",
|
|
853
|
-
.{ file_path, file_reader.err.? },
|
|
854
|
-
),
|
|
855
|
-
error.WriteFailed => return error.OutOfMemory,
|
|
856
|
-
};
|
|
857
|
-
|
|
858
|
-
try argv_list.append(result.written());
|
|
859
|
-
man.hash.addBytes(file_plp.prefix);
|
|
860
|
-
_ = try man.addFilePath(file_path, null);
|
|
861
|
-
},
|
|
862
|
-
.artifact => |pa| {
|
|
863
|
-
const artifact = pa.artifact;
|
|
864
|
-
|
|
865
|
-
if (artifact.rootModuleTarget().os.tag == .windows) {
|
|
866
|
-
// On Windows we don't have rpaths so we have to add .dll search paths to PATH
|
|
867
|
-
run.addPathForDynLibs(artifact);
|
|
868
|
-
}
|
|
869
|
-
const file_path = artifact.installed_path orelse artifact.generated_bin.?.path.?;
|
|
870
|
-
|
|
871
|
-
try argv_list.append(b.fmt("{s}{s}", .{
|
|
872
|
-
pa.prefix,
|
|
873
|
-
run.convertPathArg(.{ .root_dir = .cwd(), .sub_path = file_path }),
|
|
874
|
-
}));
|
|
875
|
-
|
|
876
|
-
_ = try man.addFile(file_path, null);
|
|
877
|
-
},
|
|
878
|
-
.output_file, .output_directory => |output| {
|
|
879
|
-
man.hash.addBytes(output.prefix);
|
|
880
|
-
man.hash.addBytes(output.basename);
|
|
881
|
-
// Add a placeholder into the argument list because we need the
|
|
882
|
-
// manifest hash to be updated with all arguments before the
|
|
883
|
-
// object directory is computed.
|
|
884
|
-
try output_placeholders.append(.{
|
|
885
|
-
.index = argv_list.items.len,
|
|
886
|
-
.tag = arg,
|
|
887
|
-
.output = output,
|
|
888
|
-
});
|
|
889
|
-
_ = try argv_list.addOne();
|
|
890
|
-
},
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
switch (run.stdin) {
|
|
895
|
-
.bytes => |bytes| {
|
|
896
|
-
man.hash.addBytes(bytes);
|
|
897
|
-
},
|
|
898
|
-
.lazy_path => |lazy_path| {
|
|
899
|
-
const file_path = lazy_path.getPath2(b, step);
|
|
900
|
-
_ = try man.addFile(file_path, null);
|
|
901
|
-
},
|
|
902
|
-
.none => {},
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
if (run.captured_stdout) |captured| {
|
|
906
|
-
man.hash.addBytes(captured.output.basename);
|
|
907
|
-
man.hash.add(captured.trim_whitespace);
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
if (run.captured_stderr) |captured| {
|
|
911
|
-
man.hash.addBytes(captured.output.basename);
|
|
912
|
-
man.hash.add(captured.trim_whitespace);
|
|
913
|
-
}
|
|
914
|
-
|
|
915
|
-
hashStdIo(&man.hash, run.stdio);
|
|
916
|
-
|
|
917
|
-
for (run.file_inputs.items) |lazy_path| {
|
|
918
|
-
_ = try man.addFile(lazy_path.getPath2(b, step), null);
|
|
919
|
-
}
|
|
920
|
-
|
|
921
|
-
if (run.cwd) |cwd| {
|
|
922
|
-
const cwd_path = cwd.getPath3(b, step);
|
|
923
|
-
_ = man.hash.addBytes(try cwd_path.toString(arena));
|
|
924
|
-
}
|
|
925
|
-
|
|
926
|
-
if (!has_side_effects and try step.cacheHitAndWatch(&man)) {
|
|
927
|
-
// cache hit, skip running command
|
|
928
|
-
const digest = man.final();
|
|
929
|
-
|
|
930
|
-
try populateGeneratedPaths(
|
|
931
|
-
arena,
|
|
932
|
-
output_placeholders.items,
|
|
933
|
-
run.captured_stdout,
|
|
934
|
-
run.captured_stderr,
|
|
935
|
-
b.cache_root,
|
|
936
|
-
&digest,
|
|
937
|
-
);
|
|
938
|
-
|
|
939
|
-
step.result_cached = true;
|
|
940
|
-
return;
|
|
941
|
-
}
|
|
942
|
-
|
|
943
|
-
const dep_output_file = run.dep_output_file orelse {
|
|
944
|
-
// We already know the final output paths, use them directly.
|
|
945
|
-
const digest = if (has_side_effects)
|
|
946
|
-
man.hash.final()
|
|
947
|
-
else
|
|
948
|
-
man.final();
|
|
949
|
-
|
|
950
|
-
try populateGeneratedPaths(
|
|
951
|
-
arena,
|
|
952
|
-
output_placeholders.items,
|
|
953
|
-
run.captured_stdout,
|
|
954
|
-
run.captured_stderr,
|
|
955
|
-
b.cache_root,
|
|
956
|
-
&digest,
|
|
957
|
-
);
|
|
958
|
-
|
|
959
|
-
const output_dir_path = "o" ++ Dir.path.sep_str ++ &digest;
|
|
960
|
-
for (output_placeholders.items) |placeholder| {
|
|
961
|
-
const output_sub_path = b.pathJoin(&.{ output_dir_path, placeholder.output.basename });
|
|
962
|
-
const output_sub_dir_path = switch (placeholder.tag) {
|
|
963
|
-
.output_file => Dir.path.dirname(output_sub_path).?,
|
|
964
|
-
.output_directory => output_sub_path,
|
|
965
|
-
else => unreachable,
|
|
966
|
-
};
|
|
967
|
-
b.cache_root.handle.createDirPath(io, output_sub_dir_path) catch |err| {
|
|
968
|
-
return step.fail("unable to make path '{f}{s}': {s}", .{
|
|
969
|
-
b.cache_root, output_sub_dir_path, @errorName(err),
|
|
970
|
-
});
|
|
971
|
-
};
|
|
972
|
-
const arg_output_path = run.convertPathArg(.{
|
|
973
|
-
.root_dir = .cwd(),
|
|
974
|
-
.sub_path = placeholder.output.generated_file.getPath(),
|
|
975
|
-
});
|
|
976
|
-
argv_list.items[placeholder.index] = if (placeholder.output.prefix.len == 0)
|
|
977
|
-
arg_output_path
|
|
978
|
-
else
|
|
979
|
-
b.fmt("{s}{s}", .{ placeholder.output.prefix, arg_output_path });
|
|
980
|
-
}
|
|
981
|
-
|
|
982
|
-
try runCommand(run, argv_list.items, has_side_effects, output_dir_path, options, null);
|
|
983
|
-
if (!has_side_effects) try step.writeManifestAndWatch(&man);
|
|
984
|
-
return;
|
|
985
|
-
};
|
|
986
|
-
|
|
987
|
-
// We do not know the final output paths yet, use temp paths to run the command.
|
|
988
|
-
var rand_int: u64 = undefined;
|
|
989
|
-
io.random(@ptrCast(&rand_int));
|
|
990
|
-
const tmp_dir_path = "tmp" ++ Dir.path.sep_str ++ std.fmt.hex(rand_int);
|
|
991
|
-
|
|
992
|
-
for (output_placeholders.items) |placeholder| {
|
|
993
|
-
const output_components = .{ tmp_dir_path, placeholder.output.basename };
|
|
994
|
-
const output_sub_path = b.pathJoin(&output_components);
|
|
995
|
-
const output_sub_dir_path = switch (placeholder.tag) {
|
|
996
|
-
.output_file => Dir.path.dirname(output_sub_path).?,
|
|
997
|
-
.output_directory => output_sub_path,
|
|
998
|
-
else => unreachable,
|
|
999
|
-
};
|
|
1000
|
-
b.cache_root.handle.createDirPath(io, output_sub_dir_path) catch |err| {
|
|
1001
|
-
return step.fail("unable to make path '{f}{s}': {s}", .{
|
|
1002
|
-
b.cache_root, output_sub_dir_path, @errorName(err),
|
|
1003
|
-
});
|
|
1004
|
-
};
|
|
1005
|
-
const raw_output_path: Build.Cache.Path = .{
|
|
1006
|
-
.root_dir = b.cache_root,
|
|
1007
|
-
.sub_path = b.pathJoin(&output_components),
|
|
1008
|
-
};
|
|
1009
|
-
placeholder.output.generated_file.path = raw_output_path.toString(b.graph.arena) catch @panic("OOM");
|
|
1010
|
-
argv_list.items[placeholder.index] = b.fmt("{s}{s}", .{
|
|
1011
|
-
placeholder.output.prefix,
|
|
1012
|
-
run.convertPathArg(raw_output_path),
|
|
1013
|
-
});
|
|
1014
|
-
}
|
|
1015
|
-
|
|
1016
|
-
try runCommand(run, argv_list.items, has_side_effects, tmp_dir_path, options, null);
|
|
1017
|
-
|
|
1018
|
-
const dep_file_dir = Dir.cwd();
|
|
1019
|
-
const dep_file_basename = dep_output_file.generated_file.getPath2(b, step);
|
|
1020
|
-
if (has_side_effects)
|
|
1021
|
-
try man.addDepFile(dep_file_dir, dep_file_basename)
|
|
1022
|
-
else
|
|
1023
|
-
try man.addDepFilePost(dep_file_dir, dep_file_basename);
|
|
1024
|
-
|
|
1025
|
-
const digest = if (has_side_effects)
|
|
1026
|
-
man.hash.final()
|
|
1027
|
-
else
|
|
1028
|
-
man.final();
|
|
1029
|
-
|
|
1030
|
-
const any_output = output_placeholders.items.len > 0 or
|
|
1031
|
-
run.captured_stdout != null or run.captured_stderr != null;
|
|
1032
|
-
|
|
1033
|
-
// Rename into place
|
|
1034
|
-
if (any_output) {
|
|
1035
|
-
const o_sub_path = "o" ++ Dir.path.sep_str ++ &digest;
|
|
1036
|
-
|
|
1037
|
-
b.cache_root.handle.rename(tmp_dir_path, b.cache_root.handle, o_sub_path, io) catch |err| switch (err) {
|
|
1038
|
-
Dir.RenameError.DirNotEmpty => {
|
|
1039
|
-
b.cache_root.handle.deleteTree(io, o_sub_path) catch |del_err| {
|
|
1040
|
-
return step.fail("unable to remove dir '{f}'{s}: {t}", .{
|
|
1041
|
-
b.cache_root, tmp_dir_path, del_err,
|
|
1042
|
-
});
|
|
1043
|
-
};
|
|
1044
|
-
b.cache_root.handle.rename(tmp_dir_path, b.cache_root.handle, o_sub_path, io) catch |retry_err| {
|
|
1045
|
-
return step.fail("unable to rename dir '{f}{s}' to '{f}{s}': {t}", .{
|
|
1046
|
-
b.cache_root, tmp_dir_path, b.cache_root, o_sub_path, retry_err,
|
|
1047
|
-
});
|
|
1048
|
-
};
|
|
1049
|
-
},
|
|
1050
|
-
else => return step.fail("unable to rename dir '{f}{s}' to '{f}{s}': {t}", .{
|
|
1051
|
-
b.cache_root, tmp_dir_path, b.cache_root, o_sub_path, err,
|
|
1052
|
-
}),
|
|
1053
|
-
};
|
|
1054
|
-
}
|
|
1055
|
-
|
|
1056
|
-
if (!has_side_effects) try step.writeManifestAndWatch(&man);
|
|
1057
|
-
|
|
1058
|
-
try populateGeneratedPaths(
|
|
1059
|
-
arena,
|
|
1060
|
-
output_placeholders.items,
|
|
1061
|
-
run.captured_stdout,
|
|
1062
|
-
run.captured_stderr,
|
|
1063
|
-
b.cache_root,
|
|
1064
|
-
&digest,
|
|
1065
|
-
);
|
|
1066
|
-
}
|
|
1067
|
-
|
|
1068
|
-
pub fn rerunInFuzzMode(
|
|
1069
|
-
run: *Run,
|
|
1070
|
-
fuzz: *std.Build.Fuzz,
|
|
1071
|
-
prog_node: std.Progress.Node,
|
|
1072
|
-
) !void {
|
|
1073
|
-
const step = &run.step;
|
|
1074
|
-
const b = step.owner;
|
|
1075
|
-
const io = b.graph.io;
|
|
1076
|
-
const arena = b.allocator;
|
|
1077
|
-
var argv_list: std.ArrayList([]const u8) = .empty;
|
|
1078
|
-
for (run.argv.items) |arg| {
|
|
1079
|
-
switch (arg) {
|
|
1080
|
-
.bytes => |bytes| {
|
|
1081
|
-
try argv_list.append(arena, bytes);
|
|
1082
|
-
},
|
|
1083
|
-
.lazy_path => |file| {
|
|
1084
|
-
const file_path = file.lazy_path.getPath3(b, step);
|
|
1085
|
-
try argv_list.append(arena, b.fmt("{s}{s}", .{ file.prefix, run.convertPathArg(file_path) }));
|
|
1086
|
-
},
|
|
1087
|
-
.decorated_directory => |dd| {
|
|
1088
|
-
const file_path = dd.lazy_path.getPath3(b, step);
|
|
1089
|
-
try argv_list.append(arena, b.fmt("{s}{s}{s}", .{ dd.prefix, run.convertPathArg(file_path), dd.suffix }));
|
|
1090
|
-
},
|
|
1091
|
-
.file_content => |file_plp| {
|
|
1092
|
-
const file_path = file_plp.lazy_path.getPath3(b, step);
|
|
1093
|
-
|
|
1094
|
-
var result: std.Io.Writer.Allocating = .init(arena);
|
|
1095
|
-
errdefer result.deinit();
|
|
1096
|
-
result.writer.writeAll(file_plp.prefix) catch return error.OutOfMemory;
|
|
1097
|
-
|
|
1098
|
-
const file = try file_path.root_dir.handle.openFile(io, file_path.subPathOrDot(), .{});
|
|
1099
|
-
defer file.close(io);
|
|
1100
|
-
|
|
1101
|
-
var buf: [1024]u8 = undefined;
|
|
1102
|
-
var file_reader = file.reader(io, &buf);
|
|
1103
|
-
_ = file_reader.interface.streamRemaining(&result.writer) catch |err| switch (err) {
|
|
1104
|
-
error.ReadFailed => return file_reader.err.?,
|
|
1105
|
-
error.WriteFailed => return error.OutOfMemory,
|
|
1106
|
-
};
|
|
1107
|
-
|
|
1108
|
-
try argv_list.append(arena, result.written());
|
|
1109
|
-
},
|
|
1110
|
-
.artifact => |pa| {
|
|
1111
|
-
const artifact = pa.artifact;
|
|
1112
|
-
const file_path: []const u8 = p: {
|
|
1113
|
-
if (artifact == run.producer.?) break :p b.fmt("{f}", .{run.rebuilt_executable.?});
|
|
1114
|
-
break :p artifact.installed_path orelse artifact.generated_bin.?.path.?;
|
|
1115
|
-
};
|
|
1116
|
-
try argv_list.append(arena, b.fmt("{s}{s}", .{
|
|
1117
|
-
pa.prefix,
|
|
1118
|
-
run.convertPathArg(.{ .root_dir = .cwd(), .sub_path = file_path }),
|
|
1119
|
-
}));
|
|
1120
|
-
},
|
|
1121
|
-
.output_file, .output_directory => unreachable,
|
|
1122
|
-
}
|
|
1123
|
-
}
|
|
1124
|
-
|
|
1125
|
-
if (run.step.result_failed_command) |cmd| {
|
|
1126
|
-
fuzz.gpa.free(cmd);
|
|
1127
|
-
run.step.result_failed_command = null;
|
|
1128
|
-
}
|
|
1129
|
-
|
|
1130
|
-
const has_side_effects = false;
|
|
1131
|
-
var rand_int: u64 = undefined;
|
|
1132
|
-
io.random(@ptrCast(&rand_int));
|
|
1133
|
-
const tmp_dir_path = "tmp" ++ Dir.path.sep_str ++ std.fmt.hex(rand_int);
|
|
1134
|
-
try runCommand(run, argv_list.items, has_side_effects, tmp_dir_path, .{
|
|
1135
|
-
.progress_node = prog_node,
|
|
1136
|
-
.watch = undefined, // not used by `runCommand`
|
|
1137
|
-
.web_server = null, // only needed for time reports
|
|
1138
|
-
.unit_test_timeout_ns = null, // don't time out fuzz tests for now
|
|
1139
|
-
.gpa = fuzz.gpa,
|
|
1140
|
-
}, .{
|
|
1141
|
-
.fuzz = fuzz,
|
|
1142
|
-
});
|
|
1143
|
-
}
|
|
1144
|
-
|
|
1145
|
-
fn populateGeneratedPaths(
|
|
1146
|
-
arena: std.mem.Allocator,
|
|
1147
|
-
output_placeholders: []const IndexedOutput,
|
|
1148
|
-
captured_stdout: ?*CapturedStdIo,
|
|
1149
|
-
captured_stderr: ?*CapturedStdIo,
|
|
1150
|
-
cache_root: Build.Cache.Directory,
|
|
1151
|
-
digest: *const Build.Cache.HexDigest,
|
|
1152
|
-
) !void {
|
|
1153
|
-
for (output_placeholders) |placeholder| {
|
|
1154
|
-
placeholder.output.generated_file.path = try cache_root.join(arena, &.{
|
|
1155
|
-
"o", digest, placeholder.output.basename,
|
|
1156
|
-
});
|
|
1157
|
-
}
|
|
1158
|
-
|
|
1159
|
-
if (captured_stdout) |captured| {
|
|
1160
|
-
captured.output.generated_file.path = try cache_root.join(arena, &.{
|
|
1161
|
-
"o", digest, captured.output.basename,
|
|
1162
|
-
});
|
|
1163
|
-
}
|
|
1164
|
-
|
|
1165
|
-
if (captured_stderr) |captured| {
|
|
1166
|
-
captured.output.generated_file.path = try cache_root.join(arena, &.{
|
|
1167
|
-
"o", digest, captured.output.basename,
|
|
1168
|
-
});
|
|
1169
|
-
}
|
|
1170
|
-
}
|
|
1171
|
-
|
|
1172
|
-
fn formatTerm(term: ?process.Child.Term, w: *std.Io.Writer) std.Io.Writer.Error!void {
|
|
1173
|
-
if (term) |t| switch (t) {
|
|
1174
|
-
.exited => |code| try w.print("exited with code {d}", .{code}),
|
|
1175
|
-
.signal => |sig| try w.print("terminated with signal {t}", .{sig}),
|
|
1176
|
-
.stopped => |sig| try w.print("stopped with signal {t}", .{sig}),
|
|
1177
|
-
.unknown => |code| try w.print("terminated for unknown reason with code {d}", .{code}),
|
|
1178
|
-
} else {
|
|
1179
|
-
try w.writeAll("exited with any code");
|
|
1180
|
-
}
|
|
1181
|
-
}
|
|
1182
|
-
fn fmtTerm(term: ?process.Child.Term) std.fmt.Alt(?process.Child.Term, formatTerm) {
|
|
1183
|
-
return .{ .data = term };
|
|
1184
|
-
}
|
|
1185
|
-
|
|
1186
|
-
fn termMatches(expected: ?process.Child.Term, actual: process.Child.Term) bool {
|
|
1187
|
-
return if (expected) |e| switch (e) {
|
|
1188
|
-
.exited => |expected_code| switch (actual) {
|
|
1189
|
-
.exited => |actual_code| expected_code == actual_code,
|
|
1190
|
-
else => false,
|
|
1191
|
-
},
|
|
1192
|
-
.signal => |expected_sig| switch (actual) {
|
|
1193
|
-
.signal => |actual_sig| expected_sig == actual_sig,
|
|
1194
|
-
else => false,
|
|
1195
|
-
},
|
|
1196
|
-
.stopped => |expected_sig| switch (actual) {
|
|
1197
|
-
.stopped => |actual_sig| expected_sig == actual_sig,
|
|
1198
|
-
else => false,
|
|
1199
|
-
},
|
|
1200
|
-
.unknown => |expected_code| switch (actual) {
|
|
1201
|
-
.unknown => |actual_code| expected_code == actual_code,
|
|
1202
|
-
else => false,
|
|
1203
|
-
},
|
|
1204
|
-
} else switch (actual) {
|
|
1205
|
-
.exited => true,
|
|
1206
|
-
else => false,
|
|
1207
|
-
};
|
|
1208
|
-
}
|
|
1209
|
-
|
|
1210
|
-
const FuzzContext = struct {
|
|
1211
|
-
fuzz: *std.Build.Fuzz,
|
|
1212
|
-
};
|
|
1213
|
-
|
|
1214
|
-
fn runCommand(
|
|
1215
|
-
run: *Run,
|
|
1216
|
-
argv: []const []const u8,
|
|
1217
|
-
has_side_effects: bool,
|
|
1218
|
-
output_dir_path: []const u8,
|
|
1219
|
-
options: Step.MakeOptions,
|
|
1220
|
-
fuzz_context: ?FuzzContext,
|
|
1221
|
-
) !void {
|
|
1222
|
-
const step = &run.step;
|
|
1223
|
-
const b = step.owner;
|
|
1224
|
-
const arena = b.allocator;
|
|
1225
|
-
const gpa = options.gpa;
|
|
1226
|
-
const io = b.graph.io;
|
|
1227
|
-
|
|
1228
|
-
const cwd: process.Child.Cwd = if (run.cwd) |lazy_cwd| .{ .path = lazy_cwd.getPath2(b, step) } else .inherit;
|
|
1229
|
-
|
|
1230
|
-
try step.handleChildProcUnsupported();
|
|
1231
|
-
try Step.handleVerbose2(step.owner, cwd, run.environ_map, argv);
|
|
1232
|
-
|
|
1233
|
-
const allow_skip = switch (run.stdio) {
|
|
1234
|
-
.check, .zig_test => run.skip_foreign_checks,
|
|
1235
|
-
else => false,
|
|
1236
|
-
};
|
|
1237
|
-
|
|
1238
|
-
var interp_argv = std.array_list.Managed([]const u8).init(b.allocator);
|
|
1239
|
-
defer interp_argv.deinit();
|
|
1240
|
-
|
|
1241
|
-
var environ_map: EnvMap = env: {
|
|
1242
|
-
const orig = run.environ_map orelse &b.graph.environ_map;
|
|
1243
|
-
break :env try orig.clone(gpa);
|
|
1244
|
-
};
|
|
1245
|
-
defer environ_map.deinit();
|
|
1246
|
-
|
|
1247
|
-
const opt_generic_result = spawnChildAndCollect(run, argv, &environ_map, has_side_effects, options, fuzz_context) catch |err| term: {
|
|
1248
|
-
// InvalidExe: cpu arch mismatch
|
|
1249
|
-
// FileNotFound: can happen with a wrong dynamic linker path
|
|
1250
|
-
if (err == error.InvalidExe or err == error.FileNotFound) interpret: {
|
|
1251
|
-
// TODO: learn the target from the binary directly rather than from
|
|
1252
|
-
// relying on it being a Compile step. This will make this logic
|
|
1253
|
-
// work even for the edge case that the binary was produced by a
|
|
1254
|
-
// third party.
|
|
1255
|
-
const exe = switch (run.argv.items[0]) {
|
|
1256
|
-
.artifact => |exe| exe.artifact,
|
|
1257
|
-
else => break :interpret,
|
|
1258
|
-
};
|
|
1259
|
-
switch (exe.kind) {
|
|
1260
|
-
.exe, .@"test" => {},
|
|
1261
|
-
else => break :interpret,
|
|
1262
|
-
}
|
|
1263
|
-
|
|
1264
|
-
const root_target = exe.rootModuleTarget();
|
|
1265
|
-
const need_cross_libc = exe.is_linking_libc and
|
|
1266
|
-
(root_target.isGnuLibC() or (root_target.isMuslLibC() and exe.linkage == .dynamic));
|
|
1267
|
-
const other_target = exe.root_module.resolved_target.?.result;
|
|
1268
|
-
switch (std.zig.system.getExternalExecutor(io, &b.graph.host.result, &other_target, .{
|
|
1269
|
-
.qemu_fixes_dl = need_cross_libc and b.libc_runtimes_dir != null,
|
|
1270
|
-
.link_libc = exe.is_linking_libc,
|
|
1271
|
-
})) {
|
|
1272
|
-
.native, .rosetta => {
|
|
1273
|
-
if (allow_skip) return error.MakeSkipped;
|
|
1274
|
-
break :interpret;
|
|
1275
|
-
},
|
|
1276
|
-
.wine => |bin_name| {
|
|
1277
|
-
if (b.enable_wine) {
|
|
1278
|
-
try interp_argv.append(bin_name);
|
|
1279
|
-
try interp_argv.appendSlice(argv);
|
|
1280
|
-
|
|
1281
|
-
// Wine's excessive stderr logging is only situationally helpful. Disable it by default, but
|
|
1282
|
-
// allow the user to override it (e.g. with `WINEDEBUG=err+all`) if desired.
|
|
1283
|
-
if (environ_map.get("WINEDEBUG") == null) {
|
|
1284
|
-
try environ_map.put("WINEDEBUG", "-all");
|
|
1285
|
-
}
|
|
1286
|
-
} else {
|
|
1287
|
-
return failForeign(run, "-fwine", argv[0], exe);
|
|
1288
|
-
}
|
|
1289
|
-
},
|
|
1290
|
-
.qemu => |bin_name| {
|
|
1291
|
-
if (b.enable_qemu) {
|
|
1292
|
-
try interp_argv.append(bin_name);
|
|
1293
|
-
|
|
1294
|
-
if (need_cross_libc) {
|
|
1295
|
-
if (b.libc_runtimes_dir) |dir| {
|
|
1296
|
-
try interp_argv.append("-L");
|
|
1297
|
-
try interp_argv.append(b.pathJoin(&.{
|
|
1298
|
-
dir,
|
|
1299
|
-
try if (root_target.isGnuLibC()) std.zig.target.glibcRuntimeTriple(
|
|
1300
|
-
b.allocator,
|
|
1301
|
-
root_target.cpu.arch,
|
|
1302
|
-
root_target.os.tag,
|
|
1303
|
-
root_target.abi,
|
|
1304
|
-
) else if (root_target.isMuslLibC()) std.zig.target.muslRuntimeTriple(
|
|
1305
|
-
b.allocator,
|
|
1306
|
-
root_target.cpu.arch,
|
|
1307
|
-
root_target.abi,
|
|
1308
|
-
) else unreachable,
|
|
1309
|
-
}));
|
|
1310
|
-
} else return failForeign(run, "--libc-runtimes", argv[0], exe);
|
|
1311
|
-
}
|
|
1312
|
-
|
|
1313
|
-
try interp_argv.appendSlice(argv);
|
|
1314
|
-
} else return failForeign(run, "-fqemu", argv[0], exe);
|
|
1315
|
-
},
|
|
1316
|
-
.darling => |bin_name| {
|
|
1317
|
-
if (b.enable_darling) {
|
|
1318
|
-
try interp_argv.append(bin_name);
|
|
1319
|
-
try interp_argv.appendSlice(argv);
|
|
1320
|
-
} else {
|
|
1321
|
-
return failForeign(run, "-fdarling", argv[0], exe);
|
|
1322
|
-
}
|
|
1323
|
-
},
|
|
1324
|
-
.wasmtime => |bin_name| {
|
|
1325
|
-
if (b.enable_wasmtime) {
|
|
1326
|
-
try interp_argv.append(bin_name);
|
|
1327
|
-
try interp_argv.append("--dir=.");
|
|
1328
|
-
// Wasmtime doeesn't inherit environment variables from the parent process
|
|
1329
|
-
// by default. '-S inherit-env' was added in Wasmtime version 20.
|
|
1330
|
-
try interp_argv.append("-Sinherit-env");
|
|
1331
|
-
try interp_argv.append(argv[0]);
|
|
1332
|
-
try interp_argv.appendSlice(argv[1..]);
|
|
1333
|
-
} else {
|
|
1334
|
-
return failForeign(run, "-fwasmtime", argv[0], exe);
|
|
1335
|
-
}
|
|
1336
|
-
},
|
|
1337
|
-
.bad_dl => |foreign_dl| {
|
|
1338
|
-
if (allow_skip) return error.MakeSkipped;
|
|
1339
|
-
|
|
1340
|
-
const host_dl = b.graph.host.result.dynamic_linker.get() orelse "(none)";
|
|
1341
|
-
|
|
1342
|
-
return step.fail(
|
|
1343
|
-
\\the host system is unable to execute binaries from the target
|
|
1344
|
-
\\ because the host dynamic linker is '{s}',
|
|
1345
|
-
\\ while the target dynamic linker is '{s}'.
|
|
1346
|
-
\\ consider setting the dynamic linker or enabling skip_foreign_checks in the Run step
|
|
1347
|
-
, .{ host_dl, foreign_dl });
|
|
1348
|
-
},
|
|
1349
|
-
.bad_os_or_cpu => {
|
|
1350
|
-
if (allow_skip) return error.MakeSkipped;
|
|
1351
|
-
|
|
1352
|
-
const host_name = try b.graph.host.result.zigTriple(b.allocator);
|
|
1353
|
-
const foreign_name = try root_target.zigTriple(b.allocator);
|
|
1354
|
-
|
|
1355
|
-
return step.fail("the host system ({s}) is unable to execute binaries from the target ({s})", .{
|
|
1356
|
-
host_name, foreign_name,
|
|
1357
|
-
});
|
|
1358
|
-
},
|
|
1359
|
-
}
|
|
1360
|
-
|
|
1361
|
-
if (root_target.os.tag == .windows) {
|
|
1362
|
-
// On Windows we don't have rpaths so we have to add .dll search paths to PATH
|
|
1363
|
-
run.addPathForDynLibs(exe);
|
|
1364
|
-
}
|
|
1365
|
-
|
|
1366
|
-
gpa.free(step.result_failed_command.?);
|
|
1367
|
-
step.result_failed_command = null;
|
|
1368
|
-
try Step.handleVerbose2(step.owner, cwd, run.environ_map, interp_argv.items);
|
|
1369
|
-
|
|
1370
|
-
break :term spawnChildAndCollect(run, interp_argv.items, &environ_map, has_side_effects, options, fuzz_context) catch |e| {
|
|
1371
|
-
if (!run.failing_to_execute_foreign_is_an_error) return error.MakeSkipped;
|
|
1372
|
-
if (e == error.MakeFailed) return error.MakeFailed; // error already reported
|
|
1373
|
-
return step.fail("unable to spawn interpreter {s}: {t}", .{ interp_argv.items[0], e });
|
|
1374
|
-
};
|
|
1375
|
-
}
|
|
1376
|
-
if (err == error.MakeFailed) return error.MakeFailed; // error already reported
|
|
1377
|
-
|
|
1378
|
-
return step.fail("failed to spawn and capture stdio from {s}: {t}", .{ argv[0], err });
|
|
1379
|
-
};
|
|
1380
|
-
|
|
1381
|
-
const generic_result = opt_generic_result orelse {
|
|
1382
|
-
assert(run.stdio == .zig_test);
|
|
1383
|
-
// Specific errors have already been reported, and test results are populated. All we need
|
|
1384
|
-
// to do is report step failure if any test failed.
|
|
1385
|
-
if (!step.test_results.isSuccess()) return error.MakeFailed;
|
|
1386
|
-
return;
|
|
1387
|
-
};
|
|
1388
|
-
|
|
1389
|
-
assert(fuzz_context == null);
|
|
1390
|
-
assert(run.stdio != .zig_test);
|
|
1391
|
-
|
|
1392
|
-
// Capture stdout and stderr to GeneratedFile objects.
|
|
1393
|
-
const Stream = struct {
|
|
1394
|
-
captured: ?*CapturedStdIo,
|
|
1395
|
-
bytes: ?[]const u8,
|
|
1396
|
-
};
|
|
1397
|
-
for ([_]Stream{
|
|
1398
|
-
.{
|
|
1399
|
-
.captured = run.captured_stdout,
|
|
1400
|
-
.bytes = generic_result.stdout,
|
|
1401
|
-
},
|
|
1402
|
-
.{
|
|
1403
|
-
.captured = run.captured_stderr,
|
|
1404
|
-
.bytes = generic_result.stderr,
|
|
1405
|
-
},
|
|
1406
|
-
}) |stream| {
|
|
1407
|
-
if (stream.captured) |captured| {
|
|
1408
|
-
const output_components = .{ output_dir_path, captured.output.basename };
|
|
1409
|
-
const output_path = try b.cache_root.join(arena, &output_components);
|
|
1410
|
-
captured.output.generated_file.path = output_path;
|
|
1411
|
-
|
|
1412
|
-
const sub_path = b.pathJoin(&output_components);
|
|
1413
|
-
const sub_path_dirname = Dir.path.dirname(sub_path).?;
|
|
1414
|
-
b.cache_root.handle.createDirPath(io, sub_path_dirname) catch |err| {
|
|
1415
|
-
return step.fail("unable to make path '{f}{s}': {s}", .{
|
|
1416
|
-
b.cache_root, sub_path_dirname, @errorName(err),
|
|
1417
|
-
});
|
|
1418
|
-
};
|
|
1419
|
-
const data = switch (captured.trim_whitespace) {
|
|
1420
|
-
.none => stream.bytes.?,
|
|
1421
|
-
.all => mem.trim(u8, stream.bytes.?, &std.ascii.whitespace),
|
|
1422
|
-
.leading => mem.trimStart(u8, stream.bytes.?, &std.ascii.whitespace),
|
|
1423
|
-
.trailing => mem.trimEnd(u8, stream.bytes.?, &std.ascii.whitespace),
|
|
1424
|
-
};
|
|
1425
|
-
b.cache_root.handle.writeFile(io, .{ .sub_path = sub_path, .data = data }) catch |err| {
|
|
1426
|
-
return step.fail("unable to write file '{f}{s}': {s}", .{
|
|
1427
|
-
b.cache_root, sub_path, @errorName(err),
|
|
1428
|
-
});
|
|
1429
|
-
};
|
|
1430
|
-
}
|
|
1431
|
-
}
|
|
1432
|
-
|
|
1433
|
-
switch (run.stdio) {
|
|
1434
|
-
.zig_test => unreachable,
|
|
1435
|
-
.check => |checks| for (checks.items) |check| switch (check) {
|
|
1436
|
-
.expect_stderr_exact => |expected_bytes| {
|
|
1437
|
-
if (!mem.eql(u8, expected_bytes, generic_result.stderr.?)) {
|
|
1438
|
-
return step.fail(
|
|
1439
|
-
\\========= expected this stderr: =========
|
|
1440
|
-
\\{s}
|
|
1441
|
-
\\========= but found: ====================
|
|
1442
|
-
\\{s}
|
|
1443
|
-
, .{
|
|
1444
|
-
expected_bytes,
|
|
1445
|
-
generic_result.stderr.?,
|
|
1446
|
-
});
|
|
1447
|
-
}
|
|
1448
|
-
},
|
|
1449
|
-
.expect_stderr_match => |match| {
|
|
1450
|
-
if (mem.find(u8, generic_result.stderr.?, match) == null) {
|
|
1451
|
-
return step.fail(
|
|
1452
|
-
\\========= expected to find in stderr: =========
|
|
1453
|
-
\\{s}
|
|
1454
|
-
\\========= but stderr does not contain it: =====
|
|
1455
|
-
\\{s}
|
|
1456
|
-
, .{
|
|
1457
|
-
match,
|
|
1458
|
-
generic_result.stderr.?,
|
|
1459
|
-
});
|
|
1460
|
-
}
|
|
1461
|
-
},
|
|
1462
|
-
.expect_stdout_exact => |expected_bytes| {
|
|
1463
|
-
if (!mem.eql(u8, expected_bytes, generic_result.stdout.?)) {
|
|
1464
|
-
return step.fail(
|
|
1465
|
-
\\========= expected this stdout: =========
|
|
1466
|
-
\\{s}
|
|
1467
|
-
\\========= but found: ====================
|
|
1468
|
-
\\{s}
|
|
1469
|
-
, .{
|
|
1470
|
-
expected_bytes,
|
|
1471
|
-
generic_result.stdout.?,
|
|
1472
|
-
});
|
|
1473
|
-
}
|
|
1474
|
-
},
|
|
1475
|
-
.expect_stdout_match => |match| {
|
|
1476
|
-
if (mem.find(u8, generic_result.stdout.?, match) == null) {
|
|
1477
|
-
return step.fail(
|
|
1478
|
-
\\========= expected to find in stdout: =========
|
|
1479
|
-
\\{s}
|
|
1480
|
-
\\========= but stdout does not contain it: =====
|
|
1481
|
-
\\{s}
|
|
1482
|
-
, .{
|
|
1483
|
-
match,
|
|
1484
|
-
generic_result.stdout.?,
|
|
1485
|
-
});
|
|
1486
|
-
}
|
|
1487
|
-
},
|
|
1488
|
-
.expect_term => |expected_term| {
|
|
1489
|
-
if (!termMatches(expected_term, generic_result.term)) {
|
|
1490
|
-
return step.fail("process {f} (expected {f})", .{
|
|
1491
|
-
fmtTerm(generic_result.term),
|
|
1492
|
-
fmtTerm(expected_term),
|
|
1493
|
-
});
|
|
1494
|
-
}
|
|
1495
|
-
},
|
|
1496
|
-
},
|
|
1497
|
-
else => {
|
|
1498
|
-
// On failure, report captured stderr like normal standard error output.
|
|
1499
|
-
const bad_exit = switch (generic_result.term) {
|
|
1500
|
-
.exited => |code| code != 0,
|
|
1501
|
-
.signal, .stopped, .unknown => true,
|
|
1502
|
-
};
|
|
1503
|
-
if (bad_exit) {
|
|
1504
|
-
if (generic_result.stderr) |bytes| {
|
|
1505
|
-
run.step.result_stderr = bytes;
|
|
1506
|
-
}
|
|
1507
|
-
}
|
|
1508
|
-
|
|
1509
|
-
try step.handleChildProcessTerm(generic_result.term);
|
|
1510
|
-
},
|
|
1511
|
-
}
|
|
1512
|
-
}
|
|
1513
|
-
|
|
1514
|
-
const EvalGenericResult = struct {
|
|
1515
|
-
term: process.Child.Term,
|
|
1516
|
-
stdout: ?[]const u8,
|
|
1517
|
-
stderr: ?[]const u8,
|
|
1518
|
-
};
|
|
1519
|
-
|
|
1520
|
-
fn spawnChildAndCollect(
|
|
1521
|
-
run: *Run,
|
|
1522
|
-
argv: []const []const u8,
|
|
1523
|
-
environ_map: *EnvMap,
|
|
1524
|
-
has_side_effects: bool,
|
|
1525
|
-
options: Step.MakeOptions,
|
|
1526
|
-
fuzz_context: ?FuzzContext,
|
|
1527
|
-
) !?EvalGenericResult {
|
|
1528
|
-
const b = run.step.owner;
|
|
1529
|
-
const graph = b.graph;
|
|
1530
|
-
const io = graph.io;
|
|
1531
|
-
|
|
1532
|
-
if (fuzz_context != null) {
|
|
1533
|
-
assert(!has_side_effects);
|
|
1534
|
-
assert(run.stdio == .zig_test);
|
|
1535
|
-
}
|
|
1536
|
-
|
|
1537
|
-
const child_cwd: process.Child.Cwd = if (run.cwd) |lazy_cwd| .{ .path = lazy_cwd.getPath2(b, &run.step) } else .inherit;
|
|
1538
|
-
|
|
1539
|
-
// If an error occurs, it's caused by this command:
|
|
1540
|
-
assert(run.step.result_failed_command == null);
|
|
1541
|
-
run.step.result_failed_command = try Step.allocPrintCmd(options.gpa, child_cwd, .{
|
|
1542
|
-
.child = environ_map,
|
|
1543
|
-
.parent = &graph.environ_map,
|
|
1544
|
-
}, argv);
|
|
1545
|
-
|
|
1546
|
-
var spawn_options: process.SpawnOptions = .{
|
|
1547
|
-
.argv = argv,
|
|
1548
|
-
.cwd = child_cwd,
|
|
1549
|
-
.environ_map = environ_map,
|
|
1550
|
-
.request_resource_usage_statistics = true,
|
|
1551
|
-
.stdin = if (run.stdin != .none) s: {
|
|
1552
|
-
assert(run.stdio != .inherit);
|
|
1553
|
-
break :s .pipe;
|
|
1554
|
-
} else switch (run.stdio) {
|
|
1555
|
-
.infer_from_args => if (has_side_effects) .inherit else .ignore,
|
|
1556
|
-
.inherit => .inherit,
|
|
1557
|
-
.check => .ignore,
|
|
1558
|
-
.zig_test => .pipe,
|
|
1559
|
-
},
|
|
1560
|
-
.stdout = if (run.captured_stdout != null) .pipe else switch (run.stdio) {
|
|
1561
|
-
.infer_from_args => if (has_side_effects) .inherit else .ignore,
|
|
1562
|
-
.inherit => .inherit,
|
|
1563
|
-
.check => |checks| if (checksContainStdout(checks.items)) .pipe else .ignore,
|
|
1564
|
-
.zig_test => .pipe,
|
|
1565
|
-
},
|
|
1566
|
-
.stderr = if (run.captured_stderr != null) .pipe else switch (run.stdio) {
|
|
1567
|
-
.infer_from_args => if (has_side_effects) .inherit else .pipe,
|
|
1568
|
-
.inherit => .inherit,
|
|
1569
|
-
.check => .pipe,
|
|
1570
|
-
.zig_test => .pipe,
|
|
1571
|
-
},
|
|
1572
|
-
};
|
|
1573
|
-
|
|
1574
|
-
if (run.stdio == .zig_test) {
|
|
1575
|
-
const started: Io.Clock.Timestamp = .now(io, .awake);
|
|
1576
|
-
const result = evalZigTest(run, spawn_options, options, fuzz_context) catch |err| switch (err) {
|
|
1577
|
-
error.Canceled => |e| return e,
|
|
1578
|
-
else => |e| e,
|
|
1579
|
-
};
|
|
1580
|
-
run.step.result_duration_ns = @intCast(started.untilNow(io).raw.nanoseconds);
|
|
1581
|
-
try result;
|
|
1582
|
-
return null;
|
|
1583
|
-
} else {
|
|
1584
|
-
const inherit = spawn_options.stdout == .inherit or spawn_options.stderr == .inherit;
|
|
1585
|
-
if (!run.disable_zig_progress and !inherit) {
|
|
1586
|
-
spawn_options.progress_node = options.progress_node;
|
|
1587
|
-
}
|
|
1588
|
-
const terminal_mode: Io.Terminal.Mode = if (inherit) m: {
|
|
1589
|
-
const stderr = try io.lockStderr(&.{}, graph.stderr_mode);
|
|
1590
|
-
break :m stderr.terminal_mode;
|
|
1591
|
-
} else .no_color;
|
|
1592
|
-
defer if (inherit) io.unlockStderr();
|
|
1593
|
-
try setColorEnvironmentVariables(run, environ_map, terminal_mode);
|
|
1594
|
-
|
|
1595
|
-
const started: Io.Clock.Timestamp = .now(io, .awake);
|
|
1596
|
-
const result = evalGeneric(run, spawn_options) catch |err| switch (err) {
|
|
1597
|
-
error.Canceled => |e| return e,
|
|
1598
|
-
else => |e| e,
|
|
1599
|
-
};
|
|
1600
|
-
run.step.result_duration_ns = @intCast(started.untilNow(io).raw.nanoseconds);
|
|
1601
|
-
return try result;
|
|
1602
|
-
}
|
|
1603
|
-
}
|
|
1604
|
-
|
|
1605
|
-
fn setColorEnvironmentVariables(run: *Run, environ_map: *EnvMap, terminal_mode: Io.Terminal.Mode) !void {
|
|
1606
|
-
color: switch (run.color) {
|
|
1607
|
-
.manual => {},
|
|
1608
|
-
.enable => {
|
|
1609
|
-
try environ_map.put("CLICOLOR_FORCE", "1");
|
|
1610
|
-
_ = environ_map.swapRemove("NO_COLOR");
|
|
1611
|
-
},
|
|
1612
|
-
.disable => {
|
|
1613
|
-
try environ_map.put("NO_COLOR", "1");
|
|
1614
|
-
_ = environ_map.swapRemove("CLICOLOR_FORCE");
|
|
1615
|
-
},
|
|
1616
|
-
.inherit => switch (terminal_mode) {
|
|
1617
|
-
.no_color, .windows_api => continue :color .disable,
|
|
1618
|
-
.escape_codes => continue :color .enable,
|
|
1619
|
-
},
|
|
1620
|
-
.auto => {
|
|
1621
|
-
const capture_stderr = run.captured_stderr != null or switch (run.stdio) {
|
|
1622
|
-
.check => |checks| checksContainStderr(checks.items),
|
|
1623
|
-
.infer_from_args, .inherit, .zig_test => false,
|
|
1624
|
-
};
|
|
1625
|
-
if (capture_stderr) {
|
|
1626
|
-
continue :color .disable;
|
|
1627
|
-
} else {
|
|
1628
|
-
continue :color .inherit;
|
|
1629
|
-
}
|
|
1630
|
-
},
|
|
1631
|
-
}
|
|
1632
|
-
}
|
|
1633
|
-
|
|
1634
|
-
const StdioPollEnum = enum { stdout, stderr };
|
|
1635
|
-
|
|
1636
|
-
fn evalZigTest(
|
|
1637
|
-
run: *Run,
|
|
1638
|
-
spawn_options: process.SpawnOptions,
|
|
1639
|
-
options: Step.MakeOptions,
|
|
1640
|
-
fuzz_context: ?FuzzContext,
|
|
1641
|
-
) !void {
|
|
1642
|
-
if (fuzz_context != null) {
|
|
1643
|
-
try evalFuzzTest(run, spawn_options, options, fuzz_context.?);
|
|
1644
|
-
return;
|
|
1645
|
-
}
|
|
1646
|
-
|
|
1647
|
-
const step_owner = run.step.owner;
|
|
1648
|
-
const gpa = step_owner.allocator;
|
|
1649
|
-
const arena = step_owner.allocator;
|
|
1650
|
-
const io = step_owner.graph.io;
|
|
1651
|
-
|
|
1652
|
-
// We will update this every time a child runs.
|
|
1653
|
-
run.step.result_peak_rss = 0;
|
|
1654
|
-
|
|
1655
|
-
var test_results: Step.TestResults = .{
|
|
1656
|
-
.test_count = 0,
|
|
1657
|
-
.skip_count = 0,
|
|
1658
|
-
.fail_count = 0,
|
|
1659
|
-
.crash_count = 0,
|
|
1660
|
-
.timeout_count = 0,
|
|
1661
|
-
.leak_count = 0,
|
|
1662
|
-
.log_err_count = 0,
|
|
1663
|
-
};
|
|
1664
|
-
var test_metadata: ?TestMetadata = null;
|
|
1665
|
-
|
|
1666
|
-
while (true) {
|
|
1667
|
-
var child = try process.spawn(io, spawn_options);
|
|
1668
|
-
var multi_reader_buffer: Io.File.MultiReader.Buffer(2) = undefined;
|
|
1669
|
-
var multi_reader: Io.File.MultiReader = undefined;
|
|
1670
|
-
multi_reader.init(gpa, io, multi_reader_buffer.toStreams(), &.{ child.stdout.?, child.stderr.? });
|
|
1671
|
-
var child_killed = false;
|
|
1672
|
-
defer if (!child_killed) {
|
|
1673
|
-
child.kill(io);
|
|
1674
|
-
multi_reader.deinit();
|
|
1675
|
-
run.step.result_peak_rss = @max(
|
|
1676
|
-
run.step.result_peak_rss,
|
|
1677
|
-
child.resource_usage_statistics.getMaxRss() orelse 0,
|
|
1678
|
-
);
|
|
1679
|
-
};
|
|
1680
|
-
|
|
1681
|
-
switch (try waitZigTest(
|
|
1682
|
-
run,
|
|
1683
|
-
&child,
|
|
1684
|
-
options,
|
|
1685
|
-
&multi_reader,
|
|
1686
|
-
&test_metadata,
|
|
1687
|
-
&test_results,
|
|
1688
|
-
)) {
|
|
1689
|
-
.write_failed => |err| {
|
|
1690
|
-
// The runner unexpectedly closed a stdio pipe, which means a crash. Make sure we've captured
|
|
1691
|
-
// all available stderr to make our error output as useful as possible.
|
|
1692
|
-
const stderr_fr = multi_reader.fileReader(1);
|
|
1693
|
-
while (stderr_fr.interface.fillMore()) |_| {} else |e| switch (e) {
|
|
1694
|
-
error.ReadFailed => return stderr_fr.err.?,
|
|
1695
|
-
error.EndOfStream => {},
|
|
1696
|
-
}
|
|
1697
|
-
run.step.result_stderr = try arena.dupe(u8, stderr_fr.interface.buffered());
|
|
1698
|
-
|
|
1699
|
-
// Clean up everything and wait for the child to exit.
|
|
1700
|
-
child.stdin.?.close(io);
|
|
1701
|
-
child.stdin = null;
|
|
1702
|
-
multi_reader.deinit();
|
|
1703
|
-
child_killed = true;
|
|
1704
|
-
const term = try child.wait(io);
|
|
1705
|
-
run.step.result_peak_rss = @max(
|
|
1706
|
-
run.step.result_peak_rss,
|
|
1707
|
-
child.resource_usage_statistics.getMaxRss() orelse 0,
|
|
1708
|
-
);
|
|
1709
|
-
|
|
1710
|
-
// The individual unit test results are irrelevant: the test runner itself broke!
|
|
1711
|
-
// Fail immediately without populating `s.test_results`.
|
|
1712
|
-
return run.step.fail("unable to write stdin ({t}); test process unexpectedly {f}", .{ err, fmtTerm(term) });
|
|
1713
|
-
},
|
|
1714
|
-
.no_poll => |no_poll| {
|
|
1715
|
-
// This might be a success (we requested exit and the child dutifully closed stdout) or
|
|
1716
|
-
// a crash of some kind. Either way, the child will terminate by itself -- wait for it.
|
|
1717
|
-
const stderr_reader = multi_reader.reader(1);
|
|
1718
|
-
const stderr_owned = try arena.dupe(u8, stderr_reader.buffered());
|
|
1719
|
-
|
|
1720
|
-
// Clean up everything and wait for the child to exit.
|
|
1721
|
-
child.stdin.?.close(io);
|
|
1722
|
-
child.stdin = null;
|
|
1723
|
-
multi_reader.deinit();
|
|
1724
|
-
child_killed = true;
|
|
1725
|
-
const term = try child.wait(io);
|
|
1726
|
-
run.step.result_peak_rss = @max(
|
|
1727
|
-
run.step.result_peak_rss,
|
|
1728
|
-
child.resource_usage_statistics.getMaxRss() orelse 0,
|
|
1729
|
-
);
|
|
1730
|
-
|
|
1731
|
-
if (no_poll.active_test_index) |test_index| {
|
|
1732
|
-
// A test was running, so this is definitely a crash. Report it against that
|
|
1733
|
-
// test, and continue to the next test.
|
|
1734
|
-
test_metadata.?.ns_per_test[test_index] = no_poll.ns_elapsed;
|
|
1735
|
-
test_results.crash_count += 1;
|
|
1736
|
-
try run.step.addError("'{s}' {f}{s}{s}", .{
|
|
1737
|
-
test_metadata.?.testName(test_index),
|
|
1738
|
-
fmtTerm(term),
|
|
1739
|
-
if (stderr_owned.len != 0) " with stderr:\n" else "",
|
|
1740
|
-
std.mem.trim(u8, stderr_owned, "\n"),
|
|
1741
|
-
});
|
|
1742
|
-
continue;
|
|
1743
|
-
}
|
|
1744
|
-
|
|
1745
|
-
// Report an error if the child terminated uncleanly or if we were still trying to run more tests.
|
|
1746
|
-
run.step.result_stderr = stderr_owned;
|
|
1747
|
-
const tests_done = test_metadata != null and test_metadata.?.next_index == std.math.maxInt(u32);
|
|
1748
|
-
if (!tests_done or !termMatches(.{ .exited = 0 }, term)) {
|
|
1749
|
-
// The individual unit test results are irrelevant: the test runner itself broke!
|
|
1750
|
-
// Fail immediately without populating `s.test_results`.
|
|
1751
|
-
return run.step.fail("test process unexpectedly {f}", .{fmtTerm(term)});
|
|
1752
|
-
}
|
|
1753
|
-
|
|
1754
|
-
// We're done with all of the tests! Commit the test results and return.
|
|
1755
|
-
run.step.test_results = test_results;
|
|
1756
|
-
if (test_metadata) |tm| {
|
|
1757
|
-
run.cached_test_metadata = tm.toCachedTestMetadata();
|
|
1758
|
-
if (options.web_server) |ws| {
|
|
1759
|
-
if (run.step.owner.graph.time_report) {
|
|
1760
|
-
ws.updateTimeReportRunTest(
|
|
1761
|
-
run,
|
|
1762
|
-
&run.cached_test_metadata.?,
|
|
1763
|
-
tm.ns_per_test,
|
|
1764
|
-
);
|
|
1765
|
-
}
|
|
1766
|
-
}
|
|
1767
|
-
}
|
|
1768
|
-
return;
|
|
1769
|
-
},
|
|
1770
|
-
.timeout => |timeout| {
|
|
1771
|
-
const stderr_reader = multi_reader.reader(1);
|
|
1772
|
-
const stderr = stderr_reader.buffered();
|
|
1773
|
-
stderr_reader.tossBuffered();
|
|
1774
|
-
if (timeout.active_test_index) |test_index| {
|
|
1775
|
-
// A test was running. Report the timeout against that test, and continue on to
|
|
1776
|
-
// the next test.
|
|
1777
|
-
test_metadata.?.ns_per_test[test_index] = timeout.ns_elapsed;
|
|
1778
|
-
test_results.timeout_count += 1;
|
|
1779
|
-
try run.step.addError("'{s}' timed out after {f}{s}{s}", .{
|
|
1780
|
-
test_metadata.?.testName(test_index),
|
|
1781
|
-
Io.Duration{ .nanoseconds = timeout.ns_elapsed },
|
|
1782
|
-
if (stderr.len != 0) " with stderr:\n" else "",
|
|
1783
|
-
std.mem.trim(u8, stderr, "\n"),
|
|
1784
|
-
});
|
|
1785
|
-
continue;
|
|
1786
|
-
}
|
|
1787
|
-
// Just log an error and let the child be killed.
|
|
1788
|
-
run.step.result_stderr = try arena.dupe(u8, stderr);
|
|
1789
|
-
// The individual unit test results in `results` are irrelevant: the test runner
|
|
1790
|
-
// is broken! Fail immediately without populating `s.test_results`.
|
|
1791
|
-
return run.step.fail("test runner failed to respond for {f}", .{Io.Duration{ .nanoseconds = timeout.ns_elapsed }});
|
|
1792
|
-
},
|
|
1793
|
-
}
|
|
1794
|
-
comptime unreachable;
|
|
1795
|
-
}
|
|
1796
|
-
}
|
|
1797
|
-
|
|
1798
|
-
/// Reads stdout of a Zig test process until a termination condition is reached:
|
|
1799
|
-
/// * A write fails, indicating the child unexpectedly closed stdin
|
|
1800
|
-
/// * A test (or a response from the test runner) times out
|
|
1801
|
-
/// * The wait fails, indicating the child closed stdout and stderr
|
|
1802
|
-
fn waitZigTest(
|
|
1803
|
-
run: *Run,
|
|
1804
|
-
child: *process.Child,
|
|
1805
|
-
options: Step.MakeOptions,
|
|
1806
|
-
multi_reader: *Io.File.MultiReader,
|
|
1807
|
-
opt_metadata: *?TestMetadata,
|
|
1808
|
-
results: *Step.TestResults,
|
|
1809
|
-
) !union(enum) {
|
|
1810
|
-
write_failed: anyerror,
|
|
1811
|
-
no_poll: struct {
|
|
1812
|
-
active_test_index: ?u32,
|
|
1813
|
-
ns_elapsed: u64,
|
|
1814
|
-
},
|
|
1815
|
-
timeout: struct {
|
|
1816
|
-
active_test_index: ?u32,
|
|
1817
|
-
ns_elapsed: u64,
|
|
1818
|
-
},
|
|
1819
|
-
} {
|
|
1820
|
-
const gpa = run.step.owner.allocator;
|
|
1821
|
-
const arena = run.step.owner.allocator;
|
|
1822
|
-
const io = run.step.owner.graph.io;
|
|
1823
|
-
|
|
1824
|
-
var sub_prog_node: ?std.Progress.Node = null;
|
|
1825
|
-
defer if (sub_prog_node) |n| n.end();
|
|
1826
|
-
|
|
1827
|
-
if (opt_metadata.*) |*md| {
|
|
1828
|
-
// Previous unit test process died or was killed; we're continuing where it left off
|
|
1829
|
-
requestNextTest(io, child.stdin.?, md, &sub_prog_node) catch |err| return .{ .write_failed = err };
|
|
1830
|
-
} else {
|
|
1831
|
-
// Running unit tests normally
|
|
1832
|
-
run.fuzz_tests.clearRetainingCapacity();
|
|
1833
|
-
sendMessage(io, child.stdin.?, .query_test_metadata) catch |err| return .{ .write_failed = err };
|
|
1834
|
-
}
|
|
1835
|
-
|
|
1836
|
-
var active_test_index: ?u32 = null;
|
|
1837
|
-
|
|
1838
|
-
var last_update: Io.Clock.Timestamp = .now(io, .awake);
|
|
1839
|
-
|
|
1840
|
-
// This timeout is used when we're waiting on the test runner itself rather than a user-specified
|
|
1841
|
-
// test. For instance, if the test runner leaves this much time between us requesting a test to
|
|
1842
|
-
// start and it acknowledging the test starting, we terminate the child and raise an error. This
|
|
1843
|
-
// *should* never happen, but could in theory be caused by some very unlucky IB in a test.
|
|
1844
|
-
const response_timeout: Io.Clock.Duration = t: {
|
|
1845
|
-
const ns = @max(options.unit_test_timeout_ns orelse 0, 60 * std.time.ns_per_s);
|
|
1846
|
-
break :t .{ .clock = .awake, .raw = .fromNanoseconds(ns) };
|
|
1847
|
-
};
|
|
1848
|
-
const test_timeout: ?Io.Clock.Duration = if (options.unit_test_timeout_ns) |ns| .{
|
|
1849
|
-
.clock = .awake,
|
|
1850
|
-
.raw = .fromNanoseconds(ns),
|
|
1851
|
-
} else null;
|
|
1852
|
-
|
|
1853
|
-
const stdout = multi_reader.reader(0);
|
|
1854
|
-
const stderr = multi_reader.reader(1);
|
|
1855
|
-
const Header = std.zig.Server.Message.Header;
|
|
1856
|
-
|
|
1857
|
-
while (true) {
|
|
1858
|
-
const timeout: Io.Timeout = t: {
|
|
1859
|
-
const opt_duration = if (active_test_index == null) response_timeout else test_timeout;
|
|
1860
|
-
const duration = opt_duration orelse break :t .none;
|
|
1861
|
-
break :t .{ .deadline = last_update.addDuration(duration) };
|
|
1862
|
-
};
|
|
1863
|
-
|
|
1864
|
-
// This block is exited when `stdout` contains enough bytes for a `Header`.
|
|
1865
|
-
header_ready: {
|
|
1866
|
-
if (stdout.buffered().len >= @sizeOf(Header)) {
|
|
1867
|
-
// We already have one, no need to poll!
|
|
1868
|
-
break :header_ready;
|
|
1869
|
-
}
|
|
1870
|
-
|
|
1871
|
-
multi_reader.fill(64, timeout) catch |err| switch (err) {
|
|
1872
|
-
error.Timeout => return .{ .timeout = .{
|
|
1873
|
-
.active_test_index = active_test_index,
|
|
1874
|
-
.ns_elapsed = @intCast(last_update.untilNow(io).raw.nanoseconds),
|
|
1875
|
-
} },
|
|
1876
|
-
error.EndOfStream => return .{ .no_poll = .{
|
|
1877
|
-
.active_test_index = active_test_index,
|
|
1878
|
-
.ns_elapsed = @intCast(last_update.untilNow(io).raw.nanoseconds),
|
|
1879
|
-
} },
|
|
1880
|
-
else => |e| return e,
|
|
1881
|
-
};
|
|
1882
|
-
|
|
1883
|
-
continue;
|
|
1884
|
-
}
|
|
1885
|
-
// There is definitely a header available now -- read it.
|
|
1886
|
-
const header = stdout.takeStruct(Header, .little) catch unreachable;
|
|
1887
|
-
|
|
1888
|
-
while (stdout.buffered().len < header.bytes_len) {
|
|
1889
|
-
multi_reader.fill(64, timeout) catch |err| switch (err) {
|
|
1890
|
-
error.Timeout => return .{ .timeout = .{
|
|
1891
|
-
.active_test_index = active_test_index,
|
|
1892
|
-
.ns_elapsed = @intCast(last_update.untilNow(io).raw.nanoseconds),
|
|
1893
|
-
} },
|
|
1894
|
-
error.EndOfStream => return .{ .no_poll = .{
|
|
1895
|
-
.active_test_index = active_test_index,
|
|
1896
|
-
.ns_elapsed = @intCast(last_update.untilNow(io).raw.nanoseconds),
|
|
1897
|
-
} },
|
|
1898
|
-
else => |e| return e,
|
|
1899
|
-
};
|
|
1900
|
-
}
|
|
1901
|
-
|
|
1902
|
-
const body = stdout.take(header.bytes_len) catch unreachable;
|
|
1903
|
-
var body_r: std.Io.Reader = .fixed(body);
|
|
1904
|
-
switch (header.tag) {
|
|
1905
|
-
.zig_version => {
|
|
1906
|
-
if (!std.mem.eql(u8, builtin.zig_version_string, body)) return run.step.fail(
|
|
1907
|
-
"zig version mismatch build runner vs compiler: '{s}' vs '{s}'",
|
|
1908
|
-
.{ builtin.zig_version_string, body },
|
|
1909
|
-
);
|
|
1910
|
-
},
|
|
1911
|
-
.test_metadata => {
|
|
1912
|
-
// `metadata` would only be populated if we'd already seen a `test_metadata`, but we
|
|
1913
|
-
// only request it once (and importantly, we don't re-request it if we kill and
|
|
1914
|
-
// restart the test runner).
|
|
1915
|
-
assert(opt_metadata.* == null);
|
|
1916
|
-
|
|
1917
|
-
const tm_hdr = body_r.takeStruct(std.zig.Server.Message.TestMetadata, .little) catch unreachable;
|
|
1918
|
-
results.test_count = tm_hdr.tests_len;
|
|
1919
|
-
|
|
1920
|
-
const names = try arena.alloc(u32, results.test_count);
|
|
1921
|
-
for (names) |*dest| dest.* = body_r.takeInt(u32, .little) catch unreachable;
|
|
1922
|
-
|
|
1923
|
-
const expected_panic_msgs = try arena.alloc(u32, results.test_count);
|
|
1924
|
-
for (expected_panic_msgs) |*dest| dest.* = body_r.takeInt(u32, .little) catch unreachable;
|
|
1925
|
-
|
|
1926
|
-
const string_bytes = body_r.take(tm_hdr.string_bytes_len) catch unreachable;
|
|
1927
|
-
|
|
1928
|
-
options.progress_node.setEstimatedTotalItems(names.len);
|
|
1929
|
-
opt_metadata.* = .{
|
|
1930
|
-
.string_bytes = try arena.dupe(u8, string_bytes),
|
|
1931
|
-
.ns_per_test = try arena.alloc(u64, results.test_count),
|
|
1932
|
-
.names = names,
|
|
1933
|
-
.expected_panic_msgs = expected_panic_msgs,
|
|
1934
|
-
.next_index = 0,
|
|
1935
|
-
.prog_node = options.progress_node,
|
|
1936
|
-
};
|
|
1937
|
-
@memset(opt_metadata.*.?.ns_per_test, std.math.maxInt(u64));
|
|
1938
|
-
|
|
1939
|
-
active_test_index = null;
|
|
1940
|
-
last_update = .now(io, .awake);
|
|
1941
|
-
|
|
1942
|
-
requestNextTest(io, child.stdin.?, &opt_metadata.*.?, &sub_prog_node) catch |err| return .{ .write_failed = err };
|
|
1943
|
-
},
|
|
1944
|
-
.test_started => {
|
|
1945
|
-
active_test_index = opt_metadata.*.?.next_index - 1;
|
|
1946
|
-
last_update = .now(io, .awake);
|
|
1947
|
-
},
|
|
1948
|
-
.test_results => {
|
|
1949
|
-
const md = &opt_metadata.*.?;
|
|
1950
|
-
|
|
1951
|
-
const tr_hdr = body_r.takeStruct(std.zig.Server.Message.TestResults, .little) catch unreachable;
|
|
1952
|
-
assert(tr_hdr.index == active_test_index);
|
|
1953
|
-
|
|
1954
|
-
switch (tr_hdr.flags.status) {
|
|
1955
|
-
.pass => {},
|
|
1956
|
-
.skip => results.skip_count +|= 1,
|
|
1957
|
-
.fail => results.fail_count +|= 1,
|
|
1958
|
-
}
|
|
1959
|
-
const leak_count = tr_hdr.flags.leak_count;
|
|
1960
|
-
const log_err_count = tr_hdr.flags.log_err_count;
|
|
1961
|
-
results.leak_count +|= leak_count;
|
|
1962
|
-
results.log_err_count +|= log_err_count;
|
|
1963
|
-
|
|
1964
|
-
if (tr_hdr.flags.fuzz) try run.fuzz_tests.append(gpa, md.testName(tr_hdr.index));
|
|
1965
|
-
|
|
1966
|
-
if (tr_hdr.flags.status == .fail) {
|
|
1967
|
-
const name = md.testName(tr_hdr.index);
|
|
1968
|
-
const stderr_bytes = std.mem.trim(u8, stderr.buffered(), "\n");
|
|
1969
|
-
stderr.tossBuffered();
|
|
1970
|
-
if (stderr_bytes.len == 0) {
|
|
1971
|
-
try run.step.addError("'{s}' failed without output", .{name});
|
|
1972
|
-
} else {
|
|
1973
|
-
try run.step.addError("'{s}' failed:\n{s}", .{ name, stderr_bytes });
|
|
1974
|
-
}
|
|
1975
|
-
} else if (leak_count > 0) {
|
|
1976
|
-
const name = md.testName(tr_hdr.index);
|
|
1977
|
-
const stderr_bytes = std.mem.trim(u8, stderr.buffered(), "\n");
|
|
1978
|
-
stderr.tossBuffered();
|
|
1979
|
-
try run.step.addError("'{s}' leaked {d} allocations:\n{s}", .{ name, leak_count, stderr_bytes });
|
|
1980
|
-
} else if (log_err_count > 0) {
|
|
1981
|
-
const name = md.testName(tr_hdr.index);
|
|
1982
|
-
const stderr_bytes = std.mem.trim(u8, stderr.buffered(), "\n");
|
|
1983
|
-
stderr.tossBuffered();
|
|
1984
|
-
try run.step.addError("'{s}' logged {d} errors:\n{s}", .{ name, log_err_count, stderr_bytes });
|
|
1985
|
-
}
|
|
1986
|
-
|
|
1987
|
-
active_test_index = null;
|
|
1988
|
-
|
|
1989
|
-
const now: Io.Clock.Timestamp = .now(io, .awake);
|
|
1990
|
-
md.ns_per_test[tr_hdr.index] = @intCast(last_update.durationTo(now).raw.nanoseconds);
|
|
1991
|
-
last_update = now;
|
|
1992
|
-
|
|
1993
|
-
requestNextTest(io, child.stdin.?, md, &sub_prog_node) catch |err| return .{ .write_failed = err };
|
|
1994
|
-
},
|
|
1995
|
-
else => {}, // ignore other messages
|
|
1996
|
-
}
|
|
1997
|
-
}
|
|
1998
|
-
}
|
|
1999
|
-
|
|
2000
|
-
const FuzzTestRunner = struct {
|
|
2001
|
-
run: *Run,
|
|
2002
|
-
ctx: FuzzContext,
|
|
2003
|
-
coverage_id: ?u64,
|
|
2004
|
-
|
|
2005
|
-
instances: []Instance,
|
|
2006
|
-
/// The indexes of this are layed out such that it is effectively an array
|
|
2007
|
-
/// of `[instances.len][3]Io.Operation.Storage` of stdin, stdout, stderr.
|
|
2008
|
-
batch: Io.Batch,
|
|
2009
|
-
/// LIFO. Stream of message bodies trailed by PendingBroadcastFooter.
|
|
2010
|
-
pending_broadcasts: std.ArrayList(u8),
|
|
2011
|
-
broadcast: std.ArrayList(u8),
|
|
2012
|
-
broadcast_undelivered: u32,
|
|
2013
|
-
|
|
2014
|
-
const Instance = struct {
|
|
2015
|
-
child: process.Child,
|
|
2016
|
-
message: std.ArrayListAligned(u8, .@"4"),
|
|
2017
|
-
broadcast_written: usize,
|
|
2018
|
-
stderr: std.ArrayList(u8),
|
|
2019
|
-
stdin_vec: [1][]u8,
|
|
2020
|
-
stdout_vec: [1][]u8,
|
|
2021
|
-
stderr_vec: [1][]u8,
|
|
2022
|
-
progress_node: std.Progress.Node,
|
|
2023
|
-
|
|
2024
|
-
fn messageHeader(instance: *Instance) InHeader {
|
|
2025
|
-
assert(instance.message.items.len >= @sizeOf(InHeader));
|
|
2026
|
-
const header_ptr: *InHeader = @ptrCast(instance.message.items);
|
|
2027
|
-
var header = header_ptr.*;
|
|
2028
|
-
if (std.builtin.Endian.native != .little) {
|
|
2029
|
-
std.mem.byteSwapAllFields(InHeader, &header);
|
|
2030
|
-
}
|
|
2031
|
-
return header;
|
|
2032
|
-
}
|
|
2033
|
-
};
|
|
2034
|
-
|
|
2035
|
-
const PendingBroadcastFooter = struct {
|
|
2036
|
-
from_id: u32,
|
|
2037
|
-
body_len: u32,
|
|
2038
|
-
};
|
|
2039
|
-
|
|
2040
|
-
const InHeader = std.zig.Server.Message.Header;
|
|
2041
|
-
const OutHeader = std.zig.Client.Message.Header;
|
|
2042
|
-
|
|
2043
|
-
const stdin_i = 0;
|
|
2044
|
-
const stdout_i = 1;
|
|
2045
|
-
const stderr_i = 2;
|
|
2046
|
-
|
|
2047
|
-
fn init(
|
|
2048
|
-
run: *Run,
|
|
2049
|
-
ctx: FuzzContext,
|
|
2050
|
-
progress_node: std.Progress.Node,
|
|
2051
|
-
spawn_options: process.SpawnOptions,
|
|
2052
|
-
) !FuzzTestRunner {
|
|
2053
|
-
const step_owner = run.step.owner;
|
|
2054
|
-
const gpa = step_owner.allocator;
|
|
2055
|
-
const io = step_owner.graph.io;
|
|
2056
|
-
|
|
2057
|
-
const n_instances = switch (ctx.fuzz.mode) {
|
|
2058
|
-
.forever => step_owner.graph.max_jobs orelse @min(
|
|
2059
|
-
std.Thread.getCpuCount() catch 1,
|
|
2060
|
-
(std.math.maxInt(u32) - 2) / 3,
|
|
2061
|
-
),
|
|
2062
|
-
.limit => 1,
|
|
2063
|
-
};
|
|
2064
|
-
const instances = try gpa.alloc(Instance, n_instances);
|
|
2065
|
-
errdefer gpa.free(instances);
|
|
2066
|
-
const batch_storage = try gpa.alloc(Io.Operation.Storage, instances.len * 3);
|
|
2067
|
-
errdefer gpa.free(batch_storage);
|
|
2068
|
-
|
|
2069
|
-
@memset(instances, .{
|
|
2070
|
-
.child = undefined,
|
|
2071
|
-
.message = .empty,
|
|
2072
|
-
.broadcast_written = undefined,
|
|
2073
|
-
.stderr = .empty,
|
|
2074
|
-
.stdin_vec = undefined,
|
|
2075
|
-
.stdout_vec = undefined,
|
|
2076
|
-
.stderr_vec = undefined,
|
|
2077
|
-
.progress_node = undefined,
|
|
2078
|
-
});
|
|
2079
|
-
for (0.., instances) |id, *instance| {
|
|
2080
|
-
errdefer for (instances[0..id]) |*spawned| {
|
|
2081
|
-
spawned.child.kill(io);
|
|
2082
|
-
spawned.progress_node.end();
|
|
2083
|
-
};
|
|
2084
|
-
instance.child = try process.spawn(io, spawn_options);
|
|
2085
|
-
instance.progress_node = progress_node.start("starting fuzzer", 0);
|
|
2086
|
-
}
|
|
2087
|
-
|
|
2088
|
-
return .{
|
|
2089
|
-
.run = run,
|
|
2090
|
-
.ctx = ctx,
|
|
2091
|
-
.coverage_id = null,
|
|
2092
|
-
|
|
2093
|
-
.instances = instances,
|
|
2094
|
-
.batch = .init(batch_storage),
|
|
2095
|
-
.pending_broadcasts = .empty,
|
|
2096
|
-
.broadcast = .empty,
|
|
2097
|
-
.broadcast_undelivered = 0,
|
|
2098
|
-
};
|
|
2099
|
-
}
|
|
2100
|
-
|
|
2101
|
-
fn deinit(f: *FuzzTestRunner) void {
|
|
2102
|
-
const step_owner = f.run.step.owner;
|
|
2103
|
-
const gpa = step_owner.allocator;
|
|
2104
|
-
const io = step_owner.graph.io;
|
|
2105
|
-
|
|
2106
|
-
f.batch.cancel(io);
|
|
2107
|
-
gpa.free(f.batch.storage);
|
|
2108
|
-
var total_rss: usize = 0;
|
|
2109
|
-
for (f.instances) |*instance| {
|
|
2110
|
-
instance.child.kill(io);
|
|
2111
|
-
instance.message.deinit(gpa);
|
|
2112
|
-
instance.stderr.deinit(gpa);
|
|
2113
|
-
instance.progress_node.end();
|
|
2114
|
-
total_rss += instance.child.resource_usage_statistics.getMaxRss() orelse 0;
|
|
2115
|
-
}
|
|
2116
|
-
f.run.step.result_peak_rss = @max(f.run.step.result_peak_rss, total_rss);
|
|
2117
|
-
gpa.free(f.instances);
|
|
2118
|
-
}
|
|
2119
|
-
|
|
2120
|
-
fn startInstances(f: *FuzzTestRunner) !void {
|
|
2121
|
-
const step_owner = f.run.step.owner;
|
|
2122
|
-
const io = step_owner.graph.io;
|
|
2123
|
-
|
|
2124
|
-
for (0.., f.instances) |id, *instance| {
|
|
2125
|
-
const id32: u32 = @intCast(id);
|
|
2126
|
-
(switch (f.ctx.fuzz.mode) {
|
|
2127
|
-
.forever => sendRunFuzzTestMessage(
|
|
2128
|
-
io,
|
|
2129
|
-
instance.child.stdin.?,
|
|
2130
|
-
f.run.fuzz_tests.items,
|
|
2131
|
-
.forever,
|
|
2132
|
-
id32,
|
|
2133
|
-
),
|
|
2134
|
-
.limit => |limit| sendRunFuzzTestMessage(
|
|
2135
|
-
io,
|
|
2136
|
-
instance.child.stdin.?,
|
|
2137
|
-
f.run.fuzz_tests.items,
|
|
2138
|
-
.iterations,
|
|
2139
|
-
limit.amount,
|
|
2140
|
-
),
|
|
2141
|
-
}) catch |write_err| {
|
|
2142
|
-
// The runner unexpectedly closed stdin, which means it crashed during initialization.
|
|
2143
|
-
// Clean up everything and wait for the child to exit.
|
|
2144
|
-
instance.child.stdin.?.close(io);
|
|
2145
|
-
instance.child.stdin = null;
|
|
2146
|
-
const term = try instance.child.wait(io);
|
|
2147
|
-
return f.run.step.fail(
|
|
2148
|
-
"unable to write stdin ({t}); test process unexpectedly {f}",
|
|
2149
|
-
.{ write_err, fmtTerm(term) },
|
|
2150
|
-
);
|
|
2151
|
-
};
|
|
2152
|
-
|
|
2153
|
-
try f.addStdoutRead(id32, @sizeOf(InHeader));
|
|
2154
|
-
try f.addStderrRead(id32);
|
|
2155
|
-
}
|
|
2156
|
-
}
|
|
2157
|
-
|
|
2158
|
-
fn listen(f: *FuzzTestRunner) !void {
|
|
2159
|
-
const step_owner = f.run.step.owner;
|
|
2160
|
-
const io = step_owner.graph.io;
|
|
2161
|
-
|
|
2162
|
-
while (true) {
|
|
2163
|
-
try f.batch.awaitConcurrent(io, .none);
|
|
2164
|
-
while (f.batch.next()) |completion| {
|
|
2165
|
-
const id = completion.index / 3;
|
|
2166
|
-
const result = completion.result;
|
|
2167
|
-
switch (completion.index % 3) {
|
|
2168
|
-
0 => try f.completeStdinWrite(id, result.file_write_streaming catch |e| switch (e) {
|
|
2169
|
-
error.BrokenPipe => return f.instanceEos(id),
|
|
2170
|
-
else => |write_e| return write_e,
|
|
2171
|
-
}),
|
|
2172
|
-
1 => try f.completeStdoutRead(id, result.file_read_streaming catch |e| switch (e) {
|
|
2173
|
-
error.EndOfStream => return f.instanceEos(id),
|
|
2174
|
-
else => |read_e| return read_e,
|
|
2175
|
-
}),
|
|
2176
|
-
2 => try f.completeStderrRead(id, result.file_read_streaming catch |e| switch (e) {
|
|
2177
|
-
error.EndOfStream => return f.instanceEos(id),
|
|
2178
|
-
else => |read_e| return read_e,
|
|
2179
|
-
}),
|
|
2180
|
-
else => unreachable,
|
|
2181
|
-
}
|
|
2182
|
-
}
|
|
2183
|
-
}
|
|
2184
|
-
}
|
|
2185
|
-
|
|
2186
|
-
fn completeStdoutRead(f: *FuzzTestRunner, id: u32, n: usize) !void {
|
|
2187
|
-
const step_owner = f.run.step.owner;
|
|
2188
|
-
const gpa = step_owner.allocator;
|
|
2189
|
-
const io = step_owner.graph.io;
|
|
2190
|
-
const instance = &f.instances[id];
|
|
2191
|
-
|
|
2192
|
-
instance.message.items.len += n;
|
|
2193
|
-
const total_read = instance.message.items.len;
|
|
2194
|
-
if (total_read < @sizeOf(InHeader)) {
|
|
2195
|
-
try f.addStdoutRead(id, @sizeOf(InHeader));
|
|
2196
|
-
return;
|
|
2197
|
-
}
|
|
2198
|
-
|
|
2199
|
-
const header = instance.messageHeader();
|
|
2200
|
-
const body = instance.message.items[@sizeOf(InHeader)..];
|
|
2201
|
-
if (body.len != header.bytes_len) {
|
|
2202
|
-
try f.addStdoutRead(id, @sizeOf(InHeader) + header.bytes_len);
|
|
2203
|
-
return;
|
|
2204
|
-
}
|
|
2205
|
-
|
|
2206
|
-
switch (header.tag) {
|
|
2207
|
-
.zig_version => {
|
|
2208
|
-
if (!std.mem.eql(u8, builtin.zig_version_string, body)) return f.run.step.fail(
|
|
2209
|
-
"zig version mismatch build runner vs compiler: '{s}' vs '{s}'",
|
|
2210
|
-
.{ builtin.zig_version_string, body },
|
|
2211
|
-
);
|
|
2212
|
-
},
|
|
2213
|
-
.coverage_id => {
|
|
2214
|
-
var body_r: Io.Reader = .fixed(body);
|
|
2215
|
-
f.coverage_id = body_r.takeInt(u64, .little) catch unreachable;
|
|
2216
|
-
const cumulative_runs = body_r.takeInt(u64, .little) catch unreachable;
|
|
2217
|
-
const cumulative_unique = body_r.takeInt(u64, .little) catch unreachable;
|
|
2218
|
-
const cumulative_coverage = body_r.takeInt(u64, .little) catch unreachable;
|
|
2219
|
-
|
|
2220
|
-
const fuzz = f.ctx.fuzz;
|
|
2221
|
-
fuzz.queue_mutex.lockUncancelable(io);
|
|
2222
|
-
defer fuzz.queue_mutex.unlock(io);
|
|
2223
|
-
try fuzz.msg_queue.append(fuzz.gpa, .{ .coverage = .{
|
|
2224
|
-
.id = f.coverage_id.?,
|
|
2225
|
-
.cumulative = .{
|
|
2226
|
-
.runs = cumulative_runs,
|
|
2227
|
-
.unique = cumulative_unique,
|
|
2228
|
-
.coverage = cumulative_coverage,
|
|
2229
|
-
},
|
|
2230
|
-
.run = f.run,
|
|
2231
|
-
} });
|
|
2232
|
-
fuzz.queue_cond.signal(io);
|
|
2233
|
-
},
|
|
2234
|
-
.fuzz_start_addr => {
|
|
2235
|
-
var body_r: Io.Reader = .fixed(body);
|
|
2236
|
-
const fuzz = f.ctx.fuzz;
|
|
2237
|
-
const addr = body_r.takeInt(u64, .little) catch unreachable;
|
|
2238
|
-
|
|
2239
|
-
fuzz.queue_mutex.lockUncancelable(io);
|
|
2240
|
-
defer fuzz.queue_mutex.unlock(io);
|
|
2241
|
-
try fuzz.msg_queue.append(fuzz.gpa, .{ .entry_point = .{
|
|
2242
|
-
.addr = addr,
|
|
2243
|
-
.coverage_id = f.coverage_id.?,
|
|
2244
|
-
} });
|
|
2245
|
-
fuzz.queue_cond.signal(io);
|
|
2246
|
-
},
|
|
2247
|
-
.fuzz_test_change => {
|
|
2248
|
-
const test_i = std.mem.readInt(u32, body[0..4], .little);
|
|
2249
|
-
instance.progress_node.setName(f.run.fuzz_tests.items[test_i]);
|
|
2250
|
-
},
|
|
2251
|
-
.broadcast_fuzz_input => {
|
|
2252
|
-
if (f.instances.len == 1) {
|
|
2253
|
-
// No other processes to broadcast to.
|
|
2254
|
-
} else if (f.broadcast_undelivered == 0) {
|
|
2255
|
-
try f.instanceBroadcast(id, body);
|
|
2256
|
-
} else {
|
|
2257
|
-
const footer: PendingBroadcastFooter = .{
|
|
2258
|
-
.from_id = id,
|
|
2259
|
-
.body_len = @intCast(body.len),
|
|
2260
|
-
};
|
|
2261
|
-
// There is another broadcast in progress so add this one to the queue.
|
|
2262
|
-
const size = @sizeOf(PendingBroadcastFooter) + body.len;
|
|
2263
|
-
try f.pending_broadcasts.ensureUnusedCapacity(gpa, size);
|
|
2264
|
-
f.pending_broadcasts.appendSliceAssumeCapacity(body);
|
|
2265
|
-
f.pending_broadcasts.appendSliceAssumeCapacity(@ptrCast(&footer));
|
|
2266
|
-
}
|
|
2267
|
-
},
|
|
2268
|
-
else => {}, // ignore other messages
|
|
2269
|
-
}
|
|
2270
|
-
|
|
2271
|
-
instance.message.clearRetainingCapacity();
|
|
2272
|
-
try f.addStdoutRead(id, @sizeOf(InHeader));
|
|
2273
|
-
}
|
|
2274
|
-
|
|
2275
|
-
fn completeStderrRead(f: *FuzzTestRunner, id: u32, n: usize) !void {
|
|
2276
|
-
const instance = &f.instances[id];
|
|
2277
|
-
instance.stderr.items.len += n;
|
|
2278
|
-
try f.addStderrRead(id);
|
|
2279
|
-
}
|
|
2280
|
-
|
|
2281
|
-
fn completeStdinWrite(f: *FuzzTestRunner, id: u32, n: usize) !void {
|
|
2282
|
-
const instance = &f.instances[id];
|
|
2283
|
-
|
|
2284
|
-
instance.broadcast_written += n;
|
|
2285
|
-
if (instance.broadcast_written == f.broadcast.items.len) {
|
|
2286
|
-
f.broadcast_undelivered -= 1;
|
|
2287
|
-
if (f.broadcast_undelivered == 0) {
|
|
2288
|
-
try f.broadcastComplete();
|
|
2289
|
-
}
|
|
2290
|
-
} else {
|
|
2291
|
-
f.addStdinWrite(id);
|
|
2292
|
-
}
|
|
2293
|
-
}
|
|
2294
|
-
|
|
2295
|
-
fn addStdoutRead(f: *FuzzTestRunner, id: u32, end: usize) !void {
|
|
2296
|
-
const step_owner = f.run.step.owner;
|
|
2297
|
-
const gpa = step_owner.allocator;
|
|
2298
|
-
const instance = &f.instances[id];
|
|
2299
|
-
|
|
2300
|
-
try instance.message.ensureTotalCapacity(gpa, end);
|
|
2301
|
-
const start = instance.message.items.len;
|
|
2302
|
-
instance.stdout_vec = .{instance.message.allocatedSlice()[start..end]};
|
|
2303
|
-
f.batch.addAt(id * 3 + stdout_i, .{ .file_read_streaming = .{
|
|
2304
|
-
.file = instance.child.stdout.?,
|
|
2305
|
-
.data = &instance.stdout_vec,
|
|
2306
|
-
} });
|
|
2307
|
-
}
|
|
2308
|
-
|
|
2309
|
-
fn addStderrRead(f: *FuzzTestRunner, id: u32) !void {
|
|
2310
|
-
const step_owner = f.run.step.owner;
|
|
2311
|
-
const gpa = step_owner.allocator;
|
|
2312
|
-
const instance = &f.instances[id];
|
|
2313
|
-
|
|
2314
|
-
try instance.stderr.ensureUnusedCapacity(gpa, 1);
|
|
2315
|
-
instance.stderr_vec = .{instance.stderr.unusedCapacitySlice()};
|
|
2316
|
-
f.batch.addAt(id * 3 + stderr_i, .{ .file_read_streaming = .{
|
|
2317
|
-
.file = instance.child.stderr.?,
|
|
2318
|
-
.data = &instance.stderr_vec,
|
|
2319
|
-
} });
|
|
2320
|
-
}
|
|
2321
|
-
|
|
2322
|
-
fn addStdinWrite(f: *FuzzTestRunner, id: u32) void {
|
|
2323
|
-
const instance = &f.instances[id];
|
|
2324
|
-
|
|
2325
|
-
assert(f.broadcast.items.len != instance.broadcast_written);
|
|
2326
|
-
instance.stdin_vec = .{f.broadcast.items[instance.broadcast_written..]};
|
|
2327
|
-
f.batch.addAt(id * 3 + stdin_i, .{ .file_write_streaming = .{
|
|
2328
|
-
.file = instance.child.stdin.?,
|
|
2329
|
-
.data = &instance.stdin_vec,
|
|
2330
|
-
} });
|
|
2331
|
-
}
|
|
2332
|
-
|
|
2333
|
-
fn instanceEos(f: *FuzzTestRunner, id: u32) !void {
|
|
2334
|
-
const step_owner = f.run.step.owner;
|
|
2335
|
-
const io = step_owner.graph.io;
|
|
2336
|
-
const instance = &f.instances[id];
|
|
2337
|
-
|
|
2338
|
-
instance.child.stdin.?.close(io);
|
|
2339
|
-
instance.child.stdin = null;
|
|
2340
|
-
const term = try instance.child.wait(io);
|
|
2341
|
-
if (!termMatches(.{ .exited = 0 }, term)) {
|
|
2342
|
-
f.run.step.result_stderr = try f.mergedStderr();
|
|
2343
|
-
try f.saveCrash(id, term);
|
|
2344
|
-
return f.run.step.fail("test process unexpectedly {f}", .{fmtTerm(term)});
|
|
2345
|
-
}
|
|
2346
|
-
}
|
|
2347
|
-
|
|
2348
|
-
fn saveCrash(f: *FuzzTestRunner, id: u32, term: process.Child.Term) !void {
|
|
2349
|
-
const step = &f.run.step;
|
|
2350
|
-
const b = step.owner;
|
|
2351
|
-
const io = b.graph.io;
|
|
2352
|
-
|
|
2353
|
-
if (f.coverage_id == null) return;
|
|
2354
|
-
|
|
2355
|
-
// Search for the input file corresponding to the instance
|
|
2356
|
-
const InputHeader = Build.abi.fuzz.MmapInputHeader;
|
|
2357
|
-
var in_r_buf: [@sizeOf(InputHeader)]u8 = undefined;
|
|
2358
|
-
var in_r: Io.File.Reader = undefined;
|
|
2359
|
-
var in_f: Io.File = undefined;
|
|
2360
|
-
var in_name_buf: [12]u8 = undefined;
|
|
2361
|
-
var in_name: []const u8 = undefined;
|
|
2362
|
-
var i: u32 = 0;
|
|
2363
|
-
const header: InputHeader = while (true) {
|
|
2364
|
-
const name_prefix = "f" ++ Io.Dir.path.sep_str ++ "in";
|
|
2365
|
-
in_name = std.fmt.bufPrint(&in_name_buf, name_prefix ++ "{x}", .{i}) catch unreachable;
|
|
2366
|
-
in_f = b.cache_root.handle.openFile(io, in_name, .{
|
|
2367
|
-
.lock = .exclusive,
|
|
2368
|
-
.lock_nonblocking = true,
|
|
2369
|
-
}) catch |e| switch (e) {
|
|
2370
|
-
error.FileNotFound => return,
|
|
2371
|
-
error.WouldBlock => continue, // Can not be from
|
|
2372
|
-
// the crashed instance since it is still locked.
|
|
2373
|
-
else => return step.fail("failed to open file '{f}{s}': {t}", .{
|
|
2374
|
-
b.cache_root, in_name, e,
|
|
2375
|
-
}),
|
|
2376
|
-
};
|
|
2377
|
-
|
|
2378
|
-
in_r = in_f.readerStreaming(io, &in_r_buf);
|
|
2379
|
-
const header = in_r.interface.takeStruct(InputHeader, .little) catch |e| {
|
|
2380
|
-
in_f.close(io);
|
|
2381
|
-
switch (e) {
|
|
2382
|
-
error.ReadFailed => return step.fail("failed to read file '{f}{s}': {t}", .{
|
|
2383
|
-
b.cache_root, in_name, in_r.err.?,
|
|
2384
|
-
}),
|
|
2385
|
-
error.EndOfStream => continue,
|
|
2386
|
-
}
|
|
2387
|
-
};
|
|
2388
|
-
|
|
2389
|
-
if (header.pc_digest == f.coverage_id.? and
|
|
2390
|
-
header.instance_id == id and
|
|
2391
|
-
header.test_i < f.run.fuzz_tests.items.len)
|
|
2392
|
-
{
|
|
2393
|
-
break header;
|
|
2394
|
-
}
|
|
2395
|
-
|
|
2396
|
-
in_f.close(io);
|
|
2397
|
-
if (i == std.math.maxInt(u32)) return;
|
|
2398
|
-
i += 1;
|
|
2399
|
-
};
|
|
2400
|
-
defer in_f.close(io);
|
|
2401
|
-
|
|
2402
|
-
// Save it to a seperate file
|
|
2403
|
-
const crash_name = "f" ++ Io.Dir.path.sep_str ++ "crash";
|
|
2404
|
-
const out = b.cache_root.handle.createFile(io, crash_name, .{
|
|
2405
|
-
.lock = .exclusive, // Multiple run steps could have found a crash at the same time
|
|
2406
|
-
}) catch |e| return step.fail("failed to create file '{f}{s}': {t}", .{
|
|
2407
|
-
b.cache_root, crash_name, e,
|
|
2408
|
-
});
|
|
2409
|
-
defer out.close(io);
|
|
2410
|
-
|
|
2411
|
-
var out_w_buf: [512]u8 = undefined;
|
|
2412
|
-
var out_w = out.writerStreaming(io, &out_w_buf);
|
|
2413
|
-
_ = out_w.interface.sendFileAll(&in_r, .limited(header.len)) catch |e| switch (e) {
|
|
2414
|
-
error.ReadFailed => return step.fail("failed to read file '{f}{s}': {t}", .{
|
|
2415
|
-
b.cache_root, in_name, in_r.err.?,
|
|
2416
|
-
}),
|
|
2417
|
-
error.WriteFailed => return step.fail("failed to write file '{f}{s}': {t}", .{
|
|
2418
|
-
b.cache_root, crash_name, out_w.err.?,
|
|
2419
|
-
}),
|
|
2420
|
-
};
|
|
2421
|
-
|
|
2422
|
-
return f.run.step.fail("test '{s}' {f}; input saved to '{f}{s}'", .{
|
|
2423
|
-
f.run.fuzz_tests.items[header.test_i],
|
|
2424
|
-
fmtTerm(term),
|
|
2425
|
-
b.cache_root,
|
|
2426
|
-
crash_name,
|
|
2427
|
-
});
|
|
2428
|
-
}
|
|
2429
|
-
|
|
2430
|
-
fn instanceBroadcast(f: *FuzzTestRunner, from_id: u32, bytes: []const u8) !void {
|
|
2431
|
-
assert(f.instances.len > 1);
|
|
2432
|
-
assert(f.broadcast_undelivered == 0); // no other broadcast is progress
|
|
2433
|
-
assert(f.broadcast.items.len == 0);
|
|
2434
|
-
assert(from_id < f.instances.len);
|
|
2435
|
-
|
|
2436
|
-
const step_owner = f.run.step.owner;
|
|
2437
|
-
const gpa = step_owner.allocator;
|
|
2438
|
-
|
|
2439
|
-
var out_header: OutHeader = .{
|
|
2440
|
-
.tag = .new_fuzz_input,
|
|
2441
|
-
.bytes_len = @intCast(bytes.len),
|
|
2442
|
-
};
|
|
2443
|
-
if (std.builtin.Endian.native != .little) {
|
|
2444
|
-
std.mem.byteSwapAllFields(OutHeader, &out_header);
|
|
2445
|
-
}
|
|
2446
|
-
try f.broadcast.ensureTotalCapacity(gpa, @sizeOf(OutHeader) + bytes.len);
|
|
2447
|
-
f.broadcast.appendSliceAssumeCapacity(@ptrCast(&out_header));
|
|
2448
|
-
f.broadcast.appendSliceAssumeCapacity(bytes);
|
|
2449
|
-
|
|
2450
|
-
f.broadcast_undelivered = @intCast(f.instances.len - 1);
|
|
2451
|
-
for (0.., f.instances) |to_id, *instance| {
|
|
2452
|
-
if (to_id == from_id) continue;
|
|
2453
|
-
instance.broadcast_written = 0;
|
|
2454
|
-
f.addStdinWrite(@intCast(to_id));
|
|
2455
|
-
}
|
|
2456
|
-
}
|
|
2457
|
-
|
|
2458
|
-
fn broadcastComplete(f: *FuzzTestRunner) !void {
|
|
2459
|
-
assert(f.instances.len > 1);
|
|
2460
|
-
assert(f.broadcast_undelivered == 0);
|
|
2461
|
-
f.broadcast.clearRetainingCapacity();
|
|
2462
|
-
|
|
2463
|
-
const pending = &f.pending_broadcasts;
|
|
2464
|
-
if (pending.items.len != 0) {
|
|
2465
|
-
// Another broadcast is pending; copy it over to `broadcast`
|
|
2466
|
-
|
|
2467
|
-
const footer_len = @sizeOf(PendingBroadcastFooter);
|
|
2468
|
-
const footer_bytes = pending.items[pending.items.len - footer_len ..];
|
|
2469
|
-
const footer: *align(1) PendingBroadcastFooter = @ptrCast(footer_bytes);
|
|
2470
|
-
pending.items.len -= footer_len;
|
|
2471
|
-
|
|
2472
|
-
const body = pending.items[pending.items.len - footer.body_len ..];
|
|
2473
|
-
try f.instanceBroadcast(footer.from_id, body);
|
|
2474
|
-
pending.items.len -= body.len;
|
|
2475
|
-
}
|
|
2476
|
-
}
|
|
2477
|
-
|
|
2478
|
-
fn mergedStderr(f: *FuzzTestRunner) std.mem.Allocator.Error![]const u8 {
|
|
2479
|
-
const step_owner = f.run.step.owner;
|
|
2480
|
-
const arena = step_owner.allocator;
|
|
2481
|
-
|
|
2482
|
-
// Collect any remaining stderr
|
|
2483
|
-
while (f.batch.next()) |completion| {
|
|
2484
|
-
if (completion.index % 3 != 2) continue;
|
|
2485
|
-
const len = completion.result.file_read_streaming catch continue;
|
|
2486
|
-
f.instances[completion.index / 3].stderr.items.len += len;
|
|
2487
|
-
}
|
|
2488
|
-
|
|
2489
|
-
var stderr_len: usize = 0;
|
|
2490
|
-
for (f.instances) |*instance| stderr_len += instance.stderr.items.len;
|
|
2491
|
-
const stderr = try arena.alloc(u8, stderr_len);
|
|
2492
|
-
|
|
2493
|
-
stderr_len = 0;
|
|
2494
|
-
for (f.instances) |*instance| {
|
|
2495
|
-
@memcpy(stderr[stderr_len..][0..instance.stderr.items.len], instance.stderr.items);
|
|
2496
|
-
stderr_len += instance.stderr.items.len;
|
|
2497
|
-
}
|
|
2498
|
-
return stderr;
|
|
2499
|
-
}
|
|
2500
|
-
};
|
|
2501
|
-
|
|
2502
|
-
fn evalFuzzTest(
|
|
2503
|
-
run: *Run,
|
|
2504
|
-
spawn_options: process.SpawnOptions,
|
|
2505
|
-
options: Step.MakeOptions,
|
|
2506
|
-
fuzz_context: FuzzContext,
|
|
2507
|
-
) !void {
|
|
2508
|
-
var f: FuzzTestRunner = try .init(run, fuzz_context, options.progress_node, spawn_options);
|
|
2509
|
-
defer f.deinit();
|
|
2510
|
-
try f.startInstances();
|
|
2511
|
-
try f.listen();
|
|
2512
|
-
}
|
|
2513
|
-
|
|
2514
|
-
const TestMetadata = struct {
|
|
2515
|
-
names: []const u32,
|
|
2516
|
-
ns_per_test: []u64,
|
|
2517
|
-
expected_panic_msgs: []const u32,
|
|
2518
|
-
string_bytes: []const u8,
|
|
2519
|
-
next_index: u32,
|
|
2520
|
-
prog_node: std.Progress.Node,
|
|
2521
|
-
|
|
2522
|
-
fn toCachedTestMetadata(tm: TestMetadata) CachedTestMetadata {
|
|
2523
|
-
return .{
|
|
2524
|
-
.names = tm.names,
|
|
2525
|
-
.string_bytes = tm.string_bytes,
|
|
2526
|
-
};
|
|
2527
|
-
}
|
|
2528
|
-
|
|
2529
|
-
fn testName(tm: TestMetadata, index: u32) []const u8 {
|
|
2530
|
-
return tm.toCachedTestMetadata().testName(index);
|
|
2531
|
-
}
|
|
2532
|
-
};
|
|
2533
|
-
|
|
2534
|
-
pub const CachedTestMetadata = struct {
|
|
2535
|
-
names: []const u32,
|
|
2536
|
-
string_bytes: []const u8,
|
|
2537
|
-
|
|
2538
|
-
pub fn testName(tm: CachedTestMetadata, index: u32) []const u8 {
|
|
2539
|
-
return std.mem.sliceTo(tm.string_bytes[tm.names[index]..], 0);
|
|
2540
|
-
}
|
|
2541
|
-
};
|
|
2542
|
-
|
|
2543
|
-
fn requestNextTest(io: Io, in: Io.File, metadata: *TestMetadata, sub_prog_node: *?std.Progress.Node) !void {
|
|
2544
|
-
while (metadata.next_index < metadata.names.len) {
|
|
2545
|
-
const i = metadata.next_index;
|
|
2546
|
-
metadata.next_index += 1;
|
|
2547
|
-
|
|
2548
|
-
if (metadata.expected_panic_msgs[i] != 0) continue;
|
|
2549
|
-
|
|
2550
|
-
const name = metadata.testName(i);
|
|
2551
|
-
if (sub_prog_node.*) |n| n.end();
|
|
2552
|
-
sub_prog_node.* = metadata.prog_node.start(name, 0);
|
|
2553
|
-
|
|
2554
|
-
try sendRunTestMessage(io, in, .run_test, i);
|
|
2555
|
-
return;
|
|
2556
|
-
} else {
|
|
2557
|
-
metadata.next_index = std.math.maxInt(u32); // indicate that all tests are done
|
|
2558
|
-
try sendMessage(io, in, .exit);
|
|
2559
|
-
}
|
|
2560
|
-
}
|
|
2561
|
-
|
|
2562
|
-
fn sendMessage(io: Io, file: Io.File, tag: std.zig.Client.Message.Tag) !void {
|
|
2563
|
-
const header: std.zig.Client.Message.Header = .{
|
|
2564
|
-
.tag = tag,
|
|
2565
|
-
.bytes_len = 0,
|
|
2566
|
-
};
|
|
2567
|
-
var w = file.writerStreaming(io, &.{});
|
|
2568
|
-
w.interface.writeStruct(header, .little) catch |err| switch (err) {
|
|
2569
|
-
error.WriteFailed => return w.err.?,
|
|
2570
|
-
};
|
|
2571
|
-
}
|
|
2572
|
-
|
|
2573
|
-
fn sendRunTestMessage(io: Io, file: Io.File, tag: std.zig.Client.Message.Tag, index: u32) !void {
|
|
2574
|
-
const header: std.zig.Client.Message.Header = .{
|
|
2575
|
-
.tag = tag,
|
|
2576
|
-
.bytes_len = 4,
|
|
2577
|
-
};
|
|
2578
|
-
var w = file.writerStreaming(io, &.{});
|
|
2579
|
-
w.interface.writeStruct(header, .little) catch |err| switch (err) {
|
|
2580
|
-
error.WriteFailed => return w.err.?,
|
|
2581
|
-
};
|
|
2582
|
-
w.interface.writeInt(u32, index, .little) catch |err| switch (err) {
|
|
2583
|
-
error.WriteFailed => return w.err.?,
|
|
2584
|
-
};
|
|
2585
|
-
}
|
|
2586
|
-
|
|
2587
|
-
fn sendRunFuzzTestMessage(
|
|
2588
|
-
io: Io,
|
|
2589
|
-
file: Io.File,
|
|
2590
|
-
test_names: []const []const u8,
|
|
2591
|
-
kind: std.Build.abi.fuzz.LimitKind,
|
|
2592
|
-
amount_or_instance: u64,
|
|
2593
|
-
) !void {
|
|
2594
|
-
const header: std.zig.Client.Message.Header = .{
|
|
2595
|
-
.tag = .start_fuzzing,
|
|
2596
|
-
.bytes_len = 1 + 8 + 4 + count: {
|
|
2597
|
-
var c: u32 = @intCast(test_names.len * 4);
|
|
2598
|
-
for (test_names) |name| {
|
|
2599
|
-
c += @intCast(name.len);
|
|
2600
|
-
}
|
|
2601
|
-
break :count c;
|
|
2602
|
-
},
|
|
2603
|
-
};
|
|
2604
|
-
var w = file.writerStreaming(io, &.{});
|
|
2605
|
-
w.interface.writeStruct(header, .little) catch |err| switch (err) {
|
|
2606
|
-
error.WriteFailed => return w.err.?,
|
|
2607
|
-
};
|
|
2608
|
-
w.interface.writeByte(@intFromEnum(kind)) catch |err| switch (err) {
|
|
2609
|
-
error.WriteFailed => return w.err.?,
|
|
2610
|
-
};
|
|
2611
|
-
w.interface.writeInt(u64, amount_or_instance, .little) catch |err| switch (err) {
|
|
2612
|
-
error.WriteFailed => return w.err.?,
|
|
2613
|
-
};
|
|
2614
|
-
w.interface.writeInt(u32, @intCast(test_names.len), .little) catch |err| switch (err) {
|
|
2615
|
-
error.WriteFailed => return w.err.?,
|
|
2616
|
-
};
|
|
2617
|
-
for (test_names) |test_name| {
|
|
2618
|
-
w.interface.writeInt(u32, @intCast(test_name.len), .little) catch |err| switch (err) {
|
|
2619
|
-
error.WriteFailed => return w.err.?,
|
|
2620
|
-
};
|
|
2621
|
-
w.interface.writeAll(test_name) catch |err| switch (err) {
|
|
2622
|
-
error.WriteFailed => return w.err.?,
|
|
2623
|
-
};
|
|
2624
|
-
}
|
|
2625
|
-
}
|
|
2626
|
-
|
|
2627
|
-
fn evalGeneric(run: *Run, spawn_options: process.SpawnOptions) !EvalGenericResult {
|
|
2628
|
-
const b = run.step.owner;
|
|
2629
|
-
const io = b.graph.io;
|
|
2630
|
-
const arena = b.allocator;
|
|
2631
|
-
const gpa = b.allocator;
|
|
2632
|
-
|
|
2633
|
-
var child = try process.spawn(io, spawn_options);
|
|
2634
|
-
defer child.kill(io);
|
|
2635
|
-
|
|
2636
|
-
switch (run.stdin) {
|
|
2637
|
-
.bytes => |bytes| {
|
|
2638
|
-
child.stdin.?.writeStreamingAll(io, bytes) catch |err| {
|
|
2639
|
-
return run.step.fail("unable to write stdin: {t}", .{err});
|
|
2640
|
-
};
|
|
2641
|
-
child.stdin.?.close(io);
|
|
2642
|
-
child.stdin = null;
|
|
2643
|
-
},
|
|
2644
|
-
.lazy_path => |lazy_path| {
|
|
2645
|
-
const path = lazy_path.getPath3(b, &run.step);
|
|
2646
|
-
const file = path.root_dir.handle.openFile(io, path.subPathOrDot(), .{}) catch |err| {
|
|
2647
|
-
return run.step.fail("unable to open stdin file: {t}", .{err});
|
|
2648
|
-
};
|
|
2649
|
-
defer file.close(io);
|
|
2650
|
-
// TODO https://github.com/ziglang/zig/issues/23955
|
|
2651
|
-
var read_buffer: [1024]u8 = undefined;
|
|
2652
|
-
var file_reader = file.reader(io, &read_buffer);
|
|
2653
|
-
var write_buffer: [1024]u8 = undefined;
|
|
2654
|
-
var stdin_writer = child.stdin.?.writerStreaming(io, &write_buffer);
|
|
2655
|
-
_ = stdin_writer.interface.sendFileAll(&file_reader, .unlimited) catch |err| switch (err) {
|
|
2656
|
-
error.ReadFailed => return run.step.fail("failed to read from {f}: {t}", .{
|
|
2657
|
-
path, file_reader.err.?,
|
|
2658
|
-
}),
|
|
2659
|
-
error.WriteFailed => return run.step.fail("failed to write to stdin: {t}", .{
|
|
2660
|
-
stdin_writer.err.?,
|
|
2661
|
-
}),
|
|
2662
|
-
};
|
|
2663
|
-
stdin_writer.interface.flush() catch |err| switch (err) {
|
|
2664
|
-
error.WriteFailed => return run.step.fail("failed to write to stdin: {t}", .{
|
|
2665
|
-
stdin_writer.err.?,
|
|
2666
|
-
}),
|
|
2667
|
-
};
|
|
2668
|
-
child.stdin.?.close(io);
|
|
2669
|
-
child.stdin = null;
|
|
2670
|
-
},
|
|
2671
|
-
.none => {},
|
|
2672
|
-
}
|
|
2673
|
-
|
|
2674
|
-
var stdout_bytes: ?[]const u8 = null;
|
|
2675
|
-
var stderr_bytes: ?[]const u8 = null;
|
|
2676
|
-
|
|
2677
|
-
if (child.stdout) |stdout| {
|
|
2678
|
-
if (child.stderr) |stderr| {
|
|
2679
|
-
var multi_reader_buffer: Io.File.MultiReader.Buffer(2) = undefined;
|
|
2680
|
-
var multi_reader: Io.File.MultiReader = undefined;
|
|
2681
|
-
multi_reader.init(gpa, io, multi_reader_buffer.toStreams(), &.{ stdout, stderr });
|
|
2682
|
-
defer multi_reader.deinit();
|
|
2683
|
-
|
|
2684
|
-
const stdout_reader = multi_reader.reader(0);
|
|
2685
|
-
const stderr_reader = multi_reader.reader(1);
|
|
2686
|
-
|
|
2687
|
-
while (multi_reader.fill(64, .none)) |_| {
|
|
2688
|
-
if (run.stdio_limit.toInt()) |limit| {
|
|
2689
|
-
if (stdout_reader.buffered().len > limit)
|
|
2690
|
-
return error.StdoutStreamTooLong;
|
|
2691
|
-
if (stderr_reader.buffered().len > limit)
|
|
2692
|
-
return error.StderrStreamTooLong;
|
|
2693
|
-
}
|
|
2694
|
-
} else |err| switch (err) {
|
|
2695
|
-
error.Timeout => unreachable,
|
|
2696
|
-
error.EndOfStream => {},
|
|
2697
|
-
else => |e| return e,
|
|
2698
|
-
}
|
|
2699
|
-
|
|
2700
|
-
try multi_reader.checkAnyError();
|
|
2701
|
-
|
|
2702
|
-
stdout_bytes = try multi_reader.toOwnedSlice(0);
|
|
2703
|
-
stderr_bytes = try multi_reader.toOwnedSlice(1);
|
|
2704
|
-
} else {
|
|
2705
|
-
var stdout_reader = stdout.readerStreaming(io, &.{});
|
|
2706
|
-
stdout_bytes = stdout_reader.interface.allocRemaining(arena, run.stdio_limit) catch |err| switch (err) {
|
|
2707
|
-
error.OutOfMemory => return error.OutOfMemory,
|
|
2708
|
-
error.ReadFailed => return stdout_reader.err.?,
|
|
2709
|
-
error.StreamTooLong => return error.StdoutStreamTooLong,
|
|
2710
|
-
};
|
|
2711
|
-
}
|
|
2712
|
-
} else if (child.stderr) |stderr| {
|
|
2713
|
-
var stderr_reader = stderr.readerStreaming(io, &.{});
|
|
2714
|
-
stderr_bytes = stderr_reader.interface.allocRemaining(arena, run.stdio_limit) catch |err| switch (err) {
|
|
2715
|
-
error.OutOfMemory => return error.OutOfMemory,
|
|
2716
|
-
error.ReadFailed => return stderr_reader.err.?,
|
|
2717
|
-
error.StreamTooLong => return error.StderrStreamTooLong,
|
|
2718
|
-
};
|
|
2719
|
-
}
|
|
2720
|
-
|
|
2721
|
-
if (stderr_bytes) |bytes| if (bytes.len > 0) {
|
|
2722
|
-
// Treat stderr as an error message.
|
|
2723
|
-
const stderr_is_diagnostic = run.captured_stderr == null and switch (run.stdio) {
|
|
2724
|
-
.check => |checks| !checksContainStderr(checks.items),
|
|
2725
|
-
else => true,
|
|
2726
|
-
};
|
|
2727
|
-
if (stderr_is_diagnostic) {
|
|
2728
|
-
run.step.result_stderr = bytes;
|
|
2729
|
-
}
|
|
2730
|
-
};
|
|
2731
|
-
|
|
2732
|
-
run.step.result_peak_rss = child.resource_usage_statistics.getMaxRss() orelse 0;
|
|
2733
|
-
|
|
2734
|
-
return .{
|
|
2735
|
-
.term = try child.wait(io),
|
|
2736
|
-
.stdout = stdout_bytes,
|
|
2737
|
-
.stderr = stderr_bytes,
|
|
2738
|
-
};
|
|
2739
|
-
}
|
|
2740
|
-
|
|
2741
|
-
fn addPathForDynLibs(run: *Run, artifact: *Step.Compile) void {
|
|
2742
|
-
const b = run.step.owner;
|
|
2743
|
-
const compiles = artifact.getCompileDependencies(true);
|
|
2744
|
-
for (compiles) |compile| {
|
|
2745
|
-
if (compile.root_module.resolved_target.?.result.os.tag == .windows and
|
|
2746
|
-
compile.isDynamicLibrary())
|
|
2747
|
-
{
|
|
2748
|
-
addPathDir(run, Dir.path.dirname(compile.getEmittedBin().getPath2(b, &run.step)).?);
|
|
2749
|
-
}
|
|
2750
|
-
}
|
|
2751
|
-
}
|
|
2752
|
-
|
|
2753
|
-
fn failForeign(
|
|
2754
|
-
run: *Run,
|
|
2755
|
-
suggested_flag: []const u8,
|
|
2756
|
-
argv0: []const u8,
|
|
2757
|
-
exe: *Step.Compile,
|
|
2758
|
-
) error{ MakeFailed, MakeSkipped, OutOfMemory } {
|
|
2759
|
-
switch (run.stdio) {
|
|
2760
|
-
.check, .zig_test => {
|
|
2761
|
-
if (run.skip_foreign_checks)
|
|
2762
|
-
return error.MakeSkipped;
|
|
2763
|
-
|
|
2764
|
-
const b = run.step.owner;
|
|
2765
|
-
const host_name = try b.graph.host.result.zigTriple(b.allocator);
|
|
2766
|
-
const foreign_name = try exe.rootModuleTarget().zigTriple(b.allocator);
|
|
2767
|
-
|
|
2768
|
-
return run.step.fail(
|
|
2769
|
-
\\unable to spawn foreign binary '{s}' ({s}) on host system ({s})
|
|
2770
|
-
\\ consider using {s} or enabling skip_foreign_checks in the Run step
|
|
2771
|
-
, .{ argv0, foreign_name, host_name, suggested_flag });
|
|
2772
|
-
},
|
|
2773
|
-
else => {
|
|
2774
|
-
return run.step.fail("unable to spawn foreign binary '{s}'", .{argv0});
|
|
2775
|
-
},
|
|
2776
|
-
}
|
|
2777
|
-
}
|
|
2778
|
-
|
|
2779
|
-
fn hashStdIo(hh: *std.Build.Cache.HashHelper, stdio: StdIo) void {
|
|
2780
|
-
switch (stdio) {
|
|
2781
|
-
.infer_from_args, .inherit, .zig_test => {},
|
|
2782
|
-
.check => |checks| for (checks.items) |check| {
|
|
2783
|
-
hh.add(@as(std.meta.Tag(StdIo.Check), check));
|
|
2784
|
-
switch (check) {
|
|
2785
|
-
.expect_stderr_exact,
|
|
2786
|
-
.expect_stderr_match,
|
|
2787
|
-
.expect_stdout_exact,
|
|
2788
|
-
.expect_stdout_match,
|
|
2789
|
-
=> |s| hh.addBytes(s),
|
|
2790
|
-
|
|
2791
|
-
.expect_term => |term| {
|
|
2792
|
-
hh.add(@as(std.meta.Tag(process.Child.Term), term));
|
|
2793
|
-
switch (term) {
|
|
2794
|
-
inline .exited, .signal, .stopped => |x| hh.add(x),
|
|
2795
|
-
.unknown => |x| hh.add(x),
|
|
2796
|
-
}
|
|
2797
|
-
},
|
|
2798
|
-
}
|
|
2799
|
-
},
|
|
2800
|
-
}
|
|
724
|
+
file_input.addStepDependencies(&run.step);
|
|
725
|
+
run.file_inputs.append(arena, file_input.dupe(graph)) catch @panic("OOM");
|
|
2801
726
|
}
|