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