[browser] Move boot config tests to Wasm.Build.Tests#131199
Closed
maraf wants to merge 125 commits into
Closed
Conversation
Reverts the DEBUG-only free-threaded assert added to `FreeThreadedStrategy` in #130906. The assert was overly strict: `FreeThreadedStrategy` is also valid for apartment-affinitized COM objects when the current thread already has the correct apartment type, so the agility probe produced false assert failures. Also clarifies documentation on `StrategyBasedComWrappers.DefaultIUnknownStrategy` and adds a class comment on `FreeThreadedStrategy` describing these use cases.
Adds a `DacDbiInterfaceInstance` entrypoint to the cDAC (mscordaccore_universal) so DBI can obtain an `IDacDbiInterface` backed by the managed data-contract reader, mirroring the native DAC export of the same name and signature. Previously the cDAC only exposed the SOS / `IXCLRDataProcess` surface via `CLRDataCreateInstance`, so DBI could only be serviced through the native DAC. ## What this enables - A cDAC-serviced DacDbi creation path with the export name and signature DBI already expects. - The supporting interop declarations the entrypoint needs: `ICorDebugDataTarget` and `ICLRRuntimeLocator`. ## Design decisions and tradeoffs - Self-location via the contract descriptor: the cDAC builds its target from the embedded contract descriptor (read through `ICLRContractLocator` on the caller's data target). The passed runtime base is used only to cross-check against `ICLRRuntimeLocator::GetRuntimeBase` when the data target implements it, keeping the activation model consistent with the SOS path. - The target is read-only: the write-memory path returns `E_NOTIMPL`, which is sufficient for the DacDbi surface. - `DacSetTargetConsistencyChecks` returns success on the standalone path since it only toggles target assertions. Includes unit tests for the consistency-checks toggle. > [!NOTE] > This description was drafted with GitHub Copilot. --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The wasm `HardwareIntrinsics` tests (`src/tests/JIT/HardwareIntrinsics/Wasm`) are gated by `HWITestsWasmOnly` -> `CLRTestTargetUnsupported` unless `TargetArchitecture == wasm` (plus an `EnableWasmHWIntrinsicsTests` opt-in). As a result, none of the existing PR-triggered intrinsics pipelines ever compile them: - `runtime-coreclr hardware-intrinsics` (`src/coreclr/jit/**`, x86/x64/arm/osx) passes without building the wasm tree. - `hardware-intrinsics-arm64` (`src/coreclr/jit/*arm64*`) is skipped for wasm-only changes. So a break in the wasm intrinsic tests only surfaces in a rolling/outerloop browser-wasm build, which is what required the #130962 follow-up to #130850. ---------- This adds a wasm counterpart mirroring `hardware-intrinsics-arm64.yml`: - `eng/pipelines/coreclr/hardware-intrinsics-wasm.yml` -- PR-triggered, filtered on `src/coreclr/jit/*wasm*` (covers `hwintrinsic*wasm*`, `lowerwasm.cpp`, `regallocwasm.cpp`) plus `src/tests/JIT/HardwareIntrinsics/Wasm/**`. Runs a `browser_wasm` leg with `/p:EnableWasmHWIntrinsicsTests=true -tree:JIT/HardwareIntrinsics/Wasm`. - `eng/pipelines/coreclr/templates/jit-hardware-intrinsics-wasm.yml` -- modeled on the existing `wasi-wasm-coreclr-runtime-tests.yml` (`global-build-job`, `runtimeFlavor: coreclr`, `-s clr+libs+packs`). It is build-only (`sendToHelix: false`) since browser/V8 can''t execute these tests yet -- enough to catch compile breaks like #130962. Like `hardware-intrinsics-arm64.yml`, the new pipeline still needs an Azure DevOps definition registered against the YAML to appear as a PR check. > [!NOTE] > This PR description was drafted by Copilot. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…0974) The saturating `float`/`double` -> small integral cast changes from #128604 were not reflected in two outerloop tests, breaking CI (see #130962 (comment)). ---------- `JIT/Regression/CLR-x86-JIT/V1-M10/b05617`: under saturation `conv.u1` of `2.564783e7` now yields `255` (was `214`) and `conv.i1` of `5246667200` yields `127` (was `-1`). Propagating through the stack, the final `conv.u4` constant is updated `4294967086` -> `4294967043` so the test still returns `100`. Mono still truncates, so the test is marked unsupported on Mono, referencing the same tracking issue (#100368) used by the JIT regression test in #128604. ---------- `JIT/IL_Conformance/Convert/TestConvertFromIntegral`: the two checked `ushort.MaxValue -> short` via `Conv_I2` cases now saturate to `short.MaxValue` on CoreCLR instead of truncating to `-1`. Since the result is now runtime-divergent (Mono truncates), they are marked `UnspecifiedBehaviour`, consistent with how every other cross-runtime-divergent float->integral out-of-range case in this file is already handled. This keeps the rest of the file running on Mono. Verified locally against a checked runtime: `b05617` returns `100` and `TestConvertFromIntegral` reports "All tests passed". > [!NOTE] > This PR description was drafted by Copilot. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
) For an arm32 direct BL (ARM32_THUMB_BRANCH24), applyRelocs substitutes a placeholder target when the code block lands more than +-16MB from the call target, so the two sides' immediates differ even though both call the same recorded target. Compare the recorded reloc kind and target instead. Also error out when base and diff JITs are the same module (this has burned me a few times). Fixes #130736
Hopefully fixes ``` /Users/runner/work/1/s/.packages/microsoft.dotnet.helix.sdk/11.0.0-beta.26363.117/tools/Microsoft.DotNet.Helix.Sdk.MonoQueue.targets(79,5): error : Helix API does not contain an entry for $(helix_macos_arm64_latest_internal) [/Users/runner/work/1/s/src/libraries/sendtohelixhelp.proj] ``` seen internally in superpmi-collect.
…ls (#130924) ## Summary On `FEATURE_PORTABLE_ENTRYPOINTS` (wasm) R2R, generated code keeps its shadow stack pointer in a local and leaves the `__stack_pointer` global stale. The P/Invoke prolog (`JIT_PInvokeBegin`) normally publishes it before native code runs, but that prolog is **skipped for `SuppressGCTransition` calls**. A native `SuppressGCTransition` callee (emscripten, which uses `__stack_pointer`) then allocates its shadow frame from the stale global — the caller's SP, *above* the R2R frame — and clobbers the caller's address-taken locals. This manifests in R2R exception handling: `FindFirstPassHandler` spills its by-ref `StackFrameIterator`, calls the `SuppressGCTransition` QCall `RhpEHEnumInitFromStackFrameIterator`, the callee clobbers the spilled pointer, and the next `frameIter.ControlPC` read faults with a spurious `NullReferenceException`. EH dispatch can't GC-transition mid-unwind, which is why its QCalls are `SuppressGCTransition` and hit this path. Fixes #130923. ## Fix Publish the shadow SP to the `__stack_pointer` global just before the call, so the callee allocates its shadow frame below the current frame. The publish is net-zero on the wasm operand stack, so it is safe to emit after the call arguments are pushed. The `stackPointer` global handle comes from the `getWasmWellKnownGlobals` JIT-EE API (added in #129717) and is referenced via a `WASM_GLOBAL_INDEX_LEB` relocation, matching the existing `global.get` uses in wasm codegen. ## Validation The bug only *reproduces* with the (not-yet-merged) R2R-on-wasm bring-up stack, so there is no wasm-R2R CI leg on `main` yet. Verified `codegenwasm.cpp` compiles clean in the wasm JIT (`clr.jit`, 0 errors). Behaviorally validated on the R2R-on-wasm prototype: unfixed crashes, fixed passes, plus a byte-identical R2R↔interpreter battery. ## Notes for reviewers - Draft because it cannot be CI-validated on `main` until the R2R-on-wasm consumption path lands. - Depends on the `getWasmWellKnownGlobals` API from #129717 (fixes #129712), now on `main`. - Related bring-up family: #130634. > [!NOTE] > This pull request was authored with the assistance of GitHub Copilot.
The "duplicate attribute" PFX we use in unit tests is notable because it has named keys, keyname000 and keyname001. Windows's PFX loader has a race where if two PFXs with the same named key are loaded concurrently, they may end up sharing the same private key instances. Disposing one of the certificates will remove the keys out from under the other certificate, resulting in a "keyset not found" error. To address this, we make sure the duplicate attribute PFX has to be loaded under a lock. It's only the loading that needs to be locked, not the whole lifetime of the certificate. When the load happens serially, the Windows PFX loader is aware that a key with that name already exists, so it appropriately generates a random name instead. Our tests don't actually care what the imported name ends up being, just what it doesn't end up being.
`CoseKey` async verification accepted signatures with missing or mismatched protected `alg` headers, unlike synchronous verification. - **Validation** - Validate the protected algorithm before async verification. - Apply consistent validation to `CoseSign1Message` and `CoseSignature`. - **Coverage** - Cover missing and mismatched algorithm headers. - Assert matching sync and async behavior. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Kevin Jones <kevin@vcsjones.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Bumps [actions/setup-dotnet](https://github.com/actions/setup-dotnet) from 5 to 6. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/setup-dotnet/releases">actions/setup-dotnet's releases</a>.</em></p> <blockquote> <h2>v6.0.0</h2> <h2>What's Changed</h2> <ul> <li>Migrate to ESM and upgrade dependencies by <a href="https://github.com/priyagupta108"><code>@priyagupta108</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/752">actions/setup-dotnet#752</a></li> <li>Bump actions/checkout from 6.0.3 to 7.0.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/setup-dotnet/pull/751">actions/setup-dotnet#751</a></li> <li>chore(deps): bump <code>@actions/cache</code> to 6.2.0 by <a href="https://github.com/philip-gai"><code>@philip-gai</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/756">actions/setup-dotnet#756</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/philip-gai"><code>@philip-gai</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-dotnet/pull/756">actions/setup-dotnet#756</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/setup-dotnet/compare/v5...v6.0.0">https://github.com/actions/setup-dotnet/compare/v5...v6.0.0</a></p> <h2>v5.4.0</h2> <h2>What's Changed</h2> <h3>Enhancements</h3> <ul> <li>Improve global.json SDK version validation for rollForward by <a href="https://github.com/priyagupta108"><code>@priyagupta108</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/742">actions/setup-dotnet#742</a></li> <li>Pin actions to commit SHAs in workflows by <a href="https://github.com/priya-kinthali"><code>@priya-kinthali</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/744">actions/setup-dotnet#744</a></li> <li>Expand the CSC problem matcher to light up more errors on GitHub. by <a href="https://github.com/StephenCleary"><code>@StephenCleary</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/717">actions/setup-dotnet#717</a></li> </ul> <h3>Documentation</h3> <ul> <li>Docs(action): Explicitly mark all optional inputs with required: false by <a href="https://github.com/kranthipoturaju"><code>@kranthipoturaju</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/737">actions/setup-dotnet#737</a></li> </ul> <h3>Bug Fixes</h3> <ul> <li>Fix global.json creation command by <a href="https://github.com/michal2612"><code>@michal2612</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/694">actions/setup-dotnet#694</a></li> </ul> <h3>Dependency Updates</h3> <ul> <li>Upgrade <code>@actions/cache</code> to 5.1.0, log cache write denied by <a href="https://github.com/jasongin"><code>@jasongin</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/746">actions/setup-dotnet#746</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/jasongin"><code>@jasongin</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-dotnet/pull/746">actions/setup-dotnet#746</a></li> <li><a href="https://github.com/michal2612"><code>@michal2612</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-dotnet/pull/694">actions/setup-dotnet#694</a></li> <li><a href="https://github.com/kranthipoturaju"><code>@kranthipoturaju</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-dotnet/pull/737">actions/setup-dotnet#737</a></li> <li><a href="https://github.com/StephenCleary"><code>@StephenCleary</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-dotnet/pull/717">actions/setup-dotnet#717</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/setup-dotnet/compare/v5...v5.4.0">https://github.com/actions/setup-dotnet/compare/v5...v5.4.0</a></p> <h2>v5.3.0</h2> <h2>What's Changed</h2> <h3>Enhancements</h3> <ul> <li>Add dotnet-version: latest support with dotnet-channel input by <a href="https://github.com/mahabaleshwars"><code>@mahabaleshwars</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/730">actions/setup-dotnet#730</a></li> <li>Support global.json's rollForward latest* variants by <a href="https://github.com/js6pak"><code>@js6pak</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/538">actions/setup-dotnet#538</a></li> <li>Improve version resolution by <a href="https://github.com/akoeplinger"><code>@akoeplinger</code></a> in <a href="https://redirect.github.com/actions/setup-dotnet/pull/560">actions/setup-dotnet#560</a></li> </ul> <h3>Dependency Updates</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions/setup-dotnet/commit/a98b56852c35b8e3190ac28c8c2271da59106c68"><code>a98b568</code></a> chore(deps): bump <code>@actions/cache</code> to 6.2.0 (<a href="https://redirect.github.com/actions/setup-dotnet/issues/756">#756</a>)</li> <li><a href="https://github.com/actions/setup-dotnet/commit/afb2931642fd907238eb71bce2da0dcc910b3553"><code>afb2931</code></a> Bump actions/checkout from 6.0.3 to 7.0.0 (<a href="https://redirect.github.com/actions/setup-dotnet/issues/751">#751</a>)</li> <li><a href="https://github.com/actions/setup-dotnet/commit/6df8cefd1440cf9313e76b8fdb8aaf90cfa745a3"><code>6df8cef</code></a> Migrate to ESM and upgrade dependencies (<a href="https://redirect.github.com/actions/setup-dotnet/issues/752">#752</a>)</li> <li>See full diff in <a href="https://github.com/actions/setup-dotnet/compare/v5...v6">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Add capability for cDAC to read read-write metadata for Edit and Continue scenarios. * Add caching schema for metadata - Under forward execution, metadata caches are not flushed. Metadata cache is updated upon changes to the metadata, as indicated by the metadata generation (for RefEmit) or by the EnC edit counter. - Under potentially backwards execution, metadata caches are flushed. * Streamline docs Fixes #129557 --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Noah Falk <noahfalk@users.noreply.github.com>
`Vector2` (`TYP_SIMD8`) and `Vector3` (`TYP_SIMD12`) have no native wasm valtype, so they live as a `v128` with the low 8/12 bytes populated. Previously the wasm JIT bailed out via the `ins_Load`/`ins_Store` NYIs for these types; this implements the split lane load/store sequences instead. The emitted sequences are: - **simd8 load**: `v128.load64_zero 0` - **simd8 store**: `v128.store64_lane 0, lane 0` - **simd12 load**: `local.get addr; v128.load64_zero 0; v128.load32_lane 8, lane 2` - **simd12 store**: tee the value into a `v128` temporary, `v128.store64_lane 0, lane 0` for the low 8 bytes, then re-materialize the address and `v128.store32_lane 8, lane 2` for the upper 4 bytes `v128.load64_zero` fills lanes 0-1 (zeroing the rest); the trailing lane store/load handles bytes 8-11 for the `Vector3` case. ---------- The `TYP_SIMD12` address is forced multiply-used (loads and heap stores re-materialize it for the trailing lane op). The local-to-stack store rewrite (`RewriteLocalStackStore`) produces a `STOREIND(LCL_ADDR, value)` whose address is a re-materializable `GT_LCL_ADDR`, so that case is excluded from multiply-use and codegen re-emits the frame pointer directly. Because that synthesized `STOREIND` is not revisited by the main collection walk, its internal `v128` tee register is requested in `RewriteLocalStackStore`. ---------- Measured on the corelib crossgen2 browser SuperPMI collection (27,540 contexts): hard asserts drop from **403 to 30**, eliminating **373** `SIMD8`/`SIMD12` load/store asserts with no regressions. The residual 30 are the pre-existing `NYIRAW` oper catch-all, unrelated to this change. Full effectiveness requires #130866 (which removes the shadowing SIMD-ABI bailouts for SIMD params/locals/stores/call-args); standalone, this change already clears the 373 asserts above on that collection. > [!NOTE] > This PR description was drafted with the assistance of GitHub Copilot. --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…insics (#130938) ## Summary The internal `System.Runtime.Intrinsics.Wasm.WasmBase` class (already on `main`) declares `LeadingZeroCount`/`TrailingZeroCount` (int/uint/long/ulong) as self-recursive intrinsic stubs, but the RyuJIT-wasm backend left them unimplemented — the WasmBase `IsaRange` was `{ NI_Illegal, NI_Illegal }`, so these fell back to the managed software implementation. This wires the two intrinsics into the RyuJIT-wasm backend so they lower to native wasm `clz`/`ctz`: - **`hwintrinsic.cpp`** — give WasmBase a real IsaRange `{ FIRST_NI_WasmBase, LAST_NI_WasmBase }`. - **`hwintrinsiclistwasm.h`** — add the two scalar `HARDWARE_INTRINSIC` entries (`HW_Category_Scalar`, `HW_Flag_SpecialImport|HW_Flag_NoFloatingPointUsed`), matching the established xarch scalar `LeadingZeroCount`/`TrailingZeroCount` pattern (simdSize `0`). - **`hwintrinsicwasm.cpp`** — special-import each to a `GT_INTRINSIC` over the existing `NI_PRIMITIVE_LeadingZeroCount`/`NI_PRIMITIVE_TrailingZeroCount`, which wasm codegen already lowers to `i32.clz`/`i64.clz` and `i32.ctz`/`i64.ctz` (see `codegenwasm.cpp`). **Consumer:** `System.Numerics.BitOperations` (`LeadingZeroCount`/`Log2`/`TrailingZeroCount`) routes through `WasmBase.LeadingZeroCount(value)` when `WasmBase.IsSupported`. Implementing these makes core bit operations use native wasm `clz`/`ctz` on RyuJIT-wasm instead of the software fallback. ## API review No new or changed public API. `WasmBase` is `internal` and already shipped on `main`; this PR only implements its JIT lowering. No API review required. ## Validation - ✅ **JIT compiles clean.** The wasm cross-JIT (`clrjit_universal_wasm_arm64`) builds with 0 warnings / 0 errors after a full recompile of the changed sources (`clr.jit -c Release`). Baseline `clr+libs -rc Release` and `clr -os browser -c Release` also build clean. - ✅ **Lowering target already exists.** `NI_PRIMITIVE_*ZeroCount` `GT_INTRINSIC` nodes for `TYP_INT`/`TYP_LONG` are already handled by `codegenwasm.cpp` (emits `i32/i64.clz`/`ctz`), so the intrinsics reuse a proven codegen path. -⚠️ **Runtime execution not verified locally.** Attempting to run under the experimental wasm-CoreCLR `corerun.js` fails at `coreclr_initialize` (`0x80070057`) **even for the pre-built `tieringtest.dll` smoke test** — a pre-existing bring-up limitation of the experimental runtime in this environment (note the `System.Private.CoreLib.NotReadyYet.wasm` artifact), unrelated to this change and occurring before any JIT/intrinsic code runs. Existing `System.Numerics.BitOperations` tests already cover `LeadingZeroCount`/`TrailingZeroCount` for all overloads and will exercise this path once the wasm runtime can execute. Opening as **draft** because end-to-end runtime execution could not be verified locally (blocked by the experimental runtime, not by this change). > [!NOTE] > This pull request was authored with the assistance of GitHub Copilot. --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Removes 16 functions from the CoreCLR xarch emitter that had zero call sites anywhere in the repo. This is a DEBUG/encoding cleanup only -- no behavioral change. Each function's declaration in `emitxarch.h` and definition (with its doc-comment block) in `emitxarch.cpp` was removed, after re-verifying zero callers via `git grep -w <name> -- 'src/coreclr/*'`. Removed: - Prefix/encoding helpers: `emitExtractRex2Prefix`, `AddRex2WPrefix`, `insKMaskBaseSize` (all declared but never defined); `AddVexPrefixIfNeeded`, `AddVexPrefixIfNeededAndNotPresent`, `AddSimdPrefixIfNeededAndNotPresent` (unused inline defs) - Instruction emitters: `emitIns_AI_R`, `emitIns_I_AI`, `emitIns_I_AX`, `emitIns_R_AX`, `emitIns_AX_R`, `emitIns_I_ARR`, `emitIns_I_ARX`, `emitIns_R_R_AR_I` - Other: `IsAVXOnlyInstruction`, `emitIns_J_S` ---------- Checked for cascaded dead code after removal via a zero-caller scan over all emitxarch.h-declared method names -- no functions became newly dead as a result of these deletions; every helper the removed bodies called remains used elsewhere. `emitIns_IJ` was found to be a pre-existing zero-caller function unrelated to this change, so it is intentionally left out of scope here. Build (`build.cmd clr.jit -c checked -a x64`) succeeds with 0 warnings / 0 errors, and jit-format produces no changes. > [!NOTE] > This PR description and the changes were drafted with the assistance of GitHub Copilot. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
`Runtime_129288.cs` was added in #129348 (`JIT: don't claim rotates set ZF on xarch`) as a merged-style xunit test (`[Fact] public static int TestEntryPoint()`), but it was never referenced by any `Regression_*.csproj`. Since the SDK-style CLR test projects set `EnableDefaultItems=false`, an unreferenced `.cs` is silently never built or run -- so CI has never exercised this test. This is the same class of bug fixed in #130832. Add it to `Regression_ro_2.csproj` (an `Optimize=True` bucket, correct for this lowering/codegen correctness test), inserted in numeric order alongside its neighbors. I also audited every other `.cs` under `src/tests/JIT/Regression/` for the same issue. The only genuine orphan was `Runtime_129288`. Six other unreferenced `.cs` files are intentionally uncompiled reference sources paired with a hand-written/generated `.il` + `.ilproj` (`Runtime_70259`, `Runtime_70607`, `Runtime_73615`, `Runtime_80731`, `Runtime_40607`, `DevDiv_754566`) and were left as-is. > [!NOTE] > This PR description and the change were generated with the assistance of GitHub Copilot. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Fixes #128478 I saw there are reported perf regressions for `TensorPrimitives.IndexOfMax` in #128088, so I understand if you can't take this PR to fix that (or revert #127454). PR also includes: - Add coverage for fixed bug in `IndexOf*Magnitude_Negative1LesserThanPositive1` - Tighten asserts and don't avoid `MinValue` in `IndexOf*Magnitude_AllLengths` - Increase coverage in `IndexOf*_Negative0LesserThanPositive0` to cover vectorized paths. - Ensure floating point tests for `TensorPrimtivies` are run for `NFloat`
## Summary Fixes #125794. AOT-published Blazor WebAssembly apps that use `BlazorWebAssemblyLazyLoad` crash during Mono runtime startup — reported as `appdomain.c` assertion (`condition '<disabled>' not met`) and, in other configurations, `interp.c` `NIY … should not be reached`. ## Root cause An AOT image *hard-binds* to every assembly it references when the image is loaded. `load_aot_module` in `src/mono/mono/mini/aot-runtime.c` eagerly calls `load_image` for all referenced images unless the `aot-lazy-assembly-load` runtime option is set: ```c /* … we have to load all referenced assemblies non-lazily … */ if (!mono_opt_aot_lazy_assembly_load) { for (guint32 i = 0; i < amodule->image_table_len; ++i) load_image (amodule, i, load_error); } ``` A `BlazorWebAssemblyLazyLoad` assembly is **not present at runtime startup** (it is downloaded on demand). So when the main app's AOT image is loaded, resolving its lazy dependency fails and the image is marked *"unusable because dependency `<asm>` is not found"*. Every method in that image then falls back to the interpreter, which hits an unsupported construct and aborts: ``` [MONO] AOT: module WasmBasicTestApp is unusable because dependency Json is not found. MONO interpreter: NIY encountered in method <Module>:.cctor () [MONO] * Assertion: should not be reached at .../mono/mini/interp/interp.c:4135 ``` ## Fix Automatically enable the runtime's existing `aot-lazy-assembly-load` option from the WebAssembly SDK when AOT is combined with `BlazorWebAssemblyLazyLoad`. This defers binding of a referenced lazy assembly until it is actually loaded, so the referencing AOT image stays usable. The option flows through `runtimeOptions` in the boot config → `mono_wasm_parse_runtime_options` → `mono_options_parse_options`. The change is scoped to `RunAOTCompilation=true` + at least one `BlazorWebAssemblyLazyLoad` item, so non-AOT and non-lazy builds are unaffected. ## Test `LazyLoadingTests` previously only covered the interpreter (Debug) configuration. Added `LoadLazyAssemblyWithAOT` (`native-mono`, Release + AOT + lazy load) which reproduces the crash without the fix and passes with it. ### Verification Built the browser (Mono + CoreCLR runtime packs) and workload locally and ran the new test. - **Without the fix:** `module WasmBasicTestApp is unusable because dependency Json is not found` → `interp.c:4135` assertion → timed out waiting for `WASM EXIT`. ❌ - **With the fix:** `AOT: image 'WasmBasicTestApp' found.`, `firstJsonLoad=true`, `{"FirstName":"John","LastName":"Doe"}`, `WASM EXIT 0`. ✅ > [!NOTE] > This pull request was authored with GitHub Copilot.
Switches multicast to `Wrapper[]`, cleans up and spanifies combine/remove. Cleans up code after the moves and type changes.
…nstructions (#130339) ## Summary Reworks the repository's customized code-review automation into two complementary parts: 1. A deterministic orchestrator plus a per-PR agentic workflow that replaces the previous `pull_request`-triggered `code-review.md` 2. Path-specific review instructions broken out of the code-review skill so GitHub's built-in Copilot code review agent applies the same dotnet/runtime-specific rules. The dispatched agentic workflow submits a single, cumulative "Holistic Review" per commit range rather than a stateless diff-only pass, and it is designed to run alongside — not replace — the built-in Copilot reviewer. ## Behavior: draft, ready, and closed pull requests - **Ready (non-draft), open PRs** are polled on a 10-minute schedule; the orchestrator dispatches one worker run per PR whenever it is new or its head commit changed since the last durable review. - **Draft PRs are excluded from the scheduled poll.** They can still be reviewed on demand: `holistic-review-orchestrator`'s `workflow_dispatch` accepts a comma-separated `pr_numbers` input ("including drafts and retry-limited review targets") that bypasses the draft filter for exactly the requested PRs, and an unchanged head with an existing durable review is not reviewed again. - **Scheduled runs skip forks while manual runs remain available.** The dispatch job runs for `workflow_dispatch` or when the repository is not a fork, preventing scheduled fork runs without blocking explicit manual dispatch. - Manual and scheduled dispatch share the exact same state, retry, and dedup logic — there is no separate manual code path to keep in sync. ## Coexistence with the built-in Copilot code review agent The Holistic Review worker and GitHub's built-in Copilot code review agent are fully independent; neither waits on, hides, or edits the other's output, and both remain visible on the PR alongside human reviews. The path-specific instruction files under `.github/instructions/` are consumed natively by both: the Holistic Review skill explicitly loads them, and Copilot's built-in reviewer already applies any `.instructions.md` file whose `applyTo` glob matches the changed paths. Every Holistic Review ends with an explicit disclosure distinguishing it from the built-in review and linking back to the `holistic-review.md` workflow source. Reviews are strictly additive: the worker's only two safe outputs are up to 10 inline `create_pull_request_review_comment` calls and exactly one `submit_pull_request_review`, whose event is restricted to `COMMENT`. It never submits `APPROVE` or `REQUEST_CHANGES`, and it never modifies, hides, or supersedes an earlier review or comment from this workflow, the built-in reviewer, or a human. ## Architecture: deterministic orchestrator + gh-aw worker - **`holistic-review-orchestrator.yml`** is a conventional, deterministic GitHub Actions workflow — not an agentic workflow. Its top-level `permissions: {}` grants only `actions: write` / `pull-requests: write` inside its single job, and it does nothing but call the GitHub REST API to decide what to dispatch and to read/write one managed state comment per PR. It never checks out PR content and never runs a model, keeping it secure even though it processes untrusted PR metadata. - **`holistic-review.md`** is the `gh-aw`-compiled agentic worker (compiled to `holistic-review.lock.yml` with gh-aw v0.82.6, pinned via `.github/aw/actions-lock.json` to `github/gh-aw-actions/setup@v0.82.6`). The orchestrator dispatches it once per PR via the Actions API with the PR number, base ref, head SHA, the previously reviewed head and base SHA (when re-reviewing), a bounded review-history JSON blob, and a complete synthetic `aw_context` (`run_id`, `repo`, `workflow_id`, `item_type`, `item_number`) so gh-aw's safe-output layer has full pull-request context even though the triggering event is `workflow_dispatch`, not `pull_request`. - The orchestrator and worker communicate only through `workflow_dispatch` inputs at dispatch time and the worker's own submitted review afterward, which the orchestrator discovers by matching the run's `display_title` (`Holistic Review #<PR> (<head SHA>)`) and by recognizing gh-aw's automatic `<!-- gh-aw-agentic-workflow: Holistic Review, ... workflow_id: holistic-review -->` review-footer marker. See `github/gh-aw`'s documentation on compiled agentic workflows, safe outputs, and `workflow_dispatch`-based dispatch, and GitHub's own [`workflow_dispatch`](https://docs.github.com/actions/using-workflows/manually-running-a-workflow) and [triggering-a-workflow](https://docs.github.com/actions/using-workflows/triggering-a-workflow) documentation, for background on the primitives this design builds on. ## Why review state lives in a pull request comment Each PR carries exactly one managed, orchestrator-owned issue comment holding a versioned (`version: 5`) JSON state object: the last dispatched and last reviewed `(commit, base ref, base SHA)` pairs, the ID of the worker run that produced the last recorded review, a bounded initial-plus-latest review-history array, and a bounded `review_attempt_count`. Comments were chosen over gh-aw's repo-memory/cache mechanisms because gh-aw v0.82.6 supports deterministic reads of repo-memory/comment-memory but not deterministic *write-back* of durable state from a dispatch-triggered workflow. A `pull-requests: write`-scoped comment is visible, auditable state that survives reruns, needs no `contents: write`, and is trivially inspectable by anyone reading the PR. Crucially, **a submitted, marker-tagged worker review is the authoritative record of what has actually been reviewed — not the state comment**; the comment only suppresses duplicate in-flight dispatches, and legacy comment formats (including a pre-existing machine-only JSON format and an older HTML-marker format) are recognized once and migrated to the current schema in place. ## Retries and durable-review authority A worker run that completes without submitting a review — a transient provider error, a threat-detection replacement, or a safe-output formatting failure — is never treated as "reviewed." The orchestrator only advances `last_reviewed_*` when it finds a matching, marker-tagged submitted review for the exact dispatched commit and base; otherwise it clears that dispatch record and redispatches the same target. Retries for the same `(head, base)` target are bounded at `MAX_REVIEW_ATTEMPTS = 5`; once exhausted, the PR is reported as retry-limited in the workflow step summary rather than dispatched indefinitely, and it can still be retried explicitly through the manual `pr_numbers` input. Because attempts are keyed by `(head commit, base branch)`, a rebase, force-push, or base retarget resets the attempt counter for the new target instead of inheriting an unrelated failure count. ## Review scope: holistic initial review vs. patch-differential incremental review A trusted, deterministic pre-agent step — not the model — computes the review scope before the agent starts: it resolves the current merge base, computes a patch ID for the PR's cumulative diff, and (for re-reviews) computes the previous merge base, a previous patch ID, a `git range-diff`, and a raw patch diff, writing all of it to `metadata.json` plus `range-diff.txt`/`patch-diff.txt` for the agent to read. - **Initial review:** analyzes the complete `current_merge_base..head` range — the PR's actual base-to-head diff, not its head compared against the current state of the base branch. - **Re-review (incremental):** uses two distinct scopes. It re-reads the complete current base-to-head range only to refresh the cumulative Motivation/Approach/Summary assessment, explicitly comparing against the initial and most recent recorded reviews (retrieved by ID, not rediscovered from the general review list) and stating whether each is unchanged or changed and why. Detailed/actionable findings are restricted to the prepared `range-diff`/`patch-diff` between the previous and current cumulative patches — not a raw tree diff between the two head commits — so a rebase that pulls in unrelated upstream changes cannot manufacture new findings. If the previous and current heads are identical but the merge base changed (a pure base retarget), the same prepared patch comparison is authoritative: only code whose inclusion or semantics changed because of the retarget is reviewed, and unchanged portions of the PR patch are not rediscovered. If the patch truly has not changed, the worker still submits a `COMMENT` review recording that fact and the refreshed Assessment History, so every successful run leaves a durable record. ## Model selection The workflow does not hard-code a model. `engine.model` resolves from the workflow-specific `HOLISTIC_REVIEW_MODEL` Actions variable, allowing the model to be selected at environment, repository, or organization scope without editing or recompiling the workflow. ## Security model - **Least privilege throughout.** The orchestrator's job-scoped permissions are `actions: write` / `pull-requests: write` only; the worker's top-level permissions are `contents: read`, `issues: read`, `pull-requests: read`, and its actual review/comment capability comes from gh-aw's safe-output layer rather than a broadly scoped token held by the agent. - **GitHub reads go through the job-scoped, read-only token.** `tools.github.github-token` is pinned to `${{ secrets.GITHUB_TOKEN }}`, so the agent's `gh`/GitHub-proxy calls cannot be backed by a broader `GH_AW_GITHUB_*` secret, and the declared read-only permissions are actually authoritative. - **PR content — including its own configuration files — is treated as untrusted input.** The worker checks out the dispatched head commit, then removes and restores every agent-configuration path gh-aw v0.82.6 recognizes (the complete `.github` tree, every supported engine configuration directory, and all recognized root instruction files) from `main` before loading any guidance, because a plain checkout alone would leave PR-added files in those paths behind. PR versions of those paths — along with PR descriptions, comments, source comments, test data, and other PR-controlled text — are treated strictly as untrusted review content, never as instructions; changed files under a trusted overlay path are still reviewed from an explicit commit read or the PR diff, never from the restored worktree copy. - **A narrow, read-only shell allowlist with no build/test/execute capability.** The worker cannot run builds or tests, restore or install dependencies, execute PR-provided scripts or binaries, or make direct outbound HTTP requests; there is no `web-fetch` tool. The allowlist further excludes general-purpose process-launch surfaces (`awk`, `find`, `xargs`, `rg`, `sed`, `sort`, `gh`) so an allowlisted command cannot spawn another process or modify the workspace; the prompt separately forbids Git/GitHub CLI aliases, hooks, pagers, external helpers, credential helpers, and other child-process-spawning options, and treats the remaining compiler-injected `git`/`gh`/`sort` surface honestly as defense in depth rather than a strict sandbox. - **Egress is narrowed and routed through a CLI-side proxy.** `network.allowed` is limited to `defaults` (no `dotnet` feed access, since builds/restores are disallowed), and `tools.cli-proxy: true` alongside `tools.github.mode: gh-proxy` ensures no native MCP endpoints remain mounted in the CLI — only the CLI-mounted `safeoutputs` server — avoiding a firewall interaction where native endpoints bypassed the intended proxy path and were denied. - **Both safe outputs are bound to the exact dispatched PR**, not a wildcard or an agent-supplied target: `target: ${{ github.event.inputs.pr_number }}` on both `create-pull-request-review-comment` and `submit-pull-request-review`. A review cannot be redirected to any PR other than the one the orchestrator dispatched. - **Agent checkouts don't carry credentials.** Because gh-aw strips Git credentials before the agent runs, `pre-agent-steps` perform a token-scoped fetch of exactly the commits the review needs (current head, prior head, and prior base) while a token is still available, so the agent operates only on local Git objects afterward, including across force-pushes and retargets. ## Shared review instructions The review rules that used to live entirely in `.github/skills/code-review/SKILL.md` are split into path-scoped `.github/instructions/*.instructions.md` files, each with an `applyTo` glob, so they're consumed identically by the Holistic Review skill and by GitHub's built-in Copilot code review agent: - **`review-all-src.instructions.md`** (`src/**`) — reviewer mindset, the Holistic PR Assessment (motivation, evidence, approach, cost-benefit, scope, risk, codebase fit), PR hygiene, code reuse, established conventions (including preserving pre-existing alphabetical ordering in modified `.csproj` item groups and similar lists, flagging only ordering regressions the PR introduces, not pre-existing unsorted entries), and documentation/comment rules. - **`review-csharp.instructions.md`** (`**/*.cs`) — C#-specific error handling, thread safety, security, correctness, performance/allocation, API design, and style rules. - **`review-native.instructions.md`** (C/C++/asm globs) — JIT-specific correctness, C++ style, VM/interpreter conventions, native size/offset overflow guarding, platform defines, and P/Invoke marshalling. - **`review-all-tests.instructions.md`** (test globs) — testing conventions and regression-test expectations. - **`review-core-runtime.instructions.md`** (`src/coreclr/**,src/native/corehost/**`) — CoreCLR/compiler/host-specific correctness, collectibility, allocation, and PR-prerequisite guidance that should not load for ordinary managed-library changes. The broad C#, native, and test files explicitly state that PR-level gates are preparation guidance during authoring or local experimentation, not reasons to block exploratory work unless review is requested. `SKILL.md` retains the review process and points at these files for substantive guidance. Its area-agent discovery runs only when sub-agent tooling and matching agents actually exist; an instruction file does not imply an agent. The dispatched worker has no such tooling and explicitly skips agent discovery and multi-model fan-out. ## Testing: multi-iteration time-travel replay simulation Because this changes how and when reviews are triggered — not just what they say — it was validated by replaying real PR event timelines (opening commit, subsequent commits, and human review feedback) against the candidate workflow tree in a disposable simulation repository, resetting all simulation PRs and state between rounds and starting the next round only from a clean, freshly deployed tree. --- > [!NOTE] > This PR description was drafted with the assistance of GitHub Copilot. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Resolves #117718. Following up on diagnosis by @lindexi. When `NamedPipeClientStream.Connect()` waits for a non-existent pipe on Linux, the internal retry loop creates a `Socket` and calls `Connect()` on every iteration. Each attempt throws and catches a `SocketException`, flooding `FirstChanceException` handlers and wasting CPU on exception allocation. This change adds a `Stat` check at the top of `TryConnect`: if the socket file doesn't exist (`ENOENT`), the method returns `false` immediately without allocating a `Socket` or throwing. Permission errors (`EACCES`) and all other conditions still fall through to the existing `socket.Connect` path, preserving their specific exception behavior. The check introduces a benign TOCTOU window: if the pipe file appears between the `Stat` call and the next loop iteration, `ConnectInternal`'s polling loop picks it up on the subsequent retry. This does not reintroduce the exception flood since the file now exists and `Connect` will either succeed or fail with a non-retryable error. ### Changes - `NamedPipeClientStream.Unix.cs`: Added `Interop.Sys.Stat` / `ENOENT` guard before socket allocation in `TryConnect` - `NamedPipeTest.Specific.cs`: Added Unix-specific test that verifies connecting to a non-existent pipe does not flood `FirstChanceException` with `SocketException`s ### Test plan - New test: `ClientConnect_PipeNotFound_DoesNotFloodFirstChanceExceptions` — connects to a non-existent pipe for 500ms, asserts fewer than 5 `SocketException`s via `FirstChanceException` (previously hundreds/thousands) - Existing test: `ClientConnect_Throws_Timeout_When_Pipe_Not_Found` — verifies `TimeoutException` still thrown (unchanged behavior) --------- Signed-off-by: haltandcatchwater <angeloregalbutophotography@gmail.com>
…tifact (#128498) ## Summary Migrates all remaining `PublishBuildArtifacts@1` / `DownloadBuildArtifacts@0` usage in `eng/pipelines/` to `PublishPipelineArtifact@1` / `DownloadPipelineArtifact@2`. Pipeline Artifacts use dedup-based upload and are 10-100x faster than legacy Build Artifacts. This migration reduces agent time spent on artifact publishing and returns agents to the pool sooner, reducing queue pressure for all pipelines sharing the same pools. ## Artifact naming strategy Pipeline Artifacts cannot be overwritten on retry (unlike Build Artifacts), so artifact names must account for `System.JobAttempt`: - **Diagnostic artifacts** (logs, binlogs, test results): suffixed with `_Attempt$(System.JobAttempt)` to avoid collisions on retry - **Intermediate artifacts** consumed by downstream jobs: use **stable names** (no Attempt suffix) and publish only on `succeeded()` so retries can publish cleanly ## Changes ### Publish wrapper - `eng/pipelines/common/templates/publish-build-artifacts.yml`: `PublishBuildArtifacts@1` / `1ES.PublishBuildArtifacts@1` → `PublishPipelineArtifact@1` / `1ES.PublishPipelineArtifact@1` - `upload-artifact-step.yml`, `upload-intermediate-artifacts-step.yml`: updated input names (`PathtoPublish` → `targetPath`, etc.) ### WASM - `wasm-post-build-steps.yml`: 2 direct calls migrated; stable artifact names preserved for downstream consumption ### Performance templates - `build-perf-sample-apps.yml`: 10 binlog publish steps → `_Attempt$(System.JobAttempt)` suffix (diagnostic) - `build-perf-bdn-app.yml`: 1 binlog → `_Attempt` suffix - `build-perf-maui-apps-net6.yml`, `build-perf-maui-apps-net7.yml`: 6 binlogs each → `_Attempt` suffix ### Downloads - `download-artifact-step.yml`, `download-specific-artifact-step.yml`, `browser-wasm-build-tests.yml`, `browser-wasm-coreclr-build-tests.yml`: migrated to `DownloadPipelineArtifact@2` ## Not changed - `eng/common/` files (managed by Arcade; the `templates/job/job.yml` wrapper already routes `enablePublishBuildArtifacts` through `publish-pipeline-artifacts` with `_Attempt` suffix) - `enablePublishBuildArtifacts: true` parameter references in SuperPMI/libraries templates (parameter name only; already handled by Arcade wrapper) --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Alexander Köplinger <alex.koeplinger@outlook.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
`RtlAddGrowableFunctionTable` and related APIs were introduced in Windows 8.
…mon.h (#130928) Removes redundant/stale preprocessor defines and a block of blanket MSVC warning suppressions from `src/coreclr/vm/common.h`, and cleans up dead `USE_COM_CONTEXT_DEF` / `_CRT_DEPENDENCY_` defines from the debug/md/unwinder `stdafx.h` files. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Jan Kotas <jkotas@microsoft.com>
<!-- --> Tier 1 assertion propagation could incorrectly remove an unsigned addition’s overflow check because JIT ranges use signed intervals. - **Range analysis** - Reject unsigned ranges that straddle signed zero. - Require sums to remain representable by the signed range model. - **Regression coverage** - Cover the reported checked-addition failure and sign-straddling ranges. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: EgorBo <523221+EgorBo@users.noreply.github.com> Co-authored-by: Egor Bogatov <egorbo@gmail.com>
Reduces unsafe code use in `decimal` where it was easy to remove. These changes are all either performance neutral or improvements. For the remaining cases the changes are more involved and need thorough perf measurements and some effort to offset the perf losses. --------- Co-authored-by: Jeff Handley <jeffhandley@users.noreply.github.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…rator (#131022) ## Summary Fixes #110870. Building a browser-wasm app that references a **Windows-only** P/Invoke with non-blittable parameters (e.g. the gdi32 `GetCharABCWidthsFloat`, which takes `HandleRef` / `object`) emits spurious diagnostics on the **Mono** wasm backend: ``` WASM0060 : Type System.Object is not blittable: Not a ValueType WASM0062 : Type System.Runtime.InteropServices.HandleRef is not blittable: Field _wrapper is not blittable WASM0001 : Could not get pinvoke, or callbacks for method '...GetCharABCWidthsFloat' because 'System.NotSupportedException: Unsupported parameter type ...' ``` ## Root cause The Mono pinvoke collector (`src/tasks/WasmAppBuilder/mono/PInvokeCollector.cs`) analyzed **every** P/Invoke and callback in every referenced assembly, without consulting `[SupportedOSPlatform]` / `[UnsupportedOSPlatform]`. So a method that is only usable on Windows still had its (non-blittable) signature analyzed when targeting the browser, producing the warnings. The **CoreCLR** collector already handles this — it skips a method up front via `IsUnsupportedOnPlatform` / `EvaluatePlatformAttributes`, driven by a `TargetOS`. That check was never ported to the Mono collector, so #110870 still reproduces on Mono while it's fixed on CoreCLR. ## Fix Mirror the CoreCLR platform check into the Mono generator: - Thread `TargetOS` through `ManagedToNativeGenerator` → `PInvokeTableGenerator` → `PInvokeCollector` (the shared `<ManagedToNativeGenerator>` invocation now passes `TargetOS="$(TargetOS)"`; the Mono task gets a `TargetOS` property defaulting to `browser`, mirroring CoreCLR). - Skip pinvokes and callbacks whose method, declaring type (including nesting), or assembly is unsupported on the target OS — i.e. `[UnsupportedOSPlatform(target)]`, or a `[SupportedOSPlatform(...)]` list that doesn't include the target. Only affects the Mono wasm build task; CoreCLR is unchanged. ## Test Adds `PInvokeTableGeneratorTests.UnsupportedOSPlatformPInvokeIsSkipped`: builds a browser app containing a `[SupportedOSPlatform("windows")]` non-blittable pinvoke and asserts none of `WASM0001`/`WASM0060`/`WASM0062` are emitted. ### Verification Built the Mono wasm build task and ran a repro (browser app with a `[SupportedOSPlatform("windows")]` gdi32-style pinvoke taking `HandleRef`/`object`), plus the new WBT test: - **Without the fix:** `WASM0060` + `WASM0062` + `WASM0001` (matching the report). - **With the fix:** 0 warnings; the new test passes (Debug + Release). > [!NOTE] > This pull request was authored with GitHub Copilot. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…131025) ## Summary Fixes #120327. A `dotnet publish` of a WebAssembly app (native/emcc build) fails on Windows when the user profile name contains parentheses, e.g. `C:\Users\John(US)`: ``` WasmApp.Common.targets: error : Failed to compile ...\runtime.c -> ...\runtime.o 'C:\Users\John' is not recognized as an internal or external command, operable program or batch file. ``` The project path itself is fine — the parentheses are in the **home/temp** path. ## Root cause `Utils.RunShellCommand` (used by the `EmccCompile` task) writes the compiler command to a temporary batch file under `Path.GetTempPath()` and runs it as: ``` cmd /c "<tempdir>\tmpXXXX.cmd" ``` `Path.GetTempPath()` is under the user profile (`C:\Users\John(US)\AppData\Local\Temp\...`), so that quoted path contains `(` and `)`. `cmd`'s `/c` quote-handling rule only preserves the quotes when there are **no** special characters between them; parentheses are special, so `cmd` strips the surrounding quotes and then parses the now-unquoted path up to the first `(` — treating `C:\Users\John` as the command and reporting "is not recognized". The native build then fails. (Everything earlier in the build succeeds, which is why the failure only surfaces at the emcc compile step.) ## Fix Invoke the script with `/S` plus an extra pair of quotes: ``` cmd /S /c ""<tempdir>\tmpXXXX.cmd"" ``` `/S` makes `cmd` strip only the outermost pair of quotes and treat the remainder verbatim, so the inner quotes around the path are preserved and the path is passed intact regardless of parentheses/spaces. The Unix `/bin/sh` path is unaffected (the quoted path is passed as a single argv and never re-parsed) and is left unchanged. ## Test Adds `NativeBuildTests.NativeBuildWithParenthesesInTempPath`: a native (`WasmBuildNative=true`) build with `%TMP%`/`%TEMP%` pointed at a directory containing parentheses. It's gated to Windows (`[SkipOnPlatform(TestPlatforms.AnyUnix, …)]`) because the `cmd.exe` quote-stripping behavior is Windows-specific. ### Verification - The failure only reproduces on Windows `cmd.exe`; the Unix `/bin/sh` code path is not affected, so it cannot be reproduced on Linux/macOS. - Locally (macOS): confirmed the `WasmAppBuilder` task and the `Wasm.Build.Tests` project both compile cleanly with the change. - The regression test exercises the real end-to-end native build with a parenthesized temp path on Windows CI, where it fails without this fix. > [!NOTE] > This pull request was authored with GitHub Copilot. --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
## Summary Fixes #112262. A P/Invoke whose argument is an enum with a **64-bit underlying type** (e.g. `[Flags] enum Flags : ulong`) crashes on wasm at the call site with `RuntimeError: null function or function signature mismatch`. ## Root cause `interp_type_as_ptr()` (interp/transform.c) decides whether a native call can take the fast `MINT_CALLI_NAT_FAST` → `do_icall` path, which passes every argument as a pointer-sized `gpointer`. It treated **every enum as pointer-compatible without checking its underlying type**: ```c if (tp->type == MONO_TYPE_VALUETYPE && m_class_is_enumtype (...)) return TRUE; // ignores underlying type ``` Raw `long`/`ulong` are already correctly excluded on 32-bit targets via the `#if SIZEOF_VOID_P == 8` guard (which is why the documented workaround — casting the enum to `ulong` — works), but a 64-bit **enum** slipped through. `do_icall` then called the native `void(int64_t)` as `void(int32_t)` on wasm32 → `call_indirect` signature mismatch. ## Fix Only a 64-bit enum can be misclassified as pointer-sized on a 32-bit target, so for enums with an `I8`/`U8` underlying type defer to the underlying type (which is `SIZEOF_VOID_P`-guarded); all other enums keep their existing classification. Behavior only changes for enums with a 64-bit underlying type on 32-bit targets such as wasm32; `enum:int`/`enum:uint`/smaller enums and all enums on 64-bit hosts are unchanged. `interp_type_as_ptr` is interp-transform-only; the AOT (`type_to_c`) and jiterpreter (`mono_type_to_ldind`) signature paths already reduce enums to their underlying type, so no parallel change is needed. ## Test Extended the existing WASM ABI pinvoke test (`AbiRules.cs` + `wasm-abi.c`) with `enum:ulong` and `enum:long` direct pinvokes — the two cases the fix changes. `EnsureWasmAbiRulesAreFollowedInInterpreter` (the interpreter path where the bug lives) exercises the regression. ### Verification Built the browser Mono runtime with the fix and ran the WASM ABI interpreter test end-to-end: - **Without the fix:** `void(enum:ulong)` pinvoke → `function signature mismatch`, app aborts before running. - **With the fix:** test passes; native round-trips the full 64-bit value (`eu (eu)=18374966859414961921`, `ei (ei)=-2`). Also verified out-of-band that a pinvoke argument of every enum width — `byte`/`sbyte`/`short`/`ushort`/`int`/`uint`/`long`/`ulong` — round-trips correctly on wasm with this change. > [!NOTE] > This pull request was authored with GitHub Copilot. --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Two latent correctness fixes found while auditing `gentree.cpp`, each with a regression test. ---------- **Fix `GetOperForHWIntrinsicId` testing the `isScalar` pointer instead of `*isScalar`** (#130830) `GetOperForHWIntrinsicId` refines a `GT_SUB` into a `GT_NEG` when the constant `op1` is a scalar zero, but it guarded on the `isScalar` out-param pointer (always non-null) rather than the dereferenced value. This let a **packed** subtract whose constant has a zero low lane but is not all-zero (e.g. `Vector128.Create(0, 1, 2, 3) - x`) be reported as a negate. `fgOptimizeHWIntrinsic`'s `(-v1) + v2 => v2 - v1` transform then drops the constant entirely. ---------- **Fix stray block clobbering `needsFixup` in `gtNewSimdMinMaxNode`** (#130831) A stray unconditional block in the min branch of the floating constant fast path overwrote `needsFixup` for all four cases, making the preceding if/else dead. `needsFixup` signals that a signed-zero constant needs the AVX512 fixup so `min(+0, -0)` keeps the correct sign of zero; with it wrongly forced `false`, `Min`/`MinNumber` against a signed-zero constant miscompiles. The min branch now mirrors the already-correct max branch. Existing coverage in `JitBlue/Runtime_98068` exercises `Min`/`MinNumber` const-folding but always pairs an operand with `NaN`, so the finite opposite-signed-zero case was never tested. ---------- Both are pre-existing on `main`, found by inspection. Tests added under `JitBlue/Runtime_130830` and `JitBlue/Runtime_130831`. CC. @dotnet/jit-contrib > [!NOTE] > This PR description was authored with the help of GitHub Copilot. --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
## Summary Converts the cDAC `TypeHandle` value type into an `ITypeHandle` interface with a canonical, target-backed implementation (`TargetTypeHandle`). This is a foundational refactor; **synthetic (reader-fabricated) type handles for unloaded constructed types are deferred to a follow-up PR.** Absent or unresolved types use standard C# nullable-reference semantics (`ITypeHandle?` / `null`). Non-null handles are canonical identities produced and interned by `RuntimeTypeSystem` within a target cache epoch. ## Motivation This change is primarily **enabling groundwork**. Turning `TypeHandle` into an interface lets the Runtime Type System (RTS) contract grow in two directions that the current value-type shape cannot accommodate: - **Versioning** -- different contract versions can supply their own `ITypeHandle` implementations without changing every consumer when the representation evolves. - **More expansive RTS support** -- most immediately, synthetic handles for constructed types (`Ptr`/`Byref`/`SzArray`/`Array`, and later generic instantiations) that are not loaded in the target. A polymorphic `ITypeHandle` lets RTS fabricate a queryable handle instead of relying on ad-hoc side channels. ## Behavior note The old struct compared by address value. The new handles use canonical reference identity: repeated `GetTypeHandle` calls for the same address return the same object until `Target.Flush` invalidates the cache. Resolving the same address after a flush may return a different object reference. This identity change is intentional and prevents future handle implementations from having to coordinate cross-implementation value equality. ## Changes - Rename `TypeHandle` -> `ITypeHandle` across cDAC type references (members named `TypeHandle` remain unchanged). - Add the `ITypeHandle` interface in Abstractions (`Address`). - Add the internal `TargetTypeHandle` implementation for real target-backed handles. - Intern target handles per address so repeated `GetTypeHandle` calls return the same canonical instance within a cache epoch. - Use reference identity for constructed-type cache keys. - Represent absent/unresolved handles with nullable references and annotate the affected contracts and consumers. - Preserve the existing `ReadOnlySpan` collection API shapes. - Update the authoritative data-contract documentation. ## Why split it this way The original draft also added synthetic handles and reworked calling-convention side channels in one change. Splitting out the interface conversion keeps this PR focused; synthetic-handle behavior and its downstream simplifications can build on the stable `ITypeHandle` abstraction in a follow-up. ## Testing - Contracts and Legacy build cleanly. - All **2733** cDAC unit tests pass (16 skipped). - All **34** DataGenerator tests pass. - DumpTests and StressTests compile. > [!NOTE] > This PR description and the changes were produced with the assistance of GitHub Copilot. --------- Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Noah Falk <noahfalk@users.noreply.github.com>
The r2r.yml was deleted, but the corresponding AzDO pipeline definition wasn't deleted, and this is causing warnings on AzDO. I don't have permission to delete the definition, so we can add a dummy file in the meantime to avoid those warnings. --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
On WASM, `GetThreadStaticsBase()` computes the `ThreadLocalData*` by taking the address of `DirectOnThreadLocalData.pNativeThread`. On WASM, that field access goes through `StaticsHelpers.GetNonGCThreadStaticBase`, which itself calls `GetThreadStaticsBase()` — infinite recursion. Fix: add a `GetThreadStaticsBaseNative` FCall (WASM-only) that returns `&t_ThreadStatics` directly from native, bypassing the managed thread-static lookup path. - **`Thread.CoreCLR.cs`**: `#if TARGET_WASM` path in `GetThreadStaticsBase()` calls `GetThreadStaticsBaseNative()` instead of the `&pNativeThread` pointer arithmetic; declares the FCall as `[MethodImpl(InternalCall)]`. - **`comsynchronizable.h`**: declares `GetThreadStaticsBaseNative` FCDECL (WASM-only). - **`comsynchronizable.cpp`**: implements it returning `(void*)&t_ThreadStatics`; adds `#include "threadstatics.h"`. - **`ecalllist.h`**: registers the FCall (WASM-only). Extracted from main...AndyAyersMS:runtime:next-blocker-spc. Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: davidwrighton <10779849+davidwrighton@users.noreply.github.com>
- They should always be READYTORUN_FIXUP_PInvokeTarget instead of READYTORUN_FIXUP_IndirectPInvokeTarget - There is a debug version of JIT_PinvokeEnd which validates that sp == the __stack_pointer global. I believe our codegen will maintain this invariant, so we should be ok to skip resetting the __stack_pointer global before calls to the C++ implementation of JIT_PInvokeEnd - One detail which is no longer true after this work is merged is that the __stack_pointer global will be set to increasingly unpredictable values during execution. This is not a new phenomena, as it was happening during EH flow, but now it will happen in normal execution flow. Since the interpreter to R2R thunks will reset the stack before we return to any emscripten compiled code, we should be ok with this. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…llback from next-blocker-spc (#131121) Extracts the requested subset from `main...AndyAyersMS:runtime:next-blocker-spc`: the `GetCookieForCalliSig` string-constructor handling and the `prestub.cpp` managed-FCall helper entrypoint fix. This narrows the PR to the two runtime paths needed to unblock wasm mixed interpreter/R2R dispatch. - **`src/coreclr/vm/wasm/helpers.cpp` — `GetCookieForCalliSig`** - Adds a string-constructor special case so interpreter→R2R calli cookies use the constructor factory thunk shape (matching existing R2R→interpreter string-ctor handling). - Uses explicit thunk-key mapping by constructor arity, including `ReadOnlySpan<char>` constructor handling. - **`src/coreclr/vm/prestub.cpp` — managed FCall helper publication** - Handles both managed-helper forms under portable entrypoints: - interpreter bytecode available → publish interpreter data; - interpreter bytecode absent (native R2R helper) → publish helper native actual code. - Prevents routing back into prestub when the helper resolves to native code. ```cpp if (ilStubInterpData != NULL) { SetInterpreterCode((InterpByteCodeStart*)ilStubInterpData); PortableEntryPoint::SetInterpreterData(entryPoint, (PCODE)(TADDR)ilStubInterpData); } else { _ASSERTE(PortableEntryPoint::HasNativeEntryPoint(pCode)); PortableEntryPoint::SetActualCode(entryPoint, (PCODE)(TADDR)PortableEntryPoint::GetActualCode(pCode)); } ``` --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: davidwrighton <10779849+davidwrighton@users.noreply.github.com>
Follow-up to #130837. Several `JITDUMP` calls pass a trailing argument to a format string that has no corresponding `%` specifier, so the argument is silently ignored. This removes those leftover args. All are `DEBUG`-only and behavior is unchanged. - `lower.cpp` -- `JITDUMP("Argument is a local\n", numRegs, stackSeg.Size)` (the one called out in #130837) - `importercalls.cpp` -- `arrayElemSize` - `importervectorization.cpp` -- `str` - `inductionvariableopts.cpp` -- `dspTreeID(...)` (redundant; the following `DISPTREE` already dumps the tree) and `lclNum` - `optimizer.cpp` -- `lclNum` - `rangecheck.cpp` -- `expr` (two sites) Found by scanning every `.cpp` under `src/coreclr/jit` for literal format strings with no conversion but a trailing argument; these were the only hits. > [!NOTE] > This PR description and the changes were drafted with GitHub Copilot. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Fixes #131137. PR #130444 started removing transparent scalar/vector reinterpret `HWINTRINSIC` nodes (`CreateScalarUnsafe`, `GetLower`/`GetLower128`, `ToVector256Unsafe`/`ToVector512Unsafe`) during lowering when the consumer is another `HWINTRINSIC`. That's correct in general -- the consumer reads the value from a register at its own size -- but two x64 codegen sites keyed their decision off the *operand's* post-lowering type, which the elision changes. Both now produce wrong code. ---------- **`ConvertToVector128Int*` / `ConvertToVector256Int*` (the reported crash)** These have a vector overload `(Vector128<T>)` and a pointer overload `(T*)`, both lowering to `pmovzx*`. Codegen picked between them with `varTypeIsSIMD(op1)`. Once an elided `CreateScalarUnsafe` leaves the vector overload's operand scalar-typed, that proxy misfires and codegen takes the memory-load path -- reading the scalar value as if it were an address (the reported `NullReferenceException`; a checked JIT asserts in `emitxarch.cpp`). Fixed by selecting the overload from the stable `node->OperIsMemoryLoad()` metadata (aux-type driven), matching the generic table path already used elsewhere in the file. ---------- **AVX2 gather VSIB index width** A gather selects its VSIB index width (xmm vs ymm) from the index operand's *own* width (`indexOp->TypeIs(TYP_SIMD32)`). An elided `GetLower`/`ToVector*Unsafe` on the index changes that width, so the wrong VEX.L is encoded and the hardware reads the wrong number of indices (e.g. a `vpgatherqd` with a `GetLower()`-narrowed index gathered 4 elements instead of 2 -- a silent wrong result, not visible in the JIT disasm since it always prints the index as `xmm`). The index width can't be recovered in codegen, so this is fixed in lowering: the reinterpret elision is skipped when the node is a gather's index operand, since that width is load-bearing. ---------- I also audited the rest of `hwintrinsiccodegenxarch.cpp`, the store-containment paths in `codegenxarch.cpp`, and `emitxarch.cpp`: every other size/attr decision derives from node metadata (`node->TypeGet()`, `GetSimdSize()`, `GetSimdBaseType()`), and the `operandSize >= expectedSize` check in `IsContainableHWIntrinsicOp` prevents a narrowed operand from being contained undersized. These two sites were the only operand-width-driven exceptions. Added `Runtime_131137` covering both fixed paths (Sse41/Avx2 convert-from-scalar and the gather-with-narrowed-index case); it fails without the fix and passes with it. > [!NOTE] > This PR was authored with the assistance of GitHub Copilot. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
## Summary - Enable ReadyToRun coverage for `System.Runtime.Loader.DefaultContext.Tests`, `System.Reflection.Tests`, `System.Reflection.TypeExtensions.Tests`, and `System.Runtime.Loader.Tests`. - Account for the ReadyToRun test runner being the entry assembly in Reflection tests. - Load the TypeExtensions fixture explicitly from the published test directory. - Remove bind-failure fixtures from the ReadyToRun publish directory before Helix archives it, while retaining their `deps.json` entries. - Keep `System.Text.RegularExpressions.Tests` excluded for follow-up work. Part of #95928.
) The `parse_only_production` parameter on `c_fx_ver_parse` / `fx_ver_t::parse` was never passed as `true` — every caller used `false` or the default of `false`. Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: elinor-fung <47805090+elinor-fung@users.noreply.github.com>
…ortable entry point compatibility (#131119) Extracts the `InitHelpers.cs` changes from [AndyAyersMS:runtime:next-blocker-spc](main...AndyAyersMS:runtime:next-blocker-spc). On WASM targets using portable entry points, `call_indirect` signatures must match the compiled method exactly including return arity — but the JIT already models these helpers as value-returning (result pushed then discarded). Fix: return a dummy `null` from both helpers. - `InitClass`: `void` → `void*`, invert condition (remove early return), add `return null` - `InitInstantiatedClass`: same treatment - Add comments explaining the WASM `call_indirect` ABI requirement Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: davidwrighton <10779849+davidwrighton@users.noreply.github.com>
`Delegate.Method` needs to work since it's not a trim-unsafe API. I thought I maybe broke this in #129609, but the added test doesn't work in .NET 10 either, so I only broke a small aspect of this (GVMs were implicitly considered targets of reflection because of the `RuntimeMethodHandle` used as implementation detail).
Today several wasm codegen paths bail to the interpreter (`NYI_WASM_SIMD`) because a 128-bit SIMD value arrives as an `i32` (a by-ref pointer) rather than a real `v128` on the wasm value stack. Emitting a `v128.*` op against an `i32` operand produces an invalid module, so the JIT defensively bails. This is the end-to-end blocker for SIMD actually executing on wasm. This change treats `Vector128<T>` as the wasm `v128` ABI primitive and materializes it by value: - `getWasmLowering` maps `Vector128<T>` to `CORINFO_WASM_TYPE_V128`, and `ToJitType` maps that to `TYP_SIMD16`. - The five codegen sites that previously bailed now emit real `v128` values: SIMD parameter homing, SIMD16 local field load, store-indirect, call argument, and local load. - `RaiseSignature` can round-trip the `'V'` signature char back to a concrete v128 type. ---------- **Why only `Vector128<T>`.** It is the single SIMD type the JIT recognizes as `TYP_SIMD16` on wasm. In `getBaseTypeAndSizeOfSIMDType`, `Vector128<T>` (16 bytes) is not target-gated, `where-as` `Vector64<T>` is `TARGET_ARM64`-only and `Vector256<T>`/`Vector512<T>` are `TARGET_XARCH`-only, so on wasm those fall through to `TYP_UNDEF` and are handled as regular structs. The `System.Numerics` vectors (`Vector2`/`Vector3`/`Vector4`, `Vector<T>`, `Plane`, `Quaternion`) are multi-field, so `getWasmLowering` classifies them as passed by reference (they arrive as `TYP_BYREF`, not `varTypeIsSIMD`). The net effect is that the only by-value SIMD value reaching these codegen paths is a `Vector128<T>` in a real `v128` register, so the previous bails are no longer needed and no new gate is required. The other SIMD types keep their pre-change ABI and are deferred to follow-ups. Because every `'V'` in a lowered signature is now exactly 16 bytes, there is no mixed-width offset ambiguity in the signature round-trip. ---------- **Testing.** Adds an R2R test (`WasmSimdModule`) exercising the v128 calling convention — parameter, return, through-local, store-indirect, and call-argument — using `Vector128<int>` without any SIMD arithmetic intrinsics, so only the ABI/materialization paths are covered. Locally, `ILCompiler.ReadyToRun.Tests` (filter `Wasm`) passes 2/2; wasm SIMD only executes in CI, which is the point of this draft. Opening as **draft** for full CI validation. > [!NOTE] > This PR description was drafted with GitHub Copilot. --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Larry Ewing <lewing@gmail.com>
windbg needs an implementation of function table lookup to migrate away from DAC. In DAC this comes from the exported function OutOfProcessFunctionTableCallbackEx but since I didn't want tie the behavior to a specific dll export I created a new interface for it instead. This just creates the stub of an implementation which will still need to be filled in.
…131150) main PR N/A # Description `Delegate.IsDynamicDelegate()` in NativeAOT checked an impossible condition (`GetThunk(MulticastThunk) == IntPtr.Zero`), leaving an unreachable `DynamicInvokeImpl` branch. This change removes that dead representation check and keeps `DynamicInvoke` on the normal reflection-based invoke path. - **Core runtime cleanup** - Deleted `IsDynamicDelegate()`. - Removed unreachable dynamic-delegate branch from `DynamicInvokeImpl`. - Removed obsolete `CombineImpl` guard that depended on `IsDynamicDelegate()`. - **Behavior-preserving simplification** - Retained `ReflectionAugments.GetDelegateDynamicInvokeInfo(GetType())`. - Retained invoke-time exception wrapping (`wrapInTargetInvocationException: true`). - Retained debugger-step annotation behavior. - **Scope control** - Reviewed NativeAOT/runtime/compiler/libraries/tests for code solely tied to this obsolete path. - Removed only code directly coupled to that path; no unrelated thunk machinery changes. ```csharp [DebuggerGuidedStepThroughAttribute] protected virtual object? DynamicInvokeImpl(object?[]? args) { DynamicInvokeInfo dynamicInvokeInfo = ReflectionAugments.GetDelegateDynamicInvokeInfo(GetType()); object? result = dynamicInvokeInfo.Invoke(_target, _methodPtr, args, binderBundle: null, wrapInTargetInvocationException: true); DebugAnnotations.PreviousCallContainsDebuggerStepInCode(); return result; } ``` # Customer Impact Lower maintenance risk in delegate invocation code by removing unreachable logic and redundant branching in a core runtime type. # Regression Not a recent regression fix; this is dead-code removal and path simplification. # Testing Focused validation was run to ensure normal `DynamicInvoke` behavior remains intact (including targeted delegate `DynamicInvoke` coverage) and CoreLib/NativeAOT build viability was rechecked. # Risk Low. Narrowly scoped to deleting unreachable logic and preserving the existing active invocation path. # Package authoring no longer needed in .NET 9 IMPORTANT: Starting with .NET 9, you no longer need to edit a NuGet package's csproj to enable building and bump the version. Keep in mind that we still need package authoring in .NET 8 and older versions. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: MichalStrehovsky <13110571+MichalStrehovsky@users.noreply.github.com>
Follow up to #131155 (comment). `Runtime_131137` was added with a standalone `.csproj` and `RequiresProcessIsolation=true`, but the test meets none of the isolation rules in [`requiresprocessisolation.md`](https://github.com/dotnet/runtime/blob/main/docs/workflow/testing/coreclr/requiresprocessisolation.md) -- it sets no environment variables, no host config, and no process-wide state. It''s just a `[ConditionalFact]` in a `Runtime_131137` namespace with no custom `Main`, so it merges cleanly. This removes the standalone project and adds the source into the shared `Regression_ro_2.csproj` runner, matching the rest of the regression tests. ---------- I also audited the other recently-added `JitBlue` tests that still carry standalone csprojs. All of them are justified: the immediate neighbors `Runtime_130844`/`130845`/`130846` set `CLRTestEnvironmentVariable`, the remaining ISO ones set `CLRTestEnvironmentVariable`/`CLRTestTargetUnsupported`, and `Runtime_8980` disables the xunit wrapper generator. `Runtime_131137` was the only one with no trigger. CC. @EgorBo > [!NOTE] > This PR description was drafted by Copilot. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Test added in #130777. For code like the one below, where the `GetResult` of the value task source throws, the correct stacktrace should point to the await as the source of the throw. However, on interpreter, it is pointing to the new instruction. ``` public static async Task ThrowsSoonValueTaskSource() { ValueTask vt = new ValueTask(new ThrowsSoonValueTaskSourceImpl(), 0); await vt; } ``` The cause of this seems to be that we only report IL->native offsets for locations where the IL stack is empty, therefore we don't have a location at the await. This seems to be easily fixable via BrzVlad@460eae9. The problem with the fix is that it is a partial revert of #127469 so it has a good chance to lead to regressions on other diagnostic tests.
…ith gh-aw v0.82.6 (#131156) Agentic workflows that use the shared `pat_pool` job show a false-positive **"agentic threat detected / results could not be parsed"** banner (e.g. #131122) — the threat-detection job simply can't authenticate. **Cause:** under gh-aw **v0.81.6**, the generated `detection` job's `needs:` is hardcoded to `[activation, agent]` and omits the custom `pat_pool` job. So `needs.pat_pool.outputs.pat_number` is empty, `COPILOT_GITHUB_TOKEN` falls back to `'NO COPILOT PAT AVAILABLE'`, inference returns 503, and no `THREAT_DETECTION_RESULT` is emitted. Fixed upstream in **v0.82.6** (github/gh-aw#44202); `holistic-review` already runs v0.82.6 without the bug. **Fix:** recompiled the 5 affected workflows with gh-aw v0.82.6. Each `detection` job now depends on `pat_pool`: ```diff detection: needs: - activation - agent + - pat_pool ``` The `.md` `COPILOT_GITHUB_TOKEN` is flattened to a single line because v0.82.6's new `Check for OAuth tokens` step emits invalid YAML from a multiline value (same as `holistic-review.md`). --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Implement a check that throws a `PlatformNotSupportedException` when Extended Protection is enforced on platforms that do not support it. Add a corresponding error message for clarity. Include a test to verify this behavior on non-Windows platforms.
This pull request updates the following dependencies [marker]: <> (Begin:0c5a34f5-504e-413b-9376-08d8d8ff2d75) ## From https://github.com/dotnet/runtime-assets - **Subscription**: [0c5a34f5-504e-413b-9376-08d8d8ff2d75](https://maestro.dot.net/subscriptions?search=0c5a34f5-504e-413b-9376-08d8d8ff2d75) - **Build**: [20260630.1](https://dev.azure.com/dnceng/internal/_build/results?buildId=3011545) ([320869](https://maestro.dot.net/channel/8297/github:dotnet:runtime-assets/build/320869)) - **Date Produced**: June 30, 2026 10:44:48 AM UTC - **Commit**: [856cf037e3c32a4ccc485cda2dd7ef36b0bc1882](dotnet/runtime-assets@856cf03) - **Branch**: [main](https://github.com/dotnet/runtime-assets/tree/main) [DependencyUpdate]: <> (Begin) - **Dependency Updates**: - From [11.0.0-beta.26309.3 to 11.0.0-beta.26330.1][1] - Microsoft.DotNet.CilStrip.Sources - Microsoft.DotnetFuzzing.TestData - Microsoft.NET.HostModel.TestData - System.ComponentModel.TypeConverter.TestData - System.Data.Common.TestData - System.Drawing.Common.TestData - System.Formats.Tar.TestData - System.IO.Compression.TestData - System.IO.Packaging.TestData - System.Net.TestData - System.Private.Runtime.UnicodeData - System.Runtime.Numerics.TestData - System.Runtime.TimeZoneData - System.Security.Cryptography.X509Certificates.TestData - System.Text.RegularExpressions.TestData - System.Windows.Extensions.TestData [1]: dotnet/runtime-assets@741cd9b...856cf03 [DependencyUpdate]: <> (End) [marker]: <> (End:0c5a34f5-504e-413b-9376-08d8d8ff2d75) Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
## Automated Dependency Update This PR contains the following updates: | Package | Update | Change | |---|---|---| | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `8143d3f` → `65b656c` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `57861fa` → `0f6feb7` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `73db6e4` → `0be8725` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `675c5f2` → `428be03` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `cc1824e` → `ad046c7` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `343ffd7` → `f6b4797` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `056735e` → `1608f79` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `ad7d2c3` → `fc02e7d` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `68358db` → `b465025` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `4096bbf` → `76e7e4f` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `71e1591` → `d2582b6` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `620c418` → `f33fe0c` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `cb5214c` → `c0651a1` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `98071fd` → `2407884` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `69d2667` → `8491f14` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `8fdb1a4` → `eaece21` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `b448e8d` → `15dd63b` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `541bfc7` → `5782ea4` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `a9b4b8a` → `f4e3341` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `e309f18` → `db1a34b` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `4961733` → `301907b` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `368e164` → `a52c0bd` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `0afc4da` → `3af9ca1` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `74c557a` → `22acc70` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `594c1a8` → `718da2e` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `7f57a7e` → `f141d28` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `8102bd7` → `e64f6c2` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `4c305ca` → `73ca175` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `fd506e2` → `18ea7a1` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `d89b70a` → `bfa2dd9` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `6104a66` → `5cca2ad` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `b10bded` → `133fdc3` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `d6d5523` → `9fe9680` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `55cafde` → `4eeeb11` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `f2a0932` → `ca817af` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `ec917e9` → `06a5561` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `804a557` → `30b0629` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `042c87f` → `f983894` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `a42042a` → `b903935` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `53845f6` → `2f681f6` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `7fea07e` → `e605ffd` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `e573b57` → `3a37282` | | mcr.microsoft.com/dotnet-buildtools/prereqs | digest | `34918b5` → `91f43da` | This PR has been created automatically by the [.NET Renovate Bot](https://redirect.github.com/dotnet/arcade/blob/main/Documentation/Renovate.md) to update one or more dependencies in your repo. Please review the changes and merge the PR if everything looks good. <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNjMuMiIsInVwZGF0ZWRJblZlciI6IjQzLjI2My4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6 to 7. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/setup-python/releases">actions/setup-python's releases</a>.</em></p> <blockquote> <h2>v7.0.0</h2> <h2>What's Changed</h2> <h3>Enhancements</h3> <ul> <li>Migrate to ESM and upgrade dependencies by <a href="https://github.com/priyagupta108"><code>@priyagupta108</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1330">actions/setup-python#1330</a></li> <li>Pin SHA commits and update docs with latest versions by <a href="https://github.com/HarithaVattikuti"><code>@HarithaVattikuti</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1338">actions/setup-python#1338</a></li> <li>Remove the pip-install input by <a href="https://github.com/gowridurgad"><code>@gowridurgad</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1336">actions/setup-python#1336</a></li> </ul> <h3>Bug Fix</h3> <ul> <li>Fix to Classify stderr warning messages as warnings instead of errors in annotations by <a href="https://github.com/lmvysakh"><code>@lmvysakh</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1335">actions/setup-python#1335</a></li> <li>Validate and retry manifest fetch to prevent silent failures by <a href="https://github.com/priyagupta108"><code>@priyagupta108</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1332">actions/setup-python#1332</a></li> </ul> <h3>Dependency Upgrade</h3> <ul> <li>Bump certifi from 2020.6.20 to 2024.7.4 in /<strong>tests</strong>/data by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1328">actions/setup-python#1328</a></li> <li>Remove EOL Python versions and Bumps numpy text fixture by <a href="https://github.com/priya-kinthali"><code>@priya-kinthali</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1333">actions/setup-python#1333</a></li> <li>Upgrade <code>@actions/cache</code> to 6.2.0 by <a href="https://github.com/philip-gai"><code>@philip-gai</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1337">actions/setup-python#1337</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/lmvysakh"><code>@lmvysakh</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-python/pull/1335">actions/setup-python#1335</a></li> <li><a href="https://github.com/philip-gai"><code>@philip-gai</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-python/pull/1337">actions/setup-python#1337</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/setup-python/compare/v6...v7.0.0">https://github.com/actions/setup-python/compare/v6...v7.0.0</a></p> <h2>v6.3.0</h2> <h2>What's Changed</h2> <h3>Enhancement</h3> <ul> <li>Add RHEL support and include Linux distro in cache keys by <a href="https://github.com/priyagupta108"><code>@priyagupta108</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1323">actions/setup-python#1323</a></li> <li>Fix pip cache error handling on Windows by <a href="https://github.com/priyagupta108"><code>@priyagupta108</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1040">actions/setup-python#1040</a></li> </ul> <h3>Dependency update</h3> <ul> <li>Upgrade minimatch from 3.1.2 to 3.1.5 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1281">actions/setup-python#1281</a></li> <li>Upgrade actions dependencies by <a href="https://github.com/gowridurgad"><code>@gowridurgad</code></a> with <a href="https://github.com/Copilot"><code>@Copilot</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1303">actions/setup-python#1303</a></li> <li>Upgrade <code>@actions/cache</code> to 5.1.0, log cache write denied by <a href="https://github.com/jasongin"><code>@jasongin</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1324">actions/setup-python#1324</a></li> <li>Upgrade dependency versions and test workflow configuration by <a href="https://github.com/HarithaVattikuti"><code>@HarithaVattikuti</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1322">actions/setup-python#1322</a></li> </ul> <h3>Documentation</h3> <ul> <li>Update advanced-usage.md by <a href="https://github.com/Dunky-Z"><code>@Dunky-Z</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/811">actions/setup-python#811</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/gowridurgad"><code>@gowridurgad</code></a> with <a href="https://github.com/Copilot"><code>@Copilot</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-python/pull/1303">actions/setup-python#1303</a></li> <li><a href="https://github.com/jasongin"><code>@jasongin</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-python/pull/1324">actions/setup-python#1324</a></li> <li><a href="https://github.com/Dunky-Z"><code>@Dunky-Z</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-python/pull/811">actions/setup-python#811</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/setup-python/compare/v6.2.0...v6.3.0">https://github.com/actions/setup-python/compare/v6.2.0...v6.3.0</a></p> <h2>v6.2.0</h2> <h2>What's Changed</h2> <h3>Dependency Upgrades</h3> <ul> <li>Upgrade dependencies to Node 24 compatible versions by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/setup-python/pull/1259">actions/setup-python#1259</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions/setup-python/commit/5fda3b95a4ea91299a34e894583c3862153e4b97"><code>5fda3b9</code></a> Pin SHA commits and update docs with latest versions (<a href="https://redirect.github.com/actions/setup-python/issues/1338">#1338</a>)</li> <li><a href="https://github.com/actions/setup-python/commit/4ab7e95f05e168b4356aebde89dd84f59c283d8e"><code>4ab7e95</code></a> Merge pull request <a href="https://redirect.github.com/actions/setup-python/issues/1337">#1337</a> from actions/philip-gai/bump-actions-cache-6-2-0</li> <li><a href="https://github.com/actions/setup-python/commit/0f3a009f475dbea83c0371cd85d099690fee8c5c"><code>0f3a009</code></a> Remove the pip-install input (<a href="https://redirect.github.com/actions/setup-python/issues/1336">#1336</a>)</li> <li><a href="https://github.com/actions/setup-python/commit/f8cf4291c8b8e273ddd26e569454615c7315d932"><code>f8cf429</code></a> Migrate to ESM and upgrade dependencies (<a href="https://redirect.github.com/actions/setup-python/issues/1330">#1330</a>)</li> <li><a href="https://github.com/actions/setup-python/commit/54baeea5b34417d10a7479663a23cca53ea209b5"><code>54baeea</code></a> Validate and retry manifest fetch to prevent silent failures (<a href="https://redirect.github.com/actions/setup-python/issues/1332">#1332</a>)</li> <li><a href="https://github.com/actions/setup-python/commit/c7092773a316760f4ecfe498e4af668a4dafeac5"><code>c709277</code></a> Annotation code fix (<a href="https://redirect.github.com/actions/setup-python/issues/1335">#1335</a>)</li> <li><a href="https://github.com/actions/setup-python/commit/6849080452e69b330395e8a6d23cf90f56d76a1a"><code>6849080</code></a> remove EOL Python versions and Bumps numpy text fixture (<a href="https://redirect.github.com/actions/setup-python/issues/1333">#1333</a>)</li> <li><a href="https://github.com/actions/setup-python/commit/0903b469fbf4441aadfe4f4b249dc5b1fba3a73e"><code>0903b46</code></a> Bump certifi from 2020.6.20 to 2024.7.4 in /<strong>tests</strong>/data (<a href="https://redirect.github.com/actions/setup-python/issues/1328">#1328</a>)</li> <li>See full diff in <a href="https://github.com/actions/setup-python/compare/v6...v7">compare view</a></li> </ul> </details> <br /> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…sts (#116166) Co-authored-by: Jeremy Koritzinsky <jekoritz@microsoft.com> Co-authored-by: Jeremy Koritzinsky <jkoritzinsky@gmail.com> Co-authored-by: Jan Kotas <jkotas@microsoft.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Move GenerateWasmBootJson test coverage from the temporary tasks.tests project into Wasm.Build.Tests, remove the obsolete tasks.tests csproj, and tag the moved tests as no-workload. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2db6a9dd-0c66-4a48-b2f6-36c7329a5e0e
|
Azure Pipelines: Successfully started running 2 pipeline(s). 14 pipeline(s) were filtered out due to trigger conditions. There may be pipelines that require an authorized user to comment /azp run to run. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-up to #130825: move boot config test coverage into Wasm.Build.Tests and remove the temporary tasks.tests project.
Changes:
GenerateWasmBootJsonTestsundersrc/mono/wasm/Wasm.Build.Tests[TestCategory("no-workload")]to the moved test classsrc/tasks.tests/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks.Testsproject and test fileInternalsVisibleToentry fromMicrosoft.NET.Sdk.WebAssembly.Pack.Tasks.csprojNote
This PR description was generated with GitHub Copilot assistance.