Use the shapes ctest writes: a not-run test with SKIP_RETURN_CODE=77 or SKIP_REGULAR_EXPRESSION_MATCHED is a skip, while a not-run test whose executable is missing ('Unable to find executable') or whose skipped element has no message is a failure that fails the run. The test fails with the previous classification.
ctest writes a test whose executable is missing, for example because it failed to link, as status="notrun" with <skipped message="Unable to find executable">, the same shape as a test that skipped itself. sanitizer_report counted both as skipped, which hid a test that did not build. A skipped element now means a skip only when its message is a ctest skip status (SKIP_RETURN_CODE=<n> or SKIP_REGULAR_EXPRESSION_MATCHED, as tools/check_skips.py reads it) or when the status is not a failing one; any other not-run test counts as failed. On a local ASan and UBSan run of main this moves atrac9_gradient, whose executable does not link, from the 721 skipped tests to the failed ones.
agc_driver_guest_memory_lifetime_converted runs a relinked fixture that loads the ASan builds of libkernel, libc and libSceAgcDriver, so the ASan runtime is not the first library and ASan stops with 'ASan runtime does not come first in initial library list'. Set verify_asan_link_order=0 for it, as loadexec_arguments already does for its converted host. With it the test passes in an ANYPS5_ENABLE_ASAN build on Linux; other builds are unaffected.
Check that the SUMMARY line wins over the ERROR line, that LSan and TSan lines and a UBSan runtime error with its source location are found, that output without a sanitizer line gives nothing, that long lines are shortened, and that the failed test table gains the report column only when a failure has a report.
Read the system-out and system-err of each testcase and keep the first sanitizer line: the SUMMARY line of ASan, LSan or TSan, else their ERROR or WARNING line, else a UBSan runtime error line with its source location. When any unexpected failure has one, the failed test table gains a First sanitizer report column, shortened to 200 characters and escaped for Markdown.
Check that a listed test that passed appears in the passed table with its reason, that a listed test missing from the run appears in the not-run table, that a skipped listed test appears in neither, and that a run whose known failures all still fail has neither table.
List the known failures of the selected sanitizers whose test passed, so a fixed test can leave the list, and those that are not in the run at all, such as a renamed test. Neither affects the exit code.
Check that known failures apply only to the sanitizers they name and that blank lines are skipped, that a listed failure moves to the Known failure table with its reason escaped for Markdown and stops failing the run while an unlisted one still fails it, that --known without --sanitizer is a usage error, and that malformed lines are rejected with exit code 2 and their line number.
sanitizer_report.py --known reads a text file with one known failure per line: the test name, the comma-separated sanitizers it fails under and the reason. With --sanitizer naming the sanitizers of the build, a failure of a listed test moves to a Known failure table with its reason and no longer fails the run. Blank lines are ignored; a line without a reason, an unknown sanitizer and a duplicate test and sanitizer pair are errors that name the line.
Check how sanitizer_report classifies passed, failed, skipped, not run and disabled tests, the counts and sorted table of the summary, the exit code for runs with and without failures, the exit code 2 for unreadable or malformed reports, and that --summary appends to an existing file.
Add tools/sanitizer_report.py, which reads the JUnit file that ctest --output-junit writes, counts passed, skipped and failed tests, lists the failed ones in a Markdown summary and exits with 1 when any test failed. A test that ctest did not run counts as failed, and a disabled test as skipped.
The I/J reads take the BaryCoordSmooth input, but gl_FragCoord was declared
only for the offset kinds, so its w was read as the constant 0 and the
fragment function never read [[position]]; Apple GPUs then return the
weights unnormalized. Declare it with the built-in, and select on
gl_FragCoord.w > 0, which a compiler cannot fold as it can
min(b, b + |w|).
MoltenVK exposes VK_KHR_fragment_shader_barycentric but its MSL step
rejects PerVertexKHR, so the extension is disabled there and a pixel
shader whose I/J VGPRs outlive their v_interp_p1/p2 pairs takes the
generated barycentric stages, which accept only triangle lists without
primitive restart on a device without geometry shaders.
A new target flag, fragmentBarycentricBuiltins, enables the extension
for its built-ins only. The host interpolation check then keeps the
leftover I/J reads (all perspective or all linear, at the fragment's
default position) and reads them from BaryCoordKHR or
BaryCoordNoPerspKHR, while the interpolated attributes stay hardware
varyings. Raw vertex parameters and I/J at an offset or a sample
position still take the generated stages. Apple GPUs return
unnormalized perspective weights unless the fragment function reads
[[position]], so each perspective read keeps a neutral use of
gl_FragCoord.w, loaded as a float. Devices with the full extension are
unaffected; the request serialization moves to version 45.
Co-authored-by: yripper <[email protected]>
asinh_nid_postfix called the host libm's asinh. It now follows the branches and
thresholds of FreeBSD msun's s_asinh.c (release/11.4.0): below 2^-28 it returns x,
up to |x| = 2 it uses log1p, up to 2^28 log(2|x| + 1/(sqrt(x*x+1)+|x|)) and above
that log(|x|) + ln2. Up to |x| = 2 the results are bit-identical to msun; above 2
they depend on the host log this file still uses.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>