Repository navigation
Remove legacy LLVM IR type map build pipeline - #12889
Conversation
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Unresolved provider-source generation and library llvm-ir runtime-jar issues remain, alongside a P/Invoke coverage gap.
Get a fresh assessment by requesting another Copilot review.
Review effort: Lite
Findings: 1
Open (1)
What changed in this PR
This pull request removes the obsolete LLVM IR typemap and marshal-method pipelines while retaining trimmable typemaps, compatibility symbols, P/Invoke preservation, NativeAOT support, and remapping.
Changes:
- Removes legacy typemap, Java-stub, marshal-rewriting, and post-link tasks.
- Updates incremental native-source handling, tests, resources, and documentation.
- Rejects unsupported marshal methods with XA1049.
Review findings:
- Critical: Restore CoreCLR additional provider-source generation for secondary-process manifest providers.
- Moderate: Add multi-ABI P/Invoke preservation coverage.
- Moderate: Preserve or consistently reject legacy
llvm-irruntime-jar selection for libraries. - Nit: Update the native marshal source task description.
| File | Change |
|---|---|
tests/MSBuildDeviceIntegration/Tests/MarshalMethodsGCHangTests.cs |
Removes obsolete marshal-method device test. |
tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs |
Removes marshal-method test variants. |
tests/Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests/TypeDataBuilder.cs |
Adapts legacy entry generation. |
tests/Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests/ScannerRunner.cs |
Adds a legacy scanner entry helper. |
src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets |
Removes legacy wiring and updates compatibility generation. |
src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj |
Removes obsolete sources and resources. |
src/Xamarin.Android.Build.Tasks/Utilities/TypeMappingReleaseNativeAssemblyGenerator.cs |
Deletes the legacy release generator. |
src/Xamarin.Android.Build.Tasks/Utilities/TypeMappingDebugNativeAssemblyGenerator.cs |
Deletes the legacy debug generator. |
src/Xamarin.Android.Build.Tasks/Utilities/TypeMappingAssemblyGenerator.cs |
Deletes the legacy generator base. |
src/Xamarin.Android.Build.Tasks/Utilities/TypeMapObjectsXmlFile.cs |
Deletes legacy typemap XML support. |
src/Xamarin.Android.Build.Tasks/Utilities/TypeMapGenerator.cs |
Deletes the legacy typemap generator. |
src/Xamarin.Android.Build.Tasks/Utilities/TypeMapCecilAdapter.cs |
Deletes the legacy Cecil adapter. |
src/Xamarin.Android.Build.Tasks/Utilities/PreservePinvokesNativeAssemblyGenerator.cs |
Decouples P/Invoke preservation from removed state. |
src/Xamarin.Android.Build.Tasks/Utilities/NativeTypeMappingData.cs |
Deletes legacy native mapping data. |
src/Xamarin.Android.Build.Tasks/Utilities/NativeCodeGenState.cs |
Deletes obsolete code-generation state. |
src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs |
Simplifies assembly resolver setup. |
src/Xamarin.Android.Build.Tasks/Utilities/MarshalMethodsState.cs |
Deletes obsolete marshal state. |
src/Xamarin.Android.Build.Tasks/Utilities/MarshalMethodsNativeAssemblyGenerator.cs |
Generates compatibility native symbols. |
src/Xamarin.Android.Build.Tasks/Utilities/MarshalMethodsHelpers.cs |
Deletes marshal helpers. |
src/Xamarin.Android.Build.Tasks/Utilities/MarshalMethodsCollection.cs |
Deletes the marshal classifier collection. |
src/Xamarin.Android.Build.Tasks/Utilities/MarshalMethodCecilAdapter.cs |
Deletes marshal state conversion. |
src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs |
Updates manifest-generation documentation. |
src/Xamarin.Android.Build.Tasks/Utilities/JCWGenerator.cs |
Deletes the legacy JCW generator. |
src/Xamarin.Android.Build.Tasks/Utilities/AssemblyPipeline.cs |
Removes marshal-method pipeline state. |
src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LlvmIrGeneratorTests.cs |
Tests compatibility stub generation. |
src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs |
Removes legacy typemap assertions. |
src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/MarshalMethodTests.cs |
Deletes obsolete marshal tests. |
src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ManifestTest.cs |
Updates manifest-generation documentation. |
src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/InvalidConfigTests.cs |
Removes an obsolete pipeline assertion. |
src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs |
Updates typemap paths and removes obsolete tests. |
src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs |
Expands XA1049 validation coverage. |
src/Xamarin.Android.Build.Tasks/Tasks/RewriteMarshalMethods.cs |
Deletes the marshal rewriter task. |
src/Xamarin.Android.Build.Tasks/Tasks/RemoveRegisterAttribute.cs |
Deletes the legacy attribute-removal task. |
src/Xamarin.Android.Build.Tasks/Tasks/PreTrimmingFixLegacyDesigner.cs |
Deletes the legacy pre-trimming task. |
src/Xamarin.Android.Build.Tasks/Tasks/PrepareAbiItems.cs |
Removes the legacy typemap mode. |
src/Xamarin.Android.Build.Tasks/Tasks/GetMonoPlatformJar.cs |
Deletes the obsolete platform-jar task. |
src/Xamarin.Android.Build.Tasks/Tasks/GenerateTypeMappings.cs |
Deletes the legacy mapping task. |
src/Xamarin.Android.Build.Tasks/Tasks/GenerateNativeMarshalMethodSources.cs |
Retains compatibility and P/Invoke source generation. |
src/Xamarin.Android.Build.Tasks/Tasks/GenerateNativeApplicationConfigSources.cs |
Disables removed marshal state in app configuration. |
src/Xamarin.Android.Build.Tasks/Tasks/GenerateNativeAotLibraryLoadAssemblerSources.cs |
Updates resolver usage. |
src/Xamarin.Android.Build.Tasks/Tasks/GenerateNativeAotBootstrapSources.cs |
Simplifies bootstrap documentation. |
src/Xamarin.Android.Build.Tasks/Tasks/GenerateMainAndroidManifest.cs |
Deletes the legacy manifest task. |
src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs |
Deletes the legacy Java-stub task. |
src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaCallableWrappers.cs |
Deletes the legacy wrapper task. |
src/Xamarin.Android.Build.Tasks/Tasks/GenerateEmptyTypemapStub.cs |
Retains stub generation with updated metadata handling. |
src/Xamarin.Android.Build.Tasks/Tasks/GenerateAdditionalProviderSources.cs |
Retains shared provider-generation helpers. |
src/Xamarin.Android.Build.Tasks/Tasks/GenerateACWMap.cs |
Deletes the legacy ACW map task. |
src/Xamarin.Android.Build.Tasks/Tasks/CreateTypeManagerJava.cs |
Deletes the obsolete Java resource task. |
src/Xamarin.Android.Build.Tasks/Tasks/CollectTypeMapFilesForArchive.cs |
Deletes legacy archive collection. |
src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs |
Removes the marshal-method pipeline option. |
src/Xamarin.Android.Build.Tasks/Properties/Resources.resx |
Updates XA1049 text. |
src/Xamarin.Android.Build.Tasks/Properties/Resources.Designer.cs |
Updates generated XA1049 metadata. |
src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Resource.Designer.targets |
Updates resource-designer trimming documentation. |
src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.Trimmable.targets |
Preserves typemap stub items incrementally. |
src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.BuildOrder.targets |
Removes obsolete post-link ordering. |
src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets |
Removes obsolete post-link dependency. |
src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FindTypeMapObjectsStep.cs |
Deletes the legacy linker scanner. |
src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FindJavaObjectsStep.cs |
Removes marshal-method-specific behavior. |
Documentation/docs-mobile/messages/xa1049.md |
Documents marshal-method removal. |
Documentation/docs-mobile/messages/index.md |
Updates the XA1049 index entry. |
Documentation/docs-mobile/building-apps/build-properties.md |
Documents obsolete property behavior. |
Files not reviewed (1)
- src/Xamarin.Android.Build.Tasks/Properties/Resources.Designer.cs: Generated file
5866c12 to
6b8b57e
Compare
df2de16 to
ab4d8d4
Compare
03fb13c to
31791c5
Compare
85dd239 to
1ddbe25
Compare
Keep native host compatibility stubs and P/Invoke preservation while removing unreachable typemap and marshal-method generation, rewriting, and linker steps. Co-authored-by: Copilot App <[email protected]>
Use trimmable Java APIs for explicit library opt-ins without importing application type map targets, and retain the packaged CoreCLR/default jars for libraries without an implementation selection. Co-authored-by: Copilot App <[email protected]>
Keep generating additional Java runtime providers for trimmable CoreCLR apps after removing the legacy GenerateAdditionalProviderSources task. Register a dedicated task and track generated Java files for incremental Clean. Co-authored-by: Copilot App <[email protected]>
The shared CoreCLR provider generation is already supplied by main. Keep a single call while preserving the legacy typemap removals and upstream prelink fixes. Co-authored-by: Copilot App <[email protected]>
1ddbe25 to
d52cab0
Compare
Exercise the supported typemap validation target instead of deleted build targets. Remove obsolete Cecil JCW/XML scanning from the no-shrink pipeline, retaining compatibility fixups and assembly copying, and update managed-typemap regression coverage. Isolate relocation-test builds from persistent compiler and MSBuild servers without weakening move, incremental-build, or signing assertions. Co-authored-by: Copilot App <[email protected]>
Integrate main through c35205f, including PR #12976's collection-export and explicit-constructor JNI regressions. Resolve conflicts by retaining the deleted legacy scanners and unconditional assembly copying; preserve both managed typemap and JCW/Dex multi-TFM assertions. Co-authored-by: Copilot App <[email protected]>
|
@dalexsoto review |
dalexsoto
left a comment
There was a problem hiding this comment.
The prior CoreCLR additional-provider finding is resolved. The deliberate LLVM-IR removal, unsupported marshal-method rejection and retained compatibility symbols are acceptable. The complete 67-file review and separate integration/completeness pass identify one conditional native-linking build blocker.
Filter or deduplicate typemap candidates before building the P/Invoke ABI dictionaries (GenerateNativeMarshalMethodSources.cs:163-174). With _AndroidEnableNativeRuntimeLinking=true, a trimmed CoreCLR build supplies both the final linked/ReadyToRun typemap assembly and its pre-trim copy to ScanPInvokes(). Final typemaps are published by CoreCLR.targets:317-329 and included in resolved assemblies by AssemblyResolution.targets:268-271; Trimmable.targets:419-430 additionally appends the pre-trim typemaps for the first ABI. Common.targets:1661-1666 passes that combined collection to the changed task.
Both copies of _Microsoft.Android.TypeMaps.dll, for example, have the same assembly-name key for arm64-v8a. GetPerArchAssemblies() calls Dictionary.Add for each input (MonoAndroidHelper.cs:758-768), so it throws before the subsequent framework-only filtering can exclude these non-framework candidates. validateCollection:false does not disable duplicate-key rejection. Native source generation therefore fails for this opt-in configuration. This is a concrete replacement-scanner/item-flow defect, not just the older request for more ABI test coverage, and does not require restoring any legacy LLVM behavior.
Exclude pre-trim/non-framework candidates before constructing the per-ABI dictionaries, or deduplicate by ABI and assembly name while preferring the final linked/ReadyToRun copy. Add a trimmed CoreCLR native-linking regression using the actual combined typemap inputs. The evidence comes from immutable task/target declarations and item-identity comparison; no MSBuild reproduction or repository tests were executed during this review.
Exclude non-framework assemblies through GetPerArchAssemblies' existing predicate before Dictionary.Add can encounter final/pre-trim typemap copies with the same ABI and name. Preserve framework-only scanning and per-ABI native symbols without changing packaging or native-config item collections. Add linked/R2R task regressions with duplicate root/per-assembly typemap candidates, per-ABI framework PInvokes and ignored user PInvokes, plus trimmed multi-RID source-generation integration coverage. Both original task cases reproduced the duplicate _Microsoft.Android.TypeMaps key; both repaired production-source task cases pass. Full SDK integration tests require unavailable local Android build output. Co-authored-by: Copilot App <[email protected]>
|
@dalexsoto Fixed the native-linking blocker in 872e037307.
Added two task regressions covering linked and R2R candidates for arm64/x64, duplicated root/per-assembly typemaps, separate per-ABI framework P/Invoke symbols, and exclusion of user/typemap P/Invokes. Both cases reproduce the original Also added |
Compile defaults to DesignTimeBuild=true, which suppresses trimmable manifest generation before the explicit native-source target. Set DesignTimeBuild=false for this source-generation-only test invocation, preserving the linked/R2R and combined multi-ABI typemap assertions. Verified both old invocations select design-time mode and both corrected invocations retain normal mode/stamp paths using the production Xamarin.Android.DesignTime.targets. Full Android SDK integration remains unavailable locally. Co-authored-by: Copilot App <[email protected]>
Scope Filename, Abi and _AndroidPreTrimTypeMapCandidate to _ResolvedAssemblies in the combined-typemap assertion. Missing optional metadata on resource-designer/framework/user items now evaluates per source item instead of raising MSB4096 during batching. Ran the exact embedded assertion with linked and R2R item fixtures: reproduced both CI candidate-metadata errors, verified all three root selections with optional metadata absent, and confirmed six missing-root cases remain rejected. Full Android integration coverage still requires local SDK output unavailable here. Co-authored-by: Copilot App <[email protected]>
|
@dalexsoto review |
dalexsoto
left a comment
There was a problem hiding this comment.
The complete current cleanup and replacement paths are consistent with the accepted trimmable/NativeAOT design. The native-linking duplicate-key blocker is fixed by excluding non-framework inputs before ABI dictionary construction; supported provider, packaging, native configuration and compatibility-symbol paths remain integrated. No remaining high-confidence blockers found.
## Summary Remove the obsolete native typemap and reflection-backed activation path now that the managed trimmable typemap is the supported CoreCLR/NativeAOT runtime path. This removes compatibility stubs and duplicated build/runtime machinery that no longer serve applications. - Remove CLR native typemap lookups, app-DSO typemap/marshal symbols, internal P/Invoke exports, reflection-backed managers, and legacy Java activation registration. - Use trimmable type/value managers and JNI registration unconditionally. Preserve the current JNI-remapping startup data and managed lookup implementation from `main`. - Remove legacy platform JCW generation and `mono.android.jar`/`mono.android.dex` targeting-pack entries. Binding and application Javac use `java_runtime_trimmable.jar`; application builds generate framework JCWs through the trimmable typemap. - Retain P/Invoke preservation under the renamed `GenerateNativeRuntimeLinkingSources` task, including the framework-only filtering fix and its multi-ABI/duplicate-assembly regression tests. - Update startup/config layouts and tests, remove the duplicate application-config test that blocked the previous CI build, and remove the obsolete activation-cache benchmark and empty native translation units. The prerequisite #12889 has merged. This PR now targets `main` and is rebased onto `4126afa379785ba94bd951586d9e05f4658f8262`, with the cleanup history consolidated as requested. ## Compatibility Third-party Java sources importing legacy platform JCW implementation classes from `mono.android.jar` no longer resolve those classes during standalone binding compilation. Framework JCWs are generated and compiled per application. This removal is intentional; `TypeManager.Activate` and reflection-backed activation are not restored. The public explicit type-registration shim is retained but throws `NotSupportedException`; Java peer types must use `[Register]`. ## Validation - `dotnet test src/Microsoft.Android.Build.Tasks/Tests/Microsoft.Android.Build.Tasks.Tests/Microsoft.Android.Build.Tasks.Tests.csproj -v minimal --filter 'FullyQualifiedName~TrimmableTypeMap|FullyQualifiedName~GenerateTrimmableTypeMap|FullyQualifiedName~ExtractTypeMapKeys'` — passed: 31 tests, 7 skipped. - `dotnet test src/Microsoft.Android.Build.Tasks/Tests/Microsoft.Android.Build.Tasks.Tests/Microsoft.Android.Build.Tasks.Tests.csproj --no-restore -v minimal` — passed: 60 tests, 7 skipped. The skipped tests require a locally built Mono.Android assembly. - `JAVA_HOME=$(/usr/libexec/java_home) && clang++ -std=c++20 -fsyntax-only -DDEBUG -Duint=uint32_t -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" -Isrc/native/clr/include -Isrc/native/common/include src/native/clr/xamarin-app-stub/application_dso_stub.cc && clang++ -std=c++20 -fsyntax-only -DRELEASE -Duint=uint32_t -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" -Isrc/native/clr/include -Isrc/native/common/include src/native/clr/xamarin-app-stub/application_dso_stub.cc` — passed. These are host syntax checks, not Android ABI builds; the explicit `uint` alias supplies the Android typedef on macOS. - Changed MSBuild XML parsed; managed/native startup field order agrees; `git diff origin/main --check` passed; no unmerged paths or conflict markers remain. - Full SDK/ref-pack, host integration, native multi-ABI linking, benchmark-app build, and device runtime tests were not run: this worktree has no locally built Android SDK, and full validation was explicitly deferred to CI. The rebased head still needs a successful pipeline before merge. ---- Pull Request [title](https://github.com/dotnet/android/blob/main/Documentation/workflow/commit-messages.md#commit-summary) and [description](https://github.com/dotnet/android/blob/main/Documentation/workflow/commit-messages.md#commit-body) should follow the [`commit-messages.md` workflow documentation](https://github.com/dotnet/android/blob/main/Documentation/workflow/commit-messages.md), and in particular should include: - [x] Useful description of *why the change is necessary*. - [ ] Links to issues fixed - [x] Unit tests
…13024) The trimmable type map is the sole supported implementation after #12889 and #12890. `$(AndroidTypeMapImplementation)` no longer selects between working implementations, but still adds conditions, defaults, validation, and redundant test parameters throughout the build. Remove the selector rather than preserving an extension point for a hypothetical future implementation: - Remove its defaults, property-cache entry, target/import conditions, and UCO binding prerequisite checks. Always select `java_runtime_trimmable.jar`; retain application/library, runtime, trimming, design-time, and inner-RID guards. - Simplify constant typemap test parameters while retaining the CoreCLR/NativeAOT matrices. Make the callback fixture reference and callback/manifest test sources unconditional, and remove the obsolete `CoreCLRTrimmable` test flavor default. - Replace selector-validation tests with coverage that applications still generate typemaps and libraries do not, regardless of obsolete assignments. Add standalone R8 target regression coverage for omitted, empty, `llvm-ir`, `trimmable`, and unknown values. - Retire XA4267, remove selector wording from XA4265/XA4266, and update build-property documentation, contributor guidance, and test commands. Generated non-English localization files are unchanged. **Compatibility:** Existing assignments to `$(AndroidTypeMapImplementation)` are now ignored, including previously rejected `llvm-ir`, unknown, and explicitly empty global values. The documentation retains an obsolete-property notice so users can remove those assignments. No linked issue; this follows the legacy typemap removal PRs and the redundant test-lane removal in #13011. ## Validation After merging `main` and resolving review feedback, expanded standalone coverage: **98 passed, 7 skipped, 0 failed**. This includes the obsolete-property regression cases and the new transferred-reference activation tests from `main`. The skipped tests require locally built Android assemblies. NativeAOT target cases were exercised with the NDK tools. ```bash dotnet test src/Microsoft.Android.Build.Tasks/Tests/Microsoft.Android.Build.Tasks.Tests/Microsoft.Android.Build.Tasks.Tests.csproj -v minimal -p:_NativeAotLlvmReadObjPath=/Users/simon/android-toolchain/ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readobj --filter 'FullyQualifiedName~TypeMapProguardTargetsTests|FullyQualifiedName~GenerateTrimmableTypeMapTests|FullyQualifiedName~TrimmableTypeMapIncrementalTests|FullyQualifiedName~TrimmableTypeMapManifestAliasTests|FullyQualifiedName~TrimmableTypeMapRidCallbackTests|FullyQualifiedName~ExtractTypeMapKeysFromAssembliesTests|FullyQualifiedName~ExtractTypeMapKeysFromNativeAotObjectTests|FullyQualifiedName~GenerateTypeMapProguardConfigurationTests|FullyQualifiedName~GenerateTypeMapMemberProguardConfigurationTests|FullyQualifiedName~TransferredReferenceActivationTests' ``` The earlier focused obsolete-property regression run passed **all 5 cases**: ```bash dotnet test src/Microsoft.Android.Build.Tasks/Tests/Microsoft.Android.Build.Tasks.Tests/Microsoft.Android.Build.Tasks.Tests.csproj -v minimal --filter 'Name~AssemblyTargetConsumesLinkedMetadataAcrossRidsAndEmptyStubs' ``` `git diff --cached --check` passed. All 12 modified XML files parsed successfully. Merge-resolution checks confirmed all 84 `Compile` items and five `ProjectReference` items from `main` are preserved; the five formerly gated runtime source entries (including the new `TransferredReferenceTests`) and callback project reference are unconditional. The initial implementation also verified unchanged target ordering/incremental inputs and outputs, preservation of non-selector guards and 169 explicit test cases. **Full SDK validation is blocked:** Retrying `make prepare && make all` after the merge failed during preparation with NU1102 because the configured feeds cannot supply `Microsoft.NETCore.App.Ref` version `10.0.13`; `make all` did not run. Earlier attempts using `make prepare MSBUILD_ARGS=-p:DotNetPreviewTool=/usr/local/share/dotnet/dotnet` and `dotnet build src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Xamarin.Android.Build.Tests.csproj -v minimal -p:DotNetStableTargetFramework=net11.0` failed for the same dependency. Full-build application/library regressions, device integration tests, and on-device runtime tests have therefore not run locally. ---- Pull Request [title](https://github.com/dotnet/android/blob/main/Documentation/workflow/commit-messages.md#commit-summary) and [description](https://github.com/dotnet/android/blob/main/Documentation/workflow/commit-messages.md#commit-body) should follow the [`commit-messages.md` workflow documentation](https://github.com/dotnet/android/blob/main/Documentation/workflow/commit-messages.md), and in particular should include: - [x] Useful description of *why the change is necessary*. - [ ] Links to issues fixed - [x] Unit tests

Stacked on #12887; base:
simonrozsival-default-trimmable-typemap.Summary
LinkDescription,LinkerDumpDependencies, and incremental file tracking. RejectAndroidEnableMarshalMethods=truewithXA1049rather than accepting an unsupported path.The default property and
XA4265validation remain in the small bottom PR. JVM-only test cleanup is in #12894; this PR does not replay the old bottom branch's broad CI and test-fixture changes.Validation
generator.dll; CI must validate the combined path.