Skip to content

[NativeAOT] Add support for [Preserve] attributes - #18666

Merged
rolfbjarne merged 2 commits into
dotnet:net8.0from
rolfbjarne:use-dynamicdependency-for-preserve-attributes
Aug 18, 2023
Merged

rolfbjarne merged 2 commits into
dotnet:net8.0from
rolfbjarne:use-dynamicdependency-for-preserve-attributes

Conversation

@rolfbjarne

@rolfbjarne rolfbjarne commented Aug 8, 2023 •

Copy link
Copy Markdown
Member

Add partial support for the [Preserve] attribute for NativeAOT. This is done by injecting an equivalent [DynamicDependency] attribute. The partial support comes from the fact that there's no way to map a conditional preserve attribute ([Preserve (Conditional = true)]) to a [DynamicDependency] attribute, so we report a warning instead.

For non-conditional [Preserve] attributes, we'll now add a [DynamicDependency] attribute to the assembly's module constructor for the type/member in question, effectively rooting it.

This makes it possible to fully link all our test suites when NativeAOT (otherwise NativeAOT would just link out all the tests, leaving the test suites empty - and unfortunately green, so this was a rather accidental discovery).

@github-actions

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@rolfbjarne
rolfbjarne force-pushed the use-dynamicdependency-for-preserve-attributes branch from d2e181a to 69ec2d3 Compare August 11, 2023 09:27
@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

…ationAwareSubStep

This improves error reporting.
…cDependency attributes.

Add support for mapping Preserve attributes to DynamicDependency attributes, and use for NativeAOT.

This fixes a problem where NativeAOT would trim away all our tests in our test suites.
@rolfbjarne
rolfbjarne force-pushed the use-dynamicdependency-for-preserve-attributes branch from 69ec2d3 to c6576d3 Compare August 15, 2023 14:25
@vs-mobiletools-engineering-service2

Copy link
Copy Markdown
Collaborator

βœ… API diff for current PR / commit

Legacy Xamarin (No breaking changes)
  • iOS (no change detected)
  • tvOS (no change detected)
  • watchOS (no change detected)
  • macOS (no change detected)
NET (empty diffs)
  • iOS: (empty diff detected)
  • tvOS: (empty diff detected)
  • MacCatalyst: (empty diff detected)
  • macOS: (empty diff detected)

βœ… API diff vs stable

Legacy Xamarin (No breaking changes)
.NET (No breaking changes)
Legacy Xamarin (stable) vs .NET

ℹ️ Generator diff

Generator Diff: vsdrops (html) vsdrops (raw diff) gist (raw diff) - Please review changes)

Pipeline on Agent
Hash: c6576d3c5dfa94f1e6621554b695020d7f27959a [PR build]

@vs-mobiletools-engineering-service2

Copy link
Copy Markdown
Collaborator

πŸ’» [CI Build] Windows Integration Tests passed πŸ’»

βœ… All Windows Integration Tests passed.

Pipeline on Agent
Hash: c6576d3c5dfa94f1e6621554b695020d7f27959a [PR build]

@vs-mobiletools-engineering-service2

Copy link
Copy Markdown
Collaborator

πŸ’» [PR Build] Tests on macOS M1 - Mac Ventura (13.0) passed πŸ’»

βœ… All tests on macOS M1 - Mac Ventura (13.0) passed.

Pipeline on Agent
Hash: [PR build]

@vs-mobiletools-engineering-service2

Copy link
Copy Markdown
Collaborator

πŸ’» [PR Build] Tests on macOS M1 - Mac Big Sur (11.5) passed πŸ’»

βœ… All tests on macOS M1 - Mac Big Sur (11.5) passed.

Pipeline on Agent
Hash: [PR build]

@vs-mobiletools-engineering-service2

Copy link
Copy Markdown
Collaborator

πŸ“š [PR Build] Artifacts πŸ“š

Packages generated

View packages

Pipeline on Agent
Hash: [PR build]

@vs-mobiletools-engineering-service2

This comment has been minimized.

@rolfbjarne rolfbjarne changed the title [DRAFT] Testing misc NativeAOT fixes. [NativeAOT] Add support for [Preserve] attributes Aug 17, 2023
@rolfbjarne
rolfbjarne marked this pull request as ready for review August 17, 2023 06:59
@vs-mobiletools-engineering-service2

Copy link
Copy Markdown
Collaborator

πŸš€ [CI Build] Test results πŸš€

Test results

βœ… All tests passed on VSTS: simulator tests.

πŸŽ‰ All 232 tests passed πŸŽ‰

Tests counts

