The prolog and epilog code in SILGen is not set up to deal with
abstraction differences in the thrown error type of closures, so disable
the peephole optimization for closure literals.
Fixes https://github.com/apple/swift/issues/71401 / rdar://122366566,
which I've stared at for waaaaay too many hours.
Relax some existing pattern matches and add some unhandled instructions to the
walkers so that borrowing switches over address-only enums are properly analyzed
for incorrect consumption. Add a `[strict]` flag to `mark_unresolved_move_only_value`
to indicate a borrow access that should remain a borrow access even if the subject
is later stack-promoted from a box.
Ad-hoc requirements are now obsolete by making `remoteCall`,
`record{Argument, ReturnType}`, `decodeNextArgument` protocols
requirements and injecting witness tables for `SerializationRequirement`
conformances during IRGen.
It turns out there are valid usecases for exposing a standalone
objc-metaclass symbols and tbd files must encode it correctly.
resolves: rdar://118499886
It doesn't make sense that we permit a `ReferenceStorageType` to be
substituted for a generic parameter, since I don't know whether any
valid Swift code would ever actually construct such SIL.
But there are some hand-written SIL test cases that do it anyway, for
unconstrained generic parameters. Since now even those get protocol
requirements with NoncopyableGenerics, just look at the referent type in
ParseSIL.
Don't verify lowering in modules built from swiftinterface (which may
not have been built with `-enable-experimental-feature BitwiseCopyable`)
Allow trivial types defined in other modules to lack conformance because
those modules may not have been built with the feature enabled.
In preparation for inserting mark_dependence instructions for lifetime
dependencies early, immediately after SILGen. That will simplify the
implementation of borrowed arguments.
Marking them unresolved is needed to make OSSA verification
conservative until lifetime dependence diagnostics runs.
This adds SIL-level support and LLVM codegen for normal results of a coroutine.
The main user of this will be autodiff as VJP of a coroutine must be a coroutine itself (in order to produce the yielded result) and return a pullback closure as a normal result.
For now only direct results are supported, but this seems to be enough for autodiff purposes.
Decls with a package access level are currently set to public SIL
linkages. This limits the ability to have more fine-grained control
and optimize around resilience and serialization.
This PR introduces a separate SIL linkage and FormalLinkage for
package decls, pipes them down to IRGen, and updates linkage checks
at call sites to include package linkage.
Resolves rdar://121409846
Specifies that the optimizer and IRGen must not add runtime calls which are not in the function originally.
This attribute is set for functions with performance constraints or functions which are called from functions with performance.
Just making this easier to debug. Previously, one would have to go into the
debugger to figure out what the issue is. Now upon failure, one just gets the
exact instruction that needs to be added.