The command-line relinker skips an ELF module whose file name extends
another module's in the same directory when both have the same SONAME, a
dumper's backup such as libX.prx.esbak (#7380). That check lives in the
CLI's ReadModules, so the online converter, which hands every ELF in
sce_module/ straight to Conversion, still stops on such a layout with
"Ambiguous guest dependency name: libX.prx".
The check moves into the relinker core as RemoveBackupCopies, which
Conversion::Convert now runs before patching or converting modules and
reports through the progress messages, so the browser prints the same
"Skipping backup copy" lines. ReadModules uses the same function, so the
command line and --verify-patches behave as before.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Expect the found heading in the finding for '## What', an indented '### what', '#WHAT' and the existing '#### What' case, and no hint for a different word such as '### Whatever'.
The template check only reads '### Name' headings, so '## What', '#### Tested' or '### checklist' counted as missing, and the finding did not say why. When a section is missing, look for the same name as a heading at any level and in any case, and add it to the finding, as in "add the '### What' heading of the template; found '## What'".
Expect 'fill the ### What section' for the untouched template and for sections that are blank or only hold a comment, and 'add the ### What heading of the template' for a heading written at another level. Add a body that names its sections without headings, the shape that failed #10721 at first, and expect one finding per missing heading.
The pull request template check reported 'section What is missing or empty' both when the body had no '### What' heading and when the heading was there with nothing under it, without saying which heading it looks for. Report 'add the ### What heading of the template' when the heading is absent and 'fill the ### What section' when it is empty, for What, Tested and Checklist.
progress.py skips every definition whose name ends in _nid_no_patch or
_nid_no_patch_cut, which are meant to be internal helpers. Some libraries
export such functions with APS5_EXPORT under an explicit NID or name:
libSceAgcVsh (150), libSceNKWebKit (150) and libSceJson2's inventory
(66), all of them calling NotImplemented_nid_no_patch. None of the 366
was counted, so those three libraries showed 151 of 151 functions where
they declare 517, and import_audit, which takes its stub list from the
same scan, reported imports of them as implemented.
A _nid_no_patch definition is now skipped only when no APS5_EXPORT in its
library exports it. The library totals go from 6104 of 12305 to 6104 of
12671 on main.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
With 250 pull requests of which every 25th shares a file with the branch, expect probe lines at 100, 200 and 250 with 4, 8 and 10 related pull requests and one line for merging those 10; without a branch, expect merge lines at 100 and 150 of 150. The tests fail before the previous commit.
After the fetch, a --branch run probed about 1,300 pull requests for about 28 s without output, and --out merged every pull request into the base. Report every 100 pull requests and at the end how many were probed and how many of them share files or exports with the branch, and how many were merged into the base.
Run tools/tests/test_pr_overlap_progress.py as pr_overlap_progress next to pr_overlap_branch_scan, so check_test_registration --scripts finds a runner for it.
Check that listing 150 pull requests over two pages reports their number, that fetching 250 heads in three batches reports 99, 199 and 250 of them, and that a run without pull requests still reports one fetch line. The tests fail before the previous commit.
pr_overlap printed nothing until its report, which takes 54 to 81 s on Linux with about 1,300 open pull requests and took minutes on Windows, so a run looked stuck. Write progress lines to stderr: the number of open pull requests once they are listed, and the number of pull request heads fetched after each batch of 100. The report on stdout is unchanged.
Path.write_text takes newline only from Python 3.10, so the three tests errored in the fixture helper on the Python 3.9.6 that macOS ships as /usr/bin/python3. open() with newline writes the same LF bytes on every version.
The branch scan gives the same overlaps as a scan of every pull request and merges only the pull requests that share a file or an export with the branch; a scan without a branch still merges all of them.
pr_overlap --branch merged every open pull request against main, although a pull request can only appear in the report when it shares a file or an export with the branch, so on a repository with a thousand open pull requests the check did not finish in an hour. probe lists each pull request's files and exports from git diff base...head, without a merge, and scan_all merges only the ones that overlap the branch; the others get empty sets, which is what they would contribute to the report. --out is unchanged.
CRYPTO_num_locks, CRYPTO_set_locking_callback, CRYPTO_set_add_lock_callback,
CRYPTO_THREADID_set_callback and CRYPTO_THREADID_set_numeric threw. They
now follow LibreSSL 2.5.4's cryptlib.c, the version identified in the
firmware 13.40 measurements: CRYPTO_num_locks returns 41, the setters
store their callbacks, CRYPTO_THREADID_set_callback keeps the first
non-null one and returns 0 once one is set, and
CRYPTO_THREADID_set_numeric clears the {ptr, val} structure and stores a
64-bit value. The callbacks are never called, because the module exports
none of CRYPTO_lock, CRYPTO_add_lock or CRYPTO_THREADID_current; the debt
entry records it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
OutputInfo had no member at offset 0xb, so sceVideodec2Decode and
sceVideodec2Flush never wrote that byte, and a returned picture carried
whatever the caller had left there. Name it isDiscardedFrame, as
SharpProspero and KytyPS5 do, and set it to 0 when a picture is
returned; a result without a picture leaves it as the caller set it.
Co-Authored-By: Claude <[email protected]>
agc_driver_f16_to_f32_unpack_spirv runs agc_driver_f16_to_f32_unpack_tests --verify-spirv, which is built from tests/execution/F16ToF32Unpack.cpp. When ANYPS5_AGC_EXECUTION_TESTS does not list F16ToF32Unpack, the target is built from ExecutionTestNotBuilt.cpp, which prints 'skipped, this build leaves the test out with ANYPS5_AGC_EXECUTION_TESTS' and exits with 77. Unlike the other registrations of execution tests, this one had no SKIP_RETURN_CODE, so ctest reported a failure. Set SKIP_RETURN_CODE 77; the verification mode of the real test never exits with 77.
agc_driver_f64_denorm_preserve_spirv runs agc_driver_f64_fma_subnormals_tests --verify-spv-denorm-mode, which is built from tests/execution/F64FmaSubnormals.cpp. When ANYPS5_AGC_EXECUTION_TESTS does not list F64FmaSubnormals, the target is built from ExecutionTestNotBuilt.cpp, which prints 'skipped, this build leaves the test out with ANYPS5_AGC_EXECUTION_TESTS' and exits with 77. Unlike the other registrations of execution tests, this one had no SKIP_RETURN_CODE, so ctest reported a failure. Set SKIP_RETURN_CODE 77; the verification mode of the real test never exits with 77.
Past their initialization and argument errors, sceContentSearchOpenMetadata, sceContentSearchOpenMetadataByContentId, sceContentSearchGetMetadataFieldInfo and sceContentSearchGetMetadataValue threw a bare logic_error for every valid call, so progress.py counted them as done. The host content library is empty and the console's errors for missing content and unopened metadata ids are unknown, so the four now go through NotImplemented_nid_no_patch. ThrowUnknownMetadataId had no other caller and goes.
For a live session, sceContentExportGetProgress and sceContentExportFromDataWithThumbnail threw a bare runtime_error, so progress.py counted them as done. An idle session's progress depends on the caller's SDK compatibility mode, and the host has no media library to export into, so both now go through NotImplemented_nid_no_patch. RequireSession's not-initialized and unknown-session throws, which other calls share, are unchanged.
After its handle and argument errors, sceAudioPropagationSourceCalculateAudioPaths threw a bare runtime_error for every valid call, so progress.py counted it as done. Propagation is not implemented, so the valid call now goes through NotImplemented_nid_no_patch. The early errors are unchanged.
When process_vm_readv failed with anything but EFAULT (EPERM under a
seccomp filter, ENOSYS), GuestCopyIn_nid_no_patch fell back to a plain
memcpy, so the host dereferenced the unchecked guest pointer, the crash
the checked read exists to prevent. Throw as GuestCopyOut_nid_no_patch
does for process_vm_writev.
The test runs the call in a child process under a seccomp filter that
answers process_vm_readv with EPERM and expects the exception.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
NaN-to-PCM_I16L output is marked unimplemented in Render.cpp and the debt entry,
and the test rule excludes asserting that an unimplemented path throws. The
production exception and the debt entry stay.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>