βœ… bcl: All 69 tests passed. Html Report (VSDrops) Download
βœ… cecil: All 1 tests passed. Html Report (VSDrops) Download
βœ… dotnettests: All 1 tests passed. [attempt 2] Html Report (VSDrops) Download
βœ… fsharp: All 7 tests passed. Html Report (VSDrops) Download
βœ… framework: All 8 tests passed. Html Report (VSDrops) Download
βœ… generator: All 2 tests passed. Html Report (VSDrops) Download
βœ… interdependent_binding_projects: All 7 tests passed. Html Report (VSDrops) Download
βœ… install_source: All 1 tests passed. Html Report (VSDrops) Download
βœ… introspection: All 8 tests passed. Html Report (VSDrops) Download
βœ… linker: All 65 tests passed. Html Report (VSDrops) Download
βœ… mac_binding_project: All 1 tests passed. Html Report (VSDrops) Download
βœ… mmp: All 2 tests passed. Html Report (VSDrops) Download
βœ… mononative: All 6 tests passed. Html Report (VSDrops) Download
βœ… monotouch: All 38 tests passed. [attempt 2] Html Report (VSDrops) Download
βœ… msbuild: All 2 tests passed. Html Report (VSDrops) Download
βœ… mtouch: All 1 tests passed. Html Report (VSDrops) Download
βœ… xammac: All 3 tests passed. Html Report (VSDrops) Download
βœ… xcframework: All 8 tests passed. Html Report (VSDrops) Download
βœ… xtro: All 2 tests passed. Html Report (VSDrops) Download

Pipeline on Agent
Hash: c6576d3c5dfa94f1e6621554b695020d7f27959a [PR build]

@dalexsoto dalexsoto left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

green > gred

@rolfbjarne
rolfbjarne merged commit 19b2b37 into dotnet:net8.0 Aug 18, 2023
@rolfbjarne
rolfbjarne deleted the use-dynamicdependency-for-preserve-attributes branch August 18, 2023 14:49
rolfbjarne added a commit that referenced this pull request Aug 22, 2023
Make 'Full' the default link mode for all platforms for NativeAOT because:

* It will achieve the best app size.
* NativeAOT is not a drop-in replacement that's guaranteed to work - there are
  already known features NativeAOT don't support (and may never support), so
  this may be an opportunity for app developers (and component vendors) to
  make their products trimmer safe.
* NativeAOT will be in preview in .NET 8, so we can change our mind later if
  it turns out to cause too many problems.
* In some cases NativeAOT might require trimming, because we may
  optimize/rewrite assemblies to be NativeAOT-compatible to support existing
  libraries.

This requires #18666 to be merged first, so that ests aren't linked away.
rolfbjarne pushed a commit that referenced this pull request Aug 25, 2023
This is a follow-up to #18666

The idea is to transform `[Preserve(Conditional = true)]` into
`[DynamicDependency(signature, type)]` on the static constructor of the
given type:

```c#
class MyClass {
    [Preserve (Conditional = true)]
    public void MyMethod () { }

    // transformed into ...

    [DynamicDependency ("MyMethod", typeof (MyClass))]
    static MyClass() { /* either the existing cctor or a new empty cctor */ }

    public void MyMethod () { }
}
```
rolfbjarne pushed a commit that referenced this pull request Aug 28, 2023
This is a follow-up to #18666

This PR resolves the following warnings that I've seen in build logs
when running MySingleView with NativeAOT:

```
ILLink : warning IL2034: <Module>..cctor(): The 'DynamicDependencyAttribute' could not be analyzed. [/..../xamarin/xamarin-macios/tests/dotnet/MySingleView/MySingleView.csproj]
ILLink : warning IL2034: <Module>..cctor(): The 'DynamicDependencyAttribute' could not be analyzed. [/..../xamarin/xamarin-macios/tests/dotnet/MySingleView/MySingleView.csproj]
...
```

The generated module cctor code looks like this:

```c#
internal class <Module>
{
	[DynamicDependency("InvokeConformsToProtocol(ObjCRuntime.NativeHandle)", typeof(NSObject))]
	[DynamicDependency("Foundation.NSObject", null)]
	[DynamicDependency("ConformsToProtocol(ObjCRuntime.NativeHandle)", typeof(NSObject))]
	[DynamicDependency("Foundation.NSObject", null)]
        // ...
	static <Module>()
	{
		// ...
	}
}
```

The `[DynamicDependency("T", null)]` attributes are invalid. We could
change them to `[DynamicDependency(DynamicallyAccessedMemberTypes.None,
typeof(T))]` but I think that attribute is redundant because the type
itself is always already preserved through the attribute that precedes
it with a selector of one of its methods/fields.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